/*
* Copyright (C) 2010 mAPPn.Inc
*
* 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 com.mappn.gfan.ui;
import java.util.HashMap;
import java.util.regex.Pattern;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.UnderlineSpan;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.mappn.gfan.Constants;
import com.mappn.gfan.R;
import com.mappn.gfan.common.ApiAsyncTask.ApiRequestListener;
import com.mappn.gfan.common.MarketAPI;
import com.mappn.gfan.common.util.TopBar;
import com.mappn.gfan.common.util.Utils;
import com.mappn.gfan.common.widget.BaseActivity;
/**
* 注册页
* @author Andrew
* @date 2011-5-25
*
*/
public class RegisterActivity extends BaseActivity
implements OnClickListener, OnFocusChangeListener, ApiRequestListener {
private EditText etUsername;
private EditText etEmail;
private EditText etPassword;
private EditText etPassword2;
// dialog ID
private static final int DIALOG_REGISTERING = 0;
// 用户名不合法
private static final int ERROR_CODE_USERNAME_INVALID = 213;
// 用户名已存在
private static final int ERROR_CODE_USERNAME_EXIST = 214;
// 注册email格式有误
private static final int ERROR_CODE_EMAIL_INVALID_FORMAT = 215;
// 注册email已存在
private static final int ERROR_CODE_EMAIL_EXIST = 216;
// 注册密码不合法
private static final int ERROR_CODE_PASSWORD_INVALID = 217;
public static final Pattern EMAIL_ADDRESS_PATTERN =
Pattern.compile("[a-zA-Z0-9\\+\\.\\_\\%\\-]{1,256}"
+ "\\@" + "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}"
+ "(\\." + "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" + ")+");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register_layout);
initView();
}
@Override
protected void onDestroy() {
super.onDestroy();
etUsername = null;
etEmail = null;
etPassword = null;
etPassword2 = null;
}
private void initView() {
// top bar
TopBar.createTopBar(this,
new View[] { findViewById(R.id.top_bar_title) },
new int[] { View.VISIBLE },
getString(R.string.register));
etUsername = (EditText) findViewById(R.id.et_username);
etUsername.setOnFocusChangeListener(this);
etUsername.requestFocus();
etEmail = (EditText) findViewById(R.id.et_email);
etEmail.setOnFocusChangeListener(this);
etPassword = (EditText) findViewById(R.id.et_password);
etPassword.setOnFocusChangeListener(this);
etPassword2 = (EditText) findViewById(R.id.et_confirm_password);
etPassword2.setOnFocusChangeListener(this);
Button btnRegister = (Button) findViewById(R.id.btn_register);
btnRegister.setOnClickListener(this);
TextView login = (TextView) findViewById(R.id.btn_cancel);
// make the underline style
CharSequence text = login.getText();
SpannableString spanable = new SpannableString(text);
spanable.setSpan(new UnderlineSpan(), text.length() - 4, text.length(), 0);
login.setText(spanable);
login.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_register:
onClickRegister();
break;
case R.id.btn_cancel:
Intent loginIntent = new Intent(getApplicationContext(), LoginActivity.class);
finish();
startActivity(loginIntent);
break;
}
}
@Override
public void onFocusChange(View v, boolean flag) {
switch (v.getId()) {
case R.id.et_username:
if (!flag) {
checkUserName();
}
break;
case R.id.et_email:
if (!flag) {
checkEmail();
}
break;
case R.id.et_password:
if (!flag) {
checkPassword(etPassword);
}
break;
case R.id.et_confirm_password:
if (!flag) {
checkPassword(etPassword2);
}
break;
default:
break;
}
}
/*
* 检查用户名合法性
* 1 不能为空
* 2 长度在 3 - 16 个字符之间
*/
private boolean checkUserName() {
String input = etUsername.getText().toString();
if (TextUtils.isEmpty(input)) {
etUsername.setError(getString(R.string.error_username_empty));
return false;
} else {
etUsername.setError(null);
}
int length = input.length();
if (length < 3 || length > 16) {
etUsername.setError(getString(R.string.error_username_length_invalid));
return false;
} else {
etUsername.setError(null);
}
return true;
}
/*
* 检查用户邮箱合法性
* 1 不能为空
* 2 长度在6 - 40 个字符之间
* 3 符合邮箱格式
*/
private boolean checkEmail() {
String input = etEmail.getText().toString();
if (TextUtils.isEmpty(input)) {
etEmail.setError(getString(R.string.error_email_empty));
return false;
} else {
etEmail.setError(null);
}
int length = input.length();
if (length < 6 || length > 40) {
etEmail.setError(getString(R.string.error_email_length_invalid));
return false;
} else {
etEmail.setError(null);
}
if(!EMAIL_ADDRESS_PATTERN.matcher(input).find()) {
etEmail.setError(getString(R.string.error_email_format_invalid));
return false;
} else {
etEmail.setError(null);
}
return true;
}
/*
* 检查用户密码合法性
* 1 不能为空
* 2 长度在1 - 32 个字符之间
*/
private boolean checkPassword(EditText input) {
String passwod = input.getText().toString();
if (TextUtils.isEmpty(passwod)) {
input.setError(getString(R.string.error_password_empty));
return false;
} else {
input.setError(null);
}
int length = passwod.length();
if (length > 32) {
input.setError(getString(R.string.error_password_length_invalid));
return false;
} else {
input.setError(null);
}
return true;
}
/*
* 检查两次密码相同
*/
private boolean checkPasswordSame() {
String psw1 = etPassword.getText().toString();
String psw2 = etPassword2.getText().toString();
if (!psw1.equals(psw2)) {
etPassword2.setError(getString(R.string.error_password_not_same));
return false;
} else {
etPassword2.setError(null);
return true;
}
}
/*
* 点击注册按钮
*/
private void onClickRegister() {
// 验证成功,进行注册操作
if(checkUserName()
&& checkEmail()
&& checkPassword(etPassword)
&& checkPassword(etPassword2)
&& checkPasswordSame()) {
String username = etUsername.getText().toString();
String password = etPassword.getText().toString();
String email = etEmail.getText().toString();
MarketAPI.register(getApplicationContext(), this, username, password, email);
Utils.trackEvent(getApplicationContext(), Constants.GROUP_10,
Constants.REGISTER);
if (!isFinishing()) {
showDialog(DIALOG_REGISTERING);
}
}
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
if (dialog.isShowing()) {
dialog.dismiss();
}
}
@Override
protected Dialog onCreateDialog(int id) {
if (id == DIALOG_REGISTERING) {
ProgressDialog mProgressDialog = new ProgressDialog(this);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.setMessage(getString(R.string.registering));
return mProgressDialog;
}
return super.onCreateDialog(id);
}
@SuppressWarnings("unchecked")
@Override
public void onSuccess(int method, Object obj) {
try {
dismissDialog(DIALOG_REGISTERING);
} catch (IllegalArgumentException e) {
}
Utils.trackEvent(getApplicationContext(), Constants.GROUP_10,
Constants.REGISTER_SUCCESS);
Utils.makeEventToast(getApplicationContext(), getString(R.string.register_ok), false);
HashMap<String, String> result = (HashMap<String, String>) obj;
mSession.setUid(result.get(Constants.KEY_USER_UID));
mSession.setUserName(result.get(Constants.KEY_USER_NAME));
setResult(Activity.RESULT_OK);
mSession.setLogin(true);
finish();
}
@Override
public void onError(int method, int statusCode) {
try {
dismissDialog(DIALOG_REGISTERING);
} catch (IllegalArgumentException e) {
}
String msg = null;
switch (statusCode) {
case ERROR_CODE_USERNAME_INVALID:
msg = getString(R.string.error_username_invalid);
break;
case ERROR_CODE_USERNAME_EXIST:
msg = getString(R.string.error_username_exist);
break;
case ERROR_CODE_EMAIL_INVALID_FORMAT:
msg = getString(R.string.error_email_invalid);
break;
case ERROR_CODE_EMAIL_EXIST:
msg = getString(R.string.error_email_exist);
break;
case ERROR_CODE_PASSWORD_INVALID:
msg = getString(R.string.error_password_invalid);
break;
default:
msg = getString(R.string.error_other);
break;
}
Utils.makeEventToast(getApplicationContext(), msg, false);
}
}