From 18f65d4ca4e3b88b14528f14b32bb8c249f0b76f Mon Sep 17 00:00:00 2001 From: arkon Date: Wed, 3 May 2023 15:07:41 -0400 Subject: [PATCH] Fix language in source filter list jumping to top incorrectly Fixes #9068 (cherry picked from commit f5ad95d78a857c226d53e010e52e8563ecd38f0d) # Conflicts: # app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt --- .../interactor/GetLanguagesWithSources.kt | 6 +- .../browse/SourcesFilterScreen.kt | 59 ++++++++++--------- .../browse/source/SourcesFilterScreenModel.kt | 3 +- .../tachiyomi/util/system/LocaleHelper.kt | 12 ++-- 4 files changed, 44 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/GetLanguagesWithSources.kt b/app/src/main/java/eu/kanade/domain/source/interactor/GetLanguagesWithSources.kt index 71f6cb070..9ebb244b8 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/GetLanguagesWithSources.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/GetLanguagesWithSources.kt @@ -7,13 +7,14 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import tachiyomi.domain.source.model.Source import tachiyomi.domain.source.repository.SourceRepository +import java.util.SortedMap class GetLanguagesWithSources( private val repository: SourceRepository, private val preferences: SourcePreferences, ) { - fun subscribe(): Flow>> { + fun subscribe(): Flow>> { return combine( preferences.enabledLanguages().changes(), preferences.disabledSources().changes(), @@ -24,7 +25,8 @@ class GetLanguagesWithSources( .thenBy(String.CASE_INSENSITIVE_ORDER) { it.name }, ) - sortedSources.groupBy { it.lang } + sortedSources + .groupBy { it.lang } .toSortedMap( compareBy { it !in enabledLanguage }.then(LocaleHelper.comparator), ) diff --git a/app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt index 0d1ee25e6..0648089e9 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt @@ -74,7 +74,7 @@ private fun SourcesFilterContent( state.items.forEach { (language, sources) -> val enabled = language in state.enabledLanguages item( - key = language.hashCode(), + key = language, contentType = "source-filter-header", ) { SourcesFilterHeader( @@ -84,35 +84,36 @@ private fun SourcesFilterContent( onClickItem = onClickLanguage, ) } - if (!enabled) return@forEach - // SY --> - item( - key = "toggle-$language", - contentType = "source-filter-toggle", - ) { - val toggleEnabled = remember(state.disabledSources) { - sources.none { it.id.toString() in state.disabledSources } + if (enabled) { + // SY --> + item( + key = "toggle-$language", + contentType = "source-filter-toggle", + ) { + val toggleEnabled = remember(state.disabledSources) { + sources.none { it.id.toString() in state.disabledSources } + } + SourcesFilterToggle( + modifier = Modifier.animateItemPlacement(), + isEnabled = toggleEnabled, + onClickItem = { + onClickSources(!toggleEnabled, sources) + }, + ) + } + // SY <-- + items( + items = sources, + key = { "source-filter-${it.key()}" }, + contentType = { "source-filter-item" }, + ) { source -> + SourcesFilterItem( + modifier = Modifier.animateItemPlacement(), + source = source, + enabled = "${source.id}" !in state.disabledSources, + onClickItem = onClickSource, + ) } - SourcesFilterToggle( - modifier = Modifier.animateItemPlacement(), - isEnabled = toggleEnabled, - onClickItem = { - onClickSources(!toggleEnabled, sources) - }, - ) - } - // SY <-- - items( - items = sources, - key = { "source-filter-${it.key()}" }, - contentType = { "source-filter-item" }, - ) { source -> - SourcesFilterItem( - modifier = Modifier.animateItemPlacement(), - source = source, - enabled = "${source.id}" !in state.disabledSources, - onClickItem = onClickSource, - ) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesFilterScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesFilterScreenModel.kt index b5bc9a6a1..5cbf6cf51 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesFilterScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesFilterScreenModel.kt @@ -14,6 +14,7 @@ import kotlinx.coroutines.launch import tachiyomi.domain.source.model.Source import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.util.SortedMap class SourcesFilterScreenModel( private val preferences: SourcePreferences = Injekt.get(), @@ -72,7 +73,7 @@ sealed class SourcesFilterState { ) : SourcesFilterState() data class Success( - val items: Map>, + val items: SortedMap>, val enabledLanguages: Set, val disabledSources: Set, ) : SourcesFilterState() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/LocaleHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/LocaleHelper.kt index cf8ef892a..da576b96f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/LocaleHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/LocaleHelper.kt @@ -11,10 +11,14 @@ import java.util.Locale */ object LocaleHelper { - val comparator = compareBy( - { getDisplayName(it) }, - { it == "all" }, - ) + /** + * Sorts by display name, except keeps the "all" (displayed as "Multi") locale at the top. + */ + val comparator = { a: String, b: String -> + if (a == "all") -1 + else if (b == "all") 1 + else getDisplayName(a).compareTo(getDisplayName(b)) + } /** * Returns display name of a string language code.