package com.noshufou.android.su; import android.app.Activity; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import com.noshufou.android.su.util.Util; public class PinActivity extends Activity implements OnClickListener { // private static final String TAG = "Su.PinActivity"; public static final int MODE_NEW = 1; public static final int MODE_CHANGE = 2; public static final int MODE_CHECK = 3; public static final int MODE_SECRET_CODE = 4; public static final String EXTRA_MODE = "mode"; public static final String EXTRA_ATTEMPTS_ALLOWED = "attempts_allowed"; public static final String EXTRA_PIN = "pin"; public static final String EXTRA_SECRET_CODE = "secret_code"; private String mPinConfirm = ""; private int mAttemptsAllowed = 3; private int mAttempts = 0; private int mMode = 0; private EditText mPinText; private int mOriginalHintTextColor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pin); mPinText = (EditText) findViewById(R.id.pin); mOriginalHintTextColor = mPinText.getCurrentHintTextColor(); ((Button)findViewById(R.id.pin_0)).setOnClickListener(this); ((Button)findViewById(R.id.pin_1)).setOnClickListener(this); ((Button)findViewById(R.id.pin_2)).setOnClickListener(this); ((Button)findViewById(R.id.pin_3)).setOnClickListener(this); ((Button)findViewById(R.id.pin_4)).setOnClickListener(this); ((Button)findViewById(R.id.pin_5)).setOnClickListener(this); ((Button)findViewById(R.id.pin_6)).setOnClickListener(this); ((Button)findViewById(R.id.pin_7)).setOnClickListener(this); ((Button)findViewById(R.id.pin_8)).setOnClickListener(this); ((Button)findViewById(R.id.pin_9)).setOnClickListener(this); Button okButton = (Button) findViewById(R.id.pin_ok); okButton.setOnClickListener(this); okButton.setText(R.string.ok); Button cancelButton = (Button) findViewById(R.id.pin_cancel); cancelButton.setOnClickListener(this); cancelButton.setText(R.string.cancel); mMode = getIntent().getIntExtra(EXTRA_MODE, 0); switch (mMode) { case MODE_NEW: mPinText.setHint(R.string.pin_new_pin); break; case MODE_CHANGE: case MODE_CHECK: mPinText.setHint(R.string.pin_enter_pin); break; case MODE_SECRET_CODE: mPinText.setVisibility(View.GONE); mPinText = (EditText) findViewById(R.id.secret_code); findViewById(R.id.secret_code_layout).setVisibility(View.VISIBLE); break; default: throw new IllegalArgumentException("You must specify an operating mode"); } if (getIntent().hasExtra(EXTRA_ATTEMPTS_ALLOWED)) { mAttemptsAllowed = getIntent().getIntExtra(EXTRA_ATTEMPTS_ALLOWED, 0); } } @Override public void onClick(View view) { switch (view.getId()) { case R.id.pin_0: mPinText.append("0"); break; case R.id.pin_1: mPinText.append("1"); break; case R.id.pin_2: mPinText.append("2"); break; case R.id.pin_3: mPinText.append("3"); break; case R.id.pin_4: mPinText.append("4"); break; case R.id.pin_5: mPinText.append("5"); break; case R.id.pin_6: mPinText.append("6"); break; case R.id.pin_7: mPinText.append("7"); break; case R.id.pin_8: mPinText.append("8"); break; case R.id.pin_9: mPinText.append("9"); break; case R.id.pin_ok: onOk(); break; case R.id.pin_cancel: setResult(RESULT_CANCELED); finish(); break; } } private void onOk() { if (mPinText.getText().equals("")) { return; } switch (mMode) { case MODE_NEW: String enteredPin = mPinText.getText().toString(); if (mPinConfirm.equals("")) { mPinConfirm = mPinText.getText().toString(); mPinText.setText(""); mPinText.setHint(R.string.pin_confirm_pin); mPinText.setHintTextColor(mOriginalHintTextColor); } else if (enteredPin.equals(mPinConfirm)) { Intent intent = new Intent(); intent.putExtra(EXTRA_PIN, Util.getHash(enteredPin)); setResult(RESULT_OK, intent); finish(); } else { mPinConfirm = ""; mPinText.setText(""); mPinText.setHint(R.string.pin_mismatch); mPinText.setHintTextColor(Color.RED); } break; case MODE_CHANGE: case MODE_CHECK: if (Util.checkPin(this, mPinText.getText().toString())) { if (mMode == MODE_CHECK) { setResult(RESULT_OK); finish(); } else { mPinText.setText(""); mPinText.setHint(R.string.pin_new_pin); mPinText.setHintTextColor(mOriginalHintTextColor); mMode = MODE_NEW; } } else { if (mAttempts + 1 < mAttemptsAllowed) { mAttempts++; mPinText.setText(""); mPinText.setHint(getResources() .getQuantityString(R.plurals.pin_incorrect_try, mAttemptsAllowed - mAttempts, mAttemptsAllowed - mAttempts)); mPinText.setHintTextColor(Color.RED); } else { setResult(RESULT_CANCELED); finish(); } } break; case MODE_SECRET_CODE: Intent intent = new Intent(); intent.putExtra(EXTRA_SECRET_CODE, mPinText.getText()); setResult(RESULT_OK, intent); finish(); } } }