diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt index 3eaac0b0f..811a06943 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt @@ -182,7 +182,7 @@ class TaskListFragment : InjectingFragment(), OnRefreshListener, Toolbar.OnMenuI override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - val selectedTaskIds: List = taskAdapter.selected + val selectedTaskIds: List = taskAdapter.getSelected() outState.putLongArray(EXTRA_SELECTED_TASK_IDS, selectedTaskIds.toLongArray()) outState.putString(EXTRA_SEARCH, searchQuery) } @@ -492,7 +492,7 @@ class TaskListFragment : InjectingFragment(), OnRefreshListener, Toolbar.OnMenuI loadTaskListContent() } - fun onTaskCreated(uuid: String?) { + fun onTaskCreated(uuid: String) { taskAdapter.onTaskCreated(uuid) } @@ -522,7 +522,7 @@ class TaskListFragment : InjectingFragment(), OnRefreshListener, Toolbar.OnMenuI } REQUEST_MOVE_TASKS -> if (resultCode == Activity.RESULT_OK) { taskMover.move( - taskAdapter.selected, + taskAdapter.getSelected(), data!!.getParcelableExtra(RemoteListPicker.EXTRA_SELECTED_FILTER)) finishActionMode() } @@ -605,7 +605,7 @@ class TaskListFragment : InjectingFragment(), OnRefreshListener, Toolbar.OnMenuI } override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean { - val selected = taskAdapter.selected + val selected = taskAdapter.getSelected() return when (item.itemId) { R.id.edit_tags -> { val tags = tagDataDao.getTagSelections(selected) @@ -632,10 +632,9 @@ class TaskListFragment : InjectingFragment(), OnRefreshListener, Toolbar.OnMenuI true } R.id.menu_share -> { - send( - DbUtils.collect( - taskAdapter.selected - ) { ids: List? -> taskDao.fetchTasks(preferences, IdListFilter(ids)) }) + DbUtils + .collect(selected) { taskDao.fetchTasks(preferences, IdListFilter(it)) } + .apply(this::send) true } R.id.delete -> { diff --git a/app/src/main/java/com/todoroo/astrid/adapter/AstridTaskAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/AstridTaskAdapter.java deleted file mode 100644 index 5e4ee8423..000000000 --- a/app/src/main/java/com/todoroo/astrid/adapter/AstridTaskAdapter.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.todoroo.astrid.adapter; - -import static org.tasks.Strings.isNullOrEmpty; - -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.TaskContainer; -import org.tasks.data.TaskListMetadata; -import org.tasks.tasklist.ViewHolder; -import timber.log.Timber; - -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> chainedCompletions = - Collections.synchronizedMap(new HashMap<>()); - - AstridTaskAdapter( - TaskListMetadata list, Filter filter, SubtasksFilterUpdater updater, TaskDao taskDao) { - this.list = list; - this.filter = filter; - this.updater = updater; - this.taskDao = taskDao; - } - - @Override - public int getIndent(TaskContainer task) { - return updater.getIndentForTask(task.getUuid()); - } - - @Override - public boolean canMove(ViewHolder source, ViewHolder target) { - return !updater.isDescendantOf(target.task.getUuid(), source.task.getUuid()); - } - - @Override - public int maxIndent(int previousPosition, TaskContainer task) { - TaskContainer previous = getTask(previousPosition); - String parentUuid = previous.getUuid(); - return updater.getIndentForTask(parentUuid) + 1; - } - - @Override - public boolean supportsParentingOrManualSort() { - return true; - } - - @Override - public boolean supportsManualSorting() { - return true; - } - - @Override - public void moved(int from, int to, int indent) { - TaskContainer source = getTask(from); - String targetTaskId = source.getUuid(); - - try { - if (to >= getCount()) { - updater.moveTo(list, filter, targetTaskId, "-1"); // $NON-NLS-1$ - } else { - 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); - } - } - - @Override - public void onTaskCreated(String uuid) { - updater.onCreateTask(list, filter, uuid); - } - - @Override - public void onTaskDeleted(Task task) { - updater.onDeleteTask(list, filter, task.getUuid()); - } - - @Override - public void onCompletedTask(TaskContainer item, boolean completedState) { - final String itemId = item.getUuid(); - - final long completionDate = completedState ? DateUtilities.now() : 0; - - if (!completedState) { - ArrayList chained = chainedCompletions.get(itemId); - if (chained != null) { - for (String taskId : chained) { - taskDao.setCompletionDate(taskId, completionDate); - } - } - return; - } - - final ArrayList 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 tasks = taskDao.getRecurringTasks(chained); - - boolean madeChanges = false; - for (Task t : tasks) { - if (!isNullOrEmpty(t.getRecurrence())) { - updater.moveToParentOf(t.getUuid(), itemId); - madeChanges = true; - } - } - - if (madeChanges) { - updater.writeSerialization(list, updater.serializeTree()); - } - - chainedCompletions.put(itemId, chained); - } - } - - @Override - public boolean supportsHiddenTasks() { - return false; - } -} diff --git a/app/src/main/java/com/todoroo/astrid/adapter/AstridTaskAdapter.kt b/app/src/main/java/com/todoroo/astrid/adapter/AstridTaskAdapter.kt new file mode 100644 index 000000000..56337d94a --- /dev/null +++ b/app/src/main/java/com/todoroo/astrid/adapter/AstridTaskAdapter.kt @@ -0,0 +1,97 @@ +package com.todoroo.astrid.adapter + +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 org.tasks.Strings.isNullOrEmpty +import org.tasks.data.TaskContainer +import org.tasks.data.TaskListMetadata +import org.tasks.tasklist.ViewHolder +import timber.log.Timber +import java.util.* +import kotlin.math.abs + +class AstridTaskAdapter internal constructor( + private val list: TaskListMetadata, + private val filter: Filter, + private val updater: SubtasksFilterUpdater, + private val taskDao: TaskDao) : TaskAdapter() { + + private val chainedCompletions = Collections.synchronizedMap(HashMap>()) + + override fun getIndent(task: TaskContainer) = updater.getIndentForTask(task.uuid) + + override fun canMove(source: ViewHolder, target: ViewHolder) = !updater.isDescendantOf(target.task.uuid, source.task.uuid) + + override fun maxIndent(previousPosition: Int, task: TaskContainer): Int { + val previous = getTask(previousPosition) + return updater.getIndentForTask(previous.uuid) + 1 + } + + override fun supportsParentingOrManualSort() = true + + override fun supportsManualSorting() = true + + override fun moved(from: Int, to: Int, indent: Int) { + val source = getTask(from) + val targetTaskId = source.uuid + try { + if (to >= count) { + updater.moveTo(list, filter, targetTaskId, "-1") // $NON-NLS-1$ + } else { + val destinationTaskId = getItemUuid(to) + updater.moveTo(list, filter, targetTaskId, destinationTaskId) + } + val currentIndent = updater.getIndentForTask(targetTaskId) + val delta = indent - currentIndent + for (i in 0 until abs(delta)) { + updater.indent(list, filter, targetTaskId, delta) + } + } catch (e: Exception) { + Timber.e(e) + } + } + + override fun onTaskCreated(uuid: String) = updater.onCreateTask(list, filter, uuid) + + override fun onTaskDeleted(task: Task) = updater.onDeleteTask(list, filter, task.uuid) + + override fun onCompletedTask(task: TaskContainer, newState: Boolean) { + val itemId = task.uuid + val completionDate = if (newState) DateUtilities.now() else 0 + if (!newState) { + val chained = chainedCompletions[itemId] + if (chained != null) { + for (taskId in chained) { + taskDao.setCompletionDate(taskId, completionDate) + } + } + return + } + val chained = ArrayList() + updater.applyToDescendants(itemId) { node: SubtasksFilterUpdater.Node -> + val uuid = node.uuid + taskDao.setCompletionDate(uuid, completionDate) + chained.add(node.uuid) + } + if (chained.size > 0) { + // move recurring items to item parent + val tasks = taskDao.getRecurringTasks(chained) + var madeChanges = false + for (t in tasks) { + if (!isNullOrEmpty(t.recurrence)) { + updater.moveToParentOf(t.uuid, itemId) + madeChanges = true + } + } + if (madeChanges) { + updater.writeSerialization(list, updater.serializeTree()) + } + chainedCompletions[itemId] = chained + } + } + + override fun supportsHiddenTasks() = false +} \ No newline at end of file diff --git a/app/src/main/java/com/todoroo/astrid/adapter/CaldavTaskAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/CaldavTaskAdapter.java deleted file mode 100644 index e8c8d510e..000000000 --- a/app/src/main/java/com/todoroo/astrid/adapter/CaldavTaskAdapter.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.todoroo.astrid.adapter; - -import com.todoroo.astrid.dao.TaskDao; -import org.tasks.data.CaldavDao; -import org.tasks.data.CaldavTask; -import org.tasks.data.SubsetCaldav; -import org.tasks.data.TaskContainer; -import org.tasks.tasklist.ViewHolder; - -public final class CaldavTaskAdapter extends TaskAdapter { - - private final TaskDao taskDao; - private final CaldavDao caldavDao; - - CaldavTaskAdapter(TaskDao taskDao, CaldavDao caldavDao) { - this.taskDao = taskDao; - this.caldavDao = caldavDao; - } - - @Override - public boolean canMove(ViewHolder sourceVh, ViewHolder targetVh) { - TaskContainer source = sourceVh.task; - int to = targetVh.getAdapterPosition(); - return !taskIsChild(source, to); - } - - @Override - public int maxIndent(int previousPosition, TaskContainer task) { - TaskContainer previous = getTask(previousPosition); - return previous.getIndent() + 1; - } - - @Override - public int minIndent(int nextPosition, TaskContainer task) { - return 0; - } - - @Override - public boolean supportsParentingOrManualSort() { - return true; - } - - @Override - public void moved(int from, int to, int indent) { - TaskContainer task = getTask(from); - TaskContainer previous = to > 0 ? getTask(to - 1) : null; - - long newParent = task.getParent(); - if (indent == 0) { - newParent = 0; - } else if (previous != null) { - if (indent == previous.getIndent()) { - newParent = previous.getParent(); - } else if (indent > previous.getIndent()) { - newParent = previous.getId(); - } else if (indent < previous.getIndent()) { - newParent = previous.getParent(); - int currentIndex = to; - for (int i = 0 ; i < previous.getIndent() - indent ; i++) { - long thisParent = newParent; - while (newParent == thisParent) { - thisParent = getTask(--currentIndex).getParent(); - } - newParent = thisParent; - } - } - } - - // If nothing is changing, return - if (newParent == task.getParent()) { - return; - } - - changeParent(task, newParent); - - taskDao.touch(task.getId()); - } - - private void changeParent(TaskContainer task, long newParent) { - SubsetCaldav caldavTask = task.getCaldavTask(); - - if (newParent == 0) { - caldavTask.setRemoteParent(""); - task.setParent(0); - } else { - CaldavTask parentTask = caldavDao.getTask(newParent); - if (parentTask == null) { - return; - } - caldavTask.setRemoteParent(parentTask.getRemoteId()); - task.setParent(newParent); - } - caldavDao.update(caldavTask); - taskDao.save(task.getTask()); - } - - private boolean taskIsChild(TaskContainer source, int destinationIndex) { - TaskContainer destination = getTask(destinationIndex); - while (destination.getParent() != 0) { - if (destination.getParent() == source.getParent()) { - return false; - } - if (destination.getParent() == source.getId()) { - return true; - } - destination = getTask(--destinationIndex); - } - return false; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/todoroo/astrid/adapter/CaldavTaskAdapter.kt b/app/src/main/java/com/todoroo/astrid/adapter/CaldavTaskAdapter.kt new file mode 100644 index 000000000..976f43ec6 --- /dev/null +++ b/app/src/main/java/com/todoroo/astrid/adapter/CaldavTaskAdapter.kt @@ -0,0 +1,80 @@ +package com.todoroo.astrid.adapter + +import com.todoroo.astrid.dao.TaskDao +import org.tasks.data.CaldavDao +import org.tasks.data.TaskContainer +import org.tasks.tasklist.ViewHolder + +class CaldavTaskAdapter internal constructor(private val taskDao: TaskDao, private val caldavDao: CaldavDao) : TaskAdapter() { + override fun canMove(sourceVh: ViewHolder, targetVh: ViewHolder): Boolean { + val source = sourceVh.task + val to = targetVh.adapterPosition + return !taskIsChild(source, to) + } + + override fun maxIndent(previousPosition: Int, task: TaskContainer): Int { + val previous = getTask(previousPosition) + return previous.getIndent() + 1 + } + + override fun minIndent(nextPosition: Int, task: TaskContainer) = 0 + + override fun supportsParentingOrManualSort() = true + + override fun moved(from: Int, to: Int, indent: Int) { + val task = getTask(from) + val previous = if (to > 0) getTask(to - 1) else null + var newParent = task.parent + if (indent == 0) { + newParent = 0 + } else if (previous != null) { + when { + indent == previous.getIndent() -> newParent = previous.parent + indent > previous.getIndent() -> newParent = previous.id + indent < previous.getIndent() -> { + newParent = previous.parent + var currentIndex = to + for (i in 0 until previous.getIndent() - indent) { + var thisParent = newParent + while (newParent == thisParent) { + thisParent = getTask(--currentIndex).parent + } + newParent = thisParent + } + } + } + } + + // If nothing is changing, return + if (newParent == task.parent) { + return + } + changeParent(task, newParent) + taskDao.touch(task.id) + } + + private fun changeParent(task: TaskContainer, newParent: Long) { + val caldavTask = task.getCaldavTask() + if (newParent == 0L) { + caldavTask.remoteParent = "" + task.parent = 0 + } else { + val parentTask = caldavDao.getTask(newParent) ?: return + caldavTask.remoteParent = parentTask.remoteId + task.parent = newParent + } + caldavDao.update(caldavTask) + taskDao.save(task.getTask()) + } + + private fun taskIsChild(source: TaskContainer, destinationIndex: Int): Boolean { + (destinationIndex downTo 0).forEach { + when (getTask(it).parent) { + 0L -> return false + source.parent -> return false + source.id -> return true + } + } + return false + } +} \ No newline at end of file diff --git a/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.java deleted file mode 100644 index 7c8cade94..000000000 --- a/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.todoroo.astrid.adapter; - -import com.todoroo.astrid.dao.TaskDao; -import org.tasks.BuildConfig; -import org.tasks.data.GoogleTaskDao; -import org.tasks.data.SubsetGoogleTask; -import org.tasks.data.TaskContainer; - -public final class GoogleTaskAdapter extends GoogleTaskManualSortAdapter { - - private final boolean newTasksOnTop; - - GoogleTaskAdapter(TaskDao taskDao, GoogleTaskDao googleTaskDao, boolean newTasksOnTop) { - super(taskDao, googleTaskDao); - this.newTasksOnTop = newTasksOnTop; - } - - @Override - public boolean supportsManualSorting() { - return false; - } - - @Override - public void moved(int from, int to, int indent) { - TaskContainer task = getTask(from); - SubsetGoogleTask googleTask = task.getGoogleTask(); - TaskContainer previous = to > 0 ? getTask(to - 1) : null; - if (indent == 0) { - if (googleTask.getIndent() == 0) { - return; - } - googleTaskDao.move( - googleTask, 0, newTasksOnTop ? 0 : googleTaskDao.getBottom(googleTask.getListId(), 0)); - } else { - long newParent = previous.hasParent() ? previous.getParent() : previous.getId(); - if (googleTask.getParent() == newParent) { - return; - } - googleTaskDao.move( - googleTask, - newParent, - newTasksOnTop ? 0 : googleTaskDao.getBottom(googleTask.getListId(), newParent)); - } - - taskDao.touch(task.getId()); - - if (BuildConfig.DEBUG) { - googleTaskDao.validateSorting(task.getGoogleTaskList()); - } - } -} diff --git a/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.kt b/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.kt new file mode 100644 index 000000000..3412c7e6a --- /dev/null +++ b/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.kt @@ -0,0 +1,35 @@ +package com.todoroo.astrid.adapter + +import com.todoroo.astrid.dao.TaskDao +import org.tasks.BuildConfig +import org.tasks.data.GoogleTaskDao + +class GoogleTaskAdapter internal constructor(taskDao: TaskDao, googleTaskDao: GoogleTaskDao, private val newTasksOnTop: Boolean) : GoogleTaskManualSortAdapter(taskDao, googleTaskDao) { + override fun supportsManualSorting() = false + + override fun moved(from: Int, to: Int, indent: Int) { + val task = getTask(from) + val googleTask = task.googleTask + val previous = if (to > 0) getTask(to - 1) else null + if (indent == 0) { + if (googleTask.indent == 0) { + return + } + googleTaskDao.move( + googleTask, 0, if (newTasksOnTop) 0 else googleTaskDao.getBottom(googleTask.listId, 0)) + } else { + val newParent = if (previous!!.hasParent()) previous.parent else previous.id + if (googleTask.parent == newParent) { + return + } + googleTaskDao.move( + googleTask, + newParent, + if (newTasksOnTop) 0 else googleTaskDao.getBottom(googleTask.listId, newParent)) + } + taskDao.touch(task.id) + if (BuildConfig.DEBUG) { + googleTaskDao.validateSorting(task.googleTaskList) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskManualSortAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskManualSortAdapter.java deleted file mode 100644 index 022f7d984..000000000 --- a/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskManualSortAdapter.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.todoroo.astrid.adapter; - -import com.todoroo.astrid.dao.TaskDao; -import org.tasks.BuildConfig; -import org.tasks.data.GoogleTaskDao; -import org.tasks.data.SubsetGoogleTask; -import org.tasks.data.TaskContainer; -import org.tasks.tasklist.ViewHolder; - -public class GoogleTaskManualSortAdapter extends TaskAdapter { - - final TaskDao taskDao; - final GoogleTaskDao googleTaskDao; - - GoogleTaskManualSortAdapter(TaskDao taskDao, GoogleTaskDao googleTaskDao) { - this.taskDao = taskDao; - this.googleTaskDao = googleTaskDao; - } - - @Override - public boolean canMove(ViewHolder sourceVh, ViewHolder targetVh) { - TaskContainer source = sourceVh.task; - int to = targetVh.getAdapterPosition(); - - if (!source.hasChildren() || to <= 0 || to >= getCount() - 1) { - return true; - } - - TaskContainer target = targetVh.task; - if (sourceVh.getAdapterPosition() < to) { - if (target.hasChildren()) { - return false; - } - if (target.hasParent()) { - return target.isLastSubtask(); - } - return true; - } else { - if (target.hasChildren()) { - return true; - } - if (target.hasParent()) { - return target.getParent() == source.getId() && target.secondarySort == 0; - } - return true; - } - } - - @Override - public int maxIndent(int previousPosition, TaskContainer task) { - return task.hasChildren() ? 0 : 1; - } - - @Override - public int minIndent(int nextPosition, TaskContainer task) { - return task.hasChildren() || !getTask(nextPosition).hasParent() ? 0 : 1; - } - - @Override - public boolean supportsParentingOrManualSort() { - return true; - } - - @Override - public boolean supportsManualSorting() { - return true; - } - - @Override - public void moved(int from, int to, int indent) { - TaskContainer task = getTask(from); - SubsetGoogleTask googleTask = task.getGoogleTask(); - TaskContainer previous = to > 0 ? getTask(to - 1) : null; - - if (previous == null) { - googleTaskDao.move(googleTask, 0, 0); - } else if (to == getCount() || to <= from) { - if (indent == 0) { - googleTaskDao.move(googleTask, 0, previous.getPrimarySort() + 1); - } else if (previous.hasParent()) { - googleTaskDao.move(googleTask, previous.getParent(), previous.getSecondarySort() + 1); - } else { - googleTaskDao.move(googleTask, previous.getId(), 0); - } - } else { - if (indent == 0) { - googleTaskDao.move( - googleTask, - 0, - task.hasParent() ? previous.getPrimarySort() + 1 : previous.getPrimarySort()); - } else if (previous.hasParent()) { - googleTaskDao.move( - googleTask, - previous.getParent(), - task.getParent() == previous.getParent() - ? previous.getSecondarySort() - : previous.getSecondarySort() + 1); - } else { - googleTaskDao.move(googleTask, previous.getId(), 0); - } - } - - taskDao.touch(task.getId()); - - if (BuildConfig.DEBUG) { - googleTaskDao.validateSorting(task.getGoogleTaskList()); - } - } -} diff --git a/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskManualSortAdapter.kt b/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskManualSortAdapter.kt new file mode 100644 index 000000000..78fe4ec15 --- /dev/null +++ b/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskManualSortAdapter.kt @@ -0,0 +1,75 @@ +package com.todoroo.astrid.adapter + +import com.todoroo.astrid.dao.TaskDao +import org.tasks.BuildConfig +import org.tasks.data.GoogleTaskDao +import org.tasks.data.TaskContainer +import org.tasks.tasklist.ViewHolder + +open class GoogleTaskManualSortAdapter internal constructor(val taskDao: TaskDao, val googleTaskDao: GoogleTaskDao) : TaskAdapter() { + + override fun canMove(sourceVh: ViewHolder, targetVh: ViewHolder): Boolean { + val source = sourceVh.task + val to = targetVh.adapterPosition + if (!source.hasChildren() || to <= 0 || to >= count - 1) { + return true + } + val target = targetVh.task + return if (sourceVh.adapterPosition < to) { + if (target.hasChildren()) { + return false + } + if (target.hasParent()) { + target.isLastSubtask + } else true + } else { + if (target.hasChildren()) { + return true + } + if (target.hasParent()) { + target.parent == source.id && target.secondarySort == 0L + } else true + } + } + + override fun maxIndent(previousPosition: Int, task: TaskContainer) = if (task.hasChildren()) 0 else 1 + + override fun minIndent(nextPosition: Int, task: TaskContainer) = if (task.hasChildren() || !getTask(nextPosition).hasParent()) 0 else 1 + + override fun supportsParentingOrManualSort() = true + + override fun supportsManualSorting() = true + + override fun moved(from: Int, to: Int, indent: Int) { + val task = getTask(from) + val googleTask = task.googleTask + val previous = if (to > 0) getTask(to - 1) else null + if (previous == null) { + googleTaskDao.move(googleTask, 0, 0) + } else if (to == count || to <= from) { + when { + indent == 0 -> googleTaskDao.move(googleTask, 0, previous.getPrimarySort() + 1) + previous.hasParent() -> googleTaskDao.move(googleTask, previous.parent, previous.getSecondarySort() + 1) + else -> googleTaskDao.move(googleTask, previous.id, 0) + } + } else { + when { + indent == 0 -> + googleTaskDao.move( + googleTask, + 0, + if (task.hasParent()) previous.getPrimarySort() + 1 else previous.getPrimarySort()) + previous.hasParent() -> + googleTaskDao.move( + googleTask, + previous.parent, + if (task.parent == previous.parent) previous.getSecondarySort() else previous.getSecondarySort() + 1) + else -> googleTaskDao.move(googleTask, previous.id, 0) + } + } + taskDao.touch(task.id) + if (BuildConfig.DEBUG) { + googleTaskDao.validateSorting(task.googleTaskList) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.java deleted file mode 100644 index a685fd42d..000000000 --- a/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2012 Todoroo Inc - * - * See the file "LICENSE" for the full license governing this code. - */ - -package com.todoroo.astrid.adapter; - -import static com.google.common.primitives.Longs.asList; - -import com.todoroo.astrid.data.Task; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; -import org.tasks.data.TaskContainer; -import org.tasks.tasklist.TaskListRecyclerAdapter; -import org.tasks.tasklist.ViewHolder; - -/** - * Adapter for displaying a user's tasks as a list - * - * @author Tim Su - */ -public class TaskAdapter { - - private final Set selected = new HashSet<>(); - private TaskListRecyclerAdapter helper; - - int getCount() { - return helper.getItemCount(); - } - - public void setHelper(TaskListRecyclerAdapter helper) { - this.helper = helper; - } - - public int getNumSelected() { - return selected.size(); - } - - public ArrayList getSelected() { - return new ArrayList<>(selected); - } - - public void setSelected(long... ids) { - setSelected(asList(ids)); - } - - public void setSelected(Collection ids) { - selected.clear(); - selected.addAll(ids); - } - - public void clearSelections() { - selected.clear(); - } - - public int getIndent(TaskContainer task) { - return task.getIndent(); - } - - public boolean canMove(ViewHolder source, ViewHolder target) { - return false; - } - - public int maxIndent(int previousPosition, TaskContainer task) { - return 0; - } - - public int minIndent(int nextPosition, TaskContainer task) { - return 0; - } - - public boolean isSelected(TaskContainer task) { - return selected.contains(task.getId()); - } - - public void toggleSelection(TaskContainer task) { - long id = task.getId(); - if (selected.contains(id)) { - selected.remove(id); - } else { - selected.add(id); - } - } - - public boolean supportsParentingOrManualSort() { - return false; - } - - public boolean supportsManualSorting() { - return false; - } - - public void moved(int from, int to, int indent) {} - - TaskContainer getTask(int position) { - return helper.getItem(position); - } - - String getItemUuid(int position) { - return getTask(position).getUuid(); - } - - public void onCompletedTask(TaskContainer task, boolean newState) {} - - public void onTaskCreated(String uuid) {} - - public void onTaskDeleted(Task task) {} - - public boolean supportsHiddenTasks() { - return true; - } -} diff --git a/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt b/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt new file mode 100644 index 000000000..c69a56afd --- /dev/null +++ b/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2012 Todoroo Inc + * + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.adapter + +import com.todoroo.astrid.data.Task +import org.tasks.data.TaskContainer +import org.tasks.tasklist.TaskListRecyclerAdapter +import org.tasks.tasklist.ViewHolder +import java.util.* + +open class TaskAdapter { + private val selected = HashSet() + private lateinit var helper: TaskListRecyclerAdapter + + val count: Int + get() = helper.itemCount + + fun setHelper(helper: TaskListRecyclerAdapter) { + this.helper = helper + } + + val numSelected: Int + get() = selected.size + + fun getSelected(): ArrayList = ArrayList(selected) + + fun setSelected(vararg ids: Long) = setSelected(ids.toList()) + + fun setSelected(ids: Collection) { + selected.clear() + selected.addAll(ids) + } + + fun clearSelections() = selected.clear() + + open fun getIndent(task: TaskContainer): Int = task.getIndent() + + open fun canMove(source: ViewHolder, target: ViewHolder): Boolean = false + + open fun maxIndent(previousPosition: Int, task: TaskContainer): Int = 0 + + open fun minIndent(nextPosition: Int, task: TaskContainer): Int = 0 + + fun isSelected(task: TaskContainer): Boolean = selected.contains(task.id) + + fun toggleSelection(task: TaskContainer) { + val id = task.id + if (selected.contains(id)) { + selected.remove(id) + } else { + selected.add(id) + } + } + + open fun supportsParentingOrManualSort(): Boolean = false + + open fun supportsManualSorting(): Boolean = false + + open fun moved(from: Int, to: Int, indent: Int) {} + + fun getTask(position: Int): TaskContainer = helper.getItem(position) + + fun getItemUuid(position: Int): String = getTask(position).uuid + + open fun onCompletedTask(task: TaskContainer, newState: Boolean) {} + + open fun onTaskCreated(uuid: String) {} + + open fun onTaskDeleted(task: Task) {} + + open fun supportsHiddenTasks(): Boolean = true +} \ No newline at end of file