Introduce MatrixMediaSource

This commit is contained in:
ganfra 2023-05-05 19:47:10 +02:00
parent c3a1297c18
commit 4236b69705
27 changed files with 298 additions and 84 deletions

View file

@ -17,13 +17,12 @@
package io.element.android.libraries.matrix.ui.media
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.matrix.api.media.MatrixMediaSource
import kotlin.math.roundToLong
fun AvatarData.toMediaRequestData(): MediaRequestData? {
return url?.let {
MediaRequestData(
url = it,
kind = MediaRequestData.Kind.Thumbnail(size.dp.value.roundToLong())
)
}
fun AvatarData.toMediaRequestData(): MediaRequestData {
return MediaRequestData(
source = url?.let { MatrixMediaSource(it) },
kind = MediaRequestData.Kind.Thumbnail(size.dp.value.roundToLong())
)
}

View file

@ -38,19 +38,15 @@ internal class CoilMediaFetcher(
ByteBuffer.wrap(data)
}.map { byteBuffer ->
imageLoader.components.newFetcher(byteBuffer, options, imageLoader)?.first?.fetch()
}
.fold(
{ result -> result },
{ failure -> throw failure }
)
}.getOrThrow()
}
private suspend fun loadMedia(): Result<ByteArray> {
if (mediaData == null) return Result.failure(IllegalStateException("No media data to fetch."))
if (mediaData?.source == null) return Result.failure(IllegalStateException("No media data to fetch."))
return when (mediaData.kind) {
is MediaRequestData.Kind.Content -> mediaLoader.loadMediaContent(url = mediaData.url)
is MediaRequestData.Kind.Content -> mediaLoader.loadMediaContent(source = mediaData.source)
is MediaRequestData.Kind.Thumbnail -> mediaLoader.loadMediaThumbnail(
url = mediaData.url,
source = mediaData.source,
width = mediaData.kind.width,
height = mediaData.kind.height
)

View file

@ -16,8 +16,10 @@
package io.element.android.libraries.matrix.ui.media
import io.element.android.libraries.matrix.api.media.MatrixMediaSource
data class MediaRequestData(
val url: String,
val source: MatrixMediaSource?,
val kind: Kind
) {

View file

@ -22,7 +22,7 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarData
internal class AvatarDataKeyer : Keyer<AvatarData> {
override fun key(data: AvatarData, options: Options): String? {
return data.toMediaRequestData()?.toKey()
return data.toMediaRequestData().toKey()
}
}
@ -32,4 +32,7 @@ internal class MediaRequestDataKeyer : Keyer<MediaRequestData> {
}
}
private fun MediaRequestData.toKey() = "${url}_${kind}"
private fun MediaRequestData.toKey(): String? {
if (source == null) return null
return "${source.url}_${kind}"
}