From 432f1ce50a4d799543a7f9ae3f82f3ceeb0cd656 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 11 Jun 2025 14:34:33 +0200 Subject: [PATCH] Move `isElementCallAvailable` fun to new `SessionEnterpriseService`, which implementations can get the current `MatrixClient`. --- enterprise | 2 +- .../enterprise/api/EnterpriseService.kt | 2 -- .../api/SessionEnterpriseService.kt | 12 +++++++++++ .../impl/DefaultEnterpriseService.kt | 2 -- .../impl/DefaultSessionEnterpriseService.kt | 18 +++++++++++++++++ .../DefaultSessionEnterpriseServiceTest.kt | 20 +++++++++++++++++++ .../enterprise/test/FakeEnterpriseService.kt | 5 ----- .../test/FakeSessionEnterpriseService.kt | 20 +++++++++++++++++++ .../roomcall/impl/RoomCallStatePresenter.kt | 6 +++--- .../impl/RoomCallStatePresenterTest.kt | 4 ++-- .../impl/root/UserProfilePresenter.kt | 6 +++--- .../impl/UserProfilePresenterTest.kt | 4 ++-- .../libraries/matrix/api/MatrixClient.kt | 5 +++++ .../libraries/matrix/impl/RustMatrixClient.kt | 4 ++++ .../libraries/matrix/test/FakeMatrixClient.kt | 5 +++++ 15 files changed, 95 insertions(+), 20 deletions(-) create mode 100644 features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/SessionEnterpriseService.kt create mode 100644 features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseService.kt create mode 100644 features/enterprise/impl/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseServiceTest.kt create mode 100644 features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeSessionEnterpriseService.kt diff --git a/enterprise b/enterprise index 4a07c862a2..afc6cbf41a 160000 --- a/enterprise +++ b/enterprise @@ -1 +1 @@ -Subproject commit 4a07c862a23a9fd1418eabf132cf9d6b25ea4927 +Subproject commit afc6cbf41a962f4f46f3aeca44f9e5c269f1e70e diff --git a/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/EnterpriseService.kt b/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/EnterpriseService.kt index d15586038b..4e2a3cc1f2 100644 --- a/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/EnterpriseService.kt +++ b/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/EnterpriseService.kt @@ -16,8 +16,6 @@ interface EnterpriseService { fun defaultHomeserverList(): List suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String): Boolean - suspend fun isElementCallAvailable(): Boolean - fun semanticColorsLight(): SemanticColors fun semanticColorsDark(): SemanticColors diff --git a/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/SessionEnterpriseService.kt b/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/SessionEnterpriseService.kt new file mode 100644 index 0000000000..c67b94476b --- /dev/null +++ b/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/SessionEnterpriseService.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.enterprise.api + +interface SessionEnterpriseService { + suspend fun isElementCallAvailable(): Boolean +} diff --git a/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt b/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt index 3b0995c81e..7f4f4b387b 100644 --- a/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt +++ b/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt @@ -25,8 +25,6 @@ class DefaultEnterpriseService @Inject constructor() : EnterpriseService { override fun defaultHomeserverList(): List = emptyList() override suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String) = true - override suspend fun isElementCallAvailable(): Boolean = true - override fun semanticColorsLight(): SemanticColors = compoundColorsLight override fun semanticColorsDark(): SemanticColors = compoundColorsDark diff --git a/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseService.kt b/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseService.kt new file mode 100644 index 0000000000..2728bdad6a --- /dev/null +++ b/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseService.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.enterprise.impl + +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.features.enterprise.api.SessionEnterpriseService +import io.element.android.libraries.di.SessionScope +import javax.inject.Inject + +@ContributesBinding(SessionScope::class) +class DefaultSessionEnterpriseService @Inject constructor() : SessionEnterpriseService { + override suspend fun isElementCallAvailable(): Boolean = true +} diff --git a/features/enterprise/impl/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseServiceTest.kt b/features/enterprise/impl/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseServiceTest.kt new file mode 100644 index 0000000000..b1e70ef045 --- /dev/null +++ b/features/enterprise/impl/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseServiceTest.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.enterprise.impl + +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.test.runTest +import org.junit.Test + +class DefaultSessionEnterpriseServiceTest { + @Test + fun `isElementCallAvailable is always true`() = runTest { + val service = DefaultSessionEnterpriseService() + assertThat(service.isElementCallAvailable()).isTrue() + } +} diff --git a/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeEnterpriseService.kt b/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeEnterpriseService.kt index bc90c77ada..14195e1243 100644 --- a/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeEnterpriseService.kt +++ b/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeEnterpriseService.kt @@ -18,7 +18,6 @@ class FakeEnterpriseService( private val isEnterpriseUserResult: (SessionId) -> Boolean = { lambdaError() }, private val defaultHomeserverListResult: () -> List = { emptyList() }, private val isAllowedToConnectToHomeserverResult: (String) -> Boolean = { lambdaError() }, - private val isElementCallAvailableResult: () -> Boolean = { lambdaError() }, private val semanticColorsLightResult: () -> SemanticColors = { lambdaError() }, private val semanticColorsDarkResult: () -> SemanticColors = { lambdaError() }, private val firebasePushGatewayResult: () -> String? = { lambdaError() }, @@ -36,10 +35,6 @@ class FakeEnterpriseService( isAllowedToConnectToHomeserverResult(homeserverUrl) } - override suspend fun isElementCallAvailable(): Boolean = simulateLongTask { - isElementCallAvailableResult() - } - override fun semanticColorsLight(): SemanticColors { return semanticColorsLightResult() } diff --git a/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeSessionEnterpriseService.kt b/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeSessionEnterpriseService.kt new file mode 100644 index 0000000000..a1e811ed10 --- /dev/null +++ b/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeSessionEnterpriseService.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.enterprise.test + +import io.element.android.features.enterprise.api.SessionEnterpriseService +import io.element.android.tests.testutils.lambda.lambdaError +import io.element.android.tests.testutils.simulateLongTask + +class FakeSessionEnterpriseService( + private val isElementCallAvailableResult: () -> Boolean = { lambdaError() }, +) : SessionEnterpriseService { + override suspend fun isElementCallAvailable(): Boolean = simulateLongTask { + isElementCallAvailableResult() + } +} diff --git a/features/roomcall/impl/src/main/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenter.kt b/features/roomcall/impl/src/main/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenter.kt index dc0faf26f1..47af2c24fc 100644 --- a/features/roomcall/impl/src/main/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenter.kt +++ b/features/roomcall/impl/src/main/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenter.kt @@ -15,7 +15,7 @@ import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import io.element.android.features.call.api.CurrentCall import io.element.android.features.call.api.CurrentCallService -import io.element.android.features.enterprise.api.EnterpriseService +import io.element.android.features.enterprise.api.SessionEnterpriseService import io.element.android.features.roomcall.api.RoomCallState import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.room.JoinedRoom @@ -25,12 +25,12 @@ import javax.inject.Inject class RoomCallStatePresenter @Inject constructor( private val room: JoinedRoom, private val currentCallService: CurrentCallService, - private val enterpriseService: EnterpriseService, + private val sessionEnterpriseService: SessionEnterpriseService, ) : Presenter { @Composable override fun present(): RoomCallState { val isAvailable by produceState(false) { - value = enterpriseService.isElementCallAvailable() + value = sessionEnterpriseService.isElementCallAvailable() } val roomInfo by room.roomInfoFlow.collectAsState() val syncUpdateFlow = room.syncUpdateFlow.collectAsState() diff --git a/features/roomcall/impl/src/test/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenterTest.kt b/features/roomcall/impl/src/test/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenterTest.kt index 437a495934..9647fddc1d 100644 --- a/features/roomcall/impl/src/test/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenterTest.kt +++ b/features/roomcall/impl/src/test/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenterTest.kt @@ -11,7 +11,7 @@ import com.google.common.truth.Truth.assertThat import io.element.android.features.call.api.CurrentCall import io.element.android.features.call.api.CurrentCallService import io.element.android.features.call.test.FakeCurrentCallService -import io.element.android.features.enterprise.test.FakeEnterpriseService +import io.element.android.features.enterprise.test.FakeSessionEnterpriseService import io.element.android.features.roomcall.api.RoomCallState import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.test.room.FakeBaseRoom @@ -230,7 +230,7 @@ class RoomCallStatePresenterTest { return RoomCallStatePresenter( room = joinedRoom, currentCallService = currentCallService, - enterpriseService = FakeEnterpriseService( + sessionEnterpriseService = FakeSessionEnterpriseService( isElementCallAvailableResult = { isElementCallAvailable }, ), ) diff --git a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt index c743ebfd40..4de79b8375 100644 --- a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt +++ b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt @@ -21,7 +21,7 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import io.element.android.features.createroom.api.StartDMAction -import io.element.android.features.enterprise.api.EnterpriseService +import io.element.android.features.enterprise.api.SessionEnterpriseService import io.element.android.features.userprofile.api.UserProfileEvents import io.element.android.features.userprofile.api.UserProfileState import io.element.android.features.userprofile.api.UserProfileState.ConfirmationDialog @@ -45,7 +45,7 @@ class UserProfilePresenter @AssistedInject constructor( @Assisted private val userId: UserId, private val client: MatrixClient, private val startDMAction: StartDMAction, - private val enterpriseService: EnterpriseService, + private val sessionEnterpriseService: SessionEnterpriseService, ) : Presenter { @AssistedFactory interface Factory { @@ -62,7 +62,7 @@ class UserProfilePresenter @AssistedInject constructor( @Composable private fun getCanCall(roomId: RoomId?): State { val isElementCallAvailable by produceState(initialValue = false, roomId) { - value = enterpriseService.isElementCallAvailable() + value = sessionEnterpriseService.isElementCallAvailable() } return produceState(initialValue = false, isElementCallAvailable, roomId) { diff --git a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt index c88872374d..2ce7f99c2c 100644 --- a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt +++ b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt @@ -16,7 +16,7 @@ import com.google.common.truth.Truth.assertThat import io.element.android.features.createroom.api.ConfirmingStartDmWithMatrixUser import io.element.android.features.createroom.api.StartDMAction import io.element.android.features.createroom.test.FakeStartDMAction -import io.element.android.features.enterprise.test.FakeEnterpriseService +import io.element.android.features.enterprise.test.FakeSessionEnterpriseService import io.element.android.features.userprofile.api.UserProfileEvents import io.element.android.features.userprofile.api.UserProfileState import io.element.android.features.userprofile.api.UserProfileVerificationState @@ -410,7 +410,7 @@ class UserProfilePresenterTest { userId = userId, client = client, startDMAction = startDMAction, - enterpriseService = FakeEnterpriseService( + sessionEnterpriseService = FakeSessionEnterpriseService( isElementCallAvailableResult = { isElementCallAvailable }, ), ) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt index c0005b7cfa..f7d95d7078 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt @@ -164,6 +164,11 @@ interface MatrixClient { * Check if the user can report a room. */ suspend fun canReportRoom(): Boolean + + /** + * Return true if Livekit Rtc is supported, i.e. if Element Call is available. + */ + suspend fun isLivekitRtcSupported(): Boolean } /** diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index 007628b8e1..07b8b3de09 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -678,6 +678,10 @@ class RustMatrixClient( }.getOrDefault(false) } + override suspend fun isLivekitRtcSupported(): Boolean = withContext(sessionDispatcher) { + innerClient.isLivekitRtcSupported() + } + private suspend fun File.getCacheSize( includeCryptoDb: Boolean = false, ): Long = withContext(sessionDispatcher) { diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt index 7d3ee5e994..c76d54a85c 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt @@ -89,6 +89,7 @@ class FakeMatrixClient( private val ignoreUserResult: (UserId) -> Result = { lambdaError() }, private var unIgnoreUserResult: (UserId) -> Result = { Result.success(Unit) }, private val canReportRoomLambda: () -> Boolean = { false }, + private val isLivekitRtcSupportedLambda: () -> Boolean = { false }, override val ignoredUsersFlow: StateFlow> = MutableStateFlow(persistentListOf()), ) : MatrixClient { var setDisplayNameCalled: Boolean = false @@ -334,4 +335,8 @@ class FakeMatrixClient( override suspend fun canReportRoom(): Boolean { return canReportRoomLambda() } + + override suspend fun isLivekitRtcSupported(): Boolean { + return isLivekitRtcSupportedLambda() + } }