From 40aae19b45aa9d991c63daa7cddb248d9af24235 Mon Sep 17 00:00:00 2001 From: andrekir Date: Wed, 13 Mar 2024 20:50:57 -0300 Subject: [PATCH] feat: add MQTT `mapReportSettings` config --- .../components/PositionPrecisionPreference.kt | 44 +++++++++++++++++++ .../ui/components/config/EditChannelDialog.kt | 24 +--------- .../components/config/MQTTConfigItemList.kt | 31 ++++++++++++- 3 files changed, 76 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/com/geeksville/mesh/ui/components/PositionPrecisionPreference.kt diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/PositionPrecisionPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/components/PositionPrecisionPreference.kt new file mode 100644 index 00000000..1fa5f66e --- /dev/null +++ b/app/src/main/java/com/geeksville/mesh/ui/components/PositionPrecisionPreference.kt @@ -0,0 +1,44 @@ +package com.geeksville.mesh.ui.components + +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalFocusManager + +private enum class PositionPrecision(val value: Int) { + HIGH_PRECISION(32), + MED_PRECISION(16), + LOW_PRECISION(11), + DISABLED(0), + ; +} + +@Composable +fun PositionPrecisionPreference( + title: String, + value: Int, + enabled: Boolean, + onValueChanged: (Int) -> Unit, + modifier: Modifier = Modifier, +) { + val focusManager = LocalFocusManager.current + val useDropDown = PositionPrecision.entries.any { it.value == value } + + if (useDropDown) { + DropDownPreference( + title = title, + enabled = enabled, + items = PositionPrecision.entries.map { it.value to it.name }, + selectedItem = value, + onItemSelected = onValueChanged, + ) + } else { + EditTextPreference( + title = title, + value = value, + enabled = enabled, + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), + onValueChanged = onValueChanged, + ) + } +} diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/config/EditChannelDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/components/config/EditChannelDialog.kt index 20963352..721ed881 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/components/config/EditChannelDialog.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/components/config/EditChannelDialog.kt @@ -38,21 +38,13 @@ import com.geeksville.mesh.R import com.geeksville.mesh.channelSettings import com.geeksville.mesh.copy import com.geeksville.mesh.model.Channel -import com.geeksville.mesh.ui.components.DropDownPreference import com.geeksville.mesh.ui.components.EditTextPreference +import com.geeksville.mesh.ui.components.PositionPrecisionPreference import com.google.accompanist.themeadapter.appcompat.AppCompatTheme import com.google.protobuf.ByteString import com.google.protobuf.kotlin.toByteString import java.security.SecureRandom -private enum class PositionPrecision(val value: Int) { - HIGH_PRECISION(32), - MED_PRECISION(16), - LOW_PRECISION(11), - DISABLED(0), - ; -} - @Composable fun EditChannelDialog( channelSettings: ChannelProtos.ChannelSettings, @@ -68,8 +60,6 @@ fun EditChannelDialog( var channelInput by remember(channelSettings) { mutableStateOf(channelSettings) } var pskString by remember(channelInput) { mutableStateOf(encodeToString(channelInput.psk)) } val pskError = pskString != encodeToString(channelInput.psk) - val useDropDown = PositionPrecision.entries - .any { it.value == channelInput.moduleSettings.positionPrecision } fun getRandomKey() { val random = SecureRandom() @@ -167,20 +157,10 @@ fun EditChannelDialog( ) } - if (useDropDown) DropDownPreference( + PositionPrecisionPreference( title = "Position", enabled = true, - items = PositionPrecision.entries.map { it.value to it.name }, - selectedItem = channelInput.moduleSettings.positionPrecision, - onItemSelected = { - val module = channelInput.moduleSettings.copy { positionPrecision = it } - channelInput = channelInput.copy { moduleSettings = module } - } - ) else EditTextPreference( - title = "Position precision", value = channelInput.moduleSettings.positionPrecision, - enabled = true, - keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), onValueChanged = { val module = channelInput.moduleSettings.copy { positionPrecision = it } channelInput = channelInput.copy { moduleSettings = module } diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/config/MQTTConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/components/config/MQTTConfigItemList.kt index 13776683..29d47a57 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/components/config/MQTTConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/components/config/MQTTConfigItemList.kt @@ -19,6 +19,7 @@ import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig.MQTTConfig import com.geeksville.mesh.copy import com.geeksville.mesh.ui.components.EditPasswordPreference import com.geeksville.mesh.ui.components.EditTextPreference +import com.geeksville.mesh.ui.components.PositionPrecisionPreference import com.geeksville.mesh.ui.components.PreferenceCategory import com.geeksville.mesh.ui.components.PreferenceFooter import com.geeksville.mesh.ui.components.SwitchPreference @@ -107,7 +108,7 @@ fun MQTTConfigItemList( item { EditTextPreference(title = "Root topic", value = mqttInput.root, - maxSize = 15, // root max_size:16 + maxSize = 31, // root max_size:32 enabled = enabled, isError = false, keyboardOptions = KeyboardOptions.Default.copy( @@ -125,6 +126,34 @@ fun MQTTConfigItemList( } item { Divider() } + item { + PositionPrecisionPreference( + title = "Map reporting", + enabled = enabled, + value = mqttInput.mapReportSettings.positionPrecision, + onValueChanged = { + val settings = mqttInput.mapReportSettings.copy { positionPrecision = it } + mqttInput = mqttInput.copy { + mapReportingEnabled = settings.positionPrecision > 0 + mapReportSettings = settings + } + }, + ) + } + item { Divider() } + + item { + EditTextPreference(title = "Map reporting interval (seconds)", + value = mqttInput.mapReportSettings.publishIntervalSecs, + enabled = enabled && mqttInput.mapReportingEnabled, + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), + onValueChanged = { + val settings = mqttInput.mapReportSettings.copy { publishIntervalSecs = it } + mqttInput = mqttInput.copy { mapReportSettings = settings } + }, + ) + } + item { PreferenceFooter( enabled = mqttInput != mqttConfig,