Improve ContentUrlResolver

This commit is contained in:
Benoit Marty 2020-04-15 18:56:18 +02:00
parent e97c95f40a
commit 5652140f5d
3 changed files with 24 additions and 27 deletions

View File

@ -26,6 +26,11 @@ interface ContentUrlResolver {
SCALE("scale") SCALE("scale")
} }
/**
* URL to use to upload content
*/
val uploadUrl: String
/** /**
* Get the actual URL for accessing the full-size image of a Matrix media content URI. * Get the actual URL for accessing the full-size image of a Matrix media content URI.
* *

View File

@ -23,39 +23,33 @@ import javax.inject.Inject
private const val MATRIX_CONTENT_URI_SCHEME = "mxc://" private const val MATRIX_CONTENT_URI_SCHEME = "mxc://"
internal class DefaultContentUrlResolver @Inject constructor(private val homeServerConnectionConfig: HomeServerConnectionConfig) : ContentUrlResolver { internal class DefaultContentUrlResolver @Inject constructor(homeServerConnectionConfig: HomeServerConnectionConfig) : ContentUrlResolver {
companion object { private val baseUrl = homeServerConnectionConfig.homeServerUri.toString()
fun getUploadUrl(homeServerConnectionConfig: HomeServerConnectionConfig): String { private val sep = if (baseUrl.endsWith("/")) "" else "/"
val baseUrl = homeServerConnectionConfig.homeServerUri.toString()
val sep = if (baseUrl.endsWith("/")) "" else "/"
return baseUrl + sep + NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "upload" override val uploadUrl = baseUrl + sep + NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "upload"
}
}
override fun resolveFullSize(contentUrl: String?): String? { override fun resolveFullSize(contentUrl: String?): String? {
if (contentUrl?.isValidMatrixContentUrl() == true) { if (contentUrl?.isValidMatrixContentUrl() == true) {
val baseUrl = homeServerConnectionConfig.homeServerUri.toString()
val prefix = NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "download/" val prefix = NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "download/"
return resolve(baseUrl, contentUrl, prefix) return resolve(contentUrl, prefix)
}
return null
}
override fun resolveThumbnail(contentUrl: String?, width: Int, height: Int, method: ContentUrlResolver.ThumbnailMethod): String? {
if (contentUrl?.isValidMatrixContentUrl() == true) {
val baseUrl = homeServerConnectionConfig.homeServerUri.toString()
val prefix = NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "thumbnail/"
val params = "?width=$width&height=$height&method=${method.value}"
return resolve(baseUrl, contentUrl, prefix, params)
} }
// do not allow non-mxc content URLs // do not allow non-mxc content URLs
return null return null
} }
private fun resolve(baseUrl: String, override fun resolveThumbnail(contentUrl: String?, width: Int, height: Int, method: ContentUrlResolver.ThumbnailMethod): String? {
contentUrl: String, if (contentUrl?.isValidMatrixContentUrl() == true) {
val prefix = NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "thumbnail/"
val params = "?width=$width&height=$height&method=${method.value}"
return resolve(contentUrl, prefix, params)
}
// do not allow non-mxc content URLs
return null
}
private fun resolve(contentUrl: String,
prefix: String, prefix: String,
params: String? = null): String? { params: String? = null): String? {
var serverAndMediaId = contentUrl.removePrefix(MATRIX_CONTENT_URI_SCHEME) var serverAndMediaId = contentUrl.removePrefix(MATRIX_CONTENT_URI_SCHEME)
@ -66,8 +60,6 @@ internal class DefaultContentUrlResolver @Inject constructor(private val homeSer
serverAndMediaId = serverAndMediaId.substring(0, fragmentOffset) serverAndMediaId = serverAndMediaId.substring(0, fragmentOffset)
} }
val sep = if (baseUrl.endsWith("/")) "" else "/"
return baseUrl + sep + prefix + serverAndMediaId + (params ?: "") + fragment return baseUrl + sep + prefix + serverAndMediaId + (params ?: "") + fragment
} }

View File

@ -17,7 +17,7 @@
package im.vector.matrix.android.internal.session.content package im.vector.matrix.android.internal.session.content
import com.squareup.moshi.Moshi import com.squareup.moshi.Moshi
import im.vector.matrix.android.api.auth.data.SessionParams import im.vector.matrix.android.api.session.content.ContentUrlResolver
import im.vector.matrix.android.internal.di.Authenticated import im.vector.matrix.android.internal.di.Authenticated
import im.vector.matrix.android.internal.network.ProgressRequestBody import im.vector.matrix.android.internal.network.ProgressRequestBody
import im.vector.matrix.android.internal.network.awaitResponse import im.vector.matrix.android.internal.network.awaitResponse
@ -37,10 +37,10 @@ import javax.inject.Inject
internal class FileUploader @Inject constructor(@Authenticated internal class FileUploader @Inject constructor(@Authenticated
private val okHttpClient: OkHttpClient, private val okHttpClient: OkHttpClient,
private val eventBus: EventBus, private val eventBus: EventBus,
sessionParams: SessionParams, contentUrlResolver: ContentUrlResolver,
moshi: Moshi) { moshi: Moshi) {
private val uploadUrl = DefaultContentUrlResolver.getUploadUrl(sessionParams.homeServerConnectionConfig) private val uploadUrl = contentUrlResolver.uploadUrl
private val responseAdapter = moshi.adapter(ContentUploadResponse::class.java) private val responseAdapter = moshi.adapter(ContentUploadResponse::class.java)
suspend fun uploadFile(file: File, suspend fun uploadFile(file: File,