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

View file

@ -31,16 +31,16 @@ class AccountProviderDataSource(
val flow: StateFlow<AccountProvider> = accountProvider.asStateFlow() val flow: StateFlow<AccountProvider> = accountProvider.asStateFlow()
fun reset() { suspend fun reset() {
accountProvider.tryEmit(defaultAccountProvider) accountProvider.emit(defaultAccountProvider)
} }
fun setUrl(url: String) { suspend fun setUrl(url: String) {
setAccountProvider(createAccountProvider(url)) setAccountProvider(createAccountProvider(url))
} }
fun setAccountProvider(data: AccountProvider) { suspend fun setAccountProvider(data: AccountProvider) {
accountProvider.tryEmit(data) accountProvider.emit(data)
} }
private fun createAccountProvider(url: String): AccountProvider { 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.matrix.api.auth.OidcPrompt
import io.element.android.libraries.oidc.api.OidcAction import io.element.android.libraries.oidc.api.OidcAction
import io.element.android.libraries.oidc.api.OidcActionFlow 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 * This class is responsible for managing the login flow, including handling OIDC actions and
@ -58,12 +56,11 @@ class LoginHelper(
loginModeState.value = AsyncData.Uninitialized loginModeState.value = AsyncData.Uninitialized
} }
fun submit( suspend fun submit(
coroutineScope: CoroutineScope,
isAccountCreation: Boolean, isAccountCreation: Boolean,
homeserverUrl: String, homeserverUrl: String,
loginHint: String?, loginHint: String?,
) = coroutineScope.launch { ) {
suspend { suspend {
authenticationService.setHomeserver(homeserverUrl).map { matrixHomeServerDetails -> authenticationService.setHomeserver(homeserverUrl).map { matrixHomeServerDetails ->
if (matrixHomeServerDetails.supportsOidcLogin) { 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.architecture.Presenter
import io.element.android.libraries.core.uri.ensureProtocol import io.element.android.libraries.core.uri.ensureProtocol
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.launch
@Inject @Inject
class ChooseAccountProviderPresenter( class ChooseAccountProviderPresenter(
@ -37,10 +38,9 @@ class ChooseAccountProviderPresenter(
fun handleEvent(event: ChooseAccountProviderEvents) { fun handleEvent(event: ChooseAccountProviderEvents) {
when (event) { when (event) {
ChooseAccountProviderEvents.Continue -> { ChooseAccountProviderEvents.Continue -> localCoroutineScope.launch {
selectedAccountProvider?.let { selectedAccountProvider?.let {
loginHelper.submit( loginHelper.submit(
coroutineScope = localCoroutineScope,
isAccountCreation = false, isAccountCreation = false,
homeserverUrl = it.url, homeserverUrl = it.url,
loginHint = null, 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.accountprovider.AccountProviderDataSource
import io.element.android.features.login.impl.login.LoginHelper import io.element.android.features.login.impl.login.LoginHelper
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import kotlinx.coroutines.launch
@AssistedInject @AssistedInject
class ConfirmAccountProviderPresenter( class ConfirmAccountProviderPresenter(
@ -42,9 +43,8 @@ class ConfirmAccountProviderPresenter(
fun handleEvents(event: ConfirmAccountProviderEvents) { fun handleEvents(event: ConfirmAccountProviderEvents) {
when (event) { when (event) {
ConfirmAccountProviderEvents.Continue -> { ConfirmAccountProviderEvents.Continue -> localCoroutineScope.launch {
loginHelper.submit( loginHelper.submit(
coroutineScope = localCoroutineScope,
isAccountCreation = params.isAccountCreation, isAccountCreation = params.isAccountCreation,
homeserverUrl = accountProvider.url, homeserverUrl = accountProvider.url,
loginHint = null, 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.core.meta.BuildMeta
import io.element.android.libraries.sessionstorage.api.SessionStore import io.element.android.libraries.sessionstorage.api.SessionStore
import io.element.android.libraries.ui.utils.MultipleTapToUnlock import io.element.android.libraries.ui.utils.MultipleTapToUnlock
import kotlinx.coroutines.launch
@AssistedInject @AssistedInject
class OnBoardingPresenter( class OnBoardingPresenter(
@ -99,11 +100,10 @@ class OnBoardingPresenter(
fun handleEvent(event: OnBoardingEvents) { fun handleEvent(event: OnBoardingEvents) {
when (event) { when (event) {
is OnBoardingEvents.OnSignIn -> { is OnBoardingEvents.OnSignIn -> localCoroutineScope.launch {
// Ensure that the current account provider is set // Ensure that the current account provider is set
accountProviderDataSource.setUrl(event.defaultAccountProvider) accountProviderDataSource.setUrl(event.defaultAccountProvider)
loginHelper.submit( loginHelper.submit(
coroutineScope = localCoroutineScope,
isAccountCreation = false, isAccountCreation = false,
homeserverUrl = event.defaultAccountProvider, homeserverUrl = event.defaultAccountProvider,
loginHint = params.loginHint?.takeIf { forcedAccountProvider == null }, loginHint = params.loginHint?.takeIf { forcedAccountProvider == null },