Compare commits

..

85 Commits
1.1.1 ... 2.2.0

Author SHA1 Message Date
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
hrxiang
f0b28099bf Upgrade 2022-05-25 17:03:53 +08:00
hrxiang
d5d11af7ce Upgrade 2022-05-25 16:21:43 +08:00
hrxiang
9cd717c67c Upgrade 2022-05-25 15:18:22 +08:00
hrxiang
c7218cb94c Upgrade 2022-05-20 10:27:18 +08:00
hrxiang
e4c78e0106 Upgrade 2022-05-19 16:00:10 +08:00
hrxiang
7457f182f3 Upgrade 2022-05-18 16:47:14 +08:00
hrxiang
952cb82417 Upgrade 2022-05-11 17:30:11 +08:00
std-s
3cb2c6d514 [Fix] object is NSNull. 2022-05-10 15:02:18 +08:00
hrxiang
90be2f74ac Upgrade 2022-05-10 10:37:12 +08:00
hrxiang
53ef6c2173 Upgrade 2022-05-10 10:33:39 +08:00
hrxiang
373171aded Fix bug 2022-05-10 10:13:14 +08:00
hrxiang
58702fcbaf Upgrade 2022-05-10 09:56:59 +08:00
hrxiang
8b8c9d5923 Upgrade 2022-04-29 14:14:08 +08:00
hrxiang
d5e3947878 Upgrade 2022-04-28 16:28:13 +08:00
hrxiang
6edf9b74fa Upgrade 2022-04-24 12:12:26 +08:00
hrxiang
fcc8373560 Upgrade 2022-04-08 16:29:08 +08:00
hrxiang
7e8d72929a Upgrade 2022-04-08 14:36:47 +08:00
hrxiang
03fa70c585 Upgrade 2022-04-08 10:55:15 +08:00
hrxiang
8b4a35e6b7 Upgrade 2022-04-07 12:22:38 +08:00
hrxiang
71897bcb4e Upgrade 2022-04-01 18:25:52 +08:00
hrxiang
57340e52a7 New some function 2022-03-31 11:13:36 +08:00
hrxiang
197f0b482f New some function 2022-03-31 11:08:11 +08:00
hrxiang
e009224256 Fix bug 2022-03-30 09:23:41 +08:00
hrxiang
ad0563aee4 Fix bug 2022-03-25 16:39:19 +08:00
hrxiang
d120312ac9 Fix bug 2022-03-25 16:34:06 +08:00
hrxiang
d64b426c90 Fix bug 2022-03-25 16:14:30 +08:00
hrxiang
3a845dc40b Pre publish 2.0.0+4 2022-03-25 15:15:27 +08:00
hrxiang
700265c685 Fix bug 2022-03-21 18:42:29 +08:00
hrxiang
73b9eb776f New add some fuc 2022-03-21 17:17:41 +08:00
hrxiang
372e573ea0 Fix bug 2022-03-18 19:11:30 +08:00
hrxiang
8ea08f9ce6 New add fuc 2022-03-18 18:39:34 +08:00
hrxiang
40b65f52a5 Add signaling function 2022-03-15 16:40:42 +08:00
hrxiang
6c0676fbe5 Add custom emoji message 2022-03-10 17:53:01 +08:00
hrxiang
80152e2314 Fix some one crash 2022-03-04 17:37:27 +08:00
hrxiang
2381d26729 Fix some one crash 2022-03-04 17:36:16 +08:00
hrxiang
b25f0d8547 Update ios framework 2022-03-03 11:47:59 +08:00
hrxiang
f4e7eaf50e Update README.md 2022-03-03 11:42:38 +08:00
hrxiang
f40d4148a8 Update README.md 2022-02-28 14:05:37 +08:00
hrxiang
23fa27d2cc Update README.md 2022-02-25 15:15:53 +08:00
hrxiang
6a1dc1f62a Update README.md 2022-02-25 15:13:38 +08:00
hrxiang
07212474fe Update README.md 2022-02-25 15:11:28 +08:00
hrxiang
8655088af6 Fix bug 2022-02-25 14:53:25 +08:00
hrxiang
b7aa083f48 Fix bug 2022-02-25 09:10:31 +08:00
hrxiang
514fb53eca Fix bug 2022-02-24 17:01:40 +08:00
hrxiang
9345c6465a Fix bug 2022-02-23 14:02:24 +08:00
hrxiang
b05e68355e new version sdk 2022-02-21 18:39:47 +08:00
hrxiang
3746652552 new version sdk 2022-02-21 18:31:18 +08:00
hrxiang
e323eea8cd new version sdk 2022-02-21 17:29:10 +08:00
hrxiang
f111d0c69e new version sdk 2022-02-21 16:15:08 +08:00
hrxiang
ba661a516e new version sdk 2022-02-21 16:15:03 +08:00
hrxiang
43016d5e86 new version sdk 2022-02-21 15:37:19 +08:00
hrxiang
4c43d54a1a new version sdk 2022-02-21 15:11:27 +08:00
hrxiang
b71cd22dce new version sdk 2022-02-19 14:03:45 +08:00
hrxiang
f3261d2ce4 new_version1 2022-02-16 15:36:37 +08:00
109 changed files with 9787 additions and 6047 deletions

1
.idea/misc.xml generated
View File

@@ -3,4 +3,5 @@
<component name="FrameworkDetectionExcludesConfiguration"> <component name="FrameworkDetectionExcludesConfiguration">
<type id="android" /> <type id="android" />
</component> </component>
<component name="ProjectRootManager" version="2" project-jdk-name="Android API 25 Platform" project-jdk-type="Android SDK" />
</project> </project>

1
.idea/modules.xml generated
View File

@@ -3,6 +3,7 @@
<component name="ProjectModuleManager"> <component name="ProjectModuleManager">
<modules> <modules>
<module fileurl="file://$PROJECT_DIR$/.idea/flutter_openim_sdk.iml" filepath="$PROJECT_DIR$/.idea/flutter_openim_sdk.iml" /> <module fileurl="file://$PROJECT_DIR$/.idea/flutter_openim_sdk.iml" filepath="$PROJECT_DIR$/.idea/flutter_openim_sdk.iml" />
<module fileurl="file://$PROJECT_DIR$/android/flutter_openim_sdk_android.iml" filepath="$PROJECT_DIR$/android/flutter_openim_sdk_android.iml" />
</modules> </modules>
</component> </component>
</project> </project>

View File

@@ -1,3 +1,98 @@
## 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
1.Fix bug </br>
2.Add organization fuction </br>
3.Add uploadImage method </br>
4.Fix login slow bug </br>
## 2.0.8
1.Fix bug </br>
2.Change the sdk maven address </br>
3.Sync go IM sdk version number </br>
## 2.0.0+6
1.Fix bug </br>
2.Adapter ios emulator </br>
3.Add modify group nickname </br>
4.Update at message </br>
5.ConverstaionInfo new add isNotInGroup field</br>
6.Add at type </br>
7.Add work moments </br>
8.Add global search </br>
9.Add getHistoryMessageListReverse method </br>
10.Add getAtAllTag method </br>
11.Add resetConversationGroupAtType method </br>
12.Add searchGroups method </br>
## 2.0.0+5
1.Add notification parse </br>
2.Add deleteConversationFromLocalAndSvr method </br>
3.Add deleteMessageFromLocalAndSvr method </br>
4.Add deleteAllMsgFromLocal method </br>
5.Add deleteAllMsgFromLocalAndSvr method </br>
6.Add clearC2CHistoryMessageFromLocalAndSvr method </br>
7.Add clearGroupHistoryMessageFromLocalAndSvr method </br>
8.Add markMessageAsReadByConID method </br>
9.Add wakeUp method </br>
10.Add deleteAllConversationFromLocal method </br>
## 2.0.0+4
1.Add dismiss group </br>
2.Add search local message </br>
3.Add private chat </br>
4.Add group mute
## 2.0.0+3
1.Fix bug </br>
## 2.0.0+2
1.Fix some one crash </br>
2.Add signaling function </br>
3.Add group have read receipt
## 2.0.0+1
1.Fix multi-terminal synchronization bug fix for retracted messages </br>
2.Fix sending picture flashback bug </br>
3.Fix other bug
## 2.0.0
1.Refactor mobile sdk, server sdk (2022-2-21)
## 1.1.1 ## 1.1.1
1.Update sdk maven url 1.Update sdk maven url
@@ -13,13 +108,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
@@ -57,7 +152,7 @@ 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

1994
README.md

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -4,8 +4,8 @@ version '1.0'
buildscript { buildscript {
repositories { repositories {
maven { maven {
url 'http://121.37.25.71:8081/repository/maven2/'
allowInsecureProtocol = true allowInsecureProtocol = true
url 'http://121.37.25.71:8081/repository/maven-releases/'
} }
google() google()
mavenCentral() mavenCentral()
@@ -19,8 +19,8 @@ buildscript {
rootProject.allprojects { rootProject.allprojects {
repositories { repositories {
maven { maven {
url 'http://121.37.25.71:8081/repository/maven2/'
allowInsecureProtocol = true allowInsecureProtocol = true
url 'http://121.37.25.71:8081/repository/maven-releases/'
} }
google() google()
mavenCentral() mavenCentral()
@@ -41,5 +41,5 @@ android {
} }
} }
dependencies { dependencies {
implementation 'io.openim:client-sdk:1.4.5@aar' implementation 'io.openim:core-sdk:2.1.0.2@aar'
} }

View File

@@ -18,6 +18,10 @@ import io.openim.flutter_openim_sdk.manager.FriendshipManager;
import io.openim.flutter_openim_sdk.manager.GroupManager; import io.openim.flutter_openim_sdk.manager.GroupManager;
import io.openim.flutter_openim_sdk.manager.IMManager; import io.openim.flutter_openim_sdk.manager.IMManager;
import io.openim.flutter_openim_sdk.manager.MessageManager; import io.openim.flutter_openim_sdk.manager.MessageManager;
import io.openim.flutter_openim_sdk.manager.OrganizationManager;
import io.openim.flutter_openim_sdk.manager.SignalingManager;
import io.openim.flutter_openim_sdk.manager.UserManager;
import io.openim.flutter_openim_sdk.manager.WorkMomentsManager;
/** /**
@@ -31,20 +35,28 @@ public class FlutterOpenimSdkPlugin implements FlutterPlugin, MethodCallHandler
public static MethodChannel channel; public static MethodChannel channel;
private static IMManager imManager; private static IMManager imManager;
private static UserManager userManager;
private static FriendshipManager friendshipManager; private static FriendshipManager friendshipManager;
private static MessageManager messageManager; private static MessageManager messageManager;
private static ConversationManager conversationManager; private static ConversationManager conversationManager;
private static GroupManager groupManager; private static GroupManager groupManager;
private static SignalingManager signalingManager;
private static WorkMomentsManager workMomentsManager;
private static OrganizationManager organizationManager;
public FlutterOpenimSdkPlugin() { public FlutterOpenimSdkPlugin() {
} }
private FlutterOpenimSdkPlugin(Context context) { private FlutterOpenimSdkPlugin(Context context) {
FlutterOpenimSdkPlugin.imManager = new IMManager(); FlutterOpenimSdkPlugin.imManager = new IMManager();
FlutterOpenimSdkPlugin.userManager = new UserManager();
FlutterOpenimSdkPlugin.friendshipManager = new FriendshipManager(); FlutterOpenimSdkPlugin.friendshipManager = new FriendshipManager();
FlutterOpenimSdkPlugin.messageManager = new MessageManager(); FlutterOpenimSdkPlugin.messageManager = new MessageManager();
FlutterOpenimSdkPlugin.conversationManager = new ConversationManager(); FlutterOpenimSdkPlugin.conversationManager = new ConversationManager();
FlutterOpenimSdkPlugin.groupManager = new GroupManager(); FlutterOpenimSdkPlugin.groupManager = new GroupManager();
FlutterOpenimSdkPlugin.signalingManager = new SignalingManager();
FlutterOpenimSdkPlugin.workMomentsManager = new WorkMomentsManager();
FlutterOpenimSdkPlugin.organizationManager = new OrganizationManager();
} }
@Override @Override

View File

@@ -1,28 +0,0 @@
package io.openim.flutter_openim_sdk.listener;
import io.flutter.Log;
import io.flutter.plugin.common.MethodChannel;
import io.openim.flutter_openim_sdk.util.CommonUtil;
import open_im_sdk.Base;
public class BaseListener implements Base {
MethodChannel.Result result;
public BaseListener(MethodChannel.Result result) {
this.result = result;
}
@Override
public void onError(long l, String s) {
// Log.e("F-OpenIMSD(callback)", s);
CommonUtil.runMainThreadReturnError(result, l, s, null);
}
@Override
public void onSuccess(String s) {
// Log.i("F-OpenIMSDK(callback)", s);
CommonUtil.runMainThreadReturn(result, s);
}
}

View File

@@ -1,52 +0,0 @@
package io.openim.flutter_openim_sdk.listener;
import io.openim.flutter_openim_sdk.util.CommonUtil;
import open_im_sdk.OnFriendshipListener;
public class FriendshipListener implements OnFriendshipListener {
@Override
public void onBlackListAdd(String s) {
CommonUtil.emitEvent("friendListener", "onBlackListAdd", s);
}
@Override
public void onBlackListDeleted(String s) {
CommonUtil.emitEvent("friendListener", "onBlackListDeleted", s);
}
@Override
public void onFriendApplicationListAccept(String s) {
CommonUtil.emitEvent("friendListener", "onFriendApplicationListAccept", s);
}
@Override
public void onFriendApplicationListAdded(String s) {
CommonUtil.emitEvent("friendListener", "onFriendApplicationListAdded", s);
}
@Override
public void onFriendApplicationListDeleted(String s) {
CommonUtil.emitEvent("friendListener", "onFriendApplicationListDeleted", s);
}
@Override
public void onFriendApplicationListReject(String s) {
CommonUtil.emitEvent("friendListener", "onFriendApplicationListReject", s);
}
@Override
public void onFriendInfoChanged(String s) {
CommonUtil.emitEvent("friendListener", "onFriendInfoChanged", s);
}
@Override
public void onFriendListAdded(String s) {
CommonUtil.emitEvent("friendListener", "onFriendListAdded", s);
}
@Override
public void onFriendListDeleted(String s) {
CommonUtil.emitEvent("friendListener", "onFriendListDeleted", s);
}
}

View File

@@ -1,79 +0,0 @@
package io.openim.flutter_openim_sdk.listener;
import android.util.ArrayMap;
import java.util.HashMap;
import java.util.Map;
import io.openim.flutter_openim_sdk.util.CommonUtil;
import open_im_sdk.OnGroupListener;
public class GroupListener implements OnGroupListener {
@Override
public void onApplicationProcessed(String s, String s1, int i, String s2) {
Map<String, Object> map = new ArrayMap<>();
map.put("groupId", s);
map.put("opUser", s1);
map.put("agreeOrReject", i);
map.put("opReason", s2);
CommonUtil.emitEvent("groupListener", "onApplicationProcessed", map);
}
@Override
public void onGroupCreated(String s) {
Map<String, Object> map = new ArrayMap<>();
map.put("groupId", s);
CommonUtil.emitEvent("groupListener", "onGroupCreated", map);
}
@Override
public void onGroupInfoChanged(String s, String s1) {
Map<String, Object> map = new ArrayMap<>();
map.put("groupId", s);
map.put("groupInfo", s1);
CommonUtil.emitEvent("groupListener", "onGroupInfoChanged", map);
}
@Override
public void onMemberEnter(String s, String s1) {
Map<String, Object> map = new ArrayMap<>();
map.put("groupId", s);
map.put("memberList", s1);
CommonUtil.emitEvent("groupListener", "onMemberEnter", map);
}
@Override
public void onMemberInvited(String s, String s1, String s2) {
Map<String, Object> map = new ArrayMap<>();
map.put("groupId", s);
map.put("opUser", s1);
map.put("memberList", s2);
CommonUtil.emitEvent("groupListener", "onMemberInvited", map);
}
@Override
public void onMemberKicked(String s, String s1, String s2) {
Map<String, Object> map = new ArrayMap<>();
map.put("groupId", s);
map.put("opUser", s1);
map.put("memberList", s2);
CommonUtil.emitEvent("groupListener", "onMemberKicked", map);
}
@Override
public void onMemberLeave(String s, String s1) {
Map<String, Object> map = new ArrayMap<>();
map.put("groupId", s);
map.put("member", s1);
CommonUtil.emitEvent("groupListener", "onMemberLeave", map);
}
@Override
public void onReceiveJoinApplication(String s, String s1, String s2) {
Map<String, Object> map = new ArrayMap<>();
map.put("groupId", s);
map.put("member", s1);
map.put("opReason", s2);
CommonUtil.emitEvent("groupListener", "onReceiveJoinApplication", map);
}
}

View File

@@ -5,25 +5,30 @@ import android.util.ArrayMap;
import java.util.Map; import java.util.Map;
import io.openim.flutter_openim_sdk.util.CommonUtil; import io.openim.flutter_openim_sdk.util.CommonUtil;
import open_im_sdk.OnAdvancedMsgListener;
public class AdvancedMsgListener implements OnAdvancedMsgListener { public class OnAdvancedMsgListener implements open_im_sdk_callback.OnAdvancedMsgListener {
// final Map<String, String> values = new HashMap<>();
private final String id; private final String id;
public AdvancedMsgListener(String listenerId) { public OnAdvancedMsgListener(String listenerId) {
this.id = listenerId; this.id = listenerId;
// this.values.put("id", listenerId);
} }
@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<>();
values.put("id", id); values.put("id", id);
values.put("haveReadMessage", s); values.put("c2cMessageReadReceipt", s);
CommonUtil.emitEvent("advancedMsgListener", "onRecvC2CReadReceipt", values); CommonUtil.emitEvent("advancedMsgListener", "onRecvC2CReadReceipt", values);
} }
@Override
public void onRecvGroupReadReceipt(String s) {
final Map<String, String> values = new ArrayMap<>();
values.put("id", id);
values.put("groupMessageReadReceipt", s);
CommonUtil.emitEvent("advancedMsgListener", "onRecvGroupReadReceipt", 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,31 @@
package io.openim.flutter_openim_sdk.listener;
import io.flutter.Log;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.openim.flutter_openim_sdk.util.CommonUtil;
import open_im_sdk_callback.Base;
public class OnBaseListener implements Base {
MethodChannel.Result result;
MethodCall call;
public OnBaseListener(MethodChannel.Result result, MethodCall call) {
this.result = result;
this.call = call;
}
@Override
public void onError(int l, String s) {
Log.i("F-OpenIMSDK(flutter call native)", "method: 【 " + call.method + " 】, onError: { code:" + l + ", message:" + s + "}");
CommonUtil.runMainThreadReturnError(result, l, s, null);
}
@Override
public void onSuccess(String s) {
Log.i("F-OpenIMSDK(flutter call native)", "method: 【 " + call.method + " 】, onSuccess: " + s);
CommonUtil.runMainThreadReturn(result, s);
}
}

View File

@@ -0,0 +1,34 @@
package io.openim.flutter_openim_sdk.listener;
import io.openim.flutter_openim_sdk.util.CommonUtil;
public class OnConnListener implements open_im_sdk_callback.OnConnListener {
@Override
public void onConnectFailed(int i, String s) {
CommonUtil.emitEvent("connectListener", "onConnectFailed", i, s, null);
}
@Override
public void onConnectSuccess() {
CommonUtil.emitEvent("connectListener", "onConnectSuccess", null);
}
@Override
public void onConnecting() {
CommonUtil.emitEvent("connectListener", "onConnecting", null);
}
@Override
public void onKickedOffline() {
CommonUtil.emitEvent("connectListener", "onKickedOffline", null);
}
@Override
public void onUserTokenExpired() {
CommonUtil.emitEvent("connectListener", "onUserTokenExpired", null);
}
}

View File

@@ -1,10 +1,9 @@
package io.openim.flutter_openim_sdk.listener; package io.openim.flutter_openim_sdk.listener;
import io.openim.flutter_openim_sdk.util.CommonUtil; import io.openim.flutter_openim_sdk.util.CommonUtil;
import open_im_sdk.OnConversationListener;
public class ConversationListener implements OnConversationListener {
public class OnConversationListener implements open_im_sdk_callback.OnConversationListener {
@Override @Override
public void onConversationChanged(String s) { public void onConversationChanged(String s) {

View File

@@ -0,0 +1,51 @@
package io.openim.flutter_openim_sdk.listener;
import io.openim.flutter_openim_sdk.util.CommonUtil;
public class OnFriendshipListener implements open_im_sdk_callback.OnFriendshipListener {
@Override
public void onBlackAdded(String s) {
CommonUtil.emitEvent("friendListener", "onBlacklistAdded", s);
}
@Override
public void onBlackDeleted(String s) {
CommonUtil.emitEvent("friendListener", "onBlacklistDeleted", s);
}
@Override
public void onFriendAdded(String s) {
CommonUtil.emitEvent("friendListener", "onFriendAdded", s);
}
@Override
public void onFriendApplicationAccepted(String s) {
CommonUtil.emitEvent("friendListener", "onFriendApplicationAccepted", s);
}
@Override
public void onFriendApplicationAdded(String s) {
CommonUtil.emitEvent("friendListener", "onFriendApplicationAdded", s);
}
@Override
public void onFriendApplicationDeleted(String s) {
CommonUtil.emitEvent("friendListener", "onFriendApplicationDeleted", s);
}
@Override
public void onFriendApplicationRejected(String s) {
CommonUtil.emitEvent("friendListener", "onFriendApplicationRejected", s);
}
@Override
public void onFriendDeleted(String s) {
CommonUtil.emitEvent("friendListener", "onFriendDeleted", s);
}
@Override
public void onFriendInfoChanged(String s) {
CommonUtil.emitEvent("friendListener", "onFriendInfoChanged", s);
}
}

View File

@@ -0,0 +1,56 @@
package io.openim.flutter_openim_sdk.listener;
import io.openim.flutter_openim_sdk.util.CommonUtil;
public class OnGroupListener implements open_im_sdk_callback.OnGroupListener {
@Override
public void onGroupApplicationAccepted(String s) {
CommonUtil.emitEvent("groupListener", "onGroupApplicationAccepted", s);
}
@Override
public void onGroupApplicationAdded(String s) {
CommonUtil.emitEvent("groupListener", "onGroupApplicationAdded", s);
}
@Override
public void onGroupApplicationDeleted(String s) {
CommonUtil.emitEvent("groupListener", "onGroupApplicationDeleted", s);
}
@Override
public void onGroupApplicationRejected(String s) {
CommonUtil.emitEvent("groupListener", "onGroupApplicationRejected", s);
}
@Override
public void onGroupInfoChanged(String s) {
CommonUtil.emitEvent("groupListener", "onGroupInfoChanged", s);
}
@Override
public void onGroupMemberAdded(String s) {
CommonUtil.emitEvent("groupListener", "onGroupMemberAdded", s);
}
@Override
public void onGroupMemberDeleted(String s) {
CommonUtil.emitEvent("groupListener", "onGroupMemberDeleted", s);
}
@Override
public void onGroupMemberInfoChanged(String s) {
CommonUtil.emitEvent("groupListener", "onGroupMemberInfoChanged", s);
}
@Override
public void onJoinedGroupAdded(String s) {
CommonUtil.emitEvent("groupListener", "onJoinedGroupAdded", s);
}
@Override
public void onJoinedGroupDeleted(String s) {
CommonUtil.emitEvent("groupListener", "onJoinedGroupDeleted", s);
}
}

View File

@@ -7,31 +7,33 @@ import java.util.Map;
import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel;
import io.openim.flutter_openim_sdk.util.CommonUtil; import io.openim.flutter_openim_sdk.util.CommonUtil;
import open_im_sdk.SendMsgCallBack; import open_im_sdk_callback.SendMsgCallBack;
public class MsgSendProgressListener implements SendMsgCallBack { public class OnMsgSendListener implements SendMsgCallBack {
final private MethodChannel.Result result; final private MethodChannel.Result result;
// final private MethodCall call; private Object clientMsgID;
final private Object clientMsgID;
public MsgSendProgressListener(MethodChannel.Result result, MethodCall call) { public OnMsgSendListener(MethodChannel.Result result, MethodCall call) {
this.result = result; this.result = result;
// this.call = call;
Map<String, Object> args = call.argument("message"); Map<String, Object> args = call.argument("message");
this.clientMsgID = args.get("clientMsgID"); if (null != args) {
this.clientMsgID = args.get("clientMsgID");
}
} }
@Override @Override
public void onError(long l, String s) { public void onError(int l, String s) {
CommonUtil.runMainThreadReturnError(result, l, s, null); CommonUtil.runMainThreadReturnError(result, l, s, null);
} }
@Override @Override
public void onProgress(long l) { public void onProgress(long l) {
final Map<String, Object> values = new ArrayMap<>(); if (null != clientMsgID) {
values.put("clientMsgID", clientMsgID); final Map<String, Object> values = new ArrayMap<>();
values.put("progress", l); values.put("clientMsgID", clientMsgID);
CommonUtil.emitEvent("msgSendProgressListener", "onProgress", values); values.put("progress", l);
CommonUtil.emitEvent("msgSendProgressListener", "onProgress", values);
}
} }
@Override @Override

View File

@@ -0,0 +1,10 @@
package io.openim.flutter_openim_sdk.listener;
import io.openim.flutter_openim_sdk.util.CommonUtil;
public class OnOrganizationListener implements open_im_sdk_callback.OnOrganizationListener {
@Override
public void onOrganizationUpdated() {
CommonUtil.emitEvent("organizationListener", "onOrganizationUpdated", null);
}
}

View File

@@ -0,0 +1,46 @@
package io.openim.flutter_openim_sdk.listener;
import io.openim.flutter_openim_sdk.util.CommonUtil;
public class OnSignalingListener implements open_im_sdk_callback.OnSignalingListener {
@Override
public void onInvitationCancelled(String s) {
CommonUtil.emitEvent("signalingListener", "onInvitationCancelled", s);
}
@Override
public void onInvitationTimeout(String s) {
CommonUtil.emitEvent("signalingListener", "onInvitationTimeout", s);
}
@Override
public void onInviteeAccepted(String s) {
CommonUtil.emitEvent("signalingListener", "onInviteeAccepted", s);
}
@Override
public void onInviteeAcceptedByOtherDevice(String s) {
CommonUtil.emitEvent("signalingListener", "onInviteeAcceptedByOtherDevice", s);
}
@Override
public void onInviteeRejected(String s) {
CommonUtil.emitEvent("signalingListener", "onInviteeRejected", s);
}
@Override
public void onInviteeRejectedByOtherDevice(String s) {
CommonUtil.emitEvent("signalingListener", "onInviteeRejectedByOtherDevice", s);
}
@Override
public void onReceiveNewInvitation(String s) {
CommonUtil.emitEvent("signalingListener", "onReceiveNewInvitation", s);
}
@Override
public void onHangUp(String s) {
CommonUtil.emitEvent("signalingListener", "onHangUp", s);
}
}

View File

@@ -0,0 +1,11 @@
package io.openim.flutter_openim_sdk.listener;
import io.openim.flutter_openim_sdk.util.CommonUtil;
public class OnUserListener implements open_im_sdk_callback.OnUserListener {
@Override
public void onSelfInfoUpdated(String s) {
CommonUtil.emitEvent("userListener", "onSelfInfoUpdated", s);
}
}

View File

@@ -0,0 +1,12 @@
package io.openim.flutter_openim_sdk.listener;
import io.openim.flutter_openim_sdk.util.CommonUtil;
public class OnWorkMomentsListener implements open_im_sdk_callback.OnWorkMomentsListener {
@Override
public void onRecvNewNotification() {
CommonUtil.emitEvent("workMomentsListener", "OnRecvNewNotification", null);
}
}

View File

@@ -1,38 +0,0 @@
package io.openim.flutter_openim_sdk.listener;
import io.openim.flutter_openim_sdk.util.CommonUtil;
import open_im_sdk.IMSDKListener;
public class SDKListener implements IMSDKListener {
@Override
public void onConnectFailed(long l, String s) {
CommonUtil.emitEvent("initSDKListener", "onConnectFailed", l, s, null);
}
@Override
public void onConnectSuccess() {
CommonUtil.emitEvent("initSDKListener", "onConnectSuccess", null);
}
@Override
public void onConnecting() {
CommonUtil.emitEvent("initSDKListener", "onConnecting", null);
}
@Override
public void onKickedOffline() {
CommonUtil.emitEvent("initSDKListener", "onKickedOffline", null);
}
@Override
public void onSelfInfoUpdated(String s) {
CommonUtil.emitEvent("initSDKListener", "onSelfInfoUpdated", s);
}
@Override
public void onUserTokenExpired() {
CommonUtil.emitEvent("initSDKListener", "onUserTokenExpired", null);
}
}

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

@@ -2,74 +2,98 @@ package io.openim.flutter_openim_sdk.manager;
import io.flutter.plugin.common.MethodCall; 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.BaseListener; import io.openim.flutter_openim_sdk.listener.OnBaseListener;
import io.openim.flutter_openim_sdk.listener.ConversationListener; import io.openim.flutter_openim_sdk.listener.OnConversationListener;
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;
public class ConversationManager extends BaseManager { 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 ConversationListener()); Open_im_sdk.setConversationListener(new OnConversationListener());
} }
public void getAllConversationList(MethodCall methodCall, MethodChannel.Result result) { public void getAllConversationList(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getAllConversationList(new BaseListener(result)); Open_im_sdk.getAllConversationList(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
} }
public void getConversationListSplit(MethodCall methodCall, MethodChannel.Result result) { public void getConversationListSplit(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getConversationListSplit(new BaseListener(result), Open_im_sdk.getConversationListSplit(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
int2long(methodCall, "offset"), int2long(methodCall, "offset"),
int2long(methodCall, "count")); int2long(methodCall, "count")
);
} }
public void getOneConversation(MethodCall methodCall, MethodChannel.Result result) { public void getOneConversation(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getOneConversation( Open_im_sdk.getOneConversation(
value(methodCall, "sourceID"), new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
int2long(methodCall, "sessionType"), int2long(methodCall, "sessionType"),
new BaseListener(result)); value(methodCall, "sourceID")
);
} }
public void getMultipleConversation(MethodCall methodCall, MethodChannel.Result result) { public void getMultipleConversation(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getMultipleConversation( Open_im_sdk.getMultipleConversation(
jsonValue(methodCall, "conversationIDList"), new OnBaseListener(result, methodCall),
new BaseListener(result)); value(methodCall, "operationID"),
jsonValue(methodCall, "conversationIDList")
);
} }
public void deleteConversation(MethodCall methodCall, MethodChannel.Result result) { public void deleteConversation(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.deleteConversation( Open_im_sdk.deleteConversation(
value(methodCall, "conversationID"), new OnBaseListener(result, methodCall),
new BaseListener(result)); value(methodCall, "operationID"),
value(methodCall, "conversationID")
);
} }
public void setConversationDraft(MethodCall methodCall, MethodChannel.Result result) { public void setConversationDraft(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setConversationDraft( Open_im_sdk.setConversationDraft(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID"), value(methodCall, "conversationID"),
value(methodCall, "draftText"), value(methodCall, "draftText")
new BaseListener(result)); );
} }
public void pinConversation(MethodCall methodCall, MethodChannel.Result result) { public void pinConversation(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.pinConversation( Open_im_sdk.pinConversation(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID"), value(methodCall, "conversationID"),
value(methodCall, "isPinned"), value(methodCall, "isPinned")
new BaseListener(result)); );
} }
public void markSingleMessageHasRead(MethodCall methodCall, MethodChannel.Result result) { // public void markSingleMessageHasRead(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.markSingleMessageHasRead( // Open_im_sdk.markSingleMessageHasRead(
new BaseListener(result), // new OnBaseListener(result, methodCall),
value(methodCall, "userID")); // value(methodCall, "operationID"),
} // value(methodCall, "userID")
// );
// }
public void markGroupMessageHasRead(MethodCall methodCall, MethodChannel.Result result) { public void markGroupMessageHasRead(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.markGroupMessageHasRead( Open_im_sdk.markGroupMessageHasRead(
new BaseListener(result), new OnBaseListener(result, methodCall),
value(methodCall, "groupID")); value(methodCall, "operationID"),
value(methodCall, "groupID")
);
} }
public void getTotalUnreadMsgCount(MethodCall methodCall, MethodChannel.Result result) { public void getTotalUnreadMsgCount(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getTotalUnreadMsgCount(new BaseListener(result)); Open_im_sdk.getTotalUnreadMsgCount(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
} }
public void getConversationIDBySessionType(MethodCall methodCall, MethodChannel.Result result) { public void getConversationIDBySessionType(MethodCall methodCall, MethodChannel.Result result) {
@@ -80,7 +104,8 @@ public class ConversationManager extends BaseManager {
public void setConversationRecvMessageOpt(MethodCall methodCall, MethodChannel.Result result) { public void setConversationRecvMessageOpt(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setConversationRecvMessageOpt( Open_im_sdk.setConversationRecvMessageOpt(
new BaseListener(result), new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "conversationIDList"), jsonValue(methodCall, "conversationIDList"),
int2long(methodCall, "status") int2long(methodCall, "status")
); );
@@ -88,8 +113,53 @@ public class ConversationManager extends BaseManager {
public void getConversationRecvMessageOpt(MethodCall methodCall, MethodChannel.Result result) { public void getConversationRecvMessageOpt(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getConversationRecvMessageOpt( Open_im_sdk.getConversationRecvMessageOpt(
new BaseListener(result), new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "conversationIDList") jsonValue(methodCall, "conversationIDList")
); );
} }
public void setOneConversationPrivateChat(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setOneConversationPrivateChat(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID"),
value(methodCall, "isPrivate")
);
}
public void deleteConversationFromLocalAndSvr(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.deleteConversationFromLocalAndSvr(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID")
);
}
public void deleteAllConversationFromLocal(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.deleteAllConversationFromLocal(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
}
public void resetConversationGroupAtType(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.resetConversationGroupAtType(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID")
);
}
public void getAtAllTag(MethodCall methodCall, MethodChannel.Result result) {
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")
);
}
} }

View File

@@ -2,83 +2,122 @@ package io.openim.flutter_openim_sdk.manager;
import io.flutter.plugin.common.MethodCall; 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.BaseListener; import io.openim.flutter_openim_sdk.listener.OnBaseListener;
import io.openim.flutter_openim_sdk.listener.FriendshipListener; import io.openim.flutter_openim_sdk.listener.OnFriendshipListener;
import open_im_sdk.Open_im_sdk; import open_im_sdk.Open_im_sdk;
public class FriendshipManager extends BaseManager { 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 FriendshipListener()); Open_im_sdk.setFriendListener(new OnFriendshipListener());
} }
public void getFriendsInfo(MethodCall methodCall, MethodChannel.Result result) { public void getFriendsInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getFriendsInfo(new BaseListener(result), Open_im_sdk.getDesignatedFriendsInfo(
jsonValue(methodCall, "uidList")); new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "uidList")
);
} }
public void addFriend(MethodCall methodCall, MethodChannel.Result result) { public void addFriend(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.addFriend(new BaseListener(result), Open_im_sdk.addFriend(
jsonValue(methodCall)); new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall)
);
} }
public void getFriendApplicationList(MethodCall methodCall, MethodChannel.Result result) { public void getRecvFriendApplicationList(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getFriendApplicationList(new BaseListener(result)); Open_im_sdk.getRecvFriendApplicationList(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
}
public void getSendFriendApplicationList(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getSendFriendApplicationList(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
} }
public void getFriendList(MethodCall methodCall, MethodChannel.Result result) { public void getFriendList(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getFriendList(new BaseListener(result)); Open_im_sdk.getFriendList(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
} }
public void setFriendInfo(MethodCall methodCall, MethodChannel.Result result) { public void setFriendRemark(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setFriendInfo( Open_im_sdk.setFriendRemark(
jsonValue(methodCall), new BaseListener(result)); new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall)
);
} }
public void addToBlackList(MethodCall methodCall, MethodChannel.Result result) { public void addBlacklist(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.addToBlackList(new BaseListener(result), Open_im_sdk.addBlack(
jsonValue(methodCall, "uid")); new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "uid")
);
} }
public void getBlackList(MethodCall methodCall, MethodChannel.Result result) { public void getBlacklist(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getBlackList(new BaseListener(result)); Open_im_sdk.getBlackList(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
} }
public void deleteFromBlackList(MethodCall methodCall, MethodChannel.Result result) { public void removeBlacklist(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.deleteFromBlackList(new BaseListener(result), Open_im_sdk.removeBlack(
jsonValue(methodCall, "uid")); new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "uid")
);
} }
public void checkFriend(MethodCall methodCall, MethodChannel.Result result) { public void checkFriend(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.checkFriend(new BaseListener(result), Open_im_sdk.checkFriend(
jsonValue(methodCall, "uidList")); new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "uidList")
);
} }
public void deleteFromFriendList(MethodCall methodCall, MethodChannel.Result result) { public void deleteFriend(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.deleteFromFriendList( Open_im_sdk.deleteFriend(
jsonValue(methodCall, "uid"), new BaseListener(result)); new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "uid")
);
} }
public void acceptFriendApplication(MethodCall methodCall, MethodChannel.Result result) { public void acceptFriendApplication(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.acceptFriendApplication(new BaseListener(result), Open_im_sdk.acceptFriendApplication(
jsonValue(methodCall, "uid")); new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall)
);
} }
public void refuseFriendApplication(MethodCall methodCall, MethodChannel.Result result) { public void refuseFriendApplication(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.refuseFriendApplication(new BaseListener(result), Open_im_sdk.refuseFriendApplication(
jsonValue(methodCall, "uid")); new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall)
);
} }
// public void forceSyncFriendApplication(MethodCall methodCall, MethodChannel.Result result) { public void searchFriends(MethodCall methodCall, MethodChannel.Result result) {
// Open_im_sdk.forceSyncFriendApplication(); Open_im_sdk.searchFriends(
// } new OnBaseListener(result, methodCall),
// value(methodCall, "operationID"),
// public void forceSyncFriend(MethodCall methodCall, MethodChannel.Result result) { jsonValue(methodCall, "searchParam")
// Open_im_sdk.forceSyncFriend(); );
// } }
//
// public void forceSyncBlackList(MethodCall methodCall, MethodChannel.Result result) {
// Open_im_sdk.forceSyncBlackList();
// }
} }

View File

@@ -2,120 +2,221 @@ package io.openim.flutter_openim_sdk.manager;
import io.flutter.plugin.common.MethodCall; 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.BaseListener; import io.openim.flutter_openim_sdk.listener.OnBaseListener;
import io.openim.flutter_openim_sdk.listener.GroupListener; import io.openim.flutter_openim_sdk.listener.OnGroupListener;
import open_im_sdk.Open_im_sdk; import open_im_sdk.Open_im_sdk;
public class GroupManager extends BaseManager { 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 GroupListener()); Open_im_sdk.setGroupListener(new OnGroupListener());
} }
public void inviteUserToGroup(MethodCall methodCall, MethodChannel.Result result) { public void inviteUserToGroup(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.inviteUserToGroup( Open_im_sdk.inviteUserToGroup(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "gid"), value(methodCall, "gid"),
value(methodCall, "reason"), value(methodCall, "reason"),
jsonValue(methodCall, "uidList"), jsonValue(methodCall, "uidList")
new BaseListener(result)); );
} }
public void kickGroupMember(MethodCall methodCall, MethodChannel.Result result) { public void kickGroupMember(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.kickGroupMember( Open_im_sdk.kickGroupMember(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "gid"), value(methodCall, "gid"),
value(methodCall, "reason"), value(methodCall, "reason"),
jsonValue(methodCall, "uidList"), jsonValue(methodCall, "uidList")
new BaseListener(result)); );
} }
public void getGroupMembersInfo(MethodCall methodCall, MethodChannel.Result result) { public void getGroupMembersInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getGroupMembersInfo( Open_im_sdk.getGroupMembersInfo(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "gid"), value(methodCall, "gid"),
jsonValue(methodCall, "uidList"), jsonValue(methodCall, "uidList")
new BaseListener(result)); );
} }
public void getGroupMemberList(MethodCall methodCall, MethodChannel.Result result) { public void getGroupMemberList(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getGroupMemberList( Open_im_sdk.getGroupMemberList(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "gid"), value(methodCall, "gid"),
value(methodCall, "filter"), value(methodCall, "filter"),
value(methodCall, "next"), value(methodCall, "offset"),
new BaseListener(result)); value(methodCall, "count")
);
} }
public void getJoinedGroupList(MethodCall methodCall, MethodChannel.Result result) { public void getJoinedGroupList(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getJoinedGroupList(new BaseListener(result)); Open_im_sdk.getJoinedGroupList(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
} }
public void createGroup(MethodCall methodCall, MethodChannel.Result result) { public void createGroup(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.createGroup( Open_im_sdk.createGroup(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "gInfo"), jsonValue(methodCall, "gInfo"),
jsonValue(methodCall, "memberList"), jsonValue(methodCall, "memberList")
new BaseListener(result)); );
} }
public void setGroupInfo(MethodCall methodCall, MethodChannel.Result result) { public void setGroupInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGroupInfo(jsonValue(methodCall, "gInfo"), new BaseListener(result)); Open_im_sdk.setGroupInfo(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "gid"),
jsonValue(methodCall, "gInfo")
);
} }
public void getGroupsInfo(MethodCall methodCall, MethodChannel.Result result) { public void getGroupsInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getGroupsInfo(jsonValue(methodCall, "gidList"), new BaseListener(result)); Open_im_sdk.getGroupsInfo(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "gidList")
);
} }
public void joinGroup(MethodCall methodCall, MethodChannel.Result result) { public void joinGroup(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.joinGroup( Open_im_sdk.joinGroup(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "gid"), value(methodCall, "gid"),
value(methodCall, "reason"), value(methodCall, "reason")
new BaseListener(result)); );
} }
public void quitGroup(MethodCall methodCall, MethodChannel.Result result) { public void quitGroup(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.quitGroup( Open_im_sdk.quitGroup(
value(methodCall, "gid"), new OnBaseListener(result, methodCall),
new BaseListener(result)); value(methodCall, "operationID"),
value(methodCall, "gid")
);
} }
public void transferGroupOwner(MethodCall methodCall, MethodChannel.Result result) { public void transferGroupOwner(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.transferGroupOwner( Open_im_sdk.transferGroupOwner(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "gid"), value(methodCall, "gid"),
value(methodCall, "uid"), value(methodCall, "uid")
new BaseListener(result)); );
} }
public void getGroupApplicationList(MethodCall methodCall, MethodChannel.Result result) { public void getRecvGroupApplicationList(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getGroupApplicationList(new BaseListener(result)); Open_im_sdk.getRecvGroupApplicationList(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
}
public void getSendGroupApplicationList(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getSendGroupApplicationList(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
} }
public void acceptGroupApplication(MethodCall methodCall, MethodChannel.Result result) { public void acceptGroupApplication(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.acceptGroupApplication( Open_im_sdk.acceptGroupApplication(
jsonValue(methodCall, "application"), new OnBaseListener(result, methodCall),
value(methodCall, "reason"), value(methodCall, "operationID"),
new BaseListener(result)); value(methodCall, "gid"),
value(methodCall, "uid"),
value(methodCall, "handleMsg")
);
} }
public void refuseGroupApplication(MethodCall methodCall, MethodChannel.Result result) { public void refuseGroupApplication(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.refuseGroupApplication( Open_im_sdk.refuseGroupApplication(
jsonValue(methodCall, "application"), new OnBaseListener(result, methodCall),
value(methodCall, "reason"), value(methodCall, "operationID"),
new BaseListener(result)); value(methodCall, "gid"),
value(methodCall, "uid"),
value(methodCall, "handleMsg")
);
} }
// public void forceSyncApplyGroupRequest(MethodCall methodCall, MethodChannel.Result result) { public void dismissGroup(MethodCall methodCall, MethodChannel.Result result) {
// Open_im_sdk.forceSyncApplyGroupRequest(); Open_im_sdk.dismissGroup(
// } new OnBaseListener(result, methodCall),
// value(methodCall, "operationID"),
// public void forceSyncGroupRequest(MethodCall methodCall, MethodChannel.Result result) { value(methodCall, "gid")
// Open_im_sdk.forceSyncGroupRequest(); );
// } }
//
// public void forceSyncJoinedGroup(MethodCall methodCall, MethodChannel.Result result) { public void changeGroupMute(MethodCall methodCall, MethodChannel.Result result) {
// Open_im_sdk.forceSyncJoinedGroup(); Open_im_sdk.changeGroupMute(
// } new OnBaseListener(result, methodCall),
// value(methodCall, "operationID"),
// public void forceSyncJoinedGroupMember(MethodCall methodCall, MethodChannel.Result result) { value(methodCall, "gid"),
// Open_im_sdk.forceSyncJoinedGroupMember(); value(methodCall, "mute")
// } );
}
public void changeGroupMemberMute(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.changeGroupMemberMute(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "gid"),
value(methodCall, "uid"),
int2long(methodCall, "seconds")
);
}
public void setGroupMemberNickname(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGroupMemberNickname(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "gid"),
value(methodCall, "uid"),
value(methodCall, "groupNickname")
);
}
public void searchGroups(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.searchGroups(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
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")
);
}
} }

View File

@@ -2,8 +2,8 @@ package io.openim.flutter_openim_sdk.manager;
import io.flutter.plugin.common.MethodCall; 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.BaseListener; import io.openim.flutter_openim_sdk.listener.OnBaseListener;
import io.openim.flutter_openim_sdk.listener.SDKListener; import io.openim.flutter_openim_sdk.listener.OnConnListener;
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,47 +11,46 @@ public class IMManager extends BaseManager {
public void initSDK(MethodCall methodCall, MethodChannel.Result result) { public void initSDK(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, Open_im_sdk.initSDK( CommonUtil.runMainThreadReturn(result, Open_im_sdk.initSDK(
jsonValue(methodCall), new SDKListener())); new OnConnListener(),
// CommonUtil.runMainThreadReturn(result, null); value(methodCall, "operationID"),
jsonValue(methodCall))
);
} }
public void login(MethodCall methodCall, MethodChannel.Result result) { public void login(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.login( Open_im_sdk.login(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "uid"), value(methodCall, "uid"),
value(methodCall, "token"), new BaseListener(result)); value(methodCall, "token")
);
} }
public void logout(MethodCall methodCall, MethodChannel.Result result) { public void logout(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.logout(new BaseListener(result)); Open_im_sdk.logout(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
} }
public void getLoginStatus(MethodCall methodCall, MethodChannel.Result result) { public void getLoginStatus(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, Open_im_sdk.getLoginStatus()); CommonUtil.runMainThreadReturn(result, Open_im_sdk.getLoginStatus());
} }
// public void getLoginUid(MethodCall methodCall, MethodChannel.Result result) { public void wakeUp(MethodCall methodCall, MethodChannel.Result result) {
// CommonUtil.runMainThreadReturn(result, Open_im_sdk.getLoginUid()); Open_im_sdk.wakeUp(
// } new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
public void getUsersInfo(MethodCall methodCall, MethodChannel.Result result) { );
Open_im_sdk.getUsersInfo(
jsonValue(methodCall, "uidList"), new BaseListener(result));
} }
public void setSelfInfo(MethodCall methodCall, MethodChannel.Result result) { public void uploadImage(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setSelfInfo( Open_im_sdk.uploadImage(
jsonValue(methodCall), new BaseListener(result)); new OnBaseListener(result, methodCall),
} value(methodCall, "operationID"),
value(methodCall, "path"),
public void forceSyncLoginUerInfo(MethodCall methodCall, MethodChannel.Result result) { value(methodCall, "token"),
Open_im_sdk.forceSyncLoginUerInfo(); value(methodCall, "obj")
} );
// public void forceReConn(MethodCall methodCall, MethodChannel.Result result) {
// Open_im_sdk.forceReConn();
// }
public void setSdkLog(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setSdkLog(value(methodCall, "sdkLog"));
} }
} }

View File

@@ -1,28 +1,24 @@
package io.openim.flutter_openim_sdk.manager; package io.openim.flutter_openim_sdk.manager;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import io.flutter.plugin.common.MethodCall; 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.AdvancedMsgListener; import io.openim.flutter_openim_sdk.listener.OnAdvancedMsgListener;
import io.openim.flutter_openim_sdk.listener.BaseListener; import io.openim.flutter_openim_sdk.listener.OnBaseListener;
import io.openim.flutter_openim_sdk.listener.MsgSendProgressListener; 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.OnAdvancedMsgListener;
import open_im_sdk.Open_im_sdk; 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<>();
// protected void clearListeners() { protected void clearListeners() {
// initializedListener = false; initializedListener = false;
// listeners.clear(); listeners.clear();
// } }
private final static OnAdvancedMsgListener sdkMsgListener = new OnAdvancedMsgListener() { private final static OnAdvancedMsgListener sdkMsgListener = new OnAdvancedMsgListener() {
@Override @Override
@@ -50,21 +46,21 @@ public class MessageManager extends BaseManager {
public void addAdvancedMsgListener(MethodCall methodCall, MethodChannel.Result result) { public void addAdvancedMsgListener(MethodCall methodCall, MethodChannel.Result result) {
String key = methodCall.argument(KEY_ID); String key = methodCall.argument(KEY_ID);
Open_im_sdk.addAdvancedMsgListener(new AdvancedMsgListener(key)); Open_im_sdk.addAdvancedMsgListener(new AdvancedMsgListener(key));
// listeners.put(key, new AdvancedMsgListener(key)); listeners.put(key, new AdvancedMsgListener(key));
// if (!initializedListener) { if (!initializedListener) {
// initializedListener = true; initializedListener = true;
// Open_im_sdk.addAdvancedMsgListener(sdkMsgListener); Open_im_sdk.addAdvancedMsgListener(sdkMsgListener);
// } }
} }
public void removeAdvancedMsgListener(MethodCall methodCall, MethodChannel.Result result) { public void removeAdvancedMsgListener(MethodCall methodCall, MethodChannel.Result result) {
// String key = methodCall.argument(KEY_ID); String key = methodCall.argument(KEY_ID);
// listeners.remove(key); listeners.remove(key);
// if (listeners.isEmpty()) { if (listeners.isEmpty()) {
// initializedListener = false; initializedListener = false;
// Open_im_sdk.removeAdvancedMsgListener(sdkMsgListener); Open_im_sdk.removeAdvancedMsgListener(sdkMsgListener);
// } }
} }*/
/* /*
public void addAdvancedMsgListener(MethodCall methodCall, MethodChannel.Result result) { public void addAdvancedMsgListener(MethodCall methodCall, MethodChannel.Result result) {
@@ -83,81 +79,132 @@ public class MessageManager extends BaseManager {
} }
*/ */
public void setAdvancedMsgListener(MethodCall methodCall, MethodChannel.Result result) {
String key = methodCall.argument(KEY_ID);
Open_im_sdk.setAdvancedMsgListener(new OnAdvancedMsgListener(key));
}
public void sendMessage(MethodCall methodCall, MethodChannel.Result result) { public void sendMessage(MethodCall methodCall, MethodChannel.Result result) {
MsgSendProgressListener listener = new MsgSendProgressListener(result, methodCall); Open_im_sdk.sendMessage(
Open_im_sdk.sendMessage(listener, new OnMsgSendListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "message"), jsonValue(methodCall, "message"),
value(methodCall, "userID"), value(methodCall, "userID"),
value(methodCall, "groupID"), value(methodCall, "groupID"),
value(methodCall, "onlineUserOnly")); jsonValue(methodCall, "offlinePushInfo")
);
} }
public void getHistoryMessageList(MethodCall methodCall, MethodChannel.Result result) { public void getHistoryMessageList(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getHistoryMessageList(new BaseListener(result), jsonValue(methodCall)); Open_im_sdk.getHistoryMessageList(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall)
);
} }
public void revokeMessage(MethodCall methodCall, MethodChannel.Result result) { public void revokeMessage(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.revokeMessage(new BaseListener(result), jsonValue(methodCall)); Open_im_sdk.revokeMessage(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall)
);
} }
public void deleteMessageFromLocalStorage(MethodCall methodCall, MethodChannel.Result result) { public void deleteMessageFromLocalStorage(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.deleteMessageFromLocalStorage(new BaseListener(result), jsonValue(methodCall)); Open_im_sdk.deleteMessageFromLocalStorage(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall)
);
} }
public void deleteMessages(MethodCall methodCall, MethodChannel.Result result) { // public void deleteMessages(MethodCall methodCall, MethodChannel.Result result) {
// Open_im_sdk.deleteMessages(new BaseListener(result), CommonUtil.getSDKJsonParam(methodCall)); // Open_im_sdk.deleteMessages(new OnBaseListener(result, methodCall), CommonUtil.getSDKJsonParam(methodCall));
} // }
public void insertSingleMessageToLocalStorage(MethodCall methodCall, MethodChannel.Result result) { public void insertSingleMessageToLocalStorage(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.insertSingleMessageToLocalStorage(new BaseListener(result), Open_im_sdk.insertSingleMessageToLocalStorage(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "message"), jsonValue(methodCall, "message"),
value(methodCall, "receiverID"), value(methodCall, "receiverID"),
value(methodCall, "senderID")); value(methodCall, "senderID")
);
} }
public void findMessages(MethodCall methodCall, MethodChannel.Result result) { public void insertGroupMessageToLocalStorage(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.findMessages(new BaseListener(result), jsonValue(methodCall, "messageIDList")); Open_im_sdk.insertGroupMessageToLocalStorage(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "message"),
value(methodCall, "groupID"),
value(methodCall, "senderID")
);
} }
public void markC2CMessageAsRead(MethodCall methodCall, MethodChannel.Result result) { public void markC2CMessageAsRead(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.markC2CMessageAsRead(new BaseListener(result), Open_im_sdk.markC2CMessageAsRead(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "userID"), value(methodCall, "userID"),
jsonValue(methodCall, "messageIDList")); jsonValue(methodCall, "messageIDList")
);
}
public void markGroupMessageAsRead(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.markGroupMessageAsRead(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID"),
jsonValue(methodCall, "messageIDList")
);
} }
public void typingStatusUpdate(MethodCall methodCall, MethodChannel.Result result) { public void typingStatusUpdate(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.typingStatusUpdate(value(methodCall, "userID"), Open_im_sdk.typingStatusUpdate(
value(methodCall, "typing")); new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "userID"),
value(methodCall, "msgTip")
);
} }
public void createTextMessage(MethodCall methodCall, MethodChannel.Result result) { public void createTextMessage(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createTextMessage( Open_im_sdk.createTextMessage(
value(methodCall, "operationID"),
value(methodCall, "text"))); value(methodCall, "text")));
} }
public void createTextAtMessage(MethodCall methodCall, MethodChannel.Result result) { public void createTextAtMessage(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createTextAtMessage( Open_im_sdk.createTextAtMessage(
value(methodCall, "operationID"),
value(methodCall, "text"), value(methodCall, "text"),
jsonValue(methodCall, "atUserList"))); jsonValue(methodCall, "atUserIDList"),
jsonValue(methodCall, "atUserInfoList"),
jsonValue(methodCall, "quoteMessage")
));
} }
public void createImageMessage(MethodCall methodCall, MethodChannel.Result result) { public void createImageMessage(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createImageMessage( Open_im_sdk.createImageMessage(
value(methodCall, "operationID"),
value(methodCall, "imagePath"))); value(methodCall, "imagePath")));
} }
public void createImageMessageFromFullPath(MethodCall methodCall, MethodChannel.Result result) { public void createImageMessageFromFullPath(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createImageMessageFromFullPath( Open_im_sdk.createImageMessageFromFullPath(
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(
value(methodCall, "operationID"),
value(methodCall, "soundPath"), value(methodCall, "soundPath"),
int2long(methodCall, "duration"))); int2long(methodCall, "duration")));
} }
@@ -165,6 +212,7 @@ public class MessageManager extends BaseManager {
public void createSoundMessageFromFullPath(MethodCall methodCall, MethodChannel.Result result) { public void createSoundMessageFromFullPath(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createSoundMessageFromFullPath( Open_im_sdk.createSoundMessageFromFullPath(
value(methodCall, "operationID"),
value(methodCall, "soundPath"), value(methodCall, "soundPath"),
int2long(methodCall, "duration"))); int2long(methodCall, "duration")));
} }
@@ -172,6 +220,7 @@ public class MessageManager extends BaseManager {
public void createVideoMessage(MethodCall methodCall, MethodChannel.Result result) { public void createVideoMessage(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createVideoMessage( Open_im_sdk.createVideoMessage(
value(methodCall, "operationID"),
value(methodCall, "videoPath"), value(methodCall, "videoPath"),
value(methodCall, "videoType"), value(methodCall, "videoType"),
int2long(methodCall, "duration"), int2long(methodCall, "duration"),
@@ -181,6 +230,7 @@ public class MessageManager extends BaseManager {
public void createVideoMessageFromFullPath(MethodCall methodCall, MethodChannel.Result result) { public void createVideoMessageFromFullPath(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createVideoMessageFromFullPath( Open_im_sdk.createVideoMessageFromFullPath(
value(methodCall, "operationID"),
value(methodCall, "videoPath"), value(methodCall, "videoPath"),
value(methodCall, "videoType"), value(methodCall, "videoType"),
int2long(methodCall, "duration"), int2long(methodCall, "duration"),
@@ -190,6 +240,7 @@ public class MessageManager extends BaseManager {
public void createFileMessage(MethodCall methodCall, MethodChannel.Result result) { public void createFileMessage(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createFileMessage( Open_im_sdk.createFileMessage(
value(methodCall, "operationID"),
value(methodCall, "filePath"), value(methodCall, "filePath"),
value(methodCall, "fileName"))); value(methodCall, "fileName")));
} }
@@ -197,6 +248,7 @@ public class MessageManager extends BaseManager {
public void createFileMessageFromFullPath(MethodCall methodCall, MethodChannel.Result result) { public void createFileMessageFromFullPath(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createFileMessageFromFullPath( Open_im_sdk.createFileMessageFromFullPath(
value(methodCall, "operationID"),
value(methodCall, "filePath"), value(methodCall, "filePath"),
value(methodCall, "fileName"))); value(methodCall, "fileName")));
} }
@@ -204,6 +256,7 @@ public class MessageManager extends BaseManager {
public void createMergerMessage(MethodCall methodCall, MethodChannel.Result result) { public void createMergerMessage(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createMergerMessage( Open_im_sdk.createMergerMessage(
value(methodCall, "operationID"),
jsonValue(methodCall, "messageList"), jsonValue(methodCall, "messageList"),
value(methodCall, "title"), value(methodCall, "title"),
jsonValue(methodCall, "summaryList"))); jsonValue(methodCall, "summaryList")));
@@ -213,11 +266,13 @@ public class MessageManager extends BaseManager {
public void createForwardMessage(MethodCall methodCall, MethodChannel.Result result) { public void createForwardMessage(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, CommonUtil.runMainThreadReturn(result,
Open_im_sdk.createForwardMessage( Open_im_sdk.createForwardMessage(
value(methodCall, "operationID"),
jsonValue(methodCall, "message"))); jsonValue(methodCall, "message")));
} }
public void createLocationMessage(MethodCall methodCall, MethodChannel.Result result) { public void createLocationMessage(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, Open_im_sdk.createLocationMessage( CommonUtil.runMainThreadReturn(result, Open_im_sdk.createLocationMessage(
value(methodCall, "operationID"),
value(methodCall, "description"), value(methodCall, "description"),
value(methodCall, "longitude"), value(methodCall, "longitude"),
value(methodCall, "latitude") value(methodCall, "latitude")
@@ -226,6 +281,7 @@ public class MessageManager extends BaseManager {
public void createCustomMessage(MethodCall methodCall, MethodChannel.Result result) { public void createCustomMessage(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, Open_im_sdk.createCustomMessage( CommonUtil.runMainThreadReturn(result, Open_im_sdk.createCustomMessage(
value(methodCall, "operationID"),
value(methodCall, "data"), value(methodCall, "data"),
value(methodCall, "extension"), value(methodCall, "extension"),
value(methodCall, "description") value(methodCall, "description")
@@ -234,6 +290,7 @@ public class MessageManager extends BaseManager {
public void createQuoteMessage(MethodCall methodCall, MethodChannel.Result result) { public void createQuoteMessage(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, Open_im_sdk.createQuoteMessage( CommonUtil.runMainThreadReturn(result, Open_im_sdk.createQuoteMessage(
value(methodCall, "operationID"),
value(methodCall, "quoteText"), value(methodCall, "quoteText"),
jsonValue(methodCall, "quoteMessage") jsonValue(methodCall, "quoteMessage")
)); ));
@@ -241,21 +298,95 @@ public class MessageManager extends BaseManager {
public void createCardMessage(MethodCall methodCall, MethodChannel.Result result) { public void createCardMessage(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, Open_im_sdk.createCardMessage( CommonUtil.runMainThreadReturn(result, Open_im_sdk.createCardMessage(
value(methodCall, "operationID"),
jsonValue(methodCall, "cardMessage") jsonValue(methodCall, "cardMessage")
)); ));
} }
public void forceSyncMsg(MethodCall methodCall, MethodChannel.Result result) { public void createFaceMessage(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.forceSyncMsg(); CommonUtil.runMainThreadReturn(result, Open_im_sdk.createFaceMessage(
value(methodCall, "operationID"),
int2long(methodCall, "index"),
value(methodCall, "data")
));
} }
public void clearC2CHistoryMessage(MethodCall methodCall, MethodChannel.Result result) { public void clearC2CHistoryMessage(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.clearC2CHistoryMessage(new BaseListener(result), Open_im_sdk.clearC2CHistoryMessage(
value(methodCall, "userID")); new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "userID")
);
} }
public void clearGroupHistoryMessage(MethodCall methodCall, MethodChannel.Result result) { public void clearGroupHistoryMessage(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.clearGroupHistoryMessage(new BaseListener(result), Open_im_sdk.clearGroupHistoryMessage(
value(methodCall, "groupID")); new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID")
);
}
public void searchLocalMessages(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.searchLocalMessages(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "filter")
);
}
public void deleteMessageFromLocalAndSvr(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.deleteMessageFromLocalAndSvr(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall)
);
}
public void deleteAllMsgFromLocal(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.deleteAllMsgFromLocal(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
}
public void deleteAllMsgFromLocalAndSvr(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.deleteAllMsgFromLocalAndSvr(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
}
public void markMessageAsReadByConID(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.markMessageAsReadByConID(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID"),
jsonValue(methodCall, "messageIDList")
);
}
public void clearC2CHistoryMessageFromLocalAndSvr(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.clearC2CHistoryMessageFromLocalAndSvr(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "userID")
);
}
public void clearGroupHistoryMessageFromLocalAndSvr(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.clearGroupHistoryMessageFromLocalAndSvr(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID")
);
}
public void getHistoryMessageListReverse(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getHistoryMessageListReverse(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall)
);
} }
} }

View File

@@ -0,0 +1,68 @@
package io.openim.flutter_openim_sdk.manager;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.openim.flutter_openim_sdk.listener.OnBaseListener;
import io.openim.flutter_openim_sdk.listener.OnOrganizationListener;
import open_im_sdk.Open_im_sdk;
public class OrganizationManager extends BaseManager {
public void setOrganizationListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setOrganizationListener(new OnOrganizationListener());
}
public void getSubDepartment(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getSubDepartment(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "departmentID"),
int2long(methodCall, "offset"),
int2long(methodCall, "count")
);
}
public void getDepartmentMember(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getDepartmentMember(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "departmentID"),
int2long(methodCall, "offset"),
int2long(methodCall, "count")
);
}
public void getUserInDepartment(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getUserInDepartment(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "userID")
);
}
public void getDepartmentMemberAndSubDepartment(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getDepartmentMemberAndSubDepartment(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
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, "searchParams"),
int2long(methodCall, "offset"),
int2long(methodCall, "count")
);
}
}

View File

@@ -0,0 +1,56 @@
package io.openim.flutter_openim_sdk.manager;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.openim.flutter_openim_sdk.listener.OnBaseListener;
import io.openim.flutter_openim_sdk.listener.OnSignalingListener;
import open_im_sdk.Open_im_sdk;
public class SignalingManager extends BaseManager {
public void setSignalingListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setSignalingListener(new OnSignalingListener());
}
public void signalingInvite(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.signalingInvite(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "signalingInfo"));
}
public void signalingInviteInGroup(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.signalingInviteInGroup(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "signalingInfo"));
}
public void signalingAccept(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.signalingAccept(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "signalingInfo"));
}
public void signalingReject(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.signalingReject(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "signalingInfo"));
}
public void signalingCancel(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.signalingCancel(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "signalingInfo"));
}
public void signalingHungUp(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.signalingHungUp(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "signalingInfo"));
}
}

View File

@@ -0,0 +1,35 @@
package io.openim.flutter_openim_sdk.manager;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.openim.flutter_openim_sdk.listener.OnBaseListener;
import io.openim.flutter_openim_sdk.listener.OnUserListener;
import open_im_sdk.Open_im_sdk;
public class UserManager extends BaseManager {
public void setUserListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setUserListener(new OnUserListener());
}
public void getUsersInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getUsersInfo(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "uidList"));
}
public void setSelfInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setSelfInfo(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall));
}
public void getSelfUserInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getSelfUserInfo(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
}
}

