ganfra
1 year ago
18 changed files with 242 additions and 212 deletions
@ -0,0 +1,42 @@
@@ -0,0 +1,42 @@
|
||||
/* |
||||
* Copyright (c) 2023 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.libraries.matrix.api.media |
||||
|
||||
import java.nio.file.Path |
||||
|
||||
interface MatrixMediaLoader { |
||||
/** |
||||
* @param url to fetch the content for. |
||||
* @return a [Result] of ByteArray. It contains the binary data for the media. |
||||
*/ |
||||
suspend fun loadMediaContent(url: String): Result<ByteArray> |
||||
|
||||
/** |
||||
* @param url to fetch the data for. |
||||
* @param width: the desired width for rescaling the media as thumbnail |
||||
* @param height: the desired height for rescaling the media as thumbnail |
||||
* @return a [Result] of ByteArray. It contains the binary data for the media. |
||||
*/ |
||||
suspend fun loadMediaThumbnail(url: String, width: Long, height: Long): Result<ByteArray> |
||||
|
||||
/** |
||||
* @param url to fetch the data for. |
||||
* @param mimeType: optional mime type |
||||
* @return a [Result] of [Path]. It's the path to the downloaded file. |
||||
*/ |
||||
suspend fun loadMediaFile(url: String, mimeType: String?): Result<Path> |
||||
} |
@ -1,36 +0,0 @@
@@ -1,36 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2022 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.libraries.matrix.api.media |
||||
|
||||
interface MediaResolver { |
||||
|
||||
sealed interface Kind { |
||||
data class Thumbnail(val width: Int, val height: Int) : Kind { |
||||
constructor(size: Int) : this(size, size) |
||||
} |
||||
|
||||
object Content : Kind |
||||
} |
||||
|
||||
data class Meta( |
||||
val url: String?, |
||||
val kind: Kind |
||||
) |
||||
|
||||
suspend fun resolve(url: String?, kind: Kind): Result<ByteArray> |
||||
|
||||
} |
@ -0,0 +1,75 @@
@@ -0,0 +1,75 @@
|
||||
/* |
||||
* Copyright (c) 2023 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.libraries.matrix.impl.media |
||||
|
||||
import io.element.android.libraries.core.coroutine.CoroutineDispatchers |
||||
import io.element.android.libraries.matrix.api.media.MatrixMediaLoader |
||||
import kotlinx.coroutines.withContext |
||||
import org.matrix.rustcomponents.sdk.Client |
||||
import org.matrix.rustcomponents.sdk.mediaSourceFromUrl |
||||
import org.matrix.rustcomponents.sdk.use |
||||
import java.nio.file.Path |
||||
import kotlin.io.path.Path |
||||
|
||||
class RustMediaLoader( |
||||
private val dispatchers: CoroutineDispatchers, |
||||
private val innerClient: Client |
||||
) : MatrixMediaLoader { |
||||
|
||||
@OptIn(ExperimentalUnsignedTypes::class) |
||||
override suspend fun loadMediaContent(url: String): Result<ByteArray> = |
||||
withContext(dispatchers.io) { |
||||
runCatching { |
||||
mediaSourceFromUrl(url).use { source -> |
||||
innerClient.getMediaContent(source).toUByteArray().toByteArray() |
||||
} |
||||
} |
||||
} |
||||
|
||||
@OptIn(ExperimentalUnsignedTypes::class) |
||||
override suspend fun loadMediaThumbnail( |
||||
url: String, |
||||
width: Long, |
||||
height: Long |
||||
): Result<ByteArray> = |
||||
withContext(dispatchers.io) { |
||||
runCatching { |
||||
mediaSourceFromUrl(url).use { mediaSource -> |
||||
innerClient.getMediaThumbnail( |
||||
mediaSource = mediaSource, |
||||
width = width.toULong(), |
||||
height = height.toULong() |
||||
).toUByteArray().toByteArray() |
||||
} |
||||
} |
||||
} |
||||
|
||||
override suspend fun loadMediaFile(url: String, mimeType: String?): Result<Path> = |
||||
withContext(dispatchers.io) { |
||||
runCatching { |
||||
mediaSourceFromUrl(url).use { mediaSource -> |
||||
innerClient.getMediaFile( |
||||
source = mediaSource, |
||||
mimeType = mimeType ?: "application/octet-stream" |
||||
).use { |
||||
Path(it.path()) |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
||||
} |
@ -1,36 +0,0 @@
@@ -1,36 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2023 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
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): 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( |
||||
url, |
||||
kind.width.toLong(), |
||||
kind.height.toLong() |
||||
) |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,50 @@
@@ -0,0 +1,50 @@
|
||||
/* |
||||
* Copyright (c) 2023 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.libraries.matrix.test.media |
||||
|
||||
import io.element.android.libraries.matrix.api.media.MatrixMediaLoader |
||||
import java.nio.file.Path |
||||
import kotlin.io.path.Path |
||||
|
||||
class FakeMediaLoader : MatrixMediaLoader { |
||||
|
||||
var shouldFail = false |
||||
|
||||
override suspend fun loadMediaContent(url: String): Result<ByteArray> { |
||||
return if (shouldFail) { |
||||
Result.failure(RuntimeException()) |
||||
} else { |
||||
return Result.success(ByteArray(0)) |
||||
} |
||||
} |
||||
|
||||
override suspend fun loadMediaThumbnail(url: String, width: Long, height: Long): Result<ByteArray> { |
||||
return if (shouldFail) { |
||||
Result.failure(RuntimeException()) |
||||
} else { |
||||
return Result.success(ByteArray(0)) |
||||
} |
||||
} |
||||
|
||||
override suspend fun loadMediaFile(url: String, mimeType: String?): Result<Path> { |
||||
return if (shouldFail) { |
||||
Result.failure(RuntimeException()) |
||||
} else { |
||||
return Result.success(Path("path")) |
||||
} |
||||
} |
||||
} |
@ -1,32 +0,0 @@
@@ -1,32 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2023 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.libraries.matrix.test.media |
||||
|
||||
import io.element.android.libraries.matrix.api.media.MediaResolver |
||||
|
||||
class FakeMediaResolver : MediaResolver { |
||||
|
||||
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 |
||||
} |
||||
} |
Loading…
Reference in new issue