diff --git a/.idea/misc.xml b/.idea/misc.xml index f8c5fc9..56abf55 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,4 +3,5 @@ + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 97fa7f5..7fcc83e 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -3,6 +3,7 @@ + \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 0804dde..b8d45b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ -## 2.0.0+1 +## 2.0.0+2 1.Fix some one crash
+2.New add signaling function
+3.Delete getConversationRecvMessageOpt ## 2.0.0+1 diff --git a/README.zh-cn.md b/README.zh-cn.md index 8b40768..be8f7fa 100644 --- a/README.zh-cn.md +++ b/README.zh-cn.md @@ -130,6 +130,23 @@ OpenIM.iMManager onGroupInfoChanged: (groupInfo) { // 组资料变更 }, + )) + ..signalingManager.setSignalingListener(OnSignalingListener( + onReceiveNewInvitation: (info) { + // 被邀请者收到:音视频通话邀请 + }, + onInviteeRejected: (info) { + // 邀请者收到:被邀请者拒绝音视频通话 + }, + onInviteeAccepted: (info) { + // 邀请者收到:被邀请者同意音视频通话 + }, + onInvitationTimeout: (info) { + // 邀请者收到:被邀请者超时未接通 + }, + onInvitationCancelled: (info) { + // 被邀请者收到:邀请者取消音视频通话 + }, )); ``` @@ -335,6 +352,7 @@ OpenIM.iMManager.conversationManager.setConversationRecvMessageOpt( - ##### getConversationRecvMessageOpt(查询免打扰状态) ``` +/// 此方法已废弃,使用getOneConversation/getMultipleConversation方法替代 OpenIM.iMManager.conversationManager.getConversationRecvMessageOpt( conversationIDList: [], // 会话id列表 ).then((list) { diff --git a/android/build.gradle b/android/build.gradle index fadc659..72b38d5 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -41,5 +41,5 @@ android { } } dependencies { - implementation 'io.openim:client-sdk:2.0.8@aar' + implementation 'io.openim:client-sdk:2.0.9@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 c7f7766..8f3a500 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 @@ -18,6 +18,7 @@ import io.openim.flutter_openim_sdk.manager.FriendshipManager; import io.openim.flutter_openim_sdk.manager.GroupManager; 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; @@ -37,6 +38,7 @@ public class FlutterOpenimSdkPlugin implements FlutterPlugin, MethodCallHandler private static MessageManager messageManager; private static ConversationManager conversationManager; private static GroupManager groupManager; + private static SignalingManager signalingManager; public FlutterOpenimSdkPlugin() { } @@ -48,6 +50,7 @@ public class FlutterOpenimSdkPlugin implements FlutterPlugin, MethodCallHandler FlutterOpenimSdkPlugin.messageManager = new MessageManager(); FlutterOpenimSdkPlugin.conversationManager = new ConversationManager(); FlutterOpenimSdkPlugin.groupManager = new GroupManager(); + FlutterOpenimSdkPlugin.signalingManager = new SignalingManager(); } @Override diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnSignalingListener.java b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnSignalingListener.java new file mode 100644 index 0000000..94ae88e --- /dev/null +++ b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnSignalingListener.java @@ -0,0 +1,30 @@ +package io.openim.flutter_openim_sdk.listener; + +import io.openim.flutter_openim_sdk.util.CommonUtil; + +public class OnSignalingListener implements open_im_sdk_callback.OnSignalingListener { + @Override + public void onInvitationCancelled(String s) { + CommonUtil.emitEvent("signalingListener", "onInvitationCancelled", s); + } + + @Override + public void onInvitationTimeout(String s) { + CommonUtil.emitEvent("signalingListener", "onInvitationTimeout", s); + } + + @Override + public void onInviteeAccepted(String s) { + CommonUtil.emitEvent("signalingListener", "onInviteeAccepted", s); + } + + @Override + public void onInviteeRejected(String s) { + CommonUtil.emitEvent("signalingListener", "onInviteeRejected", s); + } + + @Override + public void onReceiveNewInvitation(String s) { + CommonUtil.emitEvent("signalingListener", "onReceiveNewInvitation", s); + } +} 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 7f70c9e..601c8be 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 @@ -111,11 +111,11 @@ public class ConversationManager extends BaseManager { ); } - public void getConversationRecvMessageOpt(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.getConversationRecvMessageOpt( - new OnBaseListener(result), - value(methodCall, "operationID"), - jsonValue(methodCall, "conversationIDList") - ); - } +// public void getConversationRecvMessageOpt(MethodCall methodCall, MethodChannel.Result result) { +// Open_im_sdk.getConversationRecvMessageOpt( +// new OnBaseListener(result), +// value(methodCall, "operationID"), +// jsonValue(methodCall, "conversationIDList") +// ); +// } } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/SignalingManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/SignalingManager.java new file mode 100644 index 0000000..40516bf --- /dev/null +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/SignalingManager.java @@ -0,0 +1,49 @@ +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.OnSignalingListener; +import open_im_sdk.Open_im_sdk; + +public class SignalingManager extends BaseManager { + + public void setSignalingListener(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.setSignalingListener(new OnSignalingListener()); + } + + public void signalingInvite(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.signalingInvite( + new OnBaseListener(result), + value(methodCall, "operationID"), + jsonValue(methodCall, "signalingInfo")); + } + + public void signalingInviteInGroup(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.signalingInviteInGroup( + new OnBaseListener(result), + value(methodCall, "operationID"), + jsonValue(methodCall, "signalingInfo")); + } + + public void signalingAccept(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.signalingAccept( + new OnBaseListener(result), + value(methodCall, "operationID"), + jsonValue(methodCall, "signalingInfo")); + } + + public void signalingReject(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.signalingReject( + new OnBaseListener(result), + value(methodCall, "operationID"), + jsonValue(methodCall, "signalingInfo")); + } + + public void signalingCancel(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.signalingCancel( + new OnBaseListener(result), + value(methodCall, "operationID"), + jsonValue(methodCall, "signalingInfo")); + } +} diff --git a/example/lib/main.dart b/example/lib/main.dart index c94fc29..6e897dc 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -163,6 +163,23 @@ class _MyAppState extends State { onGroupInfoChanged: (groupInfo) { // 组资料变更 }, + )) + ..signalingManager.setSignalingListener(OnSignalingListener( + onReceiveNewInvitation: (info) { + // 被邀请者收到:音视频通话邀请 + }, + onInviteeRejected: (info) { + // 邀请者收到:被邀请者拒绝音视频通话 + }, + onInviteeAccepted: (info) { + // 邀请者收到:被邀请者同意音视频通话 + }, + onInvitationTimeout: (info) { + // 邀请者收到:被邀请者超时未接通 + }, + onInvitationCancelled: (info) { + // 被邀请者收到:邀请者取消音视频通话 + }, )); } @@ -264,9 +281,9 @@ class _MyAppState extends State { conversationIDList: [], // 会话id列表 status: 1, // 1:不接受消息;2:接受在线消息不接受离线消息;0:正常 ); - OpenIM.iMManager.conversationManager.getConversationRecvMessageOpt( - conversationIDList: [], // 会话id列表 - ); + // OpenIM.iMManager.conversationManager.getConversationRecvMessageOpt( + // conversationIDList: [], // 会话id列表 + // ); OpenIM.iMManager.conversationManager.simpleSort([]); } diff --git a/lib/flutter_openim_sdk.dart b/lib/flutter_openim_sdk.dart index e8bd60a..3584577 100644 --- a/lib/flutter_openim_sdk.dart +++ b/lib/flutter_openim_sdk.dart @@ -7,17 +7,12 @@ export 'src/enum/listener_type.dart'; export 'src/enum/message_status.dart'; export 'src/enum/message_type.dart'; export 'src/listener/advanced_msg_listener.dart'; -export 'src/listener/advanced_msg_listener.dart'; -export 'src/listener/connect_listener.dart'; export 'src/listener/connect_listener.dart'; export 'src/listener/conversation_listener.dart'; export 'src/listener/friendship_listener.dart'; -export 'src/listener/friendship_listener.dart'; export 'src/listener/group_listener.dart'; -export 'src/listener/group_listener.dart'; -export 'src/listener/msg_send_progress_listener.dart'; export 'src/listener/msg_send_progress_listener.dart'; -export 'src/listener/user_listener.dart'; +export 'src/listener/signaling_listener.dart'; export 'src/listener/user_listener.dart'; export 'src/manager/im_conversation_manager.dart'; export 'src/manager/im_friendship_manager.dart'; @@ -30,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/signaling_info.dart'; export 'src/models/user_info.dart'; export 'src/openim.dart'; export 'src/utils.dart'; diff --git a/lib/src/listener/signaling_listener.dart b/lib/src/listener/signaling_listener.dart new file mode 100644 index 0000000..e9e8942 --- /dev/null +++ b/lib/src/listener/signaling_listener.dart @@ -0,0 +1,42 @@ +import 'package:flutter_openim_sdk/src/models/signaling_info.dart'; + +class OnSignalingListener { + final Function(SignalingInfo info)? onInvitationCancelled; + final Function(SignalingInfo info)? onInvitationTimeout; + final Function(SignalingInfo info)? onInviteeAccepted; + final Function(SignalingInfo info)? onInviteeRejected; + final Function(SignalingInfo info)? onReceiveNewInvitation; + + OnSignalingListener({ + this.onInvitationCancelled, + this.onInvitationTimeout, + this.onInviteeAccepted, + this.onInviteeRejected, + this.onReceiveNewInvitation, + }); + + /// 被邀请者收到:邀请者取消音视频通话 + void invitationCancelled(SignalingInfo info) { + onInvitationCancelled?.call(info); + } + + /// 邀请者收到:被邀请者超时未接通 + void invitationTimeout(SignalingInfo info) { + onInvitationTimeout?.call(info); + } + + /// 邀请者收到:被邀请者同意音视频通话 + void inviteeAccepted(SignalingInfo info) { + onInviteeAccepted?.call(info); + } + + /// 邀请者收到:被邀请者拒绝音视频通话 + void inviteeRejected(SignalingInfo info) { + onInviteeRejected?.call(info); + } + + /// 被邀请者收到:音视频通话邀请 + void receiveNewInvitation(SignalingInfo info) { + onReceiveNewInvitation?.call(info); + } +} diff --git a/lib/src/manager/im_conversation_manager.dart b/lib/src/manager/im_conversation_manager.dart index fa37b98..9eb0c34 100644 --- a/lib/src/manager/im_conversation_manager.dart +++ b/lib/src/manager/im_conversation_manager.dart @@ -3,14 +3,14 @@ import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; class ConversationManager { MethodChannel _channel; - late OnConversationListener conversationListener; + late OnConversationListener listener; ConversationManager(this._channel); /// Observe conversation changes /// 会话监听 Future setConversationListener(OnConversationListener listener) { - this.conversationListener = listener; + this.listener = listener; return _channel.invokeMethod('setConversationListener', _buildParam({})); } @@ -191,18 +191,18 @@ class ConversationManager { /// Message Do Not Disturb /// [{"conversationId":"single_13922222222","result":0}] /// 查询免打扰状态 - Future> getConversationRecvMessageOpt({ - required List conversationIDList, - String? operationID, - }) => - _channel - .invokeMethod( - 'getConversationRecvMessageOpt', - _buildParam({ - "conversationIDList": conversationIDList, - "operationID": Utils.checkOperationID(operationID), - })) - .then((value) => Utils.toListMap(value)); + // Future> getConversationRecvMessageOpt({ + // required List conversationIDList, + // String? operationID, + // }) => + // _channel + // .invokeMethod( + // 'getConversationRecvMessageOpt', + // _buildParam({ + // "conversationIDList": conversationIDList, + // "operationID": Utils.checkOperationID(operationID), + // })) + // .then((value) => Utils.toListMap(value)); /// Custom sort for conversation list /// 会话列表自定义排序规则。 diff --git a/lib/src/manager/im_friendship_manager.dart b/lib/src/manager/im_friendship_manager.dart index 7b3defd..34f08ce 100644 --- a/lib/src/manager/im_friendship_manager.dart +++ b/lib/src/manager/im_friendship_manager.dart @@ -3,14 +3,14 @@ import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; class FriendshipManager { MethodChannel _channel; - late OnFriendshipListener friendshipListener; + late OnFriendshipListener listener; FriendshipManager(this._channel); /// Set up a friend relationship listener /// 好友关系监听 Future setFriendshipListener(OnFriendshipListener listener) { - this.friendshipListener = listener; + this.listener = listener; return _channel.invokeMethod('setFriendListener', _buildParam({})); } diff --git a/lib/src/manager/im_group_manager.dart b/lib/src/manager/im_group_manager.dart index c11676f..4c12a47 100644 --- a/lib/src/manager/im_group_manager.dart +++ b/lib/src/manager/im_group_manager.dart @@ -3,14 +3,14 @@ import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; class GroupManager { MethodChannel _channel; - late OnGroupListener groupListener; + late OnGroupListener listener; GroupManager(this._channel); /// Set up group relationship monitoring /// 组关系监听 Future setGroupListener(OnGroupListener listener) { - this.groupListener = listener; + this.listener = listener; return _channel.invokeMethod('setGroupListener', _buildParam({})); } diff --git a/lib/src/manager/im_manager.dart b/lib/src/manager/im_manager.dart index cb504c2..4d89ac0 100644 --- a/lib/src/manager/im_manager.dart +++ b/lib/src/manager/im_manager.dart @@ -12,7 +12,8 @@ class IMManager { late UserManager userManager; // late OfflinePushManager offlinePushManager; - // late SignalingManager signalingManager; + late SignalingManager signalingManager; + late OnConnectListener _connectListener; late String uid; late UserInfo uInfo; @@ -25,7 +26,7 @@ class IMManager { groupManager = GroupManager(_channel); userManager = UserManager(_channel); // offlinePushManager = OfflinePushManager(_channel); - // signalingManager = SignalingManager(_channel); + signalingManager = SignalingManager(_channel); _addNativeCallback(_channel); } @@ -60,7 +61,7 @@ class IMManager { switch (type) { case 'onSelfInfoUpdated': uInfo = Utils.toObj(data, (map) => UserInfo.fromJson(map)); - userManager.userListener.selfInfoUpdated(uInfo); + userManager.listener.selfInfoUpdated(uInfo); break; } } else if (call.method == ListenerType.groupListener) { @@ -70,49 +71,49 @@ class IMManager { case 'onGroupApplicationAccepted': final i = Utils.toObj( data, (map) => GroupApplicationInfo.fromJson(map)); - groupManager.groupListener.groupApplicationAccepted(i); + groupManager.listener.groupApplicationAccepted(i); break; case 'onGroupApplicationAdded': final i = Utils.toObj( data, (map) => GroupApplicationInfo.fromJson(map)); - groupManager.groupListener.groupApplicationAdded(i); + groupManager.listener.groupApplicationAdded(i); break; case 'onGroupApplicationDeleted': final i = Utils.toObj( data, (map) => GroupApplicationInfo.fromJson(map)); - groupManager.groupListener.groupApplicationDeleted(i); + groupManager.listener.groupApplicationDeleted(i); break; case 'onGroupApplicationRejected': final i = Utils.toObj( data, (map) => GroupApplicationInfo.fromJson(map)); - groupManager.groupListener.groupApplicationRejected(i); + groupManager.listener.groupApplicationRejected(i); break; case 'onGroupInfoChanged': final i = Utils.toObj(data, (map) => GroupInfo.fromJson(map)); - groupManager.groupListener.groupInfoChanged(i); + groupManager.listener.groupInfoChanged(i); break; case 'onGroupMemberAdded': final i = Utils.toObj(data, (map) => GroupMembersInfo.fromJson(map)); - groupManager.groupListener.groupMemberAdded(i); + groupManager.listener.groupMemberAdded(i); break; case 'onGroupMemberDeleted': final i = Utils.toObj(data, (map) => GroupMembersInfo.fromJson(map)); - groupManager.groupListener.groupMemberDeleted(i); + groupManager.listener.groupMemberDeleted(i); break; case 'onGroupMemberInfoChanged': final i = Utils.toObj(data, (map) => GroupMembersInfo.fromJson(map)); - groupManager.groupListener.groupMemberInfoChanged(i); + groupManager.listener.groupMemberInfoChanged(i); break; case 'onJoinedGroupAdded': final i = Utils.toObj(data, (map) => GroupInfo.fromJson(map)); - groupManager.groupListener.joinedGroupAdded(i); + groupManager.listener.joinedGroupAdded(i); break; case 'onJoinedGroupDeleted': final i = Utils.toObj(data, (map) => GroupInfo.fromJson(map)); - groupManager.groupListener.joinedGroupDeleted(i); + groupManager.listener.joinedGroupDeleted(i); break; } } else if (call.method == ListenerType.advancedMsgListener) { @@ -153,28 +154,27 @@ class IMManager { dynamic data = call.arguments['data']; switch (type) { case 'onSyncServerStart': - conversationManager.conversationListener.syncServerStart(); + conversationManager.listener.syncServerStart(); break; case 'onSyncServerFinish': - conversationManager.conversationListener.syncServerFinish(); + conversationManager.listener.syncServerFinish(); break; case 'onSyncServerFailed': - conversationManager.conversationListener.syncServerFailed(); + conversationManager.listener.syncServerFailed(); break; case 'onNewConversation': var list = Utils.toList(data, (map) => ConversationInfo.fromJson(map)); - conversationManager.conversationListener.newConversation(list); + conversationManager.listener.newConversation(list); break; case 'onConversationChanged': var list = Utils.toList(data, (map) => ConversationInfo.fromJson(map)); - conversationManager.conversationListener - .conversationChanged(list); + conversationManager.listener.conversationChanged(list); break; case 'onTotalUnreadMessageCountChanged': - conversationManager.conversationListener + conversationManager.listener .totalUnreadMessageCountChanged(data ?? 0); break; } @@ -185,43 +185,64 @@ class IMManager { switch (type) { case 'onBlacklistAdded': final u = Utils.toObj(data, (map) => BlacklistInfo.fromJson(map)); - friendshipManager.friendshipListener.blacklistAdded(u); + friendshipManager.listener.blacklistAdded(u); break; case 'onBlacklistDeleted': final u = Utils.toObj(data, (map) => BlacklistInfo.fromJson(map)); - friendshipManager.friendshipListener.blacklistDeleted(u); + friendshipManager.listener.blacklistDeleted(u); break; case 'onFriendApplicationAccepted': final u = Utils.toObj( data, (map) => FriendApplicationInfo.fromJson(map)); - friendshipManager.friendshipListener.friendApplicationAccepted(u); + friendshipManager.listener.friendApplicationAccepted(u); break; case 'onFriendApplicationAdded': final u = Utils.toObj( data, (map) => FriendApplicationInfo.fromJson(map)); - friendshipManager.friendshipListener.friendApplicationAdded(u); + friendshipManager.listener.friendApplicationAdded(u); break; case 'onFriendApplicationDeleted': final u = Utils.toObj( data, (map) => FriendApplicationInfo.fromJson(map)); - friendshipManager.friendshipListener.friendApplicationDeleted(u); + friendshipManager.listener.friendApplicationDeleted(u); break; case 'onFriendApplicationListRejected': final u = Utils.toObj( data, (map) => FriendApplicationInfo.fromJson(map)); - friendshipManager.friendshipListener.friendApplicationRejected(u); + friendshipManager.listener.friendApplicationRejected(u); break; case 'onFriendInfoChanged': final u = Utils.toObj(data, (map) => FriendInfo.fromJson(map)); - friendshipManager.friendshipListener.friendInfoChanged(u); + friendshipManager.listener.friendInfoChanged(u); break; case 'onFriendAdded': final u = Utils.toObj(data, (map) => FriendInfo.fromJson(map)); - friendshipManager.friendshipListener.friendAdded(u); + friendshipManager.listener.friendAdded(u); break; case 'onFriendDeleted': final u = Utils.toObj(data, (map) => FriendInfo.fromJson(map)); - friendshipManager.friendshipListener.friendDeleted(u); + friendshipManager.listener.friendDeleted(u); + break; + } + } else if (call.method == ListenerType.signalingListener) { + String type = call.arguments['type']; + dynamic data = call.arguments['data']; + final u = Utils.toObj(data, (map) => SignalingInfo.fromJson(map)); + switch (type) { + case 'onInvitationCancelled': + signalingManager.listener.invitationCancelled(u); + break; + case 'onInvitationTimeout': + signalingManager.listener.invitationTimeout(u); + break; + case 'onInviteeAccepted': + signalingManager.listener.inviteeAccepted(u); + break; + case 'onInviteeRejected': + signalingManager.listener.inviteeRejected(u); + break; + case 'onReceiveNewInvitation': + signalingManager.listener.receiveNewInvitation(u); break; } } diff --git a/lib/src/manager/im_signaling_manager.dart b/lib/src/manager/im_signaling_manager.dart index 6c34270..1349243 100644 --- a/lib/src/manager/im_signaling_manager.dart +++ b/lib/src/manager/im_signaling_manager.dart @@ -1,7 +1,90 @@ -// import 'package:flutter/services.dart'; -// -// class SignalingManager { -// MethodChannel _channel; -// -// SignalingManager(this._channel); -// } +import 'package:flutter/services.dart'; + +import '../../flutter_openim_sdk.dart'; + +class SignalingManager { + MethodChannel _channel; + late OnSignalingListener listener; + + SignalingManager(this._channel); + + /// 信令监听 + Future setSignalingListener(OnSignalingListener listener) { + this.listener = listener; + return _channel.invokeMethod('setSignalingListener', _buildParam({})); + } + + /// 邀请个人加入音视频 + Future signalingInvite({ + required SignalingInfo info, + String? operationID, + }) => + _channel + .invokeMethod( + 'signalingInvite', + _buildParam({ + 'signalingInfo': info.toJson(), + 'operationID': Utils.checkOperationID(operationID), + })) + .then((value) => + Utils.toObj(value, (map) => SignalingCertificate.fromJson(map))); + + /// 邀请群里某些人加入音视频 + Future signalingInviteInGroup({ + required SignalingInfo info, + String? operationID, + }) => + _channel + .invokeMethod( + 'signalingInviteInGroup', + _buildParam({ + 'signalingInfo': info.toJson(), + 'operationID': Utils.checkOperationID(operationID), + })) + .then((value) => + Utils.toObj(value, (map) => SignalingCertificate.fromJson(map))); + + /// 同意某人音视频邀请 + Future signalingAccept({ + required SignalingInfo info, + String? operationID, + }) => + _channel + .invokeMethod( + 'signalingAccept', + _buildParam({ + 'signalingInfo': info.toJson(), + 'operationID': Utils.checkOperationID(operationID), + })) + .then((value) => + Utils.toObj(value, (map) => SignalingCertificate.fromJson(map))); + + /// 拒绝某人音视频邀请 + Future signalingReject({ + required SignalingInfo info, + String? operationID, + }) => + _channel.invokeMethod( + 'signalingReject', + _buildParam({ + 'signalingInfo': info.toJson(), + 'operationID': Utils.checkOperationID(operationID), + })); + + /// 邀请者取消音视频通话 + Future signalingCancel({ + required SignalingInfo info, + String? operationID, + }) => + _channel.invokeMethod( + 'signalingCancel', + _buildParam({ + 'signalingInfo': info.toJson(), + 'operationID': Utils.checkOperationID(operationID), + })); + + static Map _buildParam(Map param) { + param["ManagerName"] = "signalingManager"; + return param; + } +} diff --git a/lib/src/manager/im_user_manager.dart b/lib/src/manager/im_user_manager.dart index 0cc4955..4381170 100644 --- a/lib/src/manager/im_user_manager.dart +++ b/lib/src/manager/im_user_manager.dart @@ -3,14 +3,14 @@ import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; class UserManager { MethodChannel _channel; - late OnUserListener userListener; + late OnUserListener listener; UserManager(this._channel); /// Observe user info changes /// 用户资料改变监听 Future setUserListener(OnUserListener listener) { - this.userListener = listener; + this.listener = listener; return _channel.invokeMethod('setUserListener', _buildParam({})); } diff --git a/lib/src/models/signaling_info.dart b/lib/src/models/signaling_info.dart new file mode 100644 index 0000000..7361da0 --- /dev/null +++ b/lib/src/models/signaling_info.dart @@ -0,0 +1,98 @@ +import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; + +class SignalingInfo { + String? opUserID; + InvitationInfo? invitation; + OfflinePushInfo? offlinePushInfo; + + SignalingInfo({ + this.opUserID, + this.invitation, + this.offlinePushInfo, + }); + + SignalingInfo.fromJson(Map json) { + opUserID = json['opUserID']; + invitation = json['invitation'] == null + ? null + : InvitationInfo.fromJson(json['invitation']); + offlinePushInfo = json['offlinePushInfo'] == null + ? null + : OfflinePushInfo.fromJson(json['offlinePushInfo']); + } + + Map toJson() { + final data = Map(); + data['opUserID'] = this.opUserID; + data['invitation'] = this.invitation?.toJson(); + data['offlinePushInfo'] = this.offlinePushInfo?.toJson(); + return data; + } +} + +class InvitationInfo { + String? inviterUserID; //邀请者UserID + List? inviteeUserIDList; //被邀请者UserID列表,如果是单聊只有一个元素 + String? groupID; //如果是单聊,为"" + String? roomID; //房间ID,必须唯一,可以不设置。 + int? timeout; //邀请超时时间(秒) + String? mediaType; //video 或者audio + int? sessionType; //1为单聊,2为群聊 + int? platformID; //和之前定义一致 + + InvitationInfo( + {this.inviterUserID, + this.inviteeUserIDList, + this.groupID, + this.roomID, + this.timeout, + this.mediaType, + this.sessionType, + this.platformID}); + + InvitationInfo.fromJson(Map json) { + inviterUserID = json['inviterUserID']; + inviteeUserIDList = json['inviteeUserIDList'].cast(); + groupID = json['groupID']; + roomID = json['roomID']; + timeout = json['timeout']; + mediaType = json['mediaType']; + sessionType = json['sessionType']; + platformID = json['platformID']; + } + + Map toJson() { + final data = Map(); + data['inviterUserID'] = this.inviterUserID; + data['inviteeUserIDList'] = this.inviteeUserIDList; + data['groupID'] = this.groupID; + data['roomID'] = this.roomID; + data['timeout'] = this.timeout; + data['mediaType'] = this.mediaType; + data['sessionType'] = this.sessionType; + data['platformID'] = this.platformID; + return data; + } +} + +class SignalingCertificate { + String? token; + String? roomID; + String? liveURL; + + SignalingCertificate({this.token, this.roomID, this.liveURL}); + + SignalingCertificate.fromJson(Map json) { + token = json['token']; + roomID = json['roomID']; + liveURL = json['liveURL']; + } + + Map toJson() { + final data = Map(); + data['token'] = this.token; + data['roomID'] = this.roomID; + data['liveURL'] = this.liveURL; + return data; + } +}