View File

@@ -0,0 +1,31 @@
package io.openim.flutter_openim_sdk.manager;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.openim.flutter_openim_sdk.listener.OnBaseListener;
import io.openim.flutter_openim_sdk.listener.OnWorkMomentsListener;
import open_im_sdk.Open_im_sdk;
public class WorkMomentsManager extends BaseManager {
public void setWorkMomentsListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setWorkMomentsListener(new OnWorkMomentsListener());
}
public void getWorkMomentsUnReadCount(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getWorkMomentsUnReadCount(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"));
}
public void getWorkMomentsNotification(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getWorkMomentsNotification(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
int2long(methodCall, "offset"),
int2long(methodCall, "count"));
}
public void clearWorkMomentsNotification(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.clearWorkMomentsNotification(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"));
}
}

View File

@@ -32,7 +32,7 @@ public class CommonUtil {
runMainThreadReturnError(result, String.valueOf(errorCode), errorMessage, errorDetails); runMainThreadReturnError(result, String.valueOf(errorCode), errorMessage, errorDetails);
} }
public synchronized static <T> void emitEvent(String method, String type, Long errCode, String errMsg, T data) { public synchronized static <T> void emitEvent(String method, String type, Object errCode, String errMsg, T data) {
runMainThread(() -> { runMainThread(() -> {
Map<String, Object> res = new ArrayMap<>(); Map<String, Object> res = new ArrayMap<>();
if (null != type) { if (null != type) {

View File

@@ -4,8 +4,9 @@ import org.json.JSONObject;
public class JsonUtil { public class JsonUtil {
public static String toString(Object o) { public static String toString(Object o) {
if (o == null) return null;
if (o instanceof String) { if (o instanceof String) {
StringBuffer buffer = new StringBuffer(); StringBuilder buffer = new StringBuilder();
buffer.append("\""); buffer.append("\"");
buffer.append(o); buffer.append(o);
buffer.append("\""); buffer.append("\"");

View File

@@ -138,7 +138,6 @@
97C146EC1CF9000F007C117D /* Resources */, 97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */, 9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
215A1CA82008A326A8ECBF65 /* [CP] Embed Pods Frameworks */,
); );
buildRules = ( buildRules = (
); );
@@ -155,7 +154,7 @@
97C146E61CF9000F007C117D /* Project object */ = { 97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastUpgradeCheck = 1020; LastUpgradeCheck = 1300;
ORGANIZATIONNAME = ""; ORGANIZATIONNAME = "";
TargetAttributes = { TargetAttributes = {
97C146ED1CF9000F007C117D = { 97C146ED1CF9000F007C117D = {
@@ -197,23 +196,6 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
215A1CA82008A326A8ECBF65 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -302,6 +284,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
ARCHS = arm64;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++"; CLANG_CXX_LIBRARY = "libc++";
@@ -375,6 +358,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
ARCHS = arm64;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++"; CLANG_CXX_LIBRARY = "libc++";
@@ -430,6 +414,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
ARCHS = arm64;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++"; CLANG_CXX_LIBRARY = "libc++";

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1020" LastUpgradeVersion = "1300"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@@ -1,7 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
void main() { void main() {
runApp(MyApp()); runApp(MyApp());
@@ -15,7 +13,6 @@ class MyApp extends StatefulWidget {
class _MyAppState extends State<MyApp> { class _MyAppState extends State<MyApp> {
@override @override
void initState() { void initState() {
_initSDK();
super.initState(); super.initState();
} }
@@ -28,81 +25,10 @@ class _MyAppState extends State<MyApp> {
), ),
body: Column( body: Column(
children: [ children: [
TextButton(onPressed: _login, child: Text('login')), TextButton(onPressed: () {}, child: Text('login')),
], ],
), ),
), ),
); );
} }
void _login() {
if (OpenIM.iMManager.isInitialized)
OpenIM.iMManager.login(uid: '', token: '');
}
void _initSDK() async {
// Initialize SDK
OpenIM.iMManager
..initSDK(
platform: Platform.isAndroid ? IMPlatform.android : IMPlatform.ios,
ipApi: '',
ipWs: '',
dbPath: '',
listener: OnInitSDKListener(
onConnecting: () {},
onConnectFailed: (code, error) {},
onConnectSuccess: () {},
onKickedOffline: () {},
onUserSigExpired: () {},
onSelfInfoUpdated: (user) {},
),
)
// Add message listener (remove when not in use)
..messageManager.addAdvancedMsgListener(OnAdvancedMsgListener(
onRecvMessageRevoked: (msgId) {},
onRecvC2CReadReceipt: (list) {},
onRecvNewMessage: (msg) {},
))
// Set up message sending progress listener
..messageManager.setMsgSendProgressListener(OnMsgSendProgressListener(
onProgress: (msgId, progress) {},
))
// Set up friend relationship listener
..friendshipManager.setFriendshipListener(OnFriendshipListener(
onBlackListAdd: (u) {},
onBlackListDeleted: (u) {},
onFriendApplicationListAccept: (u) {},
onFriendApplicationListAdded: (u) {},
onFriendApplicationListDeleted: (u) {},
onFriendApplicationListReject: (u) {},
onFriendInfoChanged: (u) {},
onFriendListAdded: (u) {},
onFriendListDeleted: (u) {},
))
// Set up conversation listener
..conversationManager.setConversationListener(OnConversationListener(
onConversationChanged: (list) {},
onNewConversation: (list) {},
onTotalUnreadMessageCountChanged: (count) {},
onSyncServerFailed: () {},
onSyncServerFinish: () {},
onSyncServerStart: () {},
))
// Set up group listener
..groupManager.setGroupListener(OnGroupListener(
onApplicationProcessed: (groupId, opUser, agreeOrReject, opReason) {},
onGroupCreated: (groupId) {},
onGroupInfoChanged: (groupId, info) {},
onMemberEnter: (groupId, list) {},
onMemberInvited: (groupId, opUser, list) {},
onMemberKicked: (groupId, opUser, list) {},
onMemberLeave: (groupId, info) {},
onReceiveJoinApplication: (groupId, info, opReason) {},
));
}
} }

View File

@@ -42,7 +42,7 @@ packages:
name: collection name: collection
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.15.0" version: "1.16.0"
cupertino_icons: cupertino_icons:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -56,7 +56,7 @@ packages:
name: fake_async name: fake_async
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.2.0" version: "1.3.0"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@@ -68,7 +68,7 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "1.0.9" version: "2.1.0+1"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@@ -81,6 +81,13 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.12.11" version: "0.12.11"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.4"
meta: meta:
dependency: transitive dependency: transitive
description: description:
@@ -94,7 +101,7 @@ packages:
name: path name: path
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.8.0" version: "1.8.1"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@@ -106,7 +113,7 @@ packages:
name: source_span name: source_span
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.8.1" version: "1.8.2"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@@ -141,21 +148,14 @@ packages:
name: test_api name: test_api
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.4.3" version: "0.4.9"
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
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.1" version: "2.1.2"
sdks: sdks:
dart: ">=2.14.0 <3.0.0" dart: ">=2.17.0-0 <3.0.0"
flutter: ">=1.20.0" flutter: ">=1.20.0"

View File

@@ -1,14 +1,7 @@
//
// BaseCallback.swift
// flutter_openim_sdk
//
// Created by willem on 2021/10/9.
//
import Foundation import Foundation
import OpenIMCore import OpenIMCore
public class BaseCallback: NSObject, Open_im_sdkBaseProtocol { public class BaseCallback: NSObject, Open_im_sdk_callbackBaseProtocol {
private let result:FlutterResult private let result:FlutterResult
@@ -16,7 +9,7 @@ public class BaseCallback: NSObject, Open_im_sdkBaseProtocol {
self.result = result self.result = result
} }
public func onError(_ errCode: Int, errMsg: String?) { public func onError(_ errCode: Int32, errMsg: String?) {
print("BaseResult: " + errMsg!) print("BaseResult: " + errMsg!)
safeMainAsync { self.result(FlutterError(code: "\(errCode)", message: errMsg, details: nil)) } safeMainAsync { self.result(FlutterError(code: "\(errCode)", message: errMsg, details: nil)) }
} }

View File

@@ -1,10 +1,9 @@
import Foundation import Foundation
public class CommonUtil { public class CommonUtil {
public static func emitEvent(channel: FlutterMethodChannel, method: String, type: String, errCode: Int?, errMsg: String?, data: Any?){ public static func emitEvent(channel: FlutterMethodChannel, method: String, type: String, errCode: Int32?, errMsg: String?, data: Any?){
safeMainAsync { safeMainAsync {
var res: [String: Any] = [:] var res: [String: Any] = [:]
res["type"] = type res["type"] = type

View File

@@ -1,18 +1,17 @@
//
// JsonUtil.swift
// Runner
//
// Created by z1u24 on 2021/6/28.
//
import Foundation import Foundation
public class JsonUtil { public class JsonUtil {
public static func toString(object: AnyObject?)->String { public static func toString(object: AnyObject?)->String {
if object is NSNull {
return ""
}
if object == nil { if object == nil {
return "" return ""
} }
if object is String{ if object is String{
let s = object as! String let s = object as! String
let b = s.replacingOccurrences(of: "\"", with: "\\\"") let b = s.replacingOccurrences(of: "\"", with: "\\\"")

View File

@@ -1,10 +1,3 @@
//
// BaseServiceManager.swift
// flutter_openim_sdk
//
// Created by willem on 2021/10/9.
//
import Flutter import Flutter
import OpenIMCore import OpenIMCore
import UIKit import UIKit

View File

@@ -1,10 +1,3 @@
//
// ConversationManager.swift
// Runner
//
// Created by z1u24 on 2021/6/29.
//
import Foundation import Foundation
import OpenIMCore import OpenIMCore
@@ -12,7 +5,6 @@ public class ConversationManager: BaseServiceManager {
public override func registerHandlers() { public override func registerHandlers() {
super.registerHandlers() super.registerHandlers()
self["setConversationListener"] = setConversationListener self["setConversationListener"] = setConversationListener
self["getAllConversationList"] = getAllConversationList self["getAllConversationList"] = getAllConversationList
self["getConversationListSplit"] = getConversationListSplit self["getConversationListSplit"] = getConversationListSplit
@@ -21,12 +13,18 @@ public class ConversationManager: BaseServiceManager {
self["deleteConversation"] = deleteConversation self["deleteConversation"] = deleteConversation
self["setConversationDraft"] = setConversationDraft self["setConversationDraft"] = setConversationDraft
self["pinConversation"] = pinConversation self["pinConversation"] = pinConversation
self["markSingleMessageHasRead"] = markSingleMessageHasRead // self["markSingleMessageHasRead"] = markSingleMessageHasRead
self["markGroupMessageHasRead"] = markGroupMessageHasRead self["markGroupMessageHasRead"] = markGroupMessageHasRead
self["getTotalUnreadMsgCount"] = getTotalUnreadMsgCount self["getTotalUnreadMsgCount"] = getTotalUnreadMsgCount
self["getConversationIDBySessionType"] = getConversationIDBySessionType self["getConversationIDBySessionType"] = getConversationIDBySessionType
self["setConversationRecvMessageOpt"] = setConversationRecvMessageOpt self["setConversationRecvMessageOpt"] = setConversationRecvMessageOpt
self["getConversationRecvMessageOpt"] = getConversationRecvMessageOpt self["getConversationRecvMessageOpt"] = getConversationRecvMessageOpt
self["setOneConversationPrivateChat"] = setOneConversationPrivateChat
self["deleteConversationFromLocalAndSvr"] = deleteConversationFromLocalAndSvr
self["deleteAllConversationFromLocal"] = deleteAllConversationFromLocal
self["resetConversationGroupAtType"] = resetConversationGroupAtType
self["getAtAllTag"] = getAtAllTag
self["setGlobalRecvMessageOpt"] = setGlobalRecvMessageOpt
} }
func setConversationListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func setConversationListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -35,43 +33,43 @@ public class ConversationManager: BaseServiceManager {
} }
func getAllConversationList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getAllConversationList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetAllConversationList(BaseCallback(result: result)) Open_im_sdkGetAllConversationList(BaseCallback(result: result), methodCall[string: "operationID"])
} }
func getConversationListSplit(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getConversationListSplit(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetConversationListSplit(BaseCallback(result: result), methodCall[int: "offset"], methodCall[int: "count"]) Open_im_sdkGetConversationListSplit(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "offset"], methodCall[int: "count"])
} }
func getOneConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getOneConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetOneConversation(methodCall[string: "sourceID"], methodCall[int: "sessionType"], BaseCallback(result: result)) Open_im_sdkGetOneConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "sessionType"], methodCall[string: "sourceID"])
} }
func getMultipleConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getMultipleConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetMultipleConversation(methodCall[jsonString: "conversationIDList"], BaseCallback(result: result)) Open_im_sdkGetMultipleConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "conversationIDList"])
} }
func deleteConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func deleteConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkDeleteConversation(methodCall[string: "conversationID"], BaseCallback(result: result)) Open_im_sdkDeleteConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"])
} }
func setConversationDraft(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func setConversationDraft(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetConversationDraft(methodCall[string: "conversationID"], methodCall[string: "draftText"], BaseCallback(result: result)) Open_im_sdkSetConversationDraft(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[string: "draftText"])
} }
func pinConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func pinConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkPinConversation(methodCall[string: "conversationID"], methodCall[bool: "isPinned"], BaseCallback(result: result)) Open_im_sdkPinConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[bool: "isPinned"])
} }
func markSingleMessageHasRead(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ // func markSingleMessageHasRead(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkMarkSingleMessageHasRead(BaseCallback(result: result), methodCall[string: "userID"]) // Open_im_sdkMarkSingleMessageHasRead(BaseCallback(result: result), methodCall[string: "userID"])
} // }
func markGroupMessageHasRead(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func markGroupMessageHasRead(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkMarkGroupMessageHasRead(BaseCallback(result: result), methodCall[string: "groupID"]) Open_im_sdkMarkGroupMessageHasRead(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"])
} }
func getTotalUnreadMsgCount(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getTotalUnreadMsgCount(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetTotalUnreadMsgCount(BaseCallback(result: result)) Open_im_sdkGetTotalUnreadMsgCount(BaseCallback(result: result), methodCall[string: "operationID"])
} }
func getConversationIDBySessionType(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getConversationIDBySessionType(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -80,16 +78,40 @@ public class ConversationManager: BaseServiceManager {
} }
func setConversationRecvMessageOpt(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func setConversationRecvMessageOpt(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetConversationRecvMessageOpt(BaseCallback(result: result), methodCall[jsonString: "conversationIDList"], methodCall[int: "status"]) Open_im_sdkSetConversationRecvMessageOpt(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "conversationIDList"], methodCall[int: "status"])
} }
func getConversationRecvMessageOpt(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getConversationRecvMessageOpt(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetConversationRecvMessageOpt(BaseCallback(result: result), methodCall[jsonString: "conversationIDList"]) Open_im_sdkGetConversationRecvMessageOpt(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "conversationIDList"])
}
func setOneConversationPrivateChat(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetOneConversationPrivateChat(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"],methodCall[bool: "isPrivate"])
}
func deleteConversationFromLocalAndSvr(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkDeleteConversationFromLocalAndSvr(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"])
}
func deleteAllConversationFromLocal(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkDeleteAllConversationFromLocal(BaseCallback(result: result), methodCall[string: "operationID"])
}
func resetConversationGroupAtType(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkResetConversationGroupAtType(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"])
}
func getAtAllTag(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkGetAtAllTag())
}
func setGlobalRecvMessageOpt(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGlobalRecvMessageOpt(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "status"])
} }
} }
public class ConversationListener: NSObject, Open_im_sdkOnConversationListenerProtocol { public class ConversationListener: NSObject, Open_im_sdk_callbackOnConversationListenerProtocol {
private let channel:FlutterMethodChannel private let channel:FlutterMethodChannel

View File

@@ -1,10 +1,3 @@
//
// FriendshipManager.swift
// Runner
//
// Created by z1u24 on 2021/6/29.
//
import Foundation import Foundation
import OpenIMCore import OpenIMCore
@@ -15,16 +8,18 @@ public class FriendshipManager: BaseServiceManager {
self["setFriendListener"] = setFriendListener self["setFriendListener"] = setFriendListener
self["getFriendsInfo"] = getFriendsInfo self["getFriendsInfo"] = getFriendsInfo
self["addFriend"] = addFriend self["addFriend"] = addFriend
self["getFriendApplicationList"] = getFriendApplicationList self["getRecvFriendApplicationList"] = getRecvFriendApplicationList
self["getSendFriendApplicationList"] = getSendFriendApplicationList
self["getFriendList"] = getFriendList self["getFriendList"] = getFriendList
self["setFriendInfo"] = setFriendInfo self["setFriendRemark"] = setFriendRemark
self["addToBlackList"] = addToBlackList self["addBlacklist"] = addBlacklist
self["getBlackList"] = getBlackList self["getBlacklist"] = getBlacklist
self["deleteFromBlackList"] = deleteFromBlackList self["removeBlacklist"] = removeBlacklist
self["checkFriend"] = checkFriend self["checkFriend"] = checkFriend
self["deleteFromFriendList"] = deleteFromFriendList 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
@@ -36,53 +31,60 @@ public class FriendshipManager: BaseServiceManager {
} }
func getFriendsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getFriendsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetFriendsInfo(BaseCallback(result: result), methodCall[jsonString: "uidList"]) Open_im_sdkGetDesignatedFriendsInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "uidList"])
} }
func addFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func addFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkAddFriend(BaseCallback(result: result), methodCall.toJsonString()) Open_im_sdkAddFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
} }
func getFriendApplicationList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getRecvFriendApplicationList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetFriendApplicationList(BaseCallback(result: result)) Open_im_sdkGetRecvFriendApplicationList(BaseCallback(result: result), methodCall[string: "operationID"])
} }
func getSendFriendApplicationList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetSendFriendApplicationList(BaseCallback(result: result), methodCall[string: "operationID"])
}
func getFriendList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getFriendList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetFriendList(BaseCallback(result: result)) Open_im_sdkGetFriendList(BaseCallback(result: result), methodCall[string: "operationID"])
} }
func setFriendInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func setFriendRemark(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetFriendInfo(methodCall.toJsonString(), BaseCallback(result: result)) Open_im_sdkSetFriendRemark(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
} }
func addToBlackList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func addBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkAddToBlackList(BaseCallback(result: result), methodCall[jsonString: "uid"]) Open_im_sdkAddBlack(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "uid"])
} }
func getBlackList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetBlackList(BaseCallback(result: result)) Open_im_sdkGetBlackList(BaseCallback(result: result), methodCall[string: "operationID"])
} }
func deleteFromBlackList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func removeBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkDeleteFromBlackList(BaseCallback(result: result), methodCall[jsonString: "uid"]) Open_im_sdkRemoveBlack(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "uid"])
} }
func checkFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func checkFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkCheckFriend(BaseCallback(result: result), methodCall[jsonString: "uidList"]) Open_im_sdkCheckFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "uidList"])
} }
func deleteFromFriendList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func deleteFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkDeleteFromFriendList(methodCall[jsonString: "uid"], BaseCallback(result: result)) Open_im_sdkDeleteFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "uid"])
} }
func acceptFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func acceptFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkAcceptFriendApplication(BaseCallback(result: result), methodCall[jsonString: "uid"]) Open_im_sdkAcceptFriendApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
} }
func refuseFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func refuseFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkRefuseFriendApplication(BaseCallback(result: result), methodCall[jsonString: "uid"]) 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)
@@ -99,48 +101,47 @@ public class FriendshipManager: BaseServiceManager {
// } // }
} }
public class FriendshipListener: NSObject, Open_im_sdkOnFriendshipListenerProtocol { public class FriendshipListener: NSObject, Open_im_sdk_callbackOnFriendshipListenerProtocol {
private let channel:FlutterMethodChannel private let channel:FlutterMethodChannel
init(channel:FlutterMethodChannel) { init(channel:FlutterMethodChannel) {
self.channel = channel self.channel = channel
} }
public func onBlackListAdd(_ userInfo: String?) { public func onBlackAdded(_ blackInfo: String?) {
CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onBlackListAdd", errCode: nil, errMsg: nil, data: userInfo) CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onBlacklistAdded", errCode: nil, errMsg: nil, data: blackInfo)
} }
public func onBlackListDeleted(_ userInfo: String?) { public func onBlackDeleted(_ blackInfo: String?) {
CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onBlackListDeleted", errCode: nil, errMsg: nil, data: userInfo) CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onBlacklistDeleted", errCode: nil, errMsg: nil, data: blackInfo)
} }
public func onFriendApplicationListAccept(_ applyUserInfo: String?) { public func onFriendApplicationAccepted(_ friendApplication: String?) {
CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendApplicationListAccept", errCode: nil, errMsg: nil, data: applyUserInfo) CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendApplicationAccepted", errCode: nil, errMsg: nil, data: friendApplication)
} }
public func onFriendApplicationListAdded(_ applyUserInfo: String?) { public func onFriendApplicationAdded(_ friendApplication: String?) {
CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendApplicationListAdded", errCode: nil, errMsg: nil, data: applyUserInfo) CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendApplicationAdded", errCode: nil, errMsg: nil, data: friendApplication)
} }
public func onFriendApplicationListDeleted(_ applyUserInfo: String?) { public func onFriendApplicationDeleted(_ friendApplication: String?) {
CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendApplicationListDeleted", errCode: nil, errMsg: nil, data: applyUserInfo) CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendApplicationDeleted", errCode: nil, errMsg: nil, data: friendApplication)
} }
public func onFriendApplicationListReject(_ applyUserInfo: String?) { public func onFriendApplicationRejected(_ friendApplication: String?) {
CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendApplicationListReject", errCode: nil, errMsg: nil, data: applyUserInfo) CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendApplicationRejected", errCode: nil, errMsg: nil, data: friendApplication)
} }
public func onFriendInfoChanged(_ friendInfo: String?) { public func onFriendInfoChanged(_ friendInfo: String?) {
CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendInfoChanged", errCode: nil, errMsg: nil, data: friendInfo) CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendInfoChanged", errCode: nil, errMsg: nil, data: friendInfo)
} }
public func onFriendListAdded(_ friendInfo: String?) { public func onFriendAdded(_ friendInfo: String?) {
CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendListAdded", errCode: nil, errMsg: nil, data: friendInfo) CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendAdded", errCode: nil, errMsg: nil, data: friendInfo)
} }
public func onFriendListDeleted(_ friendInfo: String?) { public func onFriendDeleted(_ friendInfo: String?) {
CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendListDeleted", errCode: nil, errMsg: nil, data: friendInfo) CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendDeleted", errCode: nil, errMsg: nil, data: friendInfo)
} }
} }

