diff --git a/.skills/compose-ui/strings-index.txt b/.skills/compose-ui/strings-index.txt index fbb067f60..bf12fdb7c 100644 --- a/.skills/compose-ui/strings-index.txt +++ b/.skills/compose-ui/strings-index.txt @@ -1411,23 +1411,6 @@ traceroute_route_towards_dest traceroute_showing_nodes track_and_share_locations track_point -### TRAFFIC ### -traffic_management -traffic_management_config -traffic_management_drop_unknown_enabled -traffic_management_enabled -traffic_management_exhaust_hop_position -traffic_management_exhaust_hop_telemetry -traffic_management_nodeinfo_direct_response -traffic_management_nodeinfo_direct_response_max_hops -traffic_management_position_dedup -traffic_management_position_min_interval -traffic_management_position_precision -traffic_management_rate_limit_enabled -traffic_management_rate_limit_max_packets -traffic_management_rate_limit_window -traffic_management_router_preserve_hops -traffic_management_unknown_packet_threshold transmit_over_lora transport_ble transport_tcp diff --git a/core/domain/src/commonMain/kotlin/org/meshtastic/core/domain/usecase/settings/InstallProfileUseCase.kt b/core/domain/src/commonMain/kotlin/org/meshtastic/core/domain/usecase/settings/InstallProfileUseCase.kt index c48ba054d..b0f62c490 100644 --- a/core/domain/src/commonMain/kotlin/org/meshtastic/core/domain/usecase/settings/InstallProfileUseCase.kt +++ b/core/domain/src/commonMain/kotlin/org/meshtastic/core/domain/usecase/settings/InstallProfileUseCase.kt @@ -103,7 +103,6 @@ open class InstallProfileUseCase constructor(private val radioController: RadioC lmc.detection_sensor?.let { setModuleConfig(ModuleConfig(detection_sensor = it)) } lmc.paxcounter?.let { setModuleConfig(ModuleConfig(paxcounter = it)) } lmc.statusmessage?.let { setModuleConfig(ModuleConfig(statusmessage = it)) } - lmc.traffic_management?.let { setModuleConfig(ModuleConfig(traffic_management = it)) } lmc.tak?.let { setModuleConfig(ModuleConfig(tak = it)) } } } diff --git a/core/domain/src/commonTest/kotlin/org/meshtastic/core/domain/usecase/settings/InstallProfileUseCaseTest.kt b/core/domain/src/commonTest/kotlin/org/meshtastic/core/domain/usecase/settings/InstallProfileUseCaseTest.kt index fc191f210..689582d9b 100644 --- a/core/domain/src/commonTest/kotlin/org/meshtastic/core/domain/usecase/settings/InstallProfileUseCaseTest.kt +++ b/core/domain/src/commonTest/kotlin/org/meshtastic/core/domain/usecase/settings/InstallProfileUseCaseTest.kt @@ -42,7 +42,6 @@ import org.meshtastic.proto.ModuleConfig.StatusMessageConfig import org.meshtastic.proto.ModuleConfig.StoreForwardConfig import org.meshtastic.proto.ModuleConfig.TAKConfig import org.meshtastic.proto.ModuleConfig.TelemetryConfig -import org.meshtastic.proto.ModuleConfig.TrafficManagementConfig import org.meshtastic.proto.User import kotlin.test.BeforeTest import kotlin.test.Test @@ -99,7 +98,6 @@ class InstallProfileUseCaseTest { detection_sensor = DetectionSensorConfig(), paxcounter = PaxcounterConfig(), statusmessage = StatusMessageConfig(), - traffic_management = TrafficManagementConfig(), tak = TAKConfig(), ), fixed_position = org.meshtastic.proto.Position(), diff --git a/core/model/src/commonMain/kotlin/org/meshtastic/core/model/Capabilities.kt b/core/model/src/commonMain/kotlin/org/meshtastic/core/model/Capabilities.kt index 56d74b046..312a52ea6 100644 --- a/core/model/src/commonMain/kotlin/org/meshtastic/core/model/Capabilities.kt +++ b/core/model/src/commonMain/kotlin/org/meshtastic/core/model/Capabilities.kt @@ -52,9 +52,6 @@ data class Capabilities(val firmwareVersion: String?, internal val forceEnableAl /** Support for Status Message module. Supported since firmware v2.8.0. */ val supportsStatusMessage = atLeast(V2_8_0) - /** Support for Traffic Management module. Supported since firmware v2.8.0. */ - val supportsTrafficManagementConfig = atLeast(V2_8_0) - /** Support for TAK (ATAK) module configuration. Supported since firmware v2.7.19. */ val supportsTakConfig = atLeast(V2_7_19) diff --git a/core/model/src/commonTest/kotlin/org/meshtastic/core/model/CapabilitiesTest.kt b/core/model/src/commonTest/kotlin/org/meshtastic/core/model/CapabilitiesTest.kt index 2471d8964..8a9a131f2 100644 --- a/core/model/src/commonTest/kotlin/org/meshtastic/core/model/CapabilitiesTest.kt +++ b/core/model/src/commonTest/kotlin/org/meshtastic/core/model/CapabilitiesTest.kt @@ -73,12 +73,6 @@ class CapabilitiesTest { assertTrue(caps("2.8.0").supportsStatusMessage) } - @Test - fun supportsTrafficManagementConfig_requires_V2_8_0() { - assertFalse(caps("2.7.21").supportsTrafficManagementConfig) - assertTrue(caps("2.8.0").supportsTrafficManagementConfig) - } - @Test fun supportsTakConfig_requires_V2_7_19() { assertFalse(caps("2.7.18").supportsTakConfig) @@ -102,7 +96,6 @@ class CapabilitiesTest { assertFalse(c.supportsQrCodeSharing) assertFalse(c.supportsSecondaryChannelLocation) assertFalse(c.supportsStatusMessage) - assertFalse(c.supportsTrafficManagementConfig) assertFalse(c.supportsTakConfig) assertFalse(c.supportsEsp32Ota) } @@ -113,7 +106,6 @@ class CapabilitiesTest { assertTrue(c.canMuteNode) assertTrue(c.canSendVerifiedContacts) assertTrue(c.supportsStatusMessage) - assertTrue(c.supportsTrafficManagementConfig) assertTrue(c.supportsTakConfig) } } diff --git a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt index 6021b6f0e..af98567c3 100644 --- a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt +++ b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt @@ -230,7 +230,6 @@ object DeepLinkRouter { "detection-sensor" to SettingsRoute.DetectionSensor, "paxcounter" to SettingsRoute.Paxcounter, "status-message" to SettingsRoute.StatusMessage, - "traffic-management" to SettingsRoute.TrafficManagement, "tak" to SettingsRoute.TAK, "clean-node-db" to SettingsRoute.CleanNodeDb, "debug-panel" to SettingsRoute.DebugPanel, diff --git a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt index 9623a3c28..e412a2949 100644 --- a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt +++ b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt @@ -150,8 +150,6 @@ sealed interface SettingsRoute : Route { @Serializable data object StatusMessage : SettingsRoute - @Serializable data object TrafficManagement : SettingsRoute - @Serializable data object TAK : SettingsRoute // endregion diff --git a/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/DeepLinkRouterTest.kt b/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/DeepLinkRouterTest.kt index dbdb14581..d2f53a1ca 100644 --- a/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/DeepLinkRouterTest.kt +++ b/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/DeepLinkRouterTest.kt @@ -321,7 +321,6 @@ class DeepLinkRouterTest { "detection-sensor" to SettingsRoute.DetectionSensor, "paxcounter" to SettingsRoute.Paxcounter, "status-message" to SettingsRoute.StatusMessage, - "traffic-management" to SettingsRoute.TrafficManagement, "tak" to SettingsRoute.TAK, "clean-node-db" to SettingsRoute.CleanNodeDb, "debug-panel" to SettingsRoute.DebugPanel, diff --git a/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/NavigationConfigTest.kt b/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/NavigationConfigTest.kt index 2f7ae59af..64640e823 100644 --- a/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/NavigationConfigTest.kt +++ b/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/NavigationConfigTest.kt @@ -96,7 +96,6 @@ class NavigationConfigTest { SettingsRoute.DetectionSensor, SettingsRoute.Paxcounter, SettingsRoute.StatusMessage, - SettingsRoute.TrafficManagement, SettingsRoute.TAK, SettingsRoute.CleanNodeDb, SettingsRoute.DebugPanel, diff --git a/core/resources/src/commonMain/composeResources/values/strings.xml b/core/resources/src/commonMain/composeResources/values/strings.xml index 40221af04..294fc9a0b 100644 --- a/core/resources/src/commonMain/composeResources/values/strings.xml +++ b/core/resources/src/commonMain/composeResources/values/strings.xml @@ -1456,23 +1456,6 @@ Showing %1$d/%2$d nodes Track and Share Locations track point - - Traffic Management - Traffic Management Configuration - Drop Unknown Packets - Module Enabled - Local-only Position (Relays) - Local-only Telemetry (Relays) - NodeInfo Direct Response - Max Hops for Direct Response - Position Deduplication - Min Position Interval (secs) - Position Precision (bits) - Rate Limiting - Max Packets in Window - Rate Limit Window (secs) - Preserve Router Hops - Unknown Packet Threshold Transmit over LoRa BLE TCP diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Telemetry.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Telemetry.kt index 71a02d11b..58ba12396 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Telemetry.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Telemetry.kt @@ -21,7 +21,6 @@ import androidx.compose.ui.graphics.vector.ImageVector import org.jetbrains.compose.resources.vectorResource import org.meshtastic.core.resources.Res import org.meshtastic.core.resources.ic_air -import org.meshtastic.core.resources.ic_alt_route import org.meshtastic.core.resources.ic_blur_on import org.meshtastic.core.resources.ic_bolt import org.meshtastic.core.resources.ic_charging_station @@ -87,7 +86,5 @@ val MeshtasticIcons.LightMode: ImageVector @Composable get() = vectorResource(Res.drawable.ic_light_mode) val MeshtasticIcons.ChargingStation: ImageVector @Composable get() = vectorResource(Res.drawable.ic_charging_station) -val MeshtasticIcons.TrafficManagement: ImageVector - @Composable get() = vectorResource(Res.drawable.ic_alt_route) val MeshtasticIcons.VolumeUp: ImageVector @Composable get() = vectorResource(Res.drawable.ic_volume_up) diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/ModuleRoute.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/ModuleRoute.kt index f214d78d2..a5766e253 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/ModuleRoute.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/ModuleRoute.kt @@ -27,7 +27,6 @@ import org.meshtastic.core.resources.audio import org.meshtastic.core.resources.canned_message import org.meshtastic.core.resources.detection_sensor import org.meshtastic.core.resources.external_notification -import org.meshtastic.core.resources.ic_alt_route import org.meshtastic.core.resources.ic_cloud import org.meshtastic.core.resources.ic_data_usage import org.meshtastic.core.resources.ic_group @@ -51,7 +50,6 @@ import org.meshtastic.core.resources.status_message import org.meshtastic.core.resources.store_forward import org.meshtastic.core.resources.tak import org.meshtastic.core.resources.telemetry -import org.meshtastic.core.resources.traffic_management import org.meshtastic.proto.AdminMessage import org.meshtastic.proto.Config import org.meshtastic.proto.DeviceMetadata @@ -144,13 +142,6 @@ enum class ModuleRoute( AdminMessage.ModuleConfigType.STATUSMESSAGE_CONFIG.value, isSupported = { it.supportsStatusMessage }, ), - TRAFFIC_MANAGEMENT( - Res.string.traffic_management, - SettingsRoute.TrafficManagement, - Res.drawable.ic_alt_route, - AdminMessage.ModuleConfigType.TRAFFICMANAGEMENT_CONFIG.value, - isSupported = { it.supportsTrafficManagementConfig }, - ), TAK( Res.string.tak, SettingsRoute.TAK, @@ -192,9 +183,6 @@ enum class ModuleRoute( STATUS_MESSAGE -> 0x0000 - // Not excludable yet - TRAFFIC_MANAGEMENT -> 0x0000 - // Not excludable yet TAK -> 0x0000 // Not excludable yet } diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/SettingsNavigation.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/SettingsNavigation.kt index 5f81667bb..9725c1ced 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/SettingsNavigation.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/SettingsNavigation.kt @@ -71,7 +71,6 @@ import org.meshtastic.feature.settings.radio.component.StoreForwardConfigScreen import org.meshtastic.feature.settings.radio.component.TAKConfigScreen import org.meshtastic.feature.settings.radio.component.TakServerScreen import org.meshtastic.feature.settings.radio.component.TelemetryConfigScreen -import org.meshtastic.feature.settings.radio.component.TrafficManagementConfigScreen import org.meshtastic.feature.settings.radio.component.UserConfigScreen import kotlin.reflect.KClass @@ -213,12 +212,6 @@ fun EntryProviderScope.settingsGraph(backStack: NavBackStack) { ModuleRoute.STATUS_MESSAGE -> StatusMessageConfigScreen(viewModel, onBack = dropUnlessResumed { backStack.removeLastOrNull() }) - ModuleRoute.TRAFFIC_MANAGEMENT -> - TrafficManagementConfigScreen( - viewModel, - onBack = dropUnlessResumed { backStack.removeLastOrNull() }, - ) - ModuleRoute.TAK -> TAKConfigScreen(viewModel, onBack = dropUnlessResumed { backStack.removeLastOrNull() }) } diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/RadioConfigViewModel.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/RadioConfigViewModel.kt index b3a0823c1..87501cece 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/RadioConfigViewModel.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/RadioConfigViewModel.kt @@ -416,7 +416,6 @@ open class RadioConfigViewModel( detection_sensor = config.detection_sensor ?: state.moduleConfig.detection_sensor, paxcounter = config.paxcounter ?: state.moduleConfig.paxcounter, statusmessage = config.statusmessage ?: state.moduleConfig.statusmessage, - traffic_management = config.traffic_management ?: state.moduleConfig.traffic_management, tak = config.tak ?: state.moduleConfig.tak, ), ) @@ -796,8 +795,6 @@ open class RadioConfigViewModel( detection_sensor = response.detection_sensor ?: state.moduleConfig.detection_sensor, paxcounter = response.paxcounter ?: state.moduleConfig.paxcounter, statusmessage = response.statusmessage ?: state.moduleConfig.statusmessage, - traffic_management = - response.traffic_management ?: state.moduleConfig.traffic_management, tak = response.tak ?: state.moduleConfig.tak, ), ) diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TrafficManagementConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TrafficManagementConfigItemList.kt deleted file mode 100644 index 19f51e1ab..000000000 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TrafficManagementConfigItemList.kt +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (c) 2026 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.meshtastic.feature.settings.radio.component - -import androidx.compose.foundation.text.KeyboardActions -import androidx.compose.material3.CardDefaults -import androidx.compose.material3.HorizontalDivider -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.ui.platform.LocalFocusManager -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import org.jetbrains.compose.resources.stringResource -import org.meshtastic.core.resources.Res -import org.meshtastic.core.resources.traffic_management -import org.meshtastic.core.resources.traffic_management_config -import org.meshtastic.core.resources.traffic_management_drop_unknown_enabled -import org.meshtastic.core.resources.traffic_management_enabled -import org.meshtastic.core.resources.traffic_management_exhaust_hop_position -import org.meshtastic.core.resources.traffic_management_exhaust_hop_telemetry -import org.meshtastic.core.resources.traffic_management_nodeinfo_direct_response -import org.meshtastic.core.resources.traffic_management_nodeinfo_direct_response_max_hops -import org.meshtastic.core.resources.traffic_management_position_dedup -import org.meshtastic.core.resources.traffic_management_position_min_interval -import org.meshtastic.core.resources.traffic_management_position_precision -import org.meshtastic.core.resources.traffic_management_rate_limit_enabled -import org.meshtastic.core.resources.traffic_management_rate_limit_max_packets -import org.meshtastic.core.resources.traffic_management_rate_limit_window -import org.meshtastic.core.resources.traffic_management_router_preserve_hops -import org.meshtastic.core.resources.traffic_management_unknown_packet_threshold -import org.meshtastic.core.ui.component.EditTextPreference -import org.meshtastic.core.ui.component.SwitchPreference -import org.meshtastic.core.ui.component.TitledCard -import org.meshtastic.feature.settings.radio.RadioConfigViewModel -import org.meshtastic.proto.ModuleConfig - -@Suppress("LongMethod") -@Composable -fun TrafficManagementConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) { - val state by viewModel.radioConfigState.collectAsStateWithLifecycle() - val tmConfig = state.moduleConfig.traffic_management ?: ModuleConfig.TrafficManagementConfig() - val formState = rememberConfigState(initialValue = tmConfig) - val focusManager = LocalFocusManager.current - - LaunchedEffect(tmConfig) { formState.value = tmConfig } - - RadioConfigScreenList( - title = stringResource(Res.string.traffic_management), - onBack = onBack, - configState = formState, - enabled = state.connected, - responseState = state.responseState, - onDismissPacketResponse = viewModel::clearPacketResponse, - onSave = { - val config = ModuleConfig(traffic_management = it) - viewModel.setModuleConfig(config) - }, - ) { - item { - TitledCard(title = stringResource(Res.string.traffic_management_config)) { - SwitchPreference( - title = stringResource(Res.string.traffic_management_enabled), - checked = formState.value.enabled, - enabled = state.connected, - onCheckedChange = { formState.value = formState.value.copy(enabled = it) }, - containerColor = CardDefaults.cardColors().containerColor, - ) - HorizontalDivider() - SwitchPreference( - title = stringResource(Res.string.traffic_management_position_dedup), - checked = formState.value.position_dedup_enabled, - enabled = state.connected, - onCheckedChange = { formState.value = formState.value.copy(position_dedup_enabled = it) }, - containerColor = CardDefaults.cardColors().containerColor, - ) - HorizontalDivider() - EditTextPreference( - title = stringResource(Res.string.traffic_management_position_precision), - value = formState.value.position_precision_bits, - enabled = state.connected, - keyboardActions = - KeyboardActions( - onNext = { focusManager.moveFocus(androidx.compose.ui.focus.FocusDirection.Down) }, - ), - onValueChanged = { formState.value = formState.value.copy(position_precision_bits = it) }, - ) - HorizontalDivider() - EditTextPreference( - title = stringResource(Res.string.traffic_management_position_min_interval), - value = formState.value.position_min_interval_secs, - enabled = state.connected, - keyboardActions = - KeyboardActions( - onNext = { focusManager.moveFocus(androidx.compose.ui.focus.FocusDirection.Down) }, - ), - onValueChanged = { formState.value = formState.value.copy(position_min_interval_secs = it) }, - ) - HorizontalDivider() - SwitchPreference( - title = stringResource(Res.string.traffic_management_nodeinfo_direct_response), - checked = formState.value.nodeinfo_direct_response, - enabled = state.connected, - onCheckedChange = { formState.value = formState.value.copy(nodeinfo_direct_response = it) }, - containerColor = CardDefaults.cardColors().containerColor, - ) - HorizontalDivider() - EditTextPreference( - title = stringResource(Res.string.traffic_management_nodeinfo_direct_response_max_hops), - value = formState.value.nodeinfo_direct_response_max_hops, - enabled = state.connected, - keyboardActions = - KeyboardActions( - onNext = { focusManager.moveFocus(androidx.compose.ui.focus.FocusDirection.Down) }, - ), - onValueChanged = { formState.value = formState.value.copy(nodeinfo_direct_response_max_hops = it) }, - ) - HorizontalDivider() - SwitchPreference( - title = stringResource(Res.string.traffic_management_rate_limit_enabled), - checked = formState.value.rate_limit_enabled, - enabled = state.connected, - onCheckedChange = { formState.value = formState.value.copy(rate_limit_enabled = it) }, - containerColor = CardDefaults.cardColors().containerColor, - ) - HorizontalDivider() - EditTextPreference( - title = stringResource(Res.string.traffic_management_rate_limit_window), - value = formState.value.rate_limit_window_secs, - enabled = state.connected, - keyboardActions = - KeyboardActions( - onNext = { focusManager.moveFocus(androidx.compose.ui.focus.FocusDirection.Down) }, - ), - onValueChanged = { formState.value = formState.value.copy(rate_limit_window_secs = it) }, - ) - HorizontalDivider() - EditTextPreference( - title = stringResource(Res.string.traffic_management_rate_limit_max_packets), - value = formState.value.rate_limit_max_packets, - enabled = state.connected, - keyboardActions = - KeyboardActions( - onNext = { focusManager.moveFocus(androidx.compose.ui.focus.FocusDirection.Down) }, - ), - onValueChanged = { formState.value = formState.value.copy(rate_limit_max_packets = it) }, - ) - HorizontalDivider() - SwitchPreference( - title = stringResource(Res.string.traffic_management_drop_unknown_enabled), - checked = formState.value.drop_unknown_enabled, - enabled = state.connected, - onCheckedChange = { formState.value = formState.value.copy(drop_unknown_enabled = it) }, - containerColor = CardDefaults.cardColors().containerColor, - ) - HorizontalDivider() - EditTextPreference( - title = stringResource(Res.string.traffic_management_unknown_packet_threshold), - value = formState.value.unknown_packet_threshold, - enabled = state.connected, - keyboardActions = - KeyboardActions( - onNext = { focusManager.moveFocus(androidx.compose.ui.focus.FocusDirection.Down) }, - ), - onValueChanged = { formState.value = formState.value.copy(unknown_packet_threshold = it) }, - ) - HorizontalDivider() - SwitchPreference( - title = stringResource(Res.string.traffic_management_exhaust_hop_telemetry), - checked = formState.value.exhaust_hop_telemetry, - enabled = state.connected, - onCheckedChange = { formState.value = formState.value.copy(exhaust_hop_telemetry = it) }, - containerColor = CardDefaults.cardColors().containerColor, - ) - HorizontalDivider() - SwitchPreference( - title = stringResource(Res.string.traffic_management_exhaust_hop_position), - checked = formState.value.exhaust_hop_position, - enabled = state.connected, - onCheckedChange = { formState.value = formState.value.copy(exhaust_hop_position = it) }, - containerColor = CardDefaults.cardColors().containerColor, - ) - HorizontalDivider() - SwitchPreference( - title = stringResource(Res.string.traffic_management_router_preserve_hops), - checked = formState.value.router_preserve_hops, - enabled = state.connected, - onCheckedChange = { formState.value = formState.value.copy(router_preserve_hops = it) }, - containerColor = CardDefaults.cardColors().containerColor, - ) - } - } - } -}