Add custom emoji message

main
hrxiang 3 years ago
parent 80152e2314
commit 6c0676fbe5
  1. 2
      android/build.gradle
  2. 7
      android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java
  3. 50
      ios/Classes/Module/MessageManager.swift
  4. 5
      ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk.objc.h
  5. BIN
      ios/Framework/OpenIMCore.framework/OpenIMCore
  6. 2
      lib/src/enum/message_type.dart
  7. 19
      lib/src/manager/im_message_manager.dart
  8. 28
      lib/src/models/message.dart
  9. 20
      lib/src/models/user_info.dart

@ -41,5 +41,5 @@ android {
} }
} }
dependencies { dependencies {
implementation 'io.openim:client-sdk:2.0.5@aar' implementation 'io.openim:client-sdk:2.0.8@aar'
} }

@ -285,6 +285,13 @@ public class MessageManager extends BaseManager {
)); ));
} }
public void createFaceMessage(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, Open_im_sdk.createFaceMessage(
value(methodCall, "operationID"),
int2long(methodCall, "index"),
value(methodCall, "data")
));
}
// public void forceSyncMsg(MethodCall methodCall, MethodChannel.Result result) { // public void forceSyncMsg(MethodCall methodCall, MethodChannel.Result result) {
// Open_im_sdk.forceSyncMsg(); // Open_im_sdk.forceSyncMsg();
// } // }

@ -33,6 +33,7 @@ public class MessageManager: BaseServiceManager {
self["createCustomMessage"] = createCustomMessage self["createCustomMessage"] = createCustomMessage
self["createQuoteMessage"] = createQuoteMessage self["createQuoteMessage"] = createQuoteMessage
self["createCardMessage"] = createCardMessage self["createCardMessage"] = createCardMessage
self["createFaceMessage"] = createFaceMessage
// self["forceSyncMsg"] = forceSyncMsg // self["forceSyncMsg"] = forceSyncMsg
self["clearC2CHistoryMessage"] = clearC2CHistoryMessage self["clearC2CHistoryMessage"] = clearC2CHistoryMessage
self["clearGroupHistoryMessage"] = clearGroupHistoryMessage self["clearGroupHistoryMessage"] = clearGroupHistoryMessage
@ -75,15 +76,15 @@ public class MessageManager: BaseServiceManager {
// func findMessages(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ // func findMessages(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
// Open_im_sdkFindMessages(BaseCallback(result: result), methodCall[jsonString: "messageIDList"]) // Open_im_sdkFindMessages(BaseCallback(result: result), methodCall[jsonString: "messageIDList"])
// } // }
func markC2CMessageAsRead(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func markC2CMessageAsRead(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkMarkC2CMessageAsRead(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"], methodCall[jsonString: "messageIDList"]) Open_im_sdkMarkC2CMessageAsRead(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"], methodCall[jsonString: "messageIDList"])
} }
func typingStatusUpdate(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func typingStatusUpdate(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkTypingStatusUpdate(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"], methodCall[string: "msgTip"]) Open_im_sdkTypingStatusUpdate(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"], methodCall[string: "msgTip"])
} }
func createTextMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createTextMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateTextMessage(methodCall[string: "operationID"], methodCall[string: "text"])) callBack(result, Open_im_sdkCreateTextMessage(methodCall[string: "operationID"], methodCall[string: "text"]))
} }
@ -116,18 +117,18 @@ public class MessageManager: BaseServiceManager {
func createVideoMessageFromFullPath(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createVideoMessageFromFullPath(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let prama = Open_im_sdkCreateVideoMessageFromFullPath(methodCall[string: "operationID"], methodCall[string: "videoPath"], methodCall[string: "videoType"], let prama = Open_im_sdkCreateVideoMessageFromFullPath(methodCall[string: "operationID"], methodCall[string: "videoPath"], methodCall[string: "videoType"],
methodCall[int64: "duration"], methodCall[string: "snapshotPath"]) methodCall[int64: "duration"], methodCall[string: "snapshotPath"])
callBack(result, prama) callBack(result, prama)
} }
func createFileMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createFileMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateFileMessage(methodCall[string: "operationID"], methodCall[string: "filePath"], methodCall[string: "fileName"])) callBack(result, Open_im_sdkCreateFileMessage(methodCall[string: "operationID"], methodCall[string: "filePath"], methodCall[string: "fileName"]))
} }
func createFileMessageFromFullPath(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createFileMessageFromFullPath(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateFileMessageFromFullPath(methodCall[string: "operationID"], methodCall[string: "filePath"], methodCall[string: "fileName"])) callBack(result, Open_im_sdkCreateFileMessageFromFullPath(methodCall[string: "operationID"], methodCall[string: "filePath"], methodCall[string: "fileName"]))
} }
func createMergerMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createMergerMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let prama = Open_im_sdkCreateMergerMessage(methodCall[string: "operationID"], methodCall[jsonString: "messageList"], methodCall[string: "title"], let prama = Open_im_sdkCreateMergerMessage(methodCall[string: "operationID"], methodCall[jsonString: "messageList"], methodCall[string: "title"],
methodCall[jsonString: "summaryList"]) methodCall[jsonString: "summaryList"])
@ -158,35 +159,38 @@ public class MessageManager: BaseServiceManager {
func createCardMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createCardMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateCardMessage(methodCall[string: "operationID"], methodCall[jsonString: "cardMessage"])) callBack(result, Open_im_sdkCreateCardMessage(methodCall[string: "operationID"], methodCall[jsonString: "cardMessage"]))
} }
func createFaceMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateFaceMessage(methodCall[string: "operationID"], methodCall[int: "index"], methodCall[string: "data"]))
}
// func forceSyncMsg(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ // func forceSyncMsg(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
// Open_im_sdkForceSyncMsg() // Open_im_sdkForceSyncMsg()
// callBack(result) // callBack(result)
// } // }
func clearC2CHistoryMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func clearC2CHistoryMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkClearC2CHistoryMessage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"]) Open_im_sdkClearC2CHistoryMessage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"])
} }
func clearGroupHistoryMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func clearGroupHistoryMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkClearGroupHistoryMessage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"]) Open_im_sdkClearGroupHistoryMessage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"])
} }
public class SendMsgProgressListener: NSObject, Open_im_sdk_callbackSendMsgCallBackProtocol { public class SendMsgProgressListener: NSObject, Open_im_sdk_callbackSendMsgCallBackProtocol {
private let channel: FlutterMethodChannel private let channel: FlutterMethodChannel
private let result: FlutterResult private let result: FlutterResult
private let call: FlutterMethodCall private let call: FlutterMethodCall
init(channel: FlutterMethodChannel, result: @escaping FlutterResult, methodCall: FlutterMethodCall) { init(channel: FlutterMethodChannel, result: @escaping FlutterResult, methodCall: FlutterMethodCall) {
self.channel = channel self.channel = channel
self.result = result self.result = result
self.call = methodCall self.call = methodCall
} }
public func onError(_ errCode: Int32, errMsg: String?) { public func onError(_ errCode: Int32, errMsg: String?) {
DispatchQueue.main.async { self.result(FlutterError(code: "\(errCode)", message: errMsg, details: nil)) } DispatchQueue.main.async { self.result(FlutterError(code: "\(errCode)", message: errMsg, details: nil)) }
} }
public func onProgress(_ progress: Int) { public func onProgress(_ progress: Int) {
var values: [String: Any] = [:] var values: [String: Any] = [:]
let message = call[dict: "message"] let message = call[dict: "message"]
@ -194,36 +198,36 @@ public class MessageManager: BaseServiceManager {
values["progress"] = progress values["progress"] = progress
CommonUtil.emitEvent(channel: channel, method: "msgSendProgressListener", type: "onProgress", errCode: nil, errMsg: nil, data: values) CommonUtil.emitEvent(channel: channel, method: "msgSendProgressListener", type: "onProgress", errCode: nil, errMsg: nil, data: values)
} }
public func onSuccess(_ data: String?) { public func onSuccess(_ data: String?) {
DispatchQueue.main.async { self.result(data) } DispatchQueue.main.async { self.result(data) }
} }
} }
public class AdvancedMsgListener: NSObject, Open_im_sdk_callbackOnAdvancedMsgListenerProtocol { public class AdvancedMsgListener: NSObject, Open_im_sdk_callbackOnAdvancedMsgListenerProtocol {
private let channel: FlutterMethodChannel private let channel: FlutterMethodChannel
private let id: String private let id: String
init(channel: FlutterMethodChannel, id: String) { init(channel: FlutterMethodChannel, id: String) {
self.channel = channel self.channel = channel
self.id = id self.id = id
} }
public func onRecvC2CReadReceipt(_ msgReceiptList: String?) { public func onRecvC2CReadReceipt(_ msgReceiptList: String?) {
var values: [String: Any] = [:] var values: [String: Any] = [:]
values["id"] = id values["id"] = id
values["haveReadMessage"] = msgReceiptList values["haveReadMessage"] = msgReceiptList
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvC2CReadReceipt", errCode: nil, errMsg: nil, data: values) CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvC2CReadReceipt", errCode: nil, errMsg: nil, data: values)
} }
public func onRecvMessageRevoked(_ msgId: String?) { public func onRecvMessageRevoked(_ msgId: String?) {
var values: [String: Any] = [:] var values: [String: Any] = [:]
values["id"] = id values["id"] = id
values["revokedMessage"] = msgId values["revokedMessage"] = msgId
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageRevoked", errCode: nil, errMsg: nil, data: values) CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageRevoked", errCode: nil, errMsg: nil, data: values)
} }
public func onRecvNewMessage(_ message: String?) { public func onRecvNewMessage(_ message: String?) {
var values: [String: Any] = [:] var values: [String: Any] = [:]
values["id"] = id values["id"] = id

@ -29,6 +29,9 @@ FOUNDATION_EXPORT void Open_im_sdkAddFriend(id<Open_im_sdk_callbackBase> _Nullab
FOUNDATION_EXPORT void Open_im_sdkCheckFriend(id<Open_im_sdk_callbackBase> _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable userIDList); FOUNDATION_EXPORT void Open_im_sdkCheckFriend(id<Open_im_sdk_callbackBase> _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable userIDList);
// skipped function CheckResourceLoad with unsupported parameter or return types
FOUNDATION_EXPORT BOOL Open_im_sdkCheckToken(NSString* _Nullable userID, NSString* _Nullable token, NSError* _Nullable* _Nullable error); FOUNDATION_EXPORT BOOL Open_im_sdkCheckToken(NSString* _Nullable userID, NSString* _Nullable token, NSError* _Nullable* _Nullable error);
FOUNDATION_EXPORT void Open_im_sdkClearC2CHistoryMessage(id<Open_im_sdk_callbackBase> _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable userID); FOUNDATION_EXPORT void Open_im_sdkClearC2CHistoryMessage(id<Open_im_sdk_callbackBase> _Nullable callback, NSString* _Nullable operationID, NSString* _Nullable userID);
@ -39,6 +42,8 @@ FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateCardMessage(NSString* _Nul
FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateCustomMessage(NSString* _Nullable operationID, NSString* _Nullable data, NSString* _Nullable extension, NSString* _Nullable description); FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateCustomMessage(NSString* _Nullable operationID, NSString* _Nullable data, NSString* _Nullable extension, NSString* _Nullable description);
FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateFaceMessage(NSString* _Nullable operationID, long index, NSString* _Nullable data);
FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateFileMessage(NSString* _Nullable operationID, NSString* _Nullable filePath, NSString* _Nullable fileName); FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateFileMessage(NSString* _Nullable operationID, NSString* _Nullable filePath, NSString* _Nullable fileName);
FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateFileMessageByURL(NSString* _Nullable operationID, NSString* _Nullable fileBaseInfo); FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateFileMessageByURL(NSString* _Nullable operationID, NSString* _Nullable fileBaseInfo);

@ -7,6 +7,7 @@ class MessageType {
static const file = 105; static const file = 105;
static const at_text = 106; static const at_text = 106;
static const merger = 107; static const merger = 107;
// static const forward = 108; // static const forward = 108;
static const card = 108; static const card = 108;
static const location = 109; static const location = 109;
@ -15,6 +16,7 @@ class MessageType {
static const has_read_receipt = 112; static const has_read_receipt = 112;
static const typing = 113; static const typing = 113;
static const quote = 114; static const quote = 114;
static const custom_face = 115;
/// ///
static const accept_friend = 201; static const accept_friend = 201;

@ -444,6 +444,25 @@ class MessageManager {
})) }))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create custom emoji message
///
/// [index] The position of the emoji, such as the position emoji
/// [data] Other data, such as url expressionsurl表情
Future<Message> createFaceMessage({
int index = -1,
String? data,
String? operationID,
}) =>
_channel
.invokeMethod(
'createFaceMessage',
_buildParam({
'index': index,
'data': data,
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Clear all c2c history message /// Clear all c2c history message
/// ///
Future<dynamic> clearC2CHistoryMessage({ Future<dynamic> clearC2CHistoryMessage({

@ -36,6 +36,7 @@ class Message {
QuoteElem? quoteElem; QuoteElem? quoteElem;
MergeElem? mergeElem; MergeElem? mergeElem;
NotificationElem? notificationElem; NotificationElem? notificationElem;
FaceElem? faceElem;
Message({ Message({
this.clientMsgID, this.clientMsgID,
@ -69,6 +70,7 @@ class Message {
this.quoteElem, this.quoteElem,
this.mergeElem, this.mergeElem,
this.notificationElem, this.notificationElem,
this.faceElem,
}); });
Message.fromJson(Map<String, dynamic> json) { Message.fromJson(Map<String, dynamic> json) {
@ -123,6 +125,8 @@ class Message {
notificationElem = json['notificationElem'] != null notificationElem = json['notificationElem'] != null
? NotificationElem.fromJson(json['notificationElem']) ? NotificationElem.fromJson(json['notificationElem'])
: null; : null;
faceElem =
json['faceElem'] != null ? FaceElem.fromJson(json['faceElem']) : null;
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@ -158,6 +162,7 @@ class Message {
data['quoteElem'] = this.quoteElem?.toJson(); data['quoteElem'] = this.quoteElem?.toJson();
data['mergeElem'] = this.mergeElem?.toJson(); data['mergeElem'] = this.mergeElem?.toJson();
data['notificationElem'] = this.notificationElem?.toJson(); data['notificationElem'] = this.notificationElem?.toJson();
data['faceElem'] = this.faceElem?.toJson();
return data; return data;
} }
@ -172,8 +177,7 @@ class Message {
int get hashCode => clientMsgID.hashCode; int get hashCode => clientMsgID.hashCode;
void update(Message message) { void update(Message message) {
if (clientMsgID != message.clientMsgID) return; if (this != message) return;
// clientMsgID = message.clientMsgID;
serverMsgID = message.serverMsgID; serverMsgID = message.serverMsgID;
createTime = message.createTime; createTime = message.createTime;
sendTime = message.sendTime; sendTime = message.sendTime;
@ -204,6 +208,7 @@ class Message {
quoteElem = message.quoteElem; quoteElem = message.quoteElem;
mergeElem = message.mergeElem; mergeElem = message.mergeElem;
notificationElem = message.notificationElem; notificationElem = message.notificationElem;
faceElem = message.faceElem;
} }
} }
@ -548,6 +553,25 @@ class NotificationElem {
} }
} }
class FaceElem {
int? index;
String? data;
FaceElem({this.index, this.data});
FaceElem.fromJson(Map<String, dynamic> json) {
index = json['index'];
data = json['data'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['index'] = this.index;
data['data'] = this.data;
return data;
}
}
class ReadReceiptInfo { class ReadReceiptInfo {
String? uid; String? uid;
List<String>? msgIDList; List<String>? msgIDList;

@ -16,11 +16,17 @@ class UserInfo {
int? createTime; int? createTime;
String? remark; String? remark;
/// User's public profile(用户公开的资料)
PublicUserInfo? publicInfo; PublicUserInfo? publicInfo;
/// Only friends can view information
FriendInfo? friendInfo; FriendInfo? friendInfo;
/// blacklist information
BlacklistInfo? blackInfo; BlacklistInfo? blackInfo;
bool? isFriendship; bool? isFriendship;
bool? isBlacklist; bool? isBlacklist;
UserInfo({ UserInfo({
@ -76,7 +82,7 @@ class UserInfo {
birth = json['birth'] ?? _birth; birth = json['birth'] ?? _birth;
email = json['email'] ?? _email; email = json['email'] ?? _email;
remark = json['remark'] ?? _remark; remark = json['remark'] ?? _remark;
ex = json['ex']; ex = json['ex'] ?? _ex;
createTime = json['createTime']; createTime = json['createTime'];
} }
@ -123,6 +129,10 @@ class UserInfo {
? friendInfo?.gender ? friendInfo?.gender
: (isBlacklist! ? blackInfo?.gender : publicInfo?.gender); : (isBlacklist! ? blackInfo?.gender : publicInfo?.gender);
String? get _ex => isFriendship!
? friendInfo?.ex
: (isBlacklist! ? blackInfo?.ex : publicInfo?.ex);
String? get _phoneNumber => friendInfo?.phoneNumber; String? get _phoneNumber => friendInfo?.phoneNumber;
int? get _birth => friendInfo?.birth; int? get _birth => friendInfo?.birth;
@ -131,9 +141,9 @@ class UserInfo {
String? get _remark => friendInfo?.remark; String? get _remark => friendInfo?.remark;
String getShowName() => _trimBlank(remark) ?? _trimBlank(nickname) ?? userID!; String getShowName() => _isNull(remark) ?? _isNull(nickname) ?? userID!;
static String? _trimBlank(String? value) { static String? _isNull(String? value) {
if (value == null || value.trim().isEmpty) return null; if (value == null || value.trim().isEmpty) return null;
return value; return value;
} }
@ -145,6 +155,7 @@ class PublicUserInfo {
String? faceURL; String? faceURL;
int? gender; int? gender;
int? appMangerLevel; int? appMangerLevel;
String? ex;
PublicUserInfo({ PublicUserInfo({
this.userID, this.userID,
@ -152,6 +163,7 @@ class PublicUserInfo {
this.faceURL, this.faceURL,
this.gender, this.gender,
this.appMangerLevel, this.appMangerLevel,
this.ex,
}); });
PublicUserInfo.fromJson(Map<String, dynamic> json) { PublicUserInfo.fromJson(Map<String, dynamic> json) {
@ -160,6 +172,7 @@ class PublicUserInfo {
faceURL = json['faceURL']; faceURL = json['faceURL'];
gender = json['gender']; gender = json['gender'];
appMangerLevel = json['appMangerLevel']; appMangerLevel = json['appMangerLevel'];
ex = json['ex'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@ -169,6 +182,7 @@ class PublicUserInfo {
data['faceURL'] = this.faceURL; data['faceURL'] = this.faceURL;
data['gender'] = this.gender; data['gender'] = this.gender;
data['appMangerLevel'] = this.appMangerLevel; data['appMangerLevel'] = this.appMangerLevel;
data['ex'] = this.ex;
return data; return data;
} }
} }

Loading…
Cancel
Save