diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java index 7a526a115..368e379ef 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java @@ -65,8 +65,10 @@ import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.actfm.sync.ActFmServiceException; import com.todoroo.astrid.actfm.sync.ActFmSyncMonitor; import com.todoroo.astrid.actfm.sync.messages.ConstructOutstandingTableFromMasterTable; +import com.todoroo.astrid.actfm.sync.messages.ConstructTaskOutstandingTableFromMasterTable; import com.todoroo.astrid.actfm.sync.messages.NameMaps; import com.todoroo.astrid.activity.Eula; +import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.TagDataDao; import com.todoroo.astrid.dao.TagOutstandingDao; import com.todoroo.astrid.dao.TaskDao; @@ -80,7 +82,6 @@ import com.todoroo.astrid.data.TagOutstanding; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.TaskListMetadata; import com.todoroo.astrid.data.TaskListMetadataOutstanding; -import com.todoroo.astrid.data.TaskOutstanding; import com.todoroo.astrid.data.UserActivity; import com.todoroo.astrid.data.UserActivityOutstanding; import com.todoroo.astrid.gtasks.auth.ModernAuthManager; @@ -124,6 +125,8 @@ public class ActFmLoginActivity extends FragmentActivity implements AuthListener private TaskListMetadataDao taskListMetadataDao; @Autowired private TaskListMetadataOutstandingDao taskListMetadataOutstandingDao; + @Autowired + private MetadataDao metadataDao; @@ -566,7 +569,7 @@ public class ActFmLoginActivity extends FragmentActivity implements AuthListener } // Successful login, create outstanding entries if (!TextUtils.isEmpty(token)) { - new ConstructOutstandingTableFromMasterTable(NameMaps.TABLE_ID_TASKS, taskDao, taskOutstandingDao, Task.CREATION_DATE).execute(); + new ConstructTaskOutstandingTableFromMasterTable(NameMaps.TABLE_ID_TASKS, taskDao, taskOutstandingDao, metadataDao, Task.CREATION_DATE).execute(); new ConstructOutstandingTableFromMasterTable(NameMaps.TABLE_ID_TAGS, tagDataDao, tagOutstandingDao, TagData.CREATION_DATE).execute(); new ConstructOutstandingTableFromMasterTable(NameMaps.TABLE_ID_USER_ACTIVITY, userActivityDao, userActivityOutstandingDao, UserActivity.CREATED_AT).execute(); new ConstructOutstandingTableFromMasterTable(NameMaps.TABLE_ID_TASK_LIST_METADATA, taskListMetadataDao, taskListMetadataOutstandingDao, null).execute(); diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/ConstructOutstandingTableFromMasterTable.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/ConstructOutstandingTableFromMasterTable.java index fcdf9f2ea..e6567a466 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/ConstructOutstandingTableFromMasterTable.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/ConstructOutstandingTableFromMasterTable.java @@ -17,10 +17,10 @@ import com.todoroo.astrid.data.RemoteModel; @SuppressWarnings("nls") public class ConstructOutstandingTableFromMasterTable> { - private final String table; - private final RemoteModelDao dao; - private final OutstandingEntryDao outstandingDao; - private final LongProperty createdAtProperty; + protected final String table; + protected final RemoteModelDao dao; + protected final OutstandingEntryDao outstandingDao; + protected final LongProperty createdAtProperty; public ConstructOutstandingTableFromMasterTable(String table, RemoteModelDao dao, OutstandingEntryDao outstandingDao, LongProperty createdAtProperty) { @@ -30,24 +30,31 @@ public class ConstructOutstandingTableFromMasterTable[] syncableProperties = NameMaps.syncableProperties(table); TodorooCursor items = dao.query(Query.select(AndroidUtilities.addToArray(syncableProperties, AbstractModel.ID_PROPERTY, RemoteModel.UUID_PROPERTY))); try { OE oe = outstandingDao.getModelClass().newInstance(); for (items.moveToFirst(); !items.isAfterLast(); items.moveToNext()) { + long createdAt; + if (createdAtProperty != null) + createdAt = items.get(createdAtProperty); + else + createdAt = DateUtilities.now(); long itemId = items.get(AbstractModel.ID_PROPERTY); for (Property p : syncableProperties) { oe.clear(); oe.setValue(OutstandingEntry.ENTITY_ID_PROPERTY, itemId); oe.setValue(OutstandingEntry.COLUMN_STRING_PROPERTY, p.name); oe.setValue(OutstandingEntry.VALUE_STRING_PROPERTY, items.get(p).toString()); - if (createdAtProperty != null) - oe.setValue(OutstandingEntry.CREATED_AT_PROPERTY, items.get(createdAtProperty)); - else - oe.setValue(OutstandingEntry.CREATED_AT_PROPERTY, DateUtilities.now()); + oe.setValue(OutstandingEntry.CREATED_AT_PROPERTY, createdAt); outstandingDao.createNew(oe); } + extras(itemId, createdAt); } } catch (IllegalAccessException e) { Log.e("ConstructOutstanding", "Error instantiating outstanding model class", e); diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/ConstructTaskOutstandingTableFromMasterTable.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/ConstructTaskOutstandingTableFromMasterTable.java new file mode 100644 index 000000000..91c5d1e09 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/ConstructTaskOutstandingTableFromMasterTable.java @@ -0,0 +1,48 @@ +package com.todoroo.astrid.actfm.sync.messages; + +import com.todoroo.andlib.data.Property.LongProperty; +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Query; +import com.todoroo.astrid.dao.MetadataDao; +import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; +import com.todoroo.astrid.dao.OutstandingEntryDao; +import com.todoroo.astrid.dao.RemoteModelDao; +import com.todoroo.astrid.data.Metadata; +import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.data.TaskOutstanding; +import com.todoroo.astrid.tags.TaskToTagMetadata; + +public class ConstructTaskOutstandingTableFromMasterTable extends ConstructOutstandingTableFromMasterTable { + + private final MetadataDao metadataDao; + + public ConstructTaskOutstandingTableFromMasterTable(String table, RemoteModelDao dao, OutstandingEntryDao outstandingDao, MetadataDao metadataDao, LongProperty createdAtProperty) { + super(table, dao, outstandingDao, createdAtProperty); + this.metadataDao = metadataDao; + } + + @Override + protected void extras(long itemId, long createdAt) { + super.extras(itemId, createdAt); + TodorooCursor tagMetadata = metadataDao.query(Query.select(Metadata.PROPERTIES) + .where(Criterion.and(MetadataCriteria.byTaskAndwithKey(itemId, TaskToTagMetadata.KEY), Metadata.DELETION_DATE.eq(0)))); + Metadata m = new Metadata(); + try { + for (tagMetadata.moveToFirst(); !tagMetadata.isAfterLast(); tagMetadata.moveToNext()) { + m.clear(); + m.readFromCursor(tagMetadata); + + TaskOutstanding oe = new TaskOutstanding(); + oe.setValue(TaskOutstanding.ENTITY_ID_PROPERTY, itemId); + oe.setValue(TaskOutstanding.COLUMN_STRING, NameMaps.TAG_ADDED_COLUMN); + oe.setValue(TaskOutstanding.VALUE_STRING, m.getValue(TaskToTagMetadata.TAG_UUID)); + oe.setValue(TaskOutstanding.CREATED_AT, createdAt); + outstandingDao.createNew(oe); + } + } finally { + tagMetadata.close(); + } + } + +} diff --git a/tests/src/com/todoroo/astrid/sync/ConstructOutstandingFromMasterTest.java b/tests/src/com/todoroo/astrid/sync/ConstructOutstandingFromMasterTest.java index fb26377ff..b8ed807e1 100644 --- a/tests/src/com/todoroo/astrid/sync/ConstructOutstandingFromMasterTest.java +++ b/tests/src/com/todoroo/astrid/sync/ConstructOutstandingFromMasterTest.java @@ -3,24 +3,30 @@ package com.todoroo.astrid.sync; import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.sql.Query; -import com.todoroo.astrid.actfm.sync.messages.ConstructOutstandingTableFromMasterTable; +import com.todoroo.astrid.actfm.sync.messages.ConstructTaskOutstandingTableFromMasterTable; import com.todoroo.astrid.actfm.sync.messages.NameMaps; +import com.todoroo.astrid.data.Metadata; +import com.todoroo.astrid.data.SyncFlags; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.TaskOutstanding; +import com.todoroo.astrid.tags.TaskToTagMetadata; public class ConstructOutstandingFromMasterTest extends NewSyncTestCase { public void testConstructOutstandingConstructsOutstanding() { Task t = createTask(true); + Metadata m = TaskToTagMetadata.newTagMetadata(t.getId(), t.getUuid(), "Tag", "2"); + m.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true); + metadataDao.createNew(m); TodorooCursor to = taskOutstandingDao.query(Query.select(TaskOutstanding.PROPERTIES)); try { assertEquals(0, to.getCount()); } finally { to.close(); } - - new ConstructOutstandingTableFromMasterTable(NameMaps.TABLE_ID_TASKS, taskDao, taskOutstandingDao, Task.CREATION_DATE).execute(); - + + new ConstructTaskOutstandingTableFromMasterTable(NameMaps.TABLE_ID_TASKS, taskDao, taskOutstandingDao, metadataDao, Task.CREATION_DATE).execute(); + Property[] syncable = NameMaps.syncableProperties(NameMaps.TABLE_ID_TASKS); for (Property p : syncable) { to = taskOutstandingDao.query(Query.select(TaskOutstanding.PROPERTIES).where(TaskOutstanding.COLUMN_STRING.eq(p.name))); @@ -33,6 +39,15 @@ public class ConstructOutstandingFromMasterTest extends NewSyncTestCase { to.close(); } } + + to = taskOutstandingDao.query(Query.select(TaskOutstanding.PROPERTIES).where(TaskOutstanding.COLUMN_STRING.eq(NameMaps.TAG_ADDED_COLUMN))); + try { + assertEquals(1, to.getCount()); + to.moveToFirst(); + assertEquals("2", to.get(TaskOutstanding.VALUE_STRING)); + } finally { + to.close(); + } } - + } diff --git a/tests/src/com/todoroo/astrid/sync/NewSyncTestCase.java b/tests/src/com/todoroo/astrid/sync/NewSyncTestCase.java index 78b501f38..f818b6576 100644 --- a/tests/src/com/todoroo/astrid/sync/NewSyncTestCase.java +++ b/tests/src/com/todoroo/astrid/sync/NewSyncTestCase.java @@ -1,6 +1,7 @@ package com.todoroo.astrid.sync; import com.todoroo.andlib.service.Autowired; +import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.RemoteModelDao; import com.todoroo.astrid.dao.TagDataDao; import com.todoroo.astrid.dao.TagOutstandingDao; @@ -12,57 +13,59 @@ import com.todoroo.astrid.data.Task; import com.todoroo.astrid.test.DatabaseTestCase; public class NewSyncTestCase extends DatabaseTestCase { - @Autowired + @Autowired protected TaskDao taskDao; - @Autowired + @Autowired protected TagDataDao tagDataDao; - - @Autowired + + @Autowired protected TaskOutstandingDao taskOutstandingDao; - @Autowired - protected - TagOutstandingDao tagOutstandingDao; - + @Autowired + protected TagOutstandingDao tagOutstandingDao; + + @Autowired + protected MetadataDao metadataDao; + @Override protected void setUp() throws Exception { super.setUp(); RemoteModelDao.outstandingEntryFlag = 1; } - + protected Task createTask(String title, boolean suppress) { Task task = new Task(); task.setValue(Task.TITLE, title); task.setValue(Task.IMPORTANCE, SYNC_TASK_IMPORTANCE); - + if (suppress) task.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true); taskDao.createNew(task); - return task; + return task; } - + protected Task createTask() { return createTask(false); } - + public static final String SYNC_TASK_TITLE = "new title"; public static final int SYNC_TASK_IMPORTANCE = Task.IMPORTANCE_MUST_DO; - + protected Task createTask(boolean suppress) { return createTask(SYNC_TASK_TITLE, suppress); } - + protected TagData createTagData(String name, boolean suppress) { TagData tag = new TagData(); tag.setValue(TagData.NAME, name); - + tagDataDao.createNew(tag); return tag; } - + protected TagData createTagData() { return createTagData(false); } - + protected TagData createTagData(boolean suppress) { return createTagData("new tag", suppress); }