diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml
index 45c08743b..b10eb6094 100644
--- a/astrid/AndroidManifest.xml
+++ b/astrid/AndroidManifest.xml
@@ -149,6 +149,13 @@
android:grantUriPermissions="true"
android:readPermission="com.timsu.astrid.permission.READ_TASKS"/>
+
+
diff --git a/astrid/api-src/com/todoroo/astrid/api/AstridApiConstants.java b/astrid/api-src/com/todoroo/astrid/api/AstridApiConstants.java
index 950996e3f..669dc38e1 100644
--- a/astrid/api-src/com/todoroo/astrid/api/AstridApiConstants.java
+++ b/astrid/api-src/com/todoroo/astrid/api/AstridApiConstants.java
@@ -35,7 +35,7 @@ public class AstridApiConstants {
/**
* URI to append to base content URI for making groupby queries
*/
- public static final String GROUP_BY_URI = "groupby/";
+ public static final String GROUP_BY_URI = "/groupby/";
// --- Broadcast Extras
diff --git a/astrid/common-src/com/todoroo/andlib/data/GenericDao.java b/astrid/common-src/com/todoroo/andlib/data/GenericDao.java
index b8b2b8ad3..ffd4fa296 100644
--- a/astrid/common-src/com/todoroo/andlib/data/GenericDao.java
+++ b/astrid/common-src/com/todoroo/andlib/data/GenericDao.java
@@ -47,10 +47,14 @@ public class GenericDao {
}
/**
- * Sets up a database
+ * Sets database accessed by this DAO. Used for dependency-injected
+ * initialization by child classes and unit tests
+ *
* @param database
*/
- protected void setDatabase(AbstractDatabase database) {
+ public void setDatabase(AbstractDatabase database) {
+ if(database == this.database)
+ return;
this.database = database;
table = database.getTable(modelClass);
}
diff --git a/astrid/src/com/todoroo/astrid/model/Metadata.java b/astrid/src/com/todoroo/astrid/model/Metadata.java
index fdd295a82..9fcb3a665 100644
--- a/astrid/src/com/todoroo/astrid/model/Metadata.java
+++ b/astrid/src/com/todoroo/astrid/model/Metadata.java
@@ -9,10 +9,10 @@ import android.net.Uri;
import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property;
-import com.todoroo.andlib.data.Property.LongProperty;
-import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.data.Table;
import com.todoroo.andlib.data.TodorooCursor;
+import com.todoroo.andlib.data.Property.LongProperty;
+import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.astrid.api.AstridApiConstants;
/**
@@ -31,7 +31,7 @@ public class Metadata extends AbstractModel {
/** content uri for this model */
public static final Uri CONTENT_URI = Uri.parse("content://" + AstridApiConstants.PACKAGE + "/" +
- TABLE.name + "/");
+ TABLE.name);
// --- properties
diff --git a/astrid/src/com/todoroo/astrid/model/StoreObject.java b/astrid/src/com/todoroo/astrid/model/StoreObject.java
index 7ddb839bd..ae183a0fa 100644
--- a/astrid/src/com/todoroo/astrid/model/StoreObject.java
+++ b/astrid/src/com/todoroo/astrid/model/StoreObject.java
@@ -9,10 +9,10 @@ import android.net.Uri;
import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property;
-import com.todoroo.andlib.data.Property.LongProperty;
-import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.data.Table;
import com.todoroo.andlib.data.TodorooCursor;
+import com.todoroo.andlib.data.Property.LongProperty;
+import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.astrid.api.AstridApiConstants;
/**
@@ -31,7 +31,7 @@ public class StoreObject extends AbstractModel {
/** content uri for this model */
public static final Uri CONTENT_URI = Uri.parse("content://" + AstridApiConstants.PACKAGE + "/" +
- TABLE.name + "/");
+ TABLE.name);
// --- properties
diff --git a/astrid/src/com/todoroo/astrid/model/Task.java b/astrid/src/com/todoroo/astrid/model/Task.java
index 4936b84d6..5580e3b88 100644
--- a/astrid/src/com/todoroo/astrid/model/Task.java
+++ b/astrid/src/com/todoroo/astrid/model/Task.java
@@ -15,11 +15,11 @@ import android.net.Uri;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property;
+import com.todoroo.andlib.data.Table;
+import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.IntegerProperty;
import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty;
-import com.todoroo.andlib.data.Table;
-import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.AstridApiConstants;
@@ -39,7 +39,7 @@ public final class Task extends AbstractModel {
/** content uri for this model */
public static final Uri CONTENT_URI = Uri.parse("content://" + AstridApiConstants.PACKAGE + "/" +
- TABLE.name + "/");
+ TABLE.name);
// --- properties
diff --git a/astrid/src/com/todoroo/astrid/provider/Astrid3ContentProvider.java b/astrid/src/com/todoroo/astrid/provider/Astrid3ContentProvider.java
index 8933517c4..17bfc178f 100644
--- a/astrid/src/com/todoroo/astrid/provider/Astrid3ContentProvider.java
+++ b/astrid/src/com/todoroo/astrid/provider/Astrid3ContentProvider.java
@@ -12,6 +12,7 @@ import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
+import com.todoroo.andlib.data.AbstractDatabase;
import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.GenericDao;
import com.todoroo.andlib.service.Autowired;
@@ -64,9 +65,12 @@ public class Astrid3ContentProvider extends ContentProvider {
/** URI for making a request over all items grouped by some field */
private static final int URI_GROUP = 3;
+ private static final UriMatcher uriMatcher;
+
+ private static AbstractDatabase databaseOverride;
+
// --- instance variables
- private final UriMatcher uriMatcher;
@Autowired
private Database database;
@@ -83,6 +87,8 @@ public class Astrid3ContentProvider extends ContentProvider {
@Autowired
private ExceptionService exceptionService;
+ static String hello = "hello";
+
@Override
public boolean onCreate() {
try {
@@ -94,18 +100,24 @@ public class Astrid3ContentProvider extends ContentProvider {
}
}
- public Astrid3ContentProvider() {
- DependencyInjectionService.getInstance().inject(this);
-
+ static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
for(Uri uri : new Uri[] { Task.CONTENT_URI, Metadata.CONTENT_URI, StoreObject.CONTENT_URI }) {
- String uriAsString = uri.toString();
- uriMatcher.addURI(uriAsString, "", URI_DIR);
- uriMatcher.addURI(uriAsString, "#", URI_ITEM);
- uriMatcher.addURI(uriAsString,
+ String authority = AstridApiConstants.PACKAGE;
+
+ String table = uri.toString();
+ table = table.substring(table.indexOf('/', 11) + 1);
+
+ uriMatcher.addURI(authority, table, URI_DIR);
+ uriMatcher.addURI(authority, table + "/#", URI_ITEM);
+ uriMatcher.addURI(authority, table +
AstridApiConstants.GROUP_BY_URI + "*", URI_GROUP);
}
+ }
+
+ public Astrid3ContentProvider() {
+ DependencyInjectionService.getInstance().inject(this);
setReadPermission(AstridApiConstants.PERMISSION_READ);
setWritePermission(AstridApiConstants.PERMISSION_WRITE);
@@ -120,7 +132,7 @@ public class Astrid3ContentProvider extends ContentProvider {
case URI_ITEM:
return "vnd.android.cursor/vnd.astrid.item";
default:
- throw new IllegalArgumentException("Unsupported URI: " + uri);
+ throw new IllegalArgumentException("Unsupported URI " + uri + " (" + uriMatcher.match(uri) + ")");
}
}
@@ -153,22 +165,35 @@ public class Astrid3ContentProvider extends ContentProvider {
UriHelper helper = new UriHelper();
helper.model = populateModel ? new Task() : null;
helper.dao = taskDao;
+ helper.dao.setDatabase(getDatabase());
return helper;
} else if(uri.toString().startsWith(Metadata.CONTENT_URI.toString())) {
UriHelper helper = new UriHelper();
helper.model = populateModel ? new Metadata() : null;
helper.dao = metadataDao;
+ helper.dao.setDatabase(getDatabase());
return helper;
} else if(uri.toString().startsWith(StoreObject.CONTENT_URI.toString())) {
UriHelper helper = new UriHelper();
helper.model = populateModel ? new StoreObject() : null;
helper.dao = storeObjectDao;
+ helper.dao.setDatabase(getDatabase());
return helper;
}
throw new UnsupportedOperationException("Unknown URI " + uri);
}
+ static void setDatabaseOverride(AbstractDatabase override) {
+ databaseOverride = override;
+ }
+
+ private AbstractDatabase getDatabase() {
+ if(databaseOverride != null)
+ return databaseOverride;
+ return database;
+ }
+
/* ======================================================================
* =========================================================== delete ===
* ====================================================================== */
@@ -204,10 +229,10 @@ public class Astrid3ContentProvider extends ContentProvider {
break;
default:
- throw new IllegalArgumentException("Unknown URI " + uri);
+ throw new IllegalArgumentException("Unknown URI " + uri + " (" + uriMatcher.match(uri) + ")");
}
- return database.delete(helper.dao.getTable().name, selection, selectionArgs);
+ return getDatabase().delete(helper.dao.getTable().name, selection, selectionArgs);
}
/* ======================================================================
@@ -236,6 +261,7 @@ public class Astrid3ContentProvider extends ContentProvider {
helper.create();
Uri newUri = ContentUris.withAppendedId(uri, helper.model.getId());
getContext().getContentResolver().notifyChange(newUri, null);
+ return newUri;
}
default:
@@ -302,10 +328,10 @@ public class Astrid3ContentProvider extends ContentProvider {
builder.appendWhere(itemSelector);
break;
default:
- throw new IllegalArgumentException("Unknown URI " + uri);
+ throw new IllegalArgumentException("Unknown URI " + uri + " (" + uriMatcher.match(uri) + ")");
}
- Cursor cursor = builder.query(database.getDatabase(), projection, selection, selectionArgs, groupBy, null, sortOrder);
+ Cursor cursor = builder.query(getDatabase().getDatabase(), projection, selection, selectionArgs, groupBy, null, sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
diff --git a/tests/src/com/todoroo/astrid/provider/Astrid3ProviderTests.java b/tests/src/com/todoroo/astrid/provider/Astrid3ProviderTests.java
index ee8994bd2..f8f15caf4 100644
--- a/tests/src/com/todoroo/astrid/provider/Astrid3ProviderTests.java
+++ b/tests/src/com/todoroo/astrid/provider/Astrid3ProviderTests.java
@@ -20,12 +20,21 @@ public class Astrid3ProviderTests extends DatabaseTestCase {
Task.TITLE.name,
};
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ // set up database
+ Astrid3ContentProvider.setDatabaseOverride(database);
+
+ }
+
/** Test CRUD over tasks with the ALL ITEMS cursor */
public void testAllItemsCrud() {
ContentResolver resolver = getContext().getContentResolver();
// fetch all tasks, get nothing
- Uri uri = Uri.withAppendedPath(Task.CONTENT_URI, "");
+ Uri uri = Task.CONTENT_URI;
Cursor cursor = resolver.query(uri, PROJECTION, "1", null, null);
assertEquals(0, cursor.getCount());
cursor.close();