Skip to content

Commit f362b0b

Browse files
committed
fix: Fix saved search not restoring Filter.Group properly
This happened when Filter.Group ordering doesn't match the old ordering.
1 parent f74662c commit f362b0b

File tree

1 file changed

+28
-8
lines changed

1 file changed

+28
-8
lines changed

app/src/main/java/yokai/domain/source/browse/filter/FilterTypeSerializer.kt

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import kotlinx.serialization.json.jsonObject
1616
import kotlinx.serialization.json.jsonPrimitive
1717
import kotlinx.serialization.json.put
1818
import kotlinx.serialization.json.putJsonArray
19+
import kotlinx.serialization.json.putJsonObject
1920

2021
interface Serializer<in T : Filter<out Any?>> {
2122
fun JsonObjectBuilder.serialize(filter: T) {}
@@ -103,26 +104,45 @@ class GroupSerializer(override val serializer: FilterSerializer) : Serializer<Fi
103104
override val clazz = Filter.Group::class
104105

105106
override fun JsonObjectBuilder.serialize(filter: Filter.Group<Any?>) {
106-
putJsonArray(Serializer.STATE) {
107-
filter.state.forEach { state ->
108-
@Suppress("UNCHECKED_CAST")
109-
add((state as? Filter<Any?>)?.let { serializer.serialize(it) } ?: JsonNull)
107+
putJsonObject(VALUES) {
108+
filter.state.forEach { item ->
109+
@Suppress("UNCHECKED_CAST", "SafeCastWithReturn")
110+
item as? Filter<Any?> ?: return@forEach
111+
// Assuming `item.name` is unique, not sure if it is tho...
112+
put(item.name, serializer.serialize(item))
110113
}
111114
}
112115
}
113116

114117
override fun deserialize(json: JsonObject, filter: Filter.Group<Any?>) {
115-
json[Serializer.STATE]!!.jsonArray.forEachIndexed { index, element ->
116-
if (element == JsonNull) return@forEachIndexed
118+
val values = json[VALUES]?.jsonObject
119+
if (values == null) {
120+
// TODO: Delete later
121+
json[Serializer.STATE]?.jsonArray?.forEachIndexed { index, element ->
122+
if (element == JsonNull) return@forEachIndexed
123+
124+
@Suppress("UNCHECKED_CAST")
125+
serializer.deserialize(filter.state[index] as Filter<Any?>, element.jsonObject)
126+
}
127+
return
128+
}
117129

118-
@Suppress("UNCHECKED_CAST")
119-
serializer.deserialize(filter.state[index] as Filter<Any?>, element.jsonObject)
130+
filter.state.forEach { item ->
131+
@Suppress("UNCHECKED_CAST", "SafeCastWithReturn")
132+
item as? Filter<Any?> ?: return@forEach
133+
134+
val itemJson = values[item.name]?.jsonObject ?: return@forEach
135+
serializer.deserialize(item, itemJson)
120136
}
121137
}
122138

123139
override fun mappings() = listOf(
124140
Serializer.NAME to Filter.Group<Any?>::name,
125141
)
142+
143+
companion object {
144+
const val VALUES = "values"
145+
}
126146
}
127147

128148
class SortSerializer(override val serializer: FilterSerializer) : Serializer<Filter.Sort> {

0 commit comments

Comments
 (0)