From cc55738bd4b659c81635e0b9b80cb80a6808116e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 13 Jun 2024 13:32:18 +0200 Subject: [PATCH] Implement a memory cache for CallWellknownAPI --- .../call/impl/utils/ElementCallBaseUrlProvider.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ElementCallBaseUrlProvider.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ElementCallBaseUrlProvider.kt index e3f32edb86..63eb5208dd 100644 --- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ElementCallBaseUrlProvider.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ElementCallBaseUrlProvider.kt @@ -20,6 +20,7 @@ import com.squareup.anvil.annotations.ContributesBinding import io.element.android.features.call.impl.wellknown.CallWellknownAPI import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.di.AppScope +import io.element.android.libraries.di.SingleIn import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.network.RetrofitFactory import kotlinx.coroutines.withContext @@ -32,15 +33,20 @@ interface ElementCallBaseUrlProvider { suspend fun provides(sessionId: SessionId): String? } +@SingleIn(AppScope::class) @ContributesBinding(AppScope::class) class DefaultElementCallBaseUrlProvider @Inject constructor( private val retrofitFactory: RetrofitFactory, private val coroutineDispatchers: CoroutineDispatchers, ) : ElementCallBaseUrlProvider { + private val apiCache = mutableMapOf() + override suspend fun provides(sessionId: SessionId): String? = withContext(coroutineDispatchers.io) { val domain = sessionId.value.substringAfter(":") - val callWellknownAPI = retrofitFactory.create("https://$domain") - .create(CallWellknownAPI::class.java) + val callWellknownAPI = apiCache.getOrPut(sessionId) { + retrofitFactory.create("https://$domain") + .create(CallWellknownAPI::class.java) + } try { callWellknownAPI.getCallWellKnown().widgetUrl } catch (e: HttpException) {