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

-14
View File
@@ -244,7 +244,6 @@ config_lora_modem_preset_licensed_summary
config_lora_modem_preset_summary
config_lora_region_summary
config_network_udp_enabled_summary
config_position_broadcast_smart_minimum_interval_secs_summary
config_saved_restarting
config_security_private_key
config_security_private_key_remote
@@ -455,7 +454,6 @@ distance_filters
distance_filters_description
distance_measurements
distance_measurements_description
dns
### DOC ###
doc_clear_search
doc_keywords_app_functions
@@ -708,7 +706,6 @@ firmware_update_wipe_confirm_warning
firmware_update_wipe_label
firmware_update_wipe_usb_detail
firmware_version
fixed_pin
fixed_position
for_more_information_see_our_privacy_policy
### FORMAT ###
@@ -722,7 +719,6 @@ free_memory
free_memory_description
freq
gas_resistance
gateway
generate_qr_code
### GEOFENCE ###
geofence
@@ -823,7 +819,6 @@ layer_type_geojson
layer_type_kml
layer_type_network
learn_more
led_heartbeat
legacy_admin_channel
library_count
license
@@ -971,11 +966,9 @@ map_overlay_precipitation
map_overlay_weather_radar
map_purge_fail
map_purge_success
map_reporting
map_reporting_consent_header
map_reporting_consent_text
map_reporting_interval_seconds
map_reporting_summary
map_select_download_region
map_start_download
map_style_selection
@@ -1006,7 +999,6 @@ mesh_beacon_interval_error
mesh_beacon_invitations_title
mesh_beacon_listen
mesh_beacon_listen_summary
mesh_beacon_message
mesh_beacon_message_error
mesh_beacon_no_channels
mesh_beacon_notification_body
@@ -1437,7 +1429,6 @@ refresh
refresh_metadata
regenerate_keys_confirmation
regenerate_private_key
region_frequency_plan
relays
### REMOTE ###
remote
@@ -1668,7 +1659,6 @@ stay_connected_anywhere
stop_connecting
store_forward
store_forward_config
subnet
success
super_deep_sleep_duration_seconds
supported
@@ -1681,7 +1671,6 @@ system_settings
### TAK ###
tak
tak_config
tak_role
tak_server
tak_server_channel
tak_server_channel_desc
@@ -1713,7 +1702,6 @@ tak_server_test_results_v2
tak_server_test_run
tak_server_test_running
tak_server_v1_fallback_notice
tak_team
telemetry
telemetry_config
temperature
@@ -1722,10 +1710,8 @@ theme_dark
theme_light
theme_system
time
time_zone
timeout
timestamp
tls_enabled
tls_enabled_public_broker_summary
toggle_my_position
trace_route
@@ -268,7 +268,6 @@
<string name="config_lora_modem_preset_summary">Available modem presets, default is Long Fast.</string>
<string name="config_lora_region_summary">The region where you will be using your radios.</string>
<string name="config_network_udp_enabled_summary">Enable broadcasting packets via UDP over the local network.</string>
<string name="config_position_broadcast_smart_minimum_interval_secs_summary">The fastest that position updates will be sent if the minimum distance has been satisfied.</string>
<string name="config_saved_restarting">The node is restarting and will be briefly unreachable.</string>
<string name="config_security_private_key">Used to create a shared key with a remote device.</string>
<string name="config_security_private_key_remote">The device does not share its private key over remote administration. You can set a new key, but it can never be read back.</string>
@@ -485,7 +484,6 @@
<string name="distance_filters_description">Filter the node list and mesh map based on proximity to your phone.</string>
<string name="distance_measurements">Distance Measurements</string>
<string name="distance_measurements_description">Display the distance between your phone and other Meshtastic nodes with positions.</string>
<string name="dns">DNS</string>
<!-- DOC -->
<string name="doc_clear_search">Clear search</string>
<string name="doc_keywords_app_functions">system ai,gemini,assistant,functions,automation,voice</string>
@@ -738,7 +736,6 @@
<string name="firmware_update_wipe_label">Erase device during update</string>
<string name="firmware_update_wipe_usb_detail">Wipes the device's flash completely, then installs the selected firmware from scratch.</string>
<string name="firmware_version">Firmware version: %1$s</string>
<string name="fixed_pin">Fixed PIN</string>
<string name="fixed_position">Fixed Position</string>
<string name="for_more_information_see_our_privacy_policy">For more information, see our privacy policy.</string>
<!-- FORMAT -->
@@ -752,7 +749,6 @@
<string name="free_memory_description">Available system memory in bytes</string>
<string name="freq">Freq</string>
<string name="gas_resistance">Gas Resistance</string>
<string name="gateway">Gateway</string>
<string name="generate_qr_code">Generate QR Code</string>
<!-- GEOFENCE -->
<string name="geofence">Geofence</string>
@@ -853,7 +849,6 @@
<string name="layer_type_kml" translatable="false">KML</string>
<string name="layer_type_network">Network layer</string>
<string name="learn_more">Learn more</string>
<string name="led_heartbeat">LED Heartbeat</string>
<string name="legacy_admin_channel">Legacy Admin channel</string>
<string name="library_count">%1$d libraries</string>
<string name="license">License</string>
@@ -1007,11 +1002,9 @@
<string name="map_overlay_weather_radar">Weather radar</string>
<string name="map_purge_fail">SQL Cache purge failed, see logcat for details</string>
<string name="map_purge_success">SQL Cache purged for %1$s</string>
<string name="map_reporting">Map reporting</string>
<string name="map_reporting_consent_header">Consent to Share Unencrypted Node Data via MQTT</string>
<string name="map_reporting_consent_text">By enabling this feature, you acknowledge and expressly consent to the transmission of your devices real-time geographic location over the MQTT protocol without encryption. This location data may be used for purposes such as live map reporting, device tracking, and related telemetry functions.</string>
<string name="map_reporting_interval_seconds">Map reporting interval (seconds)</string>
<string name="map_reporting_summary">Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, long and short name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name.</string>
<string name="map_select_download_region">Select download region</string>
<string name="map_start_download">Start Download</string>
<string name="map_style_selection">Map style selection</string>
@@ -1042,7 +1035,6 @@
<string name="mesh_beacon_invitations_title">Mesh invitations</string>
<string name="mesh_beacon_listen">Listen for beacons</string>
<string name="mesh_beacon_listen_summary">Capture invitations advertised by nearby meshes</string>
<string name="mesh_beacon_message">Beacon message</string>
<string name="mesh_beacon_message_error">Maximum %1$d bytes</string>
<string name="mesh_beacon_no_channels">No channels available</string>
<string name="mesh_beacon_notification_body">A nearby mesh invited you to join</string>
@@ -1485,7 +1477,6 @@
<string name="refresh_metadata">Refresh metadata</string>
<string name="regenerate_keys_confirmation">Are you sure you want to regenerate your Private Key?\n\nNodes that may have previously exchanged keys with this node will need to Remove that node and re-exchange keys in order to resume secure communication.</string>
<string name="regenerate_private_key">Regenerate Private Key</string>
<string name="region_frequency_plan">Region</string>
<plurals name="relays">
<item quantity="one">Heard %1$d relay</item>
<item quantity="other">Heard %1$d relays</item>
@@ -1719,7 +1710,6 @@
<string name="stop_connecting">Stop Connecting</string>
<string name="store_forward">Store &amp; Forward</string>
<string name="store_forward_config">Store &amp; Forward Config</string>
<string name="subnet">Subnet</string>
<string name="success">Success</string>
<string name="super_deep_sleep_duration_seconds">Super deep sleep duration</string>
<string name="supported">Supported</string>
@@ -1732,7 +1722,6 @@
<!-- TAK -->
<string name="tak">TAK (ATAK)</string>
<string name="tak_config">TAK Configuration</string>
<string name="tak_role">Member Role</string>
<string name="tak_server">TAK Server</string>
<string name="tak_server_channel">TAK Mesh Channel</string>
<string name="tak_server_channel_desc">Meshtastic channel used for outgoing TAK traffic</string>
@@ -1767,7 +1756,6 @@
<string name="tak_server_test_run">Run</string>
<string name="tak_server_test_running">Running: %1$s</string>
<string name="tak_server_v1_fallback_notice">Connected node firmware doesn't support full TAK integration — only location and chat messages will bridge to ATAK. Markers and other event types need firmware 2.8.0 or newer.</string>
<string name="tak_team">Team Color</string>
<string name="telemetry">Telemetry</string>
<string name="telemetry_config">Telemetry Config</string>
<string name="temperature">Temp</string>
@@ -1776,10 +1764,8 @@
<string name="theme_light">Light</string>
<string name="theme_system">System default</string>
<string name="time">Time</string>
<string name="time_zone">Time Zone</string>
<string name="timeout">Timeout</string>
<string name="timestamp">Timestamp</string>
<string name="tls_enabled">TLS enabled</string>
<string name="tls_enabled_public_broker_summary">When this phone relays MQTT it always connects to mqtt.meshtastic.org over TLS. This setting applies when the radio reaches the broker over its own Wi-Fi or Ethernet.</string>
<string name="toggle_my_position">Toggle my position</string>
<string name="trace_route">Trace Route</string>
@@ -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)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 21 KiB