diff --git a/changelog.d/3545.feature b/changelog.d/3545.feature
new file mode 100644
index 0000000000..f582affbf2
--- /dev/null
+++ b/changelog.d/3545.feature
@@ -0,0 +1 @@
+Reveal password: use facility from com.google.android.material.textfield.TextInputLayout instead of manual handling.
\ No newline at end of file
diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewActivity.kt
index ac3d4ea696..db50500195 100644
--- a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewActivity.kt
+++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewActivity.kt
@@ -17,6 +17,8 @@
package im.vector.lib.ui.styles.debug
import android.os.Bundle
+import android.text.InputType
+import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import im.vector.lib.ui.styles.databinding.ActivityDebugTextViewBinding
@@ -27,5 +29,20 @@ abstract class DebugVectorTextViewActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
val views = ActivityDebugTextViewBinding.inflate(layoutInflater)
setContentView(views.root)
+
+ views.debugShowPassword.setOnClickListener {
+ views.debugTextInputEditText.showPassword(true)
+ }
+ views.debugHidePassword.setOnClickListener {
+ views.debugTextInputEditText.showPassword(false)
+ }
+ }
+
+ private fun EditText.showPassword(visible: Boolean) {
+ if (visible) {
+ inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
+ } else {
+ inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
+ }
}
}
diff --git a/library/ui-styles/src/debug/res/layout/activity_debug_text_view.xml b/library/ui-styles/src/debug/res/layout/activity_debug_text_view.xml
index 6ca83c5a8a..1b38f04b97 100644
--- a/library/ui-styles/src/debug/res/layout/activity_debug_text_view.xml
+++ b/library/ui-styles/src/debug/res/layout/activity_debug_text_view.xml
@@ -1,5 +1,6 @@
+ android:hint="Password"
+ app:errorEnabled="true">
+
+
+
+
\ No newline at end of file
diff --git a/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt b/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt
index afa50de9b6..b87b7f0286 100644
--- a/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt
+++ b/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt
@@ -20,14 +20,11 @@ import android.app.Activity
import android.text.Editable
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import im.vector.app.R
-import im.vector.app.core.extensions.showPassword
import im.vector.app.core.platform.SimpleTextWatcher
import im.vector.app.databinding.DialogExportE2eKeysBinding
class ExportKeysDialog {
- private var passwordVisible = false
-
fun show(activity: Activity, exportKeyDialogListener: ExportKeyDialogListener) {
val dialogLayout = activity.layoutInflater.inflate(R.layout.dialog_export_e2e_keys, null)
val views = DialogExportE2eKeysBinding.bind(dialogLayout)
@@ -57,13 +54,6 @@ class ExportKeysDialog {
views.exportDialogEt.addTextChangedListener(textWatcher)
views.exportDialogEtConfirm.addTextChangedListener(textWatcher)
- views.exportDialogShowPassword.setOnClickListener {
- passwordVisible = !passwordVisible
- views.exportDialogEt.showPassword(passwordVisible)
- views.exportDialogEtConfirm.showPassword(passwordVisible)
- views.exportDialogShowPassword.render(passwordVisible)
- }
-
val exportDialog = builder.show()
views.exportDialogSubmit.setOnClickListener {
diff --git a/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt b/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt
index 31aaac41f0..759e130e29 100644
--- a/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt
+++ b/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt
@@ -40,13 +40,8 @@ fun SearchView.withoutLeftMargin() {
}
}
-fun EditText.showPassword(visible: Boolean, updateCursor: Boolean = true) {
- if (visible) {
- inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
- } else {
- inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
- }
- if (updateCursor) setSelection(text?.length ?: 0)
+fun EditText.hidePassword() {
+ inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
}
fun View.getMeasurements(): Pair {
diff --git a/vector/src/main/java/im/vector/app/core/ui/views/RevealPasswordImageView.kt b/vector/src/main/java/im/vector/app/core/ui/views/RevealPasswordImageView.kt
deleted file mode 100644
index b4bcecad16..0000000000
--- a/vector/src/main/java/im/vector/app/core/ui/views/RevealPasswordImageView.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2021 New Vector Ltd
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package im.vector.app.core.ui.views
-
-import android.content.Context
-import android.util.AttributeSet
-import androidx.appcompat.widget.AppCompatImageView
-import im.vector.app.R
-
-class RevealPasswordImageView @JvmOverloads constructor(
- context: Context,
- attrs: AttributeSet? = null,
- defStyleAttr: Int = 0
-) : AppCompatImageView(context, attrs, defStyleAttr) {
-
- init {
- render(false)
- }
-
- fun render(isPasswordShown: Boolean) {
- if (isPasswordShown) {
- contentDescription = context.getString(R.string.a11y_hide_password)
- setImageResource(R.drawable.ic_eye_closed)
- } else {
- contentDescription = context.getString(R.string.a11y_show_password)
- setImageResource(R.drawable.ic_eye)
- }
- }
-}
diff --git a/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt b/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt
index 4bdd54ae45..501af00ad2 100644
--- a/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt
@@ -24,7 +24,6 @@ import androidx.core.view.isVisible
import com.airbnb.mvrx.activityViewModel
import com.airbnb.mvrx.withState
import im.vector.app.R
-import im.vector.app.core.extensions.showPassword
import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.databinding.FragmentReauthConfirmBinding
import org.matrix.android.sdk.api.auth.data.LoginFlowTypes
@@ -41,13 +40,6 @@ class PromptFragment : VectorBaseFragment() {
views.reAuthConfirmButton.debouncedClicks {
onButtonClicked()
}
- views.passwordReveal.debouncedClicks {
- viewModel.handle(ReAuthActions.StartSSOFallback)
- }
-
- views.passwordReveal.debouncedClicks {
- viewModel.handle(ReAuthActions.TogglePassVisibility)
- }
}
private fun onButtonClicked() = withState(viewModel) { state ->
@@ -74,11 +66,11 @@ class PromptFragment : VectorBaseFragment() {
override fun invalidate() = withState(viewModel) {
when (it.flowType) {
LoginFlowTypes.SSO -> {
- views.passwordContainer.isVisible = false
+ views.passwordFieldTil.isVisible = false
views.reAuthConfirmButton.text = getString(R.string.auth_login_sso)
}
LoginFlowTypes.PASSWORD -> {
- views.passwordContainer.isVisible = true
+ views.passwordFieldTil.isVisible = true
views.reAuthConfirmButton.text = getString(R.string._continue)
}
else -> {
@@ -86,9 +78,6 @@ class PromptFragment : VectorBaseFragment() {
}
}
- views.passwordField.showPassword(it.passwordVisible)
- views.passwordReveal.render(it.passwordVisible)
-
if (it.lastErrorCode != null) {
when (it.flowType) {
LoginFlowTypes.SSO -> {
diff --git a/vector/src/main/java/im/vector/app/features/auth/ReAuthActions.kt b/vector/src/main/java/im/vector/app/features/auth/ReAuthActions.kt
index 036afda405..b0a7a9fe4c 100644
--- a/vector/src/main/java/im/vector/app/features/auth/ReAuthActions.kt
+++ b/vector/src/main/java/im/vector/app/features/auth/ReAuthActions.kt
@@ -22,6 +22,5 @@ sealed class ReAuthActions : VectorViewModelAction {
object StartSSOFallback : ReAuthActions()
object FallBackPageLoaded : ReAuthActions()
object FallBackPageClosed : ReAuthActions()
- object TogglePassVisibility : ReAuthActions()
data class ReAuthWithPass(val password: String) : ReAuthActions()
}
diff --git a/vector/src/main/java/im/vector/app/features/auth/ReAuthState.kt b/vector/src/main/java/im/vector/app/features/auth/ReAuthState.kt
index 540a08405c..075ef758b8 100644
--- a/vector/src/main/java/im/vector/app/features/auth/ReAuthState.kt
+++ b/vector/src/main/java/im/vector/app/features/auth/ReAuthState.kt
@@ -23,7 +23,6 @@ data class ReAuthState(
val session: String? = null,
val flowType: String? = null,
val ssoFallbackPageWasShown: Boolean = false,
- val passwordVisible: Boolean = false,
val lastErrorCode: String? = null,
val resultKeyStoreAlias: String = ""
) : MvRxState {
diff --git a/vector/src/main/java/im/vector/app/features/auth/ReAuthViewModel.kt b/vector/src/main/java/im/vector/app/features/auth/ReAuthViewModel.kt
index 4204da0d24..edbceae20f 100644
--- a/vector/src/main/java/im/vector/app/features/auth/ReAuthViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/auth/ReAuthViewModel.kt
@@ -65,13 +65,6 @@ class ReAuthViewModel @AssistedInject constructor(
ReAuthActions.FallBackPageClosed -> {
// Should we do something here?
}
- ReAuthActions.TogglePassVisibility -> {
- setState {
- copy(
- passwordVisible = !state.passwordVisible
- )
- }
- }
is ReAuthActions.ReAuthWithPass -> {
val safeForIntentCypher = ByteArrayOutputStream().also {
it.use {
diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseFragment.kt
index 0f0c9a23c7..96d8a257b7 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseFragment.kt
@@ -25,7 +25,6 @@ import android.view.inputmethod.EditorInfo
import androidx.core.text.set
import androidx.core.widget.doOnTextChanged
import im.vector.app.R
-import im.vector.app.core.extensions.showPassword
import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.databinding.FragmentKeysBackupRestoreFromPassphraseBinding
@@ -40,10 +39,6 @@ class KeysBackupRestoreFromPassphraseFragment @Inject constructor() : VectorBase
private lateinit var viewModel: KeysBackupRestoreFromPassphraseViewModel
private lateinit var sharedViewModel: KeysBackupRestoreSharedViewModel
- private fun toggleVisibilityMode() {
- viewModel.showPasswordMode.value = !(viewModel.showPasswordMode.value ?: false)
- }
-
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -56,12 +51,6 @@ class KeysBackupRestoreFromPassphraseFragment @Inject constructor() : VectorBase
views.helperTextWithLink.text = spannableStringForHelperText()
- viewModel.showPasswordMode.observe(viewLifecycleOwner) {
- val shouldBeVisible = it ?: false
- views.keysBackupPassphraseEnterEdittext.showPassword(shouldBeVisible)
- views.keysBackupViewShowPassword.render(shouldBeVisible)
- }
-
views.keysBackupPassphraseEnterEdittext.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
onRestoreBackup()
@@ -70,7 +59,6 @@ class KeysBackupRestoreFromPassphraseFragment @Inject constructor() : VectorBase
return@setOnEditorActionListener false
}
- views.keysBackupViewShowPassword.setOnClickListener { toggleVisibilityMode() }
views.helperTextWithLink.setOnClickListener { onUseRecoveryKey() }
views.keysBackupRestoreWithPassphraseSubmit.setOnClickListener { onRestoreBackup() }
views.keysBackupPassphraseEnterEdittext.doOnTextChanged { text, _, _, _ -> onPassphraseTextEditChange(text) }
diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseViewModel.kt
index d45a961dd7..af5938e20a 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseViewModel.kt
@@ -30,12 +30,10 @@ class KeysBackupRestoreFromPassphraseViewModel @Inject constructor(
var passphrase: MutableLiveData = MutableLiveData()
var passphraseErrorText: MutableLiveData = MutableLiveData()
- var showPasswordMode: MutableLiveData = MutableLiveData()
init {
passphrase.value = null
passphraseErrorText.value = null
- showPasswordMode.value = false
}
// ========= Actions =========
diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupSharedViewModel.kt
index 8a5264d404..cd59a69a86 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupSharedViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupSharedViewModel.kt
@@ -64,7 +64,6 @@ class KeysBackupSetupSharedViewModel @Inject constructor() : ViewModel() {
var confirmPassphraseError: MutableLiveData = MutableLiveData()
var passwordStrength: MutableLiveData = MutableLiveData()
- var showPasswordMode: MutableLiveData = MutableLiveData()
// Step 3
// Var to ignore events from previous request(s) to generate a recovery key
@@ -80,7 +79,6 @@ class KeysBackupSetupSharedViewModel @Inject constructor() : ViewModel() {
var loadingStatus: MutableLiveData = MutableLiveData()
init {
- showPasswordMode.value = false
recoveryKey.value = null
isCreatingBackupVersion.value = false
prepareRecoverFailError.value = null
@@ -97,9 +95,6 @@ class KeysBackupSetupSharedViewModel @Inject constructor() : ViewModel() {
currentRequestId.value = System.currentTimeMillis()
isCreatingBackupVersion.value = true
- // Ensure passphrase is hidden during the process
- showPasswordMode.value = false
-
recoveryKey.value = null
prepareRecoverFailError.value = null
session.let { mxSession ->
diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep2Fragment.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep2Fragment.kt
index b2d60fb02d..3e4ce2807d 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep2Fragment.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep2Fragment.kt
@@ -25,7 +25,7 @@ import androidx.lifecycle.viewModelScope
import androidx.transition.TransitionManager
import com.nulabinc.zxcvbn.Zxcvbn
import im.vector.app.R
-import im.vector.app.core.extensions.showPassword
+import im.vector.app.core.extensions.hidePassword
import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.databinding.FragmentKeysBackupSetupStep2Binding
import im.vector.app.features.settings.VectorLocale
@@ -113,13 +113,6 @@ class KeysBackupSetupStep2Fragment @Inject constructor() : VectorBaseFragment onConfirmPassphraseChanged() }
}
- private fun toggleVisibilityMode() {
- viewModel.showPasswordMode.value = !(viewModel.showPasswordMode.value ?: false)
- }
-
private fun doNext() {
when {
viewModel.passphrase.value.isNullOrEmpty() -> {
@@ -161,6 +149,9 @@ class KeysBackupSetupStep2Fragment @Inject constructor() : VectorBaseFragment {
viewModel.megolmBackupCreationInfo = null
+ // Ensure passphrase is hidden during the process
+ views.keysBackupSetupStep2PassphraseEnterEdittext.hidePassword()
+ views.keysBackupSetupStep2PassphraseConfirmEditText.hidePassword()
viewModel.prepareRecoveryKey(requireActivity(), viewModel.passphrase.value)
}
}
@@ -172,6 +163,9 @@ class KeysBackupSetupStep2Fragment @Inject constructor() : VectorBaseFragment {
diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageAction.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageAction.kt
index 30a7ab3cc0..7d44e66531 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageAction.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageAction.kt
@@ -21,8 +21,6 @@ import im.vector.app.core.platform.VectorViewModelAction
import im.vector.app.core.platform.WaitingViewData
sealed class SharedSecureStorageAction : VectorViewModelAction {
-
- object TogglePasswordVisibility : SharedSecureStorageAction()
object UseKey : SharedSecureStorageAction()
object Back : SharedSecureStorageAction()
object Cancel : SharedSecureStorageAction()
diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt
index d246d33f40..9a5fc4ca06 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt
@@ -50,7 +50,6 @@ import java.io.ByteArrayOutputStream
data class SharedSecureStorageViewState(
val ready: Boolean = false,
val hasPassphrase: Boolean = true,
- val passphraseVisible: Boolean = false,
val checkingSSSSAction: Async = Uninitialized,
val step: Step = Step.EnterPassphrase,
val activeDeviceCount: Int = 0,
@@ -128,7 +127,6 @@ class SharedSecureStorageViewModel @AssistedInject constructor(
override fun handle(action: SharedSecureStorageAction) = withState {
when (action) {
- is SharedSecureStorageAction.TogglePasswordVisibility -> handleTogglePasswordVisibility()
is SharedSecureStorageAction.Cancel -> handleCancel()
is SharedSecureStorageAction.SubmitPassphrase -> handleSubmitPassphrase(action)
SharedSecureStorageAction.UseKey -> handleUseKey()
@@ -319,14 +317,6 @@ class SharedSecureStorageViewModel @AssistedInject constructor(
_viewEvents.post(SharedSecureStorageViewEvent.Dismiss)
}
- private fun handleTogglePasswordVisibility() {
- setState {
- copy(
- passphraseVisible = !passphraseVisible
- )
- }
- }
-
companion object : MvRxViewModelFactory {
@JvmStatic
diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt
index ba2c923d8b..800b02a936 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt
@@ -23,11 +23,9 @@ import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import androidx.core.text.toSpannable
import com.airbnb.mvrx.activityViewModel
-import com.airbnb.mvrx.withState
import com.jakewharton.rxbinding3.widget.editorActionEvents
import com.jakewharton.rxbinding3.widget.textChanges
import im.vector.app.R
-import im.vector.app.core.extensions.showPassword
import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.core.resources.ColorProvider
import im.vector.app.databinding.FragmentSsssAccessFromPassphraseBinding
@@ -92,7 +90,6 @@ class SharedSecuredStoragePassphraseFragment @Inject constructor(
views.ssssPassphraseSubmit.debouncedClicks { submit() }
views.ssssPassphraseUseKey.debouncedClicks { sharedViewModel.handle(SharedSecureStorageAction.UseKey) }
- views.ssssViewShowPassword.debouncedClicks { sharedViewModel.handle(SharedSecureStorageAction.TogglePasswordVisibility) }
}
fun submit() {
@@ -101,10 +98,4 @@ class SharedSecuredStoragePassphraseFragment @Inject constructor(
views.ssssPassphraseSubmit.isEnabled = false
sharedViewModel.handle(SharedSecureStorageAction.SubmitPassphrase(text))
}
-
- override fun invalidate() = withState(sharedViewModel) { state ->
- val shouldBeVisible = state.passphraseVisible
- views.ssssPassphraseEnterEdittext.showPassword(shouldBeVisible)
- views.ssssViewShowPassword.render(shouldBeVisible)
- }
}
diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapActions.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapActions.kt
index ce06fe726f..869f0ed8ec 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapActions.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapActions.kt
@@ -34,7 +34,6 @@ sealed class BootstrapActions : VectorViewModelAction {
data class DoInitialize(val passphrase: String) : BootstrapActions()
object DoInitializeGeneratedKey : BootstrapActions()
- object TogglePasswordVisibility : BootstrapActions()
data class UpdateCandidatePassphrase(val pass: String) : BootstrapActions()
data class UpdateConfirmCandidatePassphrase(val pass: String) : BootstrapActions()
// data class ReAuth(val pass: String) : BootstrapActions()
diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt
index 2d26436556..602f0bad91 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt
@@ -28,7 +28,6 @@ import com.jakewharton.rxbinding3.widget.editorActionEvents
import com.jakewharton.rxbinding3.widget.textChanges
import im.vector.app.R
import im.vector.app.core.extensions.hideKeyboard
-import im.vector.app.core.extensions.showPassword
import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.databinding.FragmentBootstrapEnterPassphraseBinding
import io.reactivex.android.schedulers.AndroidSchedulers
@@ -84,7 +83,6 @@ class BootstrapConfirmPassphraseFragment @Inject constructor()
// }
}
- views.ssssViewShowPassword.debouncedClicks { sharedViewModel.handle(BootstrapActions.TogglePasswordVisibility) }
views.bootstrapSubmit.debouncedClicks { submit() }
}
@@ -104,12 +102,4 @@ class BootstrapConfirmPassphraseFragment @Inject constructor()
}
}
}
-
- override fun invalidate() = withState(sharedViewModel) { state ->
- if (state.step is BootstrapStep.ConfirmPassphrase) {
- val isPasswordVisible = state.step.isPasswordVisible
- views.ssssPassphraseEnterEdittext.showPassword(isPasswordVisible, updateCursor = false)
- views.ssssViewShowPassword.render(isPasswordVisible)
- }
- }
}
diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt
index 7a5d6e5fd7..9ecc7719a5 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt
@@ -26,7 +26,6 @@ import com.airbnb.mvrx.withState
import com.jakewharton.rxbinding3.widget.editorActionEvents
import com.jakewharton.rxbinding3.widget.textChanges
import im.vector.app.R
-import im.vector.app.core.extensions.showPassword
import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.databinding.FragmentBootstrapEnterPassphraseBinding
import im.vector.app.features.settings.VectorLocale
@@ -80,7 +79,6 @@ class BootstrapEnterPassphraseFragment @Inject constructor()
// }
}
- views.ssssViewShowPassword.debouncedClicks { sharedViewModel.handle(BootstrapActions.TogglePasswordVisibility) }
views.bootstrapSubmit.debouncedClicks { submit() }
}
@@ -101,10 +99,6 @@ class BootstrapEnterPassphraseFragment @Inject constructor()
override fun invalidate() = withState(sharedViewModel) { state ->
if (state.step is BootstrapStep.SetupPassphrase) {
- val isPasswordVisible = state.step.isPasswordVisible
- views.ssssPassphraseEnterEdittext.showPassword(isPasswordVisible, updateCursor = false)
- views.ssssViewShowPassword.render(isPasswordVisible)
-
state.passphraseStrength.invoke()?.let { strength ->
val score = strength.score
views.ssssPassphraseSecurityProgress.strength = score
diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt
index ca0942f59a..23d3068e34 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt
@@ -34,7 +34,6 @@ import com.jakewharton.rxbinding3.widget.textChanges
import im.vector.app.R
import im.vector.app.core.extensions.hideKeyboard
import im.vector.app.core.extensions.registerStartForActivityResult
-import im.vector.app.core.extensions.showPassword
import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.core.resources.ColorProvider
import im.vector.app.core.utils.colorizeMatchingText
@@ -84,7 +83,6 @@ class BootstrapMigrateBackupFragment @Inject constructor(
// sharedViewModel.observeViewEvents {}
views.bootstrapMigrateContinueButton.debouncedClicks { submit() }
- views.bootstrapMigrateShowPassword.debouncedClicks { sharedViewModel.handle(BootstrapActions.TogglePasswordVisibility) }
views.bootstrapMigrateForgotPassphrase.debouncedClicks { sharedViewModel.handle(BootstrapActions.HandleForgotBackupPassphrase) }
views.bootstrapMigrateUseFile.debouncedClicks { startImportTextFromFileIntent(requireContext(), importFileStartForActivityResult) }
}
@@ -116,7 +114,6 @@ class BootstrapMigrateBackupFragment @Inject constructor(
val isEnteringKey = getBackupSecretForMigration.useKey()
if (isEnteringKey) {
- views.bootstrapMigrateShowPassword.isVisible = false
views.bootstrapMigrateEditText.inputType = TYPE_CLASS_TEXT or TYPE_TEXT_VARIATION_VISIBLE_PASSWORD or TYPE_TEXT_FLAG_MULTI_LINE
val recKey = getString(R.string.bootstrap_migration_backup_recovery_key)
@@ -128,14 +125,6 @@ class BootstrapMigrateBackupFragment @Inject constructor(
views.bootstrapMigrateForgotPassphrase.isVisible = false
views.bootstrapMigrateUseFile.isVisible = true
} else {
- views.bootstrapMigrateShowPassword.isVisible = true
-
- if (state.step is BootstrapStep.GetBackupSecretPassForMigration) {
- val isPasswordVisible = state.step.isPasswordVisible
- views.bootstrapMigrateEditText.showPassword(isPasswordVisible, updateCursor = false)
- views.bootstrapMigrateShowPassword.render(isPasswordVisible)
- }
-
views.bootstrapDescriptionText.text = getString(R.string.bootstrap_migration_enter_backup_password)
views.bootstrapMigrateEditText.hint = getString(R.string.passphrase_enter_passphrase)
diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSharedViewModel.kt
index fe55d81cc4..866a87d7f9 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSharedViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSharedViewModel.kt
@@ -139,7 +139,7 @@ class BootstrapSharedViewModel @AssistedInject constructor(
private fun handleStartMigratingKeyBackup() {
if (isBackupCreatedFromPassphrase) {
setState {
- copy(step = BootstrapStep.GetBackupSecretPassForMigration(isPasswordVisible = false, useKey = false))
+ copy(step = BootstrapStep.GetBackupSecretPassForMigration(useKey = false))
}
} else {
setState {
@@ -151,29 +151,6 @@ class BootstrapSharedViewModel @AssistedInject constructor(
override fun handle(action: BootstrapActions) = withState { state ->
when (action) {
is BootstrapActions.GoBack -> queryBack()
- BootstrapActions.TogglePasswordVisibility -> {
- when (state.step) {
- is BootstrapStep.SetupPassphrase -> {
- setState {
- copy(step = state.step.copy(isPasswordVisible = !state.step.isPasswordVisible))
- }
- }
- is BootstrapStep.ConfirmPassphrase -> {
- setState {
- copy(step = state.step.copy(isPasswordVisible = !state.step.isPasswordVisible))
- }
- }
- is BootstrapStep.AccountReAuth -> {
- // nop
- }
- is BootstrapStep.GetBackupSecretPassForMigration -> {
- setState {
- copy(step = state.step.copy(isPasswordVisible = !state.step.isPasswordVisible))
- }
- }
- else -> Unit
- }
- }
BootstrapActions.StartKeyBackupMigration -> {
handleStartMigratingKeyBackup()
}
@@ -193,9 +170,7 @@ class BootstrapSharedViewModel @AssistedInject constructor(
setState {
copy(
passphrase = action.passphrase,
- step = BootstrapStep.ConfirmPassphrase(
- isPasswordVisible = (state.step as? BootstrapStep.SetupPassphrase)?.isPasswordVisible ?: false
- )
+ step = BootstrapStep.ConfirmPassphrase
)
}
}
@@ -255,7 +230,7 @@ class BootstrapSharedViewModel @AssistedInject constructor(
BootstrapActions.HandleForgotBackupPassphrase -> {
if (state.step is BootstrapStep.GetBackupSecretPassForMigration) {
setState {
- copy(step = BootstrapStep.GetBackupSecretPassForMigration(state.step.isPasswordVisible, true))
+ copy(step = BootstrapStep.GetBackupSecretPassForMigration(true))
}
} else return@withState
}
@@ -293,7 +268,7 @@ class BootstrapSharedViewModel @AssistedInject constructor(
if (action.userWantsToEnterPassphrase) {
setState {
copy(
- step = BootstrapStep.SetupPassphrase(isPasswordVisible = false)
+ step = BootstrapStep.SetupPassphrase
)
}
} else {
@@ -493,7 +468,6 @@ class BootstrapSharedViewModel @AssistedInject constructor(
setState {
copy(
step = BootstrapStep.GetBackupSecretPassForMigration(
- isPasswordVisible = state.step.isPasswordVisible,
useKey = false
)
)
@@ -524,9 +498,7 @@ class BootstrapSharedViewModel @AssistedInject constructor(
is BootstrapStep.ConfirmPassphrase -> {
setState {
copy(
- step = BootstrapStep.SetupPassphrase(
- isPasswordVisible = state.step.isPasswordVisible
- )
+ step = BootstrapStep.SetupPassphrase
)
}
}
diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapStep.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapStep.kt
index 09f0e90d5d..a4fa31ad03 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapStep.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapStep.kt
@@ -91,13 +91,13 @@ sealed class BootstrapStep {
// Use will be asked to choose between passphrase or recovery key, or to start process if a key backup exists
data class FirstForm(val keyBackUpExist: Boolean, val reset: Boolean = false) : BootstrapStep()
- data class SetupPassphrase(val isPasswordVisible: Boolean) : BootstrapStep()
- data class ConfirmPassphrase(val isPasswordVisible: Boolean) : BootstrapStep()
+ object SetupPassphrase : BootstrapStep()
+ object ConfirmPassphrase : BootstrapStep()
data class AccountReAuth(val failure: String? = null) : BootstrapStep()
abstract class GetBackupSecretForMigration : BootstrapStep()
- data class GetBackupSecretPassForMigration(val isPasswordVisible: Boolean, val useKey: Boolean) : GetBackupSecretForMigration()
+ data class GetBackupSecretPassForMigration(val useKey: Boolean) : GetBackupSecretForMigration()
object GetBackupSecretKeyForMigration : GetBackupSecretForMigration()
object Initializing : BootstrapStep()
diff --git a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt
index 389895c179..cf799681ac 100644
--- a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt
@@ -32,7 +32,7 @@ import com.jakewharton.rxbinding3.widget.textChanges
import im.vector.app.R
import im.vector.app.core.extensions.exhaustive
import im.vector.app.core.extensions.hideKeyboard
-import im.vector.app.core.extensions.showPassword
+import im.vector.app.core.extensions.hidePassword
import im.vector.app.core.extensions.toReducedUrl
import im.vector.app.databinding.FragmentLoginBinding
import io.reactivex.Observable
@@ -53,7 +53,6 @@ import javax.inject.Inject
*/
class LoginFragment @Inject constructor() : AbstractSSOLoginFragment() {
- private var passwordShown = false
private var isSignupMode = false
// Temporary patch for https://github.com/vector-im/riotX-android/issues/1410,
@@ -69,7 +68,6 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment
if (actionId == EditorInfo.IME_ACTION_DONE) {
@@ -247,23 +245,6 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment {
// Ensure password is hidden
- passwordShown = false
- renderPasswordField()
+ views.passwordField.hidePassword()
}
is Fail -> {
val error = state.asyncLoginAction.error
@@ -317,8 +297,7 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment {
// Ensure password is hidden
- passwordShown = false
- renderPasswordField()
+ views.passwordField.hidePassword()
}
// Success is handled by the LoginActivity
is Success -> Unit
diff --git a/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt
index eb7c437779..d08d81d98a 100644
--- a/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt
@@ -28,7 +28,7 @@ import com.jakewharton.rxbinding3.widget.textChanges
import im.vector.app.R
import im.vector.app.core.extensions.hideKeyboard
import im.vector.app.core.extensions.isEmail
-import im.vector.app.core.extensions.showPassword
+import im.vector.app.core.extensions.hidePassword
import im.vector.app.core.extensions.toReducedUrl
import im.vector.app.databinding.FragmentLoginResetPasswordBinding
import io.reactivex.Observable
@@ -41,8 +41,6 @@ import javax.inject.Inject
*/
class LoginResetPasswordFragment @Inject constructor() : AbstractLoginFragment() {
- private var passwordShown = false
-
// Show warning only once
private var showWarning = true
@@ -54,7 +52,6 @@ class LoginResetPasswordFragment @Inject constructor() : AbstractLoginFragment {
// Ensure new password is hidden
- passwordShown = false
- renderPasswordField()
+ views.passwordField.hidePassword()
}
is Fail -> {
views.resetPasswordEmailTil.error = errorFormatter.toHumanReadable(state.asyncResetPassword.error)
diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSigninPassword2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSigninPassword2.kt
index a13905cc5f..71f1d10137 100644
--- a/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSigninPassword2.kt
+++ b/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSigninPassword2.kt
@@ -28,7 +28,7 @@ import com.airbnb.mvrx.Fail
import com.jakewharton.rxbinding3.widget.textChanges
import im.vector.app.R
import im.vector.app.core.extensions.hideKeyboard
-import im.vector.app.core.extensions.showPassword
+import im.vector.app.core.extensions.hidePassword
import im.vector.app.databinding.FragmentLoginSigninPassword2Binding
import im.vector.app.features.home.AvatarRenderer
import io.reactivex.rxkotlin.subscribeBy
@@ -47,8 +47,6 @@ class LoginFragmentSigninPassword2 @Inject constructor(
private val avatarRenderer: AvatarRenderer
) : AbstractSSOLoginFragment2() {
- private var passwordShown = false
-
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLoginSigninPassword2Binding {
return FragmentLoginSigninPassword2Binding.inflate(inflater, container, false)
}
@@ -58,7 +56,6 @@ class LoginFragmentSigninPassword2 @Inject constructor(
setupSubmitButton()
setupForgottenPasswordButton()
- setupPasswordReveal()
setupAutoFill()
views.passwordField.setOnEditorActionListener { _, actionId, _ ->
@@ -135,23 +132,6 @@ class LoginFragmentSigninPassword2 @Inject constructor(
loginViewModel.handle(LoginAction2.PostViewEvent(LoginViewEvents2.OpenResetPasswordScreen))
}
- private fun setupPasswordReveal() {
- passwordShown = false
-
- views.passwordReveal.setOnClickListener {
- passwordShown = !passwordShown
-
- renderPasswordField()
- }
-
- renderPasswordField()
- }
-
- private fun renderPasswordField() {
- views.passwordField.showPassword(passwordShown)
- views.passwordReveal.render(passwordShown)
- }
-
override fun resetViewModel() {
// loginViewModel.handle(LoginAction2.ResetSignin)
}
@@ -169,8 +149,7 @@ class LoginFragmentSigninPassword2 @Inject constructor(
if (state.isLoading) {
// Ensure password is hidden
- passwordShown = false
- renderPasswordField()
+ views.passwordField.hidePassword()
}
}
diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSignupPassword2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSignupPassword2.kt
index c67579e98d..28a87a0e8b 100644
--- a/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSignupPassword2.kt
+++ b/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSignupPassword2.kt
@@ -26,7 +26,7 @@ import androidx.autofill.HintConstants
import com.jakewharton.rxbinding3.widget.textChanges
import im.vector.app.R
import im.vector.app.core.extensions.hideKeyboard
-import im.vector.app.core.extensions.showPassword
+import im.vector.app.core.extensions.hidePassword
import im.vector.app.databinding.FragmentLoginSignupPassword2Binding
import io.reactivex.rxkotlin.subscribeBy
import javax.inject.Inject
@@ -37,8 +37,6 @@ import javax.inject.Inject
*/
class LoginFragmentSignupPassword2 @Inject constructor() : AbstractLoginFragment2() {
- private var passwordShown = false
-
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLoginSignupPassword2Binding {
return FragmentLoginSignupPassword2Binding.inflate(inflater, container, false)
}
@@ -48,7 +46,6 @@ class LoginFragmentSignupPassword2 @Inject constructor() : AbstractLoginFragment
setupSubmitButton()
setupAutoFill()
- setupPasswordReveal()
views.passwordField.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
@@ -97,23 +94,6 @@ class LoginFragmentSignupPassword2 @Inject constructor() : AbstractLoginFragment
.disposeOnDestroyView()
}
- private fun setupPasswordReveal() {
- passwordShown = false
-
- views.passwordReveal.setOnClickListener {
- passwordShown = !passwordShown
-
- renderPasswordField()
- }
-
- renderPasswordField()
- }
-
- private fun renderPasswordField() {
- views.passwordReveal.render(passwordShown)
- views.passwordField.showPassword(passwordShown)
- }
-
override fun resetViewModel() {
// loginViewModel.handle(LoginAction2.ResetSignup)
}
@@ -127,8 +107,7 @@ class LoginFragmentSignupPassword2 @Inject constructor() : AbstractLoginFragment
if (state.isLoading) {
// Ensure password is hidden
- passwordShown = false
- renderPasswordField()
+ views.passwordField.hidePassword()
}
}
}
diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginFragmentToAny2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginFragmentToAny2.kt
index 892699723e..8a12b7e9b6 100644
--- a/vector/src/main/java/im/vector/app/features/login2/LoginFragmentToAny2.kt
+++ b/vector/src/main/java/im/vector/app/features/login2/LoginFragmentToAny2.kt
@@ -27,7 +27,7 @@ import androidx.core.view.isVisible
import com.jakewharton.rxbinding3.widget.textChanges
import im.vector.app.R
import im.vector.app.core.extensions.hideKeyboard
-import im.vector.app.core.extensions.showPassword
+import im.vector.app.core.extensions.hidePassword
import im.vector.app.core.extensions.toReducedUrl
import im.vector.app.databinding.FragmentLoginSigninToAny2Binding
import im.vector.app.features.login.LoginMode
@@ -48,8 +48,6 @@ import javax.inject.Inject
*/
class LoginFragmentToAny2 @Inject constructor() : AbstractSSOLoginFragment2() {
- private var passwordShown = false
-
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLoginSigninToAny2Binding {
return FragmentLoginSigninToAny2Binding.inflate(inflater, container, false)
}
@@ -59,7 +57,6 @@ class LoginFragmentToAny2 @Inject constructor() : AbstractSSOLoginFragment2() {
- private var passwordShown = false
-
// Show warning only once
private var showWarning = true
@@ -55,7 +52,6 @@ class LoginResetPasswordFragment2 @Inject constructor() : AbstractLoginFragment2
super.onViewCreated(view, savedInstanceState)
setupSubmitButton()
- setupPasswordReveal()
setupAutoFill()
autoResetTextInputLayoutErrors(listOf(views.resetPasswordEmailTil, views.passwordFieldTil))
@@ -148,23 +144,6 @@ class LoginResetPasswordFragment2 @Inject constructor() : AbstractLoginFragment2
views.passwordFieldTil.error = null
}
- private fun setupPasswordReveal() {
- passwordShown = false
-
- views.passwordReveal.setOnClickListener {
- passwordShown = !passwordShown
-
- renderPasswordField()
- }
-
- renderPasswordField()
- }
-
- private fun renderPasswordField() {
- views.passwordField.showPassword(passwordShown)
- views.passwordReveal.render(passwordShown)
- }
-
override fun resetViewModel() {
loginViewModel.handle(LoginAction2.ResetResetPassword)
}
@@ -178,8 +157,7 @@ class LoginResetPasswordFragment2 @Inject constructor() : AbstractLoginFragment2
if (state.isLoading) {
// Ensure new password is hidden
- passwordShown = false
- renderPasswordField()
+ views.passwordField.hidePassword()
}
}
}
diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt
index ed1188f682..caa0763c87 100644
--- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt
@@ -37,7 +37,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
import im.vector.app.R
import im.vector.app.core.dialogs.GalleryOrCameraDialogHelper
import im.vector.app.core.extensions.hideKeyboard
-import im.vector.app.core.extensions.showPassword
+import im.vector.app.core.extensions.hidePassword
import im.vector.app.core.intent.getFilenameFromUri
import im.vector.app.core.platform.SimpleTextWatcher
import im.vector.app.core.preference.UserAvatarPreference
@@ -66,7 +66,7 @@ import javax.inject.Inject
class VectorSettingsGeneralFragment @Inject constructor(
colorProvider: ColorProvider
-):
+) :
VectorSettingsBaseFragment(),
GalleryOrCameraDialogHelper.Listener {
@@ -347,18 +347,6 @@ class VectorSettingsGeneralFragment @Inject constructor(
val view: ViewGroup = activity.layoutInflater.inflate(R.layout.dialog_change_password, null) as ViewGroup
val views = DialogChangePasswordBinding.bind(view)
- var passwordShown = false
-
- views.changePasswordShowPasswords.setOnClickListener {
- passwordShown = !passwordShown
-
- views.changePasswordOldPwdText.showPassword(passwordShown)
- views.changePasswordNewPwdText.showPassword(passwordShown)
- views.changePasswordConfirmNewPwdText.showPassword(passwordShown)
-
- views.changePasswordShowPasswords.render(passwordShown)
- }
-
val dialog = MaterialAlertDialogBuilder(activity)
.setView(view)
.setCancelable(false)
@@ -377,13 +365,8 @@ class VectorSettingsGeneralFragment @Inject constructor(
fun updateUi() {
val oldPwd = views.changePasswordOldPwdText.text.toString()
val newPwd = views.changePasswordNewPwdText.text.toString()
- val newConfirmPwd = views.changePasswordConfirmNewPwdText.text.toString()
- updateButton.isEnabled = oldPwd.isNotEmpty() && newPwd.isNotEmpty() && newPwd == newConfirmPwd
-
- if (newPwd.isNotEmpty() && newConfirmPwd.isNotEmpty() && newPwd != newConfirmPwd) {
- views.changePasswordConfirmNewPwdTil.error = getString(R.string.passwords_do_not_match)
- }
+ updateButton.isEnabled = oldPwd.isNotEmpty() && newPwd.isNotEmpty()
}
views.changePasswordOldPwdText.addTextChangedListener(object : SimpleTextWatcher() {
@@ -395,32 +378,20 @@ class VectorSettingsGeneralFragment @Inject constructor(
views.changePasswordNewPwdText.addTextChangedListener(object : SimpleTextWatcher() {
override fun afterTextChanged(s: Editable) {
- views.changePasswordConfirmNewPwdTil.error = null
- updateUi()
- }
- })
-
- views.changePasswordConfirmNewPwdText.addTextChangedListener(object : SimpleTextWatcher() {
- override fun afterTextChanged(s: Editable) {
- views.changePasswordConfirmNewPwdTil.error = null
updateUi()
}
})
fun showPasswordLoadingView(toShow: Boolean) {
if (toShow) {
- views.changePasswordShowPasswords.isEnabled = false
views.changePasswordOldPwdText.isEnabled = false
views.changePasswordNewPwdText.isEnabled = false
- views.changePasswordConfirmNewPwdText.isEnabled = false
views.changePasswordLoader.isVisible = true
updateButton.isEnabled = false
cancelButton.isEnabled = false
} else {
- views.changePasswordShowPasswords.isEnabled = true
views.changePasswordOldPwdText.isEnabled = true
views.changePasswordNewPwdText.isEnabled = true
- views.changePasswordConfirmNewPwdText.isEnabled = true
views.changePasswordLoader.isVisible = false
updateButton.isEnabled = true
cancelButton.isEnabled = true
@@ -428,10 +399,9 @@ class VectorSettingsGeneralFragment @Inject constructor(
}
updateButton.setOnClickListener {
- if (passwordShown) {
- // Hide passwords during processing
- views.changePasswordShowPasswords.performClick()
- }
+ // Hide passwords during processing
+ views.changePasswordOldPwdText.hidePassword()
+ views.changePasswordNewPwdText.hidePassword()
view.hideKeyboard()
diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt
index bb946ace7d..0897e1c01d 100644
--- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt
@@ -37,7 +37,6 @@ import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.dialogs.ExportKeysDialog
import im.vector.app.core.extensions.queryExportKeys
import im.vector.app.core.extensions.registerStartForActivityResult
-import im.vector.app.core.extensions.showPassword
import im.vector.app.core.intent.ExternalIntentData
import im.vector.app.core.intent.analyseIntent
import im.vector.app.core.intent.getFilenameFromUri
@@ -451,14 +450,6 @@ class VectorSettingsSecurityPrivacyFragment @Inject constructor(
.setTitle(R.string.encryption_import_room_keys)
.setView(dialogLayout)
- var passwordVisible = false
-
- views.importDialogShowPassword.setOnClickListener {
- passwordVisible = !passwordVisible
- views.dialogE2eKeysPassphraseEditText.showPassword(passwordVisible)
- views.importDialogShowPassword.render(passwordVisible)
- }
-
views.dialogE2eKeysPassphraseEditText.addTextChangedListener(object : SimpleTextWatcher() {
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
views.dialogE2eKeysImportButton.isEnabled = !views.dialogE2eKeysPassphraseEditText.text.isNullOrEmpty()
diff --git a/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountAction.kt b/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountAction.kt
index c3fa844805..bf62800d6a 100644
--- a/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountAction.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountAction.kt
@@ -19,7 +19,6 @@ package im.vector.app.features.settings.account.deactivation
import im.vector.app.core.platform.VectorViewModelAction
sealed class DeactivateAccountAction : VectorViewModelAction {
- object TogglePassword : DeactivateAccountAction()
data class DeactivateAccount(val eraseAllData: Boolean) : DeactivateAccountAction()
object SsoAuthDone: DeactivateAccountAction()
diff --git a/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountViewModel.kt
index 80af64d9f3..80c64220c0 100644
--- a/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountViewModel.kt
@@ -41,7 +41,7 @@ import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
data class DeactivateAccountViewState(
- val passwordShown: Boolean = false
+ val dummy: Boolean = false
) : MvRxState
class DeactivateAccountViewModel @AssistedInject constructor(@Assisted private val initialState: DeactivateAccountViewState,
@@ -58,7 +58,6 @@ class DeactivateAccountViewModel @AssistedInject constructor(@Assisted private v
override fun handle(action: DeactivateAccountAction) {
when (action) {
- DeactivateAccountAction.TogglePassword -> handleTogglePassword()
is DeactivateAccountAction.DeactivateAccount -> handleDeactivateAccount(action)
DeactivateAccountAction.SsoAuthDone -> {
Timber.d("## UIA - FallBack success")
@@ -87,12 +86,6 @@ class DeactivateAccountViewModel @AssistedInject constructor(@Assisted private v
}.exhaustive
}
- private fun handleTogglePassword() = withState {
- setState {
- copy(passwordShown = !passwordShown)
- }
- }
-
private fun handleDeactivateAccount(action: DeactivateAccountAction.DeactivateAccount) {
_viewEvents.post(DeactivateAccountViewEvents.Loading())
diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutAction.kt b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutAction.kt
index d4edd2bc99..14dc19a95c 100644
--- a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutAction.kt
+++ b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutAction.kt
@@ -25,7 +25,6 @@ sealed class SoftLogoutAction : VectorViewModelAction {
// For password entering management
data class PasswordChanged(val password: String) : SoftLogoutAction()
- object TogglePassword : SoftLogoutAction()
data class SignInAgain(val password: String) : SoftLogoutAction()
// For signing again with SSO
diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutController.kt b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutController.kt
index 86cf6cc884..8aad6e2b77 100644
--- a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutController.kt
+++ b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutController.kt
@@ -114,11 +114,9 @@ class SoftLogoutController @Inject constructor(
id("passwordForm")
stringProvider(host.stringProvider)
passwordValue(state.enteredPassword)
- passwordShown(state.passwordShown)
submitEnabled(state.enteredPassword.isNotEmpty())
onPasswordEdited { host.listener?.passwordEdited(it) }
errorText((state.asyncLoginAction as? Fail)?.error?.let { host.errorFormatter.toHumanReadable(it) })
- passwordRevealClickListener { host.listener?.revealPasswordClicked() }
forgetPasswordClickListener { host.listener?.forgetPasswordClicked() }
submitClickListener { host.listener?.submit() }
}
@@ -169,6 +167,5 @@ class SoftLogoutController @Inject constructor(
fun signinFallbackSubmit()
fun clearData()
fun forgetPasswordClicked()
- fun revealPasswordClicked()
}
}
diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutFragment.kt b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutFragment.kt
index 93aba7d932..cc7379085b 100644
--- a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutFragment.kt
@@ -147,10 +147,6 @@ class SoftLogoutFragment @Inject constructor(
loginViewModel.handle(LoginAction.PostViewEvent(LoginViewEvents.OnForgetPasswordClicked))
}
- override fun revealPasswordClicked() {
- softLogoutViewModel.handle(SoftLogoutAction.TogglePassword)
- }
-
override fun resetViewModel() {
// No op
}
diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewModel.kt b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewModel.kt
index b310d379c6..f49527bd1d 100644
--- a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewModel.kt
@@ -122,7 +122,6 @@ class SoftLogoutViewModel @AssistedInject constructor(
when (action) {
is SoftLogoutAction.RetryLoginFlow -> getSupportedLoginFlow()
is SoftLogoutAction.PasswordChanged -> handlePasswordChange(action)
- is SoftLogoutAction.TogglePassword -> handleTogglePassword()
is SoftLogoutAction.SignInAgain -> handleSignInAgain(action)
is SoftLogoutAction.WebLoginSuccess -> handleWebLoginSuccess(action)
is SoftLogoutAction.ClearData -> handleClearData()
@@ -143,16 +142,6 @@ class SoftLogoutViewModel @AssistedInject constructor(
}
}
- private fun handleTogglePassword() {
- withState {
- setState {
- copy(
- passwordShown = !this.passwordShown
- )
- }
- }
- }
-
private fun handleWebLoginSuccess(action: SoftLogoutAction.WebLoginSuccess) {
// User may have been connected with SSO with another userId
// We have to check this
@@ -188,9 +177,7 @@ class SoftLogoutViewModel @AssistedInject constructor(
private fun handleSignInAgain(action: SoftLogoutAction.SignInAgain) {
setState {
copy(
- asyncLoginAction = Loading(),
- // Ensure password is hidden
- passwordShown = false
+ asyncLoginAction = Loading()
)
}
viewModelScope.launch {
diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewState.kt b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewState.kt
index 4872bfff0c..ccc186aba7 100644
--- a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewState.kt
+++ b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewState.kt
@@ -31,7 +31,6 @@ data class SoftLogoutViewState(
val deviceId: String,
val userDisplayName: String,
val hasUnsavedKeys: Boolean,
- val passwordShown: Boolean = false,
val enteredPassword: String = ""
) : MvRxState {
diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/epoxy/LoginPasswordFormItem.kt b/vector/src/main/java/im/vector/app/features/signout/soft/epoxy/LoginPasswordFormItem.kt
index 0deb9d3508..c032da7192 100644
--- a/vector/src/main/java/im/vector/app/features/signout/soft/epoxy/LoginPasswordFormItem.kt
+++ b/vector/src/main/java/im/vector/app/features/signout/soft/epoxy/LoginPasswordFormItem.kt
@@ -32,20 +32,16 @@ import im.vector.app.core.epoxy.VectorEpoxyModel
import im.vector.app.core.epoxy.addTextChangedListenerOnce
import im.vector.app.core.epoxy.onClick
import im.vector.app.core.epoxy.setValueOnce
-import im.vector.app.core.extensions.showPassword
import im.vector.app.core.platform.SimpleTextWatcher
import im.vector.app.core.resources.StringProvider
-import im.vector.app.core.ui.views.RevealPasswordImageView
@EpoxyModelClass(layout = R.layout.item_login_password_form)
abstract class LoginPasswordFormItem : VectorEpoxyModel() {
@EpoxyAttribute var passwordValue: String = ""
- @EpoxyAttribute var passwordShown: Boolean = false
@EpoxyAttribute var submitEnabled: Boolean = false
@EpoxyAttribute var errorText: String? = null
@EpoxyAttribute lateinit var stringProvider: StringProvider
- @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var passwordRevealClickListener: ClickListener? = null
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var forgetPasswordClickListener: ClickListener? = null
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var submitClickListener: ClickListener? = null
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var onPasswordEdited: TextListener? = null
@@ -61,8 +57,6 @@ abstract class LoginPasswordFormItem : VectorEpoxyModel(R.id.itemLoginPasswordFormPasswordField)
val passwordFieldTil by bind(R.id.itemLoginPasswordFormPasswordFieldTil)
- val passwordReveal by bind(R.id.itemLoginPasswordFormPasswordReveal)
val forgetPassword by bind
-
+ android:layout_marginTop="8dp"
+ android:hint="@string/login_reset_password_password_hint"
+ app:errorEnabled="true"
+ app:errorIconDrawable="@null">
-
+ android:ems="10"
+ android:imeOptions="actionDone"
+ android:inputType="textPassword"
+ android:maxLines="1"
+ android:paddingEnd="48dp"
+ tools:ignore="RtlSymmetry" />
-
-
-
-
-
-
-
+
-
+ android:layout_marginTop="16dp"
+ android:hint="@string/login_signup_password_hint"
+ app:errorEnabled="true"
+ app:errorIconDrawable="@null">
-
+ android:ems="10"
+ android:imeOptions="actionDone"
+ android:inputType="textPassword"
+ android:maxLines="1"
+ android:paddingEnd="48dp"
+ tools:ignore="RtlSymmetry" />
-
-
-
-
-
-
-
+
-
+ android:layout_marginTop="16dp"
+ android:hint="@string/login_signup_password_hint"
+ app:errorEnabled="true"
+ app:errorIconDrawable="@null">
-
+ android:ems="10"
+ android:imeOptions="actionDone"
+ android:inputType="textPassword"
+ android:maxLines="1"
+ android:paddingEnd="48dp"
+ tools:ignore="RtlSymmetry" />
-
-
-
-
-
-
-
+
-
+ android:layout_marginTop="8dp"
+ android:hint="@string/login_signup_password_hint"
+ app:errorEnabled="true"
+ app:errorIconDrawable="@null">
-
+ android:ems="10"
+ android:imeOptions="actionDone"
+ android:inputType="textPassword"
+ android:maxLines="1"
+ android:paddingEnd="48dp"
+ tools:ignore="RtlSymmetry" />
-
-
-
-
-
-
-
+
-
-
+ android:ems="10"
+ android:imeOptions="actionDone"
+ android:inputType="textPassword"
+ android:maxLines="1"
+ android:paddingEnd="48dp"
+ tools:ignore="RtlSymmetry" />
-
-
-
-
-
-
-
+
@@ -88,7 +72,7 @@
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@id/passwordContainer"
+ app:layout_constraintTop_toBottomOf="@id/passwordFieldTil"
tools:visibility="visible" />
@@ -74,18 +76,6 @@
-
-
-
+ android:layout_height="wrap_content"
+ android:hint="@string/soft_logout_signin_password_hint"
+ app:errorEnabled="true"
+ app:errorIconDrawable="@null">
-
+ android:ems="10"
+ android:inputType="textPassword"
+ android:maxLines="1"
+ android:paddingEnd="48dp"
+ tools:ignore="RtlSymmetry" />
-
-
-
-
-
-
-
+