Compare commits

...

33 Commits
3.4.0 ... 3.8.1

Author SHA1 Message Date
Brett
6a446a7b33 chore: https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.8.1 2024-09-29 17:27:30 +08:00
Brett
9f57971ee9 feat: Added getFriendListPageMap interface. 2024-08-15 16:28:18 +08:00
Brett
29b43d03ac feat: Add input status related API; update synchronization monitoring related API. 2024-08-07 16:57:15 +08:00
Brett
cade0091a7 fix: Calling setConversationEx will report that type 'String' is not a subtype of type 'List<dynamic>' in type cast. (#138) 2024-08-07 14:55:35 +08:00
Brett
d90bb33764 feat: [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.8.1-rc.0) 2024-08-06 15:24:10 +08:00
Brett
8c64af6798 feat: [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.8.1-rc.0) 2024-08-06 15:22:10 +08:00
Brett
c10dabc7e8 feat: [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.8.0) 2024-08-02 21:59:30 +08:00
Brett
ff25636516 fix: Bug fixes and performance enhancements. 2024-07-28 19:02:22 +08:00
Brett
43d3f05d4d Update README.md 2024-05-16 14:45:23 +08:00
Brett
3b8ec30625 Update README.md 2024-04-25 21:01:53 +08:00
Brett
44fe1a3210 chore: https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.5.1 2024-03-06 21:01:19 +08:00
Brett
9b11686dac fix: https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.5.1-alpha.8 2024-02-02 11:05:32 +08:00
Brett
1764da125b fix: https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.5.1-alpha.7 2024-01-23 14:49:31 +08:00
Brett
bf4cdf0754 fix: https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.5.1-alpha.7 2024-01-23 14:32:11 +08:00
Brett
45cd497d94 fix: https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.5.1-alpha.7 2024-01-23 11:34:29 +08:00
Brett
1db776e23d fix: https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.5.1-alpha.7 2024-01-23 11:30:51 +08:00
Brett
98227756df chore: https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.5.1-alpha.2 2024-01-08 11:39:17 +08:00
oliver
da148f78e3 3.5.1-alpha.2 2024-01-08 11:05:06 +08:00
oliver
883627f077 3.5.0-rc.1+1 2024-01-02 15:02:19 +08:00
oliver
50f8350987 3.5.0-rc.2 2024-01-02 14:58:08 +08:00
oliver
d098a50eaa Merge remote-tracking branch 'origin/main' 2024-01-02 12:12:37 +08:00
oliver
9e50ecf341 3.5.0+1 2024-01-02 12:12:20 +08:00
oliver
9aa861ff74 3.5.0+1 2024-01-02 12:08:13 +08:00
oliver
cfadcc5e35 3.5.0+1 2024-01-02 11:59:26 +08:00
Brett
8b4b21e18d feat: https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.5.0-rc.1 2023-12-29 20:19:29 +08:00
Brett
2814122ba4 Merge branch 'main' of https://github.com/OpenIMSDK/Open-IM-SDK-Flutter 2023-12-13 16:28:33 +08:00
Brett
2e94254192 feat: Add the log upload function of SDK. 2023-12-13 16:28:25 +08:00
Brett
a9573dbc63 Update README.md 2023-11-22 11:30:48 +08:00
Brett
92dd3adad5 Correct homepage and other information. 2023-11-17 17:01:22 +08:00
Brett
ebae12f11d fix: 'Fix return value type of 'getFriendsInfo'. 2023-11-17 16:45:22 +08:00
Brett
0dec034a55 Adjust some fields and APIs. 2023-11-17 15:05:27 +08:00
Brett
2b3f062e5c chore: Adjust the default values of some properties. 2023-11-16 18:28:39 +08:00
Brett
a4b52f5895 fix: Fixed some parameter errors. 2023-11-16 16:20:54 +08:00
61 changed files with 1466 additions and 1065 deletions

View File

@@ -1,25 +1,27 @@
<component name="libraryTable"> <component name="libraryTable">
<library name="Dart SDK"> <library name="Dart SDK">
<CLASSES> <CLASSES>
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/async" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/async" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/cli" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/cli" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/collection" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/collection" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/convert" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/convert" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/core" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/core" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/developer" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/developer" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/ffi" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/ffi" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/html" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/html" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/indexed_db" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/indexed_db" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/io" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/io" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/isolate" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/isolate" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/js" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/js" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/js_util" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/js_interop" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/math" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/js_interop_unsafe" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/mirrors" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/js_util" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/svg" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/math" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/typed_data" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/mirrors" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/web_audio" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/svg" />
<root url="file://$PROJECT_DIR$/../../../framework/flutter/bin/cache/dart-sdk/lib/web_gl" /> <root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/typed_data" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/web_audio" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/web_gl" />
</CLASSES> </CLASSES>
<JAVADOC /> <JAVADOC />
<SOURCES /> <SOURCES />

1
.idea/misc.xml generated
View File

@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="FrameworkDetectionExcludesConfiguration"> <component name="FrameworkDetectionExcludesConfiguration">
<type id="android" /> <type id="android" />

View File

@@ -1,3 +1,39 @@
## 3.8.1
- [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.8.1)
## 3.8.1-rc.0
- [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.8.1-rc.0)
## 3.8.0
- [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.8.0)
## 3.8.0-rc.16
- [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.8.0-rc.16)
## 3.5.1
- [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.5.1)
## 3.5.1-alpha.7
- [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.5.1-alpha.7)
## 3.5.1-alpha.2
- [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.5.1-alpha.2)
## 3.5.0-rc.1
- [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.5.0-rc.1)
## 3.4.0+1
- Adjust some fields and APIs.
## 3.4.0 ## 3.4.0
- [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.4.0) - [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.4.0)

View File

@@ -36,7 +36,6 @@ final success = await OpenIM.iMManager.initSDK(
apiAddr: "", // SDK's API interface address. apiAddr: "", // SDK's API interface address.
wsAddr: "", // SDK's WebSocket address. wsAddr: "", // SDK's WebSocket address.
dataDir: "", // Data storage path. For example, you can use getApplicationDocumentsDirectory() to get a path. dataDir: "", // Data storage path. For example, you can use getApplicationDocumentsDirectory() to get a path.
objectStorage: 'cos', // Image server (default is 'cos').
logLevel: 6, // Log level (default value is 6). logLevel: 6, // Log level (default value is 6).
listener: OnConnectListener( listener: OnConnectListener(
onConnectSuccess: () { onConnectSuccess: () {
@@ -139,7 +138,7 @@ You can find a demo Flutter app that uses the SDK in the [open-im-flutter-demo](
- 📚 [OpenIM Community](https://github.com/OpenIMSDK/community) - 📚 [OpenIM Community](https://github.com/OpenIMSDK/community)
- 💕 [OpenIM Interest Group](https://github.com/Openim-sigs) - 💕 [OpenIM Interest Group](https://github.com/Openim-sigs)
- 🚀 [Join our Slack community](https://join.slack.com/t/openimsdk/shared_invite/zt-22720d66b-o_FvKxMTGXtcnnnHiMqe9Q) - 🚀 [Join our Slack community](https://join.slack.com/t/openimsdk/shared_invite/zt-2ijy1ys1f-O0aEDCr7ExRZ7mwsHAVg9A)
- :eyes: [Join our wechat (微信群)](https://openim-1253691595.cos.ap-nanjing.myqcloud.com/WechatIMG20.jpeg) - :eyes: [Join our wechat (微信群)](https://openim-1253691595.cos.ap-nanjing.myqcloud.com/WechatIMG20.jpeg)
## Community Meetings :calendar: ## Community Meetings :calendar:

View File

@@ -52,5 +52,5 @@ android {
dependencies { dependencies {
// 本地依赖现将aar复制到libs/io/openim/core-sdk/0.0.1/ 下命名core-sdk-0.0.1.aar // 本地依赖现将aar复制到libs/io/openim/core-sdk/0.0.1/ 下命名core-sdk-0.0.1.aar
// implementation 'io.openim:core-sdk:0.0.1@aar' // implementation 'io.openim:core-sdk:0.0.1@aar'
implementation 'io.openim:core-sdk:3.4.0@aar' implementation 'io.openim:core-sdk:3.8.1@aar'
} }

View File

@@ -37,42 +37,6 @@ public class OnAdvancedMsgListener implements open_im_sdk_callback.OnAdvancedMsg
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("groupMsgReceiptList", s);
CommonUtil.emitEvent("advancedMsgListener", "onRecvGroupReadReceipt", values);
}
@Override
public void onRecvMessageExtensionsAdded(String s, String s1) {
final Map<String, String> values = new ArrayMap<>();
values.put("id", id);
values.put("msgID", s);
values.put("reactionExtensionList", s1);
CommonUtil.emitEvent("advancedMsgListener", "onRecvMessageExtensionsAdded", values);
}
@Override
public void onRecvMessageExtensionsChanged(String s, String s1) {
final Map<String, String> values = new ArrayMap<>();
values.put("id", id);
values.put("msgID", s);
values.put("reactionExtensionList", s1);
CommonUtil.emitEvent("advancedMsgListener", "onRecvMessageExtensionsChanged", values);
}
@Override
public void onRecvMessageExtensionsDeleted(String s, String s1) {
final Map<String, String> values = new ArrayMap<>();
values.put("id", id);
values.put("msgID", s);
values.put("reactionExtensionKeyList", s1);
CommonUtil.emitEvent("advancedMsgListener", "onRecvMessageExtensionsDeleted", values);
}
@Override @Override
public void onRecvNewMessage(String s) { public void onRecvNewMessage(String s) {
final Map<String, String> values = new ArrayMap<>(); final Map<String, String> values = new ArrayMap<>();
@@ -88,4 +52,12 @@ public class OnAdvancedMsgListener implements open_im_sdk_callback.OnAdvancedMsg
values.put("message", s); values.put("message", s);
CommonUtil.emitEvent("advancedMsgListener", "onRecvOfflineNewMessage", values); CommonUtil.emitEvent("advancedMsgListener", "onRecvOfflineNewMessage", values);
} }
@Override
public void onRecvOnlineOnlyMessage(String s) {
final Map<String, String> values = new ArrayMap<>();
values.put("id", id);
values.put("message", s);
CommonUtil.emitEvent("advancedMsgListener", "onRecvOnlineOnlyMessage", values);
}
} }

View File

@@ -19,13 +19,15 @@ public class OnBaseListener implements Base {
@Override @Override
public void onError(int l, String s) { public void onError(int l, String s) {
Log.i("F-OpenIMSDK(native call flutter)", "method: 【 " + call.method + " 】, onError: { code:" + l + ", message:" + s + "}"); String threadName = Thread.currentThread().getName();
Log.i("F-OpenIMSDK(native call flutter)", "thread: " + threadName + " method: 【 " + call.method + " 】, onError: { code:" + l + ", message:" + s + "}");
CommonUtil.runMainThreadReturnError(result, l, s, null); CommonUtil.runMainThreadReturnError(result, l, s, null);
} }
@Override @Override
public void onSuccess(String s) { public void onSuccess(String s) {
Log.i("F-OpenIMSDK(native call flutter)", "method: 【 " + call.method + " 】, onSuccess: " + s); String threadName = Thread.currentThread().getName();
Log.i("F-OpenIMSDK(native call flutter)", "thread: " + threadName + " method: 【 " + call.method + " 】, onSuccess: " + s);
CommonUtil.runMainThreadReturn(result, s); CommonUtil.runMainThreadReturn(result, s);
} }
} }

View File

@@ -31,4 +31,9 @@ public class OnConnListener implements open_im_sdk_callback.OnConnListener {
public void onUserTokenExpired() { public void onUserTokenExpired() {
CommonUtil.emitEvent("connectListener", "onUserTokenExpired", null); CommonUtil.emitEvent("connectListener", "onUserTokenExpired", null);
} }
@Override
public void onUserTokenInvalid(String s) {
CommonUtil.emitEvent("connectListener", "onUserTokenInvalid", s);
}
} }

View File

@@ -10,24 +10,34 @@ public class OnConversationListener implements open_im_sdk_callback.OnConversati
CommonUtil.emitEvent("conversationListener", "onConversationChanged", s); CommonUtil.emitEvent("conversationListener", "onConversationChanged", s);
} }
@Override
public void onConversationUserInputStatusChanged(String s) {
CommonUtil.emitEvent("conversationListener", "onConversationUserInputStatusChanged", s);
}
@Override @Override
public void onNewConversation(String s) { public void onNewConversation(String s) {
CommonUtil.emitEvent("conversationListener", "onNewConversation", s); CommonUtil.emitEvent("conversationListener", "onNewConversation", s);
} }
@Override @Override
public void onSyncServerFailed() { public void onSyncServerFailed(boolean reinstalled) {
CommonUtil.emitEvent("conversationListener", "onSyncServerFailed", null); CommonUtil.emitEvent("conversationListener", "onSyncServerFailed", reinstalled);
} }
@Override @Override
public void onSyncServerFinish() { public void onSyncServerFinish(boolean reinstalled) {
CommonUtil.emitEvent("conversationListener", "onSyncServerFinish", null); CommonUtil.emitEvent("conversationListener", "onSyncServerFinish", reinstalled);
} }
@Override @Override
public void onSyncServerStart() { public void onSyncServerStart(boolean reinstalled) {
CommonUtil.emitEvent("conversationListener", "onSyncServerStart", null); CommonUtil.emitEvent("conversationListener", "onSyncServerStart", reinstalled);
}
@Override
public void onSyncServerProgress(long progress) {
CommonUtil.emitEvent("conversationListener", "onSyncServerProgress", progress);
} }
@Override @Override

View File

@@ -1,30 +1,30 @@
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;
//
public class OnListenerForService implements open_im_sdk_callback.OnListenerForService { //public class OnListenerForService implements open_im_sdk_callback.OnListenerForService {
@Override // @Override
public void onFriendApplicationAccepted(String s) { // public void onFriendApplicationAccepted(String s) {
CommonUtil.emitEvent("listenerForService", "onFriendApplicationAccepted", s); // CommonUtil.emitEvent("listenerForService", "onFriendApplicationAccepted", s);
} // }
//
@Override // @Override
public void onFriendApplicationAdded(String s) { // public void onFriendApplicationAdded(String s) {
CommonUtil.emitEvent("listenerForService", "onFriendApplicationAdded", s); // CommonUtil.emitEvent("listenerForService", "onFriendApplicationAdded", s);
} // }
//
@Override // @Override
public void onGroupApplicationAccepted(String s) { // public void onGroupApplicationAccepted(String s) {
CommonUtil.emitEvent("listenerForService", "onGroupApplicationAccepted", s); // CommonUtil.emitEvent("listenerForService", "onGroupApplicationAccepted", s);
} // }
//
@Override // @Override
public void onGroupApplicationAdded(String s) { // public void onGroupApplicationAdded(String s) {
CommonUtil.emitEvent("listenerForService", "onGroupApplicationAdded", s); // CommonUtil.emitEvent("listenerForService", "onGroupApplicationAdded", s);
} // }
//
@Override // @Override
public void onRecvNewMessage(String s) { // public void onRecvNewMessage(String s) {
CommonUtil.emitEvent("listenerForService", "onRecvNewMessage", s); // CommonUtil.emitEvent("listenerForService", "onRecvNewMessage", s);
} // }
} //}

View File

@@ -0,0 +1,26 @@
package io.openim.flutter_openim_sdk.listener;
import android.util.ArrayMap;
import java.util.Map;
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.UploadLogProgress;
public class OnUploadLogsListener implements UploadLogProgress {
final private MethodChannel.Result result;
public OnUploadLogsListener(MethodChannel.Result result, MethodCall call) {
this.result = result;
}
@Override
public void onProgress(long current, long size) {
final Map<String, Object> values = new ArrayMap<>();
values.put("current", current);
values.put("size", size);
CommonUtil.emitEvent("uploadLogsListener", "onProgress", values);
}
}

View File

@@ -13,4 +13,19 @@ public class OnUserListener implements open_im_sdk_callback.OnUserListener {
public void onUserStatusChanged(String s) { public void onUserStatusChanged(String s) {
CommonUtil.emitEvent("userListener", "onUserStatusChanged", s); CommonUtil.emitEvent("userListener", "onUserStatusChanged", s);
} }
@Override
public void onUserCommandAdd(String s) {
CommonUtil.emitEvent("userListener", "onUserCommandAdd", s);
}
@Override
public void onUserCommandDelete(String s) {
CommonUtil.emitEvent("userListener", "onUserCommandDelete", s);
}
@Override
public void onUserCommandUpdate(String s) {
CommonUtil.emitEvent("userListener", "onUserCommandUpdate", s);
}
} }

View File

@@ -59,15 +59,6 @@ public class ConversationManager extends BaseManager {
); );
} }
public void pinConversation(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.pinConversation(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID"),
value(methodCall, "isPinned")
);
}
public void hideConversation(MethodCall methodCall, MethodChannel.Result result) { public void hideConversation(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.hideConversation( Open_im_sdk.hideConversation(
new OnBaseListener(result, methodCall), new OnBaseListener(result, methodCall),
@@ -98,32 +89,6 @@ public class ConversationManager extends BaseManager {
int2long(methodCall, "sessionType"))); int2long(methodCall, "sessionType")));
} }
public void setConversationRecvMessageOpt(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setConversationRecvMessageOpt(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID"),
int2long(methodCall, "status")
);
}
public void getConversationRecvMessageOpt(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getConversationRecvMessageOpt(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "conversationIDList")
);
}
public void setConversationPrivateChat(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setConversationPrivateChat(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID"),
value(methodCall, "isPrivate")
);
}
public void clearConversationAndDeleteAllMsg(MethodCall methodCall, MethodChannel.Result result) { public void clearConversationAndDeleteAllMsg(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.clearConversationAndDeleteAllMsg( Open_im_sdk.clearConversationAndDeleteAllMsg(
new OnBaseListener(result, methodCall), new OnBaseListener(result, methodCall),
@@ -140,60 +105,58 @@ public class ConversationManager extends BaseManager {
); );
} }
public void deleteAllConversationFromLocal(MethodCall methodCall, MethodChannel.Result result) {
}
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) { public void getAtAllTag(MethodCall methodCall, MethodChannel.Result result) {
CommonUtil.runMainThreadReturn(result, Open_im_sdk.getAtAllTag(value(methodCall, "operationID"))); CommonUtil.runMainThreadReturn(result, Open_im_sdk.getAtAllTag(value(methodCall, "operationID")));
} }
public void setGlobalRecvMessageOpt(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGlobalRecvMessageOpt(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
int2long(methodCall, "status")
);
}
public void setConversationBurnDuration(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setConversationBurnDuration(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID"),
value(methodCall, "burnDuration")
);
}
public void setConversationIsMsgDestruct(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setConversationIsMsgDestruct(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID"),
value(methodCall, "isMsgDestruct")
);
}
public void setConversationMsgDestructTime(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setConversationMsgDestructTime(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID"),
int2long(methodCall, "duration")
);
}
public void hideAllConversations(MethodCall methodCall, MethodChannel.Result result) { public void hideAllConversations(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.hideAllConversations( Open_im_sdk.hideAllConversations(
new OnBaseListener(result, methodCall), new OnBaseListener(result, methodCall),
value(methodCall, "operationID") value(methodCall, "operationID")
); );
} }
public void searchConversation(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.searchConversation(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "name")
);
}
public void changeInputStates(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.changeInputStates(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID"),
value(methodCall, "focus")
);
}
public void getInputStates(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getInputStates(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID"),
value(methodCall, "userID")
);
}
public void setConversation(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setConversation(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID"),
jsonValue(methodCall, "req")
);
}
public void searchConversations(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.searchConversation(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "name")
);
}
} }

View File

@@ -19,7 +19,8 @@ public class FriendshipManager extends BaseManager {
Open_im_sdk.getSpecifiedFriendsInfo( Open_im_sdk.getSpecifiedFriendsInfo(
new OnBaseListener(result, methodCall), new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
jsonValue(methodCall, "userIDList") jsonValue(methodCall, "userIDList"),
value(methodCall, "filterBlack")
); );
} }
@@ -48,15 +49,18 @@ public class FriendshipManager extends BaseManager {
public void getFriendList(MethodCall methodCall, MethodChannel.Result result) { public void getFriendList(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getFriendList( Open_im_sdk.getFriendList(
new OnBaseListener(result, methodCall), new OnBaseListener(result, methodCall),
value(methodCall, "operationID") value(methodCall, "operationID"),
value(methodCall, "filterBlack")
); );
} }
public void setFriendRemark(MethodCall methodCall, MethodChannel.Result result) { public void getFriendListPage(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setFriendRemark( Open_im_sdk.getFriendListPage(
new OnBaseListener(result, methodCall), new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
jsonValue(methodCall) value(methodCall, "offset"),
value(methodCall, "count"),
value(methodCall, "filterBlack")
); );
} }
@@ -64,7 +68,8 @@ public class FriendshipManager extends BaseManager {
Open_im_sdk.addBlack( Open_im_sdk.addBlack(
new OnBaseListener(result, methodCall), new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
value(methodCall, "userID") value(methodCall, "userID"),
value(methodCall, "ex")
); );
} }
@@ -122,4 +127,12 @@ public class FriendshipManager extends BaseManager {
jsonValue(methodCall, "searchParam") jsonValue(methodCall, "searchParam")
); );
} }
public void updateFriends(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.updateFriends(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "req")
);
}
} }

View File

@@ -62,6 +62,15 @@ public class GroupManager extends BaseManager {
); );
} }
public void getJoinedGroupListPage(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getJoinedGroupListPage(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "offset"),
value(methodCall, "count")
);
}
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), new OnBaseListener(result, methodCall),
@@ -92,7 +101,8 @@ public class GroupManager extends BaseManager {
value(methodCall, "operationID"), value(methodCall, "operationID"),
value(methodCall, "groupID"), value(methodCall, "groupID"),
value(methodCall, "reason"), value(methodCall, "reason"),
value(methodCall, "joinSource") value(methodCall, "joinSource"),
value(methodCall, "ex")
); );
} }
@@ -176,15 +186,6 @@ public class GroupManager extends BaseManager {
); );
} }
public void setGroupMemberNickname(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGroupMemberNickname(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID"),
value(methodCall, "userID"),
value(methodCall, "groupNickname")
);
}
public void searchGroups(MethodCall methodCall, MethodChannel.Result result) { public void searchGroups(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.searchGroups(new OnBaseListener(result, methodCall), Open_im_sdk.searchGroups(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
@@ -192,15 +193,6 @@ public class GroupManager extends BaseManager {
); );
} }
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) { public void getGroupMemberListByJoinTimeFilter(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getGroupMemberListByJoinTimeFilter(new OnBaseListener(result, methodCall), Open_im_sdk.getGroupMemberListByJoinTimeFilter(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
@@ -213,30 +205,6 @@ public class GroupManager extends BaseManager {
); );
} }
public void setGroupVerification(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGroupVerification(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID"),
value(methodCall, "needVerification")
);
}
public void setGroupLookMemberInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGroupLookMemberInfo(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID"),
value(methodCall, "status")
);
}
public void setGroupApplyMemberFriend(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGroupApplyMemberFriend(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID"),
value(methodCall, "status")
);
}
public void getGroupMemberOwnerAndAdmin(MethodCall methodCall, MethodChannel.Result result) { public void getGroupMemberOwnerAndAdmin(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getGroupMemberOwnerAndAdmin(new OnBaseListener(result, methodCall), Open_im_sdk.getGroupMemberOwnerAndAdmin(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
@@ -264,4 +232,12 @@ public class GroupManager extends BaseManager {
value(methodCall, "groupID") value(methodCall, "groupID")
); );
} }
public void getUsersInGroup(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getUsersInGroup(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID"),
jsonValue(methodCall, "userIDs")
);
}
} }

View File

@@ -6,6 +6,7 @@ import io.openim.flutter_openim_sdk.FlutterOpenimSdkPlugin;
import io.openim.flutter_openim_sdk.listener.OnBaseListener; import io.openim.flutter_openim_sdk.listener.OnBaseListener;
import io.openim.flutter_openim_sdk.listener.OnConnListener; import io.openim.flutter_openim_sdk.listener.OnConnListener;
import io.openim.flutter_openim_sdk.listener.OnUploadFileListener; import io.openim.flutter_openim_sdk.listener.OnUploadFileListener;
import io.openim.flutter_openim_sdk.listener.OnUploadLogsListener;
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;
@@ -62,6 +63,28 @@ public class IMManager extends BaseManager {
); );
} }
public void uploadLogs(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.uploadLogs(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
int2long(methodCall, "line"),
value(methodCall, "ex"),
new OnUploadLogsListener(result, methodCall)
);
}
public void logs(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.logs(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
int2long(methodCall, "logLevel"),
value(methodCall, "file"),
int2long(methodCall, "line"),
value(methodCall, "msgs"),
value(methodCall, "err"),
value(methodCall, "keyAndValue")
);
}
public void setAppBackgroundStatus(MethodCall methodCall, MethodChannel.Result result) { public void setAppBackgroundStatus(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setAppBackgroundStatus( Open_im_sdk.setAppBackgroundStatus(

View File

@@ -27,7 +27,8 @@ public class MessageManager extends BaseManager {
jsonValue(methodCall, "message"), jsonValue(methodCall, "message"),
value(methodCall, "userID"), value(methodCall, "userID"),
value(methodCall, "groupID"), value(methodCall, "groupID"),
jsonValue(methodCall, "offlinePushInfo") jsonValue(methodCall, "offlinePushInfo"),
value(methodCall, "isOnlineOnly")
); );
} }
@@ -338,7 +339,8 @@ public class MessageManager extends BaseManager {
jsonValue(methodCall, "message"), jsonValue(methodCall, "message"),
value(methodCall, "userID"), value(methodCall, "userID"),
value(methodCall, "groupID"), value(methodCall, "groupID"),
jsonValue(methodCall, "offlinePushInfo") jsonValue(methodCall, "offlinePushInfo"),
value(methodCall, "isOnlineOnly")
); );
} }

View File

@@ -61,12 +61,4 @@ public class UserManager extends BaseManager {
value(methodCall, "operationID"), value(methodCall, "operationID"),
jsonValue(methodCall, "userIDs")); jsonValue(methodCall, "userIDs"));
} }
public void getUsersInfoWithCache(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getUsersInfoWithCache(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "userIDs"),
value(methodCall, "groupID"));
}
} }

View File

@@ -33,6 +33,7 @@ public class CommonUtil {
} }
public synchronized static <T> void emitEvent(String method, String type, Object errCode, String errMsg, T data) { public synchronized static <T> void emitEvent(String method, String type, Object errCode, String errMsg, T data) {
String threadName = Thread.currentThread().getName();
runMainThread(() -> { runMainThread(() -> {
Map<String, Object> res = new ArrayMap<>(); Map<String, Object> res = new ArrayMap<>();
if (null != type) { if (null != type) {
@@ -47,7 +48,7 @@ public class CommonUtil {
if (null != errMsg) { if (null != errMsg) {
res.put("errMsg", errMsg); res.put("errMsg", errMsg);
} }
Log.i("F-OpenIMSDK(native call flutter)", "{ method:" + method + ", type:" + type + " }"); Log.i("F-OpenIMSDK(native call flutter)", "thread: " + threadName + " { method:" + method + ", type:" + type + " }");
FlutterOpenimSdkPlugin.channel.invokeMethod(method, res); FlutterOpenimSdkPlugin.channel.invokeMethod(method, res);
}); });
} }

View File

@@ -1,9 +1,9 @@
buildscript { buildscript {
repositories { repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' } maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' } maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' } maven { url 'https://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }
google() google()
mavenCentral() mavenCentral()
} }
@@ -15,10 +15,10 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' } maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' } maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' } maven { url 'https://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }
google() google()
mavenCentral() mavenCentral()
} }
@@ -30,6 +30,6 @@ subprojects {
project.evaluationDependsOn(':app') project.evaluationDependsOn(':app')
} }
task clean(type: Delete) { tasks.register("clean", Delete) {
delete rootProject.buildDir delete rootProject.buildDir
} }

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip

View File

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

29
example/ios/Podfile.lock Normal file
View File

@@ -0,0 +1,29 @@
PODS:
- Flutter (1.0.0)
- flutter_openim_sdk (0.0.1):
- Flutter
- OpenIMSDKCore (= 3.8.1-rc.0)
- OpenIMSDKCore (3.8.1-rc.0)
DEPENDENCIES:
- Flutter (from `Flutter`)
- flutter_openim_sdk (from `.symlinks/plugins/flutter_openim_sdk/ios`)
SPEC REPOS:
trunk:
- OpenIMSDKCore
EXTERNAL SOURCES:
Flutter:
:path: Flutter
flutter_openim_sdk:
:path: ".symlinks/plugins/flutter_openim_sdk/ios"
SPEC CHECKSUMS:
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
flutter_openim_sdk: 754e4ad0177918ce2c37dfba63973db26ce89c90
OpenIMSDKCore: 0c92e9e3eb2a91b6b6528e7781a1e28ed42bc518
PODFILE CHECKSUM: d4ba08011ff3d270b662299a448a7c436eb30089
COCOAPODS: 1.14.3

View File

@@ -341,14 +341,14 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = BDLHL8GNFV; DEVELOPMENT_TEAM = V57RT7LMFH;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = cn.rentsoft.uni; PRODUCT_BUNDLE_IDENTIFIER = io.openim.sdk.example;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@@ -473,14 +473,14 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = BDLHL8GNFV; DEVELOPMENT_TEAM = V57RT7LMFH;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = cn.rentsoft.uni; PRODUCT_BUNDLE_IDENTIFIER = io.openim.sdk.example;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -497,14 +497,14 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = BDLHL8GNFV; DEVELOPMENT_TEAM = V57RT7LMFH;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = cn.rentsoft.uni; PRODUCT_BUNDLE_IDENTIFIER = io.openim.sdk.example;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;

View File

@@ -19,7 +19,6 @@ class _MyAppState extends State<MyApp> {
apiAddr: '', apiAddr: '',
wsAddr: '', wsAddr: '',
dataDir: '/', dataDir: '/',
objectStorage: 'minio',
listener: OnConnectListener()); listener: OnConnectListener());
} }

View File

@@ -5,56 +5,56 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: async name: async
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "2.10.0" version: "2.11.0"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
name: boolean_selector name: boolean_selector
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.1" version: "2.1.1"
characters: characters:
dependency: transitive dependency: transitive
description: description:
name: characters name: characters
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.1" version: "1.3.0"
clock: clock:
dependency: transitive dependency: transitive
description: description:
name: clock name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.1" version: "1.1.1"
collection: collection:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "1.17.0" version: "1.18.0"
cupertino_icons: cupertino_icons:
dependency: "direct main" dependency: "direct main"
description: description:
name: cupertino_icons name: cupertino_icons
sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.5" version: "1.0.6"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
name: fake_async name: fake_async
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.1" version: "1.3.1"
flutter: flutter:
@@ -68,52 +68,68 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "3.4.0" version: "3.8.1"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
js: leak_tracker:
dependency: transitive dependency: transitive
description: description:
name: js name: leak_tracker
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "0.6.5" version: "10.0.4"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
url: "https://pub.dev"
source: hosted
version: "3.0.3"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
url: "https://pub.dev"
source: hosted
version: "3.0.1"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "0.12.13" version: "0.12.16+1"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.0" version: "0.8.0"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "1.8.0" version: "1.12.0"
path: path:
dependency: transitive dependency: transitive
description: description:
name: path name: path
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "1.8.2" version: "1.9.0"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@@ -123,32 +139,32 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "1.9.1" version: "1.10.0"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
name: stack_trace name: stack_trace
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "1.11.0" version: "1.11.1"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
name: stream_channel name: stream_channel
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.1" version: "2.1.2"
string_scanner: string_scanner:
dependency: transitive dependency: transitive
description: description:
name: string_scanner name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
term_glyph: term_glyph:
@@ -156,25 +172,33 @@ packages:
description: description:
name: term_glyph name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.1" version: "1.2.1"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "0.4.16" version: "0.7.0"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.flutter-io.cn" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.4" version: "2.1.4"
vm_service:
dependency: transitive
description:
name: vm_service
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
url: "https://pub.dev"
source: hosted
version: "14.2.1"
sdks: sdks:
dart: ">=2.18.0 <3.0.0" dart: ">=3.3.0 <4.0.0"
flutter: ">=1.20.0" flutter: ">=3.18.0-18.0.pre.54"

View File