View File

@@ -1,10 +1,3 @@
//
// GroupManager.swift
// flutter_openim_sdk
//
// Created by z1u24 on 2021/7/5.
//
import Foundation import Foundation
import OpenIMCore import OpenIMCore
@@ -24,13 +17,18 @@ public class GroupManager: BaseServiceManager {
self["joinGroup"] = joinGroup self["joinGroup"] = joinGroup
self["quitGroup"] = quitGroup self["quitGroup"] = quitGroup
self["transferGroupOwner"] = transferGroupOwner self["transferGroupOwner"] = transferGroupOwner
self["getGroupApplicationList"] = getGroupApplicationList self["getRecvGroupApplicationList"] = getRecvGroupApplicationList
self["getSendGroupApplicationList"] = getSendGroupApplicationList
self["acceptGroupApplication"] = acceptGroupApplication self["acceptGroupApplication"] = acceptGroupApplication
self["refuseGroupApplication"] = refuseGroupApplication self["refuseGroupApplication"] = refuseGroupApplication
// self["forceSyncApplyGroupRequest"] = forceSyncApplyGroupRequest self["dismissGroup"] = dismissGroup
// self["forceSyncGroupRequest"] = forceSyncGroupRequest self["changeGroupMute"] = changeGroupMute
// self["forceSyncJoinedGroup"] = forceSyncJoinedGroup self["changeGroupMemberMute"] = changeGroupMemberMute
// self["forceSyncJoinedGroupMember"] = forceSyncJoinedGroupMember self["setGroupMemberNickname"] = setGroupMemberNickname
self["searchGroups"] = searchGroups
self["setGroupMemberRoleLevel"] = setGroupMemberRoleLevel
self["getGroupMemberListByJoinTimeFilter"] = getGroupMemberListByJoinTimeFilter
self["setGroupVerification"] = setGroupVerification
} }
func setGroupListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func setGroupListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -39,86 +37,102 @@ public class GroupManager: BaseServiceManager {
} }
func inviteUserToGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func inviteUserToGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkInviteUserToGroup(methodCall[string: "gid"], methodCall[string: "reason"], Open_im_sdkInviteUserToGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[string: "reason"],
methodCall[jsonString: "uidList"], BaseCallback(result: result)) methodCall[jsonString: "uidList"])
} }
func kickGroupMember(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func kickGroupMember(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkKickGroupMember(methodCall[string: "gid"], methodCall[string: "reason"], Open_im_sdkKickGroupMember(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[string: "reason"],
methodCall[jsonString: "uidList"], BaseCallback(result: result)) methodCall[jsonString: "uidList"])
} }
func getGroupMembersInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getGroupMembersInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetGroupMembersInfo(methodCall[string: "gid"], methodCall[jsonString: "uidList"], BaseCallback(result: result)) Open_im_sdkGetGroupMembersInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[jsonString: "uidList"])
} }
func getGroupMemberList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getGroupMemberList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetGroupMemberList(methodCall[string: "gid"], methodCall[int32: "filter"], Open_im_sdkGetGroupMemberList(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[int32: "filter"],
methodCall[int32: "next"], BaseCallback(result: result)) methodCall[int32: "offset"], methodCall[int32: "count"])
} }
func getJoinedGroupList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getJoinedGroupList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetJoinedGroupList(BaseCallback(result: result)) Open_im_sdkGetJoinedGroupList(BaseCallback(result: result), methodCall[string: "operationID"])
} }
func createGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkCreateGroup(methodCall[jsonString: "gInfo"], methodCall[jsonString: "memberList"], BaseCallback(result: result)) Open_im_sdkCreateGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "gInfo"], methodCall[jsonString: "memberList"])
} }
func setGroupInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func setGroupInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupInfo(methodCall[jsonString: "gInfo"], BaseCallback(result: result)) Open_im_sdkSetGroupInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[jsonString: "gInfo"])
} }
func getGroupsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getGroupsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetGroupsInfo(methodCall[jsonString: "gidList"], BaseCallback(result: result)) Open_im_sdkGetGroupsInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "gidList"])
} }
func joinGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func joinGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkJoinGroup(methodCall[string: "gid"], methodCall[string: "reason"], BaseCallback(result: result)) Open_im_sdkJoinGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[string: "reason"])
} }
func quitGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func quitGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkQuitGroup(methodCall[string: "gid"], BaseCallback(result: result)) Open_im_sdkQuitGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"])
} }
func transferGroupOwner(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func transferGroupOwner(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkTransferGroupOwner(methodCall[string: "gid"], methodCall[string: "uid"], BaseCallback(result: result)) Open_im_sdkTransferGroupOwner(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[string: "uid"])
} }
func getGroupApplicationList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getRecvGroupApplicationList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetGroupApplicationList(BaseCallback(result: result)) Open_im_sdkGetRecvGroupApplicationList(BaseCallback(result: result), methodCall[string: "operationID"])
} }
func getSendGroupApplicationList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetSendGroupApplicationList(BaseCallback(result: result), methodCall[string: "operationID"])
}
func acceptGroupApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func acceptGroupApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkAcceptGroupApplication(methodCall[jsonString: "application"], methodCall[string: "reason"], BaseCallback(result: result)) Open_im_sdkAcceptGroupApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[string: "uid"], methodCall[string: "handleMsg"])
} }
func refuseGroupApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func refuseGroupApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkRefuseGroupApplication(methodCall[jsonString: "application"], methodCall[string: "reason"], BaseCallback(result: result)) Open_im_sdkRefuseGroupApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[string: "uid"], methodCall[string: "handleMsg"])
} }
// func forceSyncApplyGroupRequest(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { func dismissGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
// Open_im_sdkForceSyncApplyGroupRequest() Open_im_sdkDismissGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"])
// callBack(result) }
// }
// func changeGroupMute(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
// func forceSyncGroupRequest(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { Open_im_sdkChangeGroupMute(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[bool: "mute"])
// Open_im_sdkForceSyncGroupRequest() }
// callBack(result)
// } func changeGroupMemberMute(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
// Open_im_sdkChangeGroupMemberMute(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[string:"uid"],methodCall[int:"seconds"])
// func forceSyncJoinedGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { }
// Open_im_sdkForceSyncJoinedGroup()
// callBack(result) func setGroupMemberNickname(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
// } Open_im_sdkSetGroupMemberNickname(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[string:"uid"],methodCall[string:"groupNickname"])
// }
// func forceSyncJoinedGroupMember(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
// Open_im_sdkForceSyncJoinedGroupMember() func searchGroups(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
// callBack(result) 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"])
}
} }
public class GroupListener: NSObject, Open_im_sdkOnGroupListenerProtocol {
public class GroupListener: NSObject, Open_im_sdk_callbackOnGroupListenerProtocol {
private let channel:FlutterMethodChannel private let channel:FlutterMethodChannel
@@ -126,73 +140,43 @@ public class GroupListener: NSObject, Open_im_sdkOnGroupListenerProtocol {
self.channel = channel self.channel = channel
} }
public func onApplicationProcessed(_ groupId: String?, opUser: String?, agreeOrReject AgreeOrReject: Int32, opReason: String?) { public func onGroupApplicationAccepted(_ s: String?) {
var values: [String: Any] = [:] CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationAccepted", errCode: nil, errMsg: nil, data: s)
values["groupId"] = groupId
values["opUser"] = opUser
values["agreeOrReject"] = AgreeOrReject
values["opReason"] = opReason
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onApplicationProcessed", errCode: nil, errMsg: nil, data: values)
} }
// public func onApplicationProcessed(_ s: String?,s1: String?,i: Int?,s2: String?) { public func onGroupApplicationAdded(_ s: String?) {
// let values: NSMutableDictionary = NSMutableDictionary(capacity: 0) CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationAdded", errCode: nil, errMsg: nil, data: s)
// values.setValue(s, forKey: "groupId")
// values.setValue(s1, forKey: "opUser")
// values.setValue(i, forKey: "agreeOrReject")
// values.setValue(s2, forKey: "opReason")
// CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onApplicationProcessed", errCode: nil, errMsg: nil, data: values)
// }
public func onGroupCreated(_ s: String?) {
var values: [String: Any] = [:]
values["groupId"] = s
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupCreated", errCode: nil, errMsg: nil, data: values)
} }
public func onGroupInfoChanged(_ s: String?, groupInfo s1: String?) { public func onGroupApplicationDeleted(_ s: String?) {
var values: [String: Any] = [:] CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationDeleted", errCode: nil, errMsg: nil, data: s)
values["groupId"] = s
values["groupInfo"] = s1
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupInfoChanged", errCode: nil, errMsg: nil, data: values)
} }
public func onMemberEnter(_ s: String?, memberList s1: String?) { public func onGroupApplicationRejected(_ s: String?) {
var values: [String: Any] = [:] CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationRejected", errCode: nil, errMsg: nil, data: s)
values["groupId"] = s
values["memberList"] = s1
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onMemberEnter", errCode: nil, errMsg: nil, data: values)
} }
public func onMemberInvited(_ s: String?,opUser s1: String?, memberList s2: String?) { public func onGroupInfoChanged(_ s: String?) {
var values: [String: Any] = [:] CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupInfoChanged", errCode: nil, errMsg: nil, data: s)
values["groupId"] = s
values["opUser"] = s1
values["memberList"] = s2
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onMemberInvited", errCode: nil, errMsg: nil, data: values)
} }
public func onMemberKicked(_ s: String?,opUser s1: String?,memberList s2: String?) { public func onGroupMemberAdded(_ s: String?) {
var values: [String: Any] = [:] CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupMemberAdded", errCode: nil, errMsg: nil, data: s)
values["groupId"] = s
values["opUser"] = s1
values["memberList"] = s2
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onMemberKicked", errCode: nil, errMsg: nil, data: values)
} }
public func onMemberLeave(_ s: String?,member s1: String?) { public func onGroupMemberDeleted(_ s: String?) {
var values: [String: Any] = [:] CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupMemberDeleted", errCode: nil, errMsg: nil, data: s)
values["groupId"] = s
values["member"] = s1
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onMemberLeave", errCode: nil, errMsg: nil, data: values)
} }
public func onReceiveJoinApplication(_ s: String?,member s1: String?,opReason s2: String?) { public func onGroupMemberInfoChanged(_ s: String?) {
var values: [String: Any] = [:] CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupMemberInfoChanged", errCode: nil, errMsg: nil, data: s)
values["groupId"] = s
values["member"] = s1
values["opReason"] = s2
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onReceiveJoinApplication", errCode: nil, errMsg: nil, data: values)
} }
public func onJoinedGroupAdded(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onJoinedGroupAdded", errCode: nil, errMsg: nil, data: s)
}
public func onJoinedGroupDeleted(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onJoinedGroupDeleted", errCode: nil, errMsg: nil, data: s)
}
} }

View File

@@ -1,10 +1,3 @@
//
// IMManager.swift
// Runner
//
// Created by z1u24 on 2021/6/28.
//
import Foundation import Foundation
import OpenIMCore import OpenIMCore
@@ -12,90 +5,62 @@ public class IMMananger: BaseServiceManager {
public override func registerHandlers() { public override func registerHandlers() {
super.registerHandlers() super.registerHandlers()
self["initSDK"] = initSDK self["initSDK"] = initSDK
self["login"] = login self["login"] = login
self["logout"] = logout self["logout"] = logout
self["getLoginStatus"] = getLoginStatus self["getLoginStatus"] = getLoginStatus
// self["getLoginUid"] = getLoginUid self["wakeUp"] = wakeUp
self["getUsersInfo"] = getUsersInfo
self["setSelfInfo"] = setSelfInfo
self["forceSyncLoginUerInfo"] = forceSyncLoginUerInfo
// self["forceReConn"] = forceReConn
self["setSdkLog"] = setSdkLog
} }
func initSDK(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func initSDK(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkInitSDK(methodCall.toJsonString(), SDKListener(channel: self.channel)) callBack(result,Open_im_sdkInitSDK(ConnListener(channel: self.channel), methodCall[string: "operationID"], methodCall.toJsonString()))
callBack(result)
} }
func login(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { func login(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkLogin(methodCall[string: "uid"], methodCall[string: "token"], BaseCallback(result: result)) Open_im_sdkLogin(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "uid"], methodCall[string: "token"])
} }
func logout(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { func logout(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkLogout(BaseCallback(result: result)) Open_im_sdkLogout(BaseCallback(result: result), methodCall[string: "operationID"])
} }
func getLoginStatus(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { func getLoginStatus(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
callBack(result, Open_im_sdkGetLoginStatus()) callBack(result, Open_im_sdkGetLoginStatus())
} }
// func getLoginUid(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { func wakeUp(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
// callBack(result, Open_im_sdkGetLoginUser()) Open_im_sdkWakeUp(BaseCallback(result: result), methodCall[string: "operationID"])
// }
func getUsersInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetUsersInfo(methodCall[jsonString: "uidList"], BaseCallback(result: result))
} }
func setSelfInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { func uploadImage(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSetSelfInfo(methodCall.toJsonString(), BaseCallback(result: result)) Open_im_sdkUploadImage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "path"], methodCall[string: "token"], methodCall[string: "obj"])
} }
func forceSyncLoginUerInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkForceSyncLoginUerInfo()
callBack(result)
}
func setSdkLog(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSetSdkLog(methodCall[int32: "sdkLog"])
}
// func forceReConn(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
// Open_im_sdkForceReConn()
// callBack(result)
// }
} }
public class SDKListener: NSObject, Open_im_sdkIMSDKListenerProtocol { public class ConnListener: NSObject, Open_im_sdk_callbackOnConnListenerProtocol {
private let channel:FlutterMethodChannel private let channel:FlutterMethodChannel
init(channel:FlutterMethodChannel) { init(channel:FlutterMethodChannel) {
self.channel = channel self.channel = channel
} }
public func onConnectFailed(_ errCode: Int, errMsg: String?) { public func onConnectFailed(_ errCode: Int32, errMsg: String?) {
CommonUtil.emitEvent(channel: self.channel, method: "initSDKListener", type: "onConnectFailed", errCode: errCode, errMsg: errMsg, data: nil) CommonUtil.emitEvent(channel: self.channel, method: "connectListener", type: "onConnectFailed", errCode: errCode, errMsg: errMsg, data: nil)
} }
public func onConnectSuccess() { public func onConnectSuccess() {
CommonUtil.emitEvent(channel: self.channel, method: "initSDKListener", type: "onConnectSuccess", errCode: nil, errMsg: nil, data: nil) CommonUtil.emitEvent(channel: self.channel, method: "connectListener", type: "onConnectSuccess", errCode: nil, errMsg: nil, data: nil)
} }
public func onConnecting() { public func onConnecting() {
CommonUtil.emitEvent(channel: self.channel, method: "initSDKListener", type: "onConnecting", errCode: nil, errMsg: nil, data: nil) CommonUtil.emitEvent(channel: self.channel, method: "connectListener", type: "onConnecting", errCode: nil, errMsg: nil, data: nil)
} }
public func onKickedOffline() { public func onKickedOffline() {
CommonUtil.emitEvent(channel: self.channel, method: "initSDKListener", type: "onKickedOffline", errCode: nil, errMsg: nil, data: nil) CommonUtil.emitEvent(channel: self.channel, method: "connectListener", type: "onKickedOffline", errCode: nil, errMsg: nil, data: nil)
}
public func onSelfInfoUpdated(_ userInfo: String?) {
CommonUtil.emitEvent(channel: self.channel, method: "initSDKListener", type: "onSelfInfoUpdated", errCode: nil, errMsg: nil, data: userInfo)
} }
public func onUserTokenExpired() { public func onUserTokenExpired() {
CommonUtil.emitEvent(channel: self.channel, method: "initSDKListener", type: "onUserTokenExpired", errCode: nil, errMsg: nil, data: nil) CommonUtil.emitEvent(channel: self.channel, method: "connectListener", type: "onUserTokenExpired", errCode: nil, errMsg: nil, data: nil)
} }
} }

View File

