@ -1,19 +1,16 @@
package com.todoroo.astrid.service
package com.todoroo.astrid.service
import org.tasks.BuildConfig
import org.tasks.LocalBroadcastManager
import org.tasks.LocalBroadcastManager
import org.tasks.caldav.VtodoCache
import org.tasks.caldav.VtodoCache
import org.tasks.data.dao.CaldavDao
import org.tasks.data.dao.CaldavDao
import org.tasks.data.dao.GoogleTaskDao
import org.tasks.data.dao.GoogleTaskDao
import org.tasks.data.dao.TaskDao
import org.tasks.data.dao.TaskDao
import org.tasks.data.db.DbUtils.dbchunk
import org.tasks.data.db.DbUtils.dbchunk
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavTask
import org.tasks.data.entity.CaldavTask
import org.tasks.data.entity.Task
import org.tasks.data.entity.Task
import org.tasks.data.getLocalList
import org.tasks.data.getLocalList
import org.tasks.filters.CaldavFilter
import org.tasks.filters.CaldavFilter
import org.tasks.filters.Filter
import org.tasks.filters.Filter
import org.tasks.filters.GtasksFilter
import org.tasks.preferences.Preferences
import org.tasks.preferences.Preferences
import org.tasks.sync.SyncAdapters
import org.tasks.sync.SyncAdapters
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import org.tasks.time.DateTimeUtils2.currentTimeMillis
@ -31,16 +28,13 @@ class TaskMover @Inject constructor(
suspend fun getSingleFilter ( tasks : List < Long > ) : Filter ? {
suspend fun getSingleFilter ( tasks : List < Long > ) : Filter ? {
val caldavCalendars = caldavDao . getCalendars ( tasks )
val caldavCalendars = caldavDao . getCalendars ( tasks )
if ( caldavCalendars . size == 1 ) {
return if ( caldavCalendars . size == 1 ) {
val list = caldavCalendars . first ( )
val list = caldavCalendars . first ( )
val account = list . account ?. let { caldavDao . getAccountByUuid ( it ) }
val account = list . account ?. let { caldavDao . getAccountByUuid ( it ) }
return when ( account ?. accountType ) {
account ?. let { CaldavFilter ( calendar = list , account = it ) }
null -> null
} else {
CaldavAccount . TYPE _GOOGLE _TASKS -> GtasksFilter ( list )
null
else -> CaldavFilter ( list )
}
}
}
return null
}
}
suspend fun move ( task : Long , list : Long ) {
suspend fun move ( task : Long , list : Long ) {
@ -48,14 +42,11 @@ class TaskMover @Inject constructor(
val account = calendar . account ?. let { caldavDao . getAccountByUuid ( it ) } ?: return
val account = calendar . account ?. let { caldavDao . getAccountByUuid ( it ) } ?: return
move (
move (
ids = listOf ( task ) ,
ids = listOf ( task ) ,
selectedList = if ( account . accountType == CaldavAccount . TYPE _GOOGLE _TASKS )
selectedList = CaldavFilter ( calendar = calendar , account = account ) ,
GtasksFilter ( calendar )
else
CaldavFilter ( calendar )
)
)
}
}
suspend fun move ( ids : List < Long > , selectedList : Filter) {
suspend fun move ( ids : List < Long > , selectedList : Caldav Filter) {
val tasks = ids
val tasks = ids
. dbchunk ( )
. dbchunk ( )
. flatMap { taskDao . getChildren ( it ) }
. flatMap { taskDao . getChildren ( it ) }
@ -64,7 +55,7 @@ class TaskMover @Inject constructor(
val taskIds = tasks . map { it . id }
val taskIds = tasks . map { it . id }
taskDao . setParent ( 0 , ids . intersect ( taskIds . toSet ( ) ) . toList ( ) )
taskDao . setParent ( 0 , ids . intersect ( taskIds . toSet ( ) ) . toList ( ) )
tasks . forEach { performMove ( it , selectedList ) }
tasks . forEach { performMove ( it , selectedList ) }
if ( selectedList is CaldavFilte r) {
if ( selectedList . isIcalenda r) {
caldavDao . updateParents ( selectedList . uuid )
caldavDao . updateParents ( selectedList . uuid )
}
}
taskIds . dbchunk ( ) . forEach {
taskIds . dbchunk ( ) . forEach {
@ -76,10 +67,11 @@ class TaskMover @Inject constructor(
suspend fun migrateLocalTasks ( ) {
suspend fun migrateLocalTasks ( ) {
val list = caldavDao . getLocalList ( )
val list = caldavDao . getLocalList ( )
move ( taskDao . getLocalTasks ( ) , CaldavFilter ( list ) )
val account = list . account ?. let { caldavDao . getAccountByUuid ( it ) } ?: return
move ( taskDao . getLocalTasks ( ) , CaldavFilter ( calendar = list , account = account ) )
}
}
private suspend fun performMove ( task : Task , selectedList : Filter) {
private suspend fun performMove ( task : Task , selectedList : Caldav Filter) {
googleTaskDao . getByTaskId ( task . id ) ?. let {
googleTaskDao . getByTaskId ( task . id ) ?. let {
moveGoogleTask ( task , it , selectedList )
moveGoogleTask ( task , it , selectedList )
return
return
@ -91,16 +83,16 @@ class TaskMover @Inject constructor(
moveLocalTask ( task , selectedList )
moveLocalTask ( task , selectedList )
}
}
private suspend fun moveGoogleTask ( task : Task , googleTask : CaldavTask , selected : Filter) {
private suspend fun moveGoogleTask ( task : Task , googleTask : CaldavTask , selected : Caldav Filter) {
if ( selected is GtasksFilter && googleTask. calendar == selected . remoteI d) {
if ( googleTask. calendar == selected . uui d) {
return
return
}
}
val id = task . id
val id = task . id
val children = taskDao . getChildren ( id )
val children = taskDao . getChildren ( id )
caldavDao . markDeleted ( children + id , currentTimeMillis ( ) )
caldavDao . markDeleted ( children + id , currentTimeMillis ( ) )
when ( selected ) {
when {
is GtasksFilter -> {
selected . isGoogleTasks -> {
val listId = selected . remoteI d
val listId = selected . uui d
googleTaskDao . insertAndShift (
googleTaskDao . insertAndShift (
task = task ,
task = task ,
caldavTask = CaldavTask (
caldavTask = CaldavTask (
@ -120,7 +112,7 @@ class TaskMover @Inject constructor(
}
}
?. let { googleTaskDao . insert ( it ) }
?. let { googleTaskDao . insert ( it ) }
}
}
is CaldavFilter -> {
else -> {
val listId = selected . uuid
val listId = selected . uuid
val newParent = CaldavTask (
val newParent = CaldavTask (
task = id ,
task = id ,
@ -136,13 +128,11 @@ class TaskMover @Inject constructor(
newChild
newChild
} . let { caldavDao . insert ( it ) }
} . let { caldavDao . insert ( it ) }
}
}
else -> require ( ! BuildConfig . DEBUG )
}
}
}
}
private suspend fun moveCaldavTask ( task : Task , caldavTask : CaldavTask , selected : Filter ) {
private suspend fun moveCaldavTask ( task : Task , caldavTask : CaldavTask , selected : CaldavFilter ) {
if ( selected is CaldavFilter
if ( caldavTask . calendar == selected . uuid ) {
&& caldavTask . calendar == selected . uuid ) {
return
return
}
}
val id = task . id
val id = task . id
@ -154,8 +144,9 @@ class TaskMover @Inject constructor(
toDelete . addAll ( childIds )
toDelete . addAll ( childIds )
}
}
caldavDao . markDeleted ( toDelete , currentTimeMillis ( ) )
caldavDao . markDeleted ( toDelete , currentTimeMillis ( ) )
when ( selected ) {
when {
is CaldavFilter -> {
selected . isGoogleTasks -> moveToGoogleTasks ( id , childIds , selected )
else -> {
val from = caldavDao . getCalendar ( caldavTask . calendar !! )
val from = caldavDao . getCalendar ( caldavTask . calendar !! )
val id1 = caldavTask . task
val id1 = caldavTask . task
val listId = selected . uuid
val listId = selected . uuid
@ -181,15 +172,13 @@ class TaskMover @Inject constructor(
}
}
?. let { caldavDao . insert ( it ) }
?. let { caldavDao . insert ( it ) }
}
}
is GtasksFilter -> moveToGoogleTasks ( id , childIds , selected )
else -> require ( ! BuildConfig . DEBUG )
}
}
}
}
private suspend fun moveLocalTask ( task : Task , selected : Filter) {
private suspend fun moveLocalTask ( task : Task , selected : Caldav Filter) {
when (selected ) {
when {
is GtasksFilter -> moveToGoogleTasks ( task . id , taskDao . getChildren ( task . id ) , selected )
selected . isGoogleTasks -> moveToGoogleTasks ( task . id , taskDao . getChildren ( task . id ) , selected )
is CaldavFilter -> {
else -> {
val id = task . id
val id = task . id
val listId = selected . uuid
val listId = selected . uuid
val tasks : MutableMap < Long , CaldavTask > = HashMap ( )
val tasks : MutableMap < Long , CaldavTask > = HashMap ( )
@ -210,14 +199,16 @@ class TaskMover @Inject constructor(
caldavDao . insert ( task , root , preferences . addTasksToTop ( ) )
caldavDao . insert ( task , root , preferences . addTasksToTop ( ) )
caldavDao . insert ( tasks . values )
caldavDao . insert ( tasks . values )
}
}
else -> require ( ! BuildConfig . DEBUG )
}
}
}
}
private suspend fun moveToGoogleTasks ( id : Long , children : List < Long > , filter : GtasksFilter ) {
private suspend fun moveToGoogleTasks ( id : Long , children : List < Long > , filter : CaldavFilter ) {
if ( ! filter . isGoogleTasks ) {
return
}
val task = taskDao . fetch ( id ) ?: return
val task = taskDao . fetch ( id ) ?: return
taskDao . setParent ( id , children )
taskDao . setParent ( id , children )
val listId = filter . remoteId
val listId = filter . uui d
googleTaskDao . insertAndShift (
googleTaskDao . insertAndShift (
task ,
task ,
CaldavTask (
CaldavTask (