123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- package eu.kanade.tachiyomi.ui.setting
- import android.animation.ArgbEvaluator
- import android.animation.ValueAnimator
- import android.content.Context
- import android.graphics.Color
- import android.os.Bundle
- import android.util.TypedValue
- import android.view.LayoutInflater
- import android.view.View
- import android.view.ViewGroup
- import androidx.appcompat.app.AppCompatActivity
- import androidx.appcompat.view.ContextThemeWrapper
- import androidx.core.view.updatePadding
- import androidx.preference.PreferenceController
- import androidx.preference.PreferenceGroup
- import androidx.preference.PreferenceScreen
- import com.bluelinelabs.conductor.ControllerChangeHandler
- import com.bluelinelabs.conductor.ControllerChangeType
- import dev.chrisbanes.insetter.applyInsetter
- import eu.kanade.tachiyomi.R
- import eu.kanade.tachiyomi.data.preference.PreferencesHelper
- import eu.kanade.tachiyomi.ui.base.controller.BaseController
- import eu.kanade.tachiyomi.ui.base.controller.RootController
- import eu.kanade.tachiyomi.util.system.getResourceColor
- import kotlinx.coroutines.MainScope
- import uy.kohesive.injekt.Injekt
- import uy.kohesive.injekt.api.get
- abstract class SettingsController : PreferenceController() {
- var preferenceKey: String? = null
- val preferences: PreferencesHelper = Injekt.get()
- val viewScope = MainScope()
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle?): View {
- val view = super.onCreateView(inflater, container, savedInstanceState)
- if (this is RootController) {
- listView.clipToPadding = false
- listView.updatePadding(bottom = view.context.resources.getDimensionPixelSize(R.dimen.action_toolbar_list_padding))
- }
- listView.applyInsetter {
- type(navigationBars = true) {
- padding()
- }
- }
- return view
- }
- override fun onAttach(view: View) {
- super.onAttach(view)
- preferenceKey?.let { prefKey ->
- val adapter = listView.adapter
- scrollToPreference(prefKey)
- listView.post {
- if (adapter is PreferenceGroup.PreferencePositionCallback) {
- val pos = adapter.getPreferenceAdapterPosition(prefKey)
- listView.findViewHolderForAdapterPosition(pos)?.let {
- animatePreferenceHighlight(it.itemView)
- }
- }
- }
- }
- }
- override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) {
- if (type.isEnter) {
- setTitle()
- }
- setHasOptionsMenu(type.isEnter)
- super.onChangeStarted(handler, type)
- }
- override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
- val screen = preferenceManager.createPreferenceScreen(getThemedContext())
- preferenceScreen = screen
- setupPreferenceScreen(screen)
- }
- abstract fun setupPreferenceScreen(screen: PreferenceScreen): PreferenceScreen
- private fun getThemedContext(): Context {
- val tv = TypedValue()
- activity!!.theme.resolveAttribute(R.attr.preferenceTheme, tv, true)
- return ContextThemeWrapper(activity, tv.resourceId)
- }
- private fun animatePreferenceHighlight(view: View) {
- ValueAnimator
- .ofObject(ArgbEvaluator(), Color.TRANSPARENT, view.context.getResourceColor(R.attr.rippleColor))
- .apply {
- duration = 500L
- repeatCount = 2
- addUpdateListener { animator -> view.setBackgroundColor(animator.animatedValue as Int) }
- reverse()
- }
- }
- open fun getTitle(): String? {
- return preferenceScreen?.title?.toString()
- }
- private fun setTitle() {
- var parentController = parentController
- while (parentController != null) {
- if (parentController is BaseController<*> && parentController.getTitle() != null) {
- return
- }
- parentController = parentController.parentController
- }
- (activity as? AppCompatActivity)?.supportActionBar?.title = getTitle()
- }
- }
|