diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginActivity.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginActivity.kt index 1eebf532e7..f71b0ecba4 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginActivity.kt @@ -151,8 +151,8 @@ open class LoginActivity : VectorBaseActivity(), ToolbarConfigurable { // TODO Disabled because it provokes a flickering // ft.setCustomAnimations(enterAnim, exitAnim, popEnterAnim, popExitAnim) }) - is LoginViewEvents.OnServerSelectionDone -> onServerSelectionDone() - is LoginViewEvents.OnSignModeSelected -> onSignModeSelected() + is LoginViewEvents.OnServerSelectionDone -> onServerSelectionDone(loginViewEvents) + is LoginViewEvents.OnSignModeSelected -> onSignModeSelected(loginViewEvents) is LoginViewEvents.OnLoginFlowRetrieved -> addFragmentToBackstack(R.id.loginFragmentContainer, if (loginViewEvents.isSso) { @@ -228,8 +228,8 @@ open class LoginActivity : VectorBaseActivity(), ToolbarConfigurable { .show() } - private fun onServerSelectionDone() = withState(loginViewModel) { state -> - when (state.serverType) { + private fun onServerSelectionDone(loginViewEvents: LoginViewEvents.OnServerSelectionDone) { + when (loginViewEvents.serverType) { ServerType.MatrixOrg -> Unit // In this case, we wait for the login flow ServerType.Modular, ServerType.Other -> addFragmentToBackstack(R.id.loginFragmentContainer, @@ -239,8 +239,9 @@ open class LoginActivity : VectorBaseActivity(), ToolbarConfigurable { } } - private fun onSignModeSelected() = withState(loginViewModel) { state -> - when (state.signMode) { + private fun onSignModeSelected(loginViewEvents: LoginViewEvents.OnSignModeSelected) = withState(loginViewModel) { state -> + // state.signMode could not be ready yet. So use value from the ViewEvent + when (loginViewEvents.signMode) { SignMode.Unknown -> error("Sign mode has to be set before calling this method") SignMode.SignUp -> { // This is managed by the LoginViewEvents diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginViewEvents.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginViewEvents.kt index 9b69ba8a4f..fe5c00399b 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginViewEvents.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginViewEvents.kt @@ -33,9 +33,9 @@ sealed class LoginViewEvents : VectorViewEvents { // Navigation event object OpenServerSelection : LoginViewEvents() - object OnServerSelectionDone : LoginViewEvents() + data class OnServerSelectionDone(val serverType: ServerType) : LoginViewEvents() data class OnLoginFlowRetrieved(val isSso: Boolean) : LoginViewEvents() - object OnSignModeSelected : LoginViewEvents() + data class OnSignModeSelected(val signMode: SignMode) : LoginViewEvents() object OnForgetPasswordClicked : LoginViewEvents() object OnResetPasswordSendThreePidDone : LoginViewEvents() object OnResetPasswordMailConfirmationSuccess : LoginViewEvents() diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt index f68290e862..7edc674b11 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt @@ -19,7 +19,6 @@ package im.vector.riotx.features.login import android.content.Context import android.net.Uri import androidx.fragment.app.FragmentActivity -import androidx.lifecycle.viewModelScope import com.airbnb.mvrx.ActivityViewModelContext import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Loading @@ -54,8 +53,6 @@ import im.vector.riotx.features.call.WebRtcPeerConnectionManager import im.vector.riotx.features.notifications.PushRuleTriggerListener import im.vector.riotx.features.session.SessionListener import im.vector.riotx.features.signout.soft.SoftLogoutActivity -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch import timber.log.Timber import java.util.concurrent.CancellationException @@ -402,14 +399,7 @@ class LoginViewModel @AssistedInject constructor( when (action.signMode) { SignMode.SignUp -> startRegistrationFlow() SignMode.SignIn -> startAuthenticationFlow() - SignMode.SignInWithMatrixId -> { - viewModelScope.launch { - // Add a delay to avoid crash - delay(50) - _viewEvents.post(LoginViewEvents.OnSignModeSelected) - } - Unit - } + SignMode.SignInWithMatrixId -> _viewEvents.post(LoginViewEvents.OnSignModeSelected(SignMode.SignInWithMatrixId)) SignMode.Unknown -> Unit } } @@ -427,7 +417,7 @@ class LoginViewModel @AssistedInject constructor( // Request login flow here handle(LoginAction.UpdateHomeServer(matrixOrgUrl)) ServerType.Modular, - ServerType.Other -> _viewEvents.post(LoginViewEvents.OnServerSelectionDone) + ServerType.Other -> _viewEvents.post(LoginViewEvents.OnServerSelectionDone(action.serverType)) }.exhaustive } @@ -661,7 +651,7 @@ class LoginViewModel @AssistedInject constructor( // Ensure Wizard is ready loginWizard - _viewEvents.post(LoginViewEvents.OnSignModeSelected) + _viewEvents.post(LoginViewEvents.OnSignModeSelected(SignMode.SignIn)) } private fun onFlowResponse(flowResult: FlowResult) { diff --git a/vector/src/main/java/im/vector/riotx/features/signout/soft/SoftLogoutFragment.kt b/vector/src/main/java/im/vector/riotx/features/signout/soft/SoftLogoutFragment.kt index 13b90f26e8..fadcaa8055 100644 --- a/vector/src/main/java/im/vector/riotx/features/signout/soft/SoftLogoutFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/signout/soft/SoftLogoutFragment.kt @@ -93,8 +93,9 @@ class SoftLogoutFragment @Inject constructor( softLogoutViewModel.handle(SoftLogoutAction.SignInAgain(password)) } - override fun signinFallbackSubmit() { - loginViewModel.handle(LoginAction.PostViewEvent(LoginViewEvents.OnSignModeSelected)) + override fun signinFallbackSubmit() = withState(loginViewModel) { state -> + // The loginViewModel has been prepared for a SSO/login fallback recovery (above) + loginViewModel.handle(LoginAction.PostViewEvent(LoginViewEvents.OnSignModeSelected(state.signMode))) } override fun clearData() {