Compare commits

...

86 Commits

Author SHA1 Message Date
hrxiang
39727feb8a Fix bug 2023-03-08 15:52:16 +08:00
hrxiang
c6d1669bdd 添加aar包本地依赖方式说明 2023-03-06 18:37:39 +08:00
hrxiang
02202051e1 添加aar包本地依赖方式说明 2023-03-06 18:36:38 +08:00
hrxiang
d0a4530314 New add 2023-03-03 15:17:40 +08:00
hrxiang
958c118e84 Fix bug for signaling 2023-03-01 11:44:14 +08:00
hrxiang
cdef7ffda8 Fix bug callback 'onUserTokenExpired' 2023-02-20 16:34:38 +08:00
hrxiang
bac4bd0884 Fix bug 2023-02-20 15:29:57 +08:00
hrxiang
377b07ef05 Fix bug 2023-02-20 09:33:08 +08:00
hrxiang
025487fbf3 Fix bug 2023-02-09 14:31:25 +08:00
hrxiang
ba3767da42 Fix bug 2023-02-08 09:53:39 +08:00
hrxiang
fc6fd3dd93 Fix bug 2023-02-08 09:45:53 +08:00
hrxiang
c6d9815e64 Fix bug 2023-01-18 10:48:52 +08:00
hrxiang
8e0c736d29 Merge pull request #105 from johnzerTang/main
feat:补充conversation_info的遗漏
2023-01-16 09:35:35 +08:00
johnzer
15854a2c27 feat:补充conversation_info的遗漏 2023-01-09 16:27:48 +08:00
hrxiang
3e1ee249c9 Fix bug 2023-01-03 16:25:08 +08:00
hrxiang
29eac1bf91 Fix bug 2022-12-30 18:58:57 +08:00
skiffer-git
bea820ff27 Update README.md 2022-12-14 10:36:02 +08:00
hrxiang
a85062ce79 Fix bug 2022-12-12 10:51:20 +08:00
hrxiang
98b2774dc1 Fix bug 2022-12-09 16:45:25 +08:00
hrxiang
e823df62a8 Fix bug 2022-12-09 15:08:27 +08:00
hrxiang
2c40b626e4 Fix bug 2022-12-09 11:25:44 +08:00
hrxiang
3b5f47c9f0 V2.3.5 2022-12-08 12:05:21 +08:00
hrxiang
4c540fbff5 Update 2022-12-02 10:50:48 +08:00
hrxiang
b8a51374a3 Update 2022-11-25 17:03:50 +08:00
hrxiang
099cb9849a Merge branch 'main' of https://github.com/OpenIMSDK/Open-IM-SDK-Flutter 2022-11-16 16:46:35 +08:00
hrxiang
025334d32f Fix bug 2022-11-16 16:45:12 +08:00
hrxiang
5adc50b963 Merge pull request #102 from yohom/main
fix: 所有的设置Listener方法都调用result.success(null), 否则dart端的Future会一直挂起不返回.
2022-11-16 16:42:41 +08:00
yohom
ebbe5c882f fix: 所有的设置Listener方法都调用result.success(null), 否则dart端的Future会一直挂起不返回. 2022-11-16 16:28:48 +08:00
hrxiang
eb3361c4b3 Fix bug 2022-11-14 14:28:33 +08:00
hrxiang
9c5aa56609 Fix bug 2022-11-11 14:22:17 +08:00
hrxiang
3e03460300 Fix bug 2022-11-08 12:04:09 +08:00
hrxiang
788ab524c2 Fix bug 2022-11-08 11:22:44 +08:00
hrxiang
eed59f468c Fix bug 2022-11-07 10:32:05 +08:00
hrxiang
d758f3fca1 Fix bug 2022-10-31 10:27:54 +08:00
hrxiang
b8ee9276a2 Add some new function 2022-10-25 11:45:30 +08:00
hrxiang
a77c86e87a Fix bug 2022-10-09 13:55:47 +08:00
hrxiang
c99d1e4d67 Fix bug 2022-10-09 13:54:26 +08:00
hrxiang
b53d4dfcfd Fix bug 2022-10-08 18:53:29 +08:00
hrxiang
bb49d6b27a Core sdk upgrade to 2.3.4 2022-09-30 17:29:22 +08:00
hrxiang
2b78f83b20 Core sdk upgrade to 2.3.4 2022-09-30 17:28:30 +08:00
hrxiang
38a899d32c Core sdk upgrade to 2.3.3 2022-09-20 11:04:58 +08:00
hrxiang
0a0635bb71 2.3.2 2022-09-16 09:37:21 +08:00
xianghr
c44575ec0e Merge branch 'main' of https://github.com/OpenIMSDK/Open-IM-SDK-Flutter 2022-09-09 18:46:27 +08:00
std-s
14624c717b [Update] 2022-09-09 18:44:28 +08:00
xianghr
0900df2aa2 3.2.2 2022-09-09 18:31:06 +08:00
xianghr
cd06c3bb5a 3.2.2 2022-09-09 17:17:31 +08:00
hrxiang
a6aea5496a [Super Group]2.3.0 2022-08-24 11:46:15 +08:00
hrxiang
72111053bd [Super Group]2.3.0 2022-08-03 17:30:40 +08:00
hrxiang
18f099c437 [Super Group] 2022-07-22 12:12:55 +08:00
hrxiang
cff0a4cce2 [Super Group] 2022-07-18 10:13:04 +08:00
hrxiang
e415961d64 [Super Group] 2022-07-15 18:35:48 +08:00
hrxiang
b3aebeb318 [Super Group] 2022-07-15 18:34:21 +08:00
hrxiang
c76bfeb07a [Super Group] 2022-07-15 18:19:17 +08:00
hrxiang
a9343bf892 update 2022-07-05 10:25:59 +08:00
hrxiang
bf354c4103 update 2022-07-04 11:56:02 +08:00
hrxiang
644c52ae0e update 2022-07-01 10:30:42 +08:00
hrxiang
80048bcd18 update 2022-06-30 11:31:21 +08:00
hrxiang
cc6c1bdc22 update 2022-06-30 09:56:32 +08:00
hrxiang
7233b2e298 update 2022-06-29 16:40:22 +08:00
hrxiang
cd61ebba7f update 2022-06-28 09:53:54 +08:00
hrxiang
3a294dd856 update 2022-06-28 09:50:04 +08:00
hrxiang
45e0c82ea3 update 2022-06-27 18:25:55 +08:00
hrxiang
2de606d13e update 2022-06-27 18:23:33 +08:00
hrxiang
7a68e13398 update 2022-06-27 18:20:00 +08:00
hrxiang
4132338633 update 2022-06-27 18:01:31 +08:00
hrxiang
485bf58f14 Merge branch 'main' of https://github.com/OpenIMSDK/Open-IM-SDK-Flutter 2022-06-27 17:55:24 +08:00
hrxiang
6ad47216fb update 2022-06-27 17:55:18 +08:00
hrxiang
3c62315cfd Update README.zh-cn.md 2022-06-27 17:54:46 +08:00
hrxiang
7247f6b982 update 2022-06-27 17:40:04 +08:00
hrxiang
6a771f8035 update 2022-06-24 15:28:47 +08:00
hrxiang
4726055b6f update 2022-06-24 15:22:44 +08:00
hrxiang
2a9d4a0587 update 2022-06-24 11:05:29 +08:00
hrxiang
cce41e0991 update 2022-06-21 18:40:28 +08:00
hrxiang
599c25b099 update 2022-06-21 14:27:38 +08:00
hrxiang
6c3311cce1 update 2022-06-20 14:25:15 +08:00
hrxiang
9a359ca9a0 update 2022-06-17 10:00:03 +08:00
hrxiang
cc2211c36d update 2022-06-16 19:31:21 +08:00
hrxiang
ccf4d4fec1 update 2022-06-16 19:30:22 +08:00
hrxiang
0b8762a754 update 2022-06-16 19:28:54 +08:00
std-s
28a911022c Update build.gradle 2022-06-16 18:43:29 +08:00
std-s
996281e49a Update build.gradle 2022-06-16 15:43:06 +08:00
hrxiang
e2b546f400 update 2022-06-16 12:18:15 +08:00
hrxiang
8abc8e4399 1.Fix bug </br>
2.New searchOrganization method</br>
3.New searchFriends method</br>
4.New getDepartmentInfo method</br>
5.New setGroupMemberRoleLevel method</br>
2022-06-14 17:42:15 +08:00
hrxiang
ed20b4915a 1.Fix bug </br>
2.New searchOrganization method</br>
3.New searchFriends method</br>
4.New getDepartmentInfo method</br>
5.New setGroupMemberRoleLevel method</br>
2022-06-14 17:40:26 +08:00
hrxiang
8b1f4dc320 Fix bug 2022-06-06 17:22:23 +08:00
hrxiang
f7416290fb Upgrade 2022-06-06 09:27:53 +08:00
82 changed files with 6450 additions and 644 deletions

View File

@@ -15,6 +15,21 @@
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.dart_tool" /> <excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.pub" /> <excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/build" /> <excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/build" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/build" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/build" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/build" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/build" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/build" />
</content> </content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />

View File

@@ -20,7 +20,6 @@
<root url="file://$USER_HOME$/Development/flutter/bin/cache/dart-sdk/lib/typed_data" /> <root url="file://$USER_HOME$/Development/flutter/bin/cache/dart-sdk/lib/typed_data" />
<root url="file://$USER_HOME$/Development/flutter/bin/cache/dart-sdk/lib/web_audio" /> <root url="file://$USER_HOME$/Development/flutter/bin/cache/dart-sdk/lib/web_audio" />
<root url="file://$USER_HOME$/Development/flutter/bin/cache/dart-sdk/lib/web_gl" /> <root url="file://$USER_HOME$/Development/flutter/bin/cache/dart-sdk/lib/web_gl" />
<root url="file://$USER_HOME$/Development/flutter/bin/cache/dart-sdk/lib/web_sql" />
</CLASSES> </CLASSES>
<JAVADOC /> <JAVADOC />
<SOURCES /> <SOURCES />

View File

@@ -1,9 +1,171 @@
## 2.3.5+3
- Fix bug for signaling
- Add networkChanged method
- Add setListenerForService method
## 2.3.5+2
- Add onRecvMessageExtensionsAdded method for OnAdvancedMsgListener
- Add addMessageReactionExtensions method for MessageManager
- Add getMessageListSomeReactionExtensions method for MessageManager
- Add isExternal field for MessageManager
- Add isReact method field MessageManager
- Add params isExternalExtensions for initSDK
## 2.3.5+1
- Add birthTime for UserInfo
- Add setMessageKvInfoListener method for MessageManager
- Add setMessageReactionExtensions method for MessageManager
- Add deleteMessageReactionExtensions method for MessageManager
- Add getMessageListReactionExtensions method for MessageManager
- Add onRecvMessageExtensionsChanged method for OnAdvancedMsgListener
- Add onRecvMessageExtensionsDeleted method for OnAdvancedMsgListener
- Add OnMessageKvInfoListener listener
- Add class KeyValue
- Add class UserExInfo
- Add class SingleTypeKeyInfoSum
- Add class MessageKv
- Add class TypeKeySetResult
- Add class MessageTypeKeyMapping
## 2.3.5
- Add setCustomBusinessListener method for MessageManager
- Add OnCustomBusinessListener listener
- Add message encryption config
- Add message compression config
- Add setGroupMemberInfo for GroupManager
## 2.3.4+6
- Add setAppBackgroundStatus method for IMManager
## 2.3.4+5
- Fix bug
- Add setOneConversationBurnDuration method for ConversationManager
- Add signalingSendCustomSignal method for SignalingManager
- Add onReceiveCustomSignal listener for OnSignalingListener
- Add burnDuration field for ConversationInfo
- Add burnDuration field for AttachedInfoElem
## 2.3.4+4
- Fix bug
- Replace maven repository address
## 2.3.4+3
- Fix bug
## 2.3.4+2
- Add streamChangedEvent listener for OnSignalingListener
- Add signalingJoinMeeting method for SignalingManager
- Add signalingCreateMeeting method for SignalingManager
- Add signalingOperateStream method for SignalingManager
- Add signalingGetMeetings method for SignalingManager
- Add signalingCloseRoom method for SignalingManager
- Add signalingUpdateMeetingInfo method for SignalingManager
- Update findMessageList method
- Add sendMessageNotOss method for MessageManager
- Add createImageMessageByURL method for MessageManager
- Add createSoundMessageByURL method for MessageManager
- Add createVideoMessageByURL method for MessageManager
- Add createFileMessageByURL method for MessageManager
## 2.3.4+1
- Add signalingGetTokenByRoomID method for SignalingManager
## 2.3.4
- Fix bug
- Add signalGetRoomByGroupID method for SignalingManager
- Add class RoomCallingInfo
- Add onRoomParticipantConnected listener for OnSignalingListener
- Add onRoomParticipantDisconnected listener for OnSignalingListener
- Add busyLineUserIDList field for SignalingCertificate
## 2.3.3
- Fix bug
## 2.3.2
- Fix bug
- Add createAdvancedQuoteMessage method for MessageManager
- Add createAdvancedTextMessage method for MessageManager
## 2.3.0+1
- Fix bug
- enum class MessageType new add customMsgNotTriggerConversation
- enum class MessageType new add customMsgOnlineOnly
- class IMManager new add updateFcmToken method
- class MessageManager new add findMessageList method
- initSDK method add encryptionKey param
## 2.3.0
- Fix bug
- Super group
- Add setGroupLookMemberInfo method for GroupManager
- Add setGroupApplyMemberFriend method for GroupManager
- Add getGroupOwnerAndAdmin method for GroupManager
- Add revokeMessageV2 method for MessageManager
- Add lookMemberInfo field for GroupInfo
- Add applyMemberFriend field for GroupInfo
- Add notificationUpdateTime field for GroupInfo
- Add notificationUserID field for GroupInfo
- Add inviterUserID field for GroupMembersInfo
- Add joinSource field for joinGroup method
- Add advanced revoke type
- Add recvMessageRevokedV2 callback for OnAdvancedMsgListener
- Add joinSource field for GroupApplicationInfo
- Add inviterUserID field for GroupApplicationInfo
- Add getAdvancedHistoryMessageList method for MessageManager
- Add searchGroupMembers method for GroupManager
## 2.2.0
1.Fix bug </br>
## 2.1.0+1
1.Add setGroupVerification method </br>
## 2.1.0
1.Fix bug </br>
2.Add getGroupMemberListByJoinTime method </br>
3.Add groupMemberCount field </br>
## 2.0.9+3
1.Fix bug </br>
2.Add setGlobalRecvMessageOpt method </br>
## 2.0.9+2
1.Fix bug </br>
2.Add searchOrganization method </br>
3.Add searchFriends method </br>
4.Add getDepartmentInfo method </br>
5.Add setGroupMemberRoleLevel method </br>
## 2.0.9+1
1.Fix bug </br>
## 2.0.9 ## 2.0.9
1.Fix bug </br> 1.Fix bug </br>
2.New organization fuction</br> 2.Add organization fuction </br>
3.New uploadImage method </br> 3.Add uploadImage method </br>
4.Fix login slow bug</br> 4.Fix login slow bug </br>
## 2.0.8 ## 2.0.8
@@ -13,38 +175,38 @@
## 2.0.0+6 ## 2.0.0+6
1.Fix bug</br> 1.Fix bug </br>
2.Adapter ios emulator</br> 2.Adapter ios emulator </br>
3.New modify group nickname</br> 3.Add modify group nickname </br>
4.Update at message</br> 4.Update at message </br>
5.ConverstaionInfo new add isNotInGroup field</br> 5.ConverstaionInfo new add isNotInGroup field</br>
6.New at type</br> 6.Add at type </br>
7.New work moments</br> 7.Add work moments </br>
8.New global search</br> 8.Add global search </br>
9.New getHistoryMessageListReverse method</br> 9.Add getHistoryMessageListReverse method </br>
10.New getAtAllTag method</br> 10.Add getAtAllTag method </br>
11.New resetConversationGroupAtType method</br> 11.Add resetConversationGroupAtType method </br>
12.New searchGroups method</br> 12.Add searchGroups method </br>
## 2.0.0+5 ## 2.0.0+5
1.New notification parse </br> 1.Add notification parse </br>
2.New deleteConversationFromLocalAndSvr method </br> 2.Add deleteConversationFromLocalAndSvr method </br>
3.New deleteMessageFromLocalAndSvr method </br> 3.Add deleteMessageFromLocalAndSvr method </br>
4.New deleteAllMsgFromLocal method </br> 4.Add deleteAllMsgFromLocal method </br>
5.New deleteAllMsgFromLocalAndSvr method </br> 5.Add deleteAllMsgFromLocalAndSvr method </br>
6.New clearC2CHistoryMessageFromLocalAndSvr method </br> 6.Add clearC2CHistoryMessageFromLocalAndSvr method </br>
7.New clearGroupHistoryMessageFromLocalAndSvr method </br> 7.Add clearGroupHistoryMessageFromLocalAndSvr method </br>
8.New markMessageAsReadByConID method </br> 8.Add markMessageAsReadByConID method </br>
9.New wakeUp method </br> 9.Add wakeUp method </br>
10.New deleteAllConversationFromLocal method </br> 10.Add deleteAllConversationFromLocal method </br>
## 2.0.0+4 ## 2.0.0+4
1.New dismiss group </br> 1.Add dismiss group </br>
2.New search local message </br> 2.Add search local message </br>
3.New private chat </br> 3.Add private chat </br>
4.New group mute 4.Add group mute
## 2.0.0+3 ## 2.0.0+3
@@ -53,8 +215,8 @@
## 2.0.0+2 ## 2.0.0+2
1.Fix some one crash </br> 1.Fix some one crash </br>
2.New add signaling function </br> 2.Add signaling function </br>
3.New add group have read receipt 3.Add group have read receipt
## 2.0.0+1 ## 2.0.0+1
@@ -81,13 +243,13 @@
## 1.0.8 ## 1.0.8
1.Upgrade sdk to 1.4.4. </br> 1.Upgrade sdk to 1.4.4. </br>
2.New and changed conversation return changed data and no longer return all data. </br> 2.Add changed conversation return changed data and no longer return all data. </br>
3.New conversation paging method. 3.Add conversation paging method.
## 1.0.7 ## 1.0.7
Upgrade sdk to 1.3.4 </br> Upgrade sdk to 1.3.4 </br>
New add method setConversationRecvMessageOpt and getConversationRecvMessageOpt Add method setConversationRecvMessageOpt and getConversationRecvMessageOpt
## 1.0.6 ## 1.0.6
@@ -125,36 +287,45 @@ Fix bug
## 0.0.9+5 ## 0.0.9+5
1. Android upgrade sdk to 0.0.17 </br> 1. Android upgrade sdk to 0.0.17 </br>
2. New add createFileMessageFromFullPath method 2. Add createFileMessageFromFullPath method
## 0.0.9+4 ## 0.0.9+4
Fix ios friendship params error Fix ios friendship params error
## 0.0.9+3 ## 0.0.9+3
Ios native remove method 'removeAdvancedMsgListener' Ios native remove method 'removeAdvancedMsgListener'
## 0.0.9+2 ## 0.0.9+2
1. Fix bug 1. Fix bug
2. Upgrade sdk 2. Upgrade sdk
## 0.0.9+1 ## 0.0.9+1
Fix bug Fix bug
## 0.0.9 ## 0.0.9
Add ios support Add ios support
## 0.0.8 ## 0.0.8
Upgrade sdk to 0.0.14 </br> Upgrade sdk to 0.0.14 </br>
Sending a message adds a retry mechanism Sending a message adds a retry mechanism
## 0.0.7 ## 0.0.7
1. Add a new method to obtain conversation id based on user id or group id </br> 1. Add a new method to obtain conversation id based on user id or group id </br>
2. Modify the type of conversation manager input parameter sessionType to int 2. Modify the type of conversation manager input parameter sessionType to int
## 0.0.6 ## 0.0.6
Fix bug Fix bug
## 0.0.5 ## 0.0.5
Upgrade sdk </br> Upgrade sdk </br>
Fix message error bug Fix message error bug
@@ -163,11 +334,14 @@ Fix message error bug
Replace the input parameters of the createCustomMessage method from Uint8List to Map Replace the input parameters of the createCustomMessage method from Uint8List to Map
## 0.0.3 ## 0.0.3
Upgrade sdk </br> Upgrade sdk </br>
Fix bug </br> Fix bug </br>
## 0.0.2 ## 0.0.2
1. Move the markSingleMessageHasRead, markGroupMessageHasRead and getTotalUnreadMsgCount methods from the MessageManager class to the ConversationManager class. </br>
1. Move the markSingleMessageHasRead, markGroupMessageHasRead and getTotalUnreadMsgCount methods
from the MessageManager class to the ConversationManager class. </br>
2. Modify the parameters of the setFriendInfo method. </br> 2. Modify the parameters of the setFriendInfo method. </br>
3. Modify the parameters of the createGroup and setGroupInfo methods. 3. Modify the parameters of the createGroup and setGroupInfo methods.

