You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tasks/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapterProvider.kt

98 lines
4.1 KiB
Kotlin

package com.todoroo.astrid.adapter
import android.content.Context
import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.TagFilter
import com.todoroo.astrid.core.BuiltInFilterExposer
import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task.Companion.isUuidEmpty
import com.todoroo.astrid.service.TaskMover
import com.todoroo.astrid.subtasks.SubtasksFilterUpdater
import com.todoroo.astrid.subtasks.SubtasksHelper
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.runBlocking
import org.tasks.LocalBroadcastManager
import org.tasks.Strings.isNullOrEmpty
import org.tasks.data.CaldavDao
import org.tasks.data.GoogleTaskDao
import org.tasks.data.TaskListMetadata
import org.tasks.data.TaskListMetadataDao
import org.tasks.preferences.Preferences
import javax.inject.Inject
class TaskAdapterProvider @Inject constructor(
@param:ApplicationContext private val context: Context,
private val preferences: Preferences,
private val taskListMetadataDao: TaskListMetadataDao,
private val taskDao: TaskDao,
private val googleTaskDao: GoogleTaskDao,
private val caldavDao: CaldavDao,
private val localBroadcastManager: LocalBroadcastManager,
private val taskMover: TaskMover,
) {
fun createTaskAdapter(filter: Filter): TaskAdapter {
if (filter.supportsAstridSorting() && preferences.isAstridSort) {
when (filter) {
is TagFilter -> return createManualTagTaskAdapter(filter)
else -> {
val adapter = createManualFilterTaskAdapter(filter)
if (adapter != null) {
return adapter
}
}
}
}
return TaskAdapter(
newTasksOnTop = if (filter.supportsManualSort() && preferences.isManualSort) false else preferences.addTasksToTop(),
googleTaskDao = googleTaskDao,
caldavDao = caldavDao,
taskDao = taskDao,
localBroadcastManager = localBroadcastManager,
taskMover = taskMover
)
}
private fun createManualTagTaskAdapter(filter: TagFilter): TaskAdapter = runBlocking {
val tagData = filter.tagData
val tdId = tagData.remoteId
var list = taskListMetadataDao.fetchByTagOrFilter(tagData.remoteId!!)
if (list == null && !isUuidEmpty(tdId)) {
list = TaskListMetadata()
list.tagUuid = tdId
taskListMetadataDao.createNew(list)
}
val updater = SubtasksFilterUpdater(taskListMetadataDao, taskDao)
updater.initialize(list, filter)
AstridTaskAdapter(list!!, filter, updater, googleTaskDao, caldavDao, taskDao, localBroadcastManager, taskMover)
}
private fun createManualFilterTaskAdapter(filter: Filter): TaskAdapter? = runBlocking {
var filterId: String? = null
var prefId: String? = null
if (BuiltInFilterExposer.isInbox(context, filter)) {
filterId = TaskListMetadata.FILTER_ID_ALL
prefId = SubtasksFilterUpdater.ACTIVE_TASKS_ORDER
} else if (BuiltInFilterExposer.isTodayFilter(context, filter)) {
filterId = TaskListMetadata.FILTER_ID_TODAY
prefId = SubtasksFilterUpdater.TODAY_TASKS_ORDER
}
if (filterId.isNullOrBlank()) {
return@runBlocking null
}
var list = taskListMetadataDao.fetchByTagOrFilter(filterId)
if (list == null) {
var defaultOrder = preferences.getStringValue(prefId)
if (isNullOrEmpty(defaultOrder)) {
defaultOrder = "[]" // $NON-NLS-1$
}
defaultOrder = SubtasksHelper.convertTreeToRemoteIds(taskDao, defaultOrder)
list = TaskListMetadata()
list.filter = filterId
list.taskIds = defaultOrder
taskListMetadataDao.createNew(list)
}
val updater = SubtasksFilterUpdater(taskListMetadataDao, taskDao)
updater.initialize(list, filter)
AstridTaskAdapter(list, filter, updater, googleTaskDao, caldavDao, taskDao, localBroadcastManager, taskMover)
}
}