diff --git a/CHANGELOG.md b/CHANGELOG.md index 1183713..68e1c51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## 2.0.0+6 + +1.Fix bug
+2.New modify group nickname
+3.Update at message
+4.ConverstaionInfo new add isNotInGroup field
+5.New at type
+6.New work moments
+ ## 2.0.0+5 1.New notification parse
diff --git a/android/build.gradle b/android/build.gradle index 04079f1..d36bbe1 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -41,5 +41,5 @@ android { } } dependencies { - implementation 'io.openim:client-sdk:2.0.31@aar' + implementation 'io.openim:client-sdk:2.0.42@aar' } \ No newline at end of file diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/FlutterOpenimSdkPlugin.java b/android/src/main/java/io/openim/flutter_openim_sdk/FlutterOpenimSdkPlugin.java index 8f3a500..918b76b 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/FlutterOpenimSdkPlugin.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/FlutterOpenimSdkPlugin.java @@ -20,6 +20,7 @@ import io.openim.flutter_openim_sdk.manager.IMManager; import io.openim.flutter_openim_sdk.manager.MessageManager; import io.openim.flutter_openim_sdk.manager.SignalingManager; import io.openim.flutter_openim_sdk.manager.UserManager; +import io.openim.flutter_openim_sdk.manager.WorkMomentsManager; /** @@ -39,6 +40,7 @@ public class FlutterOpenimSdkPlugin implements FlutterPlugin, MethodCallHandler private static ConversationManager conversationManager; private static GroupManager groupManager; private static SignalingManager signalingManager; + private static WorkMomentsManager workMomentsManager; public FlutterOpenimSdkPlugin() { } @@ -51,6 +53,7 @@ public class FlutterOpenimSdkPlugin implements FlutterPlugin, MethodCallHandler FlutterOpenimSdkPlugin.conversationManager = new ConversationManager(); FlutterOpenimSdkPlugin.groupManager = new GroupManager(); FlutterOpenimSdkPlugin.signalingManager = new SignalingManager(); + FlutterOpenimSdkPlugin.workMomentsManager = new WorkMomentsManager(); } @Override diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnWorkMomentsListener.java b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnWorkMomentsListener.java new file mode 100644 index 0000000..73c6927 --- /dev/null +++ b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnWorkMomentsListener.java @@ -0,0 +1,12 @@ +package io.openim.flutter_openim_sdk.listener; + +import io.openim.flutter_openim_sdk.util.CommonUtil; + +public class OnWorkMomentsListener implements open_im_sdk_callback.OnWorkMomentsListener { + + + @Override + public void onRecvNewNotification() { + CommonUtil.emitEvent("workMomentsListener", "OnRecvNewNotification", null); + } +} 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 1132a02..3027014 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 @@ -174,4 +174,13 @@ public class GroupManager extends BaseManager { int2long(methodCall, "seconds") ); } + + public void setGroupMemberNickname(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.setGroupMemberNickname(new OnBaseListener(result), + value(methodCall, "operationID"), + value(methodCall, "gid"), + value(methodCall, "uid"), + value(methodCall, "groupNickname") + ); + } } \ 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 d376581..f36d209 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 @@ -182,7 +182,10 @@ public class MessageManager extends BaseManager { Open_im_sdk.createTextAtMessage( value(methodCall, "operationID"), value(methodCall, "text"), - jsonValue(methodCall, "atUserList"))); + jsonValue(methodCall, "atUserIDList"), + jsonValue(methodCall, "atUserInfoList"), + jsonValue(methodCall, "quoteMessage") + )); } public void createImageMessage(MethodCall methodCall, MethodChannel.Result result) { 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 new file mode 100644 index 0000000..12dc39b --- /dev/null +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/WorkMomentsManager.java @@ -0,0 +1,31 @@ +package io.openim.flutter_openim_sdk.manager; + +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.openim.flutter_openim_sdk.listener.OnBaseListener; +import io.openim.flutter_openim_sdk.listener.OnWorkMomentsListener; +import open_im_sdk.Open_im_sdk; + +public class WorkMomentsManager extends BaseManager { + + void setWorkMomentsListener(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.setWorkMomentsListener(new OnWorkMomentsListener()); + } + + public void getWorkMomentsUnReadCount(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.getWorkMomentsUnReadCount(new OnBaseListener(result), + value(methodCall, "operationID")); + } + + public void getWorkMomentsNotification(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.getWorkMomentsNotification(new OnBaseListener(result), + value(methodCall, "operationID"), + int2long(methodCall, "offset"), + int2long(methodCall, "count")); + } + + public void clearWorkMomentsNotification(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.clearWorkMomentsNotification(new OnBaseListener(result), + value(methodCall, "operationID")); + } +} diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/util/JsonUtil.java b/android/src/main/java/io/openim/flutter_openim_sdk/util/JsonUtil.java index 0c8af16..897da15 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/util/JsonUtil.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/util/JsonUtil.java @@ -4,8 +4,9 @@ import org.json.JSONObject; public class JsonUtil { public static String toString(Object o) { + if (o == null) return null; if (o instanceof String) { - StringBuffer buffer = new StringBuffer(); + StringBuilder buffer = new StringBuilder(); buffer.append("\""); buffer.append(o); buffer.append("\""); diff --git a/ios/Classes/Module/GroupManager.swift b/ios/Classes/Module/GroupManager.swift index 8ec19a8..533acfb 100644 --- a/ios/Classes/Module/GroupManager.swift +++ b/ios/Classes/Module/GroupManager.swift @@ -24,6 +24,7 @@ public class GroupManager: BaseServiceManager { self["dismissGroup"] = dismissGroup self["changeGroupMute"] = changeGroupMute self["changeGroupMemberMute"] = changeGroupMemberMute + self["setGroupMemberNickname"] = setGroupMemberNickname } func setGroupListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ @@ -105,6 +106,10 @@ public class GroupManager: BaseServiceManager { func changeGroupMemberMute(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ Open_im_sdkChangeGroupMemberMute(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[string:"uid"],methodCall[int:"seconds"]) } + + 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"]) + } } public class GroupListener: NSObject, Open_im_sdk_callbackOnGroupListenerProtocol { diff --git a/ios/Classes/Module/MessageManager.swift b/ios/Classes/Module/MessageManager.swift index 85d5318..2c7017f 100644 --- a/ios/Classes/Module/MessageManager.swift +++ b/ios/Classes/Module/MessageManager.swift @@ -98,7 +98,8 @@ public class MessageManager: BaseServiceManager { } func createTextAtMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - callBack(result, Open_im_sdkCreateTextAtMessage(methodCall[string: "operationID"], methodCall[string: "text"], methodCall[jsonString: "atUserList"])) + callBack(result, Open_im_sdkCreateTextAtMessage(methodCall[string: "operationID"], methodCall[string: "text"], + methodCall[jsonString: "atUserIDList"], methodCall[jsonString: "atUserInfoList"], methodCall[jsonString: "quoteMessage"])) } func createImageMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ diff --git a/ios/Classes/Module/WorkMomentsManager.swift b/ios/Classes/Module/WorkMomentsManager.swift new file mode 100644 index 0000000..d00b166 --- /dev/null +++ b/ios/Classes/Module/WorkMomentsManager.swift @@ -0,0 +1,44 @@ +import Foundation +import OpenIMCore + +public class WorkMomentsManager: BaseServiceManager { + + public override func registerHandlers() { + super.registerHandlers() + self["setWorkMomentsListener"] = setWorkMomentsListener + self["getWorkMomentsUnReadCount"] = getWorkMomentsUnReadCount + self["getWorkMomentsNotification"] = getWorkMomentsNotification + self["clearWorkMomentsNotification"] = clearWorkMomentsNotification + } + + func setWorkMomentsListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkSetWorkMomentsListener(WorkMomentsListener(channel: channel)) + callBack(result) + } + + func getWorkMomentsUnReadCount(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetWorkMomentsUnReadCount(BaseCallback(result: result), methodCall[string: "operationID"]) + } + + func getWorkMomentsNotification(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetWorkMomentsNotification(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "offset"], methodCall[int: "count"]) + } + + func clearWorkMomentsNotification(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkClearWorkMomentsNotification(BaseCallback(result: result), methodCall[string: "operationID"]) + } +} + +public class WorkMomentsListener: NSObject, Open_im_sdk_callbackOnWorkMomentsListenerProtocol { + + private let channel:FlutterMethodChannel + + init(channel:FlutterMethodChannel) { + self.channel = channel + } + + public func onRecvNewNotification() { + CommonUtil.emitEvent(channel: self.channel, method: "workMomentsListener", type: "OnRecvNewNotification", errCode: nil, errMsg: nil, data: nil) + } + +} diff --git a/ios/Classes/SwiftFlutterOpenimSdkPlugin.swift b/ios/Classes/SwiftFlutterOpenimSdkPlugin.swift index 5324a94..8091c80 100644 --- a/ios/Classes/SwiftFlutterOpenimSdkPlugin.swift +++ b/ios/Classes/SwiftFlutterOpenimSdkPlugin.swift @@ -9,6 +9,7 @@ public class SwiftFlutterOpenimSdkPlugin: NSObject, FlutterPlugin { let groupManager: GroupManager let userManger: UserManager let signalingManager: SignalingManager + let workMomentsManager: WorkMomentsManager init(channel: FlutterMethodChannel) { self.imManager = IMMananger(channel: channel) @@ -18,6 +19,7 @@ public class SwiftFlutterOpenimSdkPlugin: NSObject, FlutterPlugin { self.groupManager = GroupManager(channel: channel) self.userManger = UserManager(channel: channel) self.signalingManager = SignalingManager(channel: channel) + self.workMomentsManager = WorkMomentsManager(channel: channel) } public static func register(with registrar: FlutterPluginRegistrar) { @@ -43,6 +45,8 @@ public class SwiftFlutterOpenimSdkPlugin: NSObject, FlutterPlugin { userManger.handleMethod(call: call, result: result) case "signalingManager": signalingManager.handleMethod(call: call, result: result) + case "workMomentsManager": + workMomentsManager.handleMethod(call: call, result: result) default: print("Handle ManagerName Error: \(managerName) not found") } 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 834b275..28c06f4 100644 --- a/ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk.objc.h +++ b/ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk.objc.h @@ -46,6 +46,8 @@ FOUNDATION_EXPORT void Open_im_sdkClearGroupHistoryMessage(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable groupID); +FOUNDATION_EXPORT void Open_im_sdkClearWorkMomentsNotification(id _Nullable callback, NSString* _Nullable operationID); + FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateCardMessage(NSString* _Nullable operationID, NSString* _Nullable cardInfo); FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateCustomMessage(NSString* _Nullable operationID, NSString* _Nullable data, NSString* _Nullable extension, NSString* _Nullable description); @@ -80,7 +82,7 @@ FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateSoundMessageByURL(NSString FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateSoundMessageFromFullPath(NSString* _Nullable operationID, NSString* _Nullable soundPath, int64_t duration); -FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateTextAtMessage(NSString* _Nullable operationID, NSString* _Nullable text, NSString* _Nullable atUserList); +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateTextAtMessage(NSString* _Nullable operationID, NSString* _Nullable text, NSString* _Nullable atUserList, NSString* _Nullable atUsersInfo, NSString* _Nullable message); FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateTextMessage(NSString* _Nullable operationID, NSString* _Nullable text); @@ -110,6 +112,8 @@ FOUNDATION_EXPORT void Open_im_sdkDismissGroup(id _Nul FOUNDATION_EXPORT void Open_im_sdkGetAllConversationList(id _Nullable callback, NSString* _Nullable operationID); +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkGetAtAllTag(void); + FOUNDATION_EXPORT void Open_im_sdkGetBlackList(id _Nullable callback, NSString* _Nullable operationID); FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkGetConversationIDBySessionType(NSString* _Nullable sourceID, long sessionType); @@ -118,6 +122,10 @@ FOUNDATION_EXPORT void Open_im_sdkGetConversationListSplit(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); + +FOUNDATION_EXPORT void Open_im_sdkGetDepartmentMemberAndSubDepartment(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable departmentID, long departmentOffset, long departmentCount, long memberOffset, long memberCount); + FOUNDATION_EXPORT void Open_im_sdkGetDesignatedFriendsInfo(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable userIDList); FOUNDATION_EXPORT void Open_im_sdkGetFriendList(id _Nullable callback, NSString* _Nullable operationID); @@ -150,8 +158,12 @@ FOUNDATION_EXPORT void Open_im_sdkGetSendFriendApplicationList(id _Nullable callback, NSString* _Nullable operationID); +FOUNDATION_EXPORT void Open_im_sdkGetSubDepartment(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable departmentID, long offset, long count); + FOUNDATION_EXPORT void Open_im_sdkGetTotalUnreadMsgCount(id _Nullable callback, NSString* _Nullable operationID); +FOUNDATION_EXPORT void Open_im_sdkGetUserInDepartment(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable userID); + // skipped function GetUserWorker with unsupported parameter or return types @@ -160,6 +172,13 @@ FOUNDATION_EXPORT void Open_im_sdkGetTotalUnreadMsgCount(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable userIDList); +FOUNDATION_EXPORT void Open_im_sdkGetWorkMomentsNotification(id _Nullable callback, NSString* _Nullable operationID, long offset, long count); + +/** + * workMomentsInterface + */ +FOUNDATION_EXPORT void Open_im_sdkGetWorkMomentsUnReadCount(id _Nullable callback, NSString* _Nullable operationID); + // skipped function InitOnce with unsupported parameter or return types @@ -200,6 +219,8 @@ FOUNDATION_EXPORT void Open_im_sdkRefuseGroupApplication(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable removeUserID); +FOUNDATION_EXPORT void Open_im_sdkResetConversationGroupAtType(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable conversationID); + FOUNDATION_EXPORT void Open_im_sdkRevokeMessage(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable message); FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkSdkVersion(void); @@ -229,12 +250,16 @@ FOUNDATION_EXPORT void Open_im_sdkSetGroupInfo(id _Nul */ FOUNDATION_EXPORT void Open_im_sdkSetGroupListener(id _Nullable callback); +FOUNDATION_EXPORT void Open_im_sdkSetGroupMemberNickname(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable groupID, NSString* _Nullable userID, NSString* _Nullable groupMemberNickname); + FOUNDATION_EXPORT void Open_im_sdkSetHeartbeatInterval(long heartbeatInterval); FOUNDATION_EXPORT void Open_im_sdkSetOneConversationPrivateChat(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable conversationID, BOOL isPrivate); FOUNDATION_EXPORT void Open_im_sdkSetOneConversationRecvMessageOpt(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable conversationID, long opt); +FOUNDATION_EXPORT void Open_im_sdkSetOrganizationListener(id _Nullable callback); + FOUNDATION_EXPORT void Open_im_sdkSetSelfInfo(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable userInfo); /** @@ -244,6 +269,8 @@ FOUNDATION_EXPORT void Open_im_sdkSetSignalingListener(id _Nullable listener); +FOUNDATION_EXPORT void Open_im_sdkSetWorkMomentsListener(id _Nullable listener); + FOUNDATION_EXPORT void Open_im_sdkSignalingAccept(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable signalAcceptReq); FOUNDATION_EXPORT void Open_im_sdkSignalingCancel(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable signalCancelReq); 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 715b2ab..189872d 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 @@ -23,10 +23,14 @@ @class Open_im_sdk_callbackOnFriendshipListener; @protocol Open_im_sdk_callbackOnGroupListener; @class Open_im_sdk_callbackOnGroupListener; +@protocol Open_im_sdk_callbackOnOrganizationListener; +@class Open_im_sdk_callbackOnOrganizationListener; @protocol Open_im_sdk_callbackOnSignalingListener; @class Open_im_sdk_callbackOnSignalingListener; @protocol Open_im_sdk_callbackOnUserListener; @class Open_im_sdk_callbackOnUserListener; +@protocol Open_im_sdk_callbackOnWorkMomentsListener; +@class Open_im_sdk_callbackOnWorkMomentsListener; @protocol Open_im_sdk_callbackSendMsgCallBack; @class Open_im_sdk_callbackSendMsgCallBack; @@ -38,7 +42,7 @@ @protocol Open_im_sdk_callbackOnAdvancedMsgListener - (void)onRecvC2CReadReceipt:(NSString* _Nullable)msgReceiptList; - (void)onRecvGroupReadReceipt:(NSString* _Nullable)groupMsgReceiptList; -- (void)onRecvMessageRevoked:(NSString* _Nullable)msgId; +- (void)onRecvMessageRevoked:(NSString* _Nullable)msgID; - (void)onRecvNewMessage:(NSString* _Nullable)message; @end @@ -84,6 +88,10 @@ - (void)onJoinedGroupDeleted:(NSString* _Nullable)groupInfo; @end +@protocol Open_im_sdk_callbackOnOrganizationListener +- (void)onOrganizationUpdated; +@end + @protocol Open_im_sdk_callbackOnSignalingListener - (void)onInvitationCancelled:(NSString* _Nullable)invitationCancelledCallback; - (void)onInvitationTimeout:(NSString* _Nullable)invitationTimeoutCallback; @@ -98,6 +106,10 @@ - (void)onSelfInfoUpdated:(NSString* _Nullable)userInfo; @end +@protocol Open_im_sdk_callbackOnWorkMomentsListener +- (void)onRecvNewNotification; +@end + @protocol Open_im_sdk_callbackSendMsgCallBack - (void)onError:(int32_t)errCode errMsg:(NSString* _Nullable)errMsg; - (void)onProgress:(long)progress; @@ -116,10 +128,14 @@ @class Open_im_sdk_callbackOnGroupListener; +@class Open_im_sdk_callbackOnOrganizationListener; + @class Open_im_sdk_callbackOnSignalingListener; @class Open_im_sdk_callbackOnUserListener; +@class Open_im_sdk_callbackOnWorkMomentsListener; + @class Open_im_sdk_callbackSendMsgCallBack; @interface Open_im_sdk_callbackBase : NSObject { @@ -138,7 +154,7 @@ - (nonnull instancetype)initWithRef:(_Nonnull id)ref; - (void)onRecvC2CReadReceipt:(NSString* _Nullable)msgReceiptList; - (void)onRecvGroupReadReceipt:(NSString* _Nullable)groupMsgReceiptList; -- (void)onRecvMessageRevoked:(NSString* _Nullable)msgId; +- (void)onRecvMessageRevoked:(NSString* _Nullable)msgID; - (void)onRecvNewMessage:(NSString* _Nullable)message; @end @@ -200,6 +216,14 @@ - (void)onJoinedGroupDeleted:(NSString* _Nullable)groupInfo; @end +@interface Open_im_sdk_callbackOnOrganizationListener : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (void)onOrganizationUpdated; +@end + @interface Open_im_sdk_callbackOnSignalingListener : NSObject { } @property(strong, readonly) _Nonnull id _ref; @@ -222,6 +246,14 @@ - (void)onSelfInfoUpdated:(NSString* _Nullable)userInfo; @end +@interface Open_im_sdk_callbackOnWorkMomentsListener : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (void)onRecvNewNotification; +@end + @interface Open_im_sdk_callbackSendMsgCallBack : NSObject { } @property(strong, readonly) _Nonnull id _ref; diff --git a/ios/Framework/OpenIMCore.framework/OpenIMCore b/ios/Framework/OpenIMCore.framework/OpenIMCore index c34ef27..249621b 100644 Binary files a/ios/Framework/OpenIMCore.framework/OpenIMCore and b/ios/Framework/OpenIMCore.framework/OpenIMCore differ diff --git a/lib/flutter_openim_sdk.dart b/lib/flutter_openim_sdk.dart index 86e3013..365f4df 100644 --- a/lib/flutter_openim_sdk.dart +++ b/lib/flutter_openim_sdk.dart @@ -1,6 +1,7 @@ library flutter_openim_sdk; export 'src/enum/conversation_type.dart'; +export 'src/enum/group_at_type.dart'; export 'src/enum/group_role_level.dart'; export 'src/enum/im_platform.dart'; export 'src/enum/listener_type.dart'; @@ -14,6 +15,7 @@ export 'src/listener/group_listener.dart'; export 'src/listener/msg_send_progress_listener.dart'; export 'src/listener/signaling_listener.dart'; export 'src/listener/user_listener.dart'; +export 'src/listener/workmoments_listener.dart'; export 'src/manager/im_conversation_manager.dart'; export 'src/manager/im_friendship_manager.dart'; export 'src/manager/im_group_manager.dart'; @@ -22,6 +24,7 @@ export 'src/manager/im_message_manager.dart'; export 'src/manager/im_offline_push_manager.dart'; export 'src/manager/im_signaling_manager.dart'; export 'src/manager/im_user_manager.dart'; +export 'src/manager/im_workmoments_manager.dart'; export 'src/models/conversation_info.dart'; export 'src/models/group_info.dart'; export 'src/models/message.dart'; @@ -29,5 +32,6 @@ export 'src/models/notification_info.dart'; export 'src/models/search_info.dart'; export 'src/models/signaling_info.dart'; export 'src/models/user_info.dart'; +export 'src/models/workmoments_info.dart'; export 'src/openim.dart'; export 'src/utils.dart'; diff --git a/lib/src/enum/group_at_type.dart b/lib/src/enum/group_at_type.dart new file mode 100644 index 0000000..140d9be --- /dev/null +++ b/lib/src/enum/group_at_type.dart @@ -0,0 +1,6 @@ +class GroupAtType { + static const atNormal = 0; + static const atMe = 1; + static const atAll = 2; + static const atAllAtMe = 3; +} diff --git a/lib/src/enum/listener_type.dart b/lib/src/enum/listener_type.dart index 61f34c7..6e13237 100644 --- a/lib/src/enum/listener_type.dart +++ b/lib/src/enum/listener_type.dart @@ -8,4 +8,5 @@ class ListenerType { static final friendListener = 'friendListener'; static final signalingListener = 'signalingListener'; static final msgSendProgressListener = "msgSendProgressListener"; + static final workMomentsListener = "workMomentsListener"; } diff --git a/lib/src/enum/message_type.dart b/lib/src/enum/message_type.dart index 88b68aa..e354a28 100644 --- a/lib/src/enum/message_type.dart +++ b/lib/src/enum/message_type.dart @@ -56,6 +56,7 @@ class MessageType { static const groupMemberCancelMutedNotification = 1513; static const groupMutedNotification = 1514; static const groupCancelMutedNotification = 1515; + static const groupMemberInfoChangedNotification = 1516; static const signalingNotificationBegin = 1600; static const signalingNotification = 1601; diff --git a/lib/src/listener/workmoments_listener.dart b/lib/src/listener/workmoments_listener.dart new file mode 100644 index 0000000..f420fa8 --- /dev/null +++ b/lib/src/listener/workmoments_listener.dart @@ -0,0 +1,9 @@ +class OnWorkMomentsListener { + Function()? onRecvNewNotification; + + OnWorkMomentsListener({this.onRecvNewNotification}); + + void recvNewNotification() { + onRecvNewNotification?.call(); + } +} diff --git a/lib/src/manager/im_group_manager.dart b/lib/src/manager/im_group_manager.dart index 3b9ae08..16166c5 100644 --- a/lib/src/manager/im_group_manager.dart +++ b/lib/src/manager/im_group_manager.dart @@ -365,6 +365,23 @@ class GroupManager { 'operationID': Utils.checkOperationID(operationID), })); + /// Set group user nickname + /// 设置群成员昵称 + Future setGroupMemberNickname({ + required String groupID, + required String userID, + String? groupNickname, + String? operationID, + }) => + _channel.invokeMethod( + 'setGroupMemberNickname', + _buildParam({ + 'gid': groupID, + 'uid': userID, + 'groupNickname': groupNickname ?? '', + 'operationID': Utils.checkOperationID(operationID), + })); + 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 d07cc9b..37030b1 100644 --- a/lib/src/manager/im_manager.dart +++ b/lib/src/manager/im_manager.dart @@ -13,6 +13,7 @@ class IMManager { // late OfflinePushManager offlinePushManager; late SignalingManager signalingManager; + late WorkMomentsManager workMomentsManager; late OnConnectListener _connectListener; late String uid; @@ -27,6 +28,7 @@ class IMManager { userManager = UserManager(_channel); // offlinePushManager = OfflinePushManager(_channel); signalingManager = SignalingManager(_channel); + workMomentsManager = WorkMomentsManager(_channel); _addNativeCallback(_channel); } @@ -212,7 +214,7 @@ class IMManager { data, (map) => FriendApplicationInfo.fromJson(map)); friendshipManager.listener.friendApplicationDeleted(u); break; - case 'onFriendApplicationListRejected': + case 'onFriendApplicationRejected': final u = Utils.toObj( data, (map) => FriendApplicationInfo.fromJson(map)); friendshipManager.listener.friendApplicationRejected(u); @@ -257,6 +259,13 @@ class IMManager { signalingManager.listener.inviteeRejectedByOtherDevice(u); break; } + } else if (call.method == ListenerType.workMomentsListener) { + String type = call.arguments['type']; + switch (type) { + case 'OnRecvNewNotification': + workMomentsManager.listener.recvNewNotification(); + break; + } } } catch (err) { print( diff --git a/lib/src/manager/im_message_manager.dart b/lib/src/manager/im_message_manager.dart index 0a1c22a..d8673e2 100644 --- a/lib/src/manager/im_message_manager.dart +++ b/lib/src/manager/im_message_manager.dart @@ -214,7 +214,9 @@ class MessageManager { /// 创建@消息 Future createTextAtMessage({ required String text, - required List atUidList, + required List atUserIDList, + List atUserInfoList = const [], + Message? quoteMessage, String? operationID, }) => _channel @@ -222,7 +224,9 @@ class MessageManager { 'createTextAtMessage', _buildParam({ 'text': text, - 'atUserList': atUidList, + 'atUserIDList': atUserIDList, + 'atUserInfoList': atUserInfoList.map((e) => e.toJson()).toList(), + 'quoteMessage': quoteMessage?.toJson(), "operationID": Utils.checkOperationID(operationID), }), ) diff --git a/lib/src/manager/im_workmoments_manager.dart b/lib/src/manager/im_workmoments_manager.dart new file mode 100644 index 0000000..e13704a --- /dev/null +++ b/lib/src/manager/im_workmoments_manager.dart @@ -0,0 +1,59 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; + +class WorkMomentsManager { + MethodChannel _channel; + late OnWorkMomentsListener listener; + + WorkMomentsManager(this._channel); + + /// Observe work moments changes + Future setWorkMomentsListener(OnWorkMomentsListener listener) { + this.listener = listener; + return _channel.invokeMethod('setWorkMomentsListener', _buildParam({})); + } + + /// Get work moments unread count + Future getWorkMomentsUnReadCount({ + String? operationID, + }) => + _channel + .invokeMethod( + 'getWorkMomentsUnReadCount', + _buildParam({ + 'operationID': Utils.checkOperationID(operationID), + })) + .then((value) => Utils.toObj(value, (map) => map['unread_count'])); + + /// Get work moments notification list + Future> getWorkMomentsNotification({ + required int offset, + required int count, + String? operationID, + }) => + _channel + .invokeMethod( + 'getWorkMomentsNotification', + _buildParam({ + 'offset': offset, + 'count': count, + 'operationID': Utils.checkOperationID(operationID), + })) + .then((value) => + Utils.toList(value, (map) => WorkMomentsInfo.fromJson(map))); + + /// Clear work moments notification + Future clearWorkMomentsNotification({ + String? operationID, + }) => + _channel.invokeMethod( + 'clearWorkMomentsNotification', + _buildParam({ + 'operationID': Utils.checkOperationID(operationID), + })); + + static Map _buildParam(Map param) { + param["ManagerName"] = "workMomentsManager"; + return param; + } +} diff --git a/lib/src/models/conversation_info.dart b/lib/src/models/conversation_info.dart index d7e4b1d..0579fd4 100644 --- a/lib/src/models/conversation_info.dart +++ b/lib/src/models/conversation_info.dart @@ -21,22 +21,25 @@ class ConversationInfo { bool? isPinned; bool? isPrivateChat; String? ext; + bool? isNotInGroup; - ConversationInfo( - {required this.conversationID, - this.conversationType, - this.userID, - this.groupID, - this.showName, - this.faceURL, - this.recvMsgOpt, - this.unreadCount, - this.latestMsg, - this.latestMsgSendTime, - this.draftText, - this.draftTextTime, - this.isPrivateChat, - this.isPinned}); + ConversationInfo({ + required this.conversationID, + this.conversationType, + this.userID, + this.groupID, + this.showName, + this.faceURL, + this.recvMsgOpt, + this.unreadCount, + this.latestMsg, + this.latestMsgSendTime, + this.draftText, + this.draftTextTime, + this.isPrivateChat, + this.isPinned, + this.isNotInGroup, + }); ConversationInfo.fromJson(Map json) : conversationID = json['conversationID'] { @@ -59,6 +62,8 @@ class ConversationInfo { draftTextTime = json['draftTextTime']; isPinned = json['isPinned']; isPrivateChat = json['isPrivateChat']; + isNotInGroup = json['isNotInGroup']; + groupAtType = json['groupAtType']; } Map toJson() { @@ -77,6 +82,8 @@ class ConversationInfo { data['draftTextTime'] = this.draftTextTime; data['isPinned'] = this.isPinned; data['isPrivateChat'] = this.isPrivateChat; + data['isNotInGroup'] = this.isNotInGroup; + data['groupAtType'] = this.groupAtType; return data; } diff --git a/lib/src/models/message.dart b/lib/src/models/message.dart index a2da835..f04af85 100644 --- a/lib/src/models/message.dart +++ b/lib/src/models/message.dart @@ -424,8 +424,16 @@ class AtElem { String? text; List? atUserList; bool? isAtSelf; + List? atUsersInfo; + Message? quoteMessage; - AtElem({this.text, this.atUserList, this.isAtSelf}); + AtElem({ + this.text, + this.atUserList, + this.isAtSelf, + this.atUsersInfo, + this.quoteMessage, + }); AtElem.fromJson(Map json) { text = json['text']; @@ -433,6 +441,14 @@ class AtElem { atUserList = (json['atUserList'] as List).map((e) => '$e').toList(); } isAtSelf = json['isAtSelf']; + if (json['atUsersInfo'] is List) { + atUsersInfo = (json['atUsersInfo'] as List) + .map((e) => AtUserInfo.fromJson(e)) + .toList(); + } + quoteMessage = null != json['quoteMessage'] + ? Message.fromJson(json['quoteMessage']) + : null; } Map toJson() { @@ -440,6 +456,8 @@ class AtElem { data['text'] = this.text; data['atUserList'] = this.atUserList; data['isAtSelf'] = this.isAtSelf; + data['atUsersInfo'] = this.atUsersInfo?.map((e) => e.toJson()).toList(); + data['quoteMessage'] = this.quoteMessage?.toJson(); return data; } } @@ -705,3 +723,22 @@ class OfflinePushInfo { return data; } } + +class AtUserInfo { + String? atUserID; + String? groupNickname; + + AtUserInfo({this.atUserID, this.groupNickname}); + + AtUserInfo.fromJson(Map json) { + atUserID = json['atUserID']; + groupNickname = json['groupNickname']; + } + + Map toJson() { + final data = Map(); + data['atUserID'] = this.atUserID; + data['groupNickname'] = this.groupNickname; + return data; + } +} diff --git a/lib/src/models/notification_info.dart b/lib/src/models/notification_info.dart index a9fcb7f..b59f89b 100644 --- a/lib/src/models/notification_info.dart +++ b/lib/src/models/notification_info.dart @@ -233,6 +233,33 @@ class QuitGroupNotification { } } +/// Enter group notification +/// 进群通知 +class EnterGroupNotification { + GroupInfo? group; + GroupMembersInfo? entrantUser; + + EnterGroupNotification({this.group, this.entrantUser}); + + EnterGroupNotification.fromJson(Map json) { + group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null; + entrantUser = json['entrantUser'] != null + ? GroupMembersInfo.fromJson(json['entrantUser']) + : null; + } + + Map toJson() { + final data = Map(); + if (this.group != null) { + data['group'] = this.group!.toJson(); + } + if (this.entrantUser != null) { + data['quitUser'] = this.entrantUser!.toJson(); + } + return data; + } +} + /// Group rights transfer noticication /// 群权转让通知 class GroupRightsTransferNoticication { @@ -277,11 +304,13 @@ class MuteMemberNotification { GroupInfo? group; GroupMembersInfo? opUser; GroupMembersInfo? mutedUser; + int? mutedSeconds; MuteMemberNotification({ this.group, this.opUser, this.mutedUser, + this.mutedSeconds, }); MuteMemberNotification.fromJson(Map json) { @@ -292,6 +321,7 @@ class MuteMemberNotification { mutedUser = json['mutedUser'] != null ? GroupMembersInfo.fromJson(json['mutedUser']) : null; + mutedSeconds = json['mutedSeconds']; } Map toJson() { @@ -305,6 +335,7 @@ class MuteMemberNotification { if (this.mutedUser != null) { data['mutedUser'] = this.mutedUser!.toJson(); } + data['mutedSeconds'] = this.mutedSeconds; return data; } } @@ -332,3 +363,41 @@ class BurnAfterReadingNotification { return data; } } + +/// Group member info changed notification +/// 禁言成员通知 +class GroupMemberInfoChangedNotification { + GroupInfo? group; + GroupMembersInfo? opUser; + GroupMembersInfo? changedUser; + + GroupMemberInfoChangedNotification({ + this.group, + this.opUser, + this.changedUser, + }); + + GroupMemberInfoChangedNotification.fromJson(Map json) { + group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null; + opUser = json['opUser'] != null + ? GroupMembersInfo.fromJson(json['opUser']) + : null; + changedUser = json['changedUser'] != null + ? GroupMembersInfo.fromJson(json['changedUser']) + : null; + } + + Map toJson() { + final data = Map(); + if (this.group != null) { + data['group'] = this.group!.toJson(); + } + if (this.opUser != null) { + data['opUser'] = this.opUser!.toJson(); + } + if (this.changedUser != null) { + data['changedUser'] = this.changedUser!.toJson(); + } + return data; + } +} diff --git a/lib/src/models/workmoments_info.dart b/lib/src/models/workmoments_info.dart new file mode 100644 index 0000000..be064d1 --- /dev/null +++ b/lib/src/models/workmoments_info.dart @@ -0,0 +1,114 @@ +class WorkMomentsInfo { + /// 工作圈消息类型 0为普通评论 1为被喜欢 2为AT提醒看的朋友圈 + int? notificationMsgType; + Comment? comment; + + /// 工作圈id + String? workMomentID; + + /// 工作圈所属用户 + String? userID; + + /// 工作圈所属用户名字 + String? userName; + + /// 工作圈用户faceurl + String? faceURL; + + /// 工作圈内容 + String? workMomentContent; + + WorkMomentsInfo( + {this.notificationMsgType, + this.comment, + this.workMomentID, + this.userID, + this.userName, + this.faceURL, + this.workMomentContent}); + + WorkMomentsInfo.fromJson(Map json) { + notificationMsgType = json['notificationMsgType']; + comment = + json['comment'] != null ? Comment.fromJson(json['comment']) : null; + workMomentID = json['workMomentID']; + userID = json['userID']; + userName = json['userName']; + faceURL = json['faceURL']; + workMomentContent = json['workMomentContent']; + } + + Map toJson() { + final data = Map(); + data['notificationMsgType'] = this.notificationMsgType; + if (this.comment != null) { + data['comment'] = this.comment!.toJson(); + } + data['workMomentID'] = this.workMomentID; + data['userID'] = this.userID; + data['userName'] = this.userName; + data['faceURL'] = this.faceURL; + data['workMomentContent'] = this.workMomentContent; + return data; + } +} + +class Comment { + /// 回复的用户 + String? userID; + + /// 回复的用户名 + String? userName; + + /// 回复的用户头像 + String? faceURL; + + /// 被回复的用户ID + String? replyUserID; + + /// 被回复的用户名字 + String? replyUserName; + + /// 回复ID + String? contentID; + + /// 回复内容 + String? content; + + /// 回复时间 + int? createTime; + + Comment( + {this.userID, + this.userName, + this.faceURL, + this.replyUserID, + this.replyUserName, + this.contentID, + this.content, + this.createTime}); + + Comment.fromJson(Map json) { + userID = json['userID']; + userName = json['userName']; + faceURL = json['faceURL']; + replyUserID = json['replyUserID']; + replyUserName = json['replyUserName']; + contentID = json['contentID']; + content = json['content']; + createTime = json['createTime']; + } + + Map toJson() { + final Map data = new Map(); + data['userID'] = this.userID; + data['userName'] = this.userName; + data['faceURL'] = this.faceURL; + data['replyUserID'] = this.replyUserID; + data['replyUserName'] = this.replyUserName; + data['contentID'] = this.contentID; + data['content'] = this.content; + data['createTime'] = this.createTime; + return data; + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 16463c5..fcbf6dd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_openim_sdk description: An instant messaging plug-in that supports Android and IOS. And the server is also all open source. -version: 2.0.0+5 +version: 2.0.0+6 homepage: https://www.rentsoft.cn repository: https://github.com/OpenIMSDK/Open-IM-SDK-Flutter