package com.venmo.android.pin;
import android.view.View;
import com.venmo.android.pin.view.PinputView;
import com.venmo.android.pin.view.PinputView.OnCommitListener;
import static android.preference.PreferenceManager.getDefaultSharedPreferences;
class VerifyPinViewController<T extends PinFragmentImplement> extends BaseViewController<T> {
private static final String KEY_INCORRECT_PIN_ATTEMPTS = "com.venmo.pin.incorrect_pin_attempts";
VerifyPinViewController(T f, View v) {
super(f, v);
}
@Override
void initUI() {
String verify = String.format(
mContext.getString(R.string.verify_n_digit_pin), mPinputView.getPinLen());
mHeaderText.setText(verify);
}
@Override
OnCommitListener provideListener() {
return new OnCommitListener() {
@Override
public void onPinCommit(PinputView view, final String submission) {
validate(submission);
}
};
}
protected void validate(final String submission) {
final Validator validator = getConfig().getValidator();
if (validator instanceof AsyncValidator) {
getOutAndInAnim(mPinputView, mProgressBar).start();
runAsync(new Runnable() {
@Override
public void run() {
try {
final boolean valid = validator.isValid(submission);
postToMain(new Runnable() {
@Override
public void run() {
handleAsyncValidation(valid);
}
});
} catch (Exception e) {
generalErrorAsync(mPinFragment.getString(R.string.async_save_error));
}
}
});
} else {
handleValidation(validator.isValid(submission));
}
}
private void handleValidation(boolean isValid) {
if (isValid) {
resetIncorrectPinCount();
mPinFragment.notifyValid();
} else {
incrementFailedAttempts();
mPinputView.showErrorAndClear();
}
}
private void handleAsyncValidation(boolean valid) {
handleValidation(valid);
if (!valid) {
resetPinputView();
}
}
private void resetIncorrectPinCount() {
getDefaultSharedPreferences(mContext).edit()
.putInt(KEY_INCORRECT_PIN_ATTEMPTS, 0)
.commit();
}
private void incrementFailedAttempts() {
int failedAttempts = getIncorrectPinAttempts() + 1;
int maxTries = getConfig().maxTries();
boolean attemptsDepleted = maxTries > 0 && failedAttempts >= maxTries;
getDefaultSharedPreferences(mContext).edit()
.putInt(KEY_INCORRECT_PIN_ATTEMPTS, attemptsDepleted ? 0 : failedAttempts)
.commit();
TryDepletionListener depletionListener = getConfig().tryDepletionListener();
if (attemptsDepleted && depletionListener != null) {
depletionListener.onTriesDepleted();
}
}
private int getIncorrectPinAttempts() {
return getDefaultSharedPreferences(mContext).getInt(KEY_INCORRECT_PIN_ATTEMPTS, 0);
}
}