Update app theme preference UI

Heavily influenced by TachiyomiJ2K.
This commit is contained in:
arkon
2021-08-23 10:54:44 -04:00
parent beb7f90908
commit 6240fe1dfc
7 changed files with 338 additions and 9 deletions

View File

@@ -0,0 +1,40 @@
package eu.kanade.tachiyomi.widget.preference
import android.content.Context
import android.util.AttributeSet
import androidx.preference.ListPreference
import androidx.preference.PreferenceViewHolder
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferenceValues
class ThemesPreference @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
ListPreference(context, attrs),
ThemesPreferenceAdapter.OnItemClickListener {
private val adapter = ThemesPreferenceAdapter(this)
init {
layoutResource = R.layout.pref_themes_list
}
override fun onBindViewHolder(holder: PreferenceViewHolder) {
super.onBindViewHolder(holder)
val themesList = holder.findViewById(R.id.themes_list) as RecyclerView
themesList.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
themesList.adapter = adapter
}
override fun onItemClick(position: Int) {
value = entries[position].name
callChangeListener(value)
}
var entries: List<PreferenceValues.AppTheme> = emptyList()
set(value) {
field = value
adapter.setItems(value)
}
}

View File

@@ -0,0 +1,67 @@
package eu.kanade.tachiyomi.widget.preference
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.view.ContextThemeWrapper
import androidx.recyclerview.widget.RecyclerView
import eu.kanade.tachiyomi.data.preference.PreferenceValues
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.databinding.PrefThemeItemBinding
import eu.kanade.tachiyomi.ui.base.activity.BaseThemedActivity
import uy.kohesive.injekt.injectLazy
class ThemesPreferenceAdapter(private val clickListener: OnItemClickListener) :
RecyclerView.Adapter<ThemesPreferenceAdapter.ThemeViewHolder>() {
private val preferences: PreferencesHelper by injectLazy()
private var themes = emptyList<PreferenceValues.AppTheme>()
private lateinit var binding: PrefThemeItemBinding
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ThemeViewHolder {
val themeResIds = BaseThemedActivity.getThemeResIds(themes[viewType], preferences.themeDarkAmoled().get())
val themedContext = themeResIds.fold(parent.context) {
context, themeResId -> ContextThemeWrapper(context, themeResId)
}
binding = PrefThemeItemBinding.inflate(LayoutInflater.from(themedContext), parent, false)
return ThemeViewHolder(binding.root)
}
override fun getItemViewType(position: Int): Int = position
override fun getItemCount(): Int = themes.size
override fun onBindViewHolder(holder: ThemesPreferenceAdapter.ThemeViewHolder, position: Int) {
holder.bind(themes[position])
}
fun setItems(themes: List<PreferenceValues.AppTheme>) {
this.themes = themes
notifyDataSetChanged()
}
inner class ThemeViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
fun bind(appTheme: PreferenceValues.AppTheme) {
binding.name.text = view.context.getString(appTheme.titleResId!!)
// Rounded corners
binding.coverContainer1.clipToOutline = true
binding.coverContainer2.clipToOutline = true
binding.themeCard.isChecked = preferences.appTheme().get() == appTheme
listOf(binding.root, binding.themeCard).forEach {
it.setOnClickListener {
clickListener.onItemClick(bindingAdapterPosition)
}
}
}
}
interface OnItemClickListener {
fun onItemClick(position: Int)
}
}