@@ -1,30 +1,21 @@
//
// MessageManager.swift
// Runner
//
// Created by z1u24 on 2021/6/29.
//
import Foundation import Foundation
import OpenIMCore import OpenIMCore
public class MessageManager: BaseServiceManager { public class MessageManager: BaseServiceManager {
private let KEY_ID: String = "id" private let KEY_ID: String = "id"
private var listeners: [String: AdvancedMsgListener] = [:] // private var listeners: [String: AdvancedMsgListener] = [:]
public override func registerHandlers() { public override func registerHandlers() {
super.registerHandlers() super.registerHandlers()
self["setAdvancedMsgListener"] = setAdvancedMsgListener
self["addAdvancedMsgListener"] = addAdvancedMsgListener
self["removeAdvancedMsgListener"] = removeAdvancedMsgListener
self["sendMessage"] = sendMessage self["sendMessage"] = sendMessage
self["getHistoryMessageList"] = getHistoryMessageList self["getHistoryMessageList"] = getHistoryMessageList
self["revokeMessage"] = revokeMessage self["revokeMessage"] = revokeMessage
self["deleteMessageFromLocalStorage"] = deleteMessageFromLocalStorage self["deleteMessageFromLocalStorage"] = deleteMessageFromLocalStorage
self["deleteMessages"] = deleteMessages
self["insertSingleMessageToLocalStorage"] = insertSingleMessageToLocalStorage self["insertSingleMessageToLocalStorage"] = insertSingleMessageToLocalStorage
self["findMessages"] = findMessages self["insertGroupMessageToLocalStorage"] = insertGroupMessageToLocalStorage
self["markC2CMessageAsRead"] = markC2CMessageAsRead self["markC2CMessageAsRead"] = markC2CMessageAsRead
self["markGroupMessageAsRead"] = markGroupMessageAsRead
self["typingStatusUpdate"] = typingStatusUpdate self["typingStatusUpdate"] = typingStatusUpdate
self["createTextMessage"] = createTextMessage self["createTextMessage"] = createTextMessage
self["createTextAtMessage"] = createTextAtMessage self["createTextAtMessage"] = createTextAtMessage
@@ -35,237 +26,253 @@ public class MessageManager: BaseServiceManager {
self["createVideoMessage"] = createVideoMessage self["createVideoMessage"] = createVideoMessage
self["createVideoMessageFromFullPath"] = createVideoMessageFromFullPath self["createVideoMessageFromFullPath"] = createVideoMessageFromFullPath
self["createFileMessage"] = createFileMessage self["createFileMessage"] = createFileMessage
self["createFileMessageFromFullPath"] = createFileMessageFromFullPath
self["createMergerMessage"] = createMergerMessage self["createMergerMessage"] = createMergerMessage
self["createForwardMessage"] = createForwardMessage self["createForwardMessage"] = createForwardMessage
self["createLocationMessage"] = createLocationMessage self["createLocationMessage"] = createLocationMessage
self["createCustomMessage"] = createCustomMessage self["createCustomMessage"] = createCustomMessage
self["createQuoteMessage"] = createQuoteMessage self["createQuoteMessage"] = createQuoteMessage
self["createCardMessage"] = createCardMessage self["createCardMessage"] = createCardMessage
self["forceSyncMsg"] = forceSyncMsg self["createFaceMessage"] = createFaceMessage
self["clearC2CHistoryMessage"] = clearC2CHistoryMessage self["clearC2CHistoryMessage"] = clearC2CHistoryMessage
self["clearGroupHistoryMessage"] = clearGroupHistoryMessage self["clearGroupHistoryMessage"] = clearGroupHistoryMessage
self["searchLocalMessages"] = searchLocalMessages
self["deleteMessageFromLocalAndSvr"] = deleteMessageFromLocalAndSvr
self["deleteAllMsgFromLocal"] = deleteAllMsgFromLocal
self["deleteAllMsgFromLocalAndSvr"] = deleteAllMsgFromLocalAndSvr
self["markMessageAsReadByConID"] = markMessageAsReadByConID
self["clearC2CHistoryMessageFromLocalAndSvr"] = clearC2CHistoryMessageFromLocalAndSvr
self["clearGroupHistoryMessageFromLocalAndSvr"] = clearGroupHistoryMessageFromLocalAndSvr
self["getHistoryMessageListReverse"] = getHistoryMessageListReverse
} }
func addAdvancedMsgListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func setAdvancedMsgListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let key = methodCall[string: KEY_ID] let key = methodCall[string: KEY_ID]
if listeners[key] == nil { let lis = AdvancedMsgListener(channel: channel, id: key)
let lis = AdvancedMsgListener(channel: channel, id: key) Open_im_sdkSetAdvancedMsgListener(lis)
listeners[key] = lis
Open_im_sdkAddAdvancedMsgListener(lis)
print("=================add msg listener======\n\(lis)")
}
callBack(result)
}
func removeAdvancedMsgListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let key = methodCall[string: KEY_ID]
if let lis = listeners[key] {
listeners[key] = nil
// Open_im_sdkRemoveAdvancedMsgListener(lis)
}
callBack(result) callBack(result)
} }
func sendMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func sendMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let sendMsgProgressListener: SendMsgProgressListener = SendMsgProgressListener(channel: channel,result: result,methodCall: methodCall) let sendMsgProgressListener: SendMsgProgressListener = SendMsgProgressListener(channel: channel,result: result,methodCall: methodCall)
// sendMsgProgressListener.setCall(methodCall: methodCall) Open_im_sdkSendMessage(sendMsgProgressListener, methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[string: "userID"],
// sendMsgProgressListener.setResult(result: result) methodCall[string: "groupID"], methodCall[jsonString: "offlinePushInfo"])
print("===============sendMessage===============")
Open_im_sdkSendMessage(sendMsgProgressListener, methodCall[jsonString: "message"], methodCall[string: "userID"],
methodCall[string: "groupID"], methodCall[bool: "onlineUserOnly"])
} }
func getHistoryMessageList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getHistoryMessageList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetHistoryMessageList(BaseCallback(result: result), methodCall.toJsonString()) Open_im_sdkGetHistoryMessageList(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
} }
func revokeMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func revokeMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkRevokeMessage(BaseCallback(result: result), methodCall.toJsonString()) Open_im_sdkRevokeMessage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
} }
func deleteMessageFromLocalStorage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func deleteMessageFromLocalStorage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkDeleteMessageFromLocalStorage(BaseCallback(result: result), methodCall.toJsonString()) Open_im_sdkDeleteMessageFromLocalStorage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
} }
// deprecated
func deleteMessages(methodCall: FlutterMethodCall, result: FlutterResult){
}
func insertSingleMessageToLocalStorage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func insertSingleMessageToLocalStorage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkInsertSingleMessageToLocalStorage(BaseCallback(result: result), methodCall[jsonString: "message"], Open_im_sdkInsertSingleMessageToLocalStorage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "message"],
methodCall[string: "receiverID"], methodCall[string: "senderID"]) methodCall[string: "receiverID"], methodCall[string: "senderID"])
} }
func findMessages(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func insertGroupMessageToLocalStorage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkFindMessages(BaseCallback(result: result), methodCall[jsonString: "messageIDList"]) Open_im_sdkInsertGroupMessageToLocalStorage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "message"],
methodCall[string: "groupID"], methodCall[string: "senderID"])
}
func markC2CMessageAsRead(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkMarkC2CMessageAsRead(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"], methodCall[jsonString: "messageIDList"])
} }
func markC2CMessageAsRead(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func markGroupMessageAsRead(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkMarkC2CMessageAsRead(BaseCallback(result: result), methodCall[string: "userID"], methodCall[jsonString: "messageIDList"]) Open_im_sdkMarkGroupMessageAsRead(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[jsonString: "messageIDList"])
} }
func typingStatusUpdate(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func typingStatusUpdate(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkTypingStatusUpdate(methodCall[string: "userID"], methodCall[string: "typing"]) Open_im_sdkTypingStatusUpdate(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"], methodCall[string: "msgTip"])
callBack(result)
} }
func createTextMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createTextMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateTextMessage(methodCall[string: "text"])) callBack(result, Open_im_sdkCreateTextMessage(methodCall[string: "operationID"], methodCall[string: "text"]))
} }
func createTextAtMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createTextAtMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateTextAtMessage(methodCall[string: "text"], methodCall[jsonString: "atUserList"])) callBack(result, Open_im_sdkCreateTextAtMessage(methodCall[string: "operationID"], methodCall[string: "text"],
methodCall[jsonString: "atUserIDList"], methodCall[jsonString: "atUserInfoList"], methodCall[jsonString: "quoteMessage"]))
} }
func createImageMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createImageMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateImageMessage(methodCall[string: "imagePath"])) callBack(result, Open_im_sdkCreateImageMessage(methodCall[string: "operationID"], methodCall[string: "imagePath"]))
} }
func createImageMessageFromFullPath(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createImageMessageFromFullPath(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateImageMessageFromFullPath(methodCall[string: "imagePath"])) callBack(result, Open_im_sdkCreateImageMessageFromFullPath(methodCall[string: "operationID"], methodCall[string: "imagePath"]))
} }
func createSoundMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createSoundMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateSoundMessage(methodCall[string: "soundPath"], methodCall[int64: "duration"])) callBack(result, Open_im_sdkCreateSoundMessage(methodCall[string: "operationID"], methodCall[string: "soundPath"], methodCall[int64: "duration"]))
} }
func createSoundMessageFromFullPath(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createSoundMessageFromFullPath(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateSoundMessageFromFullPath(methodCall[string: "soundPath"], methodCall[int64: "duration"])) callBack(result, Open_im_sdkCreateSoundMessageFromFullPath(methodCall[string: "operationID"], methodCall[string: "soundPath"], methodCall[int64: "duration"]))
} }
func createVideoMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createVideoMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let prama = Open_im_sdkCreateVideoMessage(methodCall[string: "videoPath"], methodCall[string: "videoType"], let prama = Open_im_sdkCreateVideoMessage(methodCall[string: "operationID"], methodCall[string: "videoPath"], methodCall[string: "videoType"],
methodCall[int64: "duration"], methodCall[string: "snapshotPath"]) methodCall[int64: "duration"], methodCall[string: "snapshotPath"])
callBack(result, prama) callBack(result, prama)
} }
func createVideoMessageFromFullPath(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createVideoMessageFromFullPath(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let prama = Open_im_sdkCreateVideoMessageFromFullPath(methodCall[string: "videoPath"], methodCall[string: "videoType"], let prama = Open_im_sdkCreateVideoMessageFromFullPath(methodCall[string: "operationID"], methodCall[string: "videoPath"], methodCall[string: "videoType"],
methodCall[int64: "duration"], methodCall[string: "snapshotPath"]) methodCall[int64: "duration"], methodCall[string: "snapshotPath"])
callBack(result, prama) callBack(result, prama)
} }
func createFileMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createFileMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateFileMessage(methodCall[string: "filePath"], methodCall[string: "fileName"])) callBack(result, Open_im_sdkCreateFileMessage(methodCall[string: "operationID"], methodCall[string: "filePath"], methodCall[string: "fileName"]))
} }
func createFileMessageFromFullPath(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createFileMessageFromFullPath(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateFileMessageFromFullPath(methodCall[string: "filePath"], methodCall[string: "fileName"])) callBack(result, Open_im_sdkCreateFileMessageFromFullPath(methodCall[string: "operationID"], methodCall[string: "filePath"], methodCall[string: "fileName"]))
} }
func createMergerMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createMergerMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let prama = Open_im_sdkCreateMergerMessage(methodCall[jsonString: "messageList"], methodCall[string: "title"], let prama = Open_im_sdkCreateMergerMessage(methodCall[string: "operationID"], methodCall[jsonString: "messageList"], methodCall[string: "title"],
methodCall[jsonString: "summaryList"]) methodCall[jsonString: "summaryList"])
callBack(result, prama) callBack(result, prama)
} }
func createForwardMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createForwardMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateForwardMessage(methodCall[jsonString: "message"])) callBack(result, Open_im_sdkCreateForwardMessage(methodCall[string: "operationID"], methodCall[jsonString: "message"]))
} }
func createLocationMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createLocationMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let prama = Open_im_sdkCreateLocationMessage(methodCall[string: "description"], let prama = Open_im_sdkCreateLocationMessage(methodCall[string: "operationID"], methodCall[string: "description"],
methodCall[double: "longitude"], methodCall[double: "latitude"]) methodCall[double: "longitude"], methodCall[double: "latitude"])
callBack(result, prama) callBack(result, prama)
} }
func createCustomMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createCustomMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let prama = Open_im_sdkCreateCustomMessage(methodCall[string: "data"], let prama = Open_im_sdkCreateCustomMessage(methodCall[string: "operationID"], methodCall[string: "data"],
methodCall[string: "extension"], methodCall[string: "description"]) methodCall[string: "extension"], methodCall[string: "description"])
callBack(result, prama) callBack(result, prama)
} }
func createQuoteMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createQuoteMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let prama = Open_im_sdkCreateQuoteMessage(methodCall[string: "quoteText"], methodCall[jsonString: "quoteMessage"]) let prama = Open_im_sdkCreateQuoteMessage(methodCall[string: "operationID"], methodCall[string: "quoteText"], methodCall[jsonString: "quoteMessage"])
callBack(result, prama) callBack(result, prama)
} }
func createCardMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createCardMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
callBack(result, Open_im_sdkCreateCardMessage(methodCall[jsonString: "cardMessage"])) callBack(result, Open_im_sdkCreateCardMessage(methodCall[string: "operationID"], methodCall[jsonString: "cardMessage"]))
} }
func forceSyncMsg(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createFaceMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkForceSyncMsg() callBack(result, Open_im_sdkCreateFaceMessage(methodCall[string: "operationID"], methodCall[int: "index"], methodCall[string: "data"]))
callBack(result)
} }
func clearC2CHistoryMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func clearC2CHistoryMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkClearC2CHistoryMessage(BaseCallback(result: result), methodCall[string: "userID"]) Open_im_sdkClearC2CHistoryMessage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"])
} }
func clearGroupHistoryMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func clearGroupHistoryMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkClearGroupHistoryMessage(BaseCallback(result: result), methodCall[string: "groupID"]) Open_im_sdkClearGroupHistoryMessage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"])
}
func searchLocalMessages(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSearchLocalMessages(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "filter"])
}
func deleteMessageFromLocalAndSvr(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkDeleteMessageFromLocalAndSvr(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
} }
public class SendMsgProgressListener: NSObject, Open_im_sdkSendMsgCallBackProtocol { func deleteAllMsgFromLocal(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkDeleteAllMsgFromLocal(BaseCallback(result: result), methodCall[string: "operationID"])
}
func deleteAllMsgFromLocalAndSvr(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkDeleteAllMsgFromLocalAndSvr(BaseCallback(result: result), methodCall[string: "operationID"])
}
func markMessageAsReadByConID(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkMarkMessageAsReadByConID(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[jsonString: "messageIDList"])
}
func clearC2CHistoryMessageFromLocalAndSvr(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkClearC2CHistoryMessageFromLocalAndSvr(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"])
}
func clearGroupHistoryMessageFromLocalAndSvr(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkClearGroupHistoryMessageFromLocalAndSvr(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"])
}
func getHistoryMessageListReverse(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetHistoryMessageListReverse(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
}
public class SendMsgProgressListener: NSObject, Open_im_sdk_callbackSendMsgCallBackProtocol {
private let channel: FlutterMethodChannel private let channel: FlutterMethodChannel
private let result: FlutterResult private let result: FlutterResult
private let call: FlutterMethodCall private let call: FlutterMethodCall
init(channel: FlutterMethodChannel, result: @escaping FlutterResult, methodCall: FlutterMethodCall) { init(channel: FlutterMethodChannel, result: @escaping FlutterResult, methodCall: FlutterMethodCall) {
self.channel = channel self.channel = channel
self.result = result self.result = result
self.call = methodCall self.call = methodCall
} }
// func setResult(result: @escaping FlutterResult){ public func onError(_ errCode: Int32, errMsg: String?) {
// self.result = result
// }
//
// func setCall(methodCall: FlutterMethodCall){
// self.call = methodCall
// }
public func onError(_ errCode: Int, errMsg: String?) {
print("=================onError============\nerrcode:\(errCode),errMsg:\(errMsg!)")
DispatchQueue.main.async { self.result(FlutterError(code: "\(errCode)", message: errMsg, details: nil)) } DispatchQueue.main.async { self.result(FlutterError(code: "\(errCode)", message: errMsg, details: nil)) }
} }
public func onProgress(_ progress: Int) { public func onProgress(_ progress: Int) {
// guard let call = call else {
// return
// }
var values: [String: Any] = [:] var values: [String: Any] = [:]
print("=================onProgress============\nprogress:\(progress)")
let message = call[dict: "message"] let message = call[dict: "message"]
values["clientMsgID"] = message["clientMsgID"] values["clientMsgID"] = message["clientMsgID"]
values["progress"] = progress values["progress"] = progress
CommonUtil.emitEvent(channel: channel, method: "msgSendProgressListener", type: "onProgress", errCode: nil, errMsg: nil, data: values) CommonUtil.emitEvent(channel: channel, method: "msgSendProgressListener", type: "onProgress", errCode: nil, errMsg: nil, data: values)
} }
public func onSuccess(_ data: String?) { public func onSuccess(_ data: String?) {
print("=================onSuccess============\nsuccess:\(data!)")
DispatchQueue.main.async { self.result(data) } DispatchQueue.main.async { self.result(data) }
} }
} }
public class AdvancedMsgListener: NSObject, Open_im_sdkOnAdvancedMsgListenerProtocol { public class AdvancedMsgListener: NSObject, Open_im_sdk_callbackOnAdvancedMsgListenerProtocol {
private let channel: FlutterMethodChannel private let channel: FlutterMethodChannel
private let id: String private let id: String
// private var values: [String: Any] = [:]
init(channel: FlutterMethodChannel, id: String) { init(channel: FlutterMethodChannel, id: String) {
self.channel = channel self.channel = channel
self.id = id self.id = id
// values["id"] = id
} }
public func onRecvC2CReadReceipt(_ msgReceiptList: String?) { public func onRecvC2CReadReceipt(_ msgReceiptList: String?) {
var values: [String: Any] = [:] var values: [String: Any] = [:]
values["id"] = id values["id"] = id
values["haveReadMessage"] = msgReceiptList values["c2cMessageReadReceipt"] = msgReceiptList
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvC2CReadReceipt", errCode: nil, errMsg: nil, data: values) CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvC2CReadReceipt", errCode: nil, errMsg: nil, data: values)
} }
public func 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?) { public func onRecvMessageRevoked(_ msgId: String?) {
var values: [String: Any] = [:] var values: [String: Any] = [:]
values["id"] = id values["id"] = id
values["revokedMessage"] = msgId values["revokedMessage"] = msgId
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageRevoked", errCode: nil, errMsg: nil, data: values) CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageRevoked", errCode: nil, errMsg: nil, data: values)
} }
public func onRecvNewMessage(_ message: String?) { public func onRecvNewMessage(_ message: String?) {
var values: [String: Any] = [:] var values: [String: Any] = [:]
values["id"] = id values["id"] = id

View File

@@ -0,0 +1,59 @@
import Foundation
import OpenIMCore
public class OrganizationManager: BaseServiceManager {
public override func registerHandlers() {
super.registerHandlers()
self["setOrganizationListener"] = setOrganizationListener
self["getSubDepartment"] = getSubDepartment
self["getDepartmentMember"] = getDepartmentMember
self["getUserInDepartment"] = getUserInDepartment
self["getDepartmentMemberAndSubDepartment"] = getDepartmentMemberAndSubDepartment
self["getDepartmentInfo"] = getDepartmentInfo
self["searchOrganization"] = searchOrganization
}
func setOrganizationListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetOrganizationListener(OrganizationListener(channel: channel))
callBack(result)
}
func getSubDepartment(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetSubDepartment(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "departmentID"], methodCall[int: "offset"], methodCall[int: "count"])
}
func getDepartmentMember(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetDepartmentMember(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "departmentID"], methodCall[int: "offset"], methodCall[int: "count"])
}
func getUserInDepartment(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetUserInDepartment(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"])
}
func getDepartmentMemberAndSubDepartment(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
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: "searchParams"], methodCall[int: "offset"], methodCall[int: "count"])
}
}
public class OrganizationListener: NSObject, Open_im_sdk_callbackOnOrganizationListenerProtocol {
private let channel:FlutterMethodChannel
init(channel:FlutterMethodChannel) {
self.channel = channel
}
public func onOrganizationUpdated() {
CommonUtil.emitEvent(channel: self.channel, method: "organizationListener", type: "onOrganizationUpdated", errCode: nil, errMsg: nil, data: nil)
}
}

View File

@@ -0,0 +1,86 @@
import Foundation
import OpenIMCore
public class SignalingManager: BaseServiceManager {
public override func registerHandlers() {
super.registerHandlers()
self["setSignalingListener"] = setSignalingListener
self["signalingInvite"] = signalingInvite
self["signalingInviteInGroup"] = signalingInviteInGroup
self["signalingAccept"] = signalingAccept
self["signalingReject"] = signalingReject
self["signalingCancel"] = signalingCancel
self["signalingHungUp"] = signalingHungUp
}
func setSignalingListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetSignalingListener(SignalingListener(channel: channel))
callBack(result)
}
func signalingInvite(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingInvite(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "signalingInfo"])
}
func signalingInviteInGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingInviteInGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "signalingInfo"])
}
func signalingAccept(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingAccept(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "signalingInfo"])
}
func signalingReject(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingReject(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "signalingInfo"])
}
func signalingCancel(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingCancel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "signalingInfo"])
}
func signalingHungUp(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSignalingHungUp(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "signalingInfo"])
}
}
public class SignalingListener: NSObject, Open_im_sdk_callbackOnSignalingListenerProtocol {
private let channel:FlutterMethodChannel
init(channel:FlutterMethodChannel) {
self.channel = channel
}
public func onInvitationCancelled(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onInvitationCancelled", errCode: nil, errMsg: nil, data: s)
}
public func onInvitationTimeout(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onInvitationTimeout", errCode: nil, errMsg: nil, data: s)
}
public func onInviteeAccepted(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onInviteeAccepted", errCode: nil, errMsg: nil, data: s)
}
public func onInviteeAccepted(byOtherDevice s: String?) {
CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onInviteeAcceptedByOtherDevice", errCode: nil, errMsg: nil, data: s)
}
public func onInviteeRejected(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onInviteeRejected", errCode: nil, errMsg: nil, data: s)
}
public func onInviteeRejected(byOtherDevice s: String?) {
CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onInviteeRejectedByOtherDevice", errCode: nil, errMsg: nil, data: s)
}
public func onReceiveNewInvitation(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onReceiveNewInvitation", errCode: nil, errMsg: nil, data: s)
}
public func onHangUp(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "signalingListener", type: "onHangUp", errCode: nil, errMsg: nil, data: s)
}
}

View File

@@ -0,0 +1,43 @@
import Foundation
import OpenIMCore
public class UserManager: BaseServiceManager {
public override func registerHandlers() {
super.registerHandlers()
self["setUserListener"] = setUserListener
self["getUsersInfo"] = getUsersInfo
self["setSelfInfo"] = setSelfInfo
self["getSelfUserInfo"] = getSelfUserInfo
}
func setUserListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetUserListener(UserListener(channel: channel))
callBack(result)
}
func getUsersInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetUsersInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "uidList"])
}
func setSelfInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSetSelfInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
}
func getSelfUserInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetSelfUserInfo(BaseCallback(result: result), methodCall[string: "operationID"])
}
}
public class UserListener: NSObject, Open_im_sdk_callbackOnUserListenerProtocol {
private let channel:FlutterMethodChannel
init(channel:FlutterMethodChannel) {
self.channel = channel
}
public func onSelfInfoUpdated(_ userInfo: String?) {
CommonUtil.emitEvent(channel: self.channel, method: "userListener", type: "onSelfInfoUpdated", errCode: nil, errMsg: nil, data: userInfo)
}
}

View File

@@ -0,0 +1,44 @@
import Foundation
import OpenIMCore
public class WorkMomentsManager: BaseServiceManager {
public override func registerHandlers() {
super.registerHandlers()
self["setWorkMomentsListener"] = setWorkMomentsListener
self["getWorkMomentsUnReadCount"] = getWorkMomentsUnReadCount
self["getWorkMomentsNotification"] = getWorkMomentsNotification
self["clearWorkMomentsNotification"] = clearWorkMomentsNotification
}
func setWorkMomentsListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetWorkMomentsListener(WorkMomentsListener(channel: channel))
callBack(result)
}
func getWorkMomentsUnReadCount(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetWorkMomentsUnReadCount(BaseCallback(result: result), methodCall[string: "operationID"])
}
func getWorkMomentsNotification(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetWorkMomentsNotification(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "offset"], methodCall[int: "count"])
}
func clearWorkMomentsNotification(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkClearWorkMomentsNotification(BaseCallback(result: result), methodCall[string: "operationID"])
}
}
public class WorkMomentsListener: NSObject, Open_im_sdk_callbackOnWorkMomentsListenerProtocol {
private let channel:FlutterMethodChannel
init(channel:FlutterMethodChannel) {
self.channel = channel
}
public func onRecvNewNotification() {
CommonUtil.emitEvent(channel: self.channel, method: "workMomentsListener", type: "OnRecvNewNotification", errCode: nil, errMsg: nil, data: nil)
}
}

View File

