Rename GetUrlResolver to UrlContentFetcher and TemporaryMatrixClientFactory.createTemporaryMatrixClient to just create

This commit is contained in:
Jorge Martín
2026-08-11 09:30:22 +02:00
committed by Jorge Martin Espinosa
parent dbc28df3eb
commit e371b46c68
23 changed files with 55 additions and 52 deletions
@@ -10,7 +10,7 @@ package io.element.android.features.enterprise.api
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import io.element.android.compound.colors.SemanticColorsLightDark import io.element.android.compound.colors.SemanticColorsLightDark
import io.element.android.libraries.matrix.api.GetUrlResolver import io.element.android.libraries.matrix.api.UrlContentFetcher
import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.wellknown.api.ElementWellKnown import io.element.android.libraries.wellknown.api.ElementWellKnown
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@@ -18,7 +18,7 @@ import kotlinx.coroutines.flow.Flow
interface EnterpriseService { interface EnterpriseService {
val isEnterpriseBuild: Boolean val isEnterpriseBuild: Boolean
suspend fun isEnterpriseUser(sessionId: SessionId): Boolean suspend fun isEnterpriseUser(sessionId: SessionId): Boolean
suspend fun tweakMasUrl(url: String, homeserver: String, getUrlResolver: GetUrlResolver): String suspend fun tweakMasUrl(url: String, homeserver: String, urlContentFetcher: UrlContentFetcher): String
fun defaultHomeserverList(): List<String> fun defaultHomeserverList(): List<String>
suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String): Boolean suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String): Boolean
@@ -7,7 +7,7 @@
package io.element.android.features.enterprise.api.remoteconfig package io.element.android.features.enterprise.api.remoteconfig
import io.element.android.libraries.matrix.api.GetUrlResolver import io.element.android.libraries.matrix.api.UrlContentFetcher
import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.wellknown.api.WellknownRetrieverResult import io.element.android.libraries.wellknown.api.WellknownRetrieverResult
@@ -18,6 +18,6 @@ interface RemoteEnterpriseConfigProvider {
suspend fun get(sessionId: SessionId): WellknownRetrieverResult<RemoteEnterpriseConfig> suspend fun get(sessionId: SessionId): WellknownRetrieverResult<RemoteEnterpriseConfig>
interface Factory { interface Factory {
fun create(getUrlResolver: GetUrlResolver): RemoteEnterpriseConfigProvider fun create(urlContentFetcher: UrlContentFetcher): RemoteEnterpriseConfigProvider
} }
} }
@@ -14,7 +14,7 @@ import dev.zacsweers.metro.ContributesBinding
import io.element.android.compound.colors.SemanticColorsLightDark import io.element.android.compound.colors.SemanticColorsLightDark
import io.element.android.features.enterprise.api.BugReportUrl import io.element.android.features.enterprise.api.BugReportUrl
import io.element.android.features.enterprise.api.EnterpriseService import io.element.android.features.enterprise.api.EnterpriseService
import io.element.android.libraries.matrix.api.GetUrlResolver import io.element.android.libraries.matrix.api.UrlContentFetcher
import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.wellknown.api.ElementWellKnown import io.element.android.libraries.wellknown.api.ElementWellKnown
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@@ -25,7 +25,7 @@ class DefaultEnterpriseService : EnterpriseService {
override val isEnterpriseBuild = false override val isEnterpriseBuild = false
override suspend fun isEnterpriseUser(sessionId: SessionId) = false override suspend fun isEnterpriseUser(sessionId: SessionId) = false
override suspend fun tweakMasUrl(url: String, homeserver: String, getUrlResolver: GetUrlResolver) = url override suspend fun tweakMasUrl(url: String, homeserver: String, urlContentFetcher: UrlContentFetcher) = url
override fun defaultHomeserverList(): List<String> = emptyList() override fun defaultHomeserverList(): List<String> = emptyList()
override suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String) = true override suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String) = true
@@ -11,7 +11,7 @@ import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.ContributesBinding
import io.element.android.features.enterprise.api.remoteconfig.RemoteEnterpriseConfig import io.element.android.features.enterprise.api.remoteconfig.RemoteEnterpriseConfig
import io.element.android.features.enterprise.api.remoteconfig.RemoteEnterpriseConfigProvider import io.element.android.features.enterprise.api.remoteconfig.RemoteEnterpriseConfigProvider
import io.element.android.libraries.matrix.api.GetUrlResolver import io.element.android.libraries.matrix.api.UrlContentFetcher
import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.wellknown.api.WellknownRetrieverResult import io.element.android.libraries.wellknown.api.WellknownRetrieverResult
@@ -23,7 +23,7 @@ class DefaultRemoteEnterpriseConfigProvider : RemoteEnterpriseConfigProvider {
@ContributesBinding(AppScope::class) @ContributesBinding(AppScope::class)
class Factory : RemoteEnterpriseConfigProvider.Factory { class Factory : RemoteEnterpriseConfigProvider.Factory {
override fun create(getUrlResolver: GetUrlResolver): RemoteEnterpriseConfigProvider { override fun create(urlContentFetcher: UrlContentFetcher): RemoteEnterpriseConfigProvider {
return DefaultRemoteEnterpriseConfigProvider() return DefaultRemoteEnterpriseConfigProvider()
} }
} }
@@ -9,7 +9,7 @@ package io.element.android.features.enterprise.impl.scanner
import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.ContributesBinding
import io.element.android.libraries.matrix.api.GetUrlResolver import io.element.android.libraries.matrix.api.UrlContentFetcher
import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.api.scanner.ContentScannerUrlProvider import io.element.android.libraries.matrix.api.scanner.ContentScannerUrlProvider
@@ -22,7 +22,7 @@ class DefaultContentScannerUrlProvider : ContentScannerUrlProvider {
@ContributesBinding(AppScope::class) @ContributesBinding(AppScope::class)
class Factory : ContentScannerUrlProvider.Factory { class Factory : ContentScannerUrlProvider.Factory {
override fun create(getUrlResolver: GetUrlResolver): ContentScannerUrlProvider { override fun create(urlContentFetcher: UrlContentFetcher): ContentScannerUrlProvider {
return DefaultContentScannerUrlProvider() return DefaultContentScannerUrlProvider()
} }
} }
@@ -12,7 +12,7 @@ import androidx.compose.ui.graphics.Color
import io.element.android.compound.colors.SemanticColorsLightDark import io.element.android.compound.colors.SemanticColorsLightDark
import io.element.android.features.enterprise.api.BugReportUrl import io.element.android.features.enterprise.api.BugReportUrl
import io.element.android.features.enterprise.api.EnterpriseService import io.element.android.features.enterprise.api.EnterpriseService
import io.element.android.libraries.matrix.api.GetUrlResolver import io.element.android.libraries.matrix.api.UrlContentFetcher
import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.wellknown.api.ElementWellKnown import io.element.android.libraries.wellknown.api.ElementWellKnown
import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.lambda.lambdaError
@@ -32,7 +32,7 @@ class FakeEnterpriseService(
private val firebasePushGatewayResult: () -> String? = { lambdaError() }, private val firebasePushGatewayResult: () -> String? = { lambdaError() },
private val unifiedPushDefaultPushGatewayResult: () -> String? = { lambdaError() }, private val unifiedPushDefaultPushGatewayResult: () -> String? = { lambdaError() },
private val getNoisyNotificationChannelIdResult: (SessionId?) -> String? = { lambdaError() }, private val getNoisyNotificationChannelIdResult: (SessionId?) -> String? = { lambdaError() },
private val tweakMasUrlResult: (String, String, GetUrlResolver) -> String = { _, _, _ -> lambdaError() }, private val tweakMasUrlResult: (String, String, UrlContentFetcher) -> String = { _, _, _ -> lambdaError() },
private val overrideWellKnownResult: () -> ElementWellKnown? = { lambdaError() }, private val overrideWellKnownResult: () -> ElementWellKnown? = { lambdaError() },
private val essConfigEndpointUrlResult: (String) -> String = { lambdaError() }, private val essConfigEndpointUrlResult: (String) -> String = { lambdaError() },
) : EnterpriseService { ) : EnterpriseService {
@@ -43,8 +43,8 @@ class FakeEnterpriseService(
isEnterpriseUserResult(sessionId) isEnterpriseUserResult(sessionId)
} }
override suspend fun tweakMasUrl(url: String, homeserver: String, getUrlResolver: GetUrlResolver): String = simulateLongTask { override suspend fun tweakMasUrl(url: String, homeserver: String, urlContentFetcher: UrlContentFetcher): String = simulateLongTask {
tweakMasUrlResult(url, homeserver, getUrlResolver) tweakMasUrlResult(url, homeserver, urlContentFetcher)
} }
override fun defaultHomeserverList(): List<String> { override fun defaultHomeserverList(): List<String> {
@@ -8,10 +8,10 @@
package io.element.android.features.enterprise.test.remoteconfig package io.element.android.features.enterprise.test.remoteconfig
import io.element.android.features.enterprise.api.remoteconfig.RemoteEnterpriseConfigProvider import io.element.android.features.enterprise.api.remoteconfig.RemoteEnterpriseConfigProvider
import io.element.android.libraries.matrix.api.GetUrlResolver import io.element.android.libraries.matrix.api.UrlContentFetcher
class FakeRemoteEnterpriseConfigProviderFactory( class FakeRemoteEnterpriseConfigProviderFactory(
private val remoteEnterpriseConfigProvider: RemoteEnterpriseConfigProvider = FakeRemoteEnterpriseConfigProvider(), private val remoteEnterpriseConfigProvider: RemoteEnterpriseConfigProvider = FakeRemoteEnterpriseConfigProvider(),
) : RemoteEnterpriseConfigProvider.Factory { ) : RemoteEnterpriseConfigProvider.Factory {
override fun create(getUrlResolver: GetUrlResolver): RemoteEnterpriseConfigProvider = remoteEnterpriseConfigProvider override fun create(urlContentFetcher: UrlContentFetcher): RemoteEnterpriseConfigProvider = remoteEnterpriseConfigProvider
} }
@@ -40,7 +40,7 @@ class DefaultAccountProviderAccessControl(
) { ) {
if (enterpriseService.isEnterpriseBuild.not()) { if (enterpriseService.isEnterpriseBuild.not()) {
// Ensure that Element Pro is not required for this account provider // Ensure that Element Pro is not required for this account provider
val temporaryMatrixClient = temporaryMatrixClientFactory.createTemporaryMatrixClient(accountProviderUrl).getOrThrow() val temporaryMatrixClient = temporaryMatrixClientFactory.create(accountProviderUrl).getOrThrow()
temporaryMatrixClient.use { temporaryMatrixClient.use {
val wellknownRetriever = wellknownRetrieverFactory.create(temporaryMatrixClient) val wellknownRetriever = wellknownRetrieverFactory.create(temporaryMatrixClient)
val wellKnown = wellknownRetriever.getElementWellKnown( val wellKnown = wellknownRetriever.getElementWellKnown(
@@ -32,7 +32,7 @@ class DefaultWebClientUrlForAuthenticationRetriever(
Timber.w("Temporary account creation flow is only supported on matrix.org") Timber.w("Temporary account creation flow is only supported on matrix.org")
throw AccountCreationNotSupported() throw AccountCreationNotSupported()
} }
val temporaryMatrixClient = temporaryMatrixClientFactory.createTemporaryMatrixClient(homeServerUrl).getOrThrow() val temporaryMatrixClient = temporaryMatrixClientFactory.create(homeServerUrl).getOrThrow()
return temporaryMatrixClient.use { return temporaryMatrixClient.use {
val wellknownRetriever = wellknownRetrieverFactory.create(temporaryMatrixClient) val wellknownRetriever = wellknownRetrieverFactory.create(temporaryMatrixClient)
val wellknown = wellknownRetriever.getElementWellKnown( val wellknown = wellknownRetriever.getElementWellKnown(
@@ -54,7 +54,7 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import java.util.Optional import java.util.Optional
interface MatrixClient : GetUrlResolver { interface MatrixClient : UrlContentFetcher {
val sessionId: SessionId val sessionId: SessionId
val deviceId: DeviceId val deviceId: DeviceId
@@ -15,4 +15,4 @@ import java.lang.AutoCloseable
* Note: this client implements an [AutoCloseable] interface, so using [AutoCloseable.close] or [AutoCloseable.use] will clean up any resources associated * Note: this client implements an [AutoCloseable] interface, so using [AutoCloseable.close] or [AutoCloseable.use] will clean up any resources associated
* with it, such as temporary files. * with it, such as temporary files.
*/ */
interface TemporaryMatrixClient : GetUrlResolver, AutoCloseable interface TemporaryMatrixClient : UrlContentFetcher, AutoCloseable
@@ -11,5 +11,5 @@ package io.element.android.libraries.matrix.api
* Factory to create a temporary [TemporaryMatrixClient] for a given home server URL. * Factory to create a temporary [TemporaryMatrixClient] for a given home server URL.
*/ */
interface TemporaryMatrixClientFactory { interface TemporaryMatrixClientFactory {
suspend fun createTemporaryMatrixClient(homeServerUrl: String): Result<TemporaryMatrixClient> suspend fun create(homeServerUrl: String): Result<TemporaryMatrixClient>
} }
@@ -7,7 +7,10 @@
package io.element.android.libraries.matrix.api package io.element.android.libraries.matrix.api
fun interface GetUrlResolver { /**
* An interface to fetch content from a URL using a simple GET request.
*/
fun interface UrlContentFetcher {
/** /**
* Execute generic GET requests through the SDKs internal HTTP client. * Execute generic GET requests through the SDKs internal HTTP client.
*/ */
@@ -7,7 +7,7 @@
package io.element.android.libraries.matrix.api.scanner package io.element.android.libraries.matrix.api.scanner
import io.element.android.libraries.matrix.api.GetUrlResolver import io.element.android.libraries.matrix.api.UrlContentFetcher
import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.SessionId
/** /**
@@ -20,6 +20,6 @@ fun interface ContentScannerUrlProvider {
suspend fun getContentScannerUrl(sessionId: SessionId): Result<String?> suspend fun getContentScannerUrl(sessionId: SessionId): Result<String?>
fun interface Factory { fun interface Factory {
fun create(getUrlResolver: GetUrlResolver): ContentScannerUrlProvider fun create(urlContentFetcher: UrlContentFetcher): ContentScannerUrlProvider
} }
} }
@@ -10,8 +10,8 @@ package io.element.android.libraries.matrix.impl
import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.ContributesBinding
import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.core.extensions.runCatchingExceptions
import io.element.android.libraries.matrix.api.TemporaryMatrixClientFactory
import io.element.android.libraries.matrix.api.TemporaryMatrixClient import io.element.android.libraries.matrix.api.TemporaryMatrixClient
import io.element.android.libraries.matrix.api.TemporaryMatrixClientFactory
import io.element.android.libraries.matrix.impl.paths.SessionPathsFactory import io.element.android.libraries.matrix.impl.paths.SessionPathsFactory
@ContributesBinding(AppScope::class) @ContributesBinding(AppScope::class)
@@ -19,7 +19,7 @@ class RustTemporaryMatrixClientFactory(
private val sessionPathsFactory: SessionPathsFactory, private val sessionPathsFactory: SessionPathsFactory,
private val rustMatrixClientFactory: RustMatrixClientFactory, private val rustMatrixClientFactory: RustMatrixClientFactory,
) : TemporaryMatrixClientFactory { ) : TemporaryMatrixClientFactory {
override suspend fun createTemporaryMatrixClient(homeServerUrl: String): Result<TemporaryMatrixClient> { override suspend fun create(homeServerUrl: String): Result<TemporaryMatrixClient> {
return runCatchingExceptions { return runCatchingExceptions {
val sessionPaths = sessionPathsFactory.create() val sessionPaths = sessionPathsFactory.create()
val client = rustMatrixClientFactory.getBaseClientBuilder( val client = rustMatrixClientFactory.getBaseClientBuilder(
@@ -279,7 +279,7 @@ class RustMatrixAuthenticationService(
enterpriseService.tweakMasUrl( enterpriseService.tweakMasUrl(
url = it, url = it,
homeserver = client.server() ?: client.homeserver(), homeserver = client.server() ?: client.homeserver(),
getUrlResolver = getUrlResolver, urlContentFetcher = getUrlResolver,
) )
} }
pendingOAuthAuthorizationData = oAuthAuthorizationData pendingOAuthAuthorizationData = oAuthAuthorizationData
@@ -13,9 +13,9 @@ import dev.zacsweers.metro.ContributesTo
import dev.zacsweers.metro.Provides import dev.zacsweers.metro.Provides
import io.element.android.libraries.di.SessionScope import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.di.annotations.SessionCoroutineScope import io.element.android.libraries.di.annotations.SessionCoroutineScope
import io.element.android.libraries.matrix.api.GetUrlResolver
import io.element.android.libraries.matrix.api.HomeserverCapabilitiesProvider import io.element.android.libraries.matrix.api.HomeserverCapabilitiesProvider
import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.UrlContentFetcher
import io.element.android.libraries.matrix.api.core.DeviceId import io.element.android.libraries.matrix.api.core.DeviceId
import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.api.encryption.EncryptionService import io.element.android.libraries.matrix.api.encryption.EncryptionService
@@ -32,7 +32,7 @@ import io.element.android.libraries.matrix.api.verification.SessionVerificationS
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@BindingContainer @BindingContainer
@ContributesTo(SessionScope::class, replaces = [GetUrlResolver::class]) @ContributesTo(SessionScope::class)
object SessionMatrixModule { object SessionMatrixModule {
@Provides @Provides
fun providesSessionId(matrixClient: MatrixClient): SessionId { fun providesSessionId(matrixClient: MatrixClient): SessionId {
@@ -111,7 +111,7 @@ object SessionMatrixModule {
} }
@Provides @Provides
fun providesGetUrlResolverClient(matrixClient: MatrixClient): GetUrlResolver { fun providesGetUrlResolverClient(matrixClient: MatrixClient): UrlContentFetcher {
return matrixClient return matrixClient
} }
} }
@@ -7,11 +7,11 @@
package io.element.android.libraries.matrix.test package io.element.android.libraries.matrix.test
import io.element.android.libraries.matrix.api.TemporaryMatrixClientFactory
import io.element.android.libraries.matrix.api.TemporaryMatrixClient import io.element.android.libraries.matrix.api.TemporaryMatrixClient
import io.element.android.libraries.matrix.api.TemporaryMatrixClientFactory
class FakeTemporaryMatrixClientFactory( class FakeTemporaryMatrixClientFactory(
private val createResult: (String) -> Result<TemporaryMatrixClient> = { Result.success(FakeTemporaryMatrixClient()) }, private val createResult: (String) -> Result<TemporaryMatrixClient> = { Result.success(FakeTemporaryMatrixClient()) },
) : TemporaryMatrixClientFactory { ) : TemporaryMatrixClientFactory {
override suspend fun createTemporaryMatrixClient(homeServerUrl: String): Result<TemporaryMatrixClient> = createResult(homeServerUrl) override suspend fun create(homeServerUrl: String): Result<TemporaryMatrixClient> = createResult(homeServerUrl)
} }
@@ -8,7 +8,7 @@
package io.element.android.libraries.wellknown.api package io.element.android.libraries.wellknown.api
import io.element.android.libraries.matrix.api.GetUrlResolver import io.element.android.libraries.matrix.api.UrlContentFetcher
interface WellknownRetriever { interface WellknownRetriever {
suspend fun getElementWellKnown( suspend fun getElementWellKnown(
@@ -17,6 +17,6 @@ interface WellknownRetriever {
): WellknownRetrieverResult<ElementWellKnown> ): WellknownRetrieverResult<ElementWellKnown>
interface Factory { interface Factory {
fun create(getUrlResolver: GetUrlResolver): WellknownRetriever fun create(urlContentFetcher: UrlContentFetcher): WellknownRetriever
} }
} }
@@ -19,12 +19,12 @@ import io.element.android.libraries.core.extensions.mapCatchingExceptions
import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.core.extensions.runCatchingExceptions
import io.element.android.libraries.core.uri.ensureProtocol import io.element.android.libraries.core.uri.ensureProtocol
import io.element.android.libraries.di.annotations.AppCoroutineScope import io.element.android.libraries.di.annotations.AppCoroutineScope
import io.element.android.libraries.matrix.api.GetUrlResolver import io.element.android.libraries.matrix.api.UrlContentFetcher
import io.element.android.libraries.matrix.api.exception.ClientException import io.element.android.libraries.matrix.api.exception.ClientException
import io.element.android.libraries.wellknown.api.ElementWellKnown import io.element.android.libraries.wellknown.api.ElementWellKnown
import io.element.android.libraries.wellknown.api.ElementWellKnownParser import io.element.android.libraries.wellknown.api.ElementWellKnownParser
import io.element.android.libraries.wellknown.api.EnterpriseRemoteConfigSource
import io.element.android.libraries.wellknown.api.ElementWellknownStore import io.element.android.libraries.wellknown.api.ElementWellknownStore
import io.element.android.libraries.wellknown.api.EnterpriseRemoteConfigSource
import io.element.android.libraries.wellknown.api.WellknownRetriever import io.element.android.libraries.wellknown.api.WellknownRetriever
import io.element.android.libraries.wellknown.api.WellknownRetrieverResult import io.element.android.libraries.wellknown.api.WellknownRetrieverResult
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@@ -37,13 +37,13 @@ class DefaultWellknownRetriever(
private val elementWellknownStoreFactory: ElementWellknownStore.Factory, private val elementWellknownStoreFactory: ElementWellknownStore.Factory,
private val enterpriseService: EnterpriseService, private val enterpriseService: EnterpriseService,
private val elementWellKnownParser: ElementWellKnownParser, private val elementWellKnownParser: ElementWellKnownParser,
@Assisted private val getUrlResolver: GetUrlResolver, @Assisted private val urlContentFetcher: UrlContentFetcher,
@AppCoroutineScope private val coroutineScope: CoroutineScope, @AppCoroutineScope private val coroutineScope: CoroutineScope,
) : WellknownRetriever { ) : WellknownRetriever {
@ContributesBinding(AppScope::class) @ContributesBinding(AppScope::class)
@AssistedFactory @AssistedFactory
fun interface Factory : WellknownRetriever.Factory { fun interface Factory : WellknownRetriever.Factory {
override fun create(getUrlResolver: GetUrlResolver): DefaultWellknownRetriever override fun create(urlContentFetcher: UrlContentFetcher): DefaultWellknownRetriever
} }
override suspend fun getElementWellKnown( override suspend fun getElementWellKnown(
@@ -95,7 +95,7 @@ class DefaultWellknownRetriever(
source: EnterpriseRemoteConfigSource, source: EnterpriseRemoteConfigSource,
store: ElementWellknownStore store: ElementWellknownStore
): WellknownRetrieverResult<ElementWellKnown> { ): WellknownRetrieverResult<ElementWellKnown> {
return getUrlResolver return urlContentFetcher
.getUrl(url(host, source)) .getUrl(url(host, source))
.mapCatchingExceptions { .mapCatchingExceptions {
val data = String(it) val data = String(it)
@@ -13,7 +13,7 @@ import dev.zacsweers.metro.Provides
import io.element.android.features.enterprise.api.EnterpriseService import io.element.android.features.enterprise.api.EnterpriseService
import io.element.android.libraries.di.SessionScope import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.di.annotations.SessionCoroutineScope import io.element.android.libraries.di.annotations.SessionCoroutineScope
import io.element.android.libraries.matrix.api.GetUrlResolver import io.element.android.libraries.matrix.api.UrlContentFetcher
import io.element.android.libraries.wellknown.api.ElementWellKnownParser import io.element.android.libraries.wellknown.api.ElementWellKnownParser
import io.element.android.libraries.wellknown.api.ElementWellknownStore import io.element.android.libraries.wellknown.api.ElementWellknownStore
import io.element.android.libraries.wellknown.api.WellknownRetriever import io.element.android.libraries.wellknown.api.WellknownRetriever
@@ -27,14 +27,14 @@ object SessionWellknownModule {
elementWellknownStoreFactory: ElementWellknownStore.Factory, elementWellknownStoreFactory: ElementWellknownStore.Factory,
enterpriseService: EnterpriseService, enterpriseService: EnterpriseService,
elementWellKnownParser: ElementWellKnownParser, elementWellKnownParser: ElementWellKnownParser,
getUrlResolver: GetUrlResolver, urlContentFetcher: UrlContentFetcher,
@SessionCoroutineScope coroutineScope: CoroutineScope, @SessionCoroutineScope coroutineScope: CoroutineScope,
): WellknownRetriever { ): WellknownRetriever {
return DefaultWellknownRetriever( return DefaultWellknownRetriever(
elementWellknownStoreFactory = elementWellknownStoreFactory, elementWellknownStoreFactory = elementWellknownStoreFactory,
enterpriseService = enterpriseService, enterpriseService = enterpriseService,
elementWellKnownParser = elementWellKnownParser, elementWellKnownParser = elementWellKnownParser,
getUrlResolver = getUrlResolver, urlContentFetcher = urlContentFetcher,
coroutineScope = coroutineScope coroutineScope = coroutineScope
) )
} }
@@ -14,7 +14,7 @@ import com.google.common.truth.Truth.assertThat
import io.element.android.features.enterprise.test.FakeEnterpriseService import io.element.android.features.enterprise.test.FakeEnterpriseService
import io.element.android.features.wellknown.test.FakeElementWellknownStore import io.element.android.features.wellknown.test.FakeElementWellknownStore
import io.element.android.features.wellknown.test.anElementWellKnown import io.element.android.features.wellknown.test.anElementWellKnown
import io.element.android.libraries.matrix.api.GetUrlResolver import io.element.android.libraries.matrix.api.UrlContentFetcher
import io.element.android.libraries.matrix.api.exception.ClientException import io.element.android.libraries.matrix.api.exception.ClientException
import io.element.android.libraries.wellknown.api.ElementWellKnown import io.element.android.libraries.wellknown.api.ElementWellKnown
import io.element.android.libraries.wellknown.api.ElementWellKnownParser import io.element.android.libraries.wellknown.api.ElementWellKnownParser
@@ -31,7 +31,7 @@ class DefaultWellknownRetrieverTest {
@Test @Test
fun `get element wellknown calls resolver and parser`() = runTest { fun `get element wellknown calls resolver and parser`() = runTest {
val parser = lambdaRecorder<String, Result<ElementWellKnown>> { Result.success(anElementWellKnown()) } val parser = lambdaRecorder<String, Result<ElementWellKnown>> { Result.success(anElementWellKnown()) }
val resolver = SpyGetUrlResolver { Result.success(WELLKNOWN_CONTENT.toByteArray()) } val resolver = SpyUrlContentFetcher { Result.success(WELLKNOWN_CONTENT.toByteArray()) }
val sut = createDefaultWellknownRetriever( val sut = createDefaultWellknownRetriever(
elementWellKnownParser = parser, elementWellKnownParser = parser,
urlResolver = resolver, urlResolver = resolver,
@@ -54,7 +54,7 @@ class DefaultWellknownRetrieverTest {
@Test @Test
fun `get element wellknown network error`() = runTest { fun `get element wellknown network error`() = runTest {
val resolver = SpyGetUrlResolver { Result.failure(IllegalStateException("Network error")) } val resolver = SpyUrlContentFetcher { Result.failure(IllegalStateException("Network error")) }
val sut = createDefaultWellknownRetriever(urlResolver = resolver) val sut = createDefaultWellknownRetriever(urlResolver = resolver)
assertThat(sut.getElementWellKnown(WELLKNOWN_URL, EnterpriseRemoteConfigSource.WELLKNOWN_ENDPOINT)) assertThat(sut.getElementWellKnown(WELLKNOWN_URL, EnterpriseRemoteConfigSource.WELLKNOWN_ENDPOINT))
.isInstanceOf(WellknownRetrieverResult.Error::class.java) .isInstanceOf(WellknownRetrieverResult.Error::class.java)
@@ -62,7 +62,7 @@ class DefaultWellknownRetrieverTest {
@Test @Test
fun `get element wellknown 404 http error counts as not found`() = runTest { fun `get element wellknown 404 http error counts as not found`() = runTest {
val resolver = SpyGetUrlResolver { Result.failure(ClientException.Generic("Http error: 404", null)) } val resolver = SpyUrlContentFetcher { Result.failure(ClientException.Generic("Http error: 404", null)) }
val sut = createDefaultWellknownRetriever(urlResolver = resolver) val sut = createDefaultWellknownRetriever(urlResolver = resolver)
assertThat(sut.getElementWellKnown(WELLKNOWN_URL, EnterpriseRemoteConfigSource.WELLKNOWN_ENDPOINT)) assertThat(sut.getElementWellKnown(WELLKNOWN_URL, EnterpriseRemoteConfigSource.WELLKNOWN_ENDPOINT))
.isInstanceOf(WellknownRetrieverResult.NotFound::class.java) .isInstanceOf(WellknownRetrieverResult.NotFound::class.java)
@@ -72,7 +72,7 @@ class DefaultWellknownRetrieverTest {
fun `get element wellknown was overridden`() = runTest { fun `get element wellknown was overridden`() = runTest {
val wellKnown = anElementWellKnown() val wellKnown = anElementWellKnown()
val resolver = SpyGetUrlResolver { Result.success(WELLKNOWN_CONTENT.toByteArray()) } val resolver = SpyUrlContentFetcher { Result.success(WELLKNOWN_CONTENT.toByteArray()) }
val sut = createDefaultWellknownRetriever( val sut = createDefaultWellknownRetriever(
enterpriseService = FakeEnterpriseService( enterpriseService = FakeEnterpriseService(
@@ -94,12 +94,12 @@ class DefaultWellknownRetrieverTest {
cacheStore: FakeElementWellknownStore = FakeElementWellknownStore(), cacheStore: FakeElementWellknownStore = FakeElementWellknownStore(),
elementWellKnownParser: ElementWellKnownParser = { Result.success(expectedElementWellKnown) }, elementWellKnownParser: ElementWellKnownParser = { Result.success(expectedElementWellKnown) },
enterpriseService: FakeEnterpriseService = FakeEnterpriseService(overrideWellKnownResult = { null }), enterpriseService: FakeEnterpriseService = FakeEnterpriseService(overrideWellKnownResult = { null }),
urlResolver: GetUrlResolver = SpyGetUrlResolver { Result.success(WELLKNOWN_CONTENT.toByteArray()) }, urlResolver: UrlContentFetcher = SpyUrlContentFetcher { Result.success(WELLKNOWN_CONTENT.toByteArray()) },
) = DefaultWellknownRetriever( ) = DefaultWellknownRetriever(
elementWellknownStoreFactory = { cacheStore }, elementWellknownStoreFactory = { cacheStore },
enterpriseService = enterpriseService, enterpriseService = enterpriseService,
elementWellKnownParser = elementWellKnownParser, elementWellKnownParser = elementWellKnownParser,
getUrlResolver = urlResolver, urlContentFetcher = urlResolver,
coroutineScope = backgroundScope, coroutineScope = backgroundScope,
) )
@@ -130,7 +130,7 @@ class DefaultWellknownRetrieverTest {
} }
} }
private class SpyGetUrlResolver(lambda: (String) -> Result<ByteArray>) : GetUrlResolver { private class SpyUrlContentFetcher(lambda: (String) -> Result<ByteArray>) : UrlContentFetcher {
private val spy = lambdaRecorder<String, Result<ByteArray>> { lambda(it) } private val spy = lambdaRecorder<String, Result<ByteArray>> { lambda(it) }
override suspend fun getUrl(url: String): Result<ByteArray> { override suspend fun getUrl(url: String): Result<ByteArray> {
@@ -7,11 +7,11 @@
package io.element.android.features.wellknown.test package io.element.android.features.wellknown.test
import io.element.android.libraries.matrix.api.GetUrlResolver import io.element.android.libraries.matrix.api.UrlContentFetcher
import io.element.android.libraries.wellknown.api.WellknownRetriever import io.element.android.libraries.wellknown.api.WellknownRetriever
class FakeWellknownRetrieverFactory( class FakeWellknownRetrieverFactory(
private val wellknownRetriever: WellknownRetriever = FakeWellknownRetriever(), private val wellknownRetriever: WellknownRetriever = FakeWellknownRetriever(),
) : WellknownRetriever.Factory { ) : WellknownRetriever.Factory {
override fun create(getUrlResolver: GetUrlResolver): WellknownRetriever = wellknownRetriever override fun create(urlContentFetcher: UrlContentFetcher): WellknownRetriever = wellknownRetriever
} }