From f362b0bda0ab943b32ab533f0b49083d5708fd5d Mon Sep 17 00:00:00 2001 From: Ahmad Ansori Palembani Date: Fri, 9 May 2025 10:44:30 +0700 Subject: [PATCH] fix: Fix saved search not restoring Filter.Group properly This happened when Filter.Group ordering doesn't match the old ordering. --- .../browse/filter/FilterTypeSerializer.kt | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/yokai/domain/source/browse/filter/FilterTypeSerializer.kt b/app/src/main/java/yokai/domain/source/browse/filter/FilterTypeSerializer.kt index c763e6ca4e..817765b643 100644 --- a/app/src/main/java/yokai/domain/source/browse/filter/FilterTypeSerializer.kt +++ b/app/src/main/java/yokai/domain/source/browse/filter/FilterTypeSerializer.kt @@ -16,6 +16,7 @@ import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.put import kotlinx.serialization.json.putJsonArray +import kotlinx.serialization.json.putJsonObject interface Serializer> { fun JsonObjectBuilder.serialize(filter: T) {} @@ -103,26 +104,45 @@ class GroupSerializer(override val serializer: FilterSerializer) : Serializer) { - putJsonArray(Serializer.STATE) { - filter.state.forEach { state -> - @Suppress("UNCHECKED_CAST") - add((state as? Filter)?.let { serializer.serialize(it) } ?: JsonNull) + putJsonObject(VALUES) { + filter.state.forEach { item -> + @Suppress("UNCHECKED_CAST", "SafeCastWithReturn") + item as? Filter ?: return@forEach + // Assuming `item.name` is unique, not sure if it is tho... + put(item.name, serializer.serialize(item)) } } } override fun deserialize(json: JsonObject, filter: Filter.Group) { - json[Serializer.STATE]!!.jsonArray.forEachIndexed { index, element -> - if (element == JsonNull) return@forEachIndexed + val values = json[VALUES]?.jsonObject + if (values == null) { + // TODO: Delete later + json[Serializer.STATE]?.jsonArray?.forEachIndexed { index, element -> + if (element == JsonNull) return@forEachIndexed - @Suppress("UNCHECKED_CAST") - serializer.deserialize(filter.state[index] as Filter, element.jsonObject) + @Suppress("UNCHECKED_CAST") + serializer.deserialize(filter.state[index] as Filter, element.jsonObject) + } + return + } + + filter.state.forEach { item -> + @Suppress("UNCHECKED_CAST", "SafeCastWithReturn") + item as? Filter ?: return@forEach + + val itemJson = values[item.name]?.jsonObject ?: return@forEach + serializer.deserialize(item, itemJson) } } override fun mappings() = listOf( Serializer.NAME to Filter.Group::name, ) + + companion object { + const val VALUES = "values" + } } class SortSerializer(override val serializer: FilterSerializer) : Serializer {