From c322affde4708791ce275e01a79f8e185526ead5 Mon Sep 17 00:00:00 2001 From: infi Date: Tue, 4 Aug 2026 12:26:31 +0200 Subject: [PATCH] feat: use voice icon for voice channels --- .../stoat/composables/chat/MessageField.kt | 4 +- .../composables/screens/chat/ChannelHeader.kt | 4 +- .../composables/screens/chat/ChannelIcon.kt | 40 +++++++++++++++---- .../screens/chat/ChannelSheetHeader.kt | 26 +++++++----- .../screens/chat/drawer/ChannelSideDrawer.kt | 4 ++ .../chat/views/channel/ChannelScreen.kt | 2 +- .../chat/stoat/sheets/ChannelInfoSheet.kt | 8 +--- .../chat/stoat/core/model/schemas/Channel.kt | 1 + 8 files changed, 58 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/chat/stoat/composables/chat/MessageField.kt b/app/src/main/java/chat/stoat/composables/chat/MessageField.kt index 20274f39..5c828690 100644 --- a/app/src/main/java/chat/stoat/composables/chat/MessageField.kt +++ b/app/src/main/java/chat/stoat/composables/chat/MessageField.kt @@ -400,9 +400,9 @@ fun MessageField( }, label = { Text("#${item.channel.name}") }, icon = { - item.channel.channelType?.let { type -> + if (item.channel.channelType != null) { ChannelIcon( - channelType = type, + channel = item.channel, modifier = Modifier.size(SuggestionChipDefaults.IconSize) ) } diff --git a/app/src/main/java/chat/stoat/composables/screens/chat/ChannelHeader.kt b/app/src/main/java/chat/stoat/composables/screens/chat/ChannelHeader.kt index 24f3212c..10c70bb1 100644 --- a/app/src/main/java/chat/stoat/composables/screens/chat/ChannelHeader.kt +++ b/app/src/main/java/chat/stoat/composables/screens/chat/ChannelHeader.kt @@ -61,9 +61,9 @@ fun ChannelHeader( ) } - channel.channelType?.let { + if (channel.channelType != null) { ChannelIcon( - channelType = it, + channel = channel, modifier = Modifier.alpha(0.6f) ) } diff --git a/app/src/main/java/chat/stoat/composables/screens/chat/ChannelIcon.kt b/app/src/main/java/chat/stoat/composables/screens/chat/ChannelIcon.kt index b709bc35..e9b623e5 100644 --- a/app/src/main/java/chat/stoat/composables/screens/chat/ChannelIcon.kt +++ b/app/src/main/java/chat/stoat/composables/screens/chat/ChannelIcon.kt @@ -9,10 +9,42 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameterProvider import chat.stoat.R +import chat.stoat.core.model.schemas.Channel import chat.stoat.core.model.schemas.ChannelType +@Composable +fun ChannelIcon(channel: Channel, modifier: Modifier = Modifier) { + ChannelIcon( + channelType = channel.channelType ?: ChannelType.TextChannel, + hasVoice = channel.channelType == ChannelType.TextChannel && channel.voice != null, + modifier = modifier + ) +} + @Composable fun ChannelIcon(channelType: ChannelType, modifier: Modifier = Modifier) { + ChannelIcon( + channelType = channelType, + hasVoice = channelType == ChannelType.VoiceChannel, + modifier = modifier + ) +} + +@Composable +private fun ChannelIcon( + channelType: ChannelType, + hasVoice: Boolean, + modifier: Modifier, +) { + if (hasVoice || channelType == ChannelType.VoiceChannel) { + Icon( + painter = painterResource(R.drawable.ic_volume_up_24dp), + contentDescription = stringResource(R.string.channel_voice), + modifier = modifier + ) + return + } + when (channelType) { ChannelType.TextChannel -> { Icon( @@ -22,14 +54,6 @@ fun ChannelIcon(channelType: ChannelType, modifier: Modifier = Modifier) { ) } - ChannelType.VoiceChannel -> { - Icon( - painter = painterResource(R.drawable.ic_volume_up_24dp), - contentDescription = stringResource(R.string.channel_voice), - modifier = modifier - ) - } - ChannelType.SavedMessages -> { Icon( painter = painterResource(R.drawable.ic_note_stack_24dp), diff --git a/app/src/main/java/chat/stoat/composables/screens/chat/ChannelSheetHeader.kt b/app/src/main/java/chat/stoat/composables/screens/chat/ChannelSheetHeader.kt index b92fb8c5..0f3bd94d 100644 --- a/app/src/main/java/chat/stoat/composables/screens/chat/ChannelSheetHeader.kt +++ b/app/src/main/java/chat/stoat/composables/screens/chat/ChannelSheetHeader.kt @@ -18,26 +18,28 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import chat.stoat.core.model.schemas.AutumnResource -import chat.stoat.core.model.schemas.ChannelType -import chat.stoat.core.model.schemas.User +import chat.stoat.R +import chat.stoat.api.internals.ChannelUtils import chat.stoat.composables.generic.RemoteImage import chat.stoat.composables.generic.UserAvatar import chat.stoat.composables.markdown.prose.ChatMarkdown import chat.stoat.core.model.data.STOAT_FILES +import chat.stoat.core.model.schemas.Channel +import chat.stoat.core.model.schemas.ChannelType +import chat.stoat.core.model.schemas.User @Composable fun ChannelSheetHeader( - channelName: String, - channelIcon: AutumnResource? = null, - channelType: ChannelType, - channelDescription: String? = null, - serverId: String? = null, + channel: Channel, dmPartner: User? = null ) { + val channelType = channel.channelType ?: ChannelType.TextChannel + val channelIcon = channel.icon + val channelDescription = channel.description Row( verticalAlignment = Alignment.CenterVertically ) { @@ -73,7 +75,7 @@ fun ChannelSheetHeader( ) } else { CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onPrimaryContainer) { - ChannelIcon(channelType = channelType) + ChannelIcon(channel = channel) } } } @@ -82,7 +84,9 @@ fun ChannelSheetHeader( Column { Text( - text = channelName, + text = channel.name + ?: ChannelUtils.resolveName(channel) + ?: stringResource(R.string.unknown), fontWeight = FontWeight.SemiBold, maxLines = 1, overflow = TextOverflow.Ellipsis @@ -90,7 +94,7 @@ fun ChannelSheetHeader( if (!channelDescription.isNullOrBlank()) { Spacer(modifier = Modifier.height(8.dp)) - ChatMarkdown(channelDescription, serverId = serverId) + ChatMarkdown(channelDescription, serverId = channel.server) } } } diff --git a/app/src/main/java/chat/stoat/composables/screens/chat/drawer/ChannelSideDrawer.kt b/app/src/main/java/chat/stoat/composables/screens/chat/drawer/ChannelSideDrawer.kt index 404fcfa8..7920b437 100644 --- a/app/src/main/java/chat/stoat/composables/screens/chat/drawer/ChannelSideDrawer.kt +++ b/app/src/main/java/chat/stoat/composables/screens/chat/drawer/ChannelSideDrawer.kt @@ -925,6 +925,10 @@ fun ChannelItem( ) } + channel.channelType == ChannelType.TextChannel && channel.voice != null -> { + ChannelIcon(channel = channel) + } + else -> ChannelIcon(iconType.type) } } diff --git a/app/src/main/java/chat/stoat/screens/chat/views/channel/ChannelScreen.kt b/app/src/main/java/chat/stoat/screens/chat/views/channel/ChannelScreen.kt index 65d37ef9..125269d6 100644 --- a/app/src/main/java/chat/stoat/screens/chat/views/channel/ChannelScreen.kt +++ b/app/src/main/java/chat/stoat/screens/chat/views/channel/ChannelScreen.kt @@ -703,7 +703,7 @@ fun ChannelScreen( else -> { ChannelIcon( - channelType = it.channelType ?: ChannelType.TextChannel, + channel = it, modifier = Modifier .size(24.dp) .alpha(0.8f) diff --git a/app/src/main/java/chat/stoat/sheets/ChannelInfoSheet.kt b/app/src/main/java/chat/stoat/sheets/ChannelInfoSheet.kt index d2d6a0ad..de0eda16 100644 --- a/app/src/main/java/chat/stoat/sheets/ChannelInfoSheet.kt +++ b/app/src/main/java/chat/stoat/sheets/ChannelInfoSheet.kt @@ -103,13 +103,7 @@ fun ChannelInfoSheet(channelId: String, onHideSheet: suspend () -> Unit) { modifier = Modifier.padding(top = 16.dp, start = 16.dp, end = 16.dp, bottom = 4.dp), ) { ChannelSheetHeader( - channelName = channel.name - ?: ChannelUtils.resolveName(channel) - ?: stringResource(id = R.string.unknown), - channelIcon = channel.icon, - channelType = channel.channelType ?: ChannelType.TextChannel, - channelDescription = channel.description, - serverId = channel.server, + channel = channel, dmPartner = partner ) HorizontalDivider() diff --git a/core/model/src/main/java/chat/stoat/core/model/schemas/Channel.kt b/core/model/src/main/java/chat/stoat/core/model/schemas/Channel.kt index 30bd08b9..e0e21d72 100644 --- a/core/model/src/main/java/chat/stoat/core/model/schemas/Channel.kt +++ b/core/model/src/main/java/chat/stoat/core/model/schemas/Channel.kt @@ -99,6 +99,7 @@ data class Channel( rolePermissions = partial.rolePermissions ?: rolePermissions, defaultPermissions = partial.defaultPermissions ?: defaultPermissions, nsfw = partial.nsfw ?: nsfw, + voice = partial.voice ?: voice, slowmode = partial.slowmode ?: slowmode, type = partial.type ?: type )