Add sorting to google task lists

pull/467/head
Alex Baker 9 years ago
parent 691c90404c
commit 3b4aae4473

@ -0,0 +1,12 @@
package com.todoroo.astrid.gtasks;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.GtasksFilter;
import org.tasks.tasklist.GtasksListFragment;
public class GtasksSubtaskListFragment extends GtasksListFragment {
public static TaskListFragment newGtasksSubtaskListFragment(GtasksFilter gtasksFilter, GtasksList list) {
return null;
}
}

@ -1,12 +1,10 @@
package com.todoroo.astrid.gtasks; package org.tasks.tasklist;
import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.GtasksFilter; import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.subtasks.SubtasksListFragment; import com.todoroo.astrid.gtasks.GtasksList;
public class GtasksListFragment extends SubtasksListFragment {
public static final String TOKEN_STORE_ID = "storeId";
public class GtasksListFragment extends TaskListFragment {
public static TaskListFragment newGtasksListFragment(GtasksFilter gtasksFilter, GtasksList list) { public static TaskListFragment newGtasksListFragment(GtasksFilter gtasksFilter, GtasksList list) {
return null; return null;
} }

@ -0,0 +1,12 @@
package com.todoroo.astrid.gtasks;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.GtasksFilter;
import org.tasks.tasklist.GtasksListFragment;
public class GtasksSubtaskListFragment extends GtasksListFragment {
public static TaskListFragment newGtasksSubtaskListFragment(GtasksFilter gtasksFilter, GtasksList list) {
return null;
}
}

@ -1,12 +1,10 @@
package com.todoroo.astrid.gtasks; package org.tasks.tasklist;
import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.GtasksFilter; import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.subtasks.SubtasksListFragment; import com.todoroo.astrid.gtasks.GtasksList;
public class GtasksListFragment extends SubtasksListFragment {
public static final String TOKEN_STORE_ID = "storeId";
public class GtasksListFragment extends TaskListFragment {
public static TaskListFragment newGtasksListFragment(GtasksFilter gtasksFilter, GtasksList list) { public static TaskListFragment newGtasksListFragment(GtasksFilter gtasksFilter, GtasksList list) {
return null; return null;
} }

@ -8,8 +8,6 @@ package com.todoroo.astrid.gtasks;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.ListView; import android.widget.ListView;
@ -21,10 +19,7 @@ import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskAttachmentDao; import com.todoroo.astrid.dao.TaskAttachmentDao;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.SyncV2Service;
import com.todoroo.astrid.sync.SyncResultCallback;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
import org.tasks.R; import org.tasks.R;
@ -32,6 +27,7 @@ import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.ForApplication; import org.tasks.injection.ForApplication;
import org.tasks.injection.FragmentComponent; import org.tasks.injection.FragmentComponent;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.tasklist.GtasksListFragment;
import org.tasks.themes.Theme; import org.tasks.themes.Theme;
import org.tasks.themes.ThemeCache; import org.tasks.themes.ThemeCache;
import org.tasks.ui.CheckBoxes; import org.tasks.ui.CheckBoxes;
@ -41,21 +37,18 @@ import java.util.Arrays;
import javax.inject.Inject; import javax.inject.Inject;
public class GtasksSubtaskListFragment extends TaskListFragment { public class GtasksSubtaskListFragment extends GtasksListFragment {
public static TaskListFragment newGtasksListFragment(GtasksFilter filter, GtasksList list) { public static TaskListFragment newGtasksSubtaskListFragment(GtasksFilter filter, GtasksList list) {
GtasksSubtaskListFragment fragment = new GtasksSubtaskListFragment(); GtasksSubtaskListFragment fragment = new GtasksSubtaskListFragment();
fragment.filter = filter; fragment.filter = filter;
fragment.list = list; fragment.list = list;
return fragment; return fragment;
} }
private static final String EXTRA_STORE_OBJECT = "extra_store_object";
@Inject TaskDao taskDao; @Inject TaskDao taskDao;
@Inject MetadataDao metadataDao; @Inject MetadataDao metadataDao;
@Inject GtasksTaskListUpdater gtasksTaskListUpdater; @Inject GtasksTaskListUpdater gtasksTaskListUpdater;
@Inject SyncV2Service syncService;
@Inject TaskAttachmentDao taskAttachmentDao; @Inject TaskAttachmentDao taskAttachmentDao;
@Inject Preferences preferences; @Inject Preferences preferences;
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@ -65,7 +58,6 @@ public class GtasksSubtaskListFragment extends TaskListFragment {
@Inject @ForApplication Context context; @Inject @ForApplication Context context;
@Inject Theme theme; @Inject Theme theme;
private GtasksList list;
protected OrderedMetadataListFragmentHelper helper; protected OrderedMetadataListFragmentHelper helper;
private int lastVisibleIndex = -1; private int lastVisibleIndex = -1;
@ -73,59 +65,15 @@ public class GtasksSubtaskListFragment extends TaskListFragment {
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
StoreObject storeObject = savedInstanceState.getParcelable(EXTRA_STORE_OBJECT);
list = new GtasksList(storeObject);
}
helper.setList(list); helper.setList(list);
} }
@Override
protected void inflateMenu(Toolbar toolbar) {
super.inflateMenu(toolbar);
toolbar.inflateMenu(R.menu.menu_gtasks_list_fragment);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(EXTRA_STORE_OBJECT, list.getStoreObject());
}
@Override @Override
protected void onTaskDelete(Task task) { protected void onTaskDelete(Task task) {
super.onTaskDelete(task); super.onTaskDelete(task);
helper.onDeleteTask(task); helper.onDeleteTask(task);
} }
@Override
public boolean onMenuItemClick(MenuItem item) {
switch(item.getItemId()) {
case R.id.menu_clear_completed:
clearCompletedTasks();
return true;
default:
return super.onMenuItemClick(item);
}
}
private void clearCompletedTasks() {
syncService.clearCompleted(list, new SyncResultCallback() {
@Override
public void started() {
setSyncOngoing(true);
}
@Override
public void finished() {
setSyncOngoing(false);
onRefresh();
}
});
}
@Override @Override
public Property<?>[] taskProperties() { public Property<?>[] taskProperties() {
Property<?>[] baseProperties = TaskAdapter.PROPERTIES; Property<?>[] baseProperties = TaskAdapter.PROPERTIES;
@ -157,6 +105,7 @@ public class GtasksSubtaskListFragment extends TaskListFragment {
@Override @Override
public void setTaskAdapter() { public void setTaskAdapter() {
helper.setList(list);
helper.beforeSetUpTaskList(filter); helper.beforeSetUpTaskList(filter);
super.setTaskAdapter(); super.setTaskAdapter();

@ -9,7 +9,9 @@ import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.sync.GtasksSyncService; import com.todoroo.astrid.gtasks.sync.GtasksSyncService;
@ -47,6 +49,16 @@ public class GtasksTaskListUpdater {
this.metadataDao = metadataDao; this.metadataDao = metadataDao;
} }
public void initialize(Filter filter) {
String query = filter.getSqlQuery();
query = query.replaceAll("ORDER BY .*", "");
query = query + String.format(" ORDER BY %s", Order.asc(Functions.cast(GtasksMetadata.ORDER, "LONG")));
query = query.replace(
TaskDao.TaskCriteria.activeAndVisible().toString(),
TaskDao.TaskCriteria.notDeleted().toString());
filter.setFilterQueryOverride(query);
}
// --- overrides // --- overrides
Metadata getTaskMetadata(long taskId) { Metadata getTaskMetadata(long taskId) {

@ -105,6 +105,7 @@ class OrderedMetadataListFragmentHelper {
} }
public void beforeSetUpTaskList(Filter filter) { public void beforeSetUpTaskList(Filter filter) {
updater.initialize(filter);
} }
private final DropListener dropListener = new DropListener() { private final DropListener dropListener = new DropListener() {

@ -0,0 +1,92 @@
package org.tasks.tasklist;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.gtasks.GtasksList;
import com.todoroo.astrid.service.SyncV2Service;
import com.todoroo.astrid.sync.SyncResultCallback;
import org.tasks.R;
import org.tasks.injection.FragmentComponent;
import javax.inject.Inject;
public class GtasksListFragment extends TaskListFragment {
public static TaskListFragment newGtasksListFragment(GtasksFilter filter, GtasksList list) {
GtasksListFragment fragment = new GtasksListFragment();
fragment.filter = filter;
fragment.list = list;
return fragment;
}
private static final String EXTRA_STORE_OBJECT = "extra_store_object";
@Inject SyncV2Service syncService;
protected GtasksList list;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
StoreObject storeObject = savedInstanceState.getParcelable(EXTRA_STORE_OBJECT);
list = new GtasksList(storeObject);
}
}
@Override
protected void inflateMenu(Toolbar toolbar) {
super.inflateMenu(toolbar);
toolbar.inflateMenu(R.menu.menu_gtasks_list_fragment);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch(item.getItemId()) {
case R.id.menu_clear_completed:
clearCompletedTasks();
return true;
default:
return super.onMenuItemClick(item);
}
}
private void clearCompletedTasks() {
syncService.clearCompleted(list, new SyncResultCallback() {
@Override
public void started() {
setSyncOngoing(true);
}
@Override
public void finished() {
setSyncOngoing(false);
onRefresh();
}
});
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(EXTRA_STORE_OBJECT, list.getStoreObject());
}
@Override
protected boolean hasDraggableOption() {
return list != null;
}
@Override
public void inject(FragmentComponent component) {
component.inject(this);
}
}

@ -54,6 +54,7 @@ import org.tasks.intents.TaskIntents;
import org.tasks.preferences.DefaultFilterProvider; import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.receivers.RepeatConfirmationReceiver; import org.tasks.receivers.RepeatConfirmationReceiver;
import org.tasks.tasklist.GtasksListFragment;
import org.tasks.tasklist.TagListFragment; import org.tasks.tasklist.TagListFragment;
import org.tasks.themes.Theme; import org.tasks.themes.Theme;
import org.tasks.themes.ThemeCache; import org.tasks.themes.ThemeCache;
@ -298,7 +299,9 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
GtasksFilter gtasksFilter = (GtasksFilter) filter; GtasksFilter gtasksFilter = (GtasksFilter) filter;
GtasksList list = gtasksListService.getList(gtasksFilter.getStoreId()); GtasksList list = gtasksListService.getList(gtasksFilter.getStoreId());
if (list != null) { if (list != null) {
return GtasksSubtaskListFragment.newGtasksListFragment(gtasksFilter, list); return preferences.getBoolean(R.string.p_manual_sort, false)
? GtasksSubtaskListFragment.newGtasksSubtaskListFragment(gtasksFilter, list)
: GtasksListFragment.newGtasksListFragment(gtasksFilter, list);
} }
} else if (filter != null) { } else if (filter != null) {
return subtasksHelper.shouldUseSubtasksFragmentForFilter(filter) return subtasksHelper.shouldUseSubtasksFragmentForFilter(filter)

@ -262,7 +262,6 @@ public class TaskListFragment extends InjectingListFragment implements
completed.setChecked(true); completed.setChecked(true);
} }
if (this instanceof GtasksSubtaskListFragment) { if (this instanceof GtasksSubtaskListFragment) {
menu.findItem(R.id.menu_sort).setVisible(false);
completed.setChecked(true); completed.setChecked(true);
completed.setEnabled(false); completed.setEnabled(false);
} }

@ -6,9 +6,7 @@ import android.os.Parcelable;
import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
@ -40,12 +38,12 @@ public class GtasksFilter extends Filter {
} }
private static QueryTemplate getQueryTemplate(GtasksList list) { private static QueryTemplate getQueryTemplate(GtasksList list) {
return new QueryTemplate().join( Criterion fullCriterion = Criterion.and(
Join.left(Metadata.TABLE, Task.ID.eq(Metadata.TASK))).where(Criterion.and(
MetadataDao.MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY), MetadataDao.MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY),
TaskDao.TaskCriteria.notDeleted(), TaskDao.TaskCriteria.activeAndVisible(),
GtasksMetadata.LIST_ID.eq(list.getRemoteId()))).orderBy( GtasksMetadata.LIST_ID.eq(list.getRemoteId()));
Order.asc(Functions.cast(GtasksMetadata.ORDER, "LONG"))); return new QueryTemplate().join(Join.left(Metadata.TABLE, Task.ID.eq(Metadata.TASK)))
.where(fullCriterion);
} }
private static ContentValues getValuesForNewTasks(GtasksList list) { private static ContentValues getValuesForNewTasks(GtasksList list) {

@ -68,8 +68,7 @@ public class TaskListDataProvider {
String groupedQuery; String groupedQuery;
if (sqlQueryTemplate.get().contains("GROUP BY")) { if (sqlQueryTemplate.get().contains("GROUP BY")) {
groupedQuery = sqlQueryTemplate.get(); groupedQuery = sqlQueryTemplate.get();
} else if (sqlQueryTemplate.get().contains("ORDER BY")) //$NON-NLS-1$ } else if (sqlQueryTemplate.get().contains("ORDER BY")) {
{
groupedQuery = sqlQueryTemplate.get().replace("ORDER BY", "GROUP BY " + Task.ID + " ORDER BY"); //$NON-NLS-1$ groupedQuery = sqlQueryTemplate.get().replace("ORDER BY", "GROUP BY " + Task.ID + " ORDER BY"); //$NON-NLS-1$
} else { } else {
groupedQuery = sqlQueryTemplate.get() + " GROUP BY " + Task.ID; groupedQuery = sqlQueryTemplate.get() + " GROUP BY " + Task.ID;

@ -14,6 +14,7 @@ import com.todoroo.astrid.ui.HideUntilControlSet;
import com.todoroo.astrid.ui.ReminderControlSet; import com.todoroo.astrid.ui.ReminderControlSet;
import org.tasks.fragments.CommentBarFragment; import org.tasks.fragments.CommentBarFragment;
import org.tasks.tasklist.GtasksListFragment;
import org.tasks.tasklist.TagListFragment; import org.tasks.tasklist.TagListFragment;
import org.tasks.ui.CalendarControlSet; import org.tasks.ui.CalendarControlSet;
import org.tasks.ui.DeadlineControlSet; import org.tasks.ui.DeadlineControlSet;
@ -69,4 +70,6 @@ public interface FragmentComponent {
void inject(SubtasksTagListFragment subtasksTagListFragment); void inject(SubtasksTagListFragment subtasksTagListFragment);
void inject(GoogleTaskListFragment googleTaskListFragment); void inject(GoogleTaskListFragment googleTaskListFragment);
void inject(GtasksListFragment gtasksListFragment);
} }

Loading…
Cancel
Save