mirror of https://github.com/tasks/tasks
Convert TaskMover to Kotlin
parent
100ec6f80a
commit
45920a8035
@ -1,229 +0,0 @@
|
|||||||
package com.todoroo.astrid.service;
|
|
||||||
|
|
||||||
import static com.google.common.collect.FluentIterable.from;
|
|
||||||
import static com.google.common.collect.Lists.newArrayList;
|
|
||||||
import static com.google.common.collect.Lists.transform;
|
|
||||||
import static com.todoroo.andlib.utility.DateUtilities.now;
|
|
||||||
import static java.util.Collections.emptyList;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import com.todoroo.astrid.api.CaldavFilter;
|
|
||||||
import com.todoroo.astrid.api.Filter;
|
|
||||||
import com.todoroo.astrid.api.GtasksFilter;
|
|
||||||
import com.todoroo.astrid.dao.TaskDao;
|
|
||||||
import com.todoroo.astrid.data.Task;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import org.tasks.BuildConfig;
|
|
||||||
import org.tasks.LocalBroadcastManager;
|
|
||||||
import org.tasks.data.CaldavCalendar;
|
|
||||||
import org.tasks.data.CaldavDao;
|
|
||||||
import org.tasks.data.CaldavTask;
|
|
||||||
import org.tasks.data.GoogleTask;
|
|
||||||
import org.tasks.data.GoogleTaskDao;
|
|
||||||
import org.tasks.data.GoogleTaskListDao;
|
|
||||||
import org.tasks.injection.ForApplication;
|
|
||||||
import org.tasks.preferences.Preferences;
|
|
||||||
|
|
||||||
public class TaskMover {
|
|
||||||
|
|
||||||
private final Context context;
|
|
||||||
private final TaskDao taskDao;
|
|
||||||
private final CaldavDao caldavDao;
|
|
||||||
private final GoogleTaskDao googleTaskDao;
|
|
||||||
private final GoogleTaskListDao googleTaskListDao;
|
|
||||||
private final Preferences preferences;
|
|
||||||
private final LocalBroadcastManager localBroadcastManager;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
public TaskMover(
|
|
||||||
@ForApplication Context context,
|
|
||||||
TaskDao taskDao,
|
|
||||||
CaldavDao caldavDao,
|
|
||||||
GoogleTaskDao googleTaskDao,
|
|
||||||
GoogleTaskListDao googleTaskListDao,
|
|
||||||
Preferences preferences,
|
|
||||||
LocalBroadcastManager localBroadcastManager) {
|
|
||||||
this.context = context;
|
|
||||||
this.taskDao = taskDao;
|
|
||||||
this.caldavDao = caldavDao;
|
|
||||||
this.googleTaskDao = googleTaskDao;
|
|
||||||
this.googleTaskListDao = googleTaskListDao;
|
|
||||||
this.preferences = preferences;
|
|
||||||
this.localBroadcastManager = localBroadcastManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Filter getSingleFilter(List<Long> tasks) {
|
|
||||||
List<String> caldavCalendars = caldavDao.getCalendars(tasks);
|
|
||||||
List<String> googleTaskLists = googleTaskDao.getLists(tasks);
|
|
||||||
if (caldavCalendars.isEmpty()) {
|
|
||||||
if (googleTaskLists.size() == 1) {
|
|
||||||
return new GtasksFilter(googleTaskListDao.getByRemoteId(googleTaskLists.get(0)));
|
|
||||||
}
|
|
||||||
} else if (googleTaskLists.isEmpty()) {
|
|
||||||
if (caldavCalendars.size() == 1) {
|
|
||||||
return new CaldavFilter(caldavDao.getCalendar(caldavCalendars.get(0)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void move(List<Long> tasks, @NonNull Filter selectedList) {
|
|
||||||
tasks = new ArrayList<>(tasks);
|
|
||||||
tasks.removeAll(googleTaskDao.findChildrenInList(tasks));
|
|
||||||
tasks.removeAll(taskDao.findChildrenInList(tasks));
|
|
||||||
taskDao.setParent(0, tasks);
|
|
||||||
for (Task task : taskDao.fetch(tasks)) {
|
|
||||||
performMove(task, selectedList);
|
|
||||||
}
|
|
||||||
if (selectedList instanceof CaldavFilter) {
|
|
||||||
caldavDao.updateParents((((CaldavFilter) selectedList).getUuid()));
|
|
||||||
}
|
|
||||||
taskDao.touch(tasks);
|
|
||||||
localBroadcastManager.broadcastRefresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void migrateLocalTasks() {
|
|
||||||
CaldavCalendar list = caldavDao.getLocalList(context);
|
|
||||||
move(taskDao.getLocalTasks(), new CaldavFilter(list));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void performMove(Task task, @NonNull Filter selectedList) {
|
|
||||||
long id = task.getId();
|
|
||||||
|
|
||||||
GoogleTask googleTask = googleTaskDao.getByTaskId(id);
|
|
||||||
if (googleTask != null) {
|
|
||||||
moveGoogleTask(task, googleTask, selectedList);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CaldavTask caldavTask = caldavDao.getTask(id);
|
|
||||||
if (caldavTask != null) {
|
|
||||||
moveCaldavTask(task, caldavTask, selectedList);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
moveLocalTask(task, selectedList);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void moveGoogleTask(Task task, GoogleTask googleTask, @NonNull Filter selected) {
|
|
||||||
if (selected instanceof GtasksFilter
|
|
||||||
&& googleTask.getListId().equals(((GtasksFilter) selected).getRemoteId())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
long id = googleTask.getTask();
|
|
||||||
List<GoogleTask> children = googleTaskDao.getChildren(id);
|
|
||||||
List<Long> childIds = from(children).transform(GoogleTask::getTask).toList();
|
|
||||||
googleTaskDao.markDeleted(id, now());
|
|
||||||
|
|
||||||
if (selected instanceof GtasksFilter) {
|
|
||||||
String listId = ((GtasksFilter) selected).getRemoteId();
|
|
||||||
googleTaskDao.insertAndShift(new GoogleTask(id, listId), preferences.addTasksToTop());
|
|
||||||
if (!children.isEmpty()) {
|
|
||||||
googleTaskDao.insert(
|
|
||||||
transform(
|
|
||||||
children,
|
|
||||||
child -> {
|
|
||||||
GoogleTask newChild = new GoogleTask(child.getTask(), listId);
|
|
||||||
newChild.setOrder(child.getOrder());
|
|
||||||
newChild.setParent(id);
|
|
||||||
return newChild;
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
} else if (selected instanceof CaldavFilter) {
|
|
||||||
String listId = ((CaldavFilter) selected).getUuid();
|
|
||||||
CaldavTask newParent = new CaldavTask(id, listId);
|
|
||||||
caldavDao.insert(task, newParent, preferences.addTasksToTop());
|
|
||||||
caldavDao.insert(
|
|
||||||
transform(
|
|
||||||
childIds,
|
|
||||||
child -> {
|
|
||||||
CaldavTask newChild = new CaldavTask(child, listId);
|
|
||||||
newChild.setRemoteParent(newParent.getRemoteId());
|
|
||||||
return newChild;
|
|
||||||
}));
|
|
||||||
} else if (BuildConfig.DEBUG) {
|
|
||||||
throw new IllegalArgumentException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void moveCaldavTask(Task task, CaldavTask caldavTask, @NonNull Filter selected) {
|
|
||||||
if (selected instanceof CaldavFilter
|
|
||||||
&& caldavTask.getCalendar().equals(((CaldavFilter) selected).getUuid())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
long id = task.getId();
|
|
||||||
List<Long> childIds = taskDao.getChildren(id);
|
|
||||||
List<Long> toDelete = newArrayList(id);
|
|
||||||
List<CaldavTask> children = emptyList();
|
|
||||||
if (!childIds.isEmpty()) {
|
|
||||||
children = caldavDao.getTasks(childIds);
|
|
||||||
toDelete.addAll(childIds);
|
|
||||||
}
|
|
||||||
caldavDao.markDeleted(toDelete, now());
|
|
||||||
|
|
||||||
if (selected instanceof CaldavFilter) {
|
|
||||||
long id1 = caldavTask.getTask();
|
|
||||||
String listId = ((CaldavFilter) selected).getUuid();
|
|
||||||
CaldavTask newParent =
|
|
||||||
new CaldavTask(id1, listId, caldavTask.getRemoteId(), caldavTask.getObject());
|
|
||||||
newParent.setVtodo(caldavTask.getVtodo());
|
|
||||||
caldavDao.insert(task, newParent, preferences.addTasksToTop());
|
|
||||||
caldavDao.insert(
|
|
||||||
transform(
|
|
||||||
children,
|
|
||||||
child -> {
|
|
||||||
CaldavTask newChild =
|
|
||||||
new CaldavTask(child.getTask(), listId, child.getRemoteId(), child.getObject());
|
|
||||||
newChild.setVtodo(child.getVtodo());
|
|
||||||
newChild.setRemoteParent(child.getRemoteParent());
|
|
||||||
return newChild;
|
|
||||||
}));
|
|
||||||
} else if (selected instanceof GtasksFilter) {
|
|
||||||
moveToGoogleTasks(id, childIds, (GtasksFilter) selected);
|
|
||||||
} else if (BuildConfig.DEBUG) {
|
|
||||||
throw new IllegalArgumentException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void moveLocalTask(Task task, @NonNull Filter selected) {
|
|
||||||
if (selected instanceof GtasksFilter) {
|
|
||||||
moveToGoogleTasks(task.getId(), taskDao.getChildren(task.getId()), (GtasksFilter) selected);
|
|
||||||
} else if (selected instanceof CaldavFilter) {
|
|
||||||
long id = task.getId();
|
|
||||||
String listId = ((CaldavFilter) selected).getUuid();
|
|
||||||
Map<Long, CaldavTask> tasks = new HashMap<>();
|
|
||||||
CaldavTask root = new CaldavTask(id, listId);
|
|
||||||
for (Task child : taskDao.fetchChildren(task.getId())) {
|
|
||||||
CaldavTask newTask = new CaldavTask(child.getId(), listId);
|
|
||||||
long parent = child.getParent();
|
|
||||||
newTask.setRemoteParent((parent == id ? root : tasks.get(parent)).getRemoteId());
|
|
||||||
tasks.put(child.getId(), newTask);
|
|
||||||
}
|
|
||||||
caldavDao.insert(task, root, preferences.addTasksToTop());
|
|
||||||
caldavDao.insert(tasks.values());
|
|
||||||
} else if (BuildConfig.DEBUG) {
|
|
||||||
throw new IllegalArgumentException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void moveToGoogleTasks(long id, List<Long> children, GtasksFilter filter) {
|
|
||||||
taskDao.setParent(0, children);
|
|
||||||
String listId = filter.getRemoteId();
|
|
||||||
googleTaskDao.insertAndShift(new GoogleTask(id, listId), preferences.addTasksToTop());
|
|
||||||
List<GoogleTask> newChildren = new ArrayList<>();
|
|
||||||
for (int i = 0; i < children.size(); i++) {
|
|
||||||
GoogleTask newChild = new GoogleTask(children.get(i), listId);
|
|
||||||
newChild.setOrder(i);
|
|
||||||
newChild.setParent(id);
|
|
||||||
newChildren.add(newChild);
|
|
||||||
}
|
|
||||||
googleTaskDao.insert(newChildren);
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,179 @@
|
|||||||
|
package com.todoroo.astrid.service
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import com.todoroo.andlib.utility.DateUtilities
|
||||||
|
import com.todoroo.astrid.api.CaldavFilter
|
||||||
|
import com.todoroo.astrid.api.Filter
|
||||||
|
import com.todoroo.astrid.api.GtasksFilter
|
||||||
|
import com.todoroo.astrid.dao.TaskDao
|
||||||
|
import com.todoroo.astrid.data.Task
|
||||||
|
import org.tasks.BuildConfig
|
||||||
|
import org.tasks.LocalBroadcastManager
|
||||||
|
import org.tasks.data.*
|
||||||
|
import org.tasks.injection.ForApplication
|
||||||
|
import org.tasks.preferences.Preferences
|
||||||
|
import java.util.*
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class TaskMover @Inject constructor(
|
||||||
|
@param:ForApplication private val context: Context,
|
||||||
|
private val taskDao: TaskDao,
|
||||||
|
private val caldavDao: CaldavDao,
|
||||||
|
private val googleTaskDao: GoogleTaskDao,
|
||||||
|
private val googleTaskListDao: GoogleTaskListDao,
|
||||||
|
private val preferences: Preferences,
|
||||||
|
private val localBroadcastManager: LocalBroadcastManager) {
|
||||||
|
|
||||||
|
fun getSingleFilter(tasks: List<Long>): Filter? {
|
||||||
|
val caldavCalendars = caldavDao.getCalendars(tasks)
|
||||||
|
val googleTaskLists = googleTaskDao.getLists(tasks)
|
||||||
|
if (caldavCalendars.isEmpty()) {
|
||||||
|
if (googleTaskLists.size == 1) {
|
||||||
|
return GtasksFilter(googleTaskListDao.getByRemoteId(googleTaskLists[0]))
|
||||||
|
}
|
||||||
|
} else if (googleTaskLists.isEmpty()) {
|
||||||
|
if (caldavCalendars.size == 1) {
|
||||||
|
return CaldavFilter(caldavDao.getCalendar(caldavCalendars[0]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
fun move(tasks: List<Long>, selectedList: Filter) {
|
||||||
|
var tasks = tasks
|
||||||
|
tasks = ArrayList(tasks)
|
||||||
|
tasks.removeAll(googleTaskDao.findChildrenInList(tasks))
|
||||||
|
tasks.removeAll(taskDao.findChildrenInList(tasks))
|
||||||
|
taskDao.setParent(0, tasks)
|
||||||
|
for (task in taskDao.fetch(tasks)) {
|
||||||
|
performMove(task, selectedList)
|
||||||
|
}
|
||||||
|
if (selectedList is CaldavFilter) {
|
||||||
|
caldavDao.updateParents(selectedList.uuid)
|
||||||
|
}
|
||||||
|
taskDao.touch(tasks)
|
||||||
|
localBroadcastManager.broadcastRefresh()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun migrateLocalTasks() {
|
||||||
|
val list = caldavDao.getLocalList(context)
|
||||||
|
move(taskDao.getLocalTasks(), CaldavFilter(list))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun performMove(task: Task, selectedList: Filter) {
|
||||||
|
googleTaskDao.getByTaskId(task.id)?.let {
|
||||||
|
moveGoogleTask(task, it, selectedList)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
caldavDao.getTask(task.id)?.let {
|
||||||
|
moveCaldavTask(task, it, selectedList)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
moveLocalTask(task, selectedList)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun moveGoogleTask(task: Task, googleTask: GoogleTask, selected: Filter) {
|
||||||
|
if (selected is GtasksFilter && googleTask.listId == selected.remoteId) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val id = googleTask.task
|
||||||
|
val children = googleTaskDao.getChildren(id)
|
||||||
|
val childIds = children.map(GoogleTask::task)
|
||||||
|
googleTaskDao.markDeleted(id, DateUtilities.now())
|
||||||
|
when(selected) {
|
||||||
|
is GtasksFilter -> {
|
||||||
|
val listId = selected.remoteId
|
||||||
|
googleTaskDao.insertAndShift(GoogleTask(id, listId), preferences.addTasksToTop())
|
||||||
|
children.takeIf { it.isNotEmpty() }
|
||||||
|
?.map {
|
||||||
|
val newChild = GoogleTask(it.task, listId)
|
||||||
|
newChild.order = it.order
|
||||||
|
newChild.parent = id
|
||||||
|
newChild
|
||||||
|
}
|
||||||
|
?.apply(googleTaskDao::insert)
|
||||||
|
}
|
||||||
|
is CaldavFilter -> {
|
||||||
|
val listId = selected.uuid
|
||||||
|
val newParent = CaldavTask(id, listId)
|
||||||
|
caldavDao.insert(task, newParent, preferences.addTasksToTop())
|
||||||
|
childIds.map {
|
||||||
|
val newChild = CaldavTask(it, listId)
|
||||||
|
newChild.remoteParent = newParent.remoteId
|
||||||
|
newChild
|
||||||
|
}.apply(caldavDao::insert)
|
||||||
|
}
|
||||||
|
else -> require(!BuildConfig.DEBUG)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun moveCaldavTask(task: Task, caldavTask: CaldavTask, selected: Filter) {
|
||||||
|
if (selected is CaldavFilter
|
||||||
|
&& caldavTask.calendar == selected.uuid) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val id = task.id
|
||||||
|
val childIds = taskDao.getChildren(id)
|
||||||
|
val toDelete = arrayListOf(id)
|
||||||
|
var children: List<CaldavTask> = emptyList()
|
||||||
|
if (childIds.isNotEmpty()) {
|
||||||
|
children = caldavDao.getTasks(childIds)
|
||||||
|
toDelete.addAll(childIds)
|
||||||
|
}
|
||||||
|
caldavDao.markDeleted(toDelete, DateUtilities.now())
|
||||||
|
when (selected) {
|
||||||
|
is CaldavFilter -> {
|
||||||
|
val id1 = caldavTask.task
|
||||||
|
val listId = selected.uuid
|
||||||
|
val newParent = CaldavTask(id1, listId, caldavTask.remoteId, caldavTask.`object`)
|
||||||
|
newParent.vtodo = caldavTask.vtodo
|
||||||
|
caldavDao.insert(task, newParent, preferences.addTasksToTop())
|
||||||
|
children.takeIf { it.isNotEmpty() }
|
||||||
|
?.map {
|
||||||
|
val newChild = CaldavTask(it.task, listId, it.remoteId, it.`object`)
|
||||||
|
newChild.vtodo = it.vtodo
|
||||||
|
newChild.remoteParent = it.remoteParent
|
||||||
|
newChild
|
||||||
|
}
|
||||||
|
?.apply(caldavDao::insert)
|
||||||
|
}
|
||||||
|
is GtasksFilter -> moveToGoogleTasks(id, childIds, selected)
|
||||||
|
else -> require(!BuildConfig.DEBUG)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun moveLocalTask(task: Task, selected: Filter) {
|
||||||
|
when (selected) {
|
||||||
|
is GtasksFilter -> moveToGoogleTasks(task.id, taskDao.getChildren(task.id), selected)
|
||||||
|
is CaldavFilter -> {
|
||||||
|
val id = task.id
|
||||||
|
val listId = selected.uuid
|
||||||
|
val tasks: MutableMap<Long, CaldavTask> = HashMap()
|
||||||
|
val root = CaldavTask(id, listId)
|
||||||
|
for (child in taskDao.fetchChildren(task.id)) {
|
||||||
|
val newTask = CaldavTask(child.id, listId)
|
||||||
|
val parent = child.parent
|
||||||
|
newTask.remoteParent = (if (parent == id) root else tasks[parent])!!.remoteId
|
||||||
|
tasks[child.id] = newTask
|
||||||
|
}
|
||||||
|
caldavDao.insert(task, root, preferences.addTasksToTop())
|
||||||
|
caldavDao.insert(tasks.values)
|
||||||
|
}
|
||||||
|
else -> require(!BuildConfig.DEBUG)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun moveToGoogleTasks(id: Long, children: List<Long>, filter: GtasksFilter) {
|
||||||
|
taskDao.setParent(0, children)
|
||||||
|
val listId = filter.remoteId
|
||||||
|
googleTaskDao.insertAndShift(GoogleTask(id, listId), preferences.addTasksToTop())
|
||||||
|
children.takeIf { it.isNotEmpty() }
|
||||||
|
?.mapIndexed { index, task ->
|
||||||
|
val newChild = GoogleTask(task, listId)
|
||||||
|
newChild.order = index.toLong()
|
||||||
|
newChild.parent = id
|
||||||
|
newChild
|
||||||
|
}
|
||||||
|
?.apply(googleTaskDao::insert)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue