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.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. // * Preferences that a source may need.
// */ // */
// val preferences: SharedPreferences by lazy { // 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.CatalogueSource
import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.ConfigurableSource
import eu.kanade.tachiyomi.source.Source 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.NoToolbarElevationController
import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.ui.base.controller.NucleusController
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
@ -128,7 +129,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
val sourcePrefs = mutableListOf<Preference>() val sourcePrefs = mutableListOf<Preference>()
val block: (@DSL SwitchPreferenceCompat).() -> Unit = { val block: (@DSL SwitchPreferenceCompat).() -> Unit = {
key = getSourceKey(source.id) key = source.getPreferenceKey()
title = when { title = when {
isMultiSource && !isMultiLangSingleSource -> source.toString() isMultiSource && !isMultiLangSingleSource -> source.toString()
else -> LocaleHelper.getSourceDisplayName(it.key, context) else -> LocaleHelper.getSourceDisplayName(it.key, context)
@ -226,10 +227,6 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
return id.toString() !in preferences.hiddenCatalogues().get() return id.toString() !in preferences.hiddenCatalogues().get()
} }
private fun getSourceKey(sourceId: Long): String {
return "source_$sourceId"
}
private fun getPreferenceThemeContext(): Context { private fun getPreferenceThemeContext(): Context {
val tv = TypedValue() val tv = TypedValue()
activity!!.theme.resolveAttribute(R.attr.preferenceTheme, tv, true) 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.databinding.SourcePreferencesControllerBinding
import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.ConfigurableSource
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.getPreferenceKey
import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.ui.base.controller.NucleusController
import timber.log.Timber import timber.log.Timber
@ -107,7 +108,7 @@ class SourcePreferencesController(bundle: Bundle? = null) :
val context = screen.context val context = screen.context
val dataStore = SharedPreferencesDataStore( val dataStore = SharedPreferencesDataStore(
context.getSharedPreferences("source_${source.id}", Context.MODE_PRIVATE) context.getSharedPreferences(source.getPreferenceKey(), Context.MODE_PRIVATE)
) )
if (source is ConfigurableSource) { if (source is ConfigurableSource) {

View File

@ -1,12 +1,17 @@
package eu.kanade.tachiyomi.ui.browse.source package eu.kanade.tachiyomi.ui.browse.source
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import androidx.preference.CheckBoxPreference
import androidx.preference.PreferenceGroup
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.SourceManager 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.ui.setting.SettingsController
import eu.kanade.tachiyomi.util.preference.onChange 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.preference.titleRes
import eu.kanade.tachiyomi.util.system.LocaleHelper import eu.kanade.tachiyomi.util.system.LocaleHelper
import java.util.TreeMap import java.util.TreeMap
@ -27,25 +32,36 @@ class SourceFilterController : SettingsController() {
val sourcesByLang = onlineSources.groupByTo(TreeMap(), { it.lang }) val sourcesByLang = onlineSources.groupByTo(TreeMap(), { it.lang })
// Order first by active languages, then inactive ones // 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 -> 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) preferenceScreen.addPreference(this)
title = LocaleHelper.getSourceDisplayName(lang, context) title = LocaleHelper.getSourceDisplayName(lang, context)
isPersistent = false isPersistent = false
isChecked = lang in activeLangsCodes if (lang in activeLangsCodes) {
setChecked(true)
addLanguageSources(this, sources)
}
onChange { newValue -> onChange { newValue ->
val checked = newValue as Boolean val checked = newValue as Boolean
val current = preferences.enabledLanguages().get() val current = preferences.enabledLanguages().get()
preferences.enabledLanguages().set( if (!checked) {
if (!checked) { preferences.enabledLanguages().set(current - lang)
current - lang removeAll()
} else { } else {
current + lang preferences.enabledLanguages().set(current + lang)
} addLanguageSources(this, sources)
) }
true true
} }
} }
@ -55,4 +71,46 @@ class SourceFilterController : SettingsController() {
override fun setDivider(divider: Drawable?) { override fun setDivider(divider: Drawable?) {
super.setDivider(null) 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) }
}
} }