diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt index 26de77b57..0a4b679e2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt @@ -18,12 +18,24 @@ import org.koin.core.get sealed class SettingsItem : ObservableItem() { + 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() { abstract class Value : SettingsItem() { - @get:Bindable abstract var value: T protected var callbackVars: Pair? = null @@ -63,24 +74,13 @@ sealed class SettingsItem : ObservableItem() { abstract fun onPressed(view: View) - protected inline fun 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 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() { abstract class Toggle : Value() { - 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() { abstract class Input : Value() { - 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() { abstract class Selector : Value(), KoinComponent { - override val layoutRes = R.layout.item_settings_selector - protected val resources get() = get() @ArrayRes open val entryRes = -1 @@ -138,15 +138,9 @@ sealed class SettingsItem : ObservableItem() { 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 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 = runCatching { getStringArray(id) }.getOrDefault(emptyArray()) @@ -169,9 +163,7 @@ sealed class SettingsItem : ObservableItem() { } - 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 diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt index a6003bdfe..4060650c9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt @@ -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() } } diff --git a/app/src/main/res/layout/fragment_settings_md2.xml b/app/src/main/res/layout/fragment_settings_md2.xml index 55a3efe5a..4f83edc5d 100644 --- a/app/src/main/res/layout/fragment_settings_md2.xml +++ b/app/src/main/res/layout/fragment_settings_md2.xml @@ -31,7 +31,7 @@ android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/l1}" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:layout_marginTop="24dp" - tools:listitem="@layout/item_settings_toggle" + tools:listitem="@layout/item_settings" tools:paddingTop="@dimen/l1" /> diff --git a/app/src/main/res/layout/item_settings_toggle.xml b/app/src/main/res/layout/item_settings.xml similarity index 65% rename from app/src/main/res/layout/item_settings_toggle.xml rename to app/src/main/res/layout/item_settings.xml index 1925d4d9b..b97998762 100644 --- a/app/src/main/res/layout/item_settings_toggle.xml +++ b/app/src/main/res/layout/item_settings.xml @@ -5,11 +5,9 @@ - - + type="com.topjohnwu.magisk.model.entity.recycler.SettingsItem" /> - + android:orientation="horizontal" + android:gravity="center_vertical" + android:paddingStart="@{item.icon == 0 ? @dimen/l1 : 0}" + android:paddingEnd="@dimen/l1"> - - + android:paddingBottom="@dimen/l1"> - + + + diff --git a/app/src/main/res/layout/item_settings_blank.xml b/app/src/main/res/layout/item_settings_blank.xml deleted file mode 100644 index 4c5cb8a42..000000000 --- a/app/src/main/res/layout/item_settings_blank.xml +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/item_settings_input.xml b/app/src/main/res/layout/item_settings_input.xml deleted file mode 100644 index 32ea9d4ea..000000000 --- a/app/src/main/res/layout/item_settings_input.xml +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/item_settings_selector.xml b/app/src/main/res/layout/item_settings_selector.xml deleted file mode 100644 index 7d6bd136a..000000000 --- a/app/src/main/res/layout/item_settings_selector.xml +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -