SettingsController.kt 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package eu.kanade.tachiyomi.ui.setting
  2. import android.animation.ArgbEvaluator
  3. import android.animation.ValueAnimator
  4. import android.content.Context
  5. import android.graphics.Color
  6. import android.os.Bundle
  7. import android.util.TypedValue
  8. import android.view.LayoutInflater
  9. import android.view.View
  10. import android.view.ViewGroup
  11. import androidx.appcompat.app.AppCompatActivity
  12. import androidx.appcompat.view.ContextThemeWrapper
  13. import androidx.core.view.updatePadding
  14. import androidx.preference.PreferenceController
  15. import androidx.preference.PreferenceGroup
  16. import androidx.preference.PreferenceScreen
  17. import com.bluelinelabs.conductor.ControllerChangeHandler
  18. import com.bluelinelabs.conductor.ControllerChangeType
  19. import dev.chrisbanes.insetter.applyInsetter
  20. import eu.kanade.tachiyomi.R
  21. import eu.kanade.tachiyomi.data.preference.PreferencesHelper
  22. import eu.kanade.tachiyomi.ui.base.controller.BaseController
  23. import eu.kanade.tachiyomi.ui.base.controller.RootController
  24. import eu.kanade.tachiyomi.util.system.getResourceColor
  25. import kotlinx.coroutines.MainScope
  26. import uy.kohesive.injekt.Injekt
  27. import uy.kohesive.injekt.api.get
  28. abstract class SettingsController : PreferenceController() {
  29. var preferenceKey: String? = null
  30. val preferences: PreferencesHelper = Injekt.get()
  31. val viewScope = MainScope()
  32. override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle?): View {
  33. val view = super.onCreateView(inflater, container, savedInstanceState)
  34. if (this is RootController) {
  35. listView.clipToPadding = false
  36. listView.updatePadding(bottom = view.context.resources.getDimensionPixelSize(R.dimen.action_toolbar_list_padding))
  37. }
  38. listView.applyInsetter {
  39. type(navigationBars = true) {
  40. padding()
  41. }
  42. }
  43. return view
  44. }
  45. override fun onAttach(view: View) {
  46. super.onAttach(view)
  47. preferenceKey?.let { prefKey ->
  48. val adapter = listView.adapter
  49. scrollToPreference(prefKey)
  50. listView.post {
  51. if (adapter is PreferenceGroup.PreferencePositionCallback) {
  52. val pos = adapter.getPreferenceAdapterPosition(prefKey)
  53. listView.findViewHolderForAdapterPosition(pos)?.let {
  54. animatePreferenceHighlight(it.itemView)
  55. }
  56. }
  57. }
  58. }
  59. }
  60. override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) {
  61. if (type.isEnter) {
  62. setTitle()
  63. }
  64. setHasOptionsMenu(type.isEnter)
  65. super.onChangeStarted(handler, type)
  66. }
  67. override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
  68. val screen = preferenceManager.createPreferenceScreen(getThemedContext())
  69. preferenceScreen = screen
  70. setupPreferenceScreen(screen)
  71. }
  72. abstract fun setupPreferenceScreen(screen: PreferenceScreen): PreferenceScreen
  73. private fun getThemedContext(): Context {
  74. val tv = TypedValue()
  75. activity!!.theme.resolveAttribute(R.attr.preferenceTheme, tv, true)
  76. return ContextThemeWrapper(activity, tv.resourceId)
  77. }
  78. private fun animatePreferenceHighlight(view: View) {
  79. ValueAnimator
  80. .ofObject(ArgbEvaluator(), Color.TRANSPARENT, view.context.getResourceColor(R.attr.rippleColor))
  81. .apply {
  82. duration = 500L
  83. repeatCount = 2
  84. addUpdateListener { animator -> view.setBackgroundColor(animator.animatedValue as Int) }
  85. reverse()
  86. }
  87. }
  88. open fun getTitle(): String? {
  89. return preferenceScreen?.title?.toString()
  90. }
  91. private fun setTitle() {
  92. var parentController = parentController
  93. while (parentController != null) {
  94. if (parentController is BaseController<*> && parentController.getTitle() != null) {
  95. return
  96. }
  97. parentController = parentController.parentController
  98. }
  99. (activity as? AppCompatActivity)?.supportActionBar?.title = getTitle()
  100. }
  101. }