|
|
@ -1,4 +1,5 @@ |
|
|
|
import 'dart:convert'; |
|
|
|
import 'dart:convert'; |
|
|
|
|
|
|
|
import 'dart:io'; |
|
|
|
|
|
|
|
|
|
|
|
import 'package:flutter/services.dart'; |
|
|
|
import 'package:flutter/services.dart'; |
|
|
|
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; |
|
|
|
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; |
|
|
@ -10,16 +11,22 @@ class MessageManager { |
|
|
|
|
|
|
|
|
|
|
|
MessageManager(this._channel); |
|
|
|
MessageManager(this._channel); |
|
|
|
|
|
|
|
|
|
|
|
void addAdvancedMsgListener(AdvancedMsgListener listener) { |
|
|
|
Future addAdvancedMsgListener(AdvancedMsgListener listener) { |
|
|
|
advancedMsgListeners.add(listener); |
|
|
|
advancedMsgListeners.add(listener); |
|
|
|
_channel.invokeMethod( |
|
|
|
return _channel.invokeMethod( |
|
|
|
'addAdvancedMsgListener', _buildParam({'id': listener.id})); |
|
|
|
'addAdvancedMsgListener', |
|
|
|
|
|
|
|
_buildParam({ |
|
|
|
|
|
|
|
'id': listener.id, |
|
|
|
|
|
|
|
})); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void removeAdvancedMsgListener(AdvancedMsgListener listener) { |
|
|
|
Future removeAdvancedMsgListener(AdvancedMsgListener listener) { |
|
|
|
advancedMsgListeners.remove(listener); |
|
|
|
advancedMsgListeners.remove(listener); |
|
|
|
_channel.invokeMethod( |
|
|
|
return _channel.invokeMethod( |
|
|
|
'removeAdvancedMsgListener', _buildParam({'id': listener.id})); |
|
|
|
'removeAdvancedMsgListener', |
|
|
|
|
|
|
|
_buildParam({ |
|
|
|
|
|
|
|
'id': listener.id, |
|
|
|
|
|
|
|
})); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void setMsgSendProgressListener(MsgSendProgressListener listener) { |
|
|
|
void setMsgSendProgressListener(MsgSendProgressListener listener) { |
|
|
@ -139,8 +146,10 @@ class MessageManager { |
|
|
|
.then((value) => _toObj(value)); |
|
|
|
.then((value) => _toObj(value)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Future<Message> createSoundMessage( |
|
|
|
Future<Message> createSoundMessage({ |
|
|
|
{required String soundPath, required int duration}) { |
|
|
|
required String soundPath, |
|
|
|
|
|
|
|
required int duration, |
|
|
|
|
|
|
|
}) { |
|
|
|
return _channel |
|
|
|
return _channel |
|
|
|
.invokeMethod( |
|
|
|
.invokeMethod( |
|
|
|
'createSoundMessage', |
|
|
|
'createSoundMessage', |
|
|
@ -167,18 +176,25 @@ class MessageManager { |
|
|
|
.then((value) => _toObj(value)); |
|
|
|
.then((value) => _toObj(value)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Future<Message> createFileMessage( |
|
|
|
Future<Message> createFileMessage({ |
|
|
|
{required String filePath, required String fileName}) { |
|
|
|
required String filePath, |
|
|
|
|
|
|
|
required String fileName, |
|
|
|
|
|
|
|
}) { |
|
|
|
return _channel |
|
|
|
return _channel |
|
|
|
.invokeMethod('createFileMessage', |
|
|
|
.invokeMethod( |
|
|
|
_buildParam({'filePath': filePath, 'fileName': fileName})) |
|
|
|
'createFileMessage', |
|
|
|
|
|
|
|
_buildParam({ |
|
|
|
|
|
|
|
'filePath': filePath, |
|
|
|
|
|
|
|
'fileName': fileName, |
|
|
|
|
|
|
|
})) |
|
|
|
.then((value) => _toObj(value)); |
|
|
|
.then((value) => _toObj(value)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Future<Message> createMergerMessage( |
|
|
|
Future<Message> createMergerMessage({ |
|
|
|
{required List<Message> messageList, |
|
|
|
required List<Message> messageList, |
|
|
|
required String title, |
|
|
|
required String title, |
|
|
|
required List<String> summaryList}) { |
|
|
|
required List<String> summaryList, |
|
|
|
|
|
|
|
}) { |
|
|
|
return _channel |
|
|
|
return _channel |
|
|
|
.invokeMethod( |
|
|
|
.invokeMethod( |
|
|
|
'createMergerMessage', |
|
|
|
'createMergerMessage', |
|
|
@ -194,8 +210,9 @@ class MessageManager { |
|
|
|
return _channel |
|
|
|
return _channel |
|
|
|
.invokeMethod( |
|
|
|
.invokeMethod( |
|
|
|
'createForwardMessage', |
|
|
|
'createForwardMessage', |
|
|
|
_buildParam( |
|
|
|
_buildParam({ |
|
|
|
{'message': messageList.map((e) => e.toJson()).toList()})) |
|
|
|
'message': messageList.map((e) => e.toJson()).toList(), |
|
|
|
|
|
|
|
})) |
|
|
|
.then((value) => _toObj(value)); |
|
|
|
.then((value) => _toObj(value)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -207,6 +224,123 @@ class MessageManager { |
|
|
|
_channel.invokeMethod('forceSyncMsg', _buildParam({})); |
|
|
|
_channel.invokeMethod('forceSyncMsg', _buildParam({})); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Message createTextMessageV2({required String text}) { |
|
|
|
|
|
|
|
return _createMessage(contentType: MessageType.text)..content = text; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Message createTextAtMessageV2({ |
|
|
|
|
|
|
|
required String text, |
|
|
|
|
|
|
|
required List<String> atUidList, |
|
|
|
|
|
|
|
}) { |
|
|
|
|
|
|
|
var atElem = AtElem( |
|
|
|
|
|
|
|
text: text, |
|
|
|
|
|
|
|
atUserList: atUidList, |
|
|
|
|
|
|
|
isAtSelf: false, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
return _createMessage(contentType: MessageType.at_text) |
|
|
|
|
|
|
|
..forceList = atUidList |
|
|
|
|
|
|
|
..atElem = atElem |
|
|
|
|
|
|
|
..content = jsonEncode(atElem); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Message createImageMessageV2({ |
|
|
|
|
|
|
|
required String imagePath, |
|
|
|
|
|
|
|
required String mineType, |
|
|
|
|
|
|
|
required int size, |
|
|
|
|
|
|
|
required int width, |
|
|
|
|
|
|
|
required int height, |
|
|
|
|
|
|
|
}) { |
|
|
|
|
|
|
|
return _createMessage(contentType: MessageType.picture) |
|
|
|
|
|
|
|
..pictureElem = PictureElem( |
|
|
|
|
|
|
|
sourcePath: imagePath, |
|
|
|
|
|
|
|
sourcePicture: PictureInfo( |
|
|
|
|
|
|
|
type: mineType, |
|
|
|
|
|
|
|
size: size, |
|
|
|
|
|
|
|
width: width, |
|
|
|
|
|
|
|
height: height, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Message createSoundMessageV2({ |
|
|
|
|
|
|
|
required String soundPath, |
|
|
|
|
|
|
|
required int duration, |
|
|
|
|
|
|
|
required int dataSize, |
|
|
|
|
|
|
|
}) { |
|
|
|
|
|
|
|
return _createMessage(contentType: MessageType.voice) |
|
|
|
|
|
|
|
..soundElem = SoundElem( |
|
|
|
|
|
|
|
soundPath: soundPath, |
|
|
|
|
|
|
|
dataSize: dataSize, |
|
|
|
|
|
|
|
duration: duration, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Message createVideoMessageV2({ |
|
|
|
|
|
|
|
required String videoPath, |
|
|
|
|
|
|
|
required String videoType, |
|
|
|
|
|
|
|
required int videoSize, |
|
|
|
|
|
|
|
required int duration, |
|
|
|
|
|
|
|
required String snapshotPath, |
|
|
|
|
|
|
|
required int snapshotSize, |
|
|
|
|
|
|
|
required int snapshotWidth, |
|
|
|
|
|
|
|
required int snapshotHeight, |
|
|
|
|
|
|
|
}) { |
|
|
|
|
|
|
|
return _createMessage(contentType: MessageType.video) |
|
|
|
|
|
|
|
..videoElem = VideoElem( |
|
|
|
|
|
|
|
videoPath: videoPath, |
|
|
|
|
|
|
|
videoSize: videoSize, |
|
|
|
|
|
|
|
videoType: videoType, |
|
|
|
|
|
|
|
duration: duration, |
|
|
|
|
|
|
|
snapshotPath: snapshotPath, |
|
|
|
|
|
|
|
snapshotSize: snapshotSize, |
|
|
|
|
|
|
|
snapshotHeight: snapshotHeight, |
|
|
|
|
|
|
|
snapshotWidth: snapshotWidth, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Message createFileMessageV2({ |
|
|
|
|
|
|
|
required String filePath, |
|
|
|
|
|
|
|
required String fileName, |
|
|
|
|
|
|
|
required int fileSize, |
|
|
|
|
|
|
|
}) { |
|
|
|
|
|
|
|
return _createMessage(contentType: MessageType.file) |
|
|
|
|
|
|
|
..fileElem = FileElem( |
|
|
|
|
|
|
|
fileName: fileName, |
|
|
|
|
|
|
|
filePath: filePath, |
|
|
|
|
|
|
|
fileSize: fileSize, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Message createMergerMessageV2({ |
|
|
|
|
|
|
|
required List<Message> messageList, |
|
|
|
|
|
|
|
required String title, |
|
|
|
|
|
|
|
required List<String> summaryList, |
|
|
|
|
|
|
|
}) { |
|
|
|
|
|
|
|
var message = _createMessage(contentType: MessageType.merger); |
|
|
|
|
|
|
|
return message; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Message createForwardMessageV2({required List<Message> messageList}) { |
|
|
|
|
|
|
|
var message = _createMessage(); |
|
|
|
|
|
|
|
return message; |
|
|
|
|
|
|
|
}*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static Message _createMessage({required contentType}) { |
|
|
|
|
|
|
|
var now = DateTime.now(); |
|
|
|
|
|
|
|
return Message( |
|
|
|
|
|
|
|
clientMsgID: 'client_msg_id_v2_${now.microsecondsSinceEpoch}', |
|
|
|
|
|
|
|
createTime: now.millisecond ~/ 1000, |
|
|
|
|
|
|
|
sendTime: now.millisecond ~/ 1000, |
|
|
|
|
|
|
|
// sessionType: 0,//请求为单人会话1,请求为群聊会话2 |
|
|
|
|
|
|
|
msgFrom: 100, |
|
|
|
|
|
|
|
contentType: contentType, |
|
|
|
|
|
|
|
status: MessageStatus.sending, |
|
|
|
|
|
|
|
platformID: Platform.isAndroid ? IMPlatform.android : IMPlatform.ios, |
|
|
|
|
|
|
|
sendID: OpenIM.iMManager.uid, |
|
|
|
|
|
|
|
senderNickName: OpenIM.iMManager.uInfo.name, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static Map _buildParam(Map param) { |
|
|
|
static Map _buildParam(Map param) { |
|
|
|
param["ManagerName"] = "messageManager"; |
|
|
|
param["ManagerName"] = "messageManager"; |
|
|
|
return param; |
|
|
|
return param; |
|
|
|