From d8f67e011a93ddb269f27e7c2d4217c67da9c97a Mon Sep 17 00:00:00 2001 From: Joshua Soberg Date: Sun, 2 Mar 2025 10:20:27 -0500 Subject: [PATCH] fix #1615: Add explicit signed int editing preference (#1629) --- .../mesh/ui/components/EditTextPreference.kt | 34 +++++++++++++++++++ .../components/LoRaConfigItemList.kt | 7 ++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/EditTextPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/components/EditTextPreference.kt index 02ed72a1..f022689d 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/components/EditTextPreference.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/components/EditTextPreference.kt @@ -46,6 +46,40 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.geeksville.mesh.R +@Composable +fun SignedIntegerEditTextPreference( + title: String, + value: Int, + enabled: Boolean, + keyboardActions: KeyboardActions, + onValueChanged: (Int) -> Unit, + modifier: Modifier = Modifier, + onFocusChanged: (FocusState) -> Unit = {}, + trailingIcon: (@Composable () -> Unit)? = null, +) { + var valueState by remember(value) { mutableStateOf(value.toString()) } + + EditTextPreference( + title = title, + value = valueState, + enabled = enabled, + isError = valueState.toIntOrNull() == null, + keyboardOptions = KeyboardOptions.Default.copy( + keyboardType = KeyboardType.Number, imeAction = ImeAction.Done + ), + keyboardActions = keyboardActions, + onValueChanged = { + valueState = it + it.toIntOrNull()?.let { int -> + onValueChanged(int) + } + }, + onFocusChanged = onFocusChanged, + modifier = modifier, + trailingIcon = trailingIcon + ) +} + @Composable fun EditTextPreference( title: String, diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/LoRaConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/LoRaConfigItemList.kt index 17a3279c..4ad4a2db 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/LoRaConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/LoRaConfigItemList.kt @@ -44,6 +44,7 @@ import com.geeksville.mesh.ui.components.EditListPreference import com.geeksville.mesh.ui.components.EditTextPreference import com.geeksville.mesh.ui.components.PreferenceCategory import com.geeksville.mesh.ui.components.PreferenceFooter +import com.geeksville.mesh.ui.components.SignedIntegerEditTextPreference import com.geeksville.mesh.ui.components.SwitchPreference import com.geeksville.mesh.ui.radioconfig.RadioConfigViewModel @@ -171,11 +172,13 @@ fun LoRaConfigItemList( item { Divider() } item { - EditTextPreference(title = "TX power (dBm)", + SignedIntegerEditTextPreference( + title = "TX power (dBm)", value = loraInput.txPower, enabled = enabled, keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), - onValueChanged = { loraInput = loraInput.copy { txPower = it } }) + onValueChanged = { loraInput = loraInput.copy { txPower = it } }, + ) } item {