feat(settings): read the labels and helper text the schema already has (#7302)

This commit is contained in:
James Rich authored and GitHub committed 2026-09-22 16:53:46 +00:00
1 parent e23466be3c
commit 2def49d539
27 files changed
+267 -120

No files matched your search

@@ -29,10 +29,15 @@ import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.ambient_lighting
import org.meshtastic.core.resources.ambient_lighting_config
import org.meshtastic.core.resources.schema_ambientlighting_blue
import org.meshtastic.core.resources.schema_ambientlighting_blue_description
import org.meshtastic.core.resources.schema_ambientlighting_current
import org.meshtastic.core.resources.schema_ambientlighting_current_description
import org.meshtastic.core.resources.schema_ambientlighting_green
import org.meshtastic.core.resources.schema_ambientlighting_green_description
import org.meshtastic.core.resources.schema_ambientlighting_led_state
import org.meshtastic.core.resources.schema_ambientlighting_led_state_description
import org.meshtastic.core.resources.schema_ambientlighting_red
import org.meshtastic.core.resources.schema_ambientlighting_red_description
import org.meshtastic.core.ui.component.SwitchPreference
import org.meshtastic.core.ui.component.TitledCard
import org.meshtastic.feature.settings.radio.RadioConfigViewModel
@@ -68,6 +73,7 @@ fun AmbientLightingConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> U
TitledCard(title = stringResource(Res.string.ambient_lighting_config)) {
SwitchPreference(
title = stringResource(Res.string.schema_ambientlighting_led_state),
summary = stringResource(Res.string.schema_ambientlighting_led_state_description),
checked = formState.value.led_state,
enabled = state.connected,
onCheckedChange = {
@@ -97,6 +103,7 @@ private fun LedColorFields(
androidx.compose.foundation.layout.Column {
BoundedIntEditTextPreference(
title = stringResource(Res.string.schema_ambientlighting_current),
summary = stringResource(Res.string.schema_ambientlighting_current_description),
value = config.current,
metadata = ModuleConfig.AmbientLightingConfig.current,
enabled = enabled,
@@ -105,6 +112,7 @@ private fun LedColorFields(
)
BoundedIntEditTextPreference(
title = stringResource(Res.string.schema_ambientlighting_red),
summary = stringResource(Res.string.schema_ambientlighting_red_description),
value = config.red,
metadata = ModuleConfig.AmbientLightingConfig.red,
enabled = enabled,
@@ -113,6 +121,7 @@ private fun LedColorFields(
)
BoundedIntEditTextPreference(
title = stringResource(Res.string.schema_ambientlighting_green),
summary = stringResource(Res.string.schema_ambientlighting_green_description),
value = config.green,
metadata = ModuleConfig.AmbientLightingConfig.green,
enabled = enabled,
@@ -121,6 +130,7 @@ private fun LedColorFields(
)
BoundedIntEditTextPreference(
title = stringResource(Res.string.schema_ambientlighting_blue),
summary = stringResource(Res.string.schema_ambientlighting_blue_description),
value = config.blue,
metadata = ModuleConfig.AmbientLightingConfig.blue,
enabled = enabled,
@@ -28,12 +28,15 @@ import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.audio
import org.meshtastic.core.resources.audio_config
import org.meshtastic.core.resources.schema_audio_bitrate
import org.meshtastic.core.resources.schema_audio_bitrate_description
import org.meshtastic.core.resources.schema_audio_codec2_enabled
import org.meshtastic.core.resources.schema_audio_codec2_enabled_description
import org.meshtastic.core.resources.schema_audio_i2s_din
import org.meshtastic.core.resources.schema_audio_i2s_sck
import org.meshtastic.core.resources.schema_audio_i2s_sd
import org.meshtastic.core.resources.schema_audio_i2s_ws
import org.meshtastic.core.resources.schema_audio_ptt_pin
import org.meshtastic.core.resources.schema_audio_ptt_pin_description
import org.meshtastic.core.ui.component.DropDownPreference
import org.meshtastic.core.ui.component.EditTextPreference
import org.meshtastic.core.ui.component.SwitchPreference
@@ -66,6 +69,7 @@ fun AudioConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
TitledCard(title = stringResource(Res.string.audio_config)) {
SwitchPreference(
title = stringResource(Res.string.schema_audio_codec2_enabled),
summary = stringResource(Res.string.schema_audio_codec2_enabled_description),
checked = formState.value.codec2_enabled,
enabled = state.connected,
onCheckedChange = {
@@ -76,6 +80,7 @@ fun AudioConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
EditTextPreference(
title = stringResource(Res.string.schema_audio_ptt_pin),
summary = stringResource(Res.string.schema_audio_ptt_pin_description),
value = formState.value.ptt_pin,
enabled = state.connected,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
@@ -85,6 +90,7 @@ fun AudioConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
)
DropDownPreference(
title = stringResource(Res.string.schema_audio_bitrate),
summary = stringResource(Res.string.schema_audio_bitrate_description),
enabled = state.connected,
selectedItem = formState.value.bitrate,
onItemSelected = {
@@ -33,9 +33,11 @@ import org.jetbrains.compose.resources.stringResource
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.bluetooth
import org.meshtastic.core.resources.bluetooth_config
import org.meshtastic.core.resources.fixed_pin
import org.meshtastic.core.resources.schema_bluetooth_enabled
import org.meshtastic.core.resources.schema_bluetooth_enabled_description
import org.meshtastic.core.resources.schema_bluetooth_fixed_pin
import org.meshtastic.core.resources.schema_bluetooth_mode
import org.meshtastic.core.resources.schema_bluetooth_mode_description
import org.meshtastic.core.ui.component.DropDownPreference
import org.meshtastic.core.ui.component.EditTextPreference
import org.meshtastic.core.ui.component.SwitchPreference
@@ -70,6 +72,7 @@ fun BluetoothConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
TitledCard(title = stringResource(Res.string.bluetooth_config)) {
SwitchPreference(
title = stringResource(Res.string.schema_bluetooth_enabled),
summary = stringResource(Res.string.schema_bluetooth_enabled_description),
checked = formState.value.enabled,
enabled = state.connected,
onCheckedChange = {
@@ -80,6 +83,7 @@ fun BluetoothConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
DropDownPreference(
title = stringResource(Res.string.schema_bluetooth_mode),
summary = stringResource(Res.string.schema_bluetooth_mode_description),
enabled = state.connected,
items =
Config.BluetoothConfig.PairingMode.entries
@@ -116,7 +120,7 @@ private fun FixedPinPreference(
var pinState by remember(pinValue) { mutableStateOf(pinValue.toString().padStart(PIN_LENGTH, '0')) }
val pinIsError = pinState.length != PIN_LENGTH || !pinState.all { it.isDigit() }
EditTextPreference(
title = stringResource(Res.string.fixed_pin),
title = stringResource(Res.string.schema_bluetooth_fixed_pin),
value = pinState,
enabled = enabled,
isError = pinIsError,
@@ -39,14 +39,23 @@ import org.meshtastic.core.resources.canned_message_config
import org.meshtastic.core.resources.canned_message_enabled
import org.meshtastic.core.resources.messages
import org.meshtastic.core.resources.schema_cannedmessage_inputbroker_event_ccw
import org.meshtastic.core.resources.schema_cannedmessage_inputbroker_event_ccw_description
import org.meshtastic.core.resources.schema_cannedmessage_inputbroker_event_cw
import org.meshtastic.core.resources.schema_cannedmessage_inputbroker_event_cw_description
import org.meshtastic.core.resources.schema_cannedmessage_inputbroker_event_press
import org.meshtastic.core.resources.schema_cannedmessage_inputbroker_event_press_description
import org.meshtastic.core.resources.schema_cannedmessage_inputbroker_pin_a
import org.meshtastic.core.resources.schema_cannedmessage_inputbroker_pin_a_description
import org.meshtastic.core.resources.schema_cannedmessage_inputbroker_pin_b
import org.meshtastic.core.resources.schema_cannedmessage_inputbroker_pin_b_description
import org.meshtastic.core.resources.schema_cannedmessage_inputbroker_pin_press
import org.meshtastic.core.resources.schema_cannedmessage_inputbroker_pin_press_description
import org.meshtastic.core.resources.schema_cannedmessage_rotary1_enabled
import org.meshtastic.core.resources.schema_cannedmessage_rotary1_enabled_description
import org.meshtastic.core.resources.schema_cannedmessage_send_bell
import org.meshtastic.core.resources.schema_cannedmessage_send_bell_description
import org.meshtastic.core.resources.schema_cannedmessage_updown1_enabled
import org.meshtastic.core.resources.schema_cannedmessage_updown1_enabled_description
import org.meshtastic.core.ui.component.DropDownPreference
import org.meshtastic.core.ui.component.EditTextPreference
import org.meshtastic.core.ui.component.SwitchPreference
@@ -105,6 +114,7 @@ fun CannedMessageConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Uni
}
SwitchPreference(
title = stringResource(Res.string.schema_cannedmessage_rotary1_enabled),
summary = stringResource(Res.string.schema_cannedmessage_rotary1_enabled_description),
checked = formState.value.rotary1_enabled,
enabled = state.connected,
onCheckedChange = {
@@ -115,6 +125,7 @@ fun CannedMessageConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Uni
HorizontalDivider()
EditTextPreference(
title = stringResource(Res.string.schema_cannedmessage_inputbroker_pin_a),
summary = stringResource(Res.string.schema_cannedmessage_inputbroker_pin_a_description),
value = formState.value.inputbroker_pin_a,
enabled = state.connected,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
@@ -124,6 +135,7 @@ fun CannedMessageConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Uni
)
EditTextPreference(
title = stringResource(Res.string.schema_cannedmessage_inputbroker_pin_b),
summary = stringResource(Res.string.schema_cannedmessage_inputbroker_pin_b_description),
value = formState.value.inputbroker_pin_b,
enabled = state.connected,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
@@ -133,6 +145,7 @@ fun CannedMessageConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Uni
)
EditTextPreference(
title = stringResource(Res.string.schema_cannedmessage_inputbroker_pin_press),
summary = stringResource(Res.string.schema_cannedmessage_inputbroker_pin_press_description),
value = formState.value.inputbroker_pin_press,
enabled = state.connected,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
@@ -143,6 +156,7 @@ fun CannedMessageConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Uni
)
DropDownPreference(
title = stringResource(Res.string.schema_cannedmessage_inputbroker_event_press),
summary = stringResource(Res.string.schema_cannedmessage_inputbroker_event_press_description),
enabled = state.connected,
selectedItem = formState.value.inputbroker_event_press,
onItemSelected = {
@@ -153,6 +167,7 @@ fun CannedMessageConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Uni
HorizontalDivider()
DropDownPreference(
title = stringResource(Res.string.schema_cannedmessage_inputbroker_event_cw),
summary = stringResource(Res.string.schema_cannedmessage_inputbroker_event_cw_description),
enabled = state.connected,
selectedItem = formState.value.inputbroker_event_cw,
onItemSelected = {
@@ -163,6 +178,7 @@ fun CannedMessageConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Uni
HorizontalDivider()
DropDownPreference(
title = stringResource(Res.string.schema_cannedmessage_inputbroker_event_ccw),
summary = stringResource(Res.string.schema_cannedmessage_inputbroker_event_ccw_description),
enabled = state.connected,
selectedItem = formState.value.inputbroker_event_ccw,
onItemSelected = {
@@ -173,6 +189,7 @@ fun CannedMessageConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Uni
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_cannedmessage_updown1_enabled),
summary = stringResource(Res.string.schema_cannedmessage_updown1_enabled_description),
checked = formState.value.updown1_enabled,
enabled = state.connected,
onCheckedChange = {
@@ -204,6 +221,7 @@ fun CannedMessageConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Uni
}
SwitchPreference(
title = stringResource(Res.string.schema_cannedmessage_send_bell),
summary = stringResource(Res.string.schema_cannedmessage_send_bell_description),
checked = formState.value.send_bell,
enabled = state.connected,
onCheckedChange = {
@@ -33,11 +33,17 @@ import org.meshtastic.core.resources.detection_sensor
import org.meshtastic.core.resources.detection_sensor_config
import org.meshtastic.core.resources.minimum_broadcast_seconds
import org.meshtastic.core.resources.schema_detectionsensor_detection_trigger_type
import org.meshtastic.core.resources.schema_detectionsensor_detection_trigger_type_description
import org.meshtastic.core.resources.schema_detectionsensor_enabled
import org.meshtastic.core.resources.schema_detectionsensor_enabled_description
import org.meshtastic.core.resources.schema_detectionsensor_monitor_pin
import org.meshtastic.core.resources.schema_detectionsensor_monitor_pin_description
import org.meshtastic.core.resources.schema_detectionsensor_name
import org.meshtastic.core.resources.schema_detectionsensor_name_description
import org.meshtastic.core.resources.schema_detectionsensor_send_bell
import org.meshtastic.core.resources.schema_detectionsensor_send_bell_description
import org.meshtastic.core.resources.schema_detectionsensor_use_pullup
import org.meshtastic.core.resources.schema_detectionsensor_use_pullup_description
import org.meshtastic.core.resources.state_broadcast_seconds
import org.meshtastic.core.ui.component.DropDownPreference
import org.meshtastic.core.ui.component.EditTextPreference
@@ -75,6 +81,7 @@ fun DetectionSensorConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> U
TitledCard(title = stringResource(Res.string.detection_sensor_config)) {
SwitchPreference(
title = stringResource(Res.string.schema_detectionsensor_enabled),
summary = stringResource(Res.string.schema_detectionsensor_enabled_description),
checked = formState.value.enabled,
enabled = state.connected,
onCheckedChange = {
@@ -111,6 +118,7 @@ fun DetectionSensorConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> U
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_detectionsensor_send_bell),
summary = stringResource(Res.string.schema_detectionsensor_send_bell_description),
checked = formState.value.send_bell,
enabled = state.connected,
onCheckedChange = {
@@ -121,6 +129,7 @@ fun DetectionSensorConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> U
HorizontalDivider()
EditTextPreference(
title = stringResource(Res.string.schema_detectionsensor_name),
summary = stringResource(Res.string.schema_detectionsensor_name_description),
value = formState.value.name,
maxSize = 19, // name max_size:20
enabled = state.connected,
@@ -136,6 +145,7 @@ fun DetectionSensorConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> U
val pins = remember { gpioPins }
DropDownPreference(
title = stringResource(Res.string.schema_detectionsensor_monitor_pin),
summary = stringResource(Res.string.schema_detectionsensor_monitor_pin_description),
items = pins,
selectedItem = formState.value.monitor_pin,
enabled = state.connected,
@@ -146,6 +156,7 @@ fun DetectionSensorConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> U
HorizontalDivider()
DropDownPreference(
title = stringResource(Res.string.schema_detectionsensor_detection_trigger_type),
summary = stringResource(Res.string.schema_detectionsensor_detection_trigger_type_description),
enabled = state.connected,
selectedItem = formState.value.detection_trigger_type,
onItemSelected = {
@@ -156,6 +167,7 @@ fun DetectionSensorConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> U
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_detectionsensor_use_pullup),
summary = stringResource(Res.string.schema_detectionsensor_use_pullup_description),
checked = formState.value.use_pullup,
enabled = state.connected,
onCheckedChange = {
@@ -70,18 +70,21 @@ import org.meshtastic.core.resources.files_available
import org.meshtastic.core.resources.gpio
import org.meshtastic.core.resources.hardware
import org.meshtastic.core.resources.i_know_what_i_m_doing
import org.meshtastic.core.resources.led_heartbeat
import org.meshtastic.core.resources.no_files_manifested
import org.meshtastic.core.resources.options
import org.meshtastic.core.resources.role
import org.meshtastic.core.resources.router_role_confirmation_text
import org.meshtastic.core.resources.schema_device_button_gpio
import org.meshtastic.core.resources.schema_device_button_gpio_description
import org.meshtastic.core.resources.schema_device_buzzer_gpio
import org.meshtastic.core.resources.schema_device_buzzer_gpio_description
import org.meshtastic.core.resources.schema_device_double_tap_as_button_press
import org.meshtastic.core.resources.schema_device_double_tap_as_button_press_description
import org.meshtastic.core.resources.schema_device_led_heartbeat_disabled
import org.meshtastic.core.resources.schema_device_node_info_broadcast_secs
import org.meshtastic.core.resources.schema_device_node_info_broadcast_secs_description
import org.meshtastic.core.resources.schema_device_rebroadcast_mode
import org.meshtastic.core.resources.time_zone
import org.meshtastic.core.resources.schema_device_role
import org.meshtastic.core.resources.schema_device_tzdef
import org.meshtastic.core.resources.triple_click_adhoc_ping
import org.meshtastic.core.ui.component.DropDownPreference
import org.meshtastic.core.ui.component.EditTextPreference
@@ -138,7 +141,7 @@ fun DeviceConfigScreenCommon(viewModel: RadioConfigViewModel, onBack: () -> Unit
TitledCard(title = stringResource(Res.string.options)) {
val currentRole = formState.value.role
DropDownPreference(
title = stringResource(Res.string.role),
title = stringResource(Res.string.schema_device_role),
enabled = state.connected,
selectedItem = currentRole,
onItemSelected = { selectedRole = it },
@@ -164,6 +167,7 @@ fun DeviceConfigScreenCommon(viewModel: RadioConfigViewModel, onBack: () -> Unit
val nodeInfoBroadcastIntervals = remember { IntervalConfiguration.NODE_INFO_BROADCAST.allowedIntervals }
DropDownPreference(
title = stringResource(Res.string.schema_device_node_info_broadcast_secs),
summary = stringResource(Res.string.schema_device_node_info_broadcast_secs_description),
selectedItem = formState.value.node_info_broadcast_secs.toLong(),
enabled = state.connected,
items = nodeInfoBroadcastIntervals.map { it.value to it.toDisplayString() },
@@ -206,7 +210,7 @@ fun DeviceConfigScreenCommon(viewModel: RadioConfigViewModel, onBack: () -> Unit
InsetDivider()
SwitchPreference(
title = stringResource(Res.string.led_heartbeat),
title = stringResource(Res.string.schema_device_led_heartbeat_disabled),
summary = stringResource(Res.string.config_device_ledHeartbeatEnabled_summary),
checked = !formState.value.led_heartbeat_disabled,
enabled = state.connected,
@@ -219,7 +223,7 @@ fun DeviceConfigScreenCommon(viewModel: RadioConfigViewModel, onBack: () -> Unit
}
}
item {
TitledCard(title = stringResource(Res.string.time_zone)) {
TitledCard(title = stringResource(Res.string.schema_device_tzdef)) {
val appTzPosixString = rememberSystemTimeZonePosixString()
EditTextPreference(
@@ -276,6 +280,7 @@ fun DeviceConfigScreenCommon(viewModel: RadioConfigViewModel, onBack: () -> Unit
TitledCard(title = stringResource(Res.string.gpio)) {
EditTextPreference(
title = stringResource(Res.string.schema_device_button_gpio),
summary = stringResource(Res.string.schema_device_button_gpio_description),
value = formState.value.button_gpio,
enabled = state.connected,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
@@ -288,6 +293,7 @@ fun DeviceConfigScreenCommon(viewModel: RadioConfigViewModel, onBack: () -> Unit
EditTextPreference(
title = stringResource(Res.string.schema_device_buzzer_gpio),
summary = stringResource(Res.string.schema_device_buzzer_gpio_description),
value = formState.value.buzzer_gpio,
enabled = state.connected,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
@@ -33,6 +33,7 @@ import org.meshtastic.core.resources.schema_display_auto_screen_carousel_secs_de
import org.meshtastic.core.resources.schema_display_compass_north_top
import org.meshtastic.core.resources.schema_display_compass_north_top_description
import org.meshtastic.core.resources.schema_display_compass_orientation
import org.meshtastic.core.resources.schema_display_compass_orientation_description
import org.meshtastic.core.resources.schema_display_displaymode
import org.meshtastic.core.resources.schema_display_displaymode_description
import org.meshtastic.core.resources.schema_display_flip_screen
@@ -216,6 +217,7 @@ fun DisplayConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
DropDownPreference(
title = stringResource(Res.string.schema_display_compass_orientation),
summary = stringResource(Res.string.schema_display_compass_orientation_description),
enabled = state.connected,
selectedItem = formState.value.compass_orientation,
onItemSelected = {
@@ -42,18 +42,31 @@ import org.meshtastic.core.resources.notifications_on_message_receipt
import org.meshtastic.core.resources.output_duration_milliseconds
import org.meshtastic.core.resources.ringtone
import org.meshtastic.core.resources.schema_externalnotification_active
import org.meshtastic.core.resources.schema_externalnotification_active_description
import org.meshtastic.core.resources.schema_externalnotification_alert_bell
import org.meshtastic.core.resources.schema_externalnotification_alert_bell_buzzer
import org.meshtastic.core.resources.schema_externalnotification_alert_bell_buzzer_description
import org.meshtastic.core.resources.schema_externalnotification_alert_bell_description
import org.meshtastic.core.resources.schema_externalnotification_alert_bell_vibra
import org.meshtastic.core.resources.schema_externalnotification_alert_bell_vibra_description
import org.meshtastic.core.resources.schema_externalnotification_alert_message
import org.meshtastic.core.resources.schema_externalnotification_alert_message_buzzer
import org.meshtastic.core.resources.schema_externalnotification_alert_message_buzzer_description
import org.meshtastic.core.resources.schema_externalnotification_alert_message_description
import org.meshtastic.core.resources.schema_externalnotification_alert_message_vibra
import org.meshtastic.core.resources.schema_externalnotification_alert_message_vibra_description
import org.meshtastic.core.resources.schema_externalnotification_enabled
import org.meshtastic.core.resources.schema_externalnotification_enabled_description
import org.meshtastic.core.resources.schema_externalnotification_output
import org.meshtastic.core.resources.schema_externalnotification_output_buzzer
import org.meshtastic.core.resources.schema_externalnotification_output_buzzer_description
import org.meshtastic.core.resources.schema_externalnotification_output_description
import org.meshtastic.core.resources.schema_externalnotification_output_vibra
import org.meshtastic.core.resources.schema_externalnotification_output_vibra_description
import org.meshtastic.core.resources.schema_externalnotification_use_i2s_as_buzzer
import org.meshtastic.core.resources.schema_externalnotification_use_i2s_as_buzzer_description
import org.meshtastic.core.resources.schema_externalnotification_use_pwm
import org.meshtastic.core.resources.schema_externalnotification_use_pwm_description
import org.meshtastic.core.ui.component.DropDownPreference
import org.meshtastic.core.ui.component.EditTextPreference
import org.meshtastic.core.ui.component.SwitchPreference
@@ -107,6 +120,7 @@ fun ExternalNotificationConfigScreenCommon(
TitledCard(title = stringResource(Res.string.external_notification_config)) {
SwitchPreference(
title = stringResource(Res.string.schema_externalnotification_enabled),
summary = stringResource(Res.string.schema_externalnotification_enabled_description),
checked = formState.value.enabled,
enabled = state.connected,
onCheckedChange = {
@@ -121,6 +135,7 @@ fun ExternalNotificationConfigScreenCommon(
TitledCard(title = stringResource(Res.string.notifications_on_message_receipt)) {
SwitchPreference(
title = stringResource(Res.string.schema_externalnotification_alert_message),
summary = stringResource(Res.string.schema_externalnotification_alert_message_description),
checked = formState.value.alert_message,
enabled = state.connected,
onCheckedChange = {
@@ -131,6 +146,7 @@ fun ExternalNotificationConfigScreenCommon(
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_externalnotification_alert_message_buzzer),
summary = stringResource(Res.string.schema_externalnotification_alert_message_buzzer_description),
checked = formState.value.alert_message_buzzer,
enabled = state.connected,
onCheckedChange = {
@@ -142,6 +158,7 @@ fun ExternalNotificationConfigScreenCommon(
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_externalnotification_alert_message_vibra),
summary = stringResource(Res.string.schema_externalnotification_alert_message_vibra_description),
checked = formState.value.alert_message_vibra,
enabled = state.connected,
onCheckedChange = {
@@ -157,6 +174,7 @@ fun ExternalNotificationConfigScreenCommon(
TitledCard(title = stringResource(Res.string.notifications_on_alert_bell_receipt)) {
SwitchPreference(
title = stringResource(Res.string.schema_externalnotification_alert_bell),
summary = stringResource(Res.string.schema_externalnotification_alert_bell_description),
checked = formState.value.alert_bell,
enabled = state.connected,
onCheckedChange = {
@@ -167,6 +185,7 @@ fun ExternalNotificationConfigScreenCommon(
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_externalnotification_alert_bell_buzzer),
summary = stringResource(Res.string.schema_externalnotification_alert_bell_buzzer_description),
checked = formState.value.alert_bell_buzzer,
enabled = state.connected,
onCheckedChange = {
@@ -177,6 +196,7 @@ fun ExternalNotificationConfigScreenCommon(
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_externalnotification_alert_bell_vibra),
summary = stringResource(Res.string.schema_externalnotification_alert_bell_vibra_description),
checked = formState.value.alert_bell_vibra,
enabled = state.connected,
onCheckedChange = {
@@ -192,6 +212,7 @@ fun ExternalNotificationConfigScreenCommon(
val gpio = remember { org.meshtastic.feature.settings.util.gpioPins }
DropDownPreference(
title = stringResource(Res.string.schema_externalnotification_output),
summary = stringResource(Res.string.schema_externalnotification_output_description),
items = gpio,
selectedItem = formState.value.output.toLong(),
enabled = state.connected,
@@ -203,6 +224,7 @@ fun ExternalNotificationConfigScreenCommon(
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_externalnotification_active),
summary = stringResource(Res.string.schema_externalnotification_active_description),
checked = formState.value.active,
enabled = state.connected,
onCheckedChange = {
@@ -214,6 +236,7 @@ fun ExternalNotificationConfigScreenCommon(
HorizontalDivider()
DropDownPreference(
title = stringResource(Res.string.schema_externalnotification_output_buzzer),
summary = stringResource(Res.string.schema_externalnotification_output_buzzer_description),
items = gpio,
selectedItem = formState.value.output_buzzer.toLong(),
enabled = state.connected,
@@ -226,6 +249,7 @@ fun ExternalNotificationConfigScreenCommon(
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_externalnotification_use_pwm),
summary = stringResource(Res.string.schema_externalnotification_use_pwm_description),
checked = formState.value.use_pwm,
enabled = state.connected,
onCheckedChange = {
@@ -237,6 +261,7 @@ fun ExternalNotificationConfigScreenCommon(
HorizontalDivider()
DropDownPreference(
title = stringResource(Res.string.schema_externalnotification_output_vibra),
summary = stringResource(Res.string.schema_externalnotification_output_vibra_description),
items = gpio,
selectedItem = formState.value.output_vibra.toLong(),
enabled = state.connected,
@@ -290,6 +315,7 @@ fun ExternalNotificationConfigScreenCommon(
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_externalnotification_use_i2s_as_buzzer),
summary = stringResource(Res.string.schema_externalnotification_use_i2s_as_buzzer_description),
checked = formState.value.use_i2s_as_buzzer,
enabled = state.connected,
onCheckedChange = {
@@ -46,7 +46,6 @@ import org.meshtastic.core.resources.config_lora_modem_preset_summary
import org.meshtastic.core.resources.config_lora_region_summary
import org.meshtastic.core.resources.lora
import org.meshtastic.core.resources.options
import org.meshtastic.core.resources.region_frequency_plan
import org.meshtastic.core.resources.schema_lora_bandwidth
import org.meshtastic.core.resources.schema_lora_channel_num
import org.meshtastic.core.resources.schema_lora_channel_num_description
@@ -55,15 +54,22 @@ import org.meshtastic.core.resources.schema_lora_config_ok_to_mqtt
import org.meshtastic.core.resources.schema_lora_hop_limit
import org.meshtastic.core.resources.schema_lora_hop_limit_description
import org.meshtastic.core.resources.schema_lora_ignore_mqtt
import org.meshtastic.core.resources.schema_lora_ignore_mqtt_description
import org.meshtastic.core.resources.schema_lora_modem_preset
import org.meshtastic.core.resources.schema_lora_override_duty_cycle
import org.meshtastic.core.resources.schema_lora_override_frequency
import org.meshtastic.core.resources.schema_lora_pa_fan_disabled
import org.meshtastic.core.resources.schema_lora_region
import org.meshtastic.core.resources.schema_lora_spread_factor
import org.meshtastic.core.resources.schema_lora_spread_factor_description
import org.meshtastic.core.resources.schema_lora_sx126x_rx_boosted_gain
import org.meshtastic.core.resources.schema_lora_sx126x_rx_boosted_gain_description
import org.meshtastic.core.resources.schema_lora_tx_enabled
import org.meshtastic.core.resources.schema_lora_tx_enabled_description
import org.meshtastic.core.resources.schema_lora_tx_power
import org.meshtastic.core.resources.schema_lora_tx_power_description
import org.meshtastic.core.resources.schema_lora_use_preset
import org.meshtastic.core.resources.schema_lora_use_preset_description
import org.meshtastic.core.ui.component.DropDownItem
import org.meshtastic.core.ui.component.DropDownPreference
import org.meshtastic.core.ui.component.EditTextPreference
@@ -180,7 +186,7 @@ fun LoRaConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
}
val presetsGated = presetConstraint?.isGated(state.localIsLicensed) == true
DropDownPreference(
title = stringResource(Res.string.region_frequency_plan),
title = stringResource(Res.string.schema_lora_region),
summary = stringResource(Res.string.config_lora_region_summary),
enabled = state.connected,
items =
@@ -210,6 +216,7 @@ fun LoRaConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_lora_use_preset),
summary = stringResource(Res.string.schema_lora_use_preset_description),
checked = formState.value.use_preset,
enabled = state.connected,
onCheckedChange = {
@@ -258,6 +265,7 @@ fun LoRaConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
TitledCard(title = stringResource(Res.string.advanced)) {
SwitchPreference(
title = stringResource(Res.string.schema_lora_ignore_mqtt),
summary = stringResource(Res.string.schema_lora_ignore_mqtt_description),
checked = formState.value.ignore_mqtt,
enabled = state.connected,
onCheckedChange = {
@@ -278,6 +286,7 @@ fun LoRaConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_lora_tx_enabled),
summary = stringResource(Res.string.schema_lora_tx_enabled_description),
checked = formState.value.tx_enabled,
enabled = state.connected,
onCheckedChange = {
@@ -334,6 +343,7 @@ fun LoRaConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_lora_sx126x_rx_boosted_gain),
summary = stringResource(Res.string.schema_lora_sx126x_rx_boosted_gain_description),
checked = formState.value.sx126x_rx_boosted_gain,
enabled = state.connected,
onCheckedChange = {
@@ -362,6 +372,7 @@ fun LoRaConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
SignedIntegerEditTextPreference(
title = stringResource(Res.string.schema_lora_tx_power),
summary = stringResource(Res.string.schema_lora_tx_power_description),
value = formState.value.tx_power,
enabled = state.connected,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
@@ -406,6 +417,7 @@ private fun ManualModemSettings(
HorizontalDivider()
EditTextPreference(
title = stringResource(Res.string.schema_lora_spread_factor),
summary = stringResource(Res.string.schema_lora_spread_factor_description),
value = config.spread_factor,
enabled = enabled,
isError = config.spread_factor !in SPREAD_FACTOR_RANGE,
@@ -55,7 +55,6 @@ import org.meshtastic.core.model.MqttProbeStatus
import org.meshtastic.core.network.repository.effectiveTlsEnabled
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.json_output_enabled
import org.meshtastic.core.resources.map_reporting
import org.meshtastic.core.resources.mqtt
import org.meshtastic.core.resources.mqtt_config
import org.meshtastic.core.resources.mqtt_probe_dns_failure
@@ -79,14 +78,21 @@ import org.meshtastic.core.resources.mqtt_status_reconnecting_with_attempt
import org.meshtastic.core.resources.mqtt_status_topics_refused_all
import org.meshtastic.core.resources.mqtt_status_topics_refused_some
import org.meshtastic.core.resources.mqtt_test_connection
import org.meshtastic.core.resources.password
import org.meshtastic.core.resources.schema_mqtt_address
import org.meshtastic.core.resources.schema_mqtt_address_description
import org.meshtastic.core.resources.schema_mqtt_enabled
import org.meshtastic.core.resources.schema_mqtt_enabled_description
import org.meshtastic.core.resources.schema_mqtt_encryption_enabled
import org.meshtastic.core.resources.schema_mqtt_encryption_enabled_description
import org.meshtastic.core.resources.schema_mqtt_map_reporting_enabled
import org.meshtastic.core.resources.schema_mqtt_password
import org.meshtastic.core.resources.schema_mqtt_proxy_to_client_enabled
import org.meshtastic.core.resources.schema_mqtt_proxy_to_client_enabled_description
import org.meshtastic.core.resources.schema_mqtt_root
import org.meshtastic.core.resources.schema_mqtt_root_description
import org.meshtastic.core.resources.schema_mqtt_tls_enabled
import org.meshtastic.core.resources.schema_mqtt_username
import org.meshtastic.core.resources.tls_enabled
import org.meshtastic.core.resources.schema_mqtt_username_description
import org.meshtastic.core.resources.tls_enabled_public_broker_summary
import org.meshtastic.core.ui.component.EditPasswordPreference
import org.meshtastic.core.ui.component.EditTextPreference
@@ -172,6 +178,7 @@ fun MQTTConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
TitledCard(title = stringResource(Res.string.mqtt_config)) {
SwitchPreference(
title = stringResource(Res.string.schema_mqtt_enabled),
summary = stringResource(Res.string.schema_mqtt_enabled_description),
checked = formState.value.enabled,
enabled = state.connected,
onCheckedChange = {
@@ -191,6 +198,7 @@ fun MQTTConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
EditTextPreference(
title = stringResource(Res.string.schema_mqtt_username),
summary = stringResource(Res.string.schema_mqtt_username_description),
value = formState.value.username,
maxSize = 63, // username max_size:64
enabled = state.connected,
@@ -204,7 +212,7 @@ fun MQTTConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
)
HorizontalDivider()
EditPasswordPreference(
title = stringResource(Res.string.password),
title = stringResource(Res.string.schema_mqtt_password),
value = formState.value.password,
maxSize = 63, // password max_size:64
enabled = state.connected,
@@ -216,6 +224,7 @@ fun MQTTConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_mqtt_encryption_enabled),
summary = stringResource(Res.string.schema_mqtt_encryption_enabled_description),
checked = formState.value.encryption_enabled,
enabled = state.connected,
onCheckedChange = {
@@ -247,6 +256,7 @@ fun MQTTConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
EditTextPreference(
title = stringResource(Res.string.schema_mqtt_root),
summary = stringResource(Res.string.schema_mqtt_root_description),
value = formState.value.root,
maxSize = 31, // root max_size:32
enabled = state.connected,
@@ -261,6 +271,7 @@ fun MQTTConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_mqtt_proxy_to_client_enabled),
summary = stringResource(Res.string.schema_mqtt_proxy_to_client_enabled_description),
checked = formState.value.proxy_to_client_enabled,
enabled = state.connected,
onCheckedChange = {
@@ -273,7 +284,7 @@ fun MQTTConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
}
item {
TitledCard(title = stringResource(Res.string.map_reporting)) {
TitledCard(title = stringResource(Res.string.schema_mqtt_map_reporting_enabled)) {
val mapReportSettings =
formState.value.map_report_settings ?: ModuleConfig.MapReportSettings.Builder().build()
MapReportingPreference(
@@ -332,7 +343,7 @@ internal fun MqttTlsPreference(
val resolvedAddress = address.ifEmpty { DEFAULT_MQTT_ADDRESS }
val relayForcesTls = effectiveTlsEnabled(resolvedAddress, tlsEnabled = false)
SwitchPreference(
title = stringResource(Res.string.tls_enabled),
title = stringResource(Res.string.schema_mqtt_tls_enabled),
summary = if (relayForcesTls) stringResource(Res.string.tls_enabled_public_broker_summary) else "",
checked = tlsEnabled,
enabled = enabled,
@@ -408,6 +419,7 @@ private fun MqttAddressAndProbe(
) {
EditTextPreference(
title = stringResource(Res.string.schema_mqtt_address),
summary = stringResource(Res.string.schema_mqtt_address_description),
value = formState.value.address,
maxSize = 63, // address max_size:64
enabled = enabled,
@@ -45,11 +45,11 @@ import org.meshtastic.core.model.util.toDistanceString
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.i_agree
import org.meshtastic.core.resources.i_agree_to_share_my_location
import org.meshtastic.core.resources.map_reporting
import org.meshtastic.core.resources.map_reporting_consent_header
import org.meshtastic.core.resources.map_reporting_consent_text
import org.meshtastic.core.resources.map_reporting_interval_seconds
import org.meshtastic.core.resources.map_reporting_summary
import org.meshtastic.core.resources.schema_mqtt_map_reporting_enabled
import org.meshtastic.core.resources.schema_mqtt_map_reporting_enabled_description
import org.meshtastic.core.ui.component.DropDownPreference
import org.meshtastic.core.ui.component.SwitchPreference
import org.meshtastic.feature.settings.util.FixedUpdateIntervals
@@ -78,8 +78,8 @@ fun MapReportingPreference(
// [mapReportingEnabled] so an externally-changed config wins over a stale local toggle.
var showMapReportingWarning by rememberSaveable(mapReportingEnabled) { mutableStateOf(mapReportingEnabled) }
SwitchPreference(
title = stringResource(Res.string.map_reporting),
summary = stringResource(Res.string.map_reporting_summary),
title = stringResource(Res.string.schema_mqtt_map_reporting_enabled),
summary = stringResource(Res.string.schema_mqtt_map_reporting_enabled_description),
checked = showMapReportingWarning,
enabled = enabled,
onCheckedChange = { checked ->
@@ -48,7 +48,6 @@ import org.meshtastic.core.resources.mesh_beacon_interval
import org.meshtastic.core.resources.mesh_beacon_interval_error
import org.meshtastic.core.resources.mesh_beacon_listen
import org.meshtastic.core.resources.mesh_beacon_listen_summary
import org.meshtastic.core.resources.mesh_beacon_message
import org.meshtastic.core.resources.mesh_beacon_no_channels
import org.meshtastic.core.resources.mesh_beacon_offer_channel_name
import org.meshtastic.core.resources.mesh_beacon_on_preset
@@ -61,6 +60,7 @@ import org.meshtastic.core.resources.mesh_beacon_target_default
import org.meshtastic.core.resources.mesh_beacon_target_remove
import org.meshtastic.core.resources.mesh_beacon_targets
import org.meshtastic.core.resources.plurals_seconds
import org.meshtastic.core.resources.schema_meshbeacon_broadcast_message
import org.meshtastic.core.ui.component.DropDownItem
import org.meshtastic.core.ui.component.DropDownPreference
import org.meshtastic.core.ui.component.EditTextPreference
@@ -238,7 +238,7 @@ fun MeshBeaconConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit,
if (broadcastGate.sectionsVisible) {
HorizontalDivider()
EditTextPreference(
title = stringResource(Res.string.mesh_beacon_message),
title = stringResource(Res.string.schema_meshbeacon_broadcast_message),
value = formState.value.broadcast_message,
maxSize = MESSAGE_MAX_BYTES,
enabled = broadcastGate.sectionsEnabled,
@@ -28,6 +28,7 @@ import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.neighbor_info
import org.meshtastic.core.resources.neighbor_info_config
import org.meshtastic.core.resources.schema_neighborinfo_enabled
import org.meshtastic.core.resources.schema_neighborinfo_enabled_description
import org.meshtastic.core.resources.schema_neighborinfo_transmit_over_lora
import org.meshtastic.core.resources.schema_neighborinfo_transmit_over_lora_description
import org.meshtastic.core.resources.update_interval_seconds
@@ -62,6 +63,7 @@ fun NeighborInfoConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit
TitledCard(title = stringResource(Res.string.neighbor_info_config)) {
SwitchPreference(
title = stringResource(Res.string.schema_neighborinfo_enabled),
summary = stringResource(Res.string.schema_neighborinfo_enabled_description),
checked = formState.value.enabled,
enabled = state.connected,
onCheckedChange = {
@@ -47,25 +47,28 @@ import org.meshtastic.core.resources.advanced
import org.meshtastic.core.resources.cancel
import org.meshtastic.core.resources.config_network_udp_enabled_summary
import org.meshtastic.core.resources.connection_status
import org.meshtastic.core.resources.dns
import org.meshtastic.core.resources.error
import org.meshtastic.core.resources.ethernet_config
import org.meshtastic.core.resources.ethernet_ip
import org.meshtastic.core.resources.gateway
import org.meshtastic.core.resources.network
import org.meshtastic.core.resources.nfc_disabled
import org.meshtastic.core.resources.open_settings
import org.meshtastic.core.resources.password
import org.meshtastic.core.resources.scan_nfc
import org.meshtastic.core.resources.schema_network_address_mode
import org.meshtastic.core.resources.schema_network_eth_enabled
import org.meshtastic.core.resources.schema_network_eth_enabled_description
import org.meshtastic.core.resources.schema_network_ipv4_dns
import org.meshtastic.core.resources.schema_network_ipv4_gateway
import org.meshtastic.core.resources.schema_network_ipv4_ip
import org.meshtastic.core.resources.schema_network_ipv4_subnet
import org.meshtastic.core.resources.schema_network_ntp_server
import org.meshtastic.core.resources.schema_network_ntp_server_description
import org.meshtastic.core.resources.schema_network_rsyslog_server
import org.meshtastic.core.resources.schema_network_wifi_enabled
import org.meshtastic.core.resources.schema_network_wifi_enabled_description
import org.meshtastic.core.resources.schema_network_wifi_psk
import org.meshtastic.core.resources.schema_network_wifi_ssid
import org.meshtastic.core.resources.subnet
import org.meshtastic.core.resources.schema_network_wifi_ssid_description
import org.meshtastic.core.resources.udp_enabled
import org.meshtastic.core.resources.wifi_config
import org.meshtastic.core.resources.wifi_ip
@@ -218,6 +221,7 @@ fun NetworkConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit, onO
HorizontalDivider()
EditTextPreference(
title = stringResource(Res.string.schema_network_wifi_ssid),
summary = stringResource(Res.string.schema_network_wifi_ssid_description),
value = formState.value.wifi_ssid,
maxSize = 32, // wifi_ssid max_size:33
enabled = state.connected,
@@ -231,7 +235,7 @@ fun NetworkConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit, onO
)
HorizontalDivider()
EditPasswordPreference(
title = stringResource(Res.string.password),
title = stringResource(Res.string.schema_network_wifi_psk),
value = formState.value.wifi_psk,
maxSize = 64, // wifi_psk max_size:65
enabled = state.connected,
@@ -275,6 +279,7 @@ fun NetworkConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit, onO
TitledCard(title = stringResource(Res.string.advanced)) {
EditTextPreference(
title = stringResource(Res.string.schema_network_ntp_server),
summary = stringResource(Res.string.schema_network_ntp_server_description),
value = formState.value.ntp_server,
maxSize = 32, // ntp_server max_size:33
enabled = state.connected,
@@ -336,7 +341,7 @@ fun NetworkConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit, onO
HorizontalDivider()
val ipv4 = formState.value.ipv4_config ?: Config.NetworkConfig.IpV4Config.Builder().build()
EditIPv4Preference(
title = stringResource(Res.string.wifi_ip),
title = stringResource(Res.string.schema_network_ipv4_ip),
value = ipv4.ip,
enabled = state.connected,
onValueChanged = {
@@ -350,7 +355,7 @@ fun NetworkConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit, onO
)
HorizontalDivider()
EditIPv4Preference(
title = stringResource(Res.string.gateway),
title = stringResource(Res.string.schema_network_ipv4_gateway),
value = ipv4.gateway,
enabled = state.connected,
onValueChanged = {
@@ -366,7 +371,7 @@ fun NetworkConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit, onO
)
HorizontalDivider()
EditIPv4Preference(
title = stringResource(Res.string.subnet),
title = stringResource(Res.string.schema_network_ipv4_subnet),
value = ipv4.subnet,
enabled = state.connected,
onValueChanged = {
@@ -382,7 +387,7 @@ fun NetworkConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit, onO
)
HorizontalDivider()
EditIPv4Preference(
title = stringResource(Res.string.dns),
title = stringResource(Res.string.schema_network_ipv4_dns),
value = ipv4.dns,
enabled = state.connected,
onValueChanged = {
@@ -29,8 +29,11 @@ import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.paxcounter
import org.meshtastic.core.resources.paxcounter_config
import org.meshtastic.core.resources.schema_paxcounter_ble_threshold
import org.meshtastic.core.resources.schema_paxcounter_ble_threshold_description
import org.meshtastic.core.resources.schema_paxcounter_enabled
import org.meshtastic.core.resources.schema_paxcounter_enabled_description
import org.meshtastic.core.resources.schema_paxcounter_wifi_threshold
import org.meshtastic.core.resources.schema_paxcounter_wifi_threshold_description
import org.meshtastic.core.resources.update_interval_seconds
import org.meshtastic.core.ui.component.DropDownPreference
import org.meshtastic.core.ui.component.SignedIntegerEditTextPreference
@@ -47,7 +50,6 @@ fun PaxcounterConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit)
val state by viewModel.radioConfigState.collectAsStateWithLifecycle()
val paxcounterConfig = state.moduleConfig.paxcounter ?: ModuleConfig.PaxcounterConfig.Builder().build()
val formState = rememberConfigState(initialValue = paxcounterConfig)
val focusManager = LocalFocusManager.current
RadioConfigScreenList(
rebootBehavior = RebootBehavior.ALWAYS,
@@ -62,53 +64,55 @@ fun PaxcounterConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit)
viewModel.setModuleConfig(config)
},
) {
item {
TitledCard(title = stringResource(Res.string.paxcounter_config)) {
SwitchPreference(
title = stringResource(Res.string.schema_paxcounter_enabled),
checked = formState.value.enabled,
enabled = state.connected,
onCheckedChange = {
formState.value = formState.value.newBuilder().also { wb -> wb.enabled = it }.build()
},
containerColor = CardDefaults.cardColors().containerColor,
)
HorizontalDivider()
val items = remember { IntervalConfiguration.PAX_COUNTER.allowedIntervals }
DropDownPreference(
title = stringResource(Res.string.update_interval_seconds),
selectedItem = (formState.value.paxcounter_update_interval).toLong(),
enabled = state.connected,
items = items.map { it.value to it.toDisplayString() },
onItemSelected = {
formState.value =
formState.value
.newBuilder()
.also { wb -> wb.paxcounter_update_interval = it.toInt() }
.build()
},
)
HorizontalDivider()
SignedIntegerEditTextPreference(
title = stringResource(Res.string.schema_paxcounter_wifi_threshold),
value = formState.value.wifi_threshold,
enabled = state.connected,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
onValueChanged = {
formState.value = formState.value.newBuilder().also { wb -> wb.wifi_threshold = it }.build()
},
)
HorizontalDivider()
SignedIntegerEditTextPreference(
title = stringResource(Res.string.schema_paxcounter_ble_threshold),
value = formState.value.ble_threshold,
enabled = state.connected,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
onValueChanged = {
formState.value = formState.value.newBuilder().also { wb -> wb.ble_threshold = it }.build()
},
)
}
}
item { PaxcounterSettings(formState = formState, enabled = state.connected) }
}
}
@Composable
private fun PaxcounterSettings(formState: ConfigState<ModuleConfig.PaxcounterConfig>, enabled: Boolean) {
val focusManager = LocalFocusManager.current
TitledCard(title = stringResource(Res.string.paxcounter_config)) {
SwitchPreference(
title = stringResource(Res.string.schema_paxcounter_enabled),
summary = stringResource(Res.string.schema_paxcounter_enabled_description),
checked = formState.value.enabled,
enabled = enabled,
onCheckedChange = { formState.value = formState.value.newBuilder().also { wb -> wb.enabled = it }.build() },
containerColor = CardDefaults.cardColors().containerColor,
)
HorizontalDivider()
val items = remember { IntervalConfiguration.PAX_COUNTER.allowedIntervals }
DropDownPreference(
title = stringResource(Res.string.update_interval_seconds),
selectedItem = (formState.value.paxcounter_update_interval).toLong(),
enabled = enabled,
items = items.map { it.value to it.toDisplayString() },
onItemSelected = {
formState.value =
formState.value.newBuilder().also { wb -> wb.paxcounter_update_interval = it.toInt() }.build()
},
)
HorizontalDivider()
SignedIntegerEditTextPreference(
title = stringResource(Res.string.schema_paxcounter_wifi_threshold),
summary = stringResource(Res.string.schema_paxcounter_wifi_threshold_description),
value = formState.value.wifi_threshold,
enabled = enabled,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
onValueChanged = {
formState.value = formState.value.newBuilder().also { wb -> wb.wifi_threshold = it }.build()
},
)
HorizontalDivider()
SignedIntegerEditTextPreference(
title = stringResource(Res.string.schema_paxcounter_ble_threshold),
summary = stringResource(Res.string.schema_paxcounter_ble_threshold_description),
value = formState.value.ble_threshold,
enabled = enabled,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
onValueChanged = {
formState.value = formState.value.newBuilder().also { wb -> wb.ble_threshold = it }.build()
},
)
}
}
@@ -33,7 +33,6 @@ import org.meshtastic.core.model.Position
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.advanced_device_gps
import org.meshtastic.core.resources.altitude
import org.meshtastic.core.resources.config_position_broadcast_smart_minimum_interval_secs_summary
import org.meshtastic.core.resources.device_gps
import org.meshtastic.core.resources.latitude
import org.meshtastic.core.resources.longitude
@@ -42,8 +41,11 @@ import org.meshtastic.core.resources.position_packet
import org.meshtastic.core.resources.schema_position_broadcast_smart_minimum_distance
import org.meshtastic.core.resources.schema_position_broadcast_smart_minimum_distance_description
import org.meshtastic.core.resources.schema_position_broadcast_smart_minimum_interval_secs
import org.meshtastic.core.resources.schema_position_broadcast_smart_minimum_interval_secs_description
import org.meshtastic.core.resources.schema_position_fixed_position
import org.meshtastic.core.resources.schema_position_fixed_position_description
import org.meshtastic.core.resources.schema_position_gps_en_gpio
import org.meshtastic.core.resources.schema_position_gps_en_gpio_description
import org.meshtastic.core.resources.schema_position_gps_mode
import org.meshtastic.core.resources.schema_position_gps_update_interval
import org.meshtastic.core.resources.schema_position_gps_update_interval_description
@@ -53,7 +55,9 @@ import org.meshtastic.core.resources.schema_position_position_broadcast_smart_en
import org.meshtastic.core.resources.schema_position_position_flags
import org.meshtastic.core.resources.schema_position_position_flags_description
import org.meshtastic.core.resources.schema_position_rx_gpio
import org.meshtastic.core.resources.schema_position_rx_gpio_description
import org.meshtastic.core.resources.schema_position_tx_gpio
import org.meshtastic.core.resources.schema_position_tx_gpio_description
import org.meshtastic.core.ui.component.BitwisePreference
import org.meshtastic.core.ui.component.DropDownPreference
import org.meshtastic.core.ui.component.EditTextPreference
@@ -211,7 +215,9 @@ fun PositionConfigScreenCommon(viewModel: RadioConfigViewModel, onBack: () -> Un
DropDownPreference(
title = stringResource(Res.string.schema_position_broadcast_smart_minimum_interval_secs),
summary =
stringResource(Res.string.config_position_broadcast_smart_minimum_interval_secs_summary),
stringResource(
Res.string.schema_position_broadcast_smart_minimum_interval_secs_description,
),
enabled = state.connected,
items = smartItems.map { it to it.toDisplayString() },
selectedItem =
@@ -249,6 +255,7 @@ fun PositionConfigScreenCommon(viewModel: RadioConfigViewModel, onBack: () -> Un
TitledCard(title = stringResource(Res.string.device_gps)) {
SwitchPreference(
title = stringResource(Res.string.schema_position_fixed_position),
summary = stringResource(Res.string.schema_position_fixed_position_description),
checked = formState.value.fixed_position,
enabled = state.connected,
onCheckedChange = {
@@ -348,6 +355,7 @@ fun PositionConfigScreenCommon(viewModel: RadioConfigViewModel, onBack: () -> Un
val pins = remember { org.meshtastic.feature.settings.util.gpioPins }
DropDownPreference(
title = stringResource(Res.string.schema_position_rx_gpio),
summary = stringResource(Res.string.schema_position_rx_gpio_description),
enabled = state.connected,
items = pins,
selectedItem = formState.value.rx_gpio,
@@ -358,6 +366,7 @@ fun PositionConfigScreenCommon(viewModel: RadioConfigViewModel, onBack: () -> Un
HorizontalDivider()
DropDownPreference(
title = stringResource(Res.string.schema_position_tx_gpio),
summary = stringResource(Res.string.schema_position_tx_gpio_description),
enabled = state.connected,
items = pins,
selectedItem = formState.value.tx_gpio,
@@ -368,6 +377,7 @@ fun PositionConfigScreenCommon(viewModel: RadioConfigViewModel, onBack: () -> Un
HorizontalDivider()
DropDownPreference(
title = stringResource(Res.string.schema_position_gps_en_gpio),
summary = stringResource(Res.string.schema_position_gps_en_gpio_description),
enabled = state.connected,
items = pins,
selectedItem = formState.value.gps_en_gpio,
@@ -35,6 +35,7 @@ import org.meshtastic.core.resources.schema_power_adc_multiplier_override
import org.meshtastic.core.resources.schema_power_is_power_saving
import org.meshtastic.core.resources.schema_power_is_power_saving_description
import org.meshtastic.core.resources.schema_power_on_battery_shutdown_after_secs
import org.meshtastic.core.resources.schema_power_on_battery_shutdown_after_secs_description
import org.meshtastic.core.resources.schema_power_wait_bluetooth_secs
import org.meshtastic.core.resources.super_deep_sleep_duration_seconds
import org.meshtastic.core.ui.component.DropDownPreference
@@ -81,6 +82,7 @@ fun PowerConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
val items = remember { IntervalConfiguration.ALL.allowedIntervals }
DropDownPreference(
title = stringResource(Res.string.schema_power_on_battery_shutdown_after_secs),
summary = stringResource(Res.string.schema_power_on_battery_shutdown_after_secs_description),
selectedItem = formState.value.on_battery_shutdown_after_secs.toLong(),
enabled = state.connected,
items = items.map { it.value to it.toDisplayString() },
@@ -27,7 +27,9 @@ import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.range_test
import org.meshtastic.core.resources.range_test_config
import org.meshtastic.core.resources.schema_rangetest_enabled
import org.meshtastic.core.resources.schema_rangetest_enabled_description
import org.meshtastic.core.resources.schema_rangetest_save
import org.meshtastic.core.resources.schema_rangetest_save_description
import org.meshtastic.core.resources.sender_message_interval_seconds
import org.meshtastic.core.ui.component.DropDownPreference
import org.meshtastic.core.ui.component.SwitchPreference
@@ -66,6 +68,7 @@ fun RangeTestConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
TitledCard(title = stringResource(Res.string.range_test_config)) {
SwitchPreference(
title = stringResource(Res.string.schema_rangetest_enabled),
summary = stringResource(Res.string.schema_rangetest_enabled_description),
checked = formState.value.enabled,
enabled = canConfigure || formState.value.enabled,
onCheckedChange = {
@@ -87,6 +90,7 @@ fun RangeTestConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_rangetest_save),
summary = stringResource(Res.string.schema_rangetest_save_description),
checked = formState.value.save,
enabled = canConfigure,
onCheckedChange = {
@@ -27,12 +27,19 @@ import org.jetbrains.compose.resources.stringResource
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.override_console_serial_port
import org.meshtastic.core.resources.schema_serial_baud
import org.meshtastic.core.resources.schema_serial_baud_description
import org.meshtastic.core.resources.schema_serial_echo
import org.meshtastic.core.resources.schema_serial_echo_description
import org.meshtastic.core.resources.schema_serial_enabled
import org.meshtastic.core.resources.schema_serial_enabled_description
import org.meshtastic.core.resources.schema_serial_mode
import org.meshtastic.core.resources.schema_serial_mode_description
import org.meshtastic.core.resources.schema_serial_rxd
import org.meshtastic.core.resources.schema_serial_rxd_description
import org.meshtastic.core.resources.schema_serial_timeout
import org.meshtastic.core.resources.schema_serial_timeout_description
import org.meshtastic.core.resources.schema_serial_txd
import org.meshtastic.core.resources.schema_serial_txd_description
import org.meshtastic.core.resources.serial
import org.meshtastic.core.resources.serial_config
import org.meshtastic.core.ui.component.DropDownPreference
@@ -67,6 +74,7 @@ fun SerialConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
TitledCard(title = stringResource(Res.string.serial_config)) {
SwitchPreference(
title = stringResource(Res.string.schema_serial_enabled),
summary = stringResource(Res.string.schema_serial_enabled_description),
checked = formState.value.enabled,
enabled = state.connected,
onCheckedChange = {
@@ -77,6 +85,7 @@ fun SerialConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_serial_echo),
summary = stringResource(Res.string.schema_serial_echo_description),
checked = formState.value.echo,
enabled = state.connected,
onCheckedChange = {
@@ -87,6 +96,7 @@ fun SerialConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
EditTextPreference(
title = stringResource(Res.string.schema_serial_rxd),
summary = stringResource(Res.string.schema_serial_rxd_description),
value = formState.value.rxd,
enabled = state.connected,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
@@ -97,6 +107,7 @@ fun SerialConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
EditTextPreference(
title = stringResource(Res.string.schema_serial_txd),
summary = stringResource(Res.string.schema_serial_txd_description),
value = formState.value.txd,
enabled = state.connected,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
@@ -107,6 +118,7 @@ fun SerialConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
DropDownPreference(
title = stringResource(Res.string.schema_serial_baud),
summary = stringResource(Res.string.schema_serial_baud_description),
enabled = state.connected,
selectedItem = formState.value.baud,
onItemSelected = {
@@ -116,6 +128,7 @@ fun SerialConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
EditTextPreference(
title = stringResource(Res.string.schema_serial_timeout),
summary = stringResource(Res.string.schema_serial_timeout_description),
value = formState.value.timeout,
enabled = state.connected,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
@@ -126,6 +139,7 @@ fun SerialConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
DropDownPreference(
title = stringResource(Res.string.schema_serial_mode),
summary = stringResource(Res.string.schema_serial_mode_description),
enabled = state.connected,
selectedItem = formState.value.mode,
onItemSelected = {
@@ -26,10 +26,13 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import org.jetbrains.compose.resources.stringResource
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.schema_storeforward_enabled
import org.meshtastic.core.resources.schema_storeforward_enabled_description
import org.meshtastic.core.resources.schema_storeforward_heartbeat
import org.meshtastic.core.resources.schema_storeforward_heartbeat_description
import org.meshtastic.core.resources.schema_storeforward_history_return_max
import org.meshtastic.core.resources.schema_storeforward_history_return_window
import org.meshtastic.core.resources.schema_storeforward_is_server
import org.meshtastic.core.resources.schema_storeforward_is_server_description
import org.meshtastic.core.resources.schema_storeforward_records
import org.meshtastic.core.resources.store_forward
import org.meshtastic.core.resources.store_forward_config
@@ -64,6 +67,7 @@ fun StoreForwardConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit
TitledCard(title = stringResource(Res.string.store_forward_config)) {
SwitchPreference(
title = stringResource(Res.string.schema_storeforward_enabled),
summary = stringResource(Res.string.schema_storeforward_enabled_description),
checked = formState.value.enabled,
enabled = state.connected,
onCheckedChange = {
@@ -74,6 +78,7 @@ fun StoreForwardConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_storeforward_heartbeat),
summary = stringResource(Res.string.schema_storeforward_heartbeat_description),
checked = formState.value.heartbeat,
enabled = state.connected,
onCheckedChange = {
@@ -115,6 +120,7 @@ fun StoreForwardConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_storeforward_is_server),
summary = stringResource(Res.string.schema_storeforward_is_server_description),
checked = formState.value.is_server,
enabled = state.connected,
onCheckedChange = {
@@ -61,9 +61,10 @@ import org.meshtastic.core.repository.TakPrefs
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.back
import org.meshtastic.core.resources.export_tak_data_package
import org.meshtastic.core.resources.schema_tak_role
import org.meshtastic.core.resources.schema_tak_team
import org.meshtastic.core.resources.tak
import org.meshtastic.core.resources.tak_config
import org.meshtastic.core.resources.tak_role
import org.meshtastic.core.resources.tak_server
import org.meshtastic.core.resources.tak_server_channel
import org.meshtastic.core.resources.tak_server_channel_desc
@@ -94,7 +95,6 @@ import org.meshtastic.core.resources.tak_server_test_results_v2
import org.meshtastic.core.resources.tak_server_test_run
import org.meshtastic.core.resources.tak_server_test_running
import org.meshtastic.core.resources.tak_server_v1_fallback_notice
import org.meshtastic.core.resources.tak_team
import org.meshtastic.core.takserver.TAKDataPackageGenerator
import org.meshtastic.core.takserver.TAKMeshIntegration
import org.meshtastic.core.takserver.TAKServerManager
@@ -170,7 +170,7 @@ internal fun TakConfigCard(
) {
TitledCard(title = stringResource(Res.string.tak_config)) {
DropDownPreference(
title = stringResource(Res.string.tak_team),
title = stringResource(Res.string.schema_tak_team),
enabled = enabled,
selectedItem = team,
itemColor = { Color(getColorFrom(it)) },
@@ -178,7 +178,7 @@ internal fun TakConfigCard(
)
HorizontalDivider()
DropDownPreference(
title = stringResource(Res.string.tak_role),
title = stringResource(Res.string.schema_tak_role),
enabled = enabled,
selectedItem = role,
onItemSelected = onRoleSelected,
@@ -26,17 +26,27 @@ import org.jetbrains.compose.resources.stringResource
import org.meshtastic.core.model.Capabilities
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.schema_telemetry_air_quality_enabled
import org.meshtastic.core.resources.schema_telemetry_air_quality_enabled_description
import org.meshtastic.core.resources.schema_telemetry_air_quality_interval
import org.meshtastic.core.resources.schema_telemetry_air_quality_interval_description
import org.meshtastic.core.resources.schema_telemetry_device_telemetry_enabled
import org.meshtastic.core.resources.schema_telemetry_device_telemetry_enabled_description
import org.meshtastic.core.resources.schema_telemetry_device_update_interval
import org.meshtastic.core.resources.schema_telemetry_device_update_interval_description
import org.meshtastic.core.resources.schema_telemetry_environment_display_fahrenheit
import org.meshtastic.core.resources.schema_telemetry_environment_display_fahrenheit_description
import org.meshtastic.core.resources.schema_telemetry_environment_measurement_enabled
import org.meshtastic.core.resources.schema_telemetry_environment_measurement_enabled_description
import org.meshtastic.core.resources.schema_telemetry_environment_screen_enabled
import org.meshtastic.core.resources.schema_telemetry_environment_screen_enabled_description
import org.meshtastic.core.resources.schema_telemetry_environment_update_interval
import org.meshtastic.core.resources.schema_telemetry_environment_update_interval_description
import org.meshtastic.core.resources.schema_telemetry_power_measurement_enabled
import org.meshtastic.core.resources.schema_telemetry_power_measurement_enabled_description
import org.meshtastic.core.resources.schema_telemetry_power_screen_enabled
import org.meshtastic.core.resources.schema_telemetry_power_screen_enabled_description
import org.meshtastic.core.resources.schema_telemetry_power_update_interval
import org.meshtastic.core.resources.schema_telemetry_power_update_interval_description
import org.meshtastic.core.resources.telemetry
import org.meshtastic.core.resources.telemetry_config
import org.meshtastic.core.ui.component.DropDownPreference
@@ -90,6 +100,7 @@ fun TelemetryConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
val items = remember { IntervalConfiguration.BROADCAST_SHORT.allowedIntervals }
DropDownPreference(
title = stringResource(Res.string.schema_telemetry_device_update_interval),
summary = stringResource(Res.string.schema_telemetry_device_update_interval_description),
selectedItem = formState.value.device_update_interval.toLong(),
enabled = state.connected,
items = items.map { it.value to it.toDisplayString() },
@@ -101,6 +112,7 @@ fun TelemetryConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_telemetry_environment_measurement_enabled),
summary = stringResource(Res.string.schema_telemetry_environment_measurement_enabled_description),
checked = formState.value.environment_measurement_enabled,
enabled = state.connected,
onCheckedChange = {
@@ -113,6 +125,7 @@ fun TelemetryConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
val envItems = remember { IntervalConfiguration.BROADCAST_SHORT.allowedIntervals }
DropDownPreference(
title = stringResource(Res.string.schema_telemetry_environment_update_interval),
summary = stringResource(Res.string.schema_telemetry_environment_update_interval_description),
selectedItem = formState.value.environment_update_interval.toLong(),
enabled = state.connected,
items = envItems.map { it.value to it.toDisplayString() },
@@ -127,6 +140,7 @@ fun TelemetryConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_telemetry_environment_screen_enabled),
summary = stringResource(Res.string.schema_telemetry_environment_screen_enabled_description),
checked = formState.value.environment_screen_enabled,
enabled = state.connected,
onCheckedChange = {
@@ -138,6 +152,7 @@ fun TelemetryConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_telemetry_environment_display_fahrenheit),
summary = stringResource(Res.string.schema_telemetry_environment_display_fahrenheit_description),
checked = formState.value.environment_display_fahrenheit,
enabled = state.connected,
onCheckedChange = {
@@ -149,6 +164,7 @@ fun TelemetryConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_telemetry_air_quality_enabled),
summary = stringResource(Res.string.schema_telemetry_air_quality_enabled_description),
checked = formState.value.air_quality_enabled,
enabled = state.connected,
onCheckedChange = {
@@ -161,6 +177,7 @@ fun TelemetryConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
val airItems = remember { IntervalConfiguration.BROADCAST_SHORT.allowedIntervals }
DropDownPreference(
title = stringResource(Res.string.schema_telemetry_air_quality_interval),
summary = stringResource(Res.string.schema_telemetry_air_quality_interval_description),
selectedItem = formState.value.air_quality_interval.toLong(),
enabled = state.connected,
items = airItems.map { it.value to it.toDisplayString() },
@@ -172,6 +189,7 @@ fun TelemetryConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_telemetry_power_measurement_enabled),
summary = stringResource(Res.string.schema_telemetry_power_measurement_enabled_description),
checked = formState.value.power_measurement_enabled,
enabled = state.connected,
onCheckedChange = {
@@ -184,6 +202,7 @@ fun TelemetryConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
val powerItems = remember { IntervalConfiguration.BROADCAST_SHORT.allowedIntervals }
DropDownPreference(
title = stringResource(Res.string.schema_telemetry_power_update_interval),
summary = stringResource(Res.string.schema_telemetry_power_update_interval_description),
selectedItem = formState.value.power_update_interval.toLong(),
enabled = state.connected,
items = powerItems.map { it.value to it.toDisplayString() },
@@ -195,6 +214,7 @@ fun TelemetryConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
HorizontalDivider()
SwitchPreference(
title = stringResource(Res.string.schema_telemetry_power_screen_enabled),
summary = stringResource(Res.string.schema_telemetry_power_screen_enabled_description),
checked = formState.value.power_screen_enabled,
enabled = state.connected,
onCheckedChange = {
@@ -25,8 +25,8 @@ import androidx.compose.ui.test.v2.runComposeUiTest
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.getString
import org.meshtastic.core.resources.i_agree
import org.meshtastic.core.resources.map_reporting
import org.meshtastic.core.resources.map_reporting_summary
import org.meshtastic.core.resources.schema_mqtt_map_reporting_enabled
import org.meshtastic.core.resources.schema_mqtt_map_reporting_enabled_description
import kotlin.test.Test
import kotlin.test.assertFalse
import kotlin.test.assertTrue
@@ -62,8 +62,8 @@ class MapReportingPreferenceTest {
}
}
// Verify that the dialog title is displayed
onNodeWithText(getString(Res.string.map_reporting)).assertIsDisplayed()
onNodeWithText(getString(Res.string.map_reporting_summary)).assertIsDisplayed()
onNodeWithText(getString(Res.string.schema_mqtt_map_reporting_enabled)).assertIsDisplayed()
onNodeWithText(getString(Res.string.schema_mqtt_map_reporting_enabled_description)).assertIsDisplayed()
}
@Test
@@ -84,14 +84,14 @@ class MapReportingPreferenceTest {
}
}
onNodeWithText(getString(Res.string.i_agree)).assertDoesNotExist()
onNodeWithText(getString(Res.string.map_reporting)).performClick()
onNodeWithText(getString(Res.string.schema_mqtt_map_reporting_enabled)).performClick()
assertFalse(mapReportingEnabled)
assertFalse(shouldReportLocation)
onNodeWithText(getString(Res.string.i_agree)).assertIsDisplayed()
onNodeWithText(getString(Res.string.i_agree)).performClick()
assertTrue(shouldReportLocation)
assertTrue(mapReportingEnabled)
onNodeWithText(getString(Res.string.map_reporting)).performClick()
onNodeWithText(getString(Res.string.schema_mqtt_map_reporting_enabled)).performClick()
onNodeWithText(getString(Res.string.i_agree)).assertDoesNotExist()
assertTrue(shouldReportLocation)
assertFalse(mapReportingEnabled)