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

@ -22,6 +22,7 @@ import org.tasks.caldav.iCalendar.Companion.parent
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.data.CaldavTask import org.tasks.data.CaldavTask
import org.tasks.data.CaldavTaskContainer import org.tasks.data.CaldavTaskContainer
import org.tasks.data.Filter
import org.tasks.data.FilterDao import org.tasks.data.FilterDao
import org.tasks.data.GoogleTaskListDao import org.tasks.data.GoogleTaskListDao
import org.tasks.data.Location import org.tasks.data.Location
@ -87,7 +88,7 @@ class Upgrader @Inject constructor(
run(from, V9_7_3) { caldavDao.updateParents() } run(from, V9_7_3) { caldavDao.updateParents() }
run(from, V10_0_2) { run(from, V10_0_2) {
filterDao.getFilters() filterDao.getFilters()
.filter { it.getSql().trim() == "WHERE" } .filter { it.dirtyHack.trim() == "WHERE" }
.forEach { filterDao.delete(it) } .forEach { filterDao.delete(it) }
} }
run(from, Upgrade_11_3.VERSION) { run(from, Upgrade_11_3.VERSION) {
@ -154,8 +155,11 @@ class Upgrader @Inject constructor(
tagDataDao.update(tagData) tagDataDao.update(tagData)
} }
for (filter in filterDao.getFilters()) { for (filter in filterDao.getFilters()) {
filter.setColor(getAndroidColor(filter.getColor()!!)) filterDao.update(
filterDao.update(filter) filter.copy(
color = getAndroidColor(filter.color ?: 0)
)
)
} }
} }
@ -220,25 +224,34 @@ class Upgrader @Inject constructor(
private suspend fun migrateGoogleTaskFilters() { private suspend fun migrateGoogleTaskFilters() {
for (filter in filterDao.getFilters()) { for (filter in filterDao.getFilters()) {
filter.setSql(migrateGoogleTaskFilters(filter.getSql())) filterDao.update(
filter.criterion = migrateGoogleTaskFilters(filter.criterion) filter.copy(
filterDao.update(filter) sql = migrateGoogleTaskFilters(filter.dirtyHack),
criterion = migrateGoogleTaskFilters(filter.criterion),
)
)
} }
} }
private suspend fun migrateCaldavFilters() { private suspend fun migrateCaldavFilters() {
for (filter in filterDao.getFilters()) { for (filter in filterDao.getFilters()) {
filter.setSql(migrateCaldavFilters(filter.getSql())) filterDao.update(
filter.criterion = migrateCaldavFilters(filter.criterion) filter.copy(
filterDao.update(filter) sql = migrateCaldavFilters(filter.dirtyHack),
criterion = migrateCaldavFilters(filter.criterion),
)
)
} }
} }
private suspend fun migrateFilters() { private suspend fun migrateFilters() {
for (filter in filterDao.getFilters()) { for (filter in filterDao.getFilters()) {
filter.setSql(migrateMetadata(filter.getSql())) filterDao.update(
filter.criterion = migrateMetadata(filter.criterion) filter.copy(
filterDao.update(filter) sql = migrateMetadata(filter.dirtyHack),
criterion = migrateMetadata(filter.criterion),
)
)
} }
} }
@ -390,5 +403,8 @@ class Upgrader @Inject constructor(
else -> def 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.BooleanCriterion
import com.todoroo.astrid.api.CustomFilter import com.todoroo.astrid.api.CustomFilter
import com.todoroo.astrid.api.CustomFilterCriterion 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.MultipleSelectCriterion
import com.todoroo.astrid.api.PermaSql import com.todoroo.astrid.api.PermaSql
import com.todoroo.astrid.api.TextInputCriterion import com.todoroo.astrid.api.TextInputCriterion
@ -237,24 +238,25 @@ class FilterSettingsActivity : BaseListSettingsActivity() {
return return
} }
if (hasChanges()) { if (hasChanges()) {
val f = Filter() var f = Filter(
f.title = newName id = filter?.id ?: 0L,
f.setColor(selectedColor) title = newName,
f.setIcon(selectedIcon) color = selectedColor,
f.values = AndroidUtilities.mapToSerializedString(criteria.values) icon = selectedIcon,
f.criterion = CriterionInstance.serialize(criteria) values = AndroidUtilities.mapToSerializedString(criteria.values),
criterion = CriterionInstance.serialize(criteria),
sql = criteria.sql,
order = filter?.order ?: NO_ORDER,
)
if (f.criterion.isNullOrBlank()) { if (f.criterion.isNullOrBlank()) {
throw RuntimeException("Criterion cannot be empty") throw RuntimeException("Criterion cannot be empty")
} }
f.setSql(criteria.sql)
if (isNew) { if (isNew) {
f.id = filterDao.insert(f) f = f.copy(
id = filterDao.insert(f)
)
} else { } else {
filter?.let { filterDao.update(f)
f.id = it.id
f.order = it.order
filterDao.update(f)
}
} }
setResult( setResult(
Activity.RESULT_OK, Activity.RESULT_OK,

@ -126,17 +126,19 @@ class TasksJsonImporter @Inject constructor(
) )
} }
} }
backupContainer backupContainer.filters
.filters ?.map {
?.onEach {
if (version < Upgrade_13_2.VERSION) filterCriteriaProvider.rebuildFilter(it) 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 -> backupContainer.caldavAccounts?.forEach { account ->
if (caldavDao.getAccountByUuid(account.uuid!!) == null) { if (caldavDao.getAccountByUuid(account.uuid!!) == null) {
caldavDao.insert(account) caldavDao.insert(account)

@ -1,92 +1,31 @@
package org.tasks.data package org.tasks.data
import android.os.Parcelable
import androidx.room.ColumnInfo import androidx.room.ColumnInfo
import androidx.room.Entity import androidx.room.Entity
import androidx.room.PrimaryKey import androidx.room.PrimaryKey
import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.astrid.api.Filter.Companion.NO_ORDER import com.todoroo.astrid.api.Filter.Companion.NO_ORDER
import org.tasks.themes.CustomIcons.FILTER import kotlinx.parcelize.Parcelize
@Parcelize
@Entity(tableName = "filters") @Entity(tableName = "filters")
class Filter { data class Filter(
@PrimaryKey(autoGenerate = true) @PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "_id") @ColumnInfo(name = "_id")
@Transient @Transient
var id: Long = 0 val id: Long = 0,
@ColumnInfo(name = "title") @ColumnInfo(name = "title")
var title: String? = null val title: String? = null,
@ColumnInfo(name = "sql") @ColumnInfo(name = "sql")
private var sql: String? = null val sql: String? = null,
@ColumnInfo(name = "values") @ColumnInfo(name = "values")
var values: String? = null val values: String? = null,
@ColumnInfo(name = "criterion") @ColumnInfo(name = "criterion")
var criterion: String? = null val criterion: String? = null,
@ColumnInfo(name = "f_color") @ColumnInfo(name = "f_color")
private var color: Int? = 0 val color: Int? = 0,
@ColumnInfo(name = "f_icon") @ColumnInfo(name = "f_icon")
private var icon: Int? = -1 val icon: Int? = -1,
@ColumnInfo(name = "f_order") @ColumnInfo(name = "f_order")
var order = NO_ORDER val order: Int = NO_ORDER,
) : Parcelable
// 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)"
}

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

Loading…
Cancel
Save