From d7053a23668626e183baf6baa12df8ac86ed35e2 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 20 Oct 2026 19:58:55 +0200 Subject: [PATCH] Open active stream controls from any Android header --- .../main/java/com/utun/chat/MainActivity.kt | 24 +++++++++++++++++++ tools/chatgui/src/messagelist.cpp | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) 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 a2875089..d9d8915c 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 @@ -57,6 +57,7 @@ import com.utun.chat.data.Channel import com.utun.chat.data.IncomingCallManager import com.utun.chat.data.InviteData import com.utun.chat.data.LogManager +import com.utun.chat.data.StreamController import com.utun.chat.data.Message import com.utun.chat.data.ConversationTarget import com.utun.chat.data.NativeLib @@ -247,6 +248,27 @@ class MainActivity : AppCompatActivity() { var screenBeforeCall by rememberSaveable { mutableStateOf(null) } val snackbarHostState = remember { SnackbarHostState() } val scope = rememberCoroutineScope() + val openOwnStream: (Long) -> Unit = openOwnStream@{ group -> + val publisher = StreamController.state.value + if (publisher?.ongoing != true || publisher.group != group) { + LogManager.addLog("WARN", "stream", "own stream navigation stale group=$group publisher=${publisher?.id}") + return@openOwnStream + } + val channel = vm.channels.value.firstOrNull { it.id == group.toULong().toString() } + if (channel == null) { + LogManager.addLog("ERROR", "stream", "own stream channel unavailable group=$group publisher=${publisher.id}") + scope.launch { snackbarHostState.showSnackbar(getString(R.string.stream_group_closed)) } + return@openOwnStream + } + LogManager.addLog("INFO", "stream", "own stream navigation from=$screen channel=${vm.currentChannel.value?.id} " + + "target=${channel.id} publisher=${publisher.id}") + if (vm.currentChannel.value?.id != channel.id) vm.selectChannel(channel) + if (vm.currentChannel.value?.id != channel.id) { + LogManager.addLog("ERROR", "stream", "own stream channel selection failed group=$group") + return@openOwnStream + } + vm.selectStream(null); screen = Screen.Streams + } val pmInvite by vm.pmInvite.collectAsState() val linkJoin by vm.linkJoin.collectAsState() val joinedChannel by vm.joinedChannel.collectAsState() @@ -401,6 +423,7 @@ class MainActivity : AppCompatActivity() { onDeleteChannel = { vm.deleteChannel(it.id) }, onSettings = { screen = Screen.Settings }, onLogs = { screen = Screen.Logs }, + onOwnStream = openOwnStream, onRefresh = { vm.requestRefresh() } ) } @@ -420,6 +443,7 @@ class MainActivity : AppCompatActivity() { onInvite = { showInvite(channel) }, onBack = { screen = Screen.ChannelList }, onStreams = { vm.selectStream(null); screen = Screen.Streams }, + onOwnStream = openOwnStream, onWatchStream = { vm.selectStream(it); screen = Screen.Streams }, onWatchAllStreams = { vm.watchAllStreams(); screen = Screen.Streams }, onPlayVideo = { msg -> videoMessage = msg }, diff --git a/tools/chatgui/src/messagelist.cpp b/tools/chatgui/src/messagelist.cpp index c8682d16..9874928a 100644 --- a/tools/chatgui/src/messagelist.cpp +++ b/tools/chatgui/src/messagelist.cpp @@ -561,7 +561,7 @@ MessageList::MessageList(DbManager* db, AudioRecorder* recorder, QWidget *parent if (!channel.toULongLong()) return; auto text = [](const char* s) { return QCoreApplication::translate("ChatGui", s); }; QMenu menu(this); - const bool own = m_streamPublisherGroup && m_streamPublisherGroup == channel.toULongLong(); + const bool own = m_streamPublisherGroup != 0; auto* publish = menu.addAction(text(own ? "Manage stream" : "Start stream")); menu.addSeparator(); auto* files = menu.addAction(text("Group files"));