From 3ebad383d648715b13b690a7462ea39a66dbdc3a Mon Sep 17 00:00:00 2001
From: Peter Serwylo <peter@ivt.com.au>
Date: Sun, 23 Mar 2014 22:31:06 +1100
Subject: [PATCH] Refactored the recent MR for dynamicly adding default repos.

The idea was good: reduce the amount of copied/pasted code
where ContentValues were initialized, populated, then inserted.
I've kept the idea, by putting it in its own method which is
called twice. But the resources are not loaded dynamically any
more. This is so that the compiler will be able to pick up if
we reference a missing resource. Also, I took the opportunity
to replace the field name string literals with references to
RepoProvider.DataColumns.* constants.

Finally, changed the tests around because now we need to
have the "getInteger()" call mocked in resources correctly
(for priority/inUse).
---
 src/org/fdroid/fdroid/data/DBHelper.java      | 83 +++++++++----------
 test/src/mock/MockCategoryResources.java      |  7 +-
 test/src/mock/MockFDroidResources.java        | 36 ++++++++
 .../org/fdroid/fdroid/AppProviderTest.java    |  8 +-
 .../org/fdroid/fdroid/FDroidProviderTest.java |  9 ++
 5 files changed, 95 insertions(+), 48 deletions(-)
 create mode 100644 test/src/mock/MockFDroidResources.java

diff --git a/src/org/fdroid/fdroid/data/DBHelper.java b/src/org/fdroid/fdroid/data/DBHelper.java
index feb323d91..c75fe67e9 100644
--- a/src/org/fdroid/fdroid/data/DBHelper.java
+++ b/src/org/fdroid/fdroid/data/DBHelper.java
@@ -177,55 +177,46 @@ public class DBHelper extends SQLiteOpenHelper {
     public void onCreate(SQLiteDatabase db) {
 
         createAppApk(db);
-
         db.execSQL(CREATE_TABLE_REPO);
 
-        Resources ress = context.getResources();
+        insertRepo(
+            db,
+            context.getString(R.string.default_repo_name1),
+            context.getString(R.string.default_repo_address1),
+            context.getString(R.string.default_repo_description1),
+            context.getString(R.string.default_repo_pubkey1),
+            context.getResources().getInteger(R.integer.default_repo_inuse1),
+            context.getResources().getInteger(R.integer.default_repo_priority1)
+        );
 
-        int repoCount = ress.getInteger(R.integer.default_repo_count);
-        for (int i = 1; i <= repoCount; i++) {
-            ContentValues values = new ContentValues();
-            String repoName = context.getString(ress.getIdentifier(
-                    "default_repo_name" + i,
-                    "string",
-                    "org.fdroid.fdroid"
-                    ));
-            values.put("address",
-                context.getString(ress.getIdentifier(
-                    "default_repo_address" + i,
-                    "string",
-                    "org.fdroid.fdroid"
-                    )));
-            values.put("name",repoName);
-            values.put("description",
-                context.getString(ress.getIdentifier(
-                    "default_repo_description" + i,
-                    "string",
-                    "org.fdroid.fdroid"
-                   )));
-            String pubkey = context.getString(ress.getIdentifier(
-                    "default_repo_pubkey" + i,
-                    "string",
-                    "org.fdroid.fdroid"
-                    ));
-            String fingerprint = Utils.calcFingerprint(pubkey);
-            values.put("pubkey", pubkey);
-            values.put("fingerprint", fingerprint);
-            values.put("maxage", 0);
-            values.put("inuse", ress.getInteger(ress.getIdentifier(
-                    "default_repo_inuse" + i,
-                    "integer",
-                    "org.fdroid.fdroid"
-                   )));
-            values.put("priority", ress.getInteger(ress.getIdentifier(
-                    "default_repo_priority" + i,
-                    "integer",
-                    "org.fdroid.fdroid"
-                   )));
-            values.put("lastetag", (String) null);
-            Log.i("FDroid", "Add repository " + repoName);
-            db.insert(TABLE_REPO, null, values);
-        }
+        insertRepo(
+            db,
+            context.getString(R.string.default_repo_name2),
+            context.getString(R.string.default_repo_address2),
+            context.getString(R.string.default_repo_description2),
+            context.getString(R.string.default_repo_pubkey2),
+            context.getResources().getInteger(R.integer.default_repo_inuse2),
+            context.getResources().getInteger(R.integer.default_repo_priority2)
+        );
+    }
+
+    private void insertRepo(
+        SQLiteDatabase db, String name, String address, String description,
+        String pubKey, int inUse, 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.PUBLIC_KEY, pubKey);
+        values.put(RepoProvider.DataColumns.FINGERPRINT, Utils.calcFingerprint(pubKey));
+        values.put(RepoProvider.DataColumns.MAX_AGE, 0);
+        values.put(RepoProvider.DataColumns.IN_USE, inUse);
+        values.put(RepoProvider.DataColumns.PRIORITY, priority);
+        values.put(RepoProvider.DataColumns.LAST_ETAG, (String)null);
+
+        Log.i("FDroid", "Adding repository " + name);
+        db.insert(TABLE_REPO, null, values);
     }
 
     @Override
