Skip to content

Commit 2405542

Browse files
authored
Fix long click not working for media timeline items (#3879)
1 parent 7222a1f commit 2405542

File tree

11 files changed

+46
-29
lines changed

11 files changed

+46
-29
lines changed

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListView.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ private fun TimelineItemEventContentViewWrapper(
265265
eventSink = { },
266266
modifier = modifier,
267267
onContentClick = onContentClick,
268+
onLongClick = null,
268269
onContentLayoutChange = onContentLayoutChange
269270
)
270271
}

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/ATimelineItemEventRow.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ internal fun ATimelineItemEventRow(
3030
timelineProtectionState = timelineProtectionState,
3131
isLastOutgoingMessage = isLastOutgoingMessage,
3232
isHighlighted = isHighlighted,
33-
onContentClick = {},
33+
onEventClick = {},
3434
onLongClick = {},
3535
onLinkClick = {},
3636
onUserDataClick = {},

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ fun TimelineItemEventRow(
114114
renderReadReceipts: Boolean,
115115
isLastOutgoingMessage: Boolean,
116116
isHighlighted: Boolean,
117-
onContentClick: () -> Unit,
117+
onEventClick: () -> Unit,
118118
onLongClick: () -> Unit,
119119
onLinkClick: (String) -> Unit,
120120
onUserDataClick: (UserId) -> Unit,
@@ -127,10 +127,14 @@ fun TimelineItemEventRow(
127127
eventSink: (TimelineEvents.EventFromTimelineItem) -> Unit,
128128
modifier: Modifier = Modifier,
129129
eventContentView: @Composable (Modifier, (ContentAvoidingLayoutData) -> Unit) -> Unit = { contentModifier, onContentLayoutChange ->
130+
// Only pass down a custom clickable lambda if the content can be clicked separately
131+
val onContentClick = onEventClick.takeUnless { event.isWholeContentClickable }
132+
130133
TimelineItemEventContentView(
131134
content = event.content,
132135
hideMediaContent = timelineProtectionState.hideMediaContent(event.eventId),
133136
onContentClick = onContentClick,
137+
onLongClick = onLongClick,
134138
onShowContentClick = { timelineProtectionState.eventSink(TimelineProtectionEvent.ShowContent(event.eventId)) },
135139
onLinkClick = onLinkClick,
136140
eventSink = eventSink,
@@ -151,12 +155,6 @@ fun TimelineItemEventRow(
151155
inReplyToClick(inReplyToEventId)
152156
}
153157

154-
val onWholeItemClick = if (event.isWholeContentClickable) {
155-
onContentClick
156-
} else {
157-
{}
158-
}
159-
160158
Column(modifier = modifier.fillMaxWidth()) {
161159
if (event.groupPosition.isNew()) {
162160
Spacer(modifier = Modifier.height(16.dp))
@@ -180,7 +178,7 @@ fun TimelineItemEventRow(
180178
isHighlighted = isHighlighted,
181179
timelineRoomInfo = timelineRoomInfo,
182180
interactionSource = interactionSource,
183-
onContentClick = onWholeItemClick,
181+
onContentClick = onEventClick,
184182
onLongClick = onLongClick,
185183
inReplyToClick = ::inReplyToClick,
186184
onUserDataClick = ::onUserDataClick,
@@ -214,7 +212,7 @@ fun TimelineItemEventRow(
214212
isHighlighted = isHighlighted,
215213
timelineRoomInfo = timelineRoomInfo,
216214
interactionSource = interactionSource,
217-
onContentClick = onWholeItemClick,
215+
onContentClick = onEventClick,
218216
onLongClick = onLongClick,
219217
inReplyToClick = ::inReplyToClick,
220218
onUserDataClick = ::onUserDataClick,

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ fun TimelineItemGroupedEventsRow(
6161
onLinkClick = onLinkClick,
6262
eventSink = eventSink,
6363
modifier = contentModifier,
64-
onContentClick = {},
64+
onContentClick = null,
65+
onLongClick = null,
6566
onContentLayoutChange = onContentLayoutChange
6667
)
6768
},
@@ -126,7 +127,8 @@ private fun TimelineItemGroupedEventsRowContent(
126127
onLinkClick = onLinkClick,
127128
eventSink = eventSink,
128129
modifier = contentModifier,
129-
onContentClick = {},
130+
onContentClick = null,
131+
onLongClick = null,
130132
onContentLayoutChange = onContentLayoutChange
131133
)
132134
},

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ internal fun TimelineItemRow(
6161
hideMediaContent = timelineProtectionState.hideMediaContent(event.eventId),
6262
onShowContentClick = { timelineProtectionState.eventSink(TimelineProtectionEvent.ShowContent(event.eventId)) },
6363
onContentClick = { onContentClick(event) },
64+
onLongClick = { onLongClick(event) },
6465
onLinkClick = onLinkClick,
6566
eventSink = eventSink,
6667
modifier = contentModifier,
@@ -118,7 +119,7 @@ internal fun TimelineItemRow(
118119
timelineProtectionState = timelineProtectionState,
119120
isLastOutgoingMessage = isLastOutgoingMessage,
120121
isHighlighted = timelineItem.isEvent(focusedEventId),
121-
onContentClick = { onContentClick(timelineItem) },
122+
onEventClick = { onContentClick(timelineItem) },
122123
onLongClick = { onLongClick(timelineItem) },
123124
onLinkClick = onLinkClick,
124125
onUserDataClick = onUserDataClick,

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemStateEventRow.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ fun TimelineItemStateEventRow(
7474
hideMediaContent = false,
7575
onShowContentClick = {},
7676
eventSink = eventSink,
77-
onContentClick = {},
77+
onContentClick = null,
78+
onLongClick = null,
7879
modifier = Modifier.defaultTimelineContentPadding()
7980
)
8081
}

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEventContentView.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ import io.element.android.libraries.architecture.Presenter
3636
fun TimelineItemEventContentView(
3737
content: TimelineItemEventContent,
3838
hideMediaContent: Boolean,
39-
onContentClick: () -> Unit,
39+
onContentClick: (() -> Unit)?,
40+
onLongClick: (() -> Unit)?,
4041
onShowContentClick: () -> Unit,
4142
onLinkClick: (url: String) -> Unit,
4243
eventSink: (TimelineEvents.EventFromTimelineItem) -> Unit,
@@ -68,13 +69,13 @@ fun TimelineItemEventContentView(
6869
)
6970
is TimelineItemLocationContent -> TimelineItemLocationView(
7071
content = content,
71-
onContentClick = onContentClick,
7272
modifier = modifier
7373
)
7474
is TimelineItemImageContent -> TimelineItemImageView(
7575
content = content,
7676
hideMediaContent = hideMediaContent,
7777
onContentClick = onContentClick,
78+
onLongClick = onLongClick,
7879
onShowContentClick = onShowContentClick,
7980
onLinkClick = onLinkClick,
8081
onContentLayoutChange = onContentLayoutChange,
@@ -84,13 +85,15 @@ fun TimelineItemEventContentView(
8485
content = content,
8586
hideMediaContent = hideMediaContent,
8687
onContentClick = onContentClick,
88+
onLongClick = onLongClick,
8789
onShowClick = onShowContentClick,
8890
modifier = modifier,
8991
)
9092
is TimelineItemVideoContent -> TimelineItemVideoView(
9193
content = content,
9294
hideMediaContent = hideMediaContent,
9395
onContentClick = onContentClick,
96+
onLongClick = onLongClick,
9497
onShowContentClick = onShowContentClick,
9598
onLinkClick = onLinkClick,
9699
onContentLayoutChange = onContentLayoutChange,

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
package io.element.android.features.messages.impl.timeline.components.event
99

1010
import android.text.SpannedString
11+
import androidx.compose.foundation.ExperimentalFoundationApi
1112
import androidx.compose.foundation.background
12-
import androidx.compose.foundation.clickable
13+
import androidx.compose.foundation.combinedClickable
1314
import androidx.compose.foundation.layout.Column
1415
import androidx.compose.foundation.layout.Spacer
1516
import androidx.compose.foundation.layout.fillMaxWidth
@@ -55,11 +56,13 @@ import io.element.android.libraries.textcomposer.ElementRichTextEditorStyle
5556
import io.element.android.libraries.ui.strings.CommonStrings
5657
import io.element.android.wysiwyg.compose.EditorStyledText
5758

59+
@OptIn(ExperimentalFoundationApi::class)
5860
@Composable
5961
fun TimelineItemImageView(
6062
content: TimelineItemImageContent,
6163
hideMediaContent: Boolean,
62-
onContentClick: () -> Unit,
64+
onContentClick: (() -> Unit)?,
65+
onLongClick: (() -> Unit)?,
6366
onLinkClick: (String) -> Unit,
6467
onShowContentClick: () -> Unit,
6568
onContentLayoutChange: (ContentAvoidingLayoutData) -> Unit,
@@ -87,7 +90,7 @@ fun TimelineItemImageView(
8790
modifier = Modifier
8891
.fillMaxWidth()
8992
.then(if (isLoaded) Modifier.background(Color.White) else Modifier)
90-
.clickable(onClick = onContentClick),
93+
.then(if (onContentClick != null) Modifier.combinedClickable(onClick = onContentClick, onLongClick = onLongClick) else Modifier),
9194
model = content.thumbnailMediaRequestData,
9295
contentScale = ContentScale.Fit,
9396
alignment = Alignment.Center,
@@ -132,6 +135,7 @@ internal fun TimelineItemImageViewPreview(@PreviewParameter(TimelineItemImageCon
132135
hideMediaContent = false,
133136
onShowContentClick = {},
134137
onContentClick = {},
138+
onLongClick = {},
135139
onLinkClick = {},
136140
onContentLayoutChange = {},
137141
)
@@ -145,6 +149,7 @@ internal fun TimelineItemImageViewHideMediaContentPreview() = ElementPreview {
145149
hideMediaContent = true,
146150
onShowContentClick = {},
147151
onContentClick = {},
152+
onLongClick = {},
148153
onLinkClick = {},
149154
onContentLayoutChange = {},
150155
)

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemLocationView.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
package io.element.android.features.messages.impl.timeline.components.event
99

10-
import androidx.compose.foundation.clickable
1110
import androidx.compose.foundation.layout.Column
1211
import androidx.compose.foundation.layout.fillMaxWidth
1312
import androidx.compose.foundation.layout.heightIn
@@ -26,10 +25,9 @@ import io.element.android.libraries.designsystem.theme.components.Text
2625
@Composable
2726
fun TimelineItemLocationView(
2827
content: TimelineItemLocationContent,
29-
onContentClick: () -> Unit,
3028
modifier: Modifier = Modifier,
3129
) {
32-
Column(modifier = modifier.clickable(onClick = onContentClick).fillMaxWidth()) {
30+
Column(modifier = modifier.fillMaxWidth()) {
3331
content.description?.let {
3432
Text(
3533
text = it,
@@ -55,6 +53,5 @@ internal fun TimelineItemLocationViewPreview(@PreviewParameter(TimelineItemLocat
5553
ElementPreview {
5654
TimelineItemLocationView(
5755
content = content,
58-
onContentClick = {},
5956
)
6057
}

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemStickerView.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77

88
package io.element.android.features.messages.impl.timeline.components.event
99

10+
import androidx.compose.foundation.ExperimentalFoundationApi
1011
import androidx.compose.foundation.background
11-
import androidx.compose.foundation.clickable
12+
import androidx.compose.foundation.combinedClickable
1213
import androidx.compose.foundation.layout.Column
1314
import androidx.compose.foundation.layout.fillMaxSize
1415
import androidx.compose.runtime.Composable
@@ -37,11 +38,13 @@ import io.element.android.libraries.ui.strings.CommonStrings
3738

3839
private const val STICKER_SIZE_IN_DP = 128
3940

41+
@OptIn(ExperimentalFoundationApi::class)
4042
@Composable
4143
fun TimelineItemStickerView(
4244
content: TimelineItemStickerContent,
4345
hideMediaContent: Boolean,
44-
onContentClick: () -> Unit,
46+
onContentClick: (() -> Unit)?,
47+
onLongClick: (() -> Unit)?,
4548
onShowClick: () -> Unit,
4649
modifier: Modifier = Modifier,
4750
) {
@@ -64,7 +67,7 @@ fun TimelineItemStickerView(
6467
modifier = Modifier
6568
.fillMaxSize()
6669
.then(if (isLoaded) Modifier.background(Color.White) else Modifier)
67-
.clickable(onClick = onContentClick),
70+
.then(if (onContentClick != null) Modifier.combinedClickable(onClick = onContentClick, onLongClick = onLongClick) else Modifier),
6871
model = MediaRequestData(
6972
source = content.preferredMediaSource,
7073
kind = MediaRequestData.Kind.File(
@@ -89,6 +92,7 @@ internal fun TimelineItemStickerViewPreview(@PreviewParameter(TimelineItemSticke
8992
content = content,
9093
hideMediaContent = false,
9194
onContentClick = {},
95+
onLongClick = {},
9296
onShowClick = {},
9397
)
9498
}

0 commit comments

Comments
 (0)