From d99643f39c50ae801746c9cdaf33d7cbedb83e95 Mon Sep 17 00:00:00 2001 From: dujiepeng <347302029@qq.com> Date: Sun, 24 Apr 2022 20:08:59 +0800 Subject: [PATCH 1/8] add callback handle. --- .../main/java/com/easemob/im_flutter_sdk/EMListenerHandle.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 android/src/main/java/com/easemob/im_flutter_sdk/EMListenerHandle.java diff --git a/android/src/main/java/com/easemob/im_flutter_sdk/EMListenerHandle.java b/android/src/main/java/com/easemob/im_flutter_sdk/EMListenerHandle.java new file mode 100644 index 00000000..60878703 --- /dev/null +++ b/android/src/main/java/com/easemob/im_flutter_sdk/EMListenerHandle.java @@ -0,0 +1,2 @@ +package com.easemob.im_flutter_sdk;public class EMListenerHandle { +} From 1eff028459079d6d04758433de20fca8425aab96 Mon Sep 17 00:00:00 2001 From: dujiepeng <347302029@qq.com> Date: Sun, 24 Apr 2022 20:09:43 +0800 Subject: [PATCH 2/8] update. --- .../EMChatRoomManagerWrapper.java | 224 +++++++----- .../im_flutter_sdk/EMClientWrapper.java | 7 + .../EMContactManagerWrapper.java | 68 ++-- .../im_flutter_sdk/EMGroupManagerWrapper.java | 345 +++++++++++------- .../im_flutter_sdk/EMListenerHandle.java | 54 ++- .../easemob/im_flutter_sdk/EMSDKMethod.java | 5 + example/android/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 6 +- example/lib/pages/chat/chat_page.dart | 2 +- example/lib/pages/home_page.dart | 31 +- lib/src/em_client.dart | 9 + lib/src/internal/chat_method_keys.dart | 3 + 12 files changed, 503 insertions(+), 253 deletions(-) diff --git a/android/src/main/java/com/easemob/im_flutter_sdk/EMChatRoomManagerWrapper.java b/android/src/main/java/com/easemob/im_flutter_sdk/EMChatRoomManagerWrapper.java index d8ffa869..df1b83a1 100644 --- a/android/src/main/java/com/easemob/im_flutter_sdk/EMChatRoomManagerWrapper.java +++ b/android/src/main/java/com/easemob/im_flutter_sdk/EMChatRoomManagerWrapper.java @@ -555,149 +555,183 @@ private void registerEaseListener() { @Override public void onWhiteListAdded(String chatRoomId, List whitelist) { - post(() -> { - Map data = new HashMap<>(); - data.put("roomId", chatRoomId); - data.put("whitelist", whitelist); - data.put("type", "onWhiteListAdded"); - channel.invokeMethod(EMSDKMethod.chatRoomChange, data); - }); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("roomId", chatRoomId); + data.put("whitelist", whitelist); + data.put("type", "onWhiteListAdded"); + post(() -> channel.invokeMethod(EMSDKMethod.chatRoomChange, data)); + } + ); + } @Override public void onWhiteListRemoved(String chatRoomId, List whitelist) { - post(() -> { - Map data = new HashMap<>(); - data.put("roomId", chatRoomId); - data.put("whitelist", whitelist); - data.put("type", "onWhiteListRemoved"); - channel.invokeMethod(EMSDKMethod.chatRoomChange, data); - }); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("roomId", chatRoomId); + data.put("whitelist", whitelist); + data.put("type", "onWhiteListRemoved"); + post(() -> channel.invokeMethod(EMSDKMethod.chatRoomChange, data)); + } + ); } @Override public void onAllMemberMuteStateChanged(String chatRoomId, boolean isMuted) { - post(() -> { - Map data = new HashMap<>(); - data.put("roomId", chatRoomId); - data.put("isMuted", isMuted); - data.put("type", "onAllMemberMuteStateChanged"); - channel.invokeMethod(EMSDKMethod.chatRoomChange, data); - }); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("roomId", chatRoomId); + data.put("isMuted", isMuted); + data.put("type", "onAllMemberMuteStateChanged"); + post(() -> channel.invokeMethod(EMSDKMethod.chatRoomChange, data)); + } + ); + } @Override public void onChatRoomDestroyed(String roomId, String roomName) { - post(() -> { - Map data = new HashMap<>(); - data.put("roomId", roomId); - data.put("roomName", roomName); - data.put("type", "onChatRoomDestroyed"); - channel.invokeMethod(EMSDKMethod.chatRoomChange, data); - }); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("roomId", roomId); + data.put("roomName", roomName); + data.put("type", "onChatRoomDestroyed"); + post(() -> channel.invokeMethod(EMSDKMethod.chatRoomChange, data)); + } + ); + } @Override public void onMemberJoined(String roomId, String participant) { - post(() -> { - Map data = new HashMap<>(); - data.put("roomId", roomId); - data.put("participant", participant); - data.put("type", "onMemberJoined"); - channel.invokeMethod(EMSDKMethod.chatRoomChange, data); - }); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("roomId", roomId); + data.put("participant", participant); + data.put("type", "onMemberJoined"); + post(() -> channel.invokeMethod(EMSDKMethod.chatRoomChange, data)); + } + ); } @Override public void onMemberExited(String roomId, String roomName, String participant) { - post(() -> { - Map data = new HashMap<>(); - data.put("roomId", roomId); - data.put("roomName", roomName); - data.put("participant", participant); - data.put("type", "onMemberExited"); - channel.invokeMethod(EMSDKMethod.chatRoomChange, data); - }); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("roomId", roomId); + data.put("roomName", roomName); + data.put("participant", participant); + data.put("type", "onMemberExited"); + post(() -> channel.invokeMethod(EMSDKMethod.chatRoomChange, data)); + } + ); + } @Override public void onRemovedFromChatRoom(int reason, String roomId, String roomName, String participant) { - post(() -> { - Map data = new HashMap<>(); - data.put("roomId", roomId); - data.put("roomName", roomName); - data.put("participant", participant); - data.put("type", "onRemovedFromChatRoom"); - channel.invokeMethod(EMSDKMethod.chatRoomChange, data); - }); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("roomId", roomId); + data.put("roomName", roomName); + data.put("participant", participant); + data.put("type", "onRemovedFromChatRoom"); + post(() -> channel.invokeMethod(EMSDKMethod.chatRoomChange, data)); + } + ); + } @Override public void onMuteListAdded(String chatRoomId, List mutes, long expireTime) { - post(() -> { - Map data = new HashMap<>(); - data.put("roomId", chatRoomId); - data.put("mutes", mutes); - data.put("expireTime", String.valueOf(expireTime)); - data.put("type", "onMuteListAdded"); - channel.invokeMethod(EMSDKMethod.chatRoomChange, data); - }); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("roomId", chatRoomId); + data.put("mutes", mutes); + data.put("expireTime", String.valueOf(expireTime)); + data.put("type", "onMuteListAdded"); + post(() -> channel.invokeMethod(EMSDKMethod.chatRoomChange, data)); + } + ); } @Override public void onMuteListRemoved(String chatRoomId, List mutes) { - post(() -> { - Map data = new HashMap<>(); - data.put("roomId", chatRoomId); - data.put("mutes", mutes); - data.put("type", "onMuteListRemoved"); - channel.invokeMethod(EMSDKMethod.chatRoomChange, data); - }); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("roomId", chatRoomId); + data.put("mutes", mutes); + data.put("type", "onMuteListRemoved"); + post(() -> channel.invokeMethod(EMSDKMethod.chatRoomChange, data)); + } + ); + } @Override public void onAdminAdded(String chatRoomId, String admin) { - post(() -> { - Map data = new HashMap<>(); - data.put("roomId", chatRoomId); - data.put("admin", admin); - data.put("type", "onAdminAdded"); - channel.invokeMethod(EMSDKMethod.chatRoomChange, data); - }); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("roomId", chatRoomId); + data.put("admin", admin); + data.put("type", "onAdminAdded"); + post(() -> channel.invokeMethod(EMSDKMethod.chatRoomChange, data)); + } + ); + } @Override public void onAdminRemoved(String chatRoomId, String admin) { - post(() -> { - Map data = new HashMap<>(); - data.put("roomId", chatRoomId); - data.put("admin", admin); - data.put("type", "onAdminRemoved"); - channel.invokeMethod(EMSDKMethod.chatRoomChange, data); - }); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("roomId", chatRoomId); + data.put("admin", admin); + data.put("type", "onAdminRemoved"); + post(() -> channel.invokeMethod(EMSDKMethod.chatRoomChange, data)); + } + ); } @Override public void onOwnerChanged(String chatRoomId, String newOwner, String oldOwner) { - post(() -> { - Map data = new HashMap<>(); - data.put("roomId", chatRoomId); - data.put("newOwner", newOwner); - data.put("oldOwner", oldOwner); - data.put("chatRoomChange", "onOwnerChanged"); - channel.invokeMethod(EMSDKMethod.chatRoomChange, data); - }); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("roomId", chatRoomId); + data.put("newOwner", newOwner); + data.put("oldOwner", oldOwner); + data.put("chatRoomChange", "onOwnerChanged"); + post(() -> channel.invokeMethod(EMSDKMethod.chatRoomChange, data)); + } + ); + } @Override public void onAnnouncementChanged(String chatRoomId, String announcement) { - post(() -> { - Map data = new HashMap<>(); - data.put("roomId", chatRoomId); - data.put("announcement", announcement); - data.put("chatRoomChange", "onAnnouncementChanged"); - channel.invokeMethod(EMSDKMethod.chatRoomChange, data); - }); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("roomId", chatRoomId); + data.put("announcement", announcement); + data.put("chatRoomChange", "onAnnouncementChanged"); + post(() -> channel.invokeMethod(EMSDKMethod.chatRoomChange, data)); + } + ); } }); } diff --git a/android/src/main/java/com/easemob/im_flutter_sdk/EMClientWrapper.java b/android/src/main/java/com/easemob/im_flutter_sdk/EMClientWrapper.java index d0ed296a..78a33b8a 100644 --- a/android/src/main/java/com/easemob/im_flutter_sdk/EMClientWrapper.java +++ b/android/src/main/java/com/easemob/im_flutter_sdk/EMClientWrapper.java @@ -112,6 +112,8 @@ else if (EMSDKMethod.isConnected.equals(call.method)) { } else if (EMSDKMethod.renewToken.equals(call.method)){ renewToken(param, call.method, result); + } else if (EMSDKMethod.startCallback.equals(call.method)) { + startCallback(); } else { super.onMethodCall(call, result); @@ -163,6 +165,7 @@ private void logout(JSONObject param, String channelName, Result result) throws EMClient.getInstance().logout(unbindToken, new EMWrapperCallBack(result, channelName, null){ @Override public void onSuccess() { + EMListenerHandle.getInstance().clearListener(); object = true; super.onSuccess(); } @@ -296,6 +299,10 @@ private void getLoggedInDevicesFromServer(JSONObject param, String channelName, }); } + private void startCallback() { + EMListenerHandle.getInstance().startCallback(); + } + private void bindingManagers() { new EMChatManagerWrapper(binging, "chat_manager"); new EMContactManagerWrapper(binging, "chat_contact_manager"); diff --git a/android/src/main/java/com/easemob/im_flutter_sdk/EMContactManagerWrapper.java b/android/src/main/java/com/easemob/im_flutter_sdk/EMContactManagerWrapper.java index 521b74e8..57c14968 100644 --- a/android/src/main/java/com/easemob/im_flutter_sdk/EMContactManagerWrapper.java +++ b/android/src/main/java/com/easemob/im_flutter_sdk/EMContactManagerWrapper.java @@ -51,7 +51,8 @@ public void onMethodCall(MethodCall call, Result result) { declineInvitation(param, call.method, result); } else if (EMSDKMethod.getSelfIdsOnOtherPlatform.equals(call.method)) { getSelfIdsOnOtherPlatform(param, call.method, result); - } else { + } + else { super.onMethodCall(call, result); } } catch (JSONException e) { @@ -182,51 +183,70 @@ private void getSelfIdsOnOtherPlatform(JSONObject params, String channelName, Re onError(result, e); } }); - } + private void registerEaseListener() { EMClient.getInstance().contactManager().setContactListener(new EMContactListener() { @Override public void onContactAdded(String userName) { - Map data = new HashMap<>(); - data.put("type", "onContactAdded"); - data.put("username", userName); - post(() -> channel.invokeMethod(EMSDKMethod.onContactChanged, data)); - + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onContactAdded"); + data.put("username", userName); + post(() -> channel.invokeMethod(EMSDKMethod.onContactChanged, data)); + } + ); } @Override public void onContactDeleted(String userName) { - Map data = new HashMap<>(); - data.put("type", "onContactDeleted"); - data.put("username", userName); - post(() -> channel.invokeMethod(EMSDKMethod.onContactChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onContactDeleted"); + data.put("username", userName); + post(() -> channel.invokeMethod(EMSDKMethod.onContactChanged, data)); + } + ); } @Override public void onContactInvited(String userName, String reason) { - Map data = new HashMap<>(); - data.put("type", "onContactInvited"); - data.put("username", userName); - data.put("reason", reason); - post(() -> channel.invokeMethod(EMSDKMethod.onContactChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onContactInvited"); + data.put("username", userName); + data.put("reason", reason); + post(() -> channel.invokeMethod(EMSDKMethod.onContactChanged, data)); + } + ); } @Override public void onFriendRequestAccepted(String userName) { - Map data = new HashMap<>(); - data.put("type", "onFriendRequestAccepted"); - data.put("username", userName); - post(() -> channel.invokeMethod(EMSDKMethod.onContactChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onFriendRequestAccepted"); + data.put("username", userName); + post(() -> channel.invokeMethod(EMSDKMethod.onContactChanged, data)); + } + ); } @Override public void onFriendRequestDeclined(String userName) { - Map data = new HashMap<>(); - data.put("type", "onFriendRequestDeclined"); - data.put("username", userName); - post(() -> channel.invokeMethod(EMSDKMethod.onContactChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onFriendRequestDeclined"); + data.put("username", userName); + post(() -> channel.invokeMethod(EMSDKMethod.onContactChanged, data)); + } + ); } }); } diff --git a/android/src/main/java/com/easemob/im_flutter_sdk/EMGroupManagerWrapper.java b/android/src/main/java/com/easemob/im_flutter_sdk/EMGroupManagerWrapper.java index c5c4ac04..1a7e8ec6 100644 --- a/android/src/main/java/com/easemob/im_flutter_sdk/EMGroupManagerWrapper.java +++ b/android/src/main/java/com/easemob/im_flutter_sdk/EMGroupManagerWrapper.java @@ -902,216 +902,309 @@ private void registerEaseListener() { @Override public void onWhiteListAdded(String groupId, List whitelist) { - Map data = new HashMap<>(); - data.put("type", "onWhiteListAdded"); - data.put("groupId", groupId); - data.put("whitelist", whitelist); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onWhiteListAdded"); + data.put("groupId", groupId); + data.put("whitelist", whitelist); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); } @Override public void onWhiteListRemoved(String groupId, List whitelist) { - Map data = new HashMap<>(); - data.put("type", "onWhiteListRemoved"); - data.put("groupId", groupId); - data.put("whitelist", whitelist); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onWhiteListRemoved"); + data.put("groupId", groupId); + data.put("whitelist", whitelist); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); } @Override public void onAllMemberMuteStateChanged(String groupId, boolean isMuted) { - Map data = new HashMap<>(); - data.put("type", "onAllMemberMuteStateChanged"); - data.put("groupId", groupId); - data.put("isMuted", isMuted); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onAllMemberMuteStateChanged"); + data.put("groupId", groupId); + data.put("isMuted", isMuted); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); } @Override public void onInvitationReceived(String groupId, String groupName, String inviter, String reason) { - Map data = new HashMap<>(); - data.put("type", "onInvitationReceived"); - data.put("groupId", groupId); - data.put("groupName", groupName); - data.put("inviter", inviter); - data.put("reason", reason); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onInvitationReceived"); + data.put("groupId", groupId); + data.put("groupName", groupName); + data.put("inviter", inviter); + data.put("reason", reason); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); } @Override public void onRequestToJoinReceived(String groupId, String groupName, String applicant, String reason) { - Map data = new HashMap<>(); - data.put("type", "onRequestToJoinReceived"); - data.put("groupId", groupId); - data.put("groupName", groupName); - data.put("applicant", applicant); - data.put("reason", reason); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onRequestToJoinReceived"); + data.put("groupId", groupId); + data.put("groupName", groupName); + data.put("applicant", applicant); + data.put("reason", reason); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); + } @Override public void onRequestToJoinAccepted(String groupId, String groupName, String accepter) { - Map data = new HashMap<>(); - data.put("type", "onRequestToJoinAccepted"); - data.put("groupId", groupId); - data.put("groupName", groupName); - data.put("accepter", accepter); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onRequestToJoinAccepted"); + data.put("groupId", groupId); + data.put("groupName", groupName); + data.put("accepter", accepter); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); + } @Override public void onRequestToJoinDeclined(String groupId, String groupName, String decliner, String reason) { - Map data = new HashMap<>(); - data.put("type", "onRequestToJoinDeclined"); - data.put("groupId", groupId); - data.put("groupName", groupName); - data.put("decliner", decliner); - data.put("reason", reason); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onRequestToJoinDeclined"); + data.put("groupId", groupId); + data.put("groupName", groupName); + data.put("decliner", decliner); + data.put("reason", reason); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); + } @Override public void onInvitationAccepted(String groupId, String invitee, String reason) { - Map data = new HashMap<>(); - data.put("type", "onInvitationAccepted"); - data.put("groupId", groupId); - data.put("invitee", invitee); - data.put("reason", reason); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onInvitationAccepted"); + data.put("groupId", groupId); + data.put("invitee", invitee); + data.put("reason", reason); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); + } @Override public void onInvitationDeclined(String groupId, String invitee, String reason) { - Map data = new HashMap<>(); - data.put("type", "onInvitationDeclined"); - data.put("groupId", groupId); - data.put("invitee", invitee); - data.put("reason", reason); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onInvitationDeclined"); + data.put("groupId", groupId); + data.put("invitee", invitee); + data.put("reason", reason); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); + } @Override public void onUserRemoved(String groupId, String groupName) { - Map data = new HashMap<>(); - data.put("type", "onUserRemoved"); - data.put("groupId", groupId); - data.put("groupName", groupName); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onUserRemoved"); + data.put("groupId", groupId); + data.put("groupName", groupName); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); + } @Override public void onGroupDestroyed(String groupId, String groupName) { - Map data = new HashMap<>(); - data.put("type", "onGroupDestroyed"); - data.put("groupId", groupId); - data.put("groupName", groupName); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onGroupDestroyed"); + data.put("groupId", groupId); + data.put("groupName", groupName); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); + } @Override public void onAutoAcceptInvitationFromGroup(String groupId, String inviter, String inviteMessage) { - Map data = new HashMap<>(); - data.put("type", "onAutoAcceptInvitationFromGroup"); - data.put("groupId", groupId); - data.put("inviter", inviter); - data.put("inviteMessage", inviteMessage); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onAutoAcceptInvitationFromGroup"); + data.put("groupId", groupId); + data.put("inviter", inviter); + data.put("inviteMessage", inviteMessage); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); + } @Override public void onMuteListAdded(String groupId, List mutes, long muteExpire) { - Map data = new HashMap<>(); - data.put("type", "onMuteListAdded"); - data.put("groupId", groupId); - data.put("mutes", mutes); - data.put("muteExpire", muteExpire); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onMuteListAdded"); + data.put("groupId", groupId); + data.put("mutes", mutes); + data.put("muteExpire", muteExpire); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); + } @Override public void onMuteListRemoved(String groupId, List mutes) { - Map data = new HashMap<>(); - data.put("type", "onMuteListRemoved"); - data.put("groupId", groupId); - data.put("mutes", mutes); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onMuteListRemoved"); + data.put("groupId", groupId); + data.put("mutes", mutes); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); } @Override public void onAdminAdded(String groupId, String administrator) { - Map data = new HashMap<>(); - data.put("type", "onAdminAdded"); - data.put("groupId", groupId); - data.put("administrator", administrator); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onAdminAdded"); + data.put("groupId", groupId); + data.put("administrator", administrator); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); } @Override public void onAdminRemoved(String groupId, String administrator) { - Map data = new HashMap<>(); - data.put("type", "onAdminRemoved"); - data.put("groupId", groupId); - data.put("administrator", administrator); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onAdminRemoved"); + data.put("groupId", groupId); + data.put("administrator", administrator); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); } @Override public void onOwnerChanged(String groupId, String newOwner, String oldOwner) { - Map data = new HashMap<>(); - data.put("type", "onOwnerChanged"); - data.put("groupId", groupId); - data.put("newOwner", newOwner); - data.put("oldOwner", oldOwner); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onOwnerChanged"); + data.put("groupId", groupId); + data.put("newOwner", newOwner); + data.put("oldOwner", oldOwner); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); } @Override public void onMemberJoined(String groupId, String member) { - Map data = new HashMap<>(); - data.put("type", "onMemberJoined"); - data.put("groupId", groupId); - data.put("member", member); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onMemberJoined"); + data.put("groupId", groupId); + data.put("member", member); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); } @Override public void onMemberExited(String groupId, String member) { - EMLog.e("_emGroupManagerWrapper", "onMemberExited"); - Map data = new HashMap<>(); - data.put("type", "onMemberExited"); - data.put("groupId", groupId); - data.put("member", member); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onMemberExited"); + data.put("groupId", groupId); + data.put("member", member); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); } @Override public void onAnnouncementChanged(String groupId, String announcement) { - EMLog.e("_emGroupManagerWrapper", "onAnnouncementChanged"); - Map data = new HashMap<>(); - data.put("type", "onAnnouncementChanged"); - data.put("groupId", groupId); - data.put("announcement", announcement); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onAnnouncementChanged"); + data.put("groupId", groupId); + data.put("announcement", announcement); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); } @Override public void onSharedFileAdded(String groupId, EMMucSharedFile sharedFile) { - EMLog.e("_emGroupManagerWrapper", "onSharedFileAdded"); - Map data = new HashMap<>(); - data.put("type", "onSharedFileAdded"); - data.put("groupId", groupId); - data.put("sharedFile", EMMucSharedFileHelper.toJson(sharedFile)); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onSharedFileAdded"); + data.put("groupId", groupId); + data.put("sharedFile", EMMucSharedFileHelper.toJson(sharedFile)); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); } @Override public void onSharedFileDeleted(String groupId, String fileId) { - EMLog.e("_emGroupManagerWrapper", "onSharedFileDeleted"); - Map data = new HashMap<>(); - data.put("type", "onSharedFileDeleted"); - data.put("groupId", groupId); - data.put("fileId", fileId); - post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + EMListenerHandle.getInstance().addHandle( + ()-> { + Map data = new HashMap<>(); + data.put("type", "onSharedFileDeleted"); + data.put("groupId", groupId); + data.put("fileId", fileId); + post(() -> channel.invokeMethod(EMSDKMethod.onGroupChanged, data)); + } + ); } }); } diff --git a/android/src/main/java/com/easemob/im_flutter_sdk/EMListenerHandle.java b/android/src/main/java/com/easemob/im_flutter_sdk/EMListenerHandle.java index 60878703..0565ec82 100644 --- a/android/src/main/java/com/easemob/im_flutter_sdk/EMListenerHandle.java +++ b/android/src/main/java/com/easemob/im_flutter_sdk/EMListenerHandle.java @@ -1,2 +1,54 @@ -package com.easemob.im_flutter_sdk;public class EMListenerHandle { +package com.easemob.im_flutter_sdk; + +import java.util.ArrayList; +import java.util.List; + +public class EMListenerHandle { + + static private EMListenerHandle handle; + + private List emActionHandle; + + private boolean hasReady; + + + public static EMListenerHandle getInstance() { + if (handle == null) { + handle = new EMListenerHandle(); + } + return handle; + } + + private EMListenerHandle(){ + emActionHandle = new ArrayList<>(); + } + + void addHandle(Runnable runnable) { + synchronized (emActionHandle){ + emActionHandle.add(runnable); + } + if (hasReady) { + runHandle(); + } + } + + void runHandle() { + synchronized (emActionHandle){ + List tmp = emActionHandle; + for (Runnable action : tmp) { + action.run(); + emActionHandle.remove(action); + } + } + } + + void startCallback(){ + hasReady = true; + runHandle(); + } + + void clearListener(){ + hasReady = false; + emActionHandle.clear(); + } } diff --git a/android/src/main/java/com/easemob/im_flutter_sdk/EMSDKMethod.java b/android/src/main/java/com/easemob/im_flutter_sdk/EMSDKMethod.java index e6c52867..2cb57702 100644 --- a/android/src/main/java/com/easemob/im_flutter_sdk/EMSDKMethod.java +++ b/android/src/main/java/com/easemob/im_flutter_sdk/EMSDKMethod.java @@ -221,4 +221,9 @@ public class EMSDKMethod { static final String updateOwnUserInfoWithType = "updateOwnUserInfoWithType"; static final String fetchUserInfoById = "fetchUserInfoById"; static final String fetchUserInfoByIdWithType = "fetchUserInfoByIdWithType"; + + + + /// HandleAction + static final String startCallback = "startCallback"; } diff --git a/example/android/build.gradle b/example/android/build.gradle index fd7b982e..3ae9bf12 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.1.2' + classpath 'com.android.tools.build:gradle:4.2.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index 6dbde025..6663eb89 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon May 10 15:43:45 CST 2021 +#Sun Apr 24 19:16:32 CST 2022 distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip +zipStoreBase=GRADLE_USER_HOME diff --git a/example/lib/pages/chat/chat_page.dart b/example/lib/pages/chat/chat_page.dart index 040ab29e..24592014 100644 --- a/example/lib/pages/chat/chat_page.dart +++ b/example/lib/pages/chat/chat_page.dart @@ -53,7 +53,7 @@ class _ChatPageState extends State @override void initState() { super.initState(); - + EMClient.getInstance.startCallback(); items = [ ChatMoreViewItem( 'images/chat_input_more_photo.png', '相册', _moreViewPhotoBtnOnTap), diff --git a/example/lib/pages/home_page.dart b/example/lib/pages/home_page.dart index 75b2bac1..e964ee6a 100644 --- a/example/lib/pages/home_page.dart +++ b/example/lib/pages/home_page.dart @@ -3,6 +3,7 @@ import 'package:easeim_flutter_demo/pages/conversations/conversations_page.dart' import 'package:easeim_flutter_demo/pages/me/me_page.dart'; import 'package:easeim_flutter_demo/widgets/common_widgets.dart'; import 'package:flutter/material.dart'; +import 'package:im_flutter_sdk/im_flutter_sdk.dart'; import 'package:provider/provider.dart'; class HomePage extends StatefulWidget { @@ -11,7 +12,8 @@ class HomePage extends StatefulWidget { } class _HomePageState extends State - with AutomaticKeepAliveClientMixin { + with AutomaticKeepAliveClientMixin + implements EMContactManagerListener { int _selectedPageIndex = 0; late ConversationPage _conversationListPage; late List _pages; @@ -19,7 +21,7 @@ class _HomePageState extends State @override void initState() { super.initState(); - + EMClient.getInstance.contactManager.addContactListener(this); _conversationListPage = ConversationPage(); _pages = [ _conversationListPage, @@ -157,4 +159,29 @@ class _HomePageState extends State @override bool get wantKeepAlive => true; + + @override + void onContactAdded(String userName) { + // TODO: implement onContactAdded + } + + @override + void onContactDeleted(String? userName) { + // TODO: implement onContactDeleted + } + + @override + void onContactInvited(String userName, String? reason) { + // TODO: implement onContactInvited + } + + @override + void onFriendRequestAccepted(String userName) { + // TODO: implement onFriendRequestAccepted + } + + @override + void onFriendRequestDeclined(String userName) { + // TODO: implement onFriendRequestDeclined + } } diff --git a/lib/src/em_client.dart b/lib/src/em_client.dart index 4145b578..73ddc752 100644 --- a/lib/src/em_client.dart +++ b/lib/src/em_client.dart @@ -64,6 +64,15 @@ class EMClient { }); } + Future startCallback() async { + Map result = await _channel.invokeMethod(ChatMethodKeys.startCallback); + try { + EMError.hasErrorFromResult(result); + } on EMError catch (e) { + throw e; + } + } + Future isConnected() async { Map result = await _channel.invokeMethod(ChatMethodKeys.isConnected); try { diff --git a/lib/src/internal/chat_method_keys.dart b/lib/src/internal/chat_method_keys.dart index c04f30ec..b6cf93b4 100644 --- a/lib/src/internal/chat_method_keys.dart +++ b/lib/src/internal/chat_method_keys.dart @@ -232,4 +232,7 @@ class ChatMethodKeys { static const String updateOwnUserInfoWithType = "updateOwnUserInfoWithType"; static const String fetchUserInfoById = "fetchUserInfoById"; static const String fetchUserInfoByIdWithType = "fetchUserInfoByIdWithType"; + + /// HandleAction + static const String startCallback = "startCallback"; } From c722c819d3d4662da0e3347d39bfb27fd73d7baa Mon Sep 17 00:00:00 2001 From: dujiepeng <347302029@qq.com> Date: Sun, 24 Apr 2022 21:29:09 +0800 Subject: [PATCH 3/8] ios add Callback handle --- .../im_flutter_sdk/EMClientWrapper.java | 2 +- .../im_flutter_sdk/EMListenerHandle.java | 6 +- ios/Classes/EMChatroomManagerWrapper.m | 237 +++++----- ios/Classes/EMClientWrapper.m | 7 + ios/Classes/EMContactManagerWrapper.m | 79 ++-- ios/Classes/EMGroupManagerWrapper.m | 428 +++++++++++------- ios/Classes/EMListenerHandle.h | 22 + ios/Classes/EMListenerHandle.m | 68 +++ ios/Classes/EMSDKMethod.h | 3 + 9 files changed, 554 insertions(+), 298 deletions(-) create mode 100644 ios/Classes/EMListenerHandle.h create mode 100644 ios/Classes/EMListenerHandle.m diff --git a/android/src/main/java/com/easemob/im_flutter_sdk/EMClientWrapper.java b/android/src/main/java/com/easemob/im_flutter_sdk/EMClientWrapper.java index 78a33b8a..f0381879 100644 --- a/android/src/main/java/com/easemob/im_flutter_sdk/EMClientWrapper.java +++ b/android/src/main/java/com/easemob/im_flutter_sdk/EMClientWrapper.java @@ -165,7 +165,7 @@ private void logout(JSONObject param, String channelName, Result result) throws EMClient.getInstance().logout(unbindToken, new EMWrapperCallBack(result, channelName, null){ @Override public void onSuccess() { - EMListenerHandle.getInstance().clearListener(); + EMListenerHandle.getInstance().clearHandle(); object = true; super.onSuccess(); } diff --git a/android/src/main/java/com/easemob/im_flutter_sdk/EMListenerHandle.java b/android/src/main/java/com/easemob/im_flutter_sdk/EMListenerHandle.java index 0565ec82..2f6a012f 100644 --- a/android/src/main/java/com/easemob/im_flutter_sdk/EMListenerHandle.java +++ b/android/src/main/java/com/easemob/im_flutter_sdk/EMListenerHandle.java @@ -47,8 +47,10 @@ void startCallback(){ runHandle(); } - void clearListener(){ + void clearHandle(){ hasReady = false; - emActionHandle.clear(); + synchronized (emActionHandle) { + emActionHandle.clear(); + } } } diff --git a/ios/Classes/EMChatroomManagerWrapper.m b/ios/Classes/EMChatroomManagerWrapper.m index d9f8768b..2a0ff5b2 100644 --- a/ios/Classes/EMChatroomManagerWrapper.m +++ b/ios/Classes/EMChatroomManagerWrapper.m @@ -11,7 +11,7 @@ #import "EMCursorResult+Flutter.h" #import "EMPageResult+Flutter.h" #import "EMChatroom+Flutter.h" - +#import "EMListenerHandle.h" @interface EMChatroomManagerWrapper () @@ -661,156 +661,191 @@ - (void)unMuteAllChatRoomMembers:(NSDictionary *)param channelName:(NSString *)a - (void)userDidJoinChatroom:(EMChatroom *)aChatroom user:(NSString *)aUsername { - NSDictionary *map = @{ - @"type":@"onMemberJoined", - @"roomId":aChatroom.chatroomId, - @"participant":aUsername - }; - [self.channel invokeMethod:ChatChatroomChanged - arguments:map]; + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onMemberJoined", + @"roomId":aChatroom.chatroomId, + @"participant":aUsername + }; + [weakSelf.channel invokeMethod:ChatChatroomChanged arguments:map]; + }]; } - (void)userDidLeaveChatroom:(EMChatroom *)aChatroom user:(NSString *)aUsername { - NSDictionary *map = @{ - @"type":@"onMemberExited", - @"roomId":aChatroom.chatroomId, - @"roomName":aChatroom.subject, - @"participant":aUsername - }; - [self.channel invokeMethod:ChatChatroomChanged - arguments:map]; + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onMemberExited", + @"roomId":aChatroom.chatroomId, + @"roomName":aChatroom.subject, + @"participant":aUsername + }; + [weakSelf.channel invokeMethod:ChatChatroomChanged arguments:map]; + }]; } - (void)didDismissFromChatroom:(EMChatroom *)aChatroom reason:(EMChatroomBeKickedReason)aReason { - NSString *type; - NSDictionary *map; - if (aReason == EMChatroomBeKickedReasonDestroyed) { - type = @"onChatRoomDestroyed"; - map = @{ - @"type":type, - @"roomId":aChatroom.chatroomId, - @"roomName":aChatroom.subject - }; - } else if (aReason == EMChatroomBeKickedReasonBeRemoved) { - type = @"onRemovedFromChatRoom"; - map = @{ - @"type":type, - @"roomId":aChatroom.chatroomId, - @"roomName":aChatroom.subject, - @"participant":[[EMClient sharedClient] currentUsername] - }; - } - [self.channel invokeMethod:ChatChatroomChanged - arguments:map]; + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSString *type; + NSDictionary *map; + if (aReason == EMChatroomBeKickedReasonDestroyed) { + type = @"onChatRoomDestroyed"; + map = @{ + @"type":type, + @"roomId":aChatroom.chatroomId, + @"roomName":aChatroom.subject + }; + } else if (aReason == EMChatroomBeKickedReasonBeRemoved) { + type = @"onRemovedFromChatRoom"; + map = @{ + @"type":type, + @"roomId":aChatroom.chatroomId, + @"roomName":aChatroom.subject, + @"participant":[[EMClient sharedClient] currentUsername] + }; + } + + [weakSelf.channel invokeMethod:ChatChatroomChanged arguments:map]; + }]; } - (void)chatroomMuteListDidUpdate:(EMChatroom *)aChatroom addedMutedMembers:(NSArray *)aMutes muteExpire:(NSInteger)aMuteExpire { - NSDictionary *map = @{ - @"type":@"onMuteListAdded", - @"roomId":aChatroom.chatroomId, - @"mutes":aMutes, - @"expireTime":[NSString stringWithFormat:@"%ld", (long)aMuteExpire] - }; - [self.channel invokeMethod:ChatChatroomChanged - arguments:map]; + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onMuteListAdded", + @"roomId":aChatroom.chatroomId, + @"mutes":aMutes, + @"expireTime":[NSString stringWithFormat:@"%ld", (long)aMuteExpire] + }; + [weakSelf.channel invokeMethod:ChatChatroomChanged arguments:map]; + }]; } - (void)chatroomMuteListDidUpdate:(EMChatroom *)aChatroom removedMutedMembers:(NSArray *)aMutes { - NSDictionary *map = @{ - @"type":@"onMuteListRemoved", - @"roomId":aChatroom.chatroomId, - @"mutes":aMutes - }; - [self.channel invokeMethod:ChatChatroomChanged - arguments:map]; + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onMuteListRemoved", + @"roomId":aChatroom.chatroomId, + @"mutes":aMutes + }; + [weakSelf.channel invokeMethod:ChatChatroomChanged arguments:map]; + }]; } - (void)chatroomAdminListDidUpdate:(EMChatroom *)aChatroom addedAdmin:(NSString *)aAdmin { - NSDictionary *map = @{ - @"type":@"onAdminAdded", - @"roomId":aChatroom.chatroomId, - @"admin":aAdmin - }; - [self.channel invokeMethod:ChatChatroomChanged - arguments:map]; + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onAdminAdded", + @"roomId":aChatroom.chatroomId, + @"admin":aAdmin + }; + [weakSelf.channel invokeMethod:ChatChatroomChanged arguments:map]; + }]; } - (void)chatroomAdminListDidUpdate:(EMChatroom *)aChatroom removedAdmin:(NSString *)aAdmin { - NSDictionary *map = @{ - @"type":@"onAdminRemoved", - @"roomId":aChatroom.chatroomId, - @"admin":aAdmin - }; - [self.channel invokeMethod:ChatChatroomChanged - arguments:map]; + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onAdminRemoved", + @"roomId":aChatroom.chatroomId, + @"admin":aAdmin + }; + [weakSelf.channel invokeMethod:ChatChatroomChanged arguments:map]; + }]; } - (void)chatroomOwnerDidUpdate:(EMChatroom *)aChatroom newOwner:(NSString *)aNewOwner oldOwner:(NSString *)aOldOwner { - NSDictionary *map = @{ - @"type":@"onOwnerChanged", - @"roomId":aChatroom.chatroomId, - @"newOwner":aNewOwner, - @"oldOwner":aOldOwner - }; - [self.channel invokeMethod:ChatChatroomChanged - arguments:map]; + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onOwnerChanged", + @"roomId":aChatroom.chatroomId, + @"newOwner":aNewOwner, + @"oldOwner":aOldOwner + }; + [weakSelf.channel invokeMethod:ChatChatroomChanged arguments:map]; + }]; } - (void)chatroomAnnouncementDidUpdate:(EMChatroom *)aChatroom announcement:(NSString *)aAnnouncement { - NSDictionary *map = @{ - @"type":@"onAnnouncementChanged", - @"roomId":aChatroom.chatroomId, - @"announcement":aAnnouncement - }; - [self.channel invokeMethod:ChatChatroomChanged - arguments:map]; + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onAnnouncementChanged", + @"roomId":aChatroom.chatroomId, + @"announcement":aAnnouncement + }; + [weakSelf.channel invokeMethod:ChatChatroomChanged arguments:map]; + }]; } - (void)chatroomWhiteListDidUpdate:(EMChatroom *)aChatroom addedWhiteListMembers:(NSArray *)aMembers { - NSDictionary *map = @{ - @"type":@"onWhiteListAdded", - @"roomId":aChatroom.chatroomId, - @"whitelist":aMembers - }; - [self.channel invokeMethod:ChatChatroomChanged - arguments:map]; + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onWhiteListAdded", + @"roomId":aChatroom.chatroomId, + @"whitelist":aMembers + }; + [weakSelf.channel invokeMethod:ChatChatroomChanged arguments:map]; + }]; } - (void)chatroomWhiteListDidUpdate:(EMChatroom *)aChatroom removedWhiteListMembers:(NSArray *)aMembers { - NSDictionary *map = @{ - @"type":@"onWhiteListRemoved", - @"roomId":aChatroom.chatroomId, - @"whitelist":aMembers - }; - [self.channel invokeMethod:ChatChatroomChanged - arguments:map]; + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onWhiteListRemoved", + @"roomId":aChatroom.chatroomId, + @"whitelist":aMembers + }; + [weakSelf.channel invokeMethod:ChatChatroomChanged arguments:map]; + }]; } - (void)chatroomAllMemberMuteChanged:(EMChatroom *)aChatroom isAllMemberMuted:(BOOL)aMuted { - NSDictionary *map = @{ - @"type":@"onAllMemberMuteStateChanged", - @"roomId":aChatroom.chatroomId, - @"isMuted":@(aMuted) - }; - [self.channel invokeMethod:ChatChatroomChanged - arguments:map]; + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onAllMemberMuteStateChanged", + @"roomId":aChatroom.chatroomId, + @"isMuted":@(aMuted) + }; + [weakSelf.channel invokeMethod:ChatChatroomChanged arguments:map]; + }]; + } #pragma mark - EMChatroom Pack Method diff --git a/ios/Classes/EMClientWrapper.m b/ios/Classes/EMClientWrapper.m index 9fb00e79..188143b6 100644 --- a/ios/Classes/EMClientWrapper.m +++ b/ios/Classes/EMClientWrapper.m @@ -16,6 +16,7 @@ #import "EMDeviceConfig+Flutter.h" #import "EMOptions+Flutter.h" #import "EMUserInfoManagerWrapper.h" +#import "EMListenerHandle.h" @interface EMClientWrapper () @end @@ -151,6 +152,8 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { [self renewToken:call.arguments channelName:call.method result:result]; + }else if ([ChatStartCallback isEqualToString:call.method]){ + [self startCallBack]; } else { [super handleMethodCall:call result:result]; @@ -393,6 +396,10 @@ - (void)getLoggedInDevicesFromServer:(NSDictionary *)param channelName:(NSString }]; } +- (void)startCallBack { + [EMListenerHandle.sharedInstance startCallback]; +} + #pragma - mark EMClientDelegate - (void)connectionStateDidChange:(EMConnectionState)aConnectionState { diff --git a/ios/Classes/EMContactManagerWrapper.m b/ios/Classes/EMContactManagerWrapper.m index 68498d15..d01cc165 100644 --- a/ios/Classes/EMContactManagerWrapper.m +++ b/ios/Classes/EMContactManagerWrapper.m @@ -7,6 +7,7 @@ #import "EMContactManagerWrapper.h" #import "EMSDKMethod.h" +#import "EMListenerHandle.h" @interface EMContactManagerWrapper () @@ -16,8 +17,8 @@ @implementation EMContactManagerWrapper - (instancetype)initWithChannelName:(NSString *)aChannelName registrar:(NSObject*)registrar { if(self = [super initWithChannelName:aChannelName - registrar:registrar]) { - [EMClient.sharedClient.contactManager addDelegate:self delegateQueue:nil]; + registrar:registrar]) { + [EMClient.sharedClient.contactManager addDelegate:self delegateQueue:nil]; } return self; } @@ -214,50 +215,62 @@ - (void)getSelfIdsOnOtherPlatform:(NSDictionary *)param channelName:(NSString *) #pragma mark - EMContactManagerDelegate - (void)friendshipDidAddByUser:(NSString *)aUsername { - NSDictionary *map = @{ - @"type":@"onContactAdded", - @"username":aUsername - }; - [self.channel invokeMethod:ChatOnContactChanged - arguments:map]; + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onContactAdded", + @"username":aUsername + }; + [weakSelf.channel invokeMethod:ChatOnContactChanged arguments:map]; + }]; + } - (void)friendshipDidRemoveByUser:(NSString *)aUsername { - NSDictionary *map = @{ - @"type":@"onContactDeleted", - @"username":aUsername - }; - [self.channel invokeMethod:ChatOnContactChanged - arguments:map]; + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onContactDeleted", + @"username":aUsername + }; + [weakSelf.channel invokeMethod:ChatOnContactChanged arguments:map]; + }]; } - (void)friendRequestDidReceiveFromUser:(NSString *)aUsername message:(NSString *)aMessage { - NSDictionary *map = @{ - @"type":@"onContactInvited", - @"username":aUsername, - @"reason":aMessage - }; - [self.channel invokeMethod:ChatOnContactChanged - arguments:map]; + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onContactInvited", + @"username":aUsername, + @"reason":aMessage + }; + [weakSelf.channel invokeMethod:ChatOnContactChanged arguments:map]; + }]; + } - (void)friendRequestDidApproveByUser:(NSString *)aUsername { - NSDictionary *map = @{ - @"type":@"onFriendRequestAccepted", - @"username":aUsername - }; - [self.channel invokeMethod:ChatOnContactChanged - arguments:map]; + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onFriendRequestAccepted", + @"username":aUsername + }; + [weakSelf.channel invokeMethod:ChatOnContactChanged arguments:map]; + }]; } - (void)friendRequestDidDeclineByUser:(NSString *)aUsername { - NSDictionary *map = @{ - @"type":@"onFriendRequestDeclined", - @"username":aUsername - }; - [self.channel invokeMethod:ChatOnContactChanged - arguments:map]; + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onFriendRequestDeclined", + @"username":aUsername + }; + [weakSelf.channel invokeMethod:ChatOnContactChanged arguments:map]; + }]; } @end diff --git a/ios/Classes/EMGroupManagerWrapper.m b/ios/Classes/EMGroupManagerWrapper.m index 1a748ff3..c6db467d 100644 --- a/ios/Classes/EMGroupManagerWrapper.m +++ b/ios/Classes/EMGroupManagerWrapper.m @@ -10,7 +10,7 @@ #import "EMGroup+Flutter.h" #import "EMCursorResult+Flutter.h" - +#import "EMListenerHandle.h" #import "EMSDKMethod.h" @interface EMGroupManagerWrapper () @@ -940,252 +940,358 @@ - (void)ignoreGroupPush:(NSDictionary *)param channelName:(NSString *)aChannelNa - (void)groupInvitationDidReceive:(NSString *)aGroupId inviter:(NSString *)aInviter message:(NSString *)aMessage { - NSDictionary *map = @{ - @"type":@"onInvitationReceived", - @"groupId":aGroupId, - @"inviter":aInviter, - @"message":aMessage - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onInvitationReceived", + @"groupId":aGroupId, + @"inviter":aInviter, + @"message":aMessage + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)groupInvitationDidAccept:(EMGroup *)aGroup invitee:(NSString *)aInvitee { - NSDictionary *map = @{ - @"type":@"onInvitationAccepted", - @"groupId":aGroup.groupId, - @"invitee":aInvitee - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onInvitationAccepted", + @"groupId":aGroup.groupId, + @"invitee":aInvitee + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)groupInvitationDidDecline:(EMGroup *)aGroup invitee:(NSString *)aInvitee reason:(NSString *)aReason { - NSDictionary *map = @{ - @"type":@"onInvitationDeclined", - @"groupId":aGroup.groupId, - @"invitee":aInvitee, - @"reason":aReason - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onInvitationDeclined", + @"groupId":aGroup.groupId, + @"invitee":aInvitee, + @"reason":aReason + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)didJoinGroup:(EMGroup *)aGroup inviter:(NSString *)aInviter message:(NSString *)aMessage { - NSDictionary *map = @{ - @"type":@"onAutoAcceptInvitationFromGroup", - @"groupId":aGroup.groupId, - @"message":aMessage, - @"inviter":aInviter - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onAutoAcceptInvitationFromGroup", + @"groupId":aGroup.groupId, + @"message":aMessage, + @"inviter":aInviter + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)didLeaveGroup:(EMGroup *)aGroup reason:(EMGroupLeaveReason)aReason { - NSString *type; - if (aReason == EMGroupLeaveReasonBeRemoved) { - type = @"onUserRemoved"; - } else if (aReason == EMGroupLeaveReasonDestroyed) { - type = @"onGroupDestroyed"; - } - NSDictionary *map = @{ - @"type":type, - @"groupId":aGroup.groupId, - @"groupName":aGroup.groupName - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSString *type; + if (aReason == EMGroupLeaveReasonBeRemoved) { + type = @"onUserRemoved"; + } else if (aReason == EMGroupLeaveReasonDestroyed) { + type = @"onGroupDestroyed"; + } + NSDictionary *map = @{ + @"type":type, + @"groupId":aGroup.groupId, + @"groupName":aGroup.groupName + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; + } - (void)joinGroupRequestDidReceive:(EMGroup *)aGroup user:(NSString *)aUsername reason:(NSString *)aReason { - NSDictionary *map = @{ - @"type":@"onRequestToJoinReceived", - @"groupId":aGroup.groupId, - @"applicant":aUsername, - @"reason":aReason - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onRequestToJoinReceived", + @"groupId":aGroup.groupId, + @"applicant":aUsername, + @"reason":aReason + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)joinGroupRequestDidDecline:(NSString *)aGroupId reason:(NSString *)aReason { - NSDictionary *map = @{ - @"type":@"onRequestToJoinDeclined", - @"groupId":aGroupId, - @"reason":aReason - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onRequestToJoinDeclined", + @"groupId":aGroupId, + @"reason":aReason + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)joinGroupRequestDidApprove:(EMGroup *)aGroup { - NSDictionary *map = @{ - @"type":@"onRequestToJoinAccepted", - @"groupId":aGroup.groupId, - @"groupName":aGroup.groupName, - @"accepter":aGroup.owner, - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onRequestToJoinAccepted", + @"groupId":aGroup.groupId, + @"groupName":aGroup.groupName, + @"accepter":aGroup.owner, + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)groupMuteListDidUpdate:(EMGroup *)aGroup addedMutedMembers:(NSArray *)aMutedMembers muteExpire:(NSInteger)aMuteExpire { - NSDictionary *map = @{ - @"type":@"onMuteListAdded", - @"groupId":aGroup.groupId, - @"mutes":aMutedMembers, - @"muteExpire":[NSNumber numberWithInteger:aMuteExpire] - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onMuteListAdded", + @"groupId":aGroup.groupId, + @"mutes":aMutedMembers, + @"muteExpire":[NSNumber numberWithInteger:aMuteExpire] + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)groupMuteListDidUpdate:(EMGroup *)aGroup removedMutedMembers:(NSArray *)aMutedMembers { - NSDictionary *map = @{ - @"type":@"onMuteListRemoved", - @"groupId":aGroup.groupId, - @"mutes":aMutedMembers - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onMuteListRemoved", + @"groupId":aGroup.groupId, + @"mutes":aMutedMembers + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)groupWhiteListDidUpdate:(EMGroup *)aGroup addedWhiteListMembers:(NSArray *)aMembers { - NSDictionary *map = @{ - @"type":@"onWhiteListAdded", - @"groupId":aGroup.groupId, - @"whitelist":aMembers - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onWhiteListAdded", + @"groupId":aGroup.groupId, + @"whitelist":aMembers + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)groupWhiteListDidUpdate:(EMGroup *)aGroup removedWhiteListMembers:(NSArray *)aMembers { - NSDictionary *map = @{ - @"type":@"onWhiteListRemoved", - @"groupId":aGroup.groupId, - @"whitelist":aMembers - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onWhiteListRemoved", + @"groupId":aGroup.groupId, + @"whitelist":aMembers + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)groupAllMemberMuteChanged:(EMGroup *)aGroup isAllMemberMuted:(BOOL)aMuted { - NSDictionary *map = @{ - @"type":@"onAllMemberMuteStateChanged", - @"groupId":aGroup.groupId, - @"isMuted":@(aMuted) - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onAllMemberMuteStateChanged", + @"groupId":aGroup.groupId, + @"isMuted":@(aMuted) + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)groupAdminListDidUpdate:(EMGroup *)aGroup addedAdmin:(NSString *)aAdmin { - NSDictionary *map = @{ - @"type":@"onAdminAdded", - @"groupId":aGroup.groupId, - @"administrator":aAdmin - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onAdminAdded", + @"groupId":aGroup.groupId, + @"administrator":aAdmin + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)groupAdminListDidUpdate:(EMGroup *)aGroup removedAdmin:(NSString *)aAdmin { - NSDictionary *map = @{ - @"type":@"onAdminRemoved", - @"groupId":aGroup.groupId, - @"administrator":aAdmin - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onAdminRemoved", + @"groupId":aGroup.groupId, + @"administrator":aAdmin + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)groupOwnerDidUpdate:(EMGroup *)aGroup newOwner:(NSString *)aNewOwner oldOwner:(NSString *)aOldOwner { - NSDictionary *map = @{ - @"type":@"onOwnerChanged", - @"groupId":aGroup.groupId, - @"newOwner":aNewOwner, - @"oldOwner":aOldOwner - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onOwnerChanged", + @"groupId":aGroup.groupId, + @"newOwner":aNewOwner, + @"oldOwner":aOldOwner + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)userDidJoinGroup:(EMGroup *)aGroup user:(NSString *)aUsername { - NSDictionary *map = @{ - @"type":@"onMemberJoined", - @"groupId":aGroup.groupId, - @"member":aUsername - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onMemberJoined", + @"groupId":aGroup.groupId, + @"member":aUsername + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)userDidLeaveGroup:(EMGroup *)aGroup user:(NSString *)aUsername { - NSDictionary *map = @{ - @"type":@"onMemberExited", - @"groupId":aGroup.groupId, - @"member":aUsername - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onMemberExited", + @"groupId":aGroup.groupId, + @"member":aUsername + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)groupAnnouncementDidUpdate:(EMGroup *)aGroup announcement:(NSString *)aAnnouncement { - NSDictionary *map = @{ - @"type":@"onAnnouncementChanged", - @"groupId":aGroup.groupId, - @"announcement":aAnnouncement - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onAnnouncementChanged", + @"groupId":aGroup.groupId, + @"announcement":aAnnouncement + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)groupFileListDidUpdate:(EMGroup *)aGroup addedSharedFile:(EMGroupSharedFile *)aSharedFile { - NSDictionary *map = @{ - @"type":@"onSharedFileAdded", - @"groupId":aGroup.groupId, - @"sharedFile":[aSharedFile toJson] - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onSharedFileAdded", + @"groupId":aGroup.groupId, + @"sharedFile":[aSharedFile toJson] + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } - (void)groupFileListDidUpdate:(EMGroup *)aGroup removedSharedFile:(NSString *)aFileId { - NSDictionary *map = @{ - @"type":@"onSharedFileDeleted", - @"groupId":aGroup.groupId, - @"fileId":aFileId - }; - [self.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + + + __weak typeof(self) weakSelf = self; + [EMListenerHandle.sharedInstance addHandle:^{ + NSDictionary *map = @{ + @"type":@"onSharedFileDeleted", + @"groupId":aGroup.groupId, + @"fileId":aFileId + }; + [weakSelf.channel invokeMethod:ChatOnGroupChanged + arguments:map]; + }]; } diff --git a/ios/Classes/EMListenerHandle.h b/ios/Classes/EMListenerHandle.h new file mode 100644 index 00000000..f0c21351 --- /dev/null +++ b/ios/Classes/EMListenerHandle.h @@ -0,0 +1,22 @@ +// +// EMListenerHandle.h +// im_flutter_sdk +// +// Created by 杜洁鹏 on 2022/4/24. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + + +typedef void (^EMListenerHandleCallback)(void); + +@interface EMListenerHandle : NSObject ++ (EMListenerHandle *)sharedInstance; +- (void)addHandle:(EMListenerHandleCallback)handle; +- (void)startCallback; +- (void)clearHandle; +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/EMListenerHandle.m b/ios/Classes/EMListenerHandle.m new file mode 100644 index 00000000..f86ad0b4 --- /dev/null +++ b/ios/Classes/EMListenerHandle.m @@ -0,0 +1,68 @@ +// +// EMListenerHandle.m +// im_flutter_sdk +// +// Created by 杜洁鹏 on 2022/4/24. +// + +#import "EMListenerHandle.h" + + +@interface EMListenerHandle () +{ + NSMutableArray *_handleList; + BOOL _hasReady; +} +@end + +@implementation EMListenerHandle + ++ (EMListenerHandle *)sharedInstance { + static EMListenerHandle *handle = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + handle = [[EMListenerHandle alloc] init]; + }); + return handle; +} + +- (instancetype)init { + if (self = [super init]) { + _handleList = [NSMutableArray array]; + } + + return self; +} + +- (void)addHandle:(EMListenerHandleCallback)handle { + @synchronized(self){ + [_handleList addObject:handle]; + if (_hasReady) { + [self _runHandle]; + } + } +} + +- (void)startCallback { + _hasReady = YES; + [self _runHandle]; +} + +- (void)clearHandle { + _hasReady = NO; + @synchronized(self){ + [_handleList removeAllObjects]; + } +} + +- (void)_runHandle { + @synchronized(self){ + NSArray *ary = _handleList; + for (EMListenerHandleCallback callback in ary) { + callback(); + [_handleList removeObject:callback]; + } + } +} + +@end diff --git a/ios/Classes/EMSDKMethod.h b/ios/Classes/EMSDKMethod.h index 700f1a12..58762a67 100644 --- a/ios/Classes/EMSDKMethod.h +++ b/ios/Classes/EMSDKMethod.h @@ -227,4 +227,7 @@ static NSString *const ChatFetchUserInfoById = @"fetchUserInfoById"; static NSString *const ChatFetchUserInfoByIdWithType = @"fetchUserInfoByIdWithType"; +#pragma mark - HandleAction +static NSString *const ChatStartCallback = @"startCallback"; + From 631b35e402faaaca7cab7becf1165b6166ecaa17 Mon Sep 17 00:00:00 2001 From: dujiepeng <347302029@qq.com> Date: Tue, 26 Apr 2022 12:41:18 +0800 Subject: [PATCH 4/8] fix wrong key bugs. --- .../com/easemob/im_flutter_sdk/EMConversationWrapper.java | 2 +- ios/Classes/EMConversationWrapper.m | 2 +- lib/src/em_chat_room_manager.dart | 7 +++---- lib/src/models/em_conversation.dart | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/android/src/main/java/com/easemob/im_flutter_sdk/EMConversationWrapper.java b/android/src/main/java/com/easemob/im_flutter_sdk/EMConversationWrapper.java index 2bf1a8fc..6aa98ecd 100644 --- a/android/src/main/java/com/easemob/im_flutter_sdk/EMConversationWrapper.java +++ b/android/src/main/java/com/easemob/im_flutter_sdk/EMConversationWrapper.java @@ -251,7 +251,7 @@ private void loadMsgWithMsgType(JSONObject params, String channelName, Result re String sender = params.getString("sender"); int count = params.getInt("count"); EMConversation.EMSearchDirection direction = searchDirectionFromString(params.getString("direction")); - String typeStr = params.getString("type"); + String typeStr = params.getString("msgType"); EMMessage.Type type = EMMessage.Type.TXT; switch (typeStr) { case "txt" : type = EMMessage.Type.TXT; break; diff --git a/ios/Classes/EMConversationWrapper.m b/ios/Classes/EMConversationWrapper.m index 34e8cdca..e1a95231 100644 --- a/ios/Classes/EMConversationWrapper.m +++ b/ios/Classes/EMConversationWrapper.m @@ -325,7 +325,7 @@ - (void)loadMsgWithId:(NSDictionary *)param channelName:(NSString *)aChannelName - (void)loadMsgWithMsgType:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result{ __weak typeof(self) weakSelf = self; - EMMessageBodyType type = [EMMessageBody typeFromString:param[@"type"]]; + EMMessageBodyType type = [EMMessageBody typeFromString:param[@"msgType"]]; long long timeStamp = [param[@"timeStamp"] longLongValue]; int count = [param[@"count"] intValue]; NSString *sender = param[@"sender"]; diff --git a/lib/src/em_chat_room_manager.dart b/lib/src/em_chat_room_manager.dart index 0249c3f8..b02abd1e 100644 --- a/lib/src/em_chat_room_manager.dart +++ b/lib/src/em_chat_room_manager.dart @@ -237,9 +237,8 @@ class EMChatRoomManager { .invokeMethod(ChatMethodKeys.getChatRoom, {"roomId": roomId}); try { EMError.hasErrorFromResult(result); - if (result.containsKey(ChatMethodKeys.fetchChatRoomInfoFromServer)) { - return EMChatRoom.fromJson( - result[ChatMethodKeys.fetchChatRoomInfoFromServer]); + if (result.containsKey(ChatMethodKeys.getChatRoom)) { + return EMChatRoom.fromJson(result[ChatMethodKeys.getChatRoom]); } else { return null; } @@ -818,7 +817,7 @@ class EMChatRoomManager { "members": members, }; Map result = await _channel.invokeMethod( - ChatMethodKeys.addMembersToChatRoomWhiteList, + ChatMethodKeys.removeMembersFromChatRoomWhiteList, req, ); EMError.hasErrorFromResult(result); diff --git a/lib/src/models/em_conversation.dart b/lib/src/models/em_conversation.dart index 17eff08b..d6c1524c 100644 --- a/lib/src/models/em_conversation.dart +++ b/lib/src/models/em_conversation.dart @@ -341,7 +341,7 @@ extension EMConversationExtension on EMConversation { EMSearchDirection direction = EMSearchDirection.Up, }) async { Map req = this._toJson(); - req['type'] = messageTypeToTypeStr(type); + req['msgType'] = messageTypeToTypeStr(type); req['timestamp'] = timestamp; req['count'] = count; req['sender'] = sender; From 8a81ae1f7c287acb209998feb91943585b98356d Mon Sep 17 00:00:00 2001 From: dujiepeng <347302029@qq.com> Date: Tue, 26 Apr 2022 12:42:13 +0800 Subject: [PATCH 5/8] update change log. --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf597a5c..da735e9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ ## NEXT ## 3.9.0+1 -- 修复message.attribute不准; +- 修复message.attribute不准; +- 修复已知bug; ## 3.9.0 From 188c22ae8b3ca124ad019d8dfe9ceb208aa7790d Mon Sep 17 00:00:00 2001 From: dujiepeng <347302029@qq.com> Date: Tue, 26 Apr 2022 16:20:19 +0800 Subject: [PATCH 6/8] update readme. --- CHANGELOG.md | 5 +++++ README.md | 17 +++++++++++++++++ example/lib/pages/home_page.dart | 32 ++++---------------------------- lib/src/em_client.dart | 26 ++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da735e9f..6f2a9e93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ ## 3.9.0+1 - 修复message.attribute不准; - 修复已知bug; +- 增加 EMClient.getInstance.startCallback() 方法 + ```dart + EMClient.getInstance.startCallback(); + ``` + 只有调用该方法后,`EMContactManagerListener`、 `EMGroupEventListener` 、 `EMChatRoomEventListener` 回调才会开始执行; ## 3.9.0 diff --git a/README.md b/README.md index 1763ea97..6a2cbaea 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,16 @@ try { > 退出也有失败的情况,需要确定是否失败。 > 注册环信id详细说明请参考文档[用户体系集成](http://docs-im.easemob.com/im/server/ready/user)。 +#### UI 监听 + + +> 当UI已经准备好后,需要主动调用该方法,调用之后,`EMContactManagerListener`、 `EMGroupEventListener` 、 `EMChatRoomEventListener` 回调才会开始执行。 + +```dart +EMClient.getInstance.startCallback(); +``` + + #### 监听服务器连接状态 ```dart @@ -457,6 +467,8 @@ try { #### 通讯录监听 +> 如果想要收到 `EMContactManagerListener` 回调,需要先调用 `EMClient.getInstance.startCallback();` 方法。 + ```dart class _PageState extends State implements EMContactManagerListener { @override @@ -975,6 +987,8 @@ try { #### 群回调监听 +> 如果想要收到 `EMGroupEventListener` 回调,需要先调用 `EMClient.getInstance.startCallback();` 方法。 + ```dart class _PageState extends State implements EMGroupEventListener { @override @@ -1356,6 +1370,9 @@ try { #### 添加聊天室监听 +> 如果想要收到 `EMChatRoomEventListener` 回调,需要先调用 `EMClient.getInstance.startCallback();` 方法。 + + ```dart class _PageState extends State implements EMChatRoomEventListener { @override diff --git a/example/lib/pages/home_page.dart b/example/lib/pages/home_page.dart index e964ee6a..dcd23af1 100644 --- a/example/lib/pages/home_page.dart +++ b/example/lib/pages/home_page.dart @@ -4,6 +4,7 @@ import 'package:easeim_flutter_demo/pages/me/me_page.dart'; import 'package:easeim_flutter_demo/widgets/common_widgets.dart'; import 'package:flutter/material.dart'; import 'package:im_flutter_sdk/im_flutter_sdk.dart'; + import 'package:provider/provider.dart'; class HomePage extends StatefulWidget { @@ -12,8 +13,7 @@ class HomePage extends StatefulWidget { } class _HomePageState extends State - with AutomaticKeepAliveClientMixin - implements EMContactManagerListener { + with AutomaticKeepAliveClientMixin { int _selectedPageIndex = 0; late ConversationPage _conversationListPage; late List _pages; @@ -21,13 +21,14 @@ class _HomePageState extends State @override void initState() { super.initState(); - EMClient.getInstance.contactManager.addContactListener(this); _conversationListPage = ConversationPage(); _pages = [ _conversationListPage, ContactsPage(), MePage(), ]; + + EMClient.getInstance.startCallback(); } @override @@ -159,29 +160,4 @@ class _HomePageState extends State @override bool get wantKeepAlive => true; - - @override - void onContactAdded(String userName) { - // TODO: implement onContactAdded - } - - @override - void onContactDeleted(String? userName) { - // TODO: implement onContactDeleted - } - - @override - void onContactInvited(String userName, String? reason) { - // TODO: implement onContactInvited - } - - @override - void onFriendRequestAccepted(String userName) { - // TODO: implement onFriendRequestAccepted - } - - @override - void onFriendRequestDeclined(String userName) { - // TODO: implement onFriendRequestDeclined - } } diff --git a/lib/src/em_client.dart b/lib/src/em_client.dart index 73ddc752..18c1d5b8 100644 --- a/lib/src/em_client.dart +++ b/lib/src/em_client.dart @@ -64,6 +64,12 @@ class EMClient { }); } + /// + /// Start contact and group, chatroom callback. + /// + /// Reference: + /// Call this method when you ui is ready, then will receive `EMChatRoomEventListener`, `EMContactManagerListener`, `EMGroupEventListener` callback. + /// Future startCallback() async { Map result = await _channel.invokeMethod(ChatMethodKeys.startCallback); try { @@ -73,6 +79,12 @@ class EMClient { } } + /// + /// Checks whether the SDK is connected to the chat server. + /// + /// **Return** the result whether the SDK is connected to the chat server. + /// `true`: means that the SDK is connected to the chat server. + /// `false`: means not. Future isConnected() async { Map result = await _channel.invokeMethod(ChatMethodKeys.isConnected); try { @@ -83,6 +95,15 @@ class EMClient { } } + /// + /// Checks whether the user has logged in before and did not log out. + /// + /// Reference: + /// If you need to check whether the SDK is connected to the server, please use {@link #isConnected()}. + /// + /// **Return** The result of whether the user has logged in before. + /// `true`: means that the user has logged in before, + /// `false`: means that the user has not login before or has called {@link #logout()} method. Future isLoginBefore() async { Map result = await _channel.invokeMethod(ChatMethodKeys.isLoggedInBefore); try { @@ -93,6 +114,11 @@ class EMClient { } } + /// + /// Gets the current login user ID. + /// + /// **Return** The current login user ID. + /// Future getCurrentUsername() async { Map result = await _channel.invokeMethod(ChatMethodKeys.getCurrentUser); try { From 5a187282d05eb332506172054db68387a33aabea Mon Sep 17 00:00:00 2001 From: dujiepeng <347302029@qq.com> Date: Tue, 26 Apr 2022 18:55:02 +0800 Subject: [PATCH 7/8] update change log --- .../java/com/easemob/im_flutter_sdk/EMContactManagerWrapper.java | 1 - 1 file changed, 1 deletion(-) diff --git a/android/src/main/java/com/easemob/im_flutter_sdk/EMContactManagerWrapper.java b/android/src/main/java/com/easemob/im_flutter_sdk/EMContactManagerWrapper.java index 57c14968..db287333 100644 --- a/android/src/main/java/com/easemob/im_flutter_sdk/EMContactManagerWrapper.java +++ b/android/src/main/java/com/easemob/im_flutter_sdk/EMContactManagerWrapper.java @@ -70,7 +70,6 @@ private void addContact(JSONObject param, String channelName, Result result) thr onSuccess(result, channelName, username); } catch (HyphenateException e) { onError(result, e); - } }); } From b7c8afc932340dc2f6bf929192ca30ad546a4606 Mon Sep 17 00:00:00 2001 From: dujiepeng <347302029@qq.com> Date: Tue, 26 Apr 2022 18:57:58 +0800 Subject: [PATCH 8/8] update change log --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f2a9e93..a5c13e0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,12 +2,12 @@ ## 3.9.0+1 - 修复message.attribute不准; -- 修复已知bug; - 增加 EMClient.getInstance.startCallback() 方法 ```dart EMClient.getInstance.startCallback(); ``` 只有调用该方法后,`EMContactManagerListener`、 `EMGroupEventListener` 、 `EMChatRoomEventListener` 回调才会开始执行; +- 修复删除聊天室白名单成员失败; ## 3.9.0