From d4ca812578e9831ef4ce86036d8aeaa5d7cf5cf2 Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 12 Oct 2026 02:07:04 +0200 Subject: [PATCH] Open live streams from Android channel navigation --- .../app/src/main/java/com/utun/chat/MainActivity.kt | 13 +++++++++++-- .../java/com/utun/chat/ui/screens/ChatScreen.kt | 4 +++- 2 files changed, 14 insertions(+), 3 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 446d5bf5..139de16e 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 @@ -71,7 +71,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.flow.collect class MainActivity : AppCompatActivity() { - enum class Screen { ChannelList, Chat, MemberList, Files, Settings, Logs, VideoRecord, PhotoRecord, Call, Dm } + enum class Screen { ChannelList, Chat, MemberList, Files, Settings, Logs, VideoRecord, PhotoRecord, Call, Dm, Streams } private var overLock = false private var inputScreen = "setup" @@ -244,7 +244,7 @@ class MainActivity : AppCompatActivity() { inputScreen = screen.name LogManager.addLog("INFO", "MAIN", "UI screen=$screen") val unavailable = when (screen) { - Screen.Chat, Screen.MemberList, Screen.Files, Screen.PhotoRecord -> vm.currentChannel.value == null + Screen.Chat, Screen.MemberList, Screen.Files, Screen.PhotoRecord, Screen.Streams -> vm.currentChannel.value == null Screen.Dm -> vm.currentDm.value == null Screen.VideoRecord -> videoTarget == null Screen.Call -> callState == null @@ -313,6 +313,7 @@ class MainActivity : AppCompatActivity() { Screen.MemberList -> screen = Screen.Chat Screen.VideoRecord -> screen = if (videoTarget is ConversationTarget.Pm) Screen.Dm else Screen.Chat Screen.PhotoRecord -> screen = Screen.Chat + Screen.Streams -> screen = Screen.Chat Screen.Chat -> screen = Screen.ChannelList Screen.Dm -> { vm.closeDm(); screen = Screen.ChannelList } Screen.Call -> screen = screenBeforeCall ?: Screen.ChannelList @@ -393,19 +394,27 @@ class MainActivity : AppCompatActivity() { }, onInvite = { showInvite(channel) }, onBack = { screen = Screen.ChannelList }, + onStreams = { screen = Screen.Streams }, onPlayVideo = { msg -> videoMessage = msg }, onViewPhoto = { msg -> photoMessage = msg }, onRecordVideo = { + if (com.utun.chat.data.StreamController.blocksCapture()) return@ChatScreen val target = ConversationTarget.Channel(channel.id) videoTargetId = target.nativeId; vm.captureCameraReply(target); screen = Screen.VideoRecord }, onCapturePhoto = { + if (com.utun.chat.data.StreamController.blocksCapture()) return@ChatScreen photoTargetId = channel.id vm.captureCameraReply(ConversationTarget.Channel(channel.id)); screen = Screen.PhotoRecord } ) } } + Screen.Streams -> { + vm.currentChannel.collectAsState().value?.let { channel -> + StreamScreen(channel.id, channel.name) { screen = Screen.Chat } + } + } Screen.MemberList -> { val members by vm.members.collectAsState() val selectedMember by vm.selectedMember.collectAsState() diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/ChatScreen.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/ChatScreen.kt index 32dca277..9cf31f29 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/ChatScreen.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/ChatScreen.kt @@ -88,7 +88,8 @@ fun ChatScreen( onPlayVideo: (Message) -> Unit = {}, onViewPhoto: (Message) -> Unit = {}, onRecordVideo: () -> Unit = {}, - onCapturePhoto: () -> Unit = {} + onCapturePhoto: () -> Unit = {}, + onStreams: () -> Unit = {} ) { val listState = rememberLazyListState() val context = LocalContext.current @@ -184,6 +185,7 @@ fun ChatScreen( Box { IconButton(onClick = { menu = true }) { Icon(Icons.Filled.MoreVert, stringResource(R.string.options)) } DropdownMenu(expanded = menu, onDismissRequest = { menu = false }) { + DropdownMenuItem(text = { Text(stringResource(R.string.stream_title)) }, onClick = { menu = false; onStreams() }) DropdownMenuItem(text = { Text(stringResource(R.string.files_title)) }, onClick = { menu = false; onFiles(0) }) DropdownMenuItem(text = { Text(stringResource(R.string.files_mine)) },