diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/MessageTimelineItemStateMapper.kt b/features/messages/src/main/java/io/element/android/x/features/messages/MessageTimelineItemStateMapper.kt index cebf95d4ba..3b6ccd2de7 100644 --- a/features/messages/src/main/java/io/element/android/x/features/messages/MessageTimelineItemStateMapper.kt +++ b/features/messages/src/main/java/io/element/android/x/features/messages/MessageTimelineItemStateMapper.kt @@ -25,6 +25,7 @@ class MessageTimelineItemStateMapper( private val room: MatrixRoom, private val dispatcher: CoroutineDispatcher, ) { + var highlightedEventId: String? = null suspend fun map(timelineItems: List): List = withContext(dispatcher) { @@ -33,7 +34,12 @@ class MessageTimelineItemStateMapper( val currentTimelineItem = timelineItems[index] val timelineItemState = when (currentTimelineItem) { is MatrixTimelineItem.Event -> { - buildMessageEvent(currentTimelineItem, index, timelineItems) + buildMessageEvent( + currentTimelineItem, + index, + timelineItems, + highlightedEventId + ) } is MatrixTimelineItem.Virtual -> MessagesTimelineItemState.Virtual( "virtual_item_$index" @@ -48,7 +54,8 @@ class MessageTimelineItemStateMapper( private suspend fun buildMessageEvent( currentTimelineItem: MatrixTimelineItem.Event, index: Int, - timelineItems: List + timelineItems: List, + highlightedEventId: String?, ): MessagesTimelineItemState.MessageEvent { val currentSender = currentTimelineItem.event.sender() val groupPosition = @@ -68,6 +75,7 @@ class MessageTimelineItemStateMapper( senderAvatar = senderAvatarData, content = currentTimelineItem.computeContent(), isMine = currentTimelineItem.event.isOwn(), + isHighlighted = currentTimelineItem.event.eventId().orEmpty() == highlightedEventId, groupPosition = groupPosition, reactionsState = currentTimelineItem.computeReactionsState() ) diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt index 91c758a28a..d8324c2fe4 100644 --- a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt +++ b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt @@ -382,6 +382,7 @@ fun MessageEventRow( MessageEventBubble( groupPosition = messageEvent.groupPosition, isMine = messageEvent.isMine, + isHighlighted = messageEvent.isHighlighted, onClick = onClick, onLongClick = onLongClick, modifier = Modifier diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesViewModel.kt b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesViewModel.kt index 43bf852318..13bf229d2d 100644 --- a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesViewModel.kt +++ b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesViewModel.kt @@ -18,9 +18,7 @@ import io.element.android.x.matrix.room.MatrixRoom import io.element.android.x.matrix.timeline.MatrixTimeline import io.element.android.x.textcomposer.MessageComposerMode import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import timber.log.Timber @@ -191,7 +189,21 @@ class MessagesViewModel( } }.launchIn(viewModelScope) - timeline.timelineItems() + combine( + timeline.timelineItems(), + stateFlow + .map { it.composerMode } + .distinctUntilChanged() + ) { timelineItems, messageComposerMode -> + // Set the highlightedEventId to messageTimelineItemStateMapper, before the mapping occurs + messageTimelineItemStateMapper.highlightedEventId = when (messageComposerMode) { + is MessageComposerMode.Normal -> null + is MessageComposerMode.Edit -> messageComposerMode.eventId + is MessageComposerMode.Quote -> null + is MessageComposerMode.Reply -> messageComposerMode.eventId + } + timelineItems + } .map(messageTimelineItemStateMapper::map) .execute { copy(timelineItems = it) diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/components/MessageEventBubble.kt b/features/messages/src/main/java/io/element/android/x/features/messages/components/MessageEventBubble.kt index f687fdd468..a0b17e4005 100644 --- a/features/messages/src/main/java/io/element/android/x/features/messages/components/MessageEventBubble.kt +++ b/features/messages/src/main/java/io/element/android/x/features/messages/components/MessageEventBubble.kt @@ -24,6 +24,7 @@ private val BUBBLE_RADIUS = 16.dp fun MessageEventBubble( groupPosition: MessagesItemGroupPosition, isMine: Boolean, + isHighlighted: Boolean, modifier: Modifier = Modifier, onClick: () -> Unit, onLongClick: () -> Unit, @@ -64,17 +65,25 @@ fun MessageEventBubble( } } - val backgroundBubbleColor = if (isMine) { + val backgroundBubbleColor = if (isHighlighted) { if (LocalIsDarkTheme.current) { - SystemGrey5Dark + MessageHighlightDark } else { - SystemGrey5Light + MessageHighlightLight } } else { - if (LocalIsDarkTheme.current) { - SystemGrey6Dark + if (isMine) { + if (LocalIsDarkTheme.current) { + SystemGrey5Dark + } else { + SystemGrey5Light + } } else { - SystemGrey6Light + if (LocalIsDarkTheme.current) { + SystemGrey6Dark + } else { + SystemGrey6Light + } } } val bubbleShape = bubbleShape() diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/model/MessagesTimelineItemState.kt b/features/messages/src/main/java/io/element/android/x/features/messages/model/MessagesTimelineItemState.kt index e194e9a1a4..5e24423059 100644 --- a/features/messages/src/main/java/io/element/android/x/features/messages/model/MessagesTimelineItemState.kt +++ b/features/messages/src/main/java/io/element/android/x/features/messages/model/MessagesTimelineItemState.kt @@ -16,6 +16,7 @@ sealed interface MessagesTimelineItemState { val content: MessagesTimelineItemContent, val sentTime: String = "", val isMine: Boolean = false, + val isHighlighted: Boolean = false, val groupPosition: MessagesItemGroupPosition = MessagesItemGroupPosition.None, val reactionsState: MessagesItemReactionState ) : MessagesTimelineItemState { diff --git a/libraries/designsystem/src/main/java/io/element/android/x/designsystem/Color.kt b/libraries/designsystem/src/main/java/io/element/android/x/designsystem/Color.kt index 33925b8fbc..4ad0a1e99a 100644 --- a/libraries/designsystem/src/main/java/io/element/android/x/designsystem/Color.kt +++ b/libraries/designsystem/src/main/java/io/element/android/x/designsystem/Color.kt @@ -34,3 +34,8 @@ val Melon = Color(0xFFFF812D) val ElementGreen = Color(0xFF0DBD8B) val ElementOrange = Color(0xFFD9B072) val Vermilion = Color(0xFFFF5B55) + +// TODO Update color +val MessageHighlightLight = Azure +// TODO Update color +val MessageHighlightDark = Azure