Improve API of LoginHelper and AccountProviderDataSource

This commit is contained in:
Benoit Marty
2025-11-06 17:14:30 +01:00
committed by Benoit Marty
parent a3483d1f40
commit 42a0b91acc
6 changed files with 20 additions and 17 deletions

View File

@@ -43,9 +43,11 @@ import io.element.android.libraries.architecture.NodeInputs
import io.element.android.libraries.architecture.callback
import io.element.android.libraries.architecture.createNode
import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.di.annotations.AppCoroutineScope
import io.element.android.libraries.matrix.api.auth.OidcDetails
import io.element.android.libraries.oidc.api.OidcAction
import io.element.android.libraries.oidc.api.OidcActionFlow
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.parcelize.Parcelize
@@ -57,6 +59,8 @@ class LoginFlowNode(
@Assisted plugins: List<Plugin>,
private val accountProviderDataSource: AccountProviderDataSource,
private val oidcActionFlow: OidcActionFlow,
@AppCoroutineScope
private val appCoroutineScope: CoroutineScope,
) : BaseFlowNode<LoginFlowNode.NavTarget>(
backstack = BackStack(
initialElement = NavTarget.OnBoarding,
@@ -268,7 +272,9 @@ class LoginFlowNode(
DisposableEffect(Unit) {
onDispose {
activity = null
accountProviderDataSource.reset()
appCoroutineScope.launch {
accountProviderDataSource.reset()
}
}
}
BackstackView()

View File

@@ -31,16 +31,16 @@ class AccountProviderDataSource(
val flow: StateFlow<AccountProvider> = accountProvider.asStateFlow()
fun reset() {
accountProvider.tryEmit(defaultAccountProvider)
suspend fun reset() {
accountProvider.emit(defaultAccountProvider)
}
fun setUrl(url: String) {
suspend fun setUrl(url: String) {
setAccountProvider(createAccountProvider(url))
}
fun setAccountProvider(data: AccountProvider) {
accountProvider.tryEmit(data)
suspend fun setAccountProvider(data: AccountProvider) {
accountProvider.emit(data)
}
private fun createAccountProvider(url: String): AccountProvider {

View File

@@ -25,8 +25,6 @@ import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
import io.element.android.libraries.matrix.api.auth.OidcPrompt
import io.element.android.libraries.oidc.api.OidcAction
import io.element.android.libraries.oidc.api.OidcActionFlow
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
/**
* This class is responsible for managing the login flow, including handling OIDC actions and
@@ -58,12 +56,11 @@ class LoginHelper(
loginModeState.value = AsyncData.Uninitialized
}
fun submit(
coroutineScope: CoroutineScope,
suspend fun submit(
isAccountCreation: Boolean,
homeserverUrl: String,
loginHint: String?,
) = coroutineScope.launch {
) {
suspend {
authenticationService.setHomeserver(homeserverUrl).map { matrixHomeServerDetails ->
if (matrixHomeServerDetails.supportsOidcLogin) {

View File

@@ -22,6 +22,7 @@ import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.uri.ensureProtocol
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.launch
@Inject
class ChooseAccountProviderPresenter(
@@ -37,10 +38,9 @@ class ChooseAccountProviderPresenter(
fun handleEvent(event: ChooseAccountProviderEvents) {
when (event) {
ChooseAccountProviderEvents.Continue -> {
ChooseAccountProviderEvents.Continue -> localCoroutineScope.launch {
selectedAccountProvider?.let {
loginHelper.submit(
coroutineScope = localCoroutineScope,
isAccountCreation = false,
homeserverUrl = it.url,
loginHint = null,

View File

@@ -17,6 +17,7 @@ import dev.zacsweers.metro.AssistedInject
import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource
import io.element.android.features.login.impl.login.LoginHelper
import io.element.android.libraries.architecture.Presenter
import kotlinx.coroutines.launch
@AssistedInject
class ConfirmAccountProviderPresenter(
@@ -42,9 +43,8 @@ class ConfirmAccountProviderPresenter(
fun handleEvents(event: ConfirmAccountProviderEvents) {
when (event) {
ConfirmAccountProviderEvents.Continue -> {
ConfirmAccountProviderEvents.Continue -> localCoroutineScope.launch {
loginHelper.submit(
coroutineScope = localCoroutineScope,
isAccountCreation = params.isAccountCreation,
homeserverUrl = accountProvider.url,
loginHint = null,

View File

@@ -30,6 +30,7 @@ import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.sessionstorage.api.SessionStore
import io.element.android.libraries.ui.utils.MultipleTapToUnlock
import kotlinx.coroutines.launch
@AssistedInject
class OnBoardingPresenter(
@@ -99,11 +100,10 @@ class OnBoardingPresenter(
fun handleEvent(event: OnBoardingEvents) {
when (event) {
is OnBoardingEvents.OnSignIn -> {
is OnBoardingEvents.OnSignIn -> localCoroutineScope.launch {
// Ensure that the current account provider is set
accountProviderDataSource.setUrl(event.defaultAccountProvider)
loginHelper.submit(
coroutineScope = localCoroutineScope,
isAccountCreation = false,
homeserverUrl = event.defaultAccountProvider,
loginHint = params.loginHint?.takeIf { forcedAccountProvider == null },