From 293788ae2fed2d293250ecb4cb119362841660b2 Mon Sep 17 00:00:00 2001 From: Tim Su Date: Mon, 2 Aug 2010 23:20:18 -0700 Subject: [PATCH] Updated the legacy com.timsu.astrid.tasksprovider provider --- astrid/AndroidManifest.xml | 2 +- .../todoroo/andlib/data/AbstractDatabase.java | 4 +- .../com/todoroo/andlib/data/GenericDao.java | 25 +- .../com/todoroo/andlib/sql/DBObject.java | 1 - .../com/todoroo/andlib/sql/Query.java | 13 + .../com/todoroo/andlib/utility/UserTask.java | 2 +- .../com/todoroo/astrid/tags/TagService.java | 14 +- .../timsu/astrid/data/tag/TagController.java | 8 +- .../astrid/data/task/TaskController.java | 6 +- .../timsu/astrid/provider/TasksProvider.java | 245 --------------- .../astrid/provider/Astrid2TaskProvider.java | 284 ++++++++++++++++++ .../todoroo/astrid/service/TaskService.java | 23 +- .../astrid/legacy/data/tag/TagController.java | 4 +- 13 files changed, 363 insertions(+), 268 deletions(-) delete mode 100644 astrid/src-legacy/com/timsu/astrid/provider/TasksProvider.java create mode 100644 astrid/src/com/todoroo/astrid/provider/Astrid2TaskProvider.java diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index 7635cab91..88cff7712 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -127,7 +127,7 @@ - { /** * Construct a query with SQL DSL objects - * @param database - * @param properties - * @param builder - * @param where - * @param groupBy - * @param sortOrder + * + * @param query * @return */ public TodorooCursor query(Query query) { @@ -70,6 +66,23 @@ public class GenericDao { return new TodorooCursor(cursor, query.getFields()); } + /** + * Construct a query with raw SQL + * + * @param properties + * @param selection + * @param selectionArgs + * @return + */ + public TodorooCursor rawQuery(String selection, String[] selectionArgs, Property... properties) { + String[] fields = new String[properties.length]; + for(int i = 0; i < properties.length; i++) + fields[i] = properties[i].name; + return new TodorooCursor(database.getDatabase().query(table.name, + fields, selection, selectionArgs, null, null, null), + properties); + } + /** * Returns object corresponding to the given identifier * diff --git a/astrid/common-src/com/todoroo/andlib/sql/DBObject.java b/astrid/common-src/com/todoroo/andlib/sql/DBObject.java index 4ba9c8f42..3e4c9a29f 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/DBObject.java +++ b/astrid/common-src/com/todoroo/andlib/sql/DBObject.java @@ -25,7 +25,6 @@ public abstract class DBObject> implements Cloneable { return alias != null; } - @SuppressWarnings("unchecked") @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/astrid/common-src/com/todoroo/andlib/sql/Query.java b/astrid/common-src/com/todoroo/andlib/sql/Query.java index cfb8313c6..620087ced 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/Query.java +++ b/astrid/common-src/com/todoroo/andlib/sql/Query.java @@ -5,6 +5,7 @@ import static com.todoroo.andlib.sql.SqlConstants.COMMA; import static com.todoroo.andlib.sql.SqlConstants.FROM; import static com.todoroo.andlib.sql.SqlConstants.GROUP_BY; import static com.todoroo.andlib.sql.SqlConstants.LEFT_PARENTHESIS; +import static com.todoroo.andlib.sql.SqlConstants.LIMIT; import static com.todoroo.andlib.sql.SqlConstants.ORDER_BY; import static com.todoroo.andlib.sql.SqlConstants.RIGHT_PARENTHESIS; import static com.todoroo.andlib.sql.SqlConstants.SELECT; @@ -27,6 +28,7 @@ public final class Query { private final ArrayList groupBies = new ArrayList(); private final ArrayList orders = new ArrayList(); private final ArrayList havings = new ArrayList(); + private int limits = -1; private Query(Field... fields) { this.fields.addAll(asList(fields)); @@ -61,6 +63,11 @@ public final class Query { return this; } + public Query limit(int limit) { + limits = limit; + return this; + } + public Query appendSelectFields(Property... selectFields) { this.fields.addAll(asList(selectFields)); return this; @@ -87,6 +94,7 @@ public final class Query { visitWhereClause(sql); visitGroupByClause(sql); visitOrderByClause(sql); + visitLimitClause(sql); } else { if(joins.size() > 0 || groupBies.size() > 0 || orders.size() > 0 || havings.size() > 0) @@ -163,6 +171,11 @@ public final class Query { sql.deleteCharAt(sql.length() - 1).append(SPACE); } + private void visitLimitClause(StringBuilder sql) { + if(limits > -1) + sql.append(LIMIT).append(SPACE).append(limits).append(SPACE); + } + public SqlTable as(String alias) { return table(LEFT_PARENTHESIS + this.toString() + RIGHT_PARENTHESIS).as(alias); } diff --git a/astrid/common-src/com/todoroo/andlib/utility/UserTask.java b/astrid/common-src/com/todoroo/andlib/utility/UserTask.java index 63122ebe2..180bc2f8f 100644 --- a/astrid/common-src/com/todoroo/andlib/utility/UserTask.java +++ b/astrid/common-src/com/todoroo/andlib/utility/UserTask.java @@ -417,7 +417,7 @@ public abstract class UserTask { } protected static class InternalHandler extends Handler { - @SuppressWarnings({"unchecked", "rawtypes"}) + @SuppressWarnings("unchecked") @Override public void handleMessage(Message msg) { UserTaskResult result = (UserTaskResult) msg.obj; diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java index 961042927..9f73ba6fc 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java @@ -2,9 +2,9 @@ package com.todoroo.astrid.tags; import java.util.ArrayList; +import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.Property.CountProperty; import com.todoroo.andlib.data.Property.StringProperty; -import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.sql.Criterion; @@ -142,6 +142,16 @@ public final class TagService { * @return empty string if no tags, otherwise string */ public String getTagsAsString(long taskId) { + return getTagsAsString(taskId, ", "); + } + + /** + * Return tags as a list of strings separated by given separator + * + * @param taskId + * @return empty string if no tags, otherwise string + */ + public String getTagsAsString(long taskId, String separator) { StringBuilder tagBuilder = new StringBuilder(); TodorooCursor tags = getTags(taskId); try { @@ -152,7 +162,7 @@ public final class TagService { metadata.readFromCursor(tags); tagBuilder.append(metadata.getValue(TAG)); if (i < length - 1) - tagBuilder.append(", "); + tagBuilder.append(separator); } } finally { tags.close(); diff --git a/astrid/src-legacy/com/timsu/astrid/data/tag/TagController.java b/astrid/src-legacy/com/timsu/astrid/data/tag/TagController.java index 9dcc64a62..dfecf35fc 100644 --- a/astrid/src-legacy/com/timsu/astrid/data/tag/TagController.java +++ b/astrid/src-legacy/com/timsu/astrid/data/tag/TagController.java @@ -34,7 +34,7 @@ import com.timsu.astrid.data.tag.AbstractTagModel.TagModelDatabaseHelper; import com.timsu.astrid.data.tag.TagToTaskMapping.TagToTaskMappingDatabaseHelper; import com.timsu.astrid.data.task.TaskIdentifier; import com.timsu.astrid.data.task.AbstractTaskModel.TaskModelDatabaseHelper; -import com.timsu.astrid.provider.TasksProvider; +import com.todoroo.astrid.provider.Astrid2TaskProvider; /** Controller for Tag-related operations */ @Deprecated @@ -253,7 +253,7 @@ public class TagController extends AbstractController { KEY_ROWID + " = " + tagId.idAsString(), null); // notify modification - TasksProvider.notifyDatabaseModification(); + Astrid2TaskProvider.notifyDatabaseModification(); return res > 0; } @@ -270,7 +270,7 @@ public class TagController extends AbstractController { new String[] { tagId.idAsString(), taskId.idAsString() }); // notify modification - TasksProvider.notifyDatabaseModification(); + Astrid2TaskProvider.notifyDatabaseModification(); return res > 0; } @@ -286,7 +286,7 @@ public class TagController extends AbstractController { values); // notify modification - TasksProvider.notifyDatabaseModification(); + Astrid2TaskProvider.notifyDatabaseModification(); return res >= 0; } diff --git a/astrid/src-legacy/com/timsu/astrid/data/task/TaskController.java b/astrid/src-legacy/com/timsu/astrid/data/task/TaskController.java index b46007060..0d40dd417 100644 --- a/astrid/src-legacy/com/timsu/astrid/data/task/TaskController.java +++ b/astrid/src-legacy/com/timsu/astrid/data/task/TaskController.java @@ -41,7 +41,7 @@ import com.timsu.astrid.data.alerts.AlertController; import com.timsu.astrid.data.sync.SyncDataController; import com.timsu.astrid.data.task.AbstractTaskModel.RepeatInfo; import com.timsu.astrid.data.task.AbstractTaskModel.TaskModelDatabaseHelper; -import com.timsu.astrid.provider.TasksProvider; +import com.todoroo.astrid.provider.Astrid2TaskProvider; import com.todoroo.astrid.widget.TasksWidget.UpdateService; /** @@ -235,7 +235,7 @@ public class TaskController extends AbstractController { cleanupTask(taskId, false); // notify modification - TasksProvider.notifyDatabaseModification(); + Astrid2TaskProvider.notifyDatabaseModification(); return database.delete(tasksTable, KEY_ROWID + "=" + id, null) > 0; } @@ -282,7 +282,7 @@ public class TaskController extends AbstractController { } // notify modification - TasksProvider.notifyDatabaseModification(); + Astrid2TaskProvider.notifyDatabaseModification(); return saveSucessful; } diff --git a/astrid/src-legacy/com/timsu/astrid/provider/TasksProvider.java b/astrid/src-legacy/com/timsu/astrid/provider/TasksProvider.java deleted file mode 100644 index d8ca37d32..000000000 --- a/astrid/src-legacy/com/timsu/astrid/provider/TasksProvider.java +++ /dev/null @@ -1,245 +0,0 @@ -package com.timsu.astrid.provider; - -import java.util.ArrayList; -import java.util.LinkedList; - -import android.content.ContentProvider; -import android.content.ContentValues; -import android.content.Context; -import android.content.UriMatcher; -import android.database.Cursor; -import android.database.MatrixCursor; -import android.net.Uri; -import android.util.Log; - -import com.timsu.astrid.data.tag.TagController; -import com.timsu.astrid.data.tag.TagIdentifier; -import com.timsu.astrid.data.tag.TagModelForView; -import com.timsu.astrid.data.task.TaskController; -import com.timsu.astrid.data.task.TaskModelForProvider; -import com.todoroo.astrid.service.AstridDependencyInjector; - -public class TasksProvider extends ContentProvider { - - static { - AstridDependencyInjector.initialize(); - } - - private static final String TAG = "MessageProvider"; - - private static final boolean LOGD = false; - - - public static final String AUTHORITY = "com.timsu.astrid.tasksprovider"; - - public static final Uri CONTENT_URI = Uri.parse("content://com.timsu.astrid.tasksprovider"); - - private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); - - private static final int MAX_NUMBEER_OF_TASKS = 30; - - private final static String NAME = "name"; - private final static String IMPORTANCE_COLOR = "importance_color"; - private final static String IDENTIFIER = "identifier"; - private final static String PREFERRED_DUE_DATE = "preferredDueDate"; - private final static String DEFINITE_DUE_DATE = "definiteDueDate"; - private final static String IMPORTANCE = "importance"; - private final static String ID = "id"; - - // fake property for updatu=ing that completes a task - private final static String COMPLETED = "completed"; - - private final static String TAGS_ID = "tags_id"; - - static String[] TASK_FIELD_LIST = new String[] { NAME, IMPORTANCE_COLOR, PREFERRED_DUE_DATE, DEFINITE_DUE_DATE, - IMPORTANCE, IDENTIFIER, TAGS_ID }; - - static String[] TAGS_FIELD_LIST = new String[] { ID, NAME }; - - private static final int URI_TASKS = 0; - private static final int URI_TAGS = 1; - - private static final String TAG_SEPARATOR = "|"; - - private static Context ctx = null; - - static { - URI_MATCHER.addURI(AUTHORITY, "tasks", URI_TASKS); - URI_MATCHER.addURI(AUTHORITY, "tags", URI_TAGS); - } - - @Override - public int delete(Uri uri, String selection, String[] selectionArgs) { - if (LOGD) - Log.d(TAG, "delete"); - - return 0; - } - - @Override - public String getType(Uri uri) { - return null; - } - - @Override - public Uri insert(Uri uri, ContentValues values) { - return null; - } - - @Override - public boolean onCreate() { - ctx = getContext(); - return false; - } - - public Cursor getTags() { - - LinkedList tags = null; - - TagController tagController = new TagController(ctx); - tagController.open(); - tags = tagController.getAllTags(); - tagController.close(); - - MatrixCursor ret = new MatrixCursor(TAGS_FIELD_LIST); - - for (int i = 0; i < tags.size(); i++) { - Object[] values = new Object[2]; - values[0] = tags.get(i).getTagIdentifier().getId(); - values[1] = tags.get(i).getName(); - - ret.addRow(values); - } - - return ret; - } - - public Cursor getTasks() { - - int numberOfTasks = MAX_NUMBEER_OF_TASKS; - - TaskController taskController = new TaskController(ctx); - taskController.open(); - ArrayList taskList = taskController.getTasksForProvider(Integer.toString(numberOfTasks)); - taskController.close(); - - MatrixCursor ret = new MatrixCursor(TASK_FIELD_LIST); - - for (int i = 0; i < taskList.size(); i++) { - TaskModelForProvider taskModel = taskList.get(i); - - if (taskModel != null) { - - // get prefered due date time - long preferredDueDateTime = 0; - if (taskModel.getPreferredDueDate() != null) - preferredDueDateTime = taskModel.getPreferredDueDate().getTime(); - - // get definite due date time - long definiteDueDate = 0; - if (taskModel.getDefiniteDueDate() != null) - definiteDueDate = taskModel.getDefiniteDueDate().getTime(); - - // get tags for task - LinkedList tags = null; - TagController tagController = new TagController(ctx); - tagController.open(); - tags = tagController.getTaskTags(taskModel.getTaskIdentifier()); - String taskTags = ""; - for (TagIdentifier tag : tags) { - if (taskTags.equals("")) - taskTags = Long.toString(tag.getId()); - else - taskTags = taskTags + TAG_SEPARATOR + Long.toString(tag.getId()); - } - tagController.close(); - - Object[] values = new Object[7]; - values[0] = taskModel.getName(); - values[1] = ctx.getResources().getColor(taskModel.getImportance().getColorResource()); - values[2] = preferredDueDateTime; - values[3] = definiteDueDate; - values[4] = taskModel.getImportance().ordinal(); - values[5] = taskModel.getTaskIdentifier().getId(); - values[6] = taskTags; - - ret.addRow(values); - - } - } - - return ret; - } - - @Override - public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { - - if (LOGD) - Log.d(TAG, "query"); - - Cursor cursor; - switch (URI_MATCHER.match(uri)) { - - case URI_TASKS: - cursor = getTasks(); - break; - - case URI_TAGS: - cursor = getTags(); - break; - - default: - throw new IllegalStateException("Unrecognized URI:" + uri); - } - - return cursor; - } - - @Override - public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { - - if (LOGD) - Log.d(TAG, "update"); - - switch (URI_MATCHER.match(uri)) { - - case URI_TASKS: - int updated = 0; - - // handle the "completed" value separately - if(values.containsKey(COMPLETED)) { - boolean completed = values.getAsBoolean(COMPLETED); - values.remove(COMPLETED); - values.put(TaskModelForProvider.PROGRESS_PERCENTAGE, - completed ? TaskModelForProvider.COMPLETE_PERCENTAGE : 0); - } - - TaskController taskController = new TaskController(ctx); - taskController.open(); - Cursor c = taskController.getMatchingTasksForProvider(selection, selectionArgs); - for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { - TaskModelForProvider model = new TaskModelForProvider(c); - model.update(values); - taskController.saveTask(model, false); - updated++; - } - taskController.close(); - return updated; - - case URI_TAGS: - throw new UnsupportedOperationException("tags updating: not yet"); - - default: - throw new IllegalStateException("Unrecognized URI:" + uri); - } - } - - public static void notifyDatabaseModification() { - - if (LOGD) - Log.d(TAG, "notifyDatabaseModification"); - - ctx.getContentResolver().notifyChange(CONTENT_URI, null); - } - -} diff --git a/astrid/src/com/todoroo/astrid/provider/Astrid2TaskProvider.java b/astrid/src/com/todoroo/astrid/provider/Astrid2TaskProvider.java new file mode 100644 index 000000000..b8e528348 --- /dev/null +++ b/astrid/src/com/todoroo/astrid/provider/Astrid2TaskProvider.java @@ -0,0 +1,284 @@ +package com.todoroo.astrid.provider; + +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.content.Context; +import android.content.UriMatcher; +import android.database.Cursor; +import android.database.MatrixCursor; +import android.net.Uri; +import android.util.Log; + +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.sql.Query; +import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.dao.TaskDao.TaskCriteria; +import com.todoroo.astrid.model.Metadata; +import com.todoroo.astrid.model.Task; +import com.todoroo.astrid.service.AstridDependencyInjector; +import com.todoroo.astrid.service.TaskService; +import com.todoroo.astrid.tags.TagService; +import com.todoroo.astrid.tags.TagService.Tag; + +/** + * This is the legacy Astrid task provider. While it will continue to be + * supported, note that it does not expose all of the information in + * Astrid, nor does it support many editing operations. + * + * See the individual methods for a description of what is returned. + * + * @author Tim Su + * + */ +@SuppressWarnings("nls") +public class Astrid2TaskProvider extends ContentProvider { + + static { + AstridDependencyInjector.initialize(); + } + + private static final String TAG = "MessageProvider"; + + private static final boolean LOGD = false; + + + public static final String AUTHORITY = "com.timsu.astrid.tasksprovider"; + + public static final Uri CONTENT_URI = Uri.parse("content://com.timsu.astrid.tasksprovider"); + + private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); + + private static final int MAX_NUMBER_OF_TASKS = 30; + + private final static String NAME = "name"; + private final static String IMPORTANCE_COLOR = "importance_color"; + private final static String IDENTIFIER = "identifier"; + private final static String PREFERRED_DUE_DATE = "preferredDueDate"; + private final static String DEFINITE_DUE_DATE = "definiteDueDate"; + private final static String IMPORTANCE = "importance"; + private final static String ID = "id"; + + // fake property for updating that completes a task + private final static String COMPLETED = "completed"; + + private final static String TAGS_ID = "tags_id"; + + static String[] TASK_FIELD_LIST = new String[] { NAME, IMPORTANCE_COLOR, PREFERRED_DUE_DATE, DEFINITE_DUE_DATE, + IMPORTANCE, IDENTIFIER, TAGS_ID }; + + static String[] TAGS_FIELD_LIST = new String[] { ID, NAME }; + + private static final int URI_TASKS = 0; + private static final int URI_TAGS = 1; + + private static final String TAG_SEPARATOR = "|"; + + @Autowired + private TaskService taskService; + + private static Context ctx = null; + + static { + URI_MATCHER.addURI(AUTHORITY, "tasks", URI_TASKS); + URI_MATCHER.addURI(AUTHORITY, "tags", URI_TAGS); + + AstridDependencyInjector.initialize(); + } + + public Astrid2TaskProvider() { + DependencyInjectionService.getInstance().inject(this); + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + if (LOGD) + Log.d(TAG, "delete"); + + return 0; + } + + @Override + public String getType(Uri uri) { + return null; + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + return null; + } + + @Override + public boolean onCreate() { + ctx = getContext(); + return false; + } + + /** + * Note: tag id is no longer a real column, so we pass in a UID + * generated from the tag string. + * + * @return two-column cursor: tag id (string) and tag name + */ + public Cursor getTags() { + + Tag[] tags = TagService.getInstance().getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE); + + MatrixCursor ret = new MatrixCursor(TAGS_FIELD_LIST); + + for (int i = 0; i < tags.length; i++) { + Object[] values = new Object[2]; + values[0] = tagNameToLong(tags[i].tag); + values[1] = tags[i].tag; + + ret.addRow(values); + } + + return ret; + } + + private long tagNameToLong(String tag) { + MessageDigest m; + try { + m = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + return -1; + } + + m.update(tag.getBytes(), 0, tag.length()); + return new BigInteger(1, m.digest()).longValue(); + } + + /** + * Cursor with the following columns + *
    + *
  1. task title, string + *
  2. task importance color, int android RGB color + *
  3. task due date (was: preferred due date), long millis since epoch + *
  4. task due date (was: absolute due date), long millis since epoch + *
  5. task importance, integer from 0 to 3 (0 => most important) + *
  6. task id, long + *
  7. task tags, string tags separated by | + *
+ * + * @return cursor as described above + */ + public Cursor getTasks() { + + MatrixCursor ret = new MatrixCursor(TASK_FIELD_LIST); + + TodorooCursor cursor = taskService.query(Query.select(Task.ID, Task.TITLE, + Task.IMPORTANCE, Task.DUE_DATE).where(TaskCriteria.isActive()). + orderBy(TaskService.defaultTaskOrder()).limit(MAX_NUMBER_OF_TASKS)); + + int[] importanceColors = Task.getImportanceColors(ctx.getResources()); + + Task task = new Task(); + for (int i = 0; i < cursor.getCount(); i++) { + cursor.moveToNext(); + task.readFromCursor(cursor); + + StringBuilder taskTags = new StringBuilder(); + TodorooCursor tagCursor = TagService.getInstance().getTags(task.getId()); + try { + for(tagCursor.moveToFirst(); !tagCursor.isAfterLast(); tagCursor.moveToNext()) + taskTags.append(tagCursor.get(TagService.TAG)).append(TAG_SEPARATOR); + } finally { + tagCursor.close(); + } + + Object[] values = new Object[7]; + values[0] = task.getValue(Task.TITLE); + values[1] = importanceColors[task.getValue(Task.IMPORTANCE)]; + values[2] = task.getValue(Task.DUE_DATE); + values[3] = task.getValue(Task.DUE_DATE); + values[4] = task.getValue(Task.IMPORTANCE); + values[5] = task.getId(); + values[6] = taskTags.toString(); + + ret.addRow(values); + } + + return ret; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { + + if (LOGD) + Log.d(TAG, "query"); + + Cursor cursor; + switch (URI_MATCHER.match(uri)) { + + case URI_TASKS: + cursor = getTasks(); + break; + + case URI_TAGS: + cursor = getTags(); + break; + + default: + throw new IllegalStateException("Unrecognized URI:" + uri); + } + + return cursor; + } + + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + + if (LOGD) + Log.d(TAG, "update"); + + switch (URI_MATCHER.match(uri)) { + + case URI_TASKS: + Task task = new Task(); + + // map values + if(values.containsKey(NAME)) + task.setValue(Task.TITLE, values.getAsString(NAME)); + if(values.containsKey(PREFERRED_DUE_DATE)) + task.setValue(Task.DUE_DATE, values.getAsLong(PREFERRED_DUE_DATE)); + if(values.containsKey(DEFINITE_DUE_DATE)) + task.setValue(Task.DUE_DATE, values.getAsLong(DEFINITE_DUE_DATE)); + if(values.containsKey(IMPORTANCE)) + task.setValue(Task.IMPORTANCE, values.getAsInteger(IMPORTANCE)); + if(values.containsKey(COMPLETED)) + task.setValue(Task.COMPLETION_DATE, + values.getAsBoolean(COMPLETED) ? DateUtilities.now() : 0); + + // map selection criteria + String criteria = selection.replace(NAME, Task.TITLE.name). + replace(PREFERRED_DUE_DATE, Task.DUE_DATE.name). + replace(DEFINITE_DUE_DATE, Task.DUE_DATE.name). + replace(IDENTIFIER, Task.ID.name). + replace(ID, Task.ID.name). + replace(IMPORTANCE, Task.IMPORTANCE.name); + + return taskService.updateBySelection(criteria, selectionArgs, task); + + case URI_TAGS: + throw new UnsupportedOperationException("tags updating: not yet"); + + default: + throw new IllegalStateException("Unrecognized URI:" + uri); + } + } + + public static void notifyDatabaseModification() { + + if (LOGD) + Log.d(TAG, "notifyDatabaseModification"); + + ctx.getContentResolver().notifyChange(CONTENT_URI, null); + } + +} diff --git a/astrid/src/com/todoroo/astrid/service/TaskService.java b/astrid/src/com/todoroo/astrid/service/TaskService.java index deb9ca370..1bdd7ae89 100644 --- a/astrid/src/com/todoroo/astrid/service/TaskService.java +++ b/astrid/src/com/todoroo/astrid/service/TaskService.java @@ -11,8 +11,8 @@ import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.dao.MetadataDao; -import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.TaskDao; +import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Task; @@ -207,6 +207,27 @@ public class TaskService { } } + /** + * Update database based on selection and values + * @param selection + * @param selectionArgs + * @param setValues + * @return + */ + public int updateBySelection(String selection, String[] selectionArgs, + Task taskValues) { + TodorooCursor cursor = taskDao.rawQuery(selection, selectionArgs, Task.ID); + try { + for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { + taskValues.setValue(Task.ID, cursor.get(Task.ID)); + taskDao.save(taskValues, false); + } + return cursor.getCount(); + } finally { + cursor.close(); + } + } + } diff --git a/tests/src/com/todoroo/astrid/legacy/data/tag/TagController.java b/tests/src/com/todoroo/astrid/legacy/data/tag/TagController.java index 24433ea82..1db76e266 100644 --- a/tests/src/com/todoroo/astrid/legacy/data/tag/TagController.java +++ b/tests/src/com/todoroo/astrid/legacy/data/tag/TagController.java @@ -29,12 +29,12 @@ import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; -import com.timsu.astrid.provider.TasksProvider; import com.todoroo.astrid.legacy.data.AbstractController; import com.todoroo.astrid.legacy.data.tag.AbstractTagModel.TagModelDatabaseHelper; import com.todoroo.astrid.legacy.data.tag.TagToTaskMapping.TagToTaskMappingDatabaseHelper; import com.todoroo.astrid.legacy.data.task.TaskIdentifier; import com.todoroo.astrid.legacy.data.task.AbstractTaskModel.TaskModelDatabaseHelper; +import com.todoroo.astrid.provider.Astrid2TaskProvider; /** Controller for Tag-related operations */ public class TagController extends AbstractController { @@ -266,7 +266,7 @@ public class TagController extends AbstractController { new String[] { tagId.idAsString(), taskId.idAsString() }); // notify modification - TasksProvider.notifyDatabaseModification(); + Astrid2TaskProvider.notifyDatabaseModification(); return res > 0; }