Old saved searches can load now, but now toast on click

This commit is contained in:
Jobobby04 2021-06-02 21:04:06 -04:00
parent 3adde57db9
commit cafce0ed5f
6 changed files with 61 additions and 27 deletions

View File

@ -246,6 +246,11 @@ open class BrowseSourceController(bundle: Bundle) :
return@cb return@cb
} }
if (search.filterList == null) {
activity?.toast(R.string.save_search_invalid)
return@cb
}
presenter.sourceFilters = FilterList(search.filterList) presenter.sourceFilters = FilterList(search.filterList)
filterSheet?.setFilters(presenter.filterItems) filterSheet?.setFilters(presenter.filterItems)
val allDefault = presenter.sourceFilters == presenter.source.getFilterList() val allDefault = presenter.sourceFilters == presenter.source.getFilterList()

View File

@ -49,11 +49,9 @@ import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.serialization.decodeFromString import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.put
import rx.Observable import rx.Observable
import rx.Subscription import rx.Subscription
import rx.android.schedulers.AndroidSchedulers import rx.android.schedulers.AndroidSchedulers
@ -124,8 +122,6 @@ open class BrowseSourcePresenter(
private val loggedServices by lazy { Injekt.get<TrackManager>().services.filter { it.isLogged } } private val loggedServices by lazy { Injekt.get<TrackManager>().services.filter { it.isLogged } }
// SY --> // SY -->
private var manga: Manga? = null
private val filterSerializer = FilterSerializer() private val filterSerializer = FilterSerializer()
// SY <-- // SY <--
@ -142,8 +138,8 @@ open class BrowseSourcePresenter(
// SY --> // SY -->
if (filters != null) { if (filters != null) {
val filters = Json.decodeFromString<JsonObject>(filters) val filters = Json.decodeFromString<JsonSavedSearch>(filters)
filterSerializer.deserialize(sourceFilters, filters["filters"]!!.jsonArray) filterSerializer.deserialize(sourceFilters, filters.filters)
} }
val allDefault = sourceFilters == source.getFilterList() val allDefault = sourceFilters == source.getFilterList()
// SY <-- // SY <--
@ -451,11 +447,15 @@ open class BrowseSourcePresenter(
!it.startsWith("${source.id}:") !it.startsWith("${source.id}:")
} }
val newSerialized = searches.map { val newSerialized = searches.map {
"${source.id}:" + buildJsonObject { "${source.id}:" + Json.encodeToString(
put("name", it.name) JsonSavedSearch(
put("query", it.query) it.name,
put("filters", filterSerializer.serialize(it.filterList)) it.query,
}.toString() if (it.filterList != null) {
filterSerializer.serialize(it.filterList)
} else JsonArray(emptyList())
)
)
} }
prefs.savedSearches().set((otherSerialized + newSerialized).toSet()) prefs.savedSearches().set((otherSerialized + newSerialized).toSet())
} }
@ -463,10 +463,10 @@ open class BrowseSourcePresenter(
fun loadSearches(): List<EXHSavedSearch> { fun loadSearches(): List<EXHSavedSearch> {
val loaded = prefs.savedSearches().get() val loaded = prefs.savedSearches().get()
return loaded.map { return loaded.map {
try {
val id = it.substringBefore(':').toLong() val id = it.substringBefore(':').toLong()
if (id != source.id) return@map null if (id != source.id) return@map null
val content = Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':')) val content = Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':'))
try {
val originalFilters = source.getFilterList() val originalFilters = source.getFilterList()
filterSerializer.deserialize(originalFilters, content.filters) filterSerializer.deserialize(originalFilters, content.filters)
EXHSavedSearch( EXHSavedSearch(
@ -478,7 +478,11 @@ open class BrowseSourcePresenter(
// Load failed // Load failed
Timber.e(t, "Failed to load saved search!") Timber.e(t, "Failed to load saved search!")
t.printStackTrace() t.printStackTrace()
EXHSavedSearch(
content.name,
content.query,
null null
)
} }
}.filterNotNull() }.filterNotNull()
} }

View File

