MediaResolver: exposes Result instead of Nullable

This commit is contained in:
ganfra 2023-04-26 16:13:09 +02:00
parent 9dcc3780ac
commit c920dfb97a
4 changed files with 25 additions and 10 deletions

View file

@ -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<ByteArray>
}

View file

@ -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<ByteArray> {
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()
}
}
}

View file

@ -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<ByteArray> = Result.success(ByteArray(0))
fun givenResult(result: Result<ByteArray>) {
this.result = result
}
override suspend fun resolve(url: String?, kind: MediaResolver.Kind): Result<ByteArray> {
return result
}
}

View file

@ -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) :