|
@@ -1,179 +0,0 @@
|
|
|
-package eu.kanade.tachiyomi.ui.browse.extension.details
|
|
|
-
|
|
|
-import android.annotation.SuppressLint
|
|
|
-import android.content.Context
|
|
|
-import android.os.Bundle
|
|
|
-import android.util.TypedValue
|
|
|
-import android.view.LayoutInflater
|
|
|
-import android.view.View
|
|
|
-import androidx.appcompat.view.ContextThemeWrapper
|
|
|
-import androidx.core.os.bundleOf
|
|
|
-import androidx.preference.DialogPreference
|
|
|
-import androidx.preference.EditTextPreference
|
|
|
-import androidx.preference.EditTextPreferenceDialogController
|
|
|
-import androidx.preference.ListPreference
|
|
|
-import androidx.preference.ListPreferenceDialogController
|
|
|
-import androidx.preference.MultiSelectListPreference
|
|
|
-import androidx.preference.MultiSelectListPreferenceDialogController
|
|
|
-import androidx.preference.Preference
|
|
|
-import androidx.preference.PreferenceGroupAdapter
|
|
|
-import androidx.preference.PreferenceManager
|
|
|
-import androidx.preference.PreferenceScreen
|
|
|
-import androidx.preference.get
|
|
|
-import androidx.preference.getOnBindEditTextListener
|
|
|
-import androidx.preference.isNotEmpty
|
|
|
-import androidx.recyclerview.widget.LinearLayoutManager
|
|
|
-import eu.kanade.tachiyomi.R
|
|
|
-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 eu.kanade.tachiyomi.util.system.logcat
|
|
|
-import eu.kanade.tachiyomi.widget.TachiyomiTextInputEditText.Companion.setIncognito
|
|
|
-import logcat.LogPriority
|
|
|
-
|
|
|
-@SuppressLint("RestrictedApi")
|
|
|
-class SourcePreferencesController(bundle: Bundle? = null) :
|
|
|
- NucleusController<SourcePreferencesControllerBinding, SourcePreferencesPresenter>(bundle),
|
|
|
- PreferenceManager.OnDisplayPreferenceDialogListener,
|
|
|
- DialogPreference.TargetFragment {
|
|
|
-
|
|
|
- private var lastOpenPreferencePosition: Int? = null
|
|
|
-
|
|
|
- private var preferenceScreen: PreferenceScreen? = null
|
|
|
-
|
|
|
- constructor(sourceId: Long) : this(
|
|
|
- bundleOf(SOURCE_ID to sourceId),
|
|
|
- )
|
|
|
-
|
|
|
- override fun createBinding(inflater: LayoutInflater): SourcePreferencesControllerBinding {
|
|
|
- val themedInflater = inflater.cloneInContext(getPreferenceThemeContext())
|
|
|
- return SourcePreferencesControllerBinding.inflate(themedInflater)
|
|
|
- }
|
|
|
-
|
|
|
- override fun createPresenter(): SourcePreferencesPresenter {
|
|
|
- return SourcePreferencesPresenter(args.getLong(SOURCE_ID))
|
|
|
- }
|
|
|
-
|
|
|
- override fun getTitle(): String? {
|
|
|
- return presenter.source?.toString()
|
|
|
- }
|
|
|
-
|
|
|
- @SuppressLint("PrivateResource")
|
|
|
- override fun onViewCreated(view: View) {
|
|
|
- super.onViewCreated(view)
|
|
|
-
|
|
|
- val source = presenter.source ?: return
|
|
|
- val context = view.context
|
|
|
-
|
|
|
- val themedContext by lazy { getPreferenceThemeContext() }
|
|
|
- val manager = PreferenceManager(themedContext)
|
|
|
- val dataStore = SharedPreferencesDataStore(
|
|
|
- context.getSharedPreferences(source.getPreferenceKey(), Context.MODE_PRIVATE),
|
|
|
- )
|
|
|
- manager.preferenceDataStore = dataStore
|
|
|
- manager.onDisplayPreferenceDialogListener = this
|
|
|
- val screen = manager.createPreferenceScreen(themedContext)
|
|
|
- preferenceScreen = screen
|
|
|
-
|
|
|
- try {
|
|
|
- addPreferencesForSource(screen, source)
|
|
|
- } catch (e: AbstractMethodError) {
|
|
|
- logcat(LogPriority.ERROR) { "Source did not implement [addPreferencesForSource]: ${source.name}" }
|
|
|
- }
|
|
|
-
|
|
|
- manager.setPreferences(screen)
|
|
|
-
|
|
|
- binding.recycler.layoutManager = LinearLayoutManager(context)
|
|
|
- binding.recycler.adapter = PreferenceGroupAdapter(screen)
|
|
|
- }
|
|
|
-
|
|
|
- override fun onDestroyView(view: View) {
|
|
|
- preferenceScreen = null
|
|
|
- super.onDestroyView(view)
|
|
|
- }
|
|
|
-
|
|
|
- override fun onSaveInstanceState(outState: Bundle) {
|
|
|
- lastOpenPreferencePosition?.let { outState.putInt(LASTOPENPREFERENCE_KEY, it) }
|
|
|
- super.onSaveInstanceState(outState)
|
|
|
- }
|
|
|
-
|
|
|
- override fun onRestoreInstanceState(savedInstanceState: Bundle) {
|
|
|
- super.onRestoreInstanceState(savedInstanceState)
|
|
|
- lastOpenPreferencePosition = savedInstanceState.get(LASTOPENPREFERENCE_KEY) as? Int
|
|
|
- }
|
|
|
-
|
|
|
- private fun addPreferencesForSource(screen: PreferenceScreen, source: Source) {
|
|
|
- val context = screen.context
|
|
|
-
|
|
|
- if (source is ConfigurableSource) {
|
|
|
- val newScreen = screen.preferenceManager.createPreferenceScreen(context)
|
|
|
- source.setupPreferenceScreen(newScreen)
|
|
|
-
|
|
|
- // Reparent the preferences
|
|
|
- while (newScreen.isNotEmpty()) {
|
|
|
- val pref = newScreen[0]
|
|
|
- pref.isIconSpaceReserved = false
|
|
|
- pref.order = Int.MAX_VALUE // reset to default order
|
|
|
-
|
|
|
- // Apply incognito IME for EditTextPreference
|
|
|
- if (pref is EditTextPreference) {
|
|
|
- val setListener = pref.getOnBindEditTextListener()
|
|
|
- pref.setOnBindEditTextListener {
|
|
|
- setListener?.onBindEditText(it)
|
|
|
- it.setIncognito(viewScope)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- newScreen.removePreference(pref)
|
|
|
- screen.addPreference(pref)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private fun getPreferenceThemeContext(): Context {
|
|
|
- val tv = TypedValue()
|
|
|
- activity!!.theme.resolveAttribute(R.attr.preferenceTheme, tv, true)
|
|
|
- return ContextThemeWrapper(activity, tv.resourceId)
|
|
|
- }
|
|
|
-
|
|
|
- override fun onDisplayPreferenceDialog(preference: Preference) {
|
|
|
- if (!isAttached) return
|
|
|
-
|
|
|
- val screen = preference.parent!!
|
|
|
-
|
|
|
- lastOpenPreferencePosition = (0 until screen.preferenceCount).indexOfFirst {
|
|
|
- screen[it] === preference
|
|
|
- }
|
|
|
-
|
|
|
- val f = when (preference) {
|
|
|
- is EditTextPreference ->
|
|
|
- EditTextPreferenceDialogController
|
|
|
- .newInstance(preference.getKey())
|
|
|
- is ListPreference ->
|
|
|
- ListPreferenceDialogController
|
|
|
- .newInstance(preference.getKey())
|
|
|
- is MultiSelectListPreference ->
|
|
|
- MultiSelectListPreferenceDialogController
|
|
|
- .newInstance(preference.getKey())
|
|
|
- else -> throw IllegalArgumentException(
|
|
|
- "Tried to display dialog for unknown " +
|
|
|
- "preference type. Did you forget to override onDisplayPreferenceDialog()?",
|
|
|
- )
|
|
|
- }
|
|
|
- f.targetController = this
|
|
|
- f.showDialog(router)
|
|
|
- }
|
|
|
-
|
|
|
- @Suppress("UNCHECKED_CAST")
|
|
|
- override fun <T : Preference> findPreference(key: CharSequence): T? {
|
|
|
- // We track [lastOpenPreferencePosition] when displaying the dialog
|
|
|
- // [key] isn't useful since there may be duplicates
|
|
|
- return preferenceScreen!![lastOpenPreferencePosition!!] as T
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-private const val SOURCE_ID = "source_id"
|
|
|
-private const val LASTOPENPREFERENCE_KEY = "last_open_preference"
|