Restore individual sources in source filter view
This commit is contained in:
parent
381ba86e3c
commit
f176a5179a
@ -47,3 +47,5 @@ interface Source {
|
||||
}
|
||||
|
||||
fun Source.icon(): Drawable? = Injekt.get<ExtensionManager>().getAppIconForSource(this)
|
||||
|
||||
fun Source.getPreferenceKey(): String = "source_$id"
|
||||
|
@ -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)
|
||||
// }
|
||||
|
||||
/**
|
||||
|
@ -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)
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
} else {
|
||||
current + lang
|
||||
}
|
||||
)
|
||||
if (!checked) {
|
||||
preferences.enabledLanguages().set(current - lang)
|
||||
removeAll()
|
||||
} else {
|
||||
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) }
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user