diff --git a/api/src/com/todoroo/andlib/data/DatabaseDao.java b/api/src/com/todoroo/andlib/data/DatabaseDao.java index d49b3f58b..3928dc89f 100644 --- a/api/src/com/todoroo/andlib/data/DatabaseDao.java +++ b/api/src/com/todoroo/andlib/data/DatabaseDao.java @@ -41,7 +41,7 @@ public class DatabaseDao { private Table table; - private Table outstandingTable; + protected Table outstandingTable; private AbstractDatabase database; @@ -239,9 +239,13 @@ public class DatabaseDao { public boolean makeChange(); } - private boolean insertOrUpdateAndRecordChanges(TYPE item, ContentValues values, DatabaseChangeOp op) { - boolean recordOutstanding = (outstandingTable != null) && + protected boolean shouldRecordOutstanding(TYPE item) { + return (outstandingTable != null) && !item.checkAndClearTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES); + } + + private boolean insertOrUpdateAndRecordChanges(TYPE item, ContentValues values, DatabaseChangeOp op) { + boolean recordOutstanding = shouldRecordOutstanding(item); final AtomicBoolean result = new AtomicBoolean(false); if (recordOutstanding) { // begin transaction @@ -322,7 +326,7 @@ public class DatabaseDao { return insertOrUpdateAndRecordChanges(item, values, update); } - private boolean createOutstandingEntries(long modelId, ContentValues modelSetValues) { + protected boolean createOutstandingEntries(long modelId, ContentValues modelSetValues) { Set> entries = modelSetValues.valueSet(); long now = DateUtilities.now(); for (Entry entry : entries) { diff --git a/api/src/com/todoroo/astrid/data/Metadata.java b/api/src/com/todoroo/astrid/data/Metadata.java index faf5db7ad..0ef33eec8 100644 --- a/api/src/com/todoroo/astrid/data/Metadata.java +++ b/api/src/com/todoroo/astrid/data/Metadata.java @@ -31,6 +31,9 @@ public class Metadata extends AbstractModel { /** table for this model */ public static final Table TABLE = new Table("metadata", Metadata.class); + /** changes to metadata (specifically tags) are recorded in the task outstanding table */ + public static final Class> OUTSTANDING_MODEL = TaskOutstanding.class; + /** content uri for this model */ public static final Uri CONTENT_URI = Uri.parse("content://" + AstridApiConstants.API_PACKAGE + "/" + TABLE.name); diff --git a/api/src/com/todoroo/astrid/data/RemoteModel.java b/api/src/com/todoroo/astrid/data/RemoteModel.java index 3cec18f6a..d7cef3668 100644 --- a/api/src/com/todoroo/astrid/data/RemoteModel.java +++ b/api/src/com/todoroo/astrid/data/RemoteModel.java @@ -5,6 +5,8 @@ */ package com.todoroo.astrid.data; +import android.text.TextUtils; + import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.Property.LongProperty; import com.todoroo.andlib.data.Property.StringProperty; @@ -65,4 +67,8 @@ abstract public class RemoteModel extends AbstractModel { else return NO_UUID; } + + public static boolean isUuidEmpty(String uuid) { + return NO_UUID.equals(uuid) || TextUtils.isEmpty(uuid); + } } diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/NameMaps.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/NameMaps.java index 75cbc98c4..1c326c868 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/NameMaps.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/NameMaps.java @@ -103,6 +103,9 @@ public class NameMaps { TASK_PROPERTIES_SERVER_TO_LOCAL = AndroidUtilities.reverseMap(TASK_PROPERTIES_LOCAL_TO_SERVER); } + public static final String TAG_ADDED_COLUMN = "tag_added"; + public static final String TAG_REMOVED_COLUMN = "tag_removed"; + private static final Map, String> TAG_DATA_PROPERTIES_LOCAL_TO_SERVER; private static final Map> TAG_DATA_COLUMN_NAMES_TO_PROPERTIES; diff --git a/astrid/src/com/todoroo/astrid/dao/MetadataDao.java b/astrid/src/com/todoroo/astrid/dao/MetadataDao.java index 620bf8315..18a01cd95 100644 --- a/astrid/src/com/todoroo/astrid/dao/MetadataDao.java +++ b/astrid/src/com/todoroo/astrid/dao/MetadataDao.java @@ -5,8 +5,10 @@ */ package com.todoroo.astrid.dao; +import android.content.ContentValues; import android.database.Cursor; +import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.DatabaseDao; import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.TodorooCursor; @@ -17,8 +19,12 @@ import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.Preferences; +import com.todoroo.astrid.actfm.sync.messages.NameMaps; import com.todoroo.astrid.data.Metadata; +import com.todoroo.astrid.data.OutstandingEntry; +import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.data.TaskOutstanding; import com.todoroo.astrid.provider.Astrid2TaskProvider; import com.todoroo.astrid.service.StatisticsConstants; import com.todoroo.astrid.service.StatisticsService; @@ -67,6 +73,38 @@ public class MetadataDao extends DatabaseDao { } + @Override + protected boolean shouldRecordOutstanding(Metadata item) { + ContentValues cv = item.getSetValues(); + return super.shouldRecordOutstanding(item) && cv != null && + ((cv.containsKey(Metadata.KEY.name) && + TagMetadata.KEY.equals(item.getValue(Metadata.KEY))) || + (cv.containsKey(Metadata.DELETION_DATE.name) && + item.getValue(Metadata.DELETION_DATE) > 0)); + } + + @Override + protected boolean createOutstandingEntries(long modelId, ContentValues modelSetValues) { + Long taskId = modelSetValues.getAsLong(Metadata.TASK.name); + String tagUuid = modelSetValues.getAsString(TagMetadata.TAG_UUID.name); + Long deletionDate = modelSetValues.getAsLong(Metadata.DELETION_DATE.name); + if (taskId == null || taskId == AbstractModel.NO_ID || deletionDate == null || RemoteModel.isUuidEmpty(tagUuid)) + return false; + + TaskOutstanding m = new TaskOutstanding(); + m.setValue(OutstandingEntry.ENTITY_ID_PROPERTY, taskId); + m.setValue(OutstandingEntry.CREATED_AT_PROPERTY, DateUtilities.now()); + + String addedOrRemoved = NameMaps.TAG_ADDED_COLUMN; + if (deletionDate > 0) + addedOrRemoved = NameMaps.TAG_REMOVED_COLUMN; + + m.setValue(OutstandingEntry.COLUMN_STRING_PROPERTY, addedOrRemoved); + m.setValue(OutstandingEntry.VALUE_STRING_PROPERTY, tagUuid); + database.insert(outstandingTable.name, null, m.getSetValues()); + return true; + } + @Override public boolean persist(Metadata item) { if(!item.containsValue(Metadata.CREATION_DATE))