mirror of https://github.com/tasks/tasks
Add TaskListDataProvider
parent
83888be783
commit
4447247258
@ -0,0 +1,91 @@
|
||||
package org.tasks.data;
|
||||
|
||||
import android.database.sqlite.SQLiteException;
|
||||
|
||||
import com.todoroo.andlib.data.Property;
|
||||
import com.todoroo.andlib.data.TodorooCursor;
|
||||
import com.todoroo.andlib.sql.Criterion;
|
||||
import com.todoroo.andlib.sql.Field;
|
||||
import com.todoroo.andlib.sql.Join;
|
||||
import com.todoroo.astrid.api.Filter;
|
||||
import com.todoroo.astrid.api.TagFilter;
|
||||
import com.todoroo.astrid.core.SortHelper;
|
||||
import com.todoroo.astrid.data.Metadata;
|
||||
import com.todoroo.astrid.data.Task;
|
||||
import com.todoroo.astrid.data.TaskAttachment;
|
||||
import com.todoroo.astrid.service.TaskService;
|
||||
import com.todoroo.astrid.tags.TaskToTagMetadata;
|
||||
|
||||
import org.tasks.preferences.Preferences;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import timber.log.Timber;
|
||||
|
||||
import static com.todoroo.astrid.activity.TaskListFragment.FILE_METADATA_JOIN;
|
||||
import static com.todoroo.astrid.activity.TaskListFragment.TAGS_METADATA_JOIN;
|
||||
|
||||
public class TaskListDataProvider {
|
||||
|
||||
private final AtomicReference<String> sqlQueryTemplate = new AtomicReference<>();
|
||||
private final TaskService taskService;
|
||||
private final Preferences preferences;
|
||||
|
||||
@Inject
|
||||
public TaskListDataProvider(TaskService taskService, Preferences preferences) {
|
||||
this.taskService = taskService;
|
||||
this.preferences = preferences;
|
||||
}
|
||||
|
||||
public AtomicReference<String> getSqlQueryTemplate() {
|
||||
return sqlQueryTemplate;
|
||||
}
|
||||
|
||||
public TodorooCursor<Task> constructCursor(Filter filter, Property<?>[] properties) {
|
||||
Criterion tagsJoinCriterion = Criterion.and(
|
||||
Field.field(TAGS_METADATA_JOIN + "." + Metadata.KEY.name).eq(TaskToTagMetadata.KEY), //$NON-NLS-1$
|
||||
Field.field(TAGS_METADATA_JOIN + "." + Metadata.DELETION_DATE.name).eq(0),
|
||||
Task.ID.eq(Field.field(TAGS_METADATA_JOIN + "." + Metadata.TASK.name)));
|
||||
|
||||
if (filter instanceof TagFilter) {
|
||||
String uuid = ((TagFilter) filter).getUuid();
|
||||
tagsJoinCriterion = Criterion.and(tagsJoinCriterion, Field.field(TAGS_METADATA_JOIN + "." + TaskToTagMetadata.TAG_UUID.name).neq(uuid));
|
||||
}
|
||||
|
||||
// TODO: For now, we'll modify the query to join and include the things like tag data here.
|
||||
// Eventually, we might consider restructuring things so that this query is constructed elsewhere.
|
||||
String joinedQuery =
|
||||
Join.left(Metadata.TABLE.as(TAGS_METADATA_JOIN),
|
||||
tagsJoinCriterion).toString() //$NON-NLS-1$
|
||||
+ Join.left(TaskAttachment.TABLE.as(FILE_METADATA_JOIN), Task.UUID.eq(Field.field(FILE_METADATA_JOIN + "." + TaskAttachment.TASK_UUID.name)))
|
||||
+ filter.getSqlQuery();
|
||||
|
||||
sqlQueryTemplate.set(SortHelper.adjustQueryForFlagsAndSort(
|
||||
preferences, joinedQuery, preferences.getSortMode()));
|
||||
|
||||
String groupedQuery;
|
||||
if (sqlQueryTemplate.get().contains("GROUP BY")) {
|
||||
groupedQuery = sqlQueryTemplate.get();
|
||||
} else if (sqlQueryTemplate.get().contains("ORDER BY")) //$NON-NLS-1$
|
||||
{
|
||||
groupedQuery = sqlQueryTemplate.get().replace("ORDER BY", "GROUP BY " + Task.ID + " ORDER BY"); //$NON-NLS-1$
|
||||
} else {
|
||||
groupedQuery = sqlQueryTemplate.get() + " GROUP BY " + Task.ID;
|
||||
}
|
||||
sqlQueryTemplate.set(groupedQuery);
|
||||
|
||||
// Peform query
|
||||
try {
|
||||
return taskService.fetchFiltered(sqlQueryTemplate.get(), null, properties);
|
||||
} catch (SQLiteException e) {
|
||||
// We don't show this error anymore--seems like this can get triggered
|
||||
// by a strange bug, but there seems to not be any negative side effect.
|
||||
// For now, we'll suppress the error
|
||||
// See http://astrid.com/home#tags-7tsoi/task-1119pk
|
||||
Timber.e(e, e.getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue