Restore individual sources in source filter view

This commit is contained in:
arkon 2020-06-17 22:09:48 -04:00
parent 381ba86e3c
commit f176a5179a
5 changed files with 76 additions and 18 deletions

View File

@ -47,3 +47,5 @@ interface Source {
}
fun Source.icon(): Drawable? = Injekt.get<ExtensionManager>().getAppIconForSource(this)
fun Source.getPreferenceKey(): String = "source_$id"

View File

@ -34,7 +34,7 @@ abstract class HttpSource : CatalogueSource {
// * Preferences that a source may need.
// */
// val preferences: SharedPreferences by lazy {
// Injekt.get<Application>().getSharedPreferences("source_$id", Context.MODE_PRIVATE)
// Injekt.get<Application>().getSharedPreferences(source.getPreferenceKey(), Context.MODE_PRIVATE)
// }
/**

View File

@ -27,6 +27,7 @@ import eu.kanade.tachiyomi.extension.model.Extension
import eu.kanade.tachiyomi.source.CatalogueSource
import eu.kanade.tachiyomi.source.ConfigurableSource
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.getPreferenceKey
import eu.kanade.tachiyomi.ui.base.controller.NoToolbarElevationController
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
@ -128,7 +129,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
val sourcePrefs = mutableListOf<Preference>()
val block: (@DSL SwitchPreferenceCompat).() -> Unit = {
key = getSourceKey(source.id)
key = source.getPreferenceKey()
title = when {
isMultiSource && !isMultiLangSingleSource -> source.toString()
else -> LocaleHelper.getSourceDisplayName(it.key, context)
@ -226,10 +227,6 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
return id.toString() !in preferences.hiddenCatalogues().get()
}
private fun getSourceKey(sourceId: Long): String {
return "source_$sourceId"
}
private fun getPreferenceThemeContext(): Context {
val tv = TypedValue()
activity!!.theme.resolveAttribute(R.attr.preferenceTheme, tv, true)

View File

@ -28,6 +28,7 @@ import eu.kanade.tachiyomi.data.preference.SharedPreferencesDataStore
import eu.kanade.tachiyomi.databinding.SourcePreferencesControllerBinding
import eu.kanade.tachiyomi.source.ConfigurableSource
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.getPreferenceKey
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
import timber.log.Timber
@ -107,7 +108,7 @@ class SourcePreferencesController(bundle: Bundle? = null) :
val context = screen.context
val dataStore = SharedPreferencesDataStore(
context.getSharedPreferences("source_${source.id}", Context.MODE_PRIVATE)
context.getSharedPreferences(source.getPreferenceKey(), Context.MODE_PRIVATE)
)
if (source is ConfigurableSource) {

View File

@ -1,12 +1,17 @@
package eu.kanade.tachiyomi.ui.browse.source
import android.graphics.drawable.Drawable
import androidx.preference.CheckBoxPreference
import androidx.preference.PreferenceGroup
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.getPreferenceKey
import eu.kanade.tachiyomi.source.icon
import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.ui.setting.SettingsController
import eu.kanade.tachiyomi.util.preference.onChange
import eu.kanade.tachiyomi.util.preference.switchPreference
import eu.kanade.tachiyomi.util.preference.switchPreferenceCategory
import eu.kanade.tachiyomi.util.preference.titleRes
import eu.kanade.tachiyomi.util.system.LocaleHelper
import java.util.TreeMap
@ -27,25 +32,36 @@ class SourceFilterController : SettingsController() {
val sourcesByLang = onlineSources.groupByTo(TreeMap(), { it.lang })
// Order first by active languages, then inactive ones
val orderedLangs = sourcesByLang.keys.sortedWith(compareBy({ it !in activeLangsCodes }, { LocaleHelper.getSourceDisplayName(it, context) }))
val orderedLangs = sourcesByLang.keys.sortedWith(
compareBy(
{ it !in activeLangsCodes },
{ LocaleHelper.getSourceDisplayName(it, context) }
)
)
orderedLangs.forEach { lang ->
switchPreference {
val sources = sourcesByLang[lang].orEmpty().sortedBy { it.name }
// Create a preference group and set initial state and change listener
switchPreferenceCategory {
preferenceScreen.addPreference(this)
title = LocaleHelper.getSourceDisplayName(lang, context)
isPersistent = false
isChecked = lang in activeLangsCodes
if (lang in activeLangsCodes) {
setChecked(true)
addLanguageSources(this, sources)
}
onChange { newValue ->
val checked = newValue as Boolean
val current = preferences.enabledLanguages().get()
preferences.enabledLanguages().set(
if (!checked) {
current - lang
preferences.enabledLanguages().set(current - lang)
removeAll()
} else {
current + lang
preferences.enabledLanguages().set(current + lang)
addLanguageSources(this, sources)
}
)
true
}
}
@ -55,4 +71,46 @@ class SourceFilterController : SettingsController() {
override fun setDivider(divider: Drawable?) {
super.setDivider(null)
}
/**
* Adds the source list for the given group (language).
*
* @param group the language category.
*/
private fun addLanguageSources(group: PreferenceGroup, sources: List<HttpSource>) {
val hiddenCatalogues = preferences.hiddenCatalogues().get()
sources
.sortedBy { it.id.toString() in hiddenCatalogues }
.map { source ->
CheckBoxPreference(group.context).apply {
val id = source.id.toString()
title = source.name
key = source.getPreferenceKey()
isPersistent = false
isChecked = id !in hiddenCatalogues
val sourceIcon = source.icon()
if (sourceIcon != null) {
icon = sourceIcon
}
onChange { newValue ->
val checked = newValue as Boolean
val current = preferences.hiddenCatalogues().get()
preferences.hiddenCatalogues().set(
if (checked) {
current - id
} else {
current + id
}
)
true
}
}
}
.forEach { group.addPreference(it) }
}
}