package com.bocai;
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.ViewFlipper;
import org.json.JSONException;
import org.json.JSONObject;
import com.bocai.net.AsyncHTTPRequest;
import com.bocai.net.AsyncHTTPResponseHandler;
import com.bocai.util.RestConstants;
import com.bocai.util.ToastFire;
import com.bocai.model.User;
import com.bocai.util.Macros;
import com.bocai.R;
public class AuthenticationActivity extends Activity implements AsyncHTTPResponseHandler,HomeActivity.ToolbarItemSource
{
public static final String LOAD_SPOT_ON_COMPLETE = "loadSpot";
private static final String LOG_TAG = "AuthActivity";
static final int MODE_JOIN = 1;
static final int MODE_LOGIN = 0;
public static final String RETURN_AUTH_USER = "returnUser";
private static final String EMAIL_REG_EXP = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
ViewFlipper flipper;
final Handler handler;
final Runnable hideProgress;
EditText joinConfirmField;
EditText joinEmailField;
EditText joinPassField;
boolean loadSpotControllerOnComplete;
EditText loginEmailField;
EditText loginPassField;
int mode = 0;
android.widget.RadioGroup.OnCheckedChangeListener modeCallback;
ProgressDialog progressDialog;
boolean returnAuthenticatedUser;
final Runnable showPreviousActivity;
final Runnable showSpotActivity;
Button submitJoinButton;
Button submitLoginButton;
android.widget.TextView.OnEditorActionListener textFieldActionListener;
public AuthenticationActivity()
{
loadSpotControllerOnComplete = false;
returnAuthenticatedUser = false;
mode = 0;
handler = new Handler();
showSpotActivity = new Runnable() {
public void run()
{
Log.w(LOG_TAG, "showSpotActivity");
HomeActivity homeactivity = (HomeActivity)getParent();
homeactivity.popNavigationStack();
homeactivity.showSpotActivity();
}
};
hideProgress = new Runnable() {
public void run()
{
if(progressDialog == null)
{
return;
} else
{
progressDialog.dismiss();
return;
}
}
};
showPreviousActivity = new Runnable() {
public void run()
{
((HomeActivity)getParent()).popNavigationStack();
Log.w("Auth", "showPreviousActivity");
}
};
modeCallback = new android.widget.RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
flipper.setDisplayedChild(BUTTON_ID_TO_MODE(checkedId));
}
};
textFieldActionListener = new android.widget.TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView view, int actionId,KeyEvent event) {
if(event != null){
if(event.getAction() == KeyEvent.KEYCODE_SOFT_LEFT){
if(mode ==1 && view == loginPassField){
submitForm();
}
return true;
}
}
return false;
}
};
}
private int BUTTON_ID_TO_MODE(int paramInt)
{
if(paramInt == 2131230737){
mode = 1;
}else if(paramInt == 2131230738){
mode = 0;
}else{
mode = 1;
}
return mode;
}
void configureAnimations()
{
Animation inAnimation = AnimationUtils.loadAnimation(this, R.anim.slide_left_in);
inAnimation.setDuration(200L);
flipper.setInAnimation(inAnimation);
Animation outAnimation = AnimationUtils.loadAnimation(this, R.anim.slide_left_out);
outAnimation.setDuration(100L);
flipper.setOutAnimation(outAnimation);
}
void displayErrors(JSONObject jsonObject){
final String error = jsonObject.optString("errorMsg");
Runnable runnable = new Runnable()
{
public void run()
{
android.app.AlertDialog.Builder builder = (new android.app.AlertDialog.Builder(AuthenticationActivity.this)).setTitle(getString(R.string.whoops));
builder.setMessage(error).setPositiveButton(getString(R.string.try_again), null).show();
}
};
handler.post(runnable);
}
void doFinish()
{
if(loadSpotControllerOnComplete)
{
handler.post(showSpotActivity);
} else{
if(!returnAuthenticatedUser);
handler.post(showPreviousActivity);
}
}
void hideKeyboard()
{
View view = getCurrentFocus();
if(view == null)
view = getWindow().getDecorView();
if(view == null)
{
return;
} else
{
InputMethodManager inputMethodManager = (InputMethodManager)getSystemService("input_method");
android.os.IBinder ibinder = view.getWindowToken();
inputMethodManager.hideSoftInputFromWindow(ibinder, 0);
return;
}
}
protected void onCreate(Bundle bundle)
{
super.onCreate(bundle);
setContentView(R.layout.auth);
joinEmailField = (EditText)findViewById(R.id.edit_email);
joinPassField = (EditText)findViewById(R.id.edit_password);
joinConfirmField = (EditText)findViewById(R.id.edit_confirm);
loginEmailField = (EditText)findViewById(R.id.edit_login_email);
loginPassField = (EditText)findViewById(R.id.edit_login_password);
submitJoinButton = (Button)findViewById(R.id.btn_submit_join);
submitLoginButton = (Button)findViewById(R.id.btn_submit_login);
flipper = (ViewFlipper)findViewById(R.id.flipper);
joinConfirmField.setOnEditorActionListener(textFieldActionListener);
loginPassField.setOnEditorActionListener(textFieldActionListener);
android.view.View.OnClickListener joinListener = new android.view.View.OnClickListener() {
public void onClick(View view)
{
submitForm();
}
};
submitJoinButton.setOnClickListener(joinListener);
android.view.View.OnClickListener loginListener = new android.view.View.OnClickListener() {
public void onClick(View view)
{
submitForm();
}
};
submitLoginButton.setOnClickListener(loginListener);
RadioGroup radiogroup = (RadioGroup)findViewById(R.id.grp_login_join);
radiogroup.setOnCheckedChangeListener(modeCallback);
configureAnimations();
}
@Override
//Called when a key was pressed down and not handled by any of the views inside of the activity.
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
return false;
}
return super.onKeyDown(keyCode, event);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
protected void onPause()
{
if(progressDialog != null)
progressDialog.dismiss();
super.onPause();
}
protected void onResume()
{
super.onResume();
loadSpotControllerOnComplete = false;
returnAuthenticatedUser = false;
Bundle bundle = getIntent().getExtras();
if(bundle != null)
{
loadSpotControllerOnComplete = bundle.getBoolean("loadSpot");
returnAuthenticatedUser = bundle.getBoolean("returnUser");
}
}
void showProgress(String message)
{
if(progressDialog == null)
{
progressDialog = new ProgressDialog(this);
progressDialog.setIndeterminate(true);
}
progressDialog.setMessage(message);
progressDialog.show();
}
void submitForm()
{
hideKeyboard();
String url;
AsyncHTTPRequest asyncHttpRequest;
if(mode == MODE_LOGIN){
url = RestConstants.LOGIN_URL;
}else{
url = RestConstants.JOIN_URL;
}
asyncHttpRequest = new AsyncHTTPRequest(url);
asyncHttpRequest.setTimeout(20000);
asyncHttpRequest.responseHandler = this;
asyncHttpRequest.requestMethod = AsyncHTTPRequest.POST_METHOD;
if(mode == MODE_LOGIN)
{
String email = loginEmailField.getText().toString();
if(email == null || !email.matches(EMAIL_REG_EXP)){
ToastFire.fire(this, getString(R.string.invalid_email));
return;
}
asyncHttpRequest.addPostParam("email", email);
String password = loginPassField.getText().toString();
if(password == null || password.trim().length() < 3){
ToastFire.fire(this, getString(R.string.pass_length));
return;
}
asyncHttpRequest.addPostParam("password", password);
asyncHttpRequest.addPostParam("remeberMe", "true");
String login_progress = getString(R.string.login_progress);
showProgress(login_progress);
} else
{
String email = joinEmailField.getText().toString();
if(email == null || !email.matches(EMAIL_REG_EXP)){
ToastFire.fire(this, getString(R.string.invalid_email));
return;
}
asyncHttpRequest.addPostParam("email", email);
String password = joinPassField.getText().toString();
if(password == null || password.trim().length() < 3){
ToastFire.fire(this, getString(R.string.pass_length));
return;
}
asyncHttpRequest.addPostParam("password", password);
String password_confirm = joinConfirmField.getText().toString();
if(!password_confirm.equals(password)){
ToastFire.fire(this, getString(R.string.pass_ne));
return;
}
asyncHttpRequest.addPostParam("passConfirm", password_confirm);
String join_progress = getString(R.string.join_progress);
showProgress(join_progress);
}
asyncHttpRequest.execute();
}
void saveAccount(JSONObject jsonObject){
String email = jsonObject.optString("email");
Macros.FS_DEFAULT_SET_STRING("email", email);
String password;
User user;
if(mode == 0)
password = joinPassField.getText().toString();
else
password = loginPassField.getText().toString();
Macros.FS_DEFAULT_SET_STRING("password", password);
user = new User(jsonObject);
User.archiveUser(user);
if(returnAuthenticatedUser)
{
doFinish();
return;
}
if(loadSpotControllerOnComplete)
{
handler.post(showSpotActivity);
} else
{
doFinish();
return;
}
}
@Override
public void handleError(String errorMsg, InputStream stream, long length)
throws IOException {
final String error = errorMsg;
Runnable runnable = new Runnable() {
public void run()
{
if(progressDialog != null)
progressDialog.dismiss();
android.app.AlertDialog.Builder builder = (new android.app.AlertDialog.Builder(AuthenticationActivity.this)).setTitle(R.string.network_error);
builder.setMessage(error).setPositiveButton(R.string.try_again, null).show();
}
};
handler.post(runnable);
}
@Override
public void handleResponse(AsyncHTTPRequest asyncHttpRequest,
InputStream stream, long length) throws IOException {
handler.post(hideProgress);
String s = AsyncHTTPRequest.toString(stream, length);
JSONObject jsonObject;
try {
jsonObject = new JSONObject(s);
jsonObject.put("cookies", asyncHttpRequest.responseCookies);
boolean success = jsonObject.getBoolean("success");
if(success){
saveAccount(jsonObject);
}else{
displayErrors(jsonObject);
}
} catch (JSONException e) {
StringBuilder stringBuilder = (new StringBuilder()).append("Error parsing authentication response: ");
stringBuilder.append(e.getLocalizedMessage());
Log.e("AuthActivity", stringBuilder.toString(), e);
e.printStackTrace();
}
}
@Override
public View[] getToolbarItems() {
return null;
}
}