Skip to content

Commit 3cf8237

Browse files
authored
Allow configuration to provide multiple account providers. (#4742)
* Allow several account provider in configuration * Target latest private modules. * Fix tests * Target latest private modules. * Trigger CI * Fix formatting issue
1 parent 150239b commit 3cf8237

File tree

13 files changed

+58
-40
lines changed

13 files changed

+58
-40
lines changed

enterprise

features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/EnterpriseService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import io.element.android.libraries.matrix.api.core.SessionId
1313
interface EnterpriseService {
1414
val isEnterpriseBuild: Boolean
1515
suspend fun isEnterpriseUser(sessionId: SessionId): Boolean
16-
fun defaultHomeserver(): String?
16+
fun defaultHomeserverList(): List<String>
1717
suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String): Boolean
1818

1919
fun semanticColorsLight(): SemanticColors

features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class DefaultEnterpriseService @Inject constructor() : EnterpriseService {
2222

2323
override suspend fun isEnterpriseUser(sessionId: SessionId) = false
2424

25-
override fun defaultHomeserver() = null
25+
override fun defaultHomeserverList(): List<String> = emptyList()
2626
override suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String) = true
2727

2828
override fun semanticColorsLight(): SemanticColors = compoundColorsLight

features/enterprise/impl/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseServiceTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ class DefaultEnterpriseServiceTest {
2121
}
2222

2323
@Test
24-
fun `defaultHomeserver should return null`() {
24+
fun `defaultHomeserverList should return empty list`() {
2525
val defaultEnterpriseService = DefaultEnterpriseService()
26-
assertThat<String?>(defaultEnterpriseService.defaultHomeserver()).isNull()
26+
assertThat(defaultEnterpriseService.defaultHomeserverList()).isEmpty()
2727
}
2828

2929
@Test

features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeEnterpriseService.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import io.element.android.tests.testutils.simulateLongTask
1616
class FakeEnterpriseService(
1717
override val isEnterpriseBuild: Boolean = false,
1818
private val isEnterpriseUserResult: (SessionId) -> Boolean = { lambdaError() },
19-
private val defaultHomeserverResult: () -> String? = { A_FAKE_HOMESERVER },
19+
private val defaultHomeserverListResult: () -> List<String> = { emptyList() },
2020
private val isAllowedToConnectToHomeserverResult: (String) -> Boolean = { lambdaError() },
2121
private val semanticColorsLightResult: () -> SemanticColors = { lambdaError() },
2222
private val semanticColorsDarkResult: () -> SemanticColors = { lambdaError() },
@@ -27,8 +27,8 @@ class FakeEnterpriseService(
2727
isEnterpriseUserResult(sessionId)
2828
}
2929

30-
override fun defaultHomeserver(): String? {
31-
return defaultHomeserverResult()
30+
override fun defaultHomeserverList(): List<String> {
31+
return defaultHomeserverListResult()
3232
}
3333

3434
override suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String): Boolean = simulateLongTask {

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSource.kt

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@ import javax.inject.Inject
2020
class AccountProviderDataSource @Inject constructor(
2121
enterpriseService: EnterpriseService,
2222
) {
23-
private val defaultAccountProvider = (enterpriseService.defaultHomeserver() ?: AuthenticationConfig.MATRIX_ORG_URL).let { url ->
24-
AccountProvider(
25-
url = url,
26-
subtitle = null,
27-
isPublic = url == AuthenticationConfig.MATRIX_ORG_URL,
28-
isMatrixOrg = url == AuthenticationConfig.MATRIX_ORG_URL,
29-
)
30-
}
23+
private val defaultAccountProvider = (enterpriseService.defaultHomeserverList().firstOrNull() ?: AuthenticationConfig.MATRIX_ORG_URL)
24+
.let { url ->
25+
AccountProvider(
26+
url = url,
27+
subtitle = null,
28+
isPublic = url == AuthenticationConfig.MATRIX_ORG_URL,
29+
isMatrixOrg = url == AuthenticationConfig.MATRIX_ORG_URL,
30+
)
31+
}
3132

3233
private val accountProvider: MutableStateFlow<AccountProvider> = MutableStateFlow(
3334
defaultAccountProvider

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderPresenter.kt

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,39 @@
88
package io.element.android.features.login.impl.screens.changeaccountprovider
99

1010
import androidx.compose.runtime.Composable
11+
import androidx.compose.runtime.remember
1112
import io.element.android.appconfig.AuthenticationConfig
13+
import io.element.android.features.enterprise.api.EnterpriseService
1214
import io.element.android.features.login.impl.accountprovider.AccountProvider
1315
import io.element.android.features.login.impl.changeserver.ChangeServerState
1416
import io.element.android.libraries.architecture.Presenter
17+
import io.element.android.libraries.core.uri.ensureProtocol
1518
import javax.inject.Inject
1619

1720
class ChangeAccountProviderPresenter @Inject constructor(
1821
private val changeServerPresenter: Presenter<ChangeServerState>,
22+
private val enterpriseService: EnterpriseService,
1923
) : Presenter<ChangeAccountProviderState> {
2024
@Composable
2125
override fun present(): ChangeAccountProviderState {
26+
val staticAccountProviderList = remember {
27+
enterpriseService.defaultHomeserverList()
28+
.map { it.ensureProtocol() }
29+
.ifEmpty { listOf(AuthenticationConfig.MATRIX_ORG_URL) }
30+
.map { url ->
31+
AccountProvider(
32+
url = url,
33+
subtitle = null,
34+
isPublic = url == AuthenticationConfig.MATRIX_ORG_URL,
35+
isMatrixOrg = url == AuthenticationConfig.MATRIX_ORG_URL,
36+
isValid = true,
37+
)
38+
}
39+
}
40+
2241
val changeServerState = changeServerPresenter.present()
2342
return ChangeAccountProviderState(
24-
// Just matrix.org by default for now
25-
accountProviders = listOf(
26-
AccountProvider(
27-
url = AuthenticationConfig.MATRIX_ORG_URL,
28-
subtitle = null,
29-
isPublic = true,
30-
isMatrixOrg = true,
31-
isValid = true,
32-
)
33-
),
43+
accountProviders = staticAccountProviderList,
3444
changeServerState = changeServerState,
3545
)
3646
}

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import io.element.android.features.login.impl.accountprovider.AccountProvider
1111
import io.element.android.features.login.impl.changeserver.ChangeServerState
1212

1313
// Do not use default value, so no member get forgotten in the presenters.
14-
data class ChangeAccountProviderState constructor(
14+
data class ChangeAccountProviderState(
1515
val accountProviders: List<AccountProvider>,
1616
val changeServerState: ChangeServerState,
1717
)

features/login/impl/src/test/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSourceTest.kt

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ class AccountProviderDataSourceTest {
2727
val initialState = awaitItem()
2828
assertThat(initialState).isEqualTo(
2929
AccountProvider(
30-
url = FakeEnterpriseService.A_FAKE_HOMESERVER,
31-
title = FakeEnterpriseService.A_FAKE_HOMESERVER,
30+
url = AuthenticationConfig.MATRIX_ORG_URL,
31+
title = "matrix.org",
3232
subtitle = null,
33-
isPublic = false,
34-
isMatrixOrg = false,
33+
isPublic = true,
34+
isMatrixOrg = true,
3535
isValid = false,
3636
)
3737
)
@@ -40,9 +40,11 @@ class AccountProviderDataSourceTest {
4040

4141
@Test
4242
fun `present - initial state - matrix org`() = runTest {
43-
val sut = AccountProviderDataSource(FakeEnterpriseService(
44-
defaultHomeserverResult = { AuthenticationConfig.MATRIX_ORG_URL }
45-
))
43+
val sut = AccountProviderDataSource(
44+
FakeEnterpriseService(
45+
defaultHomeserverListResult = { listOf(AuthenticationConfig.MATRIX_ORG_URL) }
46+
)
47+
)
4648
sut.flow.test {
4749
val initialState = awaitItem()
4850
assertThat(initialState).isEqualTo(
@@ -63,7 +65,7 @@ class AccountProviderDataSourceTest {
6365
val sut = AccountProviderDataSource(FakeEnterpriseService())
6466
sut.flow.test {
6567
val initialState = awaitItem()
66-
assertThat(initialState.url).isEqualTo(FakeEnterpriseService.A_FAKE_HOMESERVER)
68+
assertThat(initialState.url).isEqualTo(AuthenticationConfig.MATRIX_ORG_URL)
6769
sut.userSelection(AccountProvider(url = "https://example.com"))
6870
val changedState = awaitItem()
6971
assertThat(changedState).isEqualTo(
@@ -78,7 +80,7 @@ class AccountProviderDataSourceTest {
7880
)
7981
sut.reset()
8082
val resetState = awaitItem()
81-
assertThat(resetState.url).isEqualTo(FakeEnterpriseService.A_FAKE_HOMESERVER)
83+
assertThat(resetState.url).isEqualTo(AuthenticationConfig.MATRIX_ORG_URL)
8284
}
8385
}
8486
}

features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderPresenterTest.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import app.cash.molecule.RecompositionMode
1111
import app.cash.molecule.moleculeFlow
1212
import app.cash.turbine.test
1313
import com.google.common.truth.Truth.assertThat
14+
import io.element.android.features.enterprise.test.FakeEnterpriseService
1415
import io.element.android.features.login.impl.accountprovider.AccountProvider
1516
import io.element.android.features.login.impl.changeserver.aChangeServerState
1617
import io.element.android.tests.testutils.WarmUpRule
@@ -25,7 +26,8 @@ class ChangeAccountProviderPresenterTest {
2526
@Test
2627
fun `present - initial state`() = runTest {
2728
val presenter = ChangeAccountProviderPresenter(
28-
changeServerPresenter = { aChangeServerState() }
29+
changeServerPresenter = { aChangeServerState() },
30+
enterpriseService = FakeEnterpriseService(),
2931
)
3032
moleculeFlow(RecompositionMode.Immediate) {
3133
presenter.present()

features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenterTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import app.cash.molecule.RecompositionMode
1111
import app.cash.molecule.moleculeFlow
1212
import app.cash.turbine.test
1313
import com.google.common.truth.Truth.assertThat
14+
import io.element.android.appconfig.AuthenticationConfig
1415
import io.element.android.features.enterprise.test.FakeEnterpriseService
1516
import io.element.android.features.login.impl.DefaultLoginUserStory
1617
import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource
@@ -44,7 +45,7 @@ class ConfirmAccountProviderPresenterTest {
4445
val initialState = awaitItem()
4546
assertThat(initialState.isAccountCreation).isFalse()
4647
assertThat(initialState.submitEnabled).isTrue()
47-
assertThat(initialState.accountProvider.url).isEqualTo(FakeEnterpriseService.A_FAKE_HOMESERVER)
48+
assertThat(initialState.accountProvider.url).isEqualTo(AuthenticationConfig.MATRIX_ORG_URL)
4849
assertThat(initialState.loginFlow).isEqualTo(AsyncData.Uninitialized)
4950
}
5051
}

features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/createaccount/DefaultMessageParserTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package io.element.android.features.login.impl.screens.createaccount
99

1010
import com.google.common.truth.Truth.assertThat
11+
import io.element.android.appconfig.AuthenticationConfig
1112
import io.element.android.features.enterprise.test.FakeEnterpriseService
1213
import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource
1314
import io.element.android.libraries.matrix.api.auth.external.ExternalSession
@@ -60,7 +61,7 @@ class DefaultMessageParserTest {
6061
// missing homeServer
6162
assertThat(sut.parse(validMessage.replace(""""home_server": "home_server",""", ""))).isEqualTo(
6263
anExternalSession(
63-
homeserverUrl = FakeEnterpriseService.A_FAKE_HOMESERVER,
64+
homeserverUrl = AuthenticationConfig.MATRIX_ORG_URL,
6465
)
6566
)
6667
}

features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordPresenterTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package io.element.android.features.login.impl.screens.loginpassword
99

1010
import com.google.common.truth.Truth.assertThat
11+
import io.element.android.appconfig.AuthenticationConfig
1112
import io.element.android.features.enterprise.test.FakeEnterpriseService
1213
import io.element.android.features.login.impl.DefaultLoginUserStory
1314
import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource
@@ -33,7 +34,7 @@ class LoginPasswordPresenterTest {
3334
fun `present - initial state`() = runTest {
3435
createLoginPasswordPresenter().test {
3536
val initialState = awaitItem()
36-
assertThat(initialState.accountProvider.url).isEqualTo(FakeEnterpriseService.A_FAKE_HOMESERVER)
37+
assertThat(initialState.accountProvider.url).isEqualTo(AuthenticationConfig.MATRIX_ORG_URL)
3738
assertThat(initialState.formState).isEqualTo(LoginFormState.Default)
3839
assertThat(initialState.loginAction).isEqualTo(AsyncData.Uninitialized)
3940
assertThat(initialState.submitEnabled).isFalse()

0 commit comments

Comments
 (0)