ui: Custom password field
Add the ability to reveal text dynamically on password fields during account
creation and credentials screen
diff --git a/src/org/sflphone/fragments/AccountCreationFragment.java b/src/org/sflphone/fragments/AccountCreationFragment.java
index 7aed9da..f96a82e 100644
--- a/src/org/sflphone/fragments/AccountCreationFragment.java
+++ b/src/org/sflphone/fragments/AccountCreationFragment.java
@@ -21,6 +21,7 @@
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast;
+import org.sflphone.views.PasswordEditText;
public class AccountCreationFragment extends Fragment {
@@ -34,7 +35,7 @@
private EditText mAliasView;
private EditText mHostnameView;
private EditText mUsernameView;
- private EditText mPasswordView;
+ private PasswordEditText mPasswordView;
private Callbacks mCallbacks = sDummyCallbacks;
private static Callbacks sDummyCallbacks = new Callbacks() {
@@ -63,9 +64,9 @@
mAliasView = (EditText) inflatedView.findViewById(R.id.alias);
mHostnameView = (EditText) inflatedView.findViewById(R.id.hostname);
mUsernameView = (EditText) inflatedView.findViewById(R.id.username);
- mPasswordView = (EditText) inflatedView.findViewById(R.id.password);
+ mPasswordView = (PasswordEditText) inflatedView.findViewById(R.id.password);
- mPasswordView.setOnEditorActionListener(new OnEditorActionListener() {
+ mPasswordView.getEdit_text().setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
diff --git a/src/org/sflphone/views/CredentialsPreference.java b/src/org/sflphone/views/CredentialsPreference.java
index 93d0df8..5b18f1d 100644
--- a/src/org/sflphone/views/CredentialsPreference.java
+++ b/src/org/sflphone/views/CredentialsPreference.java
@@ -56,7 +56,9 @@
public class CredentialsPreference extends DialogPreference {
- EditText mUsernameField, mPasswordField, mRealmField;
+ EditText mUsernameField;
+ PasswordEditText mPasswordField;
+ EditText mRealmField;
public CredentialsPreference(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -70,13 +72,13 @@
View view = inflater.inflate(R.layout.credentials_pref, null);
mUsernameField = (EditText) view.findViewById(R.id.credentials_username);
- mPasswordField = (EditText) view.findViewById(R.id.credentials_password);
+ mPasswordField = (PasswordEditText) view.findViewById(R.id.credentials_password);
mRealmField = (EditText) view.findViewById(R.id.credentials_realm);
if (getExtras().getSerializable(CredentialsManager.CURRENT_CRED) != null) {
HashMap<String, String> details = (HashMap<String, String>) getExtras().getSerializable(CredentialsManager.CURRENT_CRED);
mUsernameField.setText(details.get(AccountCredentials.CONFIG_ACCOUNT_USERNAME));
- mPasswordField.setText(details.get(AccountCredentials.CONFIG_ACCOUNT_PASSWORD));
+ mPasswordField.getEdit_text().setText(details.get(AccountCredentials.CONFIG_ACCOUNT_PASSWORD));
mRealmField.setText(details.get(AccountCredentials.CONFIG_ACCOUNT_REALM));
}
diff --git a/src/org/sflphone/views/PasswordEditText.java b/src/org/sflphone/views/PasswordEditText.java
new file mode 100644
index 0000000..e15ce65
--- /dev/null
+++ b/src/org/sflphone/views/PasswordEditText.java
@@ -0,0 +1,115 @@
+package org.sflphone.views;
+
+import android.content.Context;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.text.method.HideReturnsTransformationMethod;
+import android.text.method.PasswordTransformationMethod;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.inputmethod.EditorInfo;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.RelativeLayout;
+import org.sflphone.R;
+
+/**
+ * Created by lisional on 06/04/14.
+ */
+public class PasswordEditText extends RelativeLayout {
+ LayoutInflater inflater = null;
+ EditText edit_text;
+ Button btn_clear;
+
+ public PasswordEditText(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ initViews();
+ }
+
+ public PasswordEditText(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ initViews();
+ }
+
+ public PasswordEditText(Context context) {
+ super(context);
+ // TODO Auto-generated constructor stub
+ initViews();
+ }
+
+ void initViews() {
+ inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ inflater.inflate(R.layout.password_edittext, this, true);
+ edit_text = (EditText) findViewById(R.id.password_edittext);
+ edit_text.setSingleLine();
+ edit_text.setImeOptions(EditorInfo.IME_ACTION_DONE);
+ btn_clear = (Button) findViewById(R.id.password_visibility);
+ btn_clear.setVisibility(RelativeLayout.INVISIBLE);
+ revealText();
+ edit_text.setTransformationMethod(PasswordTransformationMethod.getInstance());
+ showHideClearButton();
+ }
+
+ void revealText() {
+ btn_clear.setOnTouchListener(new View.OnTouchListener() {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ switch(event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ edit_text.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
+ edit_text.setSelection(edit_text.getText().length());
+ return true; // if you want to handle the touch event
+ case MotionEvent.ACTION_UP:
+ // RELEASED
+ edit_text.setTransformationMethod(PasswordTransformationMethod.getInstance());
+ edit_text.setSelection(edit_text.getText().length());
+ return true; // if you want to handle the touch event
+ }
+ return false;
+ }
+ });
+ }
+
+ void showHideClearButton() {
+ edit_text.addTextChangedListener(new TextWatcher() {
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ if (s.length() > 0)
+ btn_clear.setVisibility(RelativeLayout.VISIBLE);
+ else
+ btn_clear.setVisibility(RelativeLayout.INVISIBLE);
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ }
+ });
+ }
+
+ public Editable getText() {
+ Editable text = edit_text.getText();
+ return text;
+ }
+
+ public void setInputType(int typeClassNumber) {
+ edit_text.setFocusableInTouchMode(true);
+ edit_text.requestFocus();
+ edit_text.setInputType(typeClassNumber);
+ }
+
+ public EditText getEdit_text() {
+ return edit_text;
+ }
+
+ public void setError(String string) {
+ edit_text.setError(string);
+ edit_text.requestFocus();
+ }
+}
\ No newline at end of file