1785
README.md

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,208 @@
## SDK使用步骤 ## SDK使用步骤
##### 1初始化 #### 1[初始化](#initsdk%E5%88%9D%E5%A7%8B%E5%8C%96sdk)
#### 2[设置监听器](#%E7%9B%91%E5%90%AC%E5%99%A8%E8%AE%BE%E7%BD%AE)
#### 3[登录](#login%E7%99%BB%E5%BD%95)
## 类方法说明
#### IMManager初始化管理
| 方法 | 描述 |
| ---------------- | --------------------------------------------- |
| initSDK | 初始化SDK |
| unInitSDK | 反初始化SDK |
| login | 登录 |
| logout | 登出 |
| getLoginStatus | 获取登录状态 |
| getLoginUserID | 登录者用户ID |
| getLoginUserInfo | 登录者用户资料 |
| wakeUp | 唤醒socket通信当app从后台回到前台恢复通信 |
| uploadImage | 上传图片到服务器 |
#### UserManager用户信息管理
| 方法 | 描述 |
| --------------- | ------------------------ |
| setUserListener | 当前登录用户信息变更监听 |
| getUsersInfo | 根据userID获取用户资料 |
| getSelfUserInfo | 获取当前登录用户资料 |
| setSelfInfo | 修改当前登录用户资料 |
#### ConversationManager会话管理
| 方法 | 描述 |
| --------------------------------- | -------------------------------------- |
| setConversationListener | 会话监听 |
| getAllConversationList | 获取所有会话 |
| getConversationListSplit | 分页获取会话 |
| getOneConversation | 查询会话,如果会话不存在会自动生成一个 |
| getMultipleConversation | 根据会话id获取多个会话 |
| deleteConversation | 通过会话id删除指定会话 |
| setConversationDraft | 设置会话草稿 |
| pinConversation | 置顶会话 |
| markGroupMessageHasRead | 标记群聊会话已读 |
| getTotalUnreadMsgCount | 获取未读消息总数 |
| getConversationIDBySessionType | 查询会话id |
| setConversationRecvMessageOpt | 消息免打扰设置 |
| getConversationRecvMessageOpt | 查询免打扰状态 |
| setOneConversationPrivateChat | 阅后即焚 |
| deleteConversationFromLocalAndSvr | 删除本地以及服务器的会话 |
| deleteAllConversationFromLocal | 删除所有本地会话 |
| resetConversationGroupAtType | 重置强提醒标识 |
| getAtAllTag | 查询@所有人标识 |
| setGlobalRecvMessageOpt | 全局免打扰设置 |
#### FriendshipManager好友关系管理
| 方法 | 描述 |
| ---------------------------- | -------------------------------------------------- |
| setFriendshipListener | 好友关系监听 |
| getFriendsInfo | 查询好友信息 |
| addFriend | 发送一个好友请求,需要对方调用同意申请才能成为好友 |
| getRecvFriendApplicationList | 获取别人加我为好友的申请 |
| getSendFriendApplicationList | 获取我发出的好友申请 |
| getFriendList | 获取好友列表,返回的列表包含了已拉入黑名单的好友 |
| setFriendRemark | 设置好友备注 |
| addBlacklist | 加入黑名单 |
| getBlacklist | 获取黑名单列表 |
| removeBlacklist | 从黑名单移除 |
| checkFriend | 检查友好关系 |
| deleteFriend | 删除好友 |
| acceptFriendApplication | 接受好友请求 |
| refuseFriendApplication | 拒绝好友请求 |
| searchFriends | 查好友 |
#### GroupManager组/群关系管理)
| 方法 | 描述 |
| ---------------------------- | ---------------------------------------- |
| setGroupListener | 组关系监听 |
| inviteUserToGroup | 邀请进组,直接进组无需同意 |
| kickGroupMember | 移除组成员 |
| getGroupMembersInfo | 查询组成员资料 |
| getGroupMemberList | 分页获取组成员列表 |
| getJoinedGroupList | 查询已加入的组列表 |
| isJoinedGroup | 检查是否已加入组 |
| createGroup | 创建一个组 |
| setGroupInfo | 编辑组资料 |
| getGroupsInfo | 查询组信息 |
| joinGroup | 申请加入组,需要通过管理员/群组同意。 |
| quitGroup | 退出组 |
| transferGroupOwner | 转移组拥有者权限 |
| getRecvGroupApplicationList | 作为群主或者管理员,收到的群成员入群申请 |
| getSendGroupApplicationList | 获取自己发出的入群申请记录 |
| acceptGroupApplication | 管理员或者群主同意某人进入某群 |
| refuseGroupApplication | 管理员或者群主拒绝某人进入某群 |
| dismissGroup | 解散群 |
| changeGroupMute | 开启群禁言,所有群成员禁止发言 |
| changeGroupMemberMute | 禁言群成员 |
| setGroupMemberNickname | 设置群成员昵称 |
| searchGroups | 查询群 |
| setGroupMemberRoleLevel | 设置群成员权限 |
| getGroupMemberListByJoinTime | 根据加入时间分页获取组成员列表 |
#### MessageManager消息管理
| 方法 | 描述 |
| --------------------------------------- | ------------------------------------------------------------ |
| setAdvancedMsgListener | 消息监听 |
| setMsgSendProgressListener | 消息发送进度监听 |
| sendMessage | 发送消息 |
| getHistoryMessageList | 获取聊天记录(以startMsg为节点以前的聊天记录) |
| revokeMessage | 撤回消息 |
| deleteMessageFromLocalStorage | 删除本地消息 |
| insertSingleMessageToLocalStorage | 插入单聊消息到本地 |
| insertGroupMessageToLocalStorage | 插入群聊消息到本地 |
| markC2CMessageAsRead | 标记c2c单条消息已读 |
| markGroupMessageAsRead | 标记群聊消息已读 |
| typingStatusUpdate | 正在输入提示 |
| createTextMessage | 创建文本消息 |
| createTextAtMessage | 创建@消息 |
| createImageMessage | 创建图片消息 |
| createImageMessageFromFullPath | 创建图片消息 |
| createSoundMessage | 创建语音消息 |
| createSoundMessageFromFullPath | 创建语音消息 |
| createVideoMessage | 创建视频消息 |
| createVideoMessageFromFullPath | 创建视频消息 |
| createFileMessage | 创建文件消息 |
| createFileMessageFromFullPath | 创建文件消息 |
| createMergerMessage | 创建合并消息 |
| createForwardMessage | 创建转发消息 |
| createLocationMessage | 创建位置消息 |
| createCustomMessage | 创建自定义消息 |
| createQuoteMessage | 创建引用消息 |
| createCardMessage | 创建卡片消息 |
| createFaceMessage | 创建自定义表情消息 |
| clearC2CHistoryMessage | 清空单聊消息记录 |
| clearGroupHistoryMessage | 清空组消息记录 |
| searchLocalMessages | 搜索消息 |
| deleteMessageFromLocalAndSvr | 删除本地跟服务器的指定的消息 |
| deleteAllMsgFromLocal | 删除本地所有聊天记录 |
| deleteAllMsgFromLocalAndSvr | 删除本地跟服务器所有聊天记录 |
| markMessageAsReadByConID | 标记消息已读 |
| clearC2CHistoryMessageFromLocalAndSvr | 删除本地跟服务器的单聊聊天记录 |
| clearGroupHistoryMessageFromLocalAndSvr | 删除本地跟服务器的群聊天记录 |
| getHistoryMessageListReverse | 获取聊天记录(以startMsg为节点新收到的聊天记录),用在全局搜索定位某一条消息,然后此条消息后新增的消息 |
#### OrganizationManager组织架构管理
| 方法 | 描述 |
| ----------------------- | ---------------------------------------------- |
| setOrganizationListener | 组织架构发生变化回调 |
| getSubDept | 获取子部门列表,返回当前部门下的一级子部门 |
| getDeptMember | 获取部门下的成员列表,返回当前部门下的一级成员 |
| getUserInDept | 获取成员所在的部门 |
| getDeptMemberAndSubDept | 获取部门下的子部门跟员工 |
| getDeptInfo | 查询部门信息 |
| searchOrganization | 搜索组织人员 |
#### SignalingManager信令管理
| 方法 | 描述 |
| ---------------------- | ------------------------ |
| setSignalingListener | 信令监听 |
| signalingInvite | 邀请个人加入音视频 |
| signalingInviteInGroup | 邀请群里某些人加入音视频 |
| signalingAccept | 同意某人音视频邀请 |
| signalingReject | 拒绝某人音视频邀请 |
| signalingCancel | 邀请者取消音视频通话 |
| signalingHungUp | 挂断 |
#### WorkMomentsManager朋友圈管理
| 方法 | 描述 |
| ---------------------------- | ---------------------- |
| setWorkMomentsListener | 朋友圈信息发送变化通知 |
| getWorkMomentsUnReadCount | 获取朋友圈未读消息总数 |
| getWorkMomentsNotification | 获取通知列表 |
| clearWorkMomentsNotification | 清除通知列表 |
## 方法名、参数、返回值说明
- ##### initSDK初始化SDK
``` ```
OpenIM.iMManager.initSDK( OpenIM.iMManager.initSDK(
@@ -34,126 +236,12 @@ OpenIM.iMManager.initSDK(
}); });
``` ```
##### 2设置监听器
- ##### login登录
``` ```
OpenIM.iMManager OpenIM.iMManager.login(
..userManager.setUserListener(OnUserListener(
onSelfInfoUpdated: (userInfo) {
// 当前登录用户资料变更回调
},
))
..messageManager.setAdvancedMsgListener(OnAdvancedMsgListener(
onRecvNewMessage: (message) {
// 收到新消息,界面添加新消息
},
onRecvMessageRevoked: (messageID) {
// 消息成功撤回,从界面移除消息
},
onRecvC2CReadReceipt: (list) {
// 消息被阅读回执,将消息标记为已读
},
))
..messageManager.setMsgSendProgressListener(OnMsgSendProgressListener(
onProgress: (messageID, progress) {
// 消息发送进度回调
},
))
..friendshipManager.setFriendshipListener(OnFriendshipListener(
onFriendApplicationRejected: (applicationInfo) {
// 发出或收到的好友申请被拒绝
},
onFriendApplicationDeleted: (applicationInfo) {
// 发出或收到的好友申请被删除
},
onFriendApplicationAdded: (applicationInfo) {
// 发出或收到的好友申请被添加
},
onFriendApplicationAccepted: (applicationInfo) {
// 发出或收到的好友申请已同意
},
onFriendAdded: (frinedInfo) {
// 好友被添加
},
onFriendDeleted: (frinedInfo) {
// 好友被删除
},
onFriendInfoChanged: (frinedInfo) {
// 朋友的资料发生变化
},
onBlacklistDeleted: (blackInfo) {
// 从黑名单删除
},
onBlacklistAdded: (blackInfo) {
// 拉入黑名单
},
))
..conversationManager.setConversationListener(OnConversationListener(
onNewConversation: (list) {
// 新增会话
},
onConversationChanged: (list) {
// 已添加的会话发送改变
},
onTotalUnreadMessageCountChanged: (count) {
// 未读消息数发送变化
},
))
..groupManager.setGroupListener(OnGroupListener(
onGroupMemberInfoChanged: (memberInfo) {
// 组成员信息发生变化
},
onGroupMemberDeleted: (memberInfo) {
// 组成员退出
},
onGroupMemberAdded: (memberInfo) {
// 组成员进入
},
onGroupApplicationRejected: (applicationInfo) {
// 发出或收到的组申请被拒绝
},
onGroupApplicationDeleted: (applicationInfo) {
// 发出或收到的组申请被删除
},
onGroupApplicationAdded: (applicationInfo) {
// 发出或收到的组申请有新增
},
onGroupApplicationAccepted: (applicationInfo) {
// 发出或收到的组申请被接受
},
onJoinedGroupDeleted: (groupInfo) {
// 退出群:退出者收到;踢出群:被踢者收到
},
onJoinedGroupAdded: (groupInfo) {
// 创建群: 初始成员收到;邀请进群:被邀请者收到
},
onGroupInfoChanged: (groupInfo) {
// 组资料变更
},
))
..signalingManager.setSignalingListener(OnSignalingListener(
onReceiveNewInvitation: (info) {
// 被邀请者收到:音视频通话邀请
},
onInviteeRejected: (info) {
// 邀请者收到:被邀请者拒绝音视频通话
},
onInviteeAccepted: (info) {
// 邀请者收到:被邀请者同意音视频通话
},
onInvitationTimeout: (info) {
// 邀请者收到:被邀请者超时未接通
},
onInvitationCancelled: (info) {
// 被邀请者收到:邀请者取消音视频通话
},
));
```
##### 3登录
```
OpenIM.iMManager.login(
uid: "", // uid来自于自身业务服务器 uid: "", // uid来自于自身业务服务器
token: "", // token需要业务服务器根据secret向OpenIM服务端交换获取 token: "", // token需要业务服务器根据secret向OpenIM服务端交换获取
).then((userInfo) { ).then((userInfo) {
@@ -163,10 +251,6 @@ OpenIM.iMManager
## 方法名、参数、返回值说明
- ##### logout 登出) - ##### logout 登出)
``` ```
@@ -441,7 +525,7 @@ OpenIM.iMManager.conversationManager.deleteAllConversationFromLocal(
- ##### resetConversationGroupAtType - ##### resetConversationGroupAtType(重置会话强提示标识位)
``` ```
OpenIM.iMManager.conversationManager.resetConversationGroupAtType( OpenIM.iMManager.conversationManager.resetConversationGroupAtType(
@@ -455,7 +539,7 @@ OpenIM.iMManager.conversationManager.resetConversationGroupAtType(
- ##### getAtAllTag - ##### getAtAllTag@所有标识
``` ```
OpenIM.iMManager.conversationManager.getAtAllTag(); OpenIM.iMManager.conversationManager.getAtAllTag();
@@ -463,6 +547,16 @@ OpenIM.iMManager.conversationManager.getAtAllTag();
- ##### setGlobalRecvMessageOpt设置全局免打扰状态
```
OpenIM.iMManager.conversationManager.setGlobalRecvMessageOpt(
status: status,// 0正常1不接受消息2接受在线消息不接受离线消息
);
```
- ##### simpleSort自定义会话排序规则 - ##### simpleSort自定义会话排序规则
``` ```
@@ -659,6 +753,18 @@ OpenIM.iMManager.friendshipManager.acceptFriendApplication(
- ##### searchFriends搜索好友
```
var list = await OpenIM.iMManager.friendshipManager.searchFriends(
keywordList: [searchCtrl.text.trim()],//关键词
isSearchNickname: true,//按昵称查找
isSearchRemark: true,//按备注查找
);
```
- ##### inviteUserToGroup邀请进组 - ##### inviteUserToGroup邀请进组
直接进组无需同意。 直接进组无需同意。
@@ -780,6 +886,7 @@ OpenIM.iMManager.groupManager.setGroupInfo(
notification: '', // 群公告 notification: '', // 群公告
introduction: '', // 群简介 introduction: '', // 群简介
ex: '', // 扩展信息 ex: '', // 扩展信息
needVerification: '',// 进群验证设置
); );
``` ```
@@ -960,6 +1067,33 @@ List<GroupInfo> list = await OpenIM.iMManager.groupManager.searchGroups(
- ##### setGroupMemberRoleLevel设置群成员角色
```
OpenIM.iMManager.groupManager.setGroupMemberRoleLevel(
groupID: groupID,
userID: userID,
roleLevel: GroupRoleLevel.member,
)
```
- ##### getGroupMemberListByJoinTime根据加入时间分页获取组成员列表
```
// 如:获取消息发送前入群的成员,用于查看消息未读列表
var list = await OpenIM.iMManager.groupManager.getGroupMemberListByJoinTime(
groupID: message.groupID!,
joinTimeEnd: message.sendTime! ~/ 1000,
offset: 0,
count: 40,
excludeUserIDList: [...hasReadIDList, OpenIM.iMManager.uid],// 排除的人员
);
```
- ##### sendMessage发送消息 - ##### sendMessage发送消息
``` ```
@@ -1354,6 +1488,7 @@ OpenIM.iMManager.messageManager.clearGroupHistoryMessageFromLocalAndSvr(
- ##### getHistoryMessageListReverse获取新的聊天记录 - ##### getHistoryMessageListReverse获取新的聊天记录
``` ```
// 获取聊天记录(以startMsg为节点新收到的聊天记录),用在全局搜索定位某一条消息,然后此条消息后新增的消息
OpenIM.iMManager.messageManager.getHistoryMessageListReverse( OpenIM.iMManager.messageManager.getHistoryMessageListReverse(
userID: '', // 单聊对象的userID userID: '', // 单聊对象的userID
groupID: '', // 群聊的组id groupID: '', // 群聊的组id
@@ -1424,3 +1559,217 @@ OpenIM.iMManager.signalingManager.signalingHungUp(
); );
``` ```
- ##### getSubDept获取子部门列表返回当前部门下的一级子部门
```
var list = await OpenIM.iMManager.organizationManager.getSubDept(
departmentID: '', // 部门id
offset: 0, // 开始下标
count: 40, // 每页大小
);
```
- ##### getDeptMember获取部门下的成员列表返回当前部门下的一级成员
```
var list = await OpenIM.iMManager.organizationManager.getDeptMember(
departmentID: '', // 部门id
offset: 0, // 开始下标
count: 40, // 每页大小
);
```
- ##### getUserInDept获取成员所在的部门
```
var list = await OpenIM.iMManager.organizationManager.getUserInDept(
userID: '', // 成员id
);
```
- ##### getDeptMemberAndSubDept获取部门下的子部门跟员工
```
var detail = await OpenIM.iMManager.organizationManager.getDeptMemberAndSubDept(
departmentID: '', // 部门id
);
```
- ##### getDeptInfo查询部门信息
```
var info = await OpenIM.iMManager.organizationManager.getDeptInfo(
departmentID: '', // 部门id
);
```
- ##### searchOrganization搜索组织人员
```
var result = await OpenIM.iMManager.organizationManager.searchOrganization(
keyWord: searchCtrl.text.trim(),
isSearchUserName: true,
isSearchEnglishName: true,
isSearchPosition: true,
offset: offset,
count: count,
);
```
- ##### getWorkMomentsUnReadCount获取朋友圈未读消息总数
```
var count = await OpenIM.iMManager.workMomentsManager.getWorkMomentsUnReadCount();
```
- ##### getWorkMomentsNotification获取朋友圈通知列表
```
var list = await OpenIM.iMManager.workMomentsManager.getWorkMomentsNotification(
offset:0,//开始下标
count:40,//每页大小
);
```
- ##### clearWorkMomentsNotification清除朋友圈通知列表
```
OpenIM.iMManager.workMomentsManager.clearWorkMomentsNotification();
```
- ##### 监听器设置
```
OpenIM.iMManager
..userManager.setUserListener(OnUserListener(
onSelfInfoUpdated: (userInfo) {
// 当前登录用户资料变更回调
},
))
..messageManager.setAdvancedMsgListener(OnAdvancedMsgListener(
onRecvNewMessage: (message) {
// 收到新消息,界面添加新消息
},
onRecvMessageRevoked: (messageID) {
// 消息成功撤回,从界面移除消息
},
onRecvC2CReadReceipt: (list) {
// 消息被阅读回执,将消息标记为已读
},
))
..messageManager.setMsgSendProgressListener(OnMsgSendProgressListener(
onProgress: (messageID, progress) {
// 消息发送进度回调
},
))
..friendshipManager.setFriendshipListener(OnFriendshipListener(
onFriendApplicationRejected: (applicationInfo) {
// 发出或收到的好友申请被拒绝
},
onFriendApplicationDeleted: (applicationInfo) {
// 发出或收到的好友申请被删除
},
onFriendApplicationAdded: (applicationInfo) {
// 发出或收到的好友申请被添加
},
onFriendApplicationAccepted: (applicationInfo) {
// 发出或收到的好友申请已同意
},
onFriendAdded: (frinedInfo) {
// 好友被添加
},
onFriendDeleted: (frinedInfo) {
// 好友被删除
},
onFriendInfoChanged: (frinedInfo) {
// 朋友的资料发生变化
},
onBlacklistDeleted: (blackInfo) {
// 从黑名单删除
},
onBlacklistAdded: (blackInfo) {
// 拉入黑名单
},
))
..conversationManager.setConversationListener(OnConversationListener(
onNewConversation: (list) {
// 新增会话
},
onConversationChanged: (list) {
// 已添加的会话发送改变
},
onTotalUnreadMessageCountChanged: (count) {
// 未读消息数发送变化
},
))
..groupManager.setGroupListener(OnGroupListener(
onGroupMemberInfoChanged: (memberInfo) {
// 组成员信息发生变化
},
onGroupMemberDeleted: (memberInfo) {
// 组成员退出
},
onGroupMemberAdded: (memberInfo) {
// 组成员进入
},
onGroupApplicationRejected: (applicationInfo) {
// 发出或收到的组申请被拒绝
},
onGroupApplicationDeleted: (applicationInfo) {
// 发出或收到的组申请被删除
},
onGroupApplicationAdded: (applicationInfo) {
// 发出或收到的组申请有新增
},
onGroupApplicationAccepted: (applicationInfo) {
// 发出或收到的组申请被接受
},
onJoinedGroupDeleted: (groupInfo) {
// 退出群:退出者收到;踢出群:被踢者收到
},
onJoinedGroupAdded: (groupInfo) {
// 创建群: 初始成员收到;邀请进群:被邀请者收到
},
onGroupInfoChanged: (groupInfo) {
// 组资料变更
},
))
..signalingManager.setSignalingListener(OnSignalingListener(
onReceiveNewInvitation: (info) {
// 被邀请者收到:音视频通话邀请
},
onInviteeRejected: (info) {
// 邀请者收到:被邀请者拒绝音视频通话
},
onInviteeAccepted: (info) {
// 邀请者收到:被邀请者同意音视频通话
},
onInvitationTimeout: (info) {
// 邀请者收到:被邀请者超时未接通
},
onInvitationCancelled: (info) {
// 被邀请者收到:邀请者取消音视频通话
},
));
```

View File

@@ -1,12 +1,21 @@
group 'io.openim.flutter_openim_sdk' group 'io.openim.flutter_openim_sdk'
version '1.0' version '1.0'
def dir = getCurrentProjectDir()
// 将aar放到libs本地仓库替换远程仓库
def getCurrentProjectDir() {
String result = ""
rootProject.allprojects { project ->
if (project.properties.get("name").toString() == "flutter_openim_sdk") {
result = project.properties.get("projectDir").toString()
}
}
return result
}
buildscript { buildscript {
repositories { repositories {
maven {
url 'http://121.37.25.71:8081/repository/maven2/'
allowInsecureProtocol = true
}
google() google()
mavenCentral() mavenCentral()
} }
@@ -18,10 +27,9 @@ buildscript {
rootProject.allprojects { rootProject.allprojects {
repositories { repositories {
maven { // 将aar放到libs本地仓库替换远程仓库
url 'http://121.37.25.71:8081/repository/maven2/' // maven { url "$dir/libs" }
allowInsecureProtocol = true maven { url 'https://open-im-online.rentsoft.cn:51000/repository/maven2/' }
}
google() google()
mavenCentral() mavenCentral()
} }
@@ -40,6 +48,9 @@ android {
targetCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8
} }
} }
dependencies { dependencies {
implementation 'io.openim:core-sdk:2.0.9.6@aar' // 本地依赖现将aar复制到libs/io/openim/core-sdk/0.0.1/ 下命名core-sdk-0.0.1.aar
// implementation 'io.openim:core-sdk:0.0.1@aar'
api 'io.openim:core-sdk:2.3.5-t34@aar'
} }

View File

@@ -0,0 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.openim</groupId>
<artifactId>core-sdk</artifactId>
<version>0.0.1</version>
</project>

View File

@@ -13,6 +13,14 @@ public class OnAdvancedMsgListener implements open_im_sdk_callback.OnAdvancedMsg
this.id = listenerId; this.id = listenerId;
} }
@Override
public void onNewRecvMessageRevoked(String s) {
final Map<String, String> values = new ArrayMap<>();
values.put("id", id);
values.put("revokedMessageV2", s);
CommonUtil.emitEvent("advancedMsgListener", "onNewRecvMessageRevoked", values);
}
@Override @Override
public void onRecvC2CReadReceipt(String s) { public void onRecvC2CReadReceipt(String s) {
final Map<String, String> values = new ArrayMap<>(); final Map<String, String> values = new ArrayMap<>();
@@ -29,6 +37,33 @@ public class OnAdvancedMsgListener implements open_im_sdk_callback.OnAdvancedMsg
CommonUtil.emitEvent("advancedMsgListener", "onRecvGroupReadReceipt", values); CommonUtil.emitEvent("advancedMsgListener", "onRecvGroupReadReceipt", values);
} }
@Override
public void onRecvMessageExtensionsAdded(String s, String s1) {
final Map<String, String> values = new ArrayMap<>();
values.put("id", id);
values.put("msgID", s);
values.put("list", s1);
CommonUtil.emitEvent("advancedMsgListener", "onRecvMessageExtensionsAdded", values);
}
@Override
public void onRecvMessageExtensionsChanged(String s, String s1) {
final Map<String, String> values = new ArrayMap<>();
values.put("id", id);
values.put("msgID", s);
values.put("list", s1);
CommonUtil.emitEvent("advancedMsgListener", "onRecvMessageExtensionsChanged", values);
}
@Override
public void onRecvMessageExtensionsDeleted(String s, String s1) {
final Map<String, String> values = new ArrayMap<>();
values.put("id", id);
values.put("msgID", s);
values.put("list", s1);
CommonUtil.emitEvent("advancedMsgListener", "onRecvMessageExtensionsDeleted", values);
}
@Override @Override
public void onRecvMessageRevoked(String s) { public void onRecvMessageRevoked(String s) {
final Map<String, String> values = new ArrayMap<>(); final Map<String, String> values = new ArrayMap<>();

View File

@@ -0,0 +1,10 @@
package io.openim.flutter_openim_sdk.listener;
import io.openim.flutter_openim_sdk.util.CommonUtil;
public class OnCustomBusinessListener implements open_im_sdk_callback.OnCustomBusinessListener {
@Override
public void onRecvCustomBusinessMessage(String s) {
CommonUtil.emitEvent("customBusinessListener", "onRecvCustomBusinessMessage", s);
}
}

View File

@@ -0,0 +1,30 @@
package io.openim.flutter_openim_sdk.listener;
import io.openim.flutter_openim_sdk.util.CommonUtil;
public class OnListenerForService implements open_im_sdk_callback.OnListenerForService {
@Override
public void onFriendApplicationAccepted(String s) {
CommonUtil.emitEvent("listenerForService", "onFriendApplicationAccepted", s);
}
@Override
public void onFriendApplicationAdded(String s) {
CommonUtil.emitEvent("listenerForService", "onFriendApplicationAdded", s);
}
@Override
public void onGroupApplicationAccepted(String s) {
CommonUtil.emitEvent("listenerForService", "onGroupApplicationAccepted", s);
}
@Override
public void onGroupApplicationAdded(String s) {
CommonUtil.emitEvent("listenerForService", "onGroupApplicationAdded", s);
}
@Override
public void onRecvNewMessage(String s) {
CommonUtil.emitEvent("listenerForService", "onRecvNewMessage", s);
}
}

View File

@@ -0,0 +1,12 @@
package io.openim.flutter_openim_sdk.listener;
import io.openim.flutter_openim_sdk.util.CommonUtil;
public class OnMessageKvInfoListener implements open_im_sdk_callback.OnMessageKvInfoListener {
// 经过聚合后的kv计算了总数判断了是否包含自己
@Override
public void onMessageKvInfoChanged(String s) {
CommonUtil.emitEvent("messageKvInfoListener", "onMessageKvInfoChanged", s);
}
}

View File

@@ -34,11 +34,31 @@ public class OnSignalingListener implements open_im_sdk_callback.OnSignalingList
CommonUtil.emitEvent("signalingListener", "onInviteeRejectedByOtherDevice", s); CommonUtil.emitEvent("signalingListener", "onInviteeRejectedByOtherDevice", s);
} }
@Override
public void onReceiveCustomSignal(String s) {
CommonUtil.emitEvent("signalingListener", "onReceiveCustomSignal", s);
}
@Override @Override
public void onReceiveNewInvitation(String s) { public void onReceiveNewInvitation(String s) {
CommonUtil.emitEvent("signalingListener", "onReceiveNewInvitation", s); CommonUtil.emitEvent("signalingListener", "onReceiveNewInvitation", s);
} }
@Override
public void onRoomParticipantConnected(String s) {
CommonUtil.emitEvent("signalingListener", "onRoomParticipantConnected", s);
}
@Override
public void onRoomParticipantDisconnected(String s) {
CommonUtil.emitEvent("signalingListener", "onRoomParticipantDisconnected", s);
}
@Override
public void onStreamChange(String s) {
CommonUtil.emitEvent("signalingListener", "onStreamChange", s);
}
@Override @Override
public void onHangUp(String s) { public void onHangUp(String s) {
CommonUtil.emitEvent("signalingListener", "onHangUp", s); CommonUtil.emitEvent("signalingListener", "onHangUp", s);

View File

@@ -18,7 +18,10 @@ class BaseManager {
} }
static Long int2long(MethodCall methodCall, String key) { static Long int2long(MethodCall methodCall, String key) {
Integer i = value(methodCall, key); Object i = value(methodCall, key);
return Long.valueOf(i); if (i instanceof Long) {
return (Long) i;
}
return Long.valueOf((Integer) i);
} }
} }

View File

@@ -11,6 +11,8 @@ public class ConversationManager extends BaseManager {
public void setConversationListener(MethodCall methodCall, MethodChannel.Result result) { public void setConversationListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setConversationListener(new OnConversationListener()); Open_im_sdk.setConversationListener(new OnConversationListener());
result.success(null);
} }
@@ -154,4 +156,21 @@ public class ConversationManager extends BaseManager {
public void getAtAllTag(MethodCall methodCall, MethodChannel.Result result) { public void getAtAllTag(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, Open_im_sdk.getAtAllTag()); CommonUtil.runMainThreadReturn(result, Open_im_sdk.getAtAllTag());
} }
public void setGlobalRecvMessageOpt(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGlobalRecvMessageOpt(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
int2long(methodCall, "status")
);
}
public void setOneConversationBurnDuration(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setOneConversationBurnDuration(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID"),
value(methodCall, "burnDuration")
);
}
} }

View File

@@ -11,6 +11,8 @@ public class FriendshipManager extends BaseManager {
public void setFriendListener(MethodCall methodCall, MethodChannel.Result result) { public void setFriendListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setFriendListener(new OnFriendshipListener()); Open_im_sdk.setFriendListener(new OnFriendshipListener());
result.success(null);
} }
public void getFriendsInfo(MethodCall methodCall, MethodChannel.Result result) { public void getFriendsInfo(MethodCall methodCall, MethodChannel.Result result) {
@@ -112,4 +114,12 @@ public class FriendshipManager extends BaseManager {
jsonValue(methodCall) jsonValue(methodCall)
); );
} }
public void searchFriends(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.searchFriends(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "searchParam")
);
}
} }

View File

@@ -10,6 +10,8 @@ public class GroupManager extends BaseManager {
public void setGroupListener(MethodCall methodCall, MethodChannel.Result result) { public void setGroupListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGroupListener(new OnGroupListener()); Open_im_sdk.setGroupListener(new OnGroupListener());
result.success(null);
} }
public void inviteUserToGroup(MethodCall methodCall, MethodChannel.Result result) { public void inviteUserToGroup(MethodCall methodCall, MethodChannel.Result result) {
@@ -91,7 +93,8 @@ public class GroupManager extends BaseManager {
new OnBaseListener(result, methodCall), new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
value(methodCall, "gid"), value(methodCall, "gid"),
value(methodCall, "reason") value(methodCall, "reason"),
value(methodCall, "joinSource")
); );
} }
@@ -190,4 +193,70 @@ public class GroupManager extends BaseManager {
jsonValue(methodCall, "searchParam") jsonValue(methodCall, "searchParam")
); );
} }
public void setGroupMemberRoleLevel(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGroupMemberRoleLevel(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID"),
value(methodCall, "userID"),
int2long(methodCall, "roleLevel")
);
}
public void getGroupMemberListByJoinTimeFilter(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getGroupMemberListByJoinTimeFilter(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID"),
value(methodCall, "offset"),
value(methodCall, "count"),
int2long(methodCall, "joinTimeBegin"),
int2long(methodCall, "joinTimeEnd"),
jsonValue(methodCall, "excludeUserIDList")
);
}
public void setGroupVerification(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGroupVerification(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID"),
value(methodCall, "needVerification")
);
}
public void setGroupLookMemberInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGroupLookMemberInfo(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID"),
value(methodCall, "status")
);
}
public void setGroupApplyMemberFriend(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGroupApplyMemberFriend(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID"),
value(methodCall, "status")
);
}
public void getGroupMemberOwnerAndAdmin(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getGroupMemberOwnerAndAdmin(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID")
);
}
public void searchGroupMembers(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.searchGroupMembers(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "searchParam")
);
}
public void setGroupMemberInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGroupMemberInfo(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "info")
);
}
} }

View File

@@ -4,6 +4,7 @@ import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel;
import io.openim.flutter_openim_sdk.listener.OnBaseListener; import io.openim.flutter_openim_sdk.listener.OnBaseListener;
import io.openim.flutter_openim_sdk.listener.OnConnListener; import io.openim.flutter_openim_sdk.listener.OnConnListener;
import io.openim.flutter_openim_sdk.listener.OnListenerForService;
import io.openim.flutter_openim_sdk.util.CommonUtil; import io.openim.flutter_openim_sdk.util.CommonUtil;
import open_im_sdk.Open_im_sdk; import open_im_sdk.Open_im_sdk;
@@ -53,4 +54,35 @@ public class IMManager extends BaseManager {
value(methodCall, "obj") value(methodCall, "obj")
); );
} }
public void updateFcmToken(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.updateFcmToken(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "fcmToken")
);
}
public void setAppBackgroundStatus(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setAppBackgroundStatus(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "isBackground")
);
}
public void networkChanged(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.networkChanged(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
}
public void setListenerForService(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setListenerForService(new OnListenerForService());
result.success(null);
}
} }

View File

@@ -4,6 +4,8 @@ import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel;
import io.openim.flutter_openim_sdk.listener.OnAdvancedMsgListener; import io.openim.flutter_openim_sdk.listener.OnAdvancedMsgListener;
import io.openim.flutter_openim_sdk.listener.OnBaseListener; import io.openim.flutter_openim_sdk.listener.OnBaseListener;
import io.openim.flutter_openim_sdk.listener.OnCustomBusinessListener;
import io.openim.flutter_openim_sdk.listener.OnMessageKvInfoListener;
import io.openim.flutter_openim_sdk.listener.OnMsgSendListener; import io.openim.flutter_openim_sdk.listener.OnMsgSendListener;
import io.openim.flutter_openim_sdk.util.CommonUtil; import io.openim.flutter_openim_sdk.util.CommonUtil;
import open_im_sdk.Open_im_sdk; import open_im_sdk.Open_im_sdk;
@@ -11,6 +13,7 @@ import open_im_sdk.Open_im_sdk;
public class MessageManager extends BaseManager { public class MessageManager extends BaseManager {
private final static String KEY_ID = "id"; private final static String KEY_ID = "id";
// private final static Map<String, OnAdvancedMsgListener> listeners = new HashMap<>(); // private final static Map<String, OnAdvancedMsgListener> listeners = new HashMap<>();
/* private static boolean initializedListener = false; /* private static boolean initializedListener = false;
private final static Map<String, AdvancedMsgListener> listeners = new ConcurrentHashMap<>(); private final static Map<String, AdvancedMsgListener> listeners = new ConcurrentHashMap<>();
@@ -82,6 +85,8 @@ public class MessageManager extends BaseManager {
public void setAdvancedMsgListener(MethodCall methodCall, MethodChannel.Result result) { public void setAdvancedMsgListener(MethodCall methodCall, MethodChannel.Result result) {
String key = methodCall.argument(KEY_ID); String key = methodCall.argument(KEY_ID);
Open_im_sdk.setAdvancedMsgListener(new OnAdvancedMsgListener(key)); Open_im_sdk.setAdvancedMsgListener(new OnAdvancedMsgListener(key));
result.success(null);
} }
public void sendMessage(MethodCall methodCall, MethodChannel.Result result) { public void sendMessage(MethodCall methodCall, MethodChannel.Result result) {
@@ -201,6 +206,7 @@ public class MessageManager extends BaseManager {
value(methodCall, "operationID"), value(methodCall, "operationID"),
value(methodCall, "imagePath"))); value(methodCall, "imagePath")));
} }
public void createSoundMessage(MethodCall methodCall, MethodChannel.Result result) { public void createSoundMessage(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createSoundMessage( Open_im_sdk.createSoundMessage(
@@ -389,4 +395,144 @@ public class MessageManager extends BaseManager {
jsonValue(methodCall) jsonValue(methodCall)
); );
} }
public void newRevokeMessage(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.newRevokeMessage(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall)
);
}
public void getAdvancedHistoryMessageList(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getAdvancedHistoryMessageList(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall)
);
}
public void findMessageList(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.findMessageList(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "searchParams")
);
}
public void createAdvancedTextMessage(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createAdvancedTextMessage(
value(methodCall, "operationID"),
value(methodCall, "text"),
jsonValue(methodCall, "richMessageInfoList")
));
}
public void createAdvancedQuoteMessage(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createAdvancedQuoteMessage(
value(methodCall, "operationID"),
value(methodCall, "quoteText"),
jsonValue(methodCall, "quoteMessage"),
jsonValue(methodCall, "richMessageInfoList")
));
}
public void sendMessageNotOss(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.sendMessageNotOss(
new OnMsgSendListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "message"),
value(methodCall, "userID"),
value(methodCall, "groupID"),
jsonValue(methodCall, "offlinePushInfo")
);
}
public void createImageMessageByURL(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createImageMessageByURL(
value(methodCall, "operationID"),
jsonValue(methodCall, "sourcePicture"),
jsonValue(methodCall, "bigPicture"),
jsonValue(methodCall, "snapshotPicture")));
}
public void createSoundMessageByURL(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createSoundMessageByURL(
value(methodCall, "operationID"),
jsonValue(methodCall, "soundElem")));
}
public void createVideoMessageByURL(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createVideoMessageByURL(
value(methodCall, "operationID"),
jsonValue(methodCall, "videoElem")));
}
public void createFileMessageByURL(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createFileMessageByURL(
value(methodCall, "operationID"),
jsonValue(methodCall, "fileElem")));
}
public void setCustomBusinessListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setCustomBusinessListener(new OnCustomBusinessListener());
result.success(null);
}
public void setMessageKvInfoListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setMessageKvInfoListener(new OnMessageKvInfoListener());
result.success(null);
}
public void setMessageReactionExtensions(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setMessageReactionExtensions(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "message"),
jsonValue(methodCall, "list")
);
}
public void deleteMessageReactionExtensions(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.deleteMessageReactionExtensions(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "message"),
jsonValue(methodCall, "list")
);
}
public void getMessageListReactionExtensions(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getMessageListReactionExtensions(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "messageList")
);
}
public void addMessageReactionExtensions(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.addMessageReactionExtensions(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "message"),
jsonValue(methodCall, "list")
);
}
public void getMessageListSomeReactionExtensions(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getMessageListSomeReactionExtensions(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "messageList"),
jsonValue(methodCall, "list")
);
}
} }

View File

@@ -10,6 +10,8 @@ public class OrganizationManager extends BaseManager {
public void setOrganizationListener(MethodCall methodCall, MethodChannel.Result result) { public void setOrganizationListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setOrganizationListener(new OnOrganizationListener()); Open_im_sdk.setOrganizationListener(new OnOrganizationListener());
result.success(null);
} }
public void getSubDepartment(MethodCall methodCall, MethodChannel.Result result) { public void getSubDepartment(MethodCall methodCall, MethodChannel.Result result) {
@@ -47,4 +49,22 @@ public class OrganizationManager extends BaseManager {
value(methodCall, "departmentID") value(methodCall, "departmentID")
); );
} }
public void getDepartmentInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getDepartmentInfo(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "departmentID")
);
}
public void searchOrganization(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.searchOrganization(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "searchParam"),
int2long(methodCall, "offset"),
int2long(methodCall, "count")
);
}
} }

View File

@@ -10,6 +10,8 @@ public class SignalingManager extends BaseManager {
public void setSignalingListener(MethodCall methodCall, MethodChannel.Result result) { public void setSignalingListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setSignalingListener(new OnSignalingListener()); Open_im_sdk.setSignalingListener(new OnSignalingListener());
result.success(null);
} }
public void signalingInvite(MethodCall methodCall, MethodChannel.Result result) { public void signalingInvite(MethodCall methodCall, MethodChannel.Result result) {
@@ -53,4 +55,71 @@ public class SignalingManager extends BaseManager {
value(methodCall, "operationID"), value(methodCall, "operationID"),
jsonValue(methodCall, "signalingInfo")); jsonValue(methodCall, "signalingInfo"));
} }
public void signalingGetRoomByGroupID(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.signalingGetRoomByGroupID(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID"));
}
public void signalingGetTokenByRoomID(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.signalingGetTokenByRoomID(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "roomID"));
}
public void signalingUpdateMeetingInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.signalingUpdateMeetingInfo(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "info"));
}
public void signalingCreateMeeting(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.signalingCreateMeeting(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "info"));
}
public void signalingJoinMeeting(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.signalingJoinMeeting(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "info"));
}
public void signalingOperateStream(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.signalingOperateStream(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "streamType"),
value(methodCall, "roomID"),
value(methodCall, "userID"),
value(methodCall, "mute"),
value(methodCall, "muteAll"));
}
public void signalingGetMeetings(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.signalingGetMeetings(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"));
}
public void signalingCloseRoom(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.signalingCloseRoom(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "roomID"));
}
public void signalingSendCustomSignal(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.signalingSendCustomSignal(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "customInfo"),
value(methodCall, "roomID"));
}
} }

View File

@@ -10,6 +10,8 @@ public class UserManager extends BaseManager {
public void setUserListener(MethodCall methodCall, MethodChannel.Result result) { public void setUserListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setUserListener(new OnUserListener()); Open_im_sdk.setUserListener(new OnUserListener());
result.success(null);
} }
public void getUsersInfo(MethodCall methodCall, MethodChannel.Result result) { public void getUsersInfo(MethodCall methodCall, MethodChannel.Result result) {

View File

@@ -10,6 +10,8 @@ public class WorkMomentsManager extends BaseManager {
public void setWorkMomentsListener(MethodCall methodCall, MethodChannel.Result result) { public void setWorkMomentsListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setWorkMomentsListener(new OnWorkMomentsListener()); Open_im_sdk.setWorkMomentsListener(new OnWorkMomentsListener());
result.success(null);
} }
public void getWorkMomentsUnReadCount(MethodCall methodCall, MethodChannel.Result result) { public void getWorkMomentsUnReadCount(MethodCall methodCall, MethodChannel.Result result) {

View File

@@ -21,6 +21,6 @@
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1.0</string> <string>1.0</string>
<key>MinimumOSVersion</key> <key>MinimumOSVersion</key>
<string>9.0</string> <string>11.0</string>
</dict> </dict>
</plist> </plist>

View File

@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project # Uncomment this line to define a global platform for your project
# platform :ios, '9.0' platform :ios, '11.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency. # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true' ENV['COCOAPODS_DISABLE_STATS'] = 'true'

View File

@@ -3,7 +3,7 @@
archiveVersion = 1; archiveVersion = 1;
classes = { classes = {
}; };
objectVersion = 51; objectVersion = 54;
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
@@ -198,6 +198,7 @@
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
@@ -212,6 +213,7 @@
}; };
9740EEB61CF901F6004384FC /* Run Script */ = { 9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
@@ -322,7 +324,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0; IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos; SUPPORTED_PLATFORMS = iphoneos;
@@ -402,7 +404,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0; IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = YES; MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
@@ -452,7 +454,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0; IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos; SUPPORTED_PLATFORMS = iphoneos;

View File

@@ -41,5 +41,9 @@
</array> </array>
<key>UIViewControllerBasedStatusBarAppearance</key> <key>UIViewControllerBasedStatusBarAppearance</key>
<false/> <false/>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict> </dict>
</plist> </plist>

View File

@@ -5,58 +5,58 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: async name: async
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.8.2" version: "2.10.0"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
name: boolean_selector name: boolean_selector
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.0" version: "2.1.1"
characters: characters:
dependency: transitive dependency: transitive
description: description:
name: characters name: characters
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.2.0" version: "1.2.1"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.1"
clock: clock:
dependency: transitive dependency: transitive
description: description:
name: clock name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.0" version: "1.1.1"
collection: collection:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.15.0" version: "1.17.0"
cupertino_icons: cupertino_icons:
dependency: "direct main" dependency: "direct main"
description: description:
name: cupertino_icons name: cupertino_icons
sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.0.3" version: "1.0.5"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
name: fake_async name: fake_async
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.2.0" version: "1.3.1"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@@ -68,40 +68,52 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "2.0.9" version: "2.3.5+2"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
js:
dependency: transitive
description:
name: js
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.6.5"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.12.11" version: "0.12.13"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.1.3" version: "0.2.0"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.7.0" version: "1.8.0"
path: path:
dependency: transitive dependency: transitive
description: description:
name: path name: path
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.8.0" version: "1.8.2"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@@ -111,58 +123,58 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.8.1" version: "1.9.1"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
name: stack_trace name: stack_trace
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.10.0" version: "1.11.0"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
name: stream_channel name: stream_channel
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.0" version: "2.1.1"
string_scanner: string_scanner:
dependency: transitive dependency: transitive
description: description:
name: string_scanner name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.0" version: "1.2.0"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
name: term_glyph name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.2.0" version: "1.2.1"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.4.8" version: "0.4.16"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.0"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.1" version: "2.1.4"
sdks: sdks:
dart: ">=2.14.0 <3.0.0" dart: ">=2.18.0 <3.0.0"
flutter: ">=1.20.0" flutter: ">=1.20.0"

View File

@@ -24,6 +24,8 @@ public class ConversationManager: BaseServiceManager {
self["deleteAllConversationFromLocal"] = deleteAllConversationFromLocal self["deleteAllConversationFromLocal"] = deleteAllConversationFromLocal
self["resetConversationGroupAtType"] = resetConversationGroupAtType self["resetConversationGroupAtType"] = resetConversationGroupAtType
self["getAtAllTag"] = getAtAllTag self["getAtAllTag"] = getAtAllTag
self["setGlobalRecvMessageOpt"] = setGlobalRecvMessageOpt
self["setOneConversationBurnDuration"] = setOneConversationBurnDuration
} }
func setConversationListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func setConversationListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -103,6 +105,14 @@ public class ConversationManager: BaseServiceManager {
func getAtAllTag(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getAtAllTag(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkGetAtAllTag()) callBack(result, Open_im_sdkGetAtAllTag())
} }
func setGlobalRecvMessageOpt(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGlobalRecvMessageOpt(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "status"])
}
func setOneConversationBurnDuration(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetOneConversationBurnDuration(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[int32: "burnDuration"])
}
} }

View File

