From b9b403d07517da5d452d85afa028f92745f87053 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 10 Jan 2025 12:12:58 +0100 Subject: [PATCH] Open account creation screen (with error) when crating an account on default server which only support MAS) --- .../onboarding/OnboardingViewModel.kt | 9 ++-- .../FtueAuthCombinedRegisterFragment.kt | 53 ++++++++++++++++++- .../fragment_ftue_combined_register.xml | 52 +++++++++++++++--- 3 files changed, 104 insertions(+), 10 deletions(-) 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 54b2c83376..8ed6272d50 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 @@ -764,9 +764,9 @@ class OnboardingViewModel @AssistedInject constructor( OnboardingFlow.SignUp -> { updateSignMode(SignMode.SignUp) if (authResult.selectedHomeserver.hasOidcCompatibilityFlow && Config.sunsetConfig is SunsetConfig.Enabled) { - // An error is displayed now + // Navigate to the screen to create an account, it will show the error setState { copy(isLoading = false) } - _viewEvents.post(OnboardingViewEvents.Failure(MasSupportRequiredException())) + _viewEvents.post(OnboardingViewEvents.OpenCombinedRegister) } else { internalRegisterAction(RegisterAction.StartRegistration) } @@ -940,7 +940,10 @@ private fun LoginMode.supportsSignModeScreen(): Boolean { return when (this) { LoginMode.Password, is LoginMode.SsoAndPassword -> true - is LoginMode.Sso, + is LoginMode.Sso -> { + // In this case, an error will be displayed in the next screen + hasOidcCompatibilityFlow + } LoginMode.Unknown, LoginMode.Unsupported -> false } diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedRegisterFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedRegisterFragment.kt index 5a971514b6..9b322b626b 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedRegisterFragment.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedRegisterFragment.kt @@ -12,6 +12,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.TextView import androidx.autofill.HintConstants import androidx.core.text.isDigitsOnly import androidx.core.view.isVisible @@ -19,6 +20,9 @@ import androidx.lifecycle.lifecycleScope import com.airbnb.mvrx.withState import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint +import im.vector.app.R +import im.vector.app.config.Config +import im.vector.app.config.SunsetConfig import im.vector.app.core.extensions.clearErrorOnChange import im.vector.app.core.extensions.content import im.vector.app.core.extensions.editText @@ -31,6 +35,9 @@ import im.vector.app.core.extensions.realignPercentagesToParent import im.vector.app.core.extensions.setOnFocusLostListener import im.vector.app.core.extensions.setOnImeDoneListener import im.vector.app.core.extensions.toReducedUrl +import im.vector.app.core.resources.BuildMeta +import im.vector.app.core.utils.openApplicationStore +import im.vector.app.core.utils.openUrlInChromeCustomTab import im.vector.app.databinding.FragmentFtueCombinedRegisterBinding import im.vector.app.features.login.LoginMode import im.vector.app.features.login.SSORedirectRouterActivity @@ -52,12 +59,14 @@ import org.matrix.android.sdk.api.failure.isRegistrationDisabled import org.matrix.android.sdk.api.failure.isUsernameInUse import org.matrix.android.sdk.api.failure.isWeakPassword import reactivecircus.flowbinding.android.widget.textChanges +import javax.inject.Inject private const val MINIMUM_PASSWORD_LENGTH = 8 @AndroidEntryPoint class FtueAuthCombinedRegisterFragment : AbstractSSOFtueAuthFragment() { + @Inject lateinit var buildMeta: BuildMeta override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentFtueCombinedRegisterBinding { return FragmentFtueCombinedRegisterBinding.inflate(inflater, container, false) @@ -181,7 +190,8 @@ class FtueAuthCombinedRegisterFragment : } private fun setupUi(state: OnboardingViewState) { - views.selectedServerName.text = state.selectedHomeserver.userFacingUrl.toReducedUrl() + val serverName = state.selectedHomeserver.userFacingUrl.toReducedUrl() + views.selectedServerName.text = serverName if (state.isLoading) { // Ensure password is hidden @@ -201,6 +211,47 @@ class FtueAuthCombinedRegisterFragment : is LoginMode.SsoAndPassword -> renderSsoProviders(state.deviceId, state.selectedHomeserver.preferredLoginMode) else -> hideSsoProviders() } + + (Config.sunsetConfig as? SunsetConfig.Enabled)?.let { config -> + val isMasSupportRequired = state.selectedHomeserver.hasOidcCompatibilityFlow + views.serverSelectionSpacing.isVisible = !isMasSupportRequired + views.serverSelectionDivider.isVisible = !isMasSupportRequired + views.chooseServerCardErrorMas.isVisible = isMasSupportRequired + views.chooseServerCardDownloadReplacementApp.isVisible = isMasSupportRequired + + if (isMasSupportRequired) { + views.chooseServerCardErrorMas.findViewById(R.id.view_card_error_title).text = + getString(CommonStrings.error_mas_not_supported_title, serverName) + views.chooseServerCardErrorMas.findViewById(R.id.view_card_error_subtitle).text = + getString( + CommonStrings.error_mas_not_supported_subtitle, + config.replacementApplicationName, + serverName, + ) + views.chooseServerCardDownloadReplacementApp.findViewById(R.id.view_download_replacement_app_title).text = + getString(CommonStrings.view_download_replacement_app_title, config.replacementApplicationName) + + views.chooseServerCardDownloadReplacementApp.debouncedClicks { + openApplicationStore( + activity = requireActivity(), + buildMeta = buildMeta, + appId = config.replacementApplicationId, + ) + } + views.chooseServerCardDownloadReplacementApp.findViewById(R.id.view_download_replacement_app_learn_more)?.debouncedClicks { + openUrlInChromeCustomTab( + context = requireContext(), + session = null, + url = config.learnMoreLink, + ) + } + + // Disable form + views.createAccountInput.isEnabled = false + views.createAccountPasswordInput.isEnabled = false + views.createAccountSubmit.isEnabled = false + } + } } private fun renderSsoProviders(deviceId: String?, loginMode: LoginMode) { diff --git a/vector/src/main/res/layout/fragment_ftue_combined_register.xml b/vector/src/main/res/layout/fragment_ftue_combined_register.xml index 605254fc0a..0d1fa2221b 100644 --- a/vector/src/main/res/layout/fragment_ftue_combined_register.xml +++ b/vector/src/main/res/layout/fragment_ftue_combined_register.xml @@ -34,8 +34,8 @@ android:layout_height="52dp" app:layout_constraintBottom_toTopOf="@id/createAccountHeaderIcon" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_chainStyle="packed" - app:layout_constraintVertical_bias="0" /> + app:layout_constraintVertical_bias="0" + app:layout_constraintVertical_chainStyle="packed" /> + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@id/chooseServerCardDownloadReplacementApp"> + android:maxLines="1" + android:nextFocusForward="@id/createAccountPasswordInput" />