diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/PasswordRevealHelper.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/PasswordRevealHelper.kt new file mode 100644 index 000000000..b3797b455 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/PasswordRevealHelper.kt @@ -0,0 +1,39 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.settings.logins + +import android.text.InputType +import android.widget.ImageButton +import android.widget.TextView +import androidx.appcompat.content.res.AppCompatResources +import org.mozilla.fenix.R +import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.ext.components + +fun togglePasswordReveal(passwordText: TextView, revealPasswordButton: ImageButton) { + val context = passwordText.context + + if (passwordText.inputType == InputType.TYPE_TEXT_VARIATION_PASSWORD + or InputType.TYPE_CLASS_TEXT + ) { + context.components.analytics.metrics.track(Event.ViewLoginPassword) + passwordText.inputType = InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + revealPasswordButton.setImageDrawable( + AppCompatResources.getDrawable(context, R.drawable.mozac_ic_password_hide) + ) + revealPasswordButton.contentDescription = + context.getString(R.string.saved_login_hide_password) + } else { + passwordText.inputType = + InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD + revealPasswordButton.setImageDrawable( + AppCompatResources.getDrawable(context, R.drawable.mozac_ic_password_reveal) + ) + revealPasswordButton.contentDescription = + context.getString(R.string.saved_login_reveal_password) + } + // We need to reset to take effect + passwordText.text = passwordText.text +} diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt index 15827fdf5..1609e1c6e 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt @@ -18,7 +18,6 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import kotlinx.android.synthetic.main.fragment_edit_login.* -import kotlinx.android.synthetic.main.fragment_edit_login.view.* import kotlinx.coroutines.ExperimentalCoroutinesApi import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.support.ktx.android.view.hideKeyboard @@ -32,9 +31,9 @@ import org.mozilla.fenix.settings.logins.LoginsAction import org.mozilla.fenix.settings.logins.LoginsFragmentStore import org.mozilla.fenix.settings.logins.LoginsListState import org.mozilla.fenix.settings.logins.SavedLogin +import org.mozilla.fenix.settings.logins.togglePasswordReveal import org.mozilla.fenix.settings.logins.controller.SavedLoginsStorageController import org.mozilla.fenix.settings.logins.interactor.EditLoginInteractor -import org.mozilla.fenix.settings.logins.view.EditLoginView /** * Displays the editable saved login information for a single website @@ -43,12 +42,11 @@ import org.mozilla.fenix.settings.logins.view.EditLoginView @Suppress("TooManyFunctions", "NestedBlockDepth", "ForbiddenComment") class EditLoginFragment : Fragment(R.layout.fragment_edit_login) { - fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this) + private fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this) private val args by navArgs() private lateinit var loginsFragmentStore: LoginsFragmentStore private lateinit var interactor: EditLoginInteractor - private lateinit var editLoginView: EditLoginView private lateinit var oldLogin: SavedLogin private var listOfPossibleDupes: List? = null @@ -56,7 +54,6 @@ class EditLoginFragment : Fragment(R.layout.fragment_edit_login) { private var usernameChanged = false private var passwordChanged = false private var saveEnabled = false - private var showPassword = true private var validPassword = true private var validUsername = true @@ -65,7 +62,6 @@ class EditLoginFragment : Fragment(R.layout.fragment_edit_login) { super.onViewCreated(view, savedInstanceState) setHasOptionsMenu(true) oldLogin = args.savedLoginItem - editLoginView = EditLoginView(view.editLoginLayout) loginsFragmentStore = StoreProvider.get(this) { LoginsFragmentStore( @@ -102,7 +98,7 @@ class EditLoginFragment : Fragment(R.layout.fragment_edit_login) { initSaveState() setUpClickListeners() setUpTextListeners() - editLoginView.showPassword() + togglePasswordReveal(passwordText, revealPasswordButton) consumeFrom(loginsFragmentStore) { listOfPossibleDupes = loginsFragmentStore.state.duplicateLogins @@ -146,12 +142,7 @@ class EditLoginFragment : Fragment(R.layout.fragment_edit_login) { it.isEnabled = false } revealPasswordButton.setOnClickListener { - showPassword = !showPassword - if (showPassword) { - editLoginView.showPassword() - } else { - editLoginView.hidePassword() - } + togglePasswordReveal(passwordText, revealPasswordButton) } } @@ -170,8 +161,8 @@ class EditLoginFragment : Fragment(R.layout.fragment_edit_login) { usernameText.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(u: Editable?) { - when { - u.toString() == oldLogin.username -> { + when (oldLogin.username) { + u.toString() -> { usernameChanged = false validUsername = true inputLayoutUsername.error = null diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/LoginDetailFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/LoginDetailFragment.kt index 501e26763..06ae9609e 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/LoginDetailFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/LoginDetailFragment.kt @@ -43,6 +43,7 @@ import org.mozilla.fenix.settings.logins.LoginsListState import org.mozilla.fenix.settings.logins.SavedLogin import org.mozilla.fenix.settings.logins.controller.SavedLoginsStorageController import org.mozilla.fenix.settings.logins.interactor.LoginDetailInteractor +import org.mozilla.fenix.settings.logins.togglePasswordReveal import org.mozilla.fenix.settings.logins.view.LoginDetailView /** @@ -59,7 +60,6 @@ class LoginDetailFragment : Fragment(R.layout.fragment_login_detail) { private lateinit var interactor: LoginDetailInteractor private lateinit var menu: Menu private var deleteDialog: AlertDialog? = null - private var showPassword = true override fun onCreateView( inflater: LayoutInflater, @@ -112,7 +112,7 @@ class LoginDetailFragment : Fragment(R.layout.fragment_login_detail) { ) setUpPasswordReveal() } - loginDetailView.togglePasswordReveal(showPassword) + togglePasswordReveal(passwordText, revealPasswordButton) } override fun onCreate(savedInstanceState: Bundle?) { @@ -140,11 +140,10 @@ class LoginDetailFragment : Fragment(R.layout.fragment_login_detail) { InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD revealPasswordButton.increaseTapArea(BUTTON_INCREASE_DPS) revealPasswordButton.setOnClickListener { - showPassword = !showPassword - loginDetailView.togglePasswordReveal(!showPassword) + togglePasswordReveal(passwordText, revealPasswordButton) } passwordText.setOnClickListener { - loginDetailView.togglePasswordReveal(!showPassword) + togglePasswordReveal(passwordText, revealPasswordButton) } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt index 63fc052e0..3fc802d45 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt @@ -171,6 +171,8 @@ class SavedLoginsAuthFragment : PreferenceFragmentCompat(), AccountObserver { accountExists -> updateSyncPreferenceStatus() !accountExists -> updateSyncPreferenceNeedsLogin() } + + togglePrefsEnabledWhileAuthenticating(enabled = true) } override fun onAuthenticated(account: OAuthAccount, authType: AuthType) = diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/view/EditLoginView.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/view/EditLoginView.kt deleted file mode 100644 index cdc1c8a9b..000000000 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/view/EditLoginView.kt +++ /dev/null @@ -1,54 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.settings.logins.view - -import android.text.InputType -import android.view.ViewGroup -import androidx.appcompat.content.res.AppCompatResources -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.fragment_edit_login.view.* -import org.mozilla.fenix.R -import org.mozilla.fenix.components.metrics.Event -import org.mozilla.fenix.ext.components - -/** - * View that contains and configures the Edit Login screen - */ -@Suppress("ForbiddenComment") -class EditLoginView( - override val containerView: ViewGroup -) : LayoutContainer { - private val context = containerView.context - - // TODO: create helper class for toggling passwords. https://github.com/mozilla-mobile/fenix/issues/12554 - fun showPassword() { - val currText = containerView.passwordText?.text - context.components.analytics.metrics.track(Event.ViewLoginPassword) - containerView.passwordText?.inputType = - InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD - containerView.revealPasswordButton?.setImageDrawable( - AppCompatResources.getDrawable(context, R.drawable.mozac_ic_password_hide) - ) - containerView.revealPasswordButton?.contentDescription = - context.resources.getString(R.string.saved_login_hide_password) - - // For the new type to take effect you need to reset the text to it's current edited version - containerView.passwordText?.text = currText - } - - fun hidePassword() { - val currText = containerView.passwordText?.text - containerView.passwordText?.inputType = - InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD - containerView.revealPasswordButton?.setImageDrawable( - AppCompatResources.getDrawable(context, R.drawable.mozac_ic_password_reveal) - ) - containerView.revealPasswordButton?.contentDescription = - context.getString(R.string.saved_login_reveal_password) - - // For the new type to take effect you need to reset the text to it's current edited version - containerView.passwordText?.text = currText - } -} diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/view/LoginDetailView.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/view/LoginDetailView.kt index 6276772f6..123e8f121 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/view/LoginDetailView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/view/LoginDetailView.kt @@ -4,62 +4,18 @@ package org.mozilla.fenix.settings.logins.view -import android.text.InputType import android.view.ViewGroup -import androidx.core.content.res.ResourcesCompat import kotlinx.android.extensions.LayoutContainer import kotlinx.android.synthetic.main.fragment_login_detail.* -import kotlinx.android.synthetic.main.fragment_login_detail.view.* -import org.mozilla.fenix.R -import org.mozilla.fenix.components.metrics.Event -import org.mozilla.fenix.ext.components import org.mozilla.fenix.settings.logins.LoginsListState /** * View that contains and configures the Login Details */ -@Suppress("ForbiddenComment") class LoginDetailView(override val containerView: ViewGroup) : LayoutContainer { - private val context = containerView.context - fun update(login: LoginsListState) { webAddressText.text = login.currentItem?.origin usernameText.text = login.currentItem?.username passwordText.text = login.currentItem?.password } - - fun togglePasswordReveal(show: Boolean) { - if (show) showPassword() else { hidePassword() } - } - - // TODO: create helper class for toggling passwords. https://github.com/mozilla-mobile/fenix/issues/12554 - fun showPassword() { - if (passwordText.inputType == InputType.TYPE_TEXT_VARIATION_PASSWORD or InputType.TYPE_CLASS_TEXT) { - context?.components?.analytics?.metrics?.track(Event.ViewLoginPassword) - passwordText.inputType = InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD - revealPasswordButton.setImageDrawable( - ResourcesCompat.getDrawable( - context.resources, - R.drawable.mozac_ic_password_hide, null - ) - ) - revealPasswordButton.contentDescription = - context.resources.getString(R.string.saved_login_hide_password) - } - // For the new type to take effect you need to reset the text - passwordText.text = containerView.passwordText.editableText - } - - fun hidePassword() { - passwordText.inputType = - InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD - revealPasswordButton.setImageDrawable( - ResourcesCompat.getDrawable(context.resources, - R.drawable.mozac_ic_password_reveal, null) - ) - revealPasswordButton.contentDescription = - context.getString(R.string.saved_login_reveal_password) - // For the new type to take effect you need to reset the text - passwordText.text = containerView.passwordText.editableText - } }