@ -23,10 +23,13 @@ import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController
import eu.kanade.tachiyomi.ui.browse.source.browse.SourceFilterSheet import eu.kanade.tachiyomi.ui.browse.source.browse.SourceFilterSheet
import eu.kanade.tachiyomi.ui.browse.source.latest.LatestUpdatesController import eu.kanade.tachiyomi.ui.browse.source.latest.LatestUpdatesController
import eu.kanade.tachiyomi.ui.manga.MangaController import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.util.system.toast
import exh.savedsearches.JsonSavedSearch
import exh.util.nullIfBlank import exh.util.nullIfBlank
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import reactivecircus.flowbinding.android.view.clicks import reactivecircus.flowbinding.android.view.clicks
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -194,8 +197,14 @@ open class IndexController :
val allDefault = presenter.sourceFilters == presenter.source.getFilterList() val allDefault = presenter.sourceFilters == presenter.source.getFilterList()
filterSheet?.dismiss() filterSheet?.dismiss()
if (!allDefault) { if (!allDefault) {
val json = buildJsonObject { put("filters", filterSerializer.serialize(presenter.sourceFilters)) } val json = Json.encodeToString(
onBrowseClick(presenter.query.nullIfBlank(), json.toString()) JsonSavedSearch(
"",
"",
filterSerializer.serialize(presenter.sourceFilters)
)
)
onBrowseClick(presenter.query.nullIfBlank(), json)
} }
}, },
onResetClicked = {}, onResetClicked = {},
@ -217,14 +226,25 @@ open class IndexController :
return@cb return@cb
} }
if (search.filterList == null) {
activity?.toast(R.string.save_search_invalid)
return@cb
}
presenter.sourceFilters = FilterList(search.filterList) presenter.sourceFilters = FilterList(search.filterList)
filterSheet?.setFilters(presenter.filterItems) filterSheet?.setFilters(presenter.filterItems)
val allDefault = presenter.sourceFilters == presenter.source.getFilterList() val allDefault = presenter.sourceFilters == presenter.source.getFilterList()
filterSheet?.dismiss() filterSheet?.dismiss()
if (!allDefault) { if (!allDefault) {
val json = buildJsonObject { put("filters", filterSerializer.serialize(presenter.sourceFilters)) } val json = Json.encodeToString(
onBrowseClick(presenter.query.nullIfBlank(), json.toString()) JsonSavedSearch(
"",
"",
filterSerializer.serialize(presenter.sourceFilters)
)
)
onBrowseClick(presenter.query.nullIfBlank(), json)
} }
}, },
onSavedSearchDeleteClicked = { _, _ -> } onSavedSearchDeleteClicked = { _, _ -> }

View File

@ -215,10 +215,10 @@ open class IndexPresenter(
fun loadSearches(): List<EXHSavedSearch> { fun loadSearches(): List<EXHSavedSearch> {
val loaded = preferences.savedSearches().get() val loaded = preferences.savedSearches().get()
return loaded.mapNotNull { return loaded.mapNotNull {
try {
val id = it.substringBefore(':').toLong() val id = it.substringBefore(':').toLong()
if (id != source.id) return@mapNotNull null if (id != source.id) return@mapNotNull null
val content = Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':')) val content = Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':'))
try {
val originalFilters = source.getFilterList() val originalFilters = source.getFilterList()
filterSerializer.deserialize(originalFilters, content.filters) filterSerializer.deserialize(originalFilters, content.filters)
EXHSavedSearch( EXHSavedSearch(
@ -230,7 +230,11 @@ open class IndexPresenter(
// Load failed // Load failed
Timber.e(t, "Failed to load saved search!") Timber.e(t, "Failed to load saved search!")
t.printStackTrace() t.printStackTrace()
EXHSavedSearch(
content.name,
content.query,
null null
)
} }
} }
} }

View File

@ -5,5 +5,5 @@ import eu.kanade.tachiyomi.source.model.FilterList
data class EXHSavedSearch( data class EXHSavedSearch(
val name: String, val name: String,
val query: String, val query: String,
val filterList: FilterList val filterList: FilterList?
) )

View File

@ -348,6 +348,7 @@
<string name="save_search_failed_to_delete_message">An error occurred while deleting the search.</string> <string name="save_search_failed_to_delete_message">An error occurred while deleting the search.</string>
<string name="save_search_delete">Delete saved search query?</string> <string name="save_search_delete">Delete saved search query?</string>
<string name="save_search_delete_message">Are you sure you wish to delete your saved search query: \'%1$s\'?</string> <string name="save_search_delete_message">Are you sure you wish to delete your saved search query: \'%1$s\'?</string>
<string name="save_search_invalid">Saved search invalid, filters have changed</string>
<!-- Source Categories --> <!-- Source Categories -->
<string name="no_source_categories">No source categories available</string> <string name="no_source_categories">No source categories available</string>