Convert Filter to data class

pull/2556/head
Alex Baker 9 months ago
parent 0bdd83988f
commit 082f741983

@ -2,7 +2,9 @@ package com.todoroo.astrid.api
import android.os.Parcel
import android.os.Parcelable
import com.todoroo.andlib.utility.AndroidUtilities
import org.tasks.R
import org.tasks.themes.CustomIcons
class CustomFilter : Filter {
var criterion: String? = null
@ -10,13 +12,13 @@ class CustomFilter : Filter {
constructor(filter: org.tasks.data.Filter) : super(
filter.title,
filter.getSql(),
filter.valuesAsMap
filter.sql!!,
AndroidUtilities.mapFromSerializedString(filter.values)
) {
id = filter.id
criterion = filter.criterion
tint = filter.getColor()!!
icon = filter.getIcon()!!
tint = filter.color ?: 0
icon = filter.icon ?: CustomIcons.FILTER
order = filter.order
}

@ -22,6 +22,7 @@ import org.tasks.caldav.iCalendar.Companion.parent
import org.tasks.data.CaldavDao
import org.tasks.data.CaldavTask
import org.tasks.data.CaldavTaskContainer
import org.tasks.data.Filter
import org.tasks.data.FilterDao
import org.tasks.data.GoogleTaskListDao
import org.tasks.data.Location
@ -87,7 +88,7 @@ class Upgrader @Inject constructor(
run(from, V9_7_3) { caldavDao.updateParents() }
run(from, V10_0_2) {
filterDao.getFilters()
.filter { it.getSql().trim() == "WHERE" }
.filter { it.dirtyHack.trim() == "WHERE" }
.forEach { filterDao.delete(it) }
}
run(from, Upgrade_11_3.VERSION) {
@ -154,8 +155,11 @@ class Upgrader @Inject constructor(
tagDataDao.update(tagData)
}
for (filter in filterDao.getFilters()) {
filter.setColor(getAndroidColor(filter.getColor()!!))
filterDao.update(filter)
filterDao.update(
filter.copy(
color = getAndroidColor(filter.color ?: 0)
)
)
}
}
@ -220,25 +224,34 @@ class Upgrader @Inject constructor(
private suspend fun migrateGoogleTaskFilters() {
for (filter in filterDao.getFilters()) {
filter.setSql(migrateGoogleTaskFilters(filter.getSql()))
filter.criterion = migrateGoogleTaskFilters(filter.criterion)
filterDao.update(filter)
filterDao.update(
filter.copy(
sql = migrateGoogleTaskFilters(filter.dirtyHack),
criterion = migrateGoogleTaskFilters(filter.criterion),
)
)
}
}
private suspend fun migrateCaldavFilters() {
for (filter in filterDao.getFilters()) {
filter.setSql(migrateCaldavFilters(filter.getSql()))
filter.criterion = migrateCaldavFilters(filter.criterion)
filterDao.update(filter)
filterDao.update(
filter.copy(
sql = migrateCaldavFilters(filter.dirtyHack),
criterion = migrateCaldavFilters(filter.criterion),
)
)
}
}
private suspend fun migrateFilters() {
for (filter in filterDao.getFilters()) {
filter.setSql(migrateMetadata(filter.getSql()))
filter.criterion = migrateMetadata(filter.criterion)
filterDao.update(filter)
filterDao.update(
filter.copy(
sql = migrateMetadata(filter.dirtyHack),
criterion = migrateMetadata(filter.criterion),
)
)
}
}
@ -390,5 +403,8 @@ class Upgrader @Inject constructor(
else -> def
}
}
private val Filter.dirtyHack: String
get() = sql!!.replace("tasks.userId=0", "1")
}
}

@ -25,6 +25,7 @@ import com.todoroo.astrid.activity.TaskListFragment
import com.todoroo.astrid.api.BooleanCriterion
import com.todoroo.astrid.api.CustomFilter
import com.todoroo.astrid.api.CustomFilterCriterion
import com.todoroo.astrid.api.Filter.Companion.NO_ORDER
import com.todoroo.astrid.api.MultipleSelectCriterion
import com.todoroo.astrid.api.PermaSql
import com.todoroo.astrid.api.TextInputCriterion
@ -237,24 +238,25 @@ class FilterSettingsActivity : BaseListSettingsActivity() {
return
}
if (hasChanges()) {
val f = Filter()
f.title = newName
f.setColor(selectedColor)
f.setIcon(selectedIcon)
f.values = AndroidUtilities.mapToSerializedString(criteria.values)
f.criterion = CriterionInstance.serialize(criteria)
var f = Filter(
id = filter?.id ?: 0L,
title = newName,
color = selectedColor,
icon = selectedIcon,
values = AndroidUtilities.mapToSerializedString(criteria.values),
criterion = CriterionInstance.serialize(criteria),
sql = criteria.sql,
order = filter?.order ?: NO_ORDER,
)
if (f.criterion.isNullOrBlank()) {
throw RuntimeException("Criterion cannot be empty")
}
f.setSql(criteria.sql)
if (isNew) {
f.id = filterDao.insert(f)
f = f.copy(
id = filterDao.insert(f)
)
} else {
filter?.let {
f.id = it.id
f.order = it.order
filterDao.update(f)
}
filterDao.update(f)
}
setResult(
Activity.RESULT_OK,

@ -126,17 +126,19 @@ class TasksJsonImporter @Inject constructor(
)
}
}
backupContainer
.filters
?.onEach {
backupContainer.filters
?.map {
if (version < Upgrade_13_2.VERSION) filterCriteriaProvider.rebuildFilter(it)
else it
}?.forEach { filter ->
if (filterDao.getByName(filter.title!!) == null) {
filterDao.insert(
filter.copy(
color = themeToColor(context, version, filter.color ?: 0)
)
)
}
}
?.forEach { filter ->
filter.setColor(themeToColor(context, version, filter.getColor()!!))
if (filterDao.getByName(filter.title!!) == null) {
filterDao.insert(filter)
}
}
backupContainer.caldavAccounts?.forEach { account ->
if (caldavDao.getAccountByUuid(account.uuid!!) == null) {
caldavDao.insert(account)

@ -1,92 +1,31 @@
package org.tasks.data
import android.os.Parcelable
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.astrid.api.Filter.Companion.NO_ORDER
import org.tasks.themes.CustomIcons.FILTER
import kotlinx.parcelize.Parcelize
@Parcelize
@Entity(tableName = "filters")
class Filter {
data class Filter(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "_id")
@Transient
var id: Long = 0
val id: Long = 0,
@ColumnInfo(name = "title")
var title: String? = null
val title: String? = null,
@ColumnInfo(name = "sql")
private var sql: String? = null
val sql: String? = null,
@ColumnInfo(name = "values")
var values: String? = null
val values: String? = null,
@ColumnInfo(name = "criterion")
var criterion: String? = null
val criterion: String? = null,
@ColumnInfo(name = "f_color")
private var color: Int? = 0
val color: Int? = 0,
@ColumnInfo(name = "f_icon")
private var icon: Int? = -1
val icon: Int? = -1,
@ColumnInfo(name = "f_order")
var order = NO_ORDER
// TODO: replace dirty hack for missing column
fun getSql(): String = sql!!.replace("tasks.userId=0", "1")
fun setSql(sql: String?) {
this.sql = sql
}
val valuesAsMap: Map<String, Any>
get() = AndroidUtilities.mapFromSerializedString(values)
@Suppress("RedundantNullableReturnType")
fun getColor(): Int? = color ?: 0
fun setColor(color: Int?) {
this.color = color
}
@Suppress("RedundantNullableReturnType")
fun getIcon(): Int? = icon ?: FILTER
fun setIcon(icon: Int?) {
this.icon = icon
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is Filter) return false
if (id != other.id) return false
if (title != other.title) return false
if (sql != other.sql) return false
if (values != other.values) return false
if (criterion != other.criterion) return false
if (color != other.color) return false
if (icon != other.icon) return false
if (order != other.order) return false
return true
}
override fun hashCode(): Int {
var result = id.hashCode()
result = 31 * result + (title?.hashCode() ?: 0)
result = 31 * result + (sql?.hashCode() ?: 0)
result = 31 * result + (values?.hashCode() ?: 0)
result = 31 * result + (criterion?.hashCode() ?: 0)
result = 31 * result + (color ?: 0)
result = 31 * result + (icon ?: 0)
result = 31 * result + order
return result
}
override fun toString(): String =
"Filter(id=$id, title=$title, sql=$sql, values=$values, criterion=$criterion, color=$color, icon=$icon, order=$order)"
}
val order: Int = NO_ORDER,
) : Parcelable

@ -40,11 +40,13 @@ class FilterCriteriaProvider @Inject constructor(
private val caldavDao: CaldavDao) {
private val r = context.resources
suspend fun rebuildFilter(filter: Filter) {
suspend fun rebuildFilter(filter: Filter): Filter {
val serialized = filter.criterion?.takeIf { it.isNotBlank() }
val criterion = fromString(serialized)
filter.setSql(criterion.sql)
filter.criterion = CriterionInstance.serialize(criterion)
return filter.copy(
sql = criterion.sql,
criterion = CriterionInstance.serialize(criterion),
)
}
suspend fun fromString(criterion: String?): List<CriterionInstance> {

Loading…
Cancel
Save