From 2def49d539a6fa8dfecc05bf54f2a144492e514b Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 22 Sep 2026 16:53:46 +0000 Subject: [PATCH] feat(settings): read the labels and helper text the schema already has (#7302) --- .skills/compose-ui/strings-index.txt | 14 --- .../composeResources/values/strings.xml | 14 --- .../AmbientLightingConfigItemList.kt | 10 ++ .../radio/component/AudioConfigItemList.kt | 6 ++ .../component/BluetoothConfigItemList.kt | 8 +- .../component/CannedMessageConfigItemList.kt | 18 ++++ .../DetectionSensorConfigItemList.kt | 12 +++ .../radio/component/DeviceConfigScreen.kt | 18 ++-- .../radio/component/DisplayConfigItemList.kt | 2 + .../ExternalNotificationConfigScreen.kt | 26 +++++ .../radio/component/LoRaConfigItemList.kt | 16 ++- .../radio/component/MQTTConfigItemList.kt | 24 +++-- .../radio/component/MapReportingPreference.kt | 8 +- .../component/MeshBeaconConfigItemList.kt | 4 +- .../component/NeighborInfoConfigItemList.kt | 2 + .../radio/component/NetworkConfigItemList.kt | 23 ++-- .../component/PaxcounterConfigItemList.kt | 102 +++++++++--------- .../radio/component/PositionConfigScreen.kt | 14 ++- .../radio/component/PowerConfigItemList.kt | 2 + .../component/RangeTestConfigItemList.kt | 4 + .../radio/component/SerialConfigItemList.kt | 14 +++ .../component/StoreForwardConfigItemList.kt | 6 ++ .../radio/component/TAKConfigItemList.kt | 8 +- .../component/TelemetryConfigItemList.kt | 20 ++++ .../component/MapReportingPreferenceTest.kt | 12 +-- ...creenshotTakConfigCard_Dark_d19fbf1f_0.png | Bin 23863 -> 21397 bytes ...reenshotTakConfigCard_Light_b29dc7a7_0.png | Bin 23710 -> 21237 bytes 27 files changed, 267 insertions(+), 120 deletions(-) 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 a740fcdfe4edf0936d6eb9ff2674a3bbcdff994d..a2e2ad91d4c1c8c198dc650912b020aedcd5f4a9 100644 GIT binary patch literal 21397 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 literal 23863 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 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 bfa18e380114405b565f6271ceecd30c09d40c98..81ab288461a8b6397c0874717e8974ba6bddac94 100644 GIT binary patch literal 21237 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 Qfl3%WUHx3vIVCg!0QqYsI{*Lx literal 23710 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