Minor cleanup 2: Electric Boogaloo

- Reword pins on top setting
- Make "Latest" button style match old UI
- Sort sources by name

(cherry picked from commit 08e63e5fab93154ca85d16e459226f01aeab5a2d)

# Conflicts:
#	app/src/main/java/eu/kanade/domain/source/interactor/GetEnabledSources.kt
#	app/src/main/java/eu/kanade/domain/source/model/Source.kt
This commit is contained in:
arkon 2022-04-24 15:04:00 -04:00 committed by Jobobby04
parent 7e0c1308bd
commit e2056982eb
7 changed files with 76 additions and 88 deletions

View File

@ -12,83 +12,66 @@ import kotlinx.coroutines.flow.distinctUntilChanged
class GetEnabledSources( class GetEnabledSources(
private val repository: SourceRepository, private val repository: SourceRepository,
private val preferences: PreferencesHelper private val preferences: PreferencesHelper,
) { ) {
fun subscribe(): Flow<List<Source>> { fun subscribe(): Flow<List<Source>> {
return preferences.pinnedSources().asFlow() return combine(
.combine(preferences.enabledLanguages().asFlow()) { pinList, enabledLanguages -> preferences.pinnedSources().asFlow(),
Config(pinSet = pinList, enabledSources = enabledLanguages) combine(
} preferences.enabledLanguages().asFlow(),
.combine(preferences.disabledSources().asFlow()) { config, disabledSources -> preferences.disabledSources().asFlow(),
config.copy(disabledSources = disabledSources) preferences.lastUsedSource().asFlow(),
} ) { a, b, c -> Triple(a, b, c) },
.combine(preferences.lastUsedSource().asFlow()) { config, lastUsedSource ->
config.copy(lastUsedSource = lastUsedSource)
}
// SY --> // SY -->
.combine(preferences.dataSaverExcludedSources().asFlow()) { config, excludedFromDataSaver -> combine(
config.copy(excludedFromDataSaver = excludedFromDataSaver) preferences.dataSaverExcludedSources().asFlow(),
} preferences.sourcesTabSourcesInCategories().asFlow(),
.combine(preferences.sourcesTabSourcesInCategories().asFlow()) { config, sourcesInCategories -> preferences.sourcesTabCategoriesFilter().asFlow(),
config.copy(sourcesInCategories = sourcesInCategories) ) { a, b, c -> Triple(a, b, c) },
}
.combine(preferences.sourcesTabCategoriesFilter().asFlow()) { config, sourceCategoriesFilter ->
config.copy(sourceCategoriesFilter = sourceCategoriesFilter)
}
// SY <-- // SY <--
.combine(repository.getSources()) { (pinList, enabledLanguages, disabledSources, lastUsedSource, excludedFromDataSaver, sourcesInCategories, sourceCategoriesFilter), sources -> repository.getSources(),
val pinsOnTop = preferences.pinsOnTop().get() ) { pinnedSourceIds, (enabledLanguages, disabledSources, lastUsedSource), (excludedFromDataSaver, sourcesInCategories, sourceCategoriesFilter), sources ->
val sourcesAndCategories = sourcesInCategories.map { val duplicatePins = preferences.duplicatePinnedSources().get()
it.split('|').let { (source, test) -> source.toLong() to test } val sourcesAndCategories = sourcesInCategories.map {
} it.split('|').let { (source, test) -> source.toLong() to test }
val sourcesInSourceCategories = sourcesAndCategories.map { it.first }
sources
.filter { it.lang in enabledLanguages || it.id == LocalSource.ID }
.filterNot { it.id.toString() in disabledSources }
.flatMap {
val flag = if ("${it.id}" in pinList) Pins.pinned else Pins.unpinned
// SY -->
val categories = sourcesAndCategories.filter { (id) -> id == it.id }
.map(Pair<*, String>::second)
.toSet()
// SY <--
val source = it.copy(
pin = flag,
isExcludedFromDataSaver = it.id.toString() in excludedFromDataSaver,
categories = categories
)
val toFlatten = mutableListOf(source)
if (source.id == lastUsedSource) {
toFlatten.add(source.copy(isUsedLast = true, pin = source.pin - Pin.Actual))
}
if (pinsOnTop.not() && Pin.Pinned in source.pin) {
toFlatten[0] = toFlatten[0].copy(pin = source.pin + Pin.Forced)
toFlatten.add(source.copy(pin = source.pin - Pin.Actual))
}
// SY -->
categories.forEach { category ->
toFlatten.add(source.copy(category = category, pin = source.pin - Pin.Actual))
}
if (sourceCategoriesFilter && Pin.Actual !in toFlatten[0].pin && source.id in sourcesInSourceCategories) {
toFlatten.removeAt(0)
}
// SY <--
toFlatten
}
} }
val sourcesInSourceCategories = sourcesAndCategories.map { it.first }
sources
.filter { it.lang in enabledLanguages || it.id == LocalSource.ID }
.filterNot { it.id.toString() in disabledSources }
.sortedBy { it.name }
.flatMap {
val flag = if ("${it.id}" in pinnedSourceIds) Pins.pinned else Pins.unpinned
// SY -->
val categories = sourcesAndCategories.filter { (id) -> id == it.id }
.map(Pair<*, String>::second)
.toSet()
// SY <--
val source = it.copy(
pin = flag,
isExcludedFromDataSaver = it.id.toString() in excludedFromDataSaver,
categories = categories
)
val toFlatten = mutableListOf(source)
if (source.id == lastUsedSource) {
toFlatten.add(source.copy(isUsedLast = true, pin = source.pin - Pin.Actual))
}
if (duplicatePins && Pin.Pinned in source.pin) {
toFlatten[0] = toFlatten[0].copy(pin = source.pin + Pin.Forced)
toFlatten.add(source.copy(pin = source.pin - Pin.Actual))
}
// SY -->
categories.forEach { category ->
toFlatten.add(source.copy(category = category, pin = source.pin - Pin.Actual))
}
if (sourceCategoriesFilter && Pin.Actual !in toFlatten[0].pin && source.id in sourcesInSourceCategories) {
toFlatten.removeAt(0)
}
// SY <--
toFlatten
}
}
.distinctUntilChanged() .distinctUntilChanged()
} }
} }
private data class Config(
val pinSet: Set<String> = setOf(),
val enabledSources: Set<String> = setOf(),
val disabledSources: Set<String> = setOf(),
val lastUsedSource: Long? = null,
// SY -->
val excludedFromDataSaver: Set<String> = setOf(),
val sourcesInCategories: Set<String> = setOf(),
val sourceCategoriesFilter: Boolean = false,
// SY <--
)