@@ -19,6 +19,7 @@ public class FriendshipManager: BaseServiceManager {
self["deleteFriend"] = deleteFriend self["deleteFriend"] = deleteFriend
self["acceptFriendApplication"] = acceptFriendApplication self["acceptFriendApplication"] = acceptFriendApplication
self["refuseFriendApplication"] = refuseFriendApplication self["refuseFriendApplication"] = refuseFriendApplication
self["searchFriends"] = searchFriends
// self["forceSyncFriendApplication"] = forceSyncFriendApplication // self["forceSyncFriendApplication"] = forceSyncFriendApplication
// self["forceSyncFriend"] = forceSyncFriend // self["forceSyncFriend"] = forceSyncFriend
// self["forceSyncBlackList"] = forceSyncBlackList // self["forceSyncBlackList"] = forceSyncBlackList
@@ -81,6 +82,9 @@ public class FriendshipManager: BaseServiceManager {
Open_im_sdkRefuseFriendApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) Open_im_sdkRefuseFriendApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
} }
func searchFriends(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSearchFriends(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"])
}
// func forceSyncFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ // func forceSyncFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
// Open_im_sdkForceSyncFriendApplication() // Open_im_sdkForceSyncFriendApplication()
// callBack(result) // callBack(result)

View File

@@ -26,6 +26,14 @@ public class GroupManager: BaseServiceManager {
self["changeGroupMemberMute"] = changeGroupMemberMute self["changeGroupMemberMute"] = changeGroupMemberMute
self["setGroupMemberNickname"] = setGroupMemberNickname self["setGroupMemberNickname"] = setGroupMemberNickname
self["searchGroups"] = searchGroups self["searchGroups"] = searchGroups
self["setGroupMemberRoleLevel"] = setGroupMemberRoleLevel
self["getGroupMemberListByJoinTimeFilter"] = getGroupMemberListByJoinTimeFilter
self["setGroupVerification"] = setGroupVerification
self["setGroupLookMemberInfo"] = setGroupLookMemberInfo
self["setGroupApplyMemberFriend"] = setGroupApplyMemberFriend
self["getGroupMemberOwnerAndAdmin"] = getGroupMemberOwnerAndAdmin
self["searchGroupMembers"] = searchGroupMembers
self["setGroupMemberInfo"] = setGroupMemberInfo
} }
func setGroupListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func setGroupListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -69,7 +77,7 @@ public class GroupManager: BaseServiceManager {
} }
func joinGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func joinGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkJoinGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[string: "reason"]) Open_im_sdkJoinGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[string: "reason"], methodCall[int32: "joinSource"])
} }
func quitGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func quitGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -115,6 +123,38 @@ public class GroupManager: BaseServiceManager {
func searchGroups(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func searchGroups(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSearchGroups(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"]) Open_im_sdkSearchGroups(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"])
} }
func setGroupMemberRoleLevel(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupMemberRoleLevel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string:"userID"],methodCall[int:"roleLevel"])
}
func getGroupMemberListByJoinTimeFilter(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetGroupMemberListByJoinTimeFilter(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32: "offset"], methodCall[int32: "count"], methodCall[int64: "joinTimeBegin"], methodCall[int64: "joinTimeEnd"], methodCall[jsonString: "excludeUserIDList"])
}
func setGroupVerification(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupVerification(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32:"needVerification"])
}
func setGroupLookMemberInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupLookMemberInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32:"status"])
}
func setGroupApplyMemberFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupApplyMemberFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32:"status"])
}
func getGroupMemberOwnerAndAdmin(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetGroupMemberOwnerAndAdmin(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"])
}
func searchGroupMembers(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSearchGroupMembers(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"])
}
func setGroupMemberInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupMemberInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "info"])
}
} }
public class GroupListener: NSObject, Open_im_sdk_callbackOnGroupListenerProtocol { public class GroupListener: NSObject, Open_im_sdk_callbackOnGroupListenerProtocol {

View File

@@ -10,6 +10,9 @@ public class IMMananger: BaseServiceManager {
self["logout"] = logout self["logout"] = logout
self["getLoginStatus"] = getLoginStatus self["getLoginStatus"] = getLoginStatus
self["wakeUp"] = wakeUp self["wakeUp"] = wakeUp
self["uploadImage"] = uploadImage
self["updateFcmToken"] = updateFcmToken
self["setAppBackgroundStatus"] = setAppBackgroundStatus
} }
func initSDK(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func initSDK(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -35,6 +38,15 @@ public class IMMananger: BaseServiceManager {
func uploadImage(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { func uploadImage(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkUploadImage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "path"], methodCall[string: "token"], methodCall[string: "obj"]) Open_im_sdkUploadImage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "path"], methodCall[string: "token"], methodCall[string: "obj"])
} }
func updateFcmToken(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkUpdateFcmToken(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "fcmToken"])
}
func setAppBackgroundStatus(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSetAppBackgroundStatus(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[bool: "isBackground"])
}
} }
public class ConnListener: NSObject, Open_im_sdk_callbackOnConnListenerProtocol { public class ConnListener: NSObject, Open_im_sdk_callbackOnConnListenerProtocol {

View File

@@ -44,6 +44,23 @@ public class MessageManager: BaseServiceManager {
self["clearC2CHistoryMessageFromLocalAndSvr"] = clearC2CHistoryMessageFromLocalAndSvr self["clearC2CHistoryMessageFromLocalAndSvr"] = clearC2CHistoryMessageFromLocalAndSvr
self["clearGroupHistoryMessageFromLocalAndSvr"] = clearGroupHistoryMessageFromLocalAndSvr self["clearGroupHistoryMessageFromLocalAndSvr"] = clearGroupHistoryMessageFromLocalAndSvr
self["getHistoryMessageListReverse"] = getHistoryMessageListReverse self["getHistoryMessageListReverse"] = getHistoryMessageListReverse
self["newRevokeMessage"] = newRevokeMessage
self["getAdvancedHistoryMessageList"] = getAdvancedHistoryMessageList
self["findMessageList"] = findMessageList
self["createAdvancedTextMessage"] = createAdvancedTextMessage
self["createAdvancedQuoteMessage"] = createAdvancedQuoteMessage
self["sendMessageNotOss"] = sendMessageNotOss
self["createImageMessageByURL"] = createImageMessageByURL
self["createSoundMessageByURL"] = createSoundMessageByURL
self["createVideoMessageByURL"] = createVideoMessageByURL
self["createFileMessageByURL"] = createFileMessageByURL
self["setCustomBusinessListener"] = setCustomBusinessListener
self["setMessageKvInfoListener"] = setMessageKvInfoListener
self["setMessageReactionExtensions"] = setMessageReactionExtensions
self["deleteMessageReactionExtensions"] = deleteMessageReactionExtensions
self["getMessageListReactionExtensions"] = getMessageListReactionExtensions
self["addMessageReactionExtensions"] = addMessageReactionExtensions
self["getMessageListSomeReactionExtensions"] = getMessageListSomeReactionExtensions
} }
func setAdvancedMsgListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func setAdvancedMsgListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -173,6 +190,16 @@ public class MessageManager: BaseServiceManager {
func createFaceMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createFaceMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateFaceMessage(methodCall[string: "operationID"], methodCall[int: "index"], methodCall[string: "data"])) callBack(result, Open_im_sdkCreateFaceMessage(methodCall[string: "operationID"], methodCall[int: "index"], methodCall[string: "data"]))
} }
func createAdvancedTextMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let prama = Open_im_sdkCreateAdvancedTextMessage(methodCall[string: "operationID"], methodCall[string: "text"], methodCall[jsonString: "richMessageInfoList"])
callBack(result, prama)
}
func createAdvancedQuoteMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let prama = Open_im_sdkCreateAdvancedQuoteMessage(methodCall[string: "operationID"], methodCall[string: "quoteText"], methodCall[jsonString: "quoteMessage"], methodCall[jsonString: "richMessageInfoList"])
callBack(result, prama)
}
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"])
@@ -214,70 +241,195 @@ public class MessageManager: BaseServiceManager {
Open_im_sdkGetHistoryMessageListReverse(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) Open_im_sdkGetHistoryMessageListReverse(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
} }
public class SendMsgProgressListener: NSObject, Open_im_sdk_callbackSendMsgCallBackProtocol { func newRevokeMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
private let channel: FlutterMethodChannel Open_im_sdkNewRevokeMessage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
private let result: FlutterResult
private let call: FlutterMethodCall
init(channel: FlutterMethodChannel, result: @escaping FlutterResult, methodCall: FlutterMethodCall) {
self.channel = channel
self.result = result
self.call = methodCall
}
public func onError(_ errCode: Int32, errMsg: String?) {
DispatchQueue.main.async { self.result(FlutterError(code: "\(errCode)", message: errMsg, details: nil)) }
}
public func onProgress(_ progress: Int) {
var values: [String: Any] = [:]
let message = call[dict: "message"]
values["clientMsgID"] = message["clientMsgID"]
values["progress"] = progress
CommonUtil.emitEvent(channel: channel, method: "msgSendProgressListener", type: "onProgress", errCode: nil, errMsg: nil, data: values)
}
public func onSuccess(_ data: String?) {
DispatchQueue.main.async { self.result(data) }
}
} }
public class AdvancedMsgListener: NSObject, Open_im_sdk_callbackOnAdvancedMsgListenerProtocol { func getAdvancedHistoryMessageList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
private let channel: FlutterMethodChannel Open_im_sdkGetAdvancedHistoryMessageList(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
private let id: String }
init(channel: FlutterMethodChannel, id: String) { func findMessageList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
self.channel = channel Open_im_sdkFindMessageList(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParams"])
self.id = id }
}
func sendMessageNotOss(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
public func onRecvC2CReadReceipt(_ msgReceiptList: String?) { let sendMsgProgressListener: SendMsgProgressListener = SendMsgProgressListener(channel: channel,result: result,methodCall: methodCall)
var values: [String: Any] = [:] Open_im_sdkSendMessageNotOss(sendMsgProgressListener, methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[string: "userID"],
values["id"] = id methodCall[string: "groupID"], methodCall[jsonString: "offlinePushInfo"])
values["c2cMessageReadReceipt"] = msgReceiptList }
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvC2CReadReceipt", errCode: nil, errMsg: nil, data: values)
} func createImageMessageByURL(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateImageMessageByURL(methodCall[string: "operationID"], methodCall[jsonString: "sourcePicture"], methodCall[jsonString: "bigPicture"], methodCall[jsonString: "snapshotPicture"]))
public func onRecvGroupReadReceipt(_ groupMsgReceiptList: String?) { }
var values: [String: Any] = [:]
values["id"] = id func createSoundMessageByURL(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
values["groupMessageReadReceipt"] = groupMsgReceiptList callBack(result, Open_im_sdkCreateSoundMessageByURL(methodCall[string: "operationID"], methodCall[jsonString: "soundElem"]))
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvGroupReadReceipt", errCode: nil, errMsg: nil, data: values) }
}
func createVideoMessageByURL(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
public func onRecvMessageRevoked(_ msgId: String?) { callBack(result, Open_im_sdkCreateVideoMessageByURL(methodCall[string: "operationID"], methodCall[jsonString: "videoElem"]))
var values: [String: Any] = [:] }
values["id"] = id
values["revokedMessage"] = msgId func createFileMessageByURL(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageRevoked", errCode: nil, errMsg: nil, data: values) callBack(result, Open_im_sdkCreateFileMessageByURL(methodCall[string: "operationID"], methodCall[jsonString: "fileElem"]))
} }
public func onRecvNewMessage(_ message: String?) { func setCustomBusinessListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
var values: [String: Any] = [:] Open_im_sdkSetCustomBusinessListener(CustomBusinessListener(channel: channel))
values["id"] = id callBack(result)
values["newMessage"] = message }
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvNewMessage", errCode: nil, errMsg: nil, data: values)
} func setMessageKvInfoListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetMessageKvInfoListener(MessageKvInfoListener(channel: channel))
callBack(result)
}
func setMessageReactionExtensions(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetMessageReactionExtensions(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[jsonString: "list"])
}
func deleteMessageReactionExtensions(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkDeleteMessageReactionExtensions(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[jsonString: "list"])
}
func getMessageListReactionExtensions(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetMessageListReactionExtensions(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "messageList"])
}
func addMessageReactionExtensions(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkAddMessageReactionExtensions(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[jsonString: "list"])
}
func getMessageListSomeReactionExtensions(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetMessageListSomeReactionExtensions(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "messageList"], methodCall[jsonString: "list"])
} }
} }
public class SendMsgProgressListener: NSObject, Open_im_sdk_callbackSendMsgCallBackProtocol {
private let channel: FlutterMethodChannel
private let result: FlutterResult
private let call: FlutterMethodCall
init(channel: FlutterMethodChannel, result: @escaping FlutterResult, methodCall: FlutterMethodCall) {
self.channel = channel
self.result = result
self.call = methodCall
}
public func onError(_ errCode: Int32, errMsg: String?) {
DispatchQueue.main.async { self.result(FlutterError(code: "\(errCode)", message: errMsg, details: nil)) }
}
public func onProgress(_ progress: Int) {
var values: [String: Any] = [:]
let message = call[dict: "message"]
values["clientMsgID"] = message["clientMsgID"]
values["progress"] = progress
CommonUtil.emitEvent(channel: channel, method: "msgSendProgressListener", type: "onProgress", errCode: nil, errMsg: nil, data: values)
}
public func onSuccess(_ data: String?) {
DispatchQueue.main.async { self.result(data) }
}
}
public class AdvancedMsgListener: NSObject, Open_im_sdk_callbackOnAdvancedMsgListenerProtocol {
private let channel: FlutterMethodChannel
private let id: String
init(channel: FlutterMethodChannel, id: String) {
self.channel = channel
self.id = id
}
public func onRecvC2CReadReceipt(_ msgReceiptList: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["c2cMessageReadReceipt"] = msgReceiptList
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvC2CReadReceipt", errCode: nil, errMsg: nil, data: values)
}
public func onRecvGroupReadReceipt(_ groupMsgReceiptList: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["groupMessageReadReceipt"] = groupMsgReceiptList
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvGroupReadReceipt", errCode: nil, errMsg: nil, data: values)
}
public func onRecvMessageRevoked(_ msgId: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["revokedMessage"] = msgId
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageRevoked", errCode: nil, errMsg: nil, data: values)
}
public func onRecvNewMessage(_ message: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["newMessage"] = message
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvNewMessage", errCode: nil, errMsg: nil, data: values)
}
public func onNewRecvMessageRevoked(_ messageRevoked: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["revokedMessageV2"] = messageRevoked
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onNewRecvMessageRevoked", errCode: nil, errMsg: nil, data: values)
}
public func onRecvMessageExtensionsChanged(_ msgID: String?, reactionExtensionList: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["msgID"] = msgID
values["list"] = reactionExtensionList
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageExtensionsChanged", errCode: nil, errMsg: nil, data: values)
}
public func onRecvMessageExtensionsDeleted(_ msgID: String?, reactionExtensionKeyList: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["msgID"] = msgID
values["list"] = reactionExtensionKeyList
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageExtensionsDeleted", errCode: nil, errMsg: nil, data: values)
}
public func onRecvMessageExtensionsAdded(_ msgID: String?, reactionExtensionList: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["msgID"] = msgID
values["list"] = reactionExtensionList
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageExtensionsAdded", errCode: nil, errMsg: nil, data: values)
}
}
public class CustomBusinessListener: NSObject, Open_im_sdk_callbackOnCustomBusinessListenerProtocol {
private let channel: FlutterMethodChannel
init(channel: FlutterMethodChannel) {
self.channel = channel
}
public func onRecvCustomBusinessMessage(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "customBusinessListener", type: "onRecvCustomBusinessMessage", errCode: nil, errMsg: nil, data: s)
}
}
public class MessageKvInfoListener: NSObject, Open_im_sdk_callbackOnMessageKvInfoListenerProtocol {
private let channel: FlutterMethodChannel
init(channel: FlutterMethodChannel) {
self.channel = channel
}
public func onMessageKvInfoChanged(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "messageKvInfoListener", type: "onMessageKvInfoChanged", errCode: nil, errMsg: nil, data: s)
}
}

View File

@@ -10,6 +10,8 @@ public class OrganizationManager: BaseServiceManager {
self["getDepartmentMember"] = getDepartmentMember self["getDepartmentMember"] = getDepartmentMember
self["getUserInDepartment"] = getUserInDepartment self["getUserInDepartment"] = getUserInDepartment
self["getDepartmentMemberAndSubDepartment"] = getDepartmentMemberAndSubDepartment self["getDepartmentMemberAndSubDepartment"] = getDepartmentMemberAndSubDepartment
self["getDepartmentInfo"] = getDepartmentInfo
self["searchOrganization"] = searchOrganization
} }
func setOrganizationListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func setOrganizationListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -32,6 +34,14 @@ public class OrganizationManager: BaseServiceManager {
func getDepartmentMemberAndSubDepartment(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { func getDepartmentMemberAndSubDepartment(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetDepartmentMemberAndSubDepartment(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "departmentID"]) Open_im_sdkGetDepartmentMemberAndSubDepartment(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "departmentID"])
} }
func getDepartmentInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetDepartmentInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "departmentID"])
}
func searchOrganization(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSearchOrganization(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"], methodCall[int: "offset"], methodCall[int: "count"])
}
} }
public class OrganizationListener: NSObject, Open_im_sdk_callbackOnOrganizationListenerProtocol { public class OrganizationListener: NSObject, Open_im_sdk_callbackOnOrganizationListenerProtocol {

View File

@@ -12,6 +12,15 @@ public class SignalingManager: BaseServiceManager {
self["signalingReject"] = signalingReject self["signalingReject"] = signalingReject
self["signalingCancel"] = signalingCancel self["signalingCancel"] = signalingCancel
self["signalingHungUp"] = signalingHungUp self["signalingHungUp"] = signalingHungUp
self["signalingGetRoomByGroupID"] = signalingGetRoomByGroupID
self["signalingGetTokenByRoomID"] = signalingGetTokenByRoomID
self["signalingUpdateMeetingInfo"] = signalingUpdateMeetingInfo
self["signalingCreateMeeting"] = signalingCreateMeeting
self["signalingJoinMeeting"] = signalingJoinMeeting
self["signalingOperateStream"] = signalingOperateStream
self["signalingGetMeetings"] = signalingGetMeetings
self["signalingCloseRoom"] = signalingCloseRoom
self["signalingSendCustomSignal"] = signalingSendCustomSignal
} }
func setSignalingListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func setSignalingListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -42,9 +51,46 @@ public class SignalingManager: BaseServiceManager {
func signalingHungUp(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func signalingHungUp(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingHungUp(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "signalingInfo"]) Open_im_sdkSignalingHungUp(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "signalingInfo"])
} }
func signalingGetRoomByGroupID(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingGetRoomByGroupID(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"])
}
func signalingGetTokenByRoomID(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingGetTokenByRoomID(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "roomID"])
}
func signalingUpdateMeetingInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingUpdateMeetingInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "info"])
}
func signalingCreateMeeting(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingCreateMeeting(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "info"])
}
func signalingJoinMeeting(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingJoinMeeting(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "info"])
}
func signalingOperateStream(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingOperateStream(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "streamType"], methodCall[string: "roomID"], methodCall[string: "userID"], methodCall[bool: "mute"], methodCall[bool: "muteAll"])
}
func signalingGetMeetings(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingGetMeetings(BaseCallback(result: result), methodCall[string: "operationID"])
}
func signalingCloseRoom(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingCloseRoom(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "roomID"])
}
func signalingSendCustomSignal(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingSendCustomSignal(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "customInfo"], methodCall[string: "roomID"])
}
} }
public class SignalingListener: NSObject, Open_im_sdk_callbackOnSignalingListenerProtocol { public class SignalingListener: NSObject, Open_im_sdk_callbackOnSignalingListenerProtocol {
private let channel:FlutterMethodChannel private let channel:FlutterMethodChannel
init(channel:FlutterMethodChannel) { init(channel:FlutterMethodChannel) {
@@ -83,4 +129,20 @@ public class SignalingListener: NSObject, Open_im_sdk_callbackOnSignalingListene
CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onHangUp", errCode: nil, errMsg: nil, data: s) CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onHangUp", errCode: nil, errMsg: nil, data: s)
} }
public func onRoomParticipantConnected(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onRoomParticipantConnected", errCode: nil, errMsg: nil, data: s)
}
public func onRoomParticipantDisconnected(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onRoomParticipantDisconnected", errCode: nil, errMsg: nil, data: s)
}
public func onStreamChange(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onStreamChange", errCode: nil, errMsg: nil, data: s)
}
public func onReceiveCustomSignal(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onReceiveCustomSignal", errCode: nil, errMsg: nil, data: s)
}
} }

View File

@@ -15,9 +15,9 @@ A new Flutter project.
s.source = { :path => '.' } s.source = { :path => '.' }
s.source_files = 'Classes/**/*' s.source_files = 'Classes/**/*'
s.dependency 'Flutter' s.dependency 'Flutter'
s.platform = :ios, '8.0' s.platform = :ios, '9.0'
s.dependency 'OpenIMSDKCore','2.0.9' s.dependency 'OpenIMSDKCore','2.3.5-b3'
s.static_framework = true s.static_framework = true
# s.vendored_frameworks = 'Framework/*.framework' # s.vendored_frameworks = 'Framework/*.framework'
# Flutter.framework does not contain a i386 slice. # Flutter.framework does not contain a i386 slice.

View File

@@ -3,15 +3,21 @@ library flutter_openim_sdk;
export 'src/enum/conversation_type.dart'; export 'src/enum/conversation_type.dart';
export 'src/enum/group_at_type.dart'; export 'src/enum/group_at_type.dart';
export 'src/enum/group_role_level.dart'; export 'src/enum/group_role_level.dart';
export 'src/enum/group_type.dart';
export 'src/enum/group_verification.dart';
export 'src/enum/im_platform.dart'; export 'src/enum/im_platform.dart';
export 'src/enum/listener_type.dart'; export 'src/enum/listener_type.dart';
export 'src/enum/message_status.dart'; export 'src/enum/message_status.dart';
export 'src/enum/message_type.dart'; export 'src/enum/message_type.dart';
export 'src/enum/sdk_error_code.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/conversation_listener.dart';
export 'src/listener/custom_business_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/listener_for_service.dart';
export 'src/listener/message_kv_info_listener.dart';
export 'src/listener/msg_send_progress_listener.dart'; export 'src/listener/msg_send_progress_listener.dart';
export 'src/listener/organization_listener.dart'; export 'src/listener/organization_listener.dart';
export 'src/listener/signaling_listener.dart'; export 'src/listener/signaling_listener.dart';
@@ -29,6 +35,7 @@ export 'src/manager/im_user_manager.dart';
export 'src/manager/im_workmoments_manager.dart'; export 'src/manager/im_workmoments_manager.dart';
export 'src/models/conversation_info.dart'; export 'src/models/conversation_info.dart';
export 'src/models/group_info.dart'; export 'src/models/group_info.dart';
export 'src/models/meeting_info.dart';
export 'src/models/message.dart'; export 'src/models/message.dart';
export 'src/models/notification_info.dart'; export 'src/models/notification_info.dart';
export 'src/models/organization_info.dart'; export 'src/models/organization_info.dart';

View File

@@ -1,5 +1,14 @@
/// 会话类型
class ConversationType { class ConversationType {
/// 单聊
static const single = 1; static const single = 1;
/// 群
static const group = 2; static const group = 2;
/// 大群
static const superGroup = 3;
/// 通知
static const notification = 4; static const notification = 4;
} }

View File

@@ -1,6 +1,17 @@
/// 会话强提示内容
class GroupAtType { class GroupAtType {
/// 取消所有提示即调用了resetConversationGroupAtType方法
static const atNormal = 0; static const atNormal = 0;
/// @了我提示
static const atMe = 1; static const atMe = 1;
/// @了所有人提示
static const atAll = 2; static const atAll = 2;
/// @了所有人@了我
static const atAllAtMe = 3; static const atAllAtMe = 3;
/// 群公告提示
static const groupNotification = 4;
} }

View File

@@ -1,7 +1,11 @@
/// 1 ordinary member, 2 group owners, 3 administrators /// 群成员角色
/// 1普通成员, 2群主3管理员
class GroupRoleLevel { class GroupRoleLevel {
/// 普通成员
static const member = 1; static const member = 1;
/// 群主
static const owner = 2; static const owner = 2;
/// 管理员
static const admin = 3; static const admin = 3;
} }

View File

@@ -0,0 +1,8 @@
/// 组类型
class GroupType {
/// 普通群
static const int general = 0;
/// 工作群
static const int work = 2;
}

View File

@@ -0,0 +1,11 @@
/// 进群验证设置选项
class GroupVerification {
/// 申请需要同意 邀请直接进
static const int applyNeedVerificationInviteDirectly = 0;
/// 所有人进群需要验证,除了群主管理员邀
static const int allNeedVerification = 1;
/// 直接进群
static const int directly = 2;
}

View File

@@ -1,9 +1,15 @@
/// 当前flutter平台仅支持Android/ios
class IMPlatform { class IMPlatform {
/// IOS
static const ios = 1; static const ios = 1;
/// Android
static const android = 2; static const android = 2;
static const windows = 3; static const windows = 3;
static const xos = 4; static const xos = 4;
static const web = 5; static const web = 5;
static const mini_web = 6; static const mini_web = 6;
static const linux = 7; static const linux = 7;
static const android_pad = 8;
static const ipad = 9;
} }

View File

@@ -1,13 +1,17 @@
/// callback类型
class ListenerType { class ListenerType {
static final simpleMsgListener = 'simpleMsgListener'; static const simpleMsgListener = 'simpleMsgListener';
static final connectListener = 'connectListener'; static const connectListener = 'connectListener';
static final userListener = 'userListener'; static const userListener = 'userListener';
static final groupListener = 'groupListener'; static const groupListener = 'groupListener';
static final advancedMsgListener = 'advancedMsgListener'; static const advancedMsgListener = 'advancedMsgListener';
static final conversationListener = 'conversationListener'; static const conversationListener = 'conversationListener';
static final friendListener = 'friendListener'; static const friendListener = 'friendListener';
static final signalingListener = 'signalingListener'; static const signalingListener = 'signalingListener';
static final msgSendProgressListener = "msgSendProgressListener"; static const msgSendProgressListener = "msgSendProgressListener";
static final workMomentsListener = "workMomentsListener"; static const workMomentsListener = "workMomentsListener";
static final organizationListener = "organizationListener"; static const organizationListener = "organizationListener";
static const customBusinessListener = "customBusinessListener";
static const messageKvInfoListener = "messageKvInfoListener";
static const listenerForService = "listenerForService";
} }

View File

@@ -1,6 +1,14 @@
/// 消息发送状态
class MessageStatus { class MessageStatus {
/// 发送中
static const sending = 1; static const sending = 1;
/// 已发送成功
static const succeeded = 2; static const succeeded = 2;
/// 发送失败
static const failed = 3; static const failed = 3;
/// 已经删除
static const deleted = 4; static const deleted = 4;
} }

View File

@@ -1,67 +1,167 @@
/// 消息类型
class MessageType { class MessageType {
/// /// 普通文本
static const text = 101; static const text = 101;
/// 图片
static const picture = 102; static const picture = 102;
/// 语音
static const voice = 103; static const voice = 103;
/// 视频
static const video = 104; static const video = 104;
/// 文件
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 card = 108; static const card = 108;
/// 位置
static const location = 109; static const location = 109;
/// 自定义
static const custom = 110; static const custom = 110;
/// 撤回
static const revoke = 111; static const revoke = 111;
/// 已读回执
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 custom_face = 115;
/// /// 群消息已读回执
static const groupHasReadReceipt = 116;
/// 富文本消息
static const advancedText = 117;
/// 高级撤回
static const advancedRevoke = 118;
static const customMsgNotTriggerConversation = 119;
static const customMsgOnlineOnly = 120;
/// 通知类型
static const notificationBegin = 1000; static const notificationBegin = 1000;
static const friendNotificationBegin = 1200; static const friendNotificationBegin = 1200;
/// 好友申请已接受
static const friendApplicationApprovedNotification = 1201; static const friendApplicationApprovedNotification = 1201;
/// 好友申请已拒绝
static const friendApplicationRejectedNotification = 1202; static const friendApplicationRejectedNotification = 1202;
/// 好友申请
static const friendApplicationNotification = 1203; static const friendApplicationNotification = 1203;
/// 好友已添加
static const friendAddedNotification = 1204; static const friendAddedNotification = 1204;
/// 好友已删除
static const friendDeletedNotification = 1205; static const friendDeletedNotification = 1205;
/// 设置好友备注
static const friendRemarkSetNotification = 1206; static const friendRemarkSetNotification = 1206;
/// 好友加入黑名单
static const blackAddedNotification = 1207; static const blackAddedNotification = 1207;
/// 已从黑名单移除
static const blackDeletedNotification = 1208; static const blackDeletedNotification = 1208;
static const friendNotificationEnd = 1299; static const friendNotificationEnd = 1299;
/// 会话改变
static const conversationChangeNotification = 1300; static const conversationChangeNotification = 1300;
static const userNotificationBegin = 1301; static const userNotificationBegin = 1301;
/// 用户信息改变
static const userInfoUpdatedNotification = 1303; static const userInfoUpdatedNotification = 1303;
static const userNotificationEnd = 1399; static const userNotificationEnd = 1399;
/// OA通知
static const oaNotification = 1400; static const oaNotification = 1400;
static const groupNotificationBegin = 1500; static const groupNotificationBegin = 1500;
/// 群已被创建
static const groupCreatedNotification = 1501; static const groupCreatedNotification = 1501;
/// 群资料改变
static const groupInfoSetNotification = 1502; static const groupInfoSetNotification = 1502;
/// 进群申请
static const joinGroupApplicationNotification = 1503; static const joinGroupApplicationNotification = 1503;
/// 群成员退出
static const memberQuitNotification = 1504; static const memberQuitNotification = 1504;
/// 群申请被接受
static const groupApplicationAcceptedNotification = 1505; static const groupApplicationAcceptedNotification = 1505;
/// 群申请被拒绝
static const groupApplicationRejectedNotification = 1506; static const groupApplicationRejectedNotification = 1506;
/// 群拥有者权限转移
static const groupOwnerTransferredNotification = 1507; static const groupOwnerTransferredNotification = 1507;
/// 群成员被踢出群
static const memberKickedNotification = 1508; static const memberKickedNotification = 1508;
/// 邀请进群
static const memberInvitedNotification = 1509; static const memberInvitedNotification = 1509;
/// 群成员进群
static const memberEnterNotification = 1510; static const memberEnterNotification = 1510;
/// 解散群
static const dismissGroupNotification = 1511; static const dismissGroupNotification = 1511;
static const groupNotificationEnd = 1599; static const groupNotificationEnd = 1599;
/// 群成员被禁言
static const groupMemberMutedNotification = 1512; static const groupMemberMutedNotification = 1512;
/// 群成员被取消禁言
static const groupMemberCancelMutedNotification = 1513; static const groupMemberCancelMutedNotification = 1513;
/// 群禁言
static const groupMutedNotification = 1514; static const groupMutedNotification = 1514;
/// 取消群禁言
static const groupCancelMutedNotification = 1515; static const groupCancelMutedNotification = 1515;
/// 群成员信息改变
static const groupMemberInfoChangedNotification = 1516; static const groupMemberInfoChangedNotification = 1516;
static const signalingNotificationBegin = 1600; static const signalingNotificationBegin = 1600;
/// 信令
static const signalingNotification = 1601; static const signalingNotification = 1601;
static const signalingNotificationEnd = 1699; static const signalingNotificationEnd = 1699;
/// 阅后即焚
static const burnAfterReadingNotification = 1701; static const burnAfterReadingNotification = 1701;
static const notificationEnd = 2000; static const notificationEnd = 2000;

View File

@@ -0,0 +1,14 @@
/// 消息发送失败
class MessageFailedCode {
/// 被对方拉黑
static const int blockedByFriend = 600;
/// 被对方删除
static const int deletedByFriend = 601;
}
/// 添加好友失败
class AddFriendFailedCode {
/// 该用户已设置不可添加
static const int refuseToAddFriends = 10007;
}

View File

@@ -1,16 +1,15 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
/// 消息监听
class OnAdvancedMsgListener { class OnAdvancedMsgListener {
/// Message read receipt
Function(List<ReadReceiptInfo> list)? onRecvC2CMessageReadReceipt; Function(List<ReadReceiptInfo> list)? onRecvC2CMessageReadReceipt;
Function(List<ReadReceiptInfo> list)? onRecvGroupMessageReadReceipt; Function(List<ReadReceiptInfo> list)? onRecvGroupMessageReadReceipt;
/// A friend revoked a message
Function(String msgId)? onRecvMessageRevoked; Function(String msgId)? onRecvMessageRevoked;
/// Receive new message
Function(Message msg)? onRecvNewMessage; Function(Message msg)? onRecvNewMessage;
Function(RevokedInfo info)? onRecvMessageRevokedV2;
Function(String msgID, List<KeyValue> list)? onRecvMessageExtensionsChanged;
Function(String msgID, List<String> list)? onRecvMessageExtensionsDeleted;
Function(String msgID, List<KeyValue> list)? onRecvMessageExtensionsAdded;
/// Uniquely identifies /// Uniquely identifies
String id; String id;
@@ -18,23 +17,52 @@ class OnAdvancedMsgListener {
OnAdvancedMsgListener({ OnAdvancedMsgListener({
this.onRecvC2CMessageReadReceipt, this.onRecvC2CMessageReadReceipt,
this.onRecvGroupMessageReadReceipt, this.onRecvGroupMessageReadReceipt,
this.onRecvMessageRevoked, @deprecated this.onRecvMessageRevoked,
this.onRecvNewMessage, this.onRecvNewMessage,
this.onRecvMessageRevokedV2,
this.onRecvMessageExtensionsChanged,
this.onRecvMessageExtensionsDeleted,
this.onRecvMessageExtensionsAdded,
}) : id = "id_${DateTime.now().microsecondsSinceEpoch}"; }) : id = "id_${DateTime.now().microsecondsSinceEpoch}";
/// C2C消息已读回执
void recvC2CMessageReadReceipt(List<ReadReceiptInfo> list) { void recvC2CMessageReadReceipt(List<ReadReceiptInfo> list) {
onRecvC2CMessageReadReceipt?.call(list); onRecvC2CMessageReadReceipt?.call(list);
} }
/// 群消息已读回执
void recvGroupMessageReadReceipt(List<ReadReceiptInfo> list) { void recvGroupMessageReadReceipt(List<ReadReceiptInfo> list) {
onRecvGroupMessageReadReceipt?.call(list); onRecvGroupMessageReadReceipt?.call(list);
} }
/// 消息被撤回
void recvMessageRevoked(String msgId) { void recvMessageRevoked(String msgId) {
onRecvMessageRevoked?.call(msgId); onRecvMessageRevoked?.call(msgId);
} }
/// 收到了一条新消息
void recvNewMessage(Message msg) { void recvNewMessage(Message msg) {
onRecvNewMessage?.call(msg); onRecvNewMessage?.call(msg);
} }
/// 消息被撤回
void recvMessageRevokedV2(RevokedInfo info) {
onRecvMessageRevokedV2?.call(info);
}
/// 收到拓展消息kv改变
void recvMessageExtensionsChanged(String msgID, List<KeyValue> list) {
onRecvMessageExtensionsChanged?.call(msgID, list);
}
/// 收到扩展消息被删除
/// [list] 被删除的TypeKey
void recvMessageExtensionsDeleted(String msgID, List<String> list) {
onRecvMessageExtensionsDeleted?.call(msgID, list);
}
/// 收到拓展消息kv新增
void recvMessageExtensionsAdded(String msgID, List<KeyValue> list) {
onRecvMessageExtensionsAdded?.call(msgID, list);
}
} }

View File

@@ -1,46 +1,41 @@
/// SDK 连接状态监听
class OnConnectListener { class OnConnectListener {
/// SDK failed to connect to the server
Function(int? code, String? errorMsg)? onConnectFailed; Function(int? code, String? errorMsg)? onConnectFailed;
/// SDK has successfully connected to the server
Function()? onConnectSuccess; Function()? onConnectSuccess;
/// SDK is connecting to the server
Function()? onConnecting; Function()? onConnecting;
/// The current user is kicked offline.
/// At this time, the UI can prompt the user and call IMManager's login() function to log in again.
Function()? onKickedOffline; Function()? onKickedOffline;
Function()? onUserTokenExpired;
/// Ticket expired when online.
/// At this time, you need to generate a new userSig and call IMManager's login() function to log in again
Function()? onUserSigExpired;
OnConnectListener({ OnConnectListener({
this.onConnectFailed, this.onConnectFailed,
this.onConnectSuccess, this.onConnectSuccess,
this.onConnecting, this.onConnecting,
this.onKickedOffline, this.onKickedOffline,
this.onUserSigExpired, this.onUserTokenExpired,
}); });
/// SDK连接服务器失败
void connectFailed(int? code, String? errorMsg) { void connectFailed(int? code, String? errorMsg) {
if (null != onConnectFailed) onConnectFailed!(code, errorMsg); onConnectFailed?.call(code, errorMsg);
} }
/// SDK连接服务器成功
void connectSuccess() { void connectSuccess() {
if (null != onConnectSuccess) onConnectSuccess!(); onConnectSuccess?.call();
} }
/// SDK正在连接服务器
void connecting() { void connecting() {
if (null != onConnecting) onConnecting!.call(); onConnecting?.call();
} }
/// 账号已在其他地方登录,当前设备被踢下线
void kickedOffline() { void kickedOffline() {
if (null != onKickedOffline) onKickedOffline!(); onKickedOffline?.call();
} }
void userSigExpired() { /// 登录凭证过期,需要重新登录
if (null != onUserSigExpired) onUserSigExpired!(); void userTokenExpired() {
onUserTokenExpired?.call();
} }
} }

View File

@@ -1,5 +1,6 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
/// 会话监听
class OnConversationListener { class OnConversationListener {
Function(List<ConversationInfo> list)? onConversationChanged; Function(List<ConversationInfo> list)? onConversationChanged;
Function(List<ConversationInfo> list)? onNewConversation; Function(List<ConversationInfo> list)? onNewConversation;
@@ -17,28 +18,30 @@ class OnConversationListener {
this.onSyncServerStart, this.onSyncServerStart,
}); });
/// 会话发生改变
void conversationChanged(List<ConversationInfo> list) { void conversationChanged(List<ConversationInfo> list) {
if (onConversationChanged != null) onConversationChanged!(list); onConversationChanged?.call(list);
} }
/// 有新会话产生
void newConversation(List<ConversationInfo> list) { void newConversation(List<ConversationInfo> list) {
if (onNewConversation != null) onNewConversation!(list); onNewConversation?.call(list);
}
/// 未读消息总数发送改变
void totalUnreadMessageCountChanged(int i) {
onTotalUnreadMessageCountChanged?.call(i);
} }
void syncServerFailed() { void syncServerFailed() {
if (onSyncServerFailed != null) onSyncServerFailed!(); onSyncServerFailed?.call();
} }
void syncServerFinish() { void syncServerFinish() {
if (onSyncServerFinish != null) onSyncServerFinish!(); onSyncServerFinish?.call();
} }
void syncServerStart() { void syncServerStart() {
if (onSyncServerStart != null) onSyncServerStart!(); onSyncServerStart?.call();
}
void totalUnreadMessageCountChanged(int i) {
if (onTotalUnreadMessageCountChanged != null)
onTotalUnreadMessageCountChanged!(i);
} }
} }

