From ddb8f66c32182f53fe2d2ab84d4ccc8f4ed04bd5 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Mon, 11 Sep 2023 15:24:56 +0200 Subject: [PATCH] Take screen density into account when requesting thumbnails (#1262) * Take screen density into account when requesting thumbnails Otherwise, we could be asking for images with N size while we needed images for N@2x or N@3x size i.e. --- .../libraries/matrix/ui/media/CoilMediaFetcher.kt | 11 +++++++++-- .../libraries/matrix/ui/media/ImageLoaderFactories.kt | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/CoilMediaFetcher.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/CoilMediaFetcher.kt index 8b421c6c28..8945c46817 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/CoilMediaFetcher.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/CoilMediaFetcher.kt @@ -16,6 +16,7 @@ package io.element.android.libraries.matrix.ui.media +import android.content.Context import coil.ImageLoader import coil.decode.DataSource import coil.decode.ImageSource @@ -32,8 +33,10 @@ import okio.Buffer import okio.Path.Companion.toOkioPath import timber.log.Timber import java.nio.ByteBuffer +import kotlin.math.roundToLong internal class CoilMediaFetcher( + private val scalingFunction: (Float) -> Float, private val mediaLoader: MatrixMediaLoader, private val mediaData: MediaRequestData?, private val options: Options @@ -80,8 +83,8 @@ internal class CoilMediaFetcher( private suspend fun fetchThumbnail(mediaSource: MediaSource, kind: MediaRequestData.Kind.Thumbnail, options: Options): FetchResult? { return mediaLoader.loadMediaThumbnail( source = mediaSource, - width = kind.width, - height = kind.height + width = scalingFunction(kind.width.toFloat()).roundToLong(), + height = scalingFunction(kind.height.toFloat()).roundToLong(), ).map { byteArray -> byteArray.asSourceResult(options) }.getOrNull() @@ -102,6 +105,7 @@ internal class CoilMediaFetcher( } class MediaRequestDataFactory( + private val context: Context, private val client: MatrixClient ) : Fetcher.Factory { @@ -111,6 +115,7 @@ internal class CoilMediaFetcher( imageLoader: ImageLoader ): Fetcher { return CoilMediaFetcher( + scalingFunction = { context.resources.displayMetrics.density * it }, mediaLoader = client.mediaLoader, mediaData = data, options = options @@ -119,6 +124,7 @@ internal class CoilMediaFetcher( } class AvatarFactory( + private val context: Context, private val client: MatrixClient ) : Fetcher.Factory { @@ -129,6 +135,7 @@ internal class CoilMediaFetcher( imageLoader: ImageLoader ): Fetcher { return CoilMediaFetcher( + scalingFunction = { context.resources.displayMetrics.density * it }, mediaLoader = client.mediaLoader, mediaData = data.toMediaRequestData(), options = options diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderFactories.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderFactories.kt index c5b7f1ed44..c495558fd9 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderFactories.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderFactories.kt @@ -46,8 +46,8 @@ class LoggedInImageLoaderFactory @Inject constructor( } add(AvatarDataKeyer()) add(MediaRequestDataKeyer()) - add(CoilMediaFetcher.AvatarFactory(matrixClient)) - add(CoilMediaFetcher.MediaRequestDataFactory(matrixClient)) + add(CoilMediaFetcher.AvatarFactory(context, matrixClient)) + add(CoilMediaFetcher.MediaRequestDataFactory(context, matrixClient)) } .build() }