Fix message long click not always working (#714)
This commit is contained in:
parent
c7fd9d7a4e
commit
01ef0ac136
3 changed files with 16 additions and 5 deletions
|
|
@ -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.core.extensions.to01
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
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.Surface
|
||||||
import io.element.android.libraries.designsystem.theme.components.Text
|
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_RADIUS = 12.dp
|
||||||
private val BUBBLE_INCOMING_OFFSET = 16.dp
|
private val BUBBLE_INCOMING_OFFSET = 16.dp
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,8 @@
|
||||||
|
|
||||||
package io.element.android.features.messages.impl.timeline.components
|
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.interaction.MutableInteractionSource
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.foundation.layout.Spacer
|
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.matrix.api.timeline.item.event.EventSendState
|
||||||
import io.element.android.libraries.ui.strings.CommonStrings
|
import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
|
|
||||||
|
@OptIn(ExperimentalFoundationApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun TimelineEventTimestampView(
|
fun TimelineEventTimestampView(
|
||||||
event: TimelineItem.Event,
|
event: TimelineItem.Event,
|
||||||
onClick: () -> Unit,
|
onClick: () -> Unit,
|
||||||
modifier: Modifier = Modifier
|
onLongClick: () -> Unit,
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
val formattedTime = event.sentTime
|
val formattedTime = event.sentTime
|
||||||
val hasMessageSendingFailed = event.sendState is EventSendState.SendingFailed
|
val hasMessageSendingFailed = event.sendState is EventSendState.SendingFailed
|
||||||
|
|
@ -57,8 +60,9 @@ fun TimelineEventTimestampView(
|
||||||
val tint = if (hasMessageSendingFailed) MaterialTheme.colorScheme.error else null
|
val tint = if (hasMessageSendingFailed) MaterialTheme.colorScheme.error else null
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.clickable(
|
.combinedClickable(
|
||||||
onClick = onClick,
|
onClick = onClick,
|
||||||
|
onLongClick = onLongClick,
|
||||||
enabled = true,
|
enabled = true,
|
||||||
indication = rememberRipple(bounded = false),
|
indication = rememberRipple(bounded = false),
|
||||||
interactionSource = MutableInteractionSource()
|
interactionSource = MutableInteractionSource()
|
||||||
|
|
@ -101,6 +105,7 @@ internal fun TimelineEventTimestampViewDarkPreview(@PreviewParameter(TimelineIte
|
||||||
private fun ContentToPreview(event: TimelineItem.Event) {
|
private fun ContentToPreview(event: TimelineItem.Event) {
|
||||||
TimelineEventTimestampView(
|
TimelineEventTimestampView(
|
||||||
event = event,
|
event = event,
|
||||||
onClick = {}
|
onClick = {},
|
||||||
|
onLongClick = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -227,6 +227,10 @@ private fun MessageEventBubbleContent(
|
||||||
val isMediaItem = event.content is TimelineItemImageContent || event.content is TimelineItemVideoContent
|
val isMediaItem = event.content is TimelineItemImageContent || event.content is TimelineItemVideoContent
|
||||||
val replyToDetails = event.inReplyTo as? InReplyTo.Ready
|
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
|
@Composable
|
||||||
fun ContentView(
|
fun ContentView(
|
||||||
modifier: Modifier = Modifier
|
modifier: Modifier = Modifier
|
||||||
|
|
@ -254,6 +258,7 @@ private fun MessageEventBubbleContent(
|
||||||
TimelineEventTimestampView(
|
TimelineEventTimestampView(
|
||||||
event = event,
|
event = event,
|
||||||
onClick = onTimestampClicked,
|
onClick = onTimestampClicked,
|
||||||
|
onLongClick = ::onTimestampLongClick,
|
||||||
modifier = timestampModifier
|
modifier = timestampModifier
|
||||||
.padding(horizontal = 4.dp, vertical = 4.dp) // Outer padding
|
.padding(horizontal = 4.dp, vertical = 4.dp) // Outer padding
|
||||||
.background(ElementTheme.legacyColors.gray300, RoundedCornerShape(10.0.dp))
|
.background(ElementTheme.legacyColors.gray300, RoundedCornerShape(10.0.dp))
|
||||||
|
|
@ -267,6 +272,7 @@ private fun MessageEventBubbleContent(
|
||||||
TimelineEventTimestampView(
|
TimelineEventTimestampView(
|
||||||
event = event,
|
event = event,
|
||||||
onClick = onTimestampClicked,
|
onClick = onTimestampClicked,
|
||||||
|
onLongClick = ::onTimestampLongClick,
|
||||||
modifier = timestampModifier
|
modifier = timestampModifier
|
||||||
.align(Alignment.BottomEnd)
|
.align(Alignment.BottomEnd)
|
||||||
.padding(horizontal = 8.dp, vertical = 4.dp)
|
.padding(horizontal = 8.dp, vertical = 4.dp)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue