Use coroutines in task mover

pull/1051/head
Alex Baker 4 years ago
parent f4ad55b42d
commit 990003da66

@ -55,6 +55,7 @@ import org.tasks.LocalBroadcastManager
import org.tasks.R import org.tasks.R
import org.tasks.ShortcutManager import org.tasks.ShortcutManager
import org.tasks.activities.* import org.tasks.activities.*
import org.tasks.activities.ListPicker.Companion.newListPicker
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.data.TagDataDao import org.tasks.data.TagDataDao
@ -522,9 +523,11 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
} }
} }
REQUEST_MOVE_TASKS -> if (resultCode == Activity.RESULT_OK) { REQUEST_MOVE_TASKS -> if (resultCode == Activity.RESULT_OK) {
taskMover.move( lifecycleScope.launch {
taskAdapter.getSelected(), taskMover.move(
data!!.getParcelableExtra(ListPicker.EXTRA_SELECTED_FILTER)) taskAdapter.getSelected(),
data!!.getParcelableExtra(ListPicker.EXTRA_SELECTED_FILTER))
}
finishActionMode() finishActionMode()
} }
REQUEST_LIST_SETTINGS -> if (resultCode == Activity.RESULT_OK) { REQUEST_LIST_SETTINGS -> if (resultCode == Activity.RESULT_OK) {
@ -625,9 +628,15 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
true true
} }
R.id.move_tasks -> { R.id.move_tasks -> {
val singleFilter = taskMover.getSingleFilter(selected) lifecycleScope.launch {
(if (singleFilter == null) ListPicker.newListPicker(this, REQUEST_MOVE_TASKS) else ListPicker.newListPicker(singleFilter, this, REQUEST_MOVE_TASKS)) val singleFilter = taskMover.getSingleFilter(selected)
.show(parentFragmentManager, FRAG_TAG_REMOTE_LIST_PICKER) val fragment = if (singleFilter == null) {
newListPicker(this@TaskListFragment, REQUEST_MOVE_TASKS)
} else {
newListPicker(singleFilter, this@TaskListFragment, REQUEST_MOVE_TASKS)
}
fragment.show(parentFragmentManager, FRAG_TAG_REMOTE_LIST_PICKER)
}
true true
} }
R.id.menu_select_all -> { R.id.menu_select_all -> {

@ -5,9 +5,10 @@ import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.api.CaldavFilter import com.todoroo.astrid.api.CaldavFilter
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.dao.TaskDaoBlocking import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.runBlocking
import org.tasks.BuildConfig import org.tasks.BuildConfig
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.data.* import org.tasks.data.*
@ -18,14 +19,14 @@ import javax.inject.Inject
class TaskMover @Inject constructor( class TaskMover @Inject constructor(
@param:ApplicationContext private val context: Context, @param:ApplicationContext private val context: Context,
private val taskDao: TaskDaoBlocking, private val taskDao: TaskDao,
private val caldavDao: CaldavDaoBlocking, private val caldavDao: CaldavDao,
private val googleTaskDao: GoogleTaskDaoBlocking, private val googleTaskDao: GoogleTaskDao,
private val googleTaskListDao: GoogleTaskListDaoBlocking, private val googleTaskListDao: GoogleTaskListDao,
private val preferences: Preferences, private val preferences: Preferences,
private val localBroadcastManager: LocalBroadcastManager) { private val localBroadcastManager: LocalBroadcastManager) {
fun getSingleFilter(tasks: List<Long>): Filter? { suspend fun getSingleFilter(tasks: List<Long>): Filter? {
val caldavCalendars = caldavDao.getCalendars(tasks) val caldavCalendars = caldavDao.getCalendars(tasks)
val googleTaskLists = googleTaskDao.getLists(tasks) val googleTaskLists = googleTaskDao.getLists(tasks)
if (caldavCalendars.isEmpty()) { if (caldavCalendars.isEmpty()) {
@ -40,7 +41,7 @@ class TaskMover @Inject constructor(
return null return null
} }
fun move(ids: List<Long>, selectedList: Filter) { suspend fun move(ids: List<Long>, selectedList: Filter) {
val tasks = ArrayList(ids) val tasks = ArrayList(ids)
ids.dbchunk().forEach { ids.dbchunk().forEach {
tasks.removeAll(googleTaskDao.getChildren(it)) tasks.removeAll(googleTaskDao.getChildren(it))
@ -57,12 +58,13 @@ class TaskMover @Inject constructor(
localBroadcastManager.broadcastRefresh() localBroadcastManager.broadcastRefresh()
} }
fun migrateLocalTasks() { // TODO: remove runBlocking
fun migrateLocalTasks() = runBlocking {
val list = caldavDao.getLocalList(context) val list = caldavDao.getLocalList(context)
move(taskDao.getLocalTasks(), CaldavFilter(list)) move(taskDao.getLocalTasks(), CaldavFilter(list))
} }
private fun performMove(task: Task, selectedList: Filter) { private suspend fun performMove(task: Task, selectedList: Filter) {
googleTaskDao.getByTaskId(task.id)?.let { googleTaskDao.getByTaskId(task.id)?.let {
moveGoogleTask(task, it, selectedList) moveGoogleTask(task, it, selectedList)
return return
@ -74,7 +76,7 @@ class TaskMover @Inject constructor(
moveLocalTask(task, selectedList) moveLocalTask(task, selectedList)
} }
private fun moveGoogleTask(task: Task, googleTask: GoogleTask, selected: Filter) { private suspend fun moveGoogleTask(task: Task, googleTask: GoogleTask, selected: Filter) {
if (selected is GtasksFilter && googleTask.listId == selected.remoteId) { if (selected is GtasksFilter && googleTask.listId == selected.remoteId) {
return return
} }
@ -93,7 +95,7 @@ class TaskMover @Inject constructor(
newChild.parent = id newChild.parent = id
newChild newChild
} }
?.apply(googleTaskDao::insert) ?.let { googleTaskDao.insert(it) }
} }
is CaldavFilter -> { is CaldavFilter -> {
val listId = selected.uuid val listId = selected.uuid
@ -103,13 +105,13 @@ class TaskMover @Inject constructor(
val newChild = CaldavTask(it, listId) val newChild = CaldavTask(it, listId)
newChild.remoteParent = newParent.remoteId newChild.remoteParent = newParent.remoteId
newChild newChild
}.apply(caldavDao::insert) }.let { caldavDao.insert(it) }
} }
else -> require(!BuildConfig.DEBUG) else -> require(!BuildConfig.DEBUG)
} }
} }
private fun moveCaldavTask(task: Task, caldavTask: CaldavTask, selected: Filter) { private suspend fun moveCaldavTask(task: Task, caldavTask: CaldavTask, selected: Filter) {
if (selected is CaldavFilter if (selected is CaldavFilter
&& caldavTask.calendar == selected.uuid) { && caldavTask.calendar == selected.uuid) {
return return
@ -137,14 +139,14 @@ class TaskMover @Inject constructor(
newChild.remoteParent = it.remoteParent newChild.remoteParent = it.remoteParent
newChild newChild
} }
?.apply(caldavDao::insert) ?.let { caldavDao.insert(it) }
} }
is GtasksFilter -> moveToGoogleTasks(id, childIds, selected) is GtasksFilter -> moveToGoogleTasks(id, childIds, selected)
else -> require(!BuildConfig.DEBUG) else -> require(!BuildConfig.DEBUG)
} }
} }
private fun moveLocalTask(task: Task, selected: Filter) { private suspend fun moveLocalTask(task: Task, selected: Filter) {
when (selected) { when (selected) {
is GtasksFilter -> moveToGoogleTasks(task.id, taskDao.getChildren(task.id), selected) is GtasksFilter -> moveToGoogleTasks(task.id, taskDao.getChildren(task.id), selected)
is CaldavFilter -> { is CaldavFilter -> {
@ -165,7 +167,7 @@ class TaskMover @Inject constructor(
} }
} }
private fun moveToGoogleTasks(id: Long, children: List<Long>, filter: GtasksFilter) { private suspend fun moveToGoogleTasks(id: Long, children: List<Long>, filter: GtasksFilter) {
taskDao.setParent(0, children) taskDao.setParent(0, children)
val listId = filter.remoteId val listId = filter.remoteId
googleTaskDao.insertAndShift(GoogleTask(id, listId), preferences.addTasksToTop()) googleTaskDao.insertAndShift(GoogleTask(id, listId), preferences.addTasksToTop())
@ -176,6 +178,6 @@ class TaskMover @Inject constructor(
newChild.parent = id newChild.parent = id
newChild newChild
} }
?.apply(googleTaskDao::insert) ?.let { googleTaskDao.insert(it) }
} }
} }
Loading…
Cancel
Save