Browse Source

MediaResolver: exposes Result instead of Nullable

feature/jme/open-room-member-details-when-clicking-on-user-data
ganfra 1 year ago
parent
commit
c920dfb97a
  1. 2
      libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaResolver.kt
  2. 7
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/RustMediaResolver.kt
  3. 11
      libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/media/FakeMediaResolver.kt
  4. 15
      libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/MediaFetcher.kt

2
libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaResolver.kt

@ -31,6 +31,6 @@ interface MediaResolver {
val kind: Kind val kind: Kind
) )
suspend fun resolve(url: String?, kind: Kind): ByteArray? suspend fun resolve(url: String?, kind: Kind): Result<ByteArray>
} }

7
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.MatrixClient
import io.element.android.libraries.matrix.api.media.MediaResolver import io.element.android.libraries.matrix.api.media.MediaResolver
import java.lang.IllegalStateException
internal class RustMediaResolver(private val client: MatrixClient) : MediaResolver { internal class RustMediaResolver(private val client: MatrixClient) : MediaResolver {
override suspend fun resolve(url: String?, kind: MediaResolver.Kind): ByteArray? { override suspend fun resolve(url: String?, kind: MediaResolver.Kind): Result<ByteArray> {
if (url.isNullOrEmpty()) return null if (url.isNullOrEmpty()) return Result.failure(IllegalStateException("The url is null or empty"))
return when (kind) { return when (kind) {
is MediaResolver.Kind.Content -> client.loadMediaContent(url) is MediaResolver.Kind.Content -> client.loadMediaContent(url)
is MediaResolver.Kind.Thumbnail -> client.loadMediaThumbnail( is MediaResolver.Kind.Thumbnail -> client.loadMediaThumbnail(
@ -30,6 +31,6 @@ internal class RustMediaResolver(private val client: MatrixClient) : MediaResolv
kind.width.toLong(), kind.width.toLong(),
kind.height.toLong() kind.height.toLong()
) )
}.getOrNull() }
} }
} }

11
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 import io.element.android.libraries.matrix.api.media.MediaResolver
class FakeMediaResolver : 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
} }
} }

15
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 import java.nio.ByteBuffer
internal class MediaFetcher( internal class MediaFetcher(
private val mediaResolver: MediaResolver?, private val mediaResolver: MediaResolver,
private val meta: MediaResolver.Meta, private val meta: MediaResolver.Meta,
private val options: Options, private val options: Options,
private val imageLoader: ImageLoader private val imageLoader: ImageLoader
) : Fetcher { ) : Fetcher {
override suspend fun fetch(): FetchResult? { override suspend fun fetch(): FetchResult? {
val byteArray = mediaResolver?.resolve(meta.url, meta.kind) ?: return null return mediaResolver.resolve(meta.url, meta.kind)
val byteBuffer = ByteBuffer.wrap(byteArray) .map { byteArray ->
return imageLoader.components.newFetcher(byteBuffer, options, imageLoader)?.first?.fetch() 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) : class MetaFactory(private val client: MatrixClient) :

Loading…
Cancel
Save