Move some filters to kmp

pull/2912/head
Alex Baker 4 months ago
parent 929a01cd8c
commit d9293c7262

@ -2,7 +2,7 @@ package com.todoroo.astrid.adapter
import com.natpryce.makeiteasy.MakeItEasy.with import com.natpryce.makeiteasy.MakeItEasy.with
import com.natpryce.makeiteasy.PropertyValue import com.natpryce.makeiteasy.PropertyValue
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import org.tasks.data.entity.Task import org.tasks.data.entity.Task
import com.todoroo.astrid.service.TaskMover import com.todoroo.astrid.service.TaskMover

@ -1,7 +1,7 @@
package com.todoroo.astrid.service package com.todoroo.astrid.service
import com.natpryce.makeiteasy.MakeItEasy.with import com.natpryce.makeiteasy.MakeItEasy.with
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.HiltAndroidTest

@ -8,7 +8,6 @@ package com.todoroo.astrid.activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode import androidx.appcompat.view.ActionMode
@ -37,16 +36,21 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.tasks.BuildConfig import org.tasks.BuildConfig
import org.tasks.R import org.tasks.R
import org.tasks.activities.GoogleTaskListSettingsActivity
import org.tasks.activities.TagSettingsActivity
import org.tasks.analytics.Firebase import org.tasks.analytics.Firebase
import org.tasks.billing.Inventory import org.tasks.billing.Inventory
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.drawer.TasksMenu import org.tasks.compose.drawer.TasksMenu
import org.tasks.data.dao.AlarmDao import org.tasks.data.dao.AlarmDao
import org.tasks.data.dao.CaldavDao
import org.tasks.data.dao.LocationDao import org.tasks.data.dao.LocationDao
import org.tasks.data.entity.Place
import org.tasks.data.dao.TagDataDao import org.tasks.data.dao.TagDataDao
import org.tasks.data.entity.Place
import org.tasks.data.entity.Task import org.tasks.data.entity.Task
import org.tasks.data.getLocation import org.tasks.data.getLocation
import org.tasks.data.listSettingsClass
import org.tasks.databinding.TaskListActivityBinding import org.tasks.databinding.TaskListActivityBinding
import org.tasks.dialogs.NewFilterDialog import org.tasks.dialogs.NewFilterDialog
import org.tasks.dialogs.WhatsNewDialog import org.tasks.dialogs.WhatsNewDialog
@ -54,7 +58,9 @@ import org.tasks.extensions.Context.nightMode
import org.tasks.extensions.hideKeyboard import org.tasks.extensions.hideKeyboard
import org.tasks.filters.Filter import org.tasks.filters.Filter
import org.tasks.filters.FilterProvider import org.tasks.filters.FilterProvider
import org.tasks.filters.NavigationDrawerSubheader
import org.tasks.filters.PlaceFilter import org.tasks.filters.PlaceFilter
import org.tasks.location.LocationPickerActivity
import org.tasks.location.LocationPickerActivity.Companion.EXTRA_PLACE import org.tasks.location.LocationPickerActivity.Companion.EXTRA_PLACE
import org.tasks.preferences.DefaultFilterProvider import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
@ -81,6 +87,7 @@ class MainActivity : AppCompatActivity() {
@Inject lateinit var alarmDao: AlarmDao @Inject lateinit var alarmDao: AlarmDao
@Inject lateinit var eventBus: MainActivityEventBus @Inject lateinit var eventBus: MainActivityEventBus
@Inject lateinit var firebase: Firebase @Inject lateinit var firebase: Firebase
@Inject lateinit var caldavDao: CaldavDao
private val viewModel: MainActivityViewModel by viewModels() private val viewModel: MainActivityViewModel by viewModels()
private var currentNightMode = 0 private var currentNightMode = 0
@ -88,11 +95,6 @@ class MainActivity : AppCompatActivity() {
private var actionMode: ActionMode? = null private var actionMode: ActionMode? = null
private lateinit var binding: TaskListActivityBinding private lateinit var binding: TaskListActivityBinding
private val settingsRequest =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
recreate()
}
/** @see android.app.Activity.onCreate /** @see android.app.Activity.onCreate
*/ */
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@ -119,15 +121,43 @@ class MainActivity : AppCompatActivity() {
setFilter = { viewModel.setFilter(it) }, setFilter = { viewModel.setFilter(it) },
toggleCollapsed = { viewModel.toggleCollapsed(it) }, toggleCollapsed = { viewModel.toggleCollapsed(it) },
addFilter = { addFilter = {
val rc = it.addIntentRc when (it.addIntentRc) {
if (rc == FilterProvider.REQUEST_NEW_FILTER) { FilterProvider.REQUEST_NEW_FILTER ->
NewFilterDialog.newFilterDialog().show( NewFilterDialog.newFilterDialog().show(
supportFragmentManager, supportFragmentManager,
SubheaderClickHandler.FRAG_TAG_NEW_FILTER SubheaderClickHandler.FRAG_TAG_NEW_FILTER
) )
} else { REQUEST_NEW_PLACE ->
val intent = it.addIntent ?: return@TasksMenu startActivityForResult(
startActivityForResult(intent, rc) Intent(this, LocationPickerActivity::class.java),
REQUEST_NEW_PLACE
)
REQUEST_NEW_TAGS ->
startActivityForResult(
Intent(this, TagSettingsActivity::class.java),
REQUEST_NEW_LIST
)
REQUEST_NEW_LIST -> lifecycleScope.launch {
val account = caldavDao.getAccount(it.id) ?: return@launch
when (it.subheaderType) {
NavigationDrawerSubheader.SubheaderType.GOOGLE_TASKS ->
startActivityForResult(
Intent(this@MainActivity, GoogleTaskListSettingsActivity::class.java)
.putExtra(GoogleTaskListSettingsActivity.EXTRA_ACCOUNT, account),
REQUEST_NEW_LIST
)
NavigationDrawerSubheader.SubheaderType.CALDAV,
NavigationDrawerSubheader.SubheaderType.TASKS,
NavigationDrawerSubheader.SubheaderType.ETESYNC ->
startActivityForResult(
Intent(this@MainActivity, account.listSettingsClass())
.putExtra(BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_ACCOUNT, account),
REQUEST_NEW_LIST
)
else -> {}
}
}
else -> Timber.e("Unhandled request code: $it")
} }
}, },
dismiss = { viewModel.setDrawerOpen(false) }, dismiss = { viewModel.setDrawerOpen(false) },
@ -369,6 +399,7 @@ class MainActivity : AppCompatActivity() {
private const val FLAG_FROM_HISTORY private const val FLAG_FROM_HISTORY
= Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
const val REQUEST_NEW_LIST = 10100 const val REQUEST_NEW_LIST = 10100
const val REQUEST_NEW_TAGS = 10101
const val REQUEST_NEW_PLACE = 10104 const val REQUEST_NEW_PLACE = 10104
val Intent.getFilter: Filter? val Intent.getFilter: Filter?

@ -8,7 +8,6 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.todoroo.astrid.activity.MainActivity.Companion.LOAD_FILTER import com.todoroo.astrid.activity.MainActivity.Companion.LOAD_FILTER
import com.todoroo.astrid.activity.MainActivity.Companion.OPEN_FILTER import com.todoroo.astrid.activity.MainActivity.Companion.OPEN_FILTER
import com.todoroo.astrid.api.CaldavFilter
import com.todoroo.astrid.api.CustomFilter import com.todoroo.astrid.api.CustomFilter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.TagFilter import com.todoroo.astrid.api.TagFilter
@ -32,6 +31,7 @@ import org.tasks.data.count
import org.tasks.data.dao.CaldavDao import org.tasks.data.dao.CaldavDao
import org.tasks.data.dao.TaskDao import org.tasks.data.dao.TaskDao
import org.tasks.data.entity.Task import org.tasks.data.entity.Task
import org.tasks.filters.CaldavFilter
import org.tasks.filters.Filter import org.tasks.filters.Filter
import org.tasks.filters.FilterProvider import org.tasks.filters.FilterProvider
import org.tasks.filters.NavigationDrawerSubheader import org.tasks.filters.NavigationDrawerSubheader
@ -145,7 +145,7 @@ class MainActivityViewModel @Inject constructor(
title = item.title ?: "", title = item.title ?: "",
collapsed = item.isCollapsed, collapsed = item.isCollapsed,
hasError = item.error, hasError = item.error,
canAdd = item.addIntent != null, canAdd = item.addIntentRc != 0,
type = { item }, type = { item },
) )
else -> throw IllegalArgumentException() else -> throw IllegalArgumentException()

@ -53,7 +53,7 @@ import com.todoroo.astrid.adapter.TaskAdapter
import com.todoroo.astrid.adapter.TaskAdapterProvider import com.todoroo.astrid.adapter.TaskAdapterProvider
import com.todoroo.astrid.api.AstridApiConstants.EXTRAS_OLD_DUE_DATE import com.todoroo.astrid.api.AstridApiConstants.EXTRAS_OLD_DUE_DATE
import com.todoroo.astrid.api.AstridApiConstants.EXTRAS_TASK_ID import com.todoroo.astrid.api.AstridApiConstants.EXTRAS_TASK_ID
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.api.CustomFilter import com.todoroo.astrid.api.CustomFilter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.TagFilter import com.todoroo.astrid.api.TagFilter

@ -7,7 +7,7 @@ import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.api.CustomFilter import com.todoroo.astrid.api.CustomFilter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.TagFilter import com.todoroo.astrid.api.TagFilter

@ -7,8 +7,6 @@ import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.data.dao.CaldavDao import org.tasks.data.dao.CaldavDao
import org.tasks.dialogs.NewFilterDialog
import org.tasks.filters.FilterProvider
import org.tasks.filters.NavigationDrawerSubheader import org.tasks.filters.NavigationDrawerSubheader
import org.tasks.filters.NavigationDrawerSubheader.SubheaderType.CALDAV import org.tasks.filters.NavigationDrawerSubheader.SubheaderType.CALDAV
import org.tasks.filters.NavigationDrawerSubheader.SubheaderType.ETESYNC import org.tasks.filters.NavigationDrawerSubheader.SubheaderType.ETESYNC
@ -34,23 +32,11 @@ class SubheaderClickHandler @Inject constructor(
CALDAV, CALDAV,
TASKS, TASKS,
ETESYNC -> caldavDao.setCollapsed(subheader.id, collapsed) ETESYNC -> caldavDao.setCollapsed(subheader.id, collapsed)
else -> throw IllegalArgumentException()
} }
localBroadcastManager.broadcastRefreshList() localBroadcastManager.broadcastRefreshList()
} }
} }
override fun onAdd(subheader: NavigationDrawerSubheader) {
when (subheader.addIntentRc) {
FilterProvider.REQUEST_NEW_FILTER ->
NewFilterDialog.newFilterDialog().show(
(activity as AppCompatActivity).supportFragmentManager,
FRAG_TAG_NEW_FILTER
)
else -> activity.startActivityForResult(subheader.addIntent, subheader.addIntentRc)
}
}
override fun showError() = override fun showError() =
activity.startActivity(Intent(activity, MainPreferences::class.java)) activity.startActivity(Intent(activity, MainPreferences::class.java))

