From 30648086b4844db68b6b49a6003bb855bfeb0060 Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 29 Oct 2026 11:24:21 +0100 Subject: [PATCH] Contain remaining settings loader failures and remove retired UI scopes --- .../utun/chat/ui/screens/SettingsScreen.kt | 84 +++++++++---------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/SettingsScreen.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/SettingsScreen.kt index 54c48ad7..0cef3e89 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/SettingsScreen.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/SettingsScreen.kt @@ -62,16 +62,13 @@ import android.os.Build import android.provider.Settings import androidx.core.content.ContextCompat import androidx.lifecycle.compose.LifecycleResumeEffect -import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.CancellationException import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import kotlinx.coroutines.flow.first import java.util.UUID -import java.io.IOException private val LEVELS = listOf("DISABLED", "NONE", "ERROR", "WARN", "INFO", "DEBUG", "TRACE") private val PROTOCOLS = listOf("tcp", "udp") @@ -244,7 +241,6 @@ private fun StreamSettingsTab() { @Composable private fun GeneralSettingsTab(onDirty: (Boolean) -> Unit) { val provider = ChatApplication.instance.configProvider - val scope = rememberCoroutineScope() var nodeName by remember { mutableStateOf("") } var localInvitesEnabled by remember { mutableStateOf(provider.getInt("chat.local_invites_enabled") != 0) } var localBroadcastsEnabled by remember { mutableStateOf(provider.getInt("chat.local_broadcasts_enabled") != 0) } @@ -362,38 +358,41 @@ private fun DeveloperSettingsTab(vm: ChatViewModel, onDirty: (Boolean) -> Unit, } LaunchedEffect(Unit) { - listenPort = provider.getInt("node.listen_port").toString() - controlPort = provider.getInt("control.port").toString() - controlBindIp = provider.getString("control.bind_ip") ?: "127.0.0.1" - val allIface = listOf("lo" to "127.0.0.1") + provider.getAvailableInterfaces() - ctrlBindLabel = allIface.firstOrNull { it.second == controlBindIp }?.let { "${it.first} (${it.second})" } ?: "lo (127.0.0.1)" - debugLevel = provider.getString("debug.console_level") ?: "info" - logFile = provider.getString("debug.log_file") ?: "utun.log" - val udpLog = try { provider.getUdpLogSettings() } - catch (e: CancellationException) { throw e } - catch (e: Exception) { provider.changes.reportFailure("load network logging", e); null } - if (udpLog != null) { - logUdpEnabled = udpLog.enabled; logUdpIp = udpLog.ip; logUdpPort = udpLog.port.toString() - logUdpLoaded = true - LogManager.addLog("INFO", "UDPLog", "Settings loaded enabled=${udpLog.enabled} active=${udpLog.active}") - } - standbyActiveSec = provider.getInt("chat.standby_active_sec").toString() - standbySleepSec = provider.getInt("chat.standby_sleep_sec").toString() - standbyMinSleepSec = provider.getInt("chat.standby_min_sleep_sec").toString() - standbyKeepaliveMs = provider.getInt("chat.standby_keepalive_ms").toString() - val stored = provider.getString("debug.categories") ?: "" - catLevels = parseDebugPreferences(stored) - try { servers = provider.loadServersFromConfig().await() - serversLoaded = true - } catch (e: CancellationException) { throw e - } catch (e: Exception) { - LogManager.addLog("ERROR", "CFG", "load network settings failed: ${e.javaClass.simpleName}: ${e.message}") - configFailure = true - } - availableIfaces = allIface.drop(1) - connectionMode = provider.getConnectionMode() - autoSocketProtocols = provider.getAutoSocketProtocols() - autoConnect = provider.getInt("chat.group_autoconnect") != 0 + try { + listenPort = provider.getInt("node.listen_port").toString() + controlPort = provider.getInt("control.port").toString() + controlBindIp = provider.getString("control.bind_ip") ?: "127.0.0.1" + val allIface = listOf("lo" to "127.0.0.1") + provider.getAvailableInterfaces() + ctrlBindLabel = allIface.firstOrNull { it.second == controlBindIp }?.let { "${it.first} (${it.second})" } ?: "lo (127.0.0.1)" + debugLevel = provider.getString("debug.console_level") ?: "info" + logFile = provider.getString("debug.log_file") ?: "utun.log" + val udpLog = try { provider.getUdpLogSettings() } + catch (e: CancellationException) { throw e } + catch (e: Exception) { provider.changes.reportFailure("load network logging", e); null } + if (udpLog != null) { + logUdpEnabled = udpLog.enabled; logUdpIp = udpLog.ip; logUdpPort = udpLog.port.toString() + logUdpLoaded = true + LogManager.addLog("INFO", "UDPLog", "Settings loaded enabled=${udpLog.enabled} active=${udpLog.active}") + } + standbyActiveSec = provider.getInt("chat.standby_active_sec").toString() + standbySleepSec = provider.getInt("chat.standby_sleep_sec").toString() + standbyMinSleepSec = provider.getInt("chat.standby_min_sleep_sec").toString() + standbyKeepaliveMs = provider.getInt("chat.standby_keepalive_ms").toString() + val stored = provider.getString("debug.categories") ?: "" + catLevels = parseDebugPreferences(stored) + try { servers = provider.loadServersFromConfig().await() + serversLoaded = true + } catch (e: CancellationException) { throw e + } catch (e: Exception) { + LogManager.addLog("ERROR", "CFG", "load network settings failed: ${e.javaClass.simpleName}: ${e.message}") + configFailure = true + } + availableIfaces = allIface.drop(1) + connectionMode = provider.getConnectionMode() + autoSocketProtocols = provider.getAutoSocketProtocols() + autoConnect = provider.getInt("chat.group_autoconnect") != 0 + } catch (e: CancellationException) { throw e } + catch (e: Exception) { configFailure = true; provider.changes.reportFailure("load developer settings", e) } } val save: (List) -> Unit = { s -> @@ -871,7 +870,6 @@ private fun DeveloperSettingsTab(vm: ChatViewModel, onDirty: (Boolean) -> Unit, @Composable internal fun RadioAutomaticSettings(provider: ConfigProvider, compact: Boolean = false) { val engine = remember { RadioAudioEngine.instance() } - val scope = rememberCoroutineScope() val saved by remember { provider.changes.observe("radio automatic preferences", provider.radioAutoSettings) } .collectAsState(initial = remember { provider.getRadioAutoSettings() }) var draft by remember(saved) { mutableStateOf(saved) } @@ -1014,7 +1012,6 @@ internal fun RadioAutomaticSettings(provider: ConfigProvider, compact: Boolean = @Composable private fun RadioSettingsTab() { val provider = ChatApplication.instance.configProvider - val scope = rememberCoroutineScope() Column( modifier = Modifier.padding(16.dp).verticalScroll(rememberScrollState()), @@ -1183,7 +1180,6 @@ private fun RadioSettingsTab() { @OptIn(ExperimentalMaterial3Api::class) @Composable private fun AudioSettingsTab(vm: ChatViewModel) { - val scope = rememberCoroutineScope() val provider = ChatApplication.instance.configProvider /* Mic test state */ @@ -1456,16 +1452,18 @@ private fun AudioSettingsTab(vm: ChatViewModel) { @Composable private fun StorageSettingsTab() { val provider = ChatApplication.instance.configProvider - val scope = rememberCoroutineScope() var autoload by remember { mutableStateOf(true) } var autoloadMaxSizeMb by remember { mutableStateOf("100") } var maxStorageGb by remember { mutableStateOf("1") } LaunchedEffect(Unit) { - autoload = provider.getInt("chat.storage_autoload") != 0 - autoloadMaxSizeMb = provider.getInt("chat.storage_autoload_maxsize_mb").toString() - maxStorageGb = provider.getInt("chat.storage_maxsize_gb").toString() + try { + autoload = provider.getInt("chat.storage_autoload") != 0 + autoloadMaxSizeMb = provider.getInt("chat.storage_autoload_maxsize_mb").toString() + maxStorageGb = provider.getInt("chat.storage_maxsize_gb").toString() + } catch (e: CancellationException) { throw e } + catch (e: Exception) { provider.changes.reportFailure("load storage settings", e) } } Column(