/**
* Copyright (C) 2013-2014 EaseMob Technologies. All rights reserved.
*
* 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.easemob.chatuidemo.activity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.easemob.EMCallBack;
import com.easemob.chat.EMChatManager;
import com.easemob.chat.EMContactManager;
import com.easemob.chat.EMGroupManager;
import com.easemob.chatuidemo.Constant;
import com.easemob.chatuidemo.DemoHXSDKHelper;
import com.easemob.chatuidemo.db.UserDao;
import com.easemob.chatuidemo.domain.User;
import com.easemob.chatuidemo.utils.CommonUtils;
import com.easemob.util.HanziToPinyin;
import com.qingmu.jianzhidaren.R;
import com.quark.jianzhidaren.ApplicationControl;
import com.umeng.analytics.MobclickAgent;
/**
* 登陆页面
*
*/
public class LoginActivity extends BaseActivity {
public static final int REQUEST_CODE_SETNICK = 1;
private EditText usernameEditText;
private EditText passwordEditText;
private boolean progressShow;
private boolean autoLogin = false;
private String currentUsername;
private String currentPassword;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 如果用户名密码都有,直接进入主页面
if (DemoHXSDKHelper.getInstance().isLogined()) {
autoLogin = true;
startActivity(new Intent(LoginActivity.this, MainActivity.class));
return;
}
setContentView(R.layout.activity_login);
usernameEditText = (EditText) findViewById(R.id.username);
passwordEditText = (EditText) findViewById(R.id.password);
// 如果用户名改变,清空密码
usernameEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
passwordEditText.setText(null);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
if (ApplicationControl.getInstance().getUserName() != null) {
usernameEditText.setText(ApplicationControl.getInstance().getUserName());
}
}
/**
* 登陆
*
* @param view
*/
public void login(View view) {
if (!CommonUtils.isNetWorkConnected(this)) {
Toast.makeText(this, R.string.network_isnot_available, Toast.LENGTH_SHORT).show();
return;
}
currentUsername = usernameEditText.getText().toString().trim();
currentPassword = passwordEditText.getText().toString().trim();
if(TextUtils.isEmpty(currentUsername)){
Toast.makeText(this, "用户名不能为空!", Toast.LENGTH_SHORT).show();
return;
}
if(TextUtils.isEmpty(currentPassword)){
Toast.makeText(this, "密码不能为空!", Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent(LoginActivity.this, com.easemob.chatuidemo.activity.AlertDialog.class);
intent.putExtra("editTextShow", true);
intent.putExtra("titleIsCancel", true);
intent.putExtra("msg", "请设置当前用户的昵称\n为了ios离线推送不是userid而是nick,详情见注释");
intent.putExtra("edit_text", currentUsername);
startActivityForResult(intent, REQUEST_CODE_SETNICK);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == REQUEST_CODE_SETNICK) {
ApplicationControl.currentUserNick = data.getStringExtra("edittext");
progressShow = true;
final ProgressDialog pd = new ProgressDialog(LoginActivity.this);
pd.setCanceledOnTouchOutside(false);
pd.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
progressShow = false;
}
});
pd.setMessage("正在登陆...");
pd.show();
final long start = System.currentTimeMillis();
// 调用sdk登陆方法登陆聊天服务器
EMChatManager.getInstance().login(currentUsername, currentPassword, new EMCallBack() {
@Override
public void onSuccess() {
//umeng自定义事件,开发者可以把这个删掉
loginSuccess2Umeng(start);
Toast.makeText(getApplicationContext(), "登陆环信成功", 0).show();
if (!progressShow) {
return;
}
// 登陆成功,保存用户名密码
ApplicationControl.getInstance().setUserName(currentUsername);
ApplicationControl.getInstance().setPassword(currentPassword);
runOnUiThread(new Runnable() {
public void run() {
pd.setMessage("正在获取好友和群聊列表...");
}
});
try {
// ** 第一次登录或者之前logout后再登录,加载所有本地群和回话
// ** manually load all local groups and
// conversations in case we are auto login
EMGroupManager.getInstance().loadAllGroups();
EMChatManager.getInstance().loadAllConversations();
// demo中简单的处理成每次登陆都去获取好友username,开发者自己根据情况而定
List<String> usernames = EMContactManager.getInstance().getContactUserNames();
Map<String, User> userlist = new HashMap<String, User>();
for (String username : usernames) {
User user = new User();
user.setUsername(username);
setUserHearder(username, user);
userlist.put(username, user);
}
// 添加user"申请与通知"
User newFriends = new User();
newFriends.setUsername(Constant.NEW_FRIENDS_USERNAME);
newFriends.setNick("申请与通知");
newFriends.setHeader("");
userlist.put(Constant.NEW_FRIENDS_USERNAME, newFriends);
// 添加"群聊"
User groupUser = new User();
groupUser.setUsername(Constant.GROUP_USERNAME);
groupUser.setNick("群聊");
groupUser.setHeader("");
userlist.put(Constant.GROUP_USERNAME, groupUser);
// 存入内存
ApplicationControl.getInstance().setContactList(userlist);
// 存入db
UserDao dao = new UserDao(LoginActivity.this);
List<User> users = new ArrayList<User>(userlist.values());
dao.saveContactList(users);
// 获取群聊列表(群聊里只有groupid和groupname等简单信息,不包含members),sdk会把群组存入到内存和db中
EMGroupManager.getInstance().getGroupsFromServer();
} catch (Exception e) {
e.printStackTrace();
//取好友或者群聊失败,不让进入主页面,也可以不管这个exception继续进到主页面
runOnUiThread(new Runnable() {
public void run() {
pd.dismiss();
ApplicationControl.getInstance().logout(null);
Toast.makeText(getApplicationContext(), "登录失败: 获取好友或群聊失败", 1).show();
}
});
return;
}
//更新当前用户的nickname 此方法的作用是在ios离线推送时能够显示用户nick
boolean updatenick = EMChatManager.getInstance().updateCurrentUserNick(ApplicationControl.currentUserNick.trim());
if (!updatenick) {
Log.e("LoginActivity", "update current user nick fail");
}
if (!LoginActivity.this.isFinishing())
pd.dismiss();
// 进入主页面
startActivity(new Intent(LoginActivity.this, MainActivity.class));
finish();
}
@Override
public void onProgress(int progress, String status) {
}
@Override
public void onError(final int code, final String message) {
loginFailure2Umeng(start,code,message);
if (!progressShow) {
return;
}
runOnUiThread(new Runnable() {
public void run() {
pd.dismiss();
Toast.makeText(getApplicationContext(), "登录失败: " + message, Toast.LENGTH_SHORT).show();
}
});
}
});
}
}
}
/**
* 注册
*
* @param view
*/
public void register(View view) {
startActivityForResult(new Intent(this, RegisterActivity.class), 0);
}
@Override
protected void onResume() {
super.onResume();
if (autoLogin) {
return;
}
}
/**
* 设置hearder属性,方便通讯中对联系人按header分类显示,以及通过右侧ABCD...字母栏快速定位联系人
*
* @param username
* @param user
*/
protected void setUserHearder(String username, User user) {
String headerName = null;
if (!TextUtils.isEmpty(user.getNick())) {
headerName = user.getNick();
} else {
headerName = user.getUsername();
}
if (username.equals(Constant.NEW_FRIENDS_USERNAME)) {
user.setHeader("");
} else if (Character.isDigit(headerName.charAt(0))) {
user.setHeader("#");
} else {
user.setHeader(HanziToPinyin.getInstance().get(headerName.substring(0, 1)).get(0).target.substring(0, 1).toUpperCase());
char header = user.getHeader().toLowerCase().charAt(0);
if (header < 'a' || header > 'z') {
user.setHeader("#");
}
}
}
private void loginSuccess2Umeng(final long start) {
runOnUiThread(new Runnable() {
public void run() {
long costTime = System.currentTimeMillis() - start;
Map<String, String> params = new HashMap<String, String>();
params.put("status", "success");
MobclickAgent.onEventValue(LoginActivity.this, "login1", params, (int) costTime);
MobclickAgent.onEventDuration(LoginActivity.this, "login1", (int) costTime);
}
});
}
private void loginFailure2Umeng(final long start, final int code, final String message) {
runOnUiThread(new Runnable() {
public void run() {
long costTime = System.currentTimeMillis() - start;
Map<String, String> params = new HashMap<String, String>();
params.put("status", "failure");
params.put("error_code", code + "");
params.put("error_description", message);
MobclickAgent.onEventValue(LoginActivity.this, "login1", params, (int) costTime);
MobclickAgent.onEventDuration(LoginActivity.this, "login1", (int) costTime);
}
});
}
}