@ -18,7 +18,6 @@ internal class SubheaderViewHolder(
interface ClickHandler { interface ClickHandler {
fun onClick(subheader: NavigationDrawerSubheader) fun onClick(subheader: NavigationDrawerSubheader)
fun onAdd(subheader: NavigationDrawerSubheader)
fun showError() fun showError()
} }
@ -31,7 +30,7 @@ internal class SubheaderViewHolder(
private lateinit var subheader: NavigationDrawerSubheader private lateinit var subheader: NavigationDrawerSubheader
fun bind(subheader: NavigationDrawerSubheader) { fun bind(subheader: NavigationDrawerSubheader) {
add.isVisible = subheader.addIntent != null add.isVisible = false
this.subheader = subheader this.subheader = subheader
text.text = subheader.title text.text = subheader.title
when { when {
@ -63,6 +62,5 @@ internal class SubheaderViewHolder(
} }
} }
errorIcon.setOnClickListener { clickHandler.showError() } errorIcon.setOnClickListener { clickHandler.showError() }
add.setOnClickListener { clickHandler.onAdd(subheader) }
} }
} }

@ -1,7 +1,7 @@
package com.todoroo.astrid.adapter package com.todoroo.astrid.adapter
import android.content.Context import android.content.Context
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.TagFilter import com.todoroo.astrid.api.TagFilter
import com.todoroo.astrid.core.BuiltInFilterExposer import com.todoroo.astrid.core.BuiltInFilterExposer

