package com.easemob.chatuidemo; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.UUID; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.widget.Toast; import com.easemob.EMCallBack; import com.easemob.EMConnectionListener; import com.easemob.EMError; import com.easemob.EMEventListener; import com.easemob.EMGroupChangeListener; import com.easemob.EMNotifierEvent; import com.easemob.EMValueCallBack; import com.easemob.chat.CmdMessageBody; import com.easemob.chat.EMChat; import com.easemob.chat.EMChatManager; import com.easemob.chat.EMChatOptions; import com.easemob.chat.EMContactListener; import com.easemob.chat.EMContactManager; import com.easemob.chat.EMConversation; import com.easemob.chat.EMGroup; import com.easemob.chat.EMGroupManager; import com.easemob.chat.EMMessage; import com.easemob.chat.EMMessage.ChatType; import com.easemob.chat.EMMessage.Type; import com.easemob.chat.TextMessageBody; import com.easemob.chatuidemo.db.DemoDBManager; import com.easemob.chatuidemo.db.InviteMessgeDao; import com.easemob.chatuidemo.db.UserDao; import com.easemob.chatuidemo.domain.EmojiconExampleGroupData; import com.easemob.chatuidemo.domain.InviteMessage; import com.easemob.chatuidemo.domain.InviteMessage.InviteMesageStatus; import com.easemob.chatuidemo.domain.RobotUser; import com.easemob.chatuidemo.parse.UserProfileManager; import com.easemob.chatuidemo.receiver.CallReceiver; import com.easemob.chatuidemo.ui.ChatActivity; import com.easemob.chatuidemo.ui.MainActivity; import com.easemob.chatuidemo.ui.VideoCallActivity; import com.easemob.chatuidemo.ui.VoiceCallActivity; import com.easemob.chatuidemo.utils.PreferenceManager; import com.easemob.easeui.EaseConstant; import com.easemob.easeui.R; import com.easemob.easeui.controller.EaseUI; import com.easemob.easeui.controller.EaseUI.EaseEmojiconInfoProvider; import com.easemob.easeui.controller.EaseUI.EaseSettingsProvider; import com.easemob.easeui.controller.EaseUI.EaseUserProfileProvider; import com.easemob.easeui.domain.EaseEmojicon; import com.easemob.easeui.domain.EaseEmojiconGroupEntity; import com.easemob.easeui.domain.EaseUser; import com.easemob.easeui.model.EaseNotifier; import com.easemob.easeui.model.EaseNotifier.EaseNotificationInfoProvider; import com.easemob.easeui.utils.EaseACKUtil; import com.easemob.easeui.utils.EaseCommonUtils; import com.easemob.exceptions.EaseMobException; import com.easemob.util.EMLog; public class DemoHelper { /** * 数据同步listener */ static public interface DataSyncListener { /** * 同步完毕 * @param success true:成功同步到数据,false失败 */ public void onSyncComplete(boolean success); } protected static final String TAG = "DemoHelper"; private EaseUI easeUI; /** * EMEventListener */ protected EMEventListener eventListener = null; private Map<String, EaseUser> contactList; private Map<String, RobotUser> robotList; private UserProfileManager userProManager; private static DemoHelper instance = null; private DemoModel demoModel = null; /** * HuanXin sync groups status listener */ private List<DataSyncListener> syncGroupsListeners; /** * HuanXin sync contacts status listener */ private List<DataSyncListener> syncContactsListeners; /** * HuanXin sync blacklist status listener */ private List<DataSyncListener> syncBlackListListeners; private boolean isSyncingGroupsWithServer = false; private boolean isSyncingContactsWithServer = false; private boolean isSyncingBlackListWithServer = false; private boolean isGroupsSyncedWithServer = false; private boolean isContactsSyncedWithServer = false; private boolean isBlackListSyncedWithServer = false; private boolean alreadyNotified = false; public boolean isVoiceCalling; public boolean isVideoCalling; private String username; private Context appContext; private CallReceiver callReceiver; private EMConnectionListener connectionListener; private InviteMessgeDao inviteMessgeDao; private UserDao userDao; private LocalBroadcastManager broadcastManager; private boolean isGroupAndContactListenerRegisted; private DemoHelper() { } public synchronized static DemoHelper getInstance() { if (instance == null) { instance = new DemoHelper(); } return instance; } /** * init helper * * @param context * application context */ public void init(Context context) { if (EaseUI.getInstance().init(context)) { appContext = context; //if your app is supposed to user Google Push, please set project number String projectNumber = "562451699741"; //不使用GCM推送的注释掉这行 EMChatManager.getInstance().setGCMProjectNumber(projectNumber); //在小米手机上当app被kill时使用小米推送进行消息提示,同GCM一样不是必须的 EMChatManager.getInstance().setMipushConfig("2882303761517370134", "5131737040134"); //设为调试模式,打成正式包时,最好设为false,以免消耗额外的资源 EMChat.getInstance().setDebugMode(true); //get easeui instance easeUI = EaseUI.getInstance(); //调用easeui的api设置providers setEaseUIProviders(); demoModel = new DemoModel(context); //设置chat options setChatoptions(); //初始化PreferenceManager PreferenceManager.init(context); //初始化用户管理类 getUserProfileManager().init(context); //设置全局监听 setGlobalListeners(); broadcastManager = LocalBroadcastManager.getInstance(appContext); initDbDao(); } } private void setChatoptions(){ //easeui库默认设置了一些options,可以覆盖 EMChatOptions options = EMChatManager.getInstance().getChatOptions(); options.allowChatroomOwnerLeave(getModel().isChatroomOwnerLeaveAllowed()); } protected void setEaseUIProviders() { //需要easeui库显示用户头像和昵称设置此provider easeUI.setUserProfileProvider(new EaseUserProfileProvider() { @Override public EaseUser getUser(String username) { return getUserInfo(username); } }); //不设置,则使用easeui默认的 easeUI.setSettingsProvider(new EaseSettingsProvider() { @Override public boolean isSpeakerOpened() { return demoModel.getSettingMsgSpeaker(); } @Override public boolean isMsgVibrateAllowed(EMMessage message) { return demoModel.getSettingMsgVibrate(); } @Override public boolean isMsgSoundAllowed(EMMessage message) { return demoModel.getSettingMsgSound(); } @Override public boolean isMsgNotifyAllowed(EMMessage message) { if(message == null){ return demoModel.getSettingMsgNotification(); } if(!demoModel.getSettingMsgNotification()){ return false; }else{ //如果允许新消息提示 //屏蔽的用户和群组不提示用户 String chatUsename = null; List<String> notNotifyIds = null; // 获取设置的不提示新消息的用户或者群组ids if (message.getChatType() == ChatType.Chat) { chatUsename = message.getFrom(); notNotifyIds = demoModel.getDisabledIds(); } else { chatUsename = message.getTo(); notNotifyIds = demoModel.getDisabledGroups(); } if (notNotifyIds == null || !notNotifyIds.contains(chatUsename)) { return true; } else { return false; } } } }); //设置表情provider easeUI.setEmojiconInfoProvider(new EaseEmojiconInfoProvider() { @Override public EaseEmojicon getEmojiconInfo(String emojiconIdentityCode) { EaseEmojiconGroupEntity data = EmojiconExampleGroupData.getData(); for(EaseEmojicon emojicon : data.getEmojiconList()){ if(emojicon.getIdentityCode().equals(emojiconIdentityCode)){ return emojicon; } } return null; } @Override public Map<String, Object> getTextEmojiconMapping() { //返回文字表情emoji文本和图片(resource id或者本地路径)的映射map return null; } }); //不设置,则使用easeui默认的 easeUI.getNotifier().setNotificationInfoProvider(new EaseNotificationInfoProvider() { @Override public String getTitle(EMMessage message) { //修改标题,这里使用默认 return null; } @Override public int getSmallIcon(EMMessage message) { //设置小图标,这里为默认 return 0; } @Override public String getDisplayedText(EMMessage message) { // 设置状态栏的消息提示,可以根据message的类型做相应提示 String ticker = EaseCommonUtils.getMessageDigest(message, appContext); if(message.getType() == Type.TXT){ ticker = ticker.replaceAll("\\[.{2,3}\\]", "[表情]"); } EaseUser user = getUserInfo(message.getFrom()); if(user != null){ return getUserInfo(message.getFrom()).getNick() + ": " + ticker; }else{ return message.getFrom() + ": " + ticker; } } @Override public String getLatestText(EMMessage message, int fromUsersNum, int messageNum) { return null; // return fromUsersNum + "个基友,发来了" + messageNum + "条消息"; } @Override public Intent getLaunchIntent(EMMessage message) { //设置点击通知栏跳转事件 Intent intent = new Intent(appContext, ChatActivity.class); //有电话时优先跳转到通话页面 if(isVideoCalling){ intent = new Intent(appContext, VideoCallActivity.class); }else if(isVoiceCalling){ intent = new Intent(appContext, VoiceCallActivity.class); }else{ ChatType chatType = message.getChatType(); if (chatType == ChatType.Chat) { // 单聊信息 intent.putExtra("userId", message.getFrom()); intent.putExtra("chatType", Constant.CHATTYPE_SINGLE); } else { // 群聊信息 // message.getTo()为群聊id intent.putExtra("userId", message.getTo()); if(chatType == ChatType.GroupChat){ intent.putExtra("chatType", Constant.CHATTYPE_GROUP); }else{ intent.putExtra("chatType", Constant.CHATTYPE_CHATROOM); } } } return intent; } }); } /** * 设置全局事件监听 */ protected void setGlobalListeners(){ syncGroupsListeners = new ArrayList<DataSyncListener>(); syncContactsListeners = new ArrayList<DataSyncListener>(); syncBlackListListeners = new ArrayList<DataSyncListener>(); isGroupsSyncedWithServer = demoModel.isGroupsSynced(); isContactsSyncedWithServer = demoModel.isContactSynced(); isBlackListSyncedWithServer = demoModel.isBacklistSynced(); // create the global connection listener connectionListener = new EMConnectionListener() { @Override public void onDisconnected(int error) { if (error == EMError.USER_REMOVED) { onCurrentAccountRemoved(); }else if (error == EMError.CONNECTION_CONFLICT) { onConnectionConflict(); } } @Override public void onConnected() { // in case group and contact were already synced, we supposed to notify sdk we are ready to receive the events if(isGroupsSyncedWithServer && isContactsSyncedWithServer){ new Thread(){ @Override public void run(){ DemoHelper.getInstance().notifyForRecevingEvents(); } }.start(); }else{ if(!isGroupsSyncedWithServer){ asyncFetchGroupsFromServer(null); } if(!isContactsSyncedWithServer){ asyncFetchContactsFromServer(null); } if(!isBlackListSyncedWithServer){ asyncFetchBlackListFromServer(null); } } // 当连接到服务器之后,这里开始检查是否有没有发送的ack回执消息, EaseACKUtil.getInstance(appContext).checkACKData(); } }; IntentFilter callFilter = new IntentFilter(EMChatManager.getInstance().getIncomingCallBroadcastAction()); if(callReceiver == null){ callReceiver = new CallReceiver(); } //注册通话广播接收者 appContext.registerReceiver(callReceiver, callFilter); //注册连接监听 EMChatManager.getInstance().addConnectionListener(connectionListener); //注册群组和联系人监听 registerGroupAndContactListener(); //注册消息事件监听 registerEventListener(); } private void initDbDao() { inviteMessgeDao = new InviteMessgeDao(appContext); userDao = new UserDao(appContext); } /** * 注册群组和联系人监听,由于logout的时候会被sdk清除掉,再次登录的时候需要再注册一下 */ public void registerGroupAndContactListener(){ if(!isGroupAndContactListenerRegisted){ //注册群组变动监听 EMGroupManager.getInstance().addGroupChangeListener(new MyGroupChangeListener()); //注册联系人变动监听 EMContactManager.getInstance().setContactListener(new MyContactListener()); isGroupAndContactListenerRegisted = true; } } /** * 群组变动监听 */ class MyGroupChangeListener implements EMGroupChangeListener { @Override public void onInvitationReceived(String groupId, String groupName, String inviter, String reason) { boolean hasGroup = false; for (EMGroup group : EMGroupManager.getInstance().getAllGroups()) { if (group.getGroupId().equals(groupId)) { hasGroup = true; break; } } if (!hasGroup) return; // 被邀请 String st3 = appContext.getString(R.string.Invite_you_to_join_a_group_chat); EMMessage msg = EMMessage.createReceiveMessage(Type.TXT); msg.setChatType(ChatType.GroupChat); msg.setFrom(inviter); msg.setTo(groupId); msg.setMsgId(UUID.randomUUID().toString()); msg.addBody(new TextMessageBody(inviter + " " +st3)); // 保存邀请消息 EMChatManager.getInstance().saveMessage(msg); // 提醒新消息 getNotifier().viberateAndPlayTone(msg); //发送local广播 broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); } @Override public void onInvitationAccpted(String groupId, String inviter, String reason) { } @Override public void onInvitationDeclined(String groupId, String invitee, String reason) { } @Override public void onUserRemoved(String groupId, String groupName) { //TODO 提示用户被T了,demo省略此步骤 broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); } @Override public void onGroupDestroy(String groupId, String groupName) { // 群被解散 //TODO 提示用户群被解散,demo省略 broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); } @Override public void onApplicationReceived(String groupId, String groupName, String applyer, String reason) { // 用户申请加入群聊 InviteMessage msg = new InviteMessage(); msg.setFrom(applyer); msg.setTime(System.currentTimeMillis()); msg.setGroupId(groupId); msg.setGroupName(groupName); msg.setReason(reason); Log.d(TAG, applyer + " 申请加入群聊:" + groupName); msg.setStatus(InviteMesageStatus.BEAPPLYED); notifyNewIviteMessage(msg); broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); } @Override public void onApplicationAccept(String groupId, String groupName, String accepter) { String st4 = appContext.getString(R.string.Agreed_to_your_group_chat_application); // 加群申请被同意 EMMessage msg = EMMessage.createReceiveMessage(Type.TXT); msg.setChatType(ChatType.GroupChat); msg.setFrom(accepter); msg.setTo(groupId); msg.setMsgId(UUID.randomUUID().toString()); msg.addBody(new TextMessageBody(accepter + " " +st4)); // 保存同意消息 EMChatManager.getInstance().saveMessage(msg); // 提醒新消息 getNotifier().viberateAndPlayTone(msg); broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); } @Override public void onApplicationDeclined(String groupId, String groupName, String decliner, String reason) { // 加群申请被拒绝,demo未实现 } } /*** * 好友变化listener * */ public class MyContactListener implements EMContactListener { @Override public void onContactAdded(List<String> usernameList) { // 保存增加的联系人 Map<String, EaseUser> localUsers = getContactList(); for (String username : usernameList) { EaseUser user = new EaseUser(username); // 添加好友时可能会回调added方法两次 if (!localUsers.containsKey(username)) { saveContact(user); } } //发送好友变动广播 broadcastManager.sendBroadcast(new Intent(Constant.ACTION_CONTACT_CHANAGED)); } @Override public void onContactDeleted(final List<String> usernameList) { // 被删除 Map<String, EaseUser> localUsers = DemoHelper.getInstance().getContactList(); for (String username : usernameList) { localUsers.remove(username); userDao.deleteContact(username); inviteMessgeDao.deleteMessage(username); } broadcastManager.sendBroadcast(new Intent(Constant.ACTION_CONTACT_CHANAGED)); } @Override public void onContactInvited(String username, String reason) { // 接到邀请的消息,如果不处理(同意或拒绝),掉线后,服务器会自动再发过来,所以客户端不需要重复提醒 List<InviteMessage> msgs = inviteMessgeDao.getMessagesList(); for (InviteMessage inviteMessage : msgs) { if (inviteMessage.getGroupId() == null && inviteMessage.getFrom().equals(username)) { inviteMessgeDao.deleteMessage(username); } } // 自己封装的javabean InviteMessage msg = new InviteMessage(); msg.setFrom(username); msg.setTime(System.currentTimeMillis()); msg.setReason(reason); Log.d(TAG, username + "请求加你为好友,reason: " + reason); // 设置相应status msg.setStatus(InviteMesageStatus.BEINVITEED); notifyNewIviteMessage(msg); broadcastManager.sendBroadcast(new Intent(Constant.ACTION_CONTACT_CHANAGED)); } @Override public void onContactAgreed(String username) { List<InviteMessage> msgs = inviteMessgeDao.getMessagesList(); for (InviteMessage inviteMessage : msgs) { if (inviteMessage.getFrom().equals(username)) { return; } } // 自己封装的javabean InviteMessage msg = new InviteMessage(); msg.setFrom(username); msg.setTime(System.currentTimeMillis()); Log.d(TAG, username + "同意了你的好友请求"); msg.setStatus(InviteMesageStatus.BEAGREED); notifyNewIviteMessage(msg); broadcastManager.sendBroadcast(new Intent(Constant.ACTION_CONTACT_CHANAGED)); } @Override public void onContactRefused(String username) { // 参考同意,被邀请实现此功能,demo未实现 Log.d(username, username + "拒绝了你的好友请求"); } } /** * 保存并提示消息的邀请消息 * @param msg */ private void notifyNewIviteMessage(InviteMessage msg){ if(inviteMessgeDao == null){ inviteMessgeDao = new InviteMessgeDao(appContext); } inviteMessgeDao.saveMessage(msg); //保存未读数,这里没有精确计算 inviteMessgeDao.saveUnreadMessageCount(1); // 提示有新消息 getNotifier().viberateAndPlayTone(null); } /** * 账号在别的设备登录 */ protected void onConnectionConflict(){ Intent intent = new Intent(appContext, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(Constant.ACCOUNT_CONFLICT, true); appContext.startActivity(intent); } /** * 账号被移除 */ protected void onCurrentAccountRemoved(){ Intent intent = new Intent(appContext, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(Constant.ACCOUNT_REMOVED, true); appContext.startActivity(intent); } private EaseUser getUserInfo(String username){ //获取user信息,demo是从内存的好友列表里获取, //实际开发中,可能还需要从服务器获取用户信息, //从服务器获取的数据,最好缓存起来,避免频繁的网络请求 if(username == null){ EMLog.d(TAG, "username is null when get user info"); return null; } EaseUser user = null; if(username.equals(EMChatManager.getInstance().getCurrentUser())) return getUserProfileManager().getCurrentUserInfo(); if(getContactList() != null) user = getContactList().get(username); //TODO 获取不在好友列表里的群成员具体信息,即陌生人信息,demo未实现 if(user == null && getRobotList() != null){ user = getRobotList().get(username); } return user; } /** * 全局事件监听 * 因为可能会有UI页面先处理到这个消息,所以一般如果UI页面已经处理,这里就不需要再次处理 * activityList.size() <= 0 意味着所有页面都已经在后台运行,或者已经离开Activity Stack */ protected void registerEventListener() { eventListener = new EMEventListener() { private BroadcastReceiver broadCastReceiver = null; @Override public void onEvent(EMNotifierEvent event) { EMMessage message = null; if(event.getData() instanceof EMMessage){ message = (EMMessage)event.getData(); EMLog.d(TAG, "receive the event : " + event.getEvent() + ",id : " + message.getMsgId()); } switch (event.getEvent()) { case EventNewMessage: //应用在后台,不需要刷新UI,通知栏提示新消息 if(!easeUI.hasForegroundActivies()){ getNotifier().onNewMsg(message); } break; case EventOfflineMessage: if(!easeUI.hasForegroundActivies()){ EMLog.d(TAG, "received offline messages"); List<EMMessage> messages = (List<EMMessage>) event.getData(); getNotifier().onNewMesg(messages); } break; // below is just giving a example to show a cmd toast, the app should not follow this // so be careful of this case EventNewCMDMessage: //获取消息body CmdMessageBody cmdMsgBody = (CmdMessageBody) message.getBody(); final String action = cmdMsgBody.action;//获取自定义action if(!easeUI.hasForegroundActivies()){ if(action.equals(EaseConstant.EASE_ATTR_REVOKE)){ EaseCommonUtils.receiveRevokeMessage(appContext, message); } } //获取扩展属性 此处省略 //message.getStringAttribute(""); final String str = appContext.getString(R.string.receive_the_passthrough); final String CMD_TOAST_BROADCAST = "easemob.demo.cmd.toast"; IntentFilter cmdFilter = new IntentFilter(CMD_TOAST_BROADCAST); if(broadCastReceiver == null){ broadCastReceiver = new BroadcastReceiver(){ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Toast.makeText(appContext, intent.getStringExtra("cmd_value"), Toast.LENGTH_SHORT).show(); } }; //注册广播接收者 appContext.registerReceiver(broadCastReceiver,cmdFilter); } Intent broadcastIntent = new Intent(CMD_TOAST_BROADCAST); broadcastIntent.putExtra("cmd_value", str+action); appContext.sendBroadcast(broadcastIntent, null); break; case EventDeliveryAck: message.setDelivered(true); break; case EventReadAck: // TODO 这里当此消息未加载到内存中时,ackMessage会为null,消息的删除会失败 message.setAcked(true); EMMessage ackMessage = (EMMessage) event.getData(); EMConversation conversation = EMChatManager.getInstance().getConversation(ackMessage.getTo()); // 判断接收到ack的这条消息是不是阅后即焚的消息,如果是,则说明对方看过消息了,对方会销毁,这边也删除(现在只有txt iamge file三种消息支持 ) if(ackMessage.getBooleanAttribute(EaseConstant.EASE_ATTR_READFIRE, false) && (ackMessage.getType() == Type.TXT || ackMessage.getType() == Type.VOICE || ackMessage.getType() == Type.IMAGE)){ // 判断当前会话是不是只有一条消息,如果只有一条消息,并且这条消息也是阅后即焚类型,当对方阅读后,这边要删除,会话会被过滤掉,因此要加载上一条消息 if(conversation.getAllMessages().size() == 1 && conversation.getLastMessage().getMsgId().equals(ackMessage.getMsgId())){ if (ackMessage.getChatType() == ChatType.Chat) { conversation.loadMoreMsgFromDB(ackMessage.getMsgId(), 1); } else { conversation.loadMoreGroupMsgFromDB(ackMessage.getMsgId(), 1); } } conversation.removeMessage(ackMessage.getMsgId()); } break; // add other events in case you are interested in default: break; } } }; EMChatManager.getInstance().registerEventListener(eventListener); } /** * 是否登录成功过 * * @return */ public boolean isLoggedIn() { return EMChat.getInstance().isLoggedIn(); } /** * 退出登录 * * @param unbindDeviceToken * 是否解绑设备token(使用GCM才有) * @param callback * callback */ public void logout(boolean unbindDeviceToken, final EMCallBack callback) { endCall(); EMChatManager.getInstance().logout(unbindDeviceToken, new EMCallBack() { @Override public void onSuccess() { reset(); if (callback != null) { callback.onSuccess(); } } @Override public void onProgress(int progress, String status) { if (callback != null) { callback.onProgress(progress, status); } } @Override public void onError(int code, String error) { if (callback != null) { callback.onError(code, error); } } }); } /** * 获取消息通知类 * @return */ public EaseNotifier getNotifier(){ return easeUI.getNotifier(); } public DemoModel getModel(){ return (DemoModel) demoModel; } /** * 设置好友user list到内存中 * * @param contactList */ public void setContactList(Map<String, EaseUser> contactList) { this.contactList = contactList; } /** * 保存单个user */ public void saveContact(EaseUser user){ contactList.put(user.getUsername(), user); demoModel.saveContact(user); } /** * 获取好友list * * @return */ public Map<String, EaseUser> getContactList() { if (isLoggedIn() && contactList == null) { contactList = demoModel.getContactList(); } return contactList; } /** * 设置当前用户的环信id * @param username */ public void setCurrentUserName(String username){ this.username = username; demoModel.setCurrentUserName(username); } /** * 获取当前用户的环信id */ public String getCurrentUsernName(){ if(username == null){ username = demoModel.getCurrentUsernName(); } return username; } public void setRobotList(Map<String, RobotUser> robotList) { this.robotList = robotList; } public Map<String, RobotUser> getRobotList() { if (isLoggedIn() && robotList == null) { robotList = demoModel.getRobotList(); } return robotList; } /** * update user list to cach And db * * @param contactList */ public void updateContactList(List<EaseUser> contactInfoList) { for (EaseUser u : contactInfoList) { contactList.put(u.getUsername(), u); } ArrayList<EaseUser> mList = new ArrayList<EaseUser>(); mList.addAll(contactList.values()); demoModel.saveContactList(mList); } public UserProfileManager getUserProfileManager() { if (userProManager == null) { userProManager = new UserProfileManager(); } return userProManager; } void endCall() { try { EMChatManager.getInstance().endCall(); } catch (Exception e) { e.printStackTrace(); } } public void addSyncGroupListener(DataSyncListener listener) { if (listener == null) { return; } if (!syncGroupsListeners.contains(listener)) { syncGroupsListeners.add(listener); } } public void removeSyncGroupListener(DataSyncListener listener) { if (listener == null) { return; } if (syncGroupsListeners.contains(listener)) { syncGroupsListeners.remove(listener); } } public void addSyncContactListener(DataSyncListener listener) { if (listener == null) { return; } if (!syncContactsListeners.contains(listener)) { syncContactsListeners.add(listener); } } public void removeSyncContactListener(DataSyncListener listener) { if (listener == null) { return; } if (syncContactsListeners.contains(listener)) { syncContactsListeners.remove(listener); } } public void addSyncBlackListListener(DataSyncListener listener) { if (listener == null) { return; } if (!syncBlackListListeners.contains(listener)) { syncBlackListListeners.add(listener); } } public void removeSyncBlackListListener(DataSyncListener listener) { if (listener == null) { return; } if (syncBlackListListeners.contains(listener)) { syncBlackListListeners.remove(listener); } } /** * 同步操作,从服务器获取群组列表 * 该方法会记录更新状态,可以通过isSyncingGroupsFromServer获取是否正在更新 * 和isGroupsSyncedWithServer获取是否更新已经完成 * @throws EaseMobException */ public synchronized void asyncFetchGroupsFromServer(final EMCallBack callback){ if(isSyncingGroupsWithServer){ return; } isSyncingGroupsWithServer = true; new Thread(){ @Override public void run(){ try { EMGroupManager.getInstance().getGroupsFromServer(); // in case that logout already before server returns, we should return immediately if(!EMChat.getInstance().isLoggedIn()){ return; } demoModel.setGroupsSynced(true); isGroupsSyncedWithServer = true; isSyncingGroupsWithServer = false; //通知listener同步群组完毕 noitifyGroupSyncListeners(true); if(isContactsSyncedWithServer()){ notifyForRecevingEvents(); } if(callback != null){ callback.onSuccess(); } } catch (EaseMobException e) { demoModel.setGroupsSynced(false); isGroupsSyncedWithServer = false; isSyncingGroupsWithServer = false; noitifyGroupSyncListeners(false); if(callback != null){ callback.onError(e.getErrorCode(), e.toString()); } } } }.start(); } public void noitifyGroupSyncListeners(boolean success){ for (DataSyncListener listener : syncGroupsListeners) { listener.onSyncComplete(success); } } public void asyncFetchContactsFromServer(final EMValueCallBack<List<String>> callback){ if(isSyncingContactsWithServer){ return; } isSyncingContactsWithServer = true; new Thread(){ @Override public void run(){ List<String> usernames = null; try { usernames = EMContactManager.getInstance().getContactUserNames(); // in case that logout already before server returns, we should return immediately if(!EMChat.getInstance().isLoggedIn()){ return; } Map<String, EaseUser> userlist = new HashMap<String, EaseUser>(); for (String username : usernames) { EaseUser user = new EaseUser(username); EaseCommonUtils.setUserInitialLetter(user); userlist.put(username, user); } // 存入内存 getContactList().clear(); getContactList().putAll(userlist); // 存入db UserDao dao = new UserDao(appContext); List<EaseUser> users = new ArrayList<EaseUser>(userlist.values()); dao.saveContactList(users); demoModel.setContactSynced(true); EMLog.d(TAG, "set contact syn status to true"); isContactsSyncedWithServer = true; isSyncingContactsWithServer = false; //通知listeners联系人同步完毕 notifyContactsSyncListener(true); if(isGroupsSyncedWithServer()){ notifyForRecevingEvents(); } getUserProfileManager().asyncFetchContactInfosFromServer(usernames,new EMValueCallBack<List<EaseUser>>() { @Override public void onSuccess(List<EaseUser> uList) { updateContactList(uList); getUserProfileManager().notifyContactInfosSyncListener(true); } @Override public void onError(int error, String errorMsg) { } }); if(callback != null){ callback.onSuccess(usernames); } } catch (EaseMobException e) { demoModel.setContactSynced(false); isContactsSyncedWithServer = false; isSyncingContactsWithServer = false; noitifyGroupSyncListeners(false); e.printStackTrace(); if(callback != null){ callback.onError(e.getErrorCode(), e.toString()); } } } }.start(); } public void notifyContactsSyncListener(boolean success){ for (DataSyncListener listener : syncContactsListeners) { listener.onSyncComplete(success); } } public void asyncFetchBlackListFromServer(final EMValueCallBack<List<String>> callback){ if(isSyncingBlackListWithServer){ return; } isSyncingBlackListWithServer = true; new Thread(){ @Override public void run(){ try { List<String> usernames = EMContactManager.getInstance().getBlackListUsernamesFromServer(); // in case that logout already before server returns, we should return immediately if(!EMChat.getInstance().isLoggedIn()){ return; } demoModel.setBlacklistSynced(true); isBlackListSyncedWithServer = true; isSyncingBlackListWithServer = false; EMContactManager.getInstance().saveBlackList(usernames); notifyBlackListSyncListener(true); if(callback != null){ callback.onSuccess(usernames); } } catch (EaseMobException e) { demoModel.setBlacklistSynced(false); isBlackListSyncedWithServer = false; isSyncingBlackListWithServer = true; e.printStackTrace(); if(callback != null){ callback.onError(e.getErrorCode(), e.toString()); } } } }.start(); } public void notifyBlackListSyncListener(boolean success){ for (DataSyncListener listener : syncBlackListListeners) { listener.onSyncComplete(success); } } public boolean isSyncingGroupsWithServer() { return isSyncingGroupsWithServer; } public boolean isSyncingContactsWithServer() { return isSyncingContactsWithServer; } public boolean isSyncingBlackListWithServer() { return isSyncingBlackListWithServer; } public boolean isGroupsSyncedWithServer() { return isGroupsSyncedWithServer; } public boolean isContactsSyncedWithServer() { return isContactsSyncedWithServer; } public boolean isBlackListSyncedWithServer() { return isBlackListSyncedWithServer; } public synchronized void notifyForRecevingEvents(){ if(alreadyNotified){ return; } // 通知sdk,UI 已经初始化完毕,注册了相应的receiver和listener, 可以接受broadcast了 EMChat.getInstance().setAppInited(); alreadyNotified = true; } synchronized void reset(){ isSyncingGroupsWithServer = false; isSyncingContactsWithServer = false; isSyncingBlackListWithServer = false; demoModel.setGroupsSynced(false); demoModel.setContactSynced(false); demoModel.setBlacklistSynced(false); isGroupsSyncedWithServer = false; isContactsSyncedWithServer = false; isBlackListSyncedWithServer = false; alreadyNotified = false; isGroupAndContactListenerRegisted = false; setContactList(null); setRobotList(null); getUserProfileManager().reset(); DemoDBManager.getInstance().closeDB(); } public void pushActivity(Activity activity) { easeUI.pushActivity(activity); } public void popActivity(Activity activity) { easeUI.popActivity(activity); } }