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