@ -12,7 +12,7 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch

@ -1,7 +1,7 @@
package com.todoroo.astrid.service package com.todoroo.astrid.service
import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.PermaSql import com.todoroo.astrid.api.PermaSql
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao

@ -1,7 +1,7 @@
package com.todoroo.astrid.service package com.todoroo.astrid.service
import android.content.Context import android.content.Context
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.BuildConfig import org.tasks.BuildConfig
@ -57,7 +57,8 @@ class TaskMover @Inject constructor(
selectedList = if (account.accountType == CaldavAccount.TYPE_GOOGLE_TASKS) selectedList = if (account.accountType == CaldavAccount.TYPE_GOOGLE_TASKS)
GtasksFilter(calendar) GtasksFilter(calendar)
else else
CaldavFilter(calendar)) CaldavFilter(calendar)
)
} }
suspend fun move(ids: List<Long>, selectedList: Filter) { suspend fun move(ids: List<Long>, selectedList: Filter) {

@ -18,7 +18,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.todoroo.astrid.adapter.FilterViewHolder import com.todoroo.astrid.adapter.FilterViewHolder
import com.todoroo.astrid.adapter.NavigationDrawerAdapter import com.todoroo.astrid.adapter.NavigationDrawerAdapter
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.api.CustomFilter import com.todoroo.astrid.api.CustomFilter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.TagFilter import com.todoroo.astrid.api.TagFilter

@ -15,7 +15,7 @@ import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout
import com.todoroo.astrid.activity.MainActivity import com.todoroo.astrid.activity.MainActivity
import com.todoroo.astrid.activity.TaskListFragment import com.todoroo.astrid.activity.TaskListFragment
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import org.tasks.data.UUIDHelper import org.tasks.data.UUIDHelper
import com.todoroo.astrid.service.TaskDeleter import com.todoroo.astrid.service.TaskDeleter
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking

@ -3,7 +3,7 @@ package org.tasks.caldav
import android.content.Intent import android.content.Intent
import com.todoroo.astrid.activity.MainActivity import com.todoroo.astrid.activity.MainActivity
import com.todoroo.astrid.activity.TaskListFragment import com.todoroo.astrid.activity.TaskListFragment
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import org.tasks.data.UUIDHelper import org.tasks.data.UUIDHelper
import com.todoroo.astrid.service.TaskDeleter import com.todoroo.astrid.service.TaskDeleter
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel

@ -307,8 +307,6 @@ fun MenuPreview() {
false, false,
NavigationDrawerSubheader.SubheaderType.PREFERENCE, NavigationDrawerSubheader.SubheaderType.PREFERENCE,
0L, 0L,
0,
null
) )
}, },
) )

