Cleanup setting items

This commit is contained in:
topjohnwu
2020-08-11 03:30:00 -07:00
parent 87b6bf2c26
commit 537ae1a315
7 changed files with 54 additions and 358 deletions

View File

@@ -18,12 +18,24 @@ import org.koin.core.get
sealed class SettingsItem : ObservableItem<SettingsItem>() {
override val layoutRes get() = R.layout.item_settings
open val icon: Int get() = 0
open val title: TransitiveText get() = TransitiveText.EMPTY
@get:Bindable
open val description: TransitiveText get() = TransitiveText.EMPTY
// ---
open val showSwitch get() = false
@get:Bindable
open val isChecked get() = false
open fun onToggle(view: View, callback: Callback, checked: Boolean) {}
// ---
@get:Bindable
var isEnabled = true
set(value) = set(value, field, { field = it }, BR.enabled)
@@ -48,7 +60,6 @@ sealed class SettingsItem : ObservableItem<SettingsItem>() {
abstract class Value<T> : SettingsItem() {
@get:Bindable
abstract var value: T
protected var callbackVars: Pair<View, Callback>? = null
@@ -63,24 +74,13 @@ sealed class SettingsItem : ObservableItem<SettingsItem>() {
abstract fun onPressed(view: View)
protected inline fun <reified T> setV(
new: T, old: T, setter: (T) -> Unit, vararg fieldIds: Int, afterChanged: (T) -> Unit = {}) {
set(new, old, setter, BR.value, *fieldIds) {
afterChanged(it)
callbackVars?.let { pair ->
callbackVars = null
pair.second.onItemChanged(pair.first, this)
}
}
}
protected inline fun <reified T> setV(
new: T, old: T, setter: (T) -> Unit, afterChanged: (T) -> Unit = {}) {
set(new, old, setter, BR.value) {
set(new, old, setter, BR.value, BR.description, BR.checked) {
afterChanged(it)
callbackVars?.let { pair ->
callbackVars?.let { (view, callback) ->
callbackVars = null
pair.second.onItemChanged(pair.first, this)
callback.onItemChanged(view, this)
}
}
}
@@ -88,7 +88,11 @@ sealed class SettingsItem : ObservableItem<SettingsItem>() {
abstract class Toggle : Value<Boolean>() {
override val layoutRes = R.layout.item_settings_toggle
override val showSwitch get() = true
override val isChecked get() = value
override fun onToggle(view: View, callback: Callback, checked: Boolean) =
set(checked, value, { onPressed(view, callback) }, BR.checked)
override fun onPressed(view: View) {
value = !value
@@ -97,8 +101,6 @@ sealed class SettingsItem : ObservableItem<SettingsItem>() {
abstract class Input : Value<String>() {
override val layoutRes = R.layout.item_settings_input
protected abstract val inputResult: String?
override fun onPressed(view: View) {
@@ -128,8 +130,6 @@ sealed class SettingsItem : ObservableItem<SettingsItem>() {
abstract class Selector : Value<Int>(), KoinComponent {
override val layoutRes = R.layout.item_settings_selector
protected val resources get() = get<Resources>()
@ArrayRes open val entryRes = -1
@@ -138,15 +138,9 @@ sealed class SettingsItem : ObservableItem<SettingsItem>() {
open val entries get() = resources.getArrayOrEmpty(entryRes)
open val entryValues get() = resources.getArrayOrEmpty(entryValRes)
@get:Bindable
override val description: TransitiveText
get() = entries.getOrNull(value)?.asTransitive() ?: TransitiveText.EMPTY
protected inline fun <reified T> setS(
new: T, old: T, setter: (T) -> Unit, afterChanged: (T) -> Unit = {}) {
setV(new, old, setter, BR.description, afterChanged = afterChanged)
}
private fun Resources.getArrayOrEmpty(id: Int): Array<String> =
runCatching { getStringArray(id) }.getOrDefault(emptyArray())
@@ -169,9 +163,7 @@ sealed class SettingsItem : ObservableItem<SettingsItem>() {
}
abstract class Blank : SettingsItem() {
override val layoutRes = R.layout.item_settings_blank
}
abstract class Blank : SettingsItem()
abstract class Section : SettingsItem() {
override val layoutRes = R.layout.item_settings_section

View File

@@ -36,7 +36,7 @@ object Customization : SettingsItem.Section() {
object Language : SettingsItem.Selector() {
override var value = -1
set(value) = setS(value, field, { field = it }) {
set(value) = setV(value, field, { field = it }) {
Config.locale = entryValues[it]
}
@@ -82,7 +82,9 @@ object Hide : SettingsItem.Input() {
@get:Bindable
override var value = "Manager"
set(value) = setV(value, field, { field = it }, BR.error)
set(value) = setV(value, field, { field = it }) {
notifyPropertyChanged(BR.error)
}
@get:Bindable
val isError get() = value.length > 14 || value.isBlank()
@@ -125,7 +127,7 @@ object DownloadPath : SettingsItem.Input() {
object UpdateChannel : SettingsItem.Selector() {
override var value = Config.updateChannel
set(value) = setS(value, field, { field = it }) { Config.updateChannel = it }
set(value) = setV(value, field, { field = it }) { Config.updateChannel = it }
override val title = R.string.settings_update_channel_title.asTransitive()
override val entries get() = resources.getStringArray(R.array.update_channel).let {
@@ -138,6 +140,7 @@ object UpdateChannelUrl : SettingsItem.Input() {
override val title = R.string.settings_update_custom.asTransitive()
override var value = Config.customChannelUrl
set(value) = setV(value, field, { field = it }) { Config.customChannelUrl = it }
override val description get() = value.asTransitive()
override val inputResult get() = result
@@ -226,7 +229,7 @@ object AccessMode : SettingsItem.Selector() {
override val entryValRes = R.array.value_array
override var value = Config.rootMode
set(value) = setS(value, field, { field = it }) {
set(value) = setV(value, field, { field = it }) {
Config.rootMode = entryValues[it].toInt()
}
}
@@ -237,7 +240,7 @@ object MultiuserMode : SettingsItem.Selector() {
override val entryValRes = R.array.value_array
override var value = Config.suMultiuserMode
set(value) = setS(value, field, { field = it }) {
set(value) = setV(value, field, { field = it }) {
Config.suMultiuserMode = entryValues[it].toInt()
}
@@ -255,7 +258,7 @@ object MountNamespaceMode : SettingsItem.Selector() {
override val entryValRes = R.array.value_array
override var value = Config.suMntNamespaceMode
set(value) = setS(value, field, { field = it }) {
set(value) = setV(value, field, { field = it }) {
Config.suMntNamespaceMode = entryValues[it].toInt()
}
@@ -269,7 +272,7 @@ object AutomaticResponse : SettingsItem.Selector() {
override val entryValRes = R.array.value_array
override var value = Config.suAutoReponse
set(value) = setS(value, field, { field = it }) {
set(value) = setV(value, field, { field = it }) {
Config.suAutoReponse = entryValues[it].toInt()
}
}
@@ -280,7 +283,7 @@ object RequestTimeout : SettingsItem.Selector() {
override val entryValRes = R.array.request_timeout_value
override var value = selected
set(value) = setS(value, field, { field = it }) {
set(value) = setV(value, field, { field = it }) {
Config.suDefaultTimeout = entryValues[it].toInt()
}
@@ -294,7 +297,7 @@ object SUNotification : SettingsItem.Selector() {
override val entryValRes = R.array.value_array
override var value = Config.suNotification
set(value) = setS(value, field, { field = it }) {
set(value) = setV(value, field, { field = it }) {
Config.suNotification = entryValues[it].toInt()
}
}