View File

@@ -0,0 +1,9 @@
class OnCustomBusinessListener {
Function(String s)? onRecvCustomBusinessMessage;
OnCustomBusinessListener({this.onRecvCustomBusinessMessage});
void recvCustomBusinessMessage(String s) {
onRecvCustomBusinessMessage?.call(s);
}
}

View File

@@ -1,5 +1,6 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
/// 好友关系监听
class OnFriendshipListener { class OnFriendshipListener {
Function(FriendApplicationInfo i)? onFriendApplicationAdded; Function(FriendApplicationInfo i)? onFriendApplicationAdded;
Function(FriendApplicationInfo i)? onFriendApplicationDeleted; Function(FriendApplicationInfo i)? onFriendApplicationDeleted;
@@ -23,38 +24,47 @@ class OnFriendshipListener {
this.onFriendInfoChanged, this.onFriendInfoChanged,
}); });
/// 已被加入黑名单
void blacklistAdded(BlacklistInfo u) { void blacklistAdded(BlacklistInfo u) {
onBlacklistAdded?.call(u); onBlacklistAdded?.call(u);
} }
/// 已从黑名单移除
void blacklistDeleted(BlacklistInfo u) { void blacklistDeleted(BlacklistInfo u) {
onBlacklistDeleted?.call(u); onBlacklistDeleted?.call(u);
} }
/// 好友已添加
void friendAdded(FriendInfo u) { void friendAdded(FriendInfo u) {
onFriendAdded?.call(u); onFriendAdded?.call(u);
} }
/// 好友申请已被接受
void friendApplicationAccepted(FriendApplicationInfo u) { void friendApplicationAccepted(FriendApplicationInfo u) {
onFriendApplicationAccepted?.call(u); onFriendApplicationAccepted?.call(u);
} }
/// 已添加新的好友申请
void friendApplicationAdded(FriendApplicationInfo u) { void friendApplicationAdded(FriendApplicationInfo u) {
onFriendApplicationAdded?.call(u); onFriendApplicationAdded?.call(u);
} }
/// 好友申请已被删除
void friendApplicationDeleted(FriendApplicationInfo u) { void friendApplicationDeleted(FriendApplicationInfo u) {
onFriendApplicationDeleted?.call(u); onFriendApplicationDeleted?.call(u);
} }
/// 好友申请已被拒绝
void friendApplicationRejected(FriendApplicationInfo u) { void friendApplicationRejected(FriendApplicationInfo u) {
onFriendApplicationRejected?.call(u); onFriendApplicationRejected?.call(u);
} }
/// 好友已被删除
void friendDeleted(FriendInfo u) { void friendDeleted(FriendInfo u) {
onFriendDeleted?.call(u); onFriendDeleted?.call(u);
} }
/// 好友资料发生改变
void friendInfoChanged(FriendInfo u) { void friendInfoChanged(FriendInfo u) {
onFriendInfoChanged?.call(u); onFriendInfoChanged?.call(u);
} }

View File

@@ -1,5 +1,6 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
/// 群组监听
class OnGroupListener { class OnGroupListener {
Function(GroupApplicationInfo info)? onGroupApplicationAccepted; Function(GroupApplicationInfo info)? onGroupApplicationAccepted;
Function(GroupApplicationInfo info)? onGroupApplicationAdded; Function(GroupApplicationInfo info)? onGroupApplicationAdded;
@@ -25,42 +26,52 @@ class OnGroupListener {
this.onJoinedGroupDeleted, this.onJoinedGroupDeleted,
}); });
/// 群申请已被接受
void groupApplicationAccepted(GroupApplicationInfo info) { void groupApplicationAccepted(GroupApplicationInfo info) {
onGroupApplicationAccepted?.call(info); onGroupApplicationAccepted?.call(info);
} }
/// 群申请已被添加
void groupApplicationAdded(GroupApplicationInfo info) { void groupApplicationAdded(GroupApplicationInfo info) {
onGroupApplicationAdded?.call(info); onGroupApplicationAdded?.call(info);
} }
/// 群申请已被删除
void groupApplicationDeleted(GroupApplicationInfo info) { void groupApplicationDeleted(GroupApplicationInfo info) {
onGroupApplicationDeleted?.call(info); onGroupApplicationDeleted?.call(info);
} }
/// 群申请已被拒绝
void groupApplicationRejected(GroupApplicationInfo info) { void groupApplicationRejected(GroupApplicationInfo info) {
onGroupApplicationRejected?.call(info); onGroupApplicationRejected?.call(info);
} }
/// 群资料发生改变
void groupInfoChanged(GroupInfo info) { void groupInfoChanged(GroupInfo info) {
onGroupInfoChanged?.call(info); onGroupInfoChanged?.call(info);
} }
/// 群成员已添加
void groupMemberAdded(GroupMembersInfo info) { void groupMemberAdded(GroupMembersInfo info) {
onGroupMemberAdded?.call(info); onGroupMemberAdded?.call(info);
} }
/// 群成员已删除
void groupMemberDeleted(GroupMembersInfo info) { void groupMemberDeleted(GroupMembersInfo info) {
onGroupMemberDeleted?.call(info); onGroupMemberDeleted?.call(info);
} }
/// 群成员信息发送改变
void groupMemberInfoChanged(GroupMembersInfo info) { void groupMemberInfoChanged(GroupMembersInfo info) {
onGroupMemberInfoChanged?.call(info); onGroupMemberInfoChanged?.call(info);
} }
/// 已加入的群有新增
void joinedGroupAdded(GroupInfo info) { void joinedGroupAdded(GroupInfo info) {
onJoinedGroupAdded?.call(info); onJoinedGroupAdded?.call(info);
} }
/// 已加入的群减少
void joinedGroupDeleted(GroupInfo info) { void joinedGroupDeleted(GroupInfo info) {
onJoinedGroupDeleted?.call(info); onJoinedGroupDeleted?.call(info);
} }

View File

@@ -0,0 +1,38 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
/// 好友关系监听
class OnListenerForService {
Function(FriendApplicationInfo i)? onFriendApplicationAdded;
Function(FriendApplicationInfo i)? onFriendApplicationAccepted;
Function(GroupApplicationInfo info)? onGroupApplicationAccepted;
Function(GroupApplicationInfo info)? onGroupApplicationAdded;
Function(Message msg)? onRecvNewMessage;
OnListenerForService({
this.onFriendApplicationAdded,
this.onFriendApplicationAccepted,
this.onGroupApplicationAccepted,
this.onGroupApplicationAdded,
this.onRecvNewMessage,
});
void friendApplicationAccepted(FriendApplicationInfo u) {
onFriendApplicationAccepted?.call(u);
}
void friendApplicationAdded(FriendApplicationInfo u) {
onFriendApplicationAdded?.call(u);
}
void groupApplicationAccepted(GroupApplicationInfo info) {
onGroupApplicationAccepted?.call(info);
}
void groupApplicationAdded(GroupApplicationInfo info) {
onGroupApplicationAdded?.call(info);
}
void recvNewMessage(Message msg) {
onRecvNewMessage?.call(msg);
}
}

View File

@@ -0,0 +1,11 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class OnMessageKvInfoListener {
Function(List<MessageKv> list)? onMessageKvInfoChanged;
OnMessageKvInfoListener({this.onMessageKvInfoChanged});
void messageKvInfoChanged(List<MessageKv> list) {
onMessageKvInfoChanged?.call(list);
}
}

View File

@@ -1,9 +1,11 @@
/// 消息发送进度监听
class OnMsgSendProgressListener { class OnMsgSendProgressListener {
Function(String clientMsgID, int progress)? onProgress; Function(String clientMsgID, int progress)? onProgress;
OnMsgSendProgressListener({this.onProgress}); OnMsgSendProgressListener({this.onProgress});
/// 消息发送进度
void progress(String clientMsgID, int progress) { void progress(String clientMsgID, int progress) {
if (null != onProgress) onProgress!(clientMsgID, progress); onProgress?.call(clientMsgID, progress);
} }
} }

View File

