From e13c4c66581aae4e36e831f95037ae7956edaa8c Mon Sep 17 00:00:00 2001 From: cpdl Date: Thu, 27 Feb 2025 17:41:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/build.gradle | 2 +- .../listener/OnAdvancedMsgListener.java | 8 +++ .../manager/MessageManager.java | 10 +++ lib/src/enum/message_type.dart | 3 + lib/src/listener/advanced_msg_listener.dart | 8 +++ lib/src/manager/im_manager.dart | 5 ++ lib/src/manager/im_message_manager.dart | 32 +++++++-- lib/src/models/message.dart | 67 +++++++++++++++++++ 8 files changed, 129 insertions(+), 6 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index b1251f4..f1604ac 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -57,5 +57,5 @@ android { } dependencies { - implementation 'com.openim:sdkcore:1.0.4' + implementation 'com.openim:sdkcore:1.0.6' } \ No newline at end of file diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnAdvancedMsgListener.java b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnAdvancedMsgListener.java index d9e472d..b6029d8 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnAdvancedMsgListener.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnAdvancedMsgListener.java @@ -29,6 +29,14 @@ public class OnAdvancedMsgListener implements open_im_sdk_callback.OnAdvancedMsg CommonUtil.emitEvent("advancedMsgListener", "onNewRecvMessageRevoked", values); } + @Override + public void onNewRecvMessageEdited(String s) { + final Map values = new ArrayMap<>(); + values.put("id", id); + values.put("messageEdited", s); + CommonUtil.emitEvent("advancedMsgListener", "onNewRecvMessageEdited", values); + } + @Override public void onRecvC2CReadReceipt(String s) { final Map values = new ArrayMap<>(); 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 ffdcfaf..89682a8 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 @@ -42,6 +42,16 @@ public class MessageManager extends BaseManager { ); } + public void editMessage(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.editMessage( + new OnBaseListener(result, methodCall), + value(methodCall, "operationID"), + value(methodCall, "conversationID"), + value(methodCall, "clientMsgID"), + value(methodCall, "content") + ); + } + public void deleteMessageFromLocalStorage(MethodCall methodCall, MethodChannel.Result result) { Open_im_sdk.deleteMessageFromLocalStorage( new OnBaseListener(result, methodCall), diff --git a/lib/src/enum/message_type.dart b/lib/src/enum/message_type.dart index ef10c49..f219c31 100644 --- a/lib/src/enum/message_type.dart +++ b/lib/src/enum/message_type.dart @@ -168,6 +168,9 @@ class MessageType { /// Recall Message static const revokeMessageNotification = 2101; + /// Edit Message + static const editMessageNotification = 2108; + /// Single Chat Has Read Receipt static const signalHasReadReceiptNotification = 2150; diff --git a/lib/src/listener/advanced_msg_listener.dart b/lib/src/listener/advanced_msg_listener.dart index 27a2a8c..12b3fee 100644 --- a/lib/src/listener/advanced_msg_listener.dart +++ b/lib/src/listener/advanced_msg_listener.dart @@ -4,6 +4,7 @@ import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; class OnAdvancedMsgListener { Function(Message msg)? onMsgDeleted; Function(RevokedInfo info)? onNewRecvMessageRevoked; + Function(EditedInfo info)? onNewRecvMessageEdited; Function(List list)? onRecvC2CReadReceipt; Function(Message msg)? onRecvNewMessage; Function(Message msg)? onRecvOfflineNewMessage; @@ -15,6 +16,7 @@ class OnAdvancedMsgListener { OnAdvancedMsgListener({ this.onMsgDeleted, this.onNewRecvMessageRevoked, + this.onNewRecvMessageEdited, this.onRecvC2CReadReceipt, this.onRecvNewMessage, this.onRecvOfflineNewMessage, @@ -30,6 +32,12 @@ class OnAdvancedMsgListener { onNewRecvMessageRevoked?.call(info); } + /// Message has been edited + void newRecvMessageEdited(EditedInfo info) { + onNewRecvMessageEdited?.call(info); + } + + /// C2C Message Read Receipt void recvC2CReadReceipt(List list) { onRecvC2CReadReceipt?.call(list); diff --git a/lib/src/manager/im_manager.dart b/lib/src/manager/im_manager.dart index 262aa47..5ed01e4 100644 --- a/lib/src/manager/im_manager.dart +++ b/lib/src/manager/im_manager.dart @@ -179,6 +179,11 @@ class IMManager { var info = Utils.toObj(value, (map) => RevokedInfo.fromJson(map)); messageManager.msgListener.newRecvMessageRevoked(info); break; + case 'onNewRecvMessageEdited': + var value = call.arguments['data']['messageEdited']; + var info = Utils.toObj(value, (map) => EditedInfo.fromJson(map)); + messageManager.msgListener.newRecvMessageEdited(info); + break; case 'onRecvC2CReadReceipt': var value = call.arguments['data']['msgReceiptList']; var list = Utils.toList(value, (map) => ReadReceiptInfo.fromJson(map)); diff --git a/lib/src/manager/im_message_manager.dart b/lib/src/manager/im_message_manager.dart index 3f3a10d..4b9b3e2 100644 --- a/lib/src/manager/im_message_manager.dart +++ b/lib/src/manager/im_message_manager.dart @@ -151,7 +151,8 @@ class MessageManager { /// Typing status update /// [msgTip] Custom content - @Deprecated('Use [OpenIM.iMManager.conversationManager.changeInputStates(conversationID:focus:)] instead') + @Deprecated( + 'Use [OpenIM.iMManager.conversationManager.changeInputStates(conversationID:focus:)] instead') Future typingStatusUpdate({ required String userID, String? msgTip, @@ -531,7 +532,8 @@ class MessageManager { }, 'operationID': Utils.checkOperationID(operationID), })) - .then((value) => Utils.toObj(value, (map) => SearchResult.fromJson(map))); + .then((value) => + Utils.toObj(value, (map) => SearchResult.fromJson(map))); /// Revoke a message /// [message] The message to be revoked @@ -548,6 +550,23 @@ class MessageManager { "operationID": Utils.checkOperationID(operationID), })); + /// Edit a message + /// [message] The message to be edited + Future editMessage({ + required String conversationID, + required String clientMsgID, + String? operationID, + required String? content, + }) => + _channel.invokeMethod( + 'editMessage', + _buildParam({ + 'conversationID': conversationID, + 'clientMsgID': clientMsgID, + "operationID": Utils.checkOperationID(operationID), + 'content': content, + })); + /// Mark messages as read /// [conversationID] Conversation ID /// [messageIDList] List of clientMsgIDs of messages to be marked as read @@ -587,7 +606,8 @@ class MessageManager { 'lastMinSeq': lastMinSeq ?? 0, 'operationID': Utils.checkOperationID(operationID), })) - .then((value) => Utils.toObj(value, (map) => AdvancedMessage.fromJson(map))); + .then((value) => + Utils.toObj(value, (map) => AdvancedMessage.fromJson(map))); /// Get chat history (newly received chat history after startMsg). Used for locating a specific message in global search and then fetching messages received after that message. /// [conversationID] Conversation ID, can be used for querying notifications @@ -610,7 +630,8 @@ class MessageManager { 'lastMinSeq': lastMinSeq ?? 0, 'operationID': Utils.checkOperationID(operationID), })) - .then((value) => Utils.toObj(value, (map) => AdvancedMessage.fromJson(map))); + .then((value) => + Utils.toObj(value, (map) => AdvancedMessage.fromJson(map))); /// Find message details /// [conversationID] Conversation ID @@ -626,7 +647,8 @@ class MessageManager { 'searchParams': searchParams.map((e) => e.toJson()).toList(), 'operationID': Utils.checkOperationID(operationID), })) - .then((value) => Utils.toObj(value, (map) => SearchResult.fromJson(map))); + .then((value) => + Utils.toObj(value, (map) => SearchResult.fromJson(map))); /// Rich text message /// [text] Input content diff --git a/lib/src/models/message.dart b/lib/src/models/message.dart index 8130d86..e5f5c80 100644 --- a/lib/src/models/message.dart +++ b/lib/src/models/message.dart @@ -1123,6 +1123,73 @@ class RevokedInfo { } } + + +/// Message revocation details +class EditedInfo { + /// Editer's ID + String? editerID; + + + /// Message ID + String? clientMsgID; + + /// Revocation time + int? editTime; + + /// Message sending time + int? sourceMessageSendTime; + + /// Message sender + String? sourceMessageSendID; + + /// Message sender's nickname + String? sourceMessageSenderNickname; + + /// Conversation type [ConversationType] + int? sessionType; + + /// Message content + String? content; + + EditedInfo({ + this.editerID, + this.clientMsgID, + this.editTime, + this.sourceMessageSendTime, + this.sourceMessageSendID, + this.sourceMessageSenderNickname, + this.sessionType, + this.content, + }); + + EditedInfo.fromJson(Map json) { + editerID = json['editerID']; + clientMsgID = json['clientMsgID']; + editTime = json['editTime']; + sourceMessageSendTime = json['sourceMessageSendTime']; + sourceMessageSendID = json['sourceMessageSendID']; + sourceMessageSenderNickname = json['sourceMessageSenderNickname']; + sessionType = json['sessionType']; + content = json['content']; + } + + Map toJson() { + final data = Map(); + data['editerID'] = this.editerID; + data['clientMsgID'] = this.clientMsgID; + data['editTime'] = this.editTime; + data['sourceMessageSendTime'] = this.sourceMessageSendTime; + data['sourceMessageSendID'] = this.sourceMessageSendID; + data['sourceMessageSenderNickname'] = this.sourceMessageSenderNickname; + data['sessionType'] = this.sessionType; + data['content'] = this.content; + return data; + } +} + + + class AdvancedMessage { List? messageList; bool? isEnd;