From 0dfca7f137ba34b7f14b9526b19e12bca03e3078 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 28 Jun 2023 15:44:30 +0000 Subject: [PATCH] Fix message long click not always working (#714) --- .../impl/timeline/components/MessageEventBubble.kt | 2 +- .../components/TimelineEventTimestampView.kt | 13 +++++++++---- .../timeline/components/TimelineItemEventRow.kt | 6 ++++++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageEventBubble.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageEventBubble.kt index 4267c1e4e5..a3529d5ccb 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageEventBubble.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageEventBubble.kt @@ -42,9 +42,9 @@ import io.element.android.features.messages.impl.timeline.model.bubble.BubbleSta import io.element.android.libraries.core.extensions.to01 import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight -import io.element.android.libraries.theme.ElementTheme import io.element.android.libraries.designsystem.theme.components.Surface import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.theme.ElementTheme private val BUBBLE_RADIUS = 12.dp private val BUBBLE_INCOMING_OFFSET = 16.dp diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt index 651ef0063f..f97a12d697 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt @@ -16,7 +16,8 @@ package io.element.android.features.messages.impl.timeline.components -import androidx.compose.foundation.clickable +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -45,11 +46,13 @@ import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.matrix.api.timeline.item.event.EventSendState import io.element.android.libraries.ui.strings.CommonStrings +@OptIn(ExperimentalFoundationApi::class) @Composable fun TimelineEventTimestampView( event: TimelineItem.Event, onClick: () -> Unit, - modifier: Modifier = Modifier + onLongClick: () -> Unit, + modifier: Modifier = Modifier, ) { val formattedTime = event.sentTime val hasMessageSendingFailed = event.sendState is EventSendState.SendingFailed @@ -57,8 +60,9 @@ fun TimelineEventTimestampView( val tint = if (hasMessageSendingFailed) MaterialTheme.colorScheme.error else null Row( modifier = Modifier - .clickable( + .combinedClickable( onClick = onClick, + onLongClick = onLongClick, enabled = true, indication = rememberRipple(bounded = false), interactionSource = MutableInteractionSource() @@ -101,6 +105,7 @@ internal fun TimelineEventTimestampViewDarkPreview(@PreviewParameter(TimelineIte private fun ContentToPreview(event: TimelineItem.Event) { TimelineEventTimestampView( event = event, - onClick = {} + onClick = {}, + onLongClick = {}, ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt index b42b534dd2..c9505ee507 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt @@ -227,6 +227,10 @@ private fun MessageEventBubbleContent( val isMediaItem = event.content is TimelineItemImageContent || event.content is TimelineItemVideoContent val replyToDetails = event.inReplyTo as? InReplyTo.Ready + // Long clicks are not not automatically propagated from a `clickable` + // to its `combinedClickable` parent so we do it manually + fun onTimestampLongClick() = onMessageLongClick() + @Composable fun ContentView( modifier: Modifier = Modifier @@ -254,6 +258,7 @@ private fun MessageEventBubbleContent( TimelineEventTimestampView( event = event, onClick = onTimestampClicked, + onLongClick = ::onTimestampLongClick, modifier = timestampModifier .padding(horizontal = 4.dp, vertical = 4.dp) // Outer padding .background(ElementTheme.legacyColors.gray300, RoundedCornerShape(10.0.dp)) @@ -267,6 +272,7 @@ private fun MessageEventBubbleContent( TimelineEventTimestampView( event = event, onClick = onTimestampClicked, + onLongClick = ::onTimestampLongClick, modifier = timestampModifier .align(Alignment.BottomEnd) .padding(horizontal = 8.dp, vertical = 4.dp)