Skip to content

Commit 2873a68

Browse files
authored
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.
1 parent bee708c commit 2873a68

File tree

12 files changed

+62
-19
lines changed

12 files changed

+62
-19
lines changed

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

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ import io.element.android.libraries.designsystem.components.blurhash.blurHashBac
5151
import io.element.android.libraries.designsystem.preview.ElementPreview
5252
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
5353
import io.element.android.libraries.matrix.api.timeline.item.event.MessageFormat
54-
import io.element.android.libraries.matrix.ui.media.MediaRequestData
5554
import io.element.android.libraries.textcomposer.ElementRichTextEditorStyle
5655
import io.element.android.libraries.ui.strings.CommonStrings
5756
import io.element.android.wysiwyg.compose.EditorStyledText
@@ -86,13 +85,7 @@ fun TimelineItemImageView(
8685
modifier = Modifier
8786
.fillMaxWidth()
8887
.then(if (isLoaded) Modifier.background(Color.White) else Modifier),
89-
model = MediaRequestData(
90-
source = content.preferredMediaSource,
91-
kind = MediaRequestData.Kind.File(
92-
fileName = content.filename,
93-
mimeType = content.mimeType,
94-
),
95-
),
88+
model = content.thumbnailMediaRequestData,
9689
contentScale = ContentScale.Fit,
9790
alignment = Alignment.Center,
9891
contentDescription = description,

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ import io.element.android.libraries.designsystem.modifiers.roundedBackground
5757
import io.element.android.libraries.designsystem.preview.ElementPreview
5858
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
5959
import io.element.android.libraries.matrix.api.timeline.item.event.MessageFormat
60+
import io.element.android.libraries.matrix.ui.media.MAX_THUMBNAIL_HEIGHT
61+
import io.element.android.libraries.matrix.ui.media.MAX_THUMBNAIL_WIDTH
6062
import io.element.android.libraries.matrix.ui.media.MediaRequestData
6163
import io.element.android.libraries.textcomposer.ElementRichTextEditorStyle
6264
import io.element.android.libraries.ui.strings.CommonStrings
@@ -97,9 +99,9 @@ fun TimelineItemVideoView(
9799
.then(if (isLoaded) Modifier.background(Color.White) else Modifier),
98100
model = MediaRequestData(
99101
source = content.thumbnailSource,
100-
kind = MediaRequestData.Kind.File(
101-
fileName = content.filename,
102-
mimeType = content.mimeType
102+
kind = MediaRequestData.Kind.Thumbnail(
103+
width = content.thumbnailWidth?.toLong() ?: MAX_THUMBNAIL_WIDTH,
104+
height = content.thumbnailHeight?.toLong() ?: MAX_THUMBNAIL_HEIGHT,
103105
)
104106
),
105107
contentScale = ContentScale.Fit,

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ class TimelineItemContentMessageFactory @Inject constructor(
9393
blurhash = messageType.info?.blurhash,
9494
width = messageType.info?.width?.toInt(),
9595
height = messageType.info?.height?.toInt(),
96+
thumbnailWidth = messageType.info?.thumbnailInfo?.width?.toInt(),
97+
thumbnailHeight = messageType.info?.thumbnailInfo?.height?.toInt(),
9698
aspectRatio = aspectRatio,
9799
formattedFileSize = fileSizeFormatter.format(messageType.info?.size ?: 0),
98100
fileExtension = fileExtensionExtractor.extractFromName(messageType.filename)
@@ -146,6 +148,8 @@ class TimelineItemContentMessageFactory @Inject constructor(
146148
mimeType = messageType.info?.mimetype ?: MimeTypes.OctetStream,
147149
width = messageType.info?.width?.toInt(),
148150
height = messageType.info?.height?.toInt(),
151+
thumbnailWidth = messageType.info?.thumbnailInfo?.width?.toInt(),
152+
thumbnailHeight = messageType.info?.thumbnailInfo?.height?.toInt(),
149153
duration = messageType.info?.duration ?: Duration.ZERO,
150154
blurHash = messageType.info?.blurhash,
151155
aspectRatio = aspectRatio,

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContent.kt

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@
77

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

10-
import io.element.android.libraries.core.mimetype.MimeTypes
10+
import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeAnimatedImage
1111
import io.element.android.libraries.matrix.api.media.MediaSource
1212
import io.element.android.libraries.matrix.api.timeline.item.event.FormattedBody
13+
import io.element.android.libraries.matrix.ui.media.MAX_THUMBNAIL_HEIGHT
14+
import io.element.android.libraries.matrix.ui.media.MAX_THUMBNAIL_WIDTH
15+
import io.element.android.libraries.matrix.ui.media.MediaRequestData
1316

1417
data class TimelineItemImageContent(
1518
override val filename: String,
@@ -23,15 +26,31 @@ data class TimelineItemImageContent(
2326
val blurhash: String?,
2427
val width: Int?,
2528
val height: Int?,
29+
val thumbnailWidth: Int?,
30+
val thumbnailHeight: Int?,
2631
val aspectRatio: Float?
2732
) : TimelineItemEventContentWithAttachment {
2833
override val type: String = "TimelineItemImageContent"
2934

3035
val showCaption = caption != null
3136

32-
val preferredMediaSource = if (mimeType == MimeTypes.Gif) {
33-
mediaSource
34-
} else {
35-
thumbnailSource ?: mediaSource
37+
val thumbnailMediaRequestData: MediaRequestData by lazy {
38+
if (mimeType.isMimeTypeAnimatedImage()) {
39+
MediaRequestData(
40+
source = mediaSource,
41+
kind = MediaRequestData.Kind.File(
42+
fileName = filename,
43+
mimeType = mimeType
44+
)
45+
)
46+
} else {
47+
MediaRequestData(
48+
source = thumbnailSource ?: mediaSource,
49+
kind = MediaRequestData.Kind.Thumbnail(
50+
width = thumbnailWidth?.toLong() ?: MAX_THUMBNAIL_WIDTH,
51+
height = thumbnailHeight?.toLong() ?: MAX_THUMBNAIL_HEIGHT
52+
),
53+
)
54+
}
3655
}
3756
}

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContentProvider.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ fun aTimelineItemImageContent(
3737
blurhash = blurhash,
3838
width = null,
3939
height = 300,
40+
thumbnailWidth = null,
41+
thumbnailHeight = 150,
4042
aspectRatio = aspectRatio,
4143
formattedFileSize = "4MB",
4244
fileExtension = "jpg"

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ data class TimelineItemVideoContent(
2222
val blurHash: String?,
2323
val height: Int?,
2424
val width: Int?,
25+
val thumbnailWidth: Int?,
26+
val thumbnailHeight: Int?,
2527
val mimeType: String,
2628
val formattedFileSize: String,
2729
val fileExtension: String,

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContentProvider.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ fun aTimelineItemVideoContent(
3535
aspectRatio = aspectRatio,
3636
duration = 100.milliseconds,
3737
videoSource = MediaSource(""),
38-
height = 300,
3938
width = 150,
39+
height = 300,
40+
thumbnailWidth = 150,
41+
thumbnailHeight = 300,
4042
mimeType = MimeTypes.Mp4,
4143
formattedFileSize = "14MB",
4244
fileExtension = "mp4"

features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,8 @@ class MessagesPresenterTest {
324324
blurhash = null,
325325
width = 20,
326326
height = 20,
327+
thumbnailWidth = null,
328+
thumbnailHeight = null,
327329
aspectRatio = 1.0f,
328330
fileExtension = "jpg",
329331
formattedFileSize = "4MB"
@@ -364,6 +366,8 @@ class MessagesPresenterTest {
364366
blurHash = null,
365367
width = 20,
366368
height = 20,
369+
thumbnailWidth = 20,
370+
thumbnailHeight = 20,
367371
aspectRatio = 1.0f,
368372
fileExtension = "mp4",
369373
formattedFileSize = "50MB"

features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactoryTest.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,8 @@ class TimelineItemContentMessageFactoryTest {
246246
width = null,
247247
mimeType = MimeTypes.OctetStream,
248248
formattedFileSize = "0 Bytes",
249+
thumbnailWidth = null,
250+
thumbnailHeight = null,
249251
fileExtension = "",
250252
)
251253
assertThat(result).isEqualTo(expected)
@@ -294,6 +296,8 @@ class TimelineItemContentMessageFactoryTest {
294296
width = 300,
295297
mimeType = MimeTypes.Mp4,
296298
formattedFileSize = "555 Bytes",
299+
thumbnailWidth = 5,
300+
thumbnailHeight = 10,
297301
fileExtension = "mp4",
298302
)
299303
assertThat(result).isEqualTo(expected)
@@ -458,6 +462,8 @@ class TimelineItemContentMessageFactoryTest {
458462
blurhash = null,
459463
width = null,
460464
height = null,
465+
thumbnailWidth = null,
466+
thumbnailHeight = null,
461467
aspectRatio = null
462468
)
463469
assertThat(result).isEqualTo(expected)
@@ -531,6 +537,8 @@ class TimelineItemContentMessageFactoryTest {
531537
blurhash = A_BLUR_HASH,
532538
width = 5,
533539
height = 10,
540+
thumbnailWidth = 5,
541+
thumbnailHeight = 10,
534542
aspectRatio = 0.5f,
535543
)
536544
assertThat(result).isEqualTo(expected)

libraries/core/src/main/kotlin/io/element/android/libraries/core/mimetype/MimeTypes.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ object MimeTypes {
3838
fun String?.normalizeMimeType() = if (this == BadJpg) Jpeg else this
3939

4040
fun String?.isMimeTypeImage() = this?.startsWith("image/").orFalse()
41+
fun String?.isMimeTypeAnimatedImage() = this == Gif || this == WebP
4142
fun String?.isMimeTypeVideo() = this?.startsWith("video/").orFalse()
4243
fun String?.isMimeTypeAudio() = this?.startsWith("audio/").orFalse()
4344
fun String?.isMimeTypeApplication() = this?.startsWith("application/").orFalse()

0 commit comments

Comments
 (0)