Merge branch 'fix-511--database-constants' into 'master'
Refactor database schema constants **Note:** When this is merged I'll rebase !347 and remove its WIP. ## Summary In order to do the database changes required for #511, I've found that it is difficult due to my inclination to switch between referring to database columns by either a Java constant such as `AppProvider.DataColumns.NAME` and string literals such as `"name"`. All string literals should be migrated to constants, and that will happen in my next MR. In order to prepare for this, I've gathered together the constants into one common place: `org.fdroid.fdroid.data.Schema`. This is going to be the authoritative place for the schema to be stored going forward, and will help when reasoning about the database structure. Although it seems large, this change is a fairly straightforward find/replace job. It also passes all tests for which there is good test coverage in the content providers. ## Changes Create `Schema` interface to make it simpler to replace string literals with constants. Right now, table names are in `DBHelper.TABLE_*` constants, and each tables fields are in `*Provider.DataColumns.*` constants. This brings them all into a predictable location. In addition, it makes it easier to statically import `Schema` so that instead of, e.g., * `AppProvider.DataColumns.PACKAGE_NAME` We can choose one of the following, based on our current context: * `Schema.AppTable.Cols.PACKAGE_NAME` * `AppTable.Cols.PACKAGE_NAME` * `Cols.PACKAGE_NAME` In the worst case, it isa couple of chars shorter than now. In the best case, if we are writing a class that primarily deals with Apps (e.g. App.java or AppProvider.java) then we get a big win with just `Cols.PACKAGE_NAME`. Having these things slightly shorter may seem like it is pointless, but the length of each constant probably contributed to my lack of willingness to use constants instead of string literals when constructing queries. In the future, this should be moved towards something more akin to: > http://openhms.sourceforge.net/sqlbuilder/ and I hope that extracting all the schema stuff into one interface may help that. See merge request !346
This commit is contained in:
commit
3fae57c360
@ -84,6 +84,7 @@ import org.fdroid.fdroid.data.App;
|
||||
import org.fdroid.fdroid.data.AppProvider;
|
||||
import org.fdroid.fdroid.data.InstalledAppProvider;
|
||||
import org.fdroid.fdroid.data.RepoProvider;
|
||||
import org.fdroid.fdroid.data.Schema;
|
||||
import org.fdroid.fdroid.installer.InstallManagerService;
|
||||
import org.fdroid.fdroid.installer.Installer;
|
||||
import org.fdroid.fdroid.installer.InstallerFactory;
|
||||
@ -667,8 +668,8 @@ public class AppDetails extends AppCompatActivity {
|
||||
Uri uri = AppProvider.getContentUri(packageName);
|
||||
|
||||
ContentValues values = new ContentValues(2);
|
||||
values.put(AppProvider.DataColumns.IGNORE_ALLUPDATES, ignoreAll ? 1 : 0);
|
||||
values.put(AppProvider.DataColumns.IGNORE_THISUPDATE, ignoreVersionCode);
|
||||
values.put(Schema.AppTable.Cols.IGNORE_ALLUPDATES, ignoreAll ? 1 : 0);
|
||||
values.put(Schema.AppTable.Cols.IGNORE_THISUPDATE, ignoreVersionCode);
|
||||
|
||||
getContentResolver().update(uri, values, null, null);
|
||||
|
||||
@ -1032,7 +1033,7 @@ public class AppDetails extends AppCompatActivity {
|
||||
case REQUEST_PERMISSION_DIALOG:
|
||||
if (resultCode == Activity.RESULT_OK) {
|
||||
Uri uri = data.getData();
|
||||
Apk apk = ApkProvider.Helper.find(this, uri, ApkProvider.DataColumns.ALL);
|
||||
Apk apk = ApkProvider.Helper.find(this, uri, Schema.ApkTable.Cols.ALL);
|
||||
startInstall(apk);
|
||||
}
|
||||
break;
|
||||
|
@ -12,6 +12,7 @@ import org.fdroid.fdroid.data.App;
|
||||
import org.fdroid.fdroid.data.Repo;
|
||||
import org.fdroid.fdroid.data.RepoPersister;
|
||||
import org.fdroid.fdroid.data.RepoProvider;
|
||||
import org.fdroid.fdroid.data.Schema.RepoTable;
|
||||
import org.fdroid.fdroid.net.Downloader;
|
||||
import org.fdroid.fdroid.net.DownloaderFactory;
|
||||
import org.xml.sax.InputSource;
|
||||
@ -253,32 +254,32 @@ public class RepoUpdater {
|
||||
private ContentValues prepareRepoDetailsForSaving(String name, String description, int maxAge, int version, long timestamp) {
|
||||
ContentValues values = new ContentValues();
|
||||
|
||||
values.put(RepoProvider.DataColumns.LAST_UPDATED, Utils.formatTime(new Date(), ""));
|
||||
values.put(RepoTable.Cols.LAST_UPDATED, Utils.formatTime(new Date(), ""));
|
||||
|
||||
if (repo.lastetag == null || !repo.lastetag.equals(cacheTag)) {
|
||||
values.put(RepoProvider.DataColumns.LAST_ETAG, cacheTag);
|
||||
values.put(RepoTable.Cols.LAST_ETAG, cacheTag);
|
||||
}
|
||||
|
||||
if (version != -1 && version != repo.version) {
|
||||
Utils.debugLog(TAG, "Repo specified a new version: from " + repo.version + " to " + version);
|
||||
values.put(RepoProvider.DataColumns.VERSION, version);
|
||||
values.put(RepoTable.Cols.VERSION, version);
|
||||
}
|
||||
|
||||
if (maxAge != -1 && maxAge != repo.maxage) {
|
||||
Utils.debugLog(TAG, "Repo specified a new maximum age - updated");
|
||||
values.put(RepoProvider.DataColumns.MAX_AGE, maxAge);
|
||||
values.put(RepoTable.Cols.MAX_AGE, maxAge);
|
||||
}
|
||||
|
||||
if (description != null && !description.equals(repo.description)) {
|
||||
values.put(RepoProvider.DataColumns.DESCRIPTION, description);
|
||||
values.put(RepoTable.Cols.DESCRIPTION, description);
|
||||
}
|
||||
|
||||
if (name != null && !name.equals(repo.name)) {
|
||||
values.put(RepoProvider.DataColumns.NAME, name);
|
||||
values.put(RepoTable.Cols.NAME, name);
|
||||
}
|
||||
|
||||
if (timestamp != repo.timestamp) {
|
||||
values.put(RepoProvider.DataColumns.TIMESTAMP, timestamp);
|
||||
values.put(RepoTable.Cols.TIMESTAMP, timestamp);
|
||||
}
|
||||
|
||||
return values;
|
||||
@ -354,8 +355,8 @@ public class RepoUpdater {
|
||||
|
||||
Utils.debugLog(TAG, "Saving new signing certificate in the database for " + repo.address);
|
||||
ContentValues values = new ContentValues(2);
|
||||
values.put(RepoProvider.DataColumns.LAST_UPDATED, Utils.formatDate(new Date(), ""));
|
||||
values.put(RepoProvider.DataColumns.SIGNING_CERT, Hasher.hex(rawCertFromJar));
|
||||
values.put(RepoTable.Cols.LAST_UPDATED, Utils.formatDate(new Date(), ""));
|
||||
values.put(RepoTable.Cols.SIGNING_CERT, Hasher.hex(rawCertFromJar));
|
||||
RepoProvider.Helper.update(context, repo, values);
|
||||
}
|
||||
|
||||
|
@ -47,6 +47,7 @@ import org.fdroid.fdroid.data.App;
|
||||
import org.fdroid.fdroid.data.AppProvider;
|
||||
import org.fdroid.fdroid.data.Repo;
|
||||
import org.fdroid.fdroid.data.RepoProvider;
|
||||
import org.fdroid.fdroid.data.Schema;
|
||||
import org.fdroid.fdroid.installer.InstallManagerService;
|
||||
|
||||
import java.net.URL;
|
||||
@ -415,7 +416,7 @@ public class UpdateService extends IntentService {
|
||||
private void performUpdateNotification() {
|
||||
Cursor cursor = getContentResolver().query(
|
||||
AppProvider.getCanUpdateUri(),
|
||||
AppProvider.DataColumns.ALL,
|
||||
Schema.AppTable.Cols.ALL,
|
||||
null, null, null);
|
||||
if (cursor != null) {
|
||||
if (cursor.getCount() > 0) {
|
||||
@ -461,7 +462,7 @@ public class UpdateService extends IntentService {
|
||||
private void autoDownloadUpdates() {
|
||||
Cursor cursor = getContentResolver().query(
|
||||
AppProvider.getCanUpdateUri(),
|
||||
AppProvider.DataColumns.ALL,
|
||||
Schema.AppTable.Cols.ALL,
|
||||
null, null, null);
|
||||
if (cursor != null) {
|
||||
cursor.moveToFirst();
|
||||
|
@ -7,6 +7,7 @@ import android.os.Build;
|
||||
import android.os.Parcelable;
|
||||
|
||||
import org.fdroid.fdroid.Utils;
|
||||
import org.fdroid.fdroid.data.Schema.ApkTable.Cols;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
@ -73,67 +74,67 @@ public class Apk extends ValueObject implements Comparable<Apk> {
|
||||
|
||||
for (int i = 0; i < cursor.getColumnCount(); i++) {
|
||||
switch (cursor.getColumnName(i)) {
|
||||
case ApkProvider.DataColumns.HASH:
|
||||
case Cols.HASH:
|
||||
hash = cursor.getString(i);
|
||||
break;
|
||||
case ApkProvider.DataColumns.HASH_TYPE:
|
||||
case Cols.HASH_TYPE:
|
||||
hashType = cursor.getString(i);
|
||||
break;
|
||||
case ApkProvider.DataColumns.ADDED_DATE:
|
||||
case Cols.ADDED_DATE:
|
||||
added = Utils.parseDate(cursor.getString(i), null);
|
||||
break;
|
||||
case ApkProvider.DataColumns.FEATURES:
|
||||
case Cols.FEATURES:
|
||||
features = Utils.parseCommaSeparatedString(cursor.getString(i));
|
||||
break;
|
||||
case ApkProvider.DataColumns.PACKAGE_NAME:
|
||||
case Cols.PACKAGE_NAME:
|
||||
packageName = cursor.getString(i);
|
||||
break;
|
||||
case ApkProvider.DataColumns.IS_COMPATIBLE:
|
||||
case Cols.IS_COMPATIBLE:
|
||||
compatible = cursor.getInt(i) == 1;
|
||||
break;
|
||||
case ApkProvider.DataColumns.MIN_SDK_VERSION:
|
||||
case Cols.MIN_SDK_VERSION:
|
||||
minSdkVersion = cursor.getInt(i);
|
||||
break;
|
||||
case ApkProvider.DataColumns.TARGET_SDK_VERSION:
|
||||
case Cols.TARGET_SDK_VERSION:
|
||||
targetSdkVersion = cursor.getInt(i);
|
||||
break;
|
||||
case ApkProvider.DataColumns.MAX_SDK_VERSION:
|
||||
case Cols.MAX_SDK_VERSION:
|
||||
maxSdkVersion = cursor.getInt(i);
|
||||
break;
|
||||
case ApkProvider.DataColumns.NAME:
|
||||
case Cols.NAME:
|
||||
apkName = cursor.getString(i);
|
||||
break;
|
||||
case ApkProvider.DataColumns.PERMISSIONS:
|
||||
case Cols.PERMISSIONS:
|
||||
permissions = Utils.parseCommaSeparatedString(cursor.getString(i));
|
||||
break;
|
||||
case ApkProvider.DataColumns.NATIVE_CODE:
|
||||
case Cols.NATIVE_CODE:
|
||||
nativecode = Utils.parseCommaSeparatedString(cursor.getString(i));
|
||||
break;
|
||||
case ApkProvider.DataColumns.INCOMPATIBLE_REASONS:
|
||||
case Cols.INCOMPATIBLE_REASONS:
|
||||
incompatibleReasons = Utils.parseCommaSeparatedString(cursor.getString(i));
|
||||
break;
|
||||
case ApkProvider.DataColumns.REPO_ID:
|
||||
case Cols.REPO_ID:
|
||||
repo = cursor.getInt(i);
|
||||
break;
|
||||
case ApkProvider.DataColumns.SIGNATURE:
|
||||
case Cols.SIGNATURE:
|
||||
sig = cursor.getString(i);
|
||||
break;
|
||||
case ApkProvider.DataColumns.SIZE:
|
||||
case Cols.SIZE:
|
||||
size = cursor.getInt(i);
|
||||
break;
|
||||
case ApkProvider.DataColumns.SOURCE_NAME:
|
||||
case Cols.SOURCE_NAME:
|
||||
srcname = cursor.getString(i);
|
||||
break;
|
||||
case ApkProvider.DataColumns.VERSION_NAME:
|
||||
case Cols.VERSION_NAME:
|
||||
versionName = cursor.getString(i);
|
||||
break;
|
||||
case ApkProvider.DataColumns.VERSION_CODE:
|
||||
case Cols.VERSION_CODE:
|
||||
versionCode = cursor.getInt(i);
|
||||
break;
|
||||
case ApkProvider.DataColumns.REPO_VERSION:
|
||||
case Cols.REPO_VERSION:
|
||||
repoVersion = cursor.getInt(i);
|
||||
break;
|
||||
case ApkProvider.DataColumns.REPO_ADDRESS:
|
||||
case Cols.REPO_ADDRESS:
|
||||
repoAddress = cursor.getString(i);
|
||||
break;
|
||||
}
|
||||
@ -142,7 +143,7 @@ public class Apk extends ValueObject implements Comparable<Apk> {
|
||||
|
||||
public String getUrl() {
|
||||
if (repoAddress == null || apkName == null) {
|
||||
throw new IllegalStateException("Apk needs to have both ApkProvider.DataColumns.REPO_ADDRESS and ApkProvider.DataColumns.NAME set in order to calculate URL.");
|
||||
throw new IllegalStateException("Apk needs to have both Schema.ApkTable.Cols.REPO_ADDRESS and Schema.ApkTable.Cols.NAME set in order to calculate URL.");
|
||||
}
|
||||
return repoAddress + "/" + apkName.replace(" ", "%20");
|
||||
}
|
||||
@ -191,25 +192,25 @@ public class Apk extends ValueObject implements Comparable<Apk> {
|
||||
|
||||
public ContentValues toContentValues() {
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(ApkProvider.DataColumns.PACKAGE_NAME, packageName);
|
||||
values.put(ApkProvider.DataColumns.VERSION_NAME, versionName);
|
||||
values.put(ApkProvider.DataColumns.VERSION_CODE, versionCode);
|
||||
values.put(ApkProvider.DataColumns.REPO_ID, repo);
|
||||
values.put(ApkProvider.DataColumns.HASH, hash);
|
||||
values.put(ApkProvider.DataColumns.HASH_TYPE, hashType);
|
||||
values.put(ApkProvider.DataColumns.SIGNATURE, sig);
|
||||
values.put(ApkProvider.DataColumns.SOURCE_NAME, srcname);
|
||||
values.put(ApkProvider.DataColumns.SIZE, size);
|
||||
values.put(ApkProvider.DataColumns.NAME, apkName);
|
||||
values.put(ApkProvider.DataColumns.MIN_SDK_VERSION, minSdkVersion);
|
||||
values.put(ApkProvider.DataColumns.TARGET_SDK_VERSION, targetSdkVersion);
|
||||
values.put(ApkProvider.DataColumns.MAX_SDK_VERSION, maxSdkVersion);
|
||||
values.put(ApkProvider.DataColumns.ADDED_DATE, Utils.formatDate(added, ""));
|
||||
values.put(ApkProvider.DataColumns.PERMISSIONS, Utils.serializeCommaSeparatedString(permissions));
|
||||
values.put(ApkProvider.DataColumns.FEATURES, Utils.serializeCommaSeparatedString(features));
|
||||
values.put(ApkProvider.DataColumns.NATIVE_CODE, Utils.serializeCommaSeparatedString(nativecode));
|
||||
values.put(ApkProvider.DataColumns.INCOMPATIBLE_REASONS, Utils.serializeCommaSeparatedString(incompatibleReasons));
|
||||
values.put(ApkProvider.DataColumns.IS_COMPATIBLE, compatible ? 1 : 0);
|
||||
values.put(Cols.PACKAGE_NAME, packageName);
|
||||
values.put(Cols.VERSION_NAME, versionName);
|
||||
values.put(Cols.VERSION_CODE, versionCode);
|
||||
values.put(Cols.REPO_ID, repo);
|
||||
values.put(Cols.HASH, hash);
|
||||
values.put(Cols.HASH_TYPE, hashType);
|
||||
values.put(Cols.SIGNATURE, sig);
|
||||
values.put(Cols.SOURCE_NAME, srcname);
|
||||
values.put(Cols.SIZE, size);
|
||||
values.put(Cols.NAME, apkName);
|
||||
values.put(Cols.MIN_SDK_VERSION, minSdkVersion);
|
||||
values.put(Cols.TARGET_SDK_VERSION, targetSdkVersion);
|
||||
values.put(Cols.MAX_SDK_VERSION, maxSdkVersion);
|
||||
values.put(Cols.ADDED_DATE, Utils.formatDate(added, ""));
|
||||
values.put(Cols.PERMISSIONS, Utils.serializeCommaSeparatedString(permissions));
|
||||
values.put(Cols.FEATURES, Utils.serializeCommaSeparatedString(features));
|
||||
values.put(Cols.NATIVE_CODE, Utils.serializeCommaSeparatedString(nativecode));
|
||||
values.put(Cols.INCOMPATIBLE_REASONS, Utils.serializeCommaSeparatedString(incompatibleReasons));
|
||||
values.put(Cols.IS_COMPATIBLE, compatible ? 1 : 0);
|
||||
return values;
|
||||
}
|
||||
|
||||
|
@ -6,10 +6,12 @@ import android.content.Context;
|
||||
import android.content.UriMatcher;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.provider.BaseColumns;
|
||||
import android.util.Log;
|
||||
|
||||
import org.fdroid.fdroid.Utils;
|
||||
import org.fdroid.fdroid.data.Schema.ApkTable;
|
||||
import org.fdroid.fdroid.data.Schema.ApkTable.Cols;
|
||||
import org.fdroid.fdroid.data.Schema.RepoTable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
@ -85,7 +87,7 @@ public class ApkProvider extends FDroidProvider {
|
||||
}
|
||||
|
||||
public static Apk find(Context context, String packageName, int versionCode) {
|
||||
return find(context, packageName, versionCode, DataColumns.ALL);
|
||||
return find(context, packageName, versionCode, Cols.ALL);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -103,7 +105,7 @@ public class ApkProvider extends FDroidProvider {
|
||||
* @see org.fdroid.fdroid.data.ApkProvider.Helper#find(Context, Repo, List, String[])
|
||||
*/
|
||||
public static List<Apk> find(Context context, Repo repo, List<App> apps) {
|
||||
return find(context, repo, apps, DataColumns.ALL);
|
||||
return find(context, repo, apps, Cols.ALL);
|
||||
}
|
||||
|
||||
public static Apk find(Context context, String packageName, int versionCode, String[] projection) {
|
||||
@ -126,14 +128,14 @@ public class ApkProvider extends FDroidProvider {
|
||||
}
|
||||
|
||||
public static List<Apk> findByPackageName(Context context, String packageName) {
|
||||
return findByPackageName(context, packageName, ApkProvider.DataColumns.ALL);
|
||||
return findByPackageName(context, packageName, Cols.ALL);
|
||||
}
|
||||
|
||||
public static List<Apk> findByPackageName(Context context,
|
||||
String packageName, String[] projection) {
|
||||
ContentResolver resolver = context.getContentResolver();
|
||||
final Uri uri = getAppUri(packageName);
|
||||
final String sort = ApkProvider.DataColumns.VERSION_CODE + " DESC";
|
||||
final String sort = Cols.VERSION_CODE + " DESC";
|
||||
Cursor cursor = resolver.query(uri, projection, null, null, sort);
|
||||
return cursorToList(cursor);
|
||||
}
|
||||
@ -176,7 +178,7 @@ public class ApkProvider extends FDroidProvider {
|
||||
}
|
||||
|
||||
public static Apk get(Context context, Uri uri) {
|
||||
return get(context, uri, DataColumns.ALL);
|
||||
return get(context, uri, Cols.ALL);
|
||||
}
|
||||
|
||||
public static Apk get(Context context, Uri uri, String[] fields) {
|
||||
@ -194,40 +196,6 @@ public class ApkProvider extends FDroidProvider {
|
||||
}
|
||||
}
|
||||
|
||||
public interface DataColumns extends BaseColumns {
|
||||
|
||||
String _COUNT_DISTINCT_ID = "countDistinct";
|
||||
|
||||
String PACKAGE_NAME = "id";
|
||||
String VERSION_NAME = "version";
|
||||
String REPO_ID = "repo";
|
||||
String HASH = "hash";
|
||||
String VERSION_CODE = "vercode";
|
||||
String NAME = "apkName";
|
||||
String SIZE = "size";
|
||||
String SIGNATURE = "sig";
|
||||
String SOURCE_NAME = "srcname";
|
||||
String MIN_SDK_VERSION = "minSdkVersion";
|
||||
String TARGET_SDK_VERSION = "targetSdkVersion";
|
||||
String MAX_SDK_VERSION = "maxSdkVersion";
|
||||
String PERMISSIONS = "permissions";
|
||||
String FEATURES = "features";
|
||||
String NATIVE_CODE = "nativecode";
|
||||
String HASH_TYPE = "hashType";
|
||||
String ADDED_DATE = "added";
|
||||
String IS_COMPATIBLE = "compatible";
|
||||
String INCOMPATIBLE_REASONS = "incompatibleReasons";
|
||||
String REPO_VERSION = "repoVersion";
|
||||
String REPO_ADDRESS = "repoAddress";
|
||||
|
||||
String[] ALL = {
|
||||
_ID, PACKAGE_NAME, VERSION_NAME, REPO_ID, HASH, VERSION_CODE, NAME,
|
||||
SIZE, SIGNATURE, SOURCE_NAME, MIN_SDK_VERSION, TARGET_SDK_VERSION, MAX_SDK_VERSION,
|
||||
PERMISSIONS, FEATURES, NATIVE_CODE, HASH_TYPE, ADDED_DATE,
|
||||
IS_COMPATIBLE, REPO_VERSION, REPO_ADDRESS, INCOMPATIBLE_REASONS,
|
||||
};
|
||||
}
|
||||
|
||||
private static final int CODE_APP = CODE_SINGLE + 1;
|
||||
private static final int CODE_REPO = CODE_APP + 1;
|
||||
private static final int CODE_APKS = CODE_REPO + 1;
|
||||
@ -247,8 +215,8 @@ public class ApkProvider extends FDroidProvider {
|
||||
private static final Map<String, String> REPO_FIELDS = new HashMap<>();
|
||||
|
||||
static {
|
||||
REPO_FIELDS.put(DataColumns.REPO_VERSION, RepoProvider.DataColumns.VERSION);
|
||||
REPO_FIELDS.put(DataColumns.REPO_ADDRESS, RepoProvider.DataColumns.ADDRESS);
|
||||
REPO_FIELDS.put(Cols.REPO_VERSION, RepoTable.Cols.VERSION);
|
||||
REPO_FIELDS.put(Cols.REPO_ADDRESS, RepoTable.Cols.ADDRESS);
|
||||
|
||||
MATCHER.addURI(getAuthority(), PATH_REPO + "/#", CODE_REPO);
|
||||
MATCHER.addURI(getAuthority(), PATH_APK + "/#/*", CODE_SINGLE);
|
||||
@ -352,7 +320,7 @@ public class ApkProvider extends FDroidProvider {
|
||||
|
||||
@Override
|
||||
protected String getTableName() {
|
||||
return DBHelper.TABLE_APK;
|
||||
return ApkTable.NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -371,19 +339,19 @@ public class ApkProvider extends FDroidProvider {
|
||||
|
||||
@Override
|
||||
protected String getRequiredTables() {
|
||||
return DBHelper.TABLE_APK + " AS apk";
|
||||
return ApkTable.NAME + " AS apk";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addField(String field) {
|
||||
if (REPO_FIELDS.containsKey(field)) {
|
||||
addRepoField(REPO_FIELDS.get(field), field);
|
||||
} else if (field.equals(DataColumns._ID)) {
|
||||
} else if (field.equals(Cols._ID)) {
|
||||
appendField("rowid", "apk", "_id");
|
||||
} else if (field.equals(DataColumns._COUNT)) {
|
||||
appendField("COUNT(*) AS " + DataColumns._COUNT);
|
||||
} else if (field.equals(DataColumns._COUNT_DISTINCT_ID)) {
|
||||
appendField("COUNT(DISTINCT apk.id) AS " + DataColumns._COUNT_DISTINCT_ID);
|
||||
} else if (field.equals(Cols._COUNT)) {
|
||||
appendField("COUNT(*) AS " + Cols._COUNT);
|
||||
} else if (field.equals(Cols._COUNT_DISTINCT_ID)) {
|
||||
appendField("COUNT(DISTINCT apk.id) AS " + Cols._COUNT_DISTINCT_ID);
|
||||
} else {
|
||||
appendField(field, "apk");
|
||||
}
|
||||
@ -392,7 +360,7 @@ public class ApkProvider extends FDroidProvider {
|
||||
private void addRepoField(String field, String alias) {
|
||||
if (!repoTableRequired) {
|
||||
repoTableRequired = true;
|
||||
leftJoin(DBHelper.TABLE_REPO, "repo", "apk.repo = repo._id");
|
||||
leftJoin(RepoTable.NAME, "repo", "apk.repo = repo._id");
|
||||
}
|
||||
appendField(field, "repo", alias);
|
||||
}
|
||||
@ -400,7 +368,7 @@ public class ApkProvider extends FDroidProvider {
|
||||
}
|
||||
|
||||
private QuerySelection queryApp(String packageName) {
|
||||
final String selection = DataColumns.PACKAGE_NAME + " = ? ";
|
||||
final String selection = Cols.PACKAGE_NAME + " = ? ";
|
||||
final String[] args = {packageName};
|
||||
return new QuerySelection(selection, args);
|
||||
}
|
||||
@ -417,13 +385,13 @@ public class ApkProvider extends FDroidProvider {
|
||||
}
|
||||
|
||||
protected QuerySelection queryRepo(long repoId) {
|
||||
final String selection = DataColumns.REPO_ID + " = ? ";
|
||||
final String selection = Cols.REPO_ID + " = ? ";
|
||||
final String[] args = {Long.toString(repoId)};
|
||||
return new QuerySelection(selection, args);
|
||||
}
|
||||
|
||||
private QuerySelection queryRepoApps(long repoId, String packageNames) {
|
||||
return queryRepo(repoId).add(AppProvider.queryApps(packageNames, DataColumns.PACKAGE_NAME));
|
||||
return queryRepo(repoId).add(AppProvider.queryApps(packageNames, Cols.PACKAGE_NAME));
|
||||
}
|
||||
|
||||
protected QuerySelection queryApks(String apkKeys) {
|
||||
@ -511,14 +479,14 @@ public class ApkProvider extends FDroidProvider {
|
||||
@Override
|
||||
public Uri insert(Uri uri, ContentValues values) {
|
||||
removeRepoFields(values);
|
||||
validateFields(DataColumns.ALL, values);
|
||||
validateFields(Cols.ALL, values);
|
||||
db().insertOrThrow(getTableName(), null, values);
|
||||
if (!isApplyingBatch()) {
|
||||
getContext().getContentResolver().notifyChange(uri, null);
|
||||
}
|
||||
return getContentUri(
|
||||
values.getAsString(DataColumns.PACKAGE_NAME),
|
||||
values.getAsInteger(DataColumns.VERSION_CODE));
|
||||
values.getAsString(Cols.PACKAGE_NAME),
|
||||
values.getAsInteger(Cols.VERSION_CODE));
|
||||
|
||||
}
|
||||
|
||||
@ -573,7 +541,7 @@ public class ApkProvider extends FDroidProvider {
|
||||
}
|
||||
|
||||
protected int performUpdateUnchecked(Uri uri, ContentValues values, String where, String[] whereArgs) {
|
||||
validateFields(DataColumns.ALL, values);
|
||||
validateFields(Cols.ALL, values);
|
||||
removeRepoFields(values);
|
||||
|
||||
QuerySelection query = new QuerySelection(where, whereArgs);
|
||||
|
@ -32,6 +32,8 @@ import java.util.jar.JarFile;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.fdroid.fdroid.data.Schema.AppTable.Cols;
|
||||
|
||||
public class App extends ValueObject implements Comparable<App> {
|
||||
|
||||
private static final String TAG = "App";
|
||||
@ -151,103 +153,103 @@ public class App extends ValueObject implements Comparable<App> {
|
||||
for (int i = 0; i < cursor.getColumnCount(); i++) {
|
||||
String n = cursor.getColumnName(i);
|
||||
switch (n) {
|
||||
case AppProvider.DataColumns.IS_COMPATIBLE:
|
||||
case Cols.IS_COMPATIBLE:
|
||||
compatible = cursor.getInt(i) == 1;
|
||||
break;
|
||||
case AppProvider.DataColumns.PACKAGE_NAME:
|
||||
case Cols.PACKAGE_NAME:
|
||||
packageName = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.NAME:
|
||||
case Cols.NAME:
|
||||
name = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.SUMMARY:
|
||||
case Cols.SUMMARY:
|
||||
summary = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.ICON:
|
||||
case Cols.ICON:
|
||||
icon = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.DESCRIPTION:
|
||||
case Cols.DESCRIPTION:
|
||||
description = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.LICENSE:
|
||||
case Cols.LICENSE:
|
||||
license = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.AUTHOR:
|
||||
case Cols.AUTHOR:
|
||||
author = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.EMAIL:
|
||||
case Cols.EMAIL:
|
||||
email = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.WEB_URL:
|
||||
case Cols.WEB_URL:
|
||||
webURL = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.TRACKER_URL:
|
||||
case Cols.TRACKER_URL:
|
||||
trackerURL = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.SOURCE_URL:
|
||||
case Cols.SOURCE_URL:
|
||||
sourceURL = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.CHANGELOG_URL:
|
||||
case Cols.CHANGELOG_URL:
|
||||
changelogURL = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.DONATE_URL:
|
||||
case Cols.DONATE_URL:
|
||||
donateURL = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.BITCOIN_ADDR:
|
||||
case Cols.BITCOIN_ADDR:
|
||||
bitcoinAddr = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.LITECOIN_ADDR:
|
||||
case Cols.LITECOIN_ADDR:
|
||||
litecoinAddr = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.FLATTR_ID:
|
||||
case Cols.FLATTR_ID:
|
||||
flattrID = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.SuggestedApk.VERSION_NAME:
|
||||
case Cols.SuggestedApk.VERSION_NAME:
|
||||
suggestedVersionName = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.SUGGESTED_VERSION_CODE:
|
||||
case Cols.SUGGESTED_VERSION_CODE:
|
||||
suggestedVersionCode = cursor.getInt(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.UPSTREAM_VERSION_CODE:
|
||||
case Cols.UPSTREAM_VERSION_CODE:
|
||||
upstreamVersionCode = cursor.getInt(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.UPSTREAM_VERSION_NAME:
|
||||
case Cols.UPSTREAM_VERSION_NAME:
|
||||
upstreamVersionName = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.ADDED:
|
||||
case Cols.ADDED:
|
||||
added = Utils.parseDate(cursor.getString(i), null);
|
||||
break;
|
||||
case AppProvider.DataColumns.LAST_UPDATED:
|
||||
case Cols.LAST_UPDATED:
|
||||
lastUpdated = Utils.parseDate(cursor.getString(i), null);
|
||||
break;
|
||||
case AppProvider.DataColumns.CATEGORIES:
|
||||
case Cols.CATEGORIES:
|
||||
categories = Utils.parseCommaSeparatedString(cursor.getString(i));
|
||||
break;
|
||||
case AppProvider.DataColumns.ANTI_FEATURES:
|
||||
case Cols.ANTI_FEATURES:
|
||||
antiFeatures = Utils.parseCommaSeparatedString(cursor.getString(i));
|
||||
break;
|
||||
case AppProvider.DataColumns.REQUIREMENTS:
|
||||
case Cols.REQUIREMENTS:
|
||||
requirements = Utils.parseCommaSeparatedString(cursor.getString(i));
|
||||
break;
|
||||
case AppProvider.DataColumns.IGNORE_ALLUPDATES:
|
||||
case Cols.IGNORE_ALLUPDATES:
|
||||
ignoreAllUpdates = cursor.getInt(i) == 1;
|
||||
break;
|
||||
case AppProvider.DataColumns.IGNORE_THISUPDATE:
|
||||
case Cols.IGNORE_THISUPDATE:
|
||||
ignoreThisUpdate = cursor.getInt(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.ICON_URL:
|
||||
case Cols.ICON_URL:
|
||||
iconUrl = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.ICON_URL_LARGE:
|
||||
case Cols.ICON_URL_LARGE:
|
||||
iconUrlLarge = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.InstalledApp.VERSION_CODE:
|
||||
case Cols.InstalledApp.VERSION_CODE:
|
||||
installedVersionCode = cursor.getInt(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.InstalledApp.VERSION_NAME:
|
||||
case Cols.InstalledApp.VERSION_NAME:
|
||||
installedVersionName = cursor.getString(i);
|
||||
break;
|
||||
case AppProvider.DataColumns.InstalledApp.SIGNATURE:
|
||||
case Cols.InstalledApp.SIGNATURE:
|
||||
installedSig = cursor.getString(i);
|
||||
break;
|
||||
case "_id":
|
||||
@ -438,35 +440,35 @@ public class App extends ValueObject implements Comparable<App> {
|
||||
public ContentValues toContentValues() {
|
||||
|
||||
final ContentValues values = new ContentValues();
|
||||
values.put(AppProvider.DataColumns.PACKAGE_NAME, packageName);
|
||||
values.put(AppProvider.DataColumns.NAME, name);
|
||||
values.put(AppProvider.DataColumns.SUMMARY, summary);
|
||||
values.put(AppProvider.DataColumns.ICON, icon);
|
||||
values.put(AppProvider.DataColumns.ICON_URL, iconUrl);
|
||||
values.put(AppProvider.DataColumns.ICON_URL_LARGE, iconUrlLarge);
|
||||
values.put(AppProvider.DataColumns.DESCRIPTION, description);
|
||||
values.put(AppProvider.DataColumns.LICENSE, license);
|
||||
values.put(AppProvider.DataColumns.AUTHOR, author);
|
||||
values.put(AppProvider.DataColumns.EMAIL, email);
|
||||
values.put(AppProvider.DataColumns.WEB_URL, webURL);
|
||||
values.put(AppProvider.DataColumns.TRACKER_URL, trackerURL);
|
||||
values.put(AppProvider.DataColumns.SOURCE_URL, sourceURL);
|
||||
values.put(AppProvider.DataColumns.CHANGELOG_URL, changelogURL);
|
||||
values.put(AppProvider.DataColumns.DONATE_URL, donateURL);
|
||||
values.put(AppProvider.DataColumns.BITCOIN_ADDR, bitcoinAddr);
|
||||
values.put(AppProvider.DataColumns.LITECOIN_ADDR, litecoinAddr);
|
||||
values.put(AppProvider.DataColumns.FLATTR_ID, flattrID);
|
||||
values.put(AppProvider.DataColumns.ADDED, Utils.formatDate(added, ""));
|
||||
values.put(AppProvider.DataColumns.LAST_UPDATED, Utils.formatDate(lastUpdated, ""));
|
||||
values.put(AppProvider.DataColumns.SUGGESTED_VERSION_CODE, suggestedVersionCode);
|
||||
values.put(AppProvider.DataColumns.UPSTREAM_VERSION_NAME, upstreamVersionName);
|
||||
values.put(AppProvider.DataColumns.UPSTREAM_VERSION_CODE, upstreamVersionCode);
|
||||
values.put(AppProvider.DataColumns.CATEGORIES, Utils.serializeCommaSeparatedString(categories));
|
||||
values.put(AppProvider.DataColumns.ANTI_FEATURES, Utils.serializeCommaSeparatedString(antiFeatures));
|
||||
values.put(AppProvider.DataColumns.REQUIREMENTS, Utils.serializeCommaSeparatedString(requirements));
|
||||
values.put(AppProvider.DataColumns.IS_COMPATIBLE, compatible ? 1 : 0);
|
||||
values.put(AppProvider.DataColumns.IGNORE_ALLUPDATES, ignoreAllUpdates ? 1 : 0);
|
||||
values.put(AppProvider.DataColumns.IGNORE_THISUPDATE, ignoreThisUpdate);
|
||||
values.put(Cols.PACKAGE_NAME, packageName);
|
||||
values.put(Cols.NAME, name);
|
||||
values.put(Cols.SUMMARY, summary);
|
||||
values.put(Cols.ICON, icon);
|
||||
values.put(Cols.ICON_URL, iconUrl);
|
||||
values.put(Cols.ICON_URL_LARGE, iconUrlLarge);
|
||||
values.put(Cols.DESCRIPTION, description);
|
||||
values.put(Cols.LICENSE, license);
|
||||
values.put(Cols.AUTHOR, author);
|
||||
values.put(Cols.EMAIL, email);
|
||||
values.put(Cols.WEB_URL, webURL);
|
||||
values.put(Cols.TRACKER_URL, trackerURL);
|
||||
values.put(Cols.SOURCE_URL, sourceURL);
|
||||
values.put(Cols.CHANGELOG_URL, changelogURL);
|
||||
values.put(Cols.DONATE_URL, donateURL);
|
||||
values.put(Cols.BITCOIN_ADDR, bitcoinAddr);
|
||||
values.put(Cols.LITECOIN_ADDR, litecoinAddr);
|
||||
values.put(Cols.FLATTR_ID, flattrID);
|
||||
values.put(Cols.ADDED, Utils.formatDate(added, ""));
|
||||
values.put(Cols.LAST_UPDATED, Utils.formatDate(lastUpdated, ""));
|
||||
values.put(Cols.SUGGESTED_VERSION_CODE, suggestedVersionCode);
|
||||
values.put(Cols.UPSTREAM_VERSION_NAME, upstreamVersionName);
|
||||
values.put(Cols.UPSTREAM_VERSION_CODE, upstreamVersionCode);
|
||||
values.put(Cols.CATEGORIES, Utils.serializeCommaSeparatedString(categories));
|
||||
values.put(Cols.ANTI_FEATURES, Utils.serializeCommaSeparatedString(antiFeatures));
|
||||
values.put(Cols.REQUIREMENTS, Utils.serializeCommaSeparatedString(requirements));
|
||||
values.put(Cols.IS_COMPATIBLE, compatible ? 1 : 0);
|
||||
values.put(Cols.IGNORE_ALLUPDATES, ignoreAllUpdates ? 1 : 0);
|
||||
values.put(Cols.IGNORE_THISUPDATE, ignoreThisUpdate);
|
||||
|
||||
return values;
|
||||
}
|
||||
|
@ -13,6 +13,11 @@ import android.util.Log;
|
||||
import org.fdroid.fdroid.Preferences;
|
||||
import org.fdroid.fdroid.R;
|
||||
import org.fdroid.fdroid.Utils;
|
||||
import org.fdroid.fdroid.data.Schema.ApkTable;
|
||||
import org.fdroid.fdroid.data.Schema.AppTable;
|
||||
import org.fdroid.fdroid.data.Schema.AppTable.Cols;
|
||||
import org.fdroid.fdroid.data.Schema.InstalledAppTable;
|
||||
import org.fdroid.fdroid.data.Schema.RepoTable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@ -30,7 +35,7 @@ public class AppProvider extends FDroidProvider {
|
||||
private Helper() { }
|
||||
|
||||
public static int count(Context context, Uri uri) {
|
||||
final String[] projection = {AppProvider.DataColumns._COUNT};
|
||||
final String[] projection = {Cols._COUNT};
|
||||
Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
|
||||
int count = 0;
|
||||
if (cursor != null) {
|
||||
@ -44,7 +49,7 @@ public class AppProvider extends FDroidProvider {
|
||||
}
|
||||
|
||||
public static List<App> all(ContentResolver resolver) {
|
||||
return all(resolver, DataColumns.ALL);
|
||||
return all(resolver, Cols.ALL);
|
||||
}
|
||||
|
||||
public static List<App> all(ContentResolver resolver, String[] projection) {
|
||||
@ -90,7 +95,7 @@ public class AppProvider extends FDroidProvider {
|
||||
public static List<String> categories(Context context) {
|
||||
final ContentResolver resolver = context.getContentResolver();
|
||||
final Uri uri = getContentUri();
|
||||
final String[] projection = {DataColumns.CATEGORIES};
|
||||
final String[] projection = {Cols.CATEGORIES};
|
||||
final Cursor cursor = resolver.query(uri, projection, null, null, null);
|
||||
final Set<String> categorySet = new HashSet<>();
|
||||
if (cursor != null) {
|
||||
@ -121,7 +126,7 @@ public class AppProvider extends FDroidProvider {
|
||||
}
|
||||
|
||||
public static App findByPackageName(ContentResolver resolver, String packageName) {
|
||||
return findByPackageName(resolver, packageName, DataColumns.ALL);
|
||||
return findByPackageName(resolver, packageName, Cols.ALL);
|
||||
}
|
||||
|
||||
public static App findByPackageName(ContentResolver resolver, String packageName,
|
||||
@ -162,68 +167,11 @@ public class AppProvider extends FDroidProvider {
|
||||
static final class UpgradeHelper {
|
||||
|
||||
public static void updateIconUrls(Context context, SQLiteDatabase db) {
|
||||
AppProvider.updateIconUrls(context, db, DBHelper.TABLE_APP, DBHelper.TABLE_APK);
|
||||
AppProvider.updateIconUrls(context, db, AppTable.NAME, ApkTable.NAME);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public interface DataColumns {
|
||||
|
||||
String _ID = "rowid as _id"; // Required for CursorLoaders
|
||||
String _COUNT = "_count";
|
||||
String IS_COMPATIBLE = "compatible";
|
||||
String PACKAGE_NAME = "id";
|
||||
String NAME = "name";
|
||||
String SUMMARY = "summary";
|
||||
String ICON = "icon";
|
||||
String DESCRIPTION = "description";
|
||||
String LICENSE = "license";
|
||||
String AUTHOR = "author";
|
||||
String EMAIL = "email";
|
||||
String WEB_URL = "webURL";
|
||||
String TRACKER_URL = "trackerURL";
|
||||
String SOURCE_URL = "sourceURL";
|
||||
String CHANGELOG_URL = "changelogURL";
|
||||
String DONATE_URL = "donateURL";
|
||||
String BITCOIN_ADDR = "bitcoinAddr";
|
||||
String LITECOIN_ADDR = "litecoinAddr";
|
||||
String FLATTR_ID = "flattrID";
|
||||
String SUGGESTED_VERSION_CODE = "suggestedVercode";
|
||||
String UPSTREAM_VERSION_NAME = "upstreamVersion";
|
||||
String UPSTREAM_VERSION_CODE = "upstreamVercode";
|
||||
String ADDED = "added";
|
||||
String LAST_UPDATED = "lastUpdated";
|
||||
String CATEGORIES = "categories";
|
||||
String ANTI_FEATURES = "antiFeatures";
|
||||
String REQUIREMENTS = "requirements";
|
||||
String IGNORE_ALLUPDATES = "ignoreAllUpdates";
|
||||
String IGNORE_THISUPDATE = "ignoreThisUpdate";
|
||||
String ICON_URL = "iconUrl";
|
||||
String ICON_URL_LARGE = "iconUrlLarge";
|
||||
|
||||
interface SuggestedApk {
|
||||
String VERSION_NAME = "suggestedApkVersion";
|
||||
}
|
||||
|
||||
interface InstalledApp {
|
||||
String VERSION_CODE = "installedVersionCode";
|
||||
String VERSION_NAME = "installedVersionName";
|
||||
String SIGNATURE = "installedSig";
|
||||
}
|
||||
|
||||
String[] ALL = {
|
||||
_ID, IS_COMPATIBLE, PACKAGE_NAME, NAME, SUMMARY, ICON, DESCRIPTION,
|
||||
LICENSE, AUTHOR, EMAIL, WEB_URL, TRACKER_URL, SOURCE_URL,
|
||||
CHANGELOG_URL, DONATE_URL, BITCOIN_ADDR, LITECOIN_ADDR, FLATTR_ID,
|
||||
UPSTREAM_VERSION_NAME, UPSTREAM_VERSION_CODE, ADDED, LAST_UPDATED,
|
||||
CATEGORIES, ANTI_FEATURES, REQUIREMENTS, IGNORE_ALLUPDATES,
|
||||
IGNORE_THISUPDATE, ICON_URL, ICON_URL_LARGE,
|
||||
SUGGESTED_VERSION_CODE, SuggestedApk.VERSION_NAME,
|
||||
InstalledApp.VERSION_CODE, InstalledApp.VERSION_NAME,
|
||||
InstalledApp.SIGNATURE,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* A QuerySelection which is aware of the option/need to join onto the
|
||||
* installed apps table. Not that the base classes
|
||||
@ -296,7 +244,7 @@ public class AppProvider extends FDroidProvider {
|
||||
protected String getRequiredTables() {
|
||||
final String app = getTableName();
|
||||
final String apk = getApkTableName();
|
||||
final String repo = DBHelper.TABLE_REPO;
|
||||
final String repo = RepoTable.NAME;
|
||||
|
||||
return app +
|
||||
" LEFT JOIN " + apk + " ON ( " + apk + ".id = " + app + ".id ) " +
|
||||
@ -326,9 +274,9 @@ public class AppProvider extends FDroidProvider {
|
||||
public void naturalJoinToInstalledTable() {
|
||||
if (!requiresInstalledTable) {
|
||||
join(
|
||||
DBHelper.TABLE_INSTALLED_APP,
|
||||
InstalledAppTable.NAME,
|
||||
"installed",
|
||||
"installed." + InstalledAppProvider.DataColumns.PACKAGE_NAME + " = " + getTableName() + ".id");
|
||||
"installed." + InstalledAppTable.Cols.PACKAGE_NAME + " = " + getTableName() + ".id");
|
||||
requiresInstalledTable = true;
|
||||
}
|
||||
}
|
||||
@ -336,9 +284,9 @@ public class AppProvider extends FDroidProvider {
|
||||
public void leftJoinToInstalledTable() {
|
||||
if (!requiresInstalledTable) {
|
||||
leftJoin(
|
||||
DBHelper.TABLE_INSTALLED_APP,
|
||||
InstalledAppTable.NAME,
|
||||
"installed",
|
||||
"installed." + InstalledAppProvider.DataColumns.PACKAGE_NAME + " = " + getTableName() + ".id");
|
||||
"installed." + InstalledAppTable.Cols.PACKAGE_NAME + " = " + getTableName() + ".id");
|
||||
requiresInstalledTable = true;
|
||||
}
|
||||
}
|
||||
@ -346,23 +294,23 @@ public class AppProvider extends FDroidProvider {
|
||||
@Override
|
||||
public void addField(String field) {
|
||||
switch (field) {
|
||||
case DataColumns.SuggestedApk.VERSION_NAME:
|
||||
case Cols.SuggestedApk.VERSION_NAME:
|
||||
addSuggestedApkVersionField();
|
||||
break;
|
||||
case DataColumns.InstalledApp.VERSION_NAME:
|
||||
case Cols.InstalledApp.VERSION_NAME:
|
||||
addInstalledAppVersionName();
|
||||
break;
|
||||
case DataColumns.InstalledApp.VERSION_CODE:
|
||||
case Cols.InstalledApp.VERSION_CODE:
|
||||
addInstalledAppVersionCode();
|
||||
break;
|
||||
case DataColumns.InstalledApp.SIGNATURE:
|
||||
case Cols.InstalledApp.SIGNATURE:
|
||||
addInstalledSig();
|
||||
break;
|
||||
case DataColumns._COUNT:
|
||||
case Cols._COUNT:
|
||||
appendCountField();
|
||||
break;
|
||||
default:
|
||||
if (field.equals(DataColumns.CATEGORIES)) {
|
||||
if (field.equals(Cols.CATEGORIES)) {
|
||||
categoryFieldAdded = true;
|
||||
}
|
||||
appendField(field, getTableName());
|
||||
@ -372,13 +320,13 @@ public class AppProvider extends FDroidProvider {
|
||||
|
||||
private void appendCountField() {
|
||||
countFieldAppended = true;
|
||||
appendField("COUNT( DISTINCT " + getTableName() + ".id ) AS " + DataColumns._COUNT);
|
||||
appendField("COUNT( DISTINCT " + getTableName() + ".id ) AS " + Cols._COUNT);
|
||||
}
|
||||
|
||||
private void addSuggestedApkVersionField() {
|
||||
addSuggestedApkField(
|
||||
ApkProvider.DataColumns.VERSION_NAME,
|
||||
DataColumns.SuggestedApk.VERSION_NAME);
|
||||
ApkTable.Cols.VERSION_NAME,
|
||||
Cols.SuggestedApk.VERSION_NAME);
|
||||
}
|
||||
|
||||
private void addSuggestedApkField(String fieldName, String alias) {
|
||||
@ -394,22 +342,22 @@ public class AppProvider extends FDroidProvider {
|
||||
|
||||
private void addInstalledAppVersionName() {
|
||||
addInstalledAppField(
|
||||
InstalledAppProvider.DataColumns.VERSION_NAME,
|
||||
DataColumns.InstalledApp.VERSION_NAME
|
||||
InstalledAppTable.Cols.VERSION_NAME,
|
||||
Cols.InstalledApp.VERSION_NAME
|
||||
);
|
||||
}
|
||||
|
||||
private void addInstalledAppVersionCode() {
|
||||
addInstalledAppField(
|
||||
InstalledAppProvider.DataColumns.VERSION_CODE,
|
||||
DataColumns.InstalledApp.VERSION_CODE
|
||||
InstalledAppTable.Cols.VERSION_CODE,
|
||||
Cols.InstalledApp.VERSION_CODE
|
||||
);
|
||||
}
|
||||
|
||||
private void addInstalledSig() {
|
||||
addInstalledAppField(
|
||||
InstalledAppProvider.DataColumns.SIGNATURE,
|
||||
DataColumns.InstalledApp.SIGNATURE
|
||||
InstalledAppTable.Cols.SIGNATURE,
|
||||
Cols.InstalledApp.SIGNATURE
|
||||
);
|
||||
}
|
||||
|
||||
@ -577,11 +525,11 @@ public class AppProvider extends FDroidProvider {
|
||||
|
||||
@Override
|
||||
protected String getTableName() {
|
||||
return DBHelper.TABLE_APP;
|
||||
return AppTable.NAME;
|
||||
}
|
||||
|
||||
protected String getApkTableName() {
|
||||
return DBHelper.TABLE_APK;
|
||||
return ApkTable.NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -602,7 +550,7 @@ public class AppProvider extends FDroidProvider {
|
||||
final String ignoreCurrent = getTableName() + ".ignoreThisUpdate != " + getTableName() + ".suggestedVercode ";
|
||||
final String ignoreAll = getTableName() + ".ignoreAllUpdates != 1 ";
|
||||
final String ignore = " ( " + ignoreCurrent + " AND " + ignoreAll + " ) ";
|
||||
final String where = ignore + " AND " + getTableName() + "." + DataColumns.SUGGESTED_VERSION_CODE + " > installed.versionCode";
|
||||
final String where = ignore + " AND " + getTableName() + "." + Cols.SUGGESTED_VERSION_CODE + " > installed.versionCode";
|
||||
return new AppQuerySelection(where).requireNaturalInstalledTable();
|
||||
}
|
||||
|
||||
@ -821,7 +769,7 @@ public class AppProvider extends FDroidProvider {
|
||||
selection = selection.add(queryExcludeSwap());
|
||||
}
|
||||
|
||||
if (AppProvider.DataColumns.NAME.equals(sortOrder)) {
|
||||
if (Cols.NAME.equals(sortOrder)) {
|
||||
sortOrder = getTableName() + "." + sortOrder + " COLLATE LOCALIZED ";
|
||||
}
|
||||
|
||||
@ -861,7 +809,7 @@ public class AppProvider extends FDroidProvider {
|
||||
if (!isApplyingBatch()) {
|
||||
getContext().getContentResolver().notifyChange(uri, null);
|
||||
}
|
||||
return getContentUri(values.getAsString(DataColumns.PACKAGE_NAME));
|
||||
return getContentUri(values.getAsString(Cols.PACKAGE_NAME));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -1029,7 +977,7 @@ public class AppProvider extends FDroidProvider {
|
||||
*/
|
||||
private static String getIconUpdateQuery(String app, String apk) {
|
||||
|
||||
final String repo = DBHelper.TABLE_REPO;
|
||||
final String repo = RepoTable.NAME;
|
||||
|
||||
final String iconUrlQuery =
|
||||
" SELECT " +
|
||||
|
@ -9,6 +9,10 @@ import android.util.Log;
|
||||
|
||||
import org.fdroid.fdroid.R;
|
||||
import org.fdroid.fdroid.Utils;
|
||||
import org.fdroid.fdroid.data.Schema.ApkTable;
|
||||
import org.fdroid.fdroid.data.Schema.AppTable;
|
||||
import org.fdroid.fdroid.data.Schema.InstalledAppTable;
|
||||
import org.fdroid.fdroid.data.Schema.RepoTable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@ -19,15 +23,8 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
|
||||
private static final String DATABASE_NAME = "fdroid";
|
||||
|
||||
public static final String TABLE_REPO = "fdroid_repo";
|
||||
|
||||
// The TABLE_APK table stores details of all the application versions we
|
||||
// know about. Each relates directly back to an entry in TABLE_APP.
|
||||
// This information is retrieved from the repositories.
|
||||
public static final String TABLE_APK = "fdroid_apk";
|
||||
|
||||
private static final String CREATE_TABLE_REPO = "create table "
|
||||
+ TABLE_REPO + " (_id integer primary key, "
|
||||
+ RepoTable.NAME + " (_id integer primary key, "
|
||||
+ "address text not null, "
|
||||
+ "name text, description text, inuse integer not null, "
|
||||
+ "priority integer not null, pubkey text, fingerprint text, "
|
||||
@ -40,7 +37,7 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
+ ");";
|
||||
|
||||
private static final String CREATE_TABLE_APK =
|
||||
"CREATE TABLE " + TABLE_APK + " ( "
|
||||
"CREATE TABLE " + ApkTable.NAME + " ( "
|
||||
+ "id text not null, "
|
||||
+ "version text not null, "
|
||||
+ "repo integer not null, "
|
||||
@ -63,8 +60,7 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
+ "primary key(id, vercode)"
|
||||
+ ");";
|
||||
|
||||
public static final String TABLE_APP = "fdroid_app";
|
||||
private static final String CREATE_TABLE_APP = "CREATE TABLE " + TABLE_APP
|
||||
private static final String CREATE_TABLE_APP = "CREATE TABLE " + AppTable.NAME
|
||||
+ " ( "
|
||||
+ "id text not null, "
|
||||
+ "name text not null, "
|
||||
@ -97,19 +93,18 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
+ "iconUrlLarge text, "
|
||||
+ "primary key(id));";
|
||||
|
||||
public static final String TABLE_INSTALLED_APP = "fdroid_installedApp";
|
||||
private static final String CREATE_TABLE_INSTALLED_APP = "CREATE TABLE " + TABLE_INSTALLED_APP
|
||||
private static final String CREATE_TABLE_INSTALLED_APP = "CREATE TABLE " + InstalledAppTable.NAME
|
||||
+ " ( "
|
||||
+ InstalledAppProvider.DataColumns.PACKAGE_NAME + " TEXT NOT NULL PRIMARY KEY, "
|
||||
+ InstalledAppProvider.DataColumns.VERSION_CODE + " INT NOT NULL, "
|
||||
+ InstalledAppProvider.DataColumns.VERSION_NAME + " TEXT NOT NULL, "
|
||||
+ InstalledAppProvider.DataColumns.APPLICATION_LABEL + " TEXT NOT NULL, "
|
||||
+ InstalledAppProvider.DataColumns.SIGNATURE + " TEXT NOT NULL, "
|
||||
+ InstalledAppProvider.DataColumns.LAST_UPDATE_TIME + " INTEGER NOT NULL DEFAULT 0, "
|
||||
+ InstalledAppProvider.DataColumns.HASH_TYPE + " TEXT NOT NULL, "
|
||||
+ InstalledAppProvider.DataColumns.HASH + " TEXT NOT NULL"
|
||||
+ InstalledAppTable.Cols.PACKAGE_NAME + " TEXT NOT NULL PRIMARY KEY, "
|
||||
+ InstalledAppTable.Cols.VERSION_CODE + " INT NOT NULL, "
|
||||
+ InstalledAppTable.Cols.VERSION_NAME + " TEXT NOT NULL, "
|
||||
+ InstalledAppTable.Cols.APPLICATION_LABEL + " TEXT NOT NULL, "
|
||||
+ InstalledAppTable.Cols.SIGNATURE + " TEXT NOT NULL, "
|
||||
+ InstalledAppTable.Cols.LAST_UPDATE_TIME + " INTEGER NOT NULL DEFAULT 0, "
|
||||
+ InstalledAppTable.Cols.HASH_TYPE + " TEXT NOT NULL, "
|
||||
+ InstalledAppTable.Cols.HASH + " TEXT NOT NULL"
|
||||
+ " );";
|
||||
private static final String DROP_TABLE_INSTALLED_APP = "DROP TABLE " + TABLE_INSTALLED_APP + ";";
|
||||
private static final String DROP_TABLE_INSTALLED_APP = "DROP TABLE " + InstalledAppTable.NAME + ";";
|
||||
|
||||
private static final int DB_VERSION = 57;
|
||||
|
||||
@ -126,7 +121,7 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
}
|
||||
Utils.debugLog(TAG, "Populating repo names from the url");
|
||||
final String[] columns = {"address", "_id"};
|
||||
Cursor cursor = db.query(TABLE_REPO, columns,
|
||||
Cursor cursor = db.query(RepoTable.NAME, columns,
|
||||
"name IS NULL OR name = ''", null, null, null, null);
|
||||
if (cursor != null) {
|
||||
if (cursor.getCount() > 0) {
|
||||
@ -139,7 +134,7 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
values.put("name", name);
|
||||
final String[] args = {Long.toString(id)};
|
||||
Utils.debugLog(TAG, "Setting repo name to '" + name + "' for repo " + address);
|
||||
db.update(TABLE_REPO, values, "_id = ?", args);
|
||||
db.update(RepoTable.NAME, values, "_id = ?", args);
|
||||
cursor.moveToNext();
|
||||
}
|
||||
}
|
||||
@ -148,17 +143,17 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
}
|
||||
|
||||
private void renameRepoId(SQLiteDatabase db, int oldVersion) {
|
||||
if (oldVersion >= 36 || columnExists(db, TABLE_REPO, "_id")) {
|
||||
if (oldVersion >= 36 || columnExists(db, RepoTable.NAME, "_id")) {
|
||||
return;
|
||||
}
|
||||
|
||||
Utils.debugLog(TAG, "Renaming " + TABLE_REPO + ".id to _id");
|
||||
Utils.debugLog(TAG, "Renaming " + RepoTable.NAME + ".id to _id");
|
||||
db.beginTransaction();
|
||||
|
||||
try {
|
||||
// http://stackoverflow.com/questions/805363/how-do-i-rename-a-column-in-a-sqlite-database-table#805508
|
||||
String tempTableName = TABLE_REPO + "__temp__";
|
||||
db.execSQL("ALTER TABLE " + TABLE_REPO + " RENAME TO " + tempTableName + ";");
|
||||
String tempTableName = RepoTable.NAME + "__temp__";
|
||||
db.execSQL("ALTER TABLE " + RepoTable.NAME + " RENAME TO " + tempTableName + ";");
|
||||
|
||||
// I realise this is available in the CREATE_TABLE_REPO above,
|
||||
// however I have a feeling that it will need to be the same as the
|
||||
@ -167,7 +162,7 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
// got removed, then it will break the "insert select"
|
||||
// statement. Therefore, I've put a copy of CREATE_TABLE_REPO
|
||||
// here that is the same as it was at DBVersion 36.
|
||||
String createTableDdl = "create table " + TABLE_REPO + " ("
|
||||
String createTableDdl = "create table " + RepoTable.NAME + " ("
|
||||
+ "_id integer not null primary key, "
|
||||
+ "address text not null, "
|
||||
+ "name text, "
|
||||
@ -186,7 +181,7 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
String nonIdFields = "address, name, description, inuse, priority, " +
|
||||
"pubkey, fingerprint, maxage, version, lastetag, lastUpdated";
|
||||
|
||||
String insertSql = "INSERT INTO " + TABLE_REPO +
|
||||
String insertSql = "INSERT INTO " + RepoTable.NAME +
|
||||
"(_id, " + nonIdFields + " ) " +
|
||||
"SELECT id, " + nonIdFields + " FROM " + tempTableName + ";";
|
||||
|
||||
@ -256,20 +251,20 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
int priority) {
|
||||
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(RepoProvider.DataColumns.ADDRESS, address);
|
||||
values.put(RepoProvider.DataColumns.NAME, name);
|
||||
values.put(RepoProvider.DataColumns.DESCRIPTION, description);
|
||||
values.put(RepoProvider.DataColumns.SIGNING_CERT, pubKey);
|
||||
values.put(RepoProvider.DataColumns.FINGERPRINT, Utils.calcFingerprint(pubKey));
|
||||
values.put(RepoProvider.DataColumns.MAX_AGE, 0);
|
||||
values.put(RepoProvider.DataColumns.VERSION, version);
|
||||
values.put(RepoProvider.DataColumns.IN_USE, inUse);
|
||||
values.put(RepoProvider.DataColumns.PRIORITY, priority);
|
||||
values.put(RepoProvider.DataColumns.LAST_ETAG, (String) null);
|
||||
values.put(RepoProvider.DataColumns.TIMESTAMP, 0);
|
||||
values.put(RepoTable.Cols.ADDRESS, address);
|
||||
values.put(RepoTable.Cols.NAME, name);
|
||||
values.put(RepoTable.Cols.DESCRIPTION, description);
|
||||
values.put(RepoTable.Cols.SIGNING_CERT, pubKey);
|
||||
values.put(RepoTable.Cols.FINGERPRINT, Utils.calcFingerprint(pubKey));
|
||||
values.put(RepoTable.Cols.MAX_AGE, 0);
|
||||
values.put(RepoTable.Cols.VERSION, version);
|
||||
values.put(RepoTable.Cols.IN_USE, inUse);
|
||||
values.put(RepoTable.Cols.PRIORITY, priority);
|
||||
values.put(RepoTable.Cols.LAST_ETAG, (String) null);
|
||||
values.put(RepoTable.Cols.TIMESTAMP, 0);
|
||||
|
||||
Utils.debugLog(TAG, "Adding repository " + name);
|
||||
db.insert(TABLE_REPO, null, values);
|
||||
db.insert(RepoTable.NAME, null, values);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -312,7 +307,7 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
return;
|
||||
}
|
||||
List<Repo> oldrepos = new ArrayList<>();
|
||||
Cursor cursor = db.query(TABLE_REPO,
|
||||
Cursor cursor = db.query(RepoTable.NAME,
|
||||
new String[] {"address", "inuse", "pubkey"},
|
||||
null, null, null, null, null);
|
||||
if (cursor != null) {
|
||||
@ -329,7 +324,7 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
}
|
||||
cursor.close();
|
||||
}
|
||||
db.execSQL("drop table " + TABLE_REPO);
|
||||
db.execSQL("drop table " + RepoTable.NAME);
|
||||
db.execSQL(CREATE_TABLE_REPO);
|
||||
for (final Repo repo : oldrepos) {
|
||||
ContentValues values = new ContentValues();
|
||||
@ -338,7 +333,7 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
values.put("priority", 10);
|
||||
values.put("pubkey", repo.signingCertificate);
|
||||
values.put("lastetag", (String) null);
|
||||
db.insert(TABLE_REPO, null, values);
|
||||
db.insert(RepoTable.NAME, null, values);
|
||||
}
|
||||
}
|
||||
|
||||
@ -348,7 +343,7 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
values.clear();
|
||||
values.put("name", context.getString(nameResId));
|
||||
values.put("description", context.getString(descriptionResId));
|
||||
db.update(TABLE_REPO, values, "address = ?", new String[] {
|
||||
db.update(RepoTable.NAME, values, "address = ?", new String[] {
|
||||
context.getString(addressResId),
|
||||
});
|
||||
}
|
||||
@ -358,16 +353,16 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
* default repos with values from strings.xml.
|
||||
*/
|
||||
private void addNameAndDescriptionToRepo(SQLiteDatabase db, int oldVersion) {
|
||||
boolean nameExists = columnExists(db, TABLE_REPO, "name");
|
||||
boolean descriptionExists = columnExists(db, TABLE_REPO, "description");
|
||||
boolean nameExists = columnExists(db, RepoTable.NAME, "name");
|
||||
boolean descriptionExists = columnExists(db, RepoTable.NAME, "description");
|
||||
if (oldVersion >= 21 || (nameExists && descriptionExists)) {
|
||||
return;
|
||||
}
|
||||
if (!nameExists) {
|
||||
db.execSQL("alter table " + TABLE_REPO + " add column name text");
|
||||
db.execSQL("alter table " + RepoTable.NAME + " add column name text");
|
||||
}
|
||||
if (!descriptionExists) {
|
||||
db.execSQL("alter table " + TABLE_REPO + " add column description text");
|
||||
db.execSQL("alter table " + RepoTable.NAME + " add column description text");
|
||||
}
|
||||
insertNameAndDescription(db, R.string.fdroid_repo_address,
|
||||
R.string.fdroid_repo_name, R.string.fdroid_repo_description);
|
||||
@ -388,11 +383,11 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
if (oldVersion >= 44) {
|
||||
return;
|
||||
}
|
||||
if (!columnExists(db, TABLE_REPO, "fingerprint")) {
|
||||
db.execSQL("alter table " + TABLE_REPO + " add column fingerprint text");
|
||||
if (!columnExists(db, RepoTable.NAME, "fingerprint")) {
|
||||
db.execSQL("alter table " + RepoTable.NAME + " add column fingerprint text");
|
||||
}
|
||||
List<Repo> oldrepos = new ArrayList<>();
|
||||
Cursor cursor = db.query(TABLE_REPO,
|
||||
Cursor cursor = db.query(RepoTable.NAME,
|
||||
new String[] {"address", "pubkey"},
|
||||
null, null, null, null, null);
|
||||
if (cursor != null) {
|
||||
@ -411,69 +406,69 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
for (final Repo repo : oldrepos) {
|
||||
ContentValues values = new ContentValues();
|
||||
values.put("fingerprint", Utils.calcFingerprint(repo.signingCertificate));
|
||||
db.update(TABLE_REPO, values, "address = ?", new String[] {repo.address});
|
||||
db.update(RepoTable.NAME, values, "address = ?", new String[] {repo.address});
|
||||
}
|
||||
}
|
||||
|
||||
private void addMaxAgeToRepo(SQLiteDatabase db, int oldVersion) {
|
||||
if (oldVersion >= 30 || columnExists(db, TABLE_REPO, "maxage")) {
|
||||
if (oldVersion >= 30 || columnExists(db, RepoTable.NAME, "maxage")) {
|
||||
return;
|
||||
}
|
||||
db.execSQL("alter table " + TABLE_REPO + " add column maxage integer not null default 0");
|
||||
db.execSQL("alter table " + RepoTable.NAME + " add column maxage integer not null default 0");
|
||||
}
|
||||
|
||||
private void addVersionToRepo(SQLiteDatabase db, int oldVersion) {
|
||||
if (oldVersion >= 33 || columnExists(db, TABLE_REPO, "version")) {
|
||||
if (oldVersion >= 33 || columnExists(db, RepoTable.NAME, "version")) {
|
||||
return;
|
||||
}
|
||||
db.execSQL("alter table " + TABLE_REPO + " add column version integer not null default 0");
|
||||
db.execSQL("alter table " + RepoTable.NAME + " add column version integer not null default 0");
|
||||
}
|
||||
|
||||
private void addLastUpdatedToRepo(SQLiteDatabase db, int oldVersion) {
|
||||
if (oldVersion >= 35 || columnExists(db, TABLE_REPO, "lastUpdated")) {
|
||||
if (oldVersion >= 35 || columnExists(db, RepoTable.NAME, "lastUpdated")) {
|
||||
return;
|
||||
}
|
||||
Utils.debugLog(TAG, "Adding lastUpdated column to " + TABLE_REPO);
|
||||
db.execSQL("Alter table " + TABLE_REPO + " add column lastUpdated string");
|
||||
Utils.debugLog(TAG, "Adding lastUpdated column to " + RepoTable.NAME);
|
||||
db.execSQL("Alter table " + RepoTable.NAME + " add column lastUpdated string");
|
||||
}
|
||||
|
||||
private void addIsSwapToRepo(SQLiteDatabase db, int oldVersion) {
|
||||
if (oldVersion >= 47 || columnExists(db, TABLE_REPO, "isSwap")) {
|
||||
if (oldVersion >= 47 || columnExists(db, RepoTable.NAME, "isSwap")) {
|
||||
return;
|
||||
}
|
||||
Utils.debugLog(TAG, "Adding isSwap field to " + TABLE_REPO + " table in db.");
|
||||
db.execSQL("alter table " + TABLE_REPO + " add column isSwap boolean default 0;");
|
||||
Utils.debugLog(TAG, "Adding isSwap field to " + RepoTable.NAME + " table in db.");
|
||||
db.execSQL("alter table " + RepoTable.NAME + " add column isSwap boolean default 0;");
|
||||
}
|
||||
|
||||
private void addCredentialsToRepo(SQLiteDatabase db, int oldVersion) {
|
||||
if (oldVersion >= 52) {
|
||||
return;
|
||||
}
|
||||
if (!columnExists(db, TABLE_REPO, "username")) {
|
||||
Utils.debugLog(TAG, "Adding username field to " + TABLE_REPO + " table in db.");
|
||||
db.execSQL("alter table " + TABLE_REPO + " add column username string;");
|
||||
if (!columnExists(db, Schema.RepoTable.NAME, "username")) {
|
||||
Utils.debugLog(TAG, "Adding username field to " + RepoTable.NAME + " table in db.");
|
||||
db.execSQL("alter table " + RepoTable.NAME + " add column username string;");
|
||||
}
|
||||
|
||||
if (!columnExists(db, TABLE_REPO, "password")) {
|
||||
Utils.debugLog(TAG, "Adding password field to " + TABLE_REPO + " table in db.");
|
||||
db.execSQL("alter table " + TABLE_REPO + " add column password string;");
|
||||
if (!columnExists(db, RepoTable.NAME, "password")) {
|
||||
Utils.debugLog(TAG, "Adding password field to " + RepoTable.NAME + " table in db.");
|
||||
db.execSQL("alter table " + RepoTable.NAME + " add column password string;");
|
||||
}
|
||||
}
|
||||
|
||||
private void addChangelogToApp(SQLiteDatabase db, int oldVersion) {
|
||||
if (oldVersion >= 48 || columnExists(db, TABLE_APP, "changelogURL")) {
|
||||
if (oldVersion >= 48 || columnExists(db, AppTable.NAME, "changelogURL")) {
|
||||
return;
|
||||
}
|
||||
Utils.debugLog(TAG, "Adding changelogURL column to " + TABLE_APP);
|
||||
db.execSQL("alter table " + TABLE_APP + " add column changelogURL text");
|
||||
Utils.debugLog(TAG, "Adding changelogURL column to " + AppTable.NAME);
|
||||
db.execSQL("alter table " + AppTable.NAME + " add column changelogURL text");
|
||||
}
|
||||
|
||||
private void addIconUrlLargeToApp(SQLiteDatabase db, int oldVersion) {
|
||||
if (oldVersion >= 49 || columnExists(db, TABLE_APP, "iconUrlLarge")) {
|
||||
if (oldVersion >= 49 || columnExists(db, AppTable.NAME, "iconUrlLarge")) {
|
||||
return;
|
||||
}
|
||||
Utils.debugLog(TAG, "Adding iconUrlLarge columns to " + TABLE_APP);
|
||||
db.execSQL("alter table " + TABLE_APP + " add column iconUrlLarge text");
|
||||
Utils.debugLog(TAG, "Adding iconUrlLarge columns to " + AppTable.NAME);
|
||||
db.execSQL("alter table " + AppTable.NAME + " add column iconUrlLarge text");
|
||||
}
|
||||
|
||||
private void updateIconUrlLarge(SQLiteDatabase db, int oldVersion) {
|
||||
@ -489,13 +484,13 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
if (oldVersion >= 53) {
|
||||
return;
|
||||
}
|
||||
if (!columnExists(db, TABLE_APP, "author")) {
|
||||
Utils.debugLog(TAG, "Adding author column to " + TABLE_APP);
|
||||
db.execSQL("alter table " + TABLE_APP + " add column author text");
|
||||
if (!columnExists(db, AppTable.NAME, "author")) {
|
||||
Utils.debugLog(TAG, "Adding author column to " + AppTable.NAME);
|
||||
db.execSQL("alter table " + AppTable.NAME + " add column author text");
|
||||
}
|
||||
if (!columnExists(db, TABLE_APP, "email")) {
|
||||
Utils.debugLog(TAG, "Adding email column to " + TABLE_APP);
|
||||
db.execSQL("alter table " + TABLE_APP + " add column email text");
|
||||
if (!columnExists(db, AppTable.NAME, "email")) {
|
||||
Utils.debugLog(TAG, "Adding email column to " + AppTable.NAME);
|
||||
db.execSQL("alter table " + AppTable.NAME + " add column email text");
|
||||
}
|
||||
}
|
||||
|
||||
@ -505,8 +500,8 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
}
|
||||
Utils.debugLog(TAG, "Converting maxSdkVersion value 0 to " + Byte.MAX_VALUE);
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(ApkProvider.DataColumns.MAX_SDK_VERSION, Byte.MAX_VALUE);
|
||||
db.update(TABLE_APK, values, ApkProvider.DataColumns.MAX_SDK_VERSION + " < 1", null);
|
||||
values.put(ApkTable.Cols.MAX_SDK_VERSION, Byte.MAX_VALUE);
|
||||
db.update(ApkTable.NAME, values, ApkTable.Cols.MAX_SDK_VERSION + " < 1", null);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -517,10 +512,10 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
if (oldVersion >= 55) {
|
||||
return;
|
||||
}
|
||||
if (!columnExists(db, TABLE_REPO, RepoProvider.DataColumns.TIMESTAMP)) {
|
||||
Utils.debugLog(TAG, "Adding " + RepoProvider.DataColumns.TIMESTAMP + " column to " + TABLE_REPO);
|
||||
db.execSQL("alter table " + TABLE_REPO + " add column "
|
||||
+ RepoProvider.DataColumns.TIMESTAMP + " integer not null default 0");
|
||||
if (!columnExists(db, RepoTable.NAME, RepoTable.Cols.TIMESTAMP)) {
|
||||
Utils.debugLog(TAG, "Adding " + RepoTable.Cols.TIMESTAMP + " column to " + RepoTable.NAME);
|
||||
db.execSQL("alter table " + RepoTable.NAME + " add column "
|
||||
+ RepoTable.Cols.TIMESTAMP + " integer not null default 0");
|
||||
}
|
||||
}
|
||||
|
||||
@ -531,7 +526,7 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
*/
|
||||
private void clearRepoEtags(SQLiteDatabase db) {
|
||||
Utils.debugLog(TAG, "Clearing repo etags, so next update will not be skipped with \"Repos up to date\".");
|
||||
db.execSQL("update " + TABLE_REPO + " set lastetag = NULL");
|
||||
db.execSQL("update " + RepoTable.NAME + " set lastetag = NULL");
|
||||
}
|
||||
|
||||
private void resetTransient(SQLiteDatabase db, int oldVersion) {
|
||||
@ -545,18 +540,18 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
}
|
||||
context.getSharedPreferences("FDroid", Context.MODE_PRIVATE).edit()
|
||||
.putBoolean("triedEmptyUpdate", false).commit();
|
||||
db.execSQL("drop table " + TABLE_APP);
|
||||
db.execSQL("drop table " + TABLE_APK);
|
||||
db.execSQL("drop table " + AppTable.NAME);
|
||||
db.execSQL("drop table " + ApkTable.NAME);
|
||||
clearRepoEtags(db);
|
||||
createAppApk(db);
|
||||
}
|
||||
|
||||
private static void createAppApk(SQLiteDatabase db) {
|
||||
db.execSQL(CREATE_TABLE_APP);
|
||||
db.execSQL("create index app_id on " + TABLE_APP + " (id);");
|
||||
db.execSQL("create index app_id on " + AppTable.NAME + " (id);");
|
||||
db.execSQL(CREATE_TABLE_APK);
|
||||
db.execSQL("create index apk_vercode on " + TABLE_APK + " (vercode);");
|
||||
db.execSQL("create index apk_id on " + TABLE_APK + " (id);");
|
||||
db.execSQL("create index apk_vercode on " + ApkTable.NAME + " (vercode);");
|
||||
db.execSQL("create index apk_id on " + ApkTable.NAME + " (id);");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -578,10 +573,10 @@ class DBHelper extends SQLiteOpenHelper {
|
||||
if (oldVersion >= 57) {
|
||||
return;
|
||||
}
|
||||
Utils.debugLog(TAG, "Adding " + ApkProvider.DataColumns.TARGET_SDK_VERSION
|
||||
+ " columns to " + TABLE_APK);
|
||||
db.execSQL("alter table " + TABLE_APK + " add column "
|
||||
+ ApkProvider.DataColumns.TARGET_SDK_VERSION + " integer");
|
||||
Utils.debugLog(TAG, "Adding " + ApkTable.Cols.TARGET_SDK_VERSION
|
||||
+ " columns to " + ApkTable.NAME);
|
||||
db.execSQL("alter table " + ApkTable.NAME + " add column "
|
||||
+ ApkTable.Cols.TARGET_SDK_VERSION + " integer");
|
||||
}
|
||||
|
||||
private static boolean columnExists(SQLiteDatabase db,
|
||||
|
@ -13,6 +13,8 @@ import android.util.Log;
|
||||
|
||||
import org.fdroid.fdroid.R;
|
||||
import org.fdroid.fdroid.Utils;
|
||||
import org.fdroid.fdroid.data.Schema.InstalledAppTable;
|
||||
import org.fdroid.fdroid.data.Schema.InstalledAppTable.Cols;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@ -32,15 +34,15 @@ public class InstalledAppProvider extends FDroidProvider {
|
||||
Map<String, Long> cachedInfo = new HashMap<>();
|
||||
|
||||
final Uri uri = InstalledAppProvider.getContentUri();
|
||||
final String[] projection = InstalledAppProvider.DataColumns.ALL;
|
||||
final String[] projection = Cols.ALL;
|
||||
Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
|
||||
if (cursor != null) {
|
||||
if (cursor.getCount() > 0) {
|
||||
cursor.moveToFirst();
|
||||
while (!cursor.isAfterLast()) {
|
||||
cachedInfo.put(
|
||||
cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.PACKAGE_NAME)),
|
||||
cursor.getLong(cursor.getColumnIndex(DataColumns.LAST_UPDATE_TIME))
|
||||
cursor.getString(cursor.getColumnIndex(Cols.PACKAGE_NAME)),
|
||||
cursor.getLong(cursor.getColumnIndex(Cols.LAST_UPDATE_TIME))
|
||||
);
|
||||
cursor.moveToNext();
|
||||
}
|
||||
@ -53,25 +55,6 @@ public class InstalledAppProvider extends FDroidProvider {
|
||||
|
||||
}
|
||||
|
||||
public interface DataColumns {
|
||||
|
||||
String _ID = "rowid as _id"; // Required for CursorLoaders
|
||||
String PACKAGE_NAME = "appId";
|
||||
String VERSION_CODE = "versionCode";
|
||||
String VERSION_NAME = "versionName";
|
||||
String APPLICATION_LABEL = "applicationLabel";
|
||||
String SIGNATURE = "sig";
|
||||
String LAST_UPDATE_TIME = "lastUpdateTime";
|
||||
String HASH_TYPE = "hashType";
|
||||
String HASH = "hash";
|
||||
|
||||
String[] ALL = {
|
||||
_ID, PACKAGE_NAME, VERSION_CODE, VERSION_NAME, APPLICATION_LABEL,
|
||||
SIGNATURE, LAST_UPDATE_TIME, HASH_TYPE, HASH,
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
private static final String PROVIDER_NAME = "InstalledAppProvider";
|
||||
|
||||
private static final String PATH_SEARCH = "search";
|
||||
@ -117,7 +100,7 @@ public class InstalledAppProvider extends FDroidProvider {
|
||||
|
||||
@Override
|
||||
protected String getTableName() {
|
||||
return DBHelper.TABLE_INSTALLED_APP;
|
||||
return InstalledAppTable.NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -146,7 +129,7 @@ public class InstalledAppProvider extends FDroidProvider {
|
||||
@Override
|
||||
public Cursor query(Uri uri, String[] projection, String customSelection, String[] selectionArgs, String sortOrder) {
|
||||
if (sortOrder == null) {
|
||||
sortOrder = DataColumns.APPLICATION_LABEL;
|
||||
sortOrder = Cols.APPLICATION_LABEL;
|
||||
}
|
||||
|
||||
QuerySelection selection = new QuerySelection(customSelection, selectionArgs);
|
||||
@ -195,7 +178,7 @@ public class InstalledAppProvider extends FDroidProvider {
|
||||
|
||||
verifyVersionNameNotNull(values);
|
||||
db().replaceOrThrow(getTableName(), null, values);
|
||||
return getAppUri(values.getAsString(DataColumns.PACKAGE_NAME));
|
||||
return getAppUri(values.getAsString(Cols.PACKAGE_NAME));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -215,8 +198,8 @@ public class InstalledAppProvider extends FDroidProvider {
|
||||
* "versionName" is used.
|
||||
*/
|
||||
private void verifyVersionNameNotNull(ContentValues values) {
|
||||
if (values.containsKey(DataColumns.VERSION_NAME) && values.getAsString(DataColumns.VERSION_NAME) == null) {
|
||||
values.put(DataColumns.VERSION_NAME, getContext().getString(R.string.unknown));
|
||||
if (values.containsKey(Cols.VERSION_NAME) && values.getAsString(Cols.VERSION_NAME) == null) {
|
||||
values.put(Cols.VERSION_NAME, getContext().getString(R.string.unknown));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,7 @@ import android.support.annotation.Nullable;
|
||||
|
||||
import org.fdroid.fdroid.Hasher;
|
||||
import org.fdroid.fdroid.Utils;
|
||||
import org.fdroid.fdroid.data.Schema.InstalledAppTable;
|
||||
|
||||
import java.io.File;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
@ -204,16 +205,16 @@ public class InstalledAppProviderService extends IntentService {
|
||||
static void insertAppIntoDb(Context context, PackageInfo packageInfo, String hashType, String hash) {
|
||||
Uri uri = InstalledAppProvider.getContentUri();
|
||||
ContentValues contentValues = new ContentValues();
|
||||
contentValues.put(InstalledAppProvider.DataColumns.PACKAGE_NAME, packageInfo.packageName);
|
||||
contentValues.put(InstalledAppProvider.DataColumns.VERSION_CODE, packageInfo.versionCode);
|
||||
contentValues.put(InstalledAppProvider.DataColumns.VERSION_NAME, packageInfo.versionName);
|
||||
contentValues.put(InstalledAppProvider.DataColumns.APPLICATION_LABEL,
|
||||
contentValues.put(InstalledAppTable.Cols.PACKAGE_NAME, packageInfo.packageName);
|
||||
contentValues.put(InstalledAppTable.Cols.VERSION_CODE, packageInfo.versionCode);
|
||||
contentValues.put(InstalledAppTable.Cols.VERSION_NAME, packageInfo.versionName);
|
||||
contentValues.put(InstalledAppTable.Cols.APPLICATION_LABEL,
|
||||
InstalledAppProvider.getApplicationLabel(context, packageInfo.packageName));
|
||||
contentValues.put(InstalledAppProvider.DataColumns.SIGNATURE, getPackageSig(packageInfo));
|
||||
contentValues.put(InstalledAppProvider.DataColumns.LAST_UPDATE_TIME, packageInfo.lastUpdateTime);
|
||||
contentValues.put(InstalledAppTable.Cols.SIGNATURE, getPackageSig(packageInfo));
|
||||
contentValues.put(InstalledAppTable.Cols.LAST_UPDATE_TIME, packageInfo.lastUpdateTime);
|
||||
|
||||
contentValues.put(InstalledAppProvider.DataColumns.HASH_TYPE, hashType);
|
||||
contentValues.put(InstalledAppProvider.DataColumns.HASH, hash);
|
||||
contentValues.put(InstalledAppTable.Cols.HASH_TYPE, hashType);
|
||||
contentValues.put(InstalledAppTable.Cols.HASH, hash);
|
||||
|
||||
context.getContentResolver().insert(uri, contentValues);
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import android.database.Cursor;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import org.fdroid.fdroid.Utils;
|
||||
import org.fdroid.fdroid.data.Schema.RepoTable.Cols;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
@ -52,52 +53,52 @@ public class Repo extends ValueObject {
|
||||
|
||||
for (int i = 0; i < cursor.getColumnCount(); i++) {
|
||||
switch (cursor.getColumnName(i)) {
|
||||
case RepoProvider.DataColumns._ID:
|
||||
case Cols._ID:
|
||||
id = cursor.getInt(i);
|
||||
break;
|
||||
case RepoProvider.DataColumns.LAST_ETAG:
|
||||
case Cols.LAST_ETAG:
|
||||
lastetag = cursor.getString(i);
|
||||
break;
|
||||
case RepoProvider.DataColumns.ADDRESS:
|
||||
case Cols.ADDRESS:
|
||||
address = cursor.getString(i);
|
||||
break;
|
||||
case RepoProvider.DataColumns.DESCRIPTION:
|
||||
case Cols.DESCRIPTION:
|
||||
description = cursor.getString(i);
|
||||
break;
|
||||
case RepoProvider.DataColumns.FINGERPRINT:
|
||||
case Cols.FINGERPRINT:
|
||||
fingerprint = cursor.getString(i);
|
||||
break;
|
||||
case RepoProvider.DataColumns.IN_USE:
|
||||
case Cols.IN_USE:
|
||||
inuse = cursor.getInt(i) == 1;
|
||||
break;
|
||||
case RepoProvider.DataColumns.LAST_UPDATED:
|
||||
case Cols.LAST_UPDATED:
|
||||
lastUpdated = Utils.parseTime(cursor.getString(i), null);
|
||||
break;
|
||||
case RepoProvider.DataColumns.MAX_AGE:
|
||||
case Cols.MAX_AGE:
|
||||
maxage = cursor.getInt(i);
|
||||
break;
|
||||
case RepoProvider.DataColumns.VERSION:
|
||||
case Cols.VERSION:
|
||||
version = cursor.getInt(i);
|
||||
break;
|
||||
case RepoProvider.DataColumns.NAME:
|
||||
case Cols.NAME:
|
||||
name = cursor.getString(i);
|
||||
break;
|
||||
case RepoProvider.DataColumns.SIGNING_CERT:
|
||||
case Cols.SIGNING_CERT:
|
||||
signingCertificate = cursor.getString(i);
|
||||
break;
|
||||
case RepoProvider.DataColumns.PRIORITY:
|
||||
case Cols.PRIORITY:
|
||||
priority = cursor.getInt(i);
|
||||
break;
|
||||
case RepoProvider.DataColumns.IS_SWAP:
|
||||
case Cols.IS_SWAP:
|
||||
isSwap = cursor.getInt(i) == 1;
|
||||
break;
|
||||
case RepoProvider.DataColumns.USERNAME:
|
||||
case Cols.USERNAME:
|
||||
username = cursor.getString(i);
|
||||
break;
|
||||
case RepoProvider.DataColumns.PASSWORD:
|
||||
case Cols.PASSWORD:
|
||||
password = cursor.getString(i);
|
||||
break;
|
||||
case RepoProvider.DataColumns.TIMESTAMP:
|
||||
case Cols.TIMESTAMP:
|
||||
timestamp = cursor.getLong(i);
|
||||
break;
|
||||
}
|
||||
@ -158,69 +159,69 @@ public class Repo extends ValueObject {
|
||||
|
||||
public void setValues(ContentValues values) {
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns._ID)) {
|
||||
id = toInt(values.getAsInteger(RepoProvider.DataColumns._ID));
|
||||
if (values.containsKey(Cols._ID)) {
|
||||
id = toInt(values.getAsInteger(Cols._ID));
|
||||
}
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns.LAST_ETAG)) {
|
||||
lastetag = values.getAsString(RepoProvider.DataColumns.LAST_ETAG);
|
||||
if (values.containsKey(Cols.LAST_ETAG)) {
|
||||
lastetag = values.getAsString(Cols.LAST_ETAG);
|
||||
}
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns.ADDRESS)) {
|
||||
address = values.getAsString(RepoProvider.DataColumns.ADDRESS);
|
||||
if (values.containsKey(Cols.ADDRESS)) {
|
||||
address = values.getAsString(Cols.ADDRESS);
|
||||
}
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns.DESCRIPTION)) {
|
||||
description = values.getAsString(RepoProvider.DataColumns.DESCRIPTION);
|
||||
if (values.containsKey(Cols.DESCRIPTION)) {
|
||||
description = values.getAsString(Cols.DESCRIPTION);
|
||||
}
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns.FINGERPRINT)) {
|
||||
fingerprint = values.getAsString(RepoProvider.DataColumns.FINGERPRINT);
|
||||
if (values.containsKey(Cols.FINGERPRINT)) {
|
||||
fingerprint = values.getAsString(Cols.FINGERPRINT);
|
||||
}
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns.IN_USE)) {
|
||||
inuse = toInt(values.getAsInteger(RepoProvider.DataColumns.IN_USE)) == 1;
|
||||
if (values.containsKey(Cols.IN_USE)) {
|
||||
inuse = toInt(values.getAsInteger(Cols.IN_USE)) == 1;
|
||||
}
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns.LAST_UPDATED)) {
|
||||
final String dateString = values.getAsString(RepoProvider.DataColumns.LAST_UPDATED);
|
||||
if (values.containsKey(Cols.LAST_UPDATED)) {
|
||||
final String dateString = values.getAsString(Cols.LAST_UPDATED);
|
||||
lastUpdated = Utils.parseTime(dateString, null);
|
||||
}
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns.MAX_AGE)) {
|
||||
maxage = toInt(values.getAsInteger(RepoProvider.DataColumns.MAX_AGE));
|
||||
if (values.containsKey(Cols.MAX_AGE)) {
|
||||
maxage = toInt(values.getAsInteger(Cols.MAX_AGE));
|
||||
}
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns.VERSION)) {
|
||||
version = toInt(values.getAsInteger(RepoProvider.DataColumns.VERSION));
|
||||
if (values.containsKey(Cols.VERSION)) {
|
||||
version = toInt(values.getAsInteger(Cols.VERSION));
|
||||
}
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns.NAME)) {
|
||||
name = values.getAsString(RepoProvider.DataColumns.NAME);
|
||||
if (values.containsKey(Cols.NAME)) {
|
||||
name = values.getAsString(Cols.NAME);
|
||||
}
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns.SIGNING_CERT)) {
|
||||
signingCertificate = values.getAsString(RepoProvider.DataColumns.SIGNING_CERT);
|
||||
if (values.containsKey(Cols.SIGNING_CERT)) {
|
||||
signingCertificate = values.getAsString(Cols.SIGNING_CERT);
|
||||
}
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns.PRIORITY)) {
|
||||
priority = toInt(values.getAsInteger(RepoProvider.DataColumns.PRIORITY));
|
||||
if (values.containsKey(Cols.PRIORITY)) {
|
||||
priority = toInt(values.getAsInteger(Cols.PRIORITY));
|
||||
}
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns.IS_SWAP)) {
|
||||
isSwap = toInt(values.getAsInteger(RepoProvider.DataColumns.IS_SWAP)) == 1;
|
||||
if (values.containsKey(Cols.IS_SWAP)) {
|
||||
isSwap = toInt(values.getAsInteger(Cols.IS_SWAP)) == 1;
|
||||
}
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns.USERNAME)) {
|
||||
username = values.getAsString(RepoProvider.DataColumns.USERNAME);
|
||||
if (values.containsKey(Cols.USERNAME)) {
|
||||
username = values.getAsString(Cols.USERNAME);
|
||||
}
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns.PASSWORD)) {
|
||||
password = values.getAsString(RepoProvider.DataColumns.PASSWORD);
|
||||
if (values.containsKey(Cols.PASSWORD)) {
|
||||
password = values.getAsString(Cols.PASSWORD);
|
||||
}
|
||||
|
||||
if (values.containsKey(RepoProvider.DataColumns.TIMESTAMP)) {
|
||||
timestamp = toInt(values.getAsInteger(RepoProvider.DataColumns.TIMESTAMP));
|
||||
if (values.containsKey(Cols.TIMESTAMP)) {
|
||||
timestamp = toInt(values.getAsInteger(Cols.TIMESTAMP));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -32,8 +32,8 @@ public class RepoPersister {
|
||||
* is essentially completely transient, and can be nuked at any time.
|
||||
*/
|
||||
private static final String[] APP_FIELDS_TO_IGNORE = {
|
||||
AppProvider.DataColumns.IGNORE_ALLUPDATES,
|
||||
AppProvider.DataColumns.IGNORE_THISUPDATE,
|
||||
Schema.AppTable.Cols.IGNORE_ALLUPDATES,
|
||||
Schema.AppTable.Cols.IGNORE_THISUPDATE,
|
||||
};
|
||||
|
||||
/**
|
||||
@ -159,8 +159,8 @@ public class RepoPersister {
|
||||
*/
|
||||
private ArrayList<ContentProviderOperation> insertOrUpdateApks(List<Apk> packages) {
|
||||
String[] projection = new String[]{
|
||||
ApkProvider.DataColumns.PACKAGE_NAME,
|
||||
ApkProvider.DataColumns.VERSION_CODE,
|
||||
Schema.ApkTable.Cols.PACKAGE_NAME,
|
||||
Schema.ApkTable.Cols.VERSION_CODE,
|
||||
};
|
||||
List<Apk> existingApks = ApkProvider.Helper.knownApks(context, packages, projection);
|
||||
ArrayList<ContentProviderOperation> operations = new ArrayList<>(packages.size());
|
||||
@ -214,7 +214,7 @@ public class RepoPersister {
|
||||
* array.
|
||||
*/
|
||||
private boolean isAppInDatabase(App app) {
|
||||
String[] fields = {AppProvider.DataColumns.PACKAGE_NAME};
|
||||
String[] fields = {Schema.AppTable.Cols.PACKAGE_NAME};
|
||||
App found = AppProvider.Helper.findByPackageName(context.getContentResolver(), app.packageName, fields);
|
||||
return found != null;
|
||||
}
|
||||
@ -245,7 +245,7 @@ public class RepoPersister {
|
||||
*/
|
||||
@Nullable
|
||||
private ContentProviderOperation deleteOrphanedApks(List<App> apps, Map<String, List<Apk>> packages) {
|
||||
String[] projection = new String[]{ApkProvider.DataColumns.PACKAGE_NAME, ApkProvider.DataColumns.VERSION_CODE};
|
||||
String[] projection = new String[]{Schema.ApkTable.Cols.PACKAGE_NAME, Schema.ApkTable.Cols.VERSION_CODE};
|
||||
List<Apk> existing = ApkProvider.Helper.find(context, repo, apps, projection);
|
||||
List<Apk> toDelete = new ArrayList<>();
|
||||
|
||||
|
@ -7,11 +7,12 @@ import android.content.Context;
|
||||
import android.content.UriMatcher;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.provider.BaseColumns;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import org.fdroid.fdroid.Utils;
|
||||
import org.fdroid.fdroid.data.Schema.RepoTable;
|
||||
import org.fdroid.fdroid.data.Schema.RepoTable.Cols;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@ -28,12 +29,12 @@ public class RepoProvider extends FDroidProvider {
|
||||
|
||||
public static Repo findByUri(Context context, Uri uri) {
|
||||
ContentResolver resolver = context.getContentResolver();
|
||||
Cursor cursor = resolver.query(uri, DataColumns.ALL, null, null, null);
|
||||
Cursor cursor = resolver.query(uri, Cols.ALL, null, null, null);
|
||||
return cursorToRepo(cursor);
|
||||
}
|
||||
|
||||
public static Repo findById(Context context, long repoId) {
|
||||
return findById(context, repoId, DataColumns.ALL);
|
||||
return findById(context, repoId, Cols.ALL);
|
||||
}
|
||||
|
||||
public static Repo findById(Context context, long repoId,
|
||||
@ -45,18 +46,18 @@ public class RepoProvider extends FDroidProvider {
|
||||
}
|
||||
|
||||
public static Repo findByAddress(Context context, String address) {
|
||||
return findByAddress(context, address, DataColumns.ALL);
|
||||
return findByAddress(context, address, Cols.ALL);
|
||||
}
|
||||
|
||||
public static Repo findByAddress(Context context,
|
||||
String address, String[] projection) {
|
||||
List<Repo> repos = findBy(
|
||||
context, DataColumns.ADDRESS, address, projection);
|
||||
context, Cols.ADDRESS, address, projection);
|
||||
return repos.size() > 0 ? repos.get(0) : null;
|
||||
}
|
||||
|
||||
public static List<Repo> all(Context context) {
|
||||
return all(context, DataColumns.ALL);
|
||||
return all(context, Cols.ALL);
|
||||
}
|
||||
|
||||
public static List<Repo> all(Context context, String[] projection) {
|
||||
@ -113,10 +114,10 @@ public class RepoProvider extends FDroidProvider {
|
||||
// Change the name to the new address. Next time we update the repo
|
||||
// index file, it will populate the name field with the proper
|
||||
// name, but the best we can do is guess right now.
|
||||
if (values.containsKey(DataColumns.ADDRESS) &&
|
||||
!values.containsKey(DataColumns.NAME)) {
|
||||
String name = Repo.addressToName(values.getAsString(DataColumns.ADDRESS));
|
||||
values.put(DataColumns.NAME, name);
|
||||
if (values.containsKey(Cols.ADDRESS) &&
|
||||
!values.containsKey(Cols.NAME)) {
|
||||
String name = Repo.addressToName(values.getAsString(Cols.ADDRESS));
|
||||
values.put(Cols.NAME, name);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -129,14 +130,14 @@ public class RepoProvider extends FDroidProvider {
|
||||
* make sure it is correct. If the fingerprint is empty, then store
|
||||
* the calculated one.
|
||||
*/
|
||||
if (values.containsKey(DataColumns.SIGNING_CERT)) {
|
||||
String publicKey = values.getAsString(DataColumns.SIGNING_CERT);
|
||||
if (values.containsKey(Cols.SIGNING_CERT)) {
|
||||
String publicKey = values.getAsString(Cols.SIGNING_CERT);
|
||||
String calcedFingerprint = Utils.calcFingerprint(publicKey);
|
||||
if (values.containsKey(DataColumns.FINGERPRINT)) {
|
||||
String fingerprint = values.getAsString(DataColumns.FINGERPRINT);
|
||||
if (values.containsKey(Cols.FINGERPRINT)) {
|
||||
String fingerprint = values.getAsString(Cols.FINGERPRINT);
|
||||
if (!TextUtils.isEmpty(publicKey)) {
|
||||
if (TextUtils.isEmpty(fingerprint)) {
|
||||
values.put(DataColumns.FINGERPRINT, calcedFingerprint);
|
||||
values.put(Cols.FINGERPRINT, calcedFingerprint);
|
||||
} else if (!fingerprint.equals(calcedFingerprint)) {
|
||||
// TODO the UI should represent this error!
|
||||
Log.e(TAG, "The stored and calculated fingerprints do not match!");
|
||||
@ -146,20 +147,20 @@ public class RepoProvider extends FDroidProvider {
|
||||
}
|
||||
} else if (!TextUtils.isEmpty(publicKey)) {
|
||||
// no fingerprint in 'values', so put one there
|
||||
values.put(DataColumns.FINGERPRINT, calcedFingerprint);
|
||||
values.put(Cols.FINGERPRINT, calcedFingerprint);
|
||||
}
|
||||
}
|
||||
|
||||
if (values.containsKey(DataColumns.IN_USE)) {
|
||||
Integer inUse = values.getAsInteger(DataColumns.IN_USE);
|
||||
if (values.containsKey(Cols.IN_USE)) {
|
||||
Integer inUse = values.getAsInteger(Cols.IN_USE);
|
||||
if (inUse != null && inUse == 0) {
|
||||
values.put(DataColumns.LAST_ETAG, (String) null);
|
||||
values.put(Cols.LAST_ETAG, (String) null);
|
||||
}
|
||||
}
|
||||
|
||||
final Uri uri = getContentUri(repo.getId());
|
||||
final String[] args = {Long.toString(repo.getId())};
|
||||
resolver.update(uri, values, DataColumns._ID + " = ?", args);
|
||||
resolver.update(uri, values, Cols._ID + " = ?", args);
|
||||
repo.setValues(values);
|
||||
}
|
||||
|
||||
@ -194,7 +195,7 @@ public class RepoProvider extends FDroidProvider {
|
||||
|
||||
public static int countAppsForRepo(Context context, long repoId) {
|
||||
ContentResolver resolver = context.getContentResolver();
|
||||
final String[] projection = {ApkProvider.DataColumns._COUNT_DISTINCT_ID};
|
||||
final String[] projection = {Schema.ApkTable.Cols._COUNT_DISTINCT_ID};
|
||||
Uri apkUri = ApkProvider.getRepoUri(repoId);
|
||||
Cursor cursor = resolver.query(apkUri, projection, null, null, null);
|
||||
int count = 0;
|
||||
@ -209,31 +210,6 @@ public class RepoProvider extends FDroidProvider {
|
||||
}
|
||||
}
|
||||
|
||||
public interface DataColumns extends BaseColumns {
|
||||
|
||||
String ADDRESS = "address";
|
||||
String NAME = "name";
|
||||
String DESCRIPTION = "description";
|
||||
String IN_USE = "inuse";
|
||||
String PRIORITY = "priority";
|
||||
String SIGNING_CERT = "pubkey";
|
||||
String FINGERPRINT = "fingerprint";
|
||||
String MAX_AGE = "maxage";
|
||||
String LAST_ETAG = "lastetag";
|
||||
String LAST_UPDATED = "lastUpdated";
|
||||
String VERSION = "version";
|
||||
String IS_SWAP = "isSwap";
|
||||
String USERNAME = "username";
|
||||
String PASSWORD = "password";
|
||||
String TIMESTAMP = "timestamp";
|
||||
|
||||
String[] ALL = {
|
||||
_ID, ADDRESS, NAME, DESCRIPTION, IN_USE, PRIORITY, SIGNING_CERT,
|
||||
FINGERPRINT, MAX_AGE, LAST_UPDATED, LAST_ETAG, VERSION, IS_SWAP,
|
||||
USERNAME, PASSWORD, TIMESTAMP,
|
||||
};
|
||||
}
|
||||
|
||||
private static final String PROVIDER_NAME = "RepoProvider";
|
||||
private static final String PATH_ALL_EXCEPT_SWAP = "allExceptSwap";
|
||||
|
||||
@ -267,7 +243,7 @@ public class RepoProvider extends FDroidProvider {
|
||||
|
||||
@Override
|
||||
protected String getTableName() {
|
||||
return DBHelper.TABLE_REPO;
|
||||
return RepoTable.NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -294,11 +270,11 @@ public class RepoProvider extends FDroidProvider {
|
||||
|
||||
case CODE_SINGLE:
|
||||
selection = (selection == null ? "" : selection + " AND ") +
|
||||
DataColumns._ID + " = " + uri.getLastPathSegment();
|
||||
Cols._ID + " = " + uri.getLastPathSegment();
|
||||
break;
|
||||
|
||||
case CODE_ALL_EXCEPT_SWAP:
|
||||
selection = DataColumns.IS_SWAP + " = 0 OR " + DataColumns.IS_SWAP + " IS NULL ";
|
||||
selection = Cols.IS_SWAP + " = 0 OR " + Cols.IS_SWAP + " IS NULL ";
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -314,32 +290,32 @@ public class RepoProvider extends FDroidProvider {
|
||||
@Override
|
||||
public Uri insert(Uri uri, ContentValues values) {
|
||||
|
||||
if (!values.containsKey(DataColumns.ADDRESS)) {
|
||||
if (!values.containsKey(Cols.ADDRESS)) {
|
||||
throw new UnsupportedOperationException("Cannot add repo without an address.");
|
||||
}
|
||||
|
||||
// The following fields have NOT NULL constraints in the DB, so need
|
||||
// to be present.
|
||||
|
||||
if (!values.containsKey(DataColumns.IN_USE)) {
|
||||
values.put(DataColumns.IN_USE, 1);
|
||||
if (!values.containsKey(Cols.IN_USE)) {
|
||||
values.put(Cols.IN_USE, 1);
|
||||
}
|
||||
|
||||
if (!values.containsKey(DataColumns.PRIORITY)) {
|
||||
values.put(DataColumns.PRIORITY, 10);
|
||||
if (!values.containsKey(Cols.PRIORITY)) {
|
||||
values.put(Cols.PRIORITY, 10);
|
||||
}
|
||||
|
||||
if (!values.containsKey(DataColumns.MAX_AGE)) {
|
||||
values.put(DataColumns.MAX_AGE, 0);
|
||||
if (!values.containsKey(Cols.MAX_AGE)) {
|
||||
values.put(Cols.MAX_AGE, 0);
|
||||
}
|
||||
|
||||
if (!values.containsKey(DataColumns.VERSION)) {
|
||||
values.put(DataColumns.VERSION, 0);
|
||||
if (!values.containsKey(Cols.VERSION)) {
|
||||
values.put(Cols.VERSION, 0);
|
||||
}
|
||||
|
||||
if (!values.containsKey(DataColumns.NAME)) {
|
||||
final String address = values.getAsString(DataColumns.ADDRESS);
|
||||
values.put(DataColumns.NAME, Repo.addressToName(address));
|
||||
if (!values.containsKey(Cols.NAME)) {
|
||||
final String address = values.getAsString(Cols.ADDRESS);
|
||||
values.put(Cols.NAME, Repo.addressToName(address));
|
||||
}
|
||||
|
||||
long id = db().insertOrThrow(getTableName(), null, values);
|
||||
|
168
app/src/main/java/org/fdroid/fdroid/data/Schema.java
Normal file
168
app/src/main/java/org/fdroid/fdroid/data/Schema.java
Normal file
@ -0,0 +1,168 @@
|
||||
package org.fdroid.fdroid.data;
|
||||
|
||||
import android.provider.BaseColumns;
|
||||
|
||||
/**
|
||||
* The authoritative reference to each table/column which should exist in the database.
|
||||
* Constants from this interface should be used in preference to string literals when referring to
|
||||
* the tables/columns in the database.
|
||||
*/
|
||||
public interface Schema {
|
||||
|
||||
interface AppTable {
|
||||
|
||||
String NAME = "fdroid_app";
|
||||
|
||||
interface Cols {
|
||||
String _ID = "rowid as _id"; // Required for CursorLoaders
|
||||
String _COUNT = "_count";
|
||||
String IS_COMPATIBLE = "compatible";
|
||||
String PACKAGE_NAME = "id";
|
||||
String NAME = "name";
|
||||
String SUMMARY = "summary";
|
||||
String ICON = "icon";
|
||||
String DESCRIPTION = "description";
|
||||
String LICENSE = "license";
|
||||
String AUTHOR = "author";
|
||||
String EMAIL = "email";
|
||||
String WEB_URL = "webURL";
|
||||
String TRACKER_URL = "trackerURL";
|
||||
String SOURCE_URL = "sourceURL";
|
||||
String CHANGELOG_URL = "changelogURL";
|
||||
String DONATE_URL = "donateURL";
|
||||
String BITCOIN_ADDR = "bitcoinAddr";
|
||||
String LITECOIN_ADDR = "litecoinAddr";
|
||||
String FLATTR_ID = "flattrID";
|
||||
String SUGGESTED_VERSION_CODE = "suggestedVercode";
|
||||
String UPSTREAM_VERSION_NAME = "upstreamVersion";
|
||||
String UPSTREAM_VERSION_CODE = "upstreamVercode";
|
||||
String ADDED = "added";
|
||||
String LAST_UPDATED = "lastUpdated";
|
||||
String CATEGORIES = "categories";
|
||||
String ANTI_FEATURES = "antiFeatures";
|
||||
String REQUIREMENTS = "requirements";
|
||||
String IGNORE_ALLUPDATES = "ignoreAllUpdates";
|
||||
String IGNORE_THISUPDATE = "ignoreThisUpdate";
|
||||
String ICON_URL = "iconUrl";
|
||||
String ICON_URL_LARGE = "iconUrlLarge";
|
||||
|
||||
interface SuggestedApk {
|
||||
String VERSION_NAME = "suggestedApkVersion";
|
||||
}
|
||||
|
||||
interface InstalledApp {
|
||||
String VERSION_CODE = "installedVersionCode";
|
||||
String VERSION_NAME = "installedVersionName";
|
||||
String SIGNATURE = "installedSig";
|
||||
}
|
||||
|
||||
String[] ALL = {
|
||||
_ID, IS_COMPATIBLE, PACKAGE_NAME, NAME, SUMMARY, ICON, DESCRIPTION,
|
||||
LICENSE, AUTHOR, EMAIL, WEB_URL, TRACKER_URL, SOURCE_URL,
|
||||
CHANGELOG_URL, DONATE_URL, BITCOIN_ADDR, LITECOIN_ADDR, FLATTR_ID,
|
||||
UPSTREAM_VERSION_NAME, UPSTREAM_VERSION_CODE, ADDED, LAST_UPDATED,
|
||||
CATEGORIES, ANTI_FEATURES, REQUIREMENTS, IGNORE_ALLUPDATES,
|
||||
IGNORE_THISUPDATE, ICON_URL, ICON_URL_LARGE,
|
||||
SUGGESTED_VERSION_CODE, SuggestedApk.VERSION_NAME,
|
||||
InstalledApp.VERSION_CODE, InstalledApp.VERSION_NAME,
|
||||
InstalledApp.SIGNATURE,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This table stores details of all the application versions we
|
||||
* know about. Each relates directly back to an entry in TABLE_APP.
|
||||
* This information is retrieved from the repositories.
|
||||
*/
|
||||
interface ApkTable {
|
||||
|
||||
String NAME = "fdroid_apk";
|
||||
|
||||
interface Cols extends BaseColumns {
|
||||
String _COUNT_DISTINCT_ID = "countDistinct";
|
||||
|
||||
String PACKAGE_NAME = "id";
|
||||
String VERSION_NAME = "version";
|
||||
String REPO_ID = "repo";
|
||||
String HASH = "hash";
|
||||
String VERSION_CODE = "vercode";
|
||||
String NAME = "apkName";
|
||||
String SIZE = "size";
|
||||
String SIGNATURE = "sig";
|
||||
String SOURCE_NAME = "srcname";
|
||||
String MIN_SDK_VERSION = "minSdkVersion";
|
||||
String TARGET_SDK_VERSION = "targetSdkVersion";
|
||||
String MAX_SDK_VERSION = "maxSdkVersion";
|
||||
String PERMISSIONS = "permissions";
|
||||
String FEATURES = "features";
|
||||
String NATIVE_CODE = "nativecode";
|
||||
String HASH_TYPE = "hashType";
|
||||
String ADDED_DATE = "added";
|
||||
String IS_COMPATIBLE = "compatible";
|
||||
String INCOMPATIBLE_REASONS = "incompatibleReasons";
|
||||
String REPO_VERSION = "repoVersion";
|
||||
String REPO_ADDRESS = "repoAddress";
|
||||
|
||||
String[] ALL = {
|
||||
_ID, PACKAGE_NAME, VERSION_NAME, REPO_ID, HASH, VERSION_CODE, NAME,
|
||||
SIZE, SIGNATURE, SOURCE_NAME, MIN_SDK_VERSION, TARGET_SDK_VERSION, MAX_SDK_VERSION,
|
||||
PERMISSIONS, FEATURES, NATIVE_CODE, HASH_TYPE, ADDED_DATE,
|
||||
IS_COMPATIBLE, REPO_VERSION, REPO_ADDRESS, INCOMPATIBLE_REASONS,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
interface RepoTable {
|
||||
|
||||
String NAME = "fdroid_repo";
|
||||
|
||||
interface Cols extends BaseColumns {
|
||||
|
||||
String ADDRESS = "address";
|
||||
String NAME = "name";
|
||||
String DESCRIPTION = "description";
|
||||
String IN_USE = "inuse";
|
||||
String PRIORITY = "priority";
|
||||
String SIGNING_CERT = "pubkey";
|
||||
String FINGERPRINT = "fingerprint";
|
||||
String MAX_AGE = "maxage";
|
||||
String LAST_ETAG = "lastetag";
|
||||
String LAST_UPDATED = "lastUpdated";
|
||||
String VERSION = "version";
|
||||
String IS_SWAP = "isSwap";
|
||||
String USERNAME = "username";
|
||||
String PASSWORD = "password";
|
||||
String TIMESTAMP = "timestamp";
|
||||
|
||||
String[] ALL = {
|
||||
_ID, ADDRESS, NAME, DESCRIPTION, IN_USE, PRIORITY, SIGNING_CERT,
|
||||
FINGERPRINT, MAX_AGE, LAST_UPDATED, LAST_ETAG, VERSION, IS_SWAP,
|
||||
USERNAME, PASSWORD, TIMESTAMP,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
interface InstalledAppTable {
|
||||
|
||||
String NAME = "fdroid_installedApp";
|
||||
|
||||
interface Cols {
|
||||
String _ID = "rowid as _id"; // Required for CursorLoaders
|
||||
String PACKAGE_NAME = "appId";
|
||||
String VERSION_CODE = "versionCode";
|
||||
String VERSION_NAME = "versionName";
|
||||
String APPLICATION_LABEL = "applicationLabel";
|
||||
String SIGNATURE = "sig";
|
||||
String LAST_UPDATE_TIME = "lastUpdateTime";
|
||||
String HASH_TYPE = "hashType";
|
||||
String HASH = "hash";
|
||||
|
||||
String[] ALL = {
|
||||
_ID, PACKAGE_NAME, VERSION_CODE, VERSION_NAME, APPLICATION_LABEL,
|
||||
SIGNATURE, LAST_UPDATE_TIME, HASH_TYPE, HASH,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -7,6 +7,8 @@ import android.database.sqlite.SQLiteDatabase;
|
||||
import android.net.Uri;
|
||||
import android.util.Log;
|
||||
|
||||
import org.fdroid.fdroid.data.Schema.ApkTable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@ -18,7 +20,7 @@ public class TempApkProvider extends ApkProvider {
|
||||
|
||||
private static final String PROVIDER_NAME = "TempApkProvider";
|
||||
|
||||
static final String TABLE_TEMP_APK = "temp_" + DBHelper.TABLE_APK;
|
||||
static final String TABLE_TEMP_APK = "temp_" + ApkTable.NAME;
|
||||
|
||||
private static final String PATH_INIT = "init";
|
||||
|
||||
@ -128,7 +130,7 @@ public class TempApkProvider extends ApkProvider {
|
||||
private void initTable() {
|
||||
final SQLiteDatabase db = db();
|
||||
final String memoryDbName = TempAppProvider.DB;
|
||||
db.execSQL("CREATE TABLE " + memoryDbName + "." + getTableName() + " AS SELECT * FROM main." + DBHelper.TABLE_APK);
|
||||
db.execSQL("CREATE TABLE " + memoryDbName + "." + getTableName() + " AS SELECT * FROM main." + ApkTable.NAME);
|
||||
db.execSQL("CREATE INDEX IF NOT EXISTS " + memoryDbName + ".apk_vercode on " + getTableName() + " (vercode);");
|
||||
db.execSQL("CREATE INDEX IF NOT EXISTS " + memoryDbName + ".apk_id on " + getTableName() + " (id);");
|
||||
db.execSQL("CREATE INDEX IF NOT EXISTS " + memoryDbName + ".apk_compatible ON " + getTableName() + " (compatible);");
|
||||
|
@ -7,6 +7,9 @@ import android.database.sqlite.SQLiteDatabase;
|
||||
import android.database.sqlite.SQLiteException;
|
||||
import android.net.Uri;
|
||||
|
||||
import org.fdroid.fdroid.data.Schema.ApkTable;
|
||||
import org.fdroid.fdroid.data.Schema.AppTable;
|
||||
|
||||
/**
|
||||
* This class does all of its operations in a temporary sqlite table.
|
||||
*/
|
||||
@ -19,7 +22,7 @@ public class TempAppProvider extends AppProvider {
|
||||
|
||||
private static final String PROVIDER_NAME = "TempAppProvider";
|
||||
|
||||
private static final String TABLE_TEMP_APP = "temp_" + DBHelper.TABLE_APP;
|
||||
private static final String TABLE_TEMP_APP = "temp_" + AppTable.NAME;
|
||||
|
||||
private static final String PATH_INIT = "init";
|
||||
private static final String PATH_COMMIT = "commit";
|
||||
@ -127,7 +130,7 @@ public class TempAppProvider extends AppProvider {
|
||||
final SQLiteDatabase db = db();
|
||||
ensureTempTableDetached(db);
|
||||
db.execSQL("ATTACH DATABASE ':memory:' AS " + DB);
|
||||
db.execSQL("CREATE TABLE " + DB + "." + getTableName() + " AS SELECT * FROM main." + DBHelper.TABLE_APP);
|
||||
db.execSQL("CREATE TABLE " + DB + "." + getTableName() + " AS SELECT * FROM main." + AppTable.NAME);
|
||||
db.execSQL("CREATE INDEX IF NOT EXISTS " + DB + ".app_id ON " + getTableName() + " (id);");
|
||||
db.execSQL("CREATE INDEX IF NOT EXISTS " + DB + ".app_upstreamVercode ON " + getTableName() + " (upstreamVercode);");
|
||||
db.execSQL("CREATE INDEX IF NOT EXISTS " + DB + ".app_compatible ON " + getTableName() + " (compatible);");
|
||||
@ -141,11 +144,11 @@ public class TempAppProvider extends AppProvider {
|
||||
final String tempApp = DB + "." + TempAppProvider.TABLE_TEMP_APP;
|
||||
final String tempApk = DB + "." + TempApkProvider.TABLE_TEMP_APK;
|
||||
|
||||
db.execSQL("DELETE FROM " + DBHelper.TABLE_APP + " WHERE 1");
|
||||
db.execSQL("INSERT INTO " + DBHelper.TABLE_APP + " SELECT * FROM " + tempApp);
|
||||
db.execSQL("DELETE FROM " + AppTable.NAME + " WHERE 1");
|
||||
db.execSQL("INSERT INTO " + AppTable.NAME + " SELECT * FROM " + tempApp);
|
||||
|
||||
db.execSQL("DELETE FROM " + DBHelper.TABLE_APK + " WHERE 1");
|
||||
db.execSQL("INSERT INTO " + DBHelper.TABLE_APK + " SELECT * FROM " + tempApk);
|
||||
db.execSQL("DELETE FROM " + ApkTable.NAME + " WHERE 1");
|
||||
db.execSQL("INSERT INTO " + ApkTable.NAME + " SELECT * FROM " + tempApk);
|
||||
|
||||
db.setTransactionSuccessful();
|
||||
|
||||
|
@ -34,6 +34,7 @@ import org.fdroid.fdroid.Utils;
|
||||
import org.fdroid.fdroid.data.App;
|
||||
import org.fdroid.fdroid.data.Repo;
|
||||
import org.fdroid.fdroid.data.RepoProvider;
|
||||
import org.fdroid.fdroid.data.Schema;
|
||||
import org.fdroid.fdroid.localrepo.peers.Peer;
|
||||
import org.fdroid.fdroid.localrepo.peers.PeerFinder;
|
||||
import org.fdroid.fdroid.localrepo.type.BluetoothSwap;
|
||||
@ -269,15 +270,15 @@ public class SwapService extends Service {
|
||||
// "Manage repos" UI on other device. Doesn't hurt to put something there though,
|
||||
// on the off chance that somebody is looking through the sqlite database which
|
||||
// contains the repos...
|
||||
values.put(RepoProvider.DataColumns.NAME, peer.getName());
|
||||
values.put(RepoProvider.DataColumns.ADDRESS, peer.getRepoAddress());
|
||||
values.put(RepoProvider.DataColumns.DESCRIPTION, "");
|
||||
values.put(Schema.RepoTable.Cols.NAME, peer.getName());
|
||||
values.put(Schema.RepoTable.Cols.ADDRESS, peer.getRepoAddress());
|
||||
values.put(Schema.RepoTable.Cols.DESCRIPTION, "");
|
||||
String fingerprint = peer.getFingerprint();
|
||||
if (!TextUtils.isEmpty(fingerprint)) {
|
||||
values.put(RepoProvider.DataColumns.FINGERPRINT, peer.getFingerprint());
|
||||
values.put(Schema.RepoTable.Cols.FINGERPRINT, peer.getFingerprint());
|
||||
}
|
||||
values.put(RepoProvider.DataColumns.IN_USE, true);
|
||||
values.put(RepoProvider.DataColumns.IS_SWAP, true);
|
||||
values.put(Schema.RepoTable.Cols.IN_USE, true);
|
||||
values.put(Schema.RepoTable.Cols.IS_SWAP, true);
|
||||
Uri uri = RepoProvider.Helper.insert(this, values);
|
||||
repo = RepoProvider.Helper.findByUri(this, uri);
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import android.support.v4.content.LocalBroadcastManager;
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
import org.fdroid.fdroid.data.Repo;
|
||||
import org.fdroid.fdroid.data.RepoProvider;
|
||||
import org.fdroid.fdroid.data.Schema;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
@ -47,7 +48,7 @@ public class DownloaderFactory {
|
||||
} else if (isLocalFile(url)) {
|
||||
downloader = new LocalFileDownloader(url, destFile);
|
||||
} else {
|
||||
final String[] projection = {RepoProvider.DataColumns.USERNAME, RepoProvider.DataColumns.PASSWORD};
|
||||
final String[] projection = {Schema.RepoTable.Cols.USERNAME, Schema.RepoTable.Cols.PASSWORD};
|
||||
String repoUrlString = FilenameUtils.getBaseName(url.toString());
|
||||
Repo repo = RepoProvider.Helper.findByAddress(context, repoUrlString, projection);
|
||||
if (repo == null) {
|
||||
|
@ -47,6 +47,7 @@ import org.fdroid.fdroid.data.Apk;
|
||||
import org.fdroid.fdroid.data.ApkProvider;
|
||||
import org.fdroid.fdroid.data.App;
|
||||
import org.fdroid.fdroid.data.AppProvider;
|
||||
import org.fdroid.fdroid.data.Schema;
|
||||
|
||||
/**
|
||||
* NOTES:
|
||||
@ -191,7 +192,7 @@ public class InstallConfirmActivity extends FragmentActivity implements OnCancel
|
||||
|
||||
intent = getIntent();
|
||||
Uri uri = intent.getData();
|
||||
Apk apk = ApkProvider.Helper.find(this, uri, ApkProvider.DataColumns.ALL);
|
||||
Apk apk = ApkProvider.Helper.find(this, uri, Schema.ApkTable.Cols.ALL);
|
||||
app = AppProvider.Helper.findByPackageName(getContentResolver(), apk.packageName);
|
||||
|
||||
appDiff = new AppDiff(getPackageManager(), apk);
|
||||
|
@ -64,6 +64,7 @@ import org.fdroid.fdroid.compat.CursorAdapterCompat;
|
||||
import org.fdroid.fdroid.data.NewRepoConfig;
|
||||
import org.fdroid.fdroid.data.Repo;
|
||||
import org.fdroid.fdroid.data.RepoProvider;
|
||||
import org.fdroid.fdroid.data.Schema.RepoTable;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
@ -612,14 +613,14 @@ public class ManageReposActivity extends ActionBarActivity {
|
||||
// Leave address as it was.
|
||||
}
|
||||
ContentValues values = new ContentValues(4);
|
||||
values.put(RepoProvider.DataColumns.ADDRESS, address);
|
||||
values.put(RepoTable.Cols.ADDRESS, address);
|
||||
if (!TextUtils.isEmpty(fingerprint)) {
|
||||
values.put(RepoProvider.DataColumns.FINGERPRINT, fingerprint.toUpperCase(Locale.ENGLISH));
|
||||
values.put(RepoTable.Cols.FINGERPRINT, fingerprint.toUpperCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
if (!TextUtils.isEmpty(username) && !TextUtils.isEmpty(password)) {
|
||||
values.put(RepoProvider.DataColumns.USERNAME, username);
|
||||
values.put(RepoProvider.DataColumns.PASSWORD, password);
|
||||
values.put(RepoTable.Cols.USERNAME, username);
|
||||
values.put(RepoTable.Cols.PASSWORD, password);
|
||||
}
|
||||
|
||||
RepoProvider.Helper.insert(context, values);
|
||||
@ -643,8 +644,8 @@ public class ManageReposActivity extends ActionBarActivity {
|
||||
Utils.debugLog(TAG, "Enabling existing repo: " + url);
|
||||
Repo repo = RepoProvider.Helper.findByAddress(context, url);
|
||||
ContentValues values = new ContentValues(2);
|
||||
values.put(RepoProvider.DataColumns.IN_USE, 1);
|
||||
values.put(RepoProvider.DataColumns.FINGERPRINT, fingerprint);
|
||||
values.put(RepoTable.Cols.IN_USE, 1);
|
||||
values.put(RepoTable.Cols.FINGERPRINT, fingerprint);
|
||||
RepoProvider.Helper.update(context, repo, values);
|
||||
listFragment.notifyDataSetChanged();
|
||||
finishedAddingRepo();
|
||||
@ -710,11 +711,11 @@ public class ManageReposActivity extends ActionBarActivity {
|
||||
Uri uri = RepoProvider.allExceptSwapUri();
|
||||
Utils.debugLog(TAG, "Creating repo loader '" + uri + "'.");
|
||||
final String[] projection = {
|
||||
RepoProvider.DataColumns._ID,
|
||||
RepoProvider.DataColumns.NAME,
|
||||
RepoProvider.DataColumns.SIGNING_CERT,
|
||||
RepoProvider.DataColumns.FINGERPRINT,
|
||||
RepoProvider.DataColumns.IN_USE,
|
||||
RepoTable.Cols._ID,
|
||||
RepoTable.Cols.NAME,
|
||||
RepoTable.Cols.SIGNING_CERT,
|
||||
RepoTable.Cols.FINGERPRINT,
|
||||
RepoTable.Cols.IN_USE,
|
||||
};
|
||||
return new CursorLoader(getActivity(), uri, projection, null, null, null);
|
||||
}
|
||||
@ -748,7 +749,7 @@ public class ManageReposActivity extends ActionBarActivity {
|
||||
public void onSetEnabled(Repo repo, boolean isEnabled) {
|
||||
if (repo.inuse != isEnabled) {
|
||||
ContentValues values = new ContentValues(1);
|
||||
values.put(RepoProvider.DataColumns.IN_USE, isEnabled ? 1 : 0);
|
||||
values.put(RepoTable.Cols.IN_USE, isEnabled ? 1 : 0);
|
||||
RepoProvider.Helper.update(getActivity(), repo, values);
|
||||
|
||||
if (isEnabled) {
|
||||
|
@ -36,6 +36,7 @@ import org.fdroid.fdroid.UpdateService;
|
||||
import org.fdroid.fdroid.Utils;
|
||||
import org.fdroid.fdroid.data.Repo;
|
||||
import org.fdroid.fdroid.data.RepoProvider;
|
||||
import org.fdroid.fdroid.data.Schema.RepoTable;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
@ -100,9 +101,9 @@ public class RepoDetailsActivity extends ActionBarActivity {
|
||||
|
||||
repoId = getIntent().getLongExtra(ARG_REPO_ID, 0);
|
||||
final String[] projection = {
|
||||
RepoProvider.DataColumns.NAME,
|
||||
RepoProvider.DataColumns.ADDRESS,
|
||||
RepoProvider.DataColumns.FINGERPRINT,
|
||||
RepoTable.Cols.NAME,
|
||||
RepoTable.Cols.ADDRESS,
|
||||
RepoTable.Cols.FINGERPRINT,
|
||||
};
|
||||
repo = RepoProvider.Helper.findById(this, repoId, projection);
|
||||
|
||||
@ -390,8 +391,8 @@ public class RepoDetailsActivity extends ActionBarActivity {
|
||||
if (!TextUtils.isEmpty(name)) {
|
||||
|
||||
final ContentValues values = new ContentValues(2);
|
||||
values.put(RepoProvider.DataColumns.USERNAME, name);
|
||||
values.put(RepoProvider.DataColumns.PASSWORD, password);
|
||||
values.put(RepoTable.Cols.USERNAME, name);
|
||||
values.put(RepoTable.Cols.PASSWORD, password);
|
||||
|
||||
RepoProvider.Helper.update(RepoDetailsActivity.this, repo, values);
|
||||
|
||||
|
@ -25,7 +25,7 @@ import org.fdroid.fdroid.R;
|
||||
import org.fdroid.fdroid.UpdateService;
|
||||
import org.fdroid.fdroid.Utils;
|
||||
import org.fdroid.fdroid.data.App;
|
||||
import org.fdroid.fdroid.data.AppProvider;
|
||||
import org.fdroid.fdroid.data.Schema.AppTable;
|
||||
import org.fdroid.fdroid.views.AppListAdapter;
|
||||
|
||||
public abstract class AppListFragment extends ListFragment implements
|
||||
@ -38,24 +38,24 @@ public abstract class AppListFragment extends ListFragment implements
|
||||
private static final int REQUEST_APPDETAILS = 0;
|
||||
|
||||
private static final String[] APP_PROJECTION = {
|
||||
AppProvider.DataColumns._ID, // Required for cursor loader to work.
|
||||
AppProvider.DataColumns.PACKAGE_NAME,
|
||||
AppProvider.DataColumns.NAME,
|
||||
AppProvider.DataColumns.SUMMARY,
|
||||
AppProvider.DataColumns.IS_COMPATIBLE,
|
||||
AppProvider.DataColumns.LICENSE,
|
||||
AppProvider.DataColumns.ICON,
|
||||
AppProvider.DataColumns.ICON_URL,
|
||||
AppProvider.DataColumns.InstalledApp.VERSION_CODE,
|
||||
AppProvider.DataColumns.InstalledApp.VERSION_NAME,
|
||||
AppProvider.DataColumns.SuggestedApk.VERSION_NAME,
|
||||
AppProvider.DataColumns.SUGGESTED_VERSION_CODE,
|
||||
AppProvider.DataColumns.IGNORE_ALLUPDATES,
|
||||
AppProvider.DataColumns.IGNORE_THISUPDATE,
|
||||
AppProvider.DataColumns.REQUIREMENTS, // Needed for filtering apps that require root.
|
||||
AppTable.Cols._ID, // Required for cursor loader to work.
|
||||
AppTable.Cols.PACKAGE_NAME,
|
||||
AppTable.Cols.NAME,
|
||||
AppTable.Cols.SUMMARY,
|
||||
AppTable.Cols.IS_COMPATIBLE,
|
||||
AppTable.Cols.LICENSE,
|
||||
AppTable.Cols.ICON,
|
||||
AppTable.Cols.ICON_URL,
|
||||
AppTable.Cols.InstalledApp.VERSION_CODE,
|
||||
AppTable.Cols.InstalledApp.VERSION_NAME,
|
||||
AppTable.Cols.SuggestedApk.VERSION_NAME,
|
||||
AppTable.Cols.SUGGESTED_VERSION_CODE,
|
||||
AppTable.Cols.IGNORE_ALLUPDATES,
|
||||
AppTable.Cols.IGNORE_THISUPDATE,
|
||||
AppTable.Cols.REQUIREMENTS, // Needed for filtering apps that require root.
|
||||
};
|
||||
|
||||
private static final String APP_SORT = AppProvider.DataColumns.NAME;
|
||||
private static final String APP_SORT = AppTable.Cols.NAME;
|
||||
|
||||
private AppListAdapter appAdapter;
|
||||
|
||||
|
@ -36,6 +36,7 @@ import android.widget.TextView;
|
||||
|
||||
import org.fdroid.fdroid.R;
|
||||
import org.fdroid.fdroid.data.InstalledAppProvider;
|
||||
import org.fdroid.fdroid.data.Schema.InstalledAppTable;
|
||||
import org.fdroid.fdroid.localrepo.SwapService;
|
||||
|
||||
public class SelectAppsView extends ListView implements
|
||||
@ -77,7 +78,7 @@ public class SelectAppsView extends ListView implements
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
adapter = new AppListAdapter(this, getContext(),
|
||||
getContext().getContentResolver().query(InstalledAppProvider.getContentUri(), InstalledAppProvider.DataColumns.ALL, null, null, null));
|
||||
getContext().getContentResolver().query(InstalledAppProvider.getContentUri(), InstalledAppTable.Cols.ALL, null, null, null));
|
||||
|
||||
setAdapter(adapter);
|
||||
setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
|
||||
@ -140,7 +141,7 @@ public class SelectAppsView extends ListView implements
|
||||
|
||||
private void toggleAppSelected(int position) {
|
||||
Cursor c = (Cursor) adapter.getItem(position);
|
||||
String packageName = c.getString(c.getColumnIndex(InstalledAppProvider.DataColumns.PACKAGE_NAME));
|
||||
String packageName = c.getString(c.getColumnIndex(InstalledAppTable.Cols.PACKAGE_NAME));
|
||||
if (getState().hasSelectedPackage(packageName)) {
|
||||
getState().deselectPackage(packageName);
|
||||
adapter.updateCheckedIndicatorView(position, false);
|
||||
@ -162,10 +163,10 @@ public class SelectAppsView extends ListView implements
|
||||
return new CursorLoader(
|
||||
getActivity(),
|
||||
uri,
|
||||
InstalledAppProvider.DataColumns.ALL,
|
||||
InstalledAppTable.Cols.ALL,
|
||||
null,
|
||||
null,
|
||||
InstalledAppProvider.DataColumns.APPLICATION_LABEL);
|
||||
InstalledAppTable.Cols.APPLICATION_LABEL);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -174,7 +175,7 @@ public class SelectAppsView extends ListView implements
|
||||
|
||||
for (int i = 0; i < getCount(); i++) {
|
||||
Cursor c = (Cursor) getItemAtPosition(i);
|
||||
String packageName = c.getString(c.getColumnIndex(InstalledAppProvider.DataColumns.PACKAGE_NAME));
|
||||
String packageName = c.getString(c.getColumnIndex(InstalledAppTable.Cols.PACKAGE_NAME));
|
||||
getState().ensureFDroidSelected();
|
||||
for (String selected : getState().getAppsToSwap()) {
|
||||
if (TextUtils.equals(packageName, selected)) {
|
||||
@ -255,8 +256,8 @@ public class SelectAppsView extends ListView implements
|
||||
TextView labelView = (TextView) view.findViewById(R.id.application_label);
|
||||
ImageView iconView = (ImageView) view.findViewById(android.R.id.icon);
|
||||
|
||||
String packageName = cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.PACKAGE_NAME));
|
||||
String appLabel = cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.APPLICATION_LABEL));
|
||||
String packageName = cursor.getString(cursor.getColumnIndex(InstalledAppTable.Cols.PACKAGE_NAME));
|
||||
String appLabel = cursor.getString(cursor.getColumnIndex(InstalledAppTable.Cols.APPLICATION_LABEL));
|
||||
|
||||
Drawable icon;
|
||||
try {
|
||||
|
@ -49,6 +49,7 @@ import org.fdroid.fdroid.data.ApkProvider;
|
||||
import org.fdroid.fdroid.data.App;
|
||||
import org.fdroid.fdroid.data.AppProvider;
|
||||
import org.fdroid.fdroid.data.Repo;
|
||||
import org.fdroid.fdroid.data.Schema;
|
||||
import org.fdroid.fdroid.localrepo.SwapService;
|
||||
import org.fdroid.fdroid.net.Downloader;
|
||||
import org.fdroid.fdroid.net.DownloaderService;
|
||||
@ -104,7 +105,7 @@ public class SwapAppsView extends ListView implements
|
||||
*/
|
||||
|
||||
adapter = new AppListAdapter(getContext(), getContext().getContentResolver().query(
|
||||
AppProvider.getRepoUri(repo), AppProvider.DataColumns.ALL, null, null, null));
|
||||
AppProvider.getRepoUri(repo), Schema.AppTable.Cols.ALL, null, null, null));
|
||||
|
||||
setAdapter(adapter);
|
||||
|
||||
@ -194,7 +195,7 @@ public class SwapAppsView extends ListView implements
|
||||
? AppProvider.getRepoUri(repo)
|
||||
: AppProvider.getSearchUri(repo, mCurrentFilterString);
|
||||
|
||||
return new CursorLoader(getActivity(), uri, AppProvider.DataColumns.ALL, null, null, AppProvider.DataColumns.NAME);
|
||||
return new CursorLoader(getActivity(), uri, Schema.AppTable.Cols.ALL, null, null, Schema.AppTable.Cols.NAME);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -9,6 +9,9 @@ import junit.framework.AssertionFailedError;
|
||||
import org.fdroid.fdroid.data.ApkProvider;
|
||||
import org.fdroid.fdroid.data.AppProvider;
|
||||
import org.fdroid.fdroid.data.InstalledAppProvider;
|
||||
import org.fdroid.fdroid.data.Schema.ApkTable;
|
||||
import org.fdroid.fdroid.data.Schema.AppTable;
|
||||
import org.fdroid.fdroid.data.Schema.InstalledAppTable;
|
||||
import org.robolectric.shadows.ShadowContentResolver;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -152,10 +155,10 @@ public class Assert {
|
||||
Uri uri = InstalledAppProvider.getAppUri(appId);
|
||||
|
||||
String[] projection = {
|
||||
InstalledAppProvider.DataColumns.PACKAGE_NAME,
|
||||
InstalledAppProvider.DataColumns.VERSION_CODE,
|
||||
InstalledAppProvider.DataColumns.VERSION_NAME,
|
||||
InstalledAppProvider.DataColumns.APPLICATION_LABEL,
|
||||
InstalledAppTable.Cols.PACKAGE_NAME,
|
||||
InstalledAppTable.Cols.VERSION_CODE,
|
||||
InstalledAppTable.Cols.VERSION_NAME,
|
||||
InstalledAppTable.Cols.APPLICATION_LABEL,
|
||||
};
|
||||
|
||||
Cursor cursor = resolver.query(uri, projection, null, null, null);
|
||||
@ -165,9 +168,9 @@ public class Assert {
|
||||
|
||||
cursor.moveToFirst();
|
||||
|
||||
assertEquals(appId, cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.PACKAGE_NAME)));
|
||||
assertEquals(versionCode, cursor.getInt(cursor.getColumnIndex(InstalledAppProvider.DataColumns.VERSION_CODE)));
|
||||
assertEquals(versionName, cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.VERSION_NAME)));
|
||||
assertEquals(appId, cursor.getString(cursor.getColumnIndex(InstalledAppTable.Cols.PACKAGE_NAME)));
|
||||
assertEquals(versionCode, cursor.getInt(cursor.getColumnIndex(InstalledAppTable.Cols.VERSION_CODE)));
|
||||
assertEquals(versionName, cursor.getString(cursor.getColumnIndex(InstalledAppTable.Cols.VERSION_NAME)));
|
||||
cursor.close();
|
||||
}
|
||||
|
||||
@ -178,16 +181,16 @@ public class Assert {
|
||||
public static void insertApp(ShadowContentResolver resolver, String id, String name, ContentValues additionalValues) {
|
||||
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(AppProvider.DataColumns.PACKAGE_NAME, id);
|
||||
values.put(AppProvider.DataColumns.NAME, name);
|
||||
values.put(AppTable.Cols.PACKAGE_NAME, id);
|
||||
values.put(AppTable.Cols.NAME, name);
|
||||
|
||||
// Required fields (NOT NULL in the database).
|
||||
values.put(AppProvider.DataColumns.SUMMARY, "test summary");
|
||||
values.put(AppProvider.DataColumns.DESCRIPTION, "test description");
|
||||
values.put(AppProvider.DataColumns.LICENSE, "GPL?");
|
||||
values.put(AppProvider.DataColumns.IS_COMPATIBLE, 1);
|
||||
values.put(AppProvider.DataColumns.IGNORE_ALLUPDATES, 0);
|
||||
values.put(AppProvider.DataColumns.IGNORE_THISUPDATE, 0);
|
||||
values.put(AppTable.Cols.SUMMARY, "test summary");
|
||||
values.put(AppTable.Cols.DESCRIPTION, "test description");
|
||||
values.put(AppTable.Cols.LICENSE, "GPL?");
|
||||
values.put(AppTable.Cols.IS_COMPATIBLE, 1);
|
||||
values.put(AppTable.Cols.IGNORE_ALLUPDATES, 0);
|
||||
values.put(AppTable.Cols.IGNORE_THISUPDATE, 0);
|
||||
|
||||
values.putAll(additionalValues);
|
||||
|
||||
@ -204,16 +207,16 @@ public class Assert {
|
||||
|
||||
ContentValues values = new ContentValues();
|
||||
|
||||
values.put(ApkProvider.DataColumns.PACKAGE_NAME, id);
|
||||
values.put(ApkProvider.DataColumns.VERSION_CODE, versionCode);
|
||||
values.put(ApkTable.Cols.PACKAGE_NAME, id);
|
||||
values.put(ApkTable.Cols.VERSION_CODE, versionCode);
|
||||
|
||||
// Required fields (NOT NULL in the database).
|
||||
values.put(ApkProvider.DataColumns.REPO_ID, 1);
|
||||
values.put(ApkProvider.DataColumns.VERSION_NAME, "The good one");
|
||||
values.put(ApkProvider.DataColumns.HASH, "11111111aaaaaaaa");
|
||||
values.put(ApkProvider.DataColumns.NAME, "Test Apk");
|
||||
values.put(ApkProvider.DataColumns.SIZE, 10000);
|
||||
values.put(ApkProvider.DataColumns.IS_COMPATIBLE, 1);
|
||||
values.put(ApkTable.Cols.REPO_ID, 1);
|
||||
values.put(ApkTable.Cols.VERSION_NAME, "The good one");
|
||||
values.put(ApkTable.Cols.HASH, "11111111aaaaaaaa");
|
||||
values.put(ApkTable.Cols.NAME, "Test Apk");
|
||||
values.put(ApkTable.Cols.SIZE, 10000);
|
||||
values.put(ApkTable.Cols.IS_COMPATIBLE, 1);
|
||||
|
||||
values.putAll(additionalValues);
|
||||
|
||||
|
@ -13,6 +13,7 @@ import org.fdroid.fdroid.data.AppProvider;
|
||||
import org.fdroid.fdroid.data.FDroidProviderTest;
|
||||
import org.fdroid.fdroid.data.Repo;
|
||||
import org.fdroid.fdroid.data.RepoProvider;
|
||||
import org.fdroid.fdroid.data.Schema;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
|
||||
@ -91,7 +92,7 @@ public abstract class MultiRepoUpdaterTest extends FDroidProviderTest {
|
||||
}
|
||||
|
||||
protected void assertApp(String packageName, int[] versionCodes) {
|
||||
List<Apk> apks = ApkProvider.Helper.findByPackageName(context, packageName, ApkProvider.DataColumns.ALL);
|
||||
List<Apk> apks = ApkProvider.Helper.findByPackageName(context, packageName);
|
||||
assertApksExist(apks, packageName, versionCodes);
|
||||
}
|
||||
|
||||
@ -163,9 +164,9 @@ public abstract class MultiRepoUpdaterTest extends FDroidProviderTest {
|
||||
repo.name = name;
|
||||
|
||||
ContentValues values = new ContentValues(2);
|
||||
values.put(RepoProvider.DataColumns.SIGNING_CERT, repo.signingCertificate);
|
||||
values.put(RepoProvider.DataColumns.ADDRESS, repo.address);
|
||||
values.put(RepoProvider.DataColumns.NAME, repo.name);
|
||||
values.put(Schema.RepoTable.Cols.SIGNING_CERT, repo.signingCertificate);
|
||||
values.put(Schema.RepoTable.Cols.ADDRESS, repo.address);
|
||||
values.put(Schema.RepoTable.Cols.NAME, repo.name);
|
||||
|
||||
RepoProvider.Helper.insert(context, values);
|
||||
|
||||
|
@ -7,6 +7,7 @@ import org.fdroid.fdroid.data.Apk;
|
||||
import org.fdroid.fdroid.data.ApkProvider;
|
||||
import org.fdroid.fdroid.data.Repo;
|
||||
import org.fdroid.fdroid.data.RepoProvider;
|
||||
import org.fdroid.fdroid.data.Schema;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ -101,7 +102,7 @@ public class ProperMultiRepoUpdaterTest extends MultiRepoUpdaterTest {
|
||||
private void assertMainRepo(List<Repo> allRepos) {
|
||||
Repo repo = findRepo(REPO_MAIN, allRepos);
|
||||
|
||||
List<Apk> apks = ApkProvider.Helper.findByRepo(context, repo, ApkProvider.DataColumns.ALL);
|
||||
List<Apk> apks = ApkProvider.Helper.findByRepo(context, repo, Schema.ApkTable.Cols.ALL);
|
||||
assertEquals("Apks for main repo", apks.size(), 6);
|
||||
assertApksExist(apks, "com.uberspot.a2048", new int[]{18, 19});
|
||||
assertApksExist(apks, "org.adaway", new int[]{52, 53, 54});
|
||||
@ -127,7 +128,7 @@ public class ProperMultiRepoUpdaterTest extends MultiRepoUpdaterTest {
|
||||
private void assertMainArchiveRepo(List<Repo> allRepos) {
|
||||
Repo repo = findRepo(REPO_ARCHIVE, allRepos);
|
||||
|
||||
List<Apk> apks = ApkProvider.Helper.findByRepo(context, repo, ApkProvider.DataColumns.ALL);
|
||||
List<Apk> apks = ApkProvider.Helper.findByRepo(context, repo, Schema.ApkTable.Cols.ALL);
|
||||
assertEquals("Apks for main archive repo", 13, apks.size());
|
||||
assertApksExist(apks, "org.adaway", new int[]{35, 36, 37, 38, 40, 42, 45, 46, 47, 48, 49, 50, 51});
|
||||
}
|
||||
@ -145,7 +146,7 @@ public class ProperMultiRepoUpdaterTest extends MultiRepoUpdaterTest {
|
||||
private void assertConflictingRepo(List<Repo> allRepos) {
|
||||
Repo repo = findRepo(REPO_CONFLICTING, allRepos);
|
||||
|
||||
List<Apk> apks = ApkProvider.Helper.findByRepo(context, repo, ApkProvider.DataColumns.ALL);
|
||||
List<Apk> apks = ApkProvider.Helper.findByRepo(context, repo, Schema.ApkTable.Cols.ALL);
|
||||
assertEquals("Apks for main repo", 6, apks.size());
|
||||
assertApksExist(apks, "org.adaway", new int[]{50, 51, 52, 53});
|
||||
assertApksExist(apks, "org.dgtale.icsimport", new int[]{2, 3});
|
||||
|
@ -7,6 +7,8 @@ import android.net.Uri;
|
||||
|
||||
import org.fdroid.fdroid.Assert;
|
||||
import org.fdroid.fdroid.BuildConfig;
|
||||
import org.fdroid.fdroid.data.Schema.ApkTable.Cols;
|
||||
import org.fdroid.fdroid.data.Schema.RepoTable;
|
||||
import org.fdroid.fdroid.mock.MockApk;
|
||||
import org.fdroid.fdroid.mock.MockApp;
|
||||
import org.fdroid.fdroid.mock.MockRepo;
|
||||
@ -32,7 +34,7 @@ import static org.junit.Assert.fail;
|
||||
@RunWith(RobolectricGradleTestRunner.class)
|
||||
public class ApkProviderTest extends FDroidProviderTest {
|
||||
|
||||
private static final String[] PROJ = ApkProvider.DataColumns.ALL;
|
||||
private static final String[] PROJ = Cols.ALL;
|
||||
|
||||
@Test
|
||||
public void testAppApks() {
|
||||
@ -89,7 +91,7 @@ public class ApkProviderTest extends FDroidProviderTest {
|
||||
"com.example.five",
|
||||
};
|
||||
|
||||
List<Apk> all = ApkProvider.Helper.findByRepo(context, new MockRepo(10), ApkProvider.DataColumns.ALL);
|
||||
List<Apk> all = ApkProvider.Helper.findByRepo(context, new MockRepo(10), Cols.ALL);
|
||||
List<String> actualIds = new ArrayList<>();
|
||||
for (Apk apk : all) {
|
||||
actualIds.add(apk.packageName);
|
||||
@ -105,7 +107,7 @@ public class ApkProviderTest extends FDroidProviderTest {
|
||||
|
||||
assertTotalApkCount(2);
|
||||
|
||||
List<Apk> allRemaining = ApkProvider.Helper.findByRepo(context, new MockRepo(10), ApkProvider.DataColumns.ALL);
|
||||
List<Apk> allRemaining = ApkProvider.Helper.findByRepo(context, new MockRepo(10), Cols.ALL);
|
||||
List<String> actualRemainingIds = new ArrayList<>();
|
||||
for (Apk apk : allRemaining) {
|
||||
actualRemainingIds.add(apk.packageName);
|
||||
@ -211,7 +213,7 @@ public class ApkProviderTest extends FDroidProviderTest {
|
||||
|
||||
@Test
|
||||
public void testCount() {
|
||||
String[] projectionCount = new String[] {ApkProvider.DataColumns._COUNT};
|
||||
String[] projectionCount = new String[] {Cols._COUNT};
|
||||
|
||||
for (int i = 0; i < 13; i++) {
|
||||
Assert.insertApk(contentResolver, "com.example", i);
|
||||
@ -226,34 +228,34 @@ public class ApkProviderTest extends FDroidProviderTest {
|
||||
assertResultCount(1, allWithCount);
|
||||
|
||||
allWithCount.moveToFirst();
|
||||
int countColumn = allWithCount.getColumnIndex(ApkProvider.DataColumns._COUNT);
|
||||
int countColumn = allWithCount.getColumnIndex(Cols._COUNT);
|
||||
assertEquals(13, allWithCount.getInt(countColumn));
|
||||
allWithCount.close();
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testInsertWithInvalidExtraFieldDescription() {
|
||||
assertInvalidExtraField(RepoProvider.DataColumns.DESCRIPTION);
|
||||
assertInvalidExtraField(RepoTable.Cols.DESCRIPTION);
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testInsertWithInvalidExtraFieldAddress() {
|
||||
assertInvalidExtraField(RepoProvider.DataColumns.ADDRESS);
|
||||
assertInvalidExtraField(RepoTable.Cols.ADDRESS);
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testInsertWithInvalidExtraFieldFingerprint() {
|
||||
assertInvalidExtraField(RepoProvider.DataColumns.FINGERPRINT);
|
||||
assertInvalidExtraField(RepoTable.Cols.FINGERPRINT);
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testInsertWithInvalidExtraFieldName() {
|
||||
assertInvalidExtraField(RepoProvider.DataColumns.NAME);
|
||||
assertInvalidExtraField(RepoTable.Cols.NAME);
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testInsertWithInvalidExtraFieldSigningCert() {
|
||||
assertInvalidExtraField(RepoProvider.DataColumns.SIGNING_CERT);
|
||||
assertInvalidExtraField(RepoTable.Cols.SIGNING_CERT);
|
||||
}
|
||||
|
||||
public void assertInvalidExtraField(String field) {
|
||||
@ -268,15 +270,15 @@ public class ApkProviderTest extends FDroidProviderTest {
|
||||
assertResultCount(0, queryAllApks());
|
||||
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(ApkProvider.DataColumns.REPO_ID, 10);
|
||||
values.put(ApkProvider.DataColumns.REPO_ADDRESS, "http://example.com");
|
||||
values.put(ApkProvider.DataColumns.REPO_VERSION, 3);
|
||||
values.put(ApkProvider.DataColumns.FEATURES, "Some features");
|
||||
values.put(Cols.REPO_ID, 10);
|
||||
values.put(Cols.REPO_ADDRESS, "http://example.com");
|
||||
values.put(Cols.REPO_VERSION, 3);
|
||||
values.put(Cols.FEATURES, "Some features");
|
||||
Uri uri = Assert.insertApk(contentResolver, "com.example.com", 1, values);
|
||||
|
||||
assertResultCount(1, queryAllApks());
|
||||
|
||||
String[] projections = ApkProvider.DataColumns.ALL;
|
||||
String[] projections = Cols.ALL;
|
||||
Cursor cursor = contentResolver.query(uri, projections, null, null, null);
|
||||
cursor.moveToFirst();
|
||||
Apk apk = new Apk(cursor);
|
||||
@ -340,8 +342,8 @@ public class ApkProviderTest extends FDroidProviderTest {
|
||||
Collections.addAll(apksToCheck, unknown);
|
||||
|
||||
String[] projection = {
|
||||
ApkProvider.DataColumns.PACKAGE_NAME,
|
||||
ApkProvider.DataColumns.VERSION_CODE,
|
||||
Cols.PACKAGE_NAME,
|
||||
Cols.VERSION_CODE,
|
||||
};
|
||||
|
||||
List<Apk> knownApks = ApkProvider.Helper.knownApks(context, apksToCheck, projection);
|
||||
@ -394,7 +396,7 @@ public class ApkProviderTest extends FDroidProviderTest {
|
||||
|
||||
Uri apkUri = Assert.insertApk(contentResolver, "com.example", 10);
|
||||
|
||||
String[] allFields = ApkProvider.DataColumns.ALL;
|
||||
String[] allFields = Cols.ALL;
|
||||
Cursor cursor = contentResolver.query(apkUri, allFields, null, null, null);
|
||||
assertResultCount(1, cursor);
|
||||
|
||||
@ -455,9 +457,9 @@ public class ApkProviderTest extends FDroidProviderTest {
|
||||
}
|
||||
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(ApkProvider.DataColumns.VERSION_NAME, "v1.1");
|
||||
values.put(ApkProvider.DataColumns.HASH, "xxxxyyyy");
|
||||
values.put(ApkProvider.DataColumns.HASH_TYPE, "a hash type");
|
||||
values.put(Cols.VERSION_NAME, "v1.1");
|
||||
values.put(Cols.HASH, "xxxxyyyy");
|
||||
values.put(Cols.HASH_TYPE, "a hash type");
|
||||
Assert.insertApk(contentResolver, "com.example", 11, values);
|
||||
|
||||
// ...and a few more for good measure...
|
||||
@ -478,8 +480,8 @@ public class ApkProviderTest extends FDroidProviderTest {
|
||||
assertEquals("a hash type", apk.hashType);
|
||||
|
||||
String[] projection = {
|
||||
ApkProvider.DataColumns.PACKAGE_NAME,
|
||||
ApkProvider.DataColumns.HASH,
|
||||
Cols.PACKAGE_NAME,
|
||||
Cols.HASH,
|
||||
};
|
||||
|
||||
Apk apkLessFields = ApkProvider.Helper.find(context, "com.example", 11, projection);
|
||||
@ -537,7 +539,7 @@ public class ApkProviderTest extends FDroidProviderTest {
|
||||
|
||||
protected Apk insertApkForRepo(String id, int versionCode, long repoId) {
|
||||
ContentValues additionalValues = new ContentValues();
|
||||
additionalValues.put(ApkProvider.DataColumns.REPO_ID, repoId);
|
||||
additionalValues.put(Cols.REPO_ID, repoId);
|
||||
Uri uri = Assert.insertApk(contentResolver, id, versionCode, additionalValues);
|
||||
return ApkProvider.Helper.get(context, uri);
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import android.net.Uri;
|
||||
|
||||
import org.fdroid.fdroid.BuildConfig;
|
||||
import org.fdroid.fdroid.R;
|
||||
import org.fdroid.fdroid.data.Schema.AppTable.Cols;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@ -30,7 +31,7 @@ import static org.junit.Assert.assertTrue;
|
||||
@RunWith(RobolectricGradleTestRunner.class)
|
||||
public class AppProviderTest extends FDroidProviderTest {
|
||||
|
||||
private static final String[] PROJ = AppProvider.DataColumns.ALL;
|
||||
private static final String[] PROJ = Cols.ALL;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
@ -86,9 +87,9 @@ public class AppProviderTest extends FDroidProviderTest {
|
||||
String packageName, int installedVercode, int suggestedVercode,
|
||||
boolean ignoreAll, int ignoreVercode) {
|
||||
ContentValues values = new ContentValues(3);
|
||||
values.put(AppProvider.DataColumns.SUGGESTED_VERSION_CODE, suggestedVercode);
|
||||
values.put(AppProvider.DataColumns.IGNORE_ALLUPDATES, ignoreAll);
|
||||
values.put(AppProvider.DataColumns.IGNORE_THISUPDATE, ignoreVercode);
|
||||
values.put(Cols.SUGGESTED_VERSION_CODE, suggestedVercode);
|
||||
values.put(Cols.IGNORE_ALLUPDATES, ignoreAll);
|
||||
values.put(Cols.IGNORE_THISUPDATE, ignoreVercode);
|
||||
insertApp(packageName, "App: " + packageName, values);
|
||||
|
||||
InstalledAppTestUtils.install(context, packageName, installedVercode, "v" + installedVercode);
|
||||
@ -135,7 +136,7 @@ public class AppProviderTest extends FDroidProviderTest {
|
||||
assertFalse(installedOldIgnoreLatest.canAndWantToUpdate());
|
||||
assertTrue(installedOldIgnoreNewerNotLatest.canAndWantToUpdate());
|
||||
|
||||
Cursor canUpdateCursor = r.query(AppProvider.getCanUpdateUri(), AppProvider.DataColumns.ALL, null, null, null);
|
||||
Cursor canUpdateCursor = r.query(AppProvider.getCanUpdateUri(), Cols.ALL, null, null, null);
|
||||
assertNotNull(canUpdateCursor);
|
||||
canUpdateCursor.moveToFirst();
|
||||
List<String> canUpdateIds = new ArrayList<>(canUpdateCursor.getCount());
|
||||
@ -168,7 +169,7 @@ public class AppProviderTest extends FDroidProviderTest {
|
||||
|
||||
assertResultCount(contentResolver, 10, AppProvider.getContentUri(), PROJ);
|
||||
|
||||
String[] projection = {AppProvider.DataColumns.PACKAGE_NAME};
|
||||
String[] projection = {Cols.PACKAGE_NAME};
|
||||
List<App> ignoredApps = AppProvider.Helper.findIgnored(context, projection);
|
||||
|
||||
String[] expectedIgnored = {
|
||||
@ -251,9 +252,9 @@ public class AppProviderTest extends FDroidProviderTest {
|
||||
|
||||
private Cursor queryAllApps() {
|
||||
String[] projection = new String[] {
|
||||
AppProvider.DataColumns._ID,
|
||||
AppProvider.DataColumns.NAME,
|
||||
AppProvider.DataColumns.PACKAGE_NAME,
|
||||
Cols._ID,
|
||||
Cols.NAME,
|
||||
Cols.PACKAGE_NAME,
|
||||
};
|
||||
return contentResolver.query(AppProvider.getContentUri(), projection, null, null, null);
|
||||
}
|
||||
@ -342,23 +343,23 @@ public class AppProviderTest extends FDroidProviderTest {
|
||||
|
||||
private void insertAppWithCategory(String id, String name, String categories) {
|
||||
ContentValues values = new ContentValues(1);
|
||||
values.put(AppProvider.DataColumns.CATEGORIES, categories);
|
||||
values.put(Cols.CATEGORIES, categories);
|
||||
insertApp(id, name, values);
|
||||
}
|
||||
|
||||
public void insertApp(String id, String name, ContentValues additionalValues) {
|
||||
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(AppProvider.DataColumns.PACKAGE_NAME, id);
|
||||
values.put(AppProvider.DataColumns.NAME, name);
|
||||
values.put(Cols.PACKAGE_NAME, id);
|
||||
values.put(Cols.NAME, name);
|
||||
|
||||
// Required fields (NOT NULL in the database).
|
||||
values.put(AppProvider.DataColumns.SUMMARY, "test summary");
|
||||
values.put(AppProvider.DataColumns.DESCRIPTION, "test description");
|
||||
values.put(AppProvider.DataColumns.LICENSE, "GPL?");
|
||||
values.put(AppProvider.DataColumns.IS_COMPATIBLE, 1);
|
||||
values.put(AppProvider.DataColumns.IGNORE_ALLUPDATES, 0);
|
||||
values.put(AppProvider.DataColumns.IGNORE_THISUPDATE, 0);
|
||||
values.put(Cols.SUMMARY, "test summary");
|
||||
values.put(Cols.DESCRIPTION, "test description");
|
||||
values.put(Cols.LICENSE, "GPL?");
|
||||
values.put(Cols.IS_COMPATIBLE, 1);
|
||||
values.put(Cols.IGNORE_ALLUPDATES, 0);
|
||||
values.put(Cols.IGNORE_THISUPDATE, 0);
|
||||
|
||||
values.putAll(additionalValues);
|
||||
|
||||
|
@ -6,6 +6,7 @@ import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
|
||||
import org.fdroid.fdroid.BuildConfig;
|
||||
import org.fdroid.fdroid.data.Schema.InstalledAppTable.Cols;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@ -37,32 +38,32 @@ public class InstalledAppProviderTest extends FDroidProviderTest {
|
||||
assertEquals(foundBefore.size(), 0);
|
||||
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(InstalledAppProvider.DataColumns.PACKAGE_NAME, "org.example.test-app");
|
||||
values.put(InstalledAppProvider.DataColumns.APPLICATION_LABEL, "Test App");
|
||||
values.put(InstalledAppProvider.DataColumns.VERSION_CODE, 1021);
|
||||
values.put(InstalledAppProvider.DataColumns.VERSION_NAME, "Longhorn");
|
||||
values.put(InstalledAppProvider.DataColumns.HASH, "has of test app");
|
||||
values.put(InstalledAppProvider.DataColumns.HASH_TYPE, "fake hash type");
|
||||
values.put(InstalledAppProvider.DataColumns.LAST_UPDATE_TIME, 100000000L);
|
||||
values.put(InstalledAppProvider.DataColumns.SIGNATURE, "000111222333444555666777888999aaabbbcccdddeeefff");
|
||||
values.put(Cols.PACKAGE_NAME, "org.example.test-app");
|
||||
values.put(Cols.APPLICATION_LABEL, "Test App");
|
||||
values.put(Cols.VERSION_CODE, 1021);
|
||||
values.put(Cols.VERSION_NAME, "Longhorn");
|
||||
values.put(Cols.HASH, "has of test app");
|
||||
values.put(Cols.HASH_TYPE, "fake hash type");
|
||||
values.put(Cols.LAST_UPDATE_TIME, 100000000L);
|
||||
values.put(Cols.SIGNATURE, "000111222333444555666777888999aaabbbcccdddeeefff");
|
||||
contentResolver.insert(InstalledAppProvider.getContentUri(), values);
|
||||
|
||||
Map<String, Long> foundAfter = InstalledAppProvider.Helper.all(RuntimeEnvironment.application);
|
||||
assertEquals(1, foundAfter.size());
|
||||
assertEquals(100000000L, foundAfter.get("org.example.test-app").longValue());
|
||||
|
||||
Cursor cursor = contentResolver.query(InstalledAppProvider.getAppUri("org.example.test-app"), InstalledAppProvider.DataColumns.ALL, null, null, null);
|
||||
Cursor cursor = contentResolver.query(InstalledAppProvider.getAppUri("org.example.test-app"), Cols.ALL, null, null, null);
|
||||
assertEquals(cursor.getCount(), 1);
|
||||
|
||||
cursor.moveToFirst();
|
||||
assertEquals("org.example.test-app", cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.PACKAGE_NAME)));
|
||||
assertEquals("Test App", cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.APPLICATION_LABEL)));
|
||||
assertEquals(1021, cursor.getInt(cursor.getColumnIndex(InstalledAppProvider.DataColumns.VERSION_CODE)));
|
||||
assertEquals("Longhorn", cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.VERSION_NAME)));
|
||||
assertEquals("has of test app", cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.HASH)));
|
||||
assertEquals("fake hash type", cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.HASH_TYPE)));
|
||||
assertEquals(100000000L, cursor.getLong(cursor.getColumnIndex(InstalledAppProvider.DataColumns.LAST_UPDATE_TIME)));
|
||||
assertEquals("000111222333444555666777888999aaabbbcccdddeeefff", cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.SIGNATURE)));
|
||||
assertEquals("org.example.test-app", cursor.getString(cursor.getColumnIndex(Cols.PACKAGE_NAME)));
|
||||
assertEquals("Test App", cursor.getString(cursor.getColumnIndex(Cols.APPLICATION_LABEL)));
|
||||
assertEquals(1021, cursor.getInt(cursor.getColumnIndex(Cols.VERSION_CODE)));
|
||||
assertEquals("Longhorn", cursor.getString(cursor.getColumnIndex(Cols.VERSION_NAME)));
|
||||
assertEquals("has of test app", cursor.getString(cursor.getColumnIndex(Cols.HASH)));
|
||||
assertEquals("fake hash type", cursor.getString(cursor.getColumnIndex(Cols.HASH_TYPE)));
|
||||
assertEquals(100000000L, cursor.getLong(cursor.getColumnIndex(Cols.LAST_UPDATE_TIME)));
|
||||
assertEquals("000111222333444555666777888999aaabbbcccdddeeefff", cursor.getString(cursor.getColumnIndex(Cols.SIGNATURE)));
|
||||
|
||||
cursor.close();
|
||||
}
|
||||
@ -123,16 +124,16 @@ public class InstalledAppProviderTest extends FDroidProviderTest {
|
||||
Uri uri = InstalledAppProvider.getAppUri(packageName);
|
||||
|
||||
String[] projection = {
|
||||
InstalledAppProvider.DataColumns.PACKAGE_NAME,
|
||||
InstalledAppProvider.DataColumns.LAST_UPDATE_TIME,
|
||||
Cols.PACKAGE_NAME,
|
||||
Cols.LAST_UPDATE_TIME,
|
||||
};
|
||||
|
||||
Cursor cursor = contentResolver.query(uri, projection, null, null, null);
|
||||
assertNotNull(cursor);
|
||||
assertEquals("App \"" + packageName + "\" not installed", 1, cursor.getCount());
|
||||
cursor.moveToFirst();
|
||||
assertEquals(packageName, cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.PACKAGE_NAME)));
|
||||
long lastUpdateTime = cursor.getLong(cursor.getColumnIndex(InstalledAppProvider.DataColumns.LAST_UPDATE_TIME));
|
||||
assertEquals(packageName, cursor.getString(cursor.getColumnIndex(Cols.PACKAGE_NAME)));
|
||||
long lastUpdateTime = cursor.getLong(cursor.getColumnIndex(Cols.LAST_UPDATE_TIME));
|
||||
assertTrue(lastUpdateTime > 0);
|
||||
assertTrue(lastUpdateTime < System.currentTimeMillis());
|
||||
cursor.close();
|
||||
@ -142,7 +143,7 @@ public class InstalledAppProviderTest extends FDroidProviderTest {
|
||||
assertNotNull(cursor);
|
||||
assertEquals("App \"" + packageName + "\" not installed", 1, cursor.getCount());
|
||||
cursor.moveToFirst();
|
||||
assertTrue(lastUpdateTime < cursor.getLong(cursor.getColumnIndex(InstalledAppProvider.DataColumns.LAST_UPDATE_TIME)));
|
||||
assertTrue(lastUpdateTime < cursor.getLong(cursor.getColumnIndex(Cols.LAST_UPDATE_TIME)));
|
||||
cursor.close();
|
||||
}
|
||||
|
||||
@ -168,15 +169,15 @@ public class InstalledAppProviderTest extends FDroidProviderTest {
|
||||
private ContentValues createContentValues(String appId, int versionCode, String versionNumber) {
|
||||
ContentValues values = new ContentValues(3);
|
||||
if (appId != null) {
|
||||
values.put(InstalledAppProvider.DataColumns.PACKAGE_NAME, appId);
|
||||
values.put(Cols.PACKAGE_NAME, appId);
|
||||
}
|
||||
values.put(InstalledAppProvider.DataColumns.APPLICATION_LABEL, "Mock app: " + appId);
|
||||
values.put(InstalledAppProvider.DataColumns.VERSION_CODE, versionCode);
|
||||
values.put(InstalledAppProvider.DataColumns.VERSION_NAME, versionNumber);
|
||||
values.put(InstalledAppProvider.DataColumns.SIGNATURE, "");
|
||||
values.put(InstalledAppProvider.DataColumns.LAST_UPDATE_TIME, System.currentTimeMillis());
|
||||
values.put(InstalledAppProvider.DataColumns.HASH_TYPE, "sha256");
|
||||
values.put(InstalledAppProvider.DataColumns.HASH, "cafecafecafecafecafecafecafecafecafecafecafecafecafecafecafecafe");
|
||||
values.put(Cols.APPLICATION_LABEL, "Mock app: " + appId);
|
||||
values.put(Cols.VERSION_CODE, versionCode);
|
||||
values.put(Cols.VERSION_NAME, versionNumber);
|
||||
values.put(Cols.SIGNATURE, "");
|
||||
values.put(Cols.LAST_UPDATE_TIME, System.currentTimeMillis());
|
||||
values.put(Cols.HASH_TYPE, "sha256");
|
||||
values.put(Cols.HASH, "cafecafecafecafecafecafecafecafecafecafecafecafecafecafecafecafe");
|
||||
return values;
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
package org.fdroid.fdroid.data;
|
||||
|
||||
import org.fdroid.fdroid.BuildConfig;
|
||||
import org.fdroid.fdroid.data.Schema.InstalledAppTable;
|
||||
import org.fdroid.fdroid.mock.MockApk;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
@ -44,7 +45,7 @@ public class ProviderUriTests {
|
||||
@Test
|
||||
public void validInstalledAppProviderUris() {
|
||||
ShadowContentResolver.registerProvider(InstalledAppProvider.getAuthority(), new InstalledAppProvider());
|
||||
String[] projection = new String[] {InstalledAppProvider.DataColumns._ID};
|
||||
String[] projection = new String[] {InstalledAppTable.Cols._ID};
|
||||
assertValidUri(resolver, InstalledAppProvider.getContentUri(), projection);
|
||||
assertValidUri(resolver, InstalledAppProvider.getAppUri("org.example.app"), projection);
|
||||
assertValidUri(resolver, InstalledAppProvider.getSearchUri("blah"), projection);
|
||||
@ -63,7 +64,7 @@ public class ProviderUriTests {
|
||||
@Test
|
||||
public void validRepoProviderUris() {
|
||||
ShadowContentResolver.registerProvider(RepoProvider.getAuthority(), new RepoProvider());
|
||||
String[] projection = new String[] {RepoProvider.DataColumns._ID};
|
||||
String[] projection = new String[] {Schema.RepoTable.Cols._ID};
|
||||
assertValidUri(resolver, RepoProvider.getContentUri(), projection);
|
||||
assertValidUri(resolver, RepoProvider.getContentUri(10000L), projection);
|
||||
assertValidUri(resolver, RepoProvider.allExceptSwapUri(), projection);
|
||||
@ -79,7 +80,7 @@ public class ProviderUriTests {
|
||||
@Test
|
||||
public void validAppProviderUris() {
|
||||
ShadowContentResolver.registerProvider(AppProvider.getAuthority(), new AppProvider());
|
||||
String[] projection = new String[] {AppProvider.DataColumns._ID};
|
||||
String[] projection = new String[] {Schema.AppTable.Cols._ID};
|
||||
assertValidUri(resolver, AppProvider.getContentUri(), "content://org.fdroid.fdroid.data.AppProvider", projection);
|
||||
assertValidUri(resolver, AppProvider.getSearchUri("'searching!'"), "content://org.fdroid.fdroid.data.AppProvider/search/'searching!'", projection);
|
||||
assertValidUri(resolver, AppProvider.getSearchUri("/"), "content://org.fdroid.fdroid.data.AppProvider/search/%2F", projection);
|
||||
@ -110,7 +111,7 @@ public class ProviderUriTests {
|
||||
@Test
|
||||
public void validApkProviderUris() {
|
||||
ShadowContentResolver.registerProvider(ApkProvider.getAuthority(), new ApkProvider());
|
||||
String[] projection = new String[] {ApkProvider.DataColumns._ID};
|
||||
String[] projection = new String[] {Schema.ApkTable.Cols._ID};
|
||||
|
||||
List<Apk> apks = new ArrayList<>(10);
|
||||
for (int i = 0; i < 10; i++) {
|
||||
@ -127,7 +128,7 @@ public class ProviderUriTests {
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void invalidApkUrisWithTooManyApks() {
|
||||
String[] projection = ApkProvider.DataColumns.ALL;
|
||||
String[] projection = Schema.ApkTable.Cols.ALL;
|
||||
|
||||
List<Apk> manyApks = new ArrayList<>(ApkProvider.MAX_APKS_TO_QUERY - 5);
|
||||
for (int i = 0; i < ApkProvider.MAX_APKS_TO_QUERY - 1; i++) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user