mirror of https://github.com/tasks/tasks
Convert task adapters to Kotlin
parent
563567a5dc
commit
fe9dbe4585
@ -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<String, ArrayList<String>> 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<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 (!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;
|
||||
}
|
||||
}
|
||||
@ -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<String, ArrayList<String>>())
|
||||
|
||||
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<String>()
|
||||
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
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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 <tim@todoroo.com>
|
||||
*/
|
||||
public class TaskAdapter {
|
||||
|
||||
private final Set<Long> 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<Long> getSelected() {
|
||||
return new ArrayList<>(selected);
|
||||
}
|
||||
|
||||
public void setSelected(long... ids) {
|
||||
setSelected(asList(ids));
|
||||
}
|
||||
|
||||
public void setSelected(Collection<Long> 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;
|
||||
}
|
||||
}
|
||||
@ -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<Long>()
|
||||
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<Long> = ArrayList(selected)
|
||||
|
||||
fun setSelected(vararg ids: Long) = setSelected(ids.toList())
|
||||
|
||||
fun setSelected(ids: Collection<Long>) {
|
||||
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
|
||||
}
|
||||
Loading…
Reference in New Issue