Add own live stream shortcut to Android chat header

This commit is contained in:
evgeny committed 2026-10-20 19:49:27 +02:00
1 parent 352f5b3f94
commit 7e95c3043b
3 files changed
+22 -3

No files matched your search

@@ -71,8 +71,10 @@ import com.utun.chat.ui.components.GroupAvatar
import com.utun.chat.ui.components.GroupPropertiesDialog
import com.utun.chat.data.ConversationTarget
import com.utun.chat.viewmodel.ChatViewModel
import com.utun.chat.data.StreamController
import com.utun.chat.data.StreamSource
import androidx.compose.material.icons.filled.LiveTv
import androidx.compose.material.icons.filled.Videocam
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@@ -103,6 +105,12 @@ fun ChatScreen(
var properties by remember(channel.id) { mutableStateOf(false) }
var menu by remember(channel.id) { mutableStateOf(false) }
val streams by viewModel.streamSources.collectAsState()
val publisher by StreamController.state.collectAsState()
val ownStream = publisher?.takeIf { it.ongoing && it.group.toULong().toString() == channel.id }
LaunchedEffect(channel.id, ownStream?.id, ownStream?.phase) {
LogManager.addLog("INFO", "stream", "own stream header channel=${channel.id} publisher=${ownStream?.id} " +
"phase=${ownStream?.phase} visible=${ownStream != null}")
}
var chooseStream by remember(channel.id) { mutableStateOf(false) }
if (chooseStream) AlertDialog(
onDismissRequest = { chooseStream = false },
@@ -186,9 +194,12 @@ fun ChatScreen(
) {
TopAppBar(
title = {
Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp)) {
GroupAvatar(channel.id, channel.name, size = 32.dp)
Text(channel.name, maxLines = 1, overflow = androidx.compose.ui.text.style.TextOverflow.Ellipsis)
BoxWithConstraints {
val showAvatar = maxWidth >= 96.dp
Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp)) {
if (showAvatar) GroupAvatar(channel.id, channel.name, size = 32.dp)
Text(channel.name, maxLines = 1, overflow = androidx.compose.ui.text.style.TextOverflow.Ellipsis)
}
}
},
navigationIcon = {
@@ -200,6 +211,12 @@ fun ChatScreen(
Icon(Icons.Filled.LiveTv, stringResource(R.string.stream_available, streams.size), tint = Color(0xFFE53935))
}
}
if (ownStream != null) IconButton(onClick = {
LogManager.addLog("INFO", "stream", "own stream header clicked channel=${channel.id} publisher=${ownStream.id}")
onStreams()
}) {
Icon(Icons.Filled.Videocam, stringResource(R.string.stream_manage), tint = Color(0xFFE53935))
}
IconButton(
onClick = { viewModel.toggleRadio() },
modifier = Modifier.background(
@@ -62,6 +62,7 @@
<string name="stream_group_closed">Канал закрыт</string>
<string name="stream_start">Начать трансляцию</string>
<string name="stream_stop">Остановить трансляцию</string>
<string name="stream_manage">Управление своей трансляцией</string>
<string name="stream_audio">Звук трансляции</string>
<string name="stream_audio_on">Звук трансляции включён</string>
<string name="stream_audio_off">Звук трансляции выключен</string>
@@ -62,6 +62,7 @@
<string name="stream_group_closed">The channel is closed</string>
<string name="stream_start">Start stream</string>
<string name="stream_stop">Stop stream</string>
<string name="stream_manage">Manage your stream</string>
<string name="stream_audio">Stream audio</string>
<string name="stream_audio_on">Stream audio on</string>
<string name="stream_audio_off">Stream audio off</string>