package net.oschina.gitapp.ui;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import net.oschina.gitapp.AppContext;
import net.oschina.gitapp.AppException;
import net.oschina.gitapp.R;
import net.oschina.gitapp.bean.User;
import net.oschina.gitapp.common.BroadcastController;
import net.oschina.gitapp.common.Contanst;
import net.oschina.gitapp.common.CyptoUtils;
import net.oschina.gitapp.common.StringUtils;
import net.oschina.gitapp.common.UIHelper;
import net.oschina.gitapp.ui.baseactivity.BaseActionBarActivity;
public class LoginActivity extends BaseActionBarActivity
implements OnClickListener, OnEditorActionListener {
private AppContext mAppContext;
private AutoCompleteTextView mAccountEditText;
private EditText mPasswordEditText;
private ProgressDialog mLoginProgressDialog;
private Button mLogin;
private InputMethodManager imm;
private TextWatcher textWatcher;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mAppContext = getGitApplication();
initView();
}
private void initView() {
mAccountEditText = (AutoCompleteTextView) findViewById(R.id.login_account);
mPasswordEditText = (EditText) findViewById(R.id.login_password);
mLogin = (Button) findViewById(R.id.login_btn_login);
mLogin.setOnClickListener(this);
imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
textWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
// 若密码和帐号都为空,则登录按钮不可操作
String account = mAccountEditText.getText().toString();
String pwd = mPasswordEditText.getText().toString();
if (StringUtils.isEmpty(account) || StringUtils.isEmpty(pwd)) {
mLogin.setEnabled(false);
} else {
mLogin.setEnabled(true);
}
}
};
// 添加文本变化监听事件
mAccountEditText.addTextChangedListener(textWatcher);
mPasswordEditText.addTextChangedListener(textWatcher);
mPasswordEditText.setOnEditorActionListener(this);
String account = CyptoUtils.decode(Contanst.ACCOUNT_EMAIL, mAppContext.getProperty(Contanst.ACCOUNT_EMAIL));
mAccountEditText.setText(account);
String pwd = CyptoUtils.decode(Contanst.ACCOUNT_PWD, mAppContext.getProperty(Contanst.ACCOUNT_PWD));
mPasswordEditText.setText(pwd);
}
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
//在输入法里点击了“完成”,则去登录
if(actionId == EditorInfo.IME_ACTION_DONE) {
checkLogin();
//将输入法隐藏
InputMethodManager imm = (InputMethodManager)getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mPasswordEditText.getWindowToken(), 0);
return true;
}
return false;
}
/**
* 检查登录
*/
private void checkLogin() {
String email = mAccountEditText.getText().toString();
String passwd = mPasswordEditText.getText().toString();
//检查用户输入的参数
if(StringUtils.isEmpty(email)){
UIHelper.ToastMessage(this, getString(R.string.msg_login_email_null));
return;
}
if(!StringUtils.isEmail(email)) {
UIHelper.ToastMessage(this, getString(R.string.msg_login_email_error));
return;
}
if(StringUtils.isEmpty(passwd)){
UIHelper.ToastMessage(this, getString(R.string.msg_login_pwd_null));
return;
}
// 保存用户名和密码
mAppContext.saveAccountInfo(CyptoUtils.encode(Contanst.ACCOUNT_EMAIL, email), CyptoUtils.encode(Contanst.ACCOUNT_PWD, passwd));
login(email, passwd);
}
// 登录验证
private void login(final String account, final String passwd) {
if(mLoginProgressDialog == null) {
mLoginProgressDialog = new ProgressDialog(this);
mLoginProgressDialog.setCancelable(true);
mLoginProgressDialog.setCanceledOnTouchOutside(false);
mLoginProgressDialog.setMessage(getString(R.string.login_tips));
}
//异步登录
new AsyncTask<Void, Void, Message>() {
@Override
protected Message doInBackground(Void... params) {
Message msg =new Message();
try {
User user = mAppContext.loginVerify(account, passwd);
msg.what = 1;
msg.obj = user;
} catch (Exception e) {
msg.what = -1;
msg.obj = e;
if(mLoginProgressDialog != null) {
mLoginProgressDialog.dismiss();
}
}
return msg;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
if(mLoginProgressDialog != null) {
mLoginProgressDialog.show();
}
}
@Override
protected void onPostExecute(Message msg) {
super.onPostExecute(msg);
//如果程序已经关闭,则不再执行以下处理
if(isFinishing()) {
return;
}
if(mLoginProgressDialog != null) {
mLoginProgressDialog.dismiss();
}
Context context = LoginActivity.this;
if(msg.what == 1){
User user = (User)msg.obj;
if(user != null){
//提示登陆成功
UIHelper.ToastMessage(context, R.string.msg_login_success);
//返回标识,成功登录
setResult(RESULT_OK);
// 发送用户登录成功的广播
BroadcastController.sendUserChangeBroadcase(getActivity());
finish();
}
} else if(msg.what == 0){
UIHelper.ToastMessage(context, getString(
R.string.msg_login_fail) + msg.obj);
} else if(msg.what == -1){
if (msg.obj instanceof AppException) {
AppException e = ((AppException)msg.obj);
if (e.getCode() == 401) {
UIHelper.ToastMessage(context, R.string.msg_login_error);
} else {
((AppException)msg.obj).makeToast(context);
}
} else {
UIHelper.ToastMessage(context, R.string.msg_login_error);
}
}
}
}.execute();
}
@Override
public void onClick(View v) {
imm.hideSoftInputFromWindow(mPasswordEditText.getWindowToken(), 0);
checkLogin();
}
}