diff --git a/.skills/compose-ui/strings-index.txt b/.skills/compose-ui/strings-index.txt index a904a74473..7c52a0d1f1 100644 --- a/.skills/compose-ui/strings-index.txt +++ b/.skills/compose-ui/strings-index.txt @@ -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 diff --git a/core/resources/src/commonMain/composeResources/values/strings.xml b/core/resources/src/commonMain/composeResources/values/strings.xml index 47ec0b6417..883fec89a9 100644 --- a/core/resources/src/commonMain/composeResources/values/strings.xml +++ b/core/resources/src/commonMain/composeResources/values/strings.xml @@ -268,7 +268,6 @@ Available modem presets, default is Long Fast. The region where you will be using your radios. Enable broadcasting packets via UDP over the local network. - The fastest that position updates will be sent if the minimum distance has been satisfied. The node is restarting and will be briefly unreachable. Used to create a shared key with a remote device. The device does not share its private key over remote administration. You can set a new key, but it can never be read back. @@ -485,7 +484,6 @@ Filter the node list and mesh map based on proximity to your phone. Distance Measurements Display the distance between your phone and other Meshtastic nodes with positions. - DNS Clear search system ai,gemini,assistant,functions,automation,voice @@ -738,7 +736,6 @@ Erase device during update Wipes the device's flash completely, then installs the selected firmware from scratch. Firmware version: %1$s - Fixed PIN Fixed Position For more information, see our privacy policy. @@ -752,7 +749,6 @@ Available system memory in bytes Freq Gas Resistance - Gateway Generate QR Code Geofence @@ -853,7 +849,6 @@ KML Network layer Learn more - LED Heartbeat Legacy Admin channel %1$d libraries License @@ -1007,11 +1002,9 @@ Weather radar SQL Cache purge failed, see logcat for details SQL Cache purged for %1$s - Map reporting Consent to Share Unencrypted Node Data via MQTT By enabling this feature, you acknowledge and expressly consent to the transmission of your device’s 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. Map reporting interval (seconds) - 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. Select download region Start Download Map style selection @@ -1042,7 +1035,6 @@ Mesh invitations Listen for beacons Capture invitations advertised by nearby meshes - Beacon message Maximum %1$d bytes No channels available A nearby mesh invited you to join @@ -1485,7 +1477,6 @@ Refresh metadata 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. Regenerate Private Key - Region Heard %1$d relay Heard %1$d relays @@ -1719,7 +1710,6 @@ Stop Connecting Store & Forward Store & Forward Config - Subnet Success Super deep sleep duration Supported @@ -1732,7 +1722,6 @@ TAK (ATAK) TAK Configuration - Member Role TAK Server TAK Mesh Channel Meshtastic channel used for outgoing TAK traffic @@ -1767,7 +1756,6 @@ Run Running: %1$s 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. - Team Color Telemetry Telemetry Config Temp @@ -1776,10 +1764,8 @@ Light System default Time - Time Zone Timeout Timestamp - TLS enabled 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. Toggle my position Trace Route diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/AmbientLightingConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/AmbientLightingConfigItemList.kt index 612fbf748c..11f1d2439a 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/AmbientLightingConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/AmbientLightingConfigItemList.kt @@ -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, diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/AudioConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/AudioConfigItemList.kt index 9b3f98fd23..21a7ae0c43 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/AudioConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/AudioConfigItemList.kt @@ -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 = { diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/BluetoothConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/BluetoothConfigItemList.kt index 4636e80655..d34541dbd0 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/BluetoothConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/BluetoothConfigItemList.kt @@ -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, diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/CannedMessageConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/CannedMessageConfigItemList.kt index ecc445db11..7ebf161a47 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/CannedMessageConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/CannedMessageConfigItemList.kt @@ -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 = { diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/DetectionSensorConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/DetectionSensorConfigItemList.kt index d7d2e8215e..9612930332 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/DetectionSensorConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/DetectionSensorConfigItemList.kt @@ -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 = { diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/DeviceConfigScreen.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/DeviceConfigScreen.kt index 6c5880dd09..76ec11e63e 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/DeviceConfigScreen.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/DeviceConfigScreen.kt @@ -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() }), diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/DisplayConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/DisplayConfigItemList.kt index 11d7d4e13b..226152dbb3 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/DisplayConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/DisplayConfigItemList.kt @@ -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 = { diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/ExternalNotificationConfigScreen.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/ExternalNotificationConfigScreen.kt index a283e81568..46cb0e7e50 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/ExternalNotificationConfigScreen.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/ExternalNotificationConfigScreen.kt @@ -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 = { diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/LoRaConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/LoRaConfigItemList.kt index 1cefa81175..ab4319115f 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/LoRaConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/LoRaConfigItemList.kt @@ -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, diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/MQTTConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/MQTTConfigItemList.kt index d72b9f6802..77145e57f8 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/MQTTConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/MQTTConfigItemList.kt @@ -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, diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreference.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreference.kt index 8c6e552932..44642ff0df 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreference.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreference.kt @@ -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 -> diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/MeshBeaconConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/MeshBeaconConfigItemList.kt index 80559fa785..33f0c69b25 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/MeshBeaconConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/MeshBeaconConfigItemList.kt @@ -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, diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/NeighborInfoConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/NeighborInfoConfigItemList.kt index 650d80d5d7..563fe944b4 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/NeighborInfoConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/NeighborInfoConfigItemList.kt @@ -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 = { diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/NetworkConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/NetworkConfigItemList.kt index 410e7584ef..e1f4a7c279 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/NetworkConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/NetworkConfigItemList.kt @@ -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 = { diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/PaxcounterConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/PaxcounterConfigItemList.kt index 7acb8193b7..def160d459 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/PaxcounterConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/PaxcounterConfigItemList.kt @@ -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, 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() + }, + ) } } diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/PositionConfigScreen.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/PositionConfigScreen.kt index 0a03797871..bf12bfcd29 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/PositionConfigScreen.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/PositionConfigScreen.kt @@ -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, diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/PowerConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/PowerConfigItemList.kt index 6457a79f38..7d54508c74 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/PowerConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/PowerConfigItemList.kt @@ -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() }, diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/RangeTestConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/RangeTestConfigItemList.kt index 761da4f57b..0367c7056f 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/RangeTestConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/RangeTestConfigItemList.kt @@ -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 = { diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/SerialConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/SerialConfigItemList.kt index 0e873df940..ff2f4c2dbb 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/SerialConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/SerialConfigItemList.kt @@ -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 = { diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/StoreForwardConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/StoreForwardConfigItemList.kt index 5d6ea61c87..50d38fc433 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/StoreForwardConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/StoreForwardConfigItemList.kt @@ -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 = { diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigItemList.kt index 21d7e8b26e..fb9f2101d5 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigItemList.kt @@ -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, diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TelemetryConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TelemetryConfigItemList.kt index 0a87990df6..768f5d3d55 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TelemetryConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TelemetryConfigItemList.kt @@ -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 = { diff --git a/feature/settings/src/commonTest/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreferenceTest.kt b/feature/settings/src/commonTest/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreferenceTest.kt index d2e2a529f2..862587015c 100644 --- a/feature/settings/src/commonTest/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreferenceTest.kt +++ b/feature/settings/src/commonTest/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreferenceTest.kt @@ -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) diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakConfigCard_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakConfigCard_Dark_d19fbf1f_0.png index a740fcdfe4..a2e2ad91d4 100644 Binary files a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakConfigCard_Dark_d19fbf1f_0.png and b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakConfigCard_Dark_d19fbf1f_0.png differ diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakConfigCard_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakConfigCard_Light_b29dc7a7_0.png index bfa18e3801..81ab288461 100644 Binary files a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakConfigCard_Light_b29dc7a7_0.png and b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakConfigCard_Light_b29dc7a7_0.png differ