Use in-memory thumbnail APIs when possible (#3817)
* Use in-memory thumbnail APIs when possible * Make an exception for animated image types. Also add `TimelineItemImageContent.thumbnailMediaRequestData` lazy property. * Try simplifying the logic a bit more.
This commit is contained in:
parent
f77ac55ec5
commit
4e9a75f10e
12 changed files with 62 additions and 19 deletions
|
|
@ -51,7 +51,6 @@ import io.element.android.libraries.designsystem.components.blurhash.blurHashBac
|
|||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||
import io.element.android.libraries.matrix.api.timeline.item.event.MessageFormat
|
||||
import io.element.android.libraries.matrix.ui.media.MediaRequestData
|
||||
import io.element.android.libraries.textcomposer.ElementRichTextEditorStyle
|
||||
import io.element.android.libraries.ui.strings.CommonStrings
|
||||
import io.element.android.wysiwyg.compose.EditorStyledText
|
||||
|
|
@ -86,13 +85,7 @@ fun TimelineItemImageView(
|
|||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.then(if (isLoaded) Modifier.background(Color.White) else Modifier),
|
||||
model = MediaRequestData(
|
||||
source = content.preferredMediaSource,
|
||||
kind = MediaRequestData.Kind.File(
|
||||
fileName = content.filename,
|
||||
mimeType = content.mimeType,
|
||||
),
|
||||
),
|
||||
model = content.thumbnailMediaRequestData,
|
||||
contentScale = ContentScale.Fit,
|
||||
alignment = Alignment.Center,
|
||||
contentDescription = description,
|
||||
|
|
|
|||
|
|
@ -57,6 +57,8 @@ import io.element.android.libraries.designsystem.modifiers.roundedBackground
|
|||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||
import io.element.android.libraries.matrix.api.timeline.item.event.MessageFormat
|
||||
import io.element.android.libraries.matrix.ui.media.MAX_THUMBNAIL_HEIGHT
|
||||
import io.element.android.libraries.matrix.ui.media.MAX_THUMBNAIL_WIDTH
|
||||
import io.element.android.libraries.matrix.ui.media.MediaRequestData
|
||||
import io.element.android.libraries.textcomposer.ElementRichTextEditorStyle
|
||||
import io.element.android.libraries.ui.strings.CommonStrings
|
||||
|
|
@ -97,9 +99,9 @@ fun TimelineItemVideoView(
|
|||
.then(if (isLoaded) Modifier.background(Color.White) else Modifier),
|
||||
model = MediaRequestData(
|
||||
source = content.thumbnailSource,
|
||||
kind = MediaRequestData.Kind.File(
|
||||
fileName = content.filename,
|
||||
mimeType = content.mimeType
|
||||
kind = MediaRequestData.Kind.Thumbnail(
|
||||
width = content.thumbnailWidth?.toLong() ?: MAX_THUMBNAIL_WIDTH,
|
||||
height = content.thumbnailHeight?.toLong() ?: MAX_THUMBNAIL_HEIGHT,
|
||||
)
|
||||
),
|
||||
contentScale = ContentScale.Fit,
|
||||
|
|
|
|||
|
|
@ -93,6 +93,8 @@ class TimelineItemContentMessageFactory @Inject constructor(
|
|||
blurhash = messageType.info?.blurhash,
|
||||
width = messageType.info?.width?.toInt(),
|
||||
height = messageType.info?.height?.toInt(),
|
||||
thumbnailWidth = messageType.info?.thumbnailInfo?.width?.toInt(),
|
||||
thumbnailHeight = messageType.info?.thumbnailInfo?.height?.toInt(),
|
||||
aspectRatio = aspectRatio,
|
||||
formattedFileSize = fileSizeFormatter.format(messageType.info?.size ?: 0),
|
||||
fileExtension = fileExtensionExtractor.extractFromName(messageType.filename)
|
||||
|
|
@ -146,6 +148,8 @@ class TimelineItemContentMessageFactory @Inject constructor(
|
|||
mimeType = messageType.info?.mimetype ?: MimeTypes.OctetStream,
|
||||
width = messageType.info?.width?.toInt(),
|
||||
height = messageType.info?.height?.toInt(),
|
||||
thumbnailWidth = messageType.info?.thumbnailInfo?.width?.toInt(),
|
||||
thumbnailHeight = messageType.info?.thumbnailInfo?.height?.toInt(),
|
||||
duration = messageType.info?.duration ?: Duration.ZERO,
|
||||
blurHash = messageType.info?.blurhash,
|
||||
aspectRatio = aspectRatio,
|
||||
|
|
|
|||
|
|
@ -7,9 +7,12 @@
|
|||
|
||||
package io.element.android.features.messages.impl.timeline.model.event
|
||||
|
||||
import io.element.android.libraries.core.mimetype.MimeTypes
|
||||
import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeAnimatedImage
|
||||
import io.element.android.libraries.matrix.api.media.MediaSource
|
||||
import io.element.android.libraries.matrix.api.timeline.item.event.FormattedBody
|
||||
import io.element.android.libraries.matrix.ui.media.MAX_THUMBNAIL_HEIGHT
|
||||
import io.element.android.libraries.matrix.ui.media.MAX_THUMBNAIL_WIDTH
|
||||
import io.element.android.libraries.matrix.ui.media.MediaRequestData
|
||||
|
||||
data class TimelineItemImageContent(
|
||||
override val filename: String,
|
||||
|
|
@ -23,15 +26,31 @@ data class TimelineItemImageContent(
|
|||
val blurhash: String?,
|
||||
val width: Int?,
|
||||
val height: Int?,
|
||||
val thumbnailWidth: Int?,
|
||||
val thumbnailHeight: Int?,
|
||||
val aspectRatio: Float?
|
||||
) : TimelineItemEventContentWithAttachment {
|
||||
override val type: String = "TimelineItemImageContent"
|
||||
|
||||
val showCaption = caption != null
|
||||
|
||||
val preferredMediaSource = if (mimeType == MimeTypes.Gif) {
|
||||
mediaSource
|
||||
} else {
|
||||
thumbnailSource ?: mediaSource
|
||||
val thumbnailMediaRequestData: MediaRequestData by lazy {
|
||||
if (mimeType.isMimeTypeAnimatedImage()) {
|
||||
MediaRequestData(
|
||||
source = mediaSource,
|
||||
kind = MediaRequestData.Kind.File(
|
||||
fileName = filename,
|
||||
mimeType = mimeType
|
||||
)
|
||||
)
|
||||
} else {
|
||||
MediaRequestData(
|
||||
source = thumbnailSource ?: mediaSource,
|
||||
kind = MediaRequestData.Kind.Thumbnail(
|
||||
width = thumbnailWidth?.toLong() ?: MAX_THUMBNAIL_WIDTH,
|
||||
height = thumbnailHeight?.toLong() ?: MAX_THUMBNAIL_HEIGHT
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,6 +37,8 @@ fun aTimelineItemImageContent(
|
|||
blurhash = blurhash,
|
||||
width = null,
|
||||
height = 300,
|
||||
thumbnailWidth = null,
|
||||
thumbnailHeight = 150,
|
||||
aspectRatio = aspectRatio,
|
||||
formattedFileSize = "4MB",
|
||||
fileExtension = "jpg"
|
||||
|
|
|
|||
|
|
@ -22,6 +22,8 @@ data class TimelineItemVideoContent(
|
|||
val blurHash: String?,
|
||||
val height: Int?,
|
||||
val width: Int?,
|
||||
val thumbnailWidth: Int?,
|
||||
val thumbnailHeight: Int?,
|
||||
val mimeType: String,
|
||||
val formattedFileSize: String,
|
||||
val fileExtension: String,
|
||||
|
|
|
|||
|
|
@ -35,8 +35,10 @@ fun aTimelineItemVideoContent(
|
|||
aspectRatio = aspectRatio,
|
||||
duration = 100.milliseconds,
|
||||
videoSource = MediaSource(""),
|
||||
height = 300,
|
||||
width = 150,
|
||||
height = 300,
|
||||
thumbnailWidth = 150,
|
||||
thumbnailHeight = 300,
|
||||
mimeType = MimeTypes.Mp4,
|
||||
formattedFileSize = "14MB",
|
||||
fileExtension = "mp4"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue