diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt index 208109d6f9..051ff2c5df 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt @@ -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, private val accountProviderDataSource: AccountProviderDataSource, private val oidcActionFlow: OidcActionFlow, + @AppCoroutineScope + private val appCoroutineScope: CoroutineScope, ) : BaseFlowNode( backstack = BackStack( initialElement = NavTarget.OnBoarding, @@ -268,7 +272,9 @@ class LoginFlowNode( DisposableEffect(Unit) { onDispose { activity = null - accountProviderDataSource.reset() + appCoroutineScope.launch { + accountProviderDataSource.reset() + } } } BackstackView() diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSource.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSource.kt index c33e3b4f7e..75a3a67005 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSource.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSource.kt @@ -31,16 +31,16 @@ class AccountProviderDataSource( val flow: StateFlow = 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 { diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/login/LoginHelper.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/login/LoginHelper.kt index 8dbd2a4df3..1e270c5eeb 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/login/LoginHelper.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/login/LoginHelper.kt @@ -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) { diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderPresenter.kt index 0c915959cb..a44662e933 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderPresenter.kt @@ -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, diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt index d485755afb..9ad7220376 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt @@ -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, diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt index 28d542a92e..7240fdbd1d 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt @@ -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 },