allowing optional emails

- when the email stage is non mandatory, email emails are treated as a dummy step, as per the legacy flow
This commit is contained in:
Adam Brown 2022-08-31 17:35:38 +01:00
parent 6341cf92a3
commit 62e8beadf8
4 changed files with 27 additions and 7 deletions
changelog.d
vector/src/main
java/im/vector/app/features/onboarding/ftueauth
res/layout

1
changelog.d/6969.bugfix Normal file
View file

@ -0,0 +1 @@
FTUE - Fixes optional email registration step always being mandatory

View file

@ -17,9 +17,11 @@
package im.vector.app.features.onboarding.ftueauth package im.vector.app.features.onboarding.ftueauth
import android.os.Bundle import android.os.Bundle
import android.os.Parcelable
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 com.airbnb.mvrx.args
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import im.vector.app.R import im.vector.app.R
import im.vector.app.core.extensions.associateContentStateWith import im.vector.app.core.extensions.associateContentStateWith
@ -35,11 +37,18 @@ import im.vector.app.databinding.FragmentFtueEmailInputBinding
import im.vector.app.features.onboarding.OnboardingAction import im.vector.app.features.onboarding.OnboardingAction
import im.vector.app.features.onboarding.OnboardingViewState import im.vector.app.features.onboarding.OnboardingViewState
import im.vector.app.features.onboarding.RegisterAction import im.vector.app.features.onboarding.RegisterAction
import kotlinx.parcelize.Parcelize
import org.matrix.android.sdk.api.auth.registration.RegisterThreePid import org.matrix.android.sdk.api.auth.registration.RegisterThreePid
@Parcelize
data class FtueAuthEmailEntryFragmentArgument(
val mandatory: Boolean,
) : Parcelable
@AndroidEntryPoint @AndroidEntryPoint
class FtueAuthEmailEntryFragment : class FtueAuthEmailEntryFragment : AbstractFtueAuthFragment<FragmentFtueEmailInputBinding>() {
AbstractFtueAuthFragment<FragmentFtueEmailInputBinding>() {
private val params: FtueAuthEmailEntryFragmentArgument by args()
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentFtueEmailInputBinding { override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentFtueEmailInputBinding {
return FragmentFtueEmailInputBinding.inflate(inflater, container, false) return FragmentFtueEmailInputBinding.inflate(inflater, container, false)
@ -51,7 +60,10 @@ class FtueAuthEmailEntryFragment :
} }
private fun setupViews() { private fun setupViews() {
views.emailEntryInput.associateContentStateWith(button = views.emailEntrySubmit, enabledPredicate = { it.isEmail() }) views.emailEntryInput.hint = getString(if (params.mandatory) R.string.ftue_auth_email_entry_title else R.string.login_set_email_optional_hint)
views.emailEntryInput.associateContentStateWith(button = views.emailEntrySubmit, enabledPredicate = {
it.isEmail() || it.isEmptyAndOptional()
})
views.emailEntryInput.setOnImeDoneListener { updateEmail() } views.emailEntryInput.setOnImeDoneListener { updateEmail() }
views.emailEntryInput.clearErrorOnChange(viewLifecycleOwner) views.emailEntryInput.clearErrorOnChange(viewLifecycleOwner)
views.emailEntrySubmit.debouncedClicks { updateEmail() } views.emailEntrySubmit.debouncedClicks { updateEmail() }
@ -60,9 +72,14 @@ class FtueAuthEmailEntryFragment :
private fun updateEmail() { private fun updateEmail() {
val email = views.emailEntryInput.content() val email = views.emailEntryInput.content()
viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.AddThreePid(RegisterThreePid.Email(email)))) when {
email.isEmptyAndOptional() -> viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.RegisterDummy))
else -> viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.AddThreePid(RegisterThreePid.Email(email))))
}
} }
private fun String.isEmptyAndOptional() = isEmpty() && !params.mandatory
override fun updateWithState(state: OnboardingViewState) { override fun updateWithState(state: OnboardingViewState) {
views.emailEntryHeaderSubtitle.text = getString(R.string.ftue_auth_email_subtitle, state.selectedHomeserver.userFacingUrl.toReducedUrl()) views.emailEntryHeaderSubtitle.text = getString(R.string.ftue_auth_email_subtitle, state.selectedHomeserver.userFacingUrl.toReducedUrl())

View file

@ -411,7 +411,8 @@ class FtueAuthVariant(
private fun onEmail(stage: Stage) { private fun onEmail(stage: Stage) {
when { when {
vectorFeatures.isOnboardingCombinedRegisterEnabled() -> addRegistrationStageFragmentToBackstack( vectorFeatures.isOnboardingCombinedRegisterEnabled() -> addRegistrationStageFragmentToBackstack(
FtueAuthEmailEntryFragment::class.java FtueAuthEmailEntryFragment::class.java,
FtueAuthEmailEntryFragmentArgument(mandatory = stage.mandatory)
) )
else -> addRegistrationStageFragmentToBackstack( else -> addRegistrationStageFragmentToBackstack(
FtueAuthGenericTextInputFormFragment::class.java, FtueAuthGenericTextInputFormFragment::class.java,

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" <androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
style="@style/LoginFormScrollView" style="@style/LoginFormScrollView"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?android:colorBackground" android:background="?android:colorBackground"
@ -88,11 +89,11 @@
android:id="@+id/emailEntryInput" android:id="@+id/emailEntryInput"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:hint="@string/ftue_auth_email_entry_title"
app:endIconMode="clear_text" app:endIconMode="clear_text"
app:layout_constraintEnd_toEndOf="@id/emailEntryGutterEnd" app:layout_constraintEnd_toEndOf="@id/emailEntryGutterEnd"
app:layout_constraintStart_toStartOf="@id/emailEntryGutterStart" app:layout_constraintStart_toStartOf="@id/emailEntryGutterStart"
app:layout_constraintTop_toBottomOf="@id/titleContentSpacing"> app:layout_constraintTop_toBottomOf="@id/titleContentSpacing"
tools:hint="@string/ftue_auth_email_entry_title">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent" android:layout_width="match_parent"