Improve TimelineItemEventRowWithReplyPreview and coverage for fun attachmentThumbnailInfoForInReplyTo
This commit is contained in:
parent
1b872b074f
commit
5e44722b51
1 changed files with 93 additions and 16 deletions
|
|
@ -18,6 +18,8 @@ package io.element.android.features.messages.impl.timeline.components
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
import io.element.android.features.messages.impl.timeline.aTimelineItemEvent
|
import io.element.android.features.messages.impl.timeline.aTimelineItemEvent
|
||||||
import io.element.android.features.messages.impl.timeline.aTimelineItemReactions
|
import io.element.android.features.messages.impl.timeline.aTimelineItemReactions
|
||||||
import io.element.android.features.messages.impl.timeline.model.InReplyToDetails
|
import io.element.android.features.messages.impl.timeline.model.InReplyToDetails
|
||||||
|
|
@ -28,21 +30,29 @@ import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||||
import io.element.android.libraries.matrix.api.core.EventId
|
import io.element.android.libraries.matrix.api.core.EventId
|
||||||
import io.element.android.libraries.matrix.api.core.UserId
|
import io.element.android.libraries.matrix.api.core.UserId
|
||||||
|
import io.element.android.libraries.matrix.api.media.MediaSource
|
||||||
|
import io.element.android.libraries.matrix.api.poll.PollKind
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.AudioMessageType
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.EmoteMessageType
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.EventContent
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.FileMessageType
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.ImageMessageType
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.LocationMessageType
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.MessageContent
|
import io.element.android.libraries.matrix.api.timeline.item.event.MessageContent
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.MessageType
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.NoticeMessageType
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.PollContent
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.TextMessageType
|
import io.element.android.libraries.matrix.api.timeline.item.event.TextMessageType
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.VideoMessageType
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.VoiceMessageType
|
||||||
|
|
||||||
@PreviewsDayNight
|
@PreviewsDayNight
|
||||||
@Composable
|
@Composable
|
||||||
internal fun TimelineItemEventRowWithReplyPreview() = ElementPreview {
|
internal fun TimelineItemEventRowWithReplyPreview(
|
||||||
|
@PreviewParameter(InReplyToDetailsProvider::class) inReplyToDetails: InReplyToDetails,
|
||||||
|
) = ElementPreview {
|
||||||
Column {
|
Column {
|
||||||
sequenceOf(false, true).forEach {
|
sequenceOf(false, true).forEach {
|
||||||
val replyContent = if (it) {
|
|
||||||
// Short
|
|
||||||
"Message which are being replied."
|
|
||||||
} else {
|
|
||||||
// Long, to test 2 lines and ellipsis)
|
|
||||||
"Message which are being replied, and which was long enough to be displayed on two lines (only!)."
|
|
||||||
}
|
|
||||||
TimelineItemEventRow(
|
TimelineItemEventRow(
|
||||||
event = aTimelineItemEvent(
|
event = aTimelineItemEvent(
|
||||||
isMine = it,
|
isMine = it,
|
||||||
|
|
@ -50,7 +60,7 @@ internal fun TimelineItemEventRowWithReplyPreview() = ElementPreview {
|
||||||
content = aTimelineItemTextContent().copy(
|
content = aTimelineItemTextContent().copy(
|
||||||
body = "A reply."
|
body = "A reply."
|
||||||
),
|
),
|
||||||
inReplyTo = aInReplyToDetails(replyContent),
|
inReplyTo = inReplyToDetails,
|
||||||
groupPosition = TimelineItemGroupPosition.First,
|
groupPosition = TimelineItemGroupPosition.First,
|
||||||
),
|
),
|
||||||
showReadReceipts = false,
|
showReadReceipts = false,
|
||||||
|
|
@ -76,7 +86,7 @@ internal fun TimelineItemEventRowWithReplyPreview() = ElementPreview {
|
||||||
content = aTimelineItemImageContent().copy(
|
content = aTimelineItemImageContent().copy(
|
||||||
aspectRatio = 5f
|
aspectRatio = 5f
|
||||||
),
|
),
|
||||||
inReplyTo = aInReplyToDetails(replyContent),
|
inReplyTo = inReplyToDetails,
|
||||||
isThreaded = true,
|
isThreaded = true,
|
||||||
groupPosition = TimelineItemGroupPosition.Last,
|
groupPosition = TimelineItemGroupPosition.Last,
|
||||||
),
|
),
|
||||||
|
|
@ -100,15 +110,82 @@ internal fun TimelineItemEventRowWithReplyPreview() = ElementPreview {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun aInReplyToDetails(
|
class InReplyToDetailsProvider : PreviewParameterProvider<InReplyToDetails> {
|
||||||
replyContent: String,
|
override val values: Sequence<InReplyToDetails>
|
||||||
): InReplyToDetails {
|
get() = sequenceOf(
|
||||||
return InReplyToDetails(
|
aMessageContent(
|
||||||
|
body = "Message which are being replied.",
|
||||||
|
type = TextMessageType("Message which are being replied.", null)
|
||||||
|
),
|
||||||
|
aMessageContent(
|
||||||
|
body = "Message which are being replied, and which was long enough to be displayed on two lines (only!).",
|
||||||
|
type = TextMessageType("Message which are being replied, and which was long enough to be displayed on two lines (only!).", null)
|
||||||
|
),
|
||||||
|
aMessageContent(
|
||||||
|
body = "Video",
|
||||||
|
type = VideoMessageType("Video", MediaSource("url"), null),
|
||||||
|
),
|
||||||
|
aMessageContent(
|
||||||
|
body = "Audio",
|
||||||
|
type = AudioMessageType("Audio", MediaSource("url"), null),
|
||||||
|
),
|
||||||
|
aMessageContent(
|
||||||
|
body = "Voice",
|
||||||
|
type = VoiceMessageType("Voice", MediaSource("url"), null, null),
|
||||||
|
),
|
||||||
|
aMessageContent(
|
||||||
|
body = "Image",
|
||||||
|
type = ImageMessageType("Image", MediaSource("url"), null),
|
||||||
|
),
|
||||||
|
aMessageContent(
|
||||||
|
body = "File",
|
||||||
|
type = FileMessageType("File", MediaSource("url"), null),
|
||||||
|
),
|
||||||
|
aMessageContent(
|
||||||
|
body = "Location",
|
||||||
|
type = LocationMessageType("Location", "geo:1,2", null),
|
||||||
|
),
|
||||||
|
aMessageContent(
|
||||||
|
body = "Notice",
|
||||||
|
type = NoticeMessageType("Notice", null),
|
||||||
|
),
|
||||||
|
aMessageContent(
|
||||||
|
body = "Emote",
|
||||||
|
type = EmoteMessageType("Emote", null),
|
||||||
|
),
|
||||||
|
PollContent(
|
||||||
|
question = "Poll which are being replied.",
|
||||||
|
kind = PollKind.Disclosed,
|
||||||
|
maxSelections = 1u,
|
||||||
|
answers = emptyList(),
|
||||||
|
votes = emptyMap(),
|
||||||
|
endTime = null
|
||||||
|
),
|
||||||
|
).map {
|
||||||
|
aInReplyToDetails(
|
||||||
|
eventContent = it,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun aMessageContent(
|
||||||
|
body: String,
|
||||||
|
type: MessageType,
|
||||||
|
) = MessageContent(
|
||||||
|
body = body,
|
||||||
|
inReplyTo = null,
|
||||||
|
isEdited = false,
|
||||||
|
isThreaded = false,
|
||||||
|
type = type,
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun aInReplyToDetails(
|
||||||
|
eventContent: EventContent,
|
||||||
|
) = InReplyToDetails(
|
||||||
eventId = EventId("\$event"),
|
eventId = EventId("\$event"),
|
||||||
eventContent = MessageContent(replyContent, null, false, false, TextMessageType(replyContent, null)),
|
eventContent = eventContent,
|
||||||
senderId = UserId("@Sender:domain"),
|
senderId = UserId("@Sender:domain"),
|
||||||
senderDisplayName = "Sender",
|
senderDisplayName = "Sender",
|
||||||
senderAvatarUrl = null,
|
senderAvatarUrl = null,
|
||||||
textContent = replyContent,
|
textContent = (eventContent as? MessageContent)?.body.orEmpty(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue