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

132 lines
5.0 KiB
Kotlin

/*
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.core
import android.content.Context
import android.content.res.Resources
import com.todoroo.andlib.sql.Criterion
import com.todoroo.andlib.sql.Criterion.Companion.and
import com.todoroo.andlib.sql.Join
import com.todoroo.andlib.sql.QueryTemplate
import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.PermaSql
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.timers.TimerPlugin
import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.R
import org.tasks.data.CaldavTask
import org.tasks.data.GoogleTask
import org.tasks.data.TaskDao
import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible
import org.tasks.filters.RecentlyModifiedFilter
import org.tasks.filters.SortableFilter
import org.tasks.preferences.Preferences
import org.tasks.themes.CustomIcons
import java.util.*
import javax.inject.Inject
/**
* Exposes Astrid's built in filters to the NavigationDrawerFragment
*
* @author Tim Su <tim></tim>@todoroo.com>
*/
class BuiltInFilterExposer @Inject constructor(
@param:ApplicationContext private val context: Context,
private val preferences: Preferences,
private val taskDao: TaskDao) {
val myTasksFilter: Filter
get() {
val myTasksFilter = getMyTasksFilter(context.resources)
myTasksFilter.icon = CustomIcons.ALL_INBOX
return myTasksFilter
}
suspend fun filters(): List<Filter> {
val r = context.resources
val filters: MutableList<Filter> = ArrayList()
if (preferences.getBoolean(R.string.p_show_today_filter, true)) {
val todayFilter = getTodayFilter(r)
todayFilter.icon = CustomIcons.TODAY
filters.add(todayFilter)
}
if (preferences.getBoolean(R.string.p_show_recently_modified_filter, true)) {
val recentlyModifiedFilter = getRecentlyModifiedFilter(r)
recentlyModifiedFilter.icon = CustomIcons.HISTORY
filters.add(recentlyModifiedFilter)
}
if (taskDao.activeTimers() > 0) {
filters.add(TimerPlugin.createFilter(context))
}
return filters
}
companion object {
/** Build inbox filter */
fun getMyTasksFilter(r: Resources): Filter {
return SortableFilter(
r.getString(R.string.BFE_Active),
QueryTemplate().where(activeAndVisible()))
}
fun getTodayFilter(r: Resources): Filter {
val todayTitle = AndroidUtilities.capitalize(r.getString(R.string.today))
val todayValues: MutableMap<String?, Any> = HashMap()
todayValues[Task.DUE_DATE.name] = PermaSql.VALUE_NOON
return SortableFilter(
todayTitle,
QueryTemplate()
.where(
and(
activeAndVisible(),
Task.DUE_DATE.gt(0),
Task.DUE_DATE.lte(PermaSql.VALUE_EOD))),
todayValues)
}
fun getNoListFilter(): Filter {
return Filter(
"No list",
QueryTemplate()
.join(Join.left(GoogleTask.TABLE, and(GoogleTask.TASK.eq(Task.ID), GoogleTask.DELETED.eq(0))))
.join(Join.left(CaldavTask.TABLE, and(CaldavTask.TASK.eq(Task.ID), CaldavTask.DELETED.eq(0))))
.where(and(
activeAndVisible(),
GoogleTask.ID.eq(null),
CaldavTask.ID.eq(null))))
.apply {
icon = R.drawable.ic_outline_cloud_off_24px
}
}
fun getNoTitleFilter(): Filter {
return Filter(
"No title",
QueryTemplate()
.where(and(
activeAndVisible(),
Criterion.or(Task.TITLE.eq(null), Task.TITLE.eq("")))))
.apply {
icon = R.drawable.ic_outline_clear_24px
}
}
fun getRecentlyModifiedFilter(r: Resources) =
RecentlyModifiedFilter(r.getString(R.string.BFE_Recent))
@JvmStatic
fun isInbox(context: Context, filter: Filter?) =
filter != null && filter == getMyTasksFilter(context.resources)
@JvmStatic
fun isTodayFilter(context: Context, filter: Filter?) =
filter != null && filter == getTodayFilter(context.resources)
fun isRecentlyModifiedFilter(context: Context, filter: Filter?) =
filter != null && filter == getRecentlyModifiedFilter(context.resources)
}
}