@@ -1,8 +1,10 @@
/// 组织架构监听
class OnOrganizationListener { class OnOrganizationListener {
Function()? onOrganizationUpdated; Function()? onOrganizationUpdated;
OnOrganizationListener({this.onOrganizationUpdated}); OnOrganizationListener({this.onOrganizationUpdated});
/// 组织架构有更新
void organizationUpdated() { void organizationUpdated() {
onOrganizationUpdated?.call(); onOrganizationUpdated?.call();
} }

View File

@@ -1,5 +1,6 @@
import 'package:flutter_openim_sdk/src/models/signaling_info.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
/// 信令监听
class OnSignalingListener { class OnSignalingListener {
final Function(SignalingInfo info)? onInvitationCancelled; final Function(SignalingInfo info)? onInvitationCancelled;
final Function(SignalingInfo info)? onInvitationTimeout; final Function(SignalingInfo info)? onInvitationTimeout;
@@ -9,6 +10,10 @@ class OnSignalingListener {
final Function(SignalingInfo info)? onInviteeRejectedByOtherDevice; final Function(SignalingInfo info)? onInviteeRejectedByOtherDevice;
final Function(SignalingInfo info)? onInviteeAcceptedByOtherDevice; final Function(SignalingInfo info)? onInviteeAcceptedByOtherDevice;
final Function(SignalingInfo info)? onHangup; final Function(SignalingInfo info)? onHangup;
final Function(RoomCallingInfo info)? onRoomParticipantConnected;
final Function(RoomCallingInfo info)? onRoomParticipantDisconnected;
final Function(MeetingStreamEvent event)? onMeetingStreamChanged;
final Function(CustomSignaling info)? onReceiveCustomSignal;
OnSignalingListener({ OnSignalingListener({
this.onInvitationCancelled, this.onInvitationCancelled,
@@ -19,6 +24,10 @@ class OnSignalingListener {
this.onInviteeAcceptedByOtherDevice, this.onInviteeAcceptedByOtherDevice,
this.onInviteeRejectedByOtherDevice, this.onInviteeRejectedByOtherDevice,
this.onHangup, this.onHangup,
this.onRoomParticipantConnected,
this.onRoomParticipantDisconnected,
this.onMeetingStreamChanged,
this.onReceiveCustomSignal,
}); });
/// 被邀请者收到:邀请者取消音视频通话 /// 被邀请者收到:邀请者取消音视频通话
@@ -60,4 +69,20 @@ class OnSignalingListener {
void hangup(SignalingInfo info) { void hangup(SignalingInfo info) {
onHangup?.call(info); onHangup?.call(info);
} }
void roomParticipantConnected(RoomCallingInfo info) {
onRoomParticipantConnected?.call(info);
}
void roomParticipantDisconnected(RoomCallingInfo info) {
onRoomParticipantDisconnected?.call(info);
}
void streamChangedEvent(MeetingStreamEvent event) {
onMeetingStreamChanged?.call(event);
}
void receiveCustomSignal(CustomSignaling info) {
onReceiveCustomSignal?.call(info);
}
} }

View File

@@ -1,11 +1,13 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
/// 当前用户资料监听
class OnUserListener { class OnUserListener {
/// The information of the logged-in user has been updated /// The information of the logged-in user has been updated
Function(UserInfo info)? onSelfInfoUpdated; Function(UserInfo info)? onSelfInfoUpdated;
OnUserListener({this.onSelfInfoUpdated}); OnUserListener({this.onSelfInfoUpdated});
/// 自身信息发送变化回调
void selfInfoUpdated(UserInfo info) { void selfInfoUpdated(UserInfo info) {
onSelfInfoUpdated?.call(info); onSelfInfoUpdated?.call(info);
} }

View File

@@ -1,8 +1,10 @@
/// 朋友圈监听
class OnWorkMomentsListener { class OnWorkMomentsListener {
Function()? onRecvNewNotification; Function()? onRecvNewNotification;
OnWorkMomentsListener({this.onRecvNewNotification}); OnWorkMomentsListener({this.onRecvNewNotification});
/// 朋友圈信息发送改变
void recvNewNotification() { void recvNewNotification() {
onRecvNewNotification?.call(); onRecvNewNotification?.call();
} }

9
lib/src/logger.dart Normal file
View File

@@ -0,0 +1,9 @@
import 'dart:developer';
/// print full log
class Logger {
// Sample of abstract logging function
static void print(String text) {
log('** $text', name: 'flutter_openim_sdk');
}
}

View File

@@ -7,14 +7,12 @@ class ConversationManager {
ConversationManager(this._channel); ConversationManager(this._channel);
/// Observe conversation changes
/// 会话监听 /// 会话监听
Future setConversationListener(OnConversationListener listener) { Future setConversationListener(OnConversationListener listener) {
this.listener = listener; this.listener = listener;
return _channel.invokeMethod('setConversationListener', _buildParam({})); return _channel.invokeMethod('setConversationListener', _buildParam({}));
} }
/// Get all conversations
/// 获取所有会话 /// 获取所有会话
Future<List<ConversationInfo>> getAllConversationList( Future<List<ConversationInfo>> getAllConversationList(
{String? operationID}) => {String? operationID}) =>
@@ -27,8 +25,9 @@ class ConversationManager {
.then((value) => .then((value) =>
Utils.toList(value, (map) => ConversationInfo.fromJson(map))); Utils.toList(value, (map) => ConversationInfo.fromJson(map)));
/// Paging to get conversation
/// 分页获取会话 /// 分页获取会话
/// [offset] 开始下标
/// [count] 每页数量
Future<List<ConversationInfo>> getConversationListSplit({ Future<List<ConversationInfo>> getConversationListSplit({
int offset = 0, int offset = 0,
int count = 20, int count = 20,
@@ -45,12 +44,9 @@ class ConversationManager {
.then((value) => .then((value) =>
Utils.toList(value, (map) => ConversationInfo.fromJson(map))); Utils.toList(value, (map) => ConversationInfo.fromJson(map)));
/// Get a conversation, if it doesn't exist it will be created automatically /// 查询会话,如果会话不存在会自动生成一个
/// [sourceID] if it is a single chat, Its value is userID. if it is a group chat, Its value is groupID /// [sourceID] 如果是单聊会话传userID如果是群聊会话传GroupID
/// [sessionType] if it is a single chat, it value is 1. if it is a group chat, it value is 2 /// [sessionType] 参考[ConversationType]
/// 获取一个会话,如果不存在会自动创建
/// [sourceID] 如果是单聊值传用户ID如果是群聊值传组ID
/// [sessionType] 如果是单聊值传1如果是群聊值传2
Future<ConversationInfo> getOneConversation({ Future<ConversationInfo> getOneConversation({
required String sourceID, required String sourceID,
required int sessionType, required int sessionType,
@@ -67,8 +63,8 @@ class ConversationManager {
.then((value) => .then((value) =>
Utils.toObj(value, (map) => ConversationInfo.fromJson(map))); Utils.toObj(value, (map) => ConversationInfo.fromJson(map)));
/// Get conversation list by id list /// 根据会话id获取多个会话
/// 获取多个会话 /// [conversationIDList] 会话id列表
Future<List<ConversationInfo>> getMultipleConversation({ Future<List<ConversationInfo>> getMultipleConversation({
required List<String> conversationIDList, required List<String> conversationIDList,
String? operationID, String? operationID,
@@ -83,8 +79,8 @@ class ConversationManager {
.then((value) => .then((value) =>
Utils.toList(value, (map) => ConversationInfo.fromJson(map))); Utils.toList(value, (map) => ConversationInfo.fromJson(map)));
/// Delete conversation by id /// 通过会话id删除指定会话
/// 删除会话 /// [conversationID] 被删除会话的id
Future deleteConversation({ Future deleteConversation({
required String conversationID, required String conversationID,
String? operationID, String? operationID,
@@ -96,8 +92,9 @@ class ConversationManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Set draft
/// 设置会话草稿 /// 设置会话草稿
/// [conversationID] 会话id
/// [draftText] 草稿
Future setConversationDraft({ Future setConversationDraft({
required String conversationID, required String conversationID,
required String draftText, required String draftText,
@@ -111,8 +108,9 @@ class ConversationManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Pinned conversation
/// 置顶会话 /// 置顶会话
/// [conversationID] 会话id
/// [isPinned] true置顶false取消置顶
Future pinConversation({ Future pinConversation({
required String conversationID, required String conversationID,
required bool isPinned, required bool isPinned,
@@ -126,12 +124,8 @@ class ConversationManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
// Future<dynamic> markSingleMessageHasRead({required String userID}) =>
// _channel.invokeMethod(
// 'markSingleMessageHasRead', _buildParam({'userID': userID}));
/// Mark group chat all messages as read
/// 标记群聊会话已读 /// 标记群聊会话已读
/// [groupID] 群id
Future<dynamic> markGroupMessageHasRead({ Future<dynamic> markGroupMessageHasRead({
required String groupID, required String groupID,
String? operationID, String? operationID,
@@ -143,7 +137,6 @@ class ConversationManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Get the total number of unread messages
/// 获取未读消息总数 /// 获取未读消息总数
Future<dynamic> getTotalUnreadMsgCount({ Future<dynamic> getTotalUnreadMsgCount({
String? operationID, String? operationID,
@@ -154,12 +147,9 @@ class ConversationManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Query conversation id
/// [sourceID] if it is a single chat, Its value is userID. if it is a group chat, Its value is groupID
/// [sessionType] if it is a single chat, it value is 1. if it is a group chat, it value is 2
/// 查询会话id /// 查询会话id
/// [sourceID] 如果是单聊值传用户ID如果是群聊值传组ID /// [sourceID] 如果是单聊值传用户ID如果是群聊值传组ID
/// [sessionType] 如果是单聊值传1如果是群聊值传2 /// [sessionType] 参考[ConversationType]
Future<dynamic> getConversationIDBySessionType({ Future<dynamic> getConversationIDBySessionType({
required String sourceID, required String sourceID,
required int sessionType, required int sessionType,
@@ -171,9 +161,8 @@ class ConversationManager {
"sessionType": sessionType, "sessionType": sessionType,
})); }));
/// Message Do Not Disturb
/// [status] 0: Normal. 1: Do not receive messages. 2: Do not notify when messages are received.
/// 消息免打扰设置 /// 消息免打扰设置
/// [conversationIDList] 会话id列表
/// [status] 0正常1不接受消息2接受在线消息不接受离线消息 /// [status] 0正常1不接受消息2接受在线消息不接受离线消息
Future<dynamic> setConversationRecvMessageOpt({ Future<dynamic> setConversationRecvMessageOpt({
required List<String> conversationIDList, required List<String> conversationIDList,
@@ -188,9 +177,9 @@ class ConversationManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Message Do Not Disturb
/// [{"conversationId":"single_13922222222","result":0}]
/// 查询免打扰状态 /// 查询免打扰状态
/// [conversationIDList] 会话id列表
/// 返回:[{"conversationId":"single_13922222222","result":0}]result值0正常1不接受消息2接受在线消息不接受离线消息
Future<List<dynamic>> getConversationRecvMessageOpt({ Future<List<dynamic>> getConversationRecvMessageOpt({
required List<String> conversationIDList, required List<String> conversationIDList,
String? operationID, String? operationID,
@@ -204,8 +193,9 @@ class ConversationManager {
})) }))
.then((value) => Utils.toListMap(value)); .then((value) => Utils.toListMap(value));
/// burn after reading
/// 阅后即焚 /// 阅后即焚
/// [conversationID] 会话id
/// [isPrivate] true开启false关闭
Future<dynamic> setOneConversationPrivateChat({ Future<dynamic> setOneConversationPrivateChat({
required String conversationID, required String conversationID,
required bool isPrivate, required bool isPrivate,
@@ -219,8 +209,8 @@ class ConversationManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Delete conversation from local and service /// 删除本地以及服务器的会话
/// 删除会话 /// [conversationID] 会话ID
Future<dynamic> deleteConversationFromLocalAndSvr({ Future<dynamic> deleteConversationFromLocalAndSvr({
required String conversationID, required String conversationID,
String? operationID, String? operationID,
@@ -232,8 +222,7 @@ class ConversationManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Delete conversation from local /// 删除所有本地会话
/// 删除会话
Future<dynamic> deleteAllConversationFromLocal({ Future<dynamic> deleteAllConversationFromLocal({
String? operationID, String? operationID,
}) => }) =>
@@ -243,8 +232,8 @@ class ConversationManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Reset group converstaion at type /// 重置强提醒标识[GroupAtType]
/// 重置at标准位 /// [conversationID] 会话id
Future<dynamic> resetConversationGroupAtType({ Future<dynamic> resetConversationGroupAtType({
required String conversationID, required String conversationID,
String? operationID, String? operationID,
@@ -256,12 +245,39 @@ class ConversationManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Get @ all member tag /// 查询@所有人标识
/// 查询at所有人标识
Future<dynamic> getAtAllTag() => Future<dynamic> getAtAllTag() =>
_channel.invokeMethod('getAtAllTag', _buildParam({})); _channel.invokeMethod('getAtAllTag', _buildParam({}));
/// Custom sort for conversation list /// 全局免打扰
/// [status] 0正常1不接受消息2接受在线消息不接受离线消息
Future<dynamic> setGlobalRecvMessageOpt({
required int status,
String? operationID,
}) =>
_channel.invokeMethod(
'setGlobalRecvMessageOpt',
_buildParam({
"status": status,
"operationID": Utils.checkOperationID(operationID),
}));
/// 设置阅后即焚时长
/// [conversationID] 会话id
/// [burnDuration] 时长s默认30s
Future<dynamic> setOneConversationBurnDuration({
required String conversationID,
int burnDuration = 30,
String? operationID,
}) =>
_channel.invokeMethod(
'setOneConversationBurnDuration',
_buildParam({
"conversationID": conversationID,
"burnDuration": burnDuration,
"operationID": Utils.checkOperationID(operationID),
}));
/// 会话列表自定义排序规则。 /// 会话列表自定义排序规则。
List<ConversationInfo> simpleSort(List<ConversationInfo> list) => list List<ConversationInfo> simpleSort(List<ConversationInfo> list) => list
..sort((a, b) { ..sort((a, b) {

View File

@@ -7,16 +7,14 @@ class FriendshipManager {
FriendshipManager(this._channel); FriendshipManager(this._channel);
/// Set up a friend relationship listener
/// 好友关系监听 /// 好友关系监听
Future setFriendshipListener(OnFriendshipListener listener) { Future setFriendshipListener(OnFriendshipListener listener) {
this.listener = listener; this.listener = listener;
return _channel.invokeMethod('setFriendListener', _buildParam({})); return _channel.invokeMethod('setFriendListener', _buildParam({}));
} }
/// Get friend info by user id
/// 查询好友信息 /// 查询好友信息
/// [uidList] 好友的userID集合 /// [uidList] userID集合
Future<List<UserInfo>> getFriendsInfo({ Future<List<UserInfo>> getFriendsInfo({
required List<String> uidList, required List<String> uidList,
String? operationID, String? operationID,
@@ -30,10 +28,9 @@ class FriendshipManager {
})) }))
.then((value) => Utils.toList(value, (v) => UserInfo.fromJson(v))); .then((value) => Utils.toList(value, (v) => UserInfo.fromJson(v)));
/// Send an friend application
/// 发送一个好友请求,需要对方调用同意申请才能成为好友。 /// 发送一个好友请求,需要对方调用同意申请才能成为好友。
/// [uid] 被邀请的用户ID /// [uid] 被邀请的用户ID
/// [reason] 说明 /// [reason] 备注说明
Future<dynamic> addFriend({ Future<dynamic> addFriend({
required String uid, required String uid,
String? reason, String? reason,
@@ -47,7 +44,6 @@ class FriendshipManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Get someone's request to add me as a friend
/// 获取别人加我为好友的申请 /// 获取别人加我为好友的申请
Future<List<FriendApplicationInfo>> getRecvFriendApplicationList( Future<List<FriendApplicationInfo>> getRecvFriendApplicationList(
{String? operationID}) => {String? operationID}) =>
@@ -60,7 +56,6 @@ class FriendshipManager {
.then((value) => .then((value) =>
Utils.toList(value, (v) => FriendApplicationInfo.fromJson(v))); Utils.toList(value, (v) => FriendApplicationInfo.fromJson(v)));
/// Get friend requests from me
/// 获取我发出的好友申请 /// 获取我发出的好友申请
Future<List<FriendApplicationInfo>> getSendFriendApplicationList( Future<List<FriendApplicationInfo>> getSendFriendApplicationList(
{String? operationID}) => {String? operationID}) =>
@@ -73,8 +68,7 @@ class FriendshipManager {
.then((value) => .then((value) =>
Utils.toList(value, (v) => FriendApplicationInfo.fromJson(v))); Utils.toList(value, (v) => FriendApplicationInfo.fromJson(v)));
/// Find all friends including those who have been added to the blacklist /// 获取好友列表,返回的列表包含了已拉入黑名单的好友
/// 获取好友列表包含已拉入黑名单的好友
Future<List<UserInfo>> getFriendList({String? operationID}) => _channel Future<List<UserInfo>> getFriendList({String? operationID}) => _channel
.invokeMethod( .invokeMethod(
'getFriendList', 'getFriendList',
@@ -83,8 +77,7 @@ class FriendshipManager {
})) }))
.then((value) => Utils.toList(value, (v) => UserInfo.fromJson(v))); .then((value) => Utils.toList(value, (v) => UserInfo.fromJson(v)));
/// Find all friends including those who have been added to the blacklist /// 获取好友列表,返回的列表包含了已拉入黑名单的好友
/// 获取好友列表
Future<List<dynamic>> getFriendListMap({String? operationID}) => _channel Future<List<dynamic>> getFriendListMap({String? operationID}) => _channel
.invokeMethod( .invokeMethod(
'getFriendList', 'getFriendList',
@@ -93,7 +86,6 @@ class FriendshipManager {
})) }))
.then((value) => Utils.toListMap(value)); .then((value) => Utils.toListMap(value));
/// Modify friend remark name
/// 设置好友备注 /// 设置好友备注
/// [uid] 好友的userID /// [uid] 好友的userID
/// [remark] 好友的备注 /// [remark] 好友的备注
@@ -110,9 +102,8 @@ class FriendshipManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Add friends to blacklist
/// 加入黑名单 /// 加入黑名单
/// [uid]被加入黑名单的好友ID /// [uid] 被加入黑名单的好友ID
Future<dynamic> addBlacklist({ Future<dynamic> addBlacklist({
required String uid, required String uid,
String? operationID, String? operationID,
@@ -124,7 +115,6 @@ class FriendshipManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Find all blacklist
/// 获取黑名单列表 /// 获取黑名单列表
Future<List<UserInfo>> getBlacklist({String? operationID}) => _channel Future<List<UserInfo>> getBlacklist({String? operationID}) => _channel
.invokeMethod( .invokeMethod(
@@ -134,8 +124,8 @@ class FriendshipManager {
})) }))
.then((value) => Utils.toList(value, (v) => UserInfo.fromJson(v))); .then((value) => Utils.toList(value, (v) => UserInfo.fromJson(v)));
/// Remove from blacklist
/// 从黑名单移除 /// 从黑名单移除
/// [uid] 用户ID
Future<dynamic> removeBlacklist({ Future<dynamic> removeBlacklist({
required String uid, required String uid,
String? operationID, String? operationID,
@@ -147,8 +137,8 @@ class FriendshipManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Determine if there is a friendship by userId
/// 检查友好关系 /// 检查友好关系
/// [uidList] userID列表
Future<List<FriendshipInfo>> checkFriend({ Future<List<FriendshipInfo>> checkFriend({
required List<String> uidList, required List<String> uidList,
String? operationID, String? operationID,
@@ -163,8 +153,8 @@ class FriendshipManager {
.then((value) => .then((value) =>
Utils.toList(value, (v) => FriendshipInfo.fromJson(v))); Utils.toList(value, (v) => FriendshipInfo.fromJson(v)));
/// Dissolve friendship from friend list
/// 删除好友 /// 删除好友
/// [uid] 用户ID
Future<dynamic> deleteFriend({ Future<dynamic> deleteFriend({
required String uid, required String uid,
String? operationID, String? operationID,
@@ -176,8 +166,9 @@ class FriendshipManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Accept application of be friend
/// 接受好友请求 /// 接受好友请求
/// [uid] 用户ID
/// [handleMsg]备注说明
Future<dynamic> acceptFriendApplication({ Future<dynamic> acceptFriendApplication({
required String uid, required String uid,
String? handleMsg, String? handleMsg,
@@ -191,8 +182,9 @@ class FriendshipManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Refuse application of be friend
/// 拒绝好友请求 /// 拒绝好友请求
/// [uid] 用户ID
/// [handleMsg]备注说明
Future<dynamic> refuseFriendApplication({ Future<dynamic> refuseFriendApplication({
required String uid, required String uid,
String? handleMsg, String? handleMsg,
@@ -206,6 +198,33 @@ class FriendshipManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// 查好友
/// [keywordList] 搜索关键词,目前仅支持一个关键词搜索,不能为空
/// [isSearchUserID] 是否以关键词搜索好友ID(注不可以同时为false)为空默认false
/// [isSearchNickname] 是否以关键词搜索昵称为空默认false
/// [isSearchRemark] 是否以关键词搜索备注名为空默认false
Future<List<FriendInfo>> searchFriends({
List<String> keywordList = const [],
bool isSearchUserID = false,
bool isSearchNickname = false,
bool isSearchRemark = false,
String? operationID,
}) =>
_channel
.invokeMethod(
'searchFriends',
_buildParam({
'searchParam': {
'keywordList': keywordList,
'isSearchUserID': isSearchUserID,
'isSearchNickname': isSearchNickname,
'isSearchRemark': isSearchRemark,
},
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (map) => FriendInfo.fromJson(map)));
static Map _buildParam(Map param) { static Map _buildParam(Map param) {
param["ManagerName"] = "friendshipManager"; param["ManagerName"] = "friendshipManager";
return param; return param;

View File

@@ -7,15 +7,15 @@ class GroupManager {
GroupManager(this._channel); GroupManager(this._channel);
/// Set up group relationship monitoring
/// 组关系监听 /// 组关系监听
Future setGroupListener(OnGroupListener listener) { Future setGroupListener(OnGroupListener listener) {
this.listener = listener; this.listener = listener;
return _channel.invokeMethod('setGroupListener', _buildParam({})); return _channel.invokeMethod('setGroupListener', _buildParam({}));
} }
/// Invite friends into the group
/// 邀请进组,直接进组无需同意。 /// 邀请进组,直接进组无需同意。
/// [groupId] 组ID
/// [uidList] 用户ID列表
Future<List<GroupInviteResult>> inviteUserToGroup({ Future<List<GroupInviteResult>> inviteUserToGroup({
required String groupId, required String groupId,
required List<String> uidList, required List<String> uidList,
@@ -34,8 +34,10 @@ class GroupManager {
.then((value) => .then((value) =>
Utils.toList(value, (map) => GroupInviteResult.fromJson(map))); Utils.toList(value, (map) => GroupInviteResult.fromJson(map)));
/// Remove member from group
/// 移除组成员 /// 移除组成员
/// [groupId] 组ID
/// [uidList] 用户ID列表
/// [reason] 备注说明
Future<List<GroupInviteResult>> kickGroupMember({ Future<List<GroupInviteResult>> kickGroupMember({
required String groupId, required String groupId,
required List<String> uidList, required List<String> uidList,
@@ -54,8 +56,9 @@ class GroupManager {
.then((value) => .then((value) =>
Utils.toList(value, (map) => GroupInviteResult.fromJson(map))); Utils.toList(value, (map) => GroupInviteResult.fromJson(map)));
/// Get group member's info
/// 查询组成员资料 /// 查询组成员资料
/// [groupId] 组ID
/// [uidList] 用户ID列表
Future<List<GroupMembersInfo>> getGroupMembersInfo({ Future<List<GroupMembersInfo>> getGroupMembersInfo({
required String groupId, required String groupId,
required List<String> uidList, required List<String> uidList,
@@ -72,10 +75,9 @@ class GroupManager {
.then((value) => .then((value) =>
Utils.toList(value, (map) => GroupMembersInfo.fromJson(map))); Utils.toList(value, (map) => GroupMembersInfo.fromJson(map)));
/// Get the list of group members
/// 分页获取组成员列表 /// 分页获取组成员列表
/// [groupId] 群ID /// [groupId] 群ID
/// [filter] 过滤成员 1普通成员, 2群主3管理员0所有 /// [filter] 过滤成员 0所有1普通成员, 2群主3管理员4管理员+普通成员
/// [offset] 开始下标 /// [offset] 开始下标
/// [count] 总数 /// [count] 总数
Future<List<GroupMembersInfo>> getGroupMemberList({ Future<List<GroupMembersInfo>> getGroupMemberList({
@@ -98,10 +100,9 @@ class GroupManager {
.then((value) => .then((value) =>
Utils.toList(value, (map) => GroupMembersInfo.fromJson(map))); Utils.toList(value, (map) => GroupMembersInfo.fromJson(map)));
/// Get the list of group members
/// 分页获取组成员列表 /// 分页获取组成员列表
/// [groupId] 群ID /// [groupId] 群ID
/// [filter] 过滤成员 1普通成员, 2群主3管理员0所有 /// [filter] 过滤成员 0所有1普通成员, 2群主3管理员4管理员+普通成员
/// [offset] 开始下标 /// [offset] 开始下标
/// [count] 总数 /// [count] 总数
Future<List<dynamic>> getGroupMemberListMap({ Future<List<dynamic>> getGroupMemberListMap({
@@ -123,7 +124,6 @@ class GroupManager {
})) }))
.then((value) => Utils.toListMap(value)); .then((value) => Utils.toListMap(value));
/// Find all groups you have joined
/// 查询已加入的组列表 /// 查询已加入的组列表
Future<List<GroupInfo>> getJoinedGroupList({String? operationID}) => _channel Future<List<GroupInfo>> getJoinedGroupList({String? operationID}) => _channel
.invokeMethod( .invokeMethod(
@@ -133,7 +133,6 @@ class GroupManager {
})) }))
.then((value) => Utils.toList(value, (map) => GroupInfo.fromJson(map))); .then((value) => Utils.toList(value, (map) => GroupInfo.fromJson(map)));
/// Find all groups you have joined
/// 查询已加入的组列表 /// 查询已加入的组列表
Future<List<dynamic>> getJoinedGroupListMap({String? operationID}) => _channel Future<List<dynamic>> getJoinedGroupListMap({String? operationID}) => _channel
.invokeMethod( .invokeMethod(
@@ -143,8 +142,8 @@ class GroupManager {
})) }))
.then((value) => Utils.toListMap(value)); .then((value) => Utils.toListMap(value));
/// Check if you are a member of the group
/// 检查是否已加入组 /// 检查是否已加入组
/// [gid] 组ID
Future<bool> isJoinedGroup({ Future<bool> isJoinedGroup({
required String gid, required String gid,
String? operationID, String? operationID,
@@ -153,14 +152,14 @@ class GroupManager {
operationID: Utils.checkOperationID(operationID), operationID: Utils.checkOperationID(operationID),
).then((list) => list.where((e) => e.groupID == gid).length > 0); ).then((list) => list.where((e) => e.groupID == gid).length > 0);
/// Create a group
/// 创建一个组 /// 创建一个组
/// [groupName] 群名 /// [groupName] 群名
/// [notification] 公告 /// [notification] 公告
/// [introduction] 群介绍 /// [introduction] 群介绍
/// [faceUrl] 群头像 /// [faceUrl] 群头像
/// [groupType] 组类型 [GroupType]
/// [ex] 额外信息 /// [ex] 额外信息
/// [list] 初创群成员以及其角色 /// [list] 初创群成员以及其角色列表[GroupMemberRole]
Future<GroupInfo> createGroup({ Future<GroupInfo> createGroup({
String? groupName, String? groupName,
String? notification, String? notification,
@@ -189,7 +188,6 @@ class GroupManager {
.then( .then(
(value) => Utils.toObj(value, (map) => GroupInfo.fromJson(map))); (value) => Utils.toObj(value, (map) => GroupInfo.fromJson(map)));
/// Edit group information
/// 编辑组资料 /// 编辑组资料
/// [groupID] 被编辑的群ID /// [groupID] 被编辑的群ID
/// [groupName] 新的群名 /// [groupName] 新的群名
@@ -221,8 +219,8 @@ class GroupManager {
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
/// Find group information by group id
/// 查询组信息 /// 查询组信息
/// [gidList] 组ID列表
Future<List<GroupInfo>> getGroupsInfo({ Future<List<GroupInfo>> getGroupsInfo({
required List<String> gidList, required List<String> gidList,
String? operationID, String? operationID,
@@ -237,22 +235,23 @@ class GroupManager {
.then( .then(
(value) => Utils.toList(value, (map) => GroupInfo.fromJson(map))); (value) => Utils.toList(value, (map) => GroupInfo.fromJson(map)));
/// Apply to join the group
/// 申请加入组,需要通过管理员/群组同意。 /// 申请加入组,需要通过管理员/群组同意。
/// [joinSource] 2通过邀请 3通过搜索 4通过二维码
Future<dynamic> joinGroup({ Future<dynamic> joinGroup({
required String gid, required String gid,
String? reason, String? reason,
String? operationID, String? operationID,
int joinSource = 3,
}) => }) =>
_channel.invokeMethod( _channel.invokeMethod(
'joinGroup', 'joinGroup',
_buildParam({ _buildParam({
'gid': gid, 'gid': gid,
'reason': reason, 'reason': reason,
'joinSource': joinSource,
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
/// Leave group
/// 退出组 /// 退出组
Future<dynamic> quitGroup({ Future<dynamic> quitGroup({
required String gid, required String gid,
@@ -265,8 +264,9 @@ class GroupManager {
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
/// Give group permissions to others
/// 转移组拥有者权限 /// 转移组拥有者权限
/// [gid] 组ID
/// [uid] 新拥有者ID
Future<dynamic> transferGroupOwner({ Future<dynamic> transferGroupOwner({
required String gid, required String gid,
required String uid, required String uid,
@@ -280,7 +280,6 @@ class GroupManager {
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
/// As the group owner or administrator, the group member's application to join the group received
/// 作为群主或者管理员,收到的群成员入群申请 /// 作为群主或者管理员,收到的群成员入群申请
Future<List<GroupApplicationInfo>> getRecvGroupApplicationList( Future<List<GroupApplicationInfo>> getRecvGroupApplicationList(
{String? operationID}) => {String? operationID}) =>
@@ -293,7 +292,6 @@ class GroupManager {
.then((value) => .then((value) =>
Utils.toList(value, (map) => GroupApplicationInfo.fromJson(map))); Utils.toList(value, (map) => GroupApplicationInfo.fromJson(map)));
/// Get the record of the group membership application issued by yourself
/// 获取自己发出的入群申请记录 /// 获取自己发出的入群申请记录
Future<List<GroupApplicationInfo>> getSendGroupApplicationList( Future<List<GroupApplicationInfo>> getSendGroupApplicationList(
{String? operationID}) => {String? operationID}) =>
@@ -306,9 +304,10 @@ class GroupManager {
.then((value) => .then((value) =>
Utils.toList(value, (map) => GroupApplicationInfo.fromJson(map))); Utils.toList(value, (map) => GroupApplicationInfo.fromJson(map)));
/// Accept group application
/// 管理员或者群主同意某人进入某群 /// 管理员或者群主同意某人进入某群
/// 注:主动申请入群需要通过管理员/群组处理,被别人拉入群不需要管理员/群组处理 /// 注:主动申请入群需要通过管理员/群组处理,被别人拉入群不需要管理员/群组处理
/// [gid] 组id
/// [uid] 申请者用户ID
Future<dynamic> acceptGroupApplication({ Future<dynamic> acceptGroupApplication({
required String gid, required String gid,
required String uid, required String uid,
@@ -324,9 +323,11 @@ class GroupManager {
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
/// Refuse group application
/// 管理员或者群主拒绝某人进入某群 /// 管理员或者群主拒绝某人进入某群
/// 注:主动申请入群需要通过管理员/群组处理,被别人拉入群不需要管理员/群组处理 /// 注:主动申请入群需要通过管理员/群组处理,被别人拉入群不需要管理员/群组处理
/// [gid] 组id
/// [uid] 申请者用户ID
/// [handleMsg] 说明
Future<dynamic> refuseGroupApplication({ Future<dynamic> refuseGroupApplication({
required String gid, required String gid,
required String uid, required String uid,
@@ -342,8 +343,8 @@ class GroupManager {
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
/// Dissmiss group
/// 解散群 /// 解散群
/// [groupID] 群ID
Future<dynamic> dismissGroup({ Future<dynamic> dismissGroup({
required String groupID, required String groupID,
String? operationID, String? operationID,
@@ -355,7 +356,6 @@ class GroupManager {
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
/// Enable group mute
/// 开启群禁言,所有群成员禁止发言 /// 开启群禁言,所有群成员禁止发言
/// [groupID] 将开启群禁言的组ID /// [groupID] 将开启群禁言的组ID
/// [mute] true开启false关闭 /// [mute] true开启false关闭
@@ -372,11 +372,10 @@ class GroupManager {
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
/// Mute group members
/// 禁言群成员 /// 禁言群成员
/// [groupID] 群ID /// [groupID] 群ID
/// [userID] 将被禁言的成员ID /// [userID] 将被禁言的成员ID
/// [seconds] 被禁言的时间s设置为0则为接触禁言 /// [seconds] 被禁言的时间s设置为0则为解除禁言
Future<dynamic> changeGroupMemberMute({ Future<dynamic> changeGroupMemberMute({
required String groupID, required String groupID,
required String userID, required String userID,
@@ -392,7 +391,6 @@ class GroupManager {
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
/// Set group user nickname
/// 设置群成员昵称 /// 设置群成员昵称
/// [groupID] 群ID /// [groupID] 群ID
/// [userID] 群成员的用户ID /// [userID] 群成员的用户ID
@@ -412,7 +410,6 @@ class GroupManager {
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
/// Search group
/// 查询群 /// 查询群
/// [keywordList] 搜索关键词,目前仅支持一个关键词搜索,不能为空 /// [keywordList] 搜索关键词,目前仅支持一个关键词搜索,不能为空
/// [isSearchGroupID] 是否以关键词搜索群ID(注两个不可以同时为false)为空默认false /// [isSearchGroupID] 是否以关键词搜索群ID(注两个不可以同时为false)为空默认false
@@ -437,6 +434,203 @@ class GroupManager {
.then( .then(
(value) => Utils.toList(value, (map) => GroupInfo.fromJson(map))); (value) => Utils.toList(value, (map) => GroupInfo.fromJson(map)));
/// 设置群成员权限
/// [groupID] 群ID
/// [userID] 群成员的用户ID
/// [roleLevel] 角色等级,参考[GroupRoleLevel]
Future<dynamic> setGroupMemberRoleLevel({
required String groupID,
required String userID,
required int roleLevel,
String? operationID,
}) =>
_channel.invokeMethod(
'setGroupMemberRoleLevel',
_buildParam({
'groupID': groupID,
'userID': userID,
'roleLevel': roleLevel,
'operationID': Utils.checkOperationID(operationID),
}));
/// 根据加入时间分页获取组成员列表
/// [groupID] 群ID
/// [joinTimeBegin] 加入开始时间
/// [joinTimeEnd] 加入结束时间
/// [offset] 开始下标
/// [count] 总数
/// [excludeUserIDList] 排除的用户
Future<List<GroupMembersInfo>> getGroupMemberListByJoinTime({
required String groupID,
int offset = 0,
int count = 0,
int joinTimeBegin = 0,
int joinTimeEnd = 0,
List<String> excludeUserIDList = const [],
String? operationID,
}) =>
_channel
.invokeMethod(
'getGroupMemberListByJoinTimeFilter',
_buildParam({
'groupID': groupID,
'offset': offset,
'count': count,
'joinTimeBegin': joinTimeBegin,
'joinTimeEnd': joinTimeEnd,
'excludeUserIDList': excludeUserIDList,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (map) => GroupMembersInfo.fromJson(map)));
/// 进群验证设置
/// [groupID] 群ID
/// [needVerification] 进群设置,参考[GroupVerification]类
Future<dynamic> setGroupVerification({
required String groupID,
required int needVerification,
String? operationID,
}) =>
_channel.invokeMethod(
'setGroupVerification',
_buildParam({
'groupID': groupID,
'needVerification': needVerification,
'operationID': Utils.checkOperationID(operationID),
}));
/// 不允许通过群获取成员资料
/// [groupID] 群ID
/// [status] 0关闭1打开
Future<dynamic> setGroupLookMemberInfo({
required String groupID,
required int status,
String? operationID,
}) =>
_channel.invokeMethod(
'setGroupLookMemberInfo',
_buildParam({
'groupID': groupID,
'status': status,
'operationID': Utils.checkOperationID(operationID),
}));
/// 不允许通过群添加好友
/// [groupID] 群ID
/// [status] 0关闭1打开
Future<dynamic> setGroupApplyMemberFriend({
required String groupID,
required int status,
String? operationID,
}) =>
_channel.invokeMethod(
'setGroupApplyMemberFriend',
_buildParam({
'groupID': groupID,
'status': status,
'operationID': Utils.checkOperationID(operationID),
}));
/// 获取群拥有者,管理员
/// [groupId] 群ID
Future<List<GroupMembersInfo>> getGroupOwnerAndAdmin({
required String groupID,
String? operationID,
}) =>
_channel
.invokeMethod(
'getGroupMemberOwnerAndAdmin',
_buildParam({
'groupID': groupID,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (map) => GroupMembersInfo.fromJson(map)));
/// 查询群
/// [groupID] 群id
/// [keywordList] 搜索关键词,目前仅支持一个关键词搜索,不能为空
/// [isSearchUserID] 是否以关键词搜成员id
/// [isSearchMemberNickname] 是否以关键词搜索成员昵称
/// [offset] 开始index
/// [count] 每次获取的总数
Future<List<GroupMembersInfo>> searchGroupMembers({
required String groupID,
List<String> keywordList = const [],
bool isSearchUserID = false,
bool isSearchMemberNickname = false,
int offset = 0,
int count = 40,
String? operationID,
}) =>
_channel
.invokeMethod(
'searchGroupMembers',
_buildParam({
'searchParam': {
'groupID': groupID,
'keywordList': keywordList,
'isSearchUserID': isSearchUserID,
'isSearchMemberNickname': isSearchMemberNickname,
'offset': offset,
'count': count,
},
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (map) => GroupMembersInfo.fromJson(map)));
/// 查询群
/// [groupID] 群id
/// [keywordList] 搜索关键词,目前仅支持一个关键词搜索,不能为空
/// [isSearchUserID] 是否以关键词搜成员id
/// [isSearchMemberNickname] 是否以关键词搜索成员昵称
/// [offset] 开始index
/// [count] 每次获取的总数
Future<List<dynamic>> searchGroupMembersListMap({
required String groupID,
List<String> keywordList = const [],
bool isSearchUserID = false,
bool isSearchMemberNickname = false,
int offset = 0,
int count = 40,
String? operationID,
}) =>
_channel
.invokeMethod(
'searchGroupMembers',
_buildParam({
'searchParam': {
'groupID': groupID,
'keywordList': keywordList,
'isSearchUserID': isSearchUserID,
'isSearchMemberNickname': isSearchMemberNickname,
'offset': offset,
'count': count,
},
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toListMap(value));
/// 修改GroupMemberInfo ex字段
Future<dynamic> setGroupMemberInfo({
required String groupID,
required String userID,
String? ex,
String? operationID,
}) =>
_channel.invokeMethod(
'setGroupMemberInfo',
_buildParam({
'info': {
'groupID': groupID,
'userID': userID,
'ex': ex,
},
'operationID': Utils.checkOperationID(operationID),
}));
static Map _buildParam(Map param) { static Map _buildParam(Map param) {
param["ManagerName"] = "groupManager"; param["ManagerName"] = "groupManager";
return param; return param;

View File

@@ -2,6 +2,7 @@ import 'dart:developer';
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';
import 'package:flutter_openim_sdk/src/logger.dart';
class IMManager { class IMManager {
MethodChannel _channel; MethodChannel _channel;
@@ -17,6 +18,7 @@ class IMManager {
late OrganizationManager organizationManager; late OrganizationManager organizationManager;
late OnConnectListener _connectListener; late OnConnectListener _connectListener;
OnListenerForService? _listenerForService;
late String uid; late String uid;
late UserInfo uInfo; late UserInfo uInfo;
bool isLogined = false; bool isLogined = false;
@@ -39,7 +41,7 @@ class IMManager {
void _addNativeCallback(MethodChannel _channel) { void _addNativeCallback(MethodChannel _channel) {
_channel.setMethodCallHandler((call) { _channel.setMethodCallHandler((call) {
try { try {
log('Flutter : $call'); Logger.print('Flutter : $call');
if (call.method == ListenerType.connectListener) { if (call.method == ListenerType.connectListener) {
String type = call.arguments['type']; String type = call.arguments['type'];
switch (type) { switch (type) {
@@ -57,8 +59,8 @@ class IMManager {
case 'onKickedOffline': case 'onKickedOffline':
_connectListener.kickedOffline(); _connectListener.kickedOffline();
break; break;
case 'onUserSigExpired': case 'onUserTokenExpired':
_connectListener.userSigExpired(); _connectListener.userTokenExpired();
break; break;
} }
} else if (call.method == ListenerType.userListener) { } else if (call.method == ListenerType.userListener) {
@@ -124,7 +126,7 @@ class IMManager {
} }
} else if (call.method == ListenerType.advancedMsgListener) { } else if (call.method == ListenerType.advancedMsgListener) {
var type = call.arguments['type']; var type = call.arguments['type'];
var id = call.arguments['data']['id']; // var id = call.arguments['data']['id'];
switch (type) { switch (type) {
case 'onRecvNewMessage': case 'onRecvNewMessage':
var value = call.arguments['data']['newMessage']; var value = call.arguments['data']['newMessage'];
@@ -147,6 +149,32 @@ class IMManager {
Utils.toList(value, (map) => ReadReceiptInfo.fromJson(map)); Utils.toList(value, (map) => ReadReceiptInfo.fromJson(map));
messageManager.msgListener.recvGroupMessageReadReceipt(list); messageManager.msgListener.recvGroupMessageReadReceipt(list);
break; break;
case 'onNewRecvMessageRevoked':
var value = call.arguments['data']['revokedMessageV2'];
var info = Utils.toObj(value, (map) => RevokedInfo.fromJson(map));
messageManager.msgListener.recvMessageRevokedV2(info);
break;
case 'onRecvMessageExtensionsChanged':
var msgID = call.arguments['data']['msgID'];
var value = call.arguments['data']['list'];
var list = Utils.toList(value, (map) => KeyValue.fromJson(map));
messageManager.msgListener
.recvMessageExtensionsChanged(msgID, list);
break;
case 'onRecvMessageExtensionsDeleted':
var msgID = call.arguments['data']['msgID'];
var value = call.arguments['data']['list'];
var list = Utils.toList(value, (map) => '$map');
messageManager.msgListener
.recvMessageExtensionsDeleted(msgID, list);
break;
case 'onRecvMessageExtensionsAdded':
var msgID = call.arguments['data']['msgID'];
var value = call.arguments['data']['list'];
var list = Utils.toList(value, (map) => KeyValue.fromJson(map));
messageManager.msgListener
.recvMessageExtensionsAdded(msgID, list);
break;
} }
} else if (call.method == ListenerType.msgSendProgressListener) { } else if (call.method == ListenerType.msgSendProgressListener) {
String type = call.arguments['type']; String type = call.arguments['type'];
@@ -239,31 +267,59 @@ class IMManager {
} else if (call.method == ListenerType.signalingListener) { } else if (call.method == ListenerType.signalingListener) {
String type = call.arguments['type']; String type = call.arguments['type'];
dynamic data = call.arguments['data']; dynamic data = call.arguments['data'];
final u = Utils.toObj(data, (map) => SignalingInfo.fromJson(map)); dynamic info;
switch (type) {
case 'onRoomParticipantConnected':
case 'onRoomParticipantDisconnected':
info = Utils.toObj(data, (map) => RoomCallingInfo.fromJson(map));
break;
case 'onStreamChange':
info =
Utils.toObj(data, (map) => MeetingStreamEvent.fromJson(map));
break;
case 'onReceiveCustomSignal':
info = Utils.toObj(data, (map) => CustomSignaling.fromJson(map));
break;
default:
info = Utils.toObj(data, (map) => SignalingInfo.fromJson(map));
break;
}
switch (type) { switch (type) {
case 'onInvitationCancelled': case 'onInvitationCancelled':
signalingManager.listener.invitationCancelled(u); signalingManager.listener.invitationCancelled(info);
break; break;
case 'onInvitationTimeout': case 'onInvitationTimeout':
signalingManager.listener.invitationTimeout(u); signalingManager.listener.invitationTimeout(info);
break; break;
case 'onInviteeAccepted': case 'onInviteeAccepted':
signalingManager.listener.inviteeAccepted(u); signalingManager.listener.inviteeAccepted(info);
break; break;
case 'onInviteeRejected': case 'onInviteeRejected':
signalingManager.listener.inviteeRejected(u); signalingManager.listener.inviteeRejected(info);
break; break;
case 'onReceiveNewInvitation': case 'onReceiveNewInvitation':
signalingManager.listener.receiveNewInvitation(u); signalingManager.listener.receiveNewInvitation(info);
break; break;
case 'onInviteeAcceptedByOtherDevice': case 'onInviteeAcceptedByOtherDevice':
signalingManager.listener.inviteeAcceptedByOtherDevice(u); signalingManager.listener.inviteeAcceptedByOtherDevice(info);
break; break;
case 'onInviteeRejectedByOtherDevice': case 'onInviteeRejectedByOtherDevice':
signalingManager.listener.inviteeRejectedByOtherDevice(u); signalingManager.listener.inviteeRejectedByOtherDevice(info);
break; break;
case 'onHangUp': case 'onHangUp':
signalingManager.listener.hangup(u); signalingManager.listener.hangup(info);
break;
case 'onRoomParticipantConnected':
signalingManager.listener.roomParticipantConnected(info);
break;
case 'onRoomParticipantDisconnected':
signalingManager.listener.roomParticipantDisconnected(info);
break;
case 'onStreamChange':
signalingManager.listener.streamChangedEvent(info);
break;
case 'onReceiveCustomSignal':
signalingManager.listener.receiveCustomSignal(info);
break; break;
} }
} else if (call.method == ListenerType.workMomentsListener) { } else if (call.method == ListenerType.workMomentsListener) {
@@ -280,32 +336,72 @@ class IMManager {
organizationManager.listener.organizationUpdated(); organizationManager.listener.organizationUpdated();
break; break;
} }
} else if (call.method == ListenerType.customBusinessListener) {
String type = call.arguments['type'];
String data = call.arguments['data'];
switch (type) {
case 'onRecvCustomBusinessMessage':
messageManager.customBusinessListener
?.recvCustomBusinessMessage(data);
break;
}
} else if (call.method == ListenerType.messageKvInfoListener) {
String type = call.arguments['type'];
String data = call.arguments['data'];
switch (type) {
case 'onMessageKvInfoChanged':
final list =
Utils.toList(data, (map) => MessageKv.fromJson(map)).toList();
messageManager.messageKvInfoListener?.messageKvInfoChanged(list);
break;
}
} else if (call.method == ListenerType.listenerForService) {
String type = call.arguments['type'];
String data = call.arguments['data'];
switch (type) {
case 'onFriendApplicationAccepted':
final u = Utils.toObj(
data, (map) => FriendApplicationInfo.fromJson(map));
_listenerForService?.friendApplicationAccepted(u);
break;
case 'onFriendApplicationAdded':
final u = Utils.toObj(
data, (map) => FriendApplicationInfo.fromJson(map));
_listenerForService?.friendApplicationAdded(u);
break;
case 'onGroupApplicationAccepted':
final i = Utils.toObj(
data, (map) => GroupApplicationInfo.fromJson(map));
_listenerForService?.groupApplicationAccepted(i);
break;
case 'onGroupApplicationAdded':
final i = Utils.toObj(
data, (map) => GroupApplicationInfo.fromJson(map));
_listenerForService?.groupApplicationAdded(i);
break;
case 'onRecvNewMessage':
final msg = Utils.toObj(data, (map) => Message.fromJson(map));
_listenerForService?.recvNewMessage(msg);
break;
}
} }
} catch (err) { } catch (error, stackTrace) {
print( Logger.print(
"回调失败了。$err ${call.method} ${call.arguments['type']} ${call.arguments['data']}"); "回调失败了。${call.method} ${call.arguments['type']} ${call.arguments['data']} $error $stackTrace");
} }
return Future.value(null); return Future.value(null);
}); });
} }
/// Initialize SDK
///
/// [platform] platform number [IMPlatform]
/// [apiAddr] api server ip address
/// [wsAddr] webSocket ip address
/// [dataDir] data storage directory
/// [objectStorage] storage object: cos/minio
/// [logLevel] log level: 1-not print
///
/// 初始化SDK /// 初始化SDK
///
/// [platform] 平台编号[IMPlatform] /// [platform] 平台编号[IMPlatform]
/// [apiAddr] SDK api地址 /// [apiAddr] SDK api地址
/// [wsAddr] SDK websocket地址 /// [wsAddr] SDK websocket地址
/// [dataDir] SDK数据库存储目录 /// [dataDir] SDK数据库存储目录
/// [objectStorage] 存储对象 cos/minio /// [objectStorage] 存储对象 cos/minio
/// [logLevel] 日志 1-不打印 /// [logLevel] 日志 1不打印
/// [enabledEncryption] true加密
/// [enabledCompression] true压缩
Future<dynamic> initSDK({ Future<dynamic> initSDK({
required int platform, required int platform,
required String apiAddr, required String apiAddr,
@@ -314,6 +410,10 @@ class IMManager {
required OnConnectListener listener, required OnConnectListener listener,
int logLevel = 6, int logLevel = 6,
String objectStorage = 'cos', String objectStorage = 'cos',
String? encryptionKey,
bool enabledEncryption = false,
bool enabledCompression = false,
bool isExternalExtensions = false,
String? operationID, String? operationID,
}) { }) {
this._connectListener = listener; this._connectListener = listener;
@@ -328,24 +428,29 @@ class IMManager {
"data_dir": dataDir, "data_dir": dataDir,
"log_level": logLevel, "log_level": logLevel,
"object_storage": objectStorage, "object_storage": objectStorage,
"encryption_key": encryptionKey,
"is_need_encryption": enabledEncryption,
"is_compression ": enabledCompression,
"is_external_extensions": isExternalExtensions,
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
}, },
)); ));
} }
@deprecated /// 反初始化SDK
Future<dynamic> unInitSDK() { Future<dynamic> unInitSDK() {
return _channel.invokeMethod('unInitSDK', _buildParam({})); return _channel.invokeMethod('unInitSDK', _buildParam({}));
} }
/// Login sdk
/// 登录 /// 登录
/// [uid]用户id /// [uid] 用户id
/// [token]登录token从业务服务器上获取 /// [token] 登录token从业务服务器上获取
/// [defaultValue] 获取失败后使用的默认值
Future<UserInfo> login({ Future<UserInfo> login({
required String uid, required String uid,
required String token, required String token,
String? operationID, String? operationID,
Future<UserInfo> Function()? defaultValue,
}) async { }) async {
await _channel.invokeMethod( await _channel.invokeMethod(
'login', 'login',
@@ -358,11 +463,18 @@ class IMManager {
this.isLogined = true; this.isLogined = true;
this.uid = uid; this.uid = uid;
this.token = token; this.token = token;
this.uInfo = await userManager.getSelfUserInfo(); try {
return uInfo; return this.uInfo = await userManager.getSelfUserInfo();
} catch (error, stackTrace) {
log('login e: $error s: $stackTrace');
if (null != defaultValue) {
return this.uInfo = await (defaultValue.call());
}
return Future.error(error, stackTrace);
}
// return uInfo;
} }
/// Logout sdk
/// 登出 /// 登出
Future<dynamic> logout({String? operationID}) async { Future<dynamic> logout({String? operationID}) async {
var value = await _channel.invokeMethod( var value = await _channel.invokeMethod(
@@ -375,19 +487,16 @@ class IMManager {
return value; return value;
} }
/// /// 获取登录状态
Future<int?> getLoginStatus() => Future<int?> getLoginStatus() =>
_channel.invokeMethod<int>('getLoginStatus', _buildParam({})); _channel.invokeMethod<int>('getLoginStatus', _buildParam({}));
/// Current user id
/// 获取当前登录用户id /// 获取当前登录用户id
Future<String> getLoginUserID() async => uid; Future<String> getLoginUserID() async => uid;
/// Current user info
/// 获取当前登录用户信息 /// 获取当前登录用户信息
Future<UserInfo> getLoginUserInfo() async => uInfo; Future<UserInfo> getLoginUserInfo() async => uInfo;
/// wakeup
/// 从后台回到前台立刻唤醒 /// 从后台回到前台立刻唤醒
Future wakeUp({String? operationID}) => _channel.invokeMethod( Future wakeUp({String? operationID}) => _channel.invokeMethod(
'wakeUp', 'wakeUp',
@@ -395,9 +504,8 @@ class IMManager {
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
/// upload image to server
/// 上传图片到服务器 /// 上传图片到服务器
/// [path]图片路径 /// [path] 图片路径
/// [token] im token /// [token] im token
/// [objectStorage] 存储对象 cos/minio /// [objectStorage] 存储对象 cos/minio
Future uploadImage({ Future uploadImage({
@@ -415,6 +523,48 @@ class IMManager {
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
/// 更新firebase客户端注册token
/// [fcmToken] firebase token
Future updateFcmToken({
required String fcmToken,
String? operationID,
}) =>
_channel.invokeMethod(
'updateFcmToken',
_buildParam({
'fcmToken': fcmToken,
'operationID': Utils.checkOperationID(operationID),
}));
/// 标记app处于后台
Future setAppBackgroundStatus({
required bool isBackground,
String? operationID,
}) =>
_channel.invokeMethod(
'setAppBackgroundStatus',
_buildParam({
'isBackground': isBackground,
'operationID': Utils.checkOperationID(operationID),
}));
/// 网络改变
Future networkChanged({
String? operationID,
}) =>
_channel.invokeMethod(
'networkChanged',
_buildParam({
'operationID': Utils.checkOperationID(operationID),
}));
Future setListenerForService(OnListenerForService listener) {
this._listenerForService = listener;
return _channel.invokeMethod('setListenerForService', _buildParam({}));
}
MethodChannel get channel => _channel;
static Map _buildParam(Map param) { static Map _buildParam(Map param) {
param["ManagerName"] = "imManager"; param["ManagerName"] = "imManager";
return param; return param;

View File

@@ -7,10 +7,11 @@ class MessageManager {
// List<AdvancedMsgListener> advancedMsgListeners = List.empty(growable: true); // List<AdvancedMsgListener> advancedMsgListeners = List.empty(growable: true);
OnMsgSendProgressListener? msgSendProgressListener; OnMsgSendProgressListener? msgSendProgressListener;
late OnAdvancedMsgListener msgListener; late OnAdvancedMsgListener msgListener;
OnCustomBusinessListener? customBusinessListener;
OnMessageKvInfoListener? messageKvInfoListener;
MessageManager(this._channel); MessageManager(this._channel);
/// Set a message listener
/// 消息监听 /// 消息监听
Future setAdvancedMsgListener(OnAdvancedMsgListener listener) { Future setAdvancedMsgListener(OnAdvancedMsgListener listener) {
this.msgListener = listener; this.msgListener = listener;
@@ -22,18 +23,16 @@ class MessageManager {
})); }));
} }
/// Set up message sending progress monitoring
/// 消息发送进度监听 /// 消息发送进度监听
void setMsgSendProgressListener(OnMsgSendProgressListener listener) { void setMsgSendProgressListener(OnMsgSendProgressListener listener) {
msgSendProgressListener = listener; msgSendProgressListener = listener;
} }
/// Send a message to user or to group
/// [userID] receiver's user ID
/// 发送消息 /// 发送消息
/// [userID]接收消息的用户id /// [message] 消息体
/// [groupID]接收消息的id /// [userID] 接收消息的用户id
/// [offlinePushInfo]离线消息显示内容 /// [groupID] 接收消息的组id
/// [offlinePushInfo] 离线消息显示内容
Future<Message> sendMessage({ Future<Message> sendMessage({
required Message message, required Message message,
required OfflinePushInfo offlinePushInfo, required OfflinePushInfo offlinePushInfo,
@@ -53,7 +52,6 @@ class MessageManager {
})) }))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Find all history message
/// 获取聊天记录(以startMsg为节点以前的聊天记录) /// 获取聊天记录(以startMsg为节点以前的聊天记录)
/// [userID] 接收消息的用户id /// [userID] 接收消息的用户id
/// [conversationID] 会话id查询通知时可用 /// [conversationID] 会话id查询通知时可用
@@ -81,8 +79,9 @@ class MessageManager {
})) }))
.then((value) => Utils.toList(value, (map) => Message.fromJson(map))); .then((value) => Utils.toList(value, (map) => Message.fromJson(map)));
/// Revoke the sent information /// 撤回消息[revokeMessageV2]
/// 撤回消息 /// [message] 被撤回消息
@deprecated
Future revokeMessage({ Future revokeMessage({
required Message message, required Message message,
String? operationID, String? operationID,
@@ -94,8 +93,8 @@ class MessageManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
}))); })));
/// Delete message
/// 删除本地消息 /// 删除本地消息
/// [message] 被删除的消息体
Future deleteMessageFromLocalStorage({ Future deleteMessageFromLocalStorage({
required Message message, required Message message,
String? operationID, String? operationID,
@@ -107,12 +106,10 @@ class MessageManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
}))); })));
///
// Future deleteMessages({required List<Message> msgList}) =>
// _channel.invokeMethod('deleteMessages',
// _buildParam({"msgList": msgList.map((e) => e.toJson()).toList()}));
/// 插入单聊消息到本地 /// 插入单聊消息到本地
/// [receiverID] 接收者id
/// [senderID] 发送者id
/// [message] 消息体
Future<Message> insertSingleMessageToLocalStorage({ Future<Message> insertSingleMessageToLocalStorage({
String? receiverID, String? receiverID,
String? senderID, String? senderID,
@@ -131,6 +128,9 @@ class MessageManager {
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// 插入群聊消息到本地 /// 插入群聊消息到本地
/// [groupID] 群id
/// [senderID] 发送者id
/// [message] 消息体
Future<Message> insertGroupMessageToLocalStorage({ Future<Message> insertGroupMessageToLocalStorage({
String? groupID, String? groupID,
String? senderID, String? senderID,
@@ -148,8 +148,9 @@ class MessageManager {
})) }))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Mark c2c message as read /// 标记c2c单条消息已读
/// 标记c2c消息已读 /// [userID] 消息来源的userID
/// [messageIDList] 消息clientMsgID集合
Future markC2CMessageAsRead({ Future markC2CMessageAsRead({
required String userID, required String userID,
required List<String> messageIDList, required List<String> messageIDList,
@@ -163,8 +164,9 @@ class MessageManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Mark group message as read
/// 标记群聊消息已读 /// 标记群聊消息已读
/// [groupID] 群id
/// [messageIDList] 消息clientMsgID集合
Future markGroupMessageAsRead({ Future markGroupMessageAsRead({
required String groupID, required String groupID,
required List<String> messageIDList, required List<String> messageIDList,
@@ -178,7 +180,6 @@ class MessageManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Typing
/// 正在输入提示 /// 正在输入提示
/// [msgTip] 自定义内容 /// [msgTip] 自定义内容
Future typingStatusUpdate({ Future typingStatusUpdate({
@@ -194,7 +195,6 @@ class MessageManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Create text message
/// 创建文本消息 /// 创建文本消息
Future<Message> createTextMessage({ Future<Message> createTextMessage({
required String text, required String text,
@@ -209,7 +209,6 @@ class MessageManager {
})) }))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create @ message
/// 创建@消息 /// 创建@消息
/// [text] 输入内容 /// [text] 输入内容
/// [atUserIDList] 被@到的userID集合 /// [atUserIDList] 被@到的userID集合
@@ -235,8 +234,8 @@ class MessageManager {
) )
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create picture message
/// 创建图片消息 /// 创建图片消息
/// [imagePath] 路径
Future<Message> createImageMessage({ Future<Message> createImageMessage({
required String imagePath, required String imagePath,
String? operationID, String? operationID,
@@ -251,7 +250,6 @@ class MessageManager {
) )
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create picture message
/// 创建图片消息 /// 创建图片消息
/// [imagePath] 路径 /// [imagePath] 路径
Future<Message> createImageMessageFromFullPath({ Future<Message> createImageMessageFromFullPath({
@@ -268,8 +266,9 @@ class MessageManager {
) )
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create sound message
/// 创建语音消息 /// 创建语音消息
/// [soundPath] 路径
/// [duration] 时长s
Future<Message> createSoundMessage({ Future<Message> createSoundMessage({
required String soundPath, required String soundPath,
required int duration, required int duration,
@@ -286,7 +285,6 @@ class MessageManager {
) )
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create sound message
/// 创建语音消息 /// 创建语音消息
/// [soundPath] 路径 /// [soundPath] 路径
/// [duration] 时长s /// [duration] 时长s
@@ -306,8 +304,11 @@ class MessageManager {
) )
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create video message
/// 创建视频消息 /// 创建视频消息
/// [videoPath] 路径
/// [videoType] 视频mime类型
/// [duration] 时长s
/// [snapshotPath] 默认站位图路径
Future<Message> createVideoMessage({ Future<Message> createVideoMessage({
required String videoPath, required String videoPath,
required String videoType, required String videoType,
@@ -327,7 +328,6 @@ class MessageManager {
})) }))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create video message
/// 创建视频消息 /// 创建视频消息
/// [videoPath] 路径 /// [videoPath] 路径
/// [videoType] 视频mime类型 /// [videoType] 视频mime类型
@@ -352,8 +352,9 @@ class MessageManager {
})) }))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create file message
/// 创建文件消息 /// 创建文件消息
/// [filePath] 路径
/// [fileName] 文件名
Future<Message> createFileMessage({ Future<Message> createFileMessage({
required String filePath, required String filePath,
required String fileName, required String fileName,
@@ -370,7 +371,6 @@ class MessageManager {
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
} }
/// Create file message
/// 创建文件消息 /// 创建文件消息
/// [filePath] 路径 /// [filePath] 路径
/// [fileName] 文件名 /// [fileName] 文件名
@@ -389,7 +389,6 @@ class MessageManager {
})) }))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create merger message
/// 创建合并消息 /// 创建合并消息
/// [messageList] 被选中的消息 /// [messageList] 被选中的消息
/// [title] 摘要标题 /// [title] 摘要标题
@@ -411,7 +410,6 @@ class MessageManager {
})) }))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create forward message
/// 创建转发消息 /// 创建转发消息
/// [message] 被转发的消息 /// [message] 被转发的消息
Future<Message> createForwardMessage({ Future<Message> createForwardMessage({
@@ -428,7 +426,6 @@ class MessageManager {
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
} }
/// Create location message
/// 创建位置消息 /// 创建位置消息
/// [latitude] 纬度 /// [latitude] 纬度
/// [longitude] 经度 /// [longitude] 经度
@@ -450,8 +447,10 @@ class MessageManager {
})) }))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create custom message
/// 创建自定义消息 /// 创建自定义消息
/// [data] 自定义数据
/// [extension] 自定义扩展内容
/// [description] 自定义描述内容
Future<Message> createCustomMessage({ Future<Message> createCustomMessage({
required String data, required String data,
required String extension, required String extension,
@@ -469,7 +468,6 @@ class MessageManager {
})) }))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create quote message
/// 创建引用消息 /// 创建引用消息
/// [text] 回复的内容 /// [text] 回复的内容
/// [quoteMsg] 被回复的消息 /// [quoteMsg] 被回复的消息
@@ -488,8 +486,8 @@ class MessageManager {
})) }))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create card message
/// 创建卡片消息 /// 创建卡片消息
/// [data] 自定义数据
Future<Message> createCardMessage({ Future<Message> createCardMessage({
required Map<String, dynamic> data, required Map<String, dynamic> data,
String? operationID, String? operationID,
@@ -503,9 +501,6 @@ 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 expressions
/// 创建自定义表情消息 /// 创建自定义表情消息
/// [index] 位置表情根据index匹配 /// [index] 位置表情根据index匹配
/// [data] url表情直接使用url显示 /// [data] url表情直接使用url显示
@@ -524,8 +519,8 @@ class MessageManager {
})) }))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Clear all c2c history message
/// 清空单聊消息记录 /// 清空单聊消息记录
/// [uid] 单聊对象id
Future<dynamic> clearC2CHistoryMessage({ Future<dynamic> clearC2CHistoryMessage({
required String uid, required String uid,
String? operationID, String? operationID,
@@ -537,8 +532,8 @@ class MessageManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Clear all group history
/// 清空组消息记录 /// 清空组消息记录
/// [gid] 组id
Future<dynamic> clearGroupHistoryMessage({ Future<dynamic> clearGroupHistoryMessage({
required String gid, required String gid,
String? operationID, String? operationID,
@@ -550,17 +545,16 @@ class MessageManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Search local message
/// 搜索消息 /// 搜索消息
/// [conversationID] 根据会话查询如果是全局搜索传null /// [conversationID] 根据会话查询如果是全局搜索传null
/// [keywordList]搜索关键词列表,目前仅支持一个关键词搜索 /// [keywordList] 搜索关键词列表,目前仅支持一个关键词搜索
/// [keywordListMatchType]关键词匹配模式1代表与2代表或暂时未用 /// [keywordListMatchType] 关键词匹配模式1代表与2代表或暂时未用
/// [senderUserIDList]指定消息发送的uid列表 暂时未用 /// [senderUserIDList] 指定消息发送的uid列表 暂时未用
/// [messageTypeList]消息类型列表 /// [messageTypeList] 消息类型列表
/// [searchTimePosition]搜索的起始时间点。默认为0即代表从现在开始搜索。UTC 时间戳,单位:秒 /// [searchTimePosition] 搜索的起始时间点。默认为0即代表从现在开始搜索。UTC 时间戳,单位:秒
/// [searchTimePeriod]从起始时间点开始的过去时间范围单位秒。默认为0即代表不限制时间范围传24x60x60代表过去一天 /// [searchTimePeriod] 从起始时间点开始的过去时间范围单位秒。默认为0即代表不限制时间范围传24x60x60代表过去一天
/// [pageIndex]当前页数 /// [pageIndex] 当前页数
/// [count]每页数量 /// [count] 每页数量
Future<SearchResult> searchLocalMessages({ Future<SearchResult> searchLocalMessages({
String? conversationID, String? conversationID,
List<String> keywordList = const [], List<String> keywordList = const [],
@@ -593,8 +587,8 @@ class MessageManager {
.then((value) => .then((value) =>
Utils.toObj(value, (map) => SearchResult.fromJson(map))); Utils.toObj(value, (map) => SearchResult.fromJson(map)));
/// Delete message from local and service
/// 删除本地跟服务器的指定的消息 /// 删除本地跟服务器的指定的消息
/// [message] 被删除的消息
Future<dynamic> deleteMessageFromLocalAndSvr({ Future<dynamic> deleteMessageFromLocalAndSvr({
required Message message, required Message message,
String? operationID, String? operationID,
@@ -606,7 +600,6 @@ class MessageManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
}))); })));
/// Delete all message from local
/// 删除本地所有聊天记录 /// 删除本地所有聊天记录
Future<dynamic> deleteAllMsgFromLocal({ Future<dynamic> deleteAllMsgFromLocal({
String? operationID, String? operationID,
@@ -617,7 +610,6 @@ class MessageManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Delete all message from service
/// 删除本地跟服务器所有聊天记录 /// 删除本地跟服务器所有聊天记录
Future<dynamic> deleteAllMsgFromLocalAndSvr({ Future<dynamic> deleteAllMsgFromLocalAndSvr({
String? operationID, String? operationID,
@@ -628,7 +620,6 @@ class MessageManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Mark conversation message as read
/// 标记消息已读 /// 标记消息已读
/// [conversationID] 会话ID /// [conversationID] 会话ID
/// [messageIDList] 被标记的消息clientMsgID /// [messageIDList] 被标记的消息clientMsgID
@@ -645,8 +636,8 @@ class MessageManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Clear all c2c history message
/// 删除本地跟服务器的单聊聊天记录 /// 删除本地跟服务器的单聊聊天记录
/// [uid] 聊天对象的userID
Future<dynamic> clearC2CHistoryMessageFromLocalAndSvr({ Future<dynamic> clearC2CHistoryMessageFromLocalAndSvr({
required String uid, required String uid,
String? operationID, String? operationID,
@@ -658,8 +649,8 @@ class MessageManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Clear all group history
/// 删除本地跟服务器的群聊天记录 /// 删除本地跟服务器的群聊天记录
/// [gid] 组id
Future<dynamic> clearGroupHistoryMessageFromLocalAndSvr({ Future<dynamic> clearGroupHistoryMessageFromLocalAndSvr({
required String gid, required String gid,
String? operationID, String? operationID,
@@ -671,7 +662,6 @@ class MessageManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Find all history message
/// 获取聊天记录(以startMsg为节点新收到的聊天记录),用在全局搜索定位某一条消息,然后此条消息后新增的消息 /// 获取聊天记录(以startMsg为节点新收到的聊天记录),用在全局搜索定位某一条消息,然后此条消息后新增的消息
/// [userID] 接收消息的用户id /// [userID] 接收消息的用户id
/// [conversationID] 会话id查询通知时可用 /// [conversationID] 会话id查询通知时可用
@@ -699,6 +689,283 @@ class MessageManager {
})) }))
.then((value) => Utils.toList(value, (map) => Message.fromJson(map))); .then((value) => Utils.toList(value, (map) => Message.fromJson(map)));
/// 撤回消息
/// [message] 被撤回的消息体
Future revokeMessageV2({
required Message message,
String? operationID,
}) =>
_channel.invokeMethod(
'newRevokeMessage',
_buildParam(message.toJson()
..addAll({
"operationID": Utils.checkOperationID(operationID),
})));
/// 获取聊天记录(以startMsg为节点以前的聊天记录)
/// [userID] 接收消息的用户id
/// [conversationID] 会话id查询通知时可用
/// [groupID] 接收消息的组id
/// [startMsg] 从这条消息开始查询[count]条获取的列表index==length-1为最新消息所以获取下一页历史记录startMsg=list.first
/// [count] 一次拉取的总数
/// [lastMinSeq] 第一页消息不用传,获取第二页开始必传 跟[startMsg]一样
Future<AdvancedMessage> getAdvancedHistoryMessageList({
String? userID,
String? groupID,
String? conversationID,
int? lastMinSeq,
Message? startMsg,
int? count,
String? operationID,
}) =>
_channel
.invokeMethod(
'getAdvancedHistoryMessageList',
_buildParam({
'userID': userID ?? '',
'groupID': groupID ?? '',
'conversationID': conversationID ?? '',
'startClientMsgID': startMsg?.clientMsgID ?? '',
'count': count ?? 40,
'lastMinSeq': lastMinSeq ?? 0,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toObj(value, (map) => AdvancedMessage.fromJson(map)));
/// 查找消息详细
/// [conversationID] 会话id
/// [clientMsgIDList] 消息id列表
Future<SearchResult> findMessageList({
required List<SearchParams> searchParams,
String? operationID,
}) =>
_channel
.invokeMethod(
'findMessageList',
_buildParam({
'searchParams': searchParams.map((e) => e.toJson()).toList(),
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toObj(value, (map) => SearchResult.fromJson(map)));
/// 富文本消息
/// [text] 输入内容
/// [list] 富文本消息具体详细
Future<Message> createAdvancedTextMessage({
required String text,
List<RichMessageInfo> list = const [],
String? operationID,
}) =>
_channel
.invokeMethod(
'createAdvancedTextMessage',
_buildParam({
'text': text,
'richMessageInfoList': list.map((e) => e.toJson()).toList(),
"operationID": Utils.checkOperationID(operationID),
}),
)
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// 富文本消息
/// [text] 回复的内容
/// [quoteMsg] 被回复的消息
/// [list] 富文本消息具体详细
Future<Message> createAdvancedQuoteMessage({
required String text,
required Message quoteMsg,
List<RichMessageInfo> list = const [],
String? operationID,
}) =>
_channel
.invokeMethod(
'createAdvancedQuoteMessage',
_buildParam({
'quoteText': text,
'quoteMessage': quoteMsg.toJson(),
'richMessageInfoList': list.map((e) => e.toJson()).toList(),
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// 发送消息
/// [message] 消息体 [createImageMessageByURL],[createSoundMessageByURL],[createVideoMessageByURL],[createFileMessageByURL]
/// [userID] 接收消息的用户id
/// [groupID] 接收消息的组id
/// [offlinePushInfo] 离线消息显示内容
Future<Message> sendMessageNotOss({
required Message message,
required OfflinePushInfo offlinePushInfo,
String? userID,
String? groupID,
String? operationID,
}) =>
_channel
.invokeMethod(
'sendMessageNotOss',
_buildParam({
'message': message.toJson(),
'offlinePushInfo': offlinePushInfo.toJson(),
'userID': userID ?? '',
'groupID': groupID ?? '',
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// 创建图片消息
Future<Message> createImageMessageByURL({
required PictureInfo sourcePicture,
required PictureInfo bigPicture,
required PictureInfo snapshotPicture,
String? operationID,
}) =>
_channel
.invokeMethod(
'createImageMessageByURL',
_buildParam({
'sourcePicture': sourcePicture.toJson(),
'bigPicture': bigPicture.toJson(),
'snapshotPicture': snapshotPicture.toJson(),
"operationID": Utils.checkOperationID(operationID),
}),
)
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// 创建语音消息
Future<Message> createSoundMessageByURL({
required SoundElem soundElem,
String? operationID,
}) =>
_channel
.invokeMethod(
'createSoundMessageByURL',
_buildParam({
'soundElem': soundElem.toJson(),
"operationID": Utils.checkOperationID(operationID),
}),
)
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// 创建视频消息
Future<Message> createVideoMessageByURL({
required VideoElem videoElem,
String? operationID,
}) =>
_channel
.invokeMethod(
'createVideoMessageByURL',
_buildParam({
'videoElem': videoElem.toJson(),
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// 创建视频消息
Future<Message> createFileMessageByURL({
required FileElem fileElem,
String? operationID,
}) =>
_channel
.invokeMethod(
'createFileMessageByURL',
_buildParam({
'fileElem': fileElem.toJson(),
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// 用户资料改变监听
Future setCustomBusinessListener(OnCustomBusinessListener listener) {
this.customBusinessListener = listener;
return _channel.invokeMethod('setCustomBusinessListener', _buildParam({}));
}
///
Future setMessageKvInfoListener(OnMessageKvInfoListener listener) {
this.messageKvInfoListener = listener;
return _channel.invokeMethod('setMessageKvInfoListener', _buildParam({}));
}
Future<List<TypeKeySetResult>> setMessageReactionExtensions({
required Message message,
List<KeyValue> list = const [],
String? operationID,
}) =>
_channel
.invokeMethod(
'setMessageReactionExtensions',
_buildParam({
'message': message.toJson(),
'list': list.map((e) => e.toJson()).toList(),
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (map) => TypeKeySetResult.fromJson(map)));
Future<List<TypeKeySetResult>> deleteMessageReactionExtensions({
required Message message,
List<String> list = const [],
String? operationID,
}) =>
_channel
.invokeMethod(
'deleteMessageReactionExtensions',
_buildParam({
'message': message.toJson(),
'list': list,
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (map) => TypeKeySetResult.fromJson(map)));
Future<List<MessageTypeKeyMapping>> getMessageListReactionExtensions({
List<Message> messageList = const [],
String? operationID,
}) =>
_channel
.invokeMethod(
'getMessageListReactionExtensions',
_buildParam({
'messageList': messageList.map((e) => e.toJson()).toList(),
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(
value, (map) => MessageTypeKeyMapping.fromJson(map)));
Future<List<TypeKeySetResult>> addMessageReactionExtensions({
required Message message,
List<KeyValue> list = const [],
String? operationID,
}) =>
_channel
.invokeMethod(
'addMessageReactionExtensions',
_buildParam({
'message': message.toJson(),
'list': list.map((e) => e.toJson()).toList(),
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (map) => TypeKeySetResult.fromJson(map)));
Future<List<MessageTypeKeyMapping>> getMessageListSomeReactionExtensions({
List<Message> messageList = const [],
List<KeyValue> kvList = const [],
String? operationID,
}) =>
_channel
.invokeMethod(
'getMessageListSomeReactionExtensions',
_buildParam({
'messageList': messageList.map((e) => e.toJson()).toList(),
'list': kvList.map((e) => e.toJson()).toList(),
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(
value, (map) => MessageTypeKeyMapping.fromJson(map)));
static Map _buildParam(Map param) { static Map _buildParam(Map param) {
param["ManagerName"] = "messageManager"; param["ManagerName"] = "messageManager";
return param; return param;

View File

@@ -7,15 +7,16 @@ class OrganizationManager {
OrganizationManager(this._channel); OrganizationManager(this._channel);
/// Observe organization info changes
/// 组织架构发生变化回调 /// 组织架构发生变化回调
Future setOrganizationListener(OnOrganizationListener listener) { Future setOrganizationListener(OnOrganizationListener listener) {
this.listener = listener; this.listener = listener;
return _channel.invokeMethod('setOrganizationListener', _buildParam({})); return _channel.invokeMethod('setOrganizationListener', _buildParam({}));
} }
/// Query sub department /// 获取子部门列表,返回当前部门下的一级子部门
/// 获取子部门列表 /// [departmentID] 当前部门id
/// [offset] 开始下标
/// [count] 每页大小
Future<List<DeptInfo>> getSubDept({ Future<List<DeptInfo>> getSubDept({
required String departmentID, required String departmentID,
int offset = 0, int offset = 0,
@@ -33,8 +34,10 @@ class OrganizationManager {
})) }))
.then((value) => Utils.toList(value, (v) => DeptInfo.fromJson(v))); .then((value) => Utils.toList(value, (v) => DeptInfo.fromJson(v)));
/// Get member under a department /// 获取部门下的成员列表,返回当前部门下的一级成员
/// 获取部门下的成员列表 /// [departmentID] 当前部门id
/// [offset] 开始下标
/// [count] 每页大小
Future<List<DeptMemberInfo>> getDeptMember({ Future<List<DeptMemberInfo>> getDeptMember({
required String departmentID, required String departmentID,
int offset = 0, int offset = 0,
@@ -53,8 +56,8 @@ class OrganizationManager {
.then((value) => .then((value) =>
Utils.toList(value, (v) => DeptMemberInfo.fromJson(v))); Utils.toList(value, (v) => DeptMemberInfo.fromJson(v)));
/// Get member's department
/// 获取成员所在的部门 /// 获取成员所在的部门
/// [userID] 成员ID
Future<List<UserInDept>> getUserInDept({ Future<List<UserInDept>> getUserInDept({
required String userID, required String userID,
String? operationID, String? operationID,
@@ -68,8 +71,8 @@ class OrganizationManager {
})) }))
.then((value) => Utils.toList(value, (v) => UserInDept.fromJson(v))); .then((value) => Utils.toList(value, (v) => UserInDept.fromJson(v)));
/// Get the sub-departments and employees under the department
/// 获取部门下的子部门跟员工 /// 获取部门下的子部门跟员工
/// [departmentID] 当前部门id
Future<DeptMemberAndSubDept> getDeptMemberAndSubDept({ Future<DeptMemberAndSubDept> getDeptMemberAndSubDept({
required String departmentID, required String departmentID,
// int departmentOffset = 0, // int departmentOffset = 0,
@@ -92,6 +95,66 @@ class OrganizationManager {
.then((value) => .then((value) =>
Utils.toObj(value, (v) => DeptMemberAndSubDept.fromJson(v))); Utils.toObj(value, (v) => DeptMemberAndSubDept.fromJson(v)));
/// 查询部门信息
/// [departmentID] 部门ID
Future<DeptInfo> getDeptInfo({
required String departmentID,
String? operationID,
}) =>
_channel
.invokeMethod(
'getDepartmentInfo',
_buildParam({
'departmentID': departmentID,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toObj(value, (v) => DeptInfo.fromJson(v)));
/// 搜索组织人员
/// [keyWord] 关键字
/// [isSearchUserName] 是否匹配用户名
/// [isSearchEnglishName] 是否匹配英文名
/// [isSearchPosition] 是否匹配职位
/// [isSearchUserID] 是否匹配用户ID
/// [isSearchMobile] 是否匹配手机号
/// [isSearchEmail] 是否匹配邮箱号
/// [isSearchTelephone] 是否匹配电话号码
/// [offset] 开始下标
/// [count] 分页大小
Future<OrganizationSearchResult> searchOrganization({
required String keyWord,
bool isSearchUserName = false,
bool isSearchEnglishName = false,
bool isSearchPosition = false,
bool isSearchUserID = false,
bool isSearchMobile = false,
bool isSearchEmail = false,
bool isSearchTelephone = false,
int offset = 0,
int count = 40,
String? operationID,
}) =>
_channel
.invokeMethod(
'searchOrganization',
_buildParam({
'searchParam': {
'keyWord': keyWord,
'isSearchUserName': isSearchUserName,
'isSearchEnglishName': isSearchEnglishName,
'isSearchPosition': isSearchPosition,
'isSearchUserID': isSearchUserID,
'isSearchMobile': isSearchMobile,
'isSearchEmail': isSearchEmail,
'isSearchTelephone': isSearchTelephone,
},
'offset': offset,
'count': count,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toObj(value, (v) => OrganizationSearchResult.fromJson(v)));
static Map _buildParam(Map param) { static Map _buildParam(Map param) {
param["ManagerName"] = "organizationManager"; param["ManagerName"] = "organizationManager";
return param; return param;

View File

@@ -15,6 +15,7 @@ class SignalingManager {
} }
/// 邀请个人加入音视频 /// 邀请个人加入音视频
/// [info] 信令对象[SignalingInfo]
Future<SignalingCertificate> signalingInvite({ Future<SignalingCertificate> signalingInvite({
required SignalingInfo info, required SignalingInfo info,
String? operationID, String? operationID,
@@ -30,6 +31,7 @@ class SignalingManager {
Utils.toObj(value, (map) => SignalingCertificate.fromJson(map))); Utils.toObj(value, (map) => SignalingCertificate.fromJson(map)));
/// 邀请群里某些人加入音视频 /// 邀请群里某些人加入音视频
/// [info] 信令对象[SignalingInfo]
Future<SignalingCertificate> signalingInviteInGroup({ Future<SignalingCertificate> signalingInviteInGroup({
required SignalingInfo info, required SignalingInfo info,
String? operationID, String? operationID,
@@ -45,6 +47,7 @@ class SignalingManager {
Utils.toObj(value, (map) => SignalingCertificate.fromJson(map))); Utils.toObj(value, (map) => SignalingCertificate.fromJson(map)));
/// 同意某人音视频邀请 /// 同意某人音视频邀请
/// [info] 信令对象[SignalingInfo]
Future<SignalingCertificate> signalingAccept({ Future<SignalingCertificate> signalingAccept({
required SignalingInfo info, required SignalingInfo info,
String? operationID, String? operationID,
@@ -60,6 +63,7 @@ class SignalingManager {
Utils.toObj(value, (map) => SignalingCertificate.fromJson(map))); Utils.toObj(value, (map) => SignalingCertificate.fromJson(map)));
/// 拒绝某人音视频邀请 /// 拒绝某人音视频邀请
/// [info] 信令对象[SignalingInfo]
Future<dynamic> signalingReject({ Future<dynamic> signalingReject({
required SignalingInfo info, required SignalingInfo info,
String? operationID, String? operationID,
@@ -72,6 +76,7 @@ class SignalingManager {
})); }));
/// 邀请者取消音视频通话 /// 邀请者取消音视频通话
/// [info] 信令对象[SignalingInfo]
Future<dynamic> signalingCancel({ Future<dynamic> signalingCancel({
required SignalingInfo info, required SignalingInfo info,
String? operationID, String? operationID,
@@ -84,6 +89,7 @@ class SignalingManager {
})); }));
/// 挂断 /// 挂断
/// [info] 信令对象[SignalingInfo]
Future<dynamic> signalingHungUp({ Future<dynamic> signalingHungUp({
required SignalingInfo info, required SignalingInfo info,
String? operationID, String? operationID,
@@ -95,6 +101,205 @@ class SignalingManager {
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
/// 获取当前群通话信息
/// [groupID] 当前群ID
Future<RoomCallingInfo> signalingGetRoomByGroupID({
required String groupID,
String? operationID,
}) =>
_channel
.invokeMethod(
'signalingGetRoomByGroupID',
_buildParam({
'groupID': groupID,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toObj(value, (map) => RoomCallingInfo.fromJson(map)));
/// 获取进入房间的信息
/// [roomID] 当前房间ID
Future<SignalingCertificate> signalingGetTokenByRoomID({
required String roomID,
String? operationID,
}) =>
_channel
.invokeMethod(
'signalingGetTokenByRoomID',
_buildParam({
'roomID': roomID,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toObj(
value,
(map) => SignalingCertificate.fromJson(
map..addAll({'roomID': roomID}))));
/// 会议设置
/// required String roomID,
/// String? meetingName,
/// String? ex,
/// int startTime = 0,
/// int endTime = 0,
/// bool participantCanUnmuteSelf = true,
/// bool participantCanEnableVideo = true,
/// bool onlyHostInviteUser = true,
/// bool onlyHostShareScreen = true,
/// bool joinDisableMicrophone = true,
/// bool joinDisableVideo = true,
/// bool isMuteAllVideo = true,
/// bool isMuteAllMicrophone = true,
/// List<String> addCanScreenUserIDList = const [],
/// List<String> reduceCanScreenUserIDList = const [],
/// List<String> addDisableMicrophoneUserIDList = const [],
/// List<String> reduceDisableMicrophoneUserIDList = const [],
/// List<String> addDisableVideoUserIDList = const [],
/// List<String> reduceDisableVideoUserIDList = const [],
/// List<String> addPinedUserIDList = const [],
/// List<String> reducePinedUserIDList = const [],
/// List<String> addBeWatchedUserIDList = const [],
/// List<String> reduceBeWatchedUserIDList = const [],
Future<dynamic> signalingUpdateMeetingInfo({
required Map info,
String? operationID,
}) {
if (info['meetingID'] != null) {
info['roomID'] = info['meetingID'];
}
assert(info['roomID'] != null);
return _channel.invokeMethod(
'signalingUpdateMeetingInfo',
_buildParam({
'info': info,
'operationID': Utils.checkOperationID(operationID),
}));
}
/// 创建会议室
/// [meetingName] 会议主题
/// [meetingHostUserID] 会议主持人ID
/// [startTime] 开始时间s
/// [meetingDuration] 会议时长s
/// [inviteeUserIDList] 被邀请人ID列表
/// [ex] 其他
Future<SignalingCertificate> signalingCreateMeeting({
required String meetingName,
String? meetingHostUserID,
int? startTime,
int? meetingDuration,
List<String> inviteeUserIDList = const [],
String? ex,
String? operationID,
}) =>
_channel
.invokeMethod(
'signalingCreateMeeting',
_buildParam({
'info': {
'meetingName': meetingName,
'meetingHostUserID': meetingHostUserID,
'startTime': startTime,
'meetingDuration': meetingDuration,
'inviteeUserIDList': inviteeUserIDList,
'ex': ex,
},
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toObj(value, (map) => SignalingCertificate.fromJson(map)));
/// 加入会议室
/// [meetingID] 会议ID
/// [meetingName] 会议主题
/// [participantNickname] 加入房间显示的名称
Future<SignalingCertificate> signalingJoinMeeting({
required String meetingID,
String? meetingName,
String? participantNickname,
String? operationID,
}) =>
_channel
.invokeMethod(
'signalingJoinMeeting',
_buildParam({
'info': {
'meetingID': meetingID,
'meetingName': meetingName,
'participantNickname': participantNickname,
},
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toObj(value, (map) => SignalingCertificate.fromJson(map)));
/// 会议室 管理员对指定的某一个入会人员设置禁言
/// [roomID] 会议ID
/// [streamType] video/audio
/// [userID] 被禁言的用户ID
/// [mute] true禁言
/// [muteAll] truevideo/audio 一起设置
Future<dynamic> signalingOperateStream({
required String roomID,
String? streamType,
required String userID,
bool mute = false,
bool muteAll = false,
String? operationID,
}) =>
_channel.invokeMethod(
'signalingOperateStream',
_buildParam({
'roomID': roomID,
'streamType': streamType,
'userID': userID,
'mute': mute,
'muteAll': muteAll,
'operationID': Utils.checkOperationID(operationID),
}));
/// 获取所有的未完成会议
/// [roomID] 会议ID
Future<MeetingInfoList> signalingGetMeetings({
String? operationID,
}) =>
_channel
.invokeMethod(
'signalingGetMeetings',
_buildParam({
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toObj(value, (map) => MeetingInfoList.fromJson(map)));
/// 结束会议
/// [roomID] 会议ID
Future<dynamic> signalingCloseRoom({
required String roomID,
String? operationID,
}) =>
_channel.invokeMethod(
'signalingCloseRoom',
_buildParam({
'roomID': roomID,
'operationID': Utils.checkOperationID(operationID),
}));
/// 自定义信令
/// [roomID] 会议ID
/// [customInfo] 自定义信令
Future<dynamic> signalingSendCustomSignal({
required String roomID,
required String customInfo,
String? operationID,
}) =>
_channel.invokeMethod(
'signalingSendCustomSignal',
_buildParam({
'roomID': roomID,
'customInfo': customInfo,
'operationID': Utils.checkOperationID(operationID),
}));
static Map _buildParam(Map param) { static Map _buildParam(Map param) {
param["ManagerName"] = "signalingManager"; param["ManagerName"] = "signalingManager";
return param; return param;

View File

@@ -7,15 +7,14 @@ class UserManager {
UserManager(this._channel); UserManager(this._channel);
/// Observe user info changes
/// 用户资料改变监听 /// 用户资料改变监听
Future setUserListener(OnUserListener listener) { Future setUserListener(OnUserListener listener) {
this.listener = listener; this.listener = listener;
return _channel.invokeMethod('setUserListener', _buildParam({})); return _channel.invokeMethod('setUserListener', _buildParam({}));
} }
/// Query user information
/// 获取用户资料 /// 获取用户资料
/// [uidList] 用户ID列表
Future<List<UserInfo>> getUsersInfo({ Future<List<UserInfo>> getUsersInfo({
required List<String> uidList, required List<String> uidList,
String? operationID, String? operationID,
@@ -29,7 +28,6 @@ class UserManager {
})) }))
.then((value) => Utils.toList(value, (v) => UserInfo.fromJson(v))); .then((value) => Utils.toList(value, (v) => UserInfo.fromJson(v)));
/// Get the information of the currently logged in user
/// 获取当前登录用户的信息 /// 获取当前登录用户的信息
Future<UserInfo> getSelfUserInfo({ Future<UserInfo> getSelfUserInfo({
String? operationID, String? operationID,
@@ -42,8 +40,15 @@ class UserManager {
})) }))
.then((value) => Utils.toObj(value, (map) => UserInfo.fromJson(map))); .then((value) => Utils.toObj(value, (map) => UserInfo.fromJson(map)));
/// Modify current user info
/// 修改当前登录用户资料 /// 修改当前登录用户资料
/// [nickname] 昵称
/// [faceURL] 头像
/// [gender] 性别
/// [appMangerLevel]
/// [phoneNumber] 手机号
/// [birth] 出生日期
/// [email] 邮箱
/// [ex] 扩展字段
Future<String?> setSelfInfo({ Future<String?> setSelfInfo({
String? nickname, String? nickname,
String? faceURL, String? faceURL,

View File

@@ -7,13 +7,13 @@ class WorkMomentsManager {
WorkMomentsManager(this._channel); WorkMomentsManager(this._channel);
/// Observe work moments changes /// 朋友圈信息发送变化通知
Future setWorkMomentsListener(OnWorkMomentsListener listener) { Future setWorkMomentsListener(OnWorkMomentsListener listener) {
this.listener = listener; this.listener = listener;
return _channel.invokeMethod('setWorkMomentsListener', _buildParam({})); return _channel.invokeMethod('setWorkMomentsListener', _buildParam({}));
} }
/// Get work moments unread count /// 获取朋友圈未读消息总数
Future<int> getWorkMomentsUnReadCount({ Future<int> getWorkMomentsUnReadCount({
String? operationID, String? operationID,
}) => }) =>
@@ -25,7 +25,9 @@ class WorkMomentsManager {
})) }))
.then((value) => Utils.toObj(value, (map) => map['unreadCount'])); .then((value) => Utils.toObj(value, (map) => map['unreadCount']));
/// Get work moments notification list /// 获取通知列表
/// [offset] 开始下标
/// [count] 每页大小
Future<List<WorkMomentsInfo>> getWorkMomentsNotification({ Future<List<WorkMomentsInfo>> getWorkMomentsNotification({
required int offset, required int offset,
required int count, required int count,
@@ -42,7 +44,7 @@ class WorkMomentsManager {
.then((value) => .then((value) =>
Utils.toList(value, (map) => WorkMomentsInfo.fromJson(map))); Utils.toList(value, (map) => WorkMomentsInfo.fromJson(map)));
/// Clear work moments notification /// 清除通知列表
Future clearWorkMomentsNotification({ Future clearWorkMomentsNotification({
String? operationID, String? operationID,
}) => }) =>

View File

@@ -3,24 +3,61 @@ import 'dart:convert';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class ConversationInfo { class ConversationInfo {
/// 会话ID
String conversationID; String conversationID;
/// [ConversationType] /// 会话类型[ConversationType]
int? conversationType; int? conversationType;
/// 参与会话的userID
String? userID; String? userID;
/// 参与会话的groupID
String? groupID; String? groupID;
/// 昵称
String? showName; String? showName;
/// 头像
String? faceURL; String? faceURL;
/// 免打扰 0正常1不接受消息2接受在线消息不接受离线消息
int? recvMsgOpt; int? recvMsgOpt;
/// 未读消息数
int? unreadCount; int? unreadCount;
/// 强制提示,[GroupAtType]包含@所有人,@个人以及公告提示
int? groupAtType; int? groupAtType;
/// 会话最新消息内容
Message? latestMsg; Message? latestMsg;
/// 最新消息发送时间
int? latestMsgSendTime; int? latestMsgSendTime;
/// 草稿
String? draftText; String? draftText;
/// 草稿生成时间
int? draftTextTime; int? draftTextTime;
/// 是否置顶
bool? isPinned; bool? isPinned;
/// 是否开启了私聊(阅后即焚)
bool? isPrivateChat; bool? isPrivateChat;
/// 可阅读期限 s
int? burnDuration;
/// 附加内容
String? ext; String? ext;
/// 附加内容
String? ex;
/// 是否还在组内如果退群返回true
bool? isNotInGroup; bool? isNotInGroup;
ConversationInfo({ ConversationInfo({
@@ -37,8 +74,11 @@ class ConversationInfo {
this.draftText, this.draftText,
this.draftTextTime, this.draftTextTime,
this.isPrivateChat, this.isPrivateChat,
this.burnDuration,
this.isPinned, this.isPinned,
this.isNotInGroup, this.isNotInGroup,
this.ex,
this.ext,
}); });
ConversationInfo.fromJson(Map<String, dynamic> json) ConversationInfo.fromJson(Map<String, dynamic> json)
@@ -62,8 +102,11 @@ class ConversationInfo {
draftTextTime = json['draftTextTime']; draftTextTime = json['draftTextTime'];
isPinned = json['isPinned']; isPinned = json['isPinned'];
isPrivateChat = json['isPrivateChat']; isPrivateChat = json['isPrivateChat'];
burnDuration = json['burnDuration'];
isNotInGroup = json['isNotInGroup']; isNotInGroup = json['isNotInGroup'];
groupAtType = json['groupAtType']; groupAtType = json['groupAtType'];
ex = json['ex'];
ext = json['ext'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@@ -82,14 +125,24 @@ class ConversationInfo {
data['draftTextTime'] = this.draftTextTime; data['draftTextTime'] = this.draftTextTime;
data['isPinned'] = this.isPinned; data['isPinned'] = this.isPinned;
data['isPrivateChat'] = this.isPrivateChat; data['isPrivateChat'] = this.isPrivateChat;
data['burnDuration'] = this.burnDuration;
data['isNotInGroup'] = this.isNotInGroup; data['isNotInGroup'] = this.isNotInGroup;
data['groupAtType'] = this.groupAtType; data['groupAtType'] = this.groupAtType;
data['ex'] = this.ex;
data['ext'] = this.ext;
return data; return data;
} }
/// 是单聊
bool get isSingleChat => conversationType == ConversationType.single; bool get isSingleChat => conversationType == ConversationType.single;
bool get isGroupChat => conversationType == ConversationType.group; /// 是群聊
bool get isGroupChat =>
conversationType == ConversationType.group ||
conversationType == ConversationType.superGroup;
/// 是有效的
bool get isValid => isSingleChat || isGroupChat && !isNotInGroup!;
@override @override
bool operator ==(Object other) => bool operator ==(Object other) =>

View File

@@ -1,19 +1,58 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
/// 群信息
class GroupInfo { class GroupInfo {
/// 群ID
String groupID; String groupID;
/// 群名
String? groupName; String? groupName;
/// 群公告
String? notification; String? notification;
/// 群简介
String? introduction; String? introduction;
/// 群头像
String? faceURL; String? faceURL;
/// 拥有者ID
String? ownerUserID; String? ownerUserID;
/// 创建时间
int? createTime; int? createTime;
/// 群成员数
int? memberCount; int? memberCount;
/// ok = 0 blocked = 1 Dismissed = 2 Muted = 3 /// 群状态0正常1被封2解散3禁言
int? status; int? status;
/// 创建者ID
String? creatorUserID; String? creatorUserID;
/// 群类型[GroupType]
int? groupType; int? groupType;
/// 扩展字段
String? ex; String? ex;
/// 进群验证方式[GroupVerification]
int? needVerification;
/// 不允许通过群获取成员资料 0关闭1打开
int? lookMemberInfo;
/// 不允许通过群添加好友 0关闭1打开
int? applyMemberFriend;
/// 通知更新时间
int? notificationUpdateTime;
/// 通知发起人
String? notificationUserID;
GroupInfo({ GroupInfo({
required this.groupID, required this.groupID,
this.groupName, this.groupName,
@@ -27,6 +66,11 @@ class GroupInfo {
this.creatorUserID, this.creatorUserID,
this.groupType, this.groupType,
this.ex, this.ex,
this.needVerification,
this.lookMemberInfo,
this.applyMemberFriend,
this.notificationUpdateTime,
this.notificationUserID,
}); });
GroupInfo.fromJson(Map<String, dynamic> json) : groupID = json['groupID'] { GroupInfo.fromJson(Map<String, dynamic> json) : groupID = json['groupID'] {
@@ -42,6 +86,11 @@ class GroupInfo {
creatorUserID = json['creatorUserID']; creatorUserID = json['creatorUserID'];
groupType = json['groupType']; groupType = json['groupType'];
ex = json['ex']; ex = json['ex'];
needVerification = json['needVerification'];
lookMemberInfo = json['lookMemberInfo'];
applyMemberFriend = json['applyMemberFriend'];
notificationUpdateTime = json['notificationUpdateTime'];
notificationUserID = json['notificationUserID'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@@ -58,23 +107,68 @@ class GroupInfo {
data['creatorUserID'] = this.creatorUserID; data['creatorUserID'] = this.creatorUserID;
data['groupType'] = this.groupType; data['groupType'] = this.groupType;
data['ex'] = this.ex; data['ex'] = this.ex;
data['needVerification'] = this.needVerification;
data['lookMemberInfo'] = this.lookMemberInfo;
data['applyMemberFriend'] = this.applyMemberFriend;
data['notificationUpdateTime'] = this.notificationUpdateTime;
data['notificationUserID'] = this.notificationUserID;
return data; return data;
} }
/// 群类型对应的会话类型
int get sessionType => groupType == GroupType.general
? ConversationType.group
: ConversationType.superGroup;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is GroupInfo &&
runtimeType == other.runtimeType &&
groupID == other.groupID;
@override
int get hashCode => groupID.hashCode;
} }
/// 群成员信息
class GroupMembersInfo { class GroupMembersInfo {
/// 群id
String? groupID; String? groupID;
/// 用户id
String? userID; String? userID;
/// 昵称
String? nickname; String? nickname;
/// 头像
String? faceURL; String? faceURL;
/// 角色[GroupRoleLevel]
int? roleLevel; int? roleLevel;
/// 加入时间
int? joinTime; int? joinTime;
/// 入群方式 2邀请加入 3搜索加入 4通过二维码加入
int? joinSource; int? joinSource;
/// 操作者id
String? operatorUserID; String? operatorUserID;
String? ext;
/// 扩展字段
String? ex;
/// 禁言时间s
int? muteEndTime; int? muteEndTime;
///
int? appMangerLevel; int? appMangerLevel;
/// 邀请人id
String? inviterUserID;
GroupMembersInfo({ GroupMembersInfo({
this.groupID, this.groupID,
this.userID, this.userID,
@@ -82,11 +176,12 @@ class GroupMembersInfo {
this.joinTime, this.joinTime,
this.nickname, this.nickname,
this.faceURL, this.faceURL,
this.ext, this.ex,
this.joinSource, this.joinSource,
this.operatorUserID, this.operatorUserID,
this.muteEndTime, this.muteEndTime,
this.appMangerLevel, this.appMangerLevel,
this.inviterUserID,
}); });
GroupMembersInfo.fromJson(Map<String, dynamic> json) { GroupMembersInfo.fromJson(Map<String, dynamic> json) {
@@ -96,11 +191,12 @@ class GroupMembersInfo {
joinTime = json['joinTime']; joinTime = json['joinTime'];
nickname = json['nickname']; nickname = json['nickname'];
faceURL = json['faceURL']; faceURL = json['faceURL'];
ext = json['ext']; ex = json['ex'];
joinSource = json['joinSource']; joinSource = json['joinSource'];
operatorUserID = json['operatorUserID']; operatorUserID = json['operatorUserID'];
muteEndTime = json['muteEndTime']; muteEndTime = json['muteEndTime'];
appMangerLevel = json['appMangerLevel']; appMangerLevel = json['appMangerLevel'];
inviterUserID = json['inviterUserID'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@@ -111,20 +207,33 @@ class GroupMembersInfo {
data['joinTime'] = this.joinTime; data['joinTime'] = this.joinTime;
data['nickname'] = this.nickname; data['nickname'] = this.nickname;
data['faceURL'] = this.faceURL; data['faceURL'] = this.faceURL;
data['ext'] = this.ext; data['ex'] = this.ex;
data['joinSource'] = this.joinSource; data['joinSource'] = this.joinSource;
data['operatorUserID'] = this.operatorUserID; data['operatorUserID'] = this.operatorUserID;
data['muteEndTime'] = this.muteEndTime; data['muteEndTime'] = this.muteEndTime;
data['appMangerLevel'] = this.appMangerLevel; data['appMangerLevel'] = this.appMangerLevel;
data['inviterUserID'] = this.inviterUserID;
return data; return data;
} }
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is GroupMembersInfo &&
runtimeType == other.runtimeType &&
groupID == other.groupID &&
userID == other.userID;
@override
int get hashCode => groupID.hashCode ^ userID.hashCode;
} }
/// 群成员角色
class GroupMemberRole { class GroupMemberRole {
/// 用户ID
String? userID; String? userID;
/// 1 ordinary member, 2 group owners, 3 administrators /// [GroupRoleLevel] 1普通成员, 2群主3管理员
/// 1普通成员, 2群主3管理员
int? roleLevel; int? roleLevel;
GroupMemberRole({this.userID, this.roleLevel = 1}); GroupMemberRole({this.userID, this.roleLevel = 1});
@@ -142,33 +251,80 @@ class GroupMemberRole {
} }
} }
/// 群申请信息
class GroupApplicationInfo { class GroupApplicationInfo {
/// 群ID
String? groupID; String? groupID;
/// 群昵称
String? groupName; String? groupName;
/// 群公告
String? notification; String? notification;
/// 群介绍
String? introduction; String? introduction;
/// 群头像
String? groupFaceURL; String? groupFaceURL;
/// 群创建时间
int? createTime; int? createTime;
/// 群状态
int? status; int? status;
/// 创建者id
String? creatorUserID; String? creatorUserID;
/// 群类型
int? groupType; int? groupType;
/// 拥有者id
String? ownerUserID; String? ownerUserID;
/// 成员数量
int? memberCount; int? memberCount;
/// 发起入群申请的用户id
String? userID; String? userID;
/// 发起入群申请的用户昵称
String? nickname; String? nickname;
/// 发起入群申请的用户头像
String? userFaceURL; String? userFaceURL;
/// 发起入群申请的用户性别
int? gender; int? gender;
/// REFUSE = -1, AGREE = 1 /// 处理结果:-1拒绝1同意
/// -1拒绝1同意
int? handleResult; int? handleResult;
/// 请求说明
String? reqMsg; String? reqMsg;
/// 处理结果说明
String? handledMsg; String? handledMsg;
/// 请求时间
int? reqTime; int? reqTime;
/// 处理者用户ID
String? handleUserID; String? handleUserID;
/// 处理时间
int? handledTime; int? handledTime;
/// 扩展信息
String? ex; String? ex;
/// 2通过邀请 3通过搜索 4通过二维码
int? joinSource;
/// 邀请进群用户ID
String? inviterUserID;
GroupApplicationInfo({ GroupApplicationInfo({
this.groupID, this.groupID,
this.groupName, this.groupName,
@@ -192,6 +348,8 @@ class GroupApplicationInfo {
this.handleUserID, this.handleUserID,
this.handledTime, this.handledTime,
this.ex, this.ex,
this.inviterUserID,
this.joinSource,
}); });
GroupApplicationInfo.fromJson(Map<String, dynamic> json) { GroupApplicationInfo.fromJson(Map<String, dynamic> json) {
@@ -217,6 +375,8 @@ class GroupApplicationInfo {
handleUserID = json['handleUserID']; handleUserID = json['handleUserID'];
handledTime = json['handledTime']; handledTime = json['handledTime'];
ex = json['ex']; ex = json['ex'];
inviterUserID = json['inviterUserID'];
joinSource = json['joinSource'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@@ -243,6 +403,8 @@ class GroupApplicationInfo {
data['handleUserID'] = this.handleUserID; data['handleUserID'] = this.handleUserID;
data['handledTime'] = this.handledTime; data['handledTime'] = this.handledTime;
data['ex'] = this.ex; data['ex'] = this.ex;
data['inviterUserID'] = this.inviterUserID;
data['joinSource'] = this.joinSource;
return data; return data;
} }
} }

View File

@@ -0,0 +1,106 @@
class MeetingInfoList {
List<MeetingInfo>? meetingInfoList;
MeetingInfoList({this.meetingInfoList});
MeetingInfoList.fromJson(Map<String, dynamic> json) {
if (json['meetingInfoList'] != null) {
meetingInfoList = <MeetingInfo>[];
json['meetingInfoList'].forEach((v) {
meetingInfoList!.add(MeetingInfo.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.meetingInfoList != null) {
data['meetingInfoList'] =
this.meetingInfoList!.map((v) => v.toJson()).toList();
}
return data;
}
}
class MeetingInfo {
String? meetingID;
String? meetingName;
String? hostUserID;
int? createTime;
int? startTime;
int? endTime;
bool? participantCanEnableVideo;
bool? onlyHostInviteUser;
bool? joinDisableVideo;
bool? participantCanUnmuteSelf;
bool? isMuteAllMicrophone;
List<String>? inviteeUserIDList;
MeetingInfo(
{this.meetingID,
this.meetingName,
this.hostUserID,
this.createTime,
this.startTime,
this.endTime,
this.participantCanEnableVideo,
this.onlyHostInviteUser,
this.joinDisableVideo,
this.participantCanUnmuteSelf,
this.isMuteAllMicrophone,
this.inviteeUserIDList});
MeetingInfo.fromJson(Map<String, dynamic> json) {
meetingID = json['meetingID'];
meetingName = json['meetingName'];
hostUserID = json['hostUserID'];
createTime = json['createTime'];
startTime = json['startTime'];
endTime = json['endTime'];
participantCanEnableVideo = json['participantCanEnableVideo'];
onlyHostInviteUser = json['onlyHostInviteUser'];
joinDisableVideo = json['joinDisableVideo'];
participantCanUnmuteSelf = json['participantCanUnmuteSelf'];
isMuteAllMicrophone = json['isMuteAllMicrophone'];
inviteeUserIDList = json['inviteeUserIDList']?.cast<String>();
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['meetingID'] = this.meetingID;
data['meetingName'] = this.meetingName;
data['hostUserID'] = this.hostUserID;
data['createTime'] = this.createTime;
data['startTime'] = this.startTime;
data['endTime'] = this.endTime;
data['participantCanEnableVideo'] = this.participantCanEnableVideo;
data['onlyHostInviteUser'] = this.onlyHostInviteUser;
data['joinDisableVideo'] = this.joinDisableVideo;
data['participantCanUnmuteSelf'] = this.participantCanUnmuteSelf;
data['isMuteAllMicrophone'] = this.isMuteAllMicrophone;
data['inviteeUserIDList'] = this.inviteeUserIDList;
return data;
}
}
class MeetingStreamEvent {
String? meetingID;
String? streamType;
bool? mute;
MeetingStreamEvent({this.meetingID, this.streamType, this.mute});
MeetingStreamEvent.fromJson(Map<String, dynamic> json) {
meetingID = json['meetingID'];
streamType = json['streamType'];
mute = json['mute'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['meetingID'] = this.meetingID;
data['streamType'] = this.streamType;
data['mute'] = this.mute;
return data;
}
}

View File

@@ -1,45 +1,114 @@
import 'dart:io';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class Message { class Message {
/// 消息id唯一标识
String? clientMsgID; String? clientMsgID;
/// 服务端生成的id
String? serverMsgID; String? serverMsgID;
/// 创建时间
int? createTime; int? createTime;
/// 发送时间
int? sendTime; int? sendTime;
/// [ConversationType] /// 会话类型[ConversationType]
int? sessionType; int? sessionType;
/// 发送者id
String? sendID; String? sendID;
/// 接收者id
String? recvID; String? recvID;
/// 来源
int? msgFrom; int? msgFrom;
/// [MessageType] /// 消息类型[MessageType]
int? contentType; int? contentType;
/// 平台[Platform]
int? platformID; int? platformID;
/// 发送者昵称
String? senderNickname; String? senderNickname;
/// 发送者头像
String? senderFaceUrl; String? senderFaceUrl;
/// 群ID
String? groupID; String? groupID;
/// 消息内容
String? content; String? content;
/// 消息的seq
int? seq; int? seq;
/// 是否已读
bool? isRead; bool? isRead;
/// 已读时间
int? hasReadTime; int? hasReadTime;
/// [MessageStatus] /// 消息发送状态[MessageStatus]
int? status; int? status;
/// 离线显示内容
OfflinePushInfo? offlinePush; OfflinePushInfo? offlinePush;
/// 附加信息
String? attachedInfo; String? attachedInfo;
/// 扩展信息
String? ex; String? ex;
/// 自定义扩展信息,目前用于客服端处理消息时间分段
dynamic ext; dynamic ext;
/// 图片
PictureElem? pictureElem; PictureElem? pictureElem;
/// 语音
SoundElem? soundElem; SoundElem? soundElem;
/// 视频
VideoElem? videoElem; VideoElem? videoElem;
/// 文件
FileElem? fileElem; FileElem? fileElem;
/// @信息
AtElem? atElem; AtElem? atElem;
/// 位置
LocationElem? locationElem; LocationElem? locationElem;
/// 自定义
CustomElem? customElem; CustomElem? customElem;
/// 引用
QuoteElem? quoteElem; QuoteElem? quoteElem;
/// 合并
MergeElem? mergeElem; MergeElem? mergeElem;
/// 通知
NotificationElem? notificationElem; NotificationElem? notificationElem;
/// 自定义表情
FaceElem? faceElem; FaceElem? faceElem;
/// 附加信息
AttachedInfoElem? attachedInfoElem; AttachedInfoElem? attachedInfoElem;
bool? isReact;
bool? isExternal;
Message({ Message({
this.clientMsgID, this.clientMsgID,
this.serverMsgID, this.serverMsgID,
@@ -75,6 +144,8 @@ class Message {
this.notificationElem, this.notificationElem,
this.faceElem, this.faceElem,
this.attachedInfoElem, this.attachedInfoElem,
this.isExternal,
this.isReact,
}); });
Message.fromJson(Map<String, dynamic> json) { Message.fromJson(Map<String, dynamic> json) {
@@ -135,6 +206,8 @@ class Message {
? AttachedInfoElem.fromJson(json['attachedInfoElem']) ? AttachedInfoElem.fromJson(json['attachedInfoElem'])
: null; : null;
hasReadTime = json['hasReadTime'] ?? attachedInfoElem?.hasReadTime; hasReadTime = json['hasReadTime'] ?? attachedInfoElem?.hasReadTime;
isExternal = json['isExternal'];
isReact = json['isReact'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@@ -173,6 +246,8 @@ class Message {
data['notificationElem'] = this.notificationElem?.toJson(); data['notificationElem'] = this.notificationElem?.toJson();
data['faceElem'] = this.faceElem?.toJson(); data['faceElem'] = this.faceElem?.toJson();
data['attachedInfoElem'] = this.attachedInfoElem?.toJson(); data['attachedInfoElem'] = this.attachedInfoElem?.toJson();
data['isExternal'] = this.isExternal;
data['isReact'] = this.isReact;
return data; return data;
} }
@@ -222,12 +297,28 @@ class Message {
faceElem = message.faceElem; faceElem = message.faceElem;
attachedInfoElem = message.attachedInfoElem; attachedInfoElem = message.attachedInfoElem;
} }
/// 单聊消息
bool get isSingleChat => sessionType == ConversationType.single;
/// 群聊消息
bool get isGroupChat =>
sessionType == ConversationType.group ||
sessionType == ConversationType.superGroup;
} }
/// 图片消息内容
class PictureElem { class PictureElem {
/// 原路径
String? sourcePath; String? sourcePath;
/// 原图对象
PictureInfo? sourcePicture; PictureInfo? sourcePicture;
/// 大图对象
PictureInfo? bigPicture; PictureInfo? bigPicture;
/// 缩率图对象
PictureInfo? snapshotPicture; PictureInfo? snapshotPicture;
PictureElem( PictureElem(
@@ -265,12 +356,24 @@ class PictureElem {
} }
} }
/// 图片信息
class PictureInfo { class PictureInfo {
/// id
String? uuid; String? uuid;
/// 图片mime类型
String? type; String? type;
/// 大小
int? size; int? size;
/// 宽度
int? width; int? width;
/// 长度
int? height; int? height;
/// 图片URL地址
String? url; String? url;
PictureInfo( PictureInfo(
@@ -297,11 +400,21 @@ class PictureInfo {
} }
} }
/// 语音消息内容
class SoundElem { class SoundElem {
/// id
String? uuid; String? uuid;
/// 原路径
String? soundPath; String? soundPath;
/// url地址
String? sourceUrl; String? sourceUrl;
/// 大小
int? dataSize; int? dataSize;
/// 时间s
int? duration; int? duration;
SoundElem( SoundElem(
@@ -330,18 +443,42 @@ class SoundElem {
} }
} }
/// 视频消息内容
class VideoElem { class VideoElem {
/// 视频路径
String? videoPath; String? videoPath;
/// uuid
String? videoUUID; String? videoUUID;
/// 视频的url地址
String? videoUrl; String? videoUrl;
/// mime类型
String? videoType; String? videoType;
/// 大小
int? videoSize; int? videoSize;
/// 时长s
int? duration; int? duration;
/// 缩率图路径
String? snapshotPath; String? snapshotPath;
/// 缩率图uuid
String? snapshotUUID; String? snapshotUUID;
/// 缩率图大小
int? snapshotSize; int? snapshotSize;
/// 缩率图URL地址
String? snapshotUrl; String? snapshotUrl;
/// 缩率图宽度
int? snapshotWidth; int? snapshotWidth;
/// 缩率图高度
int? snapshotHeight; int? snapshotHeight;
VideoElem( VideoElem(
@@ -391,11 +528,21 @@ class VideoElem {
} }
} }
/// 文件消息内容
class FileElem { class FileElem {
/// 文件路径
String? filePath; String? filePath;
/// uuid
String? uuid; String? uuid;
/// 文件URL地址
String? sourceUrl; String? sourceUrl;
/// 文件名
String? fileName; String? fileName;
/// 文件大小
int? fileSize; int? fileSize;
FileElem( FileElem(
@@ -420,11 +567,21 @@ class FileElem {
} }
} }
/// @消息内容
class AtElem { class AtElem {
/// 消息内容
String? text; String? text;
/// 被@的用户ID列表
List<String>? atUserList; List<String>? atUserList;
/// 是否包含自己
bool? isAtSelf; bool? isAtSelf;
/// 被@的用户ID跟昵称关系列表用于将消息内容里的用户id替换为昵称显示
List<AtUserInfo>? atUsersInfo; List<AtUserInfo>? atUsersInfo;
/// 被回复的消息体,回复别人并@了人
Message? quoteMessage; Message? quoteMessage;
AtElem({ AtElem({
@@ -462,9 +619,15 @@ class AtElem {
} }
} }
/// 位置消息内日
class LocationElem { class LocationElem {
/// 位置描述
String? description; String? description;
/// 经度
double? longitude; double? longitude;
/// 纬度
double? latitude; double? latitude;
LocationElem({this.description, this.longitude, this.latitude}); LocationElem({this.description, this.longitude, this.latitude});
@@ -493,9 +656,15 @@ class LocationElem {
} }
} }
/// 自定义消息
class CustomElem { class CustomElem {
/// 自定义数据
String? data; String? data;
/// 扩展内容
String? extension; String? extension;
/// 描述内容
String? description; String? description;
CustomElem({this.data, this.extension, this.description}); CustomElem({this.data, this.extension, this.description});
@@ -515,8 +684,12 @@ class CustomElem {
} }
} }
/// 引用消息(被回复的消息)
class QuoteElem { class QuoteElem {
/// 回复内容内容
String? text; String? text;
/// 被回复的消息体
Message? quoteMessage; Message? quoteMessage;
QuoteElem({this.text, this.quoteMessage}); QuoteElem({this.text, this.quoteMessage});
@@ -536,9 +709,15 @@ class QuoteElem {
} }
} }
/// 合并消息体
class MergeElem { class MergeElem {
/// 标题
String? title; String? title;
/// 摘要
List<String>? abstractList; List<String>? abstractList;
/// 具体选择合并的消息列表
List<Message>? multiMessage; List<Message>? multiMessage;
MergeElem({this.title, this.abstractList, this.multiMessage}); MergeElem({this.title, this.abstractList, this.multiMessage});
@@ -564,8 +743,12 @@ class MergeElem {
} }
} }
/// 通知
class NotificationElem { class NotificationElem {
/// 详情
String? detail; String? detail;
/// 提示
String? defaultTips; String? defaultTips;
NotificationElem({this.detail, this.defaultTips}); NotificationElem({this.detail, this.defaultTips});
@@ -583,8 +766,12 @@ class NotificationElem {
} }
} }
/// 表情
class FaceElem { class FaceElem {
/// 位置表情,用户端对端自定义内嵌的表情包
int? index; int? index;
/// 其他表情如URL表情直接返回url
String? data; String? data;
FaceElem({this.index, this.data}); FaceElem({this.index, this.data});
@@ -602,18 +789,29 @@ class FaceElem {
} }
} }
/// 附加信息
class AttachedInfoElem { class AttachedInfoElem {
/// 群消息已读信息
GroupHasReadInfo? groupHasReadInfo; GroupHasReadInfo? groupHasReadInfo;
/// 单聊有效 /// 是否为私聊消息(阅后即焚消息),单聊有效
bool? isPrivateChat; bool? isPrivateChat;
/// 已读时间
int? hasReadTime; int? hasReadTime;
/// 阅读时长 s
/// 即从hasReadTime时间算起超过了burnDuration秒触发销毁
int? burnDuration;
/// 离线不发送推送
bool? notSenderNotificationPush; bool? notSenderNotificationPush;
AttachedInfoElem({ AttachedInfoElem({
this.groupHasReadInfo, this.groupHasReadInfo,
this.isPrivateChat, this.isPrivateChat,
this.hasReadTime, this.hasReadTime,
this.burnDuration,
this.notSenderNotificationPush, this.notSenderNotificationPush,
}); });
@@ -623,6 +821,7 @@ class AttachedInfoElem {
: GroupHasReadInfo.fromJson(json['groupHasReadInfo']); : GroupHasReadInfo.fromJson(json['groupHasReadInfo']);
isPrivateChat = json['isPrivateChat']; isPrivateChat = json['isPrivateChat'];
hasReadTime = json['hasReadTime']; hasReadTime = json['hasReadTime'];
burnDuration = json['burnDuration'];
notSenderNotificationPush = json['notSenderNotificationPush']; notSenderNotificationPush = json['notSenderNotificationPush'];
} }
@@ -631,15 +830,23 @@ class AttachedInfoElem {
data['groupHasReadInfo'] = this.groupHasReadInfo?.toJson(); data['groupHasReadInfo'] = this.groupHasReadInfo?.toJson();
data['isPrivateChat'] = this.isPrivateChat; data['isPrivateChat'] = this.isPrivateChat;
data['hasReadTime'] = this.hasReadTime; data['hasReadTime'] = this.hasReadTime;
data['burnDuration'] = this.burnDuration;
data['notSenderNotificationPush'] = this.notSenderNotificationPush; data['notSenderNotificationPush'] = this.notSenderNotificationPush;
return data; return data;
} }
} }
/// 群消息已读信息
class GroupHasReadInfo { class GroupHasReadInfo {
/// 已读的用户id列表
List<String>? hasReadUserIDList; List<String>? hasReadUserIDList;
/// 已读总数
int? hasReadCount; int? hasReadCount;
/// 发送此条消息时的群人数
int? groupMemberCount;
GroupHasReadInfo.fromJson(Map<String, dynamic> json) { GroupHasReadInfo.fromJson(Map<String, dynamic> json) {
if (json['hasReadUserIDList'] == null) { if (json['hasReadUserIDList'] == null) {
hasReadUserIDList = <String>[]; hasReadUserIDList = <String>[];
@@ -647,23 +854,39 @@ class GroupHasReadInfo {
hasReadUserIDList = (json['hasReadUserIDList'] as List).cast<String>(); hasReadUserIDList = (json['hasReadUserIDList'] as List).cast<String>();
} }
hasReadCount = json['hasReadCount'] ?? 0; hasReadCount = json['hasReadCount'] ?? 0;
groupMemberCount = json['groupMemberCount'] ?? 0;
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final data = Map<String, dynamic>(); final data = Map<String, dynamic>();
data['hasReadUserIDList'] = this.hasReadUserIDList; data['hasReadUserIDList'] = this.hasReadUserIDList;
data['hasReadCount'] = this.hasReadCount; data['hasReadCount'] = this.hasReadCount;
data['groupMemberCount'] = this.groupMemberCount;
return data; return data;
} }
} }
/// 消息已读回执信息
class ReadReceiptInfo { class ReadReceiptInfo {
/// 发送者id
String? userID; String? userID;
/// 群id
String? groupID; String? groupID;
/// 已读消息的clientMsgID集合
List<String>? msgIDList; List<String>? msgIDList;
/// 读时间
int? readTime; int? readTime;
/// 消息来源
int? msgFrom; int? msgFrom;
/// 消息类型[MessageType]
int? contentType; int? contentType;
/// 会话类型[ConversationType]
int? sessionType; int? sessionType;
ReadReceiptInfo( ReadReceiptInfo(
@@ -699,11 +922,21 @@ class ReadReceiptInfo {
} }
} }
/// 离线推送信息
class OfflinePushInfo { class OfflinePushInfo {
/// 通知标题
String? title; String? title;
/// 通知描述
String? desc; String? desc;
/// 扩展内容
String? ex; String? ex;
/// 仅ios有效
String? iOSPushSound; String? iOSPushSound;
/// 仅ios有效
bool? iOSBadgeCount; bool? iOSBadgeCount;
OfflinePushInfo( OfflinePushInfo(
@@ -728,8 +961,12 @@ class OfflinePushInfo {
} }
} }
/// @消息用户id跟昵称关系对象
class AtUserInfo { class AtUserInfo {
/// 被@的用户id
String? atUserID; String? atUserID;
/// 被@的用户昵称
String? groupNickname; String? groupNickname;
AtUserInfo({this.atUserID, this.groupNickname}); AtUserInfo({this.atUserID, this.groupNickname});
@@ -746,3 +983,313 @@ class AtUserInfo {
return data; return data;
} }
} }
/// 消息撤回具体信息
class RevokedInfo {
/// 撤回者ID
String? revokerID;
/// 撤回者群角色 [GroupRoleLevel]
int? revokerRole;
/// 撤回者昵称
String? revokerNickname;
/// 消息id
String? clientMsgID;
/// 撤回时间
int? revokeTime;
/// 消息发送时间
int? sourceMessageSendTime;
/// 消息发送者
String? sourceMessageSendID;
/// 消息发送者昵称
String? sourceMessageSenderNickname;
/// 会话类型 [ConversationType]
int? sessionType;
RevokedInfo({
this.revokerID,
this.revokerRole,
this.revokerNickname,
this.clientMsgID,
this.revokeTime,
this.sourceMessageSendTime,
this.sourceMessageSendID,
this.sourceMessageSenderNickname,
this.sessionType,
});
RevokedInfo.fromJson(Map<String, dynamic> json) {
revokerID = json['revokerID'];
revokerRole = json['revokerRole'];
revokerNickname = json['revokerNickname'];
clientMsgID = json['clientMsgID'];
revokeTime = json['revokeTime'];
sourceMessageSendTime = json['sourceMessageSendTime'];
sourceMessageSendID = json['sourceMessageSendID'];
sourceMessageSenderNickname = json['sourceMessageSenderNickname'];
sessionType = json['sessionType'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['revokerID'] = this.revokerID;
data['revokerRole'] = this.revokerRole;
data['revokerNickname'] = this.revokerNickname;
data['clientMsgID'] = this.clientMsgID;
data['revokeTime'] = this.revokeTime;
data['sourceMessageSendTime'] = this.sourceMessageSendTime;
data['sourceMessageSendID'] = this.sourceMessageSendID;
data['sourceMessageSenderNickname'] = this.sourceMessageSenderNickname;
data['sessionType'] = this.sessionType;
return data;
}
}
class AdvancedMessage {
List<Message>? messageList;
bool? isEnd;
int? errCode;
String? errMsg;
int? lastMinSeq;
AdvancedMessage({
this.messageList,
this.isEnd,
this.errCode,
this.errMsg,
this.lastMinSeq,
});
AdvancedMessage.fromJson(Map<String, dynamic> json) {
messageList = json['messageList'] == null
? null
: (json['messageList'] as List)
.map((e) => Message.fromJson(e))
.toList();
isEnd = json['isEnd'];
errCode = json['errCode'];
errMsg = json['errMsg'];
lastMinSeq = json['lastMinSeq'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['messageList'] = this.messageList?.map((e) => e.toJson()).toList();
data['isEnd'] = this.isEnd;
data['errCode'] = this.errCode;
data['errMsg'] = this.errMsg;
data['lastMinSeq'] = this.lastMinSeq;
return data;
}
}
class RichMessageInfo {
String? type;
int? offset;
int? length;
String? url;
String? info;
RichMessageInfo({
this.type,
this.offset,
this.length,
this.url,
this.info,
});
RichMessageInfo.fromJson(Map<String, dynamic> json) {
type = json['type'];
offset = json['offset'];
length = json['length'];
url = json['url'];
info = json['info'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['type'] = this.type;
data['offset'] = this.offset;
data['length'] = this.length;
data['url'] = this.url;
data['info'] = this.info;
return data;
}
}
///////////////////// 消息修改相关/////////////////////
////////////////////////////////////////////////////
class KeyValue {
String? typeKey;
String? value;
int? latestUpdateTime;
KeyValue({this.typeKey, this.value, this.latestUpdateTime});
KeyValue.fromJson(Map<String, dynamic> json) {
typeKey = json['typeKey'];
value = json['value'];
latestUpdateTime = json['latestUpdateTime'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['typeKey'] = this.typeKey;
data['value'] = this.value;
data['latestUpdateTime'] = this.latestUpdateTime;
return data;
}
}
class UserExInfo {
String? userID;
String? ex;
UserExInfo({this.userID, this.ex});
UserExInfo.fromJson(Map<String, dynamic> json) {
userID = json['userID'];
ex = json['ex'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['userID'] = this.userID;
data['ex'] = this.ex;
return data;
}
}
class SingleTypeKeyInfoSum {
String? typeKey;
int? counter;
List<UserExInfo>? infoList;
bool? isContainSelf;
SingleTypeKeyInfoSum({
this.typeKey,
this.counter,
this.infoList,
this.isContainSelf,
});
SingleTypeKeyInfoSum.fromJson(Map<String, dynamic> json) {
typeKey = json['typeKey'];
counter = json['counter'];
infoList = json['infoList'] == null
? null
: (json['infoList'] as List)
.map((e) => UserExInfo.fromJson(e))
.toList();
isContainSelf = json['isContainSelf'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['typeKey'] = this.typeKey;
data['counter'] = this.counter;
data['infoList'] = this.infoList?.map((e) => e.toJson()).toList();
data['isContainSelf'] = this.isContainSelf;
return data;
}
}
class MessageKv {
String? clientMsgID;
List<SingleTypeKeyInfoSum>? changedKvList;
MessageKv({this.clientMsgID, this.changedKvList});
MessageKv.fromJson(Map<String, dynamic> json) {
clientMsgID = json['clientMsgID'];
changedKvList = json['changedKvList'] == null
? null
: (json['changedKvList'] as List)
.map((e) => SingleTypeKeyInfoSum.fromJson(e))
.toList();
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['clientMsgID'] = this.clientMsgID;
data['changedKvList'] = this.changedKvList?.map((e) => e.toJson()).toList();
return data;
}
}
class TypeKeySetResult {
int? errCode;
String? errMsg;
String? typeKey;
int? latestUpdateTime;
String? value;
TypeKeySetResult(
{this.errCode,
this.errMsg,
this.typeKey,
this.latestUpdateTime,
this.value});
TypeKeySetResult.fromJson(Map<String, dynamic> json) {
errCode = json['errCode'];
errMsg = json['errMsg'];
typeKey = json['typeKey'];
latestUpdateTime = json['latestUpdateTime'];
value = json['value'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['errCode'] = this.errCode;
data['errMsg'] = this.errMsg;
data['typeKey'] = this.typeKey;
data['latestUpdateTime'] = this.latestUpdateTime;
data['value'] = this.value;
return data;
}
}
class MessageTypeKeyMapping {
int? errCode;
String? errMsg;
Map<String, KeyValue>? reactionExtensionList;
String? clientMsgID;
MessageTypeKeyMapping(
{this.errCode,
this.errMsg,
this.reactionExtensionList,
this.clientMsgID});
MessageTypeKeyMapping.fromJson(Map<String, dynamic> json) {
errCode = json['errCode'];
errMsg = json['errMsg'];
reactionExtensionList = json['reactionExtensionList'] != null
? (json['reactionExtensionList'] as Map)
.map((key, value) => MapEntry(key, KeyValue.fromJson(value)))
: null;
clientMsgID = json['clientMsgID'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['errCode'] = this.errCode;
data['errMsg'] = this.errMsg;
if (this.reactionExtensionList != null) {
data['reactionExtensionList'] = this
.reactionExtensionList!
.map((key, value) => MapEntry(key, value.toJson()));
}
data['clientMsgID'] = this.clientMsgID;
return data;
}
}

View File

@@ -1,25 +1,38 @@
import '../../flutter_openim_sdk.dart'; import '../../flutter_openim_sdk.dart';
/// OA notification
/// oa 通知 /// oa 通知
class OANotification { class OANotification {
/// 标题
String? notificationName; String? notificationName;
/// 头像
String? notificationFaceURL; String? notificationFaceURL;
/// 类型
int? notificationType; int? notificationType;
/// 文本内容
String? text; String? text;
/// 跳转链接
String? externalUrl; 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文字+文件通知 /// 0纯文字通知 1文字+图片通知 2文字+视频通知 3文字+文件通知
int? mixType; int? mixType;
/// 图片信息
PictureElem? pictureElem; PictureElem? pictureElem;
/// 语音信息
SoundElem? soundElem; SoundElem? soundElem;
/// 视频信息
VideoElem? videoElem; VideoElem? videoElem;
/// 文件信息
FileElem? fileElem; FileElem? fileElem;
/// 扩展字段
String? ex; String? ex;
OANotification( OANotification(
@@ -81,11 +94,18 @@ class OANotification {
} }
} }
/// Group common notification /// 群事件通知
class GroupNotification { class GroupNotification {
/// 群信息
GroupInfo? group; GroupInfo? group;
/// 当前事件操作者信息
GroupMembersInfo? opUser; GroupMembersInfo? opUser;
/// 群拥有者信息
GroupMembersInfo? groupOwnerUser; GroupMembersInfo? groupOwnerUser;
/// 产生影响的群成员列表
List<GroupMembersInfo>? memberList; List<GroupMembersInfo>? memberList;
GroupNotification({ GroupNotification({
@@ -129,11 +149,15 @@ class GroupNotification {
} }
} }
/// User is invited to the group notification
/// 用户被邀请进群通知 /// 用户被邀请进群通知
class InvitedJoinGroupNotification { class InvitedJoinGroupNotification {
/// 群信息
GroupInfo? group; GroupInfo? group;
/// 操作者信息
GroupMembersInfo? opUser; GroupMembersInfo? opUser;
/// 被邀请进群的成员信息
List<GroupMembersInfo>? invitedUserList; List<GroupMembersInfo>? invitedUserList;
InvitedJoinGroupNotification({this.group, this.opUser, this.invitedUserList}); InvitedJoinGroupNotification({this.group, this.opUser, this.invitedUserList});
@@ -167,11 +191,15 @@ class InvitedJoinGroupNotification {
} }
} }
/// Group kicked member notification
/// 组踢出成员通知 /// 组踢出成员通知
class KickedGroupMemeberNotification { class KickedGroupMemeberNotification {
/// 群信息
GroupInfo? group; GroupInfo? group;
/// 操作者信息
GroupMembersInfo? opUser; GroupMembersInfo? opUser;
/// 被踢出群的成员信息列表
List<GroupMembersInfo>? kickedUserList; List<GroupMembersInfo>? kickedUserList;
KickedGroupMemeberNotification( KickedGroupMemeberNotification(
@@ -206,10 +234,12 @@ class KickedGroupMemeberNotification {
} }
} }
/// Exit group notification
/// 退出群通知 /// 退出群通知
class QuitGroupNotification { class QuitGroupNotification {
/// 群信息
GroupInfo? group; GroupInfo? group;
/// 退群的成员信息
GroupMembersInfo? quitUser; GroupMembersInfo? quitUser;
QuitGroupNotification({this.group, this.quitUser}); QuitGroupNotification({this.group, this.quitUser});
@@ -233,10 +263,12 @@ class QuitGroupNotification {
} }
} }
/// Enter group notification
/// 进群通知 /// 进群通知
class EnterGroupNotification { class EnterGroupNotification {
/// 群信息
GroupInfo? group; GroupInfo? group;
/// 进入群的成员信息
GroupMembersInfo? entrantUser; GroupMembersInfo? entrantUser;
EnterGroupNotification({this.group, this.entrantUser}); EnterGroupNotification({this.group, this.entrantUser});
@@ -260,11 +292,15 @@ class EnterGroupNotification {
} }
} }
/// Group rights transfer noticication
/// 群权转让通知 /// 群权转让通知
class GroupRightsTransferNoticication { class GroupRightsTransferNoticication {
/// 群信息
GroupInfo? group; GroupInfo? group;
/// 操作者信息
GroupMembersInfo? opUser; GroupMembersInfo? opUser;
/// 群新的拥有者信息
GroupMembersInfo? newGroupOwner; GroupMembersInfo? newGroupOwner;
GroupRightsTransferNoticication({ GroupRightsTransferNoticication({
@@ -298,12 +334,18 @@ class GroupRightsTransferNoticication {
} }
} }
/// Mute member notification
/// 禁言成员通知 /// 禁言成员通知
class MuteMemberNotification { class MuteMemberNotification {
/// 群信息
GroupInfo? group; GroupInfo? group;
/// 操作者信息
GroupMembersInfo? opUser; GroupMembersInfo? opUser;
/// 被禁言的成员信息
GroupMembersInfo? mutedUser; GroupMembersInfo? mutedUser;
/// 禁言时间s
int? mutedSeconds; int? mutedSeconds;
MuteMemberNotification({ MuteMemberNotification({
@@ -340,11 +382,15 @@ class MuteMemberNotification {
} }
} }
/// Burn after reading notification
/// 阅后即焚通知 /// 阅后即焚通知
class BurnAfterReadingNotification { class BurnAfterReadingNotification {
/// 接收者
String? recvID; String? recvID;
/// 发送者
String? sendID; String? sendID;
/// 是否开启
bool? isPrivate; bool? isPrivate;
BurnAfterReadingNotification({this.recvID, this.sendID, this.isPrivate}); BurnAfterReadingNotification({this.recvID, this.sendID, this.isPrivate});
@@ -364,11 +410,15 @@ class BurnAfterReadingNotification {
} }
} }
/// Group member info changed notification /// 群成员信息发送变化通知
/// 禁言成员通知
class GroupMemberInfoChangedNotification { class GroupMemberInfoChangedNotification {
/// 群信息
GroupInfo? group; GroupInfo? group;
/// 操作者信息
GroupMembersInfo? opUser; GroupMembersInfo? opUser;
/// 资料发生改变的成员
GroupMembersInfo? changedUser; GroupMembersInfo? changedUser;
GroupMemberInfoChangedNotification({ GroupMemberInfoChangedNotification({

View File

@@ -1,16 +1,40 @@
/// 部门信息
class DeptInfo { class DeptInfo {
/// 部门id
String? departmentID; String? departmentID;
/// 头像
String? faceURL; String? faceURL;
/// 显示名
String? name; String? name;
/// 上一级部门id
String? parentID; String? parentID;
/// 排序方式
int? order; int? order;
/// 部门类型
int? departmentType; int? departmentType;
/// 创建时间
int? createTime; int? createTime;
/// 子部门数量
int? subDepartmentNum; int? subDepartmentNum;
/// 成员数量
int? memberNum; int? memberNum;
/// 扩展字段
String? ex; String? ex;
/// 附加信息
String? attachedInfo; String? attachedInfo;
String? relatedGroupID;
DeptInfo( DeptInfo(
{this.departmentID, {this.departmentID,
this.faceURL, this.faceURL,
@@ -22,7 +46,8 @@ class DeptInfo {
this.subDepartmentNum, this.subDepartmentNum,
this.memberNum, this.memberNum,
this.ex, this.ex,
this.attachedInfo}); this.attachedInfo,
this.relatedGroupID});
DeptInfo.fromJson(Map<String, dynamic> json) { DeptInfo.fromJson(Map<String, dynamic> json) {
departmentID = json['departmentID']; departmentID = json['departmentID'];
@@ -36,6 +61,7 @@ class DeptInfo {
memberNum = json['memberNum']; memberNum = json['memberNum'];
ex = json['ex']; ex = json['ex'];
attachedInfo = json['attachedInfo']; attachedInfo = json['attachedInfo'];
relatedGroupID = json['relatedGroupID'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@@ -51,6 +77,7 @@ class DeptInfo {
data['memberNum'] = this.memberNum; data['memberNum'] = this.memberNum;
data['ex'] = this.ex; data['ex'] = this.ex;
data['attachedInfo'] = this.attachedInfo; data['attachedInfo'] = this.attachedInfo;
data['relatedGroupID'] = this.relatedGroupID;
return data; return data;
} }
@@ -65,43 +92,96 @@ class DeptInfo {
int get hashCode => departmentID.hashCode; int get hashCode => departmentID.hashCode;
} }
/// 部门成员信息
class DeptMemberInfo { class DeptMemberInfo {
/// 用户id
String? userID; String? userID;
/// 用户昵称
String? nickname; String? nickname;
/// 英文名
String? englishName; String? englishName;
/// 头像
String? faceURL; String? faceURL;
/// 性别
int? gender; int? gender;
/// 手机号
String? mobile; String? mobile;
/// 座机
String? telephone; String? telephone;
/// 出生时间
int? birth; int? birth;
/// 邮箱
String? email; String? email;
/// 所在部门的id
String? departmentID; String? departmentID;
/// 排序方式
int? order; int? order;
/// 职位
String? position; String? position;
/// 是否是领导
int? leader; int? leader;
/// 状态
int? status; int? status;
/// 创建时间
int? createTime; int? createTime;
/// 入职时间
int? entryTime;
/// 离职时间
int? terminationTime;
/// 扩展字段
String? ex; String? ex;
/// 附加信息
String? attachedInfo; String? attachedInfo;
DeptMemberInfo( /// 搜索时使用
{this.userID, String? departmentName;
this.nickname,
this.englishName, /// 所在部门的所有上级部门
this.faceURL, List<DeptInfo>? parentDepartmentList;
this.gender,
this.mobile, /// 当前部门信息
this.telephone, DeptInfo? department;
this.birth,
this.email, DeptMemberInfo({
this.departmentID, this.userID,
this.order, this.nickname,
this.position, this.englishName,
this.leader, this.faceURL,
this.status, this.gender,
this.createTime, this.mobile,
this.ex, this.telephone,
this.attachedInfo}); this.birth,
this.email,
this.departmentID,
this.order,
this.position,
this.leader,
this.status,
this.createTime,
this.ex,
this.attachedInfo,
this.departmentName,
this.parentDepartmentList,
this.department,
});
DeptMemberInfo.fromJson(Map<String, dynamic> json) { DeptMemberInfo.fromJson(Map<String, dynamic> json) {
userID = json['userID']; userID = json['userID'];
@@ -121,6 +201,16 @@ class DeptMemberInfo {
createTime = json['createTime']; createTime = json['createTime'];
ex = json['ex']; ex = json['ex'];
attachedInfo = json['attachedInfo']; attachedInfo = json['attachedInfo'];
departmentName = json['departmentName'];
if (json['parentDepartmentList'] != null) {
parentDepartmentList = <DeptInfo>[];
json['parentDepartmentList'].forEach((v) {
parentDepartmentList!.add(DeptInfo.fromJson(v));
});
}
department = json['department'] == null
? null
: DeptInfo.fromJson(json['department']);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@@ -142,6 +232,12 @@ class DeptMemberInfo {
data['createTime'] = this.createTime; data['createTime'] = this.createTime;
data['ex'] = this.ex; data['ex'] = this.ex;
data['attachedInfo'] = this.attachedInfo; data['attachedInfo'] = this.attachedInfo;
data['departmentName'] = this.departmentName;
if (this.parentDepartmentList != null) {
data['parentDepartmentList'] =
this.parentDepartmentList!.map((v) => v.toJson()).toList();
}
data['department'] = this.department?.toJson();
return data; return data;
} }
@@ -158,7 +254,10 @@ class DeptMemberInfo {
/// 用户所在的部门 /// 用户所在的部门
class UserInDept { class UserInDept {
/// 部门信息
DeptInfo? department; DeptInfo? department;
/// 所在部门自己的信息
DeptMemberInfo? member; DeptMemberInfo? member;
UserInDept({this.department, this.member}); UserInDept({this.department, this.member});
@@ -183,12 +282,22 @@ class UserInDept {
} }
} }
/// 部门下的子部门跟员工 /// 部门下的一级子部门跟员工
class DeptMemberAndSubDept { class DeptMemberAndSubDept {
/// 一级子部门
List<DeptInfo>? departmentList; List<DeptInfo>? departmentList;
/// 一级成员
List<DeptMemberInfo>? departmentMemberList; List<DeptMemberInfo>? departmentMemberList;
DeptMemberAndSubDept({this.departmentList, this.departmentMemberList}); /// 当前部门的所有上一级部门
List<DeptInfo>? parentDepartmentList;
DeptMemberAndSubDept({
this.departmentList,
this.departmentMemberList,
this.parentDepartmentList,
});
DeptMemberAndSubDept.fromJson(Map<String, dynamic> json) { DeptMemberAndSubDept.fromJson(Map<String, dynamic> json) {
if (json['departmentList'] != null) { if (json['departmentList'] != null) {
@@ -203,6 +312,58 @@ class DeptMemberAndSubDept {
departmentMemberList!.add(DeptMemberInfo.fromJson(v)); departmentMemberList!.add(DeptMemberInfo.fromJson(v));
}); });
} }
if (json['parentDepartmentList'] != null) {
parentDepartmentList = <DeptInfo>[];
json['parentDepartmentList'].forEach((v) {
parentDepartmentList!.add(DeptInfo.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.departmentList != null) {
data['departmentList'] =
this.departmentList!.map((v) => v.toJson()).toList();
}
if (this.departmentMemberList != null) {
data['departmentMemberList'] =
this.departmentMemberList!.map((v) => v.toJson()).toList();
}
if (this.parentDepartmentList != null) {
data['parentDepartmentList'] =
this.parentDepartmentList!.map((v) => v.toJson()).toList();
}
return data;
}
}
/// 搜索结果
class OrganizationSearchResult {
/// 部门列表
List<DeptInfo>? departmentList;
/// 部门成员列表
List<DeptMemberInfo>? departmentMemberList;
OrganizationSearchResult({
this.departmentList,
this.departmentMemberList,
});
OrganizationSearchResult.fromJson(Map<String, dynamic> json) {
if (json['departmentList'] != null) {
departmentList = <DeptInfo>[];
json['departmentList'].forEach((v) {
departmentList!.add(DeptInfo.fromJson(v));
});
}
if (json['departmentMemberList'] != null) {
departmentMemberList = <DeptMemberInfo>[];
json['departmentMemberList'].forEach((v) {
departmentMemberList!.add(DeptMemberInfo.fromJson(v));
});
}
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {

View File

@@ -3,8 +3,12 @@ import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class SearchResult { class SearchResult {
/// 获取到的总的消息数量 /// 获取到的总的消息数量
int? totalCount; int? totalCount;
/// 搜索到的具体内容
List<SearchResultItems>? searchResultItems; List<SearchResultItems>? searchResultItems;
List<SearchResultItems>? findResultItems;
SearchResult({this.totalCount, this.searchResultItems}); SearchResult({this.totalCount, this.searchResultItems});
SearchResult.fromJson(Map<String, dynamic> json) { SearchResult.fromJson(Map<String, dynamic> json) {
@@ -15,6 +19,12 @@ class SearchResult {
searchResultItems!.add(SearchResultItems.fromJson(v)); searchResultItems!.add(SearchResultItems.fromJson(v));
}); });
} }
if (json['findResultItems'] != null) {
findResultItems = <SearchResultItems>[];
json['findResultItems'].forEach((v) {
findResultItems!.add(SearchResultItems.fromJson(v));
});
}
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@@ -24,6 +34,10 @@ class SearchResult {
data['searchResultItems'] = data['searchResultItems'] =
this.searchResultItems!.map((v) => v.toJson()).toList(); this.searchResultItems!.map((v) => v.toJson()).toList();
} }
if (this.findResultItems != null) {
data['findResultItems'] =
this.findResultItems!.map((v) => v.toJson()).toList();
}
return data; return data;
} }
} }
@@ -34,7 +48,11 @@ class SearchResultItems {
/// 会话类型1单聊2群聊3超级大群4通知会话 /// 会话类型1单聊2群聊3超级大群4通知会话
int? conversationType; int? conversationType;
/// 显示名
String? showName; String? showName;
/// 头像
String? faceURL; String? faceURL;
/// 搜索到的这个会话下的消息数量 /// 搜索到的这个会话下的消息数量
@@ -72,3 +90,27 @@ class SearchResultItems {
return data; return data;
} }
} }
class SearchParams {
String? conversationID;
List<String>? clientMsgIDList;
SearchParams({
this.conversationID,
this.clientMsgIDList,
});
SearchParams.fromJson(Map<String, dynamic> json) {
conversationID = json['conversationID'];
if (json['clientMsgIDList'] != null) {
clientMsgIDList = json['clientMsgIDList'].cast<String>();
}
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['conversationID'] = this.conversationID;
data['clientMsgIDList'] = this.clientMsgIDList;
return data;
}
}

View File

@@ -1,8 +1,15 @@
import 'dart:io';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class SignalingInfo { class SignalingInfo {
/// 操作者
String? opUserID; String? opUserID;
/// 邀请信息
InvitationInfo? invitation; InvitationInfo? invitation;
/// 离线显示内容
OfflinePushInfo? offlinePushInfo; OfflinePushInfo? offlinePushInfo;
SignalingInfo({ SignalingInfo({
@@ -31,14 +38,32 @@ class SignalingInfo {
} }
class InvitationInfo { class InvitationInfo {
String? inviterUserID; //邀请者UserID /// 邀请者UserID
List<String>? inviteeUserIDList; //被邀请者UserID列表如果是单聊只有一个元素 String? inviterUserID;
String? groupID; //如果是单聊,为""
String? roomID; //房间ID必须唯一可以不设置。 /// 被邀请者UserID列表如果是单聊只有一个元素
int? timeout; //邀请超时时间(秒) List<String>? inviteeUserIDList;
String? mediaType; //video 或者audio
int? sessionType; //1为单聊2为群聊 /// 如果是单聊,为""
int? platformID; //和之前定义一致 String? groupID;
/// 房间ID必须唯一可以不设置。
String? roomID;
/// 邀请超时时间(秒)
int? timeout;
/// 发起时间
int? initiateTime;
/// video 或者 audio
String? mediaType;
/// [ConversationType]1为单聊2为群聊
int? sessionType;
/// 平台[Platform]
int? platformID;
InvitationInfo( InvitationInfo(
{this.inviterUserID, {this.inviterUserID,
@@ -46,6 +71,7 @@ class InvitationInfo {
this.groupID, this.groupID,
this.roomID, this.roomID,
this.timeout, this.timeout,
this.initiateTime,
this.mediaType, this.mediaType,
this.sessionType, this.sessionType,
this.platformID}); this.platformID});
@@ -56,6 +82,7 @@ class InvitationInfo {
groupID = json['groupID']; groupID = json['groupID'];
roomID = json['roomID']; roomID = json['roomID'];
timeout = json['timeout']; timeout = json['timeout'];
initiateTime = json['initiateTime'];
mediaType = json['mediaType']; mediaType = json['mediaType'];
sessionType = json['sessionType']; sessionType = json['sessionType'];
platformID = json['platformID']; platformID = json['platformID'];
@@ -68,6 +95,7 @@ class InvitationInfo {
data['groupID'] = this.groupID; data['groupID'] = this.groupID;
data['roomID'] = this.roomID; data['roomID'] = this.roomID;
data['timeout'] = this.timeout; data['timeout'] = this.timeout;
data['initiateTime'] = this.initiateTime;
data['mediaType'] = this.mediaType; data['mediaType'] = this.mediaType;
data['sessionType'] = this.sessionType; data['sessionType'] = this.sessionType;
data['platformID'] = this.platformID; data['platformID'] = this.platformID;
@@ -75,17 +103,34 @@ class InvitationInfo {
} }
} }
/// 信令凭证
class SignalingCertificate { class SignalingCertificate {
/// 登录token
String? token; String? token;
/// 房间id
String? roomID; String? roomID;
/// 服务器地址
String? liveURL; String? liveURL;
SignalingCertificate({this.token, this.roomID, this.liveURL}); /// 占线列表
List<String>? busyLineUserIDList;
SignalingCertificate({
this.token,
this.roomID,
this.liveURL,
this.busyLineUserIDList,
});
SignalingCertificate.fromJson(Map<String, dynamic> json) { SignalingCertificate.fromJson(Map<String, dynamic> json) {
token = json['token']; token = json['token'];
roomID = json['roomID']; roomID = json['roomID'];
liveURL = json['liveURL']; liveURL = json['liveURL'];
busyLineUserIDList = null == json['busyLineUserIDList']
? null
: json['busyLineUserIDList'].cast<String>();
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@@ -93,6 +138,108 @@ class SignalingCertificate {
data['token'] = this.token; data['token'] = this.token;
data['roomID'] = this.roomID; data['roomID'] = this.roomID;
data['liveURL'] = this.liveURL; data['liveURL'] = this.liveURL;
data['busyLineUserIDList'] = this.busyLineUserIDList;
return data;
}
}
class RoomCallingInfo {
InvitationInfo? invitation;
List<Participant>? participant;
String? roomID;
String? token;
String? liveURL;
String? groupID;
RoomCallingInfo({
this.invitation,
this.participant,
this.roomID,
this.token,
this.liveURL,
this.groupID,
});
RoomCallingInfo.fromJson(Map<String, dynamic> json) {
invitation = json['invitation'] != null
? InvitationInfo.fromJson(json['invitation'])
: null;
if (json['participant'] != null) {
participant = <Participant>[];
json['participant'].forEach((v) {
participant!.add(Participant.fromJson(v));
});
}
roomID = json['roomID'] ?? invitation?.roomID;
token = json['token'];
liveURL = json['liveURL'];
groupID = json['groupID'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.invitation != null) {
data['invitation'] = this.invitation!.toJson();
}
if (this.participant != null) {
data['participant'] = this.participant!.map((v) => v.toJson()).toList();
}
data['roomID'] = this.roomID;
data['token'] = this.token;
data['liveURL'] = this.liveURL;
data['groupID'] = this.groupID;
return data;
}
}
class Participant {
GroupInfo? groupInfo;
GroupMembersInfo? groupMemberInfo;
UserInfo? userInfo;
Participant({this.groupInfo, this.groupMemberInfo, this.userInfo});
Participant.fromJson(Map<String, dynamic> json) {
groupInfo = json['groupInfo'] != null
? GroupInfo.fromJson(json['groupInfo'])
: null;
groupMemberInfo = json['groupMemberInfo'] != null
? GroupMembersInfo.fromJson(json['groupMemberInfo'])
: null;
userInfo =
json['userInfo'] != null ? UserInfo.fromJson(json['userInfo']) : null;
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.groupInfo != null) {
data['groupInfo'] = this.groupInfo!.toJson();
}
if (this.groupMemberInfo != null) {
data['groupMemberInfo'] = this.groupMemberInfo!.toJson();
}
if (this.userInfo != null) {
data['userInfo'] = this.userInfo!.toJson();
}
return data;
}
}
class CustomSignaling {
String? roomID;
String? customInfo;
CustomSignaling({this.roomID, this.customInfo});
CustomSignaling.fromJson(Map<String, dynamic> json) {
roomID = json['roomID'];
customInfo = json['customInfo'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['roomID'] = roomID;
data['customInfo'] = customInfo;
return data; return data;
} }
} }

View File

@@ -5,30 +5,69 @@
/// Not a friend is not on the blacklist /// Not a friend is not on the blacklist
/// 不是好友不在黑名单 /// 不是好友不在黑名单
class UserInfo { class UserInfo {
/// 用户id
String? userID; String? userID;
/// 用户昵称
String? nickname; String? nickname;
/// 头像
String? faceURL; String? faceURL;
/// 性别
int? gender; int? gender;
/// 手机号
String? phoneNumber; String? phoneNumber;
/// 使用[birthTime]
int? birth; int? birth;
/// 出生时间
String? birthTime;
/// 邮箱
String? email; String? email;
/// 扩展字段
String? ex; String? ex;
/// 创建时间
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;
/// 全局免打扰 0正常1不接受消息2接受在线消息不接受离线消息
int? globalRecvMsgOpt;
/// 是允许添加为好友 1允许2
int? allowAddFriend;
/// 新消息铃声 1允许2
int? allowBeep;
/// 新消息震动 1允许2
int? allowVibration;
/// 禁止登录
int? forbidden;
UserInfo({ UserInfo({
this.publicInfo, this.publicInfo,
this.friendInfo, this.friendInfo,
@@ -41,11 +80,17 @@ class UserInfo {
this.faceURL, this.faceURL,
this.phoneNumber, this.phoneNumber,
this.birth, this.birth,
this.birthTime,
this.gender, this.gender,
this.email, this.email,
this.ex, this.ex,
this.createTime, this.createTime,
this.remark, this.remark,
this.globalRecvMsgOpt,
this.allowAddFriend,
this.allowBeep,
this.allowVibration,
this.forbidden,
}); });
// UserInfo.self(Map<String, dynamic> json) { // UserInfo.self(Map<String, dynamic> json) {
@@ -80,10 +125,16 @@ class UserInfo {
gender = json['gender'] ?? _gender; gender = json['gender'] ?? _gender;
phoneNumber = json['phoneNumber'] ?? _phoneNumber; phoneNumber = json['phoneNumber'] ?? _phoneNumber;
birth = json['birth'] ?? _birth; birth = json['birth'] ?? _birth;
birthTime = json['birthTime'] ?? _birthTime;
email = json['email'] ?? _email; email = json['email'] ?? _email;
remark = json['remark'] ?? _remark; remark = json['remark'] ?? _remark;
ex = json['ex'] ?? _ex; ex = json['ex'] ?? _ex;
createTime = json['createTime']; createTime = json['createTime'];
globalRecvMsgOpt = json['globalRecvMsgOpt'];
allowAddFriend = json['allowAddFriend'];
allowBeep = json['allowBeep'];
allowVibration = json['allowVibration'];
forbidden = json['forbidden'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@@ -100,10 +151,16 @@ class UserInfo {
data['gender'] = this.gender; data['gender'] = this.gender;
data['phoneNumber'] = this.phoneNumber; data['phoneNumber'] = this.phoneNumber;
data['birth'] = this.birth; data['birth'] = this.birth;
data['birthTime'] = this.birthTime;
data['email'] = this.email; data['email'] = this.email;
data['ex'] = this.ex; data['ex'] = this.ex;
data['createTime'] = this.createTime; data['createTime'] = this.createTime;
data['remark'] = this.remark; data['remark'] = this.remark;
data['globalRecvMsgOpt'] = this.globalRecvMsgOpt;
data['allowAddFriend'] = this.allowAddFriend;
data['allowBeep'] = this.allowBeep;
data['allowVibration'] = this.allowVibration;
data['forbidden'] = this.forbidden;
return data; return data;
} }
@@ -137,6 +194,8 @@ class UserInfo {
int? get _birth => friendInfo?.birth; int? get _birth => friendInfo?.birth;
String? get _birthTime => friendInfo?.birthTime;
String? get _email => friendInfo?.email; String? get _email => friendInfo?.email;
String? get _remark => friendInfo?.remark; String? get _remark => friendInfo?.remark;
@@ -159,12 +218,24 @@ class UserInfo {
int get hashCode => userID.hashCode; int get hashCode => userID.hashCode;
} }
/// 公开的资料
class PublicUserInfo { class PublicUserInfo {
/// 用户id
String? userID; String? userID;
/// 昵称
String? nickname; String? nickname;
/// 头像
String? faceURL; String? faceURL;
/// 性别
int? gender; int? gender;
/// AppOrdinaryUsers = 1 AppAdmin = 2
int? appMangerLevel; int? appMangerLevel;
/// 扩展信息
String? ex; String? ex;
PublicUserInfo({ PublicUserInfo({
@@ -197,18 +268,45 @@ class PublicUserInfo {
} }
} }
/// 好友信息
class FriendInfo { class FriendInfo {
/// 用户id
String? userID; String? userID;
/// 昵称
String? nickname; String? nickname;
/// 头像
String? faceURL; String? faceURL;
/// 性别
int? gender; int? gender;
/// 手机号
String? phoneNumber; String? phoneNumber;
/// 出生日期
String? birthTime;
/// 使用[birthTime]
int? birth; int? birth;
/// 邮箱
String? email; String? email;
/// 备注
String? remark; String? remark;
/// 扩展字段
String? ex; String? ex;
/// 创建时间
int? createTime; int? createTime;
/// 添加方式
int? addSource; int? addSource;
/// 操作者id
String? operatorUserID; String? operatorUserID;
FriendInfo({ FriendInfo({
@@ -218,6 +316,7 @@ class FriendInfo {
this.gender, this.gender,
this.phoneNumber, this.phoneNumber,
this.birth, this.birth,
this.birthTime,
this.email, this.email,
this.remark, this.remark,
this.ex, this.ex,
@@ -238,6 +337,7 @@ class FriendInfo {
gender = json['gender']; gender = json['gender'];
phoneNumber = json['phoneNumber']; phoneNumber = json['phoneNumber'];
birth = json['birth']; birth = json['birth'];
birthTime = json['birthTime'];
email = json['email']; email = json['email'];
ex = json['ex']; ex = json['ex'];
} }
@@ -255,20 +355,44 @@ class FriendInfo {
data['gender'] = this.gender; data['gender'] = this.gender;
data['phoneNumber'] = this.phoneNumber; data['phoneNumber'] = this.phoneNumber;
data['birth'] = this.birth; data['birth'] = this.birth;
data['birthTime'] = this.birthTime;
data['email'] = this.email; data['email'] = this.email;
data['ex'] = this.ex; data['ex'] = this.ex;
return data; return data;
} }
String getShowName() => _isNull(remark) ?? _isNull(nickname) ?? userID!;
static String? _isNull(String? value) {
if (value == null || value.trim().isEmpty) return null;
return value;
}
} }
/// 黑名单信息
class BlacklistInfo { class BlacklistInfo {
/// 用户id
String? userID; String? userID;
/// 昵称
String? nickname; String? nickname;
/// 头像
String? faceURL; String? faceURL;
/// 性别
int? gender; int? gender;
/// 创建时间
int? createTime; int? createTime;
/// 添加方式
int? addSource; int? addSource;
/// 操作者
String? operatorUserID; String? operatorUserID;
/// 扩展信息
String? ex; String? ex;
BlacklistInfo({ BlacklistInfo({
@@ -307,10 +431,11 @@ class BlacklistInfo {
} }
} }
/// 关系
class FriendshipInfo { class FriendshipInfo {
/// 用户id
String? userID; String? userID;
/// 1 means friend (and not blacklist)
/// 1表示好友并且不是黑名单 /// 1表示好友并且不是黑名单
int? result; int? result;
@@ -329,21 +454,51 @@ class FriendshipInfo {
} }
} }
/// 好友申请信息
class FriendApplicationInfo { class FriendApplicationInfo {
/// 发起者用户id
String? fromUserID; String? fromUserID;
/// 发起者用户昵称
String? fromNickname; String? fromNickname;
/// 发起者用户头像
String? fromFaceURL; String? fromFaceURL;
/// 发起者性别
int? fromGender; int? fromGender;
/// 接收者用户id
String? toUserID; String? toUserID;
/// 接收者用户昵称
String? toNickname; String? toNickname;
/// 接收者头像
String? toFaceURL; String? toFaceURL;
/// 接收者性别
int? toGender; int? toGender;
/// 处理结果
int? handleResult; int? handleResult;
/// 请求消息
String? reqMsg; String? reqMsg;
/// 创建时间
int? createTime; int? createTime;
/// 处理者id
String? handlerUserID; String? handlerUserID;
/// 处理备注
String? handleMsg; String? handleMsg;
/// 处理时间
int? handleTime; int? handleTime;
/// 扩展字段
String? ex; String? ex;
FriendApplicationInfo( FriendApplicationInfo(
@@ -401,12 +556,12 @@ class FriendApplicationInfo {
return data; return data;
} }
/// friend application waiting handle /// 等待处理
bool get isWaitingHandle => handleResult == 0; bool get isWaitingHandle => handleResult == 0;
/// friend application agreed /// 已同意
bool get isAgreed => handleResult == 1; bool get isAgreed => handleResult == 1;
/// friend application rejected /// 已拒绝
bool get isRejected => handleResult == -1; bool get isRejected => handleResult == -1;
} }

View File

@@ -2,10 +2,11 @@ import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class OpenIM { class OpenIM {
static const MethodChannel _channel = static const version = '2.3.5+3';
const MethodChannel('flutter_openim_sdk');
static IMManager iMManager = IMManager(_channel); static const _channel = const MethodChannel('flutter_openim_sdk');
static final iMManager = IMManager(_channel);
OpenIM._(); OpenIM._();
} }

View File

@@ -2,14 +2,14 @@ import 'dart:convert';
class Utils { class Utils {
static List<T> toList<T>(String value, T f(Map<String, dynamic> map)) => static List<T> toList<T>(String value, T f(Map<String, dynamic> map)) =>
(_formatJson(value) as List).map((e) => f(e)).toList(); (formatJson(value) as List).map((e) => f(e)).toList();
static T toObj<T>(String value, T f(Map<String, dynamic> map)) => static T toObj<T>(String value, T f(Map<String, dynamic> map)) =>
f(_formatJson(value)); f(formatJson(value));
static List<dynamic> toListMap(String value) => _formatJson(value); static List<dynamic> toListMap(String value) => formatJson(value);
static dynamic _formatJson(String value) => jsonDecode(value); static dynamic formatJson(String value) => jsonDecode(value);
static String checkOperationID(String? obj) => static String checkOperationID(String? obj) =>
obj ?? DateTime.now().millisecondsSinceEpoch.toString(); obj ?? DateTime.now().millisecondsSinceEpoch.toString();

View File

@@ -5,51 +5,50 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: async name: async
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.8.2" version: "2.10.0"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
name: boolean_selector name: boolean_selector
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.0" version: "2.1.1"
characters: characters:
dependency: transitive dependency: transitive
description: description:
name: characters name: characters
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.2.0" version: "1.2.1"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.1"
clock: clock:
dependency: transitive dependency: transitive
description: description:
name: clock name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.0" version: "1.1.1"
collection: collection:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.15.0" version: "1.17.0"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
name: fake_async name: fake_async
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.2.0" version: "1.3.1"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@@ -60,34 +59,46 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
js:
dependency: transitive
description:
name: js
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.6.5"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.12.11" version: "0.12.13"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.1.3" version: "0.2.0"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.7.0" version: "1.8.0"
path: path:
dependency: transitive dependency: transitive
description: description:
name: path name: path
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.8.0" version: "1.8.2"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@@ -97,58 +108,58 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.8.1" version: "1.9.1"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
name: stack_trace name: stack_trace
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.10.0" version: "1.11.0"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
name: stream_channel name: stream_channel
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.0" version: "2.1.1"
string_scanner: string_scanner:
dependency: transitive dependency: transitive
description: description:
name: string_scanner name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.0" version: "1.2.0"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
name: term_glyph name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.2.0" version: "1.2.1"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.4.8" version: "0.4.16"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.0"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.1" version: "2.1.4"
sdks: sdks:
dart: ">=2.14.0 <3.0.0" dart: ">=2.18.0 <3.0.0"
flutter: ">=1.20.0" flutter: ">=1.20.0"

View File

@@ -1,6 +1,6 @@
name: flutter_openim_sdk name: flutter_openim_sdk
description: An instant messaging plug-in that supports Android and IOS. And the server is also all open source. description: An instant messaging plug-in that supports Android and IOS. And the server is also all open source.
version: 2.0.9 version: 2.3.5+3
homepage: https://www.rentsoft.cn homepage: https://www.rentsoft.cn
repository: https://github.com/OpenIMSDK/Open-IM-SDK-Flutter repository: https://github.com/OpenIMSDK/Open-IM-SDK-Flutter