diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksDecorationExposer.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksDecorationExposer.java new file mode 100644 index 000000000..54a9b9101 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksDecorationExposer.java @@ -0,0 +1,58 @@ +/** + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.gtasks; + +import android.widget.RemoteViews; + +import com.timsu.astrid.R; +import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.service.ContextManager; +import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.api.TaskDecoration; +import com.todoroo.astrid.api.TaskDecorationExposer; +import com.todoroo.astrid.data.Metadata; +import com.todoroo.astrid.data.Task; + +/** + * Exposes {@link TaskDecoration} for GTasks indentation + * + * @author Tim Su + * + */ +public class GtasksDecorationExposer implements TaskDecorationExposer { + + @Autowired private GtasksMetadataService gtasksMetadataService; + + public GtasksDecorationExposer() { + DependencyInjectionService.getInstance().inject(this); + } + + @Override + public TaskDecoration expose(Filter activeFilter, Task task) { + if(!GtasksUtilities.INSTANCE.isLoggedIn()) + return null; + + if(!activeFilter.sqlQuery.contains(GtasksMetadata.METADATA_KEY)) + return null; + + return createDecoration(task); + } + + private TaskDecoration createDecoration(Task task) { + Metadata metadata = gtasksMetadataService.getTaskMetadata(task.getId()); + if(metadata == null) + return null; + + int indentation = metadata.getValue(GtasksMetadata.INDENTATION); + if(indentation <= 0) + return null; + + RemoteViews decoration = new RemoteViews(ContextManager.getContext().getPackageName(), + R.layout.gtasks_decoration); + decoration.setInt(R.id.indent, "setWidth", indentation * 20); //$NON-NLS-1$ + return new TaskDecoration(decoration, TaskDecoration.POSITION_LEFT, 0); + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksFilterExposer.java index e28670b3e..863268dc5 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksFilterExposer.java @@ -15,7 +15,9 @@ import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Join; +import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.Filter; @@ -50,7 +52,9 @@ public class GtasksFilterExposer extends BroadcastReceiver { Join.left(Metadata.TABLE, Task.ID.eq(Metadata.TASK))).where(Criterion.and( MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY), TaskCriteria.activeAndVisible(), - GtasksMetadata.LIST_ID.eq(list.getValue(GtasksList.REMOTE_ID)))), + GtasksMetadata.LIST_ID.eq(list.getValue(GtasksList.REMOTE_ID)))).orderBy( + Order.asc(Functions.caseStatement(GtasksMetadata.ORDERING.eq(0), + Task.CREATION_DATE, GtasksMetadata.ORDERING))), values); return filter; diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadataService.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadataService.java index 17d62018f..9db0cf44f 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadataService.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadataService.java @@ -3,20 +3,16 @@ */ package com.todoroo.astrid.gtasks; -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 java.util.ArrayList; + +import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.sql.Criterion; -import com.todoroo.andlib.sql.Join; -import com.todoroo.andlib.sql.Query; -import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; -import com.todoroo.astrid.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Task; -import com.todoroo.astrid.service.MetadataService; -import com.todoroo.astrid.service.TaskService; +import com.todoroo.astrid.gtasks.sync.GtasksTaskContainer; +import com.todoroo.astrid.sync.SyncMetadataService; +import com.todoroo.astrid.sync.SyncProviderUtilities; /** * Service for working with GTasks metadata @@ -24,79 +20,36 @@ import com.todoroo.astrid.service.TaskService; * @author Tim Su * */ -public final class GtasksMetadataService { - - // --- constants - - /** Utility for joining tasks with metadata */ - public static final Join METADATA_JOIN = Join.left(Metadata.TABLE, Task.ID.eq(Metadata.TASK)); - - // --- instance variables - - @Autowired - private TaskService taskService; - - @Autowired - private MetadataService metadataService; +public final class GtasksMetadataService extends SyncMetadataService { public GtasksMetadataService() { - DependencyInjectionService.getInstance().inject(this); + super(ContextManager.getContext()); } - // --- task and metadata methods + @Override + public GtasksTaskContainer createContainerFromLocalTask(Task task, + ArrayList metadata) { + return new GtasksTaskContainer(task, metadata); + } - /** - * Clears metadata information. Used when user logs out of service - */ - public void clearMetadata() { - metadataService.deleteWhere(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY)); - PluginServices.getTaskService().clearDetails(Task.ID.in(Query.select(Metadata.TASK).from(Metadata.TABLE). - where(MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY)))); + @Override + public Criterion getLocalMatchCriteria(GtasksTaskContainer remoteTask) { + return GtasksMetadata.ID.eq(remoteTask.gtaskMetadata.getValue(GtasksMetadata.ID)); } - /** - * Gets tasks that were created since last sync - * @param properties - * @return - */ - public TodorooCursor getLocallyCreated(Property[] properties) { - return - taskService.query(Query.select(properties).join(GtasksMetadataService.METADATA_JOIN).where(Criterion.and( - Criterion.not(Task.ID.in(Query.select(Metadata.TASK).from(Metadata.TABLE). - where(Criterion.and(MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY), GtasksMetadata.ID.gt(0))))), - TaskCriteria.isActive())).groupBy(Task.ID)); + @Override + public Criterion getMetadataCriteria() { + return MetadataCriteria.withKey(getMetadataKey()); } - /** - * Gets tasks that were modified since last sync - * @param properties - * @return null if never sync'd - */ - public TodorooCursor getLocallyUpdated(Property[] properties) { - long lastSyncDate = GtasksUtilities.INSTANCE.getLastSyncDate(); - if(lastSyncDate == 0) - return taskService.query(Query.select(Task.ID).where(Criterion.none)); - return - taskService.query(Query.select(properties).join(GtasksMetadataService.METADATA_JOIN). - where(Criterion.and(MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY), - Task.MODIFICATION_DATE.gt(lastSyncDate))).groupBy(Task.ID)); + @Override + public String getMetadataKey() { + return GtasksMetadata.METADATA_KEY; } - /** - * Reads metadata out of a task - * @return null if no metadata found - */ - public Metadata getTaskMetadata(long taskId) { - TodorooCursor cursor = metadataService.query(Query.select( - Metadata.PROPERTIES).where( - MetadataCriteria.byTaskAndwithKey(taskId, GtasksMetadata.METADATA_KEY))); - try { - if(cursor.getCount() == 0) - return null; - cursor.moveToFirst(); - return new Metadata(cursor); - } finally { - cursor.close(); - } + @Override + public SyncProviderUtilities getUtilities() { + return GtasksUtilities.INSTANCE; } + } diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksTaskContainer.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksTaskContainer.java new file mode 100644 index 000000000..84c34a67b --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksTaskContainer.java @@ -0,0 +1,53 @@ +package com.todoroo.astrid.gtasks.sync; + +import java.util.ArrayList; +import java.util.Iterator; + +import com.todoroo.astrid.data.Metadata; +import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.gtasks.GtasksMetadata; +import com.todoroo.astrid.producteev.sync.ProducteevTask; +import com.todoroo.astrid.sync.SyncContainer; + +/** + * RTM Task Container + * + * @author Tim Su + * + */ +public class GtasksTaskContainer extends SyncContainer { + + public Metadata gtaskMetadata; + + public GtasksTaskContainer(Task task, ArrayList metadata, Metadata gtaskMetadata) { + this.task = task; + this.metadata = metadata; + this.gtaskMetadata = gtaskMetadata; + if(this.gtaskMetadata == null) { + this.gtaskMetadata = GtasksMetadata.createEmptyMetadata(); + } + } + + public GtasksTaskContainer(Task task, ArrayList metadata) { + this.task = task; + this.metadata = metadata; + + for(Iterator iterator = metadata.iterator(); iterator.hasNext(); ) { + Metadata item = iterator.next(); + if(ProducteevTask.METADATA_KEY.equals(item.getValue(Metadata.KEY))) { + gtaskMetadata = item; + iterator.remove(); + // don't break, could be multiple + } + } + if(this.gtaskMetadata == null) { + this.gtaskMetadata = GtasksMetadata.createEmptyMetadata(); + } + } + + @Override + public void prepareForSaving() { + super.prepareForSaving(); + metadata.add(gtaskMetadata); + } +} \ No newline at end of file diff --git a/astrid/res/layout/gtasks_decoration.xml b/astrid/res/layout/gtasks_decoration.xml new file mode 100644 index 000000000..77d6a0f23 --- /dev/null +++ b/astrid/res/layout/gtasks_decoration.xml @@ -0,0 +1,7 @@ + + + + diff --git a/astrid/src/com/todoroo/astrid/api/TaskDecorationExposer.java b/astrid/src/com/todoroo/astrid/api/TaskDecorationExposer.java new file mode 100644 index 000000000..ccde31380 --- /dev/null +++ b/astrid/src/com/todoroo/astrid/api/TaskDecorationExposer.java @@ -0,0 +1,21 @@ +package com.todoroo.astrid.api; + +import com.todoroo.astrid.data.Task; + +/** + * Internal API for exposing task decorations + * + * @author Tim Su + * + */ +public interface TaskDecorationExposer { + + /** + * Expose task decorations for the given task + * + * @param task + * @return null if no decorations, or decoration + */ + public TaskDecoration expose(Filter activeFilter, Task task); + +}