adding dedicated server selection state to onboarding state

- replaces previous separately url strings with state usage
- makes use of the state for updating the sign up and server selection fields
This commit is contained in:
Adam Brown 2022-03-31 12:52:18 +01:00
parent c3cf22158b
commit 7f90dda96f
11 changed files with 47 additions and 25 deletions

@ -291,21 +291,20 @@ class OnboardingViewModel @AssistedInject constructor(
currentJob = null currentJob = null
when (action) { when (action) {
OnboardingAction.ResetHomeServerType -> { OnboardingAction.ResetHomeServerType -> {
setState { setState {
copy( copy(
serverType = ServerType.Unknown serverType = ServerType.Unknown
) )
} }
} }
OnboardingAction.ResetHomeServerUrl -> { OnboardingAction.ResetHomeServerUrl -> {
viewModelScope.launch { viewModelScope.launch {
authenticationService.reset() authenticationService.reset()
setState { setState {
copy( copy(
isLoading = false, isLoading = false,
homeServerUrlFromUser = null, serverSelectionState = ServerSelectionState(),
homeServerUrl = null,
loginMode = LoginMode.Unknown, loginMode = LoginMode.Unknown,
serverType = ServerType.Unknown, serverType = ServerType.Unknown,
loginModeSupportedTypes = emptyList() loginModeSupportedTypes = emptyList()
@ -571,7 +570,7 @@ class OnboardingViewModel @AssistedInject constructor(
} }
private fun handleWebLoginSuccess(action: OnboardingAction.WebLoginSuccess) = withState { state -> private fun handleWebLoginSuccess(action: OnboardingAction.WebLoginSuccess) = withState { state ->
val homeServerConnectionConfigFinal = homeServerConnectionConfigFactory.create(state.homeServerUrl) val homeServerConnectionConfigFinal = homeServerConnectionConfigFactory.create(state.serverSelectionState.hostedUrl)
if (homeServerConnectionConfigFinal == null) { if (homeServerConnectionConfigFinal == null) {
// Should not happen // Should not happen
@ -647,11 +646,19 @@ class OnboardingViewModel @AssistedInject constructor(
else -> LoginMode.Unsupported else -> LoginMode.Unsupported
} }
val serverSelection = ServerSelectionState(
description = when (data.homeServerUrl) {
matrixOrgUrl -> stringProvider.getString(R.string.ftue_auth_create_account_matrix_dot_org_server_description)
else -> null
},
userUrlInput = homeServerConnectionConfig.homeServerUri.toString(),
hostedUrl = data.homeServerUrl
)
setState { setState {
copy( copy(
isLoading = false, isLoading = false,
homeServerUrlFromUser = homeServerConnectionConfig.homeServerUri.toString(), serverSelectionState = serverSelection,
homeServerUrl = data.homeServerUrl,
loginMode = loginMode, loginMode = loginMode,
loginModeSupportedTypes = data.supportedLoginTypes.toList() loginModeSupportedTypes = data.supportedLoginTypes.toList()
) )

@ -40,12 +40,6 @@ data class OnboardingViewState(
val signMode: SignMode = SignMode.Unknown, val signMode: SignMode = SignMode.Unknown,
@PersistState @PersistState
val resetPasswordEmail: String? = null, val resetPasswordEmail: String? = null,
@PersistState
val homeServerUrlFromUser: String? = null,
// Can be modified after a Wellknown request
@PersistState
val homeServerUrl: String? = null,
// For SSO session recovery // For SSO session recovery
@PersistState @PersistState
@ -60,6 +54,9 @@ data class OnboardingViewState(
val knownCustomHomeServersUrls: List<String> = emptyList(), val knownCustomHomeServersUrls: List<String> = emptyList(),
val isForceLoginFallbackEnabled: Boolean = false, val isForceLoginFallbackEnabled: Boolean = false,
@PersistState
val serverSelectionState: ServerSelectionState = ServerSelectionState(),
@PersistState @PersistState
val personalizationState: PersonalizationState = PersonalizationState() val personalizationState: PersonalizationState = PersonalizationState()
) : MavericksState ) : MavericksState
@ -70,6 +67,13 @@ enum class OnboardingFlow {
SignInSignUp SignInSignUp
} }
@Parcelize
data class ServerSelectionState(
val description: String? = null,
val userUrlInput: String? = null,
val hostedUrl: String? = null,
) : Parcelable
@Parcelize @Parcelize
data class PersonalizationState( data class PersonalizationState(
val supportsChangingDisplayName: Boolean = false, val supportsChangingDisplayName: Boolean = false,

@ -77,7 +77,7 @@ class FtueAuthCaptchaFragment @Inject constructor(
val mime = "text/html" val mime = "text/html"
val encoding = "utf-8" val encoding = "utf-8"
val homeServerUrl = state.homeServerUrl ?: error("missing url of homeserver") val homeServerUrl = state.serverSelectionState.hostedUrl ?: error("missing url of homeserver")
views.loginCaptchaWevView.loadDataWithBaseURL(homeServerUrl, html, mime, encoding, null) views.loginCaptchaWevView.loadDataWithBaseURL(homeServerUrl, html, mime, encoding, null)
views.loginCaptchaWevView.requestLayout() views.loginCaptchaWevView.requestLayout()

@ -40,6 +40,7 @@ import im.vector.app.core.extensions.hideKeyboard
import im.vector.app.core.extensions.hidePassword import im.vector.app.core.extensions.hidePassword
import im.vector.app.core.extensions.realignPercentagesToParent import im.vector.app.core.extensions.realignPercentagesToParent
import im.vector.app.core.extensions.toMvRxBundle import im.vector.app.core.extensions.toMvRxBundle
import im.vector.app.core.extensions.toReducedUrl
import im.vector.app.databinding.FragmentFtueSignUpCombinedBinding import im.vector.app.databinding.FragmentFtueSignUpCombinedBinding
import im.vector.app.features.login.LoginMode import im.vector.app.features.login.LoginMode
import im.vector.app.features.login.SSORedirectRouterActivity import im.vector.app.features.login.SSORedirectRouterActivity
@ -174,6 +175,9 @@ class FtueAuthCombinedRegisterFragment @Inject constructor() : AbstractSSOFtueAu
setupUi(state) setupUi(state)
setupAutoFill() setupAutoFill()
views.selectedServerName.text = state.serverSelectionState.userUrlInput.toReducedUrl()
views.selectedServerDescription.text = state.serverSelectionState.description
if (state.isLoading) { if (state.isLoading) {
// Ensure password is hidden // Ensure password is hidden
views.createAccountPasswordInput.editText().hidePassword() views.createAccountPasswordInput.editText().hidePassword()

@ -20,9 +20,13 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import im.vector.app.core.extensions.editText
import im.vector.app.core.extensions.realignPercentagesToParent
import im.vector.app.core.extensions.toReducedUrl
import im.vector.app.databinding.FragmentFtueServerSelectionCombinedBinding import im.vector.app.databinding.FragmentFtueServerSelectionCombinedBinding
import im.vector.app.features.onboarding.OnboardingAction import im.vector.app.features.onboarding.OnboardingAction
import im.vector.app.features.onboarding.OnboardingViewEvents import im.vector.app.features.onboarding.OnboardingViewEvents
import im.vector.app.features.onboarding.OnboardingViewState
import javax.inject.Inject import javax.inject.Inject
class FtueAuthCombinedServerSelectionFragment @Inject constructor() : AbstractSSOFtueAuthFragment<FragmentFtueServerSelectionCombinedBinding>() { class FtueAuthCombinedServerSelectionFragment @Inject constructor() : AbstractSSOFtueAuthFragment<FragmentFtueServerSelectionCombinedBinding>() {
@ -33,12 +37,18 @@ class FtueAuthCombinedServerSelectionFragment @Inject constructor() : AbstractSS
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
views.chooseServerRoot.realignPercentagesToParent()
views.chooseServerToolbar.setNavigationOnClickListener { views.chooseServerToolbar.setNavigationOnClickListener {
viewModel.handle(OnboardingAction.PostViewEvent(OnboardingViewEvents.OnBack)) viewModel.handle(OnboardingAction.PostViewEvent(OnboardingViewEvents.OnBack))
} }
} }
override fun resetViewModel() { override fun resetViewModel() {
// do nothing
}
override fun updateWithState(state: OnboardingViewState) {
views.chooseServerInput.editText().setText(state.serverSelectionState.userUrlInput.toReducedUrl())
} }
} }

@ -184,7 +184,7 @@ class FtueAuthLoginFragment @Inject constructor() : AbstractSSOFtueAuthFragment<
ServerType.MatrixOrg -> { ServerType.MatrixOrg -> {
views.loginServerIcon.isVisible = true views.loginServerIcon.isVisible = true
views.loginServerIcon.setImageResource(R.drawable.ic_logo_matrix_org) views.loginServerIcon.setImageResource(R.drawable.ic_logo_matrix_org)
views.loginTitle.text = getString(resId, state.homeServerUrlFromUser.toReducedUrl()) views.loginTitle.text = getString(resId, state.serverSelectionState.userUrlInput.toReducedUrl())
views.loginNotice.text = getString(R.string.login_server_matrix_org_text) views.loginNotice.text = getString(R.string.login_server_matrix_org_text)
} }
ServerType.EMS -> { ServerType.EMS -> {
@ -195,7 +195,7 @@ class FtueAuthLoginFragment @Inject constructor() : AbstractSSOFtueAuthFragment<
} }
ServerType.Other -> { ServerType.Other -> {
views.loginServerIcon.isVisible = false views.loginServerIcon.isVisible = false
views.loginTitle.text = getString(resId, state.homeServerUrlFromUser.toReducedUrl()) views.loginTitle.text = getString(resId, state.serverSelectionState.userUrlInput.toReducedUrl())
views.loginNotice.text = getString(R.string.login_server_other_text) views.loginNotice.text = getString(R.string.login_server_other_text)
} }
ServerType.Unknown -> Unit /* Should not happen */ ServerType.Unknown -> Unit /* Should not happen */

@ -59,7 +59,7 @@ class FtueAuthResetPasswordFragment @Inject constructor() : AbstractFtueAuthFrag
} }
private fun setupUi(state: OnboardingViewState) { private fun setupUi(state: OnboardingViewState) {
views.resetPasswordTitle.text = getString(R.string.login_reset_password_on, state.homeServerUrlFromUser.toReducedUrl()) views.resetPasswordTitle.text = getString(R.string.login_reset_password_on, state.serverSelectionState.userUrlInput.toReducedUrl())
} }
private fun setupSubmitButton() { private fun setupSubmitButton() {

@ -60,19 +60,19 @@ class FtueAuthSignUpSignInSelectionFragment @Inject constructor() : AbstractSSOF
ServerType.MatrixOrg -> { ServerType.MatrixOrg -> {
views.loginSignupSigninServerIcon.setImageResource(R.drawable.ic_logo_matrix_org) views.loginSignupSigninServerIcon.setImageResource(R.drawable.ic_logo_matrix_org)
views.loginSignupSigninServerIcon.isVisible = true views.loginSignupSigninServerIcon.isVisible = true
views.loginSignupSigninTitle.text = getString(R.string.login_connect_to, state.homeServerUrlFromUser.toReducedUrl()) views.loginSignupSigninTitle.text = getString(R.string.login_connect_to, state.serverSelectionState.userUrlInput.toReducedUrl())
views.loginSignupSigninText.text = getString(R.string.login_server_matrix_org_text) views.loginSignupSigninText.text = getString(R.string.login_server_matrix_org_text)
} }
ServerType.EMS -> { ServerType.EMS -> {
views.loginSignupSigninServerIcon.setImageResource(R.drawable.ic_logo_element_matrix_services) views.loginSignupSigninServerIcon.setImageResource(R.drawable.ic_logo_element_matrix_services)
views.loginSignupSigninServerIcon.isVisible = true views.loginSignupSigninServerIcon.isVisible = true
views.loginSignupSigninTitle.text = getString(R.string.login_connect_to_modular) views.loginSignupSigninTitle.text = getString(R.string.login_connect_to_modular)
views.loginSignupSigninText.text = state.homeServerUrlFromUser.toReducedUrl() views.loginSignupSigninText.text = state.serverSelectionState.userUrlInput.toReducedUrl()
} }
ServerType.Other -> { ServerType.Other -> {
views.loginSignupSigninServerIcon.isVisible = false views.loginSignupSigninServerIcon.isVisible = false
views.loginSignupSigninTitle.text = getString(R.string.login_server_other_title) views.loginSignupSigninTitle.text = getString(R.string.login_server_other_title)
views.loginSignupSigninText.text = getString(R.string.login_connect_to, state.homeServerUrlFromUser.toReducedUrl()) views.loginSignupSigninText.text = getString(R.string.login_connect_to, state.serverSelectionState.userUrlInput.toReducedUrl())
} }
ServerType.Unknown -> Unit /* Should not happen */ ServerType.Unknown -> Unit /* Should not happen */
} }

@ -116,7 +116,7 @@ class FtueAuthTermsFragment @Inject constructor(
} }
override fun updateWithState(state: OnboardingViewState) { override fun updateWithState(state: OnboardingViewState) {
policyController.homeServer = state.homeServerUrlFromUser.toReducedUrl() policyController.homeServer = state.serverSelectionState.userUrlInput.toReducedUrl()
renderState() renderState()
} }

@ -109,7 +109,6 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="12dp" android:layout_marginStart="12dp"
android:text="@string/ftue_auth_create_account_matrix_dot_org_server_name"
android:textColor="?vctr_content_primary" android:textColor="?vctr_content_primary"
app:layout_constraintBottom_toTopOf="@id/selectedServerDescription" app:layout_constraintBottom_toTopOf="@id/selectedServerDescription"
app:layout_constraintEnd_toStartOf="@id/editServerButton" app:layout_constraintEnd_toStartOf="@id/editServerButton"
@ -122,7 +121,6 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="12dp" android:layout_marginStart="12dp"
android:text="@string/ftue_auth_create_account_matrix_dot_org_server_description"
android:textColor="?vctr_content_tertiary" android:textColor="?vctr_content_tertiary"
app:layout_constraintBottom_toTopOf="@id/serverSelectionSpacing" app:layout_constraintBottom_toTopOf="@id/serverSelectionSpacing"
app:layout_constraintEnd_toStartOf="@id/editServerButton" app:layout_constraintEnd_toStartOf="@id/editServerButton"

@ -17,11 +17,10 @@
<string name="ftue_auth_create_account_choose_server_header">Choose your server to store your data</string> <string name="ftue_auth_create_account_choose_server_header">Choose your server to store your data</string>
<string name="ftue_auth_create_account_sso_section_header">Or</string> <string name="ftue_auth_create_account_sso_section_header">Or</string>
<string name="ftue_auth_create_account_matrix_dot_org_server_description">Join millions for free on the largest public server</string> <string name="ftue_auth_create_account_matrix_dot_org_server_description">Join millions for free on the largest public server</string>
<string name="ftue_auth_create_account_matrix_dot_org_server_name">matrix.org</string>
<string name="ftue_auth_create_account_edit_server_selection">Edit</string> <string name="ftue_auth_create_account_edit_server_selection">Edit</string>
<string name="ftue_auth_choose_server_title">Choose your server</string> <string name="ftue_auth_choose_server_title">Choose your server</string>
<string name="ftue_auth_choose_server_subtitle">What is the address of your server? Server is like a home for all your data</string> <string name="ftue_auth_choose_server_subtitle">What is the address of your server? Server is like a home for all your data.</string>
<string name="ftue_auth_choose_server_entry_hint">Server URL</string> <string name="ftue_auth_choose_server_entry_hint">Server URL</string>
<string name="ftue_auth_choose_server_entry_footer">You can only connect to a server that has already been set up</string> <string name="ftue_auth_choose_server_entry_footer">You can only connect to a server that has already been set up</string>
<string name="ftue_auth_choose_server_ems_title">Want to host your own server?</string> <string name="ftue_auth_choose_server_ems_title">Want to host your own server?</string>