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