mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 14:27:57 +01:00 
			
		
		
		
	Restore individual sources in source filter view
This commit is contained in:
		| @@ -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) } | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user