From e61dc8cd06e49d26ee103ded00b6a763348b3125 Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 19 Oct 2026 14:11:49 +0200 Subject: [PATCH] Wait for Android channel loading once before radio activation --- .../app/src/main/java/com/utun/chat/MainActivity.kt | 12 +++++++++--- .../java/com/utun/chat/ui/screens/RadioCallDialog.kt | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/MainActivity.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/MainActivity.kt index 45e7a66d..adf03d4a 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/MainActivity.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/MainActivity.kt @@ -20,6 +20,8 @@ import com.utun.chat.data.CallController import com.utun.chat.data.CallPhase import com.utun.chat.data.RadioCallController import com.utun.chat.data.RadioCallPhase +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.withTimeoutOrNull import androidx.appcompat.app.AppCompatActivity import androidx.activity.SystemBarStyle import androidx.activity.compose.BackHandler @@ -211,13 +213,17 @@ class MainActivity : AppCompatActivity() { val fileChannels by vm.channels.collectAsState() val radioCall by RadioCallController.state.collectAsState() val radioActivation by RadioCallController.activation.collectAsState() - LaunchedEffect(radioActivation, fileChannels) { + LaunchedEffect(radioActivation?.id) { val activation = radioActivation ?: return@LaunchedEffect - if (fileChannels.none { it.id == activation.channelId }) return@LaunchedEffect + val channels = withTimeoutOrNull(5000) { vm.channels.first { items -> items.any { it.id == activation.channelId } } } + if (RadioCallController.activation.value?.id != activation.id) return@LaunchedEffect + if (channels == null) { RadioCallController.activated(activation.id, false); return@LaunchedEffect } screen = Screen.Chat vm.enableRadioForCall(activation.channelId) { success -> RadioCallController.activated(activation.id, success) } } - BackHandler(radioCall != null && radioCall?.phase != RadioCallPhase.ENDED) { RadioCallController.end() } + BackHandler(radioCall != null && radioCall?.phase != RadioCallPhase.ENDED) { + if (radioCall?.phase != RadioCallPhase.PREPARING) RadioCallController.end() + } LaunchedEffect(requestedFiles, fileChannels) { requestedFiles?.let { target -> val channel = fileChannels.find { it.id == target.group.toULong().toString() } diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/RadioCallDialog.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/RadioCallDialog.kt index e92eafbc..6ed8beb6 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/RadioCallDialog.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/RadioCallDialog.kt @@ -46,7 +46,7 @@ fun RadioCallDialog(state: RadioCallState) { RadioCallPhase.ENDED -> RadioCallController.reasonText(state.reason) })) Spacer(Modifier.height(20.dp)) - if (state.phase != RadioCallPhase.ENDED) { + if (state.phase != RadioCallPhase.ENDED && state.phase != RadioCallPhase.PREPARING) { Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) { TextButton(onClick = { RadioCallController.end(state.id) }) { Text(stringResource(if (state.phase == RadioCallPhase.INCOMING) R.string.decline else android.R.string.cancel))