From 1809e78bf69bc7fbb475da2fa4b93f717bc88b3a Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Thu, 29 Jan 2026 16:35:46 +0100 Subject: [PATCH 01/14] Use component factory when rendering giphy attachments in messages --- .../api/stream-chat-android-compose.api | 9 +++++++++ .../content/GiphyAttachmentContent.kt | 10 ++++++++-- .../factory/GiphyAttachmentFactory.kt | 16 +--------------- .../messages/GiphyMessageContent.kt | 10 +++++++--- .../ui/components/messages/MessageContent.kt | 7 +++++++ .../compose/ui/theme/ChatComponentFactory.kt | 11 +++++++++++ ...tsContentTest_giphy_attachment_content.png | Bin 8560 -> 10371 bytes 7 files changed, 43 insertions(+), 20 deletions(-) diff --git a/stream-chat-android-compose/api/stream-chat-android-compose.api b/stream-chat-android-compose/api/stream-chat-android-compose.api index 513a8068cae..e9b666ef3ed 100644 --- a/stream-chat-android-compose/api/stream-chat-android-compose.api +++ b/stream-chat-android-compose/api/stream-chat-android-compose.api @@ -723,6 +723,13 @@ public final class io/getstream/chat/android/compose/ui/attachments/factory/Comp public final fun getLambda-2$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function4; } +public final class io/getstream/chat/android/compose/ui/attachments/factory/ComposableSingletons$GiphyAttachmentFactoryKt { + public static final field INSTANCE Lio/getstream/chat/android/compose/ui/attachments/factory/ComposableSingletons$GiphyAttachmentFactoryKt; + public static field lambda-1 Lkotlin/jvm/functions/Function4; + public fun ()V + public final fun getLambda-1$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function4; +} + public final class io/getstream/chat/android/compose/ui/attachments/factory/ComposableSingletons$MediaAttachmentFactoryKt { public static final field INSTANCE Lio/getstream/chat/android/compose/ui/attachments/factory/ComposableSingletons$MediaAttachmentFactoryKt; public static field lambda-1 Lkotlin/jvm/functions/Function3; @@ -2960,6 +2967,7 @@ public abstract interface class io/getstream/chat/android/compose/ui/theme/ChatC public abstract fun FileAttachmentPreviewContent (Landroidx/compose/ui/Modifier;Ljava/util/List;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V public abstract fun FileUploadContent (Lio/getstream/chat/android/compose/state/messages/attachments/AttachmentState;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V public abstract fun FileUploadItem (Lio/getstream/chat/android/models/Attachment;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V + public abstract fun GiphyAttachmentContent (Lio/getstream/chat/android/compose/state/messages/attachments/AttachmentState;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V public abstract fun GroupChannelInfoAddMembersButton (Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V public abstract fun GroupChannelInfoExpandMembersItem (Landroidx/compose/foundation/lazy/LazyItemScope;ILkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V public abstract fun GroupChannelInfoMemberItem (Landroidx/compose/foundation/lazy/LazyItemScope;Lio/getstream/chat/android/models/User;Lio/getstream/chat/android/models/Member;ZLkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V @@ -3139,6 +3147,7 @@ public final class io/getstream/chat/android/compose/ui/theme/ChatComponentFacto public static fun FileAttachmentPreviewContent (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Landroidx/compose/ui/Modifier;Ljava/util/List;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V public static fun FileUploadContent (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Lio/getstream/chat/android/compose/state/messages/attachments/AttachmentState;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V public static fun FileUploadItem (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Lio/getstream/chat/android/models/Attachment;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V + public static fun GiphyAttachmentContent (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Lio/getstream/chat/android/compose/state/messages/attachments/AttachmentState;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V public static fun GroupChannelInfoAddMembersButton (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V public static fun GroupChannelInfoExpandMembersItem (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Landroidx/compose/foundation/lazy/LazyItemScope;ILkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V public static fun GroupChannelInfoMemberItem (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Landroidx/compose/foundation/lazy/LazyItemScope;Lio/getstream/chat/android/models/User;Lio/getstream/chat/android/models/Member;ZLkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt index 382805f0250..b9a2c1204ea 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt @@ -53,10 +53,12 @@ import io.getstream.chat.android.client.utils.attachment.isGiphy import io.getstream.chat.android.compose.R import io.getstream.chat.android.compose.state.messages.attachments.AttachmentState import io.getstream.chat.android.compose.ui.theme.ChatTheme +import io.getstream.chat.android.compose.ui.theme.MessageStyling import io.getstream.chat.android.compose.ui.theme.StreamDimens import io.getstream.chat.android.compose.ui.util.AsyncImagePreviewHandler import io.getstream.chat.android.compose.ui.util.StreamAsyncImage import io.getstream.chat.android.compose.ui.util.applyIf +import io.getstream.chat.android.compose.ui.util.shouldBeDisplayedAsFullSizeAttachment import io.getstream.chat.android.models.Attachment import io.getstream.chat.android.models.AttachmentType import io.getstream.chat.android.models.Message @@ -147,7 +149,7 @@ public fun GiphyAttachmentContent( public fun GiphyAttachmentContent( state: AttachmentState, modifier: Modifier = Modifier, - giphyInfoType: GiphyInfoType = GiphyInfoType.ORIGINAL, + giphyInfoType: GiphyInfoType = GiphyInfoType.FIXED_HEIGHT_DOWNSAMPLED, giphySizingMode: GiphySizingMode = GiphySizingMode.ADAPTIVE, contentScale: ContentScale = ContentScale.Crop, onItemClick: (GiphyAttachmentClickData) -> Unit = { @@ -213,10 +215,14 @@ public fun GiphyAttachmentContent( } } + val shouldBeFullSize = message.shouldBeDisplayedAsFullSizeAttachment() Box( modifier = modifier .size(giphyDimensions) - .applyIf(message.text.isNotEmpty()) { clip(ChatTheme.shapes.attachment) } + .applyIf(!shouldBeFullSize) { + padding(MessageStyling.messageSectionPadding) + .clip(ChatTheme.shapes.attachment) + } .combinedClickable( indication = null, interactionSource = remember { MutableInteractionSource() }, diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/factory/GiphyAttachmentFactory.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/factory/GiphyAttachmentFactory.kt index d7bfac2efc1..432b8d3d1e3 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/factory/GiphyAttachmentFactory.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/factory/GiphyAttachmentFactory.kt @@ -18,10 +18,7 @@ package io.getstream.chat.android.compose.ui.attachments.factory import android.content.Context import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.wrapContentSize -import androidx.compose.runtime.Composable import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.testTag import io.getstream.chat.android.client.utils.attachment.isGiphy import io.getstream.chat.android.compose.ui.attachments.AttachmentFactory import io.getstream.chat.android.compose.ui.attachments.content.GiphyAttachmentClickData @@ -62,18 +59,7 @@ public class GiphyAttachmentFactory( ) : AttachmentFactory( type = Type.BuiltIn.GIPHY, canHandle = canHandle, - content = @Composable { modifier, state -> - GiphyAttachmentContent( - modifier = modifier - .wrapContentSize() - .testTag("Stream_GiphyContent"), - state = state, - giphyInfoType = giphyInfoType, - giphySizingMode = giphySizingMode, - contentScale = contentScale, - onItemClick = onItemClick, - ) - }, + content = { _, _ -> }, ) { /** * Creates a new instance of [GiphyAttachmentFactory] with the default parameters. diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/GiphyMessageContent.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/GiphyMessageContent.kt index f42e7d47af2..dce1de43352 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/GiphyMessageContent.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/GiphyMessageContent.kt @@ -41,7 +41,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import io.getstream.chat.android.compose.R -import io.getstream.chat.android.compose.ui.attachments.content.MessageAttachmentsContent +import io.getstream.chat.android.compose.state.messages.attachments.AttachmentState import io.getstream.chat.android.compose.ui.theme.ChatTheme import io.getstream.chat.android.compose.ui.util.clickable import io.getstream.chat.android.models.Message @@ -106,12 +106,16 @@ public fun GiphyMessageContent( ) } - MessageAttachmentsContent( + val attachmentState = AttachmentState( message = message, - currentUser = currentUser, + isMine = message.user.id == currentUser?.id, onLongItemClick = {}, onMediaGalleryPreviewResult = {}, ) + ChatTheme.componentFactory.GiphyAttachmentContent( + modifier = modifier, + state = attachmentState, + ) Spacer( modifier = Modifier diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/MessageContent.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/MessageContent.kt index 242c6a51ca0..bade74492f2 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/MessageContent.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/MessageContent.kt @@ -207,6 +207,13 @@ internal fun DefaultMessageContent( ) } + if (info.hasGiphys) { + componentFactory.GiphyAttachmentContent( + modifier = Modifier, + state = attachmentState, + ) + } + if (info.hasFiles) { componentFactory.FileAttachmentContent( modifier = Modifier, diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatComponentFactory.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatComponentFactory.kt index db8f0de8c47..fa1b9158124 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatComponentFactory.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatComponentFactory.kt @@ -2913,6 +2913,17 @@ public interface ChatComponentFactory { ) } + @Composable + public fun GiphyAttachmentContent( + state: AttachmentState, + modifier: Modifier, + ) { + io.getstream.chat.android.compose.ui.attachments.content.GiphyAttachmentContent( + state = state, + modifier = modifier, + ) + } + @Composable public fun MediaAttachmentContent( state: AttachmentState, diff --git a/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.attachments.content_AttachmentsContentTest_giphy_attachment_content.png b/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.attachments.content_AttachmentsContentTest_giphy_attachment_content.png index b2149cf2ea41c2aa0953e54e06ec49c063931666..c0f781720d1dfcba1b9b8cf852f87ad47bbc6b7b 100644 GIT binary patch literal 10371 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 XL;9RkWIxzk2pm3eY=7y#Ge7<>P4x91 literal 8560 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 From 365e50fae9565dc58a7d600fc303a3d640f6ff6f Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Wed, 4 Feb 2026 11:47:19 +0100 Subject: [PATCH 02/14] Update giphy message design --- .../api/stream-chat-android-compose.api | 7 - .../ui/components/button/StreamButton.kt | 2 +- .../messages/GiphyMessageContent.kt | 158 +++++------------- .../ui/components/messages/MessageBubble.kt | 23 --- .../compose/ui/messages/list/MessageItem.kt | 3 +- .../android/compose/ui/util/MessageUtils.kt | 6 +- .../drawable/stream_compose_ic_eye_open.xml | 26 +++ .../res/drawable/stream_compose_ic_giphy.xml | 59 +++---- 8 files changed, 105 insertions(+), 179 deletions(-) create mode 100644 stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_eye_open.xml diff --git a/stream-chat-android-compose/api/stream-chat-android-compose.api b/stream-chat-android-compose/api/stream-chat-android-compose.api index e9b666ef3ed..0d95a261a10 100644 --- a/stream-chat-android-compose/api/stream-chat-android-compose.api +++ b/stream-chat-android-compose/api/stream-chat-android-compose.api @@ -1738,13 +1738,6 @@ public final class io/getstream/chat/android/compose/ui/components/messageoption public static final fun defaultMessageOptionsState (Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;ZLjava/util/Set;Landroidx/compose/runtime/Composer;I)Ljava/util/List; } -public final class io/getstream/chat/android/compose/ui/components/messages/ComposableSingletons$GiphyMessageContentKt { - public static final field INSTANCE Lio/getstream/chat/android/compose/ui/components/messages/ComposableSingletons$GiphyMessageContentKt; - public static field lambda-1 Lkotlin/jvm/functions/Function2; - public fun ()V - public final fun getLambda-1$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; -} - public final class io/getstream/chat/android/compose/ui/components/messages/ComposableSingletons$MessageReactionItemKt { public static final field INSTANCE Lio/getstream/chat/android/compose/ui/components/messages/ComposableSingletons$MessageReactionItemKt; public static field lambda-1 Lkotlin/jvm/functions/Function2; diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/button/StreamButton.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/button/StreamButton.kt index 92d525b8aa5..e2baae9c96d 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/button/StreamButton.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/button/StreamButton.kt @@ -51,13 +51,13 @@ import io.getstream.chat.android.compose.ui.util.ifNotNull @Composable internal fun StreamTextButton( onClick: () -> Unit, + text: String, modifier: Modifier = Modifier, enabled: Boolean = true, style: StreamButtonStyle = StreamButtonStyleDefaults.primarySolid, size: StreamButtonSize = StreamButtonSize.Medium, leadingIcon: Painter? = null, trailingIcon: Painter? = null, - text: String, ) { StreamButton( onClick = onClick, diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/GiphyMessageContent.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/GiphyMessageContent.kt index dce1de43352..d7167f5732e 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/GiphyMessageContent.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/GiphyMessageContent.kt @@ -16,37 +16,34 @@ package io.getstream.chat.android.compose.ui.components.messages -import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width +import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import io.getstream.chat.android.compose.R import io.getstream.chat.android.compose.state.messages.attachments.AttachmentState +import io.getstream.chat.android.compose.ui.components.button.StreamButtonStyleDefaults +import io.getstream.chat.android.compose.ui.components.button.StreamTextButton import io.getstream.chat.android.compose.ui.theme.ChatTheme -import io.getstream.chat.android.compose.ui.util.clickable +import io.getstream.chat.android.compose.ui.theme.MessageStyling +import io.getstream.chat.android.compose.ui.theme.StreamTokens +import io.getstream.chat.android.models.Attachment +import io.getstream.chat.android.models.AttachmentType import io.getstream.chat.android.models.Message import io.getstream.chat.android.models.User -import io.getstream.chat.android.previewdata.PreviewMessageData import io.getstream.chat.android.ui.common.state.messages.list.CancelGiphy import io.getstream.chat.android.ui.common.state.messages.list.GiphyAction import io.getstream.chat.android.ui.common.state.messages.list.SendGiphy @@ -68,6 +65,8 @@ public fun GiphyMessageContent( modifier: Modifier = Modifier, onGiphyActionClick: (GiphyAction) -> Unit = {}, ) { + val colors = ChatTheme.colors + Column( modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally, @@ -76,33 +75,19 @@ public fun GiphyMessageContent( modifier = Modifier .fillMaxWidth() .height(40.dp) - .padding(horizontal = 8.dp), + .padding(horizontal = StreamTokens.spacingSm, vertical = StreamTokens.spacingXs), verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(StreamTokens.spacingXs), ) { - Image( - modifier = Modifier.size(24.dp), - painter = painterResource(id = R.drawable.stream_compose_ic_giphy), + Icon( + painter = painterResource(R.drawable.stream_compose_ic_eye_open), contentDescription = null, + tint = colors.chatTextOutgoing, ) - - Spacer(modifier = Modifier.width(8.dp)) - Text( - text = stringResource(id = R.string.stream_compose_message_list_giphy_title), - style = ChatTheme.typography.bodyBold, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - color = ChatTheme.colors.textHighEmphasis, - ) - - Spacer(modifier = Modifier.width(8.dp)) - - Text( - text = message.text, - style = ChatTheme.typography.body, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - color = ChatTheme.colors.textLowEmphasis, + text = stringResource(R.string.stream_compose_only_visible_to_you), + style = ChatTheme.typography.captionEmphasis, + color = colors.chatTextOutgoing, ) } @@ -113,108 +98,51 @@ public fun GiphyMessageContent( onMediaGalleryPreviewResult = {}, ) ChatTheme.componentFactory.GiphyAttachmentContent( - modifier = modifier, + modifier = Modifier.fillMaxWidth(), state = attachmentState, ) - Spacer( - modifier = Modifier - .fillMaxWidth() - .height(1.dp) - .background(color = ChatTheme.colors.borders), - ) - Row( modifier = Modifier - .height(48.dp) + .padding(vertical = StreamTokens.spacingXs) .fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(StreamTokens.spacingXs), ) { - GiphyButton( - modifier = Modifier - .fillMaxHeight() - .weight(1f), - text = stringResource(id = R.string.stream_compose_message_list_giphy_cancel), - textColor = ChatTheme.colors.textLowEmphasis, - onClick = { onGiphyActionClick(CancelGiphy(message)) }, - ) - - Spacer( - modifier = Modifier - .fillMaxHeight() - .width(1.dp) - .background(color = ChatTheme.colors.borders), + StreamTextButton( + onClick = { onGiphyActionClick(SendGiphy(message)) }, + text = stringResource(R.string.stream_compose_message_list_giphy_send), + style = StreamButtonStyleDefaults.primaryGhost, + modifier = Modifier.weight(1f), ) - GiphyButton( - modifier = Modifier - .fillMaxHeight() - .weight(1f), - text = stringResource(id = R.string.stream_compose_message_list_giphy_shuffle), - textColor = ChatTheme.colors.textLowEmphasis, + StreamTextButton( onClick = { onGiphyActionClick(ShuffleGiphy(message)) }, + text = stringResource(R.string.stream_compose_message_list_giphy_shuffle), + style = StreamButtonStyleDefaults.secondaryGhost, + modifier = Modifier.weight(1f), ) - Spacer( - modifier = Modifier - .fillMaxHeight() - .width(1.dp) - .background(color = ChatTheme.colors.borders), - ) - - GiphyButton( - modifier = Modifier - .fillMaxHeight() - .weight(1f), - text = stringResource(id = R.string.stream_compose_message_list_giphy_send), - textColor = ChatTheme.colors.primaryAccent, - onClick = { onGiphyActionClick(SendGiphy(message)) }, + StreamTextButton( + onClick = { onGiphyActionClick(CancelGiphy(message)) }, + text = stringResource(R.string.stream_compose_message_list_giphy_cancel), + style = StreamButtonStyleDefaults.secondaryGhost, + modifier = Modifier.weight(1f), ) } } } -/** - * Represents an action button in the ephemeral giphy message. - * - * @param text The text displayed on the button. - * @param textColor The color applied to the text. - * @param onClick Handler when the user clicks on action button. - * @param modifier Modifier for styling. - */ -@Composable -internal fun GiphyButton( - text: String, - textColor: Color, - onClick: () -> Unit, - modifier: Modifier = Modifier, -) { - Box( - modifier = modifier.clickable(onClick = onClick), - ) { - Text( - modifier = Modifier - .align(Alignment.Center) - .testTag("Stream_GiphyButton_$text"), - text = text, - style = ChatTheme.typography.bodyBold, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - color = textColor, - textAlign = TextAlign.Center, - ) - } -} - @Preview @Composable private fun GiphyMessageContentPreview() { + val attachment = Attachment(type = AttachmentType.GIPHY, ogUrl = "") ChatTheme { - GiphyMessageContent( - modifier = Modifier.size(600.dp), - message = PreviewMessageData.message1, - currentUser = PreviewMessageData.message1.user, - onGiphyActionClick = {}, - ) + Box(Modifier.background(MessageStyling.backgroundColor(true))) { + GiphyMessageContent( + message = Message(attachments = listOf(attachment)), + currentUser = null, + onGiphyActionClick = {}, + ) + } } } diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/MessageBubble.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/MessageBubble.kt index 2df19653f35..f21c08f2057 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/MessageBubble.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/MessageBubble.kt @@ -25,12 +25,6 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape -import io.getstream.chat.android.client.utils.message.isDeleted -import io.getstream.chat.android.client.utils.message.isErrorOrFailed -import io.getstream.chat.android.client.utils.message.isGiphyEphemeral -import io.getstream.chat.android.compose.ui.theme.ChatTheme -import io.getstream.chat.android.compose.ui.theme.MessageStyling -import io.getstream.chat.android.models.Message /** * Wraps the content of a message in a bubble. @@ -62,20 +56,3 @@ public fun MessageBubble( } } } - -/** - * Determines the background color of the message bubble based on the message content and ownership. - * - * @param outgoing Whether the message is by the current user - * @param message The message data. - * @return A color for the message bubble. - */ -@Composable -internal fun getMessageBubbleColor(outgoing: Boolean, message: Message): Color { - return when { - message.isGiphyEphemeral() -> ChatTheme.colors.giphyMessageBackground - message.isDeleted() -> MessageStyling.backgroundColor(outgoing) - message.isErrorOrFailed() -> MessageStyling.backgroundColor(outgoing) - else -> MessageStyling.backgroundColor(outgoing) - } -} diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageItem.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageItem.kt index 8d74fc72670..e525d5e0a8d 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageItem.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageItem.kt @@ -74,7 +74,6 @@ import io.getstream.chat.android.compose.state.reactionoptions.ReactionOptionIte import io.getstream.chat.android.compose.ui.components.messages.MessageContent import io.getstream.chat.android.compose.ui.components.messages.MessageHeaderLabel import io.getstream.chat.android.compose.ui.components.messages.PollMessageContent -import io.getstream.chat.android.compose.ui.components.messages.getMessageBubbleColor import io.getstream.chat.android.compose.ui.theme.ChatTheme import io.getstream.chat.android.compose.ui.theme.MessageReactionListParams import io.getstream.chat.android.compose.ui.theme.MessageStyling @@ -614,7 +613,7 @@ public fun RegularMessageContent( val ownsMessage = messageItem.isMine val messageBubbleShape = MessageStyling.shape(messageItem.groupPosition, outgoing = ownsMessage) - val messageBubbleColor = getMessageBubbleColor(ownsMessage, message = message) + val messageBubbleColor = MessageStyling.backgroundColor(ownsMessage) val content = @Composable { MessageContent( diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/util/MessageUtils.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/util/MessageUtils.kt index 1926b65d7fa..bd4ab0c8557 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/util/MessageUtils.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/util/MessageUtils.kt @@ -21,6 +21,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.remember import androidx.lifecycle.compose.collectAsStateWithLifecycle +import io.getstream.chat.android.client.utils.message.isGiphyEphemeral import io.getstream.chat.android.compose.R import io.getstream.chat.android.models.AttachmentType import io.getstream.chat.android.models.Message @@ -68,9 +69,10 @@ private val fullSizeAttachmentTypes = setOf( AttachmentType.AUDIO_RECORDING, ) -/** @return If the message's only attachment should occupy the full message bubble */ -internal fun Message.shouldBeDisplayedAsFullSizeAttachment(): Boolean = +/** @return If the message's attachment should occupy the full message bubble */ +internal fun Message.shouldBeDisplayedAsFullSizeAttachment(): Boolean = isGiphyEphemeral() || ( text.isEmpty() && replyTo == null && attachments.size == 1 && attachments.first().type in fullSizeAttachmentTypes + ) /** * @return If the message contains an attachment that is currently being uploaded. diff --git a/stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_eye_open.xml b/stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_eye_open.xml new file mode 100644 index 00000000000..87b3427546d --- /dev/null +++ b/stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_eye_open.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_giphy.xml b/stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_giphy.xml index 213b52e665f..4dee06a5342 100644 --- a/stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_giphy.xml +++ b/stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_giphy.xml @@ -15,33 +15,34 @@ limitations under the License. --> - - - - - - + android:width="12dp" + android:height="12dp" + android:viewportWidth="12" + android:viewportHeight="12"> + + + + + + + + From 4ba503e5adc94a24b4c53d641d8e640e2d9e7e0e Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Wed, 4 Feb 2026 11:54:15 +0100 Subject: [PATCH 03/14] Remove incorrect derivedStateOf --- .../content/GiphyAttachmentContent.kt | 54 +++++++++---------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt index b9a2c1204ea..00a441790b8 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt @@ -31,8 +31,6 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.derivedStateOf -import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -180,38 +178,36 @@ public fun GiphyAttachmentContent( val width = ChatTheme.dimens.attachmentsContentGiphyWidth val height = ChatTheme.dimens.attachmentsContentGiphyHeight - val giphyDimensions: DpSize by remember(key1 = giphyInfo) { - derivedStateOf { - if (giphyInfo != null) { - with(density) { - val giphyWidth = giphyInfo.width.toDp() - val giphyHeight = giphyInfo.height.toDp() + val giphyDimensions: DpSize = remember(giphyInfo) { + if (giphyInfo != null) { + with(density) { + val giphyWidth = giphyInfo.width.toDp() + val giphyHeight = giphyInfo.height.toDp() - when { - giphySizingMode == GiphySizingMode.FIXED_SIZE -> { - DpSize( - width = width.coerceIn( - minimumValue = null, - maximumValue = maxWidth, - ), - height = height.coerceIn( - minimumValue = null, - maximumValue = maxHeight, - ), - ) - } - - else -> calculateResultingDimensions( - maxWidth = maxWidth, - maxHeight = maxHeight, - giphyWidth = giphyWidth, - giphyHeight = giphyHeight, + when { + giphySizingMode == GiphySizingMode.FIXED_SIZE -> { + DpSize( + width = width.coerceIn( + minimumValue = null, + maximumValue = maxWidth, + ), + height = height.coerceIn( + minimumValue = null, + maximumValue = maxHeight, + ), ) } + + else -> calculateResultingDimensions( + maxWidth = maxWidth, + maxHeight = maxHeight, + giphyWidth = giphyWidth, + giphyHeight = giphyHeight, + ) } - } else { - DpSize(maxWidth, maxHeight) } + } else { + DpSize(maxWidth, maxHeight) } } From d7b9a97dffa67e4deac0497979c84fc65972fedd Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Wed, 4 Feb 2026 12:12:30 +0100 Subject: [PATCH 04/14] Update Giphy attachmentbadge --- .../content/GiphyAttachmentContent.kt | 40 ++++++++++++---- .../android/compose/ui/theme/StreamColors.kt | 8 +++- .../drawable/stream_compose_giphy_label.xml | 39 --------------- .../res/drawable/stream_compose_ic_giphy.xml | 48 ------------------- 4 files changed, 38 insertions(+), 97 deletions(-) delete mode 100644 stream-chat-android-compose/src/main/res/drawable/stream_compose_giphy_label.xml delete mode 100644 stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_giphy.xml diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt index 00a441790b8..c5ae93c5c07 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt @@ -21,14 +21,17 @@ import android.content.Intent import android.net.Uri import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image +import androidx.compose.foundation.background import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember @@ -41,6 +44,7 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.DpSize @@ -53,6 +57,7 @@ import io.getstream.chat.android.compose.state.messages.attachments.AttachmentSt import io.getstream.chat.android.compose.ui.theme.ChatTheme import io.getstream.chat.android.compose.ui.theme.MessageStyling import io.getstream.chat.android.compose.ui.theme.StreamDimens +import io.getstream.chat.android.compose.ui.theme.StreamTokens import io.getstream.chat.android.compose.ui.util.AsyncImagePreviewHandler import io.getstream.chat.android.compose.ui.util.StreamAsyncImage import io.getstream.chat.android.compose.ui.util.applyIf @@ -242,16 +247,35 @@ public fun GiphyAttachmentContent( contentScale = contentScale, ) - Image( - modifier = Modifier + GiphyLabel( + Modifier .align(Alignment.BottomStart) - .padding(8.dp) - .width(64.dp) - .wrapContentHeight(), - painter = painterResource(R.drawable.stream_compose_giphy_label), + .padding(StreamTokens.spacingXs) + ) + } +} + +@Composable +private fun GiphyLabel(modifier: Modifier) { + val colors = ChatTheme.colors + Row( + modifier = modifier + .background(colors.badgeBgOverlay, RoundedCornerShape(StreamTokens.radiusLg)) + .padding(horizontal = StreamTokens.spacingXs, vertical = StreamTokens.spacing2xs), + horizontalArrangement = Arrangement.spacedBy(StreamTokens.spacing2xs), + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + modifier = Modifier.size(12.dp), + painter = painterResource(R.drawable.stream_ic_command_giphy), contentDescription = null, contentScale = ContentScale.Inside, ) + Text( + text = stringResource(R.string.stream_compose_giphy_label), + style = ChatTheme.typography.metadataEmphasis, + color = colors.badgeTextOnAccent, + ) } } diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamColors.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamColors.kt index b2247a4ccc1..c73a44101e2 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamColors.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamColors.kt @@ -193,8 +193,10 @@ public data class StreamColors( public val textSecondary: Color, public val textTertiary: Color, public val textDisabled: Color, - public val badgeText: Color = textOnAccent, public val badgeBgInverse: Color, + public val badgeBgOverlay: Color, + public val badgeText: Color = textOnAccent, + public val badgeTextOnAccent: Color = textOnAccent, public val stateBgDisabled: Color, public val stateTextDisabled: Color, public val appBackground: Color = backgroundElevationElevation0, @@ -277,6 +279,8 @@ public data class StreamColors( backgroundCoreSurfaceSubtle = StreamPrimitiveColors.slate200, backgroundElevationElevation0 = StreamPrimitiveColors.baseWhite, backgroundElevationElevation2 = StreamPrimitiveColors.baseWhite, + badgeBgInverse = StreamPrimitiveColors.baseBlack, + badgeBgOverlay = StreamPrimitiveColors.baseBlack.copy(alpha = .75f), borderCoreDefault = StreamPrimitiveColors.slate150, borderCoreImage = StreamPrimitiveColors.baseBlack.copy(alpha = .1f), borderCoreOnAccent = StreamPrimitiveColors.baseWhite, @@ -300,7 +304,6 @@ public data class StreamColors( textPrimary = StreamPrimitiveColors.slate900, textSecondary = StreamPrimitiveColors.slate700, textTertiary = StreamPrimitiveColors.slate500, - badgeBgInverse = StreamPrimitiveColors.baseBlack, stateBgDisabled = StreamPrimitiveColors.slate200, stateTextDisabled = StreamPrimitiveColors.slate400, avatarPaletteBg1 = StreamPrimitiveColors.blue100, @@ -393,6 +396,7 @@ public data class StreamColors( textSecondary = StreamPrimitiveColors.neutral300, textTertiary = StreamPrimitiveColors.neutral400, badgeBgInverse = StreamPrimitiveColors.baseBlack, + badgeBgOverlay = StreamPrimitiveColors.baseBlack.copy(alpha = .75f), stateBgDisabled = StreamPrimitiveColors.slate800, stateTextDisabled = StreamPrimitiveColors.slate600, avatarPaletteBg1 = StreamPrimitiveColors.blue800, diff --git a/stream-chat-android-compose/src/main/res/drawable/stream_compose_giphy_label.xml b/stream-chat-android-compose/src/main/res/drawable/stream_compose_giphy_label.xml deleted file mode 100644 index c55bf8f1c98..00000000000 --- a/stream-chat-android-compose/src/main/res/drawable/stream_compose_giphy_label.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - diff --git a/stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_giphy.xml b/stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_giphy.xml deleted file mode 100644 index 4dee06a5342..00000000000 --- a/stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_giphy.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - From a3e409d56f04964382634abde75924335141e4ae Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Wed, 4 Feb 2026 12:25:24 +0100 Subject: [PATCH 05/14] Update StreamColors kdoc --- .../android/compose/ui/theme/StreamColors.kt | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamColors.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamColors.kt index c73a44101e2..f44db45f5e9 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamColors.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamColors.kt @@ -23,7 +23,7 @@ import androidx.compose.ui.res.colorResource import io.getstream.chat.android.compose.R /** - * Contains all the colors in our palette. Each color is used for various things an can be changed to + * Contains all the colors in our palette. Each color is used for various things and can be changed to * customize the app design style. * @param textHighEmphasis Used for main text and active icon status. * @param textHighEmphasisInverse Used for contrasting backgrounds or elements against the main text and active icon @@ -32,7 +32,6 @@ import io.getstream.chat.android.compose.R * @param disabled Used for disabled icons and empty states. * @param borders Used for borders, the background of self messages, selected items, pressed state, button dividers. * @param inputBackground Used for the input background, deleted messages, section headings. - * @param appBackground Used for the default app background and channel list item background. * @param barsBackground Used for button text, top and bottom bar background and other user messages. * @param overlay Used for general overlays and background when opening modals. * @param overlayDark Used for the date separator background color. @@ -49,12 +48,13 @@ import io.getstream.chat.android.compose.R * in the media gallery preview screen. Most visible in placeholders before the images are loaded. * @param imageBackgroundMessageList Used to set the background colour of videos inside the message list. * Most visible in placeholders before the video previews are loaded. - * @param imageBackgroundMediaGalleryPicker Used to set the background colour of videos inside the media gallery picker - * in the media gallery preview screen. Most visible in placeholders before the videos previews are loaded. + * @param videoBackgroundMediaGalleryPicker Used to set the background color of videos inside the media gallery picker + * in the media gallery preview screen. Most visible in placeholders before the video previews are loaded. * @param showMoreOverlay The color of the overlay displaying how many more media attachments the message contains, * given it contains more than can be displayed in the message list media attachment preview. * @param showMoreCountText The color of the text displaying how many more media attachments the message contains, * given it contains more than can be displayed in the message list media attachment preview. + * @param accentBlack Used for black accent elements. * @param accentError Used for destructive actions and error states. * @param accentNeutral Used for neutral accent for low-priority badges. * @param accentSuccess Used for success states and positive actions. @@ -71,9 +71,11 @@ import io.getstream.chat.android.compose.R * @param avatarPaletteText5 Used for avatar text color. * @param backgroundCoreDisabled Used for disabled background in components like buttons. * @param backgroundCoreSurface Used for surface background in components like buttons. + * @param backgroundCoreSurfaceSubtle Used for subtle surface backgrounds. * @param backgroundElevationElevation0 Used for base elevation surface backgrounds. * @param borderCoreImage Used for image frame border treatment. * @param borderCoreDefault Used for default border color. + * @param borderCoreOnAccent Used for borders on accent backgrounds. * @param borderCoreOnDark Used for borders on dark backgrounds. * @param borderCoreSurfaceSubtle Used for very light separators. * @param borderCorePrimary Used for selected or active state border. @@ -94,6 +96,14 @@ import io.getstream.chat.android.compose.R * @param textSecondary Used for secondary text color with lower emphasis. * @param textTertiary Used for tertiary text color with lowest emphasis. * @param textDisabled Used for disabled text and icon color. + * @param badgeBgInverse Used for badge background with inverse color scheme. + * @param badgeBgOverlay Used for badge background when displayed as an overlay. + * @param badgeText Used for badge text color. + * @param badgeTextOnAccent Used for badge text color on accent backgrounds. + * @param stateBgDisabled Used for disabled state background. + * @param stateTextDisabled Used for disabled state text color. + * @param appBackground Used for the default app background. + * @param backgroundCoreSelected Used for selected state background. * @param backgroundElevationElevation2 Used for elevated surface backgrounds at elevation level 2. * @param buttonDestructiveBg Used for destructive button background. * @param buttonDestructiveBorder Used for destructive button border. @@ -115,6 +125,11 @@ import io.getstream.chat.android.compose.R * @param chatReplyIndicatorOutgoing Used for the reply indicator color in outgoing messages. * @param chatTextIncoming Used for incoming message text color in chat bubbles. * @param chatTextOutgoing Used for outgoing message text color in chat bubbles. + * @param chatTextLink Used for link text color in chat messages. + * @param chatTextMention Used for mention text color in chat messages. + * @param chatTextTimestamp Used for timestamp text color in chat messages. + * @param controlPlayControlBg Used for play control button background. + * @param controlPlayControlIcon Used for play control button icon. * @param controlRemoveBg Used for remove control background. * @param controlRemoveBorder Used for remove control border. * @param controlRemoveIcon Used for remove control icon. From d63e391f3872f2aace9df1de866799e776f28c94 Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Wed, 4 Feb 2026 14:08:07 +0100 Subject: [PATCH 06/14] Static checks --- .../api/stream-chat-android-compose.api | 12 ++++++++---- .../ui/attachments/content/GiphyAttachmentContent.kt | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/stream-chat-android-compose/api/stream-chat-android-compose.api b/stream-chat-android-compose/api/stream-chat-android-compose.api index 0d95a261a10..cd88e680810 100644 --- a/stream-chat-android-compose/api/stream-chat-android-compose.api +++ b/stream-chat-android-compose/api/stream-chat-android-compose.api @@ -3673,8 +3673,8 @@ public final class io/getstream/chat/android/compose/ui/theme/ReactionOptionsThe public final class io/getstream/chat/android/compose/ui/theme/StreamColors { public static final field $stable I public static final field Companion Lio/getstream/chat/android/compose/ui/theme/StreamColors$Companion; - public synthetic fun (JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJIIIILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJLkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJIIIILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJLkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1-0d7_KjU ()J public final fun component10-0d7_KjU ()J public final fun component100-0d7_KjU ()J @@ -3682,6 +3682,8 @@ public final class io/getstream/chat/android/compose/ui/theme/StreamColors { public final fun component102-0d7_KjU ()J public final fun component103-0d7_KjU ()J public final fun component104-0d7_KjU ()J + public final fun component105-0d7_KjU ()J + public final fun component106-0d7_KjU ()J public final fun component11-0d7_KjU ()J public final fun component12-0d7_KjU ()J public final fun component13-0d7_KjU ()J @@ -3779,8 +3781,8 @@ public final class io/getstream/chat/android/compose/ui/theme/StreamColors { public final fun component97-0d7_KjU ()J public final fun component98-0d7_KjU ()J public final fun component99-0d7_KjU ()J - public final fun copy-rabOOY8 (JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ)Lio/getstream/chat/android/compose/ui/theme/StreamColors; - public static synthetic fun copy-rabOOY8$default (Lio/getstream/chat/android/compose/ui/theme/StreamColors;JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJIIIILjava/lang/Object;)Lio/getstream/chat/android/compose/ui/theme/StreamColors; + public final fun copy-_FuyHbg (JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ)Lio/getstream/chat/android/compose/ui/theme/StreamColors; + public static synthetic fun copy-_FuyHbg$default (Lio/getstream/chat/android/compose/ui/theme/StreamColors;JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJIIIILjava/lang/Object;)Lio/getstream/chat/android/compose/ui/theme/StreamColors; public fun equals (Ljava/lang/Object;)Z public final fun getAccentBlack-0d7_KjU ()J public final fun getAccentError-0d7_KjU ()J @@ -3805,7 +3807,9 @@ public final class io/getstream/chat/android/compose/ui/theme/StreamColors { public final fun getBackgroundElevationElevation0-0d7_KjU ()J public final fun getBackgroundElevationElevation2-0d7_KjU ()J public final fun getBadgeBgInverse-0d7_KjU ()J + public final fun getBadgeBgOverlay-0d7_KjU ()J public final fun getBadgeText-0d7_KjU ()J + public final fun getBadgeTextOnAccent-0d7_KjU ()J public final fun getBarsBackground-0d7_KjU ()J public final fun getBorderCoreDefault-0d7_KjU ()J public final fun getBorderCoreImage-0d7_KjU ()J diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt index c5ae93c5c07..addf1aa91c4 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt @@ -250,7 +250,7 @@ public fun GiphyAttachmentContent( GiphyLabel( Modifier .align(Alignment.BottomStart) - .padding(StreamTokens.spacingXs) + .padding(StreamTokens.spacingXs), ) } } From 280af2fbbb7ac48983736a5b9d705f669f0df439 Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Wed, 4 Feb 2026 14:12:00 +0100 Subject: [PATCH 07/14] Update snapshot --- ...tsContentTest_giphy_attachment_content.png | Bin 10371 -> 10497 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.attachments.content_AttachmentsContentTest_giphy_attachment_content.png b/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.attachments.content_AttachmentsContentTest_giphy_attachment_content.png index c0f781720d1dfcba1b9b8cf852f87ad47bbc6b7b..315fbd89ac7b82e35127cb21eda67d5d7eb66211 100644 GIT binary patch literal 10497 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 XL;9RkWIxzk2pm3eY=7y#Ge7<>P4x91 From 6a6144bb7a01ac916477955bca007351c0600e45 Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Wed, 4 Feb 2026 14:26:57 +0100 Subject: [PATCH 08/14] Extract giphy size calculation to its own function --- .../content/GiphyAttachmentContent.kt | 90 ++++++++++--------- 1 file changed, 50 insertions(+), 40 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt index addf1aa91c4..43a008d7bfb 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt @@ -65,6 +65,7 @@ import io.getstream.chat.android.compose.ui.util.shouldBeDisplayedAsFullSizeAtta import io.getstream.chat.android.models.Attachment import io.getstream.chat.android.models.AttachmentType import io.getstream.chat.android.models.Message +import io.getstream.chat.android.ui.common.utils.GiphyInfo import io.getstream.chat.android.ui.common.utils.GiphyInfoType import io.getstream.chat.android.ui.common.utils.GiphySizingMode import io.getstream.chat.android.ui.common.utils.giphyInfo @@ -173,48 +174,9 @@ public fun GiphyAttachmentContent( "Missing preview URL." } - val density = LocalDensity.current - val giphyInfo = attachment.giphyInfo(giphyInfoType) - val maxWidth = ChatTheme.dimens.attachmentsContentGiphyMaxWidth - val maxHeight = ChatTheme.dimens.attachmentsContentGiphyMaxHeight - - val width = ChatTheme.dimens.attachmentsContentGiphyWidth - val height = ChatTheme.dimens.attachmentsContentGiphyHeight - - val giphyDimensions: DpSize = remember(giphyInfo) { - if (giphyInfo != null) { - with(density) { - val giphyWidth = giphyInfo.width.toDp() - val giphyHeight = giphyInfo.height.toDp() - - when { - giphySizingMode == GiphySizingMode.FIXED_SIZE -> { - DpSize( - width = width.coerceIn( - minimumValue = null, - maximumValue = maxWidth, - ), - height = height.coerceIn( - minimumValue = null, - maximumValue = maxHeight, - ), - ) - } - - else -> calculateResultingDimensions( - maxWidth = maxWidth, - maxHeight = maxHeight, - giphyWidth = giphyWidth, - giphyHeight = giphyHeight, - ) - } - } - } else { - DpSize(maxWidth, maxHeight) - } - } + val giphyDimensions: DpSize = calculateSize(giphyInfo, giphySizingMode) val shouldBeFullSize = message.shouldBeDisplayedAsFullSizeAttachment() Box( @@ -255,6 +217,54 @@ public fun GiphyAttachmentContent( } } +@Composable +private fun calculateSize( + giphyInfo: GiphyInfo?, + giphySizingMode: GiphySizingMode, +): DpSize { + val density = LocalDensity.current + + val maxWidth = ChatTheme.dimens.attachmentsContentGiphyMaxWidth + val maxHeight = ChatTheme.dimens.attachmentsContentGiphyMaxHeight + + val width = ChatTheme.dimens.attachmentsContentGiphyWidth + val height = ChatTheme.dimens.attachmentsContentGiphyHeight + + val giphyDimensions: DpSize = remember(giphyInfo, density, maxWidth, width, maxHeight, height) { + if (giphyInfo != null) { + with(density) { + val giphyWidth = giphyInfo.width.toDp() + val giphyHeight = giphyInfo.height.toDp() + + when { + giphySizingMode == GiphySizingMode.FIXED_SIZE -> { + DpSize( + width = width.coerceIn( + minimumValue = null, + maximumValue = maxWidth, + ), + height = height.coerceIn( + minimumValue = null, + maximumValue = maxHeight, + ), + ) + } + + else -> calculateResultingDimensions( + maxWidth = maxWidth, + maxHeight = maxHeight, + giphyWidth = giphyWidth, + giphyHeight = giphyHeight, + ) + } + } + } else { + DpSize(maxWidth, maxHeight) + } + } + return giphyDimensions +} + @Composable private fun GiphyLabel(modifier: Modifier) { val colors = ChatTheme.colors From ec07f8daab05272cf8a0d9f9f91a24fd81ff9551 Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:44:20 +0100 Subject: [PATCH 09/14] Add missing test tag --- .../compose/ui/attachments/content/GiphyAttachmentContent.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt index 43a008d7bfb..1f4362672d4 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/GiphyAttachmentContent.kt @@ -43,6 +43,7 @@ import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview @@ -181,6 +182,7 @@ public fun GiphyAttachmentContent( val shouldBeFullSize = message.shouldBeDisplayedAsFullSizeAttachment() Box( modifier = modifier + .testTag("Stream_GiphyContent") .size(giphyDimensions) .applyIf(!shouldBeFullSize) { padding(MessageStyling.messageSectionPadding) From bdc2872657ed6f282a7bc0f47139cf299f88561e Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:09:34 +0100 Subject: [PATCH 10/14] Add missing kdoc --- .../compose/ui/theme/ChatComponentFactory.kt | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatComponentFactory.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatComponentFactory.kt index fa1b9158124..0a3417233ae 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatComponentFactory.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatComponentFactory.kt @@ -2894,11 +2894,10 @@ public interface ChatComponentFactory { } /** - * Factory method for creating the content of a file attachment. + * Factory method for creating the content of file attachments in a message. * * @param modifier Modifier for styling the composable. - * @param attachmentState The state of the attachment, containing information about the file. - * [AttachmentPreviewHandler] and the clicked [Attachment]. + * @param attachmentState The state of the attachment. */ @Composable public fun FileAttachmentContent( @@ -2913,6 +2912,12 @@ public interface ChatComponentFactory { ) } + /** + * Factory method for creating the content of Giphy attachments in a message. + * + * @param state The state of the attachment. + * @param modifier Modifier for styling. + */ @Composable public fun GiphyAttachmentContent( state: AttachmentState, @@ -2924,6 +2929,12 @@ public interface ChatComponentFactory { ) } + /** + * Factory method for creating the content of media attachments in a message. + * + * @param state The state of the attachment. + * @param modifier Modifier for styling. + */ @Composable public fun MediaAttachmentContent( state: AttachmentState, From a8059372c1516bbc65d6b30b1b51198c83f57358 Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:50:52 +0100 Subject: [PATCH 11/14] Add more missing test tags --- .../ui/components/messages/GiphyMessageContent.kt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/GiphyMessageContent.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/GiphyMessageContent.kt index d7167f5732e..87e05503f7a 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/GiphyMessageContent.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/GiphyMessageContent.kt @@ -29,6 +29,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview @@ -112,21 +113,27 @@ public fun GiphyMessageContent( onClick = { onGiphyActionClick(SendGiphy(message)) }, text = stringResource(R.string.stream_compose_message_list_giphy_send), style = StreamButtonStyleDefaults.primaryGhost, - modifier = Modifier.weight(1f), + modifier = Modifier + .weight(1f) + .testTag("Stream_GiphyButton_Send"), ) StreamTextButton( onClick = { onGiphyActionClick(ShuffleGiphy(message)) }, text = stringResource(R.string.stream_compose_message_list_giphy_shuffle), style = StreamButtonStyleDefaults.secondaryGhost, - modifier = Modifier.weight(1f), + modifier = Modifier + .weight(1f) + .testTag("Stream_GiphyButton_Shuffle"), ) StreamTextButton( onClick = { onGiphyActionClick(CancelGiphy(message)) }, text = stringResource(R.string.stream_compose_message_list_giphy_cancel), style = StreamButtonStyleDefaults.secondaryGhost, - modifier = Modifier.weight(1f), + modifier = Modifier + .weight(1f) + .testTag("Stream_GiphyButton_Cancel"), ) } } From dc50aa4a57ee88ebf284a6aa6e30b9b41f57badb Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Wed, 4 Feb 2026 17:38:21 +0100 Subject: [PATCH 12/14] Attempt to fix flaky test --- .../android/compose/robots/UserRobotMessageListAsserts.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/stream-chat-android-compose-sample/src/androidTestE2eDebug/kotlin/io/getstream/chat/android/compose/robots/UserRobotMessageListAsserts.kt b/stream-chat-android-compose-sample/src/androidTestE2eDebug/kotlin/io/getstream/chat/android/compose/robots/UserRobotMessageListAsserts.kt index 05c5276b127..797a8d35382 100644 --- a/stream-chat-android-compose-sample/src/androidTestE2eDebug/kotlin/io/getstream/chat/android/compose/robots/UserRobotMessageListAsserts.kt +++ b/stream-chat-android-compose-sample/src/androidTestE2eDebug/kotlin/io/getstream/chat/android/compose/robots/UserRobotMessageListAsserts.kt @@ -304,7 +304,9 @@ fun UserRobot.assertAlsoInTheChannelLabelInThread(): UserRobot { fun UserRobot.assertGiphyImage(isDisplayed: Boolean = true): UserRobot { if (isDisplayed) { - assertTrue(Message.giphy.waitToAppear().isDisplayed()) + device.retryOnStaleObjectException { + assertTrue(Message.giphy.waitToAppear().isDisplayed()) + } } else { assertFalse(Message.giphy.waitToDisappear().isDisplayed()) } From af9a12692178a7a3a5ef9dc5ccdfb53d5c22cf7c Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Thu, 5 Feb 2026 09:36:26 +0100 Subject: [PATCH 13/14] Remove unneeded DefaultMessageGiphyContent --- .../ui/components/messages/MessageContent.kt | 19 ------------------- .../compose/ui/theme/ChatComponentFactory.kt | 4 ++-- 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/MessageContent.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/MessageContent.kt index bade74492f2..0e7a81a7eb5 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/MessageContent.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/MessageContent.kt @@ -106,25 +106,6 @@ public fun MessageContent( } } -/** - * Represents the default ephemeral Giphy message content. - * - * @param message The message to show. - * @param onGiphyActionClick Handler for Giphy actions. - */ -@Composable -internal fun DefaultMessageGiphyContent( - message: Message, - currentUser: User?, - onGiphyActionClick: (GiphyAction) -> Unit, -) { - GiphyMessageContent( - message = message, - currentUser = currentUser, - onGiphyActionClick = onGiphyActionClick, - ) -} - /** * Represents the default deleted message content. * diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatComponentFactory.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatComponentFactory.kt index 0a3417233ae..8ff0662f516 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatComponentFactory.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatComponentFactory.kt @@ -120,7 +120,7 @@ import io.getstream.chat.android.compose.ui.components.composer.MessageInputOpti import io.getstream.chat.android.compose.ui.components.messageoptions.MessageOptions import io.getstream.chat.android.compose.ui.components.messages.DefaultMessageContent import io.getstream.chat.android.compose.ui.components.messages.DefaultMessageDeletedContent -import io.getstream.chat.android.compose.ui.components.messages.DefaultMessageGiphyContent +import io.getstream.chat.android.compose.ui.components.messages.GiphyMessageContent import io.getstream.chat.android.compose.ui.components.messages.MessageComposerQuotedMessage import io.getstream.chat.android.compose.ui.components.messages.MessageFooter import io.getstream.chat.android.compose.ui.components.messages.MessageReactionItem @@ -1226,7 +1226,7 @@ public interface ChatComponentFactory { currentUser: User?, onGiphyActionClick: (GiphyAction) -> Unit, ) { - DefaultMessageGiphyContent( + GiphyMessageContent( message = message, currentUser = currentUser, onGiphyActionClick = onGiphyActionClick, From ab8a454a7b86ad63ceb15d4dcd16338646344162 Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Thu, 5 Feb 2026 18:01:16 +0100 Subject: [PATCH 14/14] Replace icon color with black --- .../src/main/res/drawable/stream_compose_ic_eye_open.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_eye_open.xml b/stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_eye_open.xml index 87b3427546d..6ae6bb7f4d3 100644 --- a/stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_eye_open.xml +++ b/stream-chat-android-compose/src/main/res/drawable/stream_compose_ic_eye_open.xml @@ -21,6 +21,6 @@ android:viewportHeight="16">