package com.dozuki.ifixit.ui.auth;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.dozuki.ifixit.App;
import com.dozuki.ifixit.R;
import com.dozuki.ifixit.model.user.User;
import com.dozuki.ifixit.ui.BaseDialogFragment;
import com.dozuki.ifixit.util.api.ApiCall;
import com.dozuki.ifixit.util.api.ApiError;
import com.dozuki.ifixit.util.api.ApiEvent;
import com.dozuki.ifixit.util.api.Api;
import com.google.analytics.tracking.android.Fields;
import com.google.analytics.tracking.android.MapBuilder;
import com.google.analytics.tracking.android.Tracker;
import com.squareup.otto.Subscribe;
public class RegisterFragment extends BaseDialogFragment implements OnClickListener {
private Button mRegister;
private Button mCancelRegister;
private EditText mEmail;
private EditText mPassword;
private EditText mConfirmPassword;
private EditText mName;
private TextView mErrorText;
private TextView mTermsAgreeText;
private CheckBox mTermsAgreeCheckBox;
private ProgressBar mLoadingSpinner;
@Subscribe
public void onRegister(ApiEvent.Register event) {
if (!event.hasError()) {
User user = event.getResult();
((App)getActivity().getApplication()).login(user, getEmail(),
getPassword(), true);
dismiss();
} else {
enable(true);
ApiError error = event.getError();
if (error.mType == ApiError.Type.CONNECTION ||
error.mType == ApiError.Type.PARSE) {
Api.getErrorDialog(getActivity(), event).show();
}
mLoadingSpinner.setVisibility(View.GONE);
mEmail.setVisibility(View.VISIBLE);
mPassword.setVisibility(View.VISIBLE);
mConfirmPassword.setVisibility(View.VISIBLE);
mName.setVisibility(View.VISIBLE);
mTermsAgreeText.setVisibility(View.VISIBLE);
mTermsAgreeCheckBox.setVisibility(View.VISIBLE);
mErrorText.setVisibility(View.VISIBLE);
mErrorText.setText(error.mMessage);
}
}
public static RegisterFragment newInstance() {
RegisterFragment frag = new RegisterFragment();
frag.setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog);
return frag;
}
/**
* Required for restoring fragments
*/
public RegisterFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.register_fragment, container, false);
mEmail = (EditText)view.findViewById(R.id.edit_login_id);
mPassword = (EditText)view.findViewById(R.id.edit_password);
mConfirmPassword = (EditText)view.findViewById(R.id.edit_confirm_password);
// Password fields default to a courier typeface (very annoying) and
// setting the font-family in xml does nothing, so we have to set it
// explicitly here
mPassword.setTypeface(Typeface.DEFAULT);
mConfirmPassword.setTypeface(Typeface.DEFAULT);
mName = (EditText)view.findViewById(R.id.edit_login_username);
mRegister = (Button)view.findViewById(R.id.register_button);
mCancelRegister = (Button)view.findViewById(R.id.cancel_register_button);
mErrorText = (TextView)view.findViewById(R.id.login_error_text);
mErrorText.setVisibility(View.GONE);
mTermsAgreeCheckBox = (CheckBox)view.findViewById(R.id.login_agreement_terms_checkbox);
mTermsAgreeText = (TextView)view.findViewById(R.id.login_agreement_terms_textview);
if (App.get().getSite().isIfixit()) {
mTermsAgreeText.setText(R.string.register_agreement);
mTermsAgreeText.setMovementMethod(LinkMovementMethod.getInstance());
} else {
mTermsAgreeCheckBox.setVisibility(View.GONE);
mTermsAgreeText.setVisibility(View.GONE);
}
mLoadingSpinner = (ProgressBar)view.findViewById(R.id.login_loading_bar);
mLoadingSpinner.setVisibility(View.GONE);
mRegister.setOnClickListener(this);
mCancelRegister.setOnClickListener(this);
return view;
}
@Override
public void onStart() {
super.onStart();
App.sendScreenView("/register");
}
private void showKeyboard() {
InputMethodManager in = (InputMethodManager)getActivity()
.getSystemService(Context.INPUT_METHOD_SERVICE);
in.toggleSoftInput(InputMethodManager.SHOW_FORCED,
InputMethodManager.HIDE_IMPLICIT_ONLY);
}
private void enable(boolean enabled) {
mEmail.setEnabled(enabled);
mPassword.setEnabled(enabled);
mConfirmPassword.setEnabled(enabled);
mRegister.setEnabled(enabled);
mCancelRegister.setEnabled(enabled);
mName.setEnabled(enabled);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.register_button:
String email = getEmail();
String name = mName.getText().toString();
String password = getPassword();
String confirmPassword = mConfirmPassword.getText().toString();
if (password.equals(confirmPassword) && email.length() > 0 &&
name.length() > 0 && (!App.get().getSite().isIfixit() || mTermsAgreeCheckBox.isChecked())) {
enable(false);
mEmail.setVisibility(View.GONE);
mPassword.setVisibility(View.GONE);
mConfirmPassword.setVisibility(View.GONE);
mName.setVisibility(View.GONE);
mTermsAgreeText.setVisibility(View.GONE);
mTermsAgreeCheckBox.setVisibility(View.GONE);
mErrorText.setVisibility(View.GONE);
mLoadingSpinner.setVisibility(View.VISIBLE);
Api.call(getActivity(),
ApiCall.register(email, password, name));
} else {
if (email.length() <= 0) {
mErrorText.setText(R.string.empty_field_error);
mEmail.requestFocus();
showKeyboard();
} else if (password.length() <= 0) {
mErrorText.setText(R.string.empty_field_error);
mPassword.requestFocus();
showKeyboard();
} else if (name.length() <= 0) {
mErrorText.setText(R.string.empty_field_error);
mName.requestFocus();
showKeyboard();
} else if (!password.equals(confirmPassword)) {
mErrorText.setText(R.string.passwords_do_not_match_error);
} else if (!mTermsAgreeCheckBox.isChecked()) {
mErrorText.setText(R.string.terms_unchecked_error);
mConfirmPassword.requestFocus();
showKeyboard();
}
mErrorText.setVisibility(View.VISIBLE);
}
break;
case R.id.cancel_register_button:
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
// Go back to login.
fragmentManager.beginTransaction()
.remove(this)
.add(LoginFragment.newInstance(), null)
.commit();
break;
}
}
private String getEmail() {
return mEmail.getText().toString();
}
private String getPassword() {
return mPassword.getText().toString();
}
@Override
public void onCancel(DialogInterface dialog) {
App.get().cancelLogin();
}
}