diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt index 4af0825044..bb1d3cc52d 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt @@ -26,7 +26,8 @@ import org.matrix.android.sdk.api.auth.registration.RegisterThreePid import org.matrix.android.sdk.internal.network.ssl.Fingerprint sealed class OnboardingAction : VectorViewModelAction { - data class OnGetStarted(val resetLoginConfig: Boolean) : OnboardingAction() + data class OnGetStarted(val resetLoginConfig: Boolean, val onboardingFlow: OnboardingFlow) : OnboardingAction() + data class OnIAlreadyHaveAnAccount(val resetLoginConfig: Boolean, val onboardingFlow: OnboardingFlow) : OnboardingAction() data class UpdateServerType(val serverType: ServerType) : OnboardingAction() data class UpdateHomeServer(val homeServerUrl: String) : OnboardingAction() 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 32a6d63f9b..5d1e0fdade 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 @@ -121,7 +121,8 @@ class OnboardingViewModel @AssistedInject constructor( override fun handle(action: OnboardingAction) { when (action) { - is OnboardingAction.OnGetStarted -> handleOnGetStarted(action) + is OnboardingAction.OnGetStarted -> handleSplashAction(action.resetLoginConfig, action.onboardingFlow) + is OnboardingAction.OnIAlreadyHaveAnAccount -> handleSplashAction(action.resetLoginConfig, action.onboardingFlow) is OnboardingAction.UpdateServerType -> handleUpdateServerType(action) is OnboardingAction.UpdateSignMode -> handleUpdateSignMode(action) is OnboardingAction.InitWith -> handleInitWith(action) @@ -140,10 +141,11 @@ class OnboardingViewModel @AssistedInject constructor( }.exhaustive } - private fun handleOnGetStarted(action: OnboardingAction.OnGetStarted) { - if (action.resetLoginConfig) { + private fun handleSplashAction(resetConfig: Boolean, onboardingFlow: OnboardingFlow) { + if (resetConfig) { loginConfig = null } + setState { copy(onboardingFlow = onboardingFlow) } val configUrl = loginConfig?.homeServerUrl?.takeIf { it.isNotEmpty() } if (configUrl != null) { @@ -822,7 +824,17 @@ class OnboardingViewModel @AssistedInject constructor( // Notify the UI _viewEvents.post(OnboardingViewEvents.OutdatedHomeserver) } - _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved) + + withState { + when (it.onboardingFlow) { + OnboardingFlow.SignIn -> handleUpdateSignMode(OnboardingAction.UpdateSignMode(SignMode.SignIn)) + OnboardingFlow.SignUp -> handleUpdateSignMode(OnboardingAction.UpdateSignMode(SignMode.SignUp)) + OnboardingFlow.SignInSignUp, + null -> { + _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved) + } + } + } } } diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt index 7a6537f433..fd25f3901e 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt @@ -33,6 +33,9 @@ data class OnboardingViewState( val asyncResetMailConfirmed: Async = Uninitialized, val asyncRegistration: Async = Uninitialized, + @PersistState + val onboardingFlow: OnboardingFlow? = null, + // User choices @PersistState val serverType: ServerType = ServerType.Unknown, @@ -74,3 +77,9 @@ data class OnboardingViewState( return asyncLoginAction is Success } } + +enum class OnboardingFlow { + SignIn, + SignUp, + SignInSignUp +} diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashFragment.kt index 9039f2789a..5ef16afbf8 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashFragment.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashFragment.kt @@ -22,11 +22,13 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.isVisible +import com.airbnb.mvrx.withState import com.google.android.material.dialog.MaterialAlertDialogBuilder import im.vector.app.BuildConfig import im.vector.app.R -import im.vector.app.databinding.FragmentLoginSplashBinding +import im.vector.app.databinding.FragmentFtueSplashBinding import im.vector.app.features.onboarding.OnboardingAction +import im.vector.app.features.onboarding.OnboardingFlow import im.vector.app.features.settings.VectorPreferences import org.matrix.android.sdk.api.failure.Failure import java.net.UnknownHostException @@ -35,22 +37,22 @@ import javax.inject.Inject /** * In this screen, the user is viewing an introduction to what he can do with this application */ -class FtueAuthSplashFragment @Inject constructor( - private val vectorPreferences: VectorPreferences -) : AbstractFtueAuthFragment() { +class FtueAuthSplashFragment : AbstractFtueAuthFragment() { - override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLoginSplashBinding { - return FragmentLoginSplashBinding.inflate(inflater, container, false) + @Inject lateinit var vectorPreferences: VectorPreferences + + override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentFtueSplashBinding { + return FragmentFtueSplashBinding.inflate(inflater, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - setupViews() } private fun setupViews() { views.loginSplashSubmit.debouncedClicks { getStarted() } + views.loginSplashAlreadyHaveAccount.debouncedClicks { alreadyHaveAnAccount() } if (BuildConfig.DEBUG || vectorPreferences.developerMode()) { views.loginSplashVersion.isVisible = true @@ -58,11 +60,16 @@ class FtueAuthSplashFragment @Inject constructor( views.loginSplashVersion.text = "Version : ${BuildConfig.VERSION_NAME}\n" + "Branch: ${BuildConfig.GIT_BRANCH_NAME}\n" + "Build: ${BuildConfig.BUILD_NUMBER}" + views.loginSplashVersion.debouncedClicks { navigator.openDebug(requireContext()) } } } private fun getStarted() { - viewModel.handle(OnboardingAction.OnGetStarted(resetLoginConfig = false)) + viewModel.handle(OnboardingAction.OnGetStarted(resetLoginConfig = false, onboardingFlow = OnboardingFlow.SignUp)) + } + + private fun alreadyHaveAnAccount() { + viewModel.handle(OnboardingAction.OnIAlreadyHaveAnAccount(resetLoginConfig = false, onboardingFlow = OnboardingFlow.SignIn)) } override fun resetViewModel() { @@ -78,7 +85,8 @@ class FtueAuthSplashFragment @Inject constructor( .setTitle(R.string.dialog_title_error) .setMessage(getString(R.string.login_error_homeserver_from_url_not_found, url)) .setPositiveButton(R.string.login_error_homeserver_from_url_not_found_enter_manual) { _, _ -> - viewModel.handle(OnboardingAction.OnGetStarted(resetLoginConfig = true)) + val flow = withState(viewModel) { it.onboardingFlow } ?: OnboardingFlow.SignInSignUp + viewModel.handle(OnboardingAction.OnGetStarted(resetLoginConfig = true, flow)) } .setNegativeButton(R.string.action_cancel, null) .show() diff --git a/vector/src/main/res/layout/fragment_ftue_auth_splash.xml b/vector/src/main/res/layout/fragment_ftue_auth_splash.xml new file mode 100644 index 0000000000..96b3a7cbfb --- /dev/null +++ b/vector/src/main/res/layout/fragment_ftue_auth_splash.xml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +