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
4 years ago
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)
}
}