package org.commcare.views; import android.text.method.HideReturnsTransformationMethod; import android.text.method.PasswordTransformationMethod; import android.view.View; import android.widget.Button; import android.widget.EditText; import org.commcare.preferences.CommCarePreferences; import org.javarosa.core.services.locale.Localization; /** * Allow password field to show/hide password text * * @author Phillip Mates (pmates@dimagi.com) */ public class PasswordShow { private boolean isPasswordVisible; private final Button showPasswordButton; private final EditText passwordField; private final String showText, hideText; public PasswordShow(Button showPasswordButton, EditText passwordField) { this.showPasswordButton = showPasswordButton; this.passwordField = passwordField; showText = Localization.get("login.show.password"); hideText = Localization.get("login.hide.password"); } public void setupPasswordVisibility() { switch (CommCarePreferences.getPasswordDisplayOption()) { case ALWAYS_HIDDEN: passwordAlwaysHiddenState(); break; case DEFAULT_HIDE: passwordHiddenState(); break; case DEFAULT_SHOW: passwordShownState(); break; } showPasswordButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { togglePasswordVisibility(); } }); } private void passwordAlwaysHiddenState() { isPasswordVisible = false; showPasswordButton.setVisibility(View.INVISIBLE); } private void passwordHiddenState() { isPasswordVisible = false; showPasswordButton.setVisibility(View.VISIBLE); showPasswordButton.setText(showText); passwordField.setTransformationMethod(PasswordTransformationMethod.getInstance()); passwordField.setSelection(passwordField.getText().length()); } private void passwordShownState() { isPasswordVisible = true; showPasswordButton.setVisibility(View.VISIBLE); showPasswordButton.setText(hideText); passwordField.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); passwordField.setSelection(passwordField.getText().length()); } private void togglePasswordVisibility() { if (isPasswordVisible) { passwordHiddenState(); } else { passwordShownState(); } } public enum PasswordShowOption { ALWAYS_HIDDEN, DEFAULT_SHOW, DEFAULT_HIDE; public static PasswordShowOption fromString(String optionAsString) { switch (optionAsString) { case "always_hidden": return ALWAYS_HIDDEN; case "default_show": return DEFAULT_SHOW; case "default_hide": return DEFAULT_HIDE; default: return ALWAYS_HIDDEN; } } } }