diff --git a/auth/src/main/java/org/futo/circles/auth/feature/log_in/LoginDataSource.kt b/auth/src/main/java/org/futo/circles/auth/feature/log_in/LoginDataSource.kt index b262c87c41810776c5c9d1cfe57bab023aec05d3..6e3a96ef5480e4e5f60b4fa7350841ab56884b7c 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/log_in/LoginDataSource.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/log_in/LoginDataSource.kt @@ -5,11 +5,12 @@ import dagger.hilt.android.qualifiers.ApplicationContext import org.futo.circles.auth.R import org.futo.circles.auth.feature.uia.UIADataSource import org.futo.circles.auth.feature.uia.UIADataSource.Companion.DIRECT_LOGIN_PASSWORD_TYPE +import org.futo.circles.auth.feature.uia.UIADataSource.Companion.ENROLL_BSSPEKE_SAVE_TYPE +import org.futo.circles.auth.feature.uia.UIADataSource.Companion.ENROLL_EMAIL_SUBMIT_TOKEN_TYPE import org.futo.circles.auth.feature.uia.UIADataSource.Companion.LOGIN_BSSPEKE_VERIFY_TYPE +import org.futo.circles.auth.feature.uia.UIADataSource.Companion.LOGIN_EMAIL_SUBMIT_TOKEN_TYPE import org.futo.circles.auth.feature.uia.UIADataSource.Companion.LOGIN_PASSWORD_TYPE import org.futo.circles.auth.feature.uia.UIADataSource.Companion.LOGIN_PASSWORD_USER_ID_TYPE -import org.futo.circles.auth.feature.uia.UIADataSource.Companion.ENROLL_BSSPEKE_SAVE_TYPE -import org.futo.circles.auth.feature.uia.UIADataSource.Companion.ENROLL_EMAIL_SUBMIT_TOKEN_TYPE import org.futo.circles.auth.feature.uia.UIADataSource.Companion.TYPE_PARAM_KEY import org.futo.circles.auth.feature.uia.UIADataSource.Companion.USER_PARAM_KEY import org.futo.circles.auth.feature.uia.UIADataSourceProvider @@ -22,12 +23,10 @@ import javax.inject.Inject class LoginDataSource @Inject constructor( @ApplicationContext private val context: Context, - uiaFactory: UIADataSource.Factory + private val uiaFactory: UIADataSource.Factory ) { - private val uiaDataSource by lazy { - UIADataSourceProvider.create(UIAFlowType.Login, uiaFactory) - } + private val authService by lazy { MatrixInstanceProvider.matrix.authenticationService() } suspend fun startLogin( @@ -37,6 +36,10 @@ class LoginDataSource @Inject constructor( ) = createResult { authService.cancelPendingLoginOrRegistration() val stages = prepareLoginStages(userName, domain, isForgotPassword) + val uiaDataSource = UIADataSourceProvider.create( + if (isForgotPassword) UIAFlowType.ForgotPassword else UIAFlowType.Login, + uiaFactory + ) uiaDataSource.startUIAStages(stages, domain, userName) } @@ -85,7 +88,7 @@ class LoginDataSource @Inject constructor( private fun getCircleStagesForForgotPassword(flows: List<List<Stage>>): List<Stage>? = flows.firstOrNull { stages -> val containsEmailStage = stages.firstOrNull { stage -> - (stage as? Stage.Other)?.type == ENROLL_EMAIL_SUBMIT_TOKEN_TYPE + (stage as? Stage.Other)?.type == LOGIN_EMAIL_SUBMIT_TOKEN_TYPE } != null val containsSetPassword = stages.firstOrNull { stage -> (stage as? Stage.Other)?.type == ENROLL_BSSPEKE_SAVE_TYPE diff --git a/auth/src/main/java/org/futo/circles/auth/feature/uia/UIADataSource.kt b/auth/src/main/java/org/futo/circles/auth/feature/uia/UIADataSource.kt index 83bf5a80c6ed524c9cbbe6415877ae60806e1485..01a620e786cc656a7e39611d8fac2e55bf0cef0a 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/uia/UIADataSource.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/uia/UIADataSource.kt @@ -127,7 +127,9 @@ abstract class UIADataSource { LOGIN_REGISTRATION_TOKEN_TYPE -> UIANavigationEvent.TokenValidation SUBSCRPTION_GOOGLE_TYPE -> UIANavigationEvent.Subscription + LOGIN_EMAIL_REQUEST_TOKEN_TYPE, ENROLL_EMAIL_REQUEST_TOKEN_TYPE -> UIANavigationEvent.ValidateEmail + LOGIN_EMAIL_SUBMIT_TOKEN_TYPE, ENROLL_EMAIL_SUBMIT_TOKEN_TYPE -> null //stay on same screen ENROLL_USERNAME_TYPE -> UIANavigationEvent.Username ENROLL_PASSWORD_TYPE, @@ -170,6 +172,8 @@ abstract class UIADataSource { const val SUBSCRPTION_GOOGLE_TYPE = "org.futo.subscriptions.google_play" //stages email + const val LOGIN_EMAIL_REQUEST_TOKEN_TYPE = "m.login.email.request_token" + const val LOGIN_EMAIL_SUBMIT_TOKEN_TYPE = "m.login.email.submit_token" const val ENROLL_EMAIL_REQUEST_TOKEN_TYPE = "m.enroll.email.request_token" const val ENROLL_EMAIL_SUBMIT_TOKEN_TYPE = "m.enroll.email.submit_token" diff --git a/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/validate_email/ValidateEmailDataSource.kt b/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/validate_email/ValidateEmailDataSource.kt index 04395ccf477ba1d498a971c273ded6607dc49dbb..7a369e356ee345aaae7166976158ea5a772d9de8 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/validate_email/ValidateEmailDataSource.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/validate_email/ValidateEmailDataSource.kt @@ -2,6 +2,8 @@ package org.futo.circles.auth.feature.uia.stages.validate_email import org.futo.circles.auth.feature.uia.UIADataSource.Companion.ENROLL_EMAIL_REQUEST_TOKEN_TYPE import org.futo.circles.auth.feature.uia.UIADataSource.Companion.ENROLL_EMAIL_SUBMIT_TOKEN_TYPE +import org.futo.circles.auth.feature.uia.UIADataSource.Companion.LOGIN_EMAIL_REQUEST_TOKEN_TYPE +import org.futo.circles.auth.feature.uia.UIADataSource.Companion.LOGIN_EMAIL_SUBMIT_TOKEN_TYPE import org.futo.circles.auth.feature.uia.UIADataSource.Companion.TYPE_PARAM_KEY import org.futo.circles.auth.feature.uia.UIADataSourceProvider import org.futo.circles.core.extensions.Response @@ -14,11 +16,10 @@ class ValidateEmailDataSource @Inject constructor() { private val uiaDataSource = UIADataSourceProvider.getDataSourceOrThrow() suspend fun sendValidationCode( - email: String, - subscribeToUpdates: Boolean + email: String, subscribeToUpdates: Boolean ): Response<RegistrationResult> = uiaDataSource.performUIAStage( mapOf( - TYPE_PARAM_KEY to ENROLL_EMAIL_REQUEST_TOKEN_TYPE, + TYPE_PARAM_KEY to if (isLogin()) LOGIN_EMAIL_REQUEST_TOKEN_TYPE else ENROLL_EMAIL_REQUEST_TOKEN_TYPE, EMAIL_PARAM_KEY to email, SUBSCRIBE_TO_LIST to subscribeToUpdates ) @@ -27,11 +28,20 @@ class ValidateEmailDataSource @Inject constructor() { suspend fun validateEmail(code: String): Response<RegistrationResult> = uiaDataSource.performUIAStage( mapOf( - TYPE_PARAM_KEY to ENROLL_EMAIL_SUBMIT_TOKEN_TYPE, + TYPE_PARAM_KEY to if (isLogin()) LOGIN_EMAIL_REQUEST_TOKEN_TYPE else ENROLL_EMAIL_SUBMIT_TOKEN_TYPE, TOKEN_PARAM_KEY to code ) ) + private fun isLogin(): Boolean { + val currentStageKey = UIADataSourceProvider.getDataSourceOrThrow().getCurrentStageKey() + return currentStageKey == LOGIN_EMAIL_REQUEST_TOKEN_TYPE || currentStageKey == LOGIN_EMAIL_SUBMIT_TOKEN_TYPE + } + + fun getPrefilledEmail(): String? = + if (isLogin()) ((uiaDataSource.currentStage as? Stage.Other)?.params?.get(EMAILS_LIST_KEY) as? List<*>)?.firstOrNull() + ?.toString() else null + fun shouldShowSubscribeToEmail(): Boolean = (uiaDataSource.currentStage as? Stage.Other)?.params?.get(OFFER_LIST_SUBSCRIPTION_KEY) as? Boolean ?: false @@ -41,5 +51,6 @@ class ValidateEmailDataSource @Inject constructor() { private const val TOKEN_PARAM_KEY = "token" private const val SUBSCRIBE_TO_LIST = "subscribe_to_list" private const val OFFER_LIST_SUBSCRIPTION_KEY = "offer_list_subscription" + private const val EMAILS_LIST_KEY = "addresses" } } \ No newline at end of file diff --git a/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/validate_email/ValidateEmailFragment.kt b/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/validate_email/ValidateEmailFragment.kt index 8a216fa21b288683366da6b41e5f444facc8413e..96f7ff493e7894f65d4af37c27d6adf1ff95b364 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/validate_email/ValidateEmailFragment.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/validate_email/ValidateEmailFragment.kt @@ -2,6 +2,7 @@ package org.futo.circles.auth.feature.uia.stages.validate_email import android.os.Bundle import android.view.View +import androidx.core.view.isVisible import androidx.core.widget.doAfterTextChanged import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels @@ -37,6 +38,7 @@ class ValidateEmailFragment : ParentBackPressOwnerFragment(R.layout.fragment_val private fun setupViews() { with(binding) { + setAlwaysDisabledViews(listOf(binding.etEmail)) tilEmail.editText?.doAfterTextChanged { it?.let { btnSendCode.isEnabled = it.isValidEmail() } } @@ -57,7 +59,7 @@ class ValidateEmailFragment : ParentBackPressOwnerFragment(R.layout.fragment_val } btnSendCode.setOnClickListener { startLoading(btnSendCode) - viewModel.sendCode(getEmailInput(), cbEmailUpdates.isChecked) + viewModel.sendCode(getEmailInput(), cbEmailUpdates.isChecked && cbEmailUpdates.isVisible) } btnValidate.setOnClickListener { startLoading(btnValidate) @@ -75,6 +77,14 @@ class ValidateEmailFragment : ParentBackPressOwnerFragment(R.layout.fragment_val viewModel.showSubscribeCheckLiveData.observeData(this) { binding.cbEmailUpdates.setIsVisible(it) } + viewModel.usersEmailLiveData.observeData(this) {email-> + email?.let { + binding.etEmail.apply { + setText(it) + isEnabled = false + } + } + } } private fun getEmailInput(): String = binding.tilEmail.getText() diff --git a/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/validate_email/ValidateEmailViewModel.kt b/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/validate_email/ValidateEmailViewModel.kt index 0f119f467c02c3588cacd6dba635ed90fd35354f..b7a1b86fd90d372a973af0763c5707c0fc498476 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/validate_email/ValidateEmailViewModel.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/validate_email/ValidateEmailViewModel.kt @@ -18,6 +18,7 @@ class ValidateEmailViewModel @Inject constructor( val validateEmailLiveData = SingleEventLiveData<Response<RegistrationResult>>() val showSubscribeCheckLiveData = MutableLiveData(dataSource.shouldShowSubscribeToEmail()) + val usersEmailLiveData = MutableLiveData(dataSource.getPrefilledEmail()) fun sendCode(email: String, subscribeToUpdates: Boolean) { launchBg {