X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/510c00f66d08fa85f19771135811525bb69b7f4f..ff82b51e49f40155e7c340090f5ee759af2bf3ad:/src/com/owncloud/android/ui/activity/PassCodeActivity.java diff --git a/src/com/owncloud/android/ui/activity/PassCodeActivity.java b/src/com/owncloud/android/ui/activity/PassCodeActivity.java index 6323fffc..09a96307 100644 --- a/src/com/owncloud/android/ui/activity/PassCodeActivity.java +++ b/src/com/owncloud/android/ui/activity/PassCodeActivity.java @@ -1,6 +1,9 @@ /** * ownCloud Android client application * + * @author Bartek Przybylski + * @author masensio + * @author David A. Velasco * Copyright (C) 2011 Bartek Przybylski * Copyright (C) 2015 ownCloud Inc. * @@ -24,43 +27,43 @@ import java.util.Arrays; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.v7.app.ActionBar; +import android.support.v7.app.ActionBarActivity; import android.text.Editable; import android.text.TextWatcher; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; -import android.view.View.OnFocusChangeListener; -import android.view.View.OnKeyListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; -import com.actionbarsherlock.app.ActionBar; -import com.actionbarsherlock.app.SherlockFragmentActivity; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.utils.DisplayUtils; -public class PassCodeActivity extends SherlockFragmentActivity { +public class PassCodeActivity extends ActionBarActivity { private static final String TAG = PassCodeActivity.class.getSimpleName(); - public final static String ACTION_ENABLE = PassCodeActivity.class.getCanonicalName() + ".ENABLE"; - public final static String ACTION_DISABLE = PassCodeActivity.class.getCanonicalName() + ".DISABLE"; - public final static String ACTION_REQUEST = PassCodeActivity.class.getCanonicalName() + ".REQUEST"; + public final static String ACTION_ENABLE = PassCodeActivity.class.getCanonicalName() + + ".ENABLE"; + public final static String ACTION_DISABLE = PassCodeActivity.class.getCanonicalName() + + ".DISABLE"; + public final static String ACTION_REQUEST = PassCodeActivity.class.getCanonicalName() + + ".REQUEST"; private Button mBCancel; private TextView mPassCodeHdr; private TextView mPassCodeHdrExplanation; - private EditText mText0; - private EditText mText1; - private EditText mText2; - private EditText mText3; + private EditText[] mPassCodeEditTexts = new EditText[4]; private String [] mPassCodeDigits = {"","","",""}; + private static String KEY_PASSCODE_DIGITS = "PASSCODE_DIGITS"; private boolean mConfirmingPassCode = false; + private static String KEY_CONFIRMING_PASSCODE = "CONFIRMING_PASSCODE"; private boolean mBChange = true; // to control that only one blocks jump @@ -68,7 +71,8 @@ public class PassCodeActivity extends SherlockFragmentActivity { /** * Initializes the activity. * - * An intent with a valid ACTION is expected; if none is found, an {@link IllegalArgumentException} will be thrown. + * An intent with a valid ACTION is expected; if none is found, an + * {@link IllegalArgumentException} will be thrown. * * @param savedInstanceState Previously saved state - irrelevant in this case */ @@ -79,12 +83,13 @@ public class PassCodeActivity extends SherlockFragmentActivity { mBCancel = (Button) findViewById(R.id.cancel); mPassCodeHdr = (TextView) findViewById(R.id.header); mPassCodeHdrExplanation = (TextView) findViewById(R.id.explanation); - mText0 = (EditText) findViewById(R.id.txt0); - mText0.requestFocus(); - getWindow().setSoftInputMode(android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); - mText1 = (EditText) findViewById(R.id.txt1); - mText2 = (EditText) findViewById(R.id.txt2); - mText3 = (EditText) findViewById(R.id.txt3); + mPassCodeEditTexts[0] = (EditText) findViewById(R.id.txt0); + mPassCodeEditTexts[0].requestFocus(); + getWindow().setSoftInputMode( + android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + mPassCodeEditTexts[1] = (EditText) findViewById(R.id.txt1); + mPassCodeEditTexts[2] = (EditText) findViewById(R.id.txt2); + mPassCodeEditTexts[3] = (EditText) findViewById(R.id.txt3); if (ACTION_REQUEST.equals(getIntent().getAction())) { /// this is a pass code request; the user has to input the right value @@ -93,11 +98,22 @@ public class PassCodeActivity extends SherlockFragmentActivity { setCancelButtonEnabled(false); // no option to cancel } else if (ACTION_ENABLE.equals(getIntent().getAction())) { - /// pass code preference has just been activated in Preferences; will receive and confirm pass code value - mPassCodeHdr.setText(R.string.pass_code_configure_your_pass_code); - //mPassCodeHdr.setText(R.string.pass_code_enter_pass_code); // TODO choose a header, check iOS - mPassCodeHdrExplanation.setVisibility(View.VISIBLE); - setCancelButtonEnabled(true); + if (savedInstanceState != null) { + mConfirmingPassCode = savedInstanceState.getBoolean(PassCodeActivity.KEY_CONFIRMING_PASSCODE); + mPassCodeDigits = savedInstanceState.getStringArray(PassCodeActivity.KEY_PASSCODE_DIGITS); + } + if(mConfirmingPassCode){ + //the app was in the passcodeconfirmation + requestPassCodeConfirmation(); + }else{ + /// pass code preference has just been activated in Preferences; + // will receive and confirm pass code value + mPassCodeHdr.setText(R.string.pass_code_configure_your_pass_code); + //mPassCodeHdr.setText(R.string.pass_code_enter_pass_code); + // TODO choose a header, check iOS + mPassCodeHdrExplanation.setVisibility(View.VISIBLE); + setCancelButtonEnabled(true); + } } else if (ACTION_DISABLE.equals(getIntent().getAction())) { /// pass code preference has just been disabled in Preferences; @@ -107,7 +123,8 @@ public class PassCodeActivity extends SherlockFragmentActivity { setCancelButtonEnabled(true); } else { - throw new IllegalArgumentException("A valid ACTION is needed in the Intent passed to " + TAG); + throw new IllegalArgumentException("A valid ACTION is needed in the Intent passed to " + + TAG); } setTextListeners(); @@ -115,8 +132,14 @@ public class PassCodeActivity extends SherlockFragmentActivity { ActionBar actionBar = getSupportActionBar(); actionBar.setIcon(DisplayUtils.getSeasonalIconId()); } - + + /** + * Enables or disables the cancel button to allow the user interrupt the ACTION + * requested to the activity. + * + * @param enabled 'True' makes the cancel button available, 'false' hides it. + */ protected void setCancelButtonEnabled(boolean enabled){ if(enabled){ mBCancel.setVisibility(View.VISIBLE); @@ -131,83 +154,33 @@ public class PassCodeActivity extends SherlockFragmentActivity { mBCancel.setVisibility(View.INVISIBLE); mBCancel.setOnClickListener(null); } - } - - - /* - * - */ - protected void setTextListeners(){ - - /*------------------------------------------------ - * FIRST BOX - -------------------------------------------------*/ - - mText0.addTextChangedListener(new TextWatcher() { - @Override - public void onTextChanged(CharSequence s, int start, int before, - int count) { - } - @Override - public void beforeTextChanged(CharSequence s, int start, int count, - int after) { - } + /** + * Binds the appropiate listeners to the input boxes receiving each digit of the pass code. + */ + protected void setTextListeners() { + + /// First input field + mPassCodeEditTexts[0].addTextChangedListener(new PassCodeDigitTextWatcher(0, false)); - @Override - public void afterTextChanged(Editable s) { - if (s.length() > 0) { - if (!mConfirmingPassCode) { - mPassCodeDigits[0] = mText0.getText().toString(); - } - mText1.requestFocus(); - } else { - Log_OC.w(TAG, "Input in text box 0 resulted in empty string"); - } - } - }); - - /*------------------------------------------------ * SECOND BOX -------------------------------------------------*/ - mText1.addTextChangedListener(new TextWatcher() { - - @Override - public void onTextChanged(CharSequence s, int start, int before, - int count) { - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, - int after) { - } + mPassCodeEditTexts[1].addTextChangedListener(new PassCodeDigitTextWatcher(1, false)); - @Override - public void afterTextChanged(Editable s) { - if (s.length() > 0) { - if (!mConfirmingPassCode) { - mPassCodeDigits[1] = mText1.getText().toString(); - } - mText2.requestFocus(); - } else { - Log_OC.w(TAG, "Input in text box 1 resulted in empty string"); - } - } - }); - - mText1.setOnKeyListener(new OnKeyListener() { + mPassCodeEditTexts[1].setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) { // TODO WIP: event should be used to control what's exactly happening with DEL, not any custom field... - mText0.setText(""); - mText0.requestFocus(); + if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) { // TODO WIP: event should be + // used to control what's exactly happening with DEL, not any custom field... + mPassCodeEditTexts[0].setText(""); + mPassCodeEditTexts[0].requestFocus(); if (!mConfirmingPassCode) - mPassCodeDigits[0] = ""; // TODO WIP: what is this for?? + mPassCodeDigits[0] = ""; mBChange = false; } else if (!mBChange) { @@ -215,21 +188,18 @@ public class PassCodeActivity extends SherlockFragmentActivity { } return false; } - }); - - mText1.setOnFocusChangeListener(new OnFocusChangeListener() { + }); + + mPassCodeEditTexts[1].setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { - mText1.setCursorVisible(true); // TODO WIP this could be made static, or just nothing, since default is true... - if (mText0.getText().toString().equals("")) { // TODO WIP is this really needed? when? - mText1.setSelected(false); - mText1.setCursorVisible(false); // TODO WIP really this is a problem? - mText0.requestFocus(); // TODO WIP how many focus requests do we need? - mText0.setSelected(true); // TODO WIP what is this for? - mText0.setSelection(0); // TODO WIP what is THIS for? + /// TODO WIP: should take advantage of hasFocus to reduce processing + if (mPassCodeEditTexts[0].getText().toString().equals("")) { // TODO WIP validation + // could be done in a global way, with a single OnFocusChangeListener for all the + // input fields + mPassCodeEditTexts[0].requestFocus(); } - } }); @@ -237,41 +207,17 @@ public class PassCodeActivity extends SherlockFragmentActivity { /*------------------------------------------------ * THIRD BOX -------------------------------------------------*/ - /// TODO WIP yeah, let's repeat all the code again... - mText2.addTextChangedListener(new TextWatcher() { + mPassCodeEditTexts[2].addTextChangedListener(new PassCodeDigitTextWatcher(2, false)); - @Override - public void onTextChanged(CharSequence s, int start, int before, - int count) { - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, - int after) { - } - - @Override - public void afterTextChanged(Editable s) { - if (s.length() > 0) { - if (!mConfirmingPassCode) { - mPassCodeDigits[2] = mText2.getText().toString(); - } - mText3.requestFocus(); - } else { - Log_OC.w(TAG, "Input in text box 2 resulted in empty string"); - } - } - }); - - mText2.setOnKeyListener(new OnKeyListener() { + mPassCodeEditTexts[2].setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) { - mText1.requestFocus(); + mPassCodeEditTexts[1].requestFocus(); if (!mConfirmingPassCode) mPassCodeDigits[1] = ""; - mText1.setText(""); + mPassCodeEditTexts[1].setText(""); mBChange = false; } else if (!mBChange) { @@ -282,26 +228,15 @@ public class PassCodeActivity extends SherlockFragmentActivity { } }); - mText2.setOnFocusChangeListener(new OnFocusChangeListener() { + mPassCodeEditTexts[2].setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { - /// TODO WIP: hasFocus is there for some reason; for instance, doing NOTHING if this is not my business, instead of considering all the possible cases in every edit text - mText2.setCursorVisible(true); - if (mText0.getText().toString().equals("")) { - mText2.setSelected(false); - mText2.setCursorVisible(false); - mText0.requestFocus(); - mText0.setSelected(true); - mText0.setSelection(0); - } else if (mText1.getText().toString().equals("")) { - mText2.setSelected(false); - mText2.setCursorVisible(false); - mText1.requestFocus(); - mText1.setSelected(true); - mText1.setSelection(0); + if (mPassCodeEditTexts[0].getText().toString().equals("")) { + mPassCodeEditTexts[0].requestFocus(); + } else if (mPassCodeEditTexts[1].getText().toString().equals("")) { + mPassCodeEditTexts[1].requestFocus(); } - } }); @@ -309,45 +244,17 @@ public class PassCodeActivity extends SherlockFragmentActivity { /*------------------------------------------------ * FOURTH BOX -------------------------------------------------*/ - mText3.addTextChangedListener(new TextWatcher() { + mPassCodeEditTexts[3].addTextChangedListener(new PassCodeDigitTextWatcher(3, true)); - @Override - public void onTextChanged(CharSequence s, int start, int before, - int count) { - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, - int after) { - } - - @Override - public void afterTextChanged(Editable s) { - if (s.length() > 0) { - - if (!mConfirmingPassCode) { - mPassCodeDigits[3] = mText3.getText().toString(); - } - mText0.requestFocus(); - - processFullPassCode(); - - } else { - Log_OC.w(TAG, "Input in text box 3 resulted in empty string"); - } - } - }); - - - mText3.setOnKeyListener(new OnKeyListener() { + mPassCodeEditTexts[3].setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) { - mText2.requestFocus(); + mPassCodeEditTexts[2].requestFocus(); if (!mConfirmingPassCode) mPassCodeDigits[2] = ""; - mText2.setText(""); + mPassCodeEditTexts[2].setText(""); mBChange = false; } else if (!mBChange) { @@ -357,45 +264,30 @@ public class PassCodeActivity extends SherlockFragmentActivity { } }); - mText3.setOnFocusChangeListener(new OnFocusChangeListener() { + mPassCodeEditTexts[3].setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { - mText3.setCursorVisible(true); - - if (mText0.getText().toString().equals("")) { - mText3.setSelected(false); - mText3.setCursorVisible(false); - mText0.requestFocus(); - mText0.setSelected(true); - mText0.setSelection(0); - } else if (mText1.getText().toString().equals("")) { - mText3.setSelected(false); - mText3.setCursorVisible(false); - mText1.requestFocus(); - mText1.setSelected(true); - mText1.setSelection(0); - } else if (mText2.getText().toString().equals("")) { - mText3.setSelected(false); - mText3.setCursorVisible(false); - mText2.requestFocus(); - mText2.setSelected(true); - mText2.setSelection(0); + + if (mPassCodeEditTexts[0].getText().toString().equals("")) { + mPassCodeEditTexts[0].requestFocus(); + } else if (mPassCodeEditTexts[1].getText().toString().equals("")) { + mPassCodeEditTexts[1].requestFocus(); + } else if (mPassCodeEditTexts[2].getText().toString().equals("")) { + mPassCodeEditTexts[2].requestFocus(); } } }); - - - + } // end setTextListener /** * Processes the pass code entered by the user just after the last digit was in. * - * Takes into account the action requested to the activity, the currently saved pass code and the previously - * typed pass code, if any. + * Takes into account the action requested to the activity, the currently saved pass code and + * the previously typed pass code, if any. */ private void processFullPassCode() { if (ACTION_REQUEST.equals(getIntent().getAction())) { @@ -404,8 +296,8 @@ public class PassCodeActivity extends SherlockFragmentActivity { finish(); } else { - showErrorAndRestart(R.string.common_error, R.string.pass_code_enter_pass_code, View.INVISIBLE); - /// TODO better error message + showErrorAndRestart(R.string.pass_code_wrong, R.string.pass_code_enter_pass_code, + View.INVISIBLE); } } else if (ACTION_DISABLE.equals(getIntent().getAction())) { @@ -413,15 +305,16 @@ public class PassCodeActivity extends SherlockFragmentActivity { /// pass code accepted when disabling, pass code is removed SharedPreferences.Editor appPrefs = PreferenceManager .getDefaultSharedPreferences(getApplicationContext()).edit(); - appPrefs.putBoolean("set_pincode", false); // TODO remove; this should be unnecessary, was done before entering in the activity + appPrefs.putBoolean("set_pincode", false); // TODO remove; this should be + // unnecessary, was done before entering in the activity appPrefs.commit(); Toast.makeText(PassCodeActivity.this, R.string.pass_code_removed, Toast.LENGTH_LONG).show(); finish(); } else { - showErrorAndRestart(R.string.common_error, R.string.pass_code_enter_pass_code, View.INVISIBLE); - /// TODO better error message + showErrorAndRestart(R.string.pass_code_wrong, R.string.pass_code_enter_pass_code, + View.INVISIBLE); } } else if (ACTION_ENABLE.equals(getIntent().getAction())) { @@ -441,19 +334,21 @@ public class PassCodeActivity extends SherlockFragmentActivity { } } - - private void showErrorAndRestart(int errorMessage, int headerMessage, int explanationVisibility) { + + private void showErrorAndRestart(int errorMessage, int headerMessage, + int explanationVisibility) { Arrays.fill(mPassCodeDigits, null); CharSequence errorSeq = getString(errorMessage); Toast.makeText(this, errorSeq, Toast.LENGTH_LONG).show(); mPassCodeHdr.setText(headerMessage); // TODO check if really needed - mPassCodeHdrExplanation.setVisibility(explanationVisibility); // TODO check if really needed + mPassCodeHdrExplanation.setVisibility(explanationVisibility); // TODO check if really needed clearBoxes(); } /** - * Ask to the user for retyping the pass code just entered before saving it as the current pass code. + * Ask to the user for retyping the pass code just entered before saving it as the current pass + * code. */ protected void requestPassCodeConfirmation(){ clearBoxes(); @@ -477,50 +372,44 @@ public class PassCodeActivity extends SherlockFragmentActivity { savedPassCodeDigits[2] = appPrefs.getString("PrefPinCode3", null); savedPassCodeDigits[3] = appPrefs.getString("PrefPinCode4", null); - return ( - mPassCodeDigits[0].equals(savedPassCodeDigits[0]) && - mPassCodeDigits[1].equals(savedPassCodeDigits[0]) && - mPassCodeDigits[2].equals(savedPassCodeDigits[0]) && - mPassCodeDigits[3].equals(savedPassCodeDigits[0]) - ); + boolean result = true; + for (int i = 0; i < mPassCodeDigits.length && result; i++) { + result = result && (mPassCodeDigits[i] != null) && + mPassCodeDigits[i].equals(savedPassCodeDigits[i]); + } + return result; } /** - * Compares pass code retyped by the user with the value entered just before. + * Compares pass code retyped by the user in the input fields with the value entered just + * before. * * @return 'True' if retyped pass code equals to the entered before. */ protected boolean confirmPassCode(){ mConfirmingPassCode = false; - String retypedPassCodeDigits[] = new String[4]; - retypedPassCodeDigits[0] = mText0.getText().toString(); - retypedPassCodeDigits[1] = mText1.getText().toString(); - retypedPassCodeDigits[2] = mText2.getText().toString(); - retypedPassCodeDigits[3] = mText3.getText().toString(); - - return ( - mPassCodeDigits[0].equals(retypedPassCodeDigits[0]) && - mPassCodeDigits[1].equals(retypedPassCodeDigits[0]) && - mPassCodeDigits[2].equals(retypedPassCodeDigits[0]) && - mPassCodeDigits[3].equals(retypedPassCodeDigits[0]) - ); + boolean result = true; + for (int i = 0; i < mPassCodeEditTexts.length && result; i++) { + result = result && + ((mPassCodeEditTexts[i].getText().toString()).equals(mPassCodeDigits[i])); + } + return result; } /** * Sets the input fields to empty strings and puts the focus on the first one. */ protected void clearBoxes(){ - mText0.setText(""); - mText1.setText(""); - mText2.setText(""); - mText3.setText(""); - mText0.requestFocus(); + for (int i=0; i < mPassCodeEditTexts.length; i++) { + mPassCodeEditTexts[i].setText(""); + } + mPassCodeEditTexts[0].requestFocus(); } /** - * Overrides click on the BACK arrow to correctly cancel ACTION_ENABLE or ACTION_DISABLE, while preventing - * than ACTION_REQUEST may be worked around. + * Overrides click on the BACK arrow to correctly cancel ACTION_ENABLE or ACTION_DISABLE, while + * preventing than ACTION_REQUEST may be worked around. * * @param keyCode Key code of the key that triggered the down event. * @param event Event triggered. @@ -529,7 +418,8 @@ public class PassCodeActivity extends SherlockFragmentActivity { @Override public boolean onKeyDown(int keyCode, KeyEvent event){ if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount()== 0){ - if (ACTION_ENABLE.equals(getIntent().getAction()) || ACTION_DISABLE.equals(getIntent().getAction())) { + if (ACTION_ENABLE.equals(getIntent().getAction()) || + ACTION_DISABLE.equals(getIntent().getAction())) { revertActionAndExit(); } return true; @@ -548,7 +438,8 @@ public class PassCodeActivity extends SherlockFragmentActivity { appPrefs.putString("PrefPinCode2", mPassCodeDigits[1]); appPrefs.putString("PrefPinCode3", mPassCodeDigits[2]); appPrefs.putString("PrefPinCode4", mPassCodeDigits[3]); - appPrefs.putBoolean("set_pincode", true); /// TODO remove; unnecessary, Preferences did it before entering here + appPrefs.putBoolean("set_pincode", true); /// TODO remove; unnecessary, + // Preferences did it before entering here appPrefs.commit(); Toast.makeText(this, R.string.pass_code_stored, Toast.LENGTH_LONG).show(); @@ -568,10 +459,86 @@ public class PassCodeActivity extends SherlockFragmentActivity { boolean state = appPrefs.getBoolean("set_pincode", false); appPrefsE.putBoolean("set_pincode", !state); - // TODO WIP: this is reverting the value of the preference because it was changed BEFORE entering + // TODO WIP: this is reverting the value of the preference because it was changed BEFORE + // entering // TODO in this activity; was the PreferenceCheckBox in the caller who did it appPrefsE.commit(); finish(); } + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(PassCodeActivity.KEY_CONFIRMING_PASSCODE, mConfirmingPassCode); + outState.putStringArray(PassCodeActivity.KEY_PASSCODE_DIGITS, mPassCodeDigits); + } + + + private class PassCodeDigitTextWatcher implements TextWatcher { + + private int mIndex = -1; + private boolean mLastOne = false; + + /** + * Constructor + * + * @param index Position in the pass code of the input field that will be bound to + * this watcher. + * @param lastOne 'True' means that watcher corresponds to the last position of the + * pass code. + */ + public PassCodeDigitTextWatcher(int index, boolean lastOne) { + mIndex = index; + mLastOne = lastOne; + if (mIndex < 0) { + throw new IllegalArgumentException( + "Invalid index in " + PassCodeDigitTextWatcher.class.getSimpleName() + + " constructor" + ); + } + } + + private int next() { + return mLastOne ? 0 : mIndex + 1; + } + + /** + * Performs several actions when the user types a digit in an input field: + * - saves the input digit to the state of the activity; this will allow retyping the + * pass code to confirm it. + * - moves the focus automatically to the next field + * - for the last field, triggers the processing of the full pass code + * + * @param s + */ + @Override + public void afterTextChanged(Editable s) { + if (s.length() > 0) { + if (!mConfirmingPassCode) { + mPassCodeDigits[mIndex] = mPassCodeEditTexts[mIndex].getText().toString(); + } + mPassCodeEditTexts[next()].requestFocus(); + + if (mLastOne) { + processFullPassCode(); + } + + } else { + Log_OC.d(TAG, "Text box " + mIndex + " was cleaned"); + } + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + // nothing to do + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + // nothing to do + } + + } + + }