Merge tag '10.0.2' into main

pull/1132/head
Alex Baker 4 years ago
commit 6c898bc622

@ -1,6 +1,12 @@
Change Log
---
=======
### 10.0.2 (2020-09-14)
* Fix crash from corrupted custom filter
* Fix crash in 'Astrid manual sorting' mode
* Fix missing 'Calendar event created' snackbar
### 10.0.1 (2020-09-05)
* Bug fixes

@ -44,8 +44,8 @@ android {
defaultConfig {
testApplicationId = "org.tasks.test"
applicationId = "org.tasks"
versionCode = 100011
versionName = "10.0.1"
versionCode = 100012
versionName = "10.0.2"
targetSdkVersion(Versions.targetSdk)
minSdkVersion(Versions.minSdk)
testInstrumentationRunner = "org.tasks.TestRunner"

@ -254,9 +254,10 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener {
/** Save task model from values in UI components */
suspend fun save() = withContext(NonCancellable) {
val tlf = (activity as MainActivity?)?.taskListFragment
val saved = editViewModel.save()
if (saved && editViewModel.isNew) {
(activity as MainActivity?)?.taskListFragment?.let { taskListFragment ->
tlf?.let { taskListFragment ->
val model = editViewModel.task!!
taskListFragment.onTaskCreated(model.uuid)
if (!isNullOrEmpty(model.calendarURI)) {

@ -1,8 +1,5 @@
package com.todoroo.astrid.core
import com.google.common.base.Joiner
import com.google.common.base.Splitter
import com.google.common.collect.Lists
import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.astrid.api.CustomFilterCriterion
import com.todoroo.astrid.api.MultipleSelectCriterion
@ -72,14 +69,13 @@ class CriterionInstance {
private fun serialize(): String {
// criterion|entry|text|type|sql
return Joiner.on(AndroidUtilities.SERIALIZATION_SEPARATOR)
.join(
listOf(
escape(criterion.identifier),
escape(valueFromCriterion),
escape(criterion.text),
type,
if (criterion.sql == null) "" else criterion.sql))
return listOf(
escape(criterion.identifier),
escape(valueFromCriterion),
escape(criterion.text),
type,
criterion.sql ?: "")
.joinToString(AndroidUtilities.SERIALIZATION_SEPARATOR)
}
override fun toString(): String {
@ -126,9 +122,10 @@ class CriterionInstance {
return emptyList()
}
val entries: MutableList<CriterionInstance> = ArrayList()
for (row in criterion.split("\n".toRegex()).toTypedArray()) {
val split = Lists.transform(
Splitter.on(AndroidUtilities.SERIALIZATION_SEPARATOR).splitToList(row)) { item: String? -> unescape(item) }
for (row in criterion.trim().split("\n")) {
val split = row
.split(AndroidUtilities.SERIALIZATION_SEPARATOR)
.map { unescape(it) }
if (split.size != 4 && split.size != 5) {
Timber.e("invalid row: %s", row)
return emptyList()
@ -141,7 +138,7 @@ class CriterionInstance {
} else if (entry.criterion is MultipleSelectCriterion) {
val multipleSelectCriterion = entry.criterion as MultipleSelectCriterion?
if (multipleSelectCriterion!!.entryValues != null) {
entry.selectedIndex = listOf(*multipleSelectCriterion.entryValues).indexOf(value)
entry.selectedIndex = multipleSelectCriterion.entryValues.indexOf(value)
}
} else {
Timber.d("Ignored value %s for %s", value, entry.criterion)
@ -167,8 +164,10 @@ class CriterionInstance {
AndroidUtilities.SEPARATOR_ESCAPE, AndroidUtilities.SERIALIZATION_SEPARATOR)
}
fun serialize(criterion: List<CriterionInstance>?): String {
return Joiner.on("\n").join(Lists.transform<CriterionInstance, String?>(criterion!!) { obj: CriterionInstance? -> obj!!.serialize() })
fun serialize(criterion: List<CriterionInstance>): String {
return criterion
.joinToString("\n") { it.serialize() }
.trim()
}
}
}

@ -69,6 +69,11 @@ class Upgrader @Inject constructor(
}
run(from, V9_7) { googleTaskListDao.resetOrders() }
run(from, V9_7_3) { googleTaskDao.updateParents() }
run(from, V10_0_2) {
filterDao.getAll()
.filter { it.getSql().trim() == "WHERE" }
.forEach { filterDao.delete(it) }
}
preferences.setBoolean(R.string.p_just_updated, true)
}
preferences.setCurrentVersion(to)
@ -315,6 +320,7 @@ class Upgrader @Inject constructor(
const val V9_6 = 90600
const val V9_7 = 90700
const val V9_7_3 = 90704
const val V10_0_2 = 100012
@JvmStatic
fun getAndroidColor(context: Context, index: Int): Int {

@ -91,12 +91,7 @@ class FilterSettingsActivity : BaseListSettingsActivity() {
setCriteria(CriterionInstance.fromString(
filterCriteriaProvider, intent.getStringExtra(EXTRA_CRITERIA)!!))
}
else -> {
val instance = CriterionInstance()
instance.criterion = filterCriteriaProvider.startingUniverse
instance.type = CriterionInstance.TYPE_UNIVERSE
setCriteria(mutableListOf(instance))
}
else -> setCriteria(universe())
}
recyclerView.layoutManager = LinearLayoutManager(this)
ItemTouchHelper(
@ -108,8 +103,15 @@ class FilterSettingsActivity : BaseListSettingsActivity() {
updateTheme()
}
private fun universe() = listOf(CriterionInstance().apply {
criterion = filterCriteriaProvider.startingUniverse
type = CriterionInstance.TYPE_UNIVERSE
})
private fun setCriteria(criteria: List<CriterionInstance>) {
this.criteria = criteria.toMutableList()
this.criteria = criteria
.ifEmpty { universe() }
.toMutableList()
adapter = CustomFilterAdapter(criteria, locale) { replaceId: String -> onClick(replaceId) }
recyclerView.adapter = adapter
fab.isExtended = isNew || adapter.itemCount <= 1
@ -246,6 +248,9 @@ class FilterSettingsActivity : BaseListSettingsActivity() {
f.setIcon(selectedIcon)
f.values = AndroidUtilities.mapToSerializedString(values)
f.criterion = CriterionInstance.serialize(criteria)
if (f.criterion.isNullOrBlank()) {
throw RuntimeException("Criterion cannot be empty")
}
f.setSql(sql)
if (isNew) {
f.id = filterDao.insert(f)
@ -272,7 +277,9 @@ class FilterSettingsActivity : BaseListSettingsActivity() {
(!Strings.isNullOrEmpty(newName)
|| selectedColor != 0 || selectedIcon != -1 || criteria.size > 1)
} else newName != filter!!.listingTitle
|| selectedColor != filter!!.tint || selectedIcon != filter!!.icon || CriterionInstance.serialize(criteria) != filter!!.criterion
|| selectedColor != filter!!.tint
|| selectedIcon != filter!!.icon
|| CriterionInstance.serialize(criteria) != filter!!.criterion.trim()
|| values != filter!!.valuesForNewTasks
|| sql != filter!!.originalSqlQuery
}

@ -1,9 +1,6 @@
package org.tasks.data
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query
import androidx.room.Update
import androidx.room.*
import com.todoroo.astrid.api.FilterListItem.NO_ORDER
@Dao
@ -14,6 +11,9 @@ interface FilterDao {
@Query("DELETE FROM filters WHERE _id = :id")
suspend fun delete(id: Long)
@Delete
suspend fun delete(filter: Filter)
@Query("SELECT * FROM filters WHERE title = :title COLLATE NOCASE LIMIT 1")
suspend fun getByName(title: String): Filter?

@ -0,0 +1,3 @@
* Fix crash from corrupted custom filter
* Fix crash in 'Astrid manual sorting' mode
* Fix missing 'Calendar event created' snackbar
Loading…
Cancel
Save