Further fleshing out gtasks - added decoration exposer and rewrote metadata service to use commons version

pull/14/head
Tim Su 15 years ago
parent 9d829cfada
commit a87cb96a8d

@ -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 <tim@todoroo.com>
*
*/
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);
}
}

@ -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;

@ -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 <tim@todoroo.com>
*
*/
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<GtasksTaskContainer> {
public GtasksMetadataService() {
DependencyInjectionService.getInstance().inject(this);
super(ContextManager.getContext());
}
// --- task and metadata methods
@Override
public GtasksTaskContainer createContainerFromLocalTask(Task task,
ArrayList<Metadata> 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<Task> 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<Task> 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<Metadata> 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;
}
}

@ -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 <tim@todoroo.com>
*
*/
public class GtasksTaskContainer extends SyncContainer {
public Metadata gtaskMetadata;
public GtasksTaskContainer(Task task, ArrayList<Metadata> 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> metadata) {
this.task = task;
this.metadata = metadata;
for(Iterator<Metadata> 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);
}
}

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- See the file "LICENSE" for the full license governing this code. -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/indent"
android:layout_width="wrap_content"
android:layout_height="fill_parent"/>

@ -0,0 +1,21 @@
package com.todoroo.astrid.api;
import com.todoroo.astrid.data.Task;
/**
* Internal API for exposing task decorations
*
* @author Tim Su <tim@todoroo.com>
*
*/
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);
}
Loading…
Cancel
Save