diff --git a/app/src/main/java/org/fdroid/fdroid/AppDetails.java b/app/src/main/java/org/fdroid/fdroid/AppDetails.java index ed5dea712..8bc60b6dc 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppDetails.java +++ b/app/src/main/java/org/fdroid/fdroid/AppDetails.java @@ -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; diff --git a/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java b/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java index d72f83210..f5ca2e6dc 100644 --- a/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java +++ b/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java @@ -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); } diff --git a/app/src/main/java/org/fdroid/fdroid/UpdateService.java b/app/src/main/java/org/fdroid/fdroid/UpdateService.java index 3c4c5da5a..6fc75b4c0 100644 --- a/app/src/main/java/org/fdroid/fdroid/UpdateService.java +++ b/app/src/main/java/org/fdroid/fdroid/UpdateService.java @@ -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(); diff --git a/app/src/main/java/org/fdroid/fdroid/data/Apk.java b/app/src/main/java/org/fdroid/fdroid/data/Apk.java index 36d5db4e8..04b626d3e 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Apk.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Apk.java @@ -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 { 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 { 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 { 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; } diff --git a/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java b/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java index a69dc5155..66b9e6f1d 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java @@ -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 find(Context context, Repo repo, List 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 findByPackageName(Context context, String packageName) { - return findByPackageName(context, packageName, ApkProvider.DataColumns.ALL); + return findByPackageName(context, packageName, Cols.ALL); } public static List 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 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); diff --git a/app/src/main/java/org/fdroid/fdroid/data/App.java b/app/src/main/java/org/fdroid/fdroid/data/App.java index 355d1a8ee..c9971f2b1 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/App.java +++ b/app/src/main/java/org/fdroid/fdroid/data/App.java @@ -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 { private static final String TAG = "App"; @@ -151,103 +153,103 @@ public class App extends ValueObject implements Comparable { 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 { 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; } diff --git a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java index 0b2457dad..f1d5e0b8d 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java @@ -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 all(ContentResolver resolver) { - return all(resolver, DataColumns.ALL); + return all(resolver, Cols.ALL); } public static List all(ContentResolver resolver, String[] projection) { @@ -90,7 +95,7 @@ public class AppProvider extends FDroidProvider { public static List 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 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 " + diff --git a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java index 209905a27..294dee31c 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java @@ -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 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 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, diff --git a/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProvider.java b/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProvider.java index ffeb36f59..0bfeccee9 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProvider.java @@ -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 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)); } } diff --git a/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java b/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java index da9db1bb2..44dc8e642 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java +++ b/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java @@ -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); } diff --git a/app/src/main/java/org/fdroid/fdroid/data/Repo.java b/app/src/main/java/org/fdroid/fdroid/data/Repo.java index df8f7ef4e..62746de2b 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Repo.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Repo.java @@ -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)); } } } diff --git a/app/src/main/java/org/fdroid/fdroid/data/RepoPersister.java b/app/src/main/java/org/fdroid/fdroid/data/RepoPersister.java index cb7ce562a..ff34ffe53 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/RepoPersister.java +++ b/app/src/main/java/org/fdroid/fdroid/data/RepoPersister.java @@ -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 insertOrUpdateApks(List packages) { String[] projection = new String[]{ - ApkProvider.DataColumns.PACKAGE_NAME, - ApkProvider.DataColumns.VERSION_CODE, + Schema.ApkTable.Cols.PACKAGE_NAME, + Schema.ApkTable.Cols.VERSION_CODE, }; List existingApks = ApkProvider.Helper.knownApks(context, packages, projection); ArrayList 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 apps, Map> 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 existing = ApkProvider.Helper.find(context, repo, apps, projection); List toDelete = new ArrayList<>(); diff --git a/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java b/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java index 3d1e76ac1..bc7d9c8fa 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java @@ -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 repos = findBy( - context, DataColumns.ADDRESS, address, projection); + context, Cols.ADDRESS, address, projection); return repos.size() > 0 ? repos.get(0) : null; } public static List all(Context context) { - return all(context, DataColumns.ALL); + return all(context, Cols.ALL); } public static List 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); diff --git a/app/src/main/java/org/fdroid/fdroid/data/Schema.java b/app/src/main/java/org/fdroid/fdroid/data/Schema.java new file mode 100644 index 000000000..2a8cbbc91 --- /dev/null +++ b/app/src/main/java/org/fdroid/fdroid/data/Schema.java @@ -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, + }; + } + } + +} diff --git a/app/src/main/java/org/fdroid/fdroid/data/TempApkProvider.java b/app/src/main/java/org/fdroid/fdroid/data/TempApkProvider.java index 19b4d277d..55f90fe11 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/TempApkProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/TempApkProvider.java @@ -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);"); diff --git a/app/src/main/java/org/fdroid/fdroid/data/TempAppProvider.java b/app/src/main/java/org/fdroid/fdroid/data/TempAppProvider.java index d2ee5aa6e..bd0a20ddc 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/TempAppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/TempAppProvider.java @@ -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(); diff --git a/app/src/main/java/org/fdroid/fdroid/localrepo/SwapService.java b/app/src/main/java/org/fdroid/fdroid/localrepo/SwapService.java index 6f1eb4b47..e33b2c1a3 100644 --- a/app/src/main/java/org/fdroid/fdroid/localrepo/SwapService.java +++ b/app/src/main/java/org/fdroid/fdroid/localrepo/SwapService.java @@ -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); } diff --git a/app/src/main/java/org/fdroid/fdroid/net/DownloaderFactory.java b/app/src/main/java/org/fdroid/fdroid/net/DownloaderFactory.java index 2c2b8cb65..65e35e6b2 100644 --- a/app/src/main/java/org/fdroid/fdroid/net/DownloaderFactory.java +++ b/app/src/main/java/org/fdroid/fdroid/net/DownloaderFactory.java @@ -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) { diff --git a/app/src/main/java/org/fdroid/fdroid/privileged/views/InstallConfirmActivity.java b/app/src/main/java/org/fdroid/fdroid/privileged/views/InstallConfirmActivity.java index e4cc05053..766fe316f 100644 --- a/app/src/main/java/org/fdroid/fdroid/privileged/views/InstallConfirmActivity.java +++ b/app/src/main/java/org/fdroid/fdroid/privileged/views/InstallConfirmActivity.java @@ -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); diff --git a/app/src/main/java/org/fdroid/fdroid/views/ManageReposActivity.java b/app/src/main/java/org/fdroid/fdroid/views/ManageReposActivity.java index 909c6c42f..88d290f18 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/ManageReposActivity.java +++ b/app/src/main/java/org/fdroid/fdroid/views/ManageReposActivity.java @@ -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) { diff --git a/app/src/main/java/org/fdroid/fdroid/views/RepoDetailsActivity.java b/app/src/main/java/org/fdroid/fdroid/views/RepoDetailsActivity.java index 6c4cdbcd7..03ce7ab66 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/RepoDetailsActivity.java +++ b/app/src/main/java/org/fdroid/fdroid/views/RepoDetailsActivity.java @@ -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); diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/AppListFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/AppListFragment.java index 609c0b37f..1886af329 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/fragments/AppListFragment.java +++ b/app/src/main/java/org/fdroid/fdroid/views/fragments/AppListFragment.java @@ -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; diff --git a/app/src/main/java/org/fdroid/fdroid/views/swap/SelectAppsView.java b/app/src/main/java/org/fdroid/fdroid/views/swap/SelectAppsView.java index 935e688a9..b625c7ceb 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/swap/SelectAppsView.java +++ b/app/src/main/java/org/fdroid/fdroid/views/swap/SelectAppsView.java @@ -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 { diff --git a/app/src/main/java/org/fdroid/fdroid/views/swap/SwapAppsView.java b/app/src/main/java/org/fdroid/fdroid/views/swap/SwapAppsView.java index 305035e4d..3165f7de9 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/swap/SwapAppsView.java +++ b/app/src/main/java/org/fdroid/fdroid/views/swap/SwapAppsView.java @@ -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 diff --git a/app/src/test/java/org/fdroid/fdroid/Assert.java b/app/src/test/java/org/fdroid/fdroid/Assert.java index 1296e0f9c..cb6354b1f 100644 --- a/app/src/test/java/org/fdroid/fdroid/Assert.java +++ b/app/src/test/java/org/fdroid/fdroid/Assert.java @@ -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); diff --git a/app/src/test/java/org/fdroid/fdroid/MultiRepoUpdaterTest.java b/app/src/test/java/org/fdroid/fdroid/MultiRepoUpdaterTest.java index 2da14d8eb..9aa0785e4 100644 --- a/app/src/test/java/org/fdroid/fdroid/MultiRepoUpdaterTest.java +++ b/app/src/test/java/org/fdroid/fdroid/MultiRepoUpdaterTest.java @@ -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 apks = ApkProvider.Helper.findByPackageName(context, packageName, ApkProvider.DataColumns.ALL); + List 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); diff --git a/app/src/test/java/org/fdroid/fdroid/ProperMultiRepoUpdaterTest.java b/app/src/test/java/org/fdroid/fdroid/ProperMultiRepoUpdaterTest.java index b0e992854..3d6e18abd 100644 --- a/app/src/test/java/org/fdroid/fdroid/ProperMultiRepoUpdaterTest.java +++ b/app/src/test/java/org/fdroid/fdroid/ProperMultiRepoUpdaterTest.java @@ -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 allRepos) { Repo repo = findRepo(REPO_MAIN, allRepos); - List apks = ApkProvider.Helper.findByRepo(context, repo, ApkProvider.DataColumns.ALL); + List 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 allRepos) { Repo repo = findRepo(REPO_ARCHIVE, allRepos); - List apks = ApkProvider.Helper.findByRepo(context, repo, ApkProvider.DataColumns.ALL); + List 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 allRepos) { Repo repo = findRepo(REPO_CONFLICTING, allRepos); - List apks = ApkProvider.Helper.findByRepo(context, repo, ApkProvider.DataColumns.ALL); + List 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}); diff --git a/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java b/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java index d6fcd1b03..089706aab 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java +++ b/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java @@ -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 all = ApkProvider.Helper.findByRepo(context, new MockRepo(10), ApkProvider.DataColumns.ALL); + List all = ApkProvider.Helper.findByRepo(context, new MockRepo(10), Cols.ALL); List actualIds = new ArrayList<>(); for (Apk apk : all) { actualIds.add(apk.packageName); @@ -105,7 +107,7 @@ public class ApkProviderTest extends FDroidProviderTest { assertTotalApkCount(2); - List allRemaining = ApkProvider.Helper.findByRepo(context, new MockRepo(10), ApkProvider.DataColumns.ALL); + List allRemaining = ApkProvider.Helper.findByRepo(context, new MockRepo(10), Cols.ALL); List 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 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); } diff --git a/app/src/test/java/org/fdroid/fdroid/data/AppProviderTest.java b/app/src/test/java/org/fdroid/fdroid/data/AppProviderTest.java index 9178eb2c3..546d17eb2 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/AppProviderTest.java +++ b/app/src/test/java/org/fdroid/fdroid/data/AppProviderTest.java @@ -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 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 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); diff --git a/app/src/test/java/org/fdroid/fdroid/data/InstalledAppProviderTest.java b/app/src/test/java/org/fdroid/fdroid/data/InstalledAppProviderTest.java index e207f1a16..592ad1a46 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/InstalledAppProviderTest.java +++ b/app/src/test/java/org/fdroid/fdroid/data/InstalledAppProviderTest.java @@ -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 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; } diff --git a/app/src/test/java/org/fdroid/fdroid/data/ProviderUriTests.java b/app/src/test/java/org/fdroid/fdroid/data/ProviderUriTests.java index 118adcf65..d8b8f0599 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/ProviderUriTests.java +++ b/app/src/test/java/org/fdroid/fdroid/data/ProviderUriTests.java @@ -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 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 manyApks = new ArrayList<>(ApkProvider.MAX_APKS_TO_QUERY - 5); for (int i = 0; i < ApkProvider.MAX_APKS_TO_QUERY - 1; i++) {