Remove GtasksFilter

pull/3221/head
Alex Baker 11 months ago
parent e5d6723e23
commit dd06decc40

@ -2,9 +2,7 @@ package com.todoroo.astrid.adapter
import com.natpryce.makeiteasy.MakeItEasy.with
import com.natpryce.makeiteasy.PropertyValue
import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.dao.TaskDao
import org.tasks.data.entity.Task
import com.todoroo.astrid.service.TaskMover
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules
@ -15,11 +13,15 @@ import org.junit.Before
import org.junit.Test
import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.data.entity.CaldavCalendar
import org.tasks.data.dao.CaldavDao
import org.tasks.data.dao.GoogleTaskDao
import org.tasks.data.TaskContainer
import org.tasks.data.TaskListQuery.getQuery
import org.tasks.data.dao.CaldavDao
import org.tasks.data.dao.GoogleTaskDao
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_CALDAV
import org.tasks.data.entity.CaldavCalendar
import org.tasks.data.entity.Task
import org.tasks.filters.CaldavFilter
import org.tasks.injection.InjectingTestCase
import org.tasks.injection.ProductionModule
import org.tasks.makers.CaldavTaskMaker.CALENDAR
@ -45,7 +47,10 @@ class CaldavManualSortTaskAdapterTest : InjectingTestCase() {
private lateinit var adapter: CaldavManualSortTaskAdapter
private val tasks = ArrayList<TaskContainer>()
private val filter = CaldavFilter(CaldavCalendar(name = "calendar", uuid = "1234"))
private val filter = CaldavFilter(
calendar = CaldavCalendar(name = "calendar", uuid = "1234"),
account = CaldavAccount(accountType = TYPE_CALDAV)
)
private val dataSource = object : TaskAdapterDataSource {
override fun getItem(position: Int) = tasks[position]

@ -2,7 +2,6 @@ package com.todoroo.astrid.adapter
import com.natpryce.makeiteasy.MakeItEasy.with
import com.natpryce.makeiteasy.PropertyValue
import org.tasks.filters.GtasksFilter
import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.service.TaskMover
import dagger.hilt.android.testing.HiltAndroidTest
@ -17,8 +16,11 @@ import org.tasks.data.TaskContainer
import org.tasks.data.TaskListQuery.getQuery
import org.tasks.data.dao.CaldavDao
import org.tasks.data.dao.GoogleTaskDao
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_GOOGLE_TASKS
import org.tasks.data.entity.CaldavCalendar
import org.tasks.data.entity.Task
import org.tasks.filters.CaldavFilter
import org.tasks.injection.InjectingTestCase
import org.tasks.injection.ProductionModule
import org.tasks.makers.CaldavTaskMaker.CALENDAR
@ -41,7 +43,10 @@ class GoogleTaskManualSortAdapterTest : InjectingTestCase() {
private lateinit var adapter: GoogleTaskManualSortAdapter
private val tasks = ArrayList<TaskContainer>()
private val filter = GtasksFilter(CaldavCalendar(uuid = "1234"))
private val filter = CaldavFilter(
calendar = CaldavCalendar(uuid = "1234"),
account = CaldavAccount(accountType = TYPE_GOOGLE_TASKS)
)
private val dataSource = object : TaskAdapterDataSource {
override fun getItem(position: Int) = tasks[position]

@ -1,8 +1,6 @@
package com.todoroo.astrid.service
import com.natpryce.makeiteasy.MakeItEasy.with
import org.tasks.filters.CaldavFilter
import org.tasks.filters.GtasksFilter
import com.todoroo.astrid.dao.TaskDao
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules
@ -17,6 +15,7 @@ import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_CALDAV
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_GOOGLE_TASKS
import org.tasks.data.entity.CaldavCalendar
import org.tasks.filters.CaldavFilter
import org.tasks.injection.InjectingTestCase
import org.tasks.injection.ProductionModule
import org.tasks.jobs.WorkManager
@ -306,11 +305,23 @@ class TaskMoverTest : InjectingTestCase() {
}
private suspend fun moveToGoogleTasks(list: String, vararg tasks: Long) {
taskMover.move(tasks.toList(), GtasksFilter(CaldavCalendar(uuid = list)))
taskMover.move(
tasks.toList(),
CaldavFilter(
calendar = CaldavCalendar(uuid = list),
account = CaldavAccount(accountType = TYPE_GOOGLE_TASKS)
)
)
}
private suspend fun moveToCaldavList(calendar: String, vararg tasks: Long) {
taskMover.move(tasks.toList(), CaldavFilter(CaldavCalendar(name = "", uuid = calendar)))
taskMover.move(
tasks.toList(),
CaldavFilter(
CaldavCalendar(name = "", uuid = calendar),
account = CaldavAccount(accountType = TYPE_CALDAV)
)
)
}
private suspend fun setAccountType(account: String, type: Int) {

@ -1,7 +1,6 @@
package org.tasks.data
import com.natpryce.makeiteasy.MakeItEasy.with
import org.tasks.filters.GtasksFilter
import com.todoroo.astrid.dao.TaskDao
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules
@ -13,7 +12,9 @@ import org.tasks.R
import org.tasks.data.dao.CaldavDao
import org.tasks.data.dao.GoogleTaskDao
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_GOOGLE_TASKS
import org.tasks.data.entity.CaldavCalendar
import org.tasks.filters.CaldavFilter
import org.tasks.injection.InjectingTestCase
import org.tasks.injection.ProductionModule
import org.tasks.makers.CaldavTaskMaker.CALENDAR
@ -33,7 +34,7 @@ class ManualGoogleTaskQueryTest : InjectingTestCase() {
@Inject lateinit var googleTaskDao: GoogleTaskDao
@Inject lateinit var taskDao: TaskDao
@Inject lateinit var preferences: Preferences
private lateinit var filter: GtasksFilter
private lateinit var filter: CaldavFilter
@Before
override fun setUp() {
@ -45,7 +46,7 @@ class ManualGoogleTaskQueryTest : InjectingTestCase() {
caldavDao.insert(CaldavAccount())
caldavDao.insert(calendar)
}
filter = GtasksFilter(calendar)
filter = CaldavFilter(calendar, account = CaldavAccount(accountType = TYPE_GOOGLE_TASKS))
}
@Test
@ -101,7 +102,7 @@ class ManualGoogleTaskQueryTest : InjectingTestCase() {
with(ORDER, order),
with(PARENT, parent),
))
googleTaskDao.insert(newCaldavTask(with(CALENDAR, filter.list.uuid), with(TASK, id)))
googleTaskDao.insert(newCaldavTask(with(CALENDAR, filter.uuid), with(TASK, id)))
}
private suspend fun query(): List<TaskContainer> = taskDao.fetchTasks {

@ -51,6 +51,7 @@ import org.tasks.analytics.Firebase
import org.tasks.billing.Inventory
import org.tasks.billing.PurchaseActivity
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity.Companion.EXTRA_CALDAV_ACCOUNT
import org.tasks.compose.drawer.DrawerAction
import org.tasks.compose.drawer.DrawerItem
import org.tasks.compose.drawer.MenuSearchBar
@ -200,9 +201,9 @@ class MainActivity : AppCompatActivity() {
REQUEST_NEW_LIST
)
REQUEST_NEW_LIST -> lifecycleScope.launch {
REQUEST_NEW_LIST -> {
val account =
caldavDao.getAccount(it.header.id) ?: return@launch
caldavDao.getAccount(it.header.id.toLong()) ?: return@launch
when (it.header.subheaderType) {
NavigationDrawerSubheader.SubheaderType.GOOGLE_TASKS ->
startActivityForResult(
@ -211,7 +212,7 @@ class MainActivity : AppCompatActivity() {
GoogleTaskListSettingsActivity::class.java
)
.putExtra(
GoogleTaskListSettingsActivity.EXTRA_ACCOUNT,
EXTRA_CALDAV_ACCOUNT,
account
),
REQUEST_NEW_LIST
@ -225,7 +226,7 @@ class MainActivity : AppCompatActivity() {
account.listSettingsClass()
)
.putExtra(
BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_ACCOUNT,
EXTRA_CALDAV_ACCOUNT,
account
),
REQUEST_NEW_LIST

@ -80,7 +80,6 @@ import org.tasks.R
import org.tasks.ShortcutManager
import org.tasks.TasksApplication
import org.tasks.activities.FilterSettingsActivity
import org.tasks.activities.GoogleTaskListSettingsActivity
import org.tasks.activities.PlaceSettingsActivity
import org.tasks.activities.TagSettingsActivity
import org.tasks.analytics.Firebase
@ -121,7 +120,6 @@ import org.tasks.filters.CaldavFilter
import org.tasks.filters.CustomFilter
import org.tasks.filters.Filter
import org.tasks.filters.FilterImpl
import org.tasks.filters.GtasksFilter
import org.tasks.filters.MyTasksFilter
import org.tasks.filters.PlaceFilter
import org.tasks.filters.TagFilter
@ -462,7 +460,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
when (filter) {
is CaldavFilter -> R.menu.menu_caldav_list_fragment
is CustomFilter -> R.menu.menu_custom_filter
is GtasksFilter -> R.menu.menu_gtasks_list_fragment
is TagFilter -> R.menu.menu_tag_view_fragment
is PlaceFilter -> R.menu.menu_location_list_fragment
else -> null
@ -571,15 +568,12 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
true
}
R.id.menu_caldav_list_fragment -> {
val calendar = (filter as CaldavFilter).calendar
lifecycleScope.launch {
val account = caldavDao.getAccountByUuid(calendar.account!!)
listSettingsRequest.launch(
Intent(activity, account!!.listSettingsClass())
.putExtra(BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_ACCOUNT, account)
.putExtra(BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_CALENDAR, calendar)
)
}
val filter = filter as? CaldavFilter ?: return false
listSettingsRequest.launch(
Intent(activity, filter.account.listSettingsClass())
.putExtra(BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_ACCOUNT, filter.account)
.putExtra(BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_CALENDAR, filter.calendar)
)
true
}
R.id.menu_location_settings -> {
@ -590,13 +584,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
)
true
}
R.id.menu_gtasks_list_settings -> {
listSettingsRequest.launch(
Intent(activity, GoogleTaskListSettingsActivity::class.java)
.putExtra(GoogleTaskListSettingsActivity.EXTRA_STORE_DATA, (filter as GtasksFilter).list)
)
true
}
R.id.menu_tag_settings -> {
listSettingsRequest.launch(
Intent(activity, TagSettingsActivity::class.java)

@ -7,9 +7,8 @@ import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
import org.tasks.LocalBroadcastManager
import org.tasks.activities.GoogleTaskListSettingsActivity
import org.tasks.activities.TagSettingsActivity
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity.Companion.EXTRA_CALDAV_ACCOUNT
import org.tasks.data.dao.CaldavDao
import org.tasks.data.listSettingsClass
import org.tasks.dialogs.NewFilterDialog
@ -22,9 +21,9 @@ import org.tasks.filters.NavigationDrawerSubheader.SubheaderType.CALDAV
import org.tasks.filters.NavigationDrawerSubheader.SubheaderType.GOOGLE_TASKS
import org.tasks.filters.NavigationDrawerSubheader.SubheaderType.PREFERENCE
import org.tasks.filters.NavigationDrawerSubheader.SubheaderType.TASKS
import org.tasks.preferences.TasksPreferences
import org.tasks.location.LocationPickerActivity
import org.tasks.preferences.MainPreferences
import org.tasks.preferences.TasksPreferences
import timber.log.Timber
import javax.inject.Inject
@ -66,26 +65,14 @@ class SubheaderClickHandler @Inject constructor(
)
REQUEST_NEW_LIST -> {
(activity as AppCompatActivity).lifecycleScope.launch {
val account = caldavDao.getAccount(subheader.id) ?: return@launch
val account = caldavDao.getAccount(subheader.id.toLong()) ?: return@launch
when (subheader.subheaderType) {
NavigationDrawerSubheader.SubheaderType.GOOGLE_TASKS ->
activity.startActivityForResult(
Intent(activity, GoogleTaskListSettingsActivity::class.java)
.putExtra(
GoogleTaskListSettingsActivity.EXTRA_ACCOUNT,
account
),
REQUEST_NEW_LIST
)
NavigationDrawerSubheader.SubheaderType.GOOGLE_TASKS,
NavigationDrawerSubheader.SubheaderType.CALDAV,
NavigationDrawerSubheader.SubheaderType.TASKS ->
activity.startActivityForResult(
Intent(activity, account.listSettingsClass())
.putExtra(
BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_ACCOUNT,
account
),
.putExtra(EXTRA_CALDAV_ACCOUNT, account),
REQUEST_NEW_LIST
)

@ -17,7 +17,6 @@ import org.tasks.data.entity.TaskListMetadata
import org.tasks.filters.AstridOrderingFilter
import org.tasks.filters.CaldavFilter
import org.tasks.filters.Filter
import org.tasks.filters.GtasksFilter
import org.tasks.filters.MyTasksFilter
import org.tasks.filters.TagFilter
import org.tasks.filters.TodayFilter
@ -47,9 +46,11 @@ class TaskAdapterProvider @Inject constructor(
}
}
if (filter.supportsManualSort() && preferences.isManualSort) {
when (filter) {
is GtasksFilter -> return GoogleTaskManualSortAdapter(googleTaskDao, caldavDao, taskDao, localBroadcastManager, taskMover)
is CaldavFilter -> return CaldavManualSortTaskAdapter(googleTaskDao, caldavDao, taskDao, localBroadcastManager, taskMover)
if (filter is CaldavFilter) {
when {
filter.isGoogleTasks -> return GoogleTaskManualSortAdapter(googleTaskDao, caldavDao, taskDao, localBroadcastManager, taskMover)
filter.isIcalendar -> return CaldavManualSortTaskAdapter(googleTaskDao, caldavDao, taskDao, localBroadcastManager, taskMover)
}
}
}
return TaskAdapter(preferences.addTasksToTop(), googleTaskDao, caldavDao, taskDao, localBroadcastManager, taskMover)

@ -14,7 +14,6 @@ import androidx.compose.ui.platform.ComposeView
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import net.fortuna.ical4j.model.Recur
import net.fortuna.ical4j.model.WeekDay
import org.tasks.R
@ -22,7 +21,6 @@ import org.tasks.compose.edit.RepeatRow
import org.tasks.data.dao.CaldavDao
import org.tasks.data.entity.CaldavAccount
import org.tasks.filters.CaldavFilter
import org.tasks.filters.GtasksFilter
import org.tasks.repeats.BasicRecurrenceDialog
import org.tasks.repeats.RecurrenceUtils.newRecur
import org.tasks.repeats.RepeatRuleToString
@ -91,27 +89,23 @@ class RepeatControlSet : TaskEditControlFragment() {
},
repeatAfterCompletion = viewModel.repeatAfterCompletion.collectAsStateWithLifecycle().value,
onClick = {
lifecycleScope.launch {
val accountType = viewModel.selectedList.value
.let {
when (it) {
is CaldavFilter -> it.account
is GtasksFilter -> it.account
else -> null
}
val accountType = viewModel.selectedList.value
.let {
when (it) {
is CaldavFilter -> it.account
else -> null
}
?.let { caldavDao.getAccountByUuid(it) }
?.accountType
?: CaldavAccount.TYPE_LOCAL
BasicRecurrenceDialog.newBasicRecurrenceDialog(
target = this@RepeatControlSet,
rc = REQUEST_RECURRENCE,
rrule = viewModel.recurrence.value,
dueDate = viewModel.dueDate.value,
accountType = accountType,
)
.show(parentFragmentManager, FRAG_TAG_BASIC_RECURRENCE)
}
}
?.accountType
?: CaldavAccount.TYPE_LOCAL
BasicRecurrenceDialog.newBasicRecurrenceDialog(
target = this@RepeatControlSet,
rc = REQUEST_RECURRENCE,
rrule = viewModel.recurrence.value,
dueDate = viewModel.dueDate.value,
accountType = accountType,
)
.show(parentFragmentManager, FRAG_TAG_BASIC_RECURRENCE)
},
onRepeatFromChanged = { viewModel.repeatAfterCompletion.value = it }
)

@ -33,7 +33,6 @@ import org.tasks.data.entity.Task.Companion.HIDE_UNTIL_NONE
import org.tasks.data.entity.Task.Companion.IMPORTANCE
import org.tasks.filters.CaldavFilter
import org.tasks.filters.Filter
import org.tasks.filters.GtasksFilter
import org.tasks.filters.mapFromSerializedString
import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences
@ -88,25 +87,27 @@ class TaskCreator @Inject constructor(
)
} else {
val remoteList = defaultFilterProvider.getDefaultList()
if (remoteList is GtasksFilter) {
googleTaskDao.insertAndShift(
task,
CaldavTask(
task = task.id,
calendar = remoteList.remoteId,
remoteId = null
),
addToTop
)
} else if (remoteList is CaldavFilter) {
caldavDao.insert(
task,
CaldavTask(
task = task.id,
calendar = remoteList.uuid,
),
addToTop
)
if (remoteList is CaldavFilter) {
if (remoteList.isGoogleTasks) {
googleTaskDao.insertAndShift(
task,
CaldavTask(
task = task.id,
calendar = remoteList.uuid,
remoteId = null
),
addToTop
)
} else {
caldavDao.insert(
task,
CaldavTask(
task = task.id,
calendar = remoteList.uuid,
),
addToTop
)
}
}
}
if (task.hasTransitory(Place.KEY)) {

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

@ -32,7 +32,7 @@ import org.tasks.data.entity.CaldavTask
import org.tasks.data.entity.Filter
import org.tasks.data.entity.Tag
import org.tasks.data.entity.TagData
import org.tasks.filters.GtasksFilter
import org.tasks.filters.CaldavFilter
import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences
import org.tasks.time.DateTimeUtils2.currentTimeMillis
@ -270,7 +270,10 @@ class Upgrader @Inject constructor(
} else {
val googleTaskList = caldavDao.getCalendarByUuid(defaultGoogleTaskList!!)
if (googleTaskList != null) {
defaultFilterProvider.defaultList = GtasksFilter(googleTaskList)
caldavDao.getAccountByUuid(googleTaskList.account!!)?.let {
defaultFilterProvider.defaultList =
CaldavFilter(calendar = googleTaskList, account = it)
}
}
}
}

@ -18,12 +18,14 @@ import kotlinx.coroutines.withContext
import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.Strings.isNullOrEmpty
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity.Companion.EXTRA_CALDAV_ACCOUNT
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity.Companion.EXTRA_CALDAV_CALENDAR
import org.tasks.compose.settings.Toaster
import org.tasks.data.dao.CaldavDao
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavCalendar
import org.tasks.filters.CaldavFilter
import org.tasks.filters.Filter
import org.tasks.filters.GtasksFilter
import org.tasks.themes.TasksIcons
import org.tasks.themes.TasksTheme
import timber.log.Timber
@ -35,6 +37,12 @@ class GoogleTaskListSettingsActivity : BaseListSettingsActivity() {
@Inject lateinit var taskDeleter: TaskDeleter
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
private val account: CaldavAccount
get() = intent.getParcelableExtra(EXTRA_CALDAV_ACCOUNT)!!
private val list: CaldavCalendar?
get() = intent.getParcelableExtra(EXTRA_CALDAV_CALENDAR)
private var isNewList = false
private lateinit var gtasksList: CaldavCalendar
private val createListViewModel: CreateListViewModel by viewModels()
@ -45,12 +53,7 @@ class GoogleTaskListSettingsActivity : BaseListSettingsActivity() {
val snackbar = SnackbarHostState()
override fun onCreate(savedInstanceState: Bundle?) {
gtasksList = intent.getParcelableExtra(EXTRA_STORE_DATA)
?: CaldavCalendar(
account = intent.getParcelableExtra<CaldavAccount>(EXTRA_ACCOUNT)!!.username
).apply {
isNewList = true
}
gtasksList = list ?: CaldavCalendar(account = account.username).apply { isNewList = true }
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
baseViewModel.setColor(gtasksList.color)
@ -78,7 +81,7 @@ class GoogleTaskListSettingsActivity : BaseListSettingsActivity() {
}
override val filter: Filter?
get() = if (isNewList) null else GtasksFilter(gtasksList)
get() = if (isNewList) null else CaldavFilter(calendar = gtasksList, account = account)
override val toolbarTitle: String
get() = if (isNew) getString(R.string.new_list) else gtasksList.name!!
@ -123,7 +126,11 @@ class GoogleTaskListSettingsActivity : BaseListSettingsActivity() {
setResult(
Activity.RESULT_OK,
Intent(TaskListFragment.ACTION_RELOAD)
.putExtra(MainActivity.OPEN_FILTER, GtasksFilter(gtasksList)))
.putExtra(
MainActivity.OPEN_FILTER,
CaldavFilter(calendar = gtasksList, account = account)
)
)
}
finish()
}
@ -172,7 +179,11 @@ class GoogleTaskListSettingsActivity : BaseListSettingsActivity() {
setResult(
Activity.RESULT_OK,
Intent().putExtra(MainActivity.OPEN_FILTER, GtasksFilter(result.copy(id = id))))
Intent().putExtra(
MainActivity.OPEN_FILTER,
CaldavFilter(calendar = result.copy(id = id), account = account)
)
)
finish()
}
@ -199,7 +210,11 @@ class GoogleTaskListSettingsActivity : BaseListSettingsActivity() {
setResult(
Activity.RESULT_OK,
Intent(TaskListFragment.ACTION_RELOAD)
.putExtra(MainActivity.OPEN_FILTER, GtasksFilter(result)))
.putExtra(
MainActivity.OPEN_FILTER,
CaldavFilter(calendar = result, account = account)
)
)
finish()
}
@ -210,9 +225,4 @@ class GoogleTaskListSettingsActivity : BaseListSettingsActivity() {
//toast(R.string.gtasks_GLA_errorIOAuth)
return
}
companion object {
const val EXTRA_ACCOUNT = "extra_account"
const val EXTRA_STORE_DATA = "extra_store_data"
}
}

@ -18,10 +18,6 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.todoroo.astrid.adapter.FilterViewHolder
import com.todoroo.astrid.adapter.NavigationDrawerAdapter
import org.tasks.filters.CaldavFilter
import org.tasks.filters.CustomFilter
import org.tasks.filters.GtasksFilter
import org.tasks.filters.TagFilter
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.LocalBroadcastManager
@ -33,10 +29,13 @@ import org.tasks.data.dao.LocationDao
import org.tasks.data.dao.TagDataDao
import org.tasks.data.listSettingsClass
import org.tasks.databinding.ActivityTagOrganizerBinding
import org.tasks.filters.CaldavFilter
import org.tasks.filters.CustomFilter
import org.tasks.filters.Filter
import org.tasks.filters.FilterListItem
import org.tasks.filters.FilterProvider
import org.tasks.filters.PlaceFilter
import org.tasks.filters.TagFilter
import org.tasks.injection.ThemedInjectingAppCompatActivity
import org.tasks.preferences.Preferences
import javax.inject.Inject
@ -103,18 +102,11 @@ class NavigationDrawerCustomization : ThemedInjectingAppCompatActivity(), Toolba
private fun onClick(item: FilterListItem?) {
when (item) {
is GtasksFilter ->
Intent(this, GoogleTaskListSettingsActivity::class.java)
.putExtra(GoogleTaskListSettingsActivity.EXTRA_STORE_DATA, item.list)
.apply(this::startActivity)
is CaldavFilter ->
lifecycleScope.launch {
caldavDao.getAccountByUuid(item.account)?.let {
Intent(this@NavigationDrawerCustomization, it.listSettingsClass())
.putExtra(BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_CALENDAR, item.calendar)
.apply { startActivity(this) }
}
}
Intent(this@NavigationDrawerCustomization, item.account.listSettingsClass())
.putExtra(BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_CALENDAR, item.calendar)
.putExtra(BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_ACCOUNT, item.account)
.apply { startActivity(this) }
is CustomFilter ->
Intent(this, FilterSettingsActivity::class.java)
.putExtra(FilterSettingsActivity.TOKEN_FILTER, item)
@ -178,11 +170,7 @@ class NavigationDrawerCustomization : ThemedInjectingAppCompatActivity(), Toolba
if (sourceFilter::class.java != targetFilter::class.java) {
return false
}
if (sourceFilter is GtasksFilter && targetFilter is GtasksFilter) {
if (sourceFilter.account != targetFilter.account) {
return false
}
} else if (sourceFilter is CaldavFilter && targetFilter is CaldavFilter) {
if (sourceFilter is CaldavFilter && targetFilter is CaldavFilter) {
if (sourceFilter.account != targetFilter.account) {
return false
}
@ -227,7 +215,6 @@ class NavigationDrawerCustomization : ThemedInjectingAppCompatActivity(), Toolba
private fun getPredicate(item: FilterListItem): (FilterListItem) -> Boolean = { f ->
item::class.java == f::class.java && when (item) {
is GtasksFilter -> item.account == (f as GtasksFilter).account
is CaldavFilter -> item.account == (f as CaldavFilter).account
else -> true
}
@ -235,7 +222,6 @@ class NavigationDrawerCustomization : ThemedInjectingAppCompatActivity(), Toolba
private suspend fun setOrder(order: Int, filter: Filter) {
when (filter) {
is GtasksFilter -> caldavDao.setOrder(filter.list.id, order)
is CaldavFilter -> caldavDao.setOrder(filter.calendar.id, order)
is TagFilter -> tagDataDao.setOrder(filter.tagData.id!!, order)
is CustomFilter -> filterDao.setOrder(filter.id, order)

@ -59,7 +59,7 @@ abstract class BaseCaldavCalendarSettingsActivity : BaseListSettingsActivity() {
}
override val filter: Filter?
get() = caldavCalendar?.let { CaldavFilter(it) }
get() = caldavCalendar?.let { CaldavFilter(calendar = it, account = caldavAccount) }
override val toolbarTitle: String
get() = if (isNew) getString(R.string.new_list) else caldavCalendar!!.name ?: ""
@ -134,7 +134,11 @@ abstract class BaseCaldavCalendarSettingsActivity : BaseListSettingsActivity() {
caldavDao.insert(caldavCalendar)
setResult(
Activity.RESULT_OK,
Intent().putExtra(MainActivity.OPEN_FILTER, CaldavFilter(caldavCalendar)))
Intent().putExtra(
MainActivity.OPEN_FILTER,
CaldavFilter(calendar = caldavCalendar, account = caldavAccount)
)
)
finish()
}
@ -148,7 +152,11 @@ abstract class BaseCaldavCalendarSettingsActivity : BaseListSettingsActivity() {
setResult(
Activity.RESULT_OK,
Intent(TaskListFragment.ACTION_RELOAD)
.putExtra(MainActivity.OPEN_FILTER, CaldavFilter(result)))
.putExtra(
MainActivity.OPEN_FILTER,
CaldavFilter(calendar = result, account = caldavAccount)
)
)
finish()
}

@ -50,7 +50,10 @@ class CaldavCalendarViewModel @Inject constructor(
caldavDao.insert(this)
}
if (!ignoreFinish) {
finish.value = Intent().putExtra(MainActivity.OPEN_FILTER, CaldavFilter(calendar))
finish.value = Intent().putExtra(
MainActivity.OPEN_FILTER,
CaldavFilter(calendar = calendar, account = caldavAccount)
)
}
calendar
}
@ -73,7 +76,10 @@ class CaldavCalendarViewModel @Inject constructor(
)
caldavDao.update(result)
finish.value = Intent(TaskListFragment.ACTION_RELOAD)
.putExtra(MainActivity.OPEN_FILTER, CaldavFilter(result))
.putExtra(
MainActivity.OPEN_FILTER,
CaldavFilter(calendar = result, account = account)
)
}
suspend fun deleteCalendar(account: CaldavAccount, calendar: CaldavCalendar) =

@ -30,6 +30,7 @@ import dagger.hilt.android.AndroidEntryPoint
import org.tasks.LocalBroadcastManager
import org.tasks.compose.pickers.SearchableFilterPicker
import org.tasks.dialogs.FilterPickerViewModel
import org.tasks.filters.CaldavFilter
import org.tasks.filters.Filter
import org.tasks.filters.NavigationDrawerSubheader
import org.tasks.preferences.DefaultFilterProvider
@ -110,11 +111,11 @@ class FilterSelectionActivity : AppCompatActivity() {
const val EXTRA_FILTER = "extra_filter"
const val EXTRA_LISTS_ONLY = "extra_lists_only"
fun Fragment.registerForListPickerResult(callback: (Filter) -> Unit): ActivityResultLauncher<Intent> {
fun Fragment.registerForListPickerResult(callback: (CaldavFilter) -> Unit): ActivityResultLauncher<Intent> {
return registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
it.data?.let { intent ->
IntentCompat
.getParcelableExtra(intent, EXTRA_FILTER, Filter::class.java)
.getParcelableExtra(intent, EXTRA_FILTER, CaldavFilter::class.java)
?.let(callback)
}
}

@ -40,10 +40,11 @@ import org.tasks.compose.SubtaskChip
import org.tasks.compose.TaskEditIcon
import org.tasks.compose.TaskEditRow
import org.tasks.data.TaskContainer
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavCalendar
import org.tasks.data.entity.Task
import org.tasks.data.isHidden
import org.tasks.filters.Filter
import org.tasks.filters.GtasksFilter
import org.tasks.filters.CaldavFilter
import org.tasks.tasklist.SectionedDataSource
import org.tasks.tasklist.TasksResults
import org.tasks.tasklist.UiItem
@ -51,8 +52,8 @@ import org.tasks.themes.TasksTheme
@Composable
fun SubtaskRow(
originalFilter: Filter?,
filter: Filter?,
originalFilter: CaldavFilter,
filter: CaldavFilter,
hasParent: Boolean,
existingSubtasks: TasksResults,
newSubtasks: List<Task>,
@ -81,9 +82,9 @@ fun SubtaskRow(
Column {
val isGoogleTaskChild =
hasParent &&
filter is GtasksFilter &&
originalFilter is GtasksFilter &&
originalFilter.remoteId == filter.remoteId
filter.isGoogleTasks &&
originalFilter.isGoogleTasks &&
originalFilter.uuid == filter.uuid
if (isGoogleTaskChild) {
DisabledText(
text = stringResource(id = org.tasks.R.string.subtasks_multilevel_google_task),
@ -99,7 +100,7 @@ fun SubtaskRow(
.forEach { task ->
ExistingSubtaskRow(
task = task,
indent = if (filter !is GtasksFilter) task.indent else 0,
indent = if (filter.isIcalendar) task.indent else 0,
onRowClick = { openSubtask(task.task) },
onCompleteClick = {
completeExistingSubtask(
@ -234,8 +235,8 @@ fun ExistingSubtaskRow(
fun NoSubtasks() {
TasksTheme {
SubtaskRow(
originalFilter = null,
filter = null,
originalFilter = CaldavFilter(CaldavCalendar(), CaldavAccount()),
filter = CaldavFilter(CaldavCalendar(), CaldavAccount()),
hasParent = false,
existingSubtasks = TasksResults.Results(SectionedDataSource()),
newSubtasks = emptyList(),
@ -255,8 +256,8 @@ fun NoSubtasks() {
fun SubtasksPreview() {
TasksTheme {
SubtaskRow(
originalFilter = null,
filter = null,
originalFilter = CaldavFilter(CaldavCalendar(), CaldavAccount()),
filter = CaldavFilter(CaldavCalendar(), CaldavAccount()),
hasParent = false,
existingSubtasks = TasksResults.Results(
SectionedDataSource(

@ -3,6 +3,7 @@ package org.tasks.data
import android.app.Activity
import android.content.Context
import org.tasks.R
import org.tasks.activities.GoogleTaskListSettingsActivity
import org.tasks.caldav.BaseCaldavAccountSettingsActivity
import org.tasks.caldav.CaldavAccountSettingsActivity
import org.tasks.caldav.CaldavCalendarSettingsActivity
@ -56,6 +57,7 @@ fun CaldavAccount.listSettingsClass(): Class<out Activity> = when(accountType) {
CaldavAccount.TYPE_OPENTASKS -> OpenTasksListSettingsActivity::class.java
CaldavAccount.TYPE_ETEBASE -> EtebaseCalendarSettingsActivity::class.java
CaldavAccount.TYPE_MICROSOFT -> MicrosoftListSettingsActivity::class.java
CaldavAccount.TYPE_GOOGLE_TASKS -> GoogleTaskListSettingsActivity::class.java
else -> CaldavCalendarSettingsActivity::class.java
}

@ -11,12 +11,10 @@ import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.R
import org.tasks.Strings
import org.tasks.activities.FilterSettingsActivity.Companion.sql
import org.tasks.data.GoogleTask
import org.tasks.data.dao.CaldavDao
import org.tasks.data.dao.TagDataDao
import org.tasks.data.dao.TaskDao.TaskCriteria.activeAndVisible
import org.tasks.data.entity.Alarm
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavTask
import org.tasks.data.entity.Filter
import org.tasks.data.entity.Tag
@ -87,7 +85,6 @@ class FilterCriteriaProvider @Inject constructor(
IDENTIFIER_IMPORTANCE -> priorityFilter
IDENTIFIER_STARTDATE -> startDateFilter
IDENTIFIER_DUEDATE -> dueDateFilter
IDENTIFIER_GTASKS -> gtasksFilterCriteria()
IDENTIFIER_CALDAV -> caldavFilterCriteria()
IDENTIFIER_TAG_IS -> tagFilter()
IDENTIFIER_TAG_CONTAINS -> tagNameContainsFilter
@ -119,9 +116,6 @@ class FilterCriteriaProvider @Inject constructor(
add(dueDateFilter)
add(priorityFilter)
add(taskTitleContainsFilter)
if (caldavDao.getAccounts(CaldavAccount.TYPE_GOOGLE_TASKS).isNotEmpty()) {
add(gtasksFilterCriteria())
}
add(caldavFilterCriteria())
add(recurringFilter)
add(completedFilter)
@ -335,34 +329,6 @@ class FilterCriteriaProvider @Inject constructor(
"",
r.getString(R.string.CFC_title_contains_name))
private suspend fun gtasksFilterCriteria(): CustomFilterCriterion {
val lists = caldavDao.getGoogleTaskLists()
val listNames = arrayOfNulls<String>(lists.size)
val listIds = arrayOfNulls<String>(lists.size)
for (i in lists.indices) {
listNames[i] = lists[i].name
listIds[i] = lists[i].uuid
}
val values: MutableMap<String, Any> = HashMap()
values[GoogleTask.KEY] = "?"
return MultipleSelectCriterion(
IDENTIFIER_GTASKS,
context.getString(R.string.CFC_gtasks_list_text),
select(CaldavTask.TASK)
.from(CaldavTask.TABLE)
.join(inner(Task.TABLE, CaldavTask.TASK.eq(Task.ID)))
.where(
and(
activeAndVisible(),
CaldavTask.DELETED.eq(0),
CaldavTask.CALENDAR.eq("?")))
.toString(),
values,
listNames,
listIds,
context.getString(R.string.CFC_gtasks_list_name))
}
private suspend fun caldavFilterCriteria(): CustomFilterCriterion {
val calendars = caldavDao.getCalendars()
val names = arrayOfNulls<String>(calendars.size)
@ -397,7 +363,6 @@ class FilterCriteriaProvider @Inject constructor(
private const val IDENTIFIER_IMPORTANCE = "importance"
private const val IDENTIFIER_STARTDATE = "startDate"
private const val IDENTIFIER_DUEDATE = "dueDate"
private const val IDENTIFIER_GTASKS = "gtaskslist"
private const val IDENTIFIER_CALDAV = "caldavlist"
private const val IDENTIFIER_TAG_IS = "tag_is"
private const val IDENTIFIER_TAG_CONTAINS = "tag_contains"

@ -9,9 +9,7 @@ fun Filter.getIcon(inventory: Inventory): String? {
}
return when (this) {
is TagFilter -> TasksIcons.LABEL
is GtasksFilter,
is CaldavFilter -> TasksIcons.LIST
is CustomFilter -> TasksIcons.FILTER_LIST
is PlaceFilter -> TasksIcons.PLACE
else -> icon

@ -27,7 +27,6 @@ import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavCalendar
import org.tasks.data.entity.CaldavTask
import org.tasks.date.DateTimeUtils.newDateTime
import org.tasks.filters.GtasksFilter
import org.tasks.googleapis.InvokerFactory
import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.PermissionChecker
@ -121,8 +120,8 @@ class GoogleTaskSynchronizer @Inject constructor(
} while (!isNullOrEmpty(nextPageToken))
gtasksListService.updateLists(account, gtaskLists)
val defaultRemoteList = defaultFilterProvider.defaultList
if (defaultRemoteList is GtasksFilter) {
val list = caldavDao.getCalendarByUuid(defaultRemoteList.remoteId)
if (defaultRemoteList.isGoogleTasks) {
val list = caldavDao.getCalendarByUuid(defaultRemoteList.uuid)
if (list == null) {
preferences.setString(R.string.p_default_list, null)
}
@ -194,7 +193,7 @@ class GoogleTaskSynchronizer @Inject constructor(
var newlyCreated = false
val remoteId: String?
val defaultRemoteList = defaultFilterProvider.defaultList
var listId = if (defaultRemoteList is GtasksFilter) defaultRemoteList.remoteId else DEFAULT_LIST
var listId = if (defaultRemoteList.isGoogleTasks) defaultRemoteList.uuid else DEFAULT_LIST
if (isNullOrEmpty(gtasksMetadata.remoteId)) { // Create case
gtasksMetadata.calendar?.takeIf { it.isNotBlank() }?.let {
listId = it

@ -8,7 +8,6 @@ import org.tasks.data.dao.CaldavDao
import org.tasks.data.dao.FilterDao
import org.tasks.data.dao.LocationDao
import org.tasks.data.dao.TagDataDao
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavCalendar.Companion.ACCESS_READ_ONLY
import org.tasks.data.entity.CaldavTask
import org.tasks.data.entity.Task
@ -16,7 +15,6 @@ import org.tasks.data.getLocalList
import org.tasks.filters.CaldavFilter
import org.tasks.filters.CustomFilter
import org.tasks.filters.Filter
import org.tasks.filters.GtasksFilter
import org.tasks.filters.MyTasksFilter
import org.tasks.filters.NotificationsFilter
import org.tasks.filters.PlaceFilter
@ -38,7 +36,7 @@ class DefaultFilterProvider @Inject constructor(
@Deprecated("use coroutines") get() = runBlocking { getFilterFromPreference(R.string.p_dashclock_filter) }
set(filter) = setFilterPreference(filter, R.string.p_dashclock_filter)
var defaultList: Filter
var defaultList: CaldavFilter
@Deprecated("use coroutines") get() = runBlocking { getDefaultList() }
set(filter) = setFilterPreference(filter, R.string.p_default_list)
@ -50,10 +48,11 @@ class DefaultFilterProvider @Inject constructor(
suspend fun getBadgeFilter() = getFilterFromPreference(R.string.p_badge_list)
suspend fun getDefaultList() =
suspend fun getDefaultList(): CaldavFilter =
getFilterFromPreference(preferences.getStringValue(R.string.p_default_list), null)
?.takeIf { it.isWritable }
?: getAnyList()
?.let { it as? CaldavFilter }
?.takeIf { it.isWritable }
?: getAnyList()
fun setLastViewedFilter(filter: Filter) = setFilterPreference(filter, R.string.p_last_viewed_list)
@ -82,9 +81,12 @@ class DefaultFilterProvider @Inject constructor(
suspend fun getFilterFromPreference(prefString: String?): Filter =
getFilterFromPreference(prefString, MyTasksFilter.create())!!
private suspend fun getAnyList(): Filter {
val filter = caldavDao.getGoogleTaskLists().getOrNull(0)?.let(::GtasksFilter)
?: caldavDao.getCalendars().filterNot { it.access == ACCESS_READ_ONLY }.getOrElse(0) { caldavDao.getLocalList() }.let(::CaldavFilter)
private suspend fun getAnyList(): CaldavFilter {
val filter = caldavDao
.getCalendars()
.filterNot { it.access == ACCESS_READ_ONLY }
.getOrElse(0) { caldavDao.getLocalList() }
.let { CaldavFilter(calendar = it, account = caldavDao.getAccountByUuid(it.account!!)!!) }
defaultList = filter
return filter
}
@ -105,9 +107,10 @@ class DefaultFilterProvider @Inject constructor(
val tag = tagDataDao.getByUuid(split[1])
if (tag == null || isNullOrEmpty(tag.name)) null else TagFilter(tag)
}
// TODO: convert filters from old ID to uuid
TYPE_GOOGLE_TASKS -> caldavDao.getCalendarByUuid(split[1])?.let { GtasksFilter(it) }
TYPE_CALDAV -> caldavDao.getCalendarByUuid(split[1])?.let { CaldavFilter(it) }
TYPE_GOOGLE_TASKS, // TODO: convert filters from old ID to uuid?
TYPE_CALDAV ->
caldavDao.getCalendarByUuid(split[1])
?.let { CaldavFilter(it, caldavDao.getAccountByUuid(it.account!!)!!) }
TYPE_LOCATION -> locationDao.getPlace(split[1])?.let { PlaceFilter(it) }
else -> null
}
@ -120,7 +123,7 @@ class DefaultFilterProvider @Inject constructor(
TYPE_FILTER -> getFilterPreference(filterType, getBuiltInFilterId(filter))
TYPE_CUSTOM_FILTER -> getFilterPreference(filterType, (filter as CustomFilter).id)
TYPE_TAG -> getFilterPreference(filterType, (filter as TagFilter).uuid)
TYPE_GOOGLE_TASKS -> getFilterPreference(filterType, (filter as GtasksFilter).remoteId)
TYPE_GOOGLE_TASKS,
TYPE_CALDAV -> getFilterPreference(filterType, (filter as CaldavFilter).uuid)
TYPE_LOCATION -> getFilterPreference(filterType, (filter as PlaceFilter).uid)
else -> null
@ -130,7 +133,6 @@ class DefaultFilterProvider @Inject constructor(
private fun getFilterType(filter: Filter) = when (filter) {
is TagFilter -> TYPE_TAG
is GtasksFilter -> TYPE_GOOGLE_TASKS
is CustomFilter -> TYPE_CUSTOM_FILTER
is CaldavFilter -> TYPE_CALDAV
is PlaceFilter -> TYPE_LOCATION
@ -162,24 +164,24 @@ class DefaultFilterProvider @Inject constructor(
val listId = task.getTransitory<String>(GoogleTask.KEY)!!
val googleTaskList = caldavDao.getCalendarByUuid(listId)
if (googleTaskList != null) {
originalList = GtasksFilter(googleTaskList)
val account = caldavDao.getAccountByUuid(googleTaskList.account!!)!!
originalList = CaldavFilter(calendar = googleTaskList, account = account)
}
} else if (task.hasTransitory(CaldavTask.KEY)) {
val caldav = caldavDao.getCalendarByUuid(task.getTransitory(CaldavTask.KEY)!!)
?.takeIf { it.access != ACCESS_READ_ONLY }
if (caldav != null) {
originalList = CaldavFilter(caldav)
val account = caldavDao.getAccountByUuid(caldav.account!!)!!
originalList = CaldavFilter(calendar = caldav, account = account)
}
}
} else {
val caldavTask = caldavDao.getTask(task.id)
val calendar = caldavTask?.calendar?.let { caldavDao.getCalendarByUuid(it) }
val account = calendar?.account?.let { caldavDao.getAccountByUuid(it) }
originalList = when (account?.accountType) {
null -> null
CaldavAccount.TYPE_GOOGLE_TASKS -> GtasksFilter(calendar)
else -> CaldavFilter(calendar)
}
originalList = calendar
?.account
?.let { caldavDao.getAccountByUuid(it) }
?.let { CaldavFilter(calendar = calendar, account = it) }
}
return originalList ?: getDefaultList()
}
@ -196,7 +198,7 @@ class DefaultFilterProvider @Inject constructor(
private const val TYPE_FILTER = 0
private const val TYPE_CUSTOM_FILTER = 1
private const val TYPE_TAG = 2
const val TYPE_GOOGLE_TASKS = 3
@Deprecated("use TYPE_CALDAV") const val TYPE_GOOGLE_TASKS = 3
private const val TYPE_CALDAV = 4
private const val TYPE_LOCATION = 5
private const val FILTER_MY_TASKS = 0

@ -39,7 +39,7 @@ class MicrosoftListSettingsActivity : BaseCaldavCalendarSettingsActivity() {
Activity.RESULT_OK,
Intent(TaskListFragment.ACTION_RELOAD).putExtra(
MainActivity.OPEN_FILTER,
CaldavFilter(it)
CaldavFilter(it, viewModel.account)
)
)
finish()

@ -32,7 +32,7 @@ class MicrosoftListSettingsActivityViewModel @Inject constructor(
private val _viewState = MutableStateFlow(ViewState())
val viewState = _viewState.asStateFlow()
private val account: CaldavAccount =
val account: CaldavAccount =
savedStateHandle[BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_ACCOUNT]!!
val list: CaldavCalendar? =

@ -32,7 +32,6 @@ import org.tasks.dialogs.Linkify
import org.tasks.extensions.Context.is24HourFormat
import org.tasks.filters.CaldavFilter
import org.tasks.filters.Filter
import org.tasks.filters.GtasksFilter
import org.tasks.filters.PlaceFilter
import org.tasks.filters.TagFilter
import org.tasks.kmp.org.tasks.time.getRelativeDateTime
@ -250,7 +249,6 @@ class TaskViewHolder internal constructor(
val list = task.caldav
val tagsString = task.tagsString
val isSubtask = task.hasParent()
val isGoogleTask = task.isGoogleTask
val appearance = preferences.getIntegerFromString(R.string.p_chip_appearance, 0)
val showText = appearance != 2
val showIcon = appearance != 1
@ -296,13 +294,10 @@ class TaskViewHolder internal constructor(
!isSubtask &&
!sortByList &&
preferences.showListChip &&
filter !is CaldavFilter &&
filter !is GtasksFilter
filter !is CaldavFilter
) {
remember(list, isGoogleTask) {
chipProvider.lists
.getCaldavList(list)
?.let { if (isGoogleTask) GtasksFilter(it) else CaldavFilter(it) }
remember(list) {
chipProvider.lists.getCaldavList(list)
}?.let {
FilterChip(
filter = it,

@ -1,14 +1,20 @@
package org.tasks.ui
import org.tasks.filters.TagFilter
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import org.tasks.LocalBroadcastManager
import org.tasks.data.dao.CaldavDao
import org.tasks.data.dao.TagDataDao
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavCalendar
import org.tasks.data.entity.TagData
import org.tasks.filters.CaldavFilter
import org.tasks.filters.TagFilter
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Singleton
@ -16,15 +22,25 @@ import javax.inject.Singleton
class ChipListCache @Inject internal constructor(
caldavDao: CaldavDao,
tagDataDao: TagDataDao,
private val localBroadcastManager: LocalBroadcastManager) {
private val caldavCalendars: MutableMap<String?, CaldavCalendar> = HashMap()
private val localBroadcastManager: LocalBroadcastManager,
) {
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
private val lists: MutableMap<String?, CaldavFilter> = HashMap()
private val tagDatas: MutableMap<String?, TagFilter> = HashMap()
private fun updateCaldavCalendars(updated: List<CaldavCalendar>) {
caldavCalendars.clear()
for (update in updated) {
caldavCalendars[update.uuid] = update
}
private fun updateCaldavCalendars(
accounts: List<CaldavAccount>,
calendars: List<CaldavCalendar>
) {
Timber.d("Updating lists")
calendars
.mapNotNull { list ->
val account = accounts.find { it.uuid == list.account } ?: return@mapNotNull null
CaldavFilter(calendar = list, account = account)
}
.let {
lists.clear()
it.associateByTo(lists) { filter -> filter.uuid }
}
localBroadcastManager.broadcastRefresh()
}
@ -36,12 +52,17 @@ class ChipListCache @Inject internal constructor(
localBroadcastManager.broadcastRefresh()
}
fun getCaldavList(caldav: String?): CaldavCalendar? = caldavCalendars[caldav]
fun getCaldavList(caldav: String?): CaldavFilter? = lists[caldav]
fun getTag(tag: String?): TagFilter? = tagDatas[tag]
init {
caldavDao.subscribeToCalendars().onEach { updateCaldavCalendars(it) }.launchIn(GlobalScope)
tagDataDao.subscribeToTags().onEach { updateTags(it) }.launchIn(GlobalScope)
caldavDao
.watchAccounts()
.combine(caldavDao.subscribeToCalendars()) { accounts, calendars ->
updateCaldavCalendars(accounts, calendars)
}
.launchIn(scope)
tagDataDao.subscribeToTags().onEach { updateTags(it) }.launchIn(scope)
}
}

@ -59,8 +59,6 @@ import org.tasks.data.setPicture
import org.tasks.date.DateTimeUtils.toDateTime
import org.tasks.files.FileHelper
import org.tasks.filters.CaldavFilter
import org.tasks.filters.Filter
import org.tasks.filters.GtasksFilter
import org.tasks.location.GeofenceApi
import org.tasks.preferences.PermissionChecker
import org.tasks.preferences.Preferences
@ -163,7 +161,7 @@ class TaskEditViewModel @Inject constructor(
}
var selectedCalendar = MutableStateFlow(originalCalendar)
val originalList: Filter = savedStateHandle[TaskEditFragment.EXTRA_LIST]!!
val originalList: CaldavFilter = savedStateHandle[TaskEditFragment.EXTRA_LIST]!!
var selectedList = MutableStateFlow(originalList)
private var originalLocation: Location? = savedStateHandle[TaskEditFragment.EXTRA_LOCATION]
@ -346,11 +344,12 @@ class TaskEditViewModel @Inject constructor(
taskDao.createNew(subtask)
alarmDao.insert(subtask.getDefaultAlarms())
firebase?.addTask("subtasks")
when (val filter = selectedList.value) {
is GtasksFilter -> {
val filter = selectedList.value
when {
filter.isGoogleTasks -> {
val googleTask = CaldavTask(
task = subtask.id,
calendar = filter.remoteId,
calendar = filter.uuid,
remoteId = null,
)
subtask.parent = task.id
@ -361,7 +360,7 @@ class TaskEditViewModel @Inject constructor(
top = if (isNew) false else preferences.addTasksToTop()
)
}
is CaldavFilter -> {
else -> {
val caldavTask = CaldavTask(
task = subtask.id,
calendar = filter.uuid,
@ -375,10 +374,6 @@ class TaskEditViewModel @Inject constructor(
addToTop = if (isNew) false else preferences.addTasksToTop()
)
}
else -> {
subtask.parent = task.id
taskDao.save(subtask)
}
}
}

@ -16,7 +16,6 @@ import org.tasks.extensions.Context.is24HourFormat
import org.tasks.extensions.setColorFilter
import org.tasks.filters.CaldavFilter
import org.tasks.filters.Filter
import org.tasks.filters.GtasksFilter
import org.tasks.filters.PlaceFilter
import org.tasks.filters.TagFilter
import org.tasks.filters.getIcon
@ -79,15 +78,18 @@ class WidgetChipProvider @Inject constructor(
}
fun getListChip(filter: Filter, task: TaskContainer): RemoteViews? {
return task.caldav
?.takeIf { filter !is CaldavFilter && filter !is GtasksFilter }
return if (filter is CaldavFilter) {
null
} else {
task.caldav
?.let { chipListCache.getCaldavList(it) }
?.let {
newChip(
filter = if (task.isGoogleTask) GtasksFilter(it) else CaldavFilter(it),
filter = it,
defaultIcon = R.drawable.ic_list_24px
)
}
}
}
fun getPlaceChip(filter: Filter, task: TaskContainer): RemoteViews? {

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_gtasks_list_settings"
android:title="@string/list_settings"
app:showAsAction="never"/>
</menu>

@ -567,7 +567,6 @@
<string name="persistent_notifications_description">الإشعارات المستمرة لا يمكن محوها</string>
<string name="rmd_EPr_rmd_time_desc">اشعارات لمهام بدون وقت استحقاق ستظهر عند %s</string>
<string name="gtasks_GLA_authenticating">قيد المصادقة…</string>
<string name="CFC_gtasks_list_name">في قوائم مهام كوكل…</string>
<string name="no_due_date">بدون تاريخ استحقاق</string>
<string name="EPr_default_location_reminder_title">مذكرات الموقع الافتراضية</string>
<string name="default_due_date">وقت الاستحقاق الافتراضي</string>

@ -108,7 +108,6 @@
<string name="calendar_event_not_found">Събитието от календара не е намерено</string>
<string name="gcal_completed_title">%s (завършено)</string>
<string name="CFC_gtasks_list_text">В списъка: \?</string>
<string name="CFC_gtasks_list_name">В списъка GTasks…</string>
<string name="gtasks_GTA_clear_completed">Изчистване на завършените</string>
<string name="gtasks_GLA_authenticating">Удостоверяване…</string>
<string name="gtasks_GLA_errorIOAuth">Има проблем с връзката до сървърите на Google. Опитайте отново по-късно.</string>

@ -151,7 +151,6 @@
<string name="no_reminders">Sense recordatoris</string>
<string name="default_location_reminder_on_departure">A la sortida</string>
<string name="default_location_reminder_on_arrival_or_departure">A larribada i sortida</string>
<string name="CFC_gtasks_list_name">A la llista GTasks…</string>
<string name="repeat_option_does_not_repeat">No es repeteix</string>
<string name="repeat_option_every_day">Cada dia</string>
<string name="filter_any_start_date">Qualsevol data d\'inici</string>

@ -88,7 +88,6 @@
<string name="gcal_TEA_showCalendar_label">Otevřít událost v kalendáři</string>
<string name="gcal_completed_title">%s (dokončeno)</string>
<string name="CFC_gtasks_list_text">V seznamu: ?</string>
<string name="CFC_gtasks_list_name">V seznamu Google úkolů…</string>
<string name="gtasks_GTA_clear_completed">Smazat dokončené</string>
<string name="gtasks_GLA_authenticating">Ověřuje se…</string>
<string name="gtasks_GLA_errorIOAuth">Nastal problém při komunikaci se servery Google. Zkuste to prosím později.</string>

@ -79,7 +79,6 @@
<string name="quiet_hours">Hviletid</string>
<string name="widget_show_header">Vis topbjælke</string>
<string name="voice_command_added_task">Tilføjede en opgave</string>
<string name="CFC_gtasks_list_name">På Google Huskelisten…</string>
<string name="gtasks_error_accountNotFound">Konto %s ikke fundet. Log venligst ud og log ind igen fra Google Huskeliste-indstillingerne.</string>
<string name="EPr_show_task_edit_comments">Vis kommentarer i opgaveredigering</string>
<string name="EPr_fullTask_title">Vis hele opgavetitlen</string>

@ -102,7 +102,6 @@
<string name="calendar_event_not_found">Kalendereintrag nicht gefunden</string>
<string name="gcal_completed_title">%s (abgeschlossen)</string>
<string name="CFC_gtasks_list_text">In der Liste: ?</string>
<string name="CFC_gtasks_list_name">In GTasks-Liste …</string>
<string name="gtasks_GTA_clear_completed">Erledigte Aufgaben entfernen</string>
<string name="gtasks_GLA_authenticating">Authentifizierung…</string>
<string name="gtasks_GLA_errorIOAuth">Leider ist während der Kommunikation mit den Google-Servern ein Problem aufgetreten. Bitte versuchen Sie es später noch einmal.</string>

@ -81,7 +81,6 @@
<string name="gcal_TEA_showCalendar_label">Άνοιγμα event ημερολογίου</string>
<string name="gcal_completed_title">%s (έχει ολοκληρωθεί)</string>
<string name="CFC_gtasks_list_text">Στην λίστα: ?</string>
<string name="CFC_gtasks_list_name">Στην λίστα του GTasks…</string>
<string name="gtasks_GTA_clear_completed">Καθαρισμός ολοκληρωμένων</string>
<string name="gtasks_GLA_authenticating">Αυθεντικοποίηση…</string>
<string name="gtasks_GLA_errorIOAuth">Συγγνώμη, υπήρξε σφάλμα επικοινωνίας με τους διακομιστές της Google. Παρακαλουμε δοκιμάστε πάλι μετά.</string>

@ -132,7 +132,6 @@
<string name="rmd_EPr_defaultRemind_title">Hazardaj memorigiloj</string>
<string name="rmd_EPr_rmd_time_title">Memorigo-tempo</string>
<string name="CFC_list_name">En listo…</string>
<string name="CFC_gtasks_list_name">En GTasks Listo…</string>
<string name="CFC_gtasks_list_text">En Listo: \?</string>
<string name="calendar_event_not_found">Kalendara evento ne trovita</string>
<string name="gcal_TEA_showCalendar_label">Malfermi Kalendara Evento</string>

@ -107,7 +107,6 @@
<string name="calendar_event_not_found">Evento de calendario no encontrado</string>
<string name="gcal_completed_title">%s (completado)</string>
<string name="CFC_gtasks_list_text">En la Lista: ?</string>
<string name="CFC_gtasks_list_name">en la Lista GTasks…</string>
<string name="gtasks_GTA_clear_completed">Quitar finalizadas</string>
<string name="gtasks_GLA_authenticating">Autenticando…</string>
<string name="gtasks_GLA_errorIOAuth">Perdón, hubo un problema al comunicarse con los servidores de Google. Por favor inténtalo mas tarde.</string>

@ -90,7 +90,6 @@
<string name="calendar_event_not_found">Kalendri sündmust ei leitud</string>
<string name="gcal_completed_title">%s (valmis)</string>
<string name="CFC_gtasks_list_text">Nimekirjas: \?</string>
<string name="CFC_gtasks_list_name">GTasks nimekirjas…</string>
<string name="gtasks_GTA_clear_completed">Eemalda lõpetatud</string>
<string name="gtasks_GLA_authenticating">Autentimine…</string>
<string name="gtasks_GPr_header">Google Tasks</string>

@ -108,7 +108,6 @@
<string name="calendar_event_not_found">Ez da egutegiko gertaera aurkitu</string>
<string name="gcal_completed_title">%s (burututa)</string>
<string name="CFC_gtasks_list_text">Zerrendan: \?</string>
<string name="CFC_gtasks_list_name">GTasks zerrendan…</string>
<string name="gtasks_GTA_clear_completed">Kendu burututakoak</string>
<string name="gtasks_GLA_authenticating">Autentifikatzen…</string>
<string name="gtasks_GLA_errorIOAuth">Google zerbitzariekin komunikatzeko arazo bat izan dugu. Saiatu geroago.</string>

@ -95,7 +95,6 @@
<string name="calendar_event_not_found">Kalenteritapahtumaa ei löydy</string>
<string name="gcal_completed_title">%s (valmistunut)</string>
<string name="CFC_gtasks_list_text">Listalla: ?</string>
<string name="CFC_gtasks_list_name">Gtask lista…</string>
<string name="gtasks_GTA_clear_completed">Poista valmiit</string>
<string name="gtasks_GLA_authenticating">Todennetaan…</string>
<string name="gtasks_GLA_errorIOAuth">Valitettavasti meillä on yhteysongelmia Google palvelimiin. Ole hyvä ja yritä myöhemmin uudestaa.</string>

@ -105,7 +105,6 @@
<string name="calendar_event_not_found">Évènement de calendrier introuvable</string>
<string name="gcal_completed_title">%s (complété)</string>
<string name="CFC_gtasks_list_text">Dans la liste : \?</string>
<string name="CFC_gtasks_list_name">Dans la liste GTasks…</string>
<string name="gtasks_GTA_clear_completed">Effacer les tâches terminées</string>
<string name="gtasks_GLA_authenticating">Authentification en cours…</string>
<string name="gtasks_GLA_errorIOAuth">Désolé, une erreur de communication avec les serveurs de Google s\'est produite. Veuillez réessayer ultérieurement.</string>

@ -104,7 +104,6 @@
<string name="calendar_event_not_found">Evento de calendario non atopado</string>
<string name="gcal_completed_title">%s (finalizado)</string>
<string name="CFC_gtasks_list_text">Na lista: \?</string>
<string name="CFC_gtasks_list_name">Na lista GTasks…</string>
<string name="gtasks_GTA_clear_completed">Limpar as finalizadas</string>
<string name="gtasks_GLA_authenticating">Autenticando…</string>
<string name="gtasks_GLA_errorIOAuth">Houbo un problema ao comunicarse cos servidores de Google. Inténtao máis tarde.</string>

@ -443,7 +443,6 @@
<string name="gtasks_GLA_authenticating">Autentifikacija …</string>
<string name="gtasks_GTA_clear_completed">Izbriši obavljene</string>
<string name="CFC_list_name">U popisu …</string>
<string name="CFC_gtasks_list_name">U GTasks popisu …</string>
<string name="CFC_gtasks_list_text">U popisu: \?</string>
<string name="gcal_completed_title">%s (obavljeno)</string>
<string name="calendar_event_not_found">Kalendarski događaj nije pronađen</string>

@ -103,7 +103,6 @@
<string name="calendar_event_not_found">Naptáresemény nem található</string>
<string name="gcal_completed_title">%s (befejezve)</string>
<string name="CFC_gtasks_list_text">Listában: ?</string>
<string name="CFC_gtasks_list_name">Ebben a GTasks listában…</string>
<string name="gtasks_GTA_clear_completed">Elvégzettek törlése</string>
<string name="gtasks_GLA_authenticating">Azonosítás…</string>
<string name="gtasks_GLA_errorIOAuth">Sajnáljuk, de hiba történt a Google szervereivel való kommunikálás során. Próbáld újra később.</string>

@ -78,7 +78,6 @@
<string name="calendar_event_not_found">Acara kalender tidak ditemukan</string>
<string name="gcal_completed_title">%s (selesai)</string>
<string name="CFC_gtasks_list_text">Dalam Daftar: \?</string>
<string name="CFC_gtasks_list_name">Dalam Daftar GTasks…</string>
<string name="gtasks_GLA_authenticating">Mengotentikasi…</string>
<string name="gtasks_GLA_errorIOAuth">Maaf, terjadi kesalahan komunikasi dengan server Google. Silakan coba lagi nanti.</string>
<string name="gtasks_GPr_header">Google Tasks</string>

@ -103,7 +103,6 @@
<string name="calendar_event_not_found">Evento non trovato</string>
<string name="gcal_completed_title">%s (completato)</string>
<string name="CFC_gtasks_list_text">Nella lista: ?</string>
<string name="CFC_gtasks_list_name">Nella lista GTasks…</string>
<string name="gtasks_GTA_clear_completed">Elimina attività completate</string>
<string name="gtasks_GLA_authenticating">Autenticazione…</string>
<string name="gtasks_GLA_errorIOAuth">Ci scusiamo per il disagio, abbiamo dei problemi a comunicare con i server di Google. Per favore riprovare più tardi.</string>

@ -108,7 +108,6 @@
<string name="calendar_event_not_found">אירוע לא נמצא</string>
<string name="gcal_completed_title">%s (בוצעה)</string>
<string name="CFC_gtasks_list_text">ברשימה: ?</string>
<string name="CFC_gtasks_list_name">ברשימה של „משימות גוגל”…</string>
<string name="gtasks_GTA_clear_completed">נקה משימות שבוצעו</string>
<string name="gtasks_GLA_authenticating">מתבצע אימות…</string>
<string name="gtasks_GLA_errorIOAuth">בעיה בהתחברות לשרתי גוגל. נא נסה שוב מאוחר יותר.</string>

@ -113,7 +113,6 @@
<string name="calendar_event_not_found">カレンダーイベントが見つかりません</string>
<string name="gcal_completed_title">%s (完了)</string>
<string name="CFC_gtasks_list_text">リストに含む: \?</string>
<string name="CFC_gtasks_list_name">GTasks リストに…</string>
<string name="gtasks_GTA_clear_completed">完了したタスクをクリア</string>
<string name="gtasks_GLA_authenticating">認証中…</string>
<string name="gtasks_GLA_errorIOAuth">すみません、Google のサーバーとの通信で問題が発生しました。しばらくしてからもう一度お試しください。</string>

@ -103,7 +103,6 @@
<string name="calendar_event_not_found">달력 일정이 발견되지 않음</string>
<string name="gcal_completed_title">%s (완료)</string>
<string name="CFC_gtasks_list_text">목록에: ?</string>
<string name="CFC_gtasks_list_name">GTasks 목록에…</string>
<string name="gtasks_GTA_clear_completed">완료한 할일 지우기</string>
<string name="gtasks_GLA_authenticating">인증 중…</string>
<string name="gtasks_GLA_errorIOAuth">죄송합니다, 구글 서버와 통신하는 데 문제가 있습니다. 잠시 후 다시 시도하세요.</string>

@ -113,7 +113,6 @@
<string name="calendar_event_not_found">Kalendoriaus įvykis nerastas</string>
<string name="gcal_completed_title">%s (užbaigta)</string>
<string name="CFC_gtasks_list_text">Yra sąraše ?</string>
<string name="CFC_gtasks_list_name">Yra GTasks sąraše…</string>
<string name="gtasks_GTA_clear_completed">Išvalyti užbaigtas</string>
<string name="gtasks_GLA_authenticating">Autorizuojama…</string>
<string name="gtasks_GLA_errorIOAuth">Atsiprašome, turime bėdų susisiekiant su Google serveriais. Prašome pabandyti vėliau.</string>

@ -198,7 +198,6 @@
<string name="CFC_tag_contains_name">Etikettnavn inneholder…</string>
<string name="CFC_tag_contains_text">Etikettnavn inneholder: \?</string>
<string name="calendar_event_not_found">Fant ikke kalenderhendelsen</string>
<string name="CFC_gtasks_list_name">I GTasks-listen…</string>
<string name="gtasks_GLA_authenticating">Identitetsbekrefter…</string>
<string name="gtasks_GPr_header">Google Tasks</string>
<string name="gtasks_error_accountNotFound">Kontoen %s ble ikke funnet. Logg ut og inn igjen fra Google Tasks-innstillingene.</string>

@ -102,7 +102,6 @@
<string name="calendar_event_not_found">Kalender-item niet gevonden</string>
<string name="gcal_completed_title">%s (voltooid)</string>
<string name="CFC_gtasks_list_text">In de lijst: \?</string>
<string name="CFC_gtasks_list_name">In de GTasks lijst…</string>
<string name="gtasks_GTA_clear_completed">Voltooide taken wissen</string>
<string name="gtasks_GLA_authenticating">Verifiëren…</string>
<string name="gtasks_GLA_errorIOAuth">Sorry, er zijn problemen met de communicatie met Google-servers. Probeer het later nog eens.</string>

@ -102,7 +102,6 @@
<string name="calendar_event_not_found">Zdarzenie kalendarza nie odnazlezione</string>
<string name="gcal_completed_title">%s (ukończono)</string>
<string name="CFC_gtasks_list_text">Na liście: ?</string>
<string name="CFC_gtasks_list_name">Na liście GTasks…</string>
<string name="gtasks_GTA_clear_completed">Wyczyść zakończone</string>
<string name="gtasks_GLA_authenticating">Uwierzytelnianie…</string>
<string name="gtasks_GLA_errorIOAuth">Przepraszamy, mieliśmy problem z porozumieniem się z serwerami Google. Prosimy spróbować ponownie.</string>

@ -100,7 +100,6 @@
<string name="calendar_event_not_found">Evento no calendário não encontrado</string>
<string name="gcal_completed_title">%s (concluída)</string>
<string name="CFC_gtasks_list_text">Na lista: ?</string>
<string name="CFC_gtasks_list_name">No Google Tarefas…</string>
<string name="gtasks_GTA_clear_completed">Limpar tarefas concluídas</string>
<string name="gtasks_GLA_authenticating">Autenticando…</string>
<string name="gtasks_GLA_errorIOAuth">Lamentamos, mas tivemos problemas na comunicação com os servidores do Google. Por favor, tente novamente mais tarde.</string>

@ -98,7 +98,6 @@
<string name="calendar_event_not_found">Não foi encontrado o evento no calendário</string>
<string name="gcal_completed_title">%s (terminada)</string>
<string name="CFC_gtasks_list_text">Na lista: ?</string>
<string name="CFC_gtasks_list_name">Na lista da GTasks…</string>
<string name="gtasks_GTA_clear_completed">Eliminar terminadas</string>
<string name="gtasks_GLA_authenticating">Autenticação…</string>
<string name="gtasks_GLA_errorIOAuth">Ocorreu um erro ao comunicar com os servidores do Google. Tente mais tarde.</string>

@ -376,7 +376,6 @@
<string name="gtasks_GLA_authenticating">Autentificare…</string>
<string name="gtasks_GTA_clear_completed">Eliminare finalizată</string>
<string name="CFC_list_name">În lista…</string>
<string name="CFC_gtasks_list_name">În lista GTasks…</string>
<string name="CFC_gtasks_list_text">În listă: \?</string>
<string name="gcal_completed_title">%s (finalizat)</string>
<string name="calendar_event_not_found">Evenimentul din calendar nu a fost găsit</string>

@ -108,7 +108,6 @@
<string name="calendar_event_not_found">Событие календаря не найдено</string>
<string name="gcal_completed_title">%s (выполнено)</string>
<string name="CFC_gtasks_list_text">В списке: \?</string>
<string name="CFC_gtasks_list_name">В списке GTasks…</string>
<string name="gtasks_GTA_clear_completed">Удалить завершенные</string>
<string name="gtasks_GLA_authenticating">Аутентификация…</string>
<string name="gtasks_GLA_errorIOAuth">При обращении к серверам Google возникли проблемы. Пожалуйста, попробуйте позже.</string>

@ -321,7 +321,6 @@
<string name="ring_once">එක් වරක් නාද කරන්න</string>
<string name="ring_five_times">පස් වතාවක් නාද කරන්න</string>
<string name="CFC_list_name">ලැයිස්තුවේ…</string>
<string name="CFC_gtasks_list_name">GTasks ලැයිස්තුවේ…</string>
<string name="SSD_sort_modified">අවසන් වරට වෙනස් කරන ලද දිනය අනුව</string>
<string name="astrid_sort_order">Astrid අතින් වර්ග කිරීම</string>
<string name="TVA_add_comment">අදහස දක්වන්න…</string>

@ -108,7 +108,6 @@
<string name="calendar_event_not_found">Udalosť kalendára nenájdená</string>
<string name="gcal_completed_title">%s (dokončené)</string>
<string name="CFC_gtasks_list_text">V zozname: ?</string>
<string name="CFC_gtasks_list_name">V zozname GTasks…</string>
<string name="gtasks_GTA_clear_completed">Vymazať dokončené</string>
<string name="gtasks_GLA_authenticating">Overovanie…</string>
<string name="gtasks_GLA_errorIOAuth">Prepáč, nastal problém v komunikácii s Google serverom. Prosím, skús to znovu neskôr.</string>

@ -78,7 +78,6 @@
<string name="gcal_TEA_showCalendar_label">Odpri dogodek v koledarju</string>
<string name="gcal_completed_title">%s (končani)</string>
<string name="CFC_gtasks_list_text">V seznamu: ?</string>
<string name="CFC_gtasks_list_name">Na GNaloge seznamu…</string>
<string name="gtasks_GTA_clear_completed">Zbriši dokončano</string>
<string name="gtasks_GLA_authenticating">Avtentikacija v teku …</string>
<string name="gtasks_GLA_errorIOAuth">Žal smo imeli težave pri povezovanju z Google strežniki. Prosimo, poskusite ponovno kasneje.</string>

@ -98,7 +98,6 @@
<string name="calendar_event_not_found">Kalenderhändelsen hittades inte</string>
<string name="gcal_completed_title">%s (slutförd)</string>
<string name="CFC_gtasks_list_text">I listan: ?</string>
<string name="CFC_gtasks_list_name">I lista på Google Uppgifter…</string>
<string name="gtasks_GTA_clear_completed">Rensa slutförda</string>
<string name="gtasks_GLA_authenticating">Autentiserar…</string>
<string name="gtasks_GLA_errorIOAuth">Tyvärr, vi hade problem med att kommunicera med Googles servrar. Vänligen försök igen senare.</string>

@ -105,7 +105,6 @@
<string name="gtasks_GLA_authenticating">அங்கீகரிக்கிறது…</string>
<string name="gtasks_GTA_clear_completed">தெளிவான நிறைவு</string>
<string name="CFC_list_name">பட்டியலில்…</string>
<string name="CFC_gtasks_list_name">GTasks பட்டியலில்…</string>
<string name="CFC_gtasks_list_text">பட்டியலில் :\?</string>
<string name="gcal_completed_title">%s (முடிந்தது)</string>
<string name="calendar_event_not_found">நாள்காட்டி நிகழ்வு கிடைக்கவில்லை</string>

@ -467,7 +467,6 @@
<string name="gtasks_GLA_authenticating">กําลังรับรองความถูกต้อง…</string>
<string name="gtasks_GTA_clear_completed">ล้างเสร็จสมบูรณ์</string>
<string name="CFC_list_name">ในรายการ…</string>
<string name="CFC_gtasks_list_name">ในรายการ GTasks…</string>
<string name="CFC_gtasks_list_text">ในรายการ: \?</string>
<string name="calendar_event_not_found">ไม่พบเหตุการณ์ในปฏิทิน</string>
<string name="gcal_TEA_error">เกิดข้อผิดพลาดในการเพิ่มงานในปฏิทิน!</string>

@ -108,7 +108,6 @@
<string name="calendar_event_not_found">Takvim etkinliği bulunamadı</string>
<string name="gcal_completed_title">%s (tamamlandı)</string>
<string name="CFC_gtasks_list_text">Liste içinde: ?</string>
<string name="CFC_gtasks_list_name">Gtasks Listesi içinde…</string>
<string name="gtasks_GTA_clear_completed">Tamamlanları Temizle</string>
<string name="gtasks_GLA_authenticating">Kimlik doğrulanıyor…</string>
<string name="gtasks_GLA_errorIOAuth">Üzgünüm, Google sunucuları ile bağlanmakta sıkıntı yaşıyoruz. Lütfen daha sonra yeniden deneyin.</string>

@ -108,7 +108,6 @@
<string name="calendar_event_not_found">Подію у календарі не знайдено</string>
<string name="gcal_completed_title">%s (завершено)</string>
<string name="CFC_gtasks_list_text">У списку: \?</string>
<string name="CFC_gtasks_list_name">У списку GTasks…</string>
<string name="gtasks_GTA_clear_completed">Очистити завершені</string>
<string name="gtasks_GLA_authenticating">Авторизація…</string>
<string name="gtasks_GLA_errorIOAuth">Вибачте, виникли проблеми звернення до серверів Google. Будь ласка, спробуйте пізніше.</string>

@ -123,7 +123,6 @@
<string name="gtasks_GLA_authenticating">تصدیق ہو رہی…</string>
<string name="gtasks_GTA_clear_completed">کلئیر مکمل ہو گیا</string>
<string name="CFC_list_name">لسٹ میں…</string>
<string name="CFC_gtasks_list_name">جی ٹاسک لسٹ میں…</string>
<string name="CFC_gtasks_list_text">لسٹ میں:?</string>
<string name="gcal_completed_title">%s مکمل ہو گیا</string>
<string name="calendar_event_not_found">کیلنڈر ایونٹ نہیں مل سکا</string>

@ -541,7 +541,6 @@
<string name="gtasks_GLA_authenticating">Đang xác thực…</string>
<string name="gtasks_GTA_clear_completed">Xoá công việc đã hoàn thành</string>
<string name="CFC_list_name">Trong danh sách…</string>
<string name="CFC_gtasks_list_name">Trong danh sách GTasks…</string>
<string name="CFC_gtasks_list_text">Trong danh sách: \?</string>
<string name="gcal_completed_title">%s (đã hoàn thành)</string>
<string name="calendar_event_not_found">Không tìm thấy sự kiện trong lịch</string>

@ -97,7 +97,6 @@
<string name="calendar_event_not_found">找不到日历事件</string>
<string name="gcal_completed_title">%s (已完成)</string>
<string name="CFC_gtasks_list_text">列表内容:?</string>
<string name="CFC_gtasks_list_name">在 GTasks 列表中…</string>
<string name="gtasks_GTA_clear_completed">清除已完成项</string>
<string name="gtasks_GLA_authenticating">正在认证…</string>
<string name="gtasks_GLA_errorIOAuth">对不起,我们在与 Google 服务器通讯时遇到了问题。请稍后再尝试。</string>

@ -77,7 +77,6 @@
<string name="gcal_TEA_showCalendar_label">打開行事曆事項</string>
<string name="gcal_completed_title">%s (已完成)</string>
<string name="CFC_gtasks_list_text">列表內容: ?</string>
<string name="CFC_gtasks_list_name">在Google任務工作列表中…</string>
<string name="gtasks_GTA_clear_completed">清除已完成項</string>
<string name="gtasks_GLA_authenticating">正在認證…</string>
<string name="gtasks_GLA_errorIOAuth">對不起我們在與Google 服務器通訊時遇到了問題。請稍後再嘗試。</string>

@ -131,7 +131,6 @@ File %1$s contained %2$s.\n\n
<string name="calendar_event_not_found">Calendar event not found</string>
<string name="gcal_completed_title">%s (completed)</string>
<string name="CFC_gtasks_list_text">In List: ?</string>
<string name="CFC_gtasks_list_name">In GTasks List…</string>
<string name="CFC_list_name">In list…</string>
<string name="gtasks_GTA_clear_completed">Clear Completed</string>
<string name="gtasks_GLA_authenticating">Authenticating…</string>

@ -15,7 +15,6 @@ import org.tasks.data.db.Database
import org.tasks.data.db.DbUtils.dbchunk
import org.tasks.data.db.SuspendDbUtils.chunkedMap
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_GOOGLE_TASKS
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_LOCAL
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_OPENTASKS
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_TASKS
@ -56,7 +55,7 @@ abstract class CaldavDao(private val database: Database) {
abstract suspend fun getAccount(type: Int, username: String): CaldavAccount?
@Query("SELECT * FROM caldav_accounts WHERE cda_id = :id")
abstract suspend fun getAccount(id: String): CaldavAccount?
abstract suspend fun getAccount(id: Long): CaldavAccount?
@Query("SELECT * FROM caldav_accounts WHERE cda_id = :id")
abstract fun watchAccount(id: Long): Flow<CaldavAccount?>
@ -214,16 +213,7 @@ SELECT EXISTS(SELECT 1
+ "AND cd_deleted = 0")
abstract suspend fun getCaldavTasksToPush(calendar: String): List<CaldavTaskContainer>
@Query("SELECT * FROM caldav_lists " +
"INNER JOIN caldav_accounts ON caldav_lists.cdl_account = caldav_accounts.cda_uuid " +
"WHERE caldav_accounts.cda_account_type = $TYPE_GOOGLE_TASKS " +
"ORDER BY cdl_name COLLATE NOCASE")
abstract suspend fun getGoogleTaskLists(): List<CaldavCalendar>
@Query("SELECT * FROM caldav_lists " +
"INNER JOIN caldav_accounts ON caldav_lists.cdl_account = caldav_accounts.cda_uuid " +
"WHERE caldav_accounts.cda_account_type != $TYPE_GOOGLE_TASKS " +
"ORDER BY cdl_name COLLATE NOCASE")
@Query("SELECT * FROM caldav_lists ORDER BY cdl_name COLLATE NOCASE")
abstract suspend fun getCalendars(): List<CaldavCalendar>
@Query("""

@ -1,8 +0,0 @@
package org.tasks.data
import org.tasks.filters.GtasksFilter
fun GoogleTaskFilters.toGtasksFilter(): GtasksFilter = GtasksFilter(
list = googleTaskList,
count = count,
)

@ -1,7 +1,5 @@
package org.tasks.data
import org.tasks.filters.CaldavFilter
import org.tasks.filters.GtasksFilter
import com.todoroo.astrid.api.PermaSql
import com.todoroo.astrid.core.SortHelper
import org.tasks.data.dao.TaskDao.TaskCriteria.activeAndVisible
@ -14,6 +12,7 @@ import org.tasks.data.sql.Field.Companion.field
import org.tasks.data.sql.Join
import org.tasks.data.sql.Query
import org.tasks.data.sql.QueryTemplate
import org.tasks.filters.CaldavFilter
import org.tasks.filters.Filter
import org.tasks.preferences.QueryPreferences
@ -48,25 +47,23 @@ internal object TaskListQueryRecursive {
): MutableList<String> {
val parentQuery = when (filter) {
is CaldavFilter -> newCaldavQuery(filter.uuid)
is GtasksFilter -> newCaldavQuery(filter.list.uuid!!)
else -> PermaSql.replacePlaceholdersForQuery(filter.sql!!)
}
val manualSort = preferences.isManualSort
val groupPreference = preferences.groupMode
val groupMode = when {
(filter is GtasksFilter || filter is CaldavFilter) &&
(manualSort || groupPreference == SortHelper.SORT_LIST) -> SortHelper.GROUP_NONE
filter is CaldavFilter && (manualSort || groupPreference == SortHelper.SORT_LIST) ->
SortHelper.GROUP_NONE
else -> groupPreference
}
val sortMode = when {
manualSort && filter is GtasksFilter -> SortHelper.SORT_GTASKS
manualSort && filter is CaldavFilter -> SortHelper.SORT_CALDAV
else -> preferences.sortMode
!manualSort || filter !is CaldavFilter -> preferences.sortMode
filter.isGoogleTasks -> SortHelper.SORT_GTASKS
else -> SortHelper.SORT_CALDAV
}
val subtaskPreference = preferences.subtaskMode
val subtaskMode = when {
manualSort && filter is GtasksFilter -> SortHelper.SORT_GTASKS
manualSort && filter is CaldavFilter -> SortHelper.SORT_CALDAV
sortMode == SortHelper.SORT_GTASKS || sortMode == SortHelper.SORT_CALDAV -> sortMode
subtaskPreference == SortHelper.SORT_MANUAL -> SortHelper.SORT_CALDAV
else -> subtaskPreference
}

@ -3,6 +3,8 @@ package org.tasks.filters
import org.tasks.CommonParcelize
import org.tasks.data.NO_COUNT
import org.tasks.data.dao.TaskDao.TaskCriteria.activeAndVisible
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_GOOGLE_TASKS
import org.tasks.data.entity.CaldavCalendar
import org.tasks.data.entity.CaldavTask
import org.tasks.data.entity.Task
@ -13,11 +15,14 @@ import org.tasks.data.sql.QueryTemplate
@CommonParcelize
data class CaldavFilter(
val calendar: CaldavCalendar,
val account: CaldavAccount,
val principals: Int = 0,
override val count: Int = NO_COUNT,
) : Filter {
override val title: String?
get() = calendar.name
override val sql: String
get() = QueryTemplate()
.join(left(CaldavTask.TABLE, Task.ID.eq(CaldavTask.TASK)))
@ -29,6 +34,7 @@ data class CaldavFilter(
)
)
.toString()
override val valuesForNewTasks: String
get() = mapToSerializedString(mapOf(CaldavTask.KEY to calendar.uuid!!))
@ -43,8 +49,6 @@ data class CaldavFilter(
val uuid: String
get() = calendar.uuid!!
val account: String
get() = calendar.account!!
override val isReadOnly: Boolean
get() = calendar.access == CaldavCalendar.ACCESS_READ_ONLY
@ -54,4 +58,12 @@ data class CaldavFilter(
override fun areItemsTheSame(other: FilterListItem): Boolean {
return other is CaldavFilter && calendar.id == other.calendar.id
}
val isGoogleTasks by lazy {
account.accountType == TYPE_GOOGLE_TASKS
}
val isIcalendar by lazy {
account.accountType != TYPE_GOOGLE_TASKS
}
}

@ -11,7 +11,6 @@ import org.tasks.data.dao.LocationDao
import org.tasks.data.dao.TagDataDao
import org.tasks.data.dao.TaskDao
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_GOOGLE_TASKS
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_LOCAL
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_OPENTASKS
import org.tasks.data.setupLocalAccount
@ -233,17 +232,12 @@ class FilterProvider(
.plus(caldavDao
.getCaldavFilters(account.uuid!!)
.map {
when (account.accountType) {
TYPE_GOOGLE_TASKS -> GtasksFilter(
list = it.caldavCalendar,
count = it.count,
)
else -> CaldavFilter(
calendar = it.caldavCalendar,
principals = it.principals,
count = it.count,
)
}
CaldavFilter(
calendar = it.caldavCalendar,
account = account,
principals = it.principals,
count = it.count,
)
}
.sort())
}

@ -1,57 +0,0 @@
package org.tasks.filters
import org.tasks.CommonParcelize
import org.tasks.data.GoogleTask
import org.tasks.data.NO_COUNT
import org.tasks.data.dao.TaskDao.TaskCriteria.activeAndVisible
import org.tasks.data.entity.CaldavCalendar
import org.tasks.data.entity.CaldavTask
import org.tasks.data.entity.Task
import org.tasks.data.sql.Criterion.Companion.and
import org.tasks.data.sql.Join.Companion.left
import org.tasks.data.sql.QueryTemplate
@CommonParcelize
data class GtasksFilter(
val list: CaldavCalendar,
override val count: Int = NO_COUNT,
) : Filter {
override val title: String?
get() = list.name
override val sql: String
get() = QueryTemplate()
.join(left(CaldavTask.TABLE, Task.ID.eq(CaldavTask.TASK)))
.where(
and(
activeAndVisible(),
CaldavTask.DELETED.eq(0),
CaldavTask.CALENDAR.eq(list.uuid)
)
)
.toString()
override val valuesForNewTasks: String
get() = mapToSerializedString(mapOf(GoogleTask.KEY to list.uuid!!))
override val order: Int
get() = list.order
override val icon: String?
get() = list.icon
override val tint: Int
get() = list.color
val account: String
get() = list.account!!
override fun supportsManualSort() = true
val remoteId: String
get() = list.uuid!!
override fun areItemsTheSame(other: FilterListItem): Boolean {
return other is GtasksFilter && list.id == other.list.id
}
}
Loading…
Cancel
Save