package com.example.nanchen.aiyaschoolpush.helper; 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.example.nanchen.aiyaschoolpush.App; import com.example.nanchen.aiyaschoolpush.R; import com.example.nanchen.aiyaschoolpush.ui.activity.ChatActivity; import com.example.nanchen.aiyaschoolpush.ui.activity.MainActivity; import com.example.nanchen.aiyaschoolpush.ui.activity.VideoCallActivity; import com.example.nanchen.aiyaschoolpush.ui.activity.VoiceCallActivity; import com.example.nanchen.aiyaschoolpush.db.DemoDBManager; import com.example.nanchen.aiyaschoolpush.db.InviteMessgeDao; import com.example.nanchen.aiyaschoolpush.db.UserDao; import com.example.nanchen.aiyaschoolpush.im.Constant; import com.example.nanchen.aiyaschoolpush.im.DataSyncListener; import com.example.nanchen.aiyaschoolpush.im.EmojiconExampleGroupData; import com.example.nanchen.aiyaschoolpush.im.InviteMesageStatus; import com.example.nanchen.aiyaschoolpush.im.InviteMessage; import com.example.nanchen.aiyaschoolpush.im.PreferenceManager; import com.example.nanchen.aiyaschoolpush.im.UserProfileManager; import com.example.nanchen.aiyaschoolpush.model.DemoModel; import com.hyphenate.EMCallBack; import com.hyphenate.EMConnectionListener; import com.hyphenate.EMContactListener; import com.hyphenate.EMError; import com.hyphenate.EMGroupChangeListener; import com.hyphenate.EMMessageListener; import com.hyphenate.EMValueCallBack; import com.hyphenate.chat.EMClient; import com.hyphenate.chat.EMCmdMessageBody; import com.hyphenate.chat.EMGroup; import com.hyphenate.chat.EMMessage; import com.hyphenate.chat.EMMessage.ChatType; import com.hyphenate.chat.EMMessage.Status; import com.hyphenate.chat.EMMessage.Type; import com.hyphenate.chat.EMOptions; import com.hyphenate.chat.EMTextMessageBody; import com.hyphenate.easeui.controller.EaseUI; import com.hyphenate.easeui.controller.EaseUI.EaseEmojiconInfoProvider; import com.hyphenate.easeui.controller.EaseUI.EaseSettingsProvider; import com.hyphenate.easeui.controller.EaseUI.EaseUserProfileProvider; import com.hyphenate.easeui.domain.EaseEmojicon; import com.hyphenate.easeui.domain.EaseEmojiconGroupEntity; import com.hyphenate.easeui.domain.EaseUser; import com.hyphenate.easeui.model.EaseAtMessageHelper; import com.hyphenate.easeui.model.EaseNotifier; import com.hyphenate.easeui.model.EaseNotifier.EaseNotificationInfoProvider; import com.hyphenate.easeui.utils.EaseCommonUtils; import com.hyphenate.exceptions.HyphenateException; import com.hyphenate.util.EMLog; import java.util.ArrayList; import java.util.HashMap; import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.UUID; /** * @author nanchen * @fileName AiYaSchoolPush * @packageName com.example.nanchen.aiyaschoolpush.helper * @date 2016/10/28 08:49 */ public class DemoHelper { protected static final String TAG = "DemoHelper"; private EaseUI easeUI; /** * EMEventListener */ protected EMMessageListener messageListener = null; private Map contactList; private UserProfileManager userProManager; private static DemoHelper instance = null; private DemoModel demoModel = null; /** * sync groups status listener */ private List syncGroupsListeners; /** * sync contacts status listener */ private List syncContactsListeners; /** * sync blacklist status listener */ private List 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; public boolean isVoiceCalling; public boolean isVideoCalling; private String username; private Context appContext; private CallReceiver callReceiver; 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) { demoModel = new DemoModel(context); EMOptions options = initChatOptions(); //use default options if options is null if (EaseUI.getInstance().init(context, options)) { appContext = context; //debug mode, you'd better set it to false, if you want release your App officially. EMClient.getInstance().setDebugMode(true); //get easeui instance easeUI = EaseUI.getInstance(); //to set user's profile and avatar setEaseUIProviders(); //initialize preference manager PreferenceManager.init(context); //initialize profile manager getUserProfileManager().init(context); // EMClient.getInstance().callManager().getCallOptions().setIsSendPushIfOffline(getModel().isPushCall()); EMClient.getInstance().callManager().getCallOptions().setIsSendPushIfOffline(true); setGlobalListeners(); broadcastManager = LocalBroadcastManager.getInstance(appContext); initDbDao(); // 初始化easeUI easeUI.init(App.getAppContext(),options); EMClient.getInstance().callManager().getCallOptions().setIsSendPushIfOffline(true);// 设置离线推送为真 } } private EMOptions initChatOptions(){ Log.d(TAG, "init HuanXin Options"); EMOptions options = new EMOptions(); // set if accept the invitation automatically options.setAcceptInvitationAlways(false); // set if you need read ack options.setRequireAck(true); // set if you need delivery ack options.setRequireDeliveryAck(false); //you need apply & set your own id if you want to use google cloud messaging. options.setGCMNumber("324169311137"); //you need apply & set your own id if you want to use Mi push notification options.setMipushConfig("2882303761517426801", "5381742660801"); //you need apply & set your own id if you want to use Huawei push notification options.setHuaweiPushAppId("10492024"); //set custom servers, commonly used in private deployment if(demoModel.isCustomServerEnable() && demoModel.getRestServer() != null && demoModel.getIMServer() != null) { options.setRestServer(demoModel.getRestServer()); options.setIMServer(demoModel.getIMServer()); if(demoModel.getIMServer().contains(":")) { options.setIMServer(demoModel.getIMServer().split(":")[0]); options.setImPort(Integer.valueOf(demoModel.getIMServer().split(":")[1])); } } if (demoModel.isCustomAppkeyEnabled() && demoModel.getCutomAppkey() != null && !demoModel.getCutomAppkey().isEmpty()) { options.setAppKey(demoModel.getCutomAppkey()); } options.allowChatroomOwnerLeave(getModel().isChatroomOwnerLeaveAllowed()); options.setDeleteMessagesAsExitGroup(getModel().isDeleteMessagesAsExitGroup()); options.setAutoAcceptGroupInvitation(getModel().isAutoAcceptGroupInvitation()); return options; } protected void setEaseUIProviders() { // set profile provider if you want easeUI to handle avatar and nickname easeUI.setUserProfileProvider(new EaseUserProfileProvider() { @Override public EaseUser getUser(String username) { return getUserInfo(username); } }); //set options 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 notNotifyIds = null; // get user or group id which was blocked to show message notifications 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; } } } }); //set emoji icon 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 getTextEmojiconMapping() { return null; } }); //set notification options, will use default if you don't set it easeUI.getNotifier().setNotificationInfoProvider(new EaseNotificationInfoProvider() { @Override public String getTitle(EMMessage message) { //you can update title here return null; } @Override public int getSmallIcon(EMMessage message) { //you can update icon here return 0; } @Override public String getDisplayedText(EMMessage message) { // be used on notification bar, different text according the message type. String ticker = EaseCommonUtils.getMessageDigest(message, appContext); if(message.getType() == Type.TXT){ ticker = ticker.replaceAll("\\[.{2,3}\\]", "[表情]"); } EaseUser user = getUserInfo(message.getFrom()); if(user != null){ if(EaseAtMessageHelper.get().isAtMeMsg(message)){ return String.format(appContext.getString(R.string.at_your_in_group), user.getNick()); } return user.getNick() + ": " + ticker; }else{ if(EaseAtMessageHelper.get().isAtMeMsg(message)){ return String.format(appContext.getString(R.string.at_your_in_group), message.getFrom()); } return message.getFrom() + ": " + ticker; } } @Override public String getLatestText(EMMessage message, int fromUsersNum, int messageNum) { // here you can customize the text. // return fromUsersNum + "contacts send " + messageNum + "messages to you"; return null; } @Override public Intent getLaunchIntent(EMMessage message) { // you can set what activity you want display when user click the notification Intent intent = new Intent(appContext, ChatActivity.class); // open calling activity if there is call 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) { // single chat message intent.putExtra("userId", message.getFrom()); intent.putExtra("chatType", Constant.CHATTYPE_SINGLE); } else { // group chat message // message.getTo() is the group 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; } }); } EMConnectionListener connectionListener; /** * set global listener */ protected void setGlobalListeners(){ syncGroupsListeners = new ArrayList(); syncContactsListeners = new ArrayList(); syncBlackListListeners = new ArrayList(); isGroupsSyncedWithServer = demoModel.isGroupsSynced(); isContactsSyncedWithServer = demoModel.isContactSynced(); isBlackListSyncedWithServer = demoModel.isBacklistSynced(); // create the global connection listener connectionListener = new EMConnectionListener() { @Override public void onDisconnected(int error) { EMLog.d("global listener", "onDisconnect" + error); Log.e("abc",error+""); if (error == EMError.USER_REMOVED) { onUserException(Constant.ACCOUNT_REMOVED); } else if (error == EMError.USER_LOGIN_ANOTHER_DEVICE) { onUserException(Constant.ACCOUNT_CONFLICT); } else if (error == EMError.SERVER_SERVICE_RESTRICTED) { onUserException(Constant.ACCOUNT_FORBIDDEN); } } @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) { EMLog.d(TAG, "group and contact already synced with servre"); } else { if (!isGroupsSyncedWithServer) { asyncFetchGroupsFromServer(null); } if (!isContactsSyncedWithServer) { asyncFetchContactsFromServer(null); } if (!isBlackListSyncedWithServer) { asyncFetchBlackListFromServer(null); } } } }; IntentFilter callFilter = new IntentFilter(EMClient.getInstance().callManager().getIncomingCallBroadcastAction()); if(callReceiver == null){ callReceiver = new CallReceiver(); } //register incoming call receiver appContext.registerReceiver(callReceiver, callFilter); //register connection listener EMClient.getInstance().addConnectionListener(connectionListener); //register group and contact event listener registerGroupAndContactListener(); //register message event listener registerMessageListener(); } private void initDbDao() { inviteMessgeDao = new InviteMessgeDao(appContext); userDao = new UserDao(appContext); } /** * register group and contact listener, you need register when login */ public void registerGroupAndContactListener(){ if(!isGroupAndContactListenerRegisted){ EMClient.getInstance().groupManager().addGroupChangeListener(new MyGroupChangeListener()); EMClient.getInstance().contactManager().setContactListener(new MyContactListener()); isGroupAndContactListenerRegisted = true; } } /** * group change listener */ class MyGroupChangeListener implements EMGroupChangeListener { @Override public void onInvitationReceived(String groupId, String groupName, String inviter, String reason) { new InviteMessgeDao(appContext).deleteMessage(groupId); // user invite you to join group InviteMessage msg = new InviteMessage(); msg.setFrom(groupId); msg.setTime(System.currentTimeMillis()); msg.setGroupId(groupId); msg.setGroupName(groupName); msg.setReason(reason); msg.setGroupInviter(inviter); Log.d(TAG, "receive invitation to join the group:" + groupName); msg.setStatus(InviteMesageStatus.GROUPINVITATION); notifyNewInviteMessage(msg); broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); } @Override public void onInvitationAccepted(String groupId, String invitee, String reason) { new InviteMessgeDao(appContext).deleteMessage(groupId); //user accept your invitation boolean hasGroup = false; EMGroup _group = null; for (EMGroup group : EMClient.getInstance().groupManager().getAllGroups()) { if (group.getGroupId().equals(groupId)) { hasGroup = true; _group = group; break; } } if (!hasGroup) return; InviteMessage msg = new InviteMessage(); msg.setFrom(groupId); msg.setTime(System.currentTimeMillis()); msg.setGroupId(groupId); msg.setGroupName(_group == null ? groupId : _group.getGroupName()); msg.setReason(reason); msg.setGroupInviter(invitee); Log.d(TAG, invitee + "Accept to join the group:" + _group == null ? groupId : _group.getGroupName()); msg.setStatus(InviteMesageStatus.GROUPINVITATION_ACCEPTED); notifyNewInviteMessage(msg); broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); } @Override public void onInvitationDeclined(String groupId, String invitee, String reason) { new InviteMessgeDao(appContext).deleteMessage(groupId); //user declined your invitation EMGroup group = null; for (EMGroup _group : EMClient.getInstance().groupManager().getAllGroups()) { if (_group.getGroupId().equals(groupId)) { group = _group; break; } } if (group == null) return; InviteMessage msg = new InviteMessage(); msg.setFrom(groupId); msg.setTime(System.currentTimeMillis()); msg.setGroupId(groupId); msg.setGroupName(group.getGroupName()); msg.setReason(reason); msg.setGroupInviter(invitee); Log.d(TAG, invitee + "Declined to join the group:" + group.getGroupName()); msg.setStatus(InviteMesageStatus.GROUPINVITATION_DECLINED); notifyNewInviteMessage(msg); broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); } @Override public void onUserRemoved(String groupId, String groupName) { //user is removed from group broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); } @Override public void onGroupDestroyed(String groupId, String groupName) { // group is dismissed, broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); } @Override public void onApplicationReceived(String groupId, String groupName, String applyer, String reason) { // user apply to join group InviteMessage msg = new InviteMessage(); msg.setFrom(applyer); msg.setTime(System.currentTimeMillis()); msg.setGroupId(groupId); msg.setGroupName(groupName); msg.setReason(reason); Log.d(TAG, applyer + " Apply to join group:" + groupName); msg.setStatus(InviteMesageStatus.BEAPPLYED); notifyNewInviteMessage(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); // your application was accepted EMMessage msg = EMMessage.createReceiveMessage(Type.TXT); msg.setChatType(ChatType.GroupChat); msg.setFrom(accepter); msg.setTo(groupId); msg.setMsgId(UUID.randomUUID().toString()); msg.addBody(new EMTextMessageBody(accepter + " " +st4)); msg.setStatus(Status.SUCCESS); // save accept message EMClient.getInstance().chatManager().saveMessage(msg); // notify the accept message getNotifier().vibrateAndPlayTone(msg); broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); } @Override public void onApplicationDeclined(String groupId, String groupName, String decliner, String reason) { // your application was declined, we do nothing here in demo } @Override public void onAutoAcceptInvitationFromGroup(String groupId, String inviter, String inviteMessage) { // got an invitation 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 EMTextMessageBody(inviter + " " +st3)); msg.setStatus(EMMessage.Status.SUCCESS); // save invitation as messages EMClient.getInstance().chatManager().saveMessage(msg); // notify invitation message getNotifier().vibrateAndPlayTone(msg); EMLog.d(TAG, "onAutoAcceptInvitationFromGroup groupId:" + groupId); broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); } } /*** * 好友变化listener * */ public class MyContactListener implements EMContactListener { @Override public void onContactAdded(String username) { // save contact Map localUsers = getContactList(); Map toAddUsers = new HashMap(); EaseUser user = new EaseUser(username); if (!localUsers.containsKey(username)) { userDao.saveContact(user); } toAddUsers.put(username, user); localUsers.putAll(toAddUsers); broadcastManager.sendBroadcast(new Intent(Constant.ACTION_CONTACT_CHANAGED)); } @Override public void onContactDeleted(String username) { Map localUsers = DemoHelper.getInstance().getContactList(); 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 msgs = inviteMessgeDao.getMessagesList(); for (InviteMessage inviteMessage : msgs) { if (inviteMessage.getGroupId() == null && inviteMessage.getFrom().equals(username)) { inviteMessgeDao.deleteMessage(username); } } // save invitation as message InviteMessage msg = new InviteMessage(); msg.setFrom(username); msg.setTime(System.currentTimeMillis()); msg.setReason(reason); Log.d(TAG, username + "apply to be your friend,reason: " + reason); // set invitation status msg.setStatus(InviteMesageStatus.BEINVITEED); notifyNewInviteMessage(msg); broadcastManager.sendBroadcast(new Intent(Constant.ACTION_CONTACT_CHANAGED)); } @Override public void onContactAgreed(String username) { List msgs = inviteMessgeDao.getMessagesList(); for (InviteMessage inviteMessage : msgs) { if (inviteMessage.getFrom().equals(username)) { return; } } // save invitation as message InviteMessage msg = new InviteMessage(); msg.setFrom(username); msg.setTime(System.currentTimeMillis()); Log.d(TAG, username + "accept your request"); msg.setStatus(InviteMesageStatus.BEAGREED); notifyNewInviteMessage(msg); broadcastManager.sendBroadcast(new Intent(Constant.ACTION_CONTACT_CHANAGED)); } @Override public void onContactRefused(String username) { // your request was refused Log.d(username, username + " refused to your request"); } } /** * save and notify invitation message * @param msg */ private void notifyNewInviteMessage(InviteMessage msg){ if(inviteMessgeDao == null){ inviteMessgeDao = new InviteMessgeDao(appContext); } inviteMessgeDao.saveMessage(msg); //increase the unread message count inviteMessgeDao.saveUnreadMessageCount(1); // notify there is new message getNotifier().vibrateAndPlayTone(null); } /** * user met some exception: conflict, removed or forbidden */ protected void onUserException(String exception){ EMLog.e(TAG, "onUserException: " + exception); Intent intent = new Intent(appContext, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(exception, true); appContext.startActivity(intent); } private EaseUser getUserInfo(String username){ // To get instance of EaseUser, here we get it from the user list in memory // You'd better cache it if you get it from your server EaseUser user = null; if(username.equals(EMClient.getInstance().getCurrentUser())) return getUserProfileManager().getCurrentUserInfo(); user = getContactList().get(username); // if(user == null && getRobotList() != null){ // user = getRobotList().get(username); // } // if user is not in your contacts, set inital letter for him/her if(user == null){ user = new EaseUser(username); EaseCommonUtils.setUserInitialLetter(user); } return user; } /** * Global listener * If this event already handled by an activity, you don't need handle it again * activityList.size() <= 0 means all activities already in background or not in Activity Stack */ protected void registerMessageListener() { messageListener = new EMMessageListener() { private BroadcastReceiver broadCastReceiver = null; @Override public void onMessageReceived(List messages) { for (EMMessage message : messages) { EMLog.d(TAG, "onMessageReceived id : " + message.getMsgId()); // in background, do not refresh UI, notify it in notification bar if(!easeUI.hasForegroundActivies()){ getNotifier().onNewMsg(message); } } } @Override public void onCmdMessageReceived(List messages) { for (EMMessage message : messages) { EMLog.d(TAG, "receive command message"); //get message body EMCmdMessageBody cmdMsgBody = (EMCmdMessageBody) message.getBody(); final String action = cmdMsgBody.action();//获取自定义action //red packet code : 处理红包回执透传消息 if(!easeUI.hasForegroundActivies()){ // if (action.equals(RPConstant.REFRESH_GROUP_RED_PACKET_ACTION)){ // RedPacketUtil.receiveRedPacketAckMessage(message); // broadcastManager.sendBroadcast(new Intent(RPConstant.REFRESH_GROUP_RED_PACKET_ACTION)); // } } if (action.equals("__Call_ReqP2P_ConferencePattern")) { String title = message.getStringAttribute("em_apns_ext", "conference call"); Toast.makeText(appContext, title, Toast.LENGTH_LONG).show(); } //end of red packet code //获取扩展属性 此处省略 //maybe you need get extension of your message //message.getStringAttribute(""); EMLog.d(TAG, String.format("Command:action:%s,message:%s", action,message.toString())); } } @Override public void onMessageReadAckReceived(List messages) { } @Override public void onMessageDeliveryAckReceived(List message) { } @Override public void onMessageChanged(EMMessage message, Object change) { } }; EMClient.getInstance().chatManager().addMessageListener(messageListener); } /** * if ever logged in * * @return */ public boolean isLoggedIn() { return EMClient.getInstance().isLoggedInBefore(); } /** * logout * * @param unbindDeviceToken * whether you need unbind your device token * @param callback * callback */ public void logout(boolean unbindDeviceToken, final EMCallBack callback) { endCall(); Log.d(TAG, "logout: " + unbindDeviceToken); EMClient.getInstance().logout(unbindDeviceToken, new EMCallBack() { @Override public void onSuccess() { Log.d(TAG, "logout: 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) { Log.d(TAG, "logout: onSuccess"); reset(); if (callback != null) { callback.onError(code, error); } } }); } /** * get instance of EaseNotifier * @return */ public EaseNotifier getNotifier(){ return easeUI.getNotifier(); } public DemoModel getModel(){ return (DemoModel) demoModel; } /** * update contact list * * @param aContactList */ public void setContactList(Map aContactList) { if(aContactList == null){ if (contactList != null) { contactList.clear(); } return; } contactList = aContactList; } /** * save single contact */ public void saveContact(EaseUser user){ contactList.put(user.getUsername(), user); demoModel.saveContact(user); } /** * get contact list * * @return */ public Map getContactList() { if (isLoggedIn() && contactList == null) { contactList = demoModel.getContactList(); } // return a empty non-null object to avoid app crash if(contactList == null){ return new Hashtable(); } return contactList; } /** * set current username * @param username */ public void setCurrentUserName(String username){ this.username = username; demoModel.setCurrentUserName(username); } /** * get current user's id */ public String getCurrentUserName(){ if(username == null){ username = demoModel.getCurrentUsernName(); } return username; } /** * update user list to cache and database * * @param contactInfoList */ public void updateContactList(List contactInfoList) { for (EaseUser u : contactInfoList) { contactList.put(u.getUsername(), u); } ArrayList mList = new ArrayList(); mList.addAll(contactList.values()); demoModel.saveContactList(mList); } public UserProfileManager getUserProfileManager() { if (userProManager == null) { userProManager = new UserProfileManager(); } return userProManager; } void endCall() { try { EMClient.getInstance().callManager().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); } } /** * Get group list from server * This method will save the sync state * @throws HyphenateException */ public synchronized void asyncFetchGroupsFromServer(final EMCallBack callback){ if(isSyncingGroupsWithServer){ return; } isSyncingGroupsWithServer = true; new Thread(){ @Override public void run(){ try { EMClient.getInstance().groupManager().getJoinedGroupsFromServer(); // in case that logout already before server returns, we should return immediately if(!isLoggedIn()){ isGroupsSyncedWithServer = false; isSyncingGroupsWithServer = false; noitifyGroupSyncListeners(false); return; } demoModel.setGroupsSynced(true); isGroupsSyncedWithServer = true; isSyncingGroupsWithServer = false; //notify sync group list success noitifyGroupSyncListeners(true); if(callback != null){ callback.onSuccess(); } } catch (HyphenateException 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> callback){ if(isSyncingContactsWithServer){ return; } isSyncingContactsWithServer = true; new Thread(){ @Override public void run(){ List usernames = null; try { usernames = EMClient.getInstance().contactManager().getAllContactsFromServer(); // in case that logout already before server returns, we should return immediately if(!isLoggedIn()){ isContactsSyncedWithServer = false; isSyncingContactsWithServer = false; notifyContactsSyncListener(false); return; } Map userlist = new HashMap(); for (String username : usernames) { EaseUser user = new EaseUser(username); EaseCommonUtils.setUserInitialLetter(user); userlist.put(username, user); } // save the contact list to cache getContactList().clear(); getContactList().putAll(userlist); // save the contact list to database UserDao dao = new UserDao(appContext); List users = new ArrayList(userlist.values()); dao.saveContactList(users); demoModel.setContactSynced(true); EMLog.d(TAG, "set contact syn status to true"); isContactsSyncedWithServer = true; isSyncingContactsWithServer = false; //notify sync success notifyContactsSyncListener(true); getUserProfileManager().asyncFetchContactInfosFromServer(usernames,new EMValueCallBack>() { @Override public void onSuccess(List uList) { updateContactList(uList); getUserProfileManager().notifyContactInfosSyncListener(true); } @Override public void onError(int error, String errorMsg) { } }); if(callback != null){ callback.onSuccess(usernames); } } catch (HyphenateException e) { demoModel.setContactSynced(false); isContactsSyncedWithServer = false; isSyncingContactsWithServer = false; notifyContactsSyncListener(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> callback){ if(isSyncingBlackListWithServer){ return; } isSyncingBlackListWithServer = true; new Thread(){ @Override public void run(){ try { List usernames = EMClient.getInstance().contactManager().getBlackListFromServer(); // in case that logout already before server returns, we should return immediately if(!isLoggedIn()){ isBlackListSyncedWithServer = false; isSyncingBlackListWithServer = false; notifyBlackListSyncListener(false); return; } demoModel.setBlacklistSynced(true); isBlackListSyncedWithServer = true; isSyncingBlackListWithServer = false; notifyBlackListSyncListener(true); if(callback != null){ callback.onSuccess(usernames); } } catch (HyphenateException 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; } synchronized void reset(){ isSyncingGroupsWithServer = false; isSyncingContactsWithServer = false; isSyncingBlackListWithServer = false; demoModel.setGroupsSynced(false); demoModel.setContactSynced(false); demoModel.setBlacklistSynced(false); isGroupsSyncedWithServer = false; isContactsSyncedWithServer = false; isBlackListSyncedWithServer = 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); } }