package com.geoloqi.ui;
import java.util.regex.Pattern;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.geoloqi.mapattack.R;
import com.geoloqi.interfaces.GeoloqiConstants;
import com.geoloqi.interfaces.RPCException;
import com.geoloqi.rpc.MapAttackClient;
public class SignInActivity extends Activity implements OnClickListener {
public static final String TAG = "SignInActivity";
/** Validates an email address. */
public static final Pattern EMAIL_PATTERN = Pattern.compile("^[\\w\\.-]+@([\\w\\-]+\\.)+[a-z]{2,4}$",
Pattern.CASE_INSENSITIVE);
/** The id of the game to launch when finished. */
private String mGameId;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sign_in_activity);
final Bundle extras = getIntent().getExtras();
if (extras != null) {
mGameId = extras.getString(MapAttackActivity.PARAM_GAME_ID);
}
// Load saved user information
final SharedPreferences sharedPreferences = getSharedPreferences(
GeoloqiConstants.PREFERENCES_FILE, Context.MODE_PRIVATE);
if (sharedPreferences != null) {
final TextView initialsView = (TextView) findViewById(R.id.initials);
final TextView emailView = (TextView) findViewById(R.id.email);
initialsView.setText(sharedPreferences.getString("initials", ""));
emailView.setText(sharedPreferences.getString("email", ""));
}
// Listen for form submission
findViewById(R.id.submit_button).setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.submit_button:
final EditText initialsField = (EditText) findViewById(R.id.initials);
final EditText emailField = (EditText) findViewById(R.id.email);
final String initials = initialsField.getText().toString();
final String email = emailField.getText().toString().toLowerCase();
// Validate input
if (initials.length() == 2) {
if (EMAIL_PATTERN.matcher(email).matches()) {
new CreateAnonymousAccountTask(this, initials, email).execute();
} else {
Toast.makeText(this, R.string.error_email,
Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(this, R.string.error_initials,
Toast.LENGTH_LONG).show();
}
}
}
/** Stub */
private void finishLogin(boolean result) {
if (result) {
if (!TextUtils.isEmpty(mGameId)) {
// Launch the map attack activity
Intent intent = new Intent(this, MapAttackActivity.class);
intent.putExtra(MapAttackActivity.PARAM_GAME_ID, mGameId);
startActivity(intent);
} else {
Log.e(TAG, "Got an empty game ID when trying to finish login!");
Toast.makeText(this, R.string.error_invalid_game_id, Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(this, R.string.error_join_game, Toast.LENGTH_LONG).show();
}
// Finish the login activity
finish();
}
/** TODO: Move this to an external class file. */
private static class CreateAnonymousAccountTask extends AsyncTask<String, Void, Boolean> {
private final ProgressDialog mProgressDialog;
private final Context mContext;
private final String mInitials;
private final String mEmail;
public CreateAnonymousAccountTask(final Context context, final String initials,
final String email) {
mProgressDialog = new ProgressDialog(context);
mProgressDialog.setTitle(null);
mProgressDialog.setMessage(context.getString(R.string.sign_in_loading_text));
mContext = context;
mInitials = initials;
mEmail = email;
}
@Override
public void onPreExecute() {
mProgressDialog.show();
}
@Override
protected Boolean doInBackground(String... params) {
// TODO: Use the default shared preferences here:
//PreferenceManager.getDefaultSharedPreferences(this)
Editor prefs = (Editor) mContext.getSharedPreferences(
GeoloqiConstants.PREFERENCES_FILE, Context.MODE_PRIVATE).edit();
prefs.putString("initials", mInitials);
prefs.putString("email", mEmail);
prefs.commit();
try {
// Start login.
final MapAttackClient client = MapAttackClient.getApplicationClient(mContext);
client.createAnonymousAccount();
} catch (RPCException e) {
Log.e(TAG, "Got an RPCException when trying to create an anonymous account.", e);
return false;
}
return true;
}
@Override
public void onPostExecute(Boolean result) {
mProgressDialog.dismiss();
try {
((SignInActivity) mContext).finishLogin(result);
} catch (ClassCastException e) {
Log.w(TAG, "Got a ClassCastException when trying to finish login!", e);
}
}
}
}