Extracted AppProvider.DataColumns to Schema.AppTable.Cols

This commit is contained in:
Peter Serwylo 2016-06-30 13:14:01 +10:00
parent 7c13cc26fc
commit 315f20df0c
11 changed files with 200 additions and 192 deletions

View File

@ -84,6 +84,7 @@ import org.fdroid.fdroid.data.App;
import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.data.AppProvider;
import org.fdroid.fdroid.data.InstalledAppProvider; import org.fdroid.fdroid.data.InstalledAppProvider;
import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.data.RepoProvider;
import org.fdroid.fdroid.data.Schema;
import org.fdroid.fdroid.installer.InstallManagerService; import org.fdroid.fdroid.installer.InstallManagerService;
import org.fdroid.fdroid.installer.Installer; import org.fdroid.fdroid.installer.Installer;
import org.fdroid.fdroid.installer.InstallerFactory; import org.fdroid.fdroid.installer.InstallerFactory;
@ -667,8 +668,8 @@ public class AppDetails extends AppCompatActivity {
Uri uri = AppProvider.getContentUri(packageName); Uri uri = AppProvider.getContentUri(packageName);
ContentValues values = new ContentValues(2); ContentValues values = new ContentValues(2);
values.put(AppProvider.DataColumns.IGNORE_ALLUPDATES, ignoreAll ? 1 : 0); values.put(Schema.AppTable.Cols.IGNORE_ALLUPDATES, ignoreAll ? 1 : 0);
values.put(AppProvider.DataColumns.IGNORE_THISUPDATE, ignoreVersionCode); values.put(Schema.AppTable.Cols.IGNORE_THISUPDATE, ignoreVersionCode);
getContentResolver().update(uri, values, null, null); getContentResolver().update(uri, values, null, null);

View File

@ -47,6 +47,7 @@ import org.fdroid.fdroid.data.App;
import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.data.AppProvider;
import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.Repo;
import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.data.RepoProvider;
import org.fdroid.fdroid.data.Schema;
import org.fdroid.fdroid.installer.InstallManagerService; import org.fdroid.fdroid.installer.InstallManagerService;
import java.net.URL; import java.net.URL;
@ -415,7 +416,7 @@ public class UpdateService extends IntentService {
private void performUpdateNotification() { private void performUpdateNotification() {
Cursor cursor = getContentResolver().query( Cursor cursor = getContentResolver().query(
AppProvider.getCanUpdateUri(), AppProvider.getCanUpdateUri(),
AppProvider.DataColumns.ALL, Schema.AppTable.Cols.ALL,
null, null, null); null, null, null);
if (cursor != null) { if (cursor != null) {
if (cursor.getCount() > 0) { if (cursor.getCount() > 0) {
@ -461,7 +462,7 @@ public class UpdateService extends IntentService {
private void autoDownloadUpdates() { private void autoDownloadUpdates() {
Cursor cursor = getContentResolver().query( Cursor cursor = getContentResolver().query(
AppProvider.getCanUpdateUri(), AppProvider.getCanUpdateUri(),
AppProvider.DataColumns.ALL, Schema.AppTable.Cols.ALL,
null, null, null); null, null, null);
if (cursor != null) { if (cursor != null) {
cursor.moveToFirst(); cursor.moveToFirst();

View File

@ -32,6 +32,8 @@ import java.util.jar.JarFile;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.fdroid.fdroid.data.Schema.AppTable.Cols;
public class App extends ValueObject implements Comparable<App> { public class App extends ValueObject implements Comparable<App> {
private static final String TAG = "App"; private static final String TAG = "App";
@ -151,103 +153,103 @@ public class App extends ValueObject implements Comparable<App> {
for (int i = 0; i < cursor.getColumnCount(); i++) { for (int i = 0; i < cursor.getColumnCount(); i++) {
String n = cursor.getColumnName(i); String n = cursor.getColumnName(i);
switch (n) { switch (n) {
case AppProvider.DataColumns.IS_COMPATIBLE: case Cols.IS_COMPATIBLE:
compatible = cursor.getInt(i) == 1; compatible = cursor.getInt(i) == 1;
break; break;
case AppProvider.DataColumns.PACKAGE_NAME: case Cols.PACKAGE_NAME:
packageName = cursor.getString(i); packageName = cursor.getString(i);
break; break;
case AppProvider.DataColumns.NAME: case Cols.NAME:
name = cursor.getString(i); name = cursor.getString(i);
break; break;
case AppProvider.DataColumns.SUMMARY: case Cols.SUMMARY:
summary = cursor.getString(i); summary = cursor.getString(i);
break; break;
case AppProvider.DataColumns.ICON: case Cols.ICON:
icon = cursor.getString(i); icon = cursor.getString(i);
break; break;
case AppProvider.DataColumns.DESCRIPTION: case Cols.DESCRIPTION:
description = cursor.getString(i); description = cursor.getString(i);
break; break;
case AppProvider.DataColumns.LICENSE: case Cols.LICENSE:
license = cursor.getString(i); license = cursor.getString(i);
break; break;
case AppProvider.DataColumns.AUTHOR: case Cols.AUTHOR:
author = cursor.getString(i); author = cursor.getString(i);
break; break;
case AppProvider.DataColumns.EMAIL: case Cols.EMAIL:
email = cursor.getString(i); email = cursor.getString(i);
break; break;
case AppProvider.DataColumns.WEB_URL: case Cols.WEB_URL:
webURL = cursor.getString(i); webURL = cursor.getString(i);
break; break;
case AppProvider.DataColumns.TRACKER_URL: case Cols.TRACKER_URL:
trackerURL = cursor.getString(i); trackerURL = cursor.getString(i);
break; break;
case AppProvider.DataColumns.SOURCE_URL: case Cols.SOURCE_URL:
sourceURL = cursor.getString(i); sourceURL = cursor.getString(i);
break; break;
case AppProvider.DataColumns.CHANGELOG_URL: case Cols.CHANGELOG_URL:
changelogURL = cursor.getString(i); changelogURL = cursor.getString(i);
break; break;
case AppProvider.DataColumns.DONATE_URL: case Cols.DONATE_URL:
donateURL = cursor.getString(i); donateURL = cursor.getString(i);
break; break;
case AppProvider.DataColumns.BITCOIN_ADDR: case Cols.BITCOIN_ADDR:
bitcoinAddr = cursor.getString(i); bitcoinAddr = cursor.getString(i);
break; break;
case AppProvider.DataColumns.LITECOIN_ADDR: case Cols.LITECOIN_ADDR:
litecoinAddr = cursor.getString(i); litecoinAddr = cursor.getString(i);
break; break;
case AppProvider.DataColumns.FLATTR_ID: case Cols.FLATTR_ID:
flattrID = cursor.getString(i); flattrID = cursor.getString(i);
break; break;
case AppProvider.DataColumns.SuggestedApk.VERSION_NAME: case Cols.SuggestedApk.VERSION_NAME:
suggestedVersionName = cursor.getString(i); suggestedVersionName = cursor.getString(i);
break; break;
case AppProvider.DataColumns.SUGGESTED_VERSION_CODE: case Cols.SUGGESTED_VERSION_CODE:
suggestedVersionCode = cursor.getInt(i); suggestedVersionCode = cursor.getInt(i);
break; break;
case AppProvider.DataColumns.UPSTREAM_VERSION_CODE: case Cols.UPSTREAM_VERSION_CODE:
upstreamVersionCode = cursor.getInt(i); upstreamVersionCode = cursor.getInt(i);
break; break;
case AppProvider.DataColumns.UPSTREAM_VERSION_NAME: case Cols.UPSTREAM_VERSION_NAME:
upstreamVersionName = cursor.getString(i); upstreamVersionName = cursor.getString(i);
break; break;
case AppProvider.DataColumns.ADDED: case Cols.ADDED:
added = Utils.parseDate(cursor.getString(i), null); added = Utils.parseDate(cursor.getString(i), null);
break; break;
case AppProvider.DataColumns.LAST_UPDATED: case Cols.LAST_UPDATED:
lastUpdated = Utils.parseDate(cursor.getString(i), null); lastUpdated = Utils.parseDate(cursor.getString(i), null);
break; break;
case AppProvider.DataColumns.CATEGORIES: case Cols.CATEGORIES:
categories = Utils.parseCommaSeparatedString(cursor.getString(i)); categories = Utils.parseCommaSeparatedString(cursor.getString(i));
break; break;
case AppProvider.DataColumns.ANTI_FEATURES: case Cols.ANTI_FEATURES:
antiFeatures = Utils.parseCommaSeparatedString(cursor.getString(i)); antiFeatures = Utils.parseCommaSeparatedString(cursor.getString(i));
break; break;
case AppProvider.DataColumns.REQUIREMENTS: case Cols.REQUIREMENTS:
requirements = Utils.parseCommaSeparatedString(cursor.getString(i)); requirements = Utils.parseCommaSeparatedString(cursor.getString(i));
break; break;
case AppProvider.DataColumns.IGNORE_ALLUPDATES: case Cols.IGNORE_ALLUPDATES:
ignoreAllUpdates = cursor.getInt(i) == 1; ignoreAllUpdates = cursor.getInt(i) == 1;
break; break;
case AppProvider.DataColumns.IGNORE_THISUPDATE: case Cols.IGNORE_THISUPDATE:
ignoreThisUpdate = cursor.getInt(i); ignoreThisUpdate = cursor.getInt(i);
break; break;
case AppProvider.DataColumns.ICON_URL: case Cols.ICON_URL:
iconUrl = cursor.getString(i); iconUrl = cursor.getString(i);
break; break;
case AppProvider.DataColumns.ICON_URL_LARGE: case Cols.ICON_URL_LARGE:
iconUrlLarge = cursor.getString(i); iconUrlLarge = cursor.getString(i);
break; break;
case AppProvider.DataColumns.InstalledApp.VERSION_CODE: case Cols.InstalledApp.VERSION_CODE:
installedVersionCode = cursor.getInt(i); installedVersionCode = cursor.getInt(i);
break; break;
case AppProvider.DataColumns.InstalledApp.VERSION_NAME: case Cols.InstalledApp.VERSION_NAME:
installedVersionName = cursor.getString(i); installedVersionName = cursor.getString(i);
break; break;
case AppProvider.DataColumns.InstalledApp.SIGNATURE: case Cols.InstalledApp.SIGNATURE:
installedSig = cursor.getString(i); installedSig = cursor.getString(i);
break; break;
case "_id": case "_id":
@ -438,35 +440,35 @@ public class App extends ValueObject implements Comparable<App> {
public ContentValues toContentValues() { public ContentValues toContentValues() {
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();
values.put(AppProvider.DataColumns.PACKAGE_NAME, packageName); values.put(Cols.PACKAGE_NAME, packageName);
values.put(AppProvider.DataColumns.NAME, name); values.put(Cols.NAME, name);
values.put(AppProvider.DataColumns.SUMMARY, summary); values.put(Cols.SUMMARY, summary);
values.put(AppProvider.DataColumns.ICON, icon); values.put(Cols.ICON, icon);
values.put(AppProvider.DataColumns.ICON_URL, iconUrl); values.put(Cols.ICON_URL, iconUrl);
values.put(AppProvider.DataColumns.ICON_URL_LARGE, iconUrlLarge); values.put(Cols.ICON_URL_LARGE, iconUrlLarge);
values.put(AppProvider.DataColumns.DESCRIPTION, description); values.put(Cols.DESCRIPTION, description);
values.put(AppProvider.DataColumns.LICENSE, license); values.put(Cols.LICENSE, license);
values.put(AppProvider.DataColumns.AUTHOR, author); values.put(Cols.AUTHOR, author);
values.put(AppProvider.DataColumns.EMAIL, email); values.put(Cols.EMAIL, email);
values.put(AppProvider.DataColumns.WEB_URL, webURL); values.put(Cols.WEB_URL, webURL);
values.put(AppProvider.DataColumns.TRACKER_URL, trackerURL); values.put(Cols.TRACKER_URL, trackerURL);
values.put(AppProvider.DataColumns.SOURCE_URL, sourceURL); values.put(Cols.SOURCE_URL, sourceURL);
values.put(AppProvider.DataColumns.CHANGELOG_URL, changelogURL); values.put(Cols.CHANGELOG_URL, changelogURL);
values.put(AppProvider.DataColumns.DONATE_URL, donateURL); values.put(Cols.DONATE_URL, donateURL);
values.put(AppProvider.DataColumns.BITCOIN_ADDR, bitcoinAddr); values.put(Cols.BITCOIN_ADDR, bitcoinAddr);
values.put(AppProvider.DataColumns.LITECOIN_ADDR, litecoinAddr); values.put(Cols.LITECOIN_ADDR, litecoinAddr);
values.put(AppProvider.DataColumns.FLATTR_ID, flattrID); values.put(Cols.FLATTR_ID, flattrID);
values.put(AppProvider.DataColumns.ADDED, Utils.formatDate(added, "")); values.put(Cols.ADDED, Utils.formatDate(added, ""));
values.put(AppProvider.DataColumns.LAST_UPDATED, Utils.formatDate(lastUpdated, "")); values.put(Cols.LAST_UPDATED, Utils.formatDate(lastUpdated, ""));
values.put(AppProvider.DataColumns.SUGGESTED_VERSION_CODE, suggestedVersionCode); values.put(Cols.SUGGESTED_VERSION_CODE, suggestedVersionCode);
values.put(AppProvider.DataColumns.UPSTREAM_VERSION_NAME, upstreamVersionName); values.put(Cols.UPSTREAM_VERSION_NAME, upstreamVersionName);
values.put(AppProvider.DataColumns.UPSTREAM_VERSION_CODE, upstreamVersionCode); values.put(Cols.UPSTREAM_VERSION_CODE, upstreamVersionCode);
values.put(AppProvider.DataColumns.CATEGORIES, Utils.serializeCommaSeparatedString(categories)); values.put(Cols.CATEGORIES, Utils.serializeCommaSeparatedString(categories));
values.put(AppProvider.DataColumns.ANTI_FEATURES, Utils.serializeCommaSeparatedString(antiFeatures)); values.put(Cols.ANTI_FEATURES, Utils.serializeCommaSeparatedString(antiFeatures));
values.put(AppProvider.DataColumns.REQUIREMENTS, Utils.serializeCommaSeparatedString(requirements)); values.put(Cols.REQUIREMENTS, Utils.serializeCommaSeparatedString(requirements));
values.put(AppProvider.DataColumns.IS_COMPATIBLE, compatible ? 1 : 0); values.put(Cols.IS_COMPATIBLE, compatible ? 1 : 0);
values.put(AppProvider.DataColumns.IGNORE_ALLUPDATES, ignoreAllUpdates ? 1 : 0); values.put(Cols.IGNORE_ALLUPDATES, ignoreAllUpdates ? 1 : 0);
values.put(AppProvider.DataColumns.IGNORE_THISUPDATE, ignoreThisUpdate); values.put(Cols.IGNORE_THISUPDATE, ignoreThisUpdate);
return values; return values;
} }

View File

@ -13,6 +13,7 @@ import android.util.Log;
import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.Schema.AppTable.Cols;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -30,7 +31,7 @@ public class AppProvider extends FDroidProvider {
private Helper() { } private Helper() { }
public static int count(Context context, Uri uri) { 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); Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
int count = 0; int count = 0;
if (cursor != null) { if (cursor != null) {
@ -44,7 +45,7 @@ public class AppProvider extends FDroidProvider {
} }
public static List<App> all(ContentResolver resolver) { public static List<App> all(ContentResolver resolver) {
return all(resolver, DataColumns.ALL); return all(resolver, Cols.ALL);
} }
public static List<App> all(ContentResolver resolver, String[] projection) { public static List<App> all(ContentResolver resolver, String[] projection) {
@ -90,7 +91,7 @@ public class AppProvider extends FDroidProvider {
public static List<String> categories(Context context) { public static List<String> categories(Context context) {
final ContentResolver resolver = context.getContentResolver(); final ContentResolver resolver = context.getContentResolver();
final Uri uri = getContentUri(); 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 Cursor cursor = resolver.query(uri, projection, null, null, null);
final Set<String> categorySet = new HashSet<>(); final Set<String> categorySet = new HashSet<>();
if (cursor != null) { if (cursor != null) {
@ -121,7 +122,7 @@ public class AppProvider extends FDroidProvider {
} }
public static App findByPackageName(ContentResolver resolver, String packageName) { 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, 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 * A QuerySelection which is aware of the option/need to join onto the
* installed apps table. Not that the base classes * installed apps table. Not that the base classes
@ -346,23 +290,23 @@ public class AppProvider extends FDroidProvider {
@Override @Override
public void addField(String field) { public void addField(String field) {
switch (field) { switch (field) {
case DataColumns.SuggestedApk.VERSION_NAME: case Cols.SuggestedApk.VERSION_NAME:
addSuggestedApkVersionField(); addSuggestedApkVersionField();
break; break;
case DataColumns.InstalledApp.VERSION_NAME: case Cols.InstalledApp.VERSION_NAME:
addInstalledAppVersionName(); addInstalledAppVersionName();
break; break;
case DataColumns.InstalledApp.VERSION_CODE: case Cols.InstalledApp.VERSION_CODE:
addInstalledAppVersionCode(); addInstalledAppVersionCode();
break; break;
case DataColumns.InstalledApp.SIGNATURE: case Cols.InstalledApp.SIGNATURE:
addInstalledSig(); addInstalledSig();
break; break;
case DataColumns._COUNT: case Cols._COUNT:
appendCountField(); appendCountField();
break; break;
default: default:
if (field.equals(DataColumns.CATEGORIES)) { if (field.equals(Cols.CATEGORIES)) {
categoryFieldAdded = true; categoryFieldAdded = true;
} }
appendField(field, getTableName()); appendField(field, getTableName());
@ -372,13 +316,13 @@ public class AppProvider extends FDroidProvider {
private void appendCountField() { private void appendCountField() {
countFieldAppended = true; countFieldAppended = true;
appendField("COUNT( DISTINCT " + getTableName() + ".id ) AS " + DataColumns._COUNT); appendField("COUNT( DISTINCT " + getTableName() + ".id ) AS " + Cols._COUNT);
} }
private void addSuggestedApkVersionField() { private void addSuggestedApkVersionField() {
addSuggestedApkField( addSuggestedApkField(
ApkProvider.DataColumns.VERSION_NAME, ApkProvider.DataColumns.VERSION_NAME,
DataColumns.SuggestedApk.VERSION_NAME); Cols.SuggestedApk.VERSION_NAME);
} }
private void addSuggestedApkField(String fieldName, String alias) { private void addSuggestedApkField(String fieldName, String alias) {
@ -395,21 +339,21 @@ public class AppProvider extends FDroidProvider {
private void addInstalledAppVersionName() { private void addInstalledAppVersionName() {
addInstalledAppField( addInstalledAppField(
InstalledAppProvider.DataColumns.VERSION_NAME, InstalledAppProvider.DataColumns.VERSION_NAME,
DataColumns.InstalledApp.VERSION_NAME Cols.InstalledApp.VERSION_NAME
); );
} }
private void addInstalledAppVersionCode() { private void addInstalledAppVersionCode() {
addInstalledAppField( addInstalledAppField(
InstalledAppProvider.DataColumns.VERSION_CODE, InstalledAppProvider.DataColumns.VERSION_CODE,
DataColumns.InstalledApp.VERSION_CODE Cols.InstalledApp.VERSION_CODE
); );
} }
private void addInstalledSig() { private void addInstalledSig() {
addInstalledAppField( addInstalledAppField(
InstalledAppProvider.DataColumns.SIGNATURE, 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 ignoreCurrent = getTableName() + ".ignoreThisUpdate != " + getTableName() + ".suggestedVercode ";
final String ignoreAll = getTableName() + ".ignoreAllUpdates != 1 "; final String ignoreAll = getTableName() + ".ignoreAllUpdates != 1 ";
final String ignore = " ( " + ignoreCurrent + " AND " + ignoreAll + " ) "; 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(); return new AppQuerySelection(where).requireNaturalInstalledTable();
} }
@ -821,7 +765,7 @@ public class AppProvider extends FDroidProvider {
selection = selection.add(queryExcludeSwap()); selection = selection.add(queryExcludeSwap());
} }
if (AppProvider.DataColumns.NAME.equals(sortOrder)) { if (Cols.NAME.equals(sortOrder)) {
sortOrder = getTableName() + "." + sortOrder + " COLLATE LOCALIZED "; sortOrder = getTableName() + "." + sortOrder + " COLLATE LOCALIZED ";
} }
@ -861,7 +805,7 @@ public class AppProvider extends FDroidProvider {
if (!isApplyingBatch()) { if (!isApplyingBatch()) {
getContext().getContentResolver().notifyChange(uri, null); getContext().getContentResolver().notifyChange(uri, null);
} }
return getContentUri(values.getAsString(DataColumns.PACKAGE_NAME)); return getContentUri(values.getAsString(Cols.PACKAGE_NAME));
} }
@Override @Override

View File

@ -32,8 +32,8 @@ public class RepoPersister {
* is essentially completely transient, and can be nuked at any time. * is essentially completely transient, and can be nuked at any time.
*/ */
private static final String[] APP_FIELDS_TO_IGNORE = { private static final String[] APP_FIELDS_TO_IGNORE = {
AppProvider.DataColumns.IGNORE_ALLUPDATES, Schema.AppTable.Cols.IGNORE_ALLUPDATES,
AppProvider.DataColumns.IGNORE_THISUPDATE, Schema.AppTable.Cols.IGNORE_THISUPDATE,
}; };
/** /**
@ -214,7 +214,7 @@ public class RepoPersister {
* array. * array.
*/ */
private boolean isAppInDatabase(App app) { 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); App found = AppProvider.Helper.findByPackageName(context.getContentResolver(), app.packageName, fields);
return found != null; return found != null;
} }

View File

@ -5,11 +5,67 @@ package org.fdroid.fdroid.data;
* Constants from this interface should be used in preference to string literals when referring to * Constants from this interface should be used in preference to string literals when referring to
* the tables/columns in the database. * the tables/columns in the database.
*/ */
interface Schema { public interface Schema {
interface AppTable { interface AppTable {
String NAME = DBHelper.TABLE_APP; 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 { interface ApkTable {

View File

@ -25,7 +25,7 @@ import org.fdroid.fdroid.R;
import org.fdroid.fdroid.UpdateService; import org.fdroid.fdroid.UpdateService;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.App; 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; import org.fdroid.fdroid.views.AppListAdapter;
public abstract class AppListFragment extends ListFragment implements 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 int REQUEST_APPDETAILS = 0;
private static final String[] APP_PROJECTION = { private static final String[] APP_PROJECTION = {
AppProvider.DataColumns._ID, // Required for cursor loader to work. AppTable.Cols._ID, // Required for cursor loader to work.
AppProvider.DataColumns.PACKAGE_NAME, AppTable.Cols.PACKAGE_NAME,
AppProvider.DataColumns.NAME, AppTable.Cols.NAME,
AppProvider.DataColumns.SUMMARY, AppTable.Cols.SUMMARY,
AppProvider.DataColumns.IS_COMPATIBLE, AppTable.Cols.IS_COMPATIBLE,
AppProvider.DataColumns.LICENSE, AppTable.Cols.LICENSE,
AppProvider.DataColumns.ICON, AppTable.Cols.ICON,
AppProvider.DataColumns.ICON_URL, AppTable.Cols.ICON_URL,
AppProvider.DataColumns.InstalledApp.VERSION_CODE, AppTable.Cols.InstalledApp.VERSION_CODE,
AppProvider.DataColumns.InstalledApp.VERSION_NAME, AppTable.Cols.InstalledApp.VERSION_NAME,
AppProvider.DataColumns.SuggestedApk.VERSION_NAME, AppTable.Cols.SuggestedApk.VERSION_NAME,
AppProvider.DataColumns.SUGGESTED_VERSION_CODE, AppTable.Cols.SUGGESTED_VERSION_CODE,
AppProvider.DataColumns.IGNORE_ALLUPDATES, AppTable.Cols.IGNORE_ALLUPDATES,
AppProvider.DataColumns.IGNORE_THISUPDATE, AppTable.Cols.IGNORE_THISUPDATE,
AppProvider.DataColumns.REQUIREMENTS, // Needed for filtering apps that require root. 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; private AppListAdapter appAdapter;

View File

@ -49,6 +49,7 @@ import org.fdroid.fdroid.data.ApkProvider;
import org.fdroid.fdroid.data.App; import org.fdroid.fdroid.data.App;
import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.data.AppProvider;
import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.Repo;
import org.fdroid.fdroid.data.Schema;
import org.fdroid.fdroid.localrepo.SwapService; import org.fdroid.fdroid.localrepo.SwapService;
import org.fdroid.fdroid.net.Downloader; import org.fdroid.fdroid.net.Downloader;
import org.fdroid.fdroid.net.DownloaderService; import org.fdroid.fdroid.net.DownloaderService;
@ -104,7 +105,7 @@ public class SwapAppsView extends ListView implements
*/ */
adapter = new AppListAdapter(getContext(), getContext().getContentResolver().query( 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); setAdapter(adapter);
@ -194,7 +195,7 @@ public class SwapAppsView extends ListView implements
? AppProvider.getRepoUri(repo) ? AppProvider.getRepoUri(repo)
: AppProvider.getSearchUri(repo, mCurrentFilterString); : 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 @Override

View File

@ -9,6 +9,8 @@ import junit.framework.AssertionFailedError;
import org.fdroid.fdroid.data.ApkProvider; import org.fdroid.fdroid.data.ApkProvider;
import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.data.AppProvider;
import org.fdroid.fdroid.data.InstalledAppProvider; 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 org.robolectric.shadows.ShadowContentResolver;
import java.util.ArrayList; import java.util.ArrayList;
@ -178,16 +180,16 @@ public class Assert {
public static void insertApp(ShadowContentResolver resolver, String id, String name, ContentValues additionalValues) { public static void insertApp(ShadowContentResolver resolver, String id, String name, ContentValues additionalValues) {
ContentValues values = new ContentValues(); ContentValues values = new ContentValues();
values.put(AppProvider.DataColumns.PACKAGE_NAME, id); values.put(AppTable.Cols.PACKAGE_NAME, id);
values.put(AppProvider.DataColumns.NAME, name); values.put(AppTable.Cols.NAME, name);
// Required fields (NOT NULL in the database). // Required fields (NOT NULL in the database).
values.put(AppProvider.DataColumns.SUMMARY, "test summary"); values.put(AppTable.Cols.SUMMARY, "test summary");
values.put(AppProvider.DataColumns.DESCRIPTION, "test description"); values.put(AppTable.Cols.DESCRIPTION, "test description");
values.put(AppProvider.DataColumns.LICENSE, "GPL?"); values.put(AppTable.Cols.LICENSE, "GPL?");
values.put(AppProvider.DataColumns.IS_COMPATIBLE, 1); values.put(AppTable.Cols.IS_COMPATIBLE, 1);
values.put(AppProvider.DataColumns.IGNORE_ALLUPDATES, 0); values.put(AppTable.Cols.IGNORE_ALLUPDATES, 0);
values.put(AppProvider.DataColumns.IGNORE_THISUPDATE, 0); values.put(AppTable.Cols.IGNORE_THISUPDATE, 0);
values.putAll(additionalValues); values.putAll(additionalValues);

View File

@ -8,6 +8,7 @@ import android.net.Uri;
import org.fdroid.fdroid.BuildConfig; import org.fdroid.fdroid.BuildConfig;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.data.Schema.AppTable.Cols;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -30,7 +31,7 @@ import static org.junit.Assert.assertTrue;
@RunWith(RobolectricGradleTestRunner.class) @RunWith(RobolectricGradleTestRunner.class)
public class AppProviderTest extends FDroidProviderTest { public class AppProviderTest extends FDroidProviderTest {
private static final String[] PROJ = AppProvider.DataColumns.ALL; private static final String[] PROJ = Cols.ALL;
@Before @Before
public void setup() { public void setup() {
@ -86,9 +87,9 @@ public class AppProviderTest extends FDroidProviderTest {
String packageName, int installedVercode, int suggestedVercode, String packageName, int installedVercode, int suggestedVercode,
boolean ignoreAll, int ignoreVercode) { boolean ignoreAll, int ignoreVercode) {
ContentValues values = new ContentValues(3); ContentValues values = new ContentValues(3);
values.put(AppProvider.DataColumns.SUGGESTED_VERSION_CODE, suggestedVercode); values.put(Cols.SUGGESTED_VERSION_CODE, suggestedVercode);
values.put(AppProvider.DataColumns.IGNORE_ALLUPDATES, ignoreAll); values.put(Cols.IGNORE_ALLUPDATES, ignoreAll);
values.put(AppProvider.DataColumns.IGNORE_THISUPDATE, ignoreVercode); values.put(Cols.IGNORE_THISUPDATE, ignoreVercode);
insertApp(packageName, "App: " + packageName, values); insertApp(packageName, "App: " + packageName, values);
InstalledAppTestUtils.install(context, packageName, installedVercode, "v" + installedVercode); InstalledAppTestUtils.install(context, packageName, installedVercode, "v" + installedVercode);
@ -135,7 +136,7 @@ public class AppProviderTest extends FDroidProviderTest {
assertFalse(installedOldIgnoreLatest.canAndWantToUpdate()); assertFalse(installedOldIgnoreLatest.canAndWantToUpdate());
assertTrue(installedOldIgnoreNewerNotLatest.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); assertNotNull(canUpdateCursor);
canUpdateCursor.moveToFirst(); canUpdateCursor.moveToFirst();
List<String> canUpdateIds = new ArrayList<>(canUpdateCursor.getCount()); List<String> canUpdateIds = new ArrayList<>(canUpdateCursor.getCount());
@ -168,7 +169,7 @@ public class AppProviderTest extends FDroidProviderTest {
assertResultCount(contentResolver, 10, AppProvider.getContentUri(), PROJ); assertResultCount(contentResolver, 10, AppProvider.getContentUri(), PROJ);
String[] projection = {AppProvider.DataColumns.PACKAGE_NAME}; String[] projection = {Cols.PACKAGE_NAME};
List<App> ignoredApps = AppProvider.Helper.findIgnored(context, projection); List<App> ignoredApps = AppProvider.Helper.findIgnored(context, projection);
String[] expectedIgnored = { String[] expectedIgnored = {
@ -251,9 +252,9 @@ public class AppProviderTest extends FDroidProviderTest {
private Cursor queryAllApps() { private Cursor queryAllApps() {
String[] projection = new String[] { String[] projection = new String[] {
AppProvider.DataColumns._ID, Cols._ID,
AppProvider.DataColumns.NAME, Cols.NAME,
AppProvider.DataColumns.PACKAGE_NAME, Cols.PACKAGE_NAME,
}; };
return contentResolver.query(AppProvider.getContentUri(), projection, null, null, null); 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) { private void insertAppWithCategory(String id, String name, String categories) {
ContentValues values = new ContentValues(1); ContentValues values = new ContentValues(1);
values.put(AppProvider.DataColumns.CATEGORIES, categories); values.put(Cols.CATEGORIES, categories);
insertApp(id, name, values); insertApp(id, name, values);
} }
public void insertApp(String id, String name, ContentValues additionalValues) { public void insertApp(String id, String name, ContentValues additionalValues) {
ContentValues values = new ContentValues(); ContentValues values = new ContentValues();
values.put(AppProvider.DataColumns.PACKAGE_NAME, id); values.put(Cols.PACKAGE_NAME, id);
values.put(AppProvider.DataColumns.NAME, name); values.put(Cols.NAME, name);
// Required fields (NOT NULL in the database). // Required fields (NOT NULL in the database).
values.put(AppProvider.DataColumns.SUMMARY, "test summary"); values.put(Cols.SUMMARY, "test summary");
values.put(AppProvider.DataColumns.DESCRIPTION, "test description"); values.put(Cols.DESCRIPTION, "test description");
values.put(AppProvider.DataColumns.LICENSE, "GPL?"); values.put(Cols.LICENSE, "GPL?");
values.put(AppProvider.DataColumns.IS_COMPATIBLE, 1); values.put(Cols.IS_COMPATIBLE, 1);
values.put(AppProvider.DataColumns.IGNORE_ALLUPDATES, 0); values.put(Cols.IGNORE_ALLUPDATES, 0);
values.put(AppProvider.DataColumns.IGNORE_THISUPDATE, 0); values.put(Cols.IGNORE_THISUPDATE, 0);
values.putAll(additionalValues); values.putAll(additionalValues);

View File

@ -79,7 +79,7 @@ public class ProviderUriTests {
@Test @Test
public void validAppProviderUris() { public void validAppProviderUris() {
ShadowContentResolver.registerProvider(AppProvider.getAuthority(), new AppProvider()); 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.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("'searching!'"), "content://org.fdroid.fdroid.data.AppProvider/search/'searching!'", projection);
assertValidUri(resolver, AppProvider.getSearchUri("/"), "content://org.fdroid.fdroid.data.AppProvider/search/%2F", projection); assertValidUri(resolver, AppProvider.getSearchUri("/"), "content://org.fdroid.fdroid.data.AppProvider/search/%2F", projection);