diff --git a/CHANGELOG.md b/CHANGELOG.md index eafbc0b..aa5619c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +## 2.0.0+5 + +1.New oa notification
+2.New method deleteConversationMsgFromLocalAndSvr
+2.New method deleteMessageFromLocalAndSvr
+3.New method deleteAllMsgFromLocal
+3.New method deleteAllMsgFromLocalAndSvr
+3.New method markMessageAsReadByConID
+3.New method wakeUp
+ ## 2.0.0+4 1.New dismiss group
diff --git a/android/build.gradle b/android/build.gradle index 0104aca..0da6537 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -41,5 +41,5 @@ android { } } dependencies { - implementation 'io.openim:client-sdk:2.0.22@aar' + implementation 'io.openim:client-sdk:2.0.27@aar' } \ No newline at end of file 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 f962564..edac438 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 @@ -127,4 +127,12 @@ public class ConversationManager extends BaseManager { value(methodCall, "isPrivate") ); } + + public void deleteConversationMsgFromLocalAndSvr(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.deleteConversationMsgFromLocalAndSvr( + new OnBaseListener(result), + value(methodCall, "operationID"), + value(methodCall, "conversationID") + ); + } } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/IMManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/IMManager.java index 2571b5d..34e8d30 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/IMManager.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/IMManager.java @@ -36,4 +36,12 @@ public class IMManager extends BaseManager { public void getLoginStatus(MethodCall methodCall, MethodChannel.Result result) { CommonUtil.runMainThreadReturn(result, Open_im_sdk.getLoginStatus()); } + + public void wakeUp(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.wakeUp( + new OnBaseListener(result), + value(methodCall, "operationID") + ); + } + } 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 98ab341..1366a44 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 @@ -331,4 +331,35 @@ public class MessageManager extends BaseManager { jsonValue(methodCall, "filter") ); } + + public void deleteMessageFromLocalAndSvr(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.deleteMessageFromLocalAndSvr( + new OnBaseListener(result), + value(methodCall, "operationID"), + jsonValue(methodCall) + ); + } + + public void deleteAllMsgFromLocal(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.deleteAllMsgFromLocal( + new OnBaseListener(result), + value(methodCall, "operationID") + ); + } + + public void deleteAllMsgFromLocalAndSvr(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.deleteAllMsgFromLocalAndSvr( + new OnBaseListener(result), + value(methodCall, "operationID") + ); + } + + public void markMessageAsReadByConID(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.markMessageAsReadByConID( + new OnBaseListener(result), + value(methodCall, "operationID"), + value(methodCall, "conversationID"), + jsonValue(methodCall, "messageIDList") + ); + } } diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 8a9c9b1..e5d0593 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -302,6 +302,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = arm64; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -352,7 +353,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; + ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; @@ -375,6 +376,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = arm64; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -430,6 +432,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = arm64; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -482,7 +485,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; + ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; @@ -506,7 +509,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; + ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; diff --git a/ios/Classes/Module/ConversationManager.swift b/ios/Classes/Module/ConversationManager.swift index 87e69ad..21d2b5c 100644 --- a/ios/Classes/Module/ConversationManager.swift +++ b/ios/Classes/Module/ConversationManager.swift @@ -20,6 +20,7 @@ public class ConversationManager: BaseServiceManager { self["setConversationRecvMessageOpt"] = setConversationRecvMessageOpt self["getConversationRecvMessageOpt"] = getConversationRecvMessageOpt self["setOneConversationPrivateChat"] = setOneConversationPrivateChat + self["deleteConversationMsgFromLocalAndSvr"] = deleteConversationMsgFromLocalAndSvr } func setConversationListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ @@ -83,6 +84,10 @@ public class ConversationManager: BaseServiceManager { func setOneConversationPrivateChat(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ Open_im_sdkSetOneConversationPrivateChat(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"],methodCall[bool: "isPrivate"]) } + + func deleteConversationMsgFromLocalAndSvr(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkDeleteConversationMsgFromLocalAndSvr(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"]) + } } diff --git a/ios/Classes/Module/IMManager.swift b/ios/Classes/Module/IMManager.swift index 43d8aad..7060c0b 100644 --- a/ios/Classes/Module/IMManager.swift +++ b/ios/Classes/Module/IMManager.swift @@ -9,12 +9,7 @@ public class IMMananger: BaseServiceManager { self["login"] = login self["logout"] = logout self["getLoginStatus"] = getLoginStatus -// self["getLoginUid"] = getLoginUid - // self["getUsersInfo"] = getUsersInfo - // self["setSelfInfo"] = setSelfInfo - // self["forceSyncLoginUerInfo"] = forceSyncLoginUerInfo -// self["forceReConn"] = forceReConn - // self["setSdkLog"] = setSdkLog + self["wakeUp"] = wakeUp } func initSDK(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ @@ -34,30 +29,10 @@ public class IMMananger: BaseServiceManager { callBack(result, Open_im_sdkGetLoginStatus()) } -// func getLoginUid(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { -// callBack(result, Open_im_sdkGetLoginUser()) -// } - - // func getUsersInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { - // Open_im_sdkGetUsersInfo(methodCall[jsonString: "uidList"], BaseCallback(result: result)) - // } - - // func setSelfInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { - // Open_im_sdkSetSelfInfo(methodCall.toJsonString(), BaseCallback(result: result)) - // } + func wakeUp(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkWakeUp(BaseCallback(result: result), methodCall[string: "operationID"]) + } - // func forceSyncLoginUerInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { - // Open_im_sdkForceSyncLoginUerInfo() - // callBack(result) - // } - - // func setSdkLog(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { - // Open_im_sdkSetSdkLog(methodCall[int32: "sdkLog"]) - // } -// func forceReConn(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { -// Open_im_sdkForceReConn() -// callBack(result) -// } } public class ConnListener: NSObject, Open_im_sdk_callbackOnConnListenerProtocol { diff --git a/ios/Classes/Module/MessageManager.swift b/ios/Classes/Module/MessageManager.swift index 0a0f894..b06d77a 100644 --- a/ios/Classes/Module/MessageManager.swift +++ b/ios/Classes/Module/MessageManager.swift @@ -12,7 +12,6 @@ public class MessageManager: BaseServiceManager { self["getHistoryMessageList"] = getHistoryMessageList self["revokeMessage"] = revokeMessage self["deleteMessageFromLocalStorage"] = deleteMessageFromLocalStorage - self["deleteMessages"] = deleteMessages self["insertSingleMessageToLocalStorage"] = insertSingleMessageToLocalStorage self["insertGroupMessageToLocalStorage"] = insertGroupMessageToLocalStorage self["markC2CMessageAsRead"] = markC2CMessageAsRead @@ -38,6 +37,10 @@ public class MessageManager: BaseServiceManager { self["clearC2CHistoryMessage"] = clearC2CHistoryMessage self["clearGroupHistoryMessage"] = clearGroupHistoryMessage self["searchLocalMessages"] = searchLocalMessages + self["deleteMessageFromLocalAndSvr"] = deleteMessageFromLocalAndSvr + self["deleteAllMsgFromLocal"] = deleteAllMsgFromLocal + self["deleteAllMsgFromLocalAndSvr"] = deleteAllMsgFromLocalAndSvr + self["markMessageAsReadByConID"] = markMessageAsReadByConID } func setAdvancedMsgListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ @@ -65,9 +68,6 @@ public class MessageManager: BaseServiceManager { Open_im_sdkDeleteMessageFromLocalStorage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) } - // deprecated - func deleteMessages(methodCall: FlutterMethodCall, result: FlutterResult){ - } func insertSingleMessageToLocalStorage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ Open_im_sdkInsertSingleMessageToLocalStorage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "message"], @@ -182,6 +182,22 @@ public class MessageManager: BaseServiceManager { Open_im_sdkSearchLocalMessages(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "filter"]) } + func deleteMessageFromLocalAndSvr(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkDeleteMessageFromLocalAndSvr(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) + } + + func deleteAllMsgFromLocal(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkDeleteAllMsgFromLocal(BaseCallback(result: result), methodCall[string: "operationID"]) + } + + func deleteAllMsgFromLocalAndSvr(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkDeleteAllMsgFromLocalAndSvr(BaseCallback(result: result), methodCall[string: "operationID"]) + } + + func markMessageAsReadByConID(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkMarkMessageAsReadByConID(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[jsonString: "messageIDList"]) + } + public class SendMsgProgressListener: NSObject, Open_im_sdk_callbackSendMsgCallBackProtocol { private let channel: FlutterMethodChannel private let result: FlutterResult 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 7528a47..60c7ee0 100644 --- a/ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk.objc.h +++ b/ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk.objc.h @@ -86,6 +86,10 @@ FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateVideoMessageByURL(NSString FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateVideoMessageFromFullPath(NSString* _Nullable operationID, NSString* _Nullable videoFullPath, NSString* _Nullable videoType, int64_t duration, NSString* _Nullable snapshotFullPath); +FOUNDATION_EXPORT void Open_im_sdkDeleteAllMsgFromLocal(id _Nullable callback, NSString* _Nullable operationID); + +FOUNDATION_EXPORT void Open_im_sdkDeleteAllMsgFromLocalAndSvr(id _Nullable callback, NSString* _Nullable operationID); + FOUNDATION_EXPORT void Open_im_sdkDeleteConversation(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable conversationID); FOUNDATION_EXPORT void Open_im_sdkDeleteConversationMsgFromLocalAndSvr(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable conversationID); @@ -178,6 +182,8 @@ FOUNDATION_EXPORT void Open_im_sdkMarkGroupMessageAsRead(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable groupID); +FOUNDATION_EXPORT void Open_im_sdkMarkMessageAsReadByConID(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable conversationID, NSString* _Nullable msgIDList); + FOUNDATION_EXPORT void Open_im_sdkPinConversation(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable conversationID, BOOL isPinned); FOUNDATION_EXPORT void Open_im_sdkQuitGroup(id _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable groupID); @@ -217,6 +223,8 @@ FOUNDATION_EXPORT void Open_im_sdkSetGroupInfo(id _Nul */ FOUNDATION_EXPORT void Open_im_sdkSetGroupListener(id _Nullable callback); +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); diff --git a/ios/Framework/OpenIMCore.framework/OpenIMCore b/ios/Framework/OpenIMCore.framework/OpenIMCore index 1c5e875..d38611e 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 9e23fcf..86e3013 100644 --- a/lib/flutter_openim_sdk.dart +++ b/lib/flutter_openim_sdk.dart @@ -25,6 +25,7 @@ export 'src/manager/im_user_manager.dart'; export 'src/models/conversation_info.dart'; export 'src/models/group_info.dart'; export 'src/models/message.dart'; +export 'src/models/notification_info.dart'; export 'src/models/search_info.dart'; export 'src/models/signaling_info.dart'; export 'src/models/user_info.dart'; diff --git a/lib/src/enum/conversation_type.dart b/lib/src/enum/conversation_type.dart index af1b0f7..887d736 100644 --- a/lib/src/enum/conversation_type.dart +++ b/lib/src/enum/conversation_type.dart @@ -1,4 +1,5 @@ class ConversationType { static const single = 1; static const group = 2; + static const notification = 4; } diff --git a/lib/src/enum/message_type.dart b/lib/src/enum/message_type.dart index 8c493c7..68ec35c 100644 --- a/lib/src/enum/message_type.dart +++ b/lib/src/enum/message_type.dart @@ -36,6 +36,8 @@ class MessageType { static const userInfoUpdatedNotification = 1303; static const userNotificationEnd = 1399; + static const oaNotification = 1400; + static const groupNotificationBegin = 1500; static const groupCreatedNotification = 1501; static const groupInfoSetNotification = 1502; diff --git a/lib/src/manager/im_conversation_manager.dart b/lib/src/manager/im_conversation_manager.dart index 4c527ea..92e9c24 100644 --- a/lib/src/manager/im_conversation_manager.dart +++ b/lib/src/manager/im_conversation_manager.dart @@ -219,6 +219,19 @@ class ConversationManager { "operationID": Utils.checkOperationID(operationID), })); + /// Delete conversation from local and service + /// 删除会话 + Future deleteConversationMsgFromLocalAndSvr({ + required String conversationID, + String? operationID, + }) => + _channel.invokeMethod( + 'deleteConversationMsgFromLocalAndSvr', + _buildParam({ + "conversationID": conversationID, + "operationID": Utils.checkOperationID(operationID), + })); + /// Custom sort for conversation list /// 会话列表自定义排序规则。 List simpleSort(List list) => list diff --git a/lib/src/manager/im_manager.dart b/lib/src/manager/im_manager.dart index abde0d3..d07cc9b 100644 --- a/lib/src/manager/im_manager.dart +++ b/lib/src/manager/im_manager.dart @@ -355,6 +355,13 @@ class IMManager { /// 获取当前登录用户信息 Future getLoginUserInfo() async => uInfo; + /// wakeup + Future wakeUp({String? operationID}) => _channel.invokeMethod( + 'wakeUp', + _buildParam({ + 'operationID': Utils.checkOperationID(operationID), + })); + static Map _buildParam(Map param) { param["ManagerName"] = "imManager"; return param; diff --git a/lib/src/manager/im_message_manager.dart b/lib/src/manager/im_message_manager.dart index 78fd59d..7afe173 100644 --- a/lib/src/manager/im_message_manager.dart +++ b/lib/src/manager/im_message_manager.dart @@ -56,10 +56,12 @@ class MessageManager { /// Find all history message /// 获取聊天记录 /// [userID]接收消息的用户id + /// [conversationID] 会话id,查询通知是可用 /// [groupID]接收消息的组id Future> getHistoryMessageList({ String? userID, String? groupID, + String? conversationID, Message? startMsg, int? count, String? operationID, @@ -70,6 +72,7 @@ class MessageManager { _buildParam({ 'userID': userID ?? '', 'groupID': groupID ?? '', + 'conversationID': conversationID ?? '', 'startClientMsgID': startMsg?.clientMsgID ?? '', 'count': count ?? 10, 'operationID': Utils.checkOperationID(operationID), @@ -566,6 +569,56 @@ class MessageManager { .then((value) => Utils.toObj(value, (map) => SearchResult.fromJson(map))); + /// Delete message from local and service + /// 删除消息 + Future deleteMessageFromLocalAndSvr({ + required Message message, + String? operationID, + }) => + _channel.invokeMethod( + 'deleteMessageFromLocalAndSvr', + _buildParam(message.toJson() + ..addAll({ + "operationID": Utils.checkOperationID(operationID), + }))); + + /// Delete all message from local + /// 删除所有消息 + Future deleteAllMsgFromLocal({ + String? operationID, + }) => + _channel.invokeMethod( + 'deleteAllMsgFromLocal', + _buildParam({ + "operationID": Utils.checkOperationID(operationID), + })); + + /// Delete all message from service + /// 删除所有消息 + Future deleteAllMsgFromLocalAndSvr({ + String? operationID, + }) => + _channel.invokeMethod( + 'deleteAllMsgFromLocalAndSvr', + _buildParam({ + "operationID": Utils.checkOperationID(operationID), + })); + + /// Mark conversation message as read + /// 标记消息已读 + Future markMessageAsReadByConID({ + required String conversationID, + required List messageIDList, + String? operationID, + }) => + _channel.invokeMethod( + 'markMessageAsReadByConID', + _buildParam({ + "messageIDList": messageIDList, + "conversationID": conversationID, + "operationID": Utils.checkOperationID(operationID), + })); + static Map _buildParam(Map param) { param["ManagerName"] = "messageManager"; return param; diff --git a/lib/src/models/message.dart b/lib/src/models/message.dart index 789cf51..a2da835 100644 --- a/lib/src/models/message.dart +++ b/lib/src/models/message.dart @@ -19,6 +19,7 @@ class Message { String? content; int? seq; bool? isRead; + int? hasReadTime; /// [MessageStatus] int? status; @@ -56,6 +57,7 @@ class Message { this.content, this.seq, this.isRead, + this.hasReadTime, this.status, this.offlinePush, this.attachedInfo, @@ -132,6 +134,7 @@ class Message { attachedInfoElem = json['attachedInfoElem'] != null ? AttachedInfoElem.fromJson(json['attachedInfoElem']) : null; + hasReadTime = json['hasReadTime'] ?? attachedInfoElem?.hasReadTime; } Map toJson() { @@ -151,6 +154,7 @@ class Message { data['content'] = this.content; data['seq'] = this.seq; data['isRead'] = this.isRead; + data['hasReadTime'] = this.hasReadTime; data['status'] = this.status; data['offlinePush'] = this.offlinePush?.toJson(); data['attachedInfo'] = this.attachedInfo; @@ -198,6 +202,7 @@ class Message { content = message.content; seq = message.seq; isRead = message.isRead; + hasReadTime = message.hasReadTime; status = message.status; offlinePush = message.offlinePush; attachedInfo = message.attachedInfo; @@ -581,21 +586,30 @@ class FaceElem { class AttachedInfoElem { GroupHasReadInfo? groupHasReadInfo; + + /// 单聊有效 bool? isPrivateChat; + int? hasReadTime; - AttachedInfoElem({this.groupHasReadInfo, this.isPrivateChat}); + AttachedInfoElem({ + this.groupHasReadInfo, + this.isPrivateChat, + this.hasReadTime, + }); AttachedInfoElem.fromJson(Map json) { groupHasReadInfo = json['groupHasReadInfo'] == null ? null : GroupHasReadInfo.fromJson(json['groupHasReadInfo']); isPrivateChat = json['isPrivateChat']; + hasReadTime = json['hasReadTime']; } Map toJson() { final data = Map(); data['groupHasReadInfo'] = this.groupHasReadInfo?.toJson(); data['isPrivateChat'] = this.isPrivateChat; + data['hasReadTime'] = this.hasReadTime; return data; } } diff --git a/lib/src/models/notification_info.dart b/lib/src/models/notification_info.dart new file mode 100644 index 0000000..0c75197 --- /dev/null +++ b/lib/src/models/notification_info.dart @@ -0,0 +1,81 @@ +import '../../flutter_openim_sdk.dart'; + +/// OA notification +class OANotification { + String? notificationName; + String? notificationFaceURL; + int? notificationType; + String? text; + String? externalUrl; + + /// Notification Mix Type + /// 0: Plain text notification + /// 1: Text+picture notification + /// 2: Text+video notification + /// 3: Text+file notification + /// 0:纯文字通知 1:文字+图片通知 2:文字+视频通知 3:文字+文件通知 + int? mixType; + PictureElem? pictureElem; + SoundElem? soundElem; + VideoElem? videoElem; + FileElem? fileElem; + String? ex; + + OANotification( + {this.notificationName, + this.notificationFaceURL, + this.notificationType, + this.text, + this.externalUrl, + this.mixType, + this.pictureElem, + this.soundElem, + this.videoElem, + this.fileElem, + this.ex}); + + OANotification.fromJson(Map json) { + notificationName = json['notificationName']; + notificationFaceURL = json['notificationFaceURL']; + notificationType = json['notificationType']; + text = json['text']; + externalUrl = json['externalUrl']; + mixType = json['mixType']; + pictureElem = json['pictureElem'] != null + ? PictureElem.fromJson(json['pictureElem']) + : null; + soundElem = json['soundElem'] != null + ? SoundElem.fromJson(json['soundElem']) + : null; + videoElem = json['videoElem'] != null + ? VideoElem.fromJson(json['videoElem']) + : null; + fileElem = + json['fileElem'] != null ? FileElem.fromJson(json['fileElem']) : null; + ex = json['ex']; + } + + Map toJson() { + final data = Map(); + data['notificationName'] = this.notificationName; + data['notificationFaceURL'] = this.notificationFaceURL; + data['notificationType'] = this.notificationType; + data['text'] = this.text; + data['externalUrl'] = this.externalUrl; + data['mixType'] = this.mixType; + if (this.pictureElem != null) { + data['pictureElem'] = this.pictureElem!.toJson(); + } + if (this.soundElem != null) { + data['soundElem'] = this.soundElem!.toJson(); + } + if (this.videoElem != null) { + data['videoElem'] = this.videoElem!.toJson(); + } + if (this.fileElem != null) { + data['fileElem'] = this.fileElem!.toJson(); + } + data['ex'] = this.ex; + return data; + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 9ffc1bd..16463c5 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+4 +version: 2.0.0+5 homepage: https://www.rentsoft.cn repository: https://github.com/OpenIMSDK/Open-IM-SDK-Flutter