1
0
Fork 0
fenix/app/src/main/java/org/mozilla/fenix/settings/RadioButtonPreference.kt

147 lines
4.6 KiB
Kotlin

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.settings
import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.widget.RadioButton
import android.widget.TextView
import androidx.core.content.res.TypedArrayUtils.getAttr
import androidx.core.content.withStyledAttributes
import androidx.core.text.HtmlCompat
import androidx.preference.Preference
import androidx.preference.PreferenceViewHolder
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.settings
open class RadioButtonPreference @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null
) : Preference(context, attrs) {
private val radioGroups = mutableListOf<RadioButtonPreference>()
private var summaryView: TextView? = null
private var titleView: TextView? = null
private var radioButton: RadioButton? = null
private var shouldSummaryBeParsedAsHtmlContent: Boolean = true
private var defaultValue: Boolean = false
private var clickListener: (() -> Unit)? = null
init {
layoutResource = R.layout.preference_widget_radiobutton
context.withStyledAttributes(
attrs,
androidx.preference.R.styleable.Preference,
getAttr(
context,
androidx.preference.R.attr.preferenceStyle,
android.R.attr.preferenceStyle
),
0
) {
defaultValue = when {
hasValue(androidx.preference.R.styleable.Preference_defaultValue) ->
getBoolean(androidx.preference.R.styleable.Preference_defaultValue, false)
hasValue(androidx.preference.R.styleable.Preference_android_defaultValue) ->
getBoolean(
androidx.preference.R.styleable.Preference_android_defaultValue,
false
)
else -> false
}
}
}
fun addToRadioGroup(radioPreference: RadioButtonPreference) {
radioGroups.add(radioPreference)
}
fun onClickListener(listener: (() -> Unit)) {
clickListener = listener
}
override fun setEnabled(enabled: Boolean) {
super.setEnabled(enabled)
if (!enabled) {
summaryView?.alpha = HALF_ALPHA
titleView?.alpha = HALF_ALPHA
} else {
summaryView?.alpha = FULL_ALPHA
titleView?.alpha = FULL_ALPHA
}
}
override fun onBindViewHolder(holder: PreferenceViewHolder) {
super.onBindViewHolder(holder)
bindRadioButton(holder)
bindTitle(holder)
bindSummaryView(holder)
setOnPreferenceClickListener {
updateRadioValue(true)
toggleRadioGroups()
clickListener?.invoke()
true
}
}
private fun updateRadioValue(isChecked: Boolean) {
persistBoolean(isChecked)
radioButton?.isChecked = isChecked
context.settings().preferences.edit().putBoolean(key, isChecked)
.apply()
}
private fun bindRadioButton(holder: PreferenceViewHolder) {
radioButton = holder.findViewById(R.id.radio_button) as RadioButton
radioButton?.isChecked = context.settings().preferences.getBoolean(key, defaultValue)
radioButton?.setStartCheckedIndicator()
}
private fun toggleRadioGroups() {
if (radioButton?.isChecked == true) {
radioGroups.forEach { it.updateRadioValue(false) }
}
}
private fun bindTitle(holder: PreferenceViewHolder) {
titleView = holder.findViewById(R.id.title) as TextView
titleView?.alpha = if (isEnabled) FULL_ALPHA else HALF_ALPHA
if (!title.isNullOrEmpty()) {
titleView?.text = title
}
}
private fun bindSummaryView(holder: PreferenceViewHolder) {
summaryView = holder.findViewById(R.id.widget_summary) as TextView
summaryView?.alpha = if (isEnabled) FULL_ALPHA else HALF_ALPHA
summaryView?.let {
if (!summary.isNullOrEmpty()) {
it.text = if (shouldSummaryBeParsedAsHtmlContent) {
HtmlCompat.fromHtml(summary.toString(), HtmlCompat.FROM_HTML_MODE_COMPACT)
} else {
summary
}
it.visibility = View.VISIBLE
} else {
it.visibility = View.GONE
}
}
}
companion object {
const val HALF_ALPHA = 0.5F
const val FULL_ALPHA = 1F
}
}