diff --git a/app/src/main/java/com/todoroo/astrid/adapter/AstridTaskAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/AstridTaskAdapter.java index 62f49c1c3..64aa066c0 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/AstridTaskAdapter.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/AstridTaskAdapter.java @@ -40,13 +40,14 @@ public final class AstridTaskAdapter extends TaskAdapter { @Override public boolean canMove(ViewHolder source, ViewHolder target) { - return true; + return !updater.isDescendantOf(target.task.getUuid(), source.task.getUuid()); } - public boolean canIndent(int position, TaskContainer task) { - String parentUuid = getItemUuid(position - 1); - int parentIndent = updater.getIndentForTask(parentUuid); - return getIndent(task) <= parentIndent; + @Override + public int maxIndent(int previousPosition, TaskContainer task) { + TaskContainer previous = getTask(previousPosition); + String parentUuid = previous.getUuid(); + return updater.getIndentForTask(parentUuid) + 1; } @Override @@ -56,11 +57,8 @@ public final class AstridTaskAdapter extends TaskAdapter { @Override public void moved(int from, int to, int indent) { - String targetTaskId = getItemUuid(from); - if (!Task.isValidUuid(targetTaskId)) { - return; // This can happen with gestures on empty parts of the list (e.g. extra space below - // tasks) - } + TaskContainer source = getTask(from); + String targetTaskId = source.getUuid(); try { if (to >= getCount()) { @@ -69,6 +67,11 @@ public final class AstridTaskAdapter extends TaskAdapter { String destinationTaskId = getItemUuid(to); updater.moveTo(list, filter, targetTaskId, destinationTaskId); } + int currentIndent = updater.getIndentForTask(targetTaskId); + int delta = indent - currentIndent; + for (int i = 0 ; i < Math.abs(delta) ; i++) { + updater.indent(list, filter, targetTaskId, delta); + } } catch (Exception e) { Timber.e(e); } diff --git a/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.java index 86cf04014..6159f0f3f 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.java @@ -56,8 +56,8 @@ public final class GoogleTaskAdapter extends TaskAdapter { } @Override - public int maxIndent(int position, TaskContainer task) { - return position == 0 || task.hasChildren() ? 0 : 1; + public int maxIndent(int previousPosition, TaskContainer task) { + return task.hasChildren() ? 0 : 1; } @Override diff --git a/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.java index c371ffed7..6d56722bd 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.java @@ -60,7 +60,7 @@ public class TaskAdapter { return false; } - public int maxIndent(int position, TaskContainer task) { + public int maxIndent(int previousPosition, TaskContainer task) { return 0; } diff --git a/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksFilterUpdater.java b/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksFilterUpdater.java index 6ad848f64..390d16cbc 100644 --- a/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksFilterUpdater.java +++ b/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksFilterUpdater.java @@ -391,6 +391,10 @@ public class SubtasksFilterUpdater { applyToFilter(filter); } + public boolean isDescendantOf(String desc, String parent) { + return isDescendantOf(idToNode.get(desc), idToNode.get(parent)); + } + // Returns true if desc is a descendant of parent private boolean isDescendantOf(Node desc, Node parent) { Node curr = desc; diff --git a/app/src/main/java/org/tasks/tasklist/ItemTouchHelperCallback.java b/app/src/main/java/org/tasks/tasklist/ItemTouchHelperCallback.java index cb43246de..92079ebe6 100644 --- a/app/src/main/java/org/tasks/tasklist/ItemTouchHelperCallback.java +++ b/app/src/main/java/org/tasks/tasklist/ItemTouchHelperCallback.java @@ -9,7 +9,6 @@ import android.graphics.Canvas; import androidx.annotation.NonNull; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; -import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.utility.Flags; import org.tasks.data.TaskContainer; @@ -17,7 +16,6 @@ import org.tasks.data.TaskContainer; public class ItemTouchHelperCallback extends ItemTouchHelper.Callback { private final TaskAdapter adapter; private final TaskListRecyclerAdapter recyclerAdapter; - private final TaskListFragment taskList; private final Runnable onClear; private int from = -1; private int to = -1; @@ -25,13 +23,9 @@ public class ItemTouchHelperCallback extends ItemTouchHelper.Callback { private boolean swiping; ItemTouchHelperCallback( - TaskAdapter adapter, - TaskListRecyclerAdapter recyclerAdapter, - TaskListFragment taskList, - Runnable onClear) { + TaskAdapter adapter, TaskListRecyclerAdapter recyclerAdapter, Runnable onClear) { this.adapter = adapter; this.recyclerAdapter = recyclerAdapter; - this.taskList = taskList; this.onClear = onClear; } @@ -85,7 +79,7 @@ public class ItemTouchHelperCallback extends ItemTouchHelper.Callback { to == 0 || to == recyclerAdapter.getItemCount() - 1 ? 0 : adapter.minIndent(from <= to ? to + 1 : to, task)); - source.setMaxIndent(adapter.maxIndent(to, task)); + source.setMaxIndent(to == 0 ? 0 : adapter.maxIndent(from >= to ? to - 1 : to, task)); } @Override @@ -175,7 +169,6 @@ public class ItemTouchHelperCallback extends ItemTouchHelper.Callback { int delta = direction == ItemTouchHelper.RIGHT ? 1 : -1; int position = viewHolder.getAdapterPosition(); recyclerAdapter.swiped(position, delta); - taskList.loadTaskListContent(); } boolean isDragging() { diff --git a/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java b/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java index 7ba71658b..1142ac23a 100644 --- a/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java +++ b/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java @@ -59,7 +59,7 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter this.actionModeProvider = actionModeProvider; this.list = list; itemTouchHelperCallback = - new ItemTouchHelperCallback(adapter, this, taskList, this::drainQueue); + new ItemTouchHelperCallback(adapter, this, this::drainQueue); isGoogleTaskList = taskList.getFilter() instanceof GtasksFilter; Pair, DiffResult> initial = Pair.create(list, null); disposables.add( @@ -262,6 +262,7 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter adapter.moved(from, to, indent); TaskContainer task = list.remove(from); list.add(from < to ? to - 1 : to, task); + taskList.loadTaskListContent(); } void swiped(int position, int delta) {