diff --git a/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/PasswordDataSource.kt b/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/PasswordDataSource.kt index 9f78db94dc44fb4f74759b1d1772fe402798274a..2e8adc523133b45450ddacd83695fc080a920d79 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/PasswordDataSource.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/PasswordDataSource.kt @@ -55,7 +55,7 @@ class PasswordDataSource @Inject constructor( is Response.Error -> result } } - + private suspend fun processDirectPasswordStage(password: String): Response<Unit> { val result = createResult { MatrixInstanceProvider.matrix.authenticationService().getLoginWizard().login( diff --git a/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/PasswordFragment.kt b/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/PasswordFragment.kt index d446f5abac8db248d4a368880df048513bd0e0a4..33884332d76d49651a4993d8ae14c92605438800 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/PasswordFragment.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/PasswordFragment.kt @@ -16,6 +16,7 @@ import org.futo.circles.auth.feature.uia.stages.password.confirmation.SetupPassw import org.futo.circles.core.base.fragment.HasLoadingState import org.futo.circles.core.base.fragment.ParentBackPressOwnerFragment import org.futo.circles.core.extensions.getText +import org.futo.circles.core.extensions.observeData import org.futo.circles.core.extensions.observeResponse import org.futo.circles.core.extensions.setIsVisible import org.futo.circles.core.extensions.showError @@ -33,6 +34,7 @@ class PasswordFragment : ParentBackPressOwnerFragment(R.layout.fragment_password super.onViewCreated(view, savedInstanceState) setupViews() setupObservers() + if (!isSignupMode()) viewModel.getCredentials(requireContext()) } override fun onResume() { @@ -73,14 +75,18 @@ class PasswordFragment : ParentBackPressOwnerFragment(R.layout.fragment_password private fun setupObservers() { viewModel.passwordResponseLiveData.observeResponse(this, error = { showError(getString(R.string.invalid_password)) }) + viewModel.passwordSelectedEventLiveData.observeData(this) { + startLoading(binding.btnLogin) + binding.etPassword.setText(it) + } } private fun onPasswordDataChanged() { val password = binding.tilPassword.getText() val repeat = binding.tilRepeatPassword.getText() binding.btnLogin.isEnabled = if (isSignupMode()) { - binding.vPasswordStrength.isPasswordStrong() && password == repeat && password.isNotEmpty() - } else password.isNotEmpty() + binding.vPasswordStrength.isPasswordStrong() && password == repeat && password.isNotEmpty() && !binding.btnLogin.isLoading + } else password.isNotEmpty() && !binding.btnLogin.isLoading } private fun showPasswordWarningIfNeeded() { diff --git a/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/PasswordViewModel.kt b/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/PasswordViewModel.kt index 01547192103a00c9eee14a79e62d17eddfcd656a..febaa25ce1012e61d577c9a2669469f78cbbc51b 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/PasswordViewModel.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/PasswordViewModel.kt @@ -1,10 +1,17 @@ package org.futo.circles.auth.feature.uia.stages.password +import android.content.Context +import androidx.credentials.CredentialManager +import androidx.credentials.GetCredentialRequest +import androidx.credentials.GetPasswordOption +import androidx.credentials.PasswordCredential import androidx.lifecycle.ViewModel import dagger.hilt.android.lifecycle.HiltViewModel +import org.futo.circles.auth.feature.uia.UIADataSourceProvider import org.futo.circles.core.base.SingleEventLiveData import org.futo.circles.core.extensions.Response import org.futo.circles.core.extensions.launchBg +import org.matrix.android.sdk.api.extensions.tryOrNull import javax.inject.Inject @HiltViewModel @@ -14,13 +21,40 @@ class PasswordViewModel @Inject constructor( private var isPasswordWarningConfirmed: Boolean = false val passwordResponseLiveData = SingleEventLiveData<Response<Unit>>() + val passwordSelectedEventLiveData = SingleEventLiveData<String>() fun processPasswordStage(password: String) { + launchBg { handlePasswordRequest(password) } + } + + fun getCredentials(activityContext: Context) { launchBg { - passwordResponseLiveData.postValue(passwordDataSource.processPasswordStage(password)) + tryOrNull { + val credentialManager = CredentialManager.create(activityContext) + val userName = UIADataSourceProvider.getDataSourceOrThrow().userName + val request = GetCredentialRequest( + listOf(GetPasswordOption(allowedUserIds = setOf(userName))) + ) + + val result = credentialManager.getCredential( + context = activityContext, + request = request + ).credential + + if (result is PasswordCredential) { + val password = result.password + passwordSelectedEventLiveData.postValue(password) + handlePasswordRequest(password) + } + } } } + private suspend fun handlePasswordRequest(password: String) { + val result = passwordDataSource.processPasswordStage(password) + passwordResponseLiveData.postValue(result) + } + fun isPasswordWarningConfirmed() = isPasswordWarningConfirmed fun confirmPasswordWarning() { isPasswordWarningConfirmed = true diff --git a/auth/src/main/res/layout/fragment_password.xml b/auth/src/main/res/layout/fragment_password.xml index 638421e673d22110d6e485e78ab318ca07b82877..4b3e6e6c86df1d96539097f0999cb3b673d2177c 100644 --- a/auth/src/main/res/layout/fragment_password.xml +++ b/auth/src/main/res/layout/fragment_password.xml @@ -61,6 +61,7 @@ android:autofillHints="password" android:imeOptions="actionDone" android:inputType="textPassword" + android:isCredential="true" android:padding="8dp" /> <org.futo.circles.auth.view.PasswordStrengthView diff --git a/core/src/main/java/org/futo/circles/core/view/LoadingButton.kt b/core/src/main/java/org/futo/circles/core/view/LoadingButton.kt index 1ceec3f8b0900856dc269d62ec3933a6bd0cacad..0a9be135547415c17959df5da1231ef2a7231245 100644 --- a/core/src/main/java/org/futo/circles/core/view/LoadingButton.kt +++ b/core/src/main/java/org/futo/circles/core/view/LoadingButton.kt @@ -7,7 +7,6 @@ import android.util.TypedValue import android.view.LayoutInflater import android.view.View import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.view.doOnLayout import org.futo.circles.core.R import org.futo.circles.core.databinding.ViewLoadingButtonBinding import org.futo.circles.core.extensions.getAttributes @@ -31,7 +30,8 @@ class LoadingButton( ViewLoadingButtonBinding.inflate(LayoutInflater.from(context), this) private var buttonText: String = "" - private var isLoading: Boolean = false + var isLoading: Boolean = false + private set init { getAttributes(attrs, R.styleable.LoadingButton) { @@ -60,7 +60,7 @@ class LoadingButton( override fun onRestoreInstanceState(state: Parcelable?) { val loadingButtonState = state as? LoadingButtonState super.onRestoreInstanceState(loadingButtonState?.superSavedState ?: state) - doOnLayout { + post { setText(loadingButtonState?.text ?: "") setIsLoading(loadingButtonState?.isLoading ?: false) isEnabled = loadingButtonState?.isEnabled ?: true