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 a209b1905..aa7858d6a 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 @@ -28,7 +28,7 @@ sealed class SettingsItem : ObservableItem() { @get:Bindable var isEnabled by bindable(true, BR.enabled) - protected open val isFullSpan: Boolean = false + protected open val isFullSpan get() = false @CallSuper open fun onPressed(view: View, callback: Callback) { @@ -145,28 +145,13 @@ sealed class SettingsItem : ObservableItem() { protected val resources get() = get() - var entries: Array = arrayOf() - private set - - var entryValues: Array = arrayOf() - private set + abstract val entries: Array + abstract val entryValues: Array @get:Bindable val selectedEntry get() = entries.getOrNull(value) - fun setValues( - entries: Array, - values: Array - ) { - check(entries.size <= values.size) { "List sizes must match" } - - this.entries = entries - this.entryValues = values - - notifyChange(BR.selectedEntry) - } - override fun onPressed(view: View, callback: Callback) { if (entries.isEmpty() || entryValues.isEmpty()) return callback.onItemPressed(view, this) @@ -199,7 +184,7 @@ sealed class SettingsItem : ObservableItem() { abstract class Section : SettingsItem() { override val layoutRes = R.layout.item_settings_section - override val isFullSpan = true + override val isFullSpan get() = true } 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 210ab97f8..c80f92d71 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 @@ -33,19 +33,21 @@ object Customization : SettingsItem.Section() { object Language : SettingsItem.Selector() { override var value by bindableValue(0) { - Config.locale = entryValues.getOrNull(it)?.toString() ?: return@bindableValue + Config.locale = entryValues[it] refreshLocale() } override val title = R.string.language.asTransitive() + override var entries = arrayOf() + override var entryValues = arrayOf() init { availableLocales.subscribeK { (names, values) -> - setValues(names, values) - val selectedLocale = currentLocale.getDisplayName( - currentLocale - ) + entries = names + entryValues = values + val selectedLocale = currentLocale.getDisplayName(currentLocale) value = names.indexOfFirst { it == selectedLocale }.let { if (it == -1) 0 else it } + notifyChange(BR.selectedEntry) } } } @@ -80,8 +82,9 @@ object Hide : SettingsItem.Input() { notifyChange(BR.value) notifyChange(BR.error) } - val isError - @Bindable get() = value.length > 14 || value.isBlank() + + @get:Bindable + val isError get() = value.length > 14 || value.isBlank() override val intermediate: String? get() = if (isError) null else value @@ -108,18 +111,18 @@ object DownloadPath : SettingsItem.Input() { override val title = R.string.settings_download_path_title.asTransitive() override val intermediate: String? get() = if (Utils.ensureDownloadPath(result) != null) result else null + + @get:Bindable var result = value - @Bindable get set(value) { field = value notifyChange(BR.result) notifyChange(BR.path) } + + @get:Bindable val path - @Bindable get() = File( - Environment.getExternalStorageDirectory(), - result - ).absolutePath.orEmpty() + get() = File(Environment.getExternalStorageDirectory(), result).absolutePath.orEmpty() override fun getView(context: Context) = DialogSettingsDownloadPathBinding .inflate(LayoutInflater.from(context)).also { it.data = this }.root @@ -132,40 +135,28 @@ object GridSize : SettingsItem.Selector() { override val title = R.string.settings_grid_span_count_title.asTransitive() override val description = R.string.settings_grid_span_count_summary.asTransitive() - - init { - setValues( - resources.getStringArray(R.array.span_count), - resources.getStringArray(R.array.value_array) - ) - } + override val entries = resources.getStringArray(R.array.span_count) + override val entryValues = resources.getStringArray(R.array.value_array) } object UpdateChannel : SettingsItem.Selector() { override var value by bindableValue(Config.updateChannel) { Config.updateChannel = it } - override val title = R.string.settings_update_channel_title.asTransitive() - init { - val entries = resources.getStringArray(R.array.update_channel).let { - if (!Utils.isCanary && Config.updateChannel < Config.Value.CANARY_CHANNEL) - it.take(it.size - 2).toTypedArray() else it - } - setValues( - entries, - resources.getStringArray(R.array.value_array) - ) + override val title = R.string.settings_update_channel_title.asTransitive() + override val entries = resources.getStringArray(R.array.update_channel).let { + if (!Utils.isCanary && Config.updateChannel < Config.Value.CANARY_CHANNEL) + it.take(it.size - 2).toTypedArray() else it } + override val entryValues = resources.getStringArray(R.array.value_array) } object UpdateChannelUrl : SettingsItem.Input() { override val title = R.string.settings_update_custom.asTransitive() - override var value: String by bindableValue(Config.customChannelUrl) { - Config.customChannelUrl = it - } + override var value by bindableValue(Config.customChannelUrl) { Config.customChannelUrl = it } override val intermediate: String? get() = result + @get:Bindable var result = value - @Bindable get set(value) { field = value notifyChange(BR.result) @@ -271,17 +262,11 @@ object Superuser : SettingsItem.Section() { object AccessMode : SettingsItem.Selector() { override val title = R.string.superuser_access.asTransitive() - override var value by bindableValue(Config.rootMode) { - Config.rootMode = entryValues.getOrNull(it) - ?.toString() - ?.toInt() ?: return@bindableValue - } + override val entries = resources.getStringArray(R.array.su_access) + override val entryValues = resources.getStringArray(R.array.value_array) - init { - setValues( - resources.getStringArray(R.array.su_access), - resources.getStringArray(R.array.value_array) - ) + override var value by bindableValue(Config.rootMode) { + Config.rootMode = entryValues[it].toInt() } override fun refresh() { @@ -291,22 +276,17 @@ object AccessMode : SettingsItem.Selector() { object MultiuserMode : SettingsItem.Selector() { override val title = R.string.multiuser_mode.asTransitive() - override var value by bindableValue(Config.suMultiuserMode) { - Config.suMultiuserMode = entryValues.getOrNull(it) - ?.toString() - ?.toInt() ?: return@bindableValue - } + override val entries = resources.getStringArray(R.array.multiuser_mode) + override val entryValues = resources.getStringArray(R.array.value_array) private val descArray = resources.getStringArray(R.array.multiuser_summary) + + override var value by bindableValue(Config.suMultiuserMode) { + Config.suMultiuserMode = entryValues[it].toInt() + } + override val description get() = descArray[value].asTransitive() - init { - setValues( - resources.getStringArray(R.array.multiuser_mode), - resources.getStringArray(R.array.value_array) - ) - } - override fun refresh() { isEnabled = Const.USER_ID <= 0 && Utils.showSuperUser() } @@ -314,22 +294,17 @@ object MultiuserMode : SettingsItem.Selector() { object MountNamespaceMode : SettingsItem.Selector() { override val title = R.string.mount_namespace_mode.asTransitive() - override var value by bindableValue(Config.suMntNamespaceMode) { - Config.suMntNamespaceMode = entryValues.getOrNull(it) - ?.toString() - ?.toInt() ?: return@bindableValue - } + override val entries = resources.getStringArray(R.array.namespace) + override val entryValues = resources.getStringArray(R.array.value_array) private val descArray = resources.getStringArray(R.array.namespace_summary) + + override var value by bindableValue(Config.suMntNamespaceMode) { + Config.suMntNamespaceMode = entryValues[it].toInt() + } + override val description get() = descArray[value].asTransitive() - init { - setValues( - resources.getStringArray(R.array.namespace), - resources.getStringArray(R.array.value_array) - ) - } - override fun refresh() { isEnabled = Utils.showSuperUser() } @@ -337,17 +312,11 @@ object MountNamespaceMode : SettingsItem.Selector() { object AutomaticResponse : SettingsItem.Selector() { override val title = R.string.auto_response.asTransitive() - override var value by bindableValue(Config.suAutoReponse) { - Config.suAutoReponse = entryValues.getOrNull(it) - ?.toString() - ?.toInt() ?: return@bindableValue - } + override val entries = resources.getStringArray(R.array.auto_response) + override val entryValues = resources.getStringArray(R.array.value_array) - init { - setValues( - resources.getStringArray(R.array.auto_response), - resources.getStringArray(R.array.value_array) - ) + override var value by bindableValue(Config.suAutoReponse) { + Config.suAutoReponse = entryValues[it].toInt() } override fun refresh() { @@ -357,20 +326,15 @@ object AutomaticResponse : SettingsItem.Selector() { object RequestTimeout : SettingsItem.Selector() { override val title = R.string.request_timeout.asTransitive() - override var value by bindableValue(-1) { - Config.suDefaultTimeout = entryValues.getOrNull(it) - ?.toString() - ?.toInt() ?: return@bindableValue + override val entries = resources.getStringArray(R.array.request_timeout) + override val entryValues = resources.getStringArray(R.array.request_timeout_value) + + override var value by bindableValue(selected) { + Config.suDefaultTimeout = entryValues[it].toInt() } - init { - setValues( - resources.getStringArray(R.array.request_timeout), - resources.getStringArray(R.array.request_timeout_value) - ) - val currentValue = Config.suDefaultTimeout.toString() - value = entryValues.indexOfFirst { it == currentValue } - } + private val selected: Int + get() = entryValues.indexOfFirst { it.toInt() == Config.suDefaultTimeout } override fun refresh() { isEnabled = Utils.showSuperUser() @@ -379,17 +343,11 @@ object RequestTimeout : SettingsItem.Selector() { object SUNotification : SettingsItem.Selector() { override val title = R.string.superuser_notification.asTransitive() - override var value by bindableValue(Config.suNotification) { - Config.suNotification = entryValues.getOrNull(it) - ?.toString() - ?.toInt() ?: return@bindableValue - } + override val entries = resources.getStringArray(R.array.su_notification) + override val entryValues = resources.getStringArray(R.array.value_array) - init { - setValues( - resources.getStringArray(R.array.su_notification), - resources.getStringArray(R.array.value_array) - ) + override var value by bindableValue(Config.suNotification) { + Config.suNotification = entryValues[it].toInt() } override fun refresh() {