From 61f449aa425616a52ff090e49565365484facf20 Mon Sep 17 00:00:00 2001 From: KokaKiwi Date: Tue, 18 Jul 2023 22:37:07 +0200 Subject: [PATCH] Invalidate search sources list only on filters change --- .../source/globalsearch/SearchScreenModel.kt | 7 +++- .../eu/kanade/tachiyomi/util/lang/Lazy.kt | 39 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/util/lang/Lazy.kt diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt index e1dfb65dbf..4f6e94f23a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt @@ -9,6 +9,7 @@ import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.presentation.util.ioCoroutineScope import eu.kanade.tachiyomi.extension.ExtensionManager import eu.kanade.tachiyomi.source.CatalogueSource +import eu.kanade.tachiyomi.util.lang.resetableLazy import kotlinx.coroutines.Job import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.async @@ -42,6 +43,9 @@ abstract class SearchScreenModel( private var lastQuery: String? = null private var lastSourceFilter: SourceFilter? = null + private val sourcesHolder = resetableLazy { getSelectedSources() } + private val sources by sourcesHolder + protected var extensionFilter: String? = null protected val pinnedSources = sourcePreferences.pinnedSources().get() @@ -100,6 +104,7 @@ abstract class SearchScreenModel( fun setSourceFilter(filter: SourceFilter) { mutableState.update { it.copy(sourceFilter = filter) } + sourcesHolder.reset() search() } @@ -119,8 +124,6 @@ abstract class SearchScreenModel( searchJob?.cancel() - val sources = getSelectedSources() - val initialItems = sources.associateWith { SearchItemResult.Loading } updateItems(initialItems) diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/lang/Lazy.kt b/app/src/main/java/eu/kanade/tachiyomi/util/lang/Lazy.kt new file mode 100644 index 0000000000..912cb03a8b --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/util/lang/Lazy.kt @@ -0,0 +1,39 @@ +package eu.kanade.tachiyomi.util.lang + +@Suppress("ClassName") +internal object UNINITIALIZED_VALUE + +interface ResetableLazy : Lazy { + fun reset() +} + +fun resetableLazy(initializer: () -> T): ResetableLazy = ResetableLazyImpl(initializer) + +class ResetableLazyImpl(private val initializer: () -> T, lock: Any? = null) : ResetableLazy { + private val lock = lock ?: this + + @Volatile + private var _value: Any? = UNINITIALIZED_VALUE + + override val value: T + get() { + if (_value !== UNINITIALIZED_VALUE) { + @Suppress("UNCHECKED_CAST") + return _value as T + } + + return synchronized(lock) { + val value = initializer() + _value = value + value + } + } + + override fun isInitialized(): Boolean = _value !== UNINITIALIZED_VALUE + + override fun reset() { + _value = UNINITIALIZED_VALUE + } + + override fun toString(): String = if (isInitialized()) value.toString() else "Lazy value not initialized yet." +}