From 8a155aef89fa4a97c552a2e89314ac0ac8c1c29e Mon Sep 17 00:00:00 2001
From: Peter Serwylo <peter@serwylo.com>
Date: Thu, 30 Jun 2016 13:28:55 +1000
Subject: [PATCH] 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<String, String> 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<Repo> repos = findBy(
-                    context, DataColumns.ADDRESS, address, projection);
+                    context, Cols.ADDRESS, address, projection);
             return repos.size() > 0 ? repos.get(0) : null;
         }
 
         public static List<Repo> all(Context context) {
-            return all(context, DataColumns.ALL);
+            return all(context, Cols.ALL);
         }
 
         public static List<Repo> all(Context context, String[] projection) {
@@ -113,10 +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);