diff --git a/app/src/main/java/com/todoroo/astrid/api/CustomFilter.kt b/app/src/main/java/com/todoroo/astrid/api/CustomFilter.kt index e451bfd0c..94dde5e05 100644 --- a/app/src/main/java/com/todoroo/astrid/api/CustomFilter.kt +++ b/app/src/main/java/com/todoroo/astrid/api/CustomFilter.kt @@ -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 } diff --git a/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt b/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt index bb6d36d0e..15b98f971 100644 --- a/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt +++ b/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt @@ -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") } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt b/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt index 6b562c33c..470799822 100644 --- a/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt @@ -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, diff --git a/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt b/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt index 0053c5d3f..97506c5d2 100644 --- a/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt +++ b/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt @@ -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) diff --git a/app/src/main/java/org/tasks/data/Filter.kt b/app/src/main/java/org/tasks/data/Filter.kt index c1c4d56f6..84eb6bad8 100644 --- a/app/src/main/java/org/tasks/data/Filter.kt +++ b/app/src/main/java/org/tasks/data/Filter.kt @@ -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 - 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)" -} \ No newline at end of file + val order: Int = NO_ORDER, +) : Parcelable diff --git a/app/src/main/java/org/tasks/filters/FilterCriteriaProvider.kt b/app/src/main/java/org/tasks/filters/FilterCriteriaProvider.kt index b3c2cdbb0..93d497eb1 100644 --- a/app/src/main/java/org/tasks/filters/FilterCriteriaProvider.kt +++ b/app/src/main/java/org/tasks/filters/FilterCriteriaProvider.kt @@ -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 {