diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaResolver.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaResolver.kt index 52d674df90..058c510ffd 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaResolver.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaResolver.kt @@ -31,6 +31,6 @@ interface MediaResolver { val kind: Kind ) - suspend fun resolve(url: String?, kind: Kind): ByteArray? + suspend fun resolve(url: String?, kind: Kind): Result } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/RustMediaResolver.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/RustMediaResolver.kt index 68ed48350e..a708dc0d31 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/RustMediaResolver.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/RustMediaResolver.kt @@ -18,11 +18,12 @@ package io.element.android.libraries.matrix.impl.media import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.media.MediaResolver +import java.lang.IllegalStateException internal class RustMediaResolver(private val client: MatrixClient) : MediaResolver { - override suspend fun resolve(url: String?, kind: MediaResolver.Kind): ByteArray? { - if (url.isNullOrEmpty()) return null + override suspend fun resolve(url: String?, kind: MediaResolver.Kind): Result { + if (url.isNullOrEmpty()) return Result.failure(IllegalStateException("The url is null or empty")) return when (kind) { is MediaResolver.Kind.Content -> client.loadMediaContent(url) is MediaResolver.Kind.Thumbnail -> client.loadMediaThumbnail( @@ -30,6 +31,6 @@ internal class RustMediaResolver(private val client: MatrixClient) : MediaResolv kind.width.toLong(), kind.height.toLong() ) - }.getOrNull() + } } } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/media/FakeMediaResolver.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/media/FakeMediaResolver.kt index 4d5ebc8029..c1b6e52003 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/media/FakeMediaResolver.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/media/FakeMediaResolver.kt @@ -19,7 +19,14 @@ package io.element.android.libraries.matrix.test.media import io.element.android.libraries.matrix.api.media.MediaResolver class FakeMediaResolver : MediaResolver { - override suspend fun resolve(url: String?, kind: MediaResolver.Kind): ByteArray? { - return null + + private var result: Result = Result.success(ByteArray(0)) + + fun givenResult(result: Result) { + this.result = result + } + + override suspend fun resolve(url: String?, kind: MediaResolver.Kind): Result { + return result } } diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/MediaFetcher.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/MediaFetcher.kt index 6567101162..4e1821e8cf 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/MediaFetcher.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/MediaFetcher.kt @@ -26,16 +26,23 @@ import io.element.android.libraries.matrix.api.media.MediaResolver import java.nio.ByteBuffer internal class MediaFetcher( - private val mediaResolver: MediaResolver?, + private val mediaResolver: MediaResolver, private val meta: MediaResolver.Meta, private val options: Options, private val imageLoader: ImageLoader ) : Fetcher { override suspend fun fetch(): FetchResult? { - val byteArray = mediaResolver?.resolve(meta.url, meta.kind) ?: return null - val byteBuffer = ByteBuffer.wrap(byteArray) - return imageLoader.components.newFetcher(byteBuffer, options, imageLoader)?.first?.fetch() + return mediaResolver.resolve(meta.url, meta.kind) + .map { byteArray -> + ByteBuffer.wrap(byteArray) + }.map { byteBuffer -> + imageLoader.components.newFetcher(byteBuffer, options, imageLoader)?.first?.fetch() + } + .fold( + { result -> result }, + { failure -> throw failure } + ) } class MetaFactory(private val client: MatrixClient) :