package com.mygeopay.wallet.ui;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.mygeopay.wallet.Constants;
import com.mygeopay.wallet.R;
import com.mygeopay.wallet.util.Fonts;
import com.mygeopay.wallet.util.Keyboard;
import com.mygeopay.wallet.util.PasswordQualityChecker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Fragment that sets a password
*/
public class SetPasswordFragment extends Fragment {
private static final Logger log = LoggerFactory.getLogger(SetPasswordFragment.class);
private Listener mListener;
private boolean isPasswordGood;
private boolean isPasswordsMatch;
private PasswordQualityChecker passwordQualityChecker;
private EditText password1;
private EditText password2;
private TextView errorPassword;
private TextView errorPasswordsMismatch;
public static SetPasswordFragment newInstance(Bundle args) {
SetPasswordFragment fragment = new SetPasswordFragment();
fragment.setArguments(args);
return fragment;
}
public SetPasswordFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
passwordQualityChecker = new PasswordQualityChecker(getActivity());
isPasswordGood = false;
isPasswordsMatch = false;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_set_password, container, false);
Fonts.setTypeface(view.findViewById(R.id.key_icon), Fonts.Font.COINOMI_FONT_ICONS);
errorPassword = (TextView) view.findViewById(R.id.password_error);
errorPasswordsMismatch = (TextView) view.findViewById(R.id.passwords_mismatch);
clearError(errorPassword);
clearError(errorPasswordsMismatch);
password1 = (EditText) view.findViewById(R.id.password1);
password2 = (EditText) view.findViewById(R.id.password2);
password1.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View textView, boolean hasFocus) {
if (hasFocus) {
clearError(errorPassword);
} else {
checkPasswordQuality();
}
}
});
password2.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View textView, boolean hasFocus) {
if (hasFocus) {
clearError(errorPasswordsMismatch);
} else {
checkPasswordsMatch();
}
}
});
// Next button
Button finishButton = (Button) view.findViewById(R.id.button_next);
finishButton.setOnClickListener(getOnFinishListener());
finishButton.setImeOptions(EditorInfo.IME_ACTION_DONE);
// Skip link
view.findViewById(R.id.password_skip).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DialogFragment dialog = SkipPasswordDialogFragment.newInstance(getArguments());
dialog.show(getFragmentManager(), null);
}
});
return view;
}
private void checkPasswordQuality() {
String pass = password1.getText().toString();
isPasswordGood = false;
try {
passwordQualityChecker.checkPassword(pass);
isPasswordGood = true;
clearError(errorPassword);
} catch (PasswordQualityChecker.PasswordTooCommonException e1) {
log.info("Entered a too common password {}", pass);
setError(errorPassword, R.string.password_too_common_error, pass);
} catch (PasswordQualityChecker.PasswordTooShortException e2) {
log.info("Entered a too short password");
setError(errorPassword, R.string.password_too_short_error,
passwordQualityChecker.getMinPasswordLength());
}
log.info("Password good = {}", isPasswordGood);
}
private void checkPasswordsMatch() {
String pass1 = password1.getText().toString();
String pass2 = password2.getText().toString();
isPasswordsMatch = pass1.equals(pass2);
if (!isPasswordsMatch) showError(errorPasswordsMismatch);
log.info("Passwords match = {}", isPasswordsMatch);
}
private View.OnClickListener getOnFinishListener() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
Keyboard.hideKeyboard(getActivity());
checkPasswordQuality();
checkPasswordsMatch();
if (isPasswordGood && isPasswordsMatch) {
Bundle args = getArguments();
args.putString(Constants.ARG_PASSWORD, password1.getText().toString());
mListener.onPasswordSet(args);
} else {
Toast.makeText(SetPasswordFragment.this.getActivity(),
R.string.password_error, Toast.LENGTH_LONG).show();
}
}
};
}
public static class SkipPasswordDialogFragment extends DialogFragment {
private Listener mListener;
public static SkipPasswordDialogFragment newInstance(Bundle args) {
SkipPasswordDialogFragment dialog = new SkipPasswordDialogFragment();
dialog.setArguments(args);
return dialog;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (Listener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement " + Listener.class);
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
.setMessage(getResources().getString(R.string.password_skip_warn))
.setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
Keyboard.hideKeyboard(getActivity());
getArguments().putString(Constants.ARG_PASSWORD, "");
mListener.onPasswordSet(getArguments());
}
})
.setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
}
});
return builder.create();
}
}
private void setError(TextView errorView, int messageId, Object... formatArgs) {
setError(errorView, getResources().getString(messageId, formatArgs));
}
private void setError(TextView errorView, String message) {
errorView.setText(message);
showError(errorView);
}
private void showError(TextView errorView) {
errorView.setVisibility(View.VISIBLE);
}
private void clearError(TextView errorView) {
errorView.setVisibility(View.GONE);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (Listener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement " + Listener.class);
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface Listener {
void onPasswordSet(Bundle args);
}
}