Skip to content

Commit

Permalink
Clarify model for Event with attachment. They must have a `filename: …
Browse files Browse the repository at this point in the history
…String` and they may have a `body :String?` (caption).

If filename is missing from the SDK model, the body is used instead and in this case the body is not mapped to our model.
  • Loading branch information
bmarty committed Oct 1, 2024
1 parent 3001efb commit 2de51bc
Show file tree
Hide file tree
Showing 47 changed files with 329 additions and 184 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,8 @@ class MessagesFlowNode @AssistedInject constructor(
is TimelineItemImageContent -> {
val navTarget = NavTarget.MediaViewer(
mediaInfo = MediaInfo(
name = event.content.filename ?: event.content.body,
name = event.content.filename,
body = event.content.body,
mimeType = event.content.mimeType,
formattedFileSize = event.content.formattedFileSize,
fileExtension = event.content.fileExtension
Expand All @@ -341,7 +342,8 @@ class MessagesFlowNode @AssistedInject constructor(
if (event.content.preferredMediaSource != null) {
val navTarget = NavTarget.MediaViewer(
mediaInfo = MediaInfo(
name = event.content.body,
name = event.content.filename,
body = event.content.body,
mimeType = event.content.mimeType,
formattedFileSize = event.content.formattedFileSize,
fileExtension = event.content.fileExtension
Expand All @@ -358,7 +360,8 @@ class MessagesFlowNode @AssistedInject constructor(
is TimelineItemVideoContent -> {
val navTarget = NavTarget.MediaViewer(
mediaInfo = MediaInfo(
name = event.content.filename ?: event.content.body,
name = event.content.filename,
body = event.content.body,
mimeType = event.content.mimeType,
formattedFileSize = event.content.formattedFileSize,
fileExtension = event.content.fileExtension
Expand All @@ -372,7 +375,8 @@ class MessagesFlowNode @AssistedInject constructor(
is TimelineItemFileContent -> {
val navTarget = NavTarget.MediaViewer(
mediaInfo = MediaInfo(
name = event.content.body,
name = event.content.filename,
body = event.content.body,
mimeType = event.content.mimeType,
formattedFileSize = event.content.formattedFileSize,
fileExtension = event.content.fileExtension
Expand All @@ -386,7 +390,8 @@ class MessagesFlowNode @AssistedInject constructor(
is TimelineItemAudioContent -> {
val navTarget = NavTarget.MediaViewer(
mediaInfo = MediaInfo(
name = event.content.body,
name = event.content.filename,
body = event.content.body,
mimeType = event.content.mimeType,
formattedFileSize = event.content.formattedFileSize,
fileExtension = event.content.fileExtension
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -269,19 +269,19 @@ private fun MessageSummary(event: TimelineItem.Event, modifier: Modifier = Modif
content = { ContentForBody(stringResource(CommonStrings.common_shared_location)) }
}
is TimelineItemImageContent -> {
content = { ContentForBody(event.content.body) }
content = { ContentForBody(event.content.bestDescription) }
}
is TimelineItemStickerContent -> {
content = { ContentForBody(event.content.body) }
content = { ContentForBody(event.content.bestDescription) }
}
is TimelineItemVideoContent -> {
content = { ContentForBody(event.content.body) }
content = { ContentForBody(event.content.bestDescription) }
}
is TimelineItemFileContent -> {
content = { ContentForBody(event.content.body) }
content = { ContentForBody(event.content.bestDescription) }
}
is TimelineItemAudioContent -> {
content = { ContentForBody(event.content.body) }
content = { ContentForBody(event.content.bestDescription) }
}
is TimelineItemVoiceContent -> {
content = { ContentForBody(textContent) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ fun TimelineItemAudioView(
Spacer(Modifier.width(spacing))
Column {
Text(
text = content.body,
text = content.bestDescription,
color = ElementTheme.materialColors.primary,
maxLines = 2,
style = ElementTheme.typography.fontBodyLgRegular,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ fun TimelineItemFileView(
Spacer(Modifier.width(spacing))
Column {
Text(
text = content.body,
text = content.bestDescription,
color = ElementTheme.materialColors.primary,
maxLines = 2,
style = ElementTheme.typography.fontBodyLgRegular,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ fun TimelineItemImageView(
model = MediaRequestData(
source = content.preferredMediaSource,
kind = MediaRequestData.Kind.File(
body = content.filename ?: content.body,
fileName = content.filename,
body = content.body,
mimeType = content.mimeType,
),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,14 @@ fun TimelineItemStickerView(
contentAlignment = Alignment.TopStart,
) {
BlurHashAsyncImage(
model = MediaRequestData(content.preferredMediaSource, MediaRequestData.Kind.File(content.body, content.mimeType)),
model = MediaRequestData(
source = content.preferredMediaSource,
kind = MediaRequestData.Kind.File(
fileName = content.filename,
body = content.body,
mimeType = content.mimeType,
)
),
blurHash = content.blurhash,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,8 @@ fun TimelineItemVideoView(
model = MediaRequestData(
source = content.thumbnailSource,
kind = MediaRequestData.Kind.File(
body = content.filename ?: content.body,
fileName = content.filename,
body = content.body,
mimeType = content.mimeType
)
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,9 @@ class TimelineItemContentMessageFactory @Inject constructor(
is ImageMessageType -> {
val aspectRatio = aspectRatioOf(messageType.info?.width, messageType.info?.height)
TimelineItemImageContent(
body = messageType.body.trimEnd(),
formatted = messageType.formatted,
filename = messageType.filename,
body = messageType.body?.trimEnd(),
formatted = messageType.formatted,
mediaSource = messageType.source,
thumbnailSource = messageType.info?.thumbnailSource,
mimeType = messageType.info?.mimetype ?: MimeTypes.OctetStream,
Expand All @@ -95,13 +95,14 @@ class TimelineItemContentMessageFactory @Inject constructor(
height = messageType.info?.height?.toInt(),
aspectRatio = aspectRatio,
formattedFileSize = fileSizeFormatter.format(messageType.info?.size ?: 0),
fileExtension = messageType.filename?.let { fileExtensionExtractor.extractFromName(it) }.orEmpty()
fileExtension = fileExtensionExtractor.extractFromName(messageType.filename)
)
}
is StickerMessageType -> {
val aspectRatio = aspectRatioOf(messageType.info?.width, messageType.info?.height)
TimelineItemStickerContent(
body = messageType.body.trimEnd(),
filename = messageType.filename,
body = messageType.body?.trimEnd(),
mediaSource = messageType.source,
thumbnailSource = messageType.info?.thumbnailSource,
mimeType = messageType.info?.mimetype ?: MimeTypes.OctetStream,
Expand All @@ -110,7 +111,7 @@ class TimelineItemContentMessageFactory @Inject constructor(
height = messageType.info?.height?.toInt(),
aspectRatio = aspectRatio,
formattedFileSize = fileSizeFormatter.format(messageType.info?.size ?: 0),
fileExtension = fileExtensionExtractor.extractFromName(messageType.body)
fileExtension = fileExtensionExtractor.extractFromName(messageType.filename)
)
}
is LocationMessageType -> {
Expand All @@ -136,9 +137,9 @@ class TimelineItemContentMessageFactory @Inject constructor(
is VideoMessageType -> {
val aspectRatio = aspectRatioOf(messageType.info?.width, messageType.info?.height)
TimelineItemVideoContent(
body = messageType.body.trimEnd(),
formatted = messageType.formatted,
filename = messageType.filename,
body = messageType.body?.trimEnd(),
formatted = messageType.formatted,
thumbnailSource = messageType.info?.thumbnailSource,
videoSource = messageType.source,
mimeType = messageType.info?.mimetype ?: MimeTypes.OctetStream,
Expand All @@ -148,25 +149,27 @@ class TimelineItemContentMessageFactory @Inject constructor(
blurHash = messageType.info?.blurhash,
aspectRatio = aspectRatio,
formattedFileSize = fileSizeFormatter.format(messageType.info?.size ?: 0),
fileExtension = messageType.filename?.let { fileExtensionExtractor.extractFromName(it) }.orEmpty(),
fileExtension = fileExtensionExtractor.extractFromName(messageType.filename),
)
}
is AudioMessageType -> {
TimelineItemAudioContent(
body = messageType.body.trimEnd(),
filename = messageType.filename,
body = messageType.body?.trimEnd(),
mediaSource = messageType.source,
duration = messageType.info?.duration ?: Duration.ZERO,
mimeType = messageType.info?.mimetype ?: MimeTypes.OctetStream,
formattedFileSize = fileSizeFormatter.format(messageType.info?.size ?: 0),
fileExtension = fileExtensionExtractor.extractFromName(messageType.body),
fileExtension = fileExtensionExtractor.extractFromName(messageType.filename),
)
}
is VoiceMessageType -> {
when (featureFlagService.isFeatureEnabled(FeatureFlags.VoiceMessages)) {
true -> {
TimelineItemVoiceContent(
eventId = eventId,
body = messageType.body.trimEnd(),
filename = messageType.filename,
body = messageType.body?.trimEnd(),
mediaSource = messageType.source,
duration = messageType.info?.duration ?: Duration.ZERO,
mimeType = messageType.info?.mimetype ?: MimeTypes.OctetStream,
Expand All @@ -175,20 +178,22 @@ class TimelineItemContentMessageFactory @Inject constructor(
}
false -> {
TimelineItemAudioContent(
body = messageType.body.trimEnd(),
filename = messageType.filename,
body = messageType.body?.trimEnd(),
mediaSource = messageType.source,
duration = messageType.info?.duration ?: Duration.ZERO,
mimeType = messageType.info?.mimetype ?: MimeTypes.OctetStream,
formattedFileSize = fileSizeFormatter.format(messageType.info?.size ?: 0),
fileExtension = fileExtensionExtractor.extractFromName(messageType.body),
fileExtension = fileExtensionExtractor.extractFromName(messageType.filename),
)
}
}
}
is FileMessageType -> {
val fileExtension = fileExtensionExtractor.extractFromName(messageType.body)
val fileExtension = fileExtensionExtractor.extractFromName(messageType.filename)
TimelineItemFileContent(
body = messageType.body.trimEnd(),
filename = messageType.filename,
body = messageType.body?.trimEnd(),
thumbnailSource = messageType.info?.thumbnailSource,
fileSource = messageType.source,
mimeType = messageType.info?.mimetype ?: MimeTypes.fromFileExtension(fileExtension),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class TimelineItemContentStickerFactory @Inject constructor(
val aspectRatio = aspectRatioOf(content.info.width, content.info.height)

return TimelineItemStickerContent(
filename = content.filename,
body = content.body,
mediaSource = content.source,
thumbnailSource = content.info.thumbnailSource,
Expand All @@ -42,7 +43,7 @@ class TimelineItemContentStickerFactory @Inject constructor(
height = content.info.height?.toInt(),
aspectRatio = aspectRatio,
formattedFileSize = fileSizeFormatter.format(content.info.size ?: 0),
fileExtension = fileExtensionExtractor.extractFromName(content.body)
fileExtension = fileExtensionExtractor.extractFromName(content.filename)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,14 @@ import io.element.android.libraries.mediaviewer.api.helper.formatFileExtensionAn
import kotlin.time.Duration

data class TimelineItemAudioContent(
val body: String,
override val filename: String,
override val body: String?,
val duration: Duration,
val mediaSource: MediaSource,
val mimeType: String,
val formattedFileSize: String,
val fileExtension: String,
) : TimelineItemEventContent {
) : TimelineItemEventContentWithAttachment {
val fileExtensionAndSize =
formatFileExtensionAndSize(
fileExtension,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ open class TimelineItemAudioContentProvider : PreviewParameterProvider<TimelineI
}

fun aTimelineItemAudioContent(fileName: String = "A sound.mp3") = TimelineItemAudioContent(
body = fileName,
filename = fileName,
body = null,
mimeType = MimeTypes.Pdf,
formattedFileSize = "100kB",
fileExtension = "mp3",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,15 @@ sealed interface TimelineItemEventContent {
val type: String
}

@Immutable
sealed interface TimelineItemEventContentWithAttachment : TimelineItemEventContent {
val filename: String
val body: String?

val bestDescription: String
get() = body ?: filename
}

/**
* Only text based content can be copied.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,14 @@ import io.element.android.libraries.matrix.api.media.MediaSource
import io.element.android.libraries.mediaviewer.api.helper.formatFileExtensionAndSize

data class TimelineItemFileContent(
val body: String,
override val filename: String,
override val body: String?,
val fileSource: MediaSource,
val thumbnailSource: MediaSource?,
val formattedFileSize: String,
val fileExtension: String,
val mimeType: String,
) : TimelineItemEventContent {
) : TimelineItemEventContentWithAttachment {
override val type: String = "TimelineItemFileContent"

val fileExtensionAndSize = formatFileExtensionAndSize(fileExtension, formattedFileSize)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ open class TimelineItemFileContentProvider : PreviewParameterProvider<TimelineIt
}

fun aTimelineItemFileContent(fileName: String = "A file.pdf") = TimelineItemFileContent(
body = fileName,
filename = fileName,
body = null,
thumbnailSource = null,
fileSource = MediaSource(url = ""),
mimeType = MimeTypes.Pdf,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ import io.element.android.libraries.matrix.api.media.MediaSource
import io.element.android.libraries.matrix.api.timeline.item.event.FormattedBody

data class TimelineItemImageContent(
val body: String,
override val filename: String,
override val body: String?,
val formatted: FormattedBody?,
val filename: String?,
val mediaSource: MediaSource,
val thumbnailSource: MediaSource?,
val formattedFileSize: String,
Expand All @@ -24,11 +24,11 @@ data class TimelineItemImageContent(
val width: Int?,
val height: Int?,
val aspectRatio: Float?
) : TimelineItemEventContent {
) : TimelineItemEventContentWithAttachment {
override val type: String = "TimelineItemImageContent"

val showCaption = filename != null && filename != body
val caption = if (showCaption) body else ""
val showCaption = body != null
val caption = body.orEmpty()

val preferredMediaSource = if (mimeType == MimeTypes.Gif) {
mediaSource
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@ open class TimelineItemImageContentProvider : PreviewParameterProvider<TimelineI
)
}

fun aTimelineItemImageContent() = TimelineItemImageContent(
body = "a body",
fun aTimelineItemImageContent(
body: String? = "a body",
) = TimelineItemImageContent(
filename = "A picture.jpg",
body = body,
formatted = null,
filename = null,
mediaSource = MediaSource(""),
thumbnailSource = null,
mimeType = MimeTypes.IMAGE_JPEG,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ package io.element.android.features.messages.impl.timeline.model.event
import io.element.android.libraries.matrix.api.media.MediaSource

data class TimelineItemStickerContent(
val body: String,
override val filename: String,
override val body: String?,
val mediaSource: MediaSource,
val thumbnailSource: MediaSource?,
val formattedFileSize: String,
Expand All @@ -20,7 +21,7 @@ data class TimelineItemStickerContent(
val width: Int?,
val height: Int?,
val aspectRatio: Float?
) : TimelineItemEventContent {
) : TimelineItemEventContentWithAttachment {
override val type: String = "TimelineItemStickerContent"

/* Stickers are supposed to be small images so
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ open class TimelineItemStickerContentProvider : PreviewParameterProvider<Timelin
}

fun aTimelineItemStickerContent() = TimelineItemStickerContent(
filename = "a sticker.gif",
body = "a body",
mediaSource = MediaSource(""),
thumbnailSource = null,
Expand Down
Loading

0 comments on commit 2de51bc

Please sign in to comment.