diff --git a/test/src/mock/MockCategoryResources.java b/test/src/mock/MockCategoryResources.java
index 669ddd1d0..2831049d8 100644
--- a/test/src/mock/MockCategoryResources.java
+++ b/test/src/mock/MockCategoryResources.java
@@ -1,9 +1,14 @@
 package mock;
 
+import android.content.Context;
 import android.test.mock.*;
 import org.fdroid.fdroid.*;
 
-public class MockCategoryResources extends MockResources {
+public class MockCategoryResources extends MockFDroidResources {
+
+    public MockCategoryResources(Context getStringDelegatingContext) {
+        super(getStringDelegatingContext);
+    }
 
     @Override
     public String getString(int id) {
diff --git a/test/src/mock/MockFDroidResources.java b/test/src/mock/MockFDroidResources.java
new file mode 100644
index 000000000..c2b716d2f
--- /dev/null
+++ b/test/src/mock/MockFDroidResources.java
@@ -0,0 +1,36 @@
+package mock;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.mock.*;
+import org.fdroid.fdroid.*;
+
+public class MockFDroidResources extends MockResources {
+
+    private Context getStringDelegatingContext;
+
+    public MockFDroidResources(Context getStringDelegatingContext) {
+        this.getStringDelegatingContext = getStringDelegatingContext;
+    }
+
+    @Override
+    public String getString(int id) {
+        return getStringDelegatingContext.getString(id);
+    }
+
+    @Override
+    public int getInteger(int id) {
+        if (id == R.integer.default_repo_inuse1) {
+            return 1;
+        } else if (id == R.integer.default_repo_inuse2) {
+            return 0;
+        } else if (id == R.integer.default_repo_priority1) {
+            return 10;
+        } else if (id == R.integer.default_repo_priority2) {
+            return 20;
+        } else {
+            return 0;
+        }
+}
+
+}
diff --git a/test/src/org/fdroid/fdroid/AppProviderTest.java b/test/src/org/fdroid/fdroid/AppProviderTest.java
index 80e19bd72..e36a32ba3 100644
--- a/test/src/org/fdroid/fdroid/AppProviderTest.java
+++ b/test/src/org/fdroid/fdroid/AppProviderTest.java
@@ -2,6 +2,7 @@ package org.fdroid.fdroid;
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
+import android.content.res.Resources;
 import android.database.Cursor;
 
 import mock.MockCategoryResources;
@@ -24,7 +25,12 @@ public class AppProviderTest extends FDroidProviderTest<AppProvider> {
     @Override
     public void setUp() throws Exception {
         super.setUp();
-        getSwappableContext().setResources(new MockCategoryResources());
+        getSwappableContext().setResources(new MockCategoryResources(getContext()));
+    }
+
+    @Override
+    protected Resources getMockResources() {
+        return new MockCategoryResources(getContext());
     }
 
     @Override
diff --git a/test/src/org/fdroid/fdroid/FDroidProviderTest.java b/test/src/org/fdroid/fdroid/FDroidProviderTest.java
index 7a4c4a6d6..a2b4a8a18 100644
--- a/test/src/org/fdroid/fdroid/FDroidProviderTest.java
+++ b/test/src/org/fdroid/fdroid/FDroidProviderTest.java
@@ -3,13 +3,16 @@ package org.fdroid.fdroid;
 import android.annotation.TargetApi;
 import android.content.ContentValues;
 import android.content.Context;
+import android.content.res.Resources;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Build;
 import android.provider.ContactsContract;
 import android.test.ProviderTestCase2MockContext;
+import mock.MockCategoryResources;
 import mock.MockContextEmptyComponents;
 import mock.MockContextSwappableComponents;
+import mock.MockFDroidResources;
 import org.fdroid.fdroid.data.FDroidProvider;
 import org.fdroid.fdroid.mock.MockInstalledApkCache;
 
@@ -23,10 +26,15 @@ public abstract class FDroidProviderTest<T extends FDroidProvider> extends Provi
         super(providerClass, providerAuthority);
     }
 
+    protected Resources getMockResources() {
+        return new MockFDroidResources(getContext());
+    }
+
     @Override
     public void setUp() throws Exception {
         super.setUp();
         Utils.setupInstalledApkCache(new MockInstalledApkCache());
+        getSwappableContext().setResources(getMockResources());
 
         // The *Provider.Helper.* functions tend to take a Context as their
         // first parameter. This context is used to connect to the relevant
@@ -34,6 +42,7 @@ public abstract class FDroidProviderTest<T extends FDroidProvider> extends Provi
         // to the mock content resolver, in order to reach the provider
         // under test.
         getSwappableContext().setContentResolver(getMockContentResolver());
+
     }
 
     @TargetApi(Build.VERSION_CODES.ECLAIR)