From 8212b7e21910480b2f51aa5ed6a5a9a7154b029a Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Tue, 1 Feb 2022 17:20:02 +0000 Subject: [PATCH] completing the onboarding via dedicated event rather than observing state - allows for greater control of the flow (such as adding new screens inbetween the creation and exit with flags) --- .../onboarding/OnboardingViewEvents.kt | 2 ++ .../onboarding/OnboardingViewModel.kt | 30 +++++++++++-------- .../onboarding/ftueauth/FtueAuthVariant.kt | 26 +++++++++------- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewEvents.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewEvents.kt index d6105cda13..463c26578d 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewEvents.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewEvents.kt @@ -48,4 +48,6 @@ sealed class OnboardingViewEvents : VectorViewEvents { data class OnSendMsisdnSuccess(val msisdn: String) : OnboardingViewEvents() data class OnWebLoginError(val errorCode: Int, val description: String, val failingUrl: String) : OnboardingViewEvents() + object OnAccountCreated: OnboardingViewEvents() + object OnAccountSignedIn: OnboardingViewEvents() } diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt index 8097e90206..f62d5e92b4 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt @@ -244,7 +244,7 @@ class OnboardingViewModel @AssistedInject constructor( } null } - ?.let { onSessionCreated(it) } + ?.let { onSessionCreated(it, isAccountCreated = false) } } } } @@ -314,7 +314,7 @@ class OnboardingViewModel @AssistedInject constructor( } ?.let { data -> when (data) { - is RegistrationResult.Success -> onSessionCreated(data.session) + is RegistrationResult.Success -> onSessionCreated(data.session, isAccountCreated = true) is RegistrationResult.FlowResponse -> onFlowResponse(data.flowResult) } } @@ -615,11 +615,11 @@ class OnboardingViewModel @AssistedInject constructor( } when (data) { is WellknownResult.Prompt -> - onWellknownSuccess(action, data, homeServerConnectionConfig) + directLoginOnWellknownSuccess(action, data, homeServerConnectionConfig) is WellknownResult.FailPrompt -> // Relax on IS discovery if homeserver is valid if (data.homeServerUrl != null && data.wellKnown != null) { - onWellknownSuccess(action, WellknownResult.Prompt(data.homeServerUrl!!, null, data.wellKnown!!), homeServerConnectionConfig) + directLoginOnWellknownSuccess(action, WellknownResult.Prompt(data.homeServerUrl!!, null, data.wellKnown!!), homeServerConnectionConfig) } else { onWellKnownError() } @@ -639,9 +639,9 @@ class OnboardingViewModel @AssistedInject constructor( _viewEvents.post(OnboardingViewEvents.Failure(Exception(stringProvider.getString(R.string.autodiscover_well_known_error)))) } - private suspend fun onWellknownSuccess(action: OnboardingAction.LoginOrRegister, - wellKnownPrompt: WellknownResult.Prompt, - homeServerConnectionConfig: HomeServerConnectionConfig?) { + private suspend fun directLoginOnWellknownSuccess(action: OnboardingAction.LoginOrRegister, + wellKnownPrompt: WellknownResult.Prompt, + homeServerConnectionConfig: HomeServerConnectionConfig?) { val alteredHomeServerConnectionConfig = homeServerConnectionConfig ?.copy( homeServerUriBase = Uri.parse(wellKnownPrompt.homeServerUrl), @@ -663,7 +663,7 @@ class OnboardingViewModel @AssistedInject constructor( onDirectLoginError(failure) return } - onSessionCreated(data) + onSessionCreated(data, isAccountCreated = true) } private fun onDirectLoginError(failure: Throwable) { @@ -721,7 +721,7 @@ class OnboardingViewModel @AssistedInject constructor( } ?.let { reAuthHelper.data = action.password - onSessionCreated(it) + onSessionCreated(it, isAccountCreated = false) } } } @@ -751,8 +751,9 @@ class OnboardingViewModel @AssistedInject constructor( } } - private suspend fun onSessionCreated(session: Session) { - awaitState().useCase?.let { useCase -> + private suspend fun onSessionCreated(session: Session, isAccountCreated: Boolean) { + val state = awaitState() + state.useCase?.let { useCase -> session.vectorStore(applicationContext).setUseCase(useCase) } activeSessionHolder.setActiveSession(session) @@ -764,6 +765,11 @@ class OnboardingViewModel @AssistedInject constructor( asyncLoginAction = Success(Unit) ) } + + when (isAccountCreated) { + true -> _viewEvents.post(OnboardingViewEvents.OnAccountCreated) + false -> _viewEvents.post(OnboardingViewEvents.OnAccountSignedIn) + } } private fun handleWebLoginSuccess(action: OnboardingAction.WebLoginSuccess) = withState { state -> @@ -782,7 +788,7 @@ class OnboardingViewModel @AssistedInject constructor( } null } - ?.let { onSessionCreated(it) } + ?.let { onSessionCreated(it, isAccountCreated = false) } } } } diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt index 33d57dd95c..3b3a4d632b 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt @@ -220,20 +220,12 @@ class FtueAuthVariant( FtueAuthUseCaseFragment::class.java, option = commonOption) } + OnboardingViewEvents.OnAccountCreated -> onAccountCreated() + OnboardingViewEvents.OnAccountSignedIn -> onAccountSignedIn() }.exhaustive } private fun updateWithState(viewState: OnboardingViewState) { - if (viewState.isUserLogged()) { - val intent = HomeActivity.newIntent( - activity, - accountCreation = viewState.signMode == SignMode.SignUp - ) - activity.startActivity(intent) - activity.finish() - return - } - // Loading views.loginLoading.isVisible = viewState.isLoading() } @@ -368,4 +360,18 @@ class FtueAuthVariant( else -> Unit // Should not happen } } + + private fun onAccountSignedIn() { + navigateToHome(createdAccount = false) + } + + private fun onAccountCreated() { + navigateToHome(createdAccount = true) + } + + private fun navigateToHome(createdAccount: Boolean) { + val intent = HomeActivity.newIntent(activity, accountCreation = createdAccount) + activity.startActivity(intent) + activity.finish() + } }