@ -18,7 +18,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import org.tasks.R import org.tasks.R
import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.dialogs.FilterPickerViewModel import org.tasks.dialogs.FilterPickerViewModel

@ -1,6 +1,6 @@
package org.tasks.data package org.tasks.data
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.PermaSql import com.todoroo.astrid.api.PermaSql
import com.todoroo.astrid.core.SortHelper import com.todoroo.astrid.core.SortHelper

@ -3,7 +3,6 @@ package org.tasks.filters
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import com.todoroo.astrid.activity.MainActivity import com.todoroo.astrid.activity.MainActivity
import com.todoroo.astrid.api.CaldavFilter
import com.todoroo.astrid.api.CustomFilter import com.todoroo.astrid.api.CustomFilter
import com.todoroo.astrid.core.BuiltInFilterExposer import com.todoroo.astrid.core.BuiltInFilterExposer
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
@ -60,15 +59,15 @@ class FilterProvider @Inject constructor(
private fun getDebugFilters(): List<FilterListItem> = private fun getDebugFilters(): List<FilterListItem> =
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
val collapsed = preferences.getBoolean(R.string.p_collapse_debug, false) val collapsed = preferences.getBoolean(R.string.p_collapse_debug, false)
listOf(NavigationDrawerSubheader( listOf(
NavigationDrawerSubheader(
context.getString(R.string.debug), context.getString(R.string.debug),
false, false,
collapsed, collapsed,
SubheaderType.PREFERENCE, SubheaderType.PREFERENCE,
R.string.p_collapse_debug.toLong(), R.string.p_collapse_debug.toLong(),
0, )
null, )
))
.apply { if (collapsed) return this } .apply { if (collapsed) return this }
.plus(listOf( .plus(listOf(
BuiltInFilterExposer.getNoListFilter(), BuiltInFilterExposer.getNoListFilter(),
@ -90,14 +89,15 @@ class FilterProvider @Inject constructor(
} else { } else {
val collapsed = preferences.getBoolean(R.string.p_collapse_filters, false) val collapsed = preferences.getBoolean(R.string.p_collapse_filters, false)
listOf( listOf(
NavigationDrawerSubheader( NavigationDrawerSubheader(
context.getString(R.string.filters), context.getString(R.string.filters),
false, false,
collapsed, collapsed,
SubheaderType.PREFERENCE, SubheaderType.PREFERENCE,
R.string.p_collapse_filters.toLong(), R.string.p_collapse_filters.toLong(),
REQUEST_NEW_FILTER, if (showCreate) REQUEST_NEW_FILTER else 0,
if (showCreate) Intent() else null)) )
)
.apply { if (collapsed) return this } .apply { if (collapsed) return this }
.plusAllIf(showBuiltIn) { .plusAllIf(showBuiltIn) {
builtInFilterExposer.filters() builtInFilterExposer.filters()
@ -111,18 +111,15 @@ class FilterProvider @Inject constructor(
} else { } else {
val collapsed = preferences.getBoolean(R.string.p_collapse_tags, false) val collapsed = preferences.getBoolean(R.string.p_collapse_tags, false)
listOf( listOf(
NavigationDrawerSubheader( NavigationDrawerSubheader(
context.getString(R.string.tags), context.getString(R.string.tags),
false, false,
collapsed, collapsed,
SubheaderType.PREFERENCE, SubheaderType.PREFERENCE,
R.string.p_collapse_tags.toLong(), R.string.p_collapse_tags.toLong(),
MainActivity.REQUEST_NEW_LIST, if (showCreate) MainActivity.REQUEST_NEW_TAGS else 0,
if (showCreate) { )
Intent(context, TagSettingsActivity::class.java) )
} else {
null
}))
.apply { if (collapsed) return this } .apply { if (collapsed) return this }
.plus(tagDataDao.getTagFilters() .plus(tagDataDao.getTagFilters()
.filterIf(hideUnused && preferences.getBoolean(R.string.p_tags_hide_unused, false)) { .filterIf(hideUnused && preferences.getBoolean(R.string.p_tags_hide_unused, false)) {
@ -138,18 +135,15 @@ class FilterProvider @Inject constructor(
} else { } else {
val collapsed = preferences.getBoolean(R.string.p_collapse_locations, false) val collapsed = preferences.getBoolean(R.string.p_collapse_locations, false)
listOf( listOf(
NavigationDrawerSubheader( NavigationDrawerSubheader(
context.getString(R.string.places), context.getString(R.string.places),
false, false,
collapsed, collapsed,
SubheaderType.PREFERENCE, SubheaderType.PREFERENCE,
R.string.p_collapse_locations.toLong(), R.string.p_collapse_locations.toLong(),
MainActivity.REQUEST_NEW_PLACE, if (showCreate) MainActivity.REQUEST_NEW_PLACE else 0,
if (showCreate) { )
Intent(context, LocationPickerActivity::class.java) )
} else {
null
}))
.apply { if (collapsed) return this } .apply { if (collapsed) return this }
.plus(locationDao.getPlaceFilters() .plus(locationDao.getPlaceFilters()
.filterIf(hideUnused && preferences.getBoolean(R.string.p_places_hide_unused, false)) { .filterIf(hideUnused && preferences.getBoolean(R.string.p_places_hide_unused, false)) {
@ -177,26 +171,29 @@ class FilterProvider @Inject constructor(
.toList() .toList()
.plusAllIf(BuildConfig.DEBUG) { getDebugFilters() } .plusAllIf(BuildConfig.DEBUG) { getDebugFilters() }
private suspend fun googleTaskFilter(account: CaldavAccount, showCreate: Boolean): List<FilterListItem> = private suspend fun googleTaskFilter(
listOf( account: CaldavAccount,
NavigationDrawerSubheader( showCreate: Boolean,
account.username, ): List<FilterListItem> {
account.error?.isNotBlank() ?: false, val collapsed = account.isCollapsed
account.isCollapsed, return listOf(
SubheaderType.GOOGLE_TASKS, NavigationDrawerSubheader(
account.id, account.username,
MainActivity.REQUEST_NEW_LIST, account.error?.isNotBlank() ?: false,
if (showCreate) { collapsed,
Intent(context, GoogleTaskListSettingsActivity::class.java) SubheaderType.GOOGLE_TASKS,
.putExtra(GoogleTaskListSettingsActivity.EXTRA_ACCOUNT, account) account.id,
} else { if (showCreate) MainActivity.REQUEST_NEW_LIST else 0,
null )
})) )
.apply { if (account.isCollapsed) return this } .apply { if (collapsed) return this }
.plus(googleTaskListDao .plus(
.getGoogleTaskFilters(account.username!!) googleTaskListDao
.map(GoogleTaskFilters::toGtasksFilter) .getGoogleTaskFilters(account.username!!)
.sort()) .map(GoogleTaskFilters::toGtasksFilter)
.sort()
)
}
private suspend fun caldavFilters(showCreate: Boolean = true): List<FilterListItem> = private suspend fun caldavFilters(showCreate: Boolean = true): List<FilterListItem> =
caldavDao.getAccounts() caldavDao.getAccounts()
@ -213,44 +210,41 @@ class FilterProvider @Inject constructor(
} }
} }
private suspend fun caldavFilter(account: CaldavAccount, showCreate: Boolean): List<FilterListItem> = private suspend fun caldavFilter(
listOf( account: CaldavAccount,
NavigationDrawerSubheader( showCreate: Boolean,
if (account.accountType == TYPE_LOCAL) { ): List<FilterListItem> {
context.getString(R.string.local_lists) val collapsed = account.isCollapsed
} else { return listOf(
account.name NavigationDrawerSubheader(
}, if (account.accountType == TYPE_LOCAL) {
account.error?.isNotBlank() ?: false, context.getString(R.string.local_lists)
account.isCollapsed, } else {
when { account.name
account.isTasksOrg -> SubheaderType.TASKS },
account.isEteSyncAccount -> SubheaderType.ETESYNC account.error?.isNotBlank() ?: false,
else -> SubheaderType.CALDAV collapsed,
}, when {
account.id, account.isTasksOrg -> SubheaderType.TASKS
MainActivity.REQUEST_NEW_LIST, account.isEteSyncAccount -> SubheaderType.ETESYNC
if (showCreate) { else -> SubheaderType.CALDAV
Intent(context, account.listSettingsClass()) },
.putExtra( account.id,
BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_ACCOUNT, if (showCreate) MainActivity.REQUEST_NEW_LIST else 0,
account )
) )
} else { .apply { if (collapsed) return this }
null .plus(caldavDao
} .getCaldavFilters(account.uuid!!)
)) .map {
.apply { if (account.isCollapsed) return this } CaldavFilter(
.plus(caldavDao calendar = it.caldavCalendar,
.getCaldavFilters(account.uuid!!) principals = it.principals,
.map { count = it.count,
CaldavFilter( )
calendar = it.caldavCalendar, }
principals = it.principals, .sort())
count = it.count, }
)
}
.sort())
companion object { companion object {
const val REQUEST_NEW_FILTER = 101015 const val REQUEST_NEW_FILTER = 101015

@ -1,7 +1,7 @@
package org.tasks.preferences package org.tasks.preferences
import android.content.Context import android.content.Context
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.api.CustomFilter import com.todoroo.astrid.api.CustomFilter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.TagFilter import com.todoroo.astrid.api.TagFilter

@ -7,7 +7,7 @@ import androidx.activity.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.todoroo.astrid.activity.MainActivity import com.todoroo.astrid.activity.MainActivity
import com.todoroo.astrid.activity.TaskListFragment import com.todoroo.astrid.activity.TaskListFragment
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.data.entity.CaldavAccount import org.tasks.data.entity.CaldavAccount

@ -14,7 +14,7 @@ import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.TagFilter import com.todoroo.astrid.api.TagFilter
import com.todoroo.astrid.core.SortHelper.SORT_DUE import com.todoroo.astrid.core.SortHelper.SORT_DUE

@ -9,7 +9,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.todoroo.astrid.activity.TaskEditFragment import com.todoroo.astrid.activity.TaskEditFragment
import com.todoroo.astrid.alarms.AlarmService import com.todoroo.astrid.alarms.AlarmService
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.gcal.GCalHelper import com.todoroo.astrid.gcal.GCalHelper

@ -4,7 +4,7 @@ import android.content.Context
import android.widget.RemoteViews import android.widget.RemoteViews
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.api.CaldavFilter import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.TagFilter import com.todoroo.astrid.api.TagFilter
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext

@ -55,6 +55,9 @@ abstract class CaldavDao(private val database: Database) {
@Query("SELECT * FROM caldav_accounts WHERE cda_account_type = :type AND cda_username = :username") @Query("SELECT * FROM caldav_accounts WHERE cda_account_type = :type AND cda_username = :username")
abstract suspend fun getAccount(type: Int, username: String): CaldavAccount? abstract suspend fun getAccount(type: Int, username: String): CaldavAccount?
@Query("SELECT * FROM caldav_accounts WHERE cda_id = :id")
abstract suspend fun getAccount(id: Long): CaldavAccount?
@Query("SELECT * FROM caldav_accounts WHERE cda_id = :id") @Query("SELECT * FROM caldav_accounts WHERE cda_id = :id")
abstract fun watchAccount(id: Long): Flow<CaldavAccount?> abstract fun watchAccount(id: Long): Flow<CaldavAccount?>

@ -0,0 +1,8 @@
package org.tasks.filters
@Deprecated("Use manual ordering")
interface AstridOrderingFilter : Filter {
var filterOverride: String?
fun getSqlQuery(): String = filterOverride ?: sql!!
}

@ -1,20 +1,16 @@
package com.todoroo.astrid.api package org.tasks.filters
import org.tasks.data.sql.Criterion.Companion.and import org.tasks.CommonParcelize
import org.tasks.data.sql.Join.Companion.left import org.tasks.data.NO_COUNT
import org.tasks.data.sql.QueryTemplate import org.tasks.data.dao.TaskDao.TaskCriteria.activeAndVisible
import com.todoroo.andlib.utility.AndroidUtilities
import kotlinx.parcelize.Parcelize
import org.tasks.data.entity.CaldavCalendar import org.tasks.data.entity.CaldavCalendar
import org.tasks.data.entity.CaldavTask import org.tasks.data.entity.CaldavTask
import org.tasks.data.NO_COUNT
import org.tasks.data.entity.Task import org.tasks.data.entity.Task
import org.tasks.data.dao.TaskDao.TaskCriteria.activeAndVisible import org.tasks.data.sql.Criterion.Companion.and
import org.tasks.filters.Filter import org.tasks.data.sql.Join.Companion.left
import org.tasks.filters.FilterListItem import org.tasks.data.sql.QueryTemplate
import org.tasks.filters.mapToSerializedString
@Parcelize @CommonParcelize
data class CaldavFilter( data class CaldavFilter(
val calendar: CaldavCalendar, val calendar: CaldavCalendar,
val principals: Int = 0, val principals: Int = 0,

@ -1,7 +1,6 @@
package org.tasks.filters package org.tasks.filters
import org.tasks.CommonParcelable import org.tasks.CommonParcelable
import org.tasks.CommonParcelize
import org.tasks.data.NO_COUNT import org.tasks.data.NO_COUNT
import org.tasks.data.NO_ORDER import org.tasks.data.NO_ORDER
@ -32,23 +31,3 @@ interface Filter : FilterListItem, CommonParcelable {
fun supportsSorting(): Boolean = true fun supportsSorting(): Boolean = true
fun disableHeaders(): Boolean = !supportsSorting() fun disableHeaders(): Boolean = !supportsSorting()
} }
@Deprecated("Use manual ordering")
interface AstridOrderingFilter : Filter {
var filterOverride: String?
fun getSqlQuery(): String = filterOverride ?: sql!!
}
@CommonParcelize
data class FilterImpl(
override val title: String? = null,
override val sql: String? = null,
override val valuesForNewTasks: String? = null,
override val icon: Int = -1,
override val tint: Int = 0,
) : Filter {
override fun areItemsTheSame(other: FilterListItem): Boolean {
return other is Filter && sql == other.sql
}
}

@ -0,0 +1,16 @@
package org.tasks.filters
import org.tasks.CommonParcelize
@CommonParcelize
data class FilterImpl(
override val title: String? = null,
override val sql: String? = null,
override val valuesForNewTasks: String? = null,
override val icon: Int = -1,
override val tint: Int = 0,
) : Filter {
override fun areItemsTheSame(other: FilterListItem): Boolean {
return other is Filter && sql == other.sql
}
}

@ -1,15 +1,12 @@
package org.tasks.filters package org.tasks.filters
import android.content.Intent
data class NavigationDrawerSubheader( data class NavigationDrawerSubheader(
val title: String?, val title: String?,
val error: Boolean, val error: Boolean,
val isCollapsed: Boolean, val isCollapsed: Boolean,
val subheaderType: SubheaderType, val subheaderType: SubheaderType,
val id: Long, val id: Long,
val addIntentRc: Int, val addIntentRc: Int = 0,
val addIntent: Intent?,
) : FilterListItem { ) : FilterListItem {
override fun areItemsTheSame(other: FilterListItem): Boolean { override fun areItemsTheSame(other: FilterListItem): Boolean {
return other is NavigationDrawerSubheader && subheaderType == other.subheaderType && id == other.id return other is NavigationDrawerSubheader && subheaderType == other.subheaderType && id == other.id
Loading…
Cancel
Save