Improve API of LoginHelper and AccountProviderDataSource
This commit is contained in:
parent
a3483d1f40
commit
42a0b91acc
6 changed files with 20 additions and 17 deletions
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue