From 64b5b535104f818d3ce63b51e4a60026e5252d4d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 21 Oct 2025 11:53:36 +0200 Subject: [PATCH] Improve API and documentation --- enterprise | 2 +- .../android/features/enterprise/api/EnterpriseService.kt | 3 ++- .../features/enterprise/impl/DefaultEnterpriseService.kt | 2 +- .../enterprise/impl/DefaultEnterpriseServiceTest.kt | 4 ++-- .../features/enterprise/test/FakeEnterpriseService.kt | 6 +++--- .../impl/developer/DeveloperSettingsPresenter.kt | 4 +++- .../impl/developer/DeveloperSettingsPresenterTest.kt | 8 ++++++-- .../rageshake/impl/reporter/DefaultBugReporter.kt | 4 ++-- .../android/libraries/sessionstorage/api/SessionStore.kt | 4 ++-- 9 files changed, 22 insertions(+), 15 deletions(-) diff --git a/enterprise b/enterprise index f9178b5a11..f662f079f9 160000 --- a/enterprise +++ b/enterprise @@ -1 +1 @@ -Subproject commit f9178b5a11cda8d91ae5d62d6ad66ae8a6b3081e +Subproject commit f662f079f911b728e5769d10268e2c2775d7287a 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 8eb4184fec..2f62327643 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 @@ -21,9 +21,10 @@ interface EnterpriseService { /** * Override the brand color. + * @param sessionId the session to override the brand color for, or null to set the brand color to use when there is no session. * @param brandColor the color in hex format (#RRGGBBAA or #RRGGBB), or null to reset to default. */ - suspend fun overrideBrandColor(brandColor: String?) + suspend fun overrideBrandColor(sessionId: SessionId?, brandColor: String?) @Composable fun semanticColorsLight(): State diff --git a/features/enterprise/impl-foss/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt b/features/enterprise/impl-foss/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt index 924a9aec26..f2171c4a49 100644 --- a/features/enterprise/impl-foss/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt +++ b/features/enterprise/impl-foss/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt @@ -32,7 +32,7 @@ class DefaultEnterpriseService : EnterpriseService { override fun defaultHomeserverList(): List = emptyList() override suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String) = true - override suspend fun overrideBrandColor(brandColor: String?) = Unit + override suspend fun overrideBrandColor(sessionId: SessionId?, brandColor: String?) = Unit @Composable override fun semanticColorsLight(): State { diff --git a/features/enterprise/impl-foss/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseServiceTest.kt b/features/enterprise/impl-foss/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseServiceTest.kt index d3a4a63ad1..5701aa6574 100644 --- a/features/enterprise/impl-foss/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseServiceTest.kt +++ b/features/enterprise/impl-foss/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseServiceTest.kt @@ -51,7 +51,7 @@ class DefaultEnterpriseServiceTest { }.test { val initialState = awaitItem() assertThat(initialState).isEqualTo(compoundColorsLight) - defaultEnterpriseService.overrideBrandColor("#87654321") + defaultEnterpriseService.overrideBrandColor(A_SESSION_ID, "#87654321") expectNoEvents() } } @@ -64,7 +64,7 @@ class DefaultEnterpriseServiceTest { }.test { val initialState = awaitItem() assertThat(initialState).isEqualTo(compoundColorsDark) - defaultEnterpriseService.overrideBrandColor("#87654321") + defaultEnterpriseService.overrideBrandColor(A_SESSION_ID, "#87654321") expectNoEvents() } } 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 04aa9dd640..64f2898078 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 @@ -26,7 +26,7 @@ class FakeEnterpriseService( private val isAllowedToConnectToHomeserverResult: (String) -> Boolean = { lambdaError() }, private val semanticColorsLightResult: () -> State = { lambdaError() }, private val semanticColorsDarkResult: () -> State = { lambdaError() }, - private val overrideBrandColorResult: (String?) -> Unit = { lambdaError() }, + private val overrideBrandColorResult: (SessionId?, String?) -> Unit = { _, _ -> lambdaError() }, private val firebasePushGatewayResult: () -> String? = { lambdaError() }, private val unifiedPushDefaultPushGatewayResult: () -> String? = { lambdaError() }, ) : EnterpriseService { @@ -42,8 +42,8 @@ class FakeEnterpriseService( isAllowedToConnectToHomeserverResult(homeserverUrl) } - override suspend fun overrideBrandColor(brandColor: String?) = simulateLongTask { - overrideBrandColorResult(brandColor) + override suspend fun overrideBrandColor(sessionId: SessionId?, brandColor: String?) = simulateLongTask { + overrideBrandColorResult(sessionId, brandColor) } @Composable diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt index 9ed2abe609..1e68652e5c 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt @@ -38,6 +38,7 @@ import io.element.android.libraries.core.meta.BuildType import io.element.android.libraries.featureflag.api.FeatureFlagService import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.ui.model.FeatureUiModel +import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.preferences.api.store.AppPreferencesStore import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf @@ -50,6 +51,7 @@ import java.net.URL @Inject class DeveloperSettingsPresenter( + private val sessionId: SessionId, private val featureFlagService: FeatureFlagService, private val computeCacheSizeUseCase: ComputeCacheSizeUseCase, private val clearCacheUseCase: ClearCacheUseCase, @@ -138,7 +140,7 @@ class DeveloperSettingsPresenter( is DeveloperSettingsEvents.ChangeBrandColor -> coroutineScope.launch { showColorPicker = false val color = event.color?.value?.toHexString(HexFormat.UpperCase)?.substring(2, 8) - enterpriseService.overrideBrandColor(color) + enterpriseService.overrideBrandColor(sessionId, color) } is DeveloperSettingsEvents.SetShowColorPicker -> { showColorPicker = event.show diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt index 593b54f077..b68c01266d 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt @@ -25,6 +25,8 @@ import io.element.android.libraries.featureflag.api.Feature import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.test.FakeFeature import io.element.android.libraries.featureflag.test.FakeFeatureFlagService +import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.matrix.test.A_SESSION_ID import io.element.android.libraries.matrix.test.core.aBuildMeta import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore import io.element.android.tests.testutils.WarmUpRule @@ -184,7 +186,7 @@ class DeveloperSettingsPresenterTest { @Test fun `present - enterprise build can change the brand color`() = runTest { - val overrideBrandColorResult = lambdaRecorder { } + val overrideBrandColorResult = lambdaRecorder { _, _ -> } val presenter = createDeveloperSettingsPresenter( enterpriseService = FakeEnterpriseService( isEnterpriseBuild = true, @@ -205,11 +207,12 @@ class DeveloperSettingsPresenterTest { assertThat(awaitItem().showColorPicker).isFalse() skipItems(1) overrideBrandColorResult.assertions().isCalledOnce() - .with(value("00FF00")) + .with(value(A_SESSION_ID), value("00FF00")) } } private fun createDeveloperSettingsPresenter( + sessionId: SessionId = A_SESSION_ID, featureFlagService: FakeFeatureFlagService = FakeFeatureFlagService( getAvailableFeaturesResult = { _, _ -> listOf( @@ -228,6 +231,7 @@ class DeveloperSettingsPresenterTest { enterpriseService: EnterpriseService = FakeEnterpriseService(), ): DeveloperSettingsPresenter { return DeveloperSettingsPresenter( + sessionId = sessionId, featureFlagService = featureFlagService, computeCacheSizeUseCase = cacheSizeUseCase, clearCacheUseCase = clearCacheUseCase, diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt index 2584ebe597..c84388b099 100755 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt @@ -36,7 +36,7 @@ import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.tracing.TracingService import io.element.android.libraries.network.useragent.UserAgentProvider import io.element.android.libraries.sessionstorage.api.SessionStore -import io.element.android.libraries.sessionstorage.api.userIdFlow +import io.element.android.libraries.sessionstorage.api.sessionIdFlow import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.distinctUntilChanged @@ -107,7 +107,7 @@ class DefaultBugReporter( sessionStore.getLatestSession() }?.userId?.let(::UserId)?.domainName setCurrentLogDirectory(logSubfolder) - sessionStore.userIdFlow() + sessionStore.sessionIdFlow() .map { it?.let(::UserId)?.domainName } diff --git a/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionStore.kt b/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionStore.kt index 96d6c4a68e..7900b4d90d 100644 --- a/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionStore.kt +++ b/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionStore.kt @@ -75,9 +75,9 @@ fun Flow>.toUserListFlow(): Flow> { } /** - * @return a flow emitting the userId of the latest session if logged in, null otherwise. + * @return a flow emitting the sessionId of the latest session if logged in, null otherwise. */ -fun SessionStore.userIdFlow(): Flow { +fun SessionStore.sessionIdFlow(): Flow { return loggedInStateFlow().map { when (it) { is LoggedInState.LoggedIn -> it.sessionId