@@ -2,12 +2,15 @@ import Flutter
import UIKit import UIKit
public class SwiftFlutterOpenimSdkPlugin: NSObject, FlutterPlugin { public class SwiftFlutterOpenimSdkPlugin: NSObject, FlutterPlugin {
let imManager: IMMananger let imManager: IMMananger
let conversationManager: ConversationManager let conversationManager: ConversationManager
let friendshipManager: FriendshipManager let friendshipManager: FriendshipManager
let messageManager: MessageManager let messageManager: MessageManager
let groupManager: GroupManager let groupManager: GroupManager
let userManger: UserManager
let signalingManager: SignalingManager
let workMomentsManager: WorkMomentsManager
let organizationManager: OrganizationManager
init(channel: FlutterMethodChannel) { init(channel: FlutterMethodChannel) {
self.imManager = IMMananger(channel: channel) self.imManager = IMMananger(channel: channel)
@@ -15,6 +18,10 @@ public class SwiftFlutterOpenimSdkPlugin: NSObject, FlutterPlugin {
self.friendshipManager = FriendshipManager(channel: channel) self.friendshipManager = FriendshipManager(channel: channel)
self.messageManager = MessageManager(channel: channel) self.messageManager = MessageManager(channel: channel)
self.groupManager = GroupManager(channel: channel) self.groupManager = GroupManager(channel: channel)
self.userManger = UserManager(channel: channel)
self.signalingManager = SignalingManager(channel: channel)
self.workMomentsManager = WorkMomentsManager(channel: channel)
self.organizationManager = OrganizationManager(channel: channel)
} }
public static func register(with registrar: FlutterPluginRegistrar) { public static func register(with registrar: FlutterPluginRegistrar) {
@@ -36,6 +43,14 @@ public class SwiftFlutterOpenimSdkPlugin: NSObject, FlutterPlugin {
friendshipManager.handleMethod(call: call, result: result) friendshipManager.handleMethod(call: call, result: result)
case "groupManager": case "groupManager":
groupManager.handleMethod(call: call, result: result) groupManager.handleMethod(call: call, result: result)
case "userManager":
userManger.handleMethod(call: call, result: result)
case "signalingManager":
signalingManager.handleMethod(call: call, result: result)
case "workMomentsManager":
workMomentsManager.handleMethod(call: call, result: result)
case "organizationManager":
organizationManager.handleMethod(call: call, result: result)
default: default:
print("Handle ManagerName Error: \(managerName) not found") print("Handle ManagerName Error: \(managerName) not found")
} }

View File

@@ -1,13 +0,0 @@
// Objective-C API for talking to the following Go packages
//
// open_im_sdk/open_im_sdk
//
// File is generated by gomobile bind. Do not edit.
#ifndef __OpenIMCore_FRAMEWORK_H__
#define __OpenIMCore_FRAMEWORK_H__
#include "Open_im_sdk.objc.h"
#include "Universe.objc.h"
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,29 +0,0 @@
// Objective-C API for talking to Go package.
// gobind -lang=objc
//
// File is generated by gobind. Do not edit.
#ifndef __Universe_H__
#define __Universe_H__
@import Foundation;
#include "ref.h"
@protocol Universeerror;
@class Universeerror;
@protocol Universeerror <NSObject>
- (NSString* _Nonnull)error;
@end
@class Universeerror;
@interface Universeerror : NSError <goSeqRefInterface, Universeerror> {
}
@property(strong, readonly) _Nonnull id _ref;
- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
- (NSString* _Nonnull)error;
@end
#endif

View File

@@ -1,35 +0,0 @@
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#ifndef __GO_REF_HDR__
#define __GO_REF_HDR__
#include <Foundation/Foundation.h>
// GoSeqRef is an object tagged with an integer for passing back and
// forth across the language boundary. A GoSeqRef may represent either
// an instance of a Go object, or an Objective-C object passed to Go.
// The explicit allocation of a GoSeqRef is used to pin a Go object
// when it is passed to Objective-C. The Go seq package maintains a
// reference to the Go object in a map keyed by the refnum along with
// a reference count. When the reference count reaches zero, the Go
// seq package will clear the corresponding entry in the map.
@interface GoSeqRef : NSObject {
}
@property(readonly) int32_t refnum;
@property(strong) id obj; // NULL when representing a Go object.
// new GoSeqRef object to proxy a Go object. The refnum must be
// provided from Go side.
- (instancetype)initWithRefnum:(int32_t)refnum obj:(id)obj;
- (int32_t)incNum;
@end
@protocol goSeqRefInterface
-(GoSeqRef*) _ref;
@end
#endif

View File

@@ -1,8 +0,0 @@
framework module "OpenIMCore" {
header "ref.h"
header "Open_im_sdk.objc.h"
header "Universe.objc.h"
header "OpenIMCore.h"
export *
}

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
</dict>
</plist>

View File

@@ -17,7 +17,9 @@ A new Flutter project.
s.dependency 'Flutter' s.dependency 'Flutter'
s.platform = :ios, '8.0' s.platform = :ios, '8.0'
s.vendored_frameworks = 'Framework/*.framework' s.dependency 'OpenIMSDKCore','2.1.0'
s.static_framework = true
# s.vendored_frameworks = 'Framework/*.framework'
# Flutter.framework does not contain a i386 slice. # Flutter.framework does not contain a i386 slice.
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386 arm64' } s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386 arm64' }
s.swift_version = '5.0' s.swift_version = '5.0'

View File

@@ -1,32 +1,41 @@
library flutter_openim_sdk; library flutter_openim_sdk;
export 'src/enum/conversation_type.dart'; export 'src/enum/conversation_type.dart';
export 'src/enum/group_role.dart'; export 'src/enum/group_at_type.dart';
export 'src/enum/group_role_level.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/listener/advanced_msg_listener.dart'; export 'src/listener/advanced_msg_listener.dart';
export 'src/listener/connect_listener.dart';
export 'src/listener/conversation_listener.dart'; export 'src/listener/conversation_listener.dart';
export 'src/listener/friendship_listener.dart'; export 'src/listener/friendship_listener.dart';
export 'src/listener/group_listener.dart'; export 'src/listener/group_listener.dart';
export 'src/listener/impl/advanced_msg_listener.dart';
export 'src/listener/impl/conversation_listener.dart';
export 'src/listener/impl/friendship_listener.dart';
export 'src/listener/impl/group_listener.dart';
export 'src/listener/impl/init_sdk_listener.dart';
export 'src/listener/impl/msg_send_progress_listener.dart';
export 'src/listener/init_sdk_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/signaling_listener.dart';
export 'src/listener/user_listener.dart';
export 'src/listener/workmoments_listener.dart';
export 'src/manager/im_conversation_manager.dart'; export 'src/manager/im_conversation_manager.dart';
export 'src/manager/im_friendship_manager.dart'; export 'src/manager/im_friendship_manager.dart';
export 'src/manager/im_group_manager.dart'; export 'src/manager/im_group_manager.dart';
export 'src/manager/im_manager.dart'; export 'src/manager/im_manager.dart';
export 'src/manager/im_message_manager.dart'; export 'src/manager/im_message_manager.dart';
export 'src/manager/im_offline_push_manager.dart'; export 'src/manager/im_offline_push_manager.dart';
export 'src/manager/im_organization_manager.dart';
export 'src/manager/im_signaling_manager.dart'; export 'src/manager/im_signaling_manager.dart';
export 'src/manager/im_user_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/message.dart'; export 'src/models/message.dart';
export 'src/models/notification_info.dart';
export 'src/models/organization_info.dart';
export 'src/models/search_info.dart';
export 'src/models/signaling_info.dart';
export 'src/models/user_info.dart'; export 'src/models/user_info.dart';
export 'src/models/workmoments_info.dart';
export 'src/openim.dart'; export 'src/openim.dart';
export 'src/utils.dart';

View File

@@ -1,4 +1,11 @@
/// 会话类型
class ConversationType { class ConversationType {
static const single_chat = 1; /// 单聊
static const group_chat = 2; static const single = 1;
/// 群聊
static const group = 2;
/// 通知
static const notification = 4;
} }

View File

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

View File

@@ -1,5 +0,0 @@
class GroupRole {
static const member = 0;
static const owner = 1;
static const admin = 2;
}

View File

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

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,5 +1,9 @@
/// 当前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;

View File

@@ -1,10 +1,14 @@
/// callback类型
class ListenerType { class ListenerType {
static const simpleMsgListener = 'simpleMsgListener'; static final simpleMsgListener = 'simpleMsgListener';
static const initSDKListener = 'initSDKListener'; static final connectListener = 'connectListener';
static const groupListener = 'groupListener'; static final userListener = 'userListener';
static const advancedMsgListener = 'advancedMsgListener'; static final groupListener = 'groupListener';
static const conversationListener = 'conversationListener'; static final advancedMsgListener = 'advancedMsgListener';
static const friendListener = 'friendListener'; static final conversationListener = 'conversationListener';
static const signalingListener = 'signalingListener'; static final friendListener = 'friendListener';
static const msgSendProgressListener = "msgSendProgressListener"; static final signalingListener = 'signalingListener';
static final msgSendProgressListener = "msgSendProgressListener";
static final workMomentsListener = "workMomentsListener";
static final organizationListener = "organizationListener";
} }

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,40 +1,155 @@
/// 消息类型
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 forward = 108;
/// 名片
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 accept_friend = 201; static const custom_face = 115;
static const add_friend = 202;
static const refuse_friend_application = 203;
static const set_self_info = 204;
static const revoke_message = 205;
static const c2c_message_as_read = 206;
static const kick_online = 303; /// 通知类型
static const notificationBegin = 1000;
/// static const friendNotificationBegin = 1200;
static const transfer_group_owner = 501;
static const create_group = 502; /// 好友申请已接受
// static const create_group = 503; static const friendApplicationApprovedNotification = 1201;
static const join_group = 504;
static const quit_group = 505; /// 好友申请已拒绝
static const set_group_info = 506; static const friendApplicationRejectedNotification = 1202;
static const accept_group_application = 507;
static const refuse_group_application = 508; /// 好友申请
static const kick_group_member = 509; static const friendApplicationNotification = 1203;
static const invited_user_to_group = 510;
/// 好友已添加
static const friendAddedNotification = 1204;
/// 好友已删除
static const friendDeletedNotification = 1205;
/// 设置好友备注
static const friendRemarkSetNotification = 1206;
/// 好友加入黑名单
static const blackAddedNotification = 1207;
/// 已从黑名单移除
static const blackDeletedNotification = 1208;
static const friendNotificationEnd = 1299;
/// 会话改变
static const conversationChangeNotification = 1300;
static const userNotificationBegin = 1301;
/// 用户信息改变
static const userInfoUpdatedNotification = 1303;
static const userNotificationEnd = 1399;
/// OA通知
static const oaNotification = 1400;
static const groupNotificationBegin = 1500;
/// 群已被创建
static const groupCreatedNotification = 1501;
/// 群资料改变
static const groupInfoSetNotification = 1502;
/// 进群申请
static const joinGroupApplicationNotification = 1503;
/// 群成员退出
static const memberQuitNotification = 1504;
/// 群申请被接受
static const groupApplicationAcceptedNotification = 1505;
/// 群申请被拒绝
static const groupApplicationRejectedNotification = 1506;
/// 群拥有者权限转移
static const groupOwnerTransferredNotification = 1507;
/// 群成员被踢出群
static const memberKickedNotification = 1508;
/// 邀请进群
static const memberInvitedNotification = 1509;
/// 群成员进群
static const memberEnterNotification = 1510;
/// 解散群
static const dismissGroupNotification = 1511;
static const groupNotificationEnd = 1599;
/// 群成员被禁言
static const groupMemberMutedNotification = 1512;
/// 群成员被取消禁言
static const groupMemberCancelMutedNotification = 1513;
/// 群禁言
static const groupMutedNotification = 1514;
/// 取消群禁言
static const groupCancelMutedNotification = 1515;
/// 群成员信息改变
static const groupMemberInfoChangedNotification = 1516;
static const signalingNotificationBegin = 1600;
/// 信令
static const signalingNotification = 1601;
static const signalingNotificationEnd = 1699;
/// 阅后即焚
static const burnAfterReadingNotification = 1701;
static const notificationEnd = 2000;
} }

View File

@@ -1,17 +1,39 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
abstract class AdvancedMsgListener { /// 消息监听
class OnAdvancedMsgListener {
Function(List<ReadReceiptInfo> list)? onRecvC2CMessageReadReceipt;
Function(List<ReadReceiptInfo> list)? onRecvGroupMessageReadReceipt;
Function(String msgId)? onRecvMessageRevoked;
Function(Message msg)? onRecvNewMessage;
/// Uniquely identifies /// Uniquely identifies
final String id; String id;
AdvancedMsgListener() : id = "id_${DateTime.now().microsecondsSinceEpoch}"; OnAdvancedMsgListener({
this.onRecvC2CMessageReadReceipt,
this.onRecvGroupMessageReadReceipt,
this.onRecvMessageRevoked,
this.onRecvNewMessage,
}) : id = "id_${DateTime.now().microsecondsSinceEpoch}";
/// Receive new message /// C2C消息已读回执
void recvNewMessage(Message msg); void recvC2CMessageReadReceipt(List<ReadReceiptInfo> list) {
onRecvC2CMessageReadReceipt?.call(list);
}
/// Message read receipt /// 群消息已读回执
void recvC2CReadReceipt(List<HaveReadInfo> list); void recvGroupMessageReadReceipt(List<ReadReceiptInfo> list) {
onRecvGroupMessageReadReceipt?.call(list);
}
/// A friend withdrew a message /// 消息被撤回
void recvMessageRevoked(String msgId); void recvMessageRevoked(String msgId) {
onRecvMessageRevoked?.call(msgId);
}
/// 收到了一条新消息
void recvNewMessage(Message msg) {
onRecvNewMessage?.call(msg);
}
} }

View File

@@ -1,48 +1,40 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; /// SDK
class OnConnectListener {
class OnInitSDKListener extends InitSDKListener {
Function(int? code, String? errorMsg)? onConnectFailed; Function(int? code, String? errorMsg)? onConnectFailed;
Function()? onConnectSuccess; Function()? onConnectSuccess;
Function()? onConnecting; Function()? onConnecting;
Function()? onKickedOffline; Function()? onKickedOffline;
Function(UserInfo info)? onSelfInfoUpdated;
Function()? onUserSigExpired; Function()? onUserSigExpired;
OnInitSDKListener({ OnConnectListener({
this.onConnectFailed, this.onConnectFailed,
this.onConnectSuccess, this.onConnectSuccess,
this.onConnecting, this.onConnecting,
this.onKickedOffline, this.onKickedOffline,
this.onSelfInfoUpdated,
this.onUserSigExpired, this.onUserSigExpired,
}); });
@override /// SDK连接服务器失败
void connectFailed(int? code, String? errorMsg) { void connectFailed(int? code, String? errorMsg) {
if (null != onConnectFailed) onConnectFailed!(code, errorMsg); if (null != onConnectFailed) onConnectFailed!(code, errorMsg);
} }
@override /// SDK连接服务器成功
void connectSuccess() { void connectSuccess() {
if (null != onConnectSuccess) onConnectSuccess!(); if (null != onConnectSuccess) onConnectSuccess!();
} }
@override /// SDK正在连接服务器
void connecting() { void connecting() {
if (null != onConnecting) onConnecting!.call(); if (null != onConnecting) onConnecting!.call();
} }
@override /// 线
void kickedOffline() { void kickedOffline() {
if (null != onKickedOffline) onKickedOffline!(); if (null != onKickedOffline) onKickedOffline!();
} }
@override ///
void selfInfoUpdated(UserInfo info) {
if (null != onSelfInfoUpdated) onSelfInfoUpdated!(info);
}
@override
void userSigExpired() { void userSigExpired() {
if (null != onUserSigExpired) onUserSigExpired!(); if (null != onUserSigExpired) onUserSigExpired!();
} }

View File

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

View File

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

View File

@@ -1,23 +1,78 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
abstract class GroupListener { /// 群组监听
void memberEnter(String groupId, List<GroupMembersInfo> list); class OnGroupListener {
Function(GroupApplicationInfo info)? onGroupApplicationAccepted;
Function(GroupApplicationInfo info)? onGroupApplicationAdded;
Function(GroupApplicationInfo info)? onGroupApplicationDeleted;
Function(GroupApplicationInfo info)? onGroupApplicationRejected;
Function(GroupInfo info)? onGroupInfoChanged;
Function(GroupMembersInfo info)? onGroupMemberAdded;
Function(GroupMembersInfo info)? onGroupMemberDeleted;
Function(GroupMembersInfo info)? onGroupMemberInfoChanged;
Function(GroupInfo info)? onJoinedGroupAdded;
Function(GroupInfo info)? onJoinedGroupDeleted;
void memberLeave(String groupId, GroupMembersInfo info); OnGroupListener({
this.onGroupApplicationAccepted,
this.onGroupApplicationAdded,
this.onGroupApplicationDeleted,
this.onGroupApplicationRejected,
this.onGroupInfoChanged,
this.onGroupMemberAdded,
this.onGroupMemberDeleted,
this.onGroupMemberInfoChanged,
this.onJoinedGroupAdded,
this.onJoinedGroupDeleted,
});
void memberInvited( /// 群申请已被接受
String groupId, GroupMembersInfo opUser, List<GroupMembersInfo> list); void groupApplicationAccepted(GroupApplicationInfo info) {
onGroupApplicationAccepted?.call(info);
}
void memberKicked( /// 群申请已被添加
String groupId, GroupMembersInfo opUser, List<GroupMembersInfo> list); void groupApplicationAdded(GroupApplicationInfo info) {
onGroupApplicationAdded?.call(info);
}
void groupCreated(String groupId); /// 群申请已被删除
void groupApplicationDeleted(GroupApplicationInfo info) {
onGroupApplicationDeleted?.call(info);
}
void groupInfoChanged(String groupId, GroupInfo info); /// 群申请已被拒绝
void groupApplicationRejected(GroupApplicationInfo info) {
onGroupApplicationRejected?.call(info);
}
void receiveJoinApplication( /// 群资料发生改变
String groupId, GroupMembersInfo info, String opReason); void groupInfoChanged(GroupInfo info) {
onGroupInfoChanged?.call(info);
}
void applicationProcessed(String groupId, GroupMembersInfo opUser, /// 群成员已添加
int agreeOrReject, String opReason); void groupMemberAdded(GroupMembersInfo info) {
onGroupMemberAdded?.call(info);
}
/// 群成员已删除
void groupMemberDeleted(GroupMembersInfo info) {
onGroupMemberDeleted?.call(info);
}
/// 群成员信息发送改变
void groupMemberInfoChanged(GroupMembersInfo info) {
onGroupMemberInfoChanged?.call(info);
}
/// 已加入的群有新增
void joinedGroupAdded(GroupInfo info) {
onJoinedGroupAdded?.call(info);
}
/// 已加入的群减少
void joinedGroupDeleted(GroupInfo info) {
onJoinedGroupDeleted?.call(info);
}
} }

View File

@@ -1,28 +0,0 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class OnAdvancedMsgListener extends AdvancedMsgListener {
Function(List<HaveReadInfo> list)? onRecvC2CReadReceipt;
Function(String msgId)? onRecvMessageRevoked;
Function(Message msg)? onRecvNewMessage;
OnAdvancedMsgListener({
this.onRecvC2CReadReceipt,
this.onRecvMessageRevoked,
this.onRecvNewMessage,
});
@override
void recvC2CReadReceipt(List<HaveReadInfo> list) {
if (null != onRecvC2CReadReceipt) onRecvC2CReadReceipt!(list);
}
@override
void recvMessageRevoked(String msgId) {
if (null != onRecvMessageRevoked) onRecvMessageRevoked!(msgId);
}
@override
void recvNewMessage(Message msg) {
if (null != onRecvNewMessage) onRecvNewMessage!(msg);
}
}

View File

@@ -1,50 +0,0 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class OnConversationListener extends ConversationListener {
Function(List<ConversationInfo> list)? onConversationChanged;
Function(List<ConversationInfo> list)? onNewConversation;
Function(int count)? onTotalUnreadMessageCountChanged;
Function()? onSyncServerFailed;
Function()? onSyncServerFinish;
Function()? onSyncServerStart;
OnConversationListener({
this.onConversationChanged,
this.onNewConversation,
this.onTotalUnreadMessageCountChanged,
this.onSyncServerFailed,
this.onSyncServerFinish,
this.onSyncServerStart,
});
@override
void conversationChanged(List<ConversationInfo> list) {
if (onConversationChanged != null) onConversationChanged!(list);
}
@override
void newConversation(List<ConversationInfo> list) {
if (onNewConversation != null) onNewConversation!(list);
}
@override
void syncServerFailed() {
if (onSyncServerFailed != null) onSyncServerFailed!();
}
@override
void syncServerFinish() {
if (onSyncServerFinish != null) onSyncServerFinish!();
}
@override
void syncServerStart() {
if (onSyncServerStart != null) onSyncServerStart!();
}
@override
void totalUnreadMessageCountChanged(int i) {
if (onTotalUnreadMessageCountChanged != null)
onTotalUnreadMessageCountChanged!(i);
}
}

View File

@@ -1,73 +0,0 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class OnFriendshipListener extends FriendshipListener {
Function(UserInfo u)? onBlackListAdd;
Function(UserInfo u)? onBlackListDeleted;
Function(UserInfo u)? onFriendApplicationListAccept;
Function(UserInfo u)? onFriendApplicationListAdded;
Function(UserInfo u)? onFriendApplicationListDeleted;
Function(UserInfo u)? onFriendApplicationListReject;
Function(UserInfo u)? onFriendInfoChanged;
Function(UserInfo u)? onFriendListAdded;
Function(UserInfo u)? onFriendListDeleted;
OnFriendshipListener({
this.onBlackListAdd,
this.onBlackListDeleted,
this.onFriendApplicationListAccept,
this.onFriendApplicationListAdded,
this.onFriendApplicationListDeleted,
this.onFriendApplicationListReject,
this.onFriendInfoChanged,
this.onFriendListAdded,
this.onFriendListDeleted,
});
@override
void blackListAdd(UserInfo u) {
if (null != onBlackListAdd) onBlackListAdd!(u);
}
@override
void blackListDeleted(UserInfo u) {
if (null != onBlackListDeleted) onBlackListDeleted!(u);
}
@override
void friendApplicationListAccept(UserInfo u) {
if (null != onFriendApplicationListAccept)
onFriendApplicationListAccept!(u);
}
@override
void friendApplicationListAdded(UserInfo u) {
if (null != onFriendApplicationListAdded) onFriendApplicationListAdded!(u);
}
@override
void friendApplicationListDeleted(UserInfo u) {
if (null != onFriendApplicationListDeleted)
onFriendApplicationListDeleted!(u);
}
@override
void friendApplicationListReject(UserInfo u) {
if (null != onFriendApplicationListReject)
onFriendApplicationListReject!(u);
}
@override
void friendInfoChanged(UserInfo u) {
if (null != onFriendInfoChanged) onFriendInfoChanged!(u);
}
@override
void friendListAdded(UserInfo u) {
if (null != onFriendListAdded) onFriendListAdded!(u);
}
@override
void friendListDeleted(UserInfo u) {
if (null != onFriendListDeleted) onFriendListDeleted!(u);
}
}

View File

@@ -1,75 +0,0 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class OnGroupListener extends GroupListener {
Function(String groupId, GroupMembersInfo opUser, int agreeOrReject,
String opReason)? onApplicationProcessed;
Function(String groupId)? onGroupCreated;
Function(String groupId, GroupInfo info)? onGroupInfoChanged;
Function(String groupId, List<GroupMembersInfo> list)? onMemberEnter;
Function(
String groupId, GroupMembersInfo opUser, List<GroupMembersInfo> list)?
onMemberInvited;
Function(
String groupId, GroupMembersInfo opUser, List<GroupMembersInfo> list)?
onMemberKicked;
Function(String groupId, GroupMembersInfo info)? onMemberLeave;
Function(String groupId, GroupMembersInfo info, String opReason)?
onReceiveJoinApplication;
OnGroupListener({
this.onApplicationProcessed,
this.onGroupCreated,
this.onGroupInfoChanged,
this.onMemberEnter,
this.onMemberInvited,
this.onMemberKicked,
this.onMemberLeave,
this.onReceiveJoinApplication,
});
@override
void applicationProcessed(String groupId, GroupMembersInfo opUser,
int agreeOrReject, String opReason) {
if (null != onApplicationProcessed)
onApplicationProcessed!(groupId, opUser, agreeOrReject, opReason);
}
@override
void groupCreated(String groupId) {
if (null != onGroupCreated) onGroupCreated!(groupId);
}
@override
void groupInfoChanged(String groupId, GroupInfo info) {
if (null != onGroupInfoChanged) onGroupInfoChanged!(groupId, info);
}
@override
void memberEnter(String groupId, List<GroupMembersInfo> list) {
if (null != onMemberEnter) onMemberEnter!(groupId, list);
}
@override
void memberInvited(
String groupId, GroupMembersInfo opUser, List<GroupMembersInfo> list) {
if (null != onMemberInvited) onMemberInvited!(groupId, opUser, list);
}
@override
void memberKicked(
String groupId, GroupMembersInfo opUser, List<GroupMembersInfo> list) {
if (null != onMemberKicked) onMemberKicked!(groupId, opUser, list);
}
@override
void memberLeave(String groupId, GroupMembersInfo info) {
if (null != onMemberLeave) onMemberLeave!(groupId, info);
}
@override
void receiveJoinApplication(
String groupId, GroupMembersInfo info, String opReason) {
if (null != onReceiveJoinApplication)
onReceiveJoinApplication!(groupId, info, opReason);
}
}

View File

@@ -1,11 +0,0 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class OnMsgSendProgressListener extends MsgSendProgressListener {
Function(String msgID, int progress)? onProgress;
OnMsgSendProgressListener({this.onProgress});
void progress(String msgID, int progress) {
if (null != onProgress) onProgress!(msgID, progress);
}
}

View File

@@ -1,23 +0,0 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
abstract class InitSDKListener {
/// SDK is connecting to the server
void connecting();
/// SDK has successfully connected to the server
void connectSuccess();
/// SDK failed to connect to the server
void connectFailed(int? code, String? errorMsg);
/// 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.
void kickedOffline();
/// Ticket expired when online.
/// At this time, you need to generate a new userSig and call IMManager's login() function to log in again
void userSigExpired();
/// The information of the logged-in user has been updated
void selfInfoUpdated(UserInfo info);
}

View File

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

View File

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

View File

@@ -0,0 +1,64 @@
import 'package:flutter_openim_sdk/src/models/signaling_info.dart';
/// 信令监听
class OnSignalingListener {
final Function(SignalingInfo info)? onInvitationCancelled;
final Function(SignalingInfo info)? onInvitationTimeout;
final Function(SignalingInfo info)? onInviteeAccepted;
final Function(SignalingInfo info)? onInviteeRejected;
final Function(SignalingInfo info)? onReceiveNewInvitation;
final Function(SignalingInfo info)? onInviteeRejectedByOtherDevice;
final Function(SignalingInfo info)? onInviteeAcceptedByOtherDevice;
final Function(SignalingInfo info)? onHangup;
OnSignalingListener({
this.onInvitationCancelled,
this.onInvitationTimeout,
this.onInviteeAccepted,
this.onInviteeRejected,
this.onReceiveNewInvitation,
this.onInviteeAcceptedByOtherDevice,
this.onInviteeRejectedByOtherDevice,
this.onHangup,
});
/// 被邀请者收到:邀请者取消音视频通话
void invitationCancelled(SignalingInfo info) {
onInvitationCancelled?.call(info);
}
/// 邀请者收到:被邀请者超时未接通
void invitationTimeout(SignalingInfo info) {
onInvitationTimeout?.call(info);
}
/// 邀请者收到:被邀请者同意音视频通话
void inviteeAccepted(SignalingInfo info) {
onInviteeAccepted?.call(info);
}
/// 邀请者收到:被邀请者拒绝音视频通话
void inviteeRejected(SignalingInfo info) {
onInviteeRejected?.call(info);
}
/// 被邀请者收到:音视频通话邀请
void receiveNewInvitation(SignalingInfo info) {
onReceiveNewInvitation?.call(info);
}
/// 被邀请者其他端收到比如被邀请者在手机拒接在pc上会收到此回调
void inviteeAcceptedByOtherDevice(SignalingInfo info) {
onInviteeAcceptedByOtherDevice?.call(info);
}
/// 被邀请者其他端收到比如被邀请者在手机拒接在pc上会收到此回调
void inviteeRejectedByOtherDevice(SignalingInfo info) {
onInviteeRejectedByOtherDevice?.call(info);
}
/// 被挂断
void hangup(SignalingInfo info) {
onHangup?.call(info);
}
}

View File

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

View File

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

View File

@@ -1,34 +1,37 @@
import 'dart:convert';
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';
///
///
class ConversationManager { class ConversationManager {
MethodChannel _channel; MethodChannel _channel;
late ConversationListener conversationListener; late OnConversationListener listener;
ConversationManager(this._channel); ConversationManager(this._channel);
/// Observe conversation changes
/// 会话监听 /// 会话监听
Future setConversationListener(ConversationListener listener) { Future setConversationListener(OnConversationListener listener) {
this.conversationListener = listener; this.listener = listener;
return _channel.invokeMethod('setConversationListener', _buildParam({})); return _channel.invokeMethod('setConversationListener', _buildParam({}));
} }
/// Get all conversations
/// 获取所有会话 /// 获取所有会话
Future<List<ConversationInfo>> getAllConversationList() => _channel Future<List<ConversationInfo>> getAllConversationList(
.invokeMethod('getAllConversationList', _buildParam({})) {String? operationID}) =>
.then((value) => _toList(value)); _channel
.invokeMethod(
'getAllConversationList',
_buildParam({
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (map) => ConversationInfo.fromJson(map)));
/// Paging to get conversation /// 分页获取会话
/// 分页获取会话, [offset]下次获取开始index /// [offset] 开始下标
/// [count] 每页数量
Future<List<ConversationInfo>> getConversationListSplit({ Future<List<ConversationInfo>> getConversationListSplit({
int offset = 0, int offset = 0,
int count = 20, int count = 20,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
@@ -36,18 +39,18 @@ class ConversationManager {
_buildParam({ _buildParam({
'offset': offset, 'offset': offset,
'count': count, 'count': count,
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => _toList(value)); .then((value) =>
Utils.toList(value, (map) => ConversationInfo.fromJson(map)));
/// Get a single conversation info /// 查询会话,如果会话不存在会自动生成一个
/// [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] 如果是单聊会话传1如果是群聊会话传2
/// 获取单个会话 Future<ConversationInfo> getOneConversation({
/// [sourceID]如果是单聊值传用户id如果是群聊值传组id
/// [sessionType]如果是单聊值传1如果是群聊值传2
Future<ConversationInfo> getSingleConversation({
required String sourceID, required String sourceID,
required int sessionType, required int sessionType,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
@@ -55,89 +58,99 @@ class ConversationManager {
_buildParam({ _buildParam({
"sourceID": sourceID, "sourceID": sourceID,
"sessionType": sessionType, "sessionType": sessionType,
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => _toObj(value)); .then((value) =>
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,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
'getMultipleConversation', 'getMultipleConversation',
_buildParam({ _buildParam({
"conversationIDList": conversationIDList, "conversationIDList": conversationIDList,
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => _toList(value)); .then((value) =>
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,
}) => }) =>
_channel _channel.invokeMethod(
.invokeMethod( 'deleteConversation',
'deleteConversation', _buildParam({
_buildParam({ "conversationID": conversationID,
"conversationID": conversationID, "operationID": Utils.checkOperationID(operationID),
})) }));
.then((value) => _printValue(value));
/// Set draft
/// 设置会话草稿 /// 设置会话草稿
/// [conversationID] 会话id
/// [draftText] 草稿
Future setConversationDraft({ Future setConversationDraft({
required String conversationID, required String conversationID,
required String draftText, required String draftText,
String? operationID,
}) => }) =>
_channel _channel.invokeMethod(
.invokeMethod( 'setConversationDraft',
'setConversationDraft', _buildParam({
_buildParam({ "conversationID": conversationID,
"conversationID": conversationID, "draftText": draftText,
"draftText": draftText, "operationID": Utils.checkOperationID(operationID),
})) }));
.then((value) => _printValue(value));
/// Pinned conversation
/// 置顶会话 /// 置顶会话
/// [conversationID] 会话id
/// [isPinned] true置顶false取消置顶
Future pinConversation({ Future pinConversation({
required String conversationID, required String conversationID,
required bool isPinned, required bool isPinned,
String? operationID,
}) => }) =>
_channel
.invokeMethod(
'pinConversation',
_buildParam({
"conversationID": conversationID,
"isPinned": isPinned,
}))
.then((value) => _printValue(value));
/// Mark single chat messages as read
/// 标记单聊已读
Future<dynamic> markSingleMessageHasRead({required String userID}) =>
_channel.invokeMethod( _channel.invokeMethod(
'markSingleMessageHasRead', _buildParam({'userID': userID})); 'pinConversation',
_buildParam({
"conversationID": conversationID,
"isPinned": isPinned,
"operationID": Utils.checkOperationID(operationID),
}));
/// Mark group chat messages as read /// 标记群聊会话已读
/// 标记群聊已读 /// [groupID] 群id
Future<dynamic> markGroupMessageHasRead({required String groupID}) => Future<dynamic> markGroupMessageHasRead({
required String groupID,
String? operationID,
}) =>
_channel.invokeMethod( _channel.invokeMethod(
'markGroupMessageHasRead', _buildParam({'groupID': groupID})); 'markGroupMessageHasRead',
_buildParam({
'groupID': groupID,
"operationID": Utils.checkOperationID(operationID),
}));
/// Get the total number of unread messages
/// 获取未读消息总数 /// 获取未读消息总数
Future<dynamic> getTotalUnreadMsgCount() => Future<dynamic> getTotalUnreadMsgCount({
_channel.invokeMethod('getTotalUnreadMsgCount', _buildParam({})); String? operationID,
}) =>
_channel.invokeMethod(
'getTotalUnreadMsgCount',
_buildParam({
"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] 如果是单聊值传1如果是群聊值传2
Future<dynamic> getConversationID({ Future<dynamic> getConversationIDBySessionType({
required String sourceID, required String sourceID,
required int sessionType, required int sessionType,
}) => }) =>
@@ -148,46 +161,117 @@ class ConversationManager {
"sessionType": sessionType, "sessionType": sessionType,
})); }));
/// Message Do Not Disturb
/// [status] 1: Do not receive messages, 2: Do not notify when messages are received; 0: Normal
/// 消息免打扰设置 /// 消息免打扰设置
/// [status] 1不接受消息2接受在线消息不接受离线消息3正常 /// [conversationIDList] 会话id列表
/// [status] 0正常1不接受消息2接受在线消息不接受离线消息
Future<dynamic> setConversationRecvMessageOpt({ Future<dynamic> setConversationRecvMessageOpt({
required List<String> conversationIDList, required List<String> conversationIDList,
required int status, required int status,
String? operationID,
}) => }) =>
_channel.invokeMethod( _channel.invokeMethod(
'setConversationRecvMessageOpt', 'setConversationRecvMessageOpt',
_buildParam({ _buildParam({
"conversationIDList": conversationIDList, "conversationIDList": conversationIDList,
"status": status, "status": status,
"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,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
'getConversationRecvMessageOpt', 'getConversationRecvMessageOpt',
_buildParam({ _buildParam({
"conversationIDList": conversationIDList, "conversationIDList": conversationIDList,
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => _formatJson(value)); .then((value) => Utils.toListMap(value));
/// Custom sort for conversation list /// 阅后即焚
/// 会话列表自定义排序规则 /// [conversationID] 会话id
/// [isPrivate] true开启false关闭
Future<dynamic> setOneConversationPrivateChat({
required String conversationID,
required bool isPrivate,
String? operationID,
}) =>
_channel.invokeMethod(
'setOneConversationPrivateChat',
_buildParam({
"conversationID": conversationID,
"isPrivate": isPrivate,
"operationID": Utils.checkOperationID(operationID),
}));
/// 删除本地以及服务器的会话
/// [conversationID] 会话ID
Future<dynamic> deleteConversationFromLocalAndSvr({
required String conversationID,
String? operationID,
}) =>
_channel.invokeMethod(
'deleteConversationFromLocalAndSvr',
_buildParam({
"conversationID": conversationID,
"operationID": Utils.checkOperationID(operationID),
}));
/// 删除所有本地会话
Future<dynamic> deleteAllConversationFromLocal({
String? operationID,
}) =>
_channel.invokeMethod(
'deleteAllConversationFromLocal',
_buildParam({
"operationID": Utils.checkOperationID(operationID),
}));
/// 重置强提醒标识[GroupAtType]
/// [conversationID] 会话id
Future<dynamic> resetConversationGroupAtType({
required String conversationID,
String? operationID,
}) =>
_channel.invokeMethod(
'resetConversationGroupAtType',
_buildParam({
"conversationID": conversationID,
"operationID": Utils.checkOperationID(operationID),
}));
/// 查询@所有人标识
Future<dynamic> getAtAllTag() =>
_channel.invokeMethod('getAtAllTag', _buildParam({}));
/// 全局免打扰
/// [status] 0正常1不接受消息2接受在线消息不接受离线消息
Future<dynamic> setGlobalRecvMessageOpt({
required int status,
String? operationID,
}) =>
_channel.invokeMethod(
'setGlobalRecvMessageOpt',
_buildParam({
"status": status,
"operationID": Utils.checkOperationID(operationID),
}));
/// 会话列表自定义排序规则。
List<ConversationInfo> simpleSort(List<ConversationInfo> list) => list List<ConversationInfo> simpleSort(List<ConversationInfo> list) => list
..sort((a, b) { ..sort((a, b) {
if ((a.isPinned == 1 && b.isPinned == 1) || if ((a.isPinned == true && b.isPinned == true) ||
(a.isPinned != 1 && b.isPinned != 1)) { (a.isPinned != true && b.isPinned != true)) {
int aCompare = a.draftTimestamp! > a.latestMsgSendTime! int aCompare = a.draftTextTime! > a.latestMsgSendTime!
? a.draftTimestamp! ? a.draftTextTime!
: a.latestMsgSendTime!; : a.latestMsgSendTime!;
int bCompare = b.draftTimestamp! > b.latestMsgSendTime! int bCompare = b.draftTextTime! > b.latestMsgSendTime!
? b.draftTimestamp! ? b.draftTextTime!
: b.latestMsgSendTime!; : b.latestMsgSendTime!;
if (aCompare > bCompare) { if (aCompare > bCompare) {
return -1; return -1;
@@ -196,7 +280,7 @@ class ConversationManager {
} else { } else {
return 0; return 0;
} }
} else if (a.isPinned == 1 && b.isPinned != 1) { } else if (a.isPinned == true && b.isPinned != true) {
return -1; return -1;
} else { } else {
return 1; return 1;
@@ -207,19 +291,4 @@ class ConversationManager {
param["ManagerName"] = "conversationManager"; param["ManagerName"] = "conversationManager";
return param; return param;
} }
static List<ConversationInfo> _toList(String? value) {
var list = _formatJson(value);
if (null == list) return <ConversationInfo>[];
return (list as List).map((e) => ConversationInfo.fromJson(e)).toList();
}
static ConversationInfo _toObj(String value) =>
ConversationInfo.fromJson(_formatJson(value));
static dynamic _formatJson(value) => jsonDecode(_printValue(value));
static String _printValue(value) {
return value;
}
} }

View File

@@ -1,136 +1,232 @@
import 'dart:convert';
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';
class FriendshipManager { class FriendshipManager {
MethodChannel _channel; MethodChannel _channel;
late FriendshipListener friendshipListener; late OnFriendshipListener listener;
FriendshipManager(this._channel); FriendshipManager(this._channel);
/// Set up a friend relationship listener
/// 好友关系监听 /// 好友关系监听
Future setFriendshipListener(FriendshipListener listener) { Future setFriendshipListener(OnFriendshipListener listener) {
this.friendshipListener = listener; this.listener = listener;
return _channel.invokeMethod('setFriendListener', _buildParam({})); return _channel.invokeMethod('setFriendListener', _buildParam({}));
} }
/// Get friend info by user id
/// 查询好友信息 /// 查询好友信息
Future<List<UserInfo>> getFriendsInfo({required List<String> uidList}) => /// [uidList] userID集合
Future<List<UserInfo>> getFriendsInfo({
required List<String> uidList,
String? operationID,
}) =>
_channel _channel
.invokeMethod('getFriendsInfo', _buildParam({"uidList": uidList})) .invokeMethod(
.then((value) => _toList(value)); 'getFriendsInfo',
_buildParam({
"uidList": uidList,
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (v) => UserInfo.fromJson(v)));
/// Send an friend application /// 发送一个好友请求,需要对方调用同意申请才能成为好友。
/// 发送一个好友请求 /// [uid] 被邀请的用户ID
Future<dynamic> addFriend({required String uid, required String reason}) => /// [reason] 备注说明
Future<dynamic> addFriend({
required String uid,
String? reason,
String? operationID,
}) =>
_channel.invokeMethod( _channel.invokeMethod(
'addFriend', _buildParam({"uid": uid, "reqMessage": reason})); 'addFriend',
/// Get all friend application, sent to you by others
/// 获取所有好友申请
Future<List<UserInfo>> getFriendApplicationList() => _channel
.invokeMethod('getFriendApplicationList', _buildParam({}))
.then((value) => _toList(value));
/// Find all friends including those who have been added to the blacklist
/// 获取好友列表包含已拉入黑名单的好友
Future<List<UserInfo>> getFriendList() => _channel
.invokeMethod('getFriendList', _buildParam({}))
.then((value) => _toList(value));
/// Find all friends including those who have been added to the blacklist
/// 获取好友列表
Future<List<dynamic>> getFriendListMap() => _channel
.invokeMethod('getFriendList', _buildParam({}))
.then((value) => _toListMap(value));
/// Modify friend information, only [comment] can be modified
/// 设置好友备注
Future<dynamic> setFriendInfo(
{required String uid, required String comment}) =>
_channel.invokeMethod(
'setFriendInfo',
_buildParam({ _buildParam({
'uid': uid, "toUserID": uid,
'comment': comment, "reqMsg": reason,
"operationID": Utils.checkOperationID(operationID),
}));
/// 获取别人加我为好友的申请
Future<List<FriendApplicationInfo>> getRecvFriendApplicationList(
{String? operationID}) =>
_channel
.invokeMethod(
'getRecvFriendApplicationList',
_buildParam({
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (v) => FriendApplicationInfo.fromJson(v)));
/// 获取我发出的好友申请
Future<List<FriendApplicationInfo>> getSendFriendApplicationList(
{String? operationID}) =>
_channel
.invokeMethod(
'getSendFriendApplicationList',
_buildParam({
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (v) => FriendApplicationInfo.fromJson(v)));
/// 获取好友列表,返回的列表包含了已拉入黑名单的好友
Future<List<UserInfo>> getFriendList({String? operationID}) => _channel
.invokeMethod(
'getFriendList',
_buildParam({
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (v) => UserInfo.fromJson(v)));
/// 获取好友列表,返回的列表包含了已拉入黑名单的好友
Future<List<dynamic>> getFriendListMap({String? operationID}) => _channel
.invokeMethod(
'getFriendList',
_buildParam({
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toListMap(value));
/// 设置好友备注
/// [uid] 好友的userID
/// [remark] 好友的备注
Future<dynamic> setFriendRemark({
required String uid,
required String remark,
String? operationID,
}) =>
_channel.invokeMethod(
'setFriendRemark',
_buildParam({
'toUserID': uid,
'remark': remark,
"operationID": Utils.checkOperationID(operationID),
})); }));
/// Add friends to blacklist
/// 加入黑名单 /// 加入黑名单
Future<dynamic> addToBlackList({required String uid}) => /// [uid] 被加入黑名单的好友ID
_channel.invokeMethod('addToBlackList', _buildParam({"uid": uid})); Future<dynamic> addBlacklist({
required String uid,
String? operationID,
}) =>
_channel.invokeMethod(
'addBlacklist',
_buildParam({
"uid": uid,
"operationID": Utils.checkOperationID(operationID),
}));
/// Find all blacklist
/// 获取黑名单列表 /// 获取黑名单列表
Future<List<UserInfo>> getBlackList() => _channel Future<List<UserInfo>> getBlacklist({String? operationID}) => _channel
.invokeMethod('getBlackList', _buildParam({})) .invokeMethod(
.then((value) => _toList(value)); 'getBlacklist',
_buildParam({
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (v) => UserInfo.fromJson(v)));
/// Remove from blacklist
/// 从黑名单移除 /// 从黑名单移除
Future<dynamic> deleteFromBlackList({required String uid}) => /// [uid] 用户ID
_channel.invokeMethod('deleteFromBlackList', _buildParam({"uid": uid})); Future<dynamic> removeBlacklist({
required String uid,
String? operationID,
}) =>
_channel.invokeMethod(
'removeBlacklist',
_buildParam({
"uid": uid,
"operationID": Utils.checkOperationID(operationID),
}));
/// Determine if there is a friendship by userId
/// 检查友好关系 /// 检查友好关系
Future<List<UserInfo>> checkFriend(List<String> uidList) => _channel /// [uidList] userID列表
.invokeMethod('checkFriend', _buildParam({'uidList': uidList})) Future<List<FriendshipInfo>> checkFriend({
.then((value) => _toList(value)); required List<String> uidList,
String? operationID,
}) =>
_channel
.invokeMethod(
'checkFriend',
_buildParam({
'uidList': uidList,
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (v) => FriendshipInfo.fromJson(v)));
/// Dissolve friendship from friend list
/// 删除好友 /// 删除好友
Future<dynamic> deleteFromFriendList({required String uid}) => /// [uid] 用户ID
_channel.invokeMethod('deleteFromFriendList', _buildParam({"uid": uid})); Future<dynamic> deleteFriend({
required String uid,
String? operationID,
}) =>
_channel.invokeMethod(
'deleteFriend',
_buildParam({
"uid": uid,
"operationID": Utils.checkOperationID(operationID),
}));
/// Accept application of be friend
/// 接受好友请求 /// 接受好友请求
Future<dynamic> acceptFriendApplication({required String uid}) => _channel /// [uid] 用户ID
.invokeMethod('acceptFriendApplication', _buildParam({"uid": uid})); /// [handleMsg]备注说明
Future<dynamic> acceptFriendApplication({
required String uid,
String? handleMsg,
String? operationID,
}) =>
_channel.invokeMethod(
'acceptFriendApplication',
_buildParam({
"toUserID": uid,
"handleMsg": handleMsg,
"operationID": Utils.checkOperationID(operationID),
}));
/// Refuse application of be friend
/// 拒绝好友请求 /// 拒绝好友请求
Future<dynamic> refuseFriendApplication({required String uid}) => _channel /// [uid] 用户ID
.invokeMethod('refuseFriendApplication', _buildParam({"uid": uid})); /// [handleMsg]备注说明
Future<dynamic> refuseFriendApplication({
required String uid,
String? handleMsg,
String? operationID,
}) =>
_channel.invokeMethod(
'refuseFriendApplication',
_buildParam({
"toUserID": uid,
"handleMsg": handleMsg,
"operationID": Utils.checkOperationID(operationID),
}));
/// /// 查好友
// Future<dynamic> forceSyncFriendApplication() { /// [keywordList] 搜索关键词,目前仅支持一个关键词搜索,不能为空
// return _channel.invokeMethod('forceSyncFriendApplication', _buildParam({})); /// [isSearchUserID] 是否以关键词搜索好友ID(注不可以同时为false)为空默认false
// } /// [isSearchNickname] 是否以关键词搜索昵称为空默认false
/// [isSearchRemark] 是否以关键词搜索备注名为空默认false
/// Future<List<FriendInfo>> searchFriends({
// Future<dynamic> forceSyncFriend() { List<String> keywordList = const [],
// return _channel.invokeMethod('forceSyncFriend', _buildParam({})); bool isSearchUserID = false,
// } bool isSearchNickname = false,
bool isSearchRemark = false,
/// String? operationID,
// Future<dynamic> forceSyncBlackList() { }) =>
// return _channel.invokeMethod('forceSyncBlackList', _buildParam({})); _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;
} }
static List<UserInfo> _toList(String? value) {
var list = _formatJson(value);
if (null == list) return <UserInfo>[];
return (list as List).map((e) => UserInfo.fromJson(e)).toList();
}
static List<dynamic> _toListMap(String? value) {
var list = _formatJson(value);
return list;
}
// static UserInfo _toObj(String value) => UserInfo.fromJson(_formatJson(value));
static dynamic _formatJson(value) => jsonDecode(_printValue(value));
static String _printValue(value) {
return value;
}
} }

View File

@@ -1,28 +1,26 @@
import 'dart:convert';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/src/listener/group_listener.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
import 'package:flutter_openim_sdk/src/models/group_info.dart';
class GroupManager { class GroupManager {
MethodChannel _channel; MethodChannel _channel;
late GroupListener groupListener; late OnGroupListener listener;
GroupManager(this._channel); GroupManager(this._channel);
/// Set up group relationship monitoring
/// 组关系监听 /// 组关系监听
Future setGroupListener(GroupListener listener) { Future setGroupListener(OnGroupListener listener) {
this.groupListener = 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,
String? reason, String? reason,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
@@ -31,17 +29,20 @@ class GroupManager {
'gid': groupId, 'gid': groupId,
'reason': reason, 'reason': reason,
'uidList': uidList, 'uidList': uidList,
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => (_formatJson(value) as List) .then((value) =>
.map((e) => GroupInviteResult.fromJson(e)) Utils.toList(value, (map) => GroupInviteResult.fromJson(map)));
.toList());
/// 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,
String? reason, String? reason,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
@@ -50,16 +51,18 @@ class GroupManager {
'gid': groupId, 'gid': groupId,
'reason': reason, 'reason': reason,
'uidList': uidList, 'uidList': uidList,
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => (_formatJson(value) as List) .then((value) =>
.map((e) => GroupInviteResult.fromJson(e)) Utils.toList(value, (map) => GroupInviteResult.fromJson(map)));
.toList());
/// 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,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
@@ -67,19 +70,22 @@ class GroupManager {
_buildParam({ _buildParam({
'gid': groupId, 'gid': groupId,
'uidList': uidList, 'uidList': uidList,
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => (_formatJson(value) as List) .then((value) =>
.map((e) => GroupMembersInfo.fromJson(e)) Utils.toList(value, (map) => GroupMembersInfo.fromJson(map)));
.toList());
/// Get the list of group members /// 分页获取组成员列表
/// [filter] 0: all user, 1: group owner, 2: administrator /// [groupId] 群ID
/// [next] begin index, pull and fill 0 for the first time /// [filter] 过滤成员 1普通成员, 2群主3管理员0 所有
/// 获取组成员列表 /// [offset] 开始下标
Future<GroupMembersList> getGroupMemberList({ /// [count] 总数
Future<List<GroupMembersInfo>> getGroupMemberList({
required String groupId, required String groupId,
int filter = 0, int filter = 0,
int next = 0, int offset = 0,
int count = 0,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
@@ -87,16 +93,24 @@ class GroupManager {
_buildParam({ _buildParam({
'gid': groupId, 'gid': groupId,
'filter': filter, 'filter': filter,
'next': next, 'offset': offset,
'count': count,
'operationID': Utils.checkOperationID(operationID),
})) }))
.then((value) => GroupMembersList.fromJson(_formatJson(value))); .then((value) =>
Utils.toList(value, (map) => GroupMembersInfo.fromJson(map)));
/// Get the list of group members /// 分页获取组成员列表
/// 获取组成员列表 /// [groupId] 群ID
Future<dynamic> getGroupMemberListMap({ /// [filter] 过滤成员 1普通成员, 2群主3管理员0所有
/// [offset] 开始下标
/// [count] 总数
Future<List<dynamic>> getGroupMemberListMap({
required String groupId, required String groupId,
int filter = 0, int filter = 0,
int next = 0, int offset = 0,
int count = 0,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
@@ -104,180 +118,387 @@ class GroupManager {
_buildParam({ _buildParam({
'gid': groupId, 'gid': groupId,
'filter': filter, 'filter': filter,
'next': next, 'offset': offset,
'count': count,
'operationID': Utils.checkOperationID(operationID),
})) }))
.then((value) => _formatJson(value)); .then((value) => Utils.toListMap(value));
/// Find all groups you have joined
/// 查询已加入的组列表 /// 查询已加入的组列表
Future<List<GroupInfo>> getJoinedGroupList() => _channel Future<List<GroupInfo>> getJoinedGroupList({String? operationID}) => _channel
.invokeMethod('getJoinedGroupList', _buildParam({})) .invokeMethod(
.then((value) => (_formatJson(value) as List) 'getJoinedGroupList',
.map((e) => GroupInfo.fromJson(e)) _buildParam({
.toList()); 'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (map) => GroupInfo.fromJson(map)));
/// Find all groups you have joined
/// 查询已加入的组列表 /// 查询已加入的组列表
Future<List<dynamic>> getJoinedGroupListMap() => _channel Future<List<dynamic>> getJoinedGroupListMap({String? operationID}) => _channel
.invokeMethod('getJoinedGroupList', _buildParam({})) .invokeMethod(
.then((value) => _formatJson(value)); 'getJoinedGroupList',
_buildParam({
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toListMap(value));
/// Check if you are a member of the group
/// 检查是否已加入组 /// 检查是否已加入组
Future<bool> isJoinedGroup({required String gid}) => getJoinedGroupList() /// [gid] 组ID
.then((list) => list.where((e) => e.groupID == gid).length > 0); Future<bool> isJoinedGroup({
required String gid,
String? operationID,
}) =>
getJoinedGroupList(
operationID: Utils.checkOperationID(operationID),
).then((list) => list.where((e) => e.groupID == gid).length > 0);
/// Create a group
/// 创建一个组 /// 创建一个组
Future<dynamic> createGroup({ /// [groupName] 群名
/// [notification] 公告
/// [introduction] 群介绍
/// [faceUrl] 群头像
/// [groupType] 组类型
/// [ex] 额外信息
/// [list] 初创群成员以及其角色列表,角色参考[GroupRoleLevel]类
Future<GroupInfo> createGroup({
String? groupName, String? groupName,
String? notification, String? notification,
String? introduction, String? introduction,
String? faceUrl, String? faceUrl,
int? groupType,
String? ex,
required List<GroupMemberRole> list, required List<GroupMemberRole> list,
String? operationID,
}) => }) =>
_channel.invokeMethod( _channel
'createGroup', .invokeMethod(
_buildParam({ 'createGroup',
'gInfo': { _buildParam({
"groupName": groupName, 'gInfo': {
"notification": notification, "groupName": groupName,
"introduction": introduction, "notification": notification,
"faceUrl": faceUrl, "introduction": introduction,
}, "faceURL": faceUrl,
'memberList': list.map((e) => e.toJson()).toList() "groupType": groupType,
})); "ex": ex,
},
'memberList': list.map((e) => e.toJson()).toList(),
'operationID': Utils.checkOperationID(operationID),
}))
.then(
(value) => Utils.toObj(value, (map) => GroupInfo.fromJson(map)));
/// Edit group information
/// 编辑组资料 /// 编辑组资料
/// [groupID] 被编辑的群ID
/// [groupName] 新的群名
/// [notification] 新的公告
/// [introduction] 新的群介绍
/// [faceUrl] 新的群头像
/// [ex] 新的额外信息
Future<dynamic> setGroupInfo({ Future<dynamic> setGroupInfo({
required String groupID, required String groupID,
String? groupName, String? groupName,
String? notification, String? notification,
String? introduction, String? introduction,
String? faceUrl, String? faceUrl,
String? ex,
String? operationID,
}) => }) =>
_channel.invokeMethod( _channel.invokeMethod(
'setGroupInfo', 'setGroupInfo',
_buildParam({ _buildParam({
"gid": groupID,
'gInfo': { 'gInfo': {
"groupID": groupID, // "groupID": groupID,
"groupName": groupName, "groupName": groupName,
"notification": notification, "notification": notification,
"introduction": introduction, "introduction": introduction,
"faceUrl": faceUrl, "faceURL": faceUrl,
"ex": ex,
}, },
'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,
}) => }) =>
_channel _channel
.invokeMethod('getGroupsInfo', _buildParam({'gidList': gidList})) .invokeMethod(
.then((value) { 'getGroupsInfo',
List list = _formatJson(value); _buildParam({
return list.map((e) => GroupInfo.fromJson(e)).toList(); 'gidList': gidList,
}); 'operationID': Utils.checkOperationID(operationID),
}))
.then(
(value) => Utils.toList(value, (map) => GroupInfo.fromJson(map)));
/// Apply to join the group /// 申请加入组,需要通过管理员/群组同意。
/// 申请加入组,需要通过管理员同意。
Future<dynamic> joinGroup({ Future<dynamic> joinGroup({
required String gid, required String gid,
String? reason, String? reason,
String? operationID,
}) => }) =>
_channel.invokeMethod( _channel.invokeMethod(
'joinGroup', 'joinGroup',
_buildParam({ _buildParam({
'gid': gid, 'gid': gid,
'reason': reason, 'reason': reason,
'operationID': Utils.checkOperationID(operationID),
})); }));
/// Leave group
/// 退出组 /// 退出组
Future<dynamic> quitGroup({ Future<dynamic> quitGroup({
required String gid, required String gid,
String? operationID,
}) => }) =>
_channel.invokeMethod( _channel.invokeMethod(
'quitGroup', 'quitGroup',
_buildParam({ _buildParam({
'gid': gid, 'gid': gid,
'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,
String? operationID,
}) => }) =>
_channel.invokeMethod( _channel.invokeMethod(
'transferGroupOwner', 'transferGroupOwner',
_buildParam({ _buildParam({
'gid': gid, 'gid': gid,
'uid': uid, 'uid': uid,
'operationID': Utils.checkOperationID(operationID),
})); }));
/// Get the list of applications /// 作为群主或者管理员,收到的群成员入群申请
/// 获取所有进组申请 Future<List<GroupApplicationInfo>> getRecvGroupApplicationList(
Future<GroupApplicationList> getGroupApplicationList() => _channel {String? operationID}) =>
.invokeMethod('getGroupApplicationList', _buildParam({})) _channel
.then((value) => GroupApplicationList.fromJson(_formatJson(value))); .invokeMethod(
'getRecvGroupApplicationList',
_buildParam({
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (map) => GroupApplicationInfo.fromJson(map)));
/// Accept group application /// 获取自己发出的入群申请记录
/// 同意进组申请 Future<List<GroupApplicationInfo>> getSendGroupApplicationList(
{String? operationID}) =>
_channel
.invokeMethod(
'getSendGroupApplicationList',
_buildParam({
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (map) => GroupApplicationInfo.fromJson(map)));
/// 管理员或者群主同意某人进入某群
/// 注:主动申请入群需要通过管理员/群组处理,被别人拉入群不需要管理员/群组处理
/// [gid] 组id
/// [uid] 申请者用户ID
Future<dynamic> acceptGroupApplication({ Future<dynamic> acceptGroupApplication({
required GroupApplicationInfo info, required String gid,
required String reason, required String uid,
String? handleMsg,
String? operationID,
}) => }) =>
_channel.invokeMethod( _channel.invokeMethod(
'acceptGroupApplication', 'acceptGroupApplication',
_buildParam({ _buildParam({
'application': info.toJson(), 'gid': gid,
'reason': reason, 'uid': uid,
'handleMsg': handleMsg,
'operationID': Utils.checkOperationID(operationID),
})); }));
/// Refuse group application /// 管理员或者群主拒绝某人进入某群
/// 拒绝进组申请 /// 注:主动申请入群需要通过管理员/群组处理,被别人拉入群不需要管理员/群组处理
/// [gid] 组id
/// [uid] 申请者用户ID
/// [handleMsg] 说明
Future<dynamic> refuseGroupApplication({ Future<dynamic> refuseGroupApplication({
required GroupApplicationInfo info, required String gid,
required String reason, required String uid,
String? handleMsg,
String? operationID,
}) => }) =>
_channel.invokeMethod( _channel.invokeMethod(
'refuseGroupApplication', 'refuseGroupApplication',
_buildParam({ _buildParam({
'application': info.toJson(), 'gid': gid,
'reason': reason, 'uid': uid,
'handleMsg': handleMsg,
'operationID': Utils.checkOperationID(operationID),
})); }));
/// /// 解散群
// Future forceSyncApplyGroupRequest() { /// [groupID] 群ID
// return _channel.invokeMethod('forceSyncApplyGroupRequest', _buildParam({})); Future<dynamic> dismissGroup({
// } required String groupID,
String? operationID,
}) =>
_channel.invokeMethod(
'dismissGroup',
_buildParam({
'gid': groupID,
'operationID': Utils.checkOperationID(operationID),
}));
/// /// 开启群禁言,所有群成员禁止发言
// Future forceSyncGroupRequest() { /// [groupID] 将开启群禁言的组ID
// return _channel.invokeMethod('forceSyncGroupRequest', _buildParam({})); /// [mute] true开启false关闭
// } Future<dynamic> changeGroupMute({
required String groupID,
required bool mute,
String? operationID,
}) =>
_channel.invokeMethod(
'changeGroupMute',
_buildParam({
'gid': groupID,
'mute': mute,
'operationID': Utils.checkOperationID(operationID),
}));
/// /// 禁言群成员
// Future forceSyncJoinedGroup() { /// [groupID] 群ID
// return _channel.invokeMethod('forceSyncJoinedGroup', _buildParam({})); /// [userID] 将被禁言的成员ID
// } /// [seconds] 被禁言的时间s设置为0则为解除禁言
Future<dynamic> changeGroupMemberMute({
required String groupID,
required String userID,
int seconds = 0,
String? operationID,
}) =>
_channel.invokeMethod(
'changeGroupMemberMute',
_buildParam({
'gid': groupID,
'uid': userID,
'seconds': seconds,
'operationID': Utils.checkOperationID(operationID),
}));
/// /// 设置群成员昵称
// Future forceSyncJoinedGroupMember() { /// [groupID] 群ID
// return _channel.invokeMethod('forceSyncJoinedGroupMember', _buildParam({})); /// [userID] 群成员的用户ID
// } /// [groupNickname] 群昵称
Future<dynamic> setGroupMemberNickname({
required String groupID,
required String userID,
String? groupNickname,
String? operationID,
}) =>
_channel.invokeMethod(
'setGroupMemberNickname',
_buildParam({
'gid': groupID,
'uid': userID,
'groupNickname': groupNickname ?? '',
'operationID': Utils.checkOperationID(operationID),
}));
/// 查询群
/// [keywordList] 搜索关键词,目前仅支持一个关键词搜索,不能为空
/// [isSearchGroupID] 是否以关键词搜索群ID(注两个不可以同时为false)为空默认false
/// [isSearchGroupName] 是否以关键词搜索群名字为空默认false
Future<List<GroupInfo>> searchGroups({
List<String> keywordList = const [],
bool isSearchGroupID = false,
bool isSearchGroupName = false,
String? operationID,
}) =>
_channel
.invokeMethod(
'searchGroups',
_buildParam({
'searchParam': {
'keywordList': keywordList,
'isSearchGroupID': isSearchGroupID,
'isSearchGroupName': isSearchGroupName,
},
'operationID': Utils.checkOperationID(operationID),
}))
.then(
(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),
}));
static Map _buildParam(Map param) { static Map _buildParam(Map param) {
param["ManagerName"] = "groupManager"; param["ManagerName"] = "groupManager";
return param; return param;
} }
static dynamic _formatJson(value) => jsonDecode(_printValue(value));
static String _printValue(value) {
return value;
}
} }

View File

@@ -1,4 +1,3 @@
import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@@ -10,22 +9,30 @@ class IMManager {
late FriendshipManager friendshipManager; late FriendshipManager friendshipManager;
late MessageManager messageManager; late MessageManager messageManager;
late GroupManager groupManager; late GroupManager groupManager;
late UserManager userManager;
// late OfflinePushManager offlinePushManager; // late OfflinePushManager offlinePushManager;
// late SignalingManager signalingManager; late SignalingManager signalingManager;
late InitSDKListener _initSDKListener; late WorkMomentsManager workMomentsManager;
late OrganizationManager organizationManager;
late OnConnectListener _connectListener;
late String uid; late String uid;
late UserInfo uInfo; late UserInfo uInfo;
bool isInitialized = false;
bool isLogined = false; bool isLogined = false;
String? token;
String? _objectStorage;
IMManager(this._channel) { IMManager(this._channel) {
conversationManager = ConversationManager(_channel); conversationManager = ConversationManager(_channel);
friendshipManager = FriendshipManager(_channel); friendshipManager = FriendshipManager(_channel);
messageManager = MessageManager(_channel); messageManager = MessageManager(_channel);
groupManager = GroupManager(_channel); groupManager = GroupManager(_channel);
userManager = UserManager(_channel);
// offlinePushManager = OfflinePushManager(_channel); // offlinePushManager = OfflinePushManager(_channel);
// signalingManager = SignalingManager(_channel); signalingManager = SignalingManager(_channel);
workMomentsManager = WorkMomentsManager(_channel);
organizationManager = OrganizationManager(_channel);
_addNativeCallback(_channel); _addNativeCallback(_channel);
} }
@@ -33,143 +40,112 @@ class IMManager {
_channel.setMethodCallHandler((call) { _channel.setMethodCallHandler((call) {
try { try {
log('Flutter : $call'); log('Flutter : $call');
if (call.method == ListenerType.initSDKListener) { if (call.method == ListenerType.connectListener) {
String type = call.arguments['type'];
switch (type) {
case 'onConnectFailed':
int? errCode = call.arguments['errCode'];
String? errMsg = call.arguments['errMsg'];
_connectListener.connectFailed(errCode, errMsg);
break;
case 'onConnecting':
_connectListener.connecting();
break;
case 'onConnectSuccess':
_connectListener.connectSuccess();
break;
case 'onKickedOffline':
_connectListener.kickedOffline();
break;
case 'onUserSigExpired':
_connectListener.userSigExpired();
break;
}
} else if (call.method == ListenerType.userListener) {
String type = call.arguments['type']; String type = call.arguments['type'];
dynamic data = call.arguments['data']; dynamic data = call.arguments['data'];
switch (type) { switch (type) {
case 'onSelfInfoUpdated': case 'onSelfInfoUpdated':
uInfo = UserInfo.fromJson(_formatJson(data)); uInfo = Utils.toObj(data, (map) => UserInfo.fromJson(map));
_initSDKListener.selfInfoUpdated(uInfo); userManager.listener.selfInfoUpdated(uInfo);
break;
case 'onConnectFailed':
int? errCode = call.arguments['errCode'];
String? errMsg = call.arguments['errMsg'];
_initSDKListener.connectFailed(errCode, errMsg);
break;
case 'onConnecting':
_initSDKListener.connecting();
break;
case 'onConnectSuccess':
_initSDKListener.connectSuccess();
break;
case 'onKickedOffline':
_initSDKListener.kickedOffline();
break;
case 'onUserSigExpired':
_initSDKListener.userSigExpired();
break; break;
} }
} else if (call.method == ListenerType.groupListener) { } else if (call.method == ListenerType.groupListener) {
var args = call.arguments; String type = call.arguments['type'];
String type = args['type']; dynamic data = call.arguments['data'];
Map<dynamic, dynamic> map = args['data'];
switch (type) { switch (type) {
case 'onMemberEnter': case 'onGroupApplicationAccepted':
groupManager.groupListener.memberEnter( final i = Utils.toObj(
map['groupId'], data, (map) => GroupApplicationInfo.fromJson(map));
(_formatJson(map['memberList']) as List) groupManager.listener.groupApplicationAccepted(i);
.map((e) => GroupMembersInfo.fromJson(e))
.toList(),
);
break; break;
case 'onMemberLeave': case 'onGroupApplicationAdded':
groupManager.groupListener.memberLeave( final i = Utils.toObj(
map['groupId'], data, (map) => GroupApplicationInfo.fromJson(map));
GroupMembersInfo.fromJson(_formatJson(map['member'])), groupManager.listener.groupApplicationAdded(i);
);
break; break;
case 'onMemberInvited': case 'onGroupApplicationDeleted':
groupManager.groupListener.memberInvited( final i = Utils.toObj(
map['groupId'], data, (map) => GroupApplicationInfo.fromJson(map));
GroupMembersInfo.fromJson(_formatJson(map['opUser'])), groupManager.listener.groupApplicationDeleted(i);
(_formatJson(map['memberList']) as List)
.map((e) => GroupMembersInfo.fromJson(e))
.toList(),
);
break; break;
case 'onMemberKicked': case 'onGroupApplicationRejected':
groupManager.groupListener.memberKicked( final i = Utils.toObj(
map['groupId'], data, (map) => GroupApplicationInfo.fromJson(map));
GroupMembersInfo.fromJson(_formatJson(map['opUser'])), groupManager.listener.groupApplicationRejected(i);
(_formatJson(map['memberList']) as List)
.map((e) => GroupMembersInfo.fromJson(e))
.toList(),
);
break;
case 'onGroupCreated':
groupManager.groupListener.groupCreated(
map['groupId'],
);
break; break;
case 'onGroupInfoChanged': case 'onGroupInfoChanged':
groupManager.groupListener.groupInfoChanged( final i = Utils.toObj(data, (map) => GroupInfo.fromJson(map));
map['groupId'], groupManager.listener.groupInfoChanged(i);
GroupInfo.fromJson(_formatJson(map['groupInfo'])),
);
break; break;
case 'onReceiveJoinApplication': case 'onGroupMemberAdded':
groupManager.groupListener.receiveJoinApplication( final i =
map['groupId'], Utils.toObj(data, (map) => GroupMembersInfo.fromJson(map));
GroupMembersInfo.fromJson(_formatJson(map['member'])), groupManager.listener.groupMemberAdded(i);
map['opReason'],
);
break; break;
case 'onApplicationProcessed': case 'onGroupMemberDeleted':
groupManager.groupListener.applicationProcessed( final i =
map['groupId'], Utils.toObj(data, (map) => GroupMembersInfo.fromJson(map));
GroupMembersInfo.fromJson(_formatJson(map['opUser'])), groupManager.listener.groupMemberDeleted(i);
map['agreeOrReject'], break;
map['opReason'], case 'onGroupMemberInfoChanged':
); final i =
Utils.toObj(data, (map) => GroupMembersInfo.fromJson(map));
groupManager.listener.groupMemberInfoChanged(i);
break;
case 'onJoinedGroupAdded':
final i = Utils.toObj(data, (map) => GroupInfo.fromJson(map));
groupManager.listener.joinedGroupAdded(i);
break;
case 'onJoinedGroupDeleted':
final i = Utils.toObj(data, (map) => GroupInfo.fromJson(map));
groupManager.listener.joinedGroupDeleted(i);
break; break;
// case 'onMemberInfoChanged':
// break;
// case 'onGroupDismissed':
// break;
// case 'onGroupRecycled':
// break;
//
// case 'onGrantAdministrator':
// break;
// case 'onRevokeAdministrator':
// break;
// case 'onQuitFromGroup':
// break;
// case 'onReceiveRESTCustomData':
// break;
// case 'onGroupAttributeChanged':
// break;
} }
} 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'];
var msg = Message.fromJson(_formatJson(value)); final msg = Utils.toObj(value, (map) => Message.fromJson(map));
for (var listener in messageManager.advancedMsgListeners) { messageManager.msgListener.recvNewMessage(msg);
if (listener.id == id) {
listener.recvNewMessage(msg);
}
}
break; break;
case 'onRecvMessageRevoked': case 'onRecvMessageRevoked':
var value = call.arguments['data']['revokedMessage']; var msgID = call.arguments['data']['revokedMessage'];
for (var listener in messageManager.advancedMsgListeners) { messageManager.msgListener.recvMessageRevoked(msgID);
if (listener.id == id) {
listener.recvMessageRevoked(value);
}
}
break; break;
case 'onRecvC2CReadReceipt': case 'onRecvC2CReadReceipt':
var value = call.arguments['data']['haveReadMessage']; var value = call.arguments['data']['c2cMessageReadReceipt'];
var l = _formatJson(value) as List; var list =
var list = l.map((e) => HaveReadInfo.fromJson(e)).toList(); Utils.toList(value, (map) => ReadReceiptInfo.fromJson(map));
for (var listener in messageManager.advancedMsgListeners) { messageManager.msgListener.recvC2CMessageReadReceipt(list);
if (listener.id == id) { break;
listener.recvC2CReadReceipt(list); case 'onRecvGroupReadReceipt':
} var value = call.arguments['data']['groupMessageReadReceipt'];
} var list =
Utils.toList(value, (map) => ReadReceiptInfo.fromJson(map));
messageManager.msgListener.recvGroupMessageReadReceipt(list);
break; break;
} }
} else if (call.method == ListenerType.msgSendProgressListener) { } else if (call.method == ListenerType.msgSendProgressListener) {
@@ -190,212 +166,241 @@ class IMManager {
dynamic data = call.arguments['data']; dynamic data = call.arguments['data'];
switch (type) { switch (type) {
case 'onSyncServerStart': case 'onSyncServerStart':
conversationManager.conversationListener.syncServerStart(); conversationManager.listener.syncServerStart();
break; break;
case 'onSyncServerFinish': case 'onSyncServerFinish':
conversationManager.conversationListener.syncServerFinish(); conversationManager.listener.syncServerFinish();
break; break;
case 'onSyncServerFailed': case 'onSyncServerFailed':
conversationManager.conversationListener.syncServerFailed(); conversationManager.listener.syncServerFailed();
break; break;
case 'onNewConversation': case 'onNewConversation':
List<ConversationInfo> list = List.empty(growable: true); var list =
if (null != data) { Utils.toList(data, (map) => ConversationInfo.fromJson(map));
list = (_formatJson(data) as List) conversationManager.listener.newConversation(list);
.map((e) => ConversationInfo.fromJson(e))
.toList();
}
conversationManager.conversationListener.newConversation(list);
break; break;
case 'onConversationChanged': case 'onConversationChanged':
List<ConversationInfo> list = List.empty(growable: true); var list =
if (null != data) { Utils.toList(data, (map) => ConversationInfo.fromJson(map));
list = (_formatJson(data) as List) conversationManager.listener.conversationChanged(list);
.map((e) => ConversationInfo.fromJson(e))
.toList();
}
conversationManager.conversationListener
.conversationChanged(list);
break; break;
case 'onTotalUnreadMessageCountChanged': case 'onTotalUnreadMessageCountChanged':
conversationManager.conversationListener conversationManager.listener
.totalUnreadMessageCountChanged(data ?? 0); .totalUnreadMessageCountChanged(data ?? 0);
break; break;
} }
} else if (call.method == ListenerType.friendListener) { } else if (call.method == ListenerType.friendListener) {
String type = call.arguments['type']; String type = call.arguments['type'];
dynamic data = call.arguments['data']; dynamic data = call.arguments['data'];
UserInfo u = UserInfo.fromJson(_formatJson(data));
switch (type) { switch (type) {
case 'onBlackListAdd': case 'onBlacklistAdded':
friendshipManager.friendshipListener.blackListAdd(u); final u = Utils.toObj(data, (map) => BlacklistInfo.fromJson(map));
friendshipManager.listener.blacklistAdded(u);
break; break;
case 'onBlackListDeleted': case 'onBlacklistDeleted':
friendshipManager.friendshipListener.blackListDeleted(u); final u = Utils.toObj(data, (map) => BlacklistInfo.fromJson(map));
friendshipManager.listener.blacklistDeleted(u);
break; break;
case 'onFriendApplicationListAccept': case 'onFriendApplicationAccepted':
friendshipManager.friendshipListener final u = Utils.toObj(
.friendApplicationListAccept(u); data, (map) => FriendApplicationInfo.fromJson(map));
friendshipManager.listener.friendApplicationAccepted(u);
break; break;
case 'onFriendApplicationListAdded': case 'onFriendApplicationAdded':
friendshipManager.friendshipListener final u = Utils.toObj(
.friendApplicationListAdded(u); data, (map) => FriendApplicationInfo.fromJson(map));
friendshipManager.listener.friendApplicationAdded(u);
break; break;
case 'onFriendApplicationListDeleted': case 'onFriendApplicationDeleted':
friendshipManager.friendshipListener final u = Utils.toObj(
.friendApplicationListDeleted(u); data, (map) => FriendApplicationInfo.fromJson(map));
friendshipManager.listener.friendApplicationDeleted(u);
break; break;
case 'onFriendApplicationListReject': case 'onFriendApplicationRejected':
friendshipManager.friendshipListener final u = Utils.toObj(
.friendApplicationListReject(u); data, (map) => FriendApplicationInfo.fromJson(map));
friendshipManager.listener.friendApplicationRejected(u);
break; break;
case 'onFriendInfoChanged': case 'onFriendInfoChanged':
friendshipManager.friendshipListener.friendInfoChanged(u); final u = Utils.toObj(data, (map) => FriendInfo.fromJson(map));
friendshipManager.listener.friendInfoChanged(u);
break; break;
case 'onFriendListAdded': case 'onFriendAdded':
friendshipManager.friendshipListener.friendListAdded(u); final u = Utils.toObj(data, (map) => FriendInfo.fromJson(map));
friendshipManager.listener.friendAdded(u);
break; break;
case 'onFriendListDeleted': case 'onFriendDeleted':
friendshipManager.friendshipListener.friendListDeleted(u); final u = Utils.toObj(data, (map) => FriendInfo.fromJson(map));
friendshipManager.listener.friendDeleted(u);
break;
}
} else if (call.method == ListenerType.signalingListener) {
String type = call.arguments['type'];
dynamic data = call.arguments['data'];
final u = Utils.toObj(data, (map) => SignalingInfo.fromJson(map));
switch (type) {
case 'onInvitationCancelled':
signalingManager.listener.invitationCancelled(u);
break;
case 'onInvitationTimeout':
signalingManager.listener.invitationTimeout(u);
break;
case 'onInviteeAccepted':
signalingManager.listener.inviteeAccepted(u);
break;
case 'onInviteeRejected':
signalingManager.listener.inviteeRejected(u);
break;
case 'onReceiveNewInvitation':
signalingManager.listener.receiveNewInvitation(u);
break;
case 'onInviteeAcceptedByOtherDevice':
signalingManager.listener.inviteeAcceptedByOtherDevice(u);
break;
case 'onInviteeRejectedByOtherDevice':
signalingManager.listener.inviteeRejectedByOtherDevice(u);
break;
case 'onHangUp':
signalingManager.listener.hangup(u);
break;
}
} else if (call.method == ListenerType.workMomentsListener) {
String type = call.arguments['type'];
switch (type) {
case 'OnRecvNewNotification':
workMomentsManager.listener.recvNewNotification();
break;
}
} else if (call.method == ListenerType.organizationListener) {
String type = call.arguments['type'];
switch (type) {
case 'onOrganizationUpdated':
organizationManager.listener.organizationUpdated();
break; break;
} }
} }
} catch (err) { } catch (err) {
print( print(
"回调失败了,数据类型异常$err ${call.method} ${call.arguments['type']} ${call.arguments['data']}"); "回调失败了。$err ${call.method} ${call.arguments['type']} ${call.arguments['data']}");
} }
return Future.value(null); return Future.value(null);
}); });
} }
/// Initialize SDK
///
/// [platform] Refer to [IMPlatform]
/// [ipApi] Api server ip address
/// [ipWs] WebSocket ip address
/// [dbPath] Data storage directory
/// 初始化SDK /// 初始化SDK
/// [platform] 平台编号[IMPlatform] /// [platform] 平台编号[IMPlatform]
/// [ipApi] SDK api地址 /// [apiAddr] SDK api地址
/// [ipWs] SDK websocket地址 /// [wsAddr] SDK websocket地址
/// [dbPath] SDK数据库存储目录 /// [dataDir] SDK数据库存储目录
/// [objectStorage] 存储对象 cos/minio
/// [logLevel] 日志 1不打印
Future<dynamic> initSDK({ Future<dynamic> initSDK({
required int platform, required int platform,
required String ipApi, required String apiAddr,
required String ipWs, required String wsAddr,
required String dbPath, required String dataDir,
required InitSDKListener listener, required OnConnectListener listener,
int logLevel = 6,
String objectStorage = 'cos',
String? operationID,
}) { }) {
_initSDKListener = listener; this._connectListener = listener;
return _channel this._objectStorage = objectStorage;
.invokeMethod( return _channel.invokeMethod(
'initSDK', 'initSDK',
_buildParam( _buildParam(
{ {
"platform": platform, "platform": platform,
"ipApi": ipApi, "api_addr": apiAddr,
"ipWs": ipWs, "ws_addr": wsAddr,
"dbDir": dbPath "data_dir": dataDir,
}, "log_level": logLevel,
)) "object_storage": objectStorage,
.then((value) => isInitialized = true); "operationID": Utils.checkOperationID(operationID),
},
));
} }
@deprecated /// 反初始化SDK
Future<dynamic> unInitSDK() { Future<dynamic> unInitSDK() {
return _channel.invokeMethod('unInitSDK', _buildParam({})).then((value) { return _channel.invokeMethod('unInitSDK', _buildParam({}));
isInitialized = false;
return value;
});
} }
/// Login sdk
/// 登录 /// 登录
Future<UserInfo> login({required String uid, required String token}) async { /// [uid] 用户id
this.uid = uid; /// [token] 登录token从业务服务器上获取
Future<UserInfo> login({
required String uid,
required String token,
String? operationID,
}) async {
await _channel.invokeMethod( await _channel.invokeMethod(
'login', 'login',
_buildParam({'uid': uid, 'token': token}), _buildParam({
'uid': uid,
'token': token,
'operationID': Utils.checkOperationID(operationID),
}),
); );
this.isLogined = true; this.isLogined = true;
this.uInfo = (await getUsersInfo([uid])).first; this.uid = uid;
this.token = token;
this.uInfo = await userManager.getSelfUserInfo();
return uInfo; return uInfo;
} }
/// Logout sdk
/// 登出 /// 登出
Future<dynamic> logout() async { Future<dynamic> logout({String? operationID}) async {
var value = await _channel.invokeMethod('logout', _buildParam({})); var value = await _channel.invokeMethod(
'logout',
_buildParam({
'operationID': Utils.checkOperationID(operationID),
}));
this.isLogined = false; this.isLogined = false;
this.token = null;
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> getLoginUid() async => uid; Future<String> getLoginUserID() async => uid;
/// Current user info
/// 获取当前登录用户信息 /// 获取当前登录用户信息
Future<UserInfo> getLoginUserInfo() async => uInfo; Future<UserInfo> getLoginUserInfo() async => uInfo;
/// Modify current user info /// 从后台回到前台立刻唤醒
/// 修改当前登录用户资料 Future wakeUp({String? operationID}) => _channel.invokeMethod(
Future<String?> setSelfInfo( 'wakeUp',
{String? name, _buildParam({
String? icon, 'operationID': Utils.checkOperationID(operationID),
int? gender, }));
String? mobile,
String? birth, /// 上传图片到服务器
String? email, /// [path] 图片路径
String? ex}) => /// [token] im token
/// [objectStorage] 存储对象 cos/minio
Future uploadImage({
required String path,
String? token,
String? objectStorage,
String? operationID,
}) =>
_channel.invokeMethod( _channel.invokeMethod(
'setSelfInfo', 'uploadImage',
_buildParam({ _buildParam({
'uid': uid, 'path': path,
'name': name, 'token': token ?? this.token,
'icon': icon, 'obj': objectStorage ?? this._objectStorage,
'gender': gender, 'operationID': Utils.checkOperationID(operationID),
'mobile': mobile,
'birth': birth,
'email': email,
'ex': ex,
})); }));
/// Query user information
/// 查询用户信息
Future<List<UserInfo>> getUsersInfo(List<String> uidList) => _channel
.invokeMethod('getUsersInfo', _buildParam({'uidList': uidList}))
.then((value) => _toList(value));
///
Future enabledSDKLog({required bool enabled}) => _channel.invokeMethod(
'setSdkLog', _buildParam({'sdkLog': enabled ? 0 : 1}));
///
Future<dynamic> forceSyncLoginUerInfo(List<String> uidList) =>
_channel.invokeMethod('forceSyncLoginUerInfo', _buildParam({}));
///
// Future<dynamic> forceReConn() {
// return _channel.invokeMethod('forceReConn', _buildParam({}));
// }
static Map _buildParam(Map param) { static Map _buildParam(Map param) {
param["ManagerName"] = "imManager"; param["ManagerName"] = "imManager";
return param; return param;
} }
static List<UserInfo> _toList(String value) =>
(_formatJson(value) as List).map((e) => UserInfo.fromJson(e)).toList();
static dynamic _formatJson(value) => jsonDecode(_printValue(value));
static String _printValue(value) {
return value;
}
} }

View File

@@ -1,223 +1,317 @@
import 'dart:convert';
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';
class MessageManager { class MessageManager {
MethodChannel _channel; MethodChannel _channel;
List<AdvancedMsgListener> advancedMsgListeners = List.empty(growable: true);
MsgSendProgressListener? msgSendProgressListener; // List<AdvancedMsgListener> advancedMsgListeners = List.empty(growable: true);
OnMsgSendProgressListener? msgSendProgressListener;
late OnAdvancedMsgListener msgListener;
MessageManager(this._channel); MessageManager(this._channel);
/// Add a message listener
/// 消息监听 /// 消息监听
Future addAdvancedMsgListener(AdvancedMsgListener listener) { Future setAdvancedMsgListener(OnAdvancedMsgListener listener) {
advancedMsgListeners.add(listener); this.msgListener = listener;
// advancedMsgListeners.add(listener);
return _channel.invokeMethod( return _channel.invokeMethod(
'addAdvancedMsgListener', 'setAdvancedMsgListener',
_buildParam({ _buildParam({
'id': listener.id, 'id': listener.id,
})); }));
} }
/// Remove a message listener
@deprecated
Future removeAdvancedMsgListener(AdvancedMsgListener listener) {
advancedMsgListeners.remove(listener);
return _channel.invokeMethod(
'removeAdvancedMsgListener',
_buildParam({
'id': listener.id,
}));
}
/// Set up message sending progress monitoring
/// 消息发送进度监听 /// 消息发送进度监听
void setMsgSendProgressListener(MsgSendProgressListener 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
Future<dynamic> sendMessage({ /// [groupID] 接收消息的组id
/// [offlinePushInfo] 离线消息显示内容
Future<Message> sendMessage({
required Message message, required Message message,
required OfflinePushInfo offlinePushInfo,
String? userID, String? userID,
String? groupID, String? groupID,
bool onlineUserOnly = false, String? operationID,
}) => }) =>
_channel.invokeMethod( _channel
'sendMessage', .invokeMethod(
_buildParam({ 'sendMessage',
'message': message.toJson(), _buildParam({
'userID': userID ?? '', 'message': message.toJson(),
'groupID': groupID ?? '', 'offlinePushInfo': offlinePushInfo.toJson(),
'onlineUserOnly': onlineUserOnly, 'userID': userID ?? '',
})) /*.then((value) => _toObj(value))*/; 'groupID': groupID ?? '',
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Find all history message /// 获取聊天记录(以startMsg为节点以前的聊天记录)
/// 获取聊天记录 /// [userID] 接收消息的用户id
/// [userID]接收消息的用户id /// [conversationID] 会话id查询通知时可用
/// [groupID]接收消息的组id /// [groupID] 接收消息的组id
/// [startMsg] 从这条消息开始查询[count]条获取的列表index==length-1为最新消息所以获取下一页历史记录startMsg=list.first
/// [count] 一次拉取的总数
Future<List<Message>> getHistoryMessageList({ Future<List<Message>> getHistoryMessageList({
String? userID, String? userID,
String? groupID, String? groupID,
String? conversationID,
Message? startMsg, Message? startMsg,
int? count, int? count,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
'getHistoryMessageList', 'getHistoryMessageList',
_buildParam({ _buildParam({
'userID': userID ?? '', 'userID': userID ?? '',
'startMsg': startMsg?.toJson() /*?? {}*/,
'groupID': groupID ?? '', 'groupID': groupID ?? '',
'conversationID': conversationID ?? '',
'startClientMsgID': startMsg?.clientMsgID ?? '',
'count': count ?? 10, 'count': count ?? 10,
'operationID': Utils.checkOperationID(operationID),
})) }))
.then((value) => _toList(value)); .then((value) => Utils.toList(value, (map) => Message.fromJson(map)));
/// Revoke the sent information
/// 撤回消息 /// 撤回消息
Future revokeMessage({required Message message}) => /// [message] 被撤回的消息体
_channel.invokeMethod('revokeMessage', _buildParam(message.toJson())); Future revokeMessage({
required Message message,
/// Delete message String? operationID,
/// 删除消息 }) =>
Future deleteMessageFromLocalStorage({required Message message}) =>
_channel.invokeMethod( _channel.invokeMethod(
'deleteMessageFromLocalStorage', _buildParam(message.toJson())); 'revokeMessage',
_buildParam(message.toJson()
..addAll({
"operationID": Utils.checkOperationID(operationID),
})));
/// /// 删除本地消息
@deprecated /// [message] 被删除的消息体
Future deleteMessages({required List<Message> msgList}) => Future deleteMessageFromLocalStorage({
_channel.invokeMethod('deleteMessages', required Message message,
_buildParam({"msgList": msgList.map((e) => e.toJson()).toList()})); String? operationID,
}) =>
_channel.invokeMethod(
'deleteMessageFromLocalStorage',
_buildParam(message.toJson()
..addAll({
"operationID": Utils.checkOperationID(operationID),
})));
/// /// 插入单聊消息到本地
Future insertSingleMessageToLocalStorage({ /// [receiverID] 接收者id
/// [senderID] 发送者id
/// [message] 消息体
Future<Message> insertSingleMessageToLocalStorage({
String? receiverID, String? receiverID,
String? senderID, String? senderID,
Message? message, Message? message,
String? operationID,
}) => }) =>
_channel.invokeMethod( _channel
'insertSingleMessageToLocalStorage', .invokeMethod(
_buildParam({ 'insertSingleMessageToLocalStorage',
"message": message?.toJson(), _buildParam({
"receiverID": receiverID, "message": message?.toJson(),
"senderID": senderID, "receiverID": receiverID,
})); "senderID": senderID,
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Query the message according to the message id /// 插入群聊消息到本地
Future findMessages({required List<String> messageIDList}) => /// [groupID] 群id
_channel.invokeMethod( /// [senderID] 发送者id
'findMessages', /// [message] 消息体
_buildParam({ Future<Message> insertGroupMessageToLocalStorage({
"messageIDList": messageIDList, String? groupID,
})); String? senderID,
Message? message,
String? operationID,
}) =>
_channel
.invokeMethod(
'insertGroupMessageToLocalStorage',
_buildParam({
"message": message?.toJson(),
"groupID": groupID,
"senderID": senderID,
"operationID": Utils.checkOperationID(operationID),
}))
.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,
String? operationID,
}) => }) =>
_channel.invokeMethod( _channel.invokeMethod(
'markC2CMessageAsRead', 'markC2CMessageAsRead',
_buildParam({ _buildParam({
"messageIDList": messageIDList, "messageIDList": messageIDList,
"userID": userID, "userID": userID,
"operationID": Utils.checkOperationID(operationID),
}));
/// 标记群聊消息已读
/// [groupID] 群id
/// [messageIDList] 消息clientMsgID集合
Future markGroupMessageAsRead({
required String groupID,
required List<String> messageIDList,
String? operationID,
}) =>
_channel.invokeMethod(
'markGroupMessageAsRead',
_buildParam({
"messageIDList": messageIDList,
"groupID": groupID,
"operationID": Utils.checkOperationID(operationID),
})); }));
/// Typing
/// 正在输入提示 /// 正在输入提示
/// [msgTip] 自定义内容
Future typingStatusUpdate({ Future typingStatusUpdate({
required String userID, required String userID,
bool typing = false, String? msgTip,
String? operationID,
}) => }) =>
_channel.invokeMethod( _channel.invokeMethod(
'typingStatusUpdate', 'typingStatusUpdate',
_buildParam({ _buildParam({
"typing": typing ? 'yes' : 'no', "msgTip": msgTip,
"userID": userID, "userID": userID,
"operationID": Utils.checkOperationID(operationID),
})); }));
/// Create text message
/// 创建文本消息 /// 创建文本消息
Future<Message> createTextMessage({required String text}) => _channel Future<Message> createTextMessage({
.invokeMethod('createTextMessage', _buildParam({'text': text})) required String text,
.then((value) => _toObj(value)); String? operationID,
}) =>
_channel
.invokeMethod(
'createTextMessage',
_buildParam({
'text': text,
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create @ message
/// 创建@消息 /// 创建@消息
/// [text] 输入内容
/// [atUserIDList] 被@到的userID集合
/// [atUserInfoList] userID跟nickname映射关系用在界面显示时将id替换为nickname
/// [quoteMessage] 引用消息(被回复的消息)
Future<Message> createTextAtMessage({ Future<Message> createTextAtMessage({
required String text, required String text,
required List<String> atUidList, required List<String> atUserIDList,
List<AtUserInfo> atUserInfoList = const [],
Message? quoteMessage,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
'createTextAtMessage', 'createTextAtMessage',
_buildParam({ _buildParam({
'text': text, 'text': text,
'atUserList': atUidList, 'atUserIDList': atUserIDList,
'atUserInfoList': atUserInfoList.map((e) => e.toJson()).toList(),
'quoteMessage': quoteMessage?.toJson(),
"operationID": Utils.checkOperationID(operationID),
}), }),
) )
.then((value) => _toObj(value)); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create picture message
/// 创建图片消息 /// 创建图片消息
Future<Message> createImageMessage({required String imagePath}) => _channel /// [imagePath] 路径
.invokeMethod( Future<Message> createImageMessage({
'createImageMessage', required String imagePath,
_buildParam({'imagePath': imagePath}), String? operationID,
) }) =>
.then((value) => _toObj(value)); _channel
.invokeMethod(
'createImageMessage',
_buildParam({
'imagePath': imagePath,
"operationID": Utils.checkOperationID(operationID),
}),
)
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create picture message
/// 创建图片消息 /// 创建图片消息
Future<Message> createImageMessageFromFullPath({required String imagePath}) => /// [imagePath] 路径
Future<Message> createImageMessageFromFullPath({
required String imagePath,
String? operationID,
}) =>
_channel _channel
.invokeMethod( .invokeMethod(
'createImageMessageFromFullPath', 'createImageMessageFromFullPath',
_buildParam({'imagePath': imagePath}), _buildParam({
'imagePath': imagePath,
"operationID": Utils.checkOperationID(operationID),
}),
) )
.then((value) => _toObj(value)); .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,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
'createSoundMessage', 'createSoundMessage',
_buildParam({'soundPath': soundPath, "duration": duration}), _buildParam({
'soundPath': soundPath,
"duration": duration,
"operationID": Utils.checkOperationID(operationID),
}),
) )
.then((value) => _toObj(value)); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create sound message
/// 创建语音消息 /// 创建语音消息
/// [soundPath] 路径
/// [duration] 时长s
Future<Message> createSoundMessageFromFullPath({ Future<Message> createSoundMessageFromFullPath({
required String soundPath, required String soundPath,
required int duration, required int duration,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
'createSoundMessageFromFullPath', 'createSoundMessageFromFullPath',
_buildParam({'soundPath': soundPath, "duration": duration}), _buildParam({
'soundPath': soundPath,
"duration": duration,
"operationID": Utils.checkOperationID(operationID),
}),
) )
.then((value) => _toObj(value)); .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,
required int duration, required int duration,
required String snapshotPath, required String snapshotPath,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
@@ -227,16 +321,21 @@ class MessageManager {
'videoType': videoType, 'videoType': videoType,
'duration': duration, 'duration': duration,
'snapshotPath': snapshotPath, 'snapshotPath': snapshotPath,
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => _toObj(value)); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create video message
/// 创建视频消息 /// 创建视频消息
/// [videoPath] 路径
/// [videoType] 视频mime类型
/// [duration] 时长s
/// [snapshotPath] 默认站位图路径
Future<Message> createVideoMessageFromFullPath({ Future<Message> createVideoMessageFromFullPath({
required String videoPath, required String videoPath,
required String videoType, required String videoType,
required int duration, required int duration,
required String snapshotPath, required String snapshotPath,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
@@ -246,14 +345,17 @@ class MessageManager {
'videoType': videoType, 'videoType': videoType,
'duration': duration, 'duration': duration,
'snapshotPath': snapshotPath, 'snapshotPath': snapshotPath,
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => _toObj(value)); .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,
String? operationID,
}) { }) {
return _channel return _channel
.invokeMethod( .invokeMethod(
@@ -261,15 +363,18 @@ class MessageManager {
_buildParam({ _buildParam({
'filePath': filePath, 'filePath': filePath,
'fileName': fileName, 'fileName': fileName,
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => _toObj(value)); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
} }
/// Create file message
/// 创建文件消息 /// 创建文件消息
/// [filePath] 路径
/// [fileName] 文件名
Future<Message> createFileMessageFromFullPath({ Future<Message> createFileMessageFromFullPath({
required String filePath, required String filePath,
required String fileName, required String fileName,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
@@ -277,15 +382,19 @@ class MessageManager {
_buildParam({ _buildParam({
'filePath': filePath, 'filePath': filePath,
'fileName': fileName, 'fileName': fileName,
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => _toObj(value)); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create merger message
/// 创建合并消息 /// 创建合并消息
/// [messageList] 被选中的消息
/// [title] 摘要标题
/// [summaryList] 摘要内容
Future<Message> createMergerMessage({ Future<Message> createMergerMessage({
required List<Message> messageList, required List<Message> messageList,
required String title, required String title,
required List<String> summaryList, required List<String> summaryList,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
@@ -294,27 +403,35 @@ class MessageManager {
'messageList': messageList.map((e) => e.toJson()).toList(), 'messageList': messageList.map((e) => e.toJson()).toList(),
'title': title, 'title': title,
'summaryList': summaryList, 'summaryList': summaryList,
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => _toObj(value)); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create forward message
/// 创建转发消息 /// 创建转发消息
Future<Message> createForwardMessage({required Message message}) { /// [message] 被转发的消息
Future<Message> createForwardMessage({
required Message message,
String? operationID,
}) {
return _channel return _channel
.invokeMethod( .invokeMethod(
'createForwardMessage', 'createForwardMessage',
_buildParam({ _buildParam({
'message': message.toJson(), 'message': message.toJson(),
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => _toObj(value)); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
} }
/// Create location message
/// 创建位置消息 /// 创建位置消息
/// [latitude] 纬度
/// [longitude] 经度
/// [description] 自定义描述信息
Future<Message> createLocationMessage({ Future<Message> createLocationMessage({
required double latitude, required double latitude,
required double longitude, required double longitude,
required String description, required String description,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
@@ -323,15 +440,19 @@ class MessageManager {
'latitude': latitude, 'latitude': latitude,
'longitude': longitude, 'longitude': longitude,
'description': description, 'description': description,
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => _toObj(value)); .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,
required String description, required String description,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
@@ -340,14 +461,17 @@ class MessageManager {
'data': data, 'data': data,
'extension': extension, 'extension': extension,
'description': description, 'description': description,
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => _toObj(value)); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create quote message
/// 创建引用消息 /// 创建引用消息
/// [text] 回复的内容
/// [quoteMsg] 被回复的消息
Future<Message> createQuoteMessage({ Future<Message> createQuoteMessage({
required String text, required String text,
required Message quoteMsg, required Message quoteMsg,
String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
@@ -355,50 +479,215 @@ class MessageManager {
_buildParam({ _buildParam({
'quoteText': text, 'quoteText': text,
'quoteMessage': quoteMsg.toJson(), 'quoteMessage': quoteMsg.toJson(),
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => _toObj(value)); .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,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
'createCardMessage', 'createCardMessage',
_buildParam({ _buildParam({
'cardMessage': data, 'cardMessage': data,
"operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => _toObj(value)); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// 创建自定义表情消息
/// [index] 位置表情根据index匹配
/// [data] url表情直接使用url显示
Future<Message> createFaceMessage({
int index = -1,
String? data,
String? operationID,
}) =>
_channel
.invokeMethod(
'createFaceMessage',
_buildParam({
'index': index,
'data': data,
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Clear all c2c history message
/// 清空单聊消息记录 /// 清空单聊消息记录
Future<dynamic> clearC2CHistoryMessage({required String uid}) => _channel /// [uid] 单聊对象id
.invokeMethod('clearC2CHistoryMessage', _buildParam({"userID": uid})); Future<dynamic> clearC2CHistoryMessage({
required String uid,
String? operationID,
}) =>
_channel.invokeMethod(
'clearC2CHistoryMessage',
_buildParam({
"userID": uid,
"operationID": Utils.checkOperationID(operationID),
}));
/// Clear all group history
/// 清空组消息记录 /// 清空组消息记录
Future<dynamic> clearGroupHistoryMessage({required String gid}) => _channel /// [gid] 组id
.invokeMethod('clearGroupHistoryMessage', _buildParam({"groupID": gid})); Future<dynamic> clearGroupHistoryMessage({
required String gid,
String? operationID,
}) =>
_channel.invokeMethod(
'clearGroupHistoryMessage',
_buildParam({
"groupID": gid,
"operationID": Utils.checkOperationID(operationID),
}));
/// /// 搜索消息
// void forceSyncMsg() { /// [conversationID] 根据会话查询如果是全局搜索传null
// _channel.invokeMethod('forceSyncMsg', _buildParam({})); /// [keywordList] 搜索关键词列表,目前仅支持一个关键词搜索
// } /// [keywordListMatchType] 关键词匹配模式1代表与2代表或暂时未用
/// [senderUserIDList] 指定消息发送的uid列表 暂时未用
/// [messageTypeList] 消息类型列表
/// [searchTimePosition] 搜索的起始时间点。默认为0即代表从现在开始搜索。UTC 时间戳,单位:秒
/// [searchTimePeriod] 从起始时间点开始的过去时间范围单位秒。默认为0即代表不限制时间范围传24x60x60代表过去一天
/// [pageIndex] 当前页数
/// [count] 每页数量
Future<SearchResult> searchLocalMessages({
String? conversationID,
List<String> keywordList = const [],
int keywordListMatchType = 0,
List<String> senderUserIDList = const [],
List<int> messageTypeList = const [],
int searchTimePosition = 0,
int searchTimePeriod = 0,
int pageIndex = 1,
int count = 40,
String? operationID,
}) =>
_channel
.invokeMethod(
'searchLocalMessages',
_buildParam({
'filter': {
'conversationID': conversationID,
'keywordList': keywordList,
'keywordListMatchType': keywordListMatchType,
'senderUserIDList': senderUserIDList,
'messageTypeList': messageTypeList,
'searchTimePosition': searchTimePosition,
'searchTimePeriod': searchTimePeriod,
'pageIndex': pageIndex,
'count': count,
},
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toObj(value, (map) => SearchResult.fromJson(map)));
/// 删除本地跟服务器的指定的消息
/// [message] 被删除的消息
Future<dynamic> deleteMessageFromLocalAndSvr({
required Message message,
String? operationID,
}) =>
_channel.invokeMethod(
'deleteMessageFromLocalAndSvr',
_buildParam(message.toJson()
..addAll({
"operationID": Utils.checkOperationID(operationID),
})));
/// 删除本地所有聊天记录
Future<dynamic> deleteAllMsgFromLocal({
String? operationID,
}) =>
_channel.invokeMethod(
'deleteAllMsgFromLocal',
_buildParam({
"operationID": Utils.checkOperationID(operationID),
}));
/// 删除本地跟服务器所有聊天记录
Future<dynamic> deleteAllMsgFromLocalAndSvr({
String? operationID,
}) =>
_channel.invokeMethod(
'deleteAllMsgFromLocalAndSvr',
_buildParam({
"operationID": Utils.checkOperationID(operationID),
}));
/// 标记消息已读
/// [conversationID] 会话ID
/// [messageIDList] 被标记的消息clientMsgID
Future markMessageAsReadByConID({
required String conversationID,
required List<String> messageIDList,
String? operationID,
}) =>
_channel.invokeMethod(
'markMessageAsReadByConID',
_buildParam({
"messageIDList": messageIDList,
"conversationID": conversationID,
"operationID": Utils.checkOperationID(operationID),
}));
/// 删除本地跟服务器的单聊聊天记录
/// [uid] 聊天对象的userID
Future<dynamic> clearC2CHistoryMessageFromLocalAndSvr({
required String uid,
String? operationID,
}) =>
_channel.invokeMethod(
'clearC2CHistoryMessageFromLocalAndSvr',
_buildParam({
"userID": uid,
"operationID": Utils.checkOperationID(operationID),
}));
/// 删除本地跟服务器的群聊天记录
/// [gid] 组id
Future<dynamic> clearGroupHistoryMessageFromLocalAndSvr({
required String gid,
String? operationID,
}) =>
_channel.invokeMethod(
'clearGroupHistoryMessageFromLocalAndSvr',
_buildParam({
"groupID": gid,
"operationID": Utils.checkOperationID(operationID),
}));
/// 获取聊天记录(以startMsg为节点新收到的聊天记录),用在全局搜索定位某一条消息,然后此条消息后新增的消息
/// [userID] 接收消息的用户id
/// [conversationID] 会话id查询通知时可用
/// [groupID] 接收消息的组id
/// [startMsg] 从这条消息开始查询[count]条获取的列表index==length-1为最新消息所以获取下一页历史记录startMsg=list.last
/// [count] 一次拉取的总数
Future<List<Message>> getHistoryMessageListReverse({
String? userID,
String? groupID,
String? conversationID,
Message? startMsg,
int? count,
String? operationID,
}) =>
_channel
.invokeMethod(
'getHistoryMessageListReverse',
_buildParam({
'userID': userID ?? '',
'groupID': groupID ?? '',
'conversationID': conversationID ?? '',
'startClientMsgID': startMsg?.clientMsgID ?? '',
'count': count ?? 10,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (map) => Message.fromJson(map)));
static Map _buildParam(Map param) { static Map _buildParam(Map param) {
param["ManagerName"] = "messageManager"; param["ManagerName"] = "messageManager";
return param; return param;
} }
static List<Message> _toList(String value) =>
(_formatJson(value) as List).map((e) => Message.fromJson(e)).toList();
static Message _toObj(String value) => Message.fromJson(_formatJson(value));
static dynamic _formatJson(value) => jsonDecode(_printValue(value));
static String _printValue(value) {
return value;
}
} }

View File

@@ -0,0 +1,162 @@
import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class OrganizationManager {
MethodChannel _channel;
late OnOrganizationListener listener;
OrganizationManager(this._channel);
/// 组织架构发生变化回调
Future setOrganizationListener(OnOrganizationListener listener) {
this.listener = listener;
return _channel.invokeMethod('setOrganizationListener', _buildParam({}));
}
/// 获取子部门列表,返回当前部门下的一级子部门
/// [departmentID] 当前部门id
/// [offset] 开始下标
/// [count] 每页大小
Future<List<DeptInfo>> getSubDept({
required String departmentID,
int offset = 0,
int count = 40,
String? operationID,
}) =>
_channel
.invokeMethod(
'getSubDepartment',
_buildParam({
'departmentID': departmentID,
'offset': offset,
'count': count,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (v) => DeptInfo.fromJson(v)));
/// 获取部门下的成员列表,返回当前部门下的一级成员
/// [departmentID] 当前部门id
/// [offset] 开始下标
/// [count] 每页大小
Future<List<DeptMemberInfo>> getDeptMember({
required String departmentID,
int offset = 0,
int count = 40,
String? operationID,
}) =>
_channel
.invokeMethod(
'getDepartmentMember',
_buildParam({
'departmentID': departmentID,
'offset': offset,
'count': count,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (v) => DeptMemberInfo.fromJson(v)));
/// 获取成员所在的部门
/// [userID] 成员ID
Future<List<UserInDept>> getUserInDept({
required String userID,
String? operationID,
}) =>
_channel
.invokeMethod(
'getUserInDepartment',
_buildParam({
'userID': userID,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (v) => UserInDept.fromJson(v)));
/// 获取部门下的子部门跟员工
/// [departmentID] 当前部门id
Future<DeptMemberAndSubDept> getDeptMemberAndSubDept({
required String departmentID,
// int departmentOffset = 0,
// int departmentCount = 40,
// int memberOffset = 0,
// int memberCount = 40,
String? operationID,
}) =>
_channel
.invokeMethod(
'getDepartmentMemberAndSubDepartment',
_buildParam({
'departmentID': departmentID,
// 'departmentOffset': departmentOffset,
// 'departmentCount': departmentCount,
// 'memberOffset': memberOffset,
// 'memberCount': memberCount,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
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({
'searchParams': {
'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) {
param["ManagerName"] = "organizationManager";
return param;
}
}

View File

@@ -1,7 +1,108 @@
// import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
//
// class SignalingManager { import '../../flutter_openim_sdk.dart';
// MethodChannel _channel;
// class SignalingManager {
// SignalingManager(this._channel); MethodChannel _channel;
// } late OnSignalingListener listener;
SignalingManager(this._channel);
/// 信令监听
Future setSignalingListener(OnSignalingListener listener) {
this.listener = listener;
return _channel.invokeMethod('setSignalingListener', _buildParam({}));
}
/// 邀请个人加入音视频
/// [info] 信令对象[SignalingInfo]
Future<SignalingCertificate> signalingInvite({
required SignalingInfo info,
String? operationID,
}) =>
_channel
.invokeMethod(
'signalingInvite',
_buildParam({
'signalingInfo': info.toJson(),
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toObj(value, (map) => SignalingCertificate.fromJson(map)));
/// 邀请群里某些人加入音视频
/// [info] 信令对象[SignalingInfo]
Future<SignalingCertificate> signalingInviteInGroup({
required SignalingInfo info,
String? operationID,
}) =>
_channel
.invokeMethod(
'signalingInviteInGroup',
_buildParam({
'signalingInfo': info.toJson(),
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toObj(value, (map) => SignalingCertificate.fromJson(map)));
/// 同意某人音视频邀请
/// [info] 信令对象[SignalingInfo]
Future<SignalingCertificate> signalingAccept({
required SignalingInfo info,
String? operationID,
}) =>
_channel
.invokeMethod(
'signalingAccept',
_buildParam({
'signalingInfo': info.toJson(),
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toObj(value, (map) => SignalingCertificate.fromJson(map)));
/// 拒绝某人音视频邀请
/// [info] 信令对象[SignalingInfo]
Future<dynamic> signalingReject({
required SignalingInfo info,
String? operationID,
}) =>
_channel.invokeMethod(
'signalingReject',
_buildParam({
'signalingInfo': info.toJson(),
'operationID': Utils.checkOperationID(operationID),
}));
/// 邀请者取消音视频通话
/// [info] 信令对象[SignalingInfo]
Future<dynamic> signalingCancel({
required SignalingInfo info,
String? operationID,
}) =>
_channel.invokeMethod(
'signalingCancel',
_buildParam({
'signalingInfo': info.toJson(),
'operationID': Utils.checkOperationID(operationID),
}));
/// 挂断
/// [info] 信令对象[SignalingInfo]
Future<dynamic> signalingHungUp({
required SignalingInfo info,
String? operationID,
}) =>
_channel.invokeMethod(
'signalingHungUp',
_buildParam({
'signalingInfo': info.toJson(),
'operationID': Utils.checkOperationID(operationID),
}));
static Map _buildParam(Map param) {
param["ManagerName"] = "signalingManager";
return param;
}
}

View File

@@ -0,0 +1,82 @@
import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class UserManager {
MethodChannel _channel;
late OnUserListener listener;
UserManager(this._channel);
/// 用户资料改变监听
Future setUserListener(OnUserListener listener) {
this.listener = listener;
return _channel.invokeMethod('setUserListener', _buildParam({}));
}
/// 获取用户资料
/// [uidList] 用户ID列表
Future<List<UserInfo>> getUsersInfo({
required List<String> uidList,
String? operationID,
}) =>
_channel
.invokeMethod(
'getUsersInfo',
_buildParam({
'uidList': uidList,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (v) => UserInfo.fromJson(v)));
/// 获取当前登录用户的信息
Future<UserInfo> getSelfUserInfo({
String? operationID,
}) =>
_channel
.invokeMethod(
'getSelfUserInfo',
_buildParam({
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toObj(value, (map) => UserInfo.fromJson(map)));
/// 修改当前登录用户资料
/// [nickname] 昵称
/// [faceURL] 头像
/// [gender] 性别
/// [appMangerLevel]
/// [phoneNumber] 手机号
/// [birth] 出生日期
/// [email] 邮箱
/// [ex] 扩展字段
Future<String?> setSelfInfo({
String? nickname,
String? faceURL,
int? gender,
int? appMangerLevel,
String? phoneNumber,
int? birth,
String? email,
String? ex,
String? operationID,
}) =>
_channel.invokeMethod(
'setSelfInfo',
_buildParam({
// 'userID': userID,
'nickname': nickname,
'faceURL': faceURL,
'gender': gender,
'appMangerLevel': appMangerLevel,
'phoneNumber': phoneNumber,
'birth': birth,
'email': email,
'ex': ex,
'operationID': Utils.checkOperationID(operationID),
}));
static Map _buildParam(Map param) {
param["ManagerName"] = "userManager";
return param;
}
}

View File

@@ -0,0 +1,61 @@
import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class WorkMomentsManager {
MethodChannel _channel;
late OnWorkMomentsListener listener;
WorkMomentsManager(this._channel);
/// 朋友圈信息发送变化通知
Future setWorkMomentsListener(OnWorkMomentsListener listener) {
this.listener = listener;
return _channel.invokeMethod('setWorkMomentsListener', _buildParam({}));
}
/// 获取朋友圈未读消息总数
Future<int> getWorkMomentsUnReadCount({
String? operationID,
}) =>
_channel
.invokeMethod(
'getWorkMomentsUnReadCount',
_buildParam({
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toObj(value, (map) => map['unreadCount']));
/// 获取通知列表
/// [offset] 开始下标
/// [count] 每页大小
Future<List<WorkMomentsInfo>> getWorkMomentsNotification({
required int offset,
required int count,
String? operationID,
}) =>
_channel
.invokeMethod(
'getWorkMomentsNotification',
_buildParam({
'offset': offset,
'count': count,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (map) => WorkMomentsInfo.fromJson(map)));
/// 清除通知列表
Future clearWorkMomentsNotification({
String? operationID,
}) =>
_channel.invokeMethod(
'clearWorkMomentsNotification',
_buildParam({
'operationID': Utils.checkOperationID(operationID),
}));
static Map _buildParam(Map param) {
param["ManagerName"] = "workMomentsManager";
return param;
}
}

View File

@@ -3,51 +3,84 @@ 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;
/// 会话最新消息内容
Message? latestMsg; Message? latestMsg;
/// 最新消息发送时间
int? latestMsgSendTime; int? latestMsgSendTime;
/// 草稿
String? draftText; String? draftText;
int? draftTimestamp;
/// pinned value is 1 /// 草稿生成时间
dynamic isPinned; int? draftTextTime;
ConversationInfo( /// 是否置顶
{required this.conversationID, bool? isPinned;
this.conversationType,
this.userID, /// 是否开启了私聊(阅后即焚)
this.groupID, bool? isPrivateChat;
this.showName,
this.faceUrl, /// 附加内容
this.recvMsgOpt, String? ext;
this.unreadCount,
this.latestMsg, /// 是否还在组内如果退群返回true
this.latestMsgSendTime, bool? isNotInGroup;
this.draftText,
this.draftTimestamp, ConversationInfo({
this.isPinned}); required this.conversationID,
this.conversationType,
this.userID,
this.groupID,
this.showName,
this.faceURL,
this.recvMsgOpt,
this.unreadCount,
this.latestMsg,
this.latestMsgSendTime,
this.draftText,
this.draftTextTime,
this.isPrivateChat,
this.isPinned,
this.isNotInGroup,
});
ConversationInfo.fromJson(Map<String, dynamic> json) ConversationInfo.fromJson(Map<String, dynamic> json)
: conversationID = json['conversationID'] { : conversationID = json['conversationID'] {
// conversationID = json['conversationID'];
conversationType = json['conversationType']; conversationType = json['conversationType'];
userID = json['userID']; userID = json['userID'];
groupID = json['groupID']; groupID = json['groupID'];
showName = json['showName']; showName = json['showName'];
faceUrl = json['faceUrl']; faceURL = json['faceURL'];
recvMsgOpt = json['recvMsgOpt']; recvMsgOpt = json['recvMsgOpt'];
unreadCount = json['unreadCount']; unreadCount = json['unreadCount'];
// latestMsg = json['latestMsg'];
// if (null != json['latestMsg']) {
try { try {
if (json['latestMsg'] is String) { if (json['latestMsg'] is String) {
latestMsg = Message.fromJson(jsonDecode(json['latestMsg'])); latestMsg = Message.fromJson(jsonDecode(json['latestMsg']));
@@ -55,38 +88,39 @@ class ConversationInfo {
latestMsg = Message.fromJson(json['latestMsg']); latestMsg = Message.fromJson(json['latestMsg']);
} }
} catch (e) {} } catch (e) {}
// }
latestMsgSendTime = json['latestMsgSendTime']; latestMsgSendTime = json['latestMsgSendTime'];
draftText = json['draftText']; draftText = json['draftText'];
draftTimestamp = json['draftTimestamp']; draftTextTime = json['draftTextTime'];
isPinned = json['isPinned']; isPinned = json['isPinned'];
isPrivateChat = json['isPrivateChat'];
isNotInGroup = json['isNotInGroup'];
groupAtType = json['groupAtType'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['conversationID'] = this.conversationID; data['conversationID'] = this.conversationID;
data['conversationType'] = this.conversationType; data['conversationType'] = this.conversationType;
data['userID'] = this.userID; data['userID'] = this.userID;
data['groupID'] = this.groupID; data['groupID'] = this.groupID;
data['showName'] = this.showName; data['showName'] = this.showName;
data['faceUrl'] = this.faceUrl; data['faceURL'] = this.faceURL;
data['recvMsgOpt'] = this.recvMsgOpt; data['recvMsgOpt'] = this.recvMsgOpt;
data['unreadCount'] = this.unreadCount; data['unreadCount'] = this.unreadCount;
data['latestMsg'] = this.latestMsg?.toJson(); data['latestMsg'] = this.latestMsg?.toJson();
data['latestMsgSendTime'] = this.latestMsgSendTime; data['latestMsgSendTime'] = this.latestMsgSendTime;
data['draftText'] = this.draftText; data['draftText'] = this.draftText;
data['draftTimestamp'] = this.draftTimestamp; data['draftTextTime'] = this.draftTextTime;
data['isPinned'] = this.isPinned; data['isPinned'] = this.isPinned;
data['isPrivateChat'] = this.isPrivateChat;
data['isNotInGroup'] = this.isNotInGroup;
data['groupAtType'] = this.groupAtType;
return data; return data;
} }
bool get isSingleChat => conversationType == ConversationType.single_chat; bool get isSingleChat => conversationType == ConversationType.single;
bool get isGroupChat => conversationType == ConversationType.group_chat; bool get isGroupChat => conversationType == ConversationType.group;
bool get isTop => isPinned == 1;
@override @override
bool operator ==(Object other) => bool operator ==(Object other) =>

View File

@@ -1,251 +1,359 @@
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? ownerId; /// 群头像
String? faceURL;
/// 拥有者ID
String? ownerUserID;
/// 创建时间
int? createTime; int? createTime;
/// 群成员数
int? memberCount; int? memberCount;
GroupInfo( /// 群状态0正常1被封2解散3禁言
{required this.groupID, int? status;
this.groupName,
this.notification, /// 创建者ID
this.introduction, String? creatorUserID;
this.faceUrl,
this.ownerId, /// 群类型
this.createTime, int? groupType;
this.memberCount});
/// 扩展字段
String? ex;
/// 进群验证方式[GroupVerification]
int? needVerification;
GroupInfo({
required this.groupID,
this.groupName,
this.notification,
this.introduction,
this.faceURL,
this.ownerUserID,
this.createTime,
this.memberCount,
this.status,
this.creatorUserID,
this.groupType,
this.ex,
this.needVerification,
});
GroupInfo.fromJson(Map<String, dynamic> json) : groupID = json['groupID'] { GroupInfo.fromJson(Map<String, dynamic> json) : groupID = json['groupID'] {
/*groupID = json['groupID'];*/ /*groupID = json['groupID'];*/
groupName = json['groupName']; groupName = json['groupName'];
notification = json['notification']; notification = json['notification'];
introduction = json['introduction']; introduction = json['introduction'];
faceUrl = json['faceUrl']; faceURL = json['faceURL'];
ownerId = json['ownerId']; ownerUserID = json['ownerUserID'];
createTime = json['createTime']; createTime = json['createTime'];
memberCount = json['memberCount']; memberCount = json['memberCount'];
status = json['status'];
creatorUserID = json['creatorUserID'];
groupType = json['groupType'];
ex = json['ex'];
needVerification = json['needVerification'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['groupID'] = this.groupID; data['groupID'] = this.groupID;
data['groupName'] = this.groupName; data['groupName'] = this.groupName;
data['notification'] = this.notification; data['notification'] = this.notification;
data['introduction'] = this.introduction; data['introduction'] = this.introduction;
data['faceUrl'] = this.faceUrl; data['faceURL'] = this.faceURL;
data['ownerId'] = this.ownerId; data['ownerUserID'] = this.ownerUserID;
data['createTime'] = this.createTime; data['createTime'] = this.createTime;
data['memberCount'] = this.memberCount; data['memberCount'] = this.memberCount;
data['status'] = this.status;
data['creatorUserID'] = this.creatorUserID;
data['groupType'] = this.groupType;
data['ex'] = this.ex;
data['needVerification'] = this.needVerification;
return data; return data;
} }
} }
class GroupMembersList { /// 群成员信息
int? nextSeq;
List<GroupMembersInfo>? data;
GroupMembersList({this.nextSeq, this.data});
GroupMembersList.fromJson(Map<String, dynamic> json) {
nextSeq = json['nextSeq'];
if (json['data'] is List) {
data = (json['data'] as List)
.map((e) => GroupMembersInfo.fromJson(e))
.toList();
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['nextSeq'] = this.nextSeq;
if (this.data != null) {
data['data'] = this.data!.map((v) => v.toJson()).toList();
}
return data;
}
}
class GroupMembersInfo { class GroupMembersInfo {
/// 群id
String? groupID; String? groupID;
String? userId;
int? role; /// 用户id
String? userID;
/// 昵称
String? nickname;
/// 头像
String? faceURL;
/// 角色[GroupRoleLevel]
int? roleLevel;
/// 加入时间
int? joinTime; int? joinTime;
String? nickName;
String? faceUrl; /// 入群方式
dynamic ext; int? joinSource;
/// 操作者id
String? operatorUserID;
/// 扩展字段
String? ex;
/// 禁言时间s
int? muteEndTime;
int? appMangerLevel;
GroupMembersInfo({ GroupMembersInfo({
this.groupID, this.groupID,
this.userId, this.userID,
this.role, this.roleLevel,
this.joinTime, this.joinTime,
this.nickName, this.nickname,
this.faceUrl, this.faceURL,
this.ext, this.ex,
this.joinSource,
this.operatorUserID,
this.muteEndTime,
this.appMangerLevel,
}); });
GroupMembersInfo.fromJson(Map<String, dynamic> json) { GroupMembersInfo.fromJson(Map<String, dynamic> json) {
groupID = json['groupID']; groupID = json['groupID'];
userId = json['userId']; userID = json['userID'];
role = json['role']; roleLevel = json['roleLevel'];
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'];
operatorUserID = json['operatorUserID'];
muteEndTime = json['muteEndTime'];
appMangerLevel = json['appMangerLevel'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['groupID'] = this.groupID; data['groupID'] = this.groupID;
data['userId'] = this.userId; data['userID'] = this.userID;
data['role'] = this.role; data['roleLevel'] = this.roleLevel;
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['operatorUserID'] = this.operatorUserID;
data['muteEndTime'] = this.muteEndTime;
data['appMangerLevel'] = this.appMangerLevel;
return data;
}
}
/// 群成员角色
class GroupMemberRole {
/// 用户ID
String? userID;
/// [GroupRoleLevel] 1普通成员, 2群主3管理员
int? roleLevel;
GroupMemberRole({this.userID, this.roleLevel = 1});
GroupMemberRole.fromJson(Map<String, dynamic> json) {
userID = json['userID'];
roleLevel = json['roleLevel'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['userID'] = this.userID;
data['roleLevel'] = this.roleLevel;
return data;
}
}
/// 群申请信息
class GroupApplicationInfo {
/// 群ID
String? groupID;
/// 群昵称
String? groupName;
/// 群公告
String? notification;
/// 群介绍
String? introduction;
/// 群头像
String? groupFaceURL;
/// 群创建时间
int? createTime;
/// 群状态
int? status;
/// 创建者id
String? creatorUserID;
/// 群类型
int? groupType;
/// 拥有者id
String? ownerUserID;
/// 成员数量
int? memberCount;
/// 发起入群申请的用户id
String? userID;
/// 发起入群申请的用户昵称
String? nickname;
/// 发起入群申请的用户头像
String? userFaceURL;
/// 发起入群申请的用户性别
int? gender;
/// 处理结果:-1拒绝1同意
int? handleResult;
/// 请求说明
String? reqMsg;
/// 处理结果说明
String? handledMsg;
/// 请求时间
int? reqTime;
/// 处理者用户ID
String? handleUserID;
/// 处理时间
int? handledTime;
/// 扩展信息
String? ex;
GroupApplicationInfo({
this.groupID,
this.groupName,
this.notification,
this.introduction,
this.groupFaceURL,
this.createTime,
this.status,
this.creatorUserID,
this.groupType,
this.ownerUserID,
this.memberCount,
this.userID,
this.nickname,
this.userFaceURL,
this.gender,
this.handleResult,
this.reqMsg,
this.handledMsg,
this.reqTime,
this.handleUserID,
this.handledTime,
this.ex,
});
GroupApplicationInfo.fromJson(Map<String, dynamic> json) {
groupID = json['groupID'];
groupName = json['groupName'];
notification = json['notification'];
introduction = json['introduction'];
groupFaceURL = json['groupFaceURL'];
createTime = json['createTime'];
status = json['status'];
creatorUserID = json['creatorUserID'];
groupType = json['groupType'];
ownerUserID = json['ownerUserID'];
memberCount = json['memberCount'];
userID = json['userID'];
nickname = json['nickname'];
userFaceURL = json['userFaceURL'];
gender = json['gender'];
handleResult = json['handleResult'];
reqMsg = json['reqMsg'];
handledMsg = json['handledMsg'];
reqTime = json['reqTime'];
handleUserID = json['handleUserID'];
handledTime = json['handledTime'];
ex = json['ex'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['groupID'] = this.groupID;
data['groupName'] = this.groupName;
data['notification'] = this.notification;
data['introduction'] = this.introduction;
data['groupFaceURL'] = this.groupFaceURL;
data['createTime'] = this.createTime;
data['status'] = this.status;
data['creatorUserID'] = this.creatorUserID;
data['groupType'] = this.groupType;
data['ownerUserID'] = this.ownerUserID;
data['memberCount'] = this.memberCount;
data['userID'] = this.userID;
data['nickname'] = this.nickname;
data['userFaceURL'] = this.userFaceURL;
data['gender'] = this.gender;
data['handleResult'] = this.handleResult;
data['reqMsg'] = this.reqMsg;
data['handledMsg'] = this.handledMsg;
data['reqTime'] = this.reqTime;
data['handleUserID'] = this.handleUserID;
data['handledTime'] = this.handledTime;
data['ex'] = this.ex;
return data; return data;
} }
} }
class GroupInviteResult { class GroupInviteResult {
String? uid; String? userID;
int? result; int? result;
GroupInviteResult({this.uid, this.result}); GroupInviteResult({this.userID, this.result});
GroupInviteResult.fromJson(Map<String, dynamic> json) { GroupInviteResult.fromJson(Map<String, dynamic> json) {
uid = json['uid']; userID = json['userID'];
result = json['result']; result = json['result'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['uid'] = this.uid; data['userID'] = this.userID;
data['result'] = this.result; data['result'] = this.result;
return data; return data;
} }
} }
class GroupMemberRole {
String? uid;
int? setRole;
GroupMemberRole({this.uid, this.setRole});
GroupMemberRole.fromJson(Map<String, dynamic> json) {
uid = json['uid'];
setRole = json['setRole'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['uid'] = this.uid;
data['setRole'] = this.setRole;
return data;
}
}
class GroupApplicationInfo {
String? id;
String? groupID;
String? fromUserID;
String? toUserID;
int? flag; //INIT = 0, REFUSE = -1, AGREE = 1
String? reqMsg;
String? handledMsg;
int? createTime;
String? fromUserNickName;
String? toUserNickName;
String? fromUserFaceURL;
String? toUserFaceURL;
String? handledUser;
int? type; //APPLICATION = 0, INVITE = 1
int? handleStatus; //UNHANDLED = 0, BY_OTHER = 1, BY_SELF = 2
int? handleResult; //REFUSE = 0, AGREE = 1
GroupApplicationInfo(
{this.id,
this.groupID,
this.fromUserID,
this.toUserID,
this.flag,
this.reqMsg,
this.handledMsg,
this.createTime,
this.fromUserNickName,
this.toUserNickName,
this.fromUserFaceURL,
this.toUserFaceURL,
this.handledUser,
this.type,
this.handleStatus,
this.handleResult});
GroupApplicationInfo.fromJson(Map<String, dynamic> json) {
id = json['id'];
groupID = json['groupID'];
fromUserID = json['fromUserID'];
toUserID = json['toUserID'];
flag = json['flag'];
reqMsg = json['reqMsg'];
handledMsg = json['handledMsg'];
createTime = json['createTime'];
fromUserNickName = json['fromUserNickName'];
toUserNickName = json['toUserNickName'];
fromUserFaceURL = json['fromUserFaceURL'];
toUserFaceURL = json['toUserFaceURL'];
handledUser = json['handledUser'];
type = json['type'];
handleStatus = json['handleStatus'];
handleResult = json['handleResult'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['groupID'] = this.groupID;
data['fromUserID'] = this.fromUserID;
data['toUserID'] = this.toUserID;
data['flag'] = this.flag;
data['reqMsg'] = this.reqMsg;
data['handledMsg'] = this.handledMsg;
data['createTime'] = this.createTime;
data['fromUserNickName'] = this.fromUserNickName;
data['toUserNickName'] = this.toUserNickName;
data['fromUserFaceURL'] = this.fromUserFaceURL;
data['toUserFaceURL'] = this.toUserFaceURL;
data['handledUser'] = this.handledUser;
data['type'] = this.type;
data['handleStatus'] = this.handleStatus;
data['handleResult'] = this.handleResult;
return data;
}
}
class GroupApplicationList {
int? count;
List<GroupApplicationInfo>? user;
GroupApplicationList({this.count, this.user});
GroupApplicationList.fromJson(Map<String, dynamic> json) {
count = json['count'];
if (json['user'] is List) {
user = (json['user'] as List)
.map((e) => GroupApplicationInfo.fromJson(e))
.toList();
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['count'] = this.count;
if (this.user != null) {
data['user'] = this.user!.map((v) => v.toJson()).toList();
}
return data;
}
}

View File

@@ -1,61 +1,133 @@
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]
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;
List<String>? forceList;
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;
/// [MessageStatus] /// 已读时间
int? hasReadTime;
/// 消息发送状态[MessageStatus]
int? status; int? status;
String? remark;
/// 离线显示内容
OfflinePushInfo? offlinePush;
/// 附加信息
String? attachedInfo;
/// 扩展信息
String? ex;
/// 自定义扩展信息,目前用于客服端处理消息时间分段
dynamic ext; dynamic ext;
/// [ConversationType] /// 图片
int? sessionType;
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;
/// 自定义表情
FaceElem? faceElem;
/// 附加信息
AttachedInfoElem? attachedInfoElem;
Message({ Message({
this.clientMsgID, this.clientMsgID,
this.serverMsgID, this.serverMsgID,
this.createTime, this.createTime,
this.sendTime, this.sendTime,
this.sessionType,
this.sendID, this.sendID,
this.recvID, this.recvID,
this.msgFrom, this.msgFrom,
this.contentType, this.contentType,
this.platformID, this.platformID,
this.forceList, this.senderNickname,
this.senderNickName,
this.senderFaceUrl, this.senderFaceUrl,
this.groupID, this.groupID,
this.content, this.content,
this.seq, this.seq,
this.isRead, this.isRead,
this.hasReadTime,
this.status, this.status,
this.remark, this.offlinePush,
this.attachedInfo,
this.ex,
this.ext, this.ext,
this.sessionType,
this.pictureElem, this.pictureElem,
this.soundElem, this.soundElem,
this.videoElem, this.videoElem,
@@ -65,10 +137,12 @@ class Message {
this.customElem, this.customElem,
this.quoteElem, this.quoteElem,
this.mergeElem, this.mergeElem,
this.notificationElem,
this.faceElem,
this.attachedInfoElem,
}); });
Message.fromJson( Message.fromJson(Map<String, dynamic> json) {
Map<String, dynamic> json) /* : clientMsgID = json['clientMsgID']*/ {
clientMsgID = json['clientMsgID']; clientMsgID = json['clientMsgID'];
serverMsgID = json['serverMsgID']; serverMsgID = json['serverMsgID'];
createTime = json['createTime']; createTime = json['createTime'];
@@ -78,17 +152,18 @@ class Message {
msgFrom = json['msgFrom']; msgFrom = json['msgFrom'];
contentType = json['contentType']; contentType = json['contentType'];
platformID = json['platformID']; platformID = json['platformID'];
if (json['forceList'] is List) { senderNickname = json['senderNickname'];
forceList = (json['forceList'] as List).map((e) => '$e').toList();
}
senderNickName = json['senderNickName'];
senderFaceUrl = json['senderFaceUrl']; senderFaceUrl = json['senderFaceUrl'];
groupID = json['groupID']; groupID = json['groupID'];
content = json['content']; content = json['content'];
seq = json['seq']; seq = json['seq'];
isRead = json['isRead']; isRead = json['isRead'];
status = json['status']; status = json['status'];
remark = json['remark']; offlinePush = json['offlinePush'] != null
? OfflinePushInfo.fromJson(json['offlinePush'])
: null;
attachedInfo = json['attachedInfo'];
ex = json['ex'];
ext = json['ext']; ext = json['ext'];
sessionType = json['sessionType']; sessionType = json['sessionType'];
pictureElem = json['pictureElem'] != null pictureElem = json['pictureElem'] != null
@@ -116,10 +191,19 @@ class Message {
mergeElem = json['mergeElem'] != null mergeElem = json['mergeElem'] != null
? MergeElem.fromJson(json['mergeElem']) ? MergeElem.fromJson(json['mergeElem'])
: null; : null;
notificationElem = json['notificationElem'] != null
? NotificationElem.fromJson(json['notificationElem'])
: null;
faceElem =
json['faceElem'] != null ? FaceElem.fromJson(json['faceElem']) : null;
attachedInfoElem = json['attachedInfoElem'] != null
? AttachedInfoElem.fromJson(json['attachedInfoElem'])
: null;
hasReadTime = json['hasReadTime'] ?? attachedInfoElem?.hasReadTime;
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['clientMsgID'] = this.clientMsgID; data['clientMsgID'] = this.clientMsgID;
data['serverMsgID'] = this.serverMsgID; data['serverMsgID'] = this.serverMsgID;
data['createTime'] = this.createTime; data['createTime'] = this.createTime;
@@ -129,15 +213,17 @@ class Message {
data['msgFrom'] = this.msgFrom; data['msgFrom'] = this.msgFrom;
data['contentType'] = this.contentType; data['contentType'] = this.contentType;
data['platformID'] = this.platformID; data['platformID'] = this.platformID;
data['forceList'] = this.forceList; data['senderNickname'] = this.senderNickname;
data['senderNickName'] = this.senderNickName;
data['senderFaceUrl'] = this.senderFaceUrl; data['senderFaceUrl'] = this.senderFaceUrl;
data['groupID'] = this.groupID; data['groupID'] = this.groupID;
data['content'] = this.content; data['content'] = this.content;
data['seq'] = this.seq; data['seq'] = this.seq;
data['isRead'] = this.isRead; data['isRead'] = this.isRead;
data['hasReadTime'] = this.hasReadTime;
data['status'] = this.status; data['status'] = this.status;
data['remark'] = this.remark; data['offlinePush'] = this.offlinePush?.toJson();
data['attachedInfo'] = this.attachedInfo;
data['ex'] = this.ex;
data['ext'] = this.ext; data['ext'] = this.ext;
data['sessionType'] = this.sessionType; data['sessionType'] = this.sessionType;
data['pictureElem'] = this.pictureElem?.toJson(); data['pictureElem'] = this.pictureElem?.toJson();
@@ -149,6 +235,9 @@ class Message {
data['customElem'] = this.customElem?.toJson(); data['customElem'] = this.customElem?.toJson();
data['quoteElem'] = this.quoteElem?.toJson(); data['quoteElem'] = this.quoteElem?.toJson();
data['mergeElem'] = this.mergeElem?.toJson(); data['mergeElem'] = this.mergeElem?.toJson();
data['notificationElem'] = this.notificationElem?.toJson();
data['faceElem'] = this.faceElem?.toJson();
data['attachedInfoElem'] = this.attachedInfoElem?.toJson();
return data; return data;
} }
@@ -161,12 +250,57 @@ class Message {
@override @override
int get hashCode => clientMsgID.hashCode; int get hashCode => clientMsgID.hashCode;
void update(Message message) {
if (this != message) return;
serverMsgID = message.serverMsgID;
createTime = message.createTime;
sendTime = message.sendTime;
sendID = message.sendID;
recvID = message.recvID;
msgFrom = message.msgFrom;
contentType = message.contentType;
platformID = message.platformID;
senderNickname = message.senderNickname;
senderFaceUrl = message.senderFaceUrl;
groupID = message.groupID;
content = message.content;
seq = message.seq;
isRead = message.isRead;
hasReadTime = message.hasReadTime;
status = message.status;
offlinePush = message.offlinePush;
attachedInfo = message.attachedInfo;
ex = message.ex;
ext = message.ext;
sessionType = message.sessionType;
pictureElem = message.pictureElem;
soundElem = message.soundElem;
videoElem = message.videoElem;
fileElem = message.fileElem;
atElem = message.atElem;
locationElem = message.locationElem;
customElem = message.customElem;
quoteElem = message.quoteElem;
mergeElem = message.mergeElem;
notificationElem = message.notificationElem;
faceElem = message.faceElem;
attachedInfoElem = message.attachedInfoElem;
}
} }
/// 图片消息内容
class PictureElem { class PictureElem {
/// 原路径
String? sourcePath; String? sourcePath;
/// 原图对象
PictureInfo? sourcePicture; PictureInfo? sourcePicture;
/// 大图对象
PictureInfo? bigPicture; PictureInfo? bigPicture;
/// 缩率图对象
PictureInfo? snapshotPicture; PictureInfo? snapshotPicture;
PictureElem( PictureElem(
@@ -189,7 +323,7 @@ class PictureElem {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['sourcePath'] = this.sourcePath; data['sourcePath'] = this.sourcePath;
if (this.sourcePicture != null) { if (this.sourcePicture != null) {
data['sourcePicture'] = this.sourcePicture?.toJson(); data['sourcePicture'] = this.sourcePicture?.toJson();
@@ -204,19 +338,31 @@ class PictureElem {
} }
} }
/// 图片信息
class PictureInfo { class PictureInfo {
String? uuID; /// id
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(
{this.uuID, this.type, this.size, this.width, this.height, this.url}); {this.uuid, this.type, this.size, this.width, this.height, this.url});
PictureInfo.fromJson(Map<String, dynamic> json) { PictureInfo.fromJson(Map<String, dynamic> json) {
uuID = json['uuID']; uuid = json['uuid'];
type = json['type']; type = json['type'];
size = json['size']; size = json['size'];
width = json['width']; width = json['width'];
@@ -225,8 +371,8 @@ class PictureInfo {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['uuID'] = this.uuID; data['uuid'] = this.uuid;
data['type'] = this.type; data['type'] = this.type;
data['size'] = this.size; data['size'] = this.size;
data['width'] = this.width; data['width'] = this.width;
@@ -236,22 +382,32 @@ class PictureInfo {
} }
} }
/// 语音消息内容
class SoundElem { class SoundElem {
String? uuID; /// id
String? uuid;
/// 原路径
String? soundPath; String? soundPath;
/// url地址
String? sourceUrl; String? sourceUrl;
/// 大小
int? dataSize; int? dataSize;
/// 时间s
int? duration; int? duration;
SoundElem( SoundElem(
{this.uuID, {this.uuid,
this.soundPath, this.soundPath,
this.sourceUrl, this.sourceUrl,
this.dataSize, this.dataSize,
this.duration}); this.duration});
SoundElem.fromJson(Map<String, dynamic> json) { SoundElem.fromJson(Map<String, dynamic> json) {
uuID = json['uuID']; uuid = json['uuid'];
soundPath = json['soundPath']; soundPath = json['soundPath'];
sourceUrl = json['sourceUrl']; sourceUrl = json['sourceUrl'];
dataSize = json['dataSize']; dataSize = json['dataSize'];
@@ -259,8 +415,8 @@ class SoundElem {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['uuID'] = this.uuID; data['uuid'] = this.uuid;
data['soundPath'] = this.soundPath; data['soundPath'] = this.soundPath;
data['sourceUrl'] = this.sourceUrl; data['sourceUrl'] = this.sourceUrl;
data['dataSize'] = this.dataSize; data['dataSize'] = this.dataSize;
@@ -269,18 +425,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(
@@ -313,7 +493,7 @@ class VideoElem {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['videoPath'] = this.videoPath; data['videoPath'] = this.videoPath;
data['videoUUID'] = this.videoUUID; data['videoUUID'] = this.videoUUID;
data['videoUrl'] = this.videoUrl; data['videoUrl'] = this.videoUrl;
@@ -330,28 +510,38 @@ class VideoElem {
} }
} }
/// 文件消息内容
class FileElem { class FileElem {
/// 文件路径
String? filePath; String? filePath;
String? uuID;
/// uuid
String? uuid;
/// 文件URL地址
String? sourceUrl; String? sourceUrl;
/// 文件名
String? fileName; String? fileName;
/// 文件大小
int? fileSize; int? fileSize;
FileElem( FileElem(
{this.filePath, this.uuID, this.sourceUrl, this.fileName, this.fileSize}); {this.filePath, this.uuid, this.sourceUrl, this.fileName, this.fileSize});
FileElem.fromJson(Map<String, dynamic> json) { FileElem.fromJson(Map<String, dynamic> json) {
filePath = json['filePath']; filePath = json['filePath'];
uuID = json['uuID']; uuid = json['uuid'];
sourceUrl = json['sourceUrl']; sourceUrl = json['sourceUrl'];
fileName = json['fileName']; fileName = json['fileName'];
fileSize = json['fileSize']; fileSize = json['fileSize'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['filePath'] = this.filePath; data['filePath'] = this.filePath;
data['uuID'] = this.uuID; data['uuid'] = this.uuid;
data['sourceUrl'] = this.sourceUrl; data['sourceUrl'] = this.sourceUrl;
data['fileName'] = this.fileName; data['fileName'] = this.fileName;
data['fileSize'] = this.fileSize; data['fileSize'] = this.fileSize;
@@ -359,12 +549,30 @@ class FileElem {
} }
} }
/// @消息内容
class AtElem { class AtElem {
/// 消息内容
String? text; String? text;
/// 被@的用户ID列表
List<String>? atUserList; List<String>? atUserList;
/// 是否包含自己
bool? isAtSelf; bool? isAtSelf;
AtElem({this.text, this.atUserList, this.isAtSelf}); /// 被@的用户ID跟昵称关系列表用于将消息内容里的用户id替换为昵称显示
List<AtUserInfo>? atUsersInfo;
/// 被回复的消息体,回复别人并@了人
Message? quoteMessage;
AtElem({
this.text,
this.atUserList,
this.isAtSelf,
this.atUsersInfo,
this.quoteMessage,
});
AtElem.fromJson(Map<String, dynamic> json) { AtElem.fromJson(Map<String, dynamic> json) {
text = json['text']; text = json['text'];
@@ -372,20 +580,36 @@ class AtElem {
atUserList = (json['atUserList'] as List).map((e) => '$e').toList(); atUserList = (json['atUserList'] as List).map((e) => '$e').toList();
} }
isAtSelf = json['isAtSelf']; isAtSelf = json['isAtSelf'];
if (json['atUsersInfo'] is List) {
atUsersInfo = (json['atUsersInfo'] as List)
.map((e) => AtUserInfo.fromJson(e))
.toList();
}
quoteMessage = null != json['quoteMessage']
? Message.fromJson(json['quoteMessage'])
: null;
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['text'] = this.text; data['text'] = this.text;
data['atUserList'] = this.atUserList; data['atUserList'] = this.atUserList;
data['isAtSelf'] = this.isAtSelf; data['isAtSelf'] = this.isAtSelf;
data['atUsersInfo'] = this.atUsersInfo?.map((e) => e.toJson()).toList();
data['quoteMessage'] = this.quoteMessage?.toJson();
return data; return data;
} }
} }
/// 位置消息内日
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});
@@ -406,7 +630,7 @@ class LocationElem {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['description'] = this.description; data['description'] = this.description;
data['longitude'] = this.longitude; data['longitude'] = this.longitude;
data['latitude'] = this.latitude; data['latitude'] = this.latitude;
@@ -414,9 +638,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});
@@ -428,7 +658,7 @@ class CustomElem {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['data'] = this.data; data['data'] = this.data;
data['extension'] = this.extension; data['extension'] = this.extension;
data['description'] = this.description; data['description'] = this.description;
@@ -436,8 +666,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});
@@ -450,16 +684,22 @@ class QuoteElem {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['text'] = this.text; data['text'] = this.text;
data['quoteMessage'] = this.quoteMessage?.toJson(); data['quoteMessage'] = this.quoteMessage?.toJson();
return data; return data;
} }
} }
/// 合并消息体
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});
@@ -477,7 +717,7 @@ class MergeElem {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['title'] = this.title; data['title'] = this.title;
data['abstractList'] = this.abstractList; data['abstractList'] = this.abstractList;
data['multiMessage'] = this.multiMessage?.map((e) => e.toJson()).toList(); data['multiMessage'] = this.multiMessage?.map((e) => e.toJson()).toList();
@@ -485,24 +725,157 @@ class MergeElem {
} }
} }
class HaveReadInfo { /// 通知
String? uid; class NotificationElem {
/// 详情
String? detail;
/// 提示
String? defaultTips;
NotificationElem({this.detail, this.defaultTips});
NotificationElem.fromJson(Map<String, dynamic> json) {
detail = json['detail'];
defaultTips = json['defaultTips'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['detail'] = this.detail;
data['defaultTips'] = this.defaultTips;
return data;
}
}
/// 表情
class FaceElem {
/// 位置表情,用户端对端自定义内嵌的表情包
int? index;
/// 其他表情如URL表情直接返回url
String? data;
FaceElem({this.index, this.data});
FaceElem.fromJson(Map<String, dynamic> json) {
index = json['index'];
data = json['data'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['index'] = this.index;
data['data'] = this.data;
return data;
}
}
/// 附加信息
class AttachedInfoElem {
/// 群消息已读信息
GroupHasReadInfo? groupHasReadInfo;
/// 是否为私聊消息(阅后即焚消息),单聊有效
bool? isPrivateChat;
/// 已读时间
int? hasReadTime;
/// 离线不发送推送
bool? notSenderNotificationPush;
AttachedInfoElem({
this.groupHasReadInfo,
this.isPrivateChat,
this.hasReadTime,
this.notSenderNotificationPush,
});
AttachedInfoElem.fromJson(Map<String, dynamic> json) {
groupHasReadInfo = json['groupHasReadInfo'] == null
? null
: GroupHasReadInfo.fromJson(json['groupHasReadInfo']);
isPrivateChat = json['isPrivateChat'];
hasReadTime = json['hasReadTime'];
notSenderNotificationPush = json['notSenderNotificationPush'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['groupHasReadInfo'] = this.groupHasReadInfo?.toJson();
data['isPrivateChat'] = this.isPrivateChat;
data['hasReadTime'] = this.hasReadTime;
data['notSenderNotificationPush'] = this.notSenderNotificationPush;
return data;
}
}
/// 群消息已读信息
class GroupHasReadInfo {
/// 已读的用户id列表
List<String>? hasReadUserIDList;
/// 已读总数
int? hasReadCount;
/// 发送此条消息时的群人数
int? groupMemberCount;
GroupHasReadInfo.fromJson(Map<String, dynamic> json) {
if (json['hasReadUserIDList'] == null) {
hasReadUserIDList = <String>[];
} else {
hasReadUserIDList = (json['hasReadUserIDList'] as List).cast<String>();
}
hasReadCount = json['hasReadCount'] ?? 0;
groupMemberCount = json['groupMemberCount'] ?? 0;
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['hasReadUserIDList'] = this.hasReadUserIDList;
data['hasReadCount'] = this.hasReadCount;
data['groupMemberCount'] = this.groupMemberCount;
return data;
}
}
/// 消息已读回执信息
class ReadReceiptInfo {
/// 发送者id
String? userID;
/// 群id
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;
HaveReadInfo( ReadReceiptInfo(
{this.uid, {this.userID,
this.groupID,
this.msgIDList, this.msgIDList,
this.readTime, this.readTime,
this.msgFrom, this.msgFrom,
this.contentType, this.contentType,
this.sessionType}); this.sessionType});
HaveReadInfo.fromJson(Map<String, dynamic> json) { ReadReceiptInfo.fromJson(Map<String, dynamic> json) {
uid = json['uid']; userID = json['uid'] ?? json['userID'];
groupID = json['groupID'];
if (json['msgIDList'] is List) { if (json['msgIDList'] is List) {
msgIDList = (json['msgIDList'] as List).map((e) => '$e').toList(); msgIDList = (json['msgIDList'] as List).map((e) => '$e').toList();
} }
@@ -513,8 +886,8 @@ class HaveReadInfo {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final data = Map<String, dynamic>();
data['uid'] = this.uid; data['userID'] = this.userID;
data['msgIDList'] = this.msgIDList; data['msgIDList'] = this.msgIDList;
data['readTime'] = this.readTime; data['readTime'] = this.readTime;
data['msgFrom'] = this.msgFrom; data['msgFrom'] = this.msgFrom;
@@ -523,3 +896,65 @@ class HaveReadInfo {
return data; return data;
} }
} }
/// 离线推送信息
class OfflinePushInfo {
/// 通知标题
String? title;
/// 通知描述
String? desc;
/// 扩展内容
String? ex;
/// 仅ios有效
String? iOSPushSound;
/// 仅ios有效
bool? iOSBadgeCount;
OfflinePushInfo(
{this.title, this.desc, this.ex, this.iOSPushSound, this.iOSBadgeCount});
OfflinePushInfo.fromJson(Map<String, dynamic> json) {
title = json['title'];
desc = json['desc'];
ex = json['ex'];
iOSPushSound = json['iOSPushSound'];
iOSBadgeCount = json['iOSBadgeCount'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['title'] = this.title;
data['desc'] = this.desc;
data['ex'] = this.ex;
data['iOSPushSound'] = this.iOSPushSound;
data['iOSBadgeCount'] = this.iOSBadgeCount;
return data;
}
}
/// @消息用户id跟昵称关系对象
class AtUserInfo {
/// 被@的用户id
String? atUserID;
/// 被@的用户昵称
String? groupNickname;
AtUserInfo({this.atUserID, this.groupNickname});
AtUserInfo.fromJson(Map<String, dynamic> json) {
atUserID = json['atUserID'];
groupNickname = json['groupNickname'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['atUserID'] = this.atUserID;
data['groupNickname'] = this.groupNickname;
return data;
}
}

View File

@@ -0,0 +1,453 @@
import '../../flutter_openim_sdk.dart';
/// oa 通知
class OANotification {
/// 标题
String? notificationName;
/// 头像
String? notificationFaceURL;
/// 类型
int? notificationType;
/// 文本内容
String? text;
/// 跳转链接
String? externalUrl;
/// 0纯文字通知 1文字+图片通知 2文字+视频通知 3文字+文件通知
int? mixType;
/// 图片信息
PictureElem? pictureElem;
/// 语音信息
SoundElem? soundElem;
/// 视频信息
VideoElem? videoElem;
/// 文件信息
FileElem? fileElem;
/// 扩展字段
String? ex;
OANotification(
{this.notificationName,
this.notificationFaceURL,
this.notificationType,
this.text,
this.externalUrl,
this.mixType,
this.pictureElem,
this.soundElem,
this.videoElem,
this.fileElem,
this.ex});
OANotification.fromJson(Map<String, dynamic> json) {
notificationName = json['notificationName'];
notificationFaceURL = json['notificationFaceURL'];
notificationType = json['notificationType'];
text = json['text'];
externalUrl = json['externalUrl'];
mixType = json['mixType'];
pictureElem = json['pictureElem'] != null
? PictureElem.fromJson(json['pictureElem'])
: null;
soundElem = json['soundElem'] != null
? SoundElem.fromJson(json['soundElem'])
: null;
videoElem = json['videoElem'] != null
? VideoElem.fromJson(json['videoElem'])
: null;
fileElem =
json['fileElem'] != null ? FileElem.fromJson(json['fileElem']) : null;
ex = json['ex'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['notificationName'] = this.notificationName;
data['notificationFaceURL'] = this.notificationFaceURL;
data['notificationType'] = this.notificationType;
data['text'] = this.text;
data['externalUrl'] = this.externalUrl;
data['mixType'] = this.mixType;
if (this.pictureElem != null) {
data['pictureElem'] = this.pictureElem!.toJson();
}
if (this.soundElem != null) {
data['soundElem'] = this.soundElem!.toJson();
}
if (this.videoElem != null) {
data['videoElem'] = this.videoElem!.toJson();
}
if (this.fileElem != null) {
data['fileElem'] = this.fileElem!.toJson();
}
data['ex'] = this.ex;
return data;
}
}
/// 群事件通知
class GroupNotification {
/// 群信息
GroupInfo? group;
/// 当前事件操作者信息
GroupMembersInfo? opUser;
/// 群拥有者信息
GroupMembersInfo? groupOwnerUser;
/// 产生影响的群成员列表
List<GroupMembersInfo>? memberList;
GroupNotification({
this.group,
this.opUser,
this.groupOwnerUser,
this.memberList,
});
GroupNotification.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
opUser = json['opUser'] != null
? GroupMembersInfo.fromJson(json['opUser'])
: null;
groupOwnerUser = json['groupOwnerUser'] != null
? GroupMembersInfo.fromJson(json['groupOwnerUser'])
: null;
if (json['memberList'] != null) {
memberList = <GroupMembersInfo>[];
json['memberList'].forEach((v) {
memberList!.add(GroupMembersInfo.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
}
if (this.groupOwnerUser != null) {
data['groupOwnerUser'] = this.groupOwnerUser!.toJson();
}
if (this.memberList != null) {
data['memberList'] = this.memberList!.map((v) => v.toJson()).toList();
}
return data;
}
}
/// 用户被邀请进群通知
class InvitedJoinGroupNotification {
/// 群信息
GroupInfo? group;
/// 操作者信息
GroupMembersInfo? opUser;
/// 被邀请进群的成员信息
List<GroupMembersInfo>? invitedUserList;
InvitedJoinGroupNotification({this.group, this.opUser, this.invitedUserList});
InvitedJoinGroupNotification.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
opUser = json['opUser'] != null
? GroupMembersInfo.fromJson(json['opUser'])
: null;
if (json['invitedUserList'] != null) {
invitedUserList = <GroupMembersInfo>[];
json['invitedUserList'].forEach((v) {
invitedUserList!.add(GroupMembersInfo.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
}
if (this.invitedUserList != null) {
data['invitedUserList'] =
this.invitedUserList!.map((v) => v.toJson()).toList();
}
return data;
}
}
/// 组踢出成员通知
class KickedGroupMemeberNotification {
/// 群信息
GroupInfo? group;
/// 操作者信息
GroupMembersInfo? opUser;
/// 被踢出群的成员信息列表
List<GroupMembersInfo>? kickedUserList;
KickedGroupMemeberNotification(
{this.group, this.opUser, this.kickedUserList});
KickedGroupMemeberNotification.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
opUser = json['opUser'] != null
? GroupMembersInfo.fromJson(json['opUser'])
: null;
if (json['kickedUserList'] != null) {
kickedUserList = <GroupMembersInfo>[];
json['kickedUserList'].forEach((v) {
kickedUserList!.add(GroupMembersInfo.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
}
if (this.kickedUserList != null) {
data['kickedUserList'] =
this.kickedUserList!.map((v) => v.toJson()).toList();
}
return data;
}
}
/// 退出群通知
class QuitGroupNotification {
/// 群信息
GroupInfo? group;
/// 退群的成员信息
GroupMembersInfo? quitUser;
QuitGroupNotification({this.group, this.quitUser});
QuitGroupNotification.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
quitUser = json['quitUser'] != null
? GroupMembersInfo.fromJson(json['quitUser'])
: null;
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
}
if (this.quitUser != null) {
data['quitUser'] = this.quitUser!.toJson();
}
return data;
}
}
/// 进群通知
class EnterGroupNotification {
/// 群信息
GroupInfo? group;
/// 进入群的成员信息
GroupMembersInfo? entrantUser;
EnterGroupNotification({this.group, this.entrantUser});
EnterGroupNotification.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
entrantUser = json['entrantUser'] != null
? GroupMembersInfo.fromJson(json['entrantUser'])
: null;
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
}
if (this.entrantUser != null) {
data['quitUser'] = this.entrantUser!.toJson();
}
return data;
}
}
/// 群权转让通知
class GroupRightsTransferNoticication {
/// 群信息
GroupInfo? group;
/// 操作者信息
GroupMembersInfo? opUser;
/// 群新的拥有者信息
GroupMembersInfo? newGroupOwner;
GroupRightsTransferNoticication({
this.group,
this.opUser,
this.newGroupOwner,
});
GroupRightsTransferNoticication.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
opUser = json['opUser'] != null
? GroupMembersInfo.fromJson(json['opUser'])
: null;
newGroupOwner = json['newGroupOwner'] != null
? GroupMembersInfo.fromJson(json['newGroupOwner'])
: null;
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
}
if (this.newGroupOwner != null) {
data['newGroupOwner'] = this.newGroupOwner!.toJson();
}
return data;
}
}
/// 禁言成员通知
class MuteMemberNotification {
/// 群信息
GroupInfo? group;
/// 操作者信息
GroupMembersInfo? opUser;
/// 被禁言的成员信息
GroupMembersInfo? mutedUser;
/// 禁言时间s
int? mutedSeconds;
MuteMemberNotification({
this.group,
this.opUser,
this.mutedUser,
this.mutedSeconds,
});
MuteMemberNotification.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
opUser = json['opUser'] != null
? GroupMembersInfo.fromJson(json['opUser'])
: null;
mutedUser = json['mutedUser'] != null
? GroupMembersInfo.fromJson(json['mutedUser'])
: null;
mutedSeconds = json['mutedSeconds'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
}
if (this.mutedUser != null) {
data['mutedUser'] = this.mutedUser!.toJson();
}
data['mutedSeconds'] = this.mutedSeconds;
return data;
}
}
/// 阅后即焚通知
class BurnAfterReadingNotification {
/// 接收者
String? recvID;
/// 发送者
String? sendID;
/// 是否开启
bool? isPrivate;
BurnAfterReadingNotification({this.recvID, this.sendID, this.isPrivate});
BurnAfterReadingNotification.fromJson(Map<String, dynamic> json) {
recvID = json['recvID'];
sendID = json['sendID'];
isPrivate = json['isPrivate'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['recvID'] = this.recvID;
data['sendID'] = this.sendID;
data['isPrivate'] = this.isPrivate;
return data;
}
}
/// 群成员信息发送变化通知
class GroupMemberInfoChangedNotification {
/// 群信息
GroupInfo? group;
/// 操作者信息
GroupMembersInfo? opUser;
/// 资料发生改变的成员
GroupMembersInfo? changedUser;
GroupMemberInfoChangedNotification({
this.group,
this.opUser,
this.changedUser,
});
GroupMemberInfoChangedNotification.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
opUser = json['opUser'] != null
? GroupMembersInfo.fromJson(json['opUser'])
: null;
changedUser = json['changedUser'] != null
? GroupMembersInfo.fromJson(json['changedUser'])
: null;
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
}
if (this.changedUser != null) {
data['changedUser'] = this.changedUser!.toJson();
}
return data;
}
}

View File

@@ -0,0 +1,362 @@
/// 部门信息
class DeptInfo {
/// 部门id
String? departmentID;
/// 头像
String? faceURL;
/// 显示名
String? name;
/// 上一级部门id
String? parentID;
/// 排序方式
int? order;
/// 部门类型
int? departmentType;
/// 创建时间
int? createTime;
/// 子部门数量
int? subDepartmentNum;
/// 成员数量
int? memberNum;
/// 扩展字段
String? ex;
/// 附加信息
String? attachedInfo;
DeptInfo(
{this.departmentID,
this.faceURL,
this.name,
this.parentID,
this.order,
this.departmentType,
this.createTime,
this.subDepartmentNum,
this.memberNum,
this.ex,
this.attachedInfo});
DeptInfo.fromJson(Map<String, dynamic> json) {
departmentID = json['departmentID'];
faceURL = json['faceURL'];
name = json['name'];
parentID = json['parentID'];
order = json['order'];
departmentType = json['departmentType'];
createTime = json['createTime'];
subDepartmentNum = json['subDepartmentNum'];
memberNum = json['memberNum'];
ex = json['ex'];
attachedInfo = json['attachedInfo'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['departmentID'] = this.departmentID;
data['faceURL'] = this.faceURL;
data['name'] = this.name;
data['parentID'] = this.parentID;
data['order'] = this.order;
data['departmentType'] = this.departmentType;
data['createTime'] = this.createTime;
data['subDepartmentNum'] = this.subDepartmentNum;
data['memberNum'] = this.memberNum;
data['ex'] = this.ex;
data['attachedInfo'] = this.attachedInfo;
return data;
}
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is DeptInfo &&
runtimeType == other.runtimeType &&
departmentID == other.departmentID;
@override
int get hashCode => departmentID.hashCode;
}
/// 部门成员信息
class DeptMemberInfo {
/// 用户id
String? userID;
/// 用户昵称
String? nickname;
/// 英文名
String? englishName;
/// 头像
String? faceURL;
/// 性别
int? gender;
/// 手机号
String? mobile;
/// 座机
String? telephone;
/// 出生时间
int? birth;
/// 邮箱
String? email;
/// 所在部门的id
String? departmentID;
/// 排序方式
int? order;
/// 职位
String? position;
/// 是否是领导
int? leader;
/// 状态
int? status;
/// 创建时间
int? createTime;
/// 扩展字段
String? ex;
/// 附加信息
String? attachedInfo;
/// 搜索时使用
String? departmentName;
/// 所在部门的所有上级部门
List<DeptInfo>? parentDepartmentList;
DeptMemberInfo({
this.userID,
this.nickname,
this.englishName,
this.faceURL,
this.gender,
this.mobile,
this.telephone,
this.birth,
this.email,
this.departmentID,
this.order,
this.position,
this.leader,
this.status,
this.createTime,
this.ex,
this.attachedInfo,
this.departmentName,
this.parentDepartmentList,
});
DeptMemberInfo.fromJson(Map<String, dynamic> json) {
userID = json['userID'];
nickname = json['nickname'];
englishName = json['englishName'];
faceURL = json['faceURL'];
gender = json['gender'];
mobile = json['mobile'];
telephone = json['telephone'];
birth = json['birth'];
email = json['email'];
departmentID = json['departmentID'];
order = json['order'];
position = json['position'];
leader = json['leader'];
status = json['status'];
createTime = json['createTime'];
ex = json['ex'];
attachedInfo = json['attachedInfo'];
departmentName = json['departmentName'];
if (json['parentDepartmentList'] != null) {
parentDepartmentList = <DeptInfo>[];
json['parentDepartmentList'].forEach((v) {
parentDepartmentList!.add(DeptInfo.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['userID'] = this.userID;
data['nickname'] = this.nickname;
data['englishName'] = this.englishName;
data['faceURL'] = this.faceURL;
data['gender'] = this.gender;
data['mobile'] = this.mobile;
data['telephone'] = this.telephone;
data['birth'] = this.birth;
data['email'] = this.email;
data['departmentID'] = this.departmentID;
data['order'] = this.order;
data['position'] = this.position;
data['leader'] = this.leader;
data['status'] = this.status;
data['createTime'] = this.createTime;
data['ex'] = this.ex;
data['attachedInfo'] = this.attachedInfo;
data['departmentName'] = this.departmentName;
if (this.parentDepartmentList != null) {
data['parentDepartmentList'] =
this.parentDepartmentList!.map((v) => v.toJson()).toList();
}
return data;
}
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is DeptMemberInfo &&
runtimeType == other.runtimeType &&
userID == other.userID;
@override
int get hashCode => userID.hashCode;
}
/// 用户所在的部门
class UserInDept {
/// 部门信息
DeptInfo? department;
/// 所在部门自己的信息
DeptMemberInfo? member;
UserInDept({this.department, this.member});
UserInDept.fromJson(Map<String, dynamic> json) {
department = json['department'] != null
? DeptInfo.fromJson(json['department'])
: null;
member =
json['member'] != null ? DeptMemberInfo.fromJson(json['member']) : null;
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.department != null) {
data['department'] = this.department!.toJson();
}
if (this.member != null) {
data['member'] = this.member!.toJson();
}
return data;
}
}
/// 部门下的子部门跟员工
class DeptMemberAndSubDept {
/// 一级子部门
List<DeptInfo>? departmentList;
/// 一级成员
List<DeptMemberInfo>? departmentMemberList;
/// 当前部门的所有上一级部门
List<DeptInfo>? parentDepartmentList;
DeptMemberAndSubDept({
this.departmentList,
this.departmentMemberList,
this.parentDepartmentList,
});
DeptMemberAndSubDept.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));
});
}
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() {
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();
}
return data;
}
}

Some files were not shown because too many files have changed in this diff Show More