From 7c13cc26fc95b6908b0e6866318f0ea50e06e198 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Thu, 30 Jun 2016 12:58:19 +1000 Subject: [PATCH 1/9] Create `Schema` interface to make it simpler to replace string literals with constants. Right now, table names are in `DBHelper.TABLE_*` constants, and each tables fields are in `*Provider.DataColumns.*` constants. This brings them all into a predictable location. In addition, it makes it easier to statically import `Schema` so that instead of, e.g., * `AppProvider.DataColumns.PACKAGE_NAME` We can choose one of the following, based on our current context: * `Schema.AppTable.Cols.PACKAGE_NAME` * `AppTable.Cols.PACKAGE_NAME` * `Cols.PACKAGE_NAME` In the worst case, it isa couple of chars shorter than now. In the best case, if we are writing a class that primarily deals with Apps (e.g. App.java or AppProvider.java) then we get a big win with just `Cols.PACKAGE_NAME`. Having these things slightly shorter may seem like it is pointless, but the length of each constant probably contributed to my lack of willingness to use constants instead of string literals when constructing queries. In the future, this should be moved towards something more akin to: > http://openhms.sourceforge.net/sqlbuilder/ and I hope that extracting all the schema stuff into one interface may help that. --- .../java/org/fdroid/fdroid/data/Schema.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 app/src/main/java/org/fdroid/fdroid/data/Schema.java 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..0dd7f98b6 --- /dev/null +++ b/app/src/main/java/org/fdroid/fdroid/data/Schema.java @@ -0,0 +1,48 @@ +package org.fdroid.fdroid.data; + +/** + * 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. + */ +interface Schema { + + interface AppTable { + String NAME = DBHelper.TABLE_APP; + interface Cols extends AppProvider.DataColumns {} + } + + interface ApkTable { + String NAME = DBHelper.TABLE_APK; + interface Cols extends ApkProvider.DataColumns {} + } + + interface RepoTable { + String NAME = DBHelper.TABLE_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, + }; + } + } + +} From 315f20df0c6f8e93070d2751ba0f7365792ac92c Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Thu, 30 Jun 2016 13:14:01 +1000 Subject: [PATCH 2/9] Extracted AppProvider.DataColumns to Schema.AppTable.Cols --- .../java/org/fdroid/fdroid/AppDetails.java | 5 +- .../java/org/fdroid/fdroid/UpdateService.java | 5 +- .../main/java/org/fdroid/fdroid/data/App.java | 126 +++++++++--------- .../org/fdroid/fdroid/data/AppProvider.java | 94 +++---------- .../org/fdroid/fdroid/data/RepoPersister.java | 6 +- .../java/org/fdroid/fdroid/data/Schema.java | 60 ++++++++- .../views/fragments/AppListFragment.java | 34 ++--- .../fdroid/views/swap/SwapAppsView.java | 5 +- .../test/java/org/fdroid/fdroid/Assert.java | 18 +-- .../fdroid/fdroid/data/AppProviderTest.java | 37 ++--- .../fdroid/fdroid/data/ProviderUriTests.java | 2 +- 11 files changed, 200 insertions(+), 192 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/AppDetails.java b/app/src/main/java/org/fdroid/fdroid/AppDetails.java index ed5dea712..50b0d634a 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); 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/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..870090644 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,7 @@ 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.AppTable.Cols; import java.util.ArrayList; import java.util.Arrays; @@ -30,7 +31,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 +45,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 +91,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 +122,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, @@ -167,63 +168,6 @@ public class AppProvider extends FDroidProvider { } - 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 @@ -346,23 +290,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 +316,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); + Cols.SuggestedApk.VERSION_NAME); } private void addSuggestedApkField(String fieldName, String alias) { @@ -395,21 +339,21 @@ public class AppProvider extends FDroidProvider { private void addInstalledAppVersionName() { addInstalledAppField( InstalledAppProvider.DataColumns.VERSION_NAME, - DataColumns.InstalledApp.VERSION_NAME + Cols.InstalledApp.VERSION_NAME ); } private void addInstalledAppVersionCode() { addInstalledAppField( InstalledAppProvider.DataColumns.VERSION_CODE, - DataColumns.InstalledApp.VERSION_CODE + Cols.InstalledApp.VERSION_CODE ); } private void addInstalledSig() { addInstalledAppField( InstalledAppProvider.DataColumns.SIGNATURE, - DataColumns.InstalledApp.SIGNATURE + Cols.InstalledApp.SIGNATURE ); } @@ -602,7 +546,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 +765,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 +805,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 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..416cbc51d 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, }; /** @@ -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; } diff --git a/app/src/main/java/org/fdroid/fdroid/data/Schema.java b/app/src/main/java/org/fdroid/fdroid/data/Schema.java index 0dd7f98b6..97265d208 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Schema.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Schema.java @@ -5,11 +5,67 @@ package org.fdroid.fdroid.data; * Constants from this interface should be used in preference to string literals when referring to * the tables/columns in the database. */ -interface Schema { +public interface Schema { interface AppTable { + String NAME = DBHelper.TABLE_APP; - interface Cols extends AppProvider.DataColumns {} + + 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, + }; + } } interface ApkTable { 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/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..301e0affc 100644 --- a/app/src/test/java/org/fdroid/fdroid/Assert.java +++ b/app/src/test/java/org/fdroid/fdroid/Assert.java @@ -9,6 +9,8 @@ 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; +import org.fdroid.fdroid.data.Schema.AppTable; import org.robolectric.shadows.ShadowContentResolver; import java.util.ArrayList; @@ -178,16 +180,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); 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/ProviderUriTests.java b/app/src/test/java/org/fdroid/fdroid/data/ProviderUriTests.java index 118adcf65..7a1fb6f77 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/ProviderUriTests.java +++ b/app/src/test/java/org/fdroid/fdroid/data/ProviderUriTests.java @@ -79,7 +79,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); From 0ea5325b8125fccce645c3345c96c15c5b076b4a Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Thu, 30 Jun 2016 13:21:55 +1000 Subject: [PATCH 3/9] Extracted ApkProvider.DataColumns to Schema.ApkTable.Cols --- .../java/org/fdroid/fdroid/AppDetails.java | 2 +- .../main/java/org/fdroid/fdroid/data/Apk.java | 83 ++++++++++--------- .../org/fdroid/fdroid/data/ApkProvider.java | 74 +++++------------ .../org/fdroid/fdroid/data/AppProvider.java | 3 +- .../java/org/fdroid/fdroid/data/DBHelper.java | 9 +- .../org/fdroid/fdroid/data/RepoPersister.java | 6 +- .../org/fdroid/fdroid/data/RepoProvider.java | 2 +- .../java/org/fdroid/fdroid/data/Schema.java | 35 +++++++- .../views/InstallConfirmActivity.java | 3 +- .../test/java/org/fdroid/fdroid/Assert.java | 17 ++-- .../fdroid/fdroid/MultiRepoUpdaterTest.java | 2 +- .../fdroid/ProperMultiRepoUpdaterTest.java | 7 +- .../fdroid/fdroid/data/ApkProviderTest.java | 39 ++++----- .../fdroid/fdroid/data/ProviderUriTests.java | 4 +- 14 files changed, 146 insertions(+), 140 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/AppDetails.java b/app/src/main/java/org/fdroid/fdroid/AppDetails.java index 50b0d634a..8bc60b6dc 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppDetails.java +++ b/app/src/main/java/org/fdroid/fdroid/AppDetails.java @@ -1033,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/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..93165edcb 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,10 @@ 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.Cols; import java.util.ArrayList; import java.util.HashMap; @@ -85,7 +85,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 +103,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 +126,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 +176,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 +194,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 +213,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, RepoProvider.DataColumns.VERSION); + REPO_FIELDS.put(Cols.REPO_ADDRESS, RepoProvider.DataColumns.ADDRESS); MATCHER.addURI(getAuthority(), PATH_REPO + "/#", CODE_REPO); MATCHER.addURI(getAuthority(), PATH_APK + "/#/*", CODE_SINGLE); @@ -378,12 +344,12 @@ public class ApkProvider extends FDroidProvider { 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"); } @@ -400,7 +366,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 +383,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 +477,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 +539,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/AppProvider.java b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java index 870090644..eeb9c13d1 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,7 @@ 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.Cols; import java.util.ArrayList; @@ -321,7 +322,7 @@ public class AppProvider extends FDroidProvider { private void addSuggestedApkVersionField() { addSuggestedApkField( - ApkProvider.DataColumns.VERSION_NAME, + ApkTable.Cols.VERSION_NAME, Cols.SuggestedApk.VERSION_NAME); } 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..f0857d130 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,7 @@ import android.util.Log; import org.fdroid.fdroid.R; import org.fdroid.fdroid.Utils; +import org.fdroid.fdroid.data.Schema.ApkTable; import java.util.ArrayList; import java.util.List; @@ -505,8 +506,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(TABLE_APK, values, ApkTable.Cols.MAX_SDK_VERSION + " < 1", null); } /** @@ -578,10 +579,10 @@ class DBHelper extends SQLiteOpenHelper { if (oldVersion >= 57) { return; } - Utils.debugLog(TAG, "Adding " + ApkProvider.DataColumns.TARGET_SDK_VERSION + Utils.debugLog(TAG, "Adding " + ApkTable.Cols.TARGET_SDK_VERSION + " columns to " + TABLE_APK); db.execSQL("alter table " + TABLE_APK + " add column " - + ApkProvider.DataColumns.TARGET_SDK_VERSION + " integer"); + + ApkTable.Cols.TARGET_SDK_VERSION + " integer"); } private static boolean columnExists(SQLiteDatabase db, 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 416cbc51d..ff34ffe53 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/RepoPersister.java +++ b/app/src/main/java/org/fdroid/fdroid/data/RepoPersister.java @@ -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()); @@ -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..31036aaf9 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java @@ -194,7 +194,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; diff --git a/app/src/main/java/org/fdroid/fdroid/data/Schema.java b/app/src/main/java/org/fdroid/fdroid/data/Schema.java index 97265d208..3b5a663ad 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Schema.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Schema.java @@ -1,5 +1,7 @@ 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 @@ -70,7 +72,38 @@ public interface Schema { interface ApkTable { String NAME = DBHelper.TABLE_APK; - interface Cols extends ApkProvider.DataColumns {} + 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 { 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/test/java/org/fdroid/fdroid/Assert.java b/app/src/test/java/org/fdroid/fdroid/Assert.java index 301e0affc..520101ed8 100644 --- a/app/src/test/java/org/fdroid/fdroid/Assert.java +++ b/app/src/test/java/org/fdroid/fdroid/Assert.java @@ -10,6 +10,7 @@ import org.fdroid.fdroid.data.ApkProvider; import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.data.InstalledAppProvider; import org.fdroid.fdroid.data.Schema; +import org.fdroid.fdroid.data.Schema.ApkTable; import org.fdroid.fdroid.data.Schema.AppTable; import org.robolectric.shadows.ShadowContentResolver; @@ -206,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..8e1583b8c 100644 --- a/app/src/test/java/org/fdroid/fdroid/MultiRepoUpdaterTest.java +++ b/app/src/test/java/org/fdroid/fdroid/MultiRepoUpdaterTest.java @@ -91,7 +91,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); } 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..cf66909e1 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,7 @@ 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.mock.MockApk; import org.fdroid.fdroid.mock.MockApp; import org.fdroid.fdroid.mock.MockRepo; @@ -32,7 +33,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 +90,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 +106,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 +212,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,7 +227,7 @@ 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(); } @@ -268,15 +269,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 +341,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 +395,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 +456,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 +479,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 +538,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/ProviderUriTests.java b/app/src/test/java/org/fdroid/fdroid/data/ProviderUriTests.java index 7a1fb6f77..6aeb9e52d 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/ProviderUriTests.java +++ b/app/src/test/java/org/fdroid/fdroid/data/ProviderUriTests.java @@ -110,7 +110,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 +127,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++) { From 8a155aef89fa4a97c552a2e89314ac0ac8c1c29e Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Thu, 30 Jun 2016 13:28:55 +1000 Subject: [PATCH 4/9] Extracted RepoProvider.DataColumns to Schema.RepoTable.Cols --- .../java/org/fdroid/fdroid/RepoUpdater.java | 19 ++-- .../org/fdroid/fdroid/data/ApkProvider.java | 5 +- .../java/org/fdroid/fdroid/data/DBHelper.java | 29 +++--- .../java/org/fdroid/fdroid/data/Repo.java | 97 ++++++++++--------- .../org/fdroid/fdroid/data/RepoProvider.java | 93 +++++++----------- .../fdroid/fdroid/localrepo/SwapService.java | 13 +-- .../fdroid/fdroid/net/DownloaderFactory.java | 3 +- .../fdroid/views/ManageReposActivity.java | 25 ++--- .../fdroid/views/RepoDetailsActivity.java | 11 ++- .../test/java/org/fdroid/fdroid/Assert.java | 1 - .../fdroid/fdroid/MultiRepoUpdaterTest.java | 7 +- .../fdroid/fdroid/data/ApkProviderTest.java | 11 ++- .../fdroid/fdroid/data/ProviderUriTests.java | 2 +- 13 files changed, 150 insertions(+), 166 deletions(-) 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/data/ApkProvider.java b/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java index 93165edcb..5244a52ba 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java @@ -10,6 +10,7 @@ import android.util.Log; import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.data.Schema.ApkTable.Cols; +import org.fdroid.fdroid.data.Schema.RepoTable; import java.util.ArrayList; import java.util.HashMap; @@ -213,8 +214,8 @@ public class ApkProvider extends FDroidProvider { private static final Map REPO_FIELDS = new HashMap<>(); static { - REPO_FIELDS.put(Cols.REPO_VERSION, RepoProvider.DataColumns.VERSION); - REPO_FIELDS.put(Cols.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); 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 f0857d130..94d3bb887 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java @@ -10,6 +10,7 @@ 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.RepoTable; import java.util.ArrayList; import java.util.List; @@ -257,17 +258,17 @@ 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); @@ -518,10 +519,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); + if (!columnExists(db, TABLE_REPO, RepoTable.Cols.TIMESTAMP)) { + Utils.debugLog(TAG, "Adding " + RepoTable.Cols.TIMESTAMP + " column to " + TABLE_REPO); db.execSQL("alter table " + TABLE_REPO + " add column " - + RepoProvider.DataColumns.TIMESTAMP + " integer not null default 0"); + + RepoTable.Cols.TIMESTAMP + " integer not null default 0"); } } 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/RepoProvider.java b/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java index 31036aaf9..ef1667f78 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,11 @@ 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.Cols; import java.util.ArrayList; import java.util.List; @@ -28,12 +28,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 +45,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 +113,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 +129,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 +146,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); } @@ -209,31 +209,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"; @@ -294,11 +269,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 +289,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/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/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/test/java/org/fdroid/fdroid/Assert.java b/app/src/test/java/org/fdroid/fdroid/Assert.java index 520101ed8..23691c5b5 100644 --- a/app/src/test/java/org/fdroid/fdroid/Assert.java +++ b/app/src/test/java/org/fdroid/fdroid/Assert.java @@ -9,7 +9,6 @@ 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; import org.fdroid.fdroid.data.Schema.ApkTable; import org.fdroid.fdroid.data.Schema.AppTable; import org.robolectric.shadows.ShadowContentResolver; diff --git a/app/src/test/java/org/fdroid/fdroid/MultiRepoUpdaterTest.java b/app/src/test/java/org/fdroid/fdroid/MultiRepoUpdaterTest.java index 8e1583b8c..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; @@ -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/data/ApkProviderTest.java b/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java index cf66909e1..089706aab 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java +++ b/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java @@ -8,6 +8,7 @@ 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; @@ -234,27 +235,27 @@ public class ApkProviderTest extends FDroidProviderTest { @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) { 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 6aeb9e52d..3866fcf97 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/ProviderUriTests.java +++ b/app/src/test/java/org/fdroid/fdroid/data/ProviderUriTests.java @@ -63,7 +63,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); From d1c04de71a04eff0f16c0e89928b345cfe5e83ae Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Thu, 30 Jun 2016 13:42:38 +1000 Subject: [PATCH 5/9] Replaced DBHelper.TABLE_REPO with Schema.RepoTable.NAME --- .../org/fdroid/fdroid/data/ApkProvider.java | 2 +- .../org/fdroid/fdroid/data/AppProvider.java | 5 +- .../java/org/fdroid/fdroid/data/DBHelper.java | 86 +++++++++---------- .../org/fdroid/fdroid/data/RepoProvider.java | 3 +- .../java/org/fdroid/fdroid/data/Schema.java | 2 +- 5 files changed, 49 insertions(+), 49 deletions(-) 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 5244a52ba..3594c562f 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java @@ -359,7 +359,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); } 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 eeb9c13d1..4d51590e8 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java @@ -15,6 +15,7 @@ import org.fdroid.fdroid.R; import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.data.Schema.ApkTable; import org.fdroid.fdroid.data.Schema.AppTable.Cols; +import org.fdroid.fdroid.data.Schema.RepoTable; import java.util.ArrayList; import java.util.Arrays; @@ -241,7 +242,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 ) " + @@ -974,7 +975,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 94d3bb887..4e582190b 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java @@ -21,15 +21,13 @@ 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, " @@ -128,7 +126,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) { @@ -141,7 +139,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(); } } @@ -150,17 +148,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 @@ -169,7 +167,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, " @@ -188,7 +186,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 + ";"; @@ -271,7 +269,7 @@ class DBHelper extends SQLiteOpenHelper { 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 @@ -314,7 +312,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) { @@ -331,7 +329,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(); @@ -340,7 +338,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); } } @@ -350,7 +348,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), }); } @@ -360,16 +358,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); @@ -390,11 +388,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) { @@ -413,52 +411,52 @@ 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;"); } } @@ -519,9 +517,9 @@ class DBHelper extends SQLiteOpenHelper { if (oldVersion >= 55) { return; } - if (!columnExists(db, TABLE_REPO, RepoTable.Cols.TIMESTAMP)) { - Utils.debugLog(TAG, "Adding " + RepoTable.Cols.TIMESTAMP + " column to " + TABLE_REPO); - db.execSQL("alter table " + TABLE_REPO + " add column " + 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"); } } @@ -533,7 +531,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) { 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 ef1667f78..bc7d9c8fa 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java @@ -11,6 +11,7 @@ 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; @@ -242,7 +243,7 @@ public class RepoProvider extends FDroidProvider { @Override protected String getTableName() { - return DBHelper.TABLE_REPO; + return RepoTable.NAME; } @Override diff --git a/app/src/main/java/org/fdroid/fdroid/data/Schema.java b/app/src/main/java/org/fdroid/fdroid/data/Schema.java index 3b5a663ad..1938c98e4 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Schema.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Schema.java @@ -107,7 +107,7 @@ public interface Schema { } interface RepoTable { - String NAME = DBHelper.TABLE_REPO; + String NAME = "fdroid_repo"; interface Cols extends BaseColumns { String ADDRESS = "address"; From 14958d48e396a2c6f40931d31fc5a4e483c0592d Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Thu, 30 Jun 2016 13:46:41 +1000 Subject: [PATCH 6/9] Replaced DBHelper.TABLE_APK with Schema.ApkTable.NAME --- .../org/fdroid/fdroid/data/ApkProvider.java | 5 +++-- .../org/fdroid/fdroid/data/AppProvider.java | 4 ++-- .../java/org/fdroid/fdroid/data/DBHelper.java | 19 +++++++------------ .../java/org/fdroid/fdroid/data/Schema.java | 7 ++++++- .../fdroid/fdroid/data/TempApkProvider.java | 6 ++++-- .../fdroid/fdroid/data/TempAppProvider.java | 6 ++++-- 6 files changed, 26 insertions(+), 21 deletions(-) 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 3594c562f..66b9e6f1d 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java @@ -9,6 +9,7 @@ import android.net.Uri; 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; @@ -319,7 +320,7 @@ public class ApkProvider extends FDroidProvider { @Override protected String getTableName() { - return DBHelper.TABLE_APK; + return ApkTable.NAME; } @Override @@ -338,7 +339,7 @@ public class ApkProvider extends FDroidProvider { @Override protected String getRequiredTables() { - return DBHelper.TABLE_APK + " AS apk"; + return ApkTable.NAME + " AS apk"; } @Override 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 4d51590e8..3cc0dfe7e 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java @@ -165,7 +165,7 @@ 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, DBHelper.TABLE_APP, ApkTable.NAME); } } @@ -527,7 +527,7 @@ public class AppProvider extends FDroidProvider { } protected String getApkTableName() { - return DBHelper.TABLE_APK; + return ApkTable.NAME; } @Override 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 4e582190b..ad227d758 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java @@ -21,11 +21,6 @@ class DBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "fdroid"; - // 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 " + RepoTable.NAME + " (_id integer primary key, " + "address text not null, " @@ -40,7 +35,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, " @@ -506,7 +501,7 @@ class DBHelper extends SQLiteOpenHelper { Utils.debugLog(TAG, "Converting maxSdkVersion value 0 to " + Byte.MAX_VALUE); ContentValues values = new ContentValues(); values.put(ApkTable.Cols.MAX_SDK_VERSION, Byte.MAX_VALUE); - db.update(TABLE_APK, values, ApkTable.Cols.MAX_SDK_VERSION + " < 1", null); + db.update(ApkTable.NAME, values, ApkTable.Cols.MAX_SDK_VERSION + " < 1", null); } /** @@ -546,7 +541,7 @@ 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 " + ApkTable.NAME); clearRepoEtags(db); createAppApk(db); } @@ -555,8 +550,8 @@ class DBHelper extends SQLiteOpenHelper { db.execSQL(CREATE_TABLE_APP); db.execSQL("create index app_id on " + TABLE_APP + " (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);"); } /** @@ -579,8 +574,8 @@ class DBHelper extends SQLiteOpenHelper { return; } Utils.debugLog(TAG, "Adding " + ApkTable.Cols.TARGET_SDK_VERSION - + " columns to " + TABLE_APK); - db.execSQL("alter table " + TABLE_APK + " add column " + + " columns to " + ApkTable.NAME); + db.execSQL("alter table " + ApkTable.NAME + " add column " + ApkTable.Cols.TARGET_SDK_VERSION + " integer"); } diff --git a/app/src/main/java/org/fdroid/fdroid/data/Schema.java b/app/src/main/java/org/fdroid/fdroid/data/Schema.java index 1938c98e4..e516761bb 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Schema.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Schema.java @@ -70,8 +70,13 @@ public interface Schema { } } + /** + * 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 = DBHelper.TABLE_APK; + String NAME = "fdroid_apk"; interface Cols extends BaseColumns { String _COUNT_DISTINCT_ID = "countDistinct"; 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..ee25cbebf 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,8 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.net.Uri; +import org.fdroid.fdroid.data.Schema.ApkTable; + /** * This class does all of its operations in a temporary sqlite table. */ @@ -144,8 +146,8 @@ public class TempAppProvider extends AppProvider { db.execSQL("DELETE FROM " + DBHelper.TABLE_APP + " WHERE 1"); db.execSQL("INSERT INTO " + DBHelper.TABLE_APP + " 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(); From d1ceb84af41be4c2303cd15d2d8d1758652e7f3a Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Thu, 30 Jun 2016 13:52:22 +1000 Subject: [PATCH 7/9] Replaced DBHelper.TABLE_APP with Schema.AppTable.NAME --- .../org/fdroid/fdroid/data/AppProvider.java | 5 +-- .../java/org/fdroid/fdroid/data/DBHelper.java | 32 +++++++++---------- .../java/org/fdroid/fdroid/data/Schema.java | 6 +++- .../fdroid/fdroid/data/TempAppProvider.java | 9 +++--- 4 files changed, 29 insertions(+), 23 deletions(-) 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 3cc0dfe7e..397b423bb 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java @@ -14,6 +14,7 @@ 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.RepoTable; @@ -165,7 +166,7 @@ public class AppProvider extends FDroidProvider { static final class UpgradeHelper { public static void updateIconUrls(Context context, SQLiteDatabase db) { - AppProvider.updateIconUrls(context, db, DBHelper.TABLE_APP, ApkTable.NAME); + AppProvider.updateIconUrls(context, db, AppTable.NAME, ApkTable.NAME); } } @@ -523,7 +524,7 @@ public class AppProvider extends FDroidProvider { @Override protected String getTableName() { - return DBHelper.TABLE_APP; + return AppTable.NAME; } protected String getApkTableName() { 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 ad227d758..aaf307191 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java @@ -10,6 +10,7 @@ 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.RepoTable; import java.util.ArrayList; @@ -58,8 +59,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, " @@ -456,19 +456,19 @@ class DBHelper extends SQLiteOpenHelper { } 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) { @@ -484,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"); } } @@ -540,7 +540,7 @@ 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 " + AppTable.NAME); db.execSQL("drop table " + ApkTable.NAME); clearRepoEtags(db); createAppApk(db); @@ -548,7 +548,7 @@ class DBHelper extends SQLiteOpenHelper { 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 " + ApkTable.NAME + " (vercode);"); db.execSQL("create index apk_id on " + ApkTable.NAME + " (id);"); diff --git a/app/src/main/java/org/fdroid/fdroid/data/Schema.java b/app/src/main/java/org/fdroid/fdroid/data/Schema.java index e516761bb..c4a896d03 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Schema.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Schema.java @@ -11,7 +11,7 @@ public interface Schema { interface AppTable { - String NAME = DBHelper.TABLE_APP; + String NAME = "fdroid_app"; interface Cols { String _ID = "rowid as _id"; // Required for CursorLoaders @@ -76,7 +76,9 @@ public interface Schema { * This information is retrieved from the repositories. */ interface ApkTable { + String NAME = "fdroid_apk"; + interface Cols extends BaseColumns { String _COUNT_DISTINCT_ID = "countDistinct"; @@ -112,7 +114,9 @@ public interface Schema { } interface RepoTable { + String NAME = "fdroid_repo"; + interface Cols extends BaseColumns { String ADDRESS = "address"; 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 ee25cbebf..bd0a20ddc 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/TempAppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/TempAppProvider.java @@ -8,6 +8,7 @@ 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. @@ -21,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"; @@ -129,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);"); @@ -143,8 +144,8 @@ 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 " + ApkTable.NAME + " WHERE 1"); db.execSQL("INSERT INTO " + ApkTable.NAME + " SELECT * FROM " + tempApk); From 6fb23d2efaebdf81dd1629fc7f68f471c91526eb Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Thu, 30 Jun 2016 17:06:40 +1000 Subject: [PATCH 8/9] Extracted InstalledAppProvider.DataColumns to Schema.InstalledAppTable.Cols --- .../org/fdroid/fdroid/data/AppProvider.java | 11 ++-- .../java/org/fdroid/fdroid/data/DBHelper.java | 17 +++--- .../fdroid/data/InstalledAppProvider.java | 34 +++-------- .../data/InstalledAppProviderService.java | 17 +++--- .../java/org/fdroid/fdroid/data/Schema.java | 22 +++++++ .../fdroid/views/swap/SelectAppsView.java | 15 ++--- .../test/java/org/fdroid/fdroid/Assert.java | 15 ++--- .../fdroid/data/InstalledAppProviderTest.java | 61 ++++++++++--------- .../fdroid/fdroid/data/ProviderUriTests.java | 3 +- 9 files changed, 103 insertions(+), 92 deletions(-) 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 397b423bb..03be2c19b 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java @@ -16,6 +16,7 @@ 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; @@ -275,7 +276,7 @@ public class AppProvider extends FDroidProvider { join( DBHelper.TABLE_INSTALLED_APP, "installed", - "installed." + InstalledAppProvider.DataColumns.PACKAGE_NAME + " = " + getTableName() + ".id"); + "installed." + InstalledAppTable.Cols.PACKAGE_NAME + " = " + getTableName() + ".id"); requiresInstalledTable = true; } } @@ -285,7 +286,7 @@ public class AppProvider extends FDroidProvider { leftJoin( DBHelper.TABLE_INSTALLED_APP, "installed", - "installed." + InstalledAppProvider.DataColumns.PACKAGE_NAME + " = " + getTableName() + ".id"); + "installed." + InstalledAppTable.Cols.PACKAGE_NAME + " = " + getTableName() + ".id"); requiresInstalledTable = true; } } @@ -341,21 +342,21 @@ public class AppProvider extends FDroidProvider { private void addInstalledAppVersionName() { addInstalledAppField( - InstalledAppProvider.DataColumns.VERSION_NAME, + InstalledAppTable.Cols.VERSION_NAME, Cols.InstalledApp.VERSION_NAME ); } private void addInstalledAppVersionCode() { addInstalledAppField( - InstalledAppProvider.DataColumns.VERSION_CODE, + InstalledAppTable.Cols.VERSION_CODE, Cols.InstalledApp.VERSION_CODE ); } private void addInstalledSig() { addInstalledAppField( - InstalledAppProvider.DataColumns.SIGNATURE, + InstalledAppTable.Cols.SIGNATURE, Cols.InstalledApp.SIGNATURE ); } 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 aaf307191..34a79d938 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java @@ -11,6 +11,7 @@ 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; @@ -95,14 +96,14 @@ class DBHelper extends SQLiteOpenHelper { public static final String TABLE_INSTALLED_APP = "fdroid_installedApp"; private static final String CREATE_TABLE_INSTALLED_APP = "CREATE TABLE " + TABLE_INSTALLED_APP + " ( " - + 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 + ";"; 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..c9d93b696 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,7 @@ import android.util.Log; import org.fdroid.fdroid.R; import org.fdroid.fdroid.Utils; +import org.fdroid.fdroid.data.Schema.InstalledAppTable.Cols; import java.util.HashMap; import java.util.Map; @@ -32,15 +33,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 +54,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"; @@ -146,7 +128,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 +177,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 +197,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/Schema.java b/app/src/main/java/org/fdroid/fdroid/data/Schema.java index c4a896d03..f2c2bf3fb 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Schema.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Schema.java @@ -143,4 +143,26 @@ public interface Schema { } } + interface InstalledAppTable { + + String NAME = DBHelper.TABLE_INSTALLED_APP; + + 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/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/test/java/org/fdroid/fdroid/Assert.java b/app/src/test/java/org/fdroid/fdroid/Assert.java index 23691c5b5..cb6354b1f 100644 --- a/app/src/test/java/org/fdroid/fdroid/Assert.java +++ b/app/src/test/java/org/fdroid/fdroid/Assert.java @@ -11,6 +11,7 @@ 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; @@ -154,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); @@ -167,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(); } 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 3866fcf97..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); From 668cc27d29555a005561847d486ddf607c847aff Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Thu, 30 Jun 2016 17:09:01 +1000 Subject: [PATCH 9/9] Replaced DBHelper.TABLE_INSTALLED_APP with Schema.InstalledAppTable.NAME --- app/src/main/java/org/fdroid/fdroid/data/AppProvider.java | 4 ++-- app/src/main/java/org/fdroid/fdroid/data/DBHelper.java | 5 ++--- .../java/org/fdroid/fdroid/data/InstalledAppProvider.java | 3 ++- app/src/main/java/org/fdroid/fdroid/data/Schema.java | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) 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 03be2c19b..f1d5e0b8d 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java @@ -274,7 +274,7 @@ public class AppProvider extends FDroidProvider { public void naturalJoinToInstalledTable() { if (!requiresInstalledTable) { join( - DBHelper.TABLE_INSTALLED_APP, + InstalledAppTable.NAME, "installed", "installed." + InstalledAppTable.Cols.PACKAGE_NAME + " = " + getTableName() + ".id"); requiresInstalledTable = true; @@ -284,7 +284,7 @@ public class AppProvider extends FDroidProvider { public void leftJoinToInstalledTable() { if (!requiresInstalledTable) { leftJoin( - DBHelper.TABLE_INSTALLED_APP, + InstalledAppTable.NAME, "installed", "installed." + InstalledAppTable.Cols.PACKAGE_NAME + " = " + getTableName() + ".id"); requiresInstalledTable = true; 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 34a79d938..294dee31c 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java @@ -93,8 +93,7 @@ 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 + " ( " + InstalledAppTable.Cols.PACKAGE_NAME + " TEXT NOT NULL PRIMARY KEY, " + InstalledAppTable.Cols.VERSION_CODE + " INT NOT NULL, " @@ -105,7 +104,7 @@ class DBHelper extends SQLiteOpenHelper { + 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; 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 c9d93b696..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,7 @@ 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; @@ -99,7 +100,7 @@ public class InstalledAppProvider extends FDroidProvider { @Override protected String getTableName() { - return DBHelper.TABLE_INSTALLED_APP; + return InstalledAppTable.NAME; } @Override diff --git a/app/src/main/java/org/fdroid/fdroid/data/Schema.java b/app/src/main/java/org/fdroid/fdroid/data/Schema.java index f2c2bf3fb..2a8cbbc91 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Schema.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Schema.java @@ -145,7 +145,7 @@ public interface Schema { interface InstalledAppTable { - String NAME = DBHelper.TABLE_INSTALLED_APP; + String NAME = "fdroid_installedApp"; interface Cols { String _ID = "rowid as _id"; // Required for CursorLoaders