diff --git a/CHANGELOG.md b/CHANGELOG.md index 68e1c51..0251e7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ 4.ConverstaionInfo new add isNotInGroup field
5.New at type
6.New work moments
+7.New global search
+8.New getHistoryMessageListReverse method
+9.New getAtAllTag method
+10.New resetConversationGroupAtType method
+11.New searchGroups method
## 2.0.0+5 diff --git a/android/build.gradle b/android/build.gradle index d36bbe1..6eeb89c 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -41,5 +41,5 @@ android { } } dependencies { - implementation 'io.openim:client-sdk:2.0.42@aar' + implementation 'io.openim:client-sdk:2.0.45@aar' } \ No newline at end of file diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnSignalingListener.java b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnSignalingListener.java index 9c4ea03..a76a46e 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnSignalingListener.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnSignalingListener.java @@ -3,6 +3,7 @@ package io.openim.flutter_openim_sdk.listener; import io.openim.flutter_openim_sdk.util.CommonUtil; public class OnSignalingListener implements open_im_sdk_callback.OnSignalingListener { + @Override public void onInvitationCancelled(String s) { CommonUtil.emitEvent("signalingListener", "onInvitationCancelled", s); @@ -37,4 +38,9 @@ public class OnSignalingListener implements open_im_sdk_callback.OnSignalingList public void onReceiveNewInvitation(String s) { CommonUtil.emitEvent("signalingListener", "onReceiveNewInvitation", s); } + + @Override + public void onHangUp(String s) { + CommonUtil.emitEvent("signalingListener", "onHangUp", s); + } } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/ConversationManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/ConversationManager.java index ac04226..e23efc8 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/ConversationManager.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/ConversationManager.java @@ -142,4 +142,16 @@ public class ConversationManager extends BaseManager { value(methodCall, "operationID") ); } + + public void resetConversationGroupAtType(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.resetConversationGroupAtType( + new OnBaseListener(result), + value(methodCall, "operationID"), + value(methodCall, "conversationID") + ); + } + + public void getAtAllTag(MethodCall methodCall, MethodChannel.Result result) { + CommonUtil.runMainThreadReturn(result, Open_im_sdk.getAtAllTag()); + } } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/GroupManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/GroupManager.java index 3027014..7b9f89f 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/GroupManager.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/GroupManager.java @@ -183,4 +183,11 @@ public class GroupManager extends BaseManager { value(methodCall, "groupNickname") ); } + + public void searchGroups(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.searchGroups(new OnBaseListener(result), + value(methodCall, "operationID"), + jsonValue(methodCall, "searchParam") + ); + } } \ No newline at end of file diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java index f36d209..ccc33c0 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java @@ -381,4 +381,12 @@ public class MessageManager extends BaseManager { value(methodCall, "groupID") ); } + + public void getHistoryMessageListReverse(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.getHistoryMessageListReverse( + new OnBaseListener(result), + value(methodCall, "operationID"), + jsonValue(methodCall) + ); + } } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/WorkMomentsManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/WorkMomentsManager.java index 12dc39b..bc30a4b 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/WorkMomentsManager.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/WorkMomentsManager.java @@ -8,7 +8,7 @@ import open_im_sdk.Open_im_sdk; public class WorkMomentsManager extends BaseManager { - void setWorkMomentsListener(MethodCall methodCall, MethodChannel.Result result) { + public void setWorkMomentsListener(MethodCall methodCall, MethodChannel.Result result) { Open_im_sdk.setWorkMomentsListener(new OnWorkMomentsListener()); } diff --git a/ios/Classes/Module/ConversationManager.swift b/ios/Classes/Module/ConversationManager.swift index d908a32..248bf85 100644 --- a/ios/Classes/Module/ConversationManager.swift +++ b/ios/Classes/Module/ConversationManager.swift @@ -22,6 +22,8 @@ public class ConversationManager: BaseServiceManager { self["setOneConversationPrivateChat"] = setOneConversationPrivateChat self["deleteConversationFromLocalAndSvr"] = deleteConversationFromLocalAndSvr self["deleteAllConversationFromLocal"] = deleteAllConversationFromLocal + self["resetConversationGroupAtType"] = resetConversationGroupAtType + self["getAtAllTag"] = getAtAllTag } func setConversationListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ @@ -93,6 +95,14 @@ public class ConversationManager: BaseServiceManager { func deleteAllConversationFromLocal(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ Open_im_sdkDeleteAllConversationFromLocal(BaseCallback(result: result), methodCall[string: "operationID"]) } + + func resetConversationGroupAtType(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkResetConversationGroupAtType(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"]) + } + + func getAtAllTag(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + callBack(result, Open_im_sdkGetAtAllTag()) + } } diff --git a/ios/Classes/Module/GroupManager.swift b/ios/Classes/Module/GroupManager.swift index 533acfb..5855e2a 100644 --- a/ios/Classes/Module/GroupManager.swift +++ b/ios/Classes/Module/GroupManager.swift @@ -25,6 +25,7 @@ public class GroupManager: BaseServiceManager { self["changeGroupMute"] = changeGroupMute self["changeGroupMemberMute"] = changeGroupMemberMute self["setGroupMemberNickname"] = setGroupMemberNickname + self["searchGroups"] = searchGroups } func setGroupListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ @@ -110,6 +111,10 @@ public class GroupManager: BaseServiceManager { func setGroupMemberNickname(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ Open_im_sdkSetGroupMemberNickname(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[string:"uid"],methodCall[string:"groupNickname"]) } + + func searchGroups(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkSearchGroups(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"]) + } } public class GroupListener: NSObject, Open_im_sdk_callbackOnGroupListenerProtocol { diff --git a/ios/Classes/Module/MessageManager.swift b/ios/Classes/Module/MessageManager.swift index 2c7017f..0f2dc0c 100644 --- a/ios/Classes/Module/MessageManager.swift +++ b/ios/Classes/Module/MessageManager.swift @@ -43,6 +43,7 @@ public class MessageManager: BaseServiceManager { self["markMessageAsReadByConID"] = markMessageAsReadByConID self["clearC2CHistoryMessageFromLocalAndSvr"] = clearC2CHistoryMessageFromLocalAndSvr self["clearGroupHistoryMessageFromLocalAndSvr"] = clearGroupHistoryMessageFromLocalAndSvr + self["getHistoryMessageListReverse"] = getHistoryMessageListReverse } func setAdvancedMsgListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ @@ -209,6 +210,10 @@ public class MessageManager: BaseServiceManager { Open_im_sdkClearGroupHistoryMessageFromLocalAndSvr(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"]) } + func getHistoryMessageListReverse(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetHistoryMessageListReverse(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) + } + public class SendMsgProgressListener: NSObject, Open_im_sdk_callbackSendMsgCallBackProtocol { private let channel: FlutterMethodChannel private let result: FlutterResult diff --git a/ios/Classes/Module/SignalingManager.swift b/ios/Classes/Module/SignalingManager.swift index 7daf714..046013b 100644 --- a/ios/Classes/Module/SignalingManager.swift +++ b/ios/Classes/Module/SignalingManager.swift @@ -44,7 +44,7 @@ public class SignalingManager: BaseServiceManager { } } public class SignalingListener: NSObject, Open_im_sdk_callbackOnSignalingListenerProtocol { - + private let channel:FlutterMethodChannel init(channel:FlutterMethodChannel) { @@ -78,5 +78,9 @@ public class SignalingListener: NSObject, Open_im_sdk_callbackOnSignalingListene public func onReceiveNewInvitation(_ s: String?) { CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onReceiveNewInvitation", errCode: nil, errMsg: nil, data: s) } - + + public func onHangUp(_ s: String?) { + CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onHangUp", errCode: nil, errMsg: nil, data: s) + } + } diff --git a/ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk.objc.h b/ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk.objc.h index 28c06f4..90e1883 100644 --- a/ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk.objc.h +++ b/ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk.objc.h @@ -120,6 +120,9 @@ FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkGetConversationIDBySessionType(N FOUNDATION_EXPORT void Open_im_sdkGetConversationListSplit(id _Nullable callback, NSString* _Nullable operationID, long offset, long count); +/** + * deprecated + */ FOUNDATION_EXPORT void Open_im_sdkGetConversationRecvMessageOpt(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable conversationIDList); FOUNDATION_EXPORT void Open_im_sdkGetDepartmentMember(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable departmentID, long offset, long count); @@ -138,6 +141,8 @@ FOUNDATION_EXPORT void Open_im_sdkGetGroupsInfo(id _Nu FOUNDATION_EXPORT void Open_im_sdkGetHistoryMessageList(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable getMessageOptions); +FOUNDATION_EXPORT void Open_im_sdkGetHistoryMessageListReverse(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable getMessageOptions); + FOUNDATION_EXPORT void Open_im_sdkGetJoinedGroupList(id _Nullable callback, NSString* _Nullable operationID); FOUNDATION_EXPORT int32_t Open_im_sdkGetLoginStatus(void); @@ -225,6 +230,8 @@ FOUNDATION_EXPORT void Open_im_sdkRevokeMessage(id _Nu FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkSdkVersion(void); +FOUNDATION_EXPORT void Open_im_sdkSearchGroups(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable searchParam); + FOUNDATION_EXPORT void Open_im_sdkSearchLocalMessages(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable searchParam); FOUNDATION_EXPORT void Open_im_sdkSendMessage(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable message, NSString* _Nullable recvID, NSString* _Nullable groupID, NSString* _Nullable offlinePushInfo); diff --git a/ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk_callback.objc.h b/ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk_callback.objc.h index 189872d..88487e1 100644 --- a/ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk_callback.objc.h +++ b/ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk_callback.objc.h @@ -93,6 +93,7 @@ @end @protocol Open_im_sdk_callbackOnSignalingListener +- (void)onHangUp:(NSString* _Nullable)hangUpCallback; - (void)onInvitationCancelled:(NSString* _Nullable)invitationCancelledCallback; - (void)onInvitationTimeout:(NSString* _Nullable)invitationTimeoutCallback; - (void)onInviteeAccepted:(NSString* _Nullable)inviteeAcceptedCallback; @@ -229,6 +230,7 @@ @property(strong, readonly) _Nonnull id _ref; - (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (void)onHangUp:(NSString* _Nullable)hangUpCallback; - (void)onInvitationCancelled:(NSString* _Nullable)invitationCancelledCallback; - (void)onInvitationTimeout:(NSString* _Nullable)invitationTimeoutCallback; - (void)onInviteeAccepted:(NSString* _Nullable)inviteeAcceptedCallback; diff --git a/ios/Framework/OpenIMCore.framework/OpenIMCore b/ios/Framework/OpenIMCore.framework/OpenIMCore index 249621b..10ce959 100644 Binary files a/ios/Framework/OpenIMCore.framework/OpenIMCore and b/ios/Framework/OpenIMCore.framework/OpenIMCore differ diff --git a/lib/src/listener/signaling_listener.dart b/lib/src/listener/signaling_listener.dart index e1d95ae..67219c2 100644 --- a/lib/src/listener/signaling_listener.dart +++ b/lib/src/listener/signaling_listener.dart @@ -8,6 +8,7 @@ class OnSignalingListener { final Function(SignalingInfo info)? onReceiveNewInvitation; final Function(SignalingInfo info)? onInviteeRejectedByOtherDevice; final Function(SignalingInfo info)? onInviteeAcceptedByOtherDevice; + final Function(SignalingInfo info)? onHangup; OnSignalingListener({ this.onInvitationCancelled, @@ -17,6 +18,7 @@ class OnSignalingListener { this.onReceiveNewInvitation, this.onInviteeAcceptedByOtherDevice, this.onInviteeRejectedByOtherDevice, + this.onHangup, }); /// 被邀请者收到:邀请者取消音视频通话 @@ -53,4 +55,9 @@ class OnSignalingListener { void inviteeRejectedByOtherDevice(SignalingInfo info) { onInviteeRejectedByOtherDevice?.call(info); } + + /// 被挂断 + void hangup(SignalingInfo info) { + onHangup?.call(info); + } } diff --git a/lib/src/manager/im_conversation_manager.dart b/lib/src/manager/im_conversation_manager.dart index 43e3b5f..270f9be 100644 --- a/lib/src/manager/im_conversation_manager.dart +++ b/lib/src/manager/im_conversation_manager.dart @@ -243,6 +243,24 @@ class ConversationManager { "operationID": Utils.checkOperationID(operationID), })); + /// Reset group converstaion at type + /// 重置at标准位 + Future resetConversationGroupAtType({ + required String conversationID, + String? operationID, + }) => + _channel.invokeMethod( + 'resetConversationGroupAtType', + _buildParam({ + "conversationID": conversationID, + "operationID": Utils.checkOperationID(operationID), + })); + + /// Get @ all member tag + /// 查询at所有人标识 + Future getAtAllTag() => + _channel.invokeMethod('getAtAllTag', _buildParam({})); + /// Custom sort for conversation list /// 会话列表自定义排序规则。 List simpleSort(List list) => list diff --git a/lib/src/manager/im_group_manager.dart b/lib/src/manager/im_group_manager.dart index 16166c5..b1c46d2 100644 --- a/lib/src/manager/im_group_manager.dart +++ b/lib/src/manager/im_group_manager.dart @@ -382,6 +382,31 @@ class GroupManager { 'operationID': Utils.checkOperationID(operationID), })); + /// Search group + /// 查询群 + /// [keywordList] 搜索关键词,目前仅支持一个关键词搜索,不能为空 + /// [isSearchGroupID] 是否以关键词搜索群ID(注:两个不可以同时为false),为空默认false + /// [isSearchGroupName] 是否以关键词搜索群名字,为空默认false + Future> searchGroups({ + List keywordList = const [], + bool isSearchGroupID = false, + bool isSearchGroupName = false, + String? operationID, + }) => + _channel + .invokeMethod( + 'searchGroups', + _buildParam({ + 'searchParam': { + 'keywordList': keywordList, + 'isSearchGroupID': isSearchGroupID, + 'isSearchGroupName': isSearchGroupName, + }, + 'operationID': Utils.checkOperationID(operationID), + })) + .then( + (value) => Utils.toList(value, (map) => GroupInfo.fromJson(map))); + static Map _buildParam(Map param) { param["ManagerName"] = "groupManager"; return param; diff --git a/lib/src/manager/im_manager.dart b/lib/src/manager/im_manager.dart index 37030b1..5f594bd 100644 --- a/lib/src/manager/im_manager.dart +++ b/lib/src/manager/im_manager.dart @@ -258,6 +258,9 @@ class IMManager { case 'onInviteeRejectedByOtherDevice': signalingManager.listener.inviteeRejectedByOtherDevice(u); break; + case 'onHangUp': + signalingManager.listener.hangup(u); + break; } } else if (call.method == ListenerType.workMomentsListener) { String type = call.arguments['type']; diff --git a/lib/src/manager/im_message_manager.dart b/lib/src/manager/im_message_manager.dart index d8673e2..59875a3 100644 --- a/lib/src/manager/im_message_manager.dart +++ b/lib/src/manager/im_message_manager.dart @@ -529,8 +529,7 @@ class MessageManager { /// Search local message /// 搜索消息 - /// [sourceID]单聊为用户ID,群聊为群ID - /// [sessionType]会话类型,单聊为1,群聊为2,如果为0,则代表搜索全部 + /// [conversationID] 根据会话查询,如果是全局搜索传null /// [keywordList]搜索关键词列表,目前仅支持一个关键词搜索 /// [keywordListMatchType]关键词匹配模式,1代表与,2代表或,暂时未用 /// [senderUserIDList]指定消息发送的uid列表 暂时未用 @@ -540,8 +539,7 @@ class MessageManager { /// [pageIndex]当前页数 /// [count]每页数量 Future searchLocalMessages({ - required String sourceID, - required int sessionType, + String? conversationID, List keywordList = const [], int keywordListMatchType = 0, List senderUserIDList = const [], @@ -557,8 +555,7 @@ class MessageManager { 'searchLocalMessages', _buildParam({ 'filter': { - 'sourceID': sourceID, - 'sessionType': sessionType, + 'conversationID': conversationID, 'keywordList': keywordList, 'keywordListMatchType': keywordListMatchType, 'senderUserIDList': senderUserIDList, @@ -649,6 +646,32 @@ class MessageManager { "operationID": Utils.checkOperationID(operationID), })); + /// Find all history message + /// 获取聊天记录 + /// [userID]接收消息的用户id + /// [conversationID] 会话id + /// [groupID]接收消息的组id + Future> getHistoryMessageListReverse({ + String? userID, + String? groupID, + String? conversationID, + Message? startMsg, + int? count, + String? operationID, + }) => + _channel + .invokeMethod( + 'getHistoryMessageListReverse', + _buildParam({ + 'userID': userID ?? '', + 'groupID': groupID ?? '', + 'conversationID': conversationID ?? '', + 'startClientMsgID': startMsg?.clientMsgID ?? '', + 'count': count ?? 10, + 'operationID': Utils.checkOperationID(operationID), + })) + .then((value) => Utils.toList(value, (map) => Message.fromJson(map))); + static Map _buildParam(Map param) { param["ManagerName"] = "messageManager"; return param; diff --git a/lib/src/models/search_info.dart b/lib/src/models/search_info.dart index 5d806b0..c5a8a24 100644 --- a/lib/src/models/search_info.dart +++ b/lib/src/models/search_info.dart @@ -32,7 +32,12 @@ class SearchResultItems { /// 会话ID String? conversationID; - /// 这个会话下的消息数量 + /// 会话类型1单聊,2群聊,3,超级大群,4通知会话 + int? conversationType; + String? showName; + String? faceURL; + + /// 搜索到的这个会话下的消息数量 int? messageCount; /// [Message]的列表 @@ -42,6 +47,9 @@ class SearchResultItems { SearchResultItems.fromJson(Map json) { conversationID = json['conversationID']; + conversationType = json['conversationType']; + showName = json['showName']; + faceURL = json['faceURL']; messageCount = json['messageCount']; if (json['messageList'] != null) { messageList = []; @@ -54,6 +62,9 @@ class SearchResultItems { Map toJson() { final data = Map(); data['conversationID'] = this.conversationID; + data['conversationType'] = this.conversationType; + data['showName'] = this.showName; + data['faceURL'] = this.faceURL; data['messageCount'] = this.messageCount; if (this.messageList != null) { data['messageList'] = this.messageList!.map((v) => v.toJson()).toList();