View File

@ -31,12 +31,12 @@ data class Source(
?.asImageBitmap() ?.asImageBitmap()
} }
val key: () -> Long = { val key: () -> String = {
when { when {
isUsedLast -> id shr 16 isUsedLast -> "$id-lastused"
Pin.Forced in pin -> id shr 32 Pin.Forced in pin -> "$id-forced"
category != null -> id shr 48 + category.hashCode() category != null -> "$id-$category"
else -> id else -> "$id"
} }
} }
} }

View File

@ -22,6 +22,7 @@ import androidx.compose.material3.Checkbox
import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
@ -243,7 +244,12 @@ fun SourceItem(
} }
if (item.supportsLatest /* SY --> */ && showLatest /* SY <-- */) { if (item.supportsLatest /* SY --> */ && showLatest /* SY <-- */) {
TextButton(onClick = { onClickLatest(item) }) { TextButton(onClick = { onClickLatest(item) }) {
Text(text = stringResource(id = R.string.latest)) Text(
text = stringResource(id = R.string.latest),
style = LocalTextStyle.current.copy(
color = MaterialTheme.colorScheme.primary
),
)
} }
} }

View File

@ -335,7 +335,7 @@ class PreferencesHelper(val context: Context) {
fun autoClearChapterCache() = prefs.getBoolean(Keys.autoClearChapterCache, false) fun autoClearChapterCache() = prefs.getBoolean(Keys.autoClearChapterCache, false)
fun pinsOnTop() = flowPrefs.getBoolean("pins_on_top", true) fun duplicatePinnedSources() = flowPrefs.getBoolean("duplicate_pinned_sources", false)
fun setChapterSettingsDefault(manga: Manga) { fun setChapterSettingsDefault(manga: Manga) {
prefs.edit { prefs.edit {

View File

@ -82,7 +82,7 @@ class SourcePresenter(
// SY <-- // SY <--
} }
private suspend fun collectLatestSources(sources: List<Source>) { private fun collectLatestSources(sources: List<Source>) {
val map = TreeMap<String, MutableList<Source>> { d1, d2 -> val map = TreeMap<String, MutableList<Source>> { d1, d2 ->
// Catalogues without a lang defined will be placed at the end // Catalogues without a lang defined will be placed at the end
when { when {
@ -121,14 +121,14 @@ class SourcePresenter(
} }
// SY --> // SY -->
private suspend fun updateCategories(categories: Set<String>) { private fun updateCategories(categories: Set<String>) {
_state.update { state -> _state.update { state ->
state.copy( state.copy(
sourceCategories = categories.sortedWith(compareByDescending(String.CASE_INSENSITIVE_ORDER) { it }) sourceCategories = categories.sortedWith(compareByDescending(String.CASE_INSENSITIVE_ORDER) { it })
) )
} }
} }
private suspend fun updateShowLatest(showLatest: Boolean) { private fun updateShowLatest(showLatest: Boolean) {
_state.update { state -> _state.update { state ->
state.copy( state.copy(
showLatest = showLatest showLatest = showLatest

View File

@ -70,13 +70,12 @@ class SettingsBrowseController : SettingsController() {
// SY <-- // SY <--
preferenceCategory { preferenceCategory {
titleRes = R.string.pref_category_general titleRes = R.string.label_sources
switchPreference { switchPreference {
bindTo(preferences.pinsOnTop()) bindTo(preferences.duplicatePinnedSources())
titleRes = R.string.pref_move_on_top titleRes = R.string.pref_duplicate_pinned_sources
summaryRes = R.string.pref_move_on_top_summary summaryRes = R.string.pref_duplicate_pinned_sources_summary
defaultValue = true
} }
} }

View File

@ -419,10 +419,10 @@
<string name="action_track">Track</string> <string name="action_track">Track</string>
<!-- Browse section --> <!-- Browse section -->
<string name="pref_duplicate_pinned_sources">Show duplicated pinned sources</string>
<string name="pref_duplicate_pinned_sources_summary">Repeat pinned sources in their respective language groups</string>
<string name="pref_enable_automatic_extension_updates">Check for extension updates</string> <string name="pref_enable_automatic_extension_updates">Check for extension updates</string>
<string name="pref_search_pinned_sources_only">Only include pinned sources</string> <string name="pref_search_pinned_sources_only">Only include pinned sources</string>
<string name="pref_move_on_top">Move pins on top</string>
<string name="pref_move_on_top_summary">Move up pins to top of the source list</string>
<!-- Backup section --> <!-- Backup section -->
<string name="pref_create_backup">Create backup</string> <string name="pref_create_backup">Create backup</string>