@@ -8,7 +8,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_openim_sdk_example/main.dart'; import '../lib/main.dart';
void main() { void main() {
testWidgets('Verify Platform version', (WidgetTester tester) async { testWidgets('Verify Platform version', (WidgetTester tester) async {
@@ -18,8 +18,7 @@ void main() {
// Verify that platform version is retrieved. // Verify that platform version is retrieved.
expect( expect(
find.byWidgetPredicate( find.byWidgetPredicate(
(Widget widget) => widget is Text && (Widget widget) => widget is Text && widget.data!.startsWith('Running on:'),
widget.data!.startsWith('Running on:'),
), ),
findsOneWidget, findsOneWidget,
); );

38
ios/.gitignore vendored
View File

@@ -1,38 +0,0 @@
.idea/
.vagrant/
.sconsign.dblite
.svn/
.DS_Store
*.swp
profile
DerivedData/
build/
GeneratedPluginRegistrant.h
GeneratedPluginRegistrant.m
.generated/
*.pbxuser
*.mode1v3
*.mode2v3
*.perspectivev3
!default.pbxuser
!default.mode1v3
!default.mode2v3
!default.perspectivev3
xcuserdata
*.moved-aside
*.pyc
*sync/
Icon?
.tags*
/Flutter/Generated.xcconfig
/Flutter/ephemeral/
/Flutter/flutter_export_environment.sh

View File

View File

@@ -2,155 +2,146 @@ import Foundation
import OpenIMCore import OpenIMCore
public class ConversationManager: BaseServiceManager { public class ConversationManager: BaseServiceManager {
public override func registerHandlers() { public override func registerHandlers() {
super.registerHandlers() super.registerHandlers()
self["setConversationListener"] = setConversationListener self["changeInputStates"] = changeInputStates
self["getAllConversationList"] = getAllConversationList
self["getConversationListSplit"] = getConversationListSplit
self["getOneConversation"] = getOneConversation
self["getMultipleConversation"] = getMultipleConversation
self["setConversationDraft"] = setConversationDraft
self["pinConversation"] = pinConversation
self["hideConversation"] = hideConversation
self["markConversationMessageAsRead"] = markConversationMessageAsRead
self["getTotalUnreadMsgCount"] = getTotalUnreadMsgCount
self["getConversationIDBySessionType"] = getConversationIDBySessionType
self["setConversationRecvMessageOpt"] = setConversationRecvMessageOpt
self["getConversationRecvMessageOpt"] = getConversationRecvMessageOpt
self["setConversationPrivateChat"] = setConversationPrivateChat
self["clearConversationAndDeleteAllMsg"] = clearConversationAndDeleteAllMsg self["clearConversationAndDeleteAllMsg"] = clearConversationAndDeleteAllMsg
self["deleteConversationAndDeleteAllMsg"] = deleteConversationAndDeleteAllMsg self["deleteConversationAndDeleteAllMsg"] = deleteConversationAndDeleteAllMsg
self["deleteAllConversationFromLocal"] = deleteAllConversationFromLocal self["getAllConversationList"] = getAllConversationList
self["resetConversationGroupAtType"] = resetConversationGroupAtType
self["getAtAllTag"] = getAtAllTag self["getAtAllTag"] = getAtAllTag
self["setGlobalRecvMessageOpt"] = setGlobalRecvMessageOpt self["getConversationIDBySessionType"] = getConversationIDBySessionType
self["setConversationBurnDuration"] = setConversationBurnDuration self["getConversationListSplit"] = getConversationListSplit
self["getInputStates"] = getInputStates
self["getMultipleConversation"] = getMultipleConversation
self["getOneConversation"] = getOneConversation
self["getTotalUnreadMsgCount"] = getTotalUnreadMsgCount
self["hideAllConversations"] = hideAllConversations self["hideAllConversations"] = hideAllConversations
self["hideConversation"] = hideConversation
self["markConversationMessageAsRead"] = markConversationMessageAsRead
self["searchConversation"] = searchConversation
self["setConversationDraft"] = setConversationDraft
self["setConversationListener"] = setConversationListener
self["setConversation"] = setConversation
self["searchConversations"] = searchConversations
} }
func setConversationListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func changeInputStates(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSetConversationListener(ConversationListener(channel: channel)) Open_im_sdkChangeInputStates(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[bool: "focus"])
callBack(result)
} }
func getAllConversationList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func clearConversationAndDeleteAllMsg(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkClearConversationAndDeleteAllMsg(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"])
}
func deleteConversationAndDeleteAllMsg(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkDeleteConversationAndDeleteAllMsg(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"])
}
func getAllConversationList(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetAllConversationList(BaseCallback(result: result), methodCall[string: "operationID"]) Open_im_sdkGetAllConversationList(BaseCallback(result: result), methodCall[string: "operationID"])
} }
func getConversationListSplit(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getAtAllTag(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetConversationListSplit(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "offset"], methodCall[int: "count"]) callBack(result, Open_im_sdkGetAtAllTag(methodCall[string: "operationID"]))
} }
func getOneConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getConversationIDBySessionType(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetOneConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int32: "sessionType"], methodCall[string: "sourceID"]) let conversationID = Open_im_sdkGetConversationIDBySessionType(methodCall[string: "operationID"], methodCall[string: "sourceID"], methodCall[int: "sessionType"])
}
func getMultipleConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetMultipleConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "conversationIDList"])
}
func setConversationDraft(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetConversationDraft(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[string: "draftText"])
}
func pinConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkPinConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[bool: "isPinned"])
}
func hideConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkHideConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"])
}
func markConversationMessageAsRead(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkMarkConversationMessageAsRead(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"])
}
func getTotalUnreadMsgCount(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetTotalUnreadMsgCount(BaseCallback(result: result), methodCall[string: "operationID"])
}
func getConversationIDBySessionType(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let conversationID = Open_im_sdkGetConversationIDBySessionType( methodCall[string: "operationID"],methodCall[string: "sourceID"], methodCall[int: "sessionType"])
callBack(result, conversationID) callBack(result, conversationID)
} }
func setConversationRecvMessageOpt(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getConversationListSplit(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSetConversationRecvMessageOpt(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[int: "status"]) Open_im_sdkGetConversationListSplit(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "offset"], methodCall[int: "count"])
} }
func getConversationRecvMessageOpt(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getInputStates(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetConversationRecvMessageOpt(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "conversationIDList"]) Open_im_sdkGetInputStates(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[string: "userID"])
}
func setConversationPrivateChat(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetConversationPrivateChat(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"],methodCall[bool: "isPrivate"])
}
func clearConversationAndDeleteAllMsg(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkClearConversationAndDeleteAllMsg(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"])
}
func deleteConversationAndDeleteAllMsg(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkDeleteConversationAndDeleteAllMsg(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"])
}
func deleteAllConversationFromLocal(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
}
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(methodCall[string: "operationID"]))
}
func setGlobalRecvMessageOpt(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGlobalRecvMessageOpt(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "status"])
}
func setConversationBurnDuration(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetConversationBurnDuration(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[int32: "burnDuration"])
} }
func hideAllConversations(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getMultipleConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkHideAllConversations(BaseCallback(result: result), methodCall[string: "operationID"]) Open_im_sdkGetMultipleConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "conversationIDList"])
}
func getOneConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetOneConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int32: "sessionType"], methodCall[string: "sourceID"])
}
func getTotalUnreadMsgCount(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetTotalUnreadMsgCount(BaseCallback(result: result), methodCall[string: "operationID"])
}
func hideAllConversations(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkHideAllConversations(BaseCallback(result: result), methodCall[string: "operationID"])
}
func hideConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkHideConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"])
}
func markConversationMessageAsRead(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkMarkConversationMessageAsRead(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"])
}
func searchConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSearchConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "name"])
}
func setConversationDraft(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSetConversationDraft(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[string: "draftText"])
}
func setConversationListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSetConversationListener(ConversationListener(channel: channel))
callBack(result)
}
func setConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSetConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[jsonString: "req"])
}
func searchConversations(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSearchConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "name"])
} }
} }
public class ConversationListener: NSObject, Open_im_sdk_callbackOnConversationListenerProtocol { public class ConversationListener: NSObject, Open_im_sdk_callbackOnConversationListenerProtocol {
private let channel:FlutterMethodChannel private let channel: FlutterMethodChannel
init(channel:FlutterMethodChannel) { init(channel: FlutterMethodChannel) {
self.channel = channel self.channel = channel
} }
public func onConversationChanged(_ conversationList: String?) { public func onConversationChanged(_ conversationList: String?) {
CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onConversationChanged", errCode: nil, errMsg: nil, data: conversationList) CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onConversationChanged", errCode: nil, errMsg: nil, data: conversationList)
} }
public func onConversationUserInputStatusChanged(_ change: String?) {
CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onConversationUserInputStatusChanged", errCode: nil, errMsg: nil, data: change)
}
public func onNewConversation(_ conversationList: String?) { public func onNewConversation(_ conversationList: String?) {
CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onNewConversation", errCode: nil, errMsg: nil, data: conversationList) CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onNewConversation", errCode: nil, errMsg: nil, data: conversationList)
} }
public func onSyncServerFailed() { public func onSyncServerFailed(_ reinstalled: Bool) {
CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerFailed", errCode: nil, errMsg: nil, data: nil) CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerFailed", errCode: nil, errMsg: nil, data: reinstalled)
} }
public func onSyncServerFinish() { public func onSyncServerFinish(_ reinstalled: Bool) {
CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerFinish", errCode: nil, errMsg: nil, data: nil) CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerFinish", errCode: nil, errMsg: nil, data: reinstalled)
} }
public func onSyncServerStart() { public func onSyncServerProgress(_ progress: Int) {
CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerStart", errCode: nil, errMsg: nil, data: nil) CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerProgress", errCode: nil, errMsg: nil, data: progress)
} }
public func onSyncServerStart(_ reinstalled: Bool) {
CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerStart", errCode: nil, errMsg: nil, data: reinstalled)
}
public func onTotalUnreadMessageCountChanged(_ totalUnreadCount: Int32) { public func onTotalUnreadMessageCountChanged(_ totalUnreadCount: Int32) {
CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onTotalUnreadMessageCountChanged", errCode: nil, errMsg: nil, data: totalUnreadCount) CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onTotalUnreadMessageCountChanged", errCode: nil, errMsg: nil, data: totalUnreadCount)
} }
} }

View File

@@ -5,64 +5,36 @@ public class FriendshipManager: BaseServiceManager {
public override func registerHandlers() { public override func registerHandlers() {
super.registerHandlers() super.registerHandlers()
self["setFriendListener"] = setFriendListener self["acceptFriendApplication"] = acceptFriendApplication
self["getFriendsInfo"] = getFriendsInfo
self["addFriend"] = addFriend
self["getFriendApplicationListAsRecipient"] = getFriendApplicationListAsRecipient
self["getFriendApplicationListAsApplicant"] = getFriendApplicationListAsApplicant
self["getFriendList"] = getFriendList
self["setFriendRemark"] = setFriendRemark
self["addBlacklist"] = addBlacklist self["addBlacklist"] = addBlacklist
self["getBlacklist"] = getBlacklist self["addFriend"] = addFriend
self["removeBlacklist"] = removeBlacklist
self["checkFriend"] = checkFriend self["checkFriend"] = checkFriend
self["deleteFriend"] = deleteFriend self["deleteFriend"] = deleteFriend
self["acceptFriendApplication"] = acceptFriendApplication self["getBlacklist"] = getBlacklist
self["getFriendApplicationListAsApplicant"] = getFriendApplicationListAsApplicant
self["getFriendApplicationListAsRecipient"] = getFriendApplicationListAsRecipient
self["getFriendList"] = getFriendList
self["getFriendListPage"] = getFriendListPage
self["getFriendsInfo"] = getFriendsInfo
self["refuseFriendApplication"] = refuseFriendApplication self["refuseFriendApplication"] = refuseFriendApplication
self["removeBlacklist"] = removeBlacklist
self["searchFriends"] = searchFriends self["searchFriends"] = searchFriends
self["setFriendListener"] = setFriendListener
self["updateFriends"] = updateFriends
} }
func setFriendListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func acceptFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetFriendListener(FriendshipListener(channel: channel)) Open_im_sdkAcceptFriendApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
callBack(result)
} }
func getFriendsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func addBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetSpecifiedFriendsInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "userIDList"]) Open_im_sdkAddBlack(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"], methodCall[string: "ex"])
} }
func addFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func addFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkAddFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) Open_im_sdkAddFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
} }
func getFriendApplicationListAsRecipient(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetFriendApplicationListAsRecipient(BaseCallback(result: result), methodCall[string: "operationID"])
}
func getFriendApplicationListAsApplicant(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetFriendApplicationListAsApplicant(BaseCallback(result: result), methodCall[string: "operationID"])
}
func getFriendList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetFriendList(BaseCallback(result: result), methodCall[string: "operationID"])
}
func setFriendRemark(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetFriendRemark(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
}
func addBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkAddBlack(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"])
}
func getBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetBlackList(BaseCallback(result: result), methodCall[string: "operationID"])
}
func removeBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkRemoveBlack(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"])
}
func checkFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func checkFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkCheckFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "userIDList"]) Open_im_sdkCheckFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "userIDList"])
} }
@@ -71,17 +43,50 @@ public class FriendshipManager: BaseServiceManager {
Open_im_sdkDeleteFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"]) Open_im_sdkDeleteFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"])
} }
func acceptFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkAcceptFriendApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) Open_im_sdkGetBlackList(BaseCallback(result: result), methodCall[string: "operationID"])
}
func getFriendApplicationListAsApplicant(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetFriendApplicationListAsApplicant(BaseCallback(result: result), methodCall[string: "operationID"])
}
func getFriendApplicationListAsRecipient(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetFriendApplicationListAsRecipient(BaseCallback(result: result), methodCall[string: "operationID"])
}
func getFriendList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetFriendList(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[bool: "filterBlack"])
}
func getFriendListPage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetFriendListPage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int32: "offset"], methodCall[int32: "count"], methodCall[bool: "filterBlack"])
}
func getFriendsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetSpecifiedFriendsInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "userIDList"], methodCall[bool: "filterBlack"])
} }
func refuseFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func refuseFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkRefuseFriendApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) Open_im_sdkRefuseFriendApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
} }
func removeBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkRemoveBlack(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"])
}
func searchFriends(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func searchFriends(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSearchFriends(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"]) Open_im_sdkSearchFriends(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"])
} }
func setFriendListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetFriendListener(FriendshipListener(channel: channel))
callBack(result)
}
func updateFriends(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkUpdateFriends(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "req"])
}
} }
public class FriendshipListener: NSObject, Open_im_sdk_callbackOnFriendshipListenerProtocol { public class FriendshipListener: NSObject, Open_im_sdk_callbackOnFriendshipListenerProtocol {
@@ -127,4 +132,3 @@ public class FriendshipListener: NSObject, Open_im_sdk_callbackOnFriendshipListe
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)
} }
} }

View File

