From 1f18a18917763218e809d7e54ff66ee4b36823ca Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 4 Sep 2026 17:08:10 +0200 Subject: [PATCH] Iterate on hooks implementation --- enterprise | 2 +- .../api/ClientBuilderEnterpriseHook.kt | 21 ++++++++++++++-- .../DefaultClientBuilderEnterpriseHook.kt | 7 +++++- .../test/FakeClientBuilderEnterpriseHook.kt | 25 +++++++++++++++++++ .../matrix/impl/RustMatrixClientFactory.kt | 7 +++++- .../impl/RustMatrixClientFactoryTest.kt | 3 ++- .../RustTemporaryMatrixClientFactoryTest.kt | 3 ++- 7 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeClientBuilderEnterpriseHook.kt diff --git a/enterprise b/enterprise index bb07b4f839..10b18f1416 160000 --- a/enterprise +++ b/enterprise @@ -1 +1 @@ -Subproject commit bb07b4f839163034fab9c3d1b4ae364f0839b450 +Subproject commit 10b18f141697b8a3998022b1cb7ff9f4a9f1171c diff --git a/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/ClientBuilderEnterpriseHook.kt b/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/ClientBuilderEnterpriseHook.kt index bfb9fb538a..f60b647c5d 100644 --- a/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/ClientBuilderEnterpriseHook.kt +++ b/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/ClientBuilderEnterpriseHook.kt @@ -13,6 +13,23 @@ import io.element.android.libraries.matrix.api.core.SessionId /** * A hook that can be used to customize the [MatrixClientBuilder] for enterprise features. */ -fun interface ClientBuilderEnterpriseHook { - suspend operator fun invoke(clientBuilder: MatrixClientBuilder, sessionId: SessionId): MatrixClientBuilder +interface ClientBuilderEnterpriseHook { + /** + * Customize the [MatrixClientBuilder] for enterprise features. + * This method is invoked everytime a new [MatrixClientBuilder] is created. + * + * @param clientBuilder The [MatrixClientBuilder] to customize. + * @return The customized [MatrixClientBuilder]. + */ + suspend fun tweakClientBuilder(clientBuilder: MatrixClientBuilder): MatrixClientBuilder + + /** + * Customize the [MatrixClientBuilder] for enterprise features. + * This method is invoked when a new [MatrixClientBuilder] is created to build a client for a specific session. + * + * @param clientBuilder The [MatrixClientBuilder] to customize. + * @param sessionId The [SessionId] for which the [MatrixClientBuilder] is being created. + * @return The customized [MatrixClientBuilder]. + */ + suspend fun tweakClientBuilder(clientBuilder: MatrixClientBuilder, sessionId: SessionId): MatrixClientBuilder } diff --git a/features/enterprise/impl-foss/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultClientBuilderEnterpriseHook.kt b/features/enterprise/impl-foss/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultClientBuilderEnterpriseHook.kt index ee22e4399d..e4b6df4171 100644 --- a/features/enterprise/impl-foss/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultClientBuilderEnterpriseHook.kt +++ b/features/enterprise/impl-foss/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultClientBuilderEnterpriseHook.kt @@ -18,7 +18,12 @@ import io.element.android.libraries.matrix.api.core.SessionId */ @ContributesBinding(AppScope::class) class DefaultClientBuilderEnterpriseHook : ClientBuilderEnterpriseHook { - override suspend fun invoke(clientBuilder: MatrixClientBuilder, sessionId: SessionId): MatrixClientBuilder { + override suspend fun tweakClientBuilder(clientBuilder: MatrixClientBuilder): MatrixClientBuilder { + // No modification + return clientBuilder + } + + override suspend fun tweakClientBuilder(clientBuilder: MatrixClientBuilder, sessionId: SessionId): MatrixClientBuilder { // No modification return clientBuilder } diff --git a/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeClientBuilderEnterpriseHook.kt b/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeClientBuilderEnterpriseHook.kt new file mode 100644 index 0000000000..8a8c3c5a67 --- /dev/null +++ b/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeClientBuilderEnterpriseHook.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2026 Element Creations 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.ClientBuilderEnterpriseHook +import io.element.android.libraries.matrix.api.MatrixClientBuilder +import io.element.android.libraries.matrix.api.core.SessionId + +class FakeClientBuilderEnterpriseHook( + private val tweakClientBuilderResult: (MatrixClientBuilder) -> MatrixClientBuilder = { it }, + private val tweakClientBuilderWithSessionIdResult: (MatrixClientBuilder, SessionId) -> MatrixClientBuilder = { clientBuilder, _ -> clientBuilder }, +) : ClientBuilderEnterpriseHook { + override suspend fun tweakClientBuilder(clientBuilder: MatrixClientBuilder): MatrixClientBuilder { + return tweakClientBuilderResult(clientBuilder) + } + + override suspend fun tweakClientBuilder(clientBuilder: MatrixClientBuilder, sessionId: SessionId): MatrixClientBuilder { + return tweakClientBuilderWithSessionIdResult(clientBuilder, sessionId) + } +} diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt index db391b3fdc..8f07b3c546 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt @@ -99,7 +99,9 @@ class RustMatrixClientFactory( ) .homeserverUrl(sessionData.homeserverUrl) .enableAutomaticBackPagination(featureFlagService.isFeatureEnabled(FeatureFlags.AutomaticBackPagination)) - .let { (clientBuilderEnterpriseHook(RustMatrixClientBuilder(it), SessionId(sessionData.userId)) as RustMatrixClientBuilder).inner } + .let { + (clientBuilderEnterpriseHook.tweakClientBuilder(RustMatrixClientBuilder(it), SessionId(sessionData.userId)) as RustMatrixClientBuilder).inner + } .use { it.build() } client.setMediaRetentionPolicy( @@ -219,6 +221,9 @@ class RustMatrixClientFactory( // Workaround for non-nullable proxy parameter in the SDK, since each call to the ClientBuilder returns a new reference we need to keep proxyProvider.provides()?.let { proxy(it) } ?: this } + .let { + (clientBuilderEnterpriseHook.tweakClientBuilder(RustMatrixClientBuilder(it)) as RustMatrixClientBuilder).inner + } } } diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactoryTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactoryTest.kt index 6d3afad5c3..6b5b5a154a 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactoryTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactoryTest.kt @@ -9,6 +9,7 @@ package io.element.android.libraries.matrix.impl import com.google.common.truth.Truth.assertThat +import io.element.android.features.enterprise.test.FakeClientBuilderEnterpriseHook import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.impl.auth.FakeProxyProvider @@ -65,5 +66,5 @@ fun TestScope.createRustMatrixClientFactory( clientBuilderProvider = clientBuilderProvider, sqliteStoreBuilderProvider = FakeSqliteStoreBuilderProvider(), workManagerScheduler = workManagerScheduler, - clientBuilderEnterpriseHook = { builder, _ -> builder }, + clientBuilderEnterpriseHook = FakeClientBuilderEnterpriseHook(), ) diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustTemporaryMatrixClientFactoryTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustTemporaryMatrixClientFactoryTest.kt index d0b87ef53a..f18f633889 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustTemporaryMatrixClientFactoryTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustTemporaryMatrixClientFactoryTest.kt @@ -8,6 +8,7 @@ package io.element.android.libraries.matrix.impl import com.google.common.truth.Truth.assertThat +import io.element.android.features.enterprise.test.FakeClientBuilderEnterpriseHook import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.impl.auth.FakeProxyProvider import io.element.android.libraries.matrix.impl.paths.SessionPathsFactory @@ -77,6 +78,6 @@ class RustTemporaryMatrixClientFactoryTest { clientBuilderProvider = clientBuilderProvider, sqliteStoreBuilderProvider = FakeSqliteStoreBuilderProvider(), workManagerScheduler = workManagerScheduler, - clientBuilderEnterpriseHook = { builder, _ -> builder }, + clientBuilderEnterpriseHook = FakeClientBuilderEnterpriseHook(), ) }