diff --git a/api-src/com/todoroo/astrid/api/AstridContentProvider.java b/api-src/com/todoroo/astrid/api/AstridContentProvider.java
index 8e581258a..e975c018a 100644
--- a/api-src/com/todoroo/astrid/api/AstridContentProvider.java
+++ b/api-src/com/todoroo/astrid/api/AstridContentProvider.java
@@ -141,11 +141,13 @@ public class AstridContentProvider {
/** int: unixtime Task was completed, 0 if task not completed */
public static final String COMPLETION_DATE = AstridApiConstants.TASK_TABLE
+ ".completionDate";
-
+
/** int: unixtime Task was deleted, 0 if task not deleted */
public static final String DELETION_DATE = AstridApiConstants.TASK_TABLE
+ ".deletionDate";
+ public static final String MODIFICATION_DATE = null;
+
// --- urgency settings
public static final int URGENCY_NONE = 0;
@@ -165,6 +167,7 @@ public class AstridContentProvider {
public static final int IMPORTANCE_SHOULD_DO = 2;
public static final int IMPORTANCE_NONE = 3;
+
}
// --- internal methods
diff --git a/external-src/com/thoughtworks/sql/Table.java b/external-src/com/thoughtworks/sql/Table.java
index 54bff107f..73a9c6087 100644
--- a/external-src/com/thoughtworks/sql/Table.java
+++ b/external-src/com/thoughtworks/sql/Table.java
@@ -11,10 +11,10 @@ public class Table extends DBObject
{
}
@SuppressWarnings("nls")
- public Field field(String fieldName) {
+ protected String fieldExpression(String fieldName) {
if (hasAlias()) {
- return Field.field(alias + "." + fieldName);
+ return alias + "." + fieldName;
}
- return Field.field(expression+"."+fieldName);
+ return expression+"."+fieldName;
}
}
diff --git a/src/com/todoroo/astrid/dao/MetadataDao.java b/src/com/todoroo/astrid/dao/MetadataDao.java
index 7d322d1c4..f244176f7 100644
--- a/src/com/todoroo/astrid/dao/MetadataDao.java
+++ b/src/com/todoroo/astrid/dao/MetadataDao.java
@@ -6,12 +6,14 @@
package com.todoroo.astrid.dao;
import android.database.Cursor;
-import android.database.DatabaseUtils;
-import com.todoroo.android.data.AbstractDao;
-import com.todoroo.android.data.AbstractDatabase;
-import com.todoroo.android.data.Property;
-import com.todoroo.android.data.TodorooCursor;
+import com.thoughtworks.sql.Criterion;
+import com.thoughtworks.sql.Join;
+import com.thoughtworks.sql.Query;
+import com.todoroo.andlib.data.AbstractDao;
+import com.todoroo.andlib.data.AbstractDatabase;
+import com.todoroo.andlib.data.Property;
+import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.model.Task;
@@ -32,18 +34,16 @@ public class MetadataDao extends AbstractDao {
/**
* Generates SQL clauses
*/
- public static class MetadataSql {
+ public static class MetadataCriteria {
/** Returns all metadata associated with a given task */
- public static String byTask(long taskId) {
- return String.format("(%s = %d)", Metadata.TASK, //$NON-NLS-1$
- taskId);
+ public static Criterion byTask(long taskId) {
+ return Metadata.TASK.eq(taskId);
}
/** Returns all metadata associated with a given key */
- public static String withKey(String key) {
- return String.format("(%s = %s)", Metadata.KEY, //$NON-NLS-1$
- DatabaseUtils.sqlEscapeString(key));
+ public static Criterion withKey(String key) {
+ return Metadata.KEY.eq(key);
}
}
@@ -54,8 +54,9 @@ public class MetadataDao extends AbstractDao {
* @param where
* @return # of deleted items
*/
- public int deleteWhere(AbstractDatabase database, String where) {
- return database.getDatabase().delete(Database.METADATA_TABLE, where, null);
+ public int deleteWhere(AbstractDatabase database, Criterion where) {
+ return database.getDatabase().delete(Metadata.TABLE.getName(),
+ where.toString(), null);
}
/**
@@ -65,13 +66,9 @@ public class MetadataDao extends AbstractDao {
* @return
*/
public TodorooCursor fetchDangling(AbstractDatabase database, Property>[] properties) {
- String sql = String.format("SELECT %s FROM %s LEFT JOIN %s ON %s.%s = %s.%s WHERE %s.%s ISNULL", //$NON-NLS-1$
- propertiesForSelect(properties, true),
- Database.METADATA_TABLE, Database.TASK_TABLE,
- Database.METADATA_TABLE, Metadata.TASK, Database.TASK_TABLE,
- Task.ID,
- Database.TASK_TABLE, Task.TITLE);
- Cursor cursor = database.getDatabase().rawQuery(sql, null);
+ Query sql = Query.select(properties).from(Metadata.TABLE).join(Join.left(Task.TABLE,
+ Metadata.TASK.eq(Task.ID))).where(Task.TITLE.isNull());
+ Cursor cursor = database.getDatabase().rawQuery(sql.toString(), null);
return new TodorooCursor(cursor);
}
diff --git a/src/com/todoroo/astrid/dao/TaskDao.java b/src/com/todoroo/astrid/dao/TaskDao.java
index 6d2f7a804..a6e719d09 100644
--- a/src/com/todoroo/astrid/dao/TaskDao.java
+++ b/src/com/todoroo/astrid/dao/TaskDao.java
@@ -8,19 +8,16 @@ package com.todoroo.astrid.dao;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
-import android.database.Cursor;
+import com.thoughtworks.sql.Criterion;
import com.todoroo.andlib.data.AbstractDao;
import com.todoroo.andlib.data.AbstractDatabase;
-import com.todoroo.andlib.data.Property;
-import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.AstridApiConstants;
-import com.todoroo.astrid.api.Filter;
-import com.todoroo.astrid.dao.MetadataDao.MetadataSql;
+import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.model.Task;
/**
@@ -44,76 +41,48 @@ public class TaskDao extends AbstractDao {
/**
* Generates SQL clauses
*/
- public static class TaskSql {
+ public static class TaskCriteria {
/** Returns tasks by id */
- public static String byId(long id) {
- return String.format("(%s = %d)", Task.ID, //$NON-NLS-1$
- id);
+ public static Criterion byId(long id) {
+ return Task.ID.eq(id);
}
/** Return tasks that have not yet been completed */
- public static String isActive() {
- return String.format("(%s = 0 AND %s = 0)", Task.COMPLETION_DATE, //$NON-NLS-1$
- Task.DELETION_DATE);
+ public static Criterion isActive() {
+ return Criterion.and(Task.COMPLETION_DATE.eq(0),
+ Task.DELETION_DATE.eq(0));
}
/** Return tasks that are not hidden at given unixtime */
- public static String isVisible(int time) {
- return String.format("(%s < %d)", Task.HIDDEN_UNTIL, time); //$NON-NLS-1$
+ public static Criterion isVisible(int time) {
+ return Task.HIDDEN_UNTIL.lt(time);
}
/** Returns tasks that have a due date */
- public static String hasDeadlines() {
- return String.format("(%s != 0)", Task.DUE_DATE); //$NON-NLS-1$
+ public static Criterion hasDeadlines() {
+ return Task.DUE_DATE.neq(0);
}
/** Returns tasks that are due before a certain unixtime */
- public static String dueBefore(int time) {
- return String.format("(%s > 0 AND %s <= %d)", Task.DUE_DATE, //$NON-NLS-1$
- Task.DUE_DATE, time);
+ public static Criterion dueBefore(int time) {
+ return Criterion.and(Task.DUE_DATE.gt(0), Task.DUE_DATE.lt(time));
}
/** Returns tasks that are due after a certain unixtime */
- public static String dueAfter(int time) {
- return String.format("(%s > %d)", Task.DUE_DATE, time); //$NON-NLS-1$
+ public static Criterion dueAfter(int time) {
+ return Task.DUE_DATE.gt(time);
}
/** Returns tasks completed before a given unixtime */
- public static String completedBefore(int time) {
- return String.format("(%s > 0 AND %s < %d)", Task.COMPLETION_DATE, //$NON-NLS-1$
- Task.COMPLETION_DATE, time);
+ public static Criterion completedBefore(int time) {
+ return Criterion.and(Task.COMPLETION_DATE.gt(0), Task.COMPLETION_DATE.lt(time));
}
- public static String hasNoName() {
- return String.format("(%s = \"\")", Task.TITLE); //$NON-NLS-1$
- }
-
}
// --- custom operations
- /**
- * Return cursor to all tasks matched by given filter
- *
- * @param database
- * @param properties
- * properties to read from task
- * @param filter
- * {@link Filter} object to use
- * @return
- */
- public TodorooCursor fetch(Database database, Property>[] properties,
- Filter filter) {
-
- String query = String.format(
- "SELECT %s FROM %s %s ", //$NON-NLS-1$
- propertiesForSelect(properties, true),
- Database.TASK_TABLE,
- filter.sqlQuery);
- Cursor cursor = database.getDatabase().rawQuery(query, null);
- return new TodorooCursor(cursor);
- }
// --- delete
@@ -131,7 +100,7 @@ public class TaskDao extends AbstractDao {
return false;
// delete all metadata
- metadataDao.deleteWhere(database, MetadataSql.byTask(id));
+ metadataDao.deleteWhere(database, MetadataCriteria.byTask(id));
return true;
}
@@ -149,22 +118,16 @@ public class TaskDao extends AbstractDao {
if (task.getId() == Task.NO_ID) {
task.setValue(Task.CREATION_DATE, DateUtilities.now());
- saveSuccessful = createItem(database, Database.TASK_TABLE, task);
-
- Context context = ContextManager.getContext();
- Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_EVENT_TASK_CREATED);
- broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, task.getId());
- context.sendOrderedBroadcast(broadcastIntent, null);
+ task.setValue(Task.MODIFICATION_DATE, DateUtilities.now());
+ saveSuccessful = createItem(database, Task.TABLE, task);
} else {
ContentValues values = task.getSetValues();
-
- if(values.size() == 0) // nothing changed
+ if(values.size() == 0)
return true;
-
+ task.setValue(Task.MODIFICATION_DATE, DateUtilities.now());
beforeSave(database, task, values, duringSync);
- saveSuccessful = saveItem(database, Database.TASK_TABLE, task);
+ saveSuccessful = saveItem(database, Task.TABLE, task);
afterSave(database, task, values, duringSync);
-
}
return saveSuccessful;
diff --git a/src/com/todoroo/astrid/model/Task.java b/src/com/todoroo/astrid/model/Task.java
index 824909d6e..009d6d20a 100644
--- a/src/com/todoroo/astrid/model/Task.java
+++ b/src/com/todoroo/astrid/model/Task.java
@@ -61,6 +61,10 @@ public class Task extends AbstractModel {
public static final IntegerProperty CREATION_DATE = new IntegerProperty(
TABLE, AstridTask.CREATION_DATE);
+ /** Unixtime Task was last touched */
+ public static final IntegerProperty MODIFICATION_DATE = new IntegerProperty(
+ TABLE, AstridTask.MODIFICATION_DATE);
+
/** Unixtime Task was completed. 0 means active */
public static final IntegerProperty COMPLETION_DATE = new IntegerProperty(
TABLE, AstridTask.COMPLETION_DATE);
diff --git a/src/com/todoroo/astrid/service/TaskService.java b/src/com/todoroo/astrid/service/TaskService.java
index 14a299c37..694ea5775 100644
--- a/src/com/todoroo/astrid/service/TaskService.java
+++ b/src/com/todoroo/astrid/service/TaskService.java
@@ -1,14 +1,13 @@
package com.todoroo.astrid.service;
-import com.todoroo.android.data.Property;
-import com.todoroo.android.data.TodorooCursor;
-import com.todoroo.android.service.Autowired;
-import com.todoroo.android.service.DependencyInjectionService;
-import com.todoroo.android.utility.DateUtilities;
+import com.todoroo.andlib.data.Property;
+import com.todoroo.andlib.data.TodorooCursor;
+import com.todoroo.andlib.service.Autowired;
+import com.todoroo.andlib.service.DependencyInjectionService;
+import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.TaskDao;
-import com.todoroo.astrid.dao.TaskDao.TaskSql;
import com.todoroo.astrid.model.Task;
/**