@@ -5,207 +5,194 @@ public class GroupManager: BaseServiceManager {
public override func registerHandlers() { public override func registerHandlers() {
super.registerHandlers() super.registerHandlers()
self["setGroupListener"] = setGroupListener
self["inviteUserToGroup"] = inviteUserToGroup
self["kickGroupMember"] = kickGroupMember
self["getGroupMembersInfo"] = getGroupMembersInfo
self["getGroupMemberList"] = getGroupMemberList
self["getJoinedGroupList"] = getJoinedGroupList
self["createGroup"] = createGroup
self["setGroupInfo"] = setGroupInfo
self["getGroupsInfo"] = getGroupsInfo
self["joinGroup"] = joinGroup
self["quitGroup"] = quitGroup
self["transferGroupOwner"] = transferGroupOwner
self["getGroupApplicationListAsRecipient"] = getGroupApplicationListAsRecipient
self["getGroupApplicationListAsApplicant"] = getGroupApplicationListAsApplicant
self["acceptGroupApplication"] = acceptGroupApplication self["acceptGroupApplication"] = acceptGroupApplication
self["refuseGroupApplication"] = refuseGroupApplication
self["dismissGroup"] = dismissGroup
self["changeGroupMute"] = changeGroupMute
self["changeGroupMemberMute"] = changeGroupMemberMute self["changeGroupMemberMute"] = changeGroupMemberMute
self["setGroupMemberNickname"] = setGroupMemberNickname self["changeGroupMute"] = changeGroupMute
self["searchGroups"] = searchGroups self["createGroup"] = createGroup
self["setGroupMemberRoleLevel"] = setGroupMemberRoleLevel self["dismissGroup"] = dismissGroup
self["getGroupApplicationListAsApplicant"] = getGroupApplicationListAsApplicant
self["getGroupApplicationListAsRecipient"] = getGroupApplicationListAsRecipient
self["getGroupMemberList"] = getGroupMemberList
self["getGroupMemberListByJoinTimeFilter"] = getGroupMemberListByJoinTimeFilter self["getGroupMemberListByJoinTimeFilter"] = getGroupMemberListByJoinTimeFilter
self["setGroupVerification"] = setGroupVerification
self["setGroupLookMemberInfo"] = setGroupLookMemberInfo
self["setGroupApplyMemberFriend"] = setGroupApplyMemberFriend
self["getGroupMemberOwnerAndAdmin"] = getGroupMemberOwnerAndAdmin self["getGroupMemberOwnerAndAdmin"] = getGroupMemberOwnerAndAdmin
self["searchGroupMembers"] = searchGroupMembers self["getGroupMembersInfo"] = getGroupMembersInfo
self["setGroupMemberInfo"] = setGroupMemberInfo self["getGroupsInfo"] = getGroupsInfo
self["getJoinedGroupList"] = getJoinedGroupList
self["getJoinedGroupListPage"] = getJoinedGroupListPage
self["getUsersInGroup"] = getUsersInGroup
self["inviteUserToGroup"] = inviteUserToGroup
self["isJoinGroup"] = isJoinGroup self["isJoinGroup"] = isJoinGroup
self["joinGroup"] = joinGroup
self["kickGroupMember"] = kickGroupMember
self["quitGroup"] = quitGroup
self["refuseGroupApplication"] = refuseGroupApplication
self["searchGroupMembers"] = searchGroupMembers
self["searchGroups"] = searchGroups
self["setGroupInfo"] = setGroupInfo
self["setGroupListener"] = setGroupListener
self["setGroupMemberInfo"] = setGroupMemberInfo
self["transferGroupOwner"] = transferGroupOwner
} }
func setGroupListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func acceptGroupApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkAcceptGroupApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "userID"], methodCall[string: "handleMsg"])
}
func changeGroupMemberMute(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkChangeGroupMemberMute(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string:"userID"], methodCall[int:"seconds"])
}
func changeGroupMute(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkChangeGroupMute(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[bool: "mute"])
}
func createGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkCreateGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
}
func dismissGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkDismissGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"])
}
func getGroupApplicationListAsApplicant(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetGroupApplicationListAsApplicant(BaseCallback(result: result), methodCall[string: "operationID"])
}
func getGroupApplicationListAsRecipient(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetGroupApplicationListAsRecipient(BaseCallback(result: result), methodCall[string: "operationID"])
}
func getGroupMemberList(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetGroupMemberList(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32: "filter"],
methodCall[int32: "offset"], methodCall[int32: "count"])
}
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 getGroupMemberOwnerAndAdmin(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetGroupMemberOwnerAndAdmin(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"])
}
func getGroupMembersInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetSpecifiedGroupMembersInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[jsonString: "userIDList"])
}
func getGroupsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetSpecifiedGroupsInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "groupIDList"])
}
func getJoinedGroupList(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetJoinedGroupList(BaseCallback(result: result), methodCall[string: "operationID"])
}
func getJoinedGroupListPage(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetJoinedGroupListPage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int32: "offset"], methodCall[int32: "count"])
}
func getUsersInGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetUsersInGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"],
methodCall[jsonString: "userIDs"])
}
func inviteUserToGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkInviteUserToGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "reason"],
methodCall[jsonString: "userIDList"])
}
func isJoinGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkIsJoinGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"])
}
func joinGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkJoinGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string:
"reason"], methodCall[int32: "joinSource"], methodCall[jsonString: "ex"])
}
func kickGroupMember(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkKickGroupMember(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "reason"],
methodCall[jsonString: "userIDList"])
}
func quitGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkQuitGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"])
}
func refuseGroupApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkRefuseGroupApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "userID"], methodCall[string: "handleMsg"])
}
func searchGroupMembers(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSearchGroupMembers(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"])
}
func searchGroups(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSearchGroups(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"])
}
func setGroupInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSetGroupInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "groupInfo"])
}
func setGroupListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSetGroupListener(GroupListener(channel: channel)) Open_im_sdkSetGroupListener(GroupListener(channel: channel))
callBack(result) callBack(result)
} }
func inviteUserToGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func setGroupMemberInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkInviteUserToGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "reason"],
methodCall[jsonString: "userIDList"])
}
func kickGroupMember(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkKickGroupMember(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "reason"],
methodCall[jsonString: "userIDList"])
}
func getGroupMembersInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetSpecifiedGroupMembersInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[jsonString: "userIDList"])
}
func getGroupMemberList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetGroupMemberList(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32: "filter"],
methodCall[int32: "offset"], methodCall[int32: "count"])
}
func getJoinedGroupList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetJoinedGroupList(BaseCallback(result: result), methodCall[string: "operationID"])
}
func createGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkCreateGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
}
func setGroupInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "groupInfo"])
}
func getGroupsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetSpecifiedGroupsInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "groupIDList"])
}
func joinGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkJoinGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "reason"], methodCall[int32: "joinSource"])
}
func quitGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkQuitGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"])
}
func transferGroupOwner(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkTransferGroupOwner(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "userID"])
}
func getGroupApplicationListAsRecipient(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetGroupApplicationListAsRecipient(BaseCallback(result: result), methodCall[string: "operationID"])
}
func getGroupApplicationListAsApplicant(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetGroupApplicationListAsApplicant(BaseCallback(result: result), methodCall[string: "operationID"])
}
func acceptGroupApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkAcceptGroupApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "userID"], methodCall[string: "handleMsg"])
}
func refuseGroupApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkRefuseGroupApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "userID"], methodCall[string: "handleMsg"])
}
func dismissGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkDismissGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"])
}
func changeGroupMute(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkChangeGroupMute(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[bool: "mute"])
}
func changeGroupMemberMute(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkChangeGroupMemberMute(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string:"userID"],methodCall[int:"seconds"])
}
func setGroupMemberNickname(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupMemberNickname(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string:"userID"],methodCall[string:"groupNickname"])
}
func searchGroups(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSearchGroups(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"])
}
func setGroupMemberRoleLevel(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupMemberRoleLevel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string:"userID"],methodCall[int:"roleLevel"])
}
func getGroupMemberListByJoinTimeFilter(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetGroupMemberListByJoinTimeFilter(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32: "offset"], methodCall[int32: "count"], methodCall[int64: "joinTimeBegin"], methodCall[int64: "joinTimeEnd"], methodCall[jsonString: "excludeUserIDList"])
}
func setGroupVerification(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupVerification(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32:"needVerification"])
}
func setGroupLookMemberInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupLookMemberInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32:"status"])
}
func setGroupApplyMemberFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupApplyMemberFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32:"status"])
}
func getGroupMemberOwnerAndAdmin(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetGroupMemberOwnerAndAdmin(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"])
}
func searchGroupMembers(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSearchGroupMembers(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"])
}
func setGroupMemberInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupMemberInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "info"]) Open_im_sdkSetGroupMemberInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "info"])
} }
func isJoinGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func transferGroupOwner(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkIsJoinGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"]) Open_im_sdkTransferGroupOwner(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "userID"])
} }
} }
public class GroupListener: NSObject, Open_im_sdk_callbackOnGroupListenerProtocol { public class GroupListener: NSObject, Open_im_sdk_callbackOnGroupListenerProtocol {
private let channel:FlutterMethodChannel private let channel: FlutterMethodChannel
init(channel:FlutterMethodChannel) { init(channel: FlutterMethodChannel) {
self.channel = channel self.channel = channel
} }
public func onGroupApplicationAccepted(_ s: String?) { public func onGroupApplicationAccepted(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationAccepted", errCode: nil, errMsg: nil, data: s) CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationAccepted", errCode: nil, errMsg: nil, data: s)
} }
public func onGroupApplicationAdded(_ s: String?) { public func onGroupApplicationAdded(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationAdded", errCode: nil, errMsg: nil, data: s) CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationAdded", errCode: nil, errMsg: nil, data: s)
} }
public func onGroupApplicationDeleted(_ s: String?) { public func onGroupApplicationDeleted(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationDeleted", errCode: nil, errMsg: nil, data: s) CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationDeleted", errCode: nil, errMsg: nil, data: s)
} }
public func onGroupApplicationRejected(_ s: String?) { public func onGroupApplicationRejected(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationRejected", errCode: nil, errMsg: nil, data: s) CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationRejected", errCode: nil, errMsg: nil, data: s)
} }
public func onGroupDismissed(_ s: String?) { public func onGroupDismissed(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupDismissed", errCode: nil, errMsg: nil, data: s) CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupDismissed", errCode: nil, errMsg: nil, data: s)
} }
public func onGroupInfoChanged(_ s: String?) { public func onGroupInfoChanged(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupInfoChanged", errCode: nil, errMsg: nil, data: s) CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupInfoChanged", errCode: nil, errMsg: nil, data: s)
} }
public func onGroupMemberAdded(_ s: String?) { public func onGroupMemberAdded(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupMemberAdded", errCode: nil, errMsg: nil, data: s) CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupMemberAdded", errCode: nil, errMsg: nil, data: s)
} }
public func onGroupMemberDeleted(_ s: String?) { public func onGroupMemberDeleted(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupMemberDeleted", errCode: nil, errMsg: nil, data: s) CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupMemberDeleted", errCode: nil, errMsg: nil, data: s)
} }
public func onGroupMemberInfoChanged(_ s: String?) { public func onGroupMemberInfoChanged(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupMemberInfoChanged", errCode: nil, errMsg: nil, data: s) CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupMemberInfoChanged", errCode: nil, errMsg: nil, data: s)
} }
public func onJoinedGroupAdded(_ s: String?) { public func onJoinedGroupAdded(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onJoinedGroupAdded", errCode: nil, errMsg: nil, data: s) CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onJoinedGroupAdded", errCode: nil, errMsg: nil, data: s)
} }

View File

@@ -13,6 +13,8 @@ public class IMMananger: BaseServiceManager {
self["logout"] = logout self["logout"] = logout
self["getLoginStatus"] = getLoginStatus self["getLoginStatus"] = getLoginStatus
self["uploadFile"] = uploadFile self["uploadFile"] = uploadFile
self["uploadLogs"] = uploadLogs
self["logs"] = logs
self["updateFcmToken"] = updateFcmToken self["updateFcmToken"] = updateFcmToken
self["setAppBackgroundStatus"] = setAppBackgroundStatus self["setAppBackgroundStatus"] = setAppBackgroundStatus
self["networkStatusChanged"] = networkStatusChanged self["networkStatusChanged"] = networkStatusChanged
@@ -83,6 +85,15 @@ public class IMMananger: BaseServiceManager {
func uploadFile(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { func uploadFile(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkUploadFile(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString(), UploadFileListener(channel: self.channel,id: methodCall[string: "id"])) Open_im_sdkUploadFile(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString(), UploadFileListener(channel: self.channel,id: methodCall[string: "id"]))
} }
func uploadLogs(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkUploadLogs(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "line"], methodCall[string: "ex"],
UploadLogsListener(channel: self.channel))
}
func logs(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkLogs(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "logLevel"], methodCall[string: "file"], methodCall[int: "line"], methodCall[string: "msgs"], methodCall[string: "err"], methodCall[string: "keyAndValue"])
}
func updateFcmToken(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { func updateFcmToken(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkUpdateFcmToken(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "fcmToken"], methodCall[int64: Open_im_sdkUpdateFcmToken(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "fcmToken"], methodCall[int64:
@@ -99,6 +110,10 @@ public class IMMananger: BaseServiceManager {
} }
public class ConnListener: NSObject, Open_im_sdk_callbackOnConnListenerProtocol { public class ConnListener: NSObject, Open_im_sdk_callbackOnConnListenerProtocol {
public func onUserTokenInvalid(_ errMsg: String?) {
CommonUtil.emitEvent(channel: self.channel, method: "connectListener", type: "onUserTokenInvalid", errCode: nil, errMsg: errMsg, data: nil)
}
private let channel:FlutterMethodChannel private let channel:FlutterMethodChannel
init(channel:FlutterMethodChannel) { init(channel:FlutterMethodChannel) {
@@ -126,11 +141,28 @@ public class ConnListener: NSObject, Open_im_sdk_callbackOnConnListenerProtocol
} }
} }
public class UploadLogsListener: NSObject, Open_im_sdk_callbackUploadLogProgressProtocol {
private let channel:FlutterMethodChannel
init(channel:FlutterMethodChannel) {
self.channel = channel
}
public func onProgress(_ current: Int64, size: Int64) {
var values: [String: Any] = [:]
values["current"] = current
values["size"] = size
CommonUtil.emitEvent(channel: channel, method: "uploadLogsListener", type: "onProgress", errCode: nil, errMsg: nil, data: values)
}
}
public class UploadFileListener: NSObject, Open_im_sdk_callbackUploadFileCallbackProtocol { public class UploadFileListener: NSObject, Open_im_sdk_callbackUploadFileCallbackProtocol {
private let channel:FlutterMethodChannel private let channel:FlutterMethodChannel
private let id: String private let id: String
init(channel:FlutterMethodChannel, id: String) { init(channel:FlutterMethodChannel, id: String) {
self.channel = channel self.channel = channel
self.id = id self.id = id

View File

@@ -65,7 +65,7 @@ public class MessageManager: BaseServiceManager {
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)
Open_im_sdkSendMessage(sendMsgProgressListener, methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[string: "userID"], Open_im_sdkSendMessage(sendMsgProgressListener, methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[string: "userID"],
methodCall[string: "groupID"], methodCall[jsonString: "offlinePushInfo"]) methodCall[string: "groupID"], methodCall[jsonString: "offlinePushInfo"], methodCall[bool: "isOnlineOnly"])
} }
func revokeMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func revokeMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -227,8 +227,7 @@ public class MessageManager: BaseServiceManager {
func sendMessageNotOss(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func sendMessageNotOss(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)
Open_im_sdkSendMessageNotOss(sendMsgProgressListener, methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[string: "userID"], Open_im_sdkSendMessageNotOss(sendMsgProgressListener, methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[string: "userID"], methodCall[string: "groupID"], methodCall[jsonString: "offlinePushInfo"], methodCall[bool: "isOnlineOnly"])
methodCall[string: "groupID"], methodCall[jsonString: "offlinePushInfo"])
} }
func createImageMessageByURL(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func createImageMessageByURL(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -312,37 +311,6 @@ public class AdvancedMsgListener: NSObject, Open_im_sdk_callbackOnAdvancedMsgLis
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["groupMsgReceiptList"] = groupMsgReceiptList
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvGroupReadReceipt", errCode: nil, errMsg: nil, data: values)
}
public func onRecvMessageExtensionsAdded(_ msgID: String?, reactionExtensionList: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["msgID"] = msgID
values["reactionExtensionList"] = reactionExtensionList
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageExtensionsAdded", errCode: nil, errMsg: nil, data: values)
}
public func onRecvMessageExtensionsChanged(_ msgID: String?, reactionExtensionList: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["msgID"] = msgID
values["reactionExtensionList"] = reactionExtensionList
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageExtensionsChanged", errCode: nil, errMsg: nil, data: values)
}
public func onRecvMessageExtensionsDeleted(_ msgID: String?, reactionExtensionKeyList: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["msgID"] = msgID
values["reactionExtensionKeyList"] = reactionExtensionKeyList
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageExtensionsDeleted", 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
@@ -350,14 +318,19 @@ public class AdvancedMsgListener: NSObject, Open_im_sdk_callbackOnAdvancedMsgLis
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvNewMessage", errCode: nil, errMsg: nil, data: values) CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvNewMessage", errCode: nil, errMsg: nil, data: values)
} }
public func onRecvOfflineNewMessage(_ message: String?) {
public func onRecvOfflineNewMessage(_ message: String?) { var values: [String: Any] = [:]
var values: [String: Any] = [:] values["id"] = id
values["id"] = id values["message"] = message
values["message"] = message CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvOfflineNewMessage", errCode: nil, errMsg: nil, data: values);
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvOfflineNewMessage", errCode: nil, errMsg: nil, data: values); }
}
public func onRecvOnlineOnlyMessage(_ message: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["message"] = message
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvOnlineOnlyMessage", errCode: nil, errMsg: nil, data: values);
}
} }
public class CustomBusinessListener: NSObject, Open_im_sdk_callbackOnCustomBusinessListenerProtocol { public class CustomBusinessListener: NSObject, Open_im_sdk_callbackOnCustomBusinessListenerProtocol {
@@ -371,4 +344,3 @@ public class CustomBusinessListener: NSObject, Open_im_sdk_callbackOnCustomBusin
CommonUtil.emitEvent(channel: channel, method: "customBusinessListener", type: "onRecvCustomBusinessMessage", errCode: nil, errMsg: nil, data: s) CommonUtil.emitEvent(channel: channel, method: "customBusinessListener", type: "onRecvCustomBusinessMessage", errCode: nil, errMsg: nil, data: s)
} }
} }

View File

@@ -13,7 +13,6 @@ public class UserManager: BaseServiceManager {
self["unsubscribeUsersStatus"] = unsubscribeUsersStatus self["unsubscribeUsersStatus"] = unsubscribeUsersStatus
self["getSubscribeUsersStatus"] = getSubscribeUsersStatus self["getSubscribeUsersStatus"] = getSubscribeUsersStatus
self["getUserStatus"] = getUserStatus self["getUserStatus"] = getUserStatus
self["getUsersInfoWithCache"] = getUsersInfoWithCache
} }
func setUserListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func setUserListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -48,14 +47,21 @@ public class UserManager: BaseServiceManager {
func getUserStatus(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ func getUserStatus(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetUserStatus(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "userIDs"]) Open_im_sdkGetUserStatus(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "userIDs"])
} }
func getUsersInfoWithCache(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetUsersInfoWithCache(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "userIDs"],
methodCall[string: "groupID"])
}
} }
public class UserListener: NSObject, Open_im_sdk_callbackOnUserListenerProtocol { public class UserListener: NSObject, Open_im_sdk_callbackOnUserListenerProtocol {
public func onUserCommandAdd(_ userCommand: String?) {
CommonUtil.emitEvent(channel: self.channel, method: "userListener", type: "onUserCommandAdd", errCode: nil, errMsg: nil, data: userCommand)
}
public func onUserCommandDelete(_ userCommand: String?) {
CommonUtil.emitEvent(channel: self.channel, method: "userListener", type: "onUserCommandDelete", errCode: nil, errMsg: nil, data: userCommand)
}
public func onUserCommandUpdate(_ userCommand: String?) {
CommonUtil.emitEvent(channel: self.channel, method: "userListener", type: "onUserCommandUpdate", errCode: nil, errMsg: nil, data: userCommand)
}
private let channel:FlutterMethodChannel private let channel:FlutterMethodChannel

View File

@@ -17,9 +17,11 @@ A new Flutter project.
s.dependency 'Flutter' s.dependency 'Flutter'
s.platform = :ios, '11.0' s.platform = :ios, '11.0'
s.dependency 'OpenIMSDKCore','3.4.0' s.dependency 'OpenIMSDKCore','3.8.1'
s.static_framework = true s.static_framework = true
# s.vendored_frameworks = 'Framework/*.framework' s.library = 'resolv'
# s.vendored_frameworks = 'Framework/*.xcframework'
# 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'

BIN
lib/.DS_Store vendored

Binary file not shown.

View File

@@ -34,5 +34,6 @@ export 'src/models/message.dart';
export 'src/models/notification_info.dart'; export 'src/models/notification_info.dart';
export 'src/models/search_info.dart'; export 'src/models/search_info.dart';
export 'src/models/user_info.dart'; export 'src/models/user_info.dart';
export 'src/models/input_status_changed_data.dart';
export 'src/openim.dart'; export 'src/openim.dart';
export 'src/utils.dart'; export 'src/utils.dart';

View File

@@ -15,4 +15,5 @@ class ListenerType {
static const messageKvInfoListener = "messageKvInfoListener"; static const messageKvInfoListener = "messageKvInfoListener";
static const listenerForService = "listenerForService"; static const listenerForService = "listenerForService";
static const uploadFileListener = "uploadFileListener"; static const uploadFileListener = "uploadFileListener";
static const uploadLogsListener = "uploadLogsListener";
} }

View File

@@ -5,10 +5,9 @@ class OnAdvancedMsgListener {
Function(Message msg)? onMsgDeleted; Function(Message msg)? onMsgDeleted;
Function(RevokedInfo info)? onNewRecvMessageRevoked; Function(RevokedInfo info)? onNewRecvMessageRevoked;
Function(List<ReadReceiptInfo> list)? onRecvC2CReadReceipt; Function(List<ReadReceiptInfo> list)? onRecvC2CReadReceipt;
Function(List<ReadReceiptInfo> list)? onRecvGroupReadReceipt;
Function(String msgID, List<String> list)? onRecvMessageExtensionsDeleted;
Function(Message msg)? onRecvNewMessage; Function(Message msg)? onRecvNewMessage;
Function(Message msg)? onRecvOfflineNewMessage; Function(Message msg)? onRecvOfflineNewMessage;
Function(Message msg)? onRecvOnlineOnlyMessage;
/// Uniquely identifies /// Uniquely identifies
String id; String id;
@@ -17,10 +16,9 @@ class OnAdvancedMsgListener {
this.onMsgDeleted, this.onMsgDeleted,
this.onNewRecvMessageRevoked, this.onNewRecvMessageRevoked,
this.onRecvC2CReadReceipt, this.onRecvC2CReadReceipt,
this.onRecvGroupReadReceipt,
this.onRecvMessageExtensionsDeleted,
this.onRecvNewMessage, this.onRecvNewMessage,
this.onRecvOfflineNewMessage, this.onRecvOfflineNewMessage,
this.onRecvOnlineOnlyMessage,
}) : id = "id_${DateTime.now().microsecondsSinceEpoch}"; }) : id = "id_${DateTime.now().microsecondsSinceEpoch}";
void msgDeleted(Message msg) { void msgDeleted(Message msg) {
@@ -37,17 +35,6 @@ class OnAdvancedMsgListener {
onRecvC2CReadReceipt?.call(list); onRecvC2CReadReceipt?.call(list);
} }
/// Group Message Read Receipt
void recvGroupReadReceipt(List<ReadReceiptInfo> list) {
onRecvGroupReadReceipt?.call(list);
}
/// Received Extended Message Deleted
/// [list] TypeKey that was deleted
void recvMessageExtensionsDeleted(String msgID, List<String> list) {
onRecvMessageExtensionsDeleted?.call(msgID, list);
}
/// Received a new message /// Received a new message
void recvNewMessage(Message msg) { void recvNewMessage(Message msg) {
onRecvNewMessage?.call(msg); onRecvNewMessage?.call(msg);
@@ -56,4 +43,8 @@ class OnAdvancedMsgListener {
void recvOfflineNewMessage(Message msg) { void recvOfflineNewMessage(Message msg) {
onRecvOfflineNewMessage?.call(msg); onRecvOfflineNewMessage?.call(msg);
} }
void recvOnlineOnlyMessage(Message msg) {
onRecvOnlineOnlyMessage?.call(msg);
}
} }

View File

@@ -5,6 +5,7 @@ class OnConnectListener {
Function()? onConnecting; Function()? onConnecting;
Function()? onKickedOffline; Function()? onKickedOffline;
Function()? onUserTokenExpired; Function()? onUserTokenExpired;
Function()? onUserTokenInvalid;
OnConnectListener({ OnConnectListener({
this.onConnectFailed, this.onConnectFailed,
@@ -12,6 +13,7 @@ class OnConnectListener {
this.onConnecting, this.onConnecting,
this.onKickedOffline, this.onKickedOffline,
this.onUserTokenExpired, this.onUserTokenExpired,
this.onUserTokenInvalid,
}); });
/// SDK failed to connect to the server /// SDK failed to connect to the server
@@ -38,4 +40,8 @@ class OnConnectListener {
void userTokenExpired() { void userTokenExpired() {
onUserTokenExpired?.call(); onUserTokenExpired?.call();
} }
void userTokenInvalid() {
onUserTokenInvalid?.call();
}
} }

View File

@@ -1,3 +1,4 @@
import 'package:flutter/foundation.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
/// Conversation Listener /// Conversation Listener
@@ -5,17 +6,21 @@ class OnConversationListener {
Function(List<ConversationInfo> list)? onConversationChanged; Function(List<ConversationInfo> list)? onConversationChanged;
Function(List<ConversationInfo> list)? onNewConversation; Function(List<ConversationInfo> list)? onNewConversation;
Function(int count)? onTotalUnreadMessageCountChanged; Function(int count)? onTotalUnreadMessageCountChanged;
Function()? onSyncServerFailed; Function(bool? reinstalled)? onSyncServerStart;
Function()? onSyncServerFinish; Function(int? progress)? onSyncServerProgress;
Function()? onSyncServerStart; Function(bool? reinstalled)? onSyncServerFinish;
Function(bool? reinstalled)? onSyncServerFailed;
ValueChanged<InputStatusChangedData>? onInputStatusChanged;
OnConversationListener({ OnConversationListener({
this.onConversationChanged, this.onConversationChanged,
this.onNewConversation, this.onNewConversation,
this.onTotalUnreadMessageCountChanged, this.onTotalUnreadMessageCountChanged,
this.onSyncServerFailed,
this.onSyncServerFinish,
this.onSyncServerStart, this.onSyncServerStart,
this.onSyncServerProgress,
this.onSyncServerFinish,
this.onSyncServerFailed,
this.onInputStatusChanged,
}); });
/// Conversations have changed /// Conversations have changed
@@ -33,15 +38,23 @@ class OnConversationListener {
onTotalUnreadMessageCountChanged?.call(count); onTotalUnreadMessageCountChanged?.call(count);
} }
void syncServerFailed() { void syncServerStart(bool? reinstalled) {
onSyncServerFailed?.call(); onSyncServerStart?.call(reinstalled);
} }
void syncServerFinish() { void syncServerProgress(int? progress) {
onSyncServerFinish?.call(); onSyncServerProgress?.call(progress);
} }
void syncServerStart() { void syncServerFailed(bool? reinstalled) {
onSyncServerStart?.call(); onSyncServerFailed?.call(reinstalled);
}
void syncServerFinish(bool? reinstalled) {
onSyncServerFinish?.call(reinstalled);
}
void conversationUserInputStatusChanged(InputStatusChangedData data) {
onInputStatusChanged?.call(data);
} }
} }

View File

@@ -1,14 +1,32 @@
class OnUploadLogsListener {
Function(int current, int size)? onUploadProgress;
OnUploadLogsListener({this.onUploadProgress});
void onProgress(int current, int size) {
onUploadProgress?.call(current, size);
}
}
class OnUploadFileListener { class OnUploadFileListener {
OnUploadFileListener({
this.onComplete,
this.onHashPartComplete,
this.onHashPartProgress,
this.onOpen,
this.onPartSize,
this.onUploadID,
this.onUploadPartComplete,
this.onUploadProgress,
});
Function(String id, int size, String url, int type)? onComplete; Function(String id, int size, String url, int type)? onComplete;
Function(String id, String partHash, String fileHash)? onHashPartComplete; Function(String id, String partHash, String fileHash)? onHashPartComplete;
Function(String id, int index, int size, String partHash)? onHashPartProgress; Function(String id, int index, int size, String partHash)? onHashPartProgress;
Function(String id, int size)? onOpen; Function(String id, int size)? onOpen;
Function(String id, int partSize, int num)? onPartSize; Function(String id, int partSize, int num)? onPartSize;
Function(String id, int fileSize, int streamSize, int storageSize)? Function(String id, int fileSize, int streamSize, int storageSize)? onUploadProgress;
onUploadProgress;
Function(String id, String uploadID)? onUploadID; Function(String id, String uploadID)? onUploadID;
Function(String id, int index, int partSize, String partHash)? Function(String id, int index, int partSize, String partHash)? onUploadPartComplete;
onUploadPartComplete;
void complete(String id, int size, String url, int type) { void complete(String id, int size, String url, int type) {
onComplete?.call(id, size, url, type); onComplete?.call(id, size, url, type);
@@ -30,8 +48,7 @@ class OnUploadFileListener {
onPartSize?.call(id, partSize, num); onPartSize?.call(id, partSize, num);
} }
void uploadProgress( void uploadProgress(String id, int fileSize, int streamSize, int storageSize) {
String id, int fileSize, int streamSize, int storageSize) {
onUploadProgress?.call(id, fileSize, streamSize, storageSize); onUploadProgress?.call(id, fileSize, streamSize, storageSize);
} }

View File

@@ -1,8 +1,11 @@
import 'dart:async';
import 'dart:developer'; import 'dart:developer';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
import '../models/update_req.dart';
class ConversationManager { class ConversationManager {
MethodChannel _channel; MethodChannel _channel;
late OnConversationListener listener; late OnConversationListener listener;
@@ -98,14 +101,11 @@ class ConversationManager {
required String conversationID, required String conversationID,
required bool isPinned, required bool isPinned,
String? operationID, String? operationID,
}) => }) {
_channel.invokeMethod( final req = ConversationReq(isPinned: isPinned);
'pinConversation',
_buildParam({ return setConversation(conversationID, req, operationID: operationID);
"conversationID": conversationID, }
"isPinned": isPinned,
"operationID": Utils.checkOperationID(operationID),
}));
/// Hide a Conversation /// Hide a Conversation
/// [conversationID] Conversation ID /// [conversationID] Conversation ID
@@ -161,22 +161,20 @@ class ConversationManager {
/// Message Do-Not-Disturb Setting /// Message Do-Not-Disturb Setting
/// [conversationID] Conversation ID /// [conversationID] Conversation ID
/// [status] 0: normal; 1: not receiving messages; 2: receive online messages but not offline messages /// [status] 0: normal; 1: not receiving messages; 2: receive online messages but not offline messages
@Deprecated('use [setConversation] instead')
Future<dynamic> setConversationRecvMessageOpt({ Future<dynamic> setConversationRecvMessageOpt({
required String conversationID, required String conversationID,
required int status, required int status,
String? operationID, String? operationID,
}) => }) {
_channel.invokeMethod( final req = ConversationReq(recvMsgOpt: status);
'setConversationRecvMessageOpt',
_buildParam({
"conversationID": conversationID,
"status": status,
"operationID": Utils.checkOperationID(operationID),
}));
/// Query Do-Not-Disturb Status return setConversation(conversationID, req, operationID: operationID);
/// [conversationIDList] List of conversation IDs }
/// Returns: [{"conversationId":"single_13922222222","result":0}], result values: 0: normal; 1: not receiving messages; 2: receive online messages but not offline messages
/// Message Do-Not-Disturb Setting
/// [conversationID] Conversation ID
/// [status] 0: normal; 1: not receiving messages; 2: receive online messages but not offline messages
Future<List<dynamic>> getConversationRecvMessageOpt({ Future<List<dynamic>> getConversationRecvMessageOpt({
required List<String> conversationIDList, required List<String> conversationIDList,
String? operationID, String? operationID,
@@ -193,18 +191,16 @@ class ConversationManager {
/// Self-Destruct Messages /// Self-Destruct Messages
/// [conversationID] Conversation ID /// [conversationID] Conversation ID
/// [isPrivate] true: enable, false: disable /// [isPrivate] true: enable, false: disable
@Deprecated('use [setConversation] instead')
Future<dynamic> setConversationPrivateChat({ Future<dynamic> setConversationPrivateChat({
required String conversationID, required String conversationID,
required bool isPrivate, required bool isPrivate,
String? operationID, String? operationID,
}) => }) {
_channel.invokeMethod( final req = ConversationReq(isPrivateChat: isPrivate);
'setConversationPrivateChat',
_buildParam({ return setConversation(conversationID, req, operationID: operationID);
"conversationID": conversationID, }
"isPrivate": isPrivate,
"operationID": Utils.checkOperationID(operationID),
}));
/// Delete a Conversation Locally and from the Server /// Delete a Conversation Locally and from the Server
/// [conversationID] Conversation ID /// [conversationID] Conversation ID
@@ -245,16 +241,15 @@ class ConversationManager {
/// Reset Mentioned (Group At) Flags [GroupAtType] /// Reset Mentioned (Group At) Flags [GroupAtType]
/// [conversationID] Conversation ID /// [conversationID] Conversation ID
@Deprecated('use [setConversation] instead')
Future<dynamic> resetConversationGroupAtType({ Future<dynamic> resetConversationGroupAtType({
required String conversationID, required String conversationID,
String? operationID, String? operationID,
}) => }) {
_channel.invokeMethod( final req = ConversationReq(groupAtType: 0);
'resetConversationGroupAtType',
_buildParam({ return setConversation(conversationID, req, operationID: operationID);
"conversationID": conversationID, }
"operationID": Utils.checkOperationID(operationID),
}));
/// Query @ All Flag /// Query @ All Flag
Future<dynamic> getAtAllTag({ Future<dynamic> getAtAllTag({
@@ -271,32 +266,27 @@ class ConversationManager {
/// Global Do-Not-Disturb /// Global Do-Not-Disturb
/// [status] 0: normal; 1: not receiving messages; 2: receive online messages but not offline messages /// [status] 0: normal; 1: not receiving messages; 2: receive online messages but not offline messages
@Deprecated('use [OpenIM.iMManager.userManager.setSelfInfo()] instead')
Future<dynamic> setGlobalRecvMessageOpt({ Future<dynamic> setGlobalRecvMessageOpt({
required int status, required int status,
String? operationID, String? operationID,
}) => }) {
_channel.invokeMethod( throw UnimplementedError('setGlobalRecvMessageOpt');
'setGlobalRecvMessageOpt', }
_buildParam({
"status": status,
"operationID": Utils.checkOperationID(operationID),
}));
/// Set Self-Destruct Message Duration /// Set Self-Destruct Message Duration
/// [conversationID] Conversation ID /// [conversationID] Conversation ID
/// [burnDuration] Duration in seconds, default: 30s /// [burnDuration] Duration in seconds, default: 30s
@Deprecated('use [setConversation] instead')
Future<dynamic> setConversationBurnDuration({ Future<dynamic> setConversationBurnDuration({
required String conversationID, required String conversationID,
int burnDuration = 30, int burnDuration = 30,
String? operationID, String? operationID,
}) => }) {
_channel.invokeMethod( final req = ConversationReq(burnDuration: burnDuration);
'setConversationBurnDuration',
_buildParam({ return setConversation(conversationID, req, operationID: operationID);
"conversationID": conversationID, }
"burnDuration": burnDuration,
"operationID": Utils.checkOperationID(operationID),
}));
/// Mark Messages as Read /// Mark Messages as Read
/// [conversationID] Conversation ID /// [conversationID] Conversation ID
@@ -311,35 +301,31 @@ class ConversationManager {
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
/// Enable Regular Deletion /// search Conversations
/// [isMsgDestruct] true: enable Future<List<ConversationInfo>> searchConversations(
Future<dynamic> setConversationIsMsgDestruct({ String name, {
required String conversationID,
bool isMsgDestruct = true,
String? operationID, String? operationID,
}) => }) {
_channel.invokeMethod( return _channel
'setConversationIsMsgDestruct', .invokeMethod(
_buildParam({ 'searchConversations',
"conversationID": conversationID, _buildParam({
"isMsgDestruct": isMsgDestruct, 'name': name,
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }))
.then((value) => Utils.toList(value, (map) => ConversationInfo.fromJson(map)));
}
/// Regularly Delete Chat Records @Deprecated('use [setConversation] instead')
/// [duration] Seconds Future setConversationEx(
Future<dynamic> setConversationMsgDestructTime({ String conversationID, {
required String conversationID, String? ex,
int duration = 1 * 24 * 60 * 60,
String? operationID, String? operationID,
}) => }) {
_channel.invokeMethod( final req = ConversationReq(ex: ex);
'setConversationMsgDestructTime',
_buildParam({ return setConversation(conversationID, req, operationID: operationID);
"conversationID": conversationID, }
"duration": duration,
"operationID": Utils.checkOperationID(operationID),
}));
/// Custom Sort for Conversation List /// Custom Sort for Conversation List
List<ConversationInfo> simpleSort(List<ConversationInfo> list) => list List<ConversationInfo> simpleSort(List<ConversationInfo> list) => list
@@ -361,9 +347,68 @@ class ConversationManager {
} }
}); });
static Map _buildParam(Map param) { Future changeInputStates({
required String conversationID,
required bool focus,
String? operationID,
}) {
return _channel.invokeMethod(
'changeInputStates',
_buildParam(
{
'focus': focus,
'conversationID': conversationID,
'operationID': Utils.checkOperationID(operationID),
},
),
);
}
Future<List<int>?> getInputStates(
String conversationID,
String userID, {
String? operationID,
}) {
return _channel
.invokeMethod(
'getInputStates',
_buildParam(
{
'conversationID': conversationID,
'userID': userID,
'operationID': Utils.checkOperationID(operationID),
},
),
)
.then((value) {
print('getInputStates: $value');
final result = Utils.toListMap(value);
return List<int>.from(result);
});
}
Future setConversation(
String conversationID,
ConversationReq req, {
String? operationID,
}) {
return _channel.invokeMethod(
'setConversation',
_buildParam(
{
'conversationID': conversationID,
'req': req.toJson(),
'operationID': Utils.checkOperationID(operationID),
},
),
);
}
static Map _buildParam(Map<String, dynamic> param) {
param["ManagerName"] = "conversationManager"; param["ManagerName"] = "conversationManager";
param = Utils.cleanMap(param);
log('param: $param'); log('param: $param');
return param; return param;
} }
} }

View File

@@ -1,6 +1,10 @@
import 'dart:async';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
import '../models/update_req.dart';
class FriendshipManager { class FriendshipManager {
MethodChannel _channel; MethodChannel _channel;
late OnFriendshipListener listener; late OnFriendshipListener listener;
@@ -15,8 +19,9 @@ class FriendshipManager {
/// Query Friend Information /// Query Friend Information
/// [userIDList] List of user IDs /// [userIDList] List of user IDs
Future<List<FriendInfo>> getFriendsInfo({ Future<List<PublicUserInfo>> getFriendsInfo({
required List<String> userIDList, required List<String> userIDList,
bool filterBlack = false,
String? operationID, String? operationID,
}) => }) =>
_channel _channel
@@ -24,9 +29,10 @@ class FriendshipManager {
'getFriendsInfo', 'getFriendsInfo',
_buildParam({ _buildParam({
"userIDList": userIDList, "userIDList": userIDList,
'filterBlack': filterBlack,
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => Utils.toList(value, (v) => FriendInfo.fromJson(v))); .then((value) => Utils.toList(value, (v) => PublicUserInfo.fromJson(v)));
/// Send a Friend Request, the other party needs to accept the request to become friends. /// Send a Friend Request, the other party needs to accept the request to become friends.
/// [userID] User ID to be invited /// [userID] User ID to be invited
@@ -63,13 +69,35 @@ class FriendshipManager {
.then((value) => Utils.toList(value, (v) => FriendApplicationInfo.fromJson(v))); .then((value) => Utils.toList(value, (v) => FriendApplicationInfo.fromJson(v)));
/// Get Friend List, including friends who have been put into the blacklist /// Get Friend List, including friends who have been put into the blacklist
Future<List<FriendInfo>> getFriendList({String? operationID}) => _channel Future<List<PublicUserInfo>> getFriendList({
.invokeMethod( String? operationID,
'getFriendList', bool filterBlack = false,
_buildParam({ }) =>
"operationID": Utils.checkOperationID(operationID), _channel
})) .invokeMethod(
.then((value) => Utils.toList(value, (v) => FriendInfo.fromJson(v))); 'getFriendList',
_buildParam({
'filterBlack': filterBlack,
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (v) => PublicUserInfo.fromJson(v)));
Future<List<PublicUserInfo>> getFriendListPage({
bool filterBlack = false,
int offset = 0,
int count = 40,
String? operationID,
}) =>
_channel
.invokeMethod(
'getFriendListPage',
_buildParam({
'offset': offset,
'count': count,
'filterBlack': filterBlack,
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (v) => PublicUserInfo.fromJson(v)));
/// Get Friend List, including friends who have been put into the blacklist (returns a map) /// Get Friend List, including friends who have been put into the blacklist (returns a map)
Future<List<dynamic>> getFriendListMap({String? operationID}) => _channel Future<List<dynamic>> getFriendListMap({String? operationID}) => _channel
@@ -80,32 +108,49 @@ class FriendshipManager {
})) }))
.then((value) => Utils.toListMap(value)); .then((value) => Utils.toListMap(value));
Future<List<dynamic>> getFriendListPageMap({
bool filterBlack = false,
String? operationID,
int offset = 0,
int count = 40,
}) =>
_channel
.invokeMethod(
'getFriendListPage',
_buildParam({
'offset': offset,
'count': count,
'filterBlack': filterBlack,
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toListMap(value));
/// Set Friend's Remark /// Set Friend's Remark
/// [userID] Friend's userID /// [userID] Friend's userID
/// [remark] Friend's remark /// [remark] Friend's remark
@Deprecated('Use [updateFriends] instead')
Future<dynamic> setFriendRemark({ Future<dynamic> setFriendRemark({
required String userID, required String userID,
required String remark, required String remark,
String? operationID, String? operationID,
}) => }) {
_channel.invokeMethod( final req = UpdateFriendsReq(friendUserIDs: [userID], remark: remark);
'setFriendRemark',
_buildParam({ return updateFriends(req, operationID: operationID);
'toUserID': userID, }
'remark': remark,
"operationID": Utils.checkOperationID(operationID),
}));
/// Add to Blacklist /// Add to Blacklist
/// [userID] Friend's ID to be added to the blacklist /// [userID] Friend's ID to be added to the blacklist
Future<dynamic> addBlacklist({ Future<dynamic> addBlacklist({
required String userID, required String userID,
String? ex,
String? operationID, String? operationID,
}) => }) =>
_channel.invokeMethod( _channel.invokeMethod(
'addBlacklist', 'addBlacklist',
_buildParam({ _buildParam({
"userID": userID, "userID": userID,
"ex": ex,
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})); }));
@@ -217,8 +262,35 @@ class FriendshipManager {
})) }))
.then((value) => Utils.toList(value, (map) => SearchFriendsInfo.fromJson(map))); .then((value) => Utils.toList(value, (map) => SearchFriendsInfo.fromJson(map)));
static Map _buildParam(Map param) { @Deprecated('Use [updateFriends] instead')
Future setFriendsEx(
List<String> friendIDs, {
String? ex,
String? operationID,
}) {
final req = UpdateFriendsReq(friendUserIDs: friendIDs, ex: ex);
return updateFriends(req, operationID: operationID);
}
Future<dynamic> updateFriends(
UpdateFriendsReq updateFriendsReq, {
String? operationID,
}) {
return _channel
.invokeMethod(
'updateFriends',
_buildParam({
'req': updateFriendsReq.toJson(),
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => value);
}
static Map _buildParam(Map<String, dynamic> param) {
param["ManagerName"] = "friendshipManager"; param["ManagerName"] = "friendshipManager";
param = Utils.cleanMap(param);
return param; return param;
} }
} }

View File

@@ -2,6 +2,7 @@ import 'dart:developer';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
import 'package:flutter_openim_sdk/src/models/set_group_member_info.dart';
class GroupManager { class GroupManager {
MethodChannel _channel; MethodChannel _channel;
@@ -131,6 +132,16 @@ class GroupManager {
})) }))
.then((value) => Utils.toList(value, (map) => GroupInfo.fromJson(map))); .then((value) => Utils.toList(value, (map) => GroupInfo.fromJson(map)));
Future<List<GroupInfo>> getJoinedGroupListPage({String? operationID, int offset = 0, int count = 40}) => _channel
.invokeMethod(
'getJoinedGroupListPage',
_buildParam({
'offset': offset,
'count': count,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (map) => GroupInfo.fromJson(map)));
/// Query the list of joined groups /// Query the list of joined groups
Future<List<dynamic>> getJoinedGroupListMap({String? operationID}) => _channel Future<List<dynamic>> getJoinedGroupListMap({String? operationID}) => _channel
.invokeMethod( .invokeMethod(
@@ -207,18 +218,15 @@ class GroupManager {
/// Apply to join a group, requiring approval from an administrator or the group. /// Apply to join a group, requiring approval from an administrator or the group.
/// [joinSource] 2: Invited, 3: Searched, 4: Using a QR code /// [joinSource] 2: Invited, 3: Searched, 4: Using a QR code
Future<dynamic> joinGroup({ Future<dynamic> joinGroup(
required String groupID, {required String groupID, String? reason, String? operationID, int joinSource = 3, String? ex}) =>
String? reason,
String? operationID,
int joinSource = 3,
}) =>
_channel.invokeMethod( _channel.invokeMethod(
'joinGroup', 'joinGroup',
_buildParam({ _buildParam({
'groupID': groupID, 'groupID': groupID,
'reason': reason, 'reason': reason,
'joinSource': joinSource, 'joinSource': joinSource,
'ex': ex,
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
@@ -356,20 +364,17 @@ class GroupManager {
/// [groupID] Group ID /// [groupID] Group ID
/// [userID] User ID of the group member /// [userID] User ID of the group member
/// [groupNickname] Group nickname /// [groupNickname] Group nickname
@Deprecated('Use [setGroupMemberInfo] instead')
Future<dynamic> setGroupMemberNickname({ Future<dynamic> setGroupMemberNickname({
required String groupID, required String groupID,
required String userID, required String userID,
String? groupNickname, String? groupNickname,
String? operationID, String? operationID,
}) => }) {
_channel.invokeMethod( final req = SetGroupMemberInfo(groupID: groupID, userID: userID, nickname: groupNickname);
'setGroupMemberNickname',
_buildParam({ return setGroupMemberInfo(groupMembersInfo: req, operationID: operationID);
'groupID': groupID, }
'userID': userID,
'groupNickname': groupNickname ?? '',
'operationID': Utils.checkOperationID(operationID),
}));
/// Query a group /// Query a group
/// [keywordList] Search keywords; currently, only one keyword is supported, and it cannot be empty. /// [keywordList] Search keywords; currently, only one keyword is supported, and it cannot be empty.
@@ -398,20 +403,17 @@ class GroupManager {
/// [groupID] Group ID /// [groupID] Group ID
/// [userID] User ID of the group member /// [userID] User ID of the group member
/// [roleLevel] Role level; see [GroupRoleLevel] /// [roleLevel] Role level; see [GroupRoleLevel]
@Deprecated('Use [setGroupMemberInfo] instead')
Future<dynamic> setGroupMemberRoleLevel({ Future<dynamic> setGroupMemberRoleLevel({
required String groupID, required String groupID,
required String userID, required String userID,
required int roleLevel, required int roleLevel,
String? operationID, String? operationID,
}) => }) {
_channel.invokeMethod( final req = SetGroupMemberInfo(groupID: groupID, userID: userID, roleLevel: roleLevel);
'setGroupMemberRoleLevel',
_buildParam({ return setGroupMemberInfo(groupMembersInfo: req, operationID: operationID);
'groupID': groupID, }
'userID': userID,
'roleLevel': roleLevel,
'operationID': Utils.checkOperationID(operationID),
}));
/// Get a group member list based on join time /// Get a group member list based on join time
Future<List<GroupMembersInfo>> getGroupMemberListByJoinTime({ Future<List<GroupMembersInfo>> getGroupMemberListByJoinTime({
@@ -440,50 +442,44 @@ class GroupManager {
/// Set group verification for joining /// Set group verification for joining
/// [groupID] Group ID /// [groupID] Group ID
/// [needVerification] Verification setting; see [GroupVerification] class /// [needVerification] Verification setting; see [GroupVerification] class
@Deprecated('Use [setGroupInfo] instead')
Future<dynamic> setGroupVerification({ Future<dynamic> setGroupVerification({
required String groupID, required String groupID,
required int needVerification, required int needVerification,
String? operationID, String? operationID,
}) => }) {
_channel.invokeMethod( final req = GroupInfo(groupID: groupID, needVerification: needVerification);
'setGroupVerification',
_buildParam({
'groupID': groupID,
'needVerification': needVerification,
'operationID': Utils.checkOperationID(operationID),
}));
/// Allow/disallow members to view each other's information through the group return setGroupInfo(req, operationID: operationID);
/// [groupID] Group ID }
/// [status] 0: Disable, 1: Enable
Future<dynamic> setGroupLookMemberInfo({
required String groupID,
required int status,
String? operationID,
}) =>
_channel.invokeMethod(
'setGroupLookMemberInfo',
_buildParam({
'groupID': groupID,
'status': status,
'operationID': Utils.checkOperationID(operationID),
}));
/// Allow/disallow members to add friends through the group /// Allow/disallow members to add friends through the group
/// [groupID] Group ID /// [groupID] Group ID
/// [status] 0: Disable, 1: Enable /// [status] 0: Disable, 1: Enable
@Deprecated('Use [setGroupInfo] instead')
Future<dynamic> setGroupLookMemberInfo({
required String groupID,
required int status,
String? operationID,
}) {
final req = GroupInfo(groupID: groupID, lookMemberInfo: status);
return setGroupInfo(req, operationID: operationID);
}
/// Allow/disallow members to add friends through the group
/// [groupID] Group ID
/// [status] 0: Disable, 1: Enable
@Deprecated('Use [setGroupInfo] instead')
Future<dynamic> setGroupApplyMemberFriend({ Future<dynamic> setGroupApplyMemberFriend({
required String groupID, required String groupID,
required int status, required int status,
String? operationID, String? operationID,
}) => }) {
_channel.invokeMethod( final req = GroupInfo(groupID: groupID, applyMemberFriend: status);
'setGroupApplyMemberFriend',
_buildParam({ return setGroupInfo(req, operationID: operationID);
'groupID': groupID, }
'status': status,
'operationID': Utils.checkOperationID(operationID),
}));
/// Get group owners and administrators /// Get group owners and administrators
/// [groupId] Group ID /// [groupId] Group ID
@@ -566,9 +562,7 @@ class GroupManager {
/// Modify the GroupMemberInfo ex field /// Modify the GroupMemberInfo ex field
Future<dynamic> setGroupMemberInfo({ Future<dynamic> setGroupMemberInfo({
required String groupID, required SetGroupMemberInfo groupMembersInfo,
required String userID,
required GroupMembersInfo groupMembersInfo,
String? operationID, String? operationID,
}) => }) =>
_channel.invokeMethod( _channel.invokeMethod(
@@ -577,9 +571,27 @@ class GroupManager {
'info': groupMembersInfo.toJson(), 'info': groupMembersInfo.toJson(),
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
static Map _buildParam(Map param) {
Future<dynamic> getUsersInGroup(
String groupID,
List<String> userIDs, {
String? operationID,
}) =>
_channel.invokeMethod(
'getUsersInGroup',
_buildParam({
'groupID': groupID,
'userIDs': userIDs,
'operationID': Utils.checkOperationID(operationID),
}));
static Map _buildParam(Map<String, dynamic> param) {
param["ManagerName"] = "groupManager"; param["ManagerName"] = "groupManager";
param = Utils.cleanMap(param);
log('param: $param'); log('param: $param');
return param; return param;
} }
} }

View File

@@ -1,3 +1,4 @@
import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'dart:io'; import 'dart:io';
@@ -16,6 +17,8 @@ class IMManager {
late OnConnectListener _connectListener; late OnConnectListener _connectListener;
OnListenerForService? _listenerForService; OnListenerForService? _listenerForService;
OnUploadFileListener? _uploadFileListener; OnUploadFileListener? _uploadFileListener;
OnUploadLogsListener? _uploadLogsListener;
late String userID; late String userID;
late UserInfo userInfo; late UserInfo userInfo;
bool isLogined = false; bool isLogined = false;
@@ -54,6 +57,9 @@ class IMManager {
case 'onUserTokenExpired': case 'onUserTokenExpired':
_connectListener.userTokenExpired(); _connectListener.userTokenExpired();
break; break;
case 'onUserTokenInvalid':
_connectListener.userTokenInvalid();
break;
} }
} else if (call.method == ListenerType.userListener) { } else if (call.method == ListenerType.userListener) {
String type = call.arguments['type']; String type = call.arguments['type'];
@@ -136,18 +142,6 @@ class IMManager {
var list = Utils.toList(value, (map) => ReadReceiptInfo.fromJson(map)); var list = Utils.toList(value, (map) => ReadReceiptInfo.fromJson(map));
messageManager.msgListener.recvC2CReadReceipt(list); messageManager.msgListener.recvC2CReadReceipt(list);
break; break;
case 'onRecvGroupReadReceipt':
var value = call.arguments['data']['groupMsgReceiptList'];
var list = Utils.toList(value, (map) => ReadReceiptInfo.fromJson(map));
messageManager.msgListener.recvGroupReadReceipt(list);
break;
case 'onRecvMessageExtensionsDeleted':
var msgID = call.arguments['data']['msgID'];
var value = call.arguments['data']['reactionExtensionKeyList'];
var list = Utils.toList(value, (map) => '$map');
messageManager.msgListener.recvMessageExtensionsDeleted(msgID, list);
break;
case 'onRecvNewMessage': case 'onRecvNewMessage':
var value = call.arguments['data']['message']; var value = call.arguments['data']['message'];
final msg = Utils.toObj(value, (map) => Message.fromJson(map)); final msg = Utils.toObj(value, (map) => Message.fromJson(map));
@@ -158,6 +152,11 @@ class IMManager {
final msg = Utils.toObj(value, (map) => Message.fromJson(map)); final msg = Utils.toObj(value, (map) => Message.fromJson(map));
messageManager.msgListener.recvOfflineNewMessage(msg); messageManager.msgListener.recvOfflineNewMessage(msg);
break; break;
case 'onRecvOnlineOnlyMessage':
var value = call.arguments['data']['message'];
final msg = Utils.toObj(value, (map) => Message.fromJson(map));
messageManager.msgListener.recvOnlineOnlyMessage(msg);
break;
} }
} else if (call.method == ListenerType.msgSendProgressListener) { } else if (call.method == ListenerType.msgSendProgressListener) {
String type = call.arguments['type']; String type = call.arguments['type'];
@@ -177,14 +176,17 @@ class IMManager {
dynamic data = call.arguments['data']; dynamic data = call.arguments['data'];
switch (type) { switch (type) {
case 'onSyncServerStart': case 'onSyncServerStart':
conversationManager.listener.syncServerStart(); print('dart onSyncServerStart: $data');
conversationManager.listener.syncServerStart(data);
break;
case 'onSyncServerProgress':
conversationManager.listener.syncServerProgress(data);
break; break;
case 'onSyncServerFinish': case 'onSyncServerFinish':
conversationManager.listener.syncServerFinish(); conversationManager.listener.syncServerFinish(data);
break; break;
case 'onSyncServerFailed': case 'onSyncServerFailed':
conversationManager.listener.syncServerFailed(); conversationManager.listener.syncServerFailed(data);
break; break;
case 'onNewConversation': case 'onNewConversation':
var list = Utils.toList(data, (map) => ConversationInfo.fromJson(map)); var list = Utils.toList(data, (map) => ConversationInfo.fromJson(map));
@@ -197,6 +199,10 @@ class IMManager {
case 'onTotalUnreadMessageCountChanged': case 'onTotalUnreadMessageCountChanged':
conversationManager.listener.totalUnreadMessageCountChanged(data ?? 0); conversationManager.listener.totalUnreadMessageCountChanged(data ?? 0);
break; break;
case 'onConversationUserInputStatusChanged':
final i = Utils.toObj(data, (map) => InputStatusChangedData.fromJson(map));
conversationManager.listener.conversationUserInputStatusChanged(i);
break;
} }
} else if (call.method == ListenerType.friendListener) { } else if (call.method == ListenerType.friendListener) {
String type = call.arguments['type']; String type = call.arguments['type'];
@@ -273,6 +279,15 @@ class IMManager {
_listenerForService?.recvNewMessage(msg); _listenerForService?.recvNewMessage(msg);
break; break;
} }
} else if (call.method == ListenerType.uploadLogsListener) {
String type = call.arguments['type'];
dynamic data = call.arguments['data'];
switch (type) {
case 'onProgress':
int size = data['size'];
int current = data['current'];
_uploadLogsListener?.onProgress(current, size);
}
} else if (call.method == ListenerType.uploadFileListener) { } else if (call.method == ListenerType.uploadFileListener) {
String type = call.arguments['type']; String type = call.arguments['type'];
dynamic data = call.arguments['data']; dynamic data = call.arguments['data'];
@@ -341,10 +356,8 @@ class IMManager {
OnConnectListener listener, { OnConnectListener listener, {
String? operationID, String? operationID,
}) { }) {
this._connectListener = listener; _connectListener = listener;
if (config.logFilePath == null) { config.logFilePath ??= config.dataDir;
config.logFilePath = config.dataDir;
}
return _channel.invokeMethod( return _channel.invokeMethod(
'initSDK', 'initSDK',
_buildParam( _buildParam(
@@ -361,7 +374,6 @@ class IMManager {
/// [apiAddr] SDK API address /// [apiAddr] SDK API address
/// [wsAddr] SDK WebSocket address /// [wsAddr] SDK WebSocket address
/// [dataDir] SDK database storage directory /// [dataDir] SDK database storage directory
/// [objectStorage] Object storage minio
/// [logLevel] Log level, 1: no printing /// [logLevel] Log level, 1: no printing
/// [enabledEncryption] true: encryption /// [enabledEncryption] true: encryption
/// [enabledCompression] true: compression /// [enabledCompression] true: compression
@@ -372,13 +384,13 @@ class IMManager {
required String dataDir, required String dataDir,
required OnConnectListener listener, required OnConnectListener listener,
int logLevel = 6, int logLevel = 6,
String objectStorage = 'minio', bool isNeedEncryption = false,
bool isCompression = false, bool isCompression = false,
bool isLogStandardOutput = true, bool isLogStandardOutput = true,
String? logFilePath, String? logFilePath,
String? operationID, String? operationID,
}) { }) {
this._connectListener = listener; _connectListener = listener;
return _channel.invokeMethod( return _channel.invokeMethod(
'initSDK', 'initSDK',
_buildParam( _buildParam(
@@ -388,10 +400,11 @@ class IMManager {
"wsAddr": wsAddr, "wsAddr": wsAddr,
"dataDir": dataDir, "dataDir": dataDir,
"logLevel": logLevel, "logLevel": logLevel,
"objectStorage": objectStorage,
"isCompression": isCompression, "isCompression": isCompression,
'isNeedEncryption': isNeedEncryption,
"isLogStandardOutput": isLogStandardOutput, "isLogStandardOutput": isLogStandardOutput,
"logFilePath": logFilePath, "logFilePath": logFilePath,
'systemType': 'flutter',
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
}, },
), ),
@@ -511,6 +524,45 @@ class IMManager {
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
/// Upload logs
Future uploadLogs({
String? ex,
int line = 0,
String? operationID,
}) =>
_channel.invokeMethod(
'uploadLogs',
_buildParam({
'ex': ex,
'line': line,
'operationID': Utils.checkOperationID(operationID),
}));
Future logs({
int logLevel = 5,
String? file,
int line = 0,
String? msgs,
String? err,
List<dynamic>? keyAndValues,
String? operationID,
}) =>
_channel.invokeMethod(
'logs',
_buildParam({
'line': line,
'logLevel': logLevel,
'file': file,
'msgs': msgs,
'err': err,
if (keyAndValues != null) 'keyAndValue': jsonEncode(keyAndValues),
'operationID': Utils.checkOperationID(operationID),
}));
void setUploadLogsListener(OnUploadLogsListener listener) {
_uploadLogsListener = listener;
}
void setUploadFileListener(OnUploadFileListener listener) { void setUploadFileListener(OnUploadFileListener listener) {
_uploadFileListener = listener; _uploadFileListener = listener;
} }
@@ -527,8 +579,10 @@ class IMManager {
MethodChannel get channel => _channel; MethodChannel get channel => _channel;
static Map _buildParam(Map param) { static Map _buildParam(Map<String, dynamic> param) {
param["ManagerName"] = "imManager"; param["ManagerName"] = "imManager";
param = Utils.cleanMap(param);
return param; return param;
} }
} }

View File

@@ -36,6 +36,7 @@ class MessageManager {
required OfflinePushInfo offlinePushInfo, required OfflinePushInfo offlinePushInfo,
String? userID, String? userID,
String? groupID, String? groupID,
bool isOnlineOnly = false,
String? operationID, String? operationID,
}) => }) =>
_channel _channel
@@ -46,6 +47,7 @@ class MessageManager {
'offlinePushInfo': offlinePushInfo.toJson(), 'offlinePushInfo': offlinePushInfo.toJson(),
'userID': userID ?? '', 'userID': userID ?? '',
'groupID': groupID ?? '', 'groupID': groupID ?? '',
'isOnlineOnly': isOnlineOnly,
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})) }))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
@@ -145,18 +147,14 @@ class MessageManager {
/// Typing status update /// Typing status update
/// [msgTip] Custom content /// [msgTip] Custom content
@Deprecated('Use [OpenIM.iMManager.conversationManager.changeInputStates(conversationID:focus:)] instead')
Future typingStatusUpdate({ Future typingStatusUpdate({
required String userID, required String userID,
String? msgTip, String? msgTip,
String? operationID, String? operationID,
}) => }) {
_channel.invokeMethod( throw UnimplementedError('typingStatusUpdate');
'typingStatusUpdate', }
_buildParam({
"msgTip": msgTip,
"userID": userID,
"operationID": Utils.checkOperationID(operationID),
}));
/// Create a text message /// Create a text message
Future<Message> createTextMessage({ Future<Message> createTextMessage({
@@ -529,8 +527,7 @@ class MessageManager {
}, },
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})) }))
.then((value) => .then((value) => Utils.toObj(value, (map) => SearchResult.fromJson(map)));
Utils.toObj(value, (map) => SearchResult.fromJson(map)));
/// Revoke a message /// Revoke a message
/// [message] The message to be revoked /// [message] The message to be revoked
@@ -550,6 +547,7 @@ class MessageManager {
/// Mark messages as read /// Mark messages as read
/// [conversationID] Conversation ID /// [conversationID] Conversation ID
/// [messageIDList] List of clientMsgIDs of messages to be marked as read /// [messageIDList] List of clientMsgIDs of messages to be marked as read
@Deprecated('Use markConversationMessageAsRead instead')
Future markMessagesAsReadByMsgID({ Future markMessagesAsReadByMsgID({
required String conversationID, required String conversationID,
required List<String> messageIDList, required List<String> messageIDList,
@@ -585,8 +583,7 @@ class MessageManager {
'lastMinSeq': lastMinSeq ?? 0, 'lastMinSeq': lastMinSeq ?? 0,
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})) }))
.then((value) => .then((value) => Utils.toObj(value, (map) => AdvancedMessage.fromJson(map)));
Utils.toObj(value, (map) => AdvancedMessage.fromJson(map)));
/// Get chat history (newly received chat history after startMsg). Used for locating a specific message in global search and then fetching messages received after that message. /// Get chat history (newly received chat history after startMsg). Used for locating a specific message in global search and then fetching messages received after that message.
/// [conversationID] Conversation ID, can be used for querying notifications /// [conversationID] Conversation ID, can be used for querying notifications
@@ -609,8 +606,7 @@ class MessageManager {
'lastMinSeq': lastMinSeq ?? 0, 'lastMinSeq': lastMinSeq ?? 0,
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})) }))
.then((value) => .then((value) => Utils.toObj(value, (map) => AdvancedMessage.fromJson(map)));
Utils.toObj(value, (map) => AdvancedMessage.fromJson(map)));
/// Find message details /// Find message details
/// [conversationID] Conversation ID /// [conversationID] Conversation ID
@@ -626,8 +622,7 @@ class MessageManager {
'searchParams': searchParams.map((e) => e.toJson()).toList(), 'searchParams': searchParams.map((e) => e.toJson()).toList(),
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})) }))
.then((value) => .then((value) => Utils.toObj(value, (map) => SearchResult.fromJson(map)));
Utils.toObj(value, (map) => SearchResult.fromJson(map)));
/// Rich text message /// Rich text message
/// [text] Input content /// [text] Input content
@@ -679,6 +674,7 @@ class MessageManager {
required OfflinePushInfo offlinePushInfo, required OfflinePushInfo offlinePushInfo,
String? userID, String? userID,
String? groupID, String? groupID,
bool isOnlineOnly = false,
String? operationID, String? operationID,
}) => }) =>
_channel _channel
@@ -689,6 +685,7 @@ class MessageManager {
'offlinePushInfo': offlinePushInfo.toJson(), 'offlinePushInfo': offlinePushInfo.toJson(),
'userID': userID ?? '', 'userID': userID ?? '',
'groupID': groupID ?? '', 'groupID': groupID ?? '',
'isOnlineOnly': isOnlineOnly,
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})) }))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map))); .then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
@@ -779,7 +776,8 @@ class MessageManager {
})); }));
} }
Future setAppBadge(int count, { Future setAppBadge(
int count, {
String? operationID, String? operationID,
}) { }) {
return _channel.invokeMethod( return _channel.invokeMethod(
@@ -790,8 +788,10 @@ class MessageManager {
})); }));
} }
static Map _buildParam(Map param) { static Map _buildParam(Map<String, dynamic> param) {
param["ManagerName"] = "messageManager"; param["ManagerName"] = "messageManager";
param = Utils.cleanMap(param);
return param; return param;
} }
} }

View File

@@ -15,7 +15,7 @@ class UserManager {
/// Get user information /// Get user information
/// [userIDList] List of user IDs /// [userIDList] List of user IDs
Future<List<UserInfo>> getUsersInfo({ Future<List<PublicUserInfo>> getUsersInfo({
required List<String> userIDList, required List<String> userIDList,
String? operationID, String? operationID,
}) => }) =>
@@ -26,7 +26,7 @@ class UserManager {
'userIDList': userIDList, 'userIDList': userIDList,
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})) }))
.then((value) => Utils.toList(value, (v) => UserInfo.fromJson(v))); .then((value) => Utils.toList(value, (v) => PublicUserInfo.fromJson(v)));
/// Get information of the currently logged-in user /// Get information of the currently logged-in user
Future<UserInfo> getSelfUserInfo({ Future<UserInfo> getSelfUserInfo({
@@ -48,17 +48,16 @@ class UserManager {
Future<String?> setSelfInfo({ Future<String?> setSelfInfo({
String? nickname, String? nickname,
String? faceURL, String? faceURL,
int? appManagerLevel, int? globalRecvMsgOpt,
String? ex, String? ex,
String? operationID, String? operationID,
}) => }) =>
_channel.invokeMethod( _channel.invokeMethod(
'setSelfInfo', 'setSelfInfo',
_buildParam({ _buildParam({
// 'userID': userID,
'nickname': nickname, 'nickname': nickname,
'faceURL': faceURL, 'faceURL': faceURL,
'appManagerLevel': appManagerLevel, 'globalRecvMsgOpt': globalRecvMsgOpt,
'ex': ex, 'ex': ex,
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
@@ -115,24 +114,28 @@ class UserManager {
.then((value) => Utils.toList(value, (map) => UserStatusInfo.fromJson(map))); .then((value) => Utils.toList(value, (map) => UserStatusInfo.fromJson(map)));
} }
Future<List<UserInfo>> getUsersInfoWithCache( @Deprecated('Use [getUsersInfo] instead')
Future<List<PublicUserInfo>> getUsersInfoWithCache(
List<String> userIDs, { List<String> userIDs, {
String? groupID,
String? operationID, String? operationID,
}) { }) {
return _channel return getUsersInfo(userIDList: userIDs, operationID: operationID);
.invokeMethod(
'getUsersInfoWithCache',
_buildParam({
'userIDs': userIDs,
'groupID': groupID,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (map) => UserInfo.fromJson(map)));
} }
static Map _buildParam(Map param) { /// Global Do Not Disturb
/// [status] 0: Normal; 1: Do not accept messages; 2: Accept online messages but not offline messages;
@Deprecated('use [setSelfInfo] instead')
Future<dynamic> setGlobalRecvMessageOpt({
required int status,
String? operationID,
}) {
return setSelfInfo(globalRecvMsgOpt: status);
}
static Map _buildParam(Map<String, dynamic> param) {
param["ManagerName"] = "userManager"; param["ManagerName"] = "userManager";
param = Utils.cleanMap(param);
return param; return param;
} }
} }

View File

@@ -25,7 +25,7 @@ class ConversationInfo {
int? recvMsgOpt; int? recvMsgOpt;
// Number of unread messages in the conversation // Number of unread messages in the conversation
int? unreadCount; int unreadCount = 0;
// Latest message in the conversation // Latest message in the conversation
Message? latestMsg; Message? latestMsg;
@@ -72,7 +72,7 @@ class ConversationInfo {
this.showName, this.showName,
this.faceURL, this.faceURL,
this.recvMsgOpt, this.recvMsgOpt,
this.unreadCount, this.unreadCount = 0,
this.latestMsg, this.latestMsg,
this.latestMsgSendTime, this.latestMsgSendTime,
this.draftText, this.draftText,
@@ -87,8 +87,7 @@ class ConversationInfo {
this.msgDestructTime, this.msgDestructTime,
}); });
ConversationInfo.fromJson(Map<String, dynamic> json) ConversationInfo.fromJson(Map<String, dynamic> json) : conversationID = json['conversationID'] {
: conversationID = json['conversationID'] {
conversationType = json['conversationType']; conversationType = json['conversationType'];
userID = json['userID']; userID = json['userID'];
groupID = json['groupID']; groupID = json['groupID'];
@@ -146,19 +145,14 @@ class ConversationInfo {
bool get isSingleChat => conversationType == ConversationType.single; bool get isSingleChat => conversationType == ConversationType.single;
// Check if it's a group chat // Check if it's a group chat
bool get isGroupChat => bool get isGroupChat => conversationType == ConversationType.group || conversationType == ConversationType.superGroup;
conversationType == ConversationType.group ||
conversationType == ConversationType.superGroup;
// Check if it's a valid conversation (not in a group if isNotInGroup is true) // Check if it's a valid conversation (not in a group if isNotInGroup is true)
bool get isValid => isSingleChat || (isGroupChat && !isNotInGroup!); bool get isValid => isSingleChat || (isGroupChat && !isNotInGroup!);
@override @override
bool operator ==(Object other) => bool operator ==(Object other) =>
identical(this, other) || identical(this, other) || other is ConversationInfo && runtimeType == other.runtimeType && conversationID == other.conversationID;
other is ConversationInfo &&
runtimeType == other.runtimeType &&
conversationID == other.conversationID;
@override @override
int get hashCode => conversationID.hashCode; int get hashCode => conversationID.hashCode;

View File

@@ -115,16 +115,11 @@ class GroupInfo {
} }
/// Corresponding Conversation Type for Group Type /// Corresponding Conversation Type for Group Type
int get sessionType => groupType == GroupType.general int get sessionType => groupType == GroupType.general ? ConversationType.group : ConversationType.superGroup;
? ConversationType.group
: ConversationType.superGroup;
@override @override
bool operator ==(Object other) => bool operator ==(Object other) =>
identical(this, other) || identical(this, other) || other is GroupInfo && runtimeType == other.runtimeType && groupID == other.groupID;
other is GroupInfo &&
runtimeType == other.runtimeType &&
groupID == other.groupID;
@override @override
int get hashCode => groupID.hashCode; int get hashCode => groupID.hashCode;

View File

@@ -1,35 +1,37 @@
class InitConfig { class InitConfig {
String systemType;
int platformID; int platformID;
String apiAddr; String apiAddr;
String wsAddr; String wsAddr;
String dataDir; String dataDir;
String objectStorage;
int logLevel; int logLevel;
bool isLogStandardOutput; bool isLogStandardOutput;
String? logFilePath; String? logFilePath;
bool enabledCompression;
InitConfig({ InitConfig({
required this.platformID, required this.platformID,
required this.apiAddr, required this.apiAddr,
required this.wsAddr, required this.wsAddr,
required this.dataDir, required this.dataDir,
required this.objectStorage,
this.logLevel = 6, this.logLevel = 6,
this.isLogStandardOutput = true, this.isLogStandardOutput = true,
this.logFilePath, this.logFilePath,
this.enabledCompression = false,
this.systemType = 'flutter',
}); });
factory InitConfig.fromJson(Map<String, dynamic> json) { factory InitConfig.fromJson(Map<String, dynamic> json) {
return InitConfig( return InitConfig(
platformID: json['platformID'], platformID: json['platformID'],
apiAddr: json['apiAddr'], apiAddr: json['apiAddr'],
wsAddr: json['wsAddr'], wsAddr: json['wsAddr'],
dataDir: json['dataDir'], dataDir: json['dataDir'],
objectStorage: json['objectStorage'], logLevel: json['logLevel'],
logLevel: json['logLevel'], isLogStandardOutput: json['isLogStandardOutput'],
isLogStandardOutput: json['isLogStandardOutput'], logFilePath: json['logFilePath'],
logFilePath: json['logFilePath'], enabledCompression: json['isCompression'],
); systemType: json['systemType']);
} }
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
@@ -38,10 +40,11 @@ class InitConfig {
'apiAddr': apiAddr, 'apiAddr': apiAddr,
'wsAddr': wsAddr, 'wsAddr': wsAddr,
'dataDir': dataDir, 'dataDir': dataDir,
'objectStorage': objectStorage,
'logLevel': logLevel, 'logLevel': logLevel,
'isLogStandardOutput': isLogStandardOutput, 'isLogStandardOutput': isLogStandardOutput,
'logFilePath': logFilePath, 'logFilePath': logFilePath,
'isCompression': enabledCompression,
'systemType': systemType,
}; };
} }
} }

View File

@@ -0,0 +1,24 @@
class InputStatusChangedData {
final String userID;
final String conversationID;
final List<int>? platformIDs;
InputStatusChangedData({
required this.userID,
required this.conversationID,
this.platformIDs,
});
InputStatusChangedData.fromJson(Map<String, dynamic> json)
: userID = json['userID'],
conversationID = json['conversationID'],
platformIDs = List<int>.from(json['platformIDs'] ?? []);
Map<String, dynamic> toJson() {
final data = <String, dynamic>{};
data['userID'] = userID;
data['conversationID'] = conversationID;
data['platformIDs'] = platformIDs;
return data;
}
}

View File

@@ -920,37 +920,27 @@ class MessageEntity {
/// Group message read information /// Group message read information
class GroupHasReadInfo { class GroupHasReadInfo {
/// List of user IDs that have read the message /// Total number of reads
List<String>? hasReadUserIDList;
/// Total number of messages read
int? hasReadCount; int? hasReadCount;
/// Number of group members when this message was sent int? unreadCount;
int? groupMemberCount;
GroupHasReadInfo.fromJson(Map<String, dynamic> json) { GroupHasReadInfo.fromJson(Map<String, dynamic> json) {
if (json['hasReadUserIDList'] == null) {
hasReadUserIDList = <String>[];
} else {
hasReadUserIDList = (json['hasReadUserIDList'] as List).cast<String>();
}
hasReadCount = json['hasReadCount'] ?? 0; hasReadCount = json['hasReadCount'] ?? 0;
groupMemberCount = json['groupMemberCount'] ?? 0; unreadCount = json['unreadCount'] ?? 0;
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final data = Map<String, dynamic>(); final data = Map<String, dynamic>();
data['hasReadUserIDList'] = this.hasReadUserIDList;
data['hasReadCount'] = this.hasReadCount; data['hasReadCount'] = this.hasReadCount;
data['groupMemberCount'] = this.groupMemberCount; data['unreadCount'] = this.unreadCount;
return data; return data;
} }
} }
/// Message read receipt information /// Message read receipt information
class ReadReceiptInfo { class ReadReceiptInfo {
/// Sender's ID /// Sender ID
String? userID; String? userID;
/// Group ID /// Group ID

View File

@@ -0,0 +1,41 @@
class SetGroupMemberInfo {
SetGroupMemberInfo({
required this.groupID,
required this.userID,
this.roleLevel,
this.nickname,
this.faceURL,
this.ex,
});
final String groupID;
final String userID;
final int? roleLevel;
final String? nickname;
final String? faceURL;
final String? ex;
SetGroupMemberInfo.fromJson(Map<String, dynamic> json)
: groupID = json['groupID'],
userID = json['userID'],
roleLevel = json['roleLevel'],
nickname = json['nickname'],
faceURL = json['faceURL'],
ex = json['ex'];
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['groupID'] = groupID;
data['userID'] = userID;
data['roleLevel'] = roleLevel;
data['nickname'] = nickname;
data['faceURL'] = faceURL;
data['ex'] = ex;
return data;
}
@override
String toString() {
return 'SetGroupMemberInfo{groupID: $groupID, userID: $userID, roleLevel: $roleLevel, nickname: $nickname, faceURL: $faceURL, ex: $ex}';
}
}

View File

@@ -0,0 +1,91 @@
class UpdateFriendsReq {
final String? ownerUserID;
final List<String>? friendUserIDs;
final bool? isPinned;
final String? remark;
final String? ex;
UpdateFriendsReq({
this.ownerUserID,
this.friendUserIDs,
this.isPinned,
this.remark,
this.ex,
});
UpdateFriendsReq.fromJson(Map<String, dynamic> json)
: ownerUserID = json['ownerUserID'],
friendUserIDs = json['friendUserIDs'],
isPinned = json['isPinned'],
remark = json['remark'],
ex = json['ex'];
Map<String, dynamic> toJson() {
final data = <String, dynamic>{};
data['ownerUserID'] = ownerUserID;
data['friendUserIDs'] = friendUserIDs;
data['isPinned'] = isPinned;
data['remark'] = remark;
data['ex'] = ex;
return data;
}
@override
String toString() {
return 'UpdateFriendsReq{ownerUserID: $ownerUserID, friendUserIDs: $friendUserIDs, isPinned: $isPinned, remark: $remark, ex: $ex}';
}
}
class ConversationReq {
final String? userID;
final String? groupID;
final int? recvMsgOpt;
final bool? isPinned;
final bool? isPrivateChat;
final String? ex;
final int? burnDuration;
final bool? isMsgDestruct;
final int? msgDestructTime;
final int? groupAtType;
ConversationReq({
this.userID,
this.groupID,
this.recvMsgOpt,
this.isPinned,
this.isPrivateChat,
this.ex,
this.burnDuration,
this.isMsgDestruct,
this.msgDestructTime,
this.groupAtType,
});
ConversationReq.fromJson(Map<String, dynamic> json)
: userID = json['userID'],
groupID = json['groupID'],
recvMsgOpt = json['recvMsgOpt'],
isPinned = json['isPinned'],
isPrivateChat = json['isPrivateChat'],
ex = json['ex'],
burnDuration = json['burnDuration'],
isMsgDestruct = json['isMsgDestruct'],
msgDestructTime = json['msgDestructTime'],
groupAtType = json['groupAtType'];
Map<String, dynamic> toJson() {
final data = <String, dynamic>{};
data['userID'] = userID;
data['groupID'] = groupID;
data['recvMsgOpt'] = recvMsgOpt;
data['isPinned'] = isPinned;
data['isPrivateChat'] = isPrivateChat;
data['ex'] = ex;
data['burnDuration'] = burnDuration;
data['isMsgDestruct'] = isMsgDestruct;
data['msgDestructTime'] = msgDestructTime;
data['groupAtType'] = groupAtType;
return data;
}
}

View File

@@ -74,32 +74,6 @@ class UserInfo {
int get hashCode => userID.hashCode; int get hashCode => userID.hashCode;
} }
class FullUserInfo {
/// User's public information
PublicUserInfo? publicInfo;
/// Information visible only to friends
FriendInfo? friendInfo;
/// Blacklist information
BlacklistInfo? blackInfo;
FullUserInfo.fromJson(Map<String, dynamic> json) {
publicInfo = json['publicInfo'] != null ? PublicUserInfo.fromJson(json['publicInfo']) : null;
friendInfo = json['friendInfo'] != null ? FriendInfo.fromJson(json['friendInfo']) : null;
blackInfo = json['blackInfo'] != null ? BlacklistInfo.fromJson(json['blackInfo']) : null;
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['publicInfo'] = this.publicInfo?.toJson();
data['friendInfo'] = this.friendInfo?.toJson();
data['blackInfo'] = this.blackInfo?.toJson();
return data;
}
}
class PublicUserInfo { class PublicUserInfo {
/// User ID /// User ID
String? userID; String? userID;

View File

@@ -2,9 +2,9 @@ import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class OpenIM { class OpenIM {
static const version = '3.4.0'; static const version = '3.8.1';
static const _channel = const MethodChannel('flutter_openim_sdk'); static const _channel = MethodChannel('flutter_openim_sdk');
static final iMManager = IMManager(_channel); static final iMManager = IMManager(_channel);

View File

@@ -4,13 +4,21 @@ class Utils {
static List<T> toList<T>(String value, T f(Map<String, dynamic> map)) => static List<T> toList<T>(String value, T f(Map<String, dynamic> map)) =>
(formatJson(value) as List).map((e) => f(e)).toList(); (formatJson(value) as List).map((e) => f(e)).toList();
static T toObj<T>(String value, T f(Map<String, dynamic> map)) => static T toObj<T>(String value, T f(Map<String, dynamic> map)) => f(formatJson(value));
f(formatJson(value));
static List<dynamic> toListMap(String value) => formatJson(value); static List<dynamic> toListMap(String value) => formatJson(value);
static dynamic formatJson(String value) => jsonDecode(value); static dynamic formatJson(String value) => jsonDecode(value);
static String checkOperationID(String? obj) => static String checkOperationID(String? obj) => obj ?? DateTime.now().millisecondsSinceEpoch.toString();
obj ?? DateTime.now().millisecondsSinceEpoch.toString();
static Map<String, dynamic> cleanMap(Map<String, dynamic> map) {
map.removeWhere((key, value) {
if (value is Map<String, dynamic>) {
cleanMap(value);
}
return value == null;
});
return map;
}
} }

View File

@@ -5,10 +5,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: async name: async
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.10.0" version: "2.11.0"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
@@ -21,10 +21,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: characters name: characters
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.1" version: "1.3.0"
clock: clock:
dependency: transitive dependency: transitive
description: description:
@@ -37,10 +37,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.17.0" version: "1.18.0"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
@@ -59,46 +59,62 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
js: leak_tracker:
dependency: transitive dependency: transitive
description: description:
name: js name: leak_tracker
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.6.5" version: "10.0.4"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
url: "https://pub.dev"
source: hosted
version: "3.0.3"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
url: "https://pub.dev"
source: hosted
version: "3.0.1"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.12.13" version: "0.12.16+1"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.0" version: "0.8.0"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.8.0" version: "1.12.0"
path: path:
dependency: transitive dependency: transitive
description: description:
name: path name: path
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.8.2" version: "1.9.0"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@@ -108,26 +124,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.9.1" version: "1.10.0"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
name: stack_trace name: stack_trace
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.11.0" version: "1.11.1"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
name: stream_channel name: stream_channel
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.1" version: "2.1.2"
string_scanner: string_scanner:
dependency: transitive dependency: transitive
description: description:
@@ -148,10 +164,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.4.16" version: "0.7.0"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
@@ -160,6 +176,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.4" version: "2.1.4"
vm_service:
dependency: transitive
description:
name: vm_service
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
url: "https://pub.dev"
source: hosted
version: "14.2.1"
sdks: sdks:
dart: ">=2.18.0 <3.0.0" dart: ">=3.3.0 <4.0.0"
flutter: ">=1.20.0" flutter: ">=3.18.0-18.0.pre.54"

View File

@@ -1,11 +1,11 @@
name: flutter_openim_sdk name: flutter_openim_sdk
description: An instant messaging plug-in that supports Android and IOS. And the server is also all open source. description: An instant messaging plug-in that supports Android and IOS. And the server is also all open source.
version: 3.4.0 version: 3.8.1
homepage: https://www.rentsoft.cn homepage: https://www.openim.io
repository: https://github.com/OpenIMSDK/Open-IM-SDK-Flutter repository: https://github.com/openimsdk/open-im-sdk-flutter
environment: environment:
sdk: ">=2.12.0 <3.0.0" sdk: ">=3.0.0 <4.0.0"
flutter: ">=1.20.0" flutter: ">=1.20.0"
dependencies: dependencies: