Contain remaining settings loader failures and remove retired UI scopes

This commit is contained in:
evgeny committed 2026-10-29 13:35:41 +01:00
1 parent 828b36f290
commit 30648086b4
1 file changed
+41 -43
@@ -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<ServerEntry>) -> 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(