Remove manual sort list fragment helpers

pull/795/head
Alex Baker 7 years ago
parent b34694f0a4
commit 8d9972c4c3

@ -1,8 +1,16 @@
package com.todoroo.astrid.adapter;
import android.text.TextUtils;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.subtasks.SubtasksFilterUpdater;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.tasks.data.TaskListMetadata;
import timber.log.Timber;
@ -11,12 +19,16 @@ public final class AstridTaskAdapter extends TaskAdapter {
private final TaskListMetadata list;
private final Filter filter;
private final SubtasksFilterUpdater updater;
private final TaskDao taskDao;
private final Map<String, ArrayList<String>> chainedCompletions =
Collections.synchronizedMap(new HashMap<>());
public AstridTaskAdapter(
TaskListMetadata list, Filter filter, SubtasksFilterUpdater updater) {
TaskListMetadata list, Filter filter, SubtasksFilterUpdater updater, TaskDao taskDao) {
this.list = list;
this.filter = filter;
this.updater = updater;
this.taskDao = taskDao;
}
@Override
@ -79,4 +91,49 @@ public final class AstridTaskAdapter extends TaskAdapter {
public void onTaskDeleted(Task task) {
updater.onDeleteTask(list, filter, task.getUuid());
}
@Override
public void onCompletedTask(Task item, boolean completedState) {
final String itemId = item.getUuid();
final long completionDate = completedState ? DateUtilities.now() : 0;
if (!completedState) {
ArrayList<String> chained = chainedCompletions.get(itemId);
if (chained != null) {
for (String taskId : chained) {
taskDao.setCompletionDate(taskId, completionDate);
}
}
return;
}
final ArrayList<String> chained = new ArrayList<>();
updater.applyToDescendants(
itemId,
node -> {
String uuid = node.uuid;
taskDao.setCompletionDate(uuid, completionDate);
chained.add(node.uuid);
});
if (chained.size() > 0) {
// move recurring items to item parent
List<Task> tasks = taskDao.getRecurringTasks(chained);
boolean madeChanges = false;
for (Task t : tasks) {
if (!TextUtils.isEmpty(t.getRecurrence())) {
updater.moveToParentOf(t.getUuid(), itemId);
madeChanges = true;
}
}
if (madeChanges) {
updater.writeSerialization(list, updater.serializeTree());
}
chainedCompletions.put(itemId, chained);
}
}
}

@ -1,11 +1,18 @@
package com.todoroo.astrid.adapter;
import android.text.TextUtils;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.GtasksTaskListUpdater;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.tasks.data.GoogleTask;
import org.tasks.data.GoogleTaskDao;
import org.tasks.data.GoogleTaskList;
import timber.log.Timber;
@ -13,10 +20,20 @@ public final class GoogleTaskAdapter extends TaskAdapter {
private final GoogleTaskList list;
private final GtasksTaskListUpdater updater;
private final TaskDao taskDao;
private final GoogleTaskDao googleTaskDao;
private final Map<Long, ArrayList<Long>> chainedCompletions =
Collections.synchronizedMap(new HashMap<>());
public GoogleTaskAdapter(GoogleTaskList list, GtasksTaskListUpdater updater) {
public GoogleTaskAdapter(
GoogleTaskList list,
GtasksTaskListUpdater updater,
TaskDao taskDao,
GoogleTaskDao googleTaskDao) {
this.list = list;
this.updater = updater;
this.taskDao = taskDao;
this.googleTaskDao = googleTaskDao;
}
@Override
@ -81,4 +98,45 @@ public final class GoogleTaskAdapter extends TaskAdapter {
public void onTaskDeleted(Task task) {
updater.onDeleteTask(list, task.getId());
}
@Override
public void onCompletedTask(Task item, boolean completedState) {
final long itemId = item.getId();
final long completionDate = completedState ? DateUtilities.now() : 0;
if (!completedState) {
ArrayList<Long> chained = chainedCompletions.get(itemId);
if (chained != null) {
for (Long taskId : chained) {
Task task = taskDao.fetch(taskId);
task.setCompletionDate(completionDate);
taskDao.save(task);
}
}
return;
}
final ArrayList<Long> chained = new ArrayList<>();
final int parentIndent = item.getIndent();
updater.applyToChildren(
list,
itemId,
node -> {
Task childTask = taskDao.fetch(node.taskId);
if (!TextUtils.isEmpty(childTask.getRecurrence())) {
GoogleTask googleTask = updater.getTaskMetadata(node.taskId);
googleTask.setIndent(parentIndent);
googleTaskDao.update(googleTask);
}
childTask.setCompletionDate(completionDate);
taskDao.save(childTask);
chained.add(node.taskId);
});
if (chained.size() > 0) {
chainedCompletions.put(itemId, chained);
}
}
}

@ -51,7 +51,6 @@ public class TaskAdapter {
Property.class);
private final Set<Long> selected = new HashSet<>();
private AsyncPagedListDiffer<Task> helper;
private OnCompletedTaskListener onCompletedTaskListener = null;
public int getCount() {
return helper.getItemCount();
@ -119,30 +118,13 @@ public class TaskAdapter {
return getTask(position).getUuid();
}
public void onCompletedTask(Task task, boolean newState) {
if (onCompletedTaskListener != null) {
onCompletedTaskListener.onCompletedTask(task, newState);
}
}
public void setOnCompletedTaskListener(final OnCompletedTaskListener newListener) {
this.onCompletedTaskListener = newListener;
}
public Property<?>[] getTaskProperties() {
return PROPERTIES;
}
public void onTaskCreated(String uuid) {
public void onCompletedTask(Task task, boolean newState) {}
}
public void onTaskCreated(String uuid) {}
public void onTaskDeleted(Task task) {
}
public interface OnCompletedTaskListener {
void onCompletedTask(Task item, boolean newState);
}
public void onTaskDeleted(Task task) {}
}

@ -6,20 +6,22 @@
package com.todoroo.astrid.gtasks;
import android.app.Activity;
import android.os.Bundle;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.adapter.GoogleTaskAdapter;
import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.dao.TaskDao;
import javax.inject.Inject;
import org.tasks.data.GoogleTaskDao;
import org.tasks.data.GoogleTaskList;
import org.tasks.injection.FragmentComponent;
import org.tasks.tasklist.GtasksListFragment;
public class GtasksSubtaskListFragment extends GtasksListFragment {
@Inject OrderedMetadataListFragmentHelper helper;
@Inject TaskDao taskDao;
@Inject GtasksTaskListUpdater updater;
@Inject GoogleTaskDao googleTaskDao;
public static TaskListFragment newGtasksSubtaskListFragment(
GtasksFilter filter, GoogleTaskList list) {
@ -29,25 +31,10 @@ public class GtasksSubtaskListFragment extends GtasksListFragment {
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
helper.setList(list);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
helper.setTaskListFragment(this);
}
@Override
protected TaskAdapter createTaskAdapter() {
helper.setList(list);
helper.beforeSetUpTaskList(filter);
return helper.createTaskAdapter();
updater.initialize(filter);
return new GoogleTaskAdapter(list, updater, taskDao, googleTaskDao);
}
@Override

@ -50,7 +50,7 @@ public class GtasksTaskListUpdater {
// --- overrides
GoogleTask getTaskMetadata(long taskId) {
public GoogleTask getTaskMetadata(long taskId) {
return googleTaskDao.getByTaskId(taskId);
}
@ -338,7 +338,7 @@ public class GtasksTaskListUpdater {
}
/** Apply an operation only to the children of the task */
void applyToChildren(GoogleTaskList list, long targetTaskId, OrderedListNodeVisitor visitor) {
public void applyToChildren(GoogleTaskList list, long targetTaskId, OrderedListNodeVisitor visitor) {
Node root = buildTreeModel(list);
Node target = findNode(root, targetTaskId);
@ -385,12 +385,12 @@ public class GtasksTaskListUpdater {
void processTask(long taskId, GoogleTask googleTask);
}
interface OrderedListNodeVisitor {
public interface OrderedListNodeVisitor {
void visitNode(Node node);
}
static class Node {
public static class Node {
public final long taskId;
final ArrayList<Node> children = new ArrayList<>();

@ -1,106 +0,0 @@
/*
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.gtasks;
import android.text.TextUtils;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.adapter.GoogleTaskAdapter;
import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import org.tasks.data.GoogleTask;
import org.tasks.data.GoogleTaskDao;
import org.tasks.data.GoogleTaskList;
class OrderedMetadataListFragmentHelper {
private final GtasksTaskListUpdater updater;
private final GoogleTaskDao googleTaskDao;
private final TaskDao taskDao;
private final Map<Long, ArrayList<Long>> chainedCompletions =
Collections.synchronizedMap(new HashMap<>());
private TaskListFragment fragment;
private GoogleTaskList list;
@Inject
OrderedMetadataListFragmentHelper(
TaskDao taskDao, GtasksTaskListUpdater updater, GoogleTaskDao googleTaskDao) {
this.taskDao = taskDao;
this.updater = updater;
this.googleTaskDao = googleTaskDao;
}
void setTaskListFragment(TaskListFragment fragment) {
this.fragment = fragment;
}
void beforeSetUpTaskList(Filter filter) {
updater.initialize(filter);
}
TaskAdapter createTaskAdapter() {
GoogleTaskAdapter taskAdapter = new GoogleTaskAdapter(list, updater);
taskAdapter.setOnCompletedTaskListener(this::setCompletedForItemAndSubtasks);
return taskAdapter;
}
private void setCompletedForItemAndSubtasks(final Task item, final boolean completedState) {
final long itemId = item.getId();
final long completionDate = completedState ? DateUtilities.now() : 0;
if (!completedState) {
ArrayList<Long> chained = chainedCompletions.get(itemId);
if (chained != null) {
for (Long taskId : chained) {
Task task = taskDao.fetch(taskId);
task.setCompletionDate(completionDate);
taskDao.save(task);
}
fragment.loadTaskListContent();
}
return;
}
final ArrayList<Long> chained = new ArrayList<>();
final int parentIndent = item.getIndent();
updater.applyToChildren(
list,
itemId,
node -> {
Task childTask = taskDao.fetch(node.taskId);
if (!TextUtils.isEmpty(childTask.getRecurrence())) {
GoogleTask googleTask = updater.getTaskMetadata(node.taskId);
googleTask.setIndent(parentIndent);
googleTaskDao.update(googleTask);
}
childTask.setCompletionDate(completionDate);
taskDao.save(childTask);
chained.add(node.taskId);
});
if (chained.size() > 0) {
chainedCompletions.put(itemId, chained);
fragment.loadTaskListContent();
}
}
public void setList(GoogleTaskList list) {
this.list = list;
}
}

@ -1,99 +0,0 @@
package com.todoroo.astrid.subtasks;
import android.text.TextUtils;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.adapter.AstridTaskAdapter;
import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.tasks.data.TaskListMetadata;
class AstridOrderedListFragmentHelper {
private final SubtasksFilterUpdater updater;
private final TaskDao taskDao;
private final Map<String, ArrayList<String>> chainedCompletions =
Collections.synchronizedMap(new HashMap<>());
private TaskListFragment fragment;
private TaskListMetadata list;
@Inject
AstridOrderedListFragmentHelper(SubtasksFilterUpdater updater, TaskDao taskDao) {
this.updater = updater;
this.taskDao = taskDao;
}
void setTaskListFragment(TaskListFragment fragment) {
this.fragment = fragment;
}
void beforeSetUpTaskList(Filter filter) {
updater.initialize(list, filter);
}
TaskAdapter createTaskAdapter() {
AstridTaskAdapter taskAdapter = new AstridTaskAdapter(list, fragment.getFilter(), updater);
taskAdapter.setOnCompletedTaskListener(this::setCompletedForItemAndSubtasks);
return taskAdapter;
}
private void setCompletedForItemAndSubtasks(final Task item, final boolean completedState) {
final String itemId = item.getUuid();
final long completionDate = completedState ? DateUtilities.now() : 0;
if (!completedState) {
ArrayList<String> chained = chainedCompletions.get(itemId);
if (chained != null) {
for (String taskId : chained) {
taskDao.setCompletionDate(taskId, completionDate);
}
fragment.loadTaskListContent();
}
return;
}
final ArrayList<String> chained = new ArrayList<>();
updater.applyToDescendants(
itemId,
node -> {
String uuid = node.uuid;
taskDao.setCompletionDate(uuid, completionDate);
chained.add(node.uuid);
});
if (chained.size() > 0) {
// move recurring items to item parent
List<Task> tasks = taskDao.getRecurringTasks(chained);
boolean madeChanges = false;
for (Task t : tasks) {
if (!TextUtils.isEmpty(t.getRecurrence())) {
updater.moveToParentOf(t.getUuid(), itemId);
madeChanges = true;
}
}
if (madeChanges) {
updater.writeSerialization(list, updater.serializeTree());
}
chainedCompletions.put(itemId, chained);
fragment.loadTaskListContent();
}
}
public void setList(TaskListMetadata list) {
this.list = list;
}
}

@ -116,7 +116,7 @@ public class SubtasksFilterUpdater {
return order;
}
void writeSerialization(TaskListMetadata list, String serialized) {
public void writeSerialization(TaskListMetadata list, String serialized) {
if (list != null) {
list.setTaskIds(serialized);
taskListMetadataDao.update(list);
@ -236,7 +236,7 @@ public class SubtasksFilterUpdater {
}
}
void applyToDescendants(String taskId, OrderedListNodeVisitor visitor) {
public void applyToDescendants(String taskId, OrderedListNodeVisitor visitor) {
Node n = idToNode.get(taskId);
if (n == null) {
return;
@ -342,7 +342,7 @@ public class SubtasksFilterUpdater {
moveHelper(list, filter, target, before);
}
void moveToParentOf(String moveThis, String toParentOfThis) {
public void moveToParentOf(String moveThis, String toParentOfThis) {
Node target = idToNode.get(toParentOfThis);
if (target == null) {
return;
@ -450,11 +450,11 @@ public class SubtasksFilterUpdater {
applyToFilter(filter);
}
String serializeTree() {
public String serializeTree() {
return serializeTree(treeRoot);
}
interface OrderedListNodeVisitor {
public interface OrderedListNodeVisitor {
void visitNode(Node node);
}
@ -464,7 +464,7 @@ public class SubtasksFilterUpdater {
void afterAddNode(Node node);
}
static class Node {
public static class Node {
final ArrayList<Node> children = new ArrayList<>();
public String uuid;

@ -10,6 +10,7 @@ import android.app.Activity;
import android.content.Context;
import android.text.TextUtils;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.adapter.AstridTaskAdapter;
import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.core.BuiltInFilterExposer;
@ -32,8 +33,8 @@ public class SubtasksListFragment extends TaskListFragment {
@Inject Preferences preferences;
@Inject @ForApplication Context context;
@Inject TaskListMetadataDao taskListMetadataDao;
@Inject SubtasksFilterUpdater updater;
@Inject TaskDao taskDao;
@Inject AstridOrderedListFragmentHelper helper;
public static TaskListFragment newSubtasksListFragment(Filter filter) {
SubtasksListFragment fragment = new SubtasksListFragment();
@ -42,10 +43,10 @@ public class SubtasksListFragment extends TaskListFragment {
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
helper.setTaskListFragment(this);
protected TaskAdapter createTaskAdapter() {
TaskListMetadata list = initializeTaskListMetadata();
updater.initialize(list, filter);
return new AstridTaskAdapter(list, filter, updater, taskDao);
}
private TaskListMetadata initializeTaskListMetadata() {
@ -76,13 +77,6 @@ public class SubtasksListFragment extends TaskListFragment {
return taskListMetadata;
}
@Override
protected TaskAdapter createTaskAdapter() {
helper.setList(initializeTaskListMetadata());
helper.beforeSetUpTaskList(filter);
return helper.createTaskAdapter();
}
@Override
public void inject(FragmentComponent component) {
component.inject(this);

@ -6,10 +6,11 @@
package com.todoroo.astrid.subtasks;
import android.app.Activity;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.adapter.AstridTaskAdapter;
import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.api.TagFilter;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
import javax.inject.Inject;
import org.tasks.data.TagData;
@ -21,7 +22,8 @@ import org.tasks.tasklist.TagListFragment;
public class SubtasksTagListFragment extends TagListFragment {
@Inject TaskListMetadataDao taskListMetadataDao;
@Inject AstridOrderedListFragmentHelper helper;
@Inject SubtasksFilterUpdater updater;
@Inject TaskDao taskDao;
public static TaskListFragment newSubtasksTagListFragment(TagFilter filter, TagData tagData) {
SubtasksTagListFragment fragment = new SubtasksTagListFragment();
@ -31,14 +33,13 @@ public class SubtasksTagListFragment extends TagListFragment {
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
helper.setTaskListFragment(this);
protected TaskAdapter createTaskAdapter() {
TaskListMetadata list = initializeTaskListMetadata();
updater.initialize(list, filter);
return new AstridTaskAdapter(list, filter, updater, taskDao);
}
@Override
protected TaskAdapter createTaskAdapter() {
private TaskListMetadata initializeTaskListMetadata() {
String tdId = tagData.getRemoteId();
TaskListMetadata taskListMetadata =
taskListMetadataDao.fetchByTagOrFilter(tagData.getRemoteId());
@ -47,9 +48,7 @@ public class SubtasksTagListFragment extends TagListFragment {
taskListMetadata.setTagUuid(tdId);
taskListMetadataDao.createNew(taskListMetadata);
}
helper.setList(taskListMetadata);
helper.beforeSetUpTaskList(filter);
return helper.createTaskAdapter();
return taskListMetadata;
}
@Override

@ -99,6 +99,7 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder>
@Override
public void onCompletedTask(Task task, boolean newState) {
adapter.onCompletedTask(task, newState);
taskList.loadTaskListContent();
}
@Override

Loading…
Cancel
Save