//
// Copyright 2011 Thomas Gumprecht, Robert Jacob, Thomas Pieronczyk
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
package net.sourcewalker.garanbot.account;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sourcewalker.garanbot.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
/**
* This activity enables the user to create a new Garanbo account in case he
* does not have one yet.
*
* @author Xperimental
*/
public class RegisterActivity extends Activity implements OnClickListener {
private static final Pattern EMAIL_PATTERN = Pattern
.compile("^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$");
private static final int PASS = 0;
private static final int FAIL_USERNAME = 1;
private static final int FAIL_PASSWORD = 2;
private static final int FAIL_PASSWORD_CHECK = 4;
private static final int FAIL_NAME = 8;
private static final int FAIL_EMAIL = 16;
private static final Map<Integer, ErrorMessage> ERROR_MESSAGE_MAP;
static {
ERROR_MESSAGE_MAP = new HashMap<Integer, RegisterActivity.ErrorMessage>();
ERROR_MESSAGE_MAP.put(FAIL_USERNAME, new ErrorMessage(
R.id.register_username, R.string.register_username_error));
ERROR_MESSAGE_MAP.put(FAIL_PASSWORD, new ErrorMessage(
R.id.register_password, R.string.register_password_error));
ERROR_MESSAGE_MAP.put(FAIL_PASSWORD_CHECK, new ErrorMessage(
R.id.register_password_check,
R.string.register_passwordcheck_error));
ERROR_MESSAGE_MAP.put(FAIL_NAME, new ErrorMessage(R.id.register_name,
R.string.register_name_error));
ERROR_MESSAGE_MAP.put(FAIL_EMAIL, new ErrorMessage(R.id.register_email,
R.string.register_email_error));
}
private EditText usernameField;
private EditText passwordField;
private EditText passwordCheckField;
private EditText nameField;
private EditText emailField;
private Button cancelButton;
private Button registerButton;
/*
* (non-Javadoc)
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
usernameField = (EditText) findViewById(R.id.register_username);
passwordField = (EditText) findViewById(R.id.register_password);
passwordCheckField = (EditText) findViewById(R.id.register_password_check);
nameField = (EditText) findViewById(R.id.register_name);
emailField = (EditText) findViewById(R.id.register_email);
cancelButton = (Button) findViewById(R.id.register_cancel);
cancelButton.setOnClickListener(this);
registerButton = (Button) findViewById(R.id.register_ok);
registerButton.setOnClickListener(this);
updateUI(true, PASS);
}
/*
* (non-Javadoc)
* @see android.view.View.OnClickListener#onClick(android.view.View)
*/
@Override
public void onClick(final View v) {
switch (v.getId()) {
case R.id.register_cancel:
setResult(RESULT_CANCELED);
finish();
break;
case R.id.register_ok:
final int checkResult = checkInput();
if (checkResult == PASS) {
startRegisterUser();
} else {
updateUI(true, checkResult);
}
break;
default:
throw new IllegalArgumentException("Unknown view clicked: " + v);
}
}
/**
* Updates the controls enabled state and color.
*
* @param enabled
* True, if user can make inputs.
* @param checkResult
* Bitmask resturned by {@link #checkInput()} for coloring
* erroneous fields.
*/
private void updateUI(final boolean enabled, final int checkResult) {
usernameField.setEnabled(enabled);
passwordField.setEnabled(enabled);
passwordCheckField.setEnabled(enabled);
nameField.setEnabled(enabled);
emailField.setEnabled(enabled);
cancelButton.setEnabled(enabled);
registerButton.setEnabled(enabled);
for (Integer key : ERROR_MESSAGE_MAP.keySet()) {
final ErrorMessage msg = ERROR_MESSAGE_MAP.get(key);
final EditText view = (EditText) findViewById(msg.viewId);
if ((checkResult & key) > 0) {
view.setError(getString(msg.msgResId));
} else {
view.setError(null);
}
}
}
/**
* Checks the input for correctness.
*
* @return True, if the input can be submitted.
*/
private int checkInput() {
int result = PASS;
result += usernameField.getText().length() > 0 ? PASS : FAIL_USERNAME;
result += passwordField.getText().length() >= 8 ? PASS : FAIL_PASSWORD;
result += passwordField.getText().toString()
.equals(passwordCheckField.getText().toString()) ? PASS
: FAIL_PASSWORD_CHECK;
result += nameField.getText().length() > 0 ? PASS : FAIL_NAME;
result += RegisterActivity.checkEmail(emailField.getText().toString()) ? PASS
: FAIL_EMAIL;
return result;
}
/**
* Check if the text is a valid email address.
*
* @param text
* Text to check.
* @return True, if the text is an email address.
*/
private static boolean checkEmail(final String text) {
final Matcher matcher = EMAIL_PATTERN.matcher(text.toLowerCase(Locale
.getDefault()));
return matcher.matches();
}
/**
* Starts the process to register a user.
*/
private void startRegisterUser() {
// TODO Auto-generated method stub
}
private static class ErrorMessage {
public int viewId;
public int msgResId;
public ErrorMessage(final int viewId, final int msgResId) {
this.viewId = viewId;
this.msgResId = msgResId;
}
}
}