Compare commits

..

7 Commits

Author SHA1 Message Date
Brett
1ca0ee7aaf hotfix version. 2025-04-18 15:50:10 +08:00
Brett
622576295e hotfix version. 2025-04-18 15:47:01 +08:00
Brett
5c13d83cc1 version. 2025-04-18 15:40:59 +08:00
Brett
8beb75eb75 fix: InvitedJoinGroupNotification 2025-04-18 15:16:00 +08:00
skiffer-git
ab67f7fa10 Update LICENSE 2025-04-02 09:35:25 +08:00
Brett
c2bf30e268 fix: The uninitSDK function removes the Future. (#204) 2025-03-31 14:50:13 +08:00
Brett
a9567886b4 https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.8.3-patch.3 2025-03-07 18:54:27 +08:00
119 changed files with 423 additions and 35712 deletions

9
.gitignore vendored
View File

@@ -2,12 +2,3 @@
#/.packages
#/.dart_tool
#/example/ios/Podfile.lock
build/
.dart_tool/
.vscode/
.metadata
.idea/encodings.xml
.idea/other.xml
windows/openlib/
windows/third_party/
.claude/

View File

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

View File

@@ -1,29 +1,27 @@
<component name="libraryTable">
<library name="Dart SDK">
<CLASSES>
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/_internal" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/async" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/cli" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/collection" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/concurrent" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/convert" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/core" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/developer" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/ffi" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/html" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/indexed_db" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/io" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/isolate" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/js" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/js_interop" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/js_interop_unsafe" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/js_util" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/math" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/mirrors" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/svg" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/typed_data" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/web_audio" />
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/web_gl" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/async" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/cli" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/collection" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/convert" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/core" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/developer" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/ffi" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/html" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/indexed_db" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/io" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/isolate" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/js" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/js_interop" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/js_interop_unsafe" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/js_util" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/math" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/mirrors" />
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/svg" />
<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>
<JAVADOC />
<SOURCES />

3
.idea/misc.xml generated
View File

@@ -3,7 +3,4 @@
<type id="android" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Android API 25 Platform" project-jdk-type="Android SDK" />
<component name="ProjectType">
<option name="id" value="io.flutter" />
</component>
</project>

View File

@@ -1,3 +1,7 @@
## 3.8.3+3
- [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.8.3-patch.3)
## 3.8.2
- [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.8.2)

195
CLAUDE.md
View File

@@ -1,195 +0,0 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## 项目概述
这是一个 Flutter 插件项目,为 OpenIM 即时通讯服务提供 Flutter SDK 封装。该 SDK 支持 Android、iOS 和 Windows 平台。
**核心架构:**
- Flutter 层通过 MethodChannel 与原生层通信
- Android 原生层使用 gomobile 编译的 AAR 包与 OpenIM SDK Core (Go) 交互
- iOS 原生层使用 gomobile 编译的 XCFramework 与 OpenIM SDK Core 交互
- 数据传输格式为 JSON,数据存储使用 OpenIM SDK Core 内置的 SQLite
## 常用命令
### 开发环境设置
```bash
# 安装依赖
flutter pub get
# 运行示例应用
cd example
flutter pub get
flutter run
```
### 测试
```bash
# 运行单元测试
flutter test
# 运行集成测试
cd example
flutter test integration_test/plugin_integration_test.dart
```
### 代码格式化
```bash
# 格式化代码
dart format .
# 分析代码
flutter analyze
```
### Android 构建
```bash
# 在 example 目录中构建 Android
cd example
flutter build apk
# 构建 Android AAR
cd android
./gradlew assembleRelease
```
### iOS 构建
```bash
# 在 example 目录中构建 iOS
cd example
flutter build ios
```
## 核心架构设计
### 1. 管理器层次结构
`IMManager` 是核心管理器,包含以下子管理器:
- `ConversationManager`: 会话管理(lib/src/manager/im_conversation_manager.dart)
- `MessageManager`: 消息管理(lib/src/manager/im_message_manager.dart)
- `FriendshipManager`: 好友关系管理(lib/src/manager/im_friendship_manager.dart)
- `GroupManager`: 群组管理(lib/src/manager/im_group_manager.dart)
- `ChannelManager`: <20><>道管理(lib/src/manager/im_channel_manager.dart)
- `UserManager`: 用户管理(lib/src/manager/im_user_manager.dart)
### 2. 双向通信机制
**Flutter → Native (方法调用):**
- Flutter 通过 MethodChannel 调用原生方法
- 参数统一使用 `_buildParam()` 封装,添加 `ManagerName` 和清理空值
- 每个请求可携带 `operationID` 用于追踪
**Native → Flutter (回调监听):**
- 原生层通过 MethodChannel 回调 Flutter 层
- Flutter 在 `IMManager._addNativeCallback()` 中统一处理所有监听器回调
- 监听器类型定义在 `lib/src/enum/listener_type.dart`
### 3. 数据模型转换
所有数据模型位于 `lib/src/models/`,使用 JSON 序列化/反序列化:
- `Utils.toObj()`: JSON Map 转对象
- `Utils.toList()`: JSON Array 转对象列表
- 所有模型类实现 `fromJson()``toJson()` 方法
### 4. 监听器系统
监听器定义在 `lib/src/listener/`,主要包括:
- `OnConnectListener`: 连接状态监听
- `OnAdvancedMsgListener`: 高级消息监听
- `OnConversationListener`: 会话变化监听
- `OnFriendshipListener`: 好友关系监听
- `OnGroupListener`: 群组事件监听
- `OnChannelListener`: 频道事件监听
- `OnUserListener`: 用户信息监听
### 5. 原生层实现
**Android (Java):**
- 插件入口: `android/src/main/java/io/openim/flutter_openim_sdk/FlutterOpenimSdkPlugin.java`
- 各管理器实现: `android/src/main/java/io/openim/flutter_openim_sdk/manager/`
- 依赖的 OpenIM SDK Core AAR 包位于 `android/libs/`
**iOS (Swift/ObjC):**
- 插件入口: `ios/Classes/SwiftFlutterOpenimSdkPlugin.swift`
- 模块化管理器: `ios/Classes/Module/`
- 工具类: `ios/Classes/Util/`
## 开发注意事项
### SDK 初始化和登录流程
1. **必须先初始化 SDK** (`initSDK()``init()`)
2. **设置监听器** (必须在登录前完成)
3. **登录** (`login()`)
4. SDK 初始化需要提供:
- `platformID`: 平台 ID (参考 `IMPlatform` 枚举)
- `apiAddr`: OpenIM Server API <20><><EFBFBD>
- `wsAddr`: OpenIM Server WebSocket 地址
- `dataDir`: 数据存储目录
### 消息收发
- 创建消息使用 `MessageManager.create*Message()` 系列方法
- 发送消息使用 `MessageManager.sendMessage()`
- 接收消息通过 `OnAdvancedMsgListener` 监听
- 支持单聊、群聊、在线消息等多种场景
### 平台特定功能
- **Android 独有**: `setListenerForService()` - 用于后台服务监听
- **通知可见性规则**: Android SDK 35+ 支持的通知管理功能
- **文件上传**: 支持自定义上传监听器 (`OnUploadFileListener`)
### 版本管理
- SDK 版本定义在 `lib/src/openim.dart` 中的 `OpenIM.version`
- `pubspec.yaml` 中的版本应与之保持一致
- 使用格式: `major.minor.patch+build` (如 `3.8.3+2`)
### 日志和调试
- 使用 `Logger.print()` 输出日志 (lib/src/logger.dart)
- 支持上传日志到服务器: `uploadLogs()`
- 可自定义日志级别 (1-6,默认 6 为全部输出)
## Android 特定配置
### ProGuard 规则
项目使用 ProGuard 混淆,规则文件在 `example/android/app/proguard-rules.pro`:
```proguard
-keep class io.openim.** { *; }
-keep class open_im_sdk.** { *; }
-keep class open_im_sdk_callback.** { *; }
```
### Gradle 配置
- 使用阿里云 Maven 镜像加速依赖下载
- 本地 Maven 仓库: `http://192.168.77.132:8081/repository/mvn2-group` (需根据实际情况修改)
- `compileSdkVersion`: 34
- `minSdkVersion`: 21
## 常见任务
### 添加新的 API 方法
1. 在对应的 Manager 类(Dart)中添加方法
2. 在 Android Manager 类(Java)中实现
3. 在 iOS Module 类(Swift)中实现
4. 确保参数序列化和回调处理正确
### 添加新的监听器
1.`lib/src/listener/` 创建监听器类
2.`ListenerType` 枚举中添加类型
3.`IMManager._addNativeCallback()` 中添加处理逻辑
4. 在原生层实现对应的回调触发
### 调试原生层交互
- Flutter → Native: 在 `Logger.print()` 查看方法调用日志
- Native → Flutter: 在 `_addNativeCallback()` 设置断点查看回调数据
- 使用 `operationID` 追踪特定操作的完整流程

214
LICENSE
View File

@@ -1,21 +1,201 @@
MIT License
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
Copyright (c) 2018 OpenIM Corporation
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
1. Definitions.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -14,8 +14,6 @@ def getCurrentProjectDir() {
}
buildscript {
ext.kotlin_version = '1.9.24'
repositories {
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/central' }
@@ -27,47 +25,30 @@ buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:7.3.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
rootProject.allprojects {
repositories {
// 本地 AAR 调试配置 - 使用 rootProject.projectDir 确保路径正确
// maven { url 'file://' + rootProject.projectDir.absolutePath + '/local-maven' }
maven {
url 'http://192.168.77.132:8081/repository/mvn2-group'
allowInsecureProtocol true
}
google()
mavenCentral()
}
}
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
android {
namespace 'io.openim.flutter_openim_sdk'
compileSdkVersion 34
defaultConfig {
minSdkVersion 21
ndk {
abiFilters "arm64-v8a","x86" // 根据需要添加其他 ABI
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
//implementation 'com.openim:sdkcore:1.0.15-local'
implementation 'com.openim:sdkcore:1.0.18'
implementation 'io.openim:core-sdk:3.8.3-patch3@aar'
}

View File

@@ -1,6 +1,5 @@
#Tue Nov 12 14:22:37 CST 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.4-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.openim.flutter_openim_sdk">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>

View File

@@ -24,7 +24,7 @@ import io.openim.flutter_openim_sdk.manager.GroupManager;
import io.openim.flutter_openim_sdk.manager.IMManager;
import io.openim.flutter_openim_sdk.manager.MessageManager;
import io.openim.flutter_openim_sdk.manager.UserManager;
import io.openim.flutter_openim_sdk.manager.ChannelManager;
/**
* FlutterOpenimSdkPlugin
@@ -42,7 +42,6 @@ public class FlutterOpenimSdkPlugin implements FlutterPlugin, MethodCallHandler,
private static MessageManager messageManager;
private static ConversationManager conversationManager;
private static GroupManager groupManager;
private static ChannelManager channelManager;
private static Activity activity;
private static Context context;
private ConnectivityListener connectivityListener;
@@ -56,8 +55,6 @@ public class FlutterOpenimSdkPlugin implements FlutterPlugin, MethodCallHandler,
FlutterOpenimSdkPlugin.messageManager = new MessageManager();
FlutterOpenimSdkPlugin.conversationManager = new ConversationManager();
FlutterOpenimSdkPlugin.groupManager = new GroupManager();
FlutterOpenimSdkPlugin.channelManager = new ChannelManager();
}

View File

@@ -29,14 +29,6 @@ public class OnAdvancedMsgListener implements open_im_sdk_callback.OnAdvancedMsg
CommonUtil.emitEvent("advancedMsgListener", "onNewRecvMessageRevoked", values);
}
@Override
public void onNewRecvMessageEdited(String s) {
final Map<String, String> values = new ArrayMap<>();
values.put("id", id);
values.put("messageEdited", s);
CommonUtil.emitEvent("advancedMsgListener", "onNewRecvMessageEdited", values);
}
@Override
public void onRecvC2CReadReceipt(String s) {
final Map<String, String> values = new ArrayMap<>();

View File

@@ -1,32 +0,0 @@
package io.openim.flutter_openim_sdk.listener;
import io.openim.flutter_openim_sdk.util.CommonUtil;
public class OnChannelListener implements open_im_sdk_callback.OnChannelListener {
@Override
public void onChannelDismissed(String s) {
CommonUtil.emitEvent("channelListener", "onChannelDismissed", s);
}
@Override
public void onChannelInfoChanged(String s) {
CommonUtil.emitEvent("channelListener", "onChannelInfoChanged", s);
}
@Override
public void onChannelMemberAdded(String s) {
CommonUtil.emitEvent("channelListener", "onChannelMemberAdded", s);
}
@Override
public void onChannelMemberDeleted(String s) {
CommonUtil.emitEvent("channelListener", "onChannelMemberDeleted", s);
}
@Override
public void onChannelMemberInfoChanged(String s) {
CommonUtil.emitEvent("channelListener", "onChannelMemberInfoChanged", s);
}
}

View File

@@ -1,103 +0,0 @@
package io.openim.flutter_openim_sdk.manager;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.openim.flutter_openim_sdk.listener.OnBaseListener;
import io.openim.flutter_openim_sdk.listener.OnChannelListener;
import open_im_sdk.Open_im_sdk;
public class ChannelManager extends BaseManager {
public void setChannelListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setChannelListener(new OnChannelListener());
result.success(null);
}
public void getChannelMembersInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getSpecifiedChannelMembersInfo(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "channelID"),
jsonValue(methodCall, "userIDList")
);
}
public void getChannelMemberList(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getChannelMemberList(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "channelID"),
value(methodCall, "filter"),
value(methodCall, "offset"),
value(methodCall, "count")
);
}
public void getChannelsInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getSpecifiedChannelsInfo(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "channelIDList")
);
}
public void joinChannel(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.joinChannel(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "channelID"),
value(methodCall, "reason"),
value(methodCall, "joinSource"),
value(methodCall, "ex")
);
}
public void quitChannel(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.quitChannel(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "channelID")
);
}
public void changeChannelMute(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.changeChannelMute(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "channelID"),
value(methodCall, "mute")
);
}
public void changeChannelMemberMute(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.changeChannelMemberMute(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "channelID"),
value(methodCall, "userID"),
int2long(methodCall, "seconds")
);
}
public void isJoinChannel(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.isJoinChannel(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "channelID")
);
}
public void getUsersInChannel(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getUsersInChannel(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "channelID"),
jsonValue(methodCall, "userIDs")
);
}
}

View File

@@ -102,69 +102,6 @@ public class IMManager extends BaseManager {
);
}
public void setNotificationVisibilityRule(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setNotificationVisibilityRule(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "notificationType"),
value(methodCall, "visibilityType")
);
}
public void setNotificationVisibilityRules(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setNotificationVisibilityRules(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "rulesJSON")
);
}
public void getNotificationVisibilityRule(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getNotificationVisibilityRule(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "notificationType")
);
}
public void getNotificationVisibilityRules(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getNotificationVisibilityRules(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
}
public void enableNotificationVisibilityRule(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.enableNotificationVisibilityRule(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "notificationType")
);
}
public void disableNotificationVisibilityRule(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.disableNotificationVisibilityRule(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "notificationType")
);
}
public void deleteNotificationVisibilityRule(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.deleteNotificationVisibilityRule(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "notificationType")
);
}
public void resetNotificationVisibilityRules(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.resetNotificationVisibilityRules(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID")
);
}
// public void setListenerForService(MethodCall methodCall, MethodChannel.Result result) {
// Open_im_sdk.setListenerForService(new OnListenerForService());
//

View File

@@ -27,7 +27,6 @@ public class MessageManager extends BaseManager {
jsonValue(methodCall, "message"),
value(methodCall, "userID"),
value(methodCall, "groupID"),
value(methodCall, "channelID"),
jsonValue(methodCall, "offlinePushInfo"),
value(methodCall, "isOnlineOnly")
);
@@ -42,16 +41,6 @@ public class MessageManager extends BaseManager {
);
}
public void editMessage(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.editMessage(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "conversationID"),
value(methodCall, "clientMsgID"),
jsonValue(methodCall, "message")
);
}
public void deleteMessageFromLocalStorage(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.deleteMessageFromLocalStorage(
new OnBaseListener(result, methodCall),
@@ -100,7 +89,6 @@ public class MessageManager extends BaseManager {
value(methodCall, "operationID"),
jsonValue(methodCall, "message"),
value(methodCall, "groupID"),
value(methodCall, "channelID"),
value(methodCall, "senderID")
);
}
@@ -351,7 +339,6 @@ public class MessageManager extends BaseManager {
jsonValue(methodCall, "message"),
value(methodCall, "userID"),
value(methodCall, "groupID"),
value(methodCall, "channelId"),
jsonValue(methodCall, "offlinePushInfo"),
value(methodCall, "isOnlineOnly")
);
@@ -388,16 +375,6 @@ public class MessageManager extends BaseManager {
jsonValue(methodCall, "fileElem")));
}
public void fetchSurroundingMessages(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.fetchSurroundingMessages(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall, "message"),
int2long(methodCall, "before"),
int2long(methodCall, "after"));
}
public void setCustomBusinessListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setCustomBusinessListener(new OnCustomBusinessListener());

View File

@@ -49,25 +49,7 @@ public class CommonUtil {
res.put("errMsg", errMsg);
}
Log.i("F-OpenIMSDK(native call flutter)", "thread: " + threadName + " { method:" + method + ", type:" + type + " }");
FlutterOpenimSdkPlugin.channel.invokeMethod(method, res, new MethodChannel.Result() {
@Override
public void success(Object result) {
// 处理成功返回值
Log.i("F-OpenIMSDK(native call flutter)", "Method " + method + " returned: ");
}
@Override
public void error(String errorCode, String errorMessage, Object errorDetails) {
// 处理错误
Log.e("F-OpenIMSDK(native call flutter)", "Method " + method + " error: " + errorCode + ", " + errorMessage);
}
@Override
public void notImplemented() {
// 处理未实现的方法
Log.w("F-OpenIMSDK(native call flutter)", "Method " + method + " not implemented");
}
});
FlutterOpenimSdkPlugin.channel.invokeMethod(method, res);
});
}

View File

@@ -1,27 +0,0 @@
package io.openim.flutter_openim_sdk
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import kotlin.test.Test
import org.mockito.Mockito
/*
* This demonstrates a simple unit test of the Kotlin portion of this plugin's implementation.
*
* Once you have built the plugin's example app, you can run these tests from the command
* line by running `./gradlew testDebugUnitTest` in the `example/android/` directory, or
* you can run them directly from IDEs that support JUnit such as Android Studio.
*/
internal class FlutterOpenimSdkPluginTest {
@Test
fun onMethodCall_getPlatformVersion_returnsExpectedValue() {
val plugin = FlutterOpenimSdkPlugin()
val call = MethodCall("getPlatformVersion", null)
val mockResult: MethodChannel.Result = Mockito.mock(MethodChannel.Result::class.java)
plugin.onMethodCall(call, mockResult)
Mockito.verify(mockResult).success("Android " + android.os.Build.VERSION.RELEASE)
}
}

4
example/.gitignore vendored
View File

@@ -41,7 +41,3 @@ app.*.map.json
/android/app/debug
/android/app/profile
/android/app/release
# 本地调试 AAR 文件
/libs/*.aar
/android/local-maven/

View File

@@ -49,7 +49,6 @@ android {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig = signingConfigs.debug
minifyEnabled true
}
}
}

View File

@@ -1,12 +1,4 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:label="example"
android:name="${applicationName}"

View File

@@ -1,5 +0,0 @@
package io.openim.flutter_openim_sdk_example
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity()

View File

@@ -1,54 +1,10 @@
buildscript {
// 1. 修改这里:将 Kotlin 版本升级到 1.9.24 以解决 "Module was compiled with... 1.9.0" 报错
ext.kotlin_version = '1.9.24'
repositories {
// 2. 优化网络:优先使用阿里云镜像,解决下载慢/超时/握手失败问题
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
google()
mavenCentral()
}
dependencies {
// Android Gradle 插件版本 (保持您当前的 7.3.0 即可,如果报错提示不兼容再升级到 7.4.2)
classpath 'com.android.tools.build:gradle:7.3.0'
// Kotlin 插件 (这里引用了上面定义的 ext.kotlin_version)
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
// === 本地 AAR 调试配置 ===
// 启用本地调试: 取消下面这行的注释
// maven { url 'file://' + projectDir.absolutePath + '/local-maven' }
// === 本地 AAR 配置结束 ===
// 3. 优化网络allprojects 也要加镜像
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
google()
mavenCentral()
}
}
// === 强制使用本地 AAR 版本 (调试时取消注释) ===
// 注意: 必须配合上面的本地 Maven 仓库一起使用
// configurations.all {
// resolutionStrategy {
// force 'com.openim:sdkcore:1.0.15-local'
// }
// }
rootProject.buildDir = "../build"
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
@@ -59,4 +15,4 @@ subprojects {
tasks.register("clean", Delete) {
delete rootProject.buildDir
}
}

View File

@@ -19,7 +19,7 @@ pluginManagement {
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "7.3.0" apply false
id "org.jetbrains.kotlin.android" version "1.9.24" apply false
id "org.jetbrains.kotlin.android" version "1.7.10" apply false
}
include ":app"

View File

@@ -1,21 +0,0 @@
// This is a basic Flutter integration test.
//
// Since integration tests run in a full Flutter application, they can interact
// with the host side of a plugin implementation, unlike Dart unit tests.
//
// For more information about Flutter integration tests, please see
// https://flutter.dev/to/integration-testing
import 'package:flutter_test/flutter_test.dart';
void main() {
// IntegrationTestWidgetsFlutterBinding.ensureInitialized();
// testWidgets('getPlatformVersion test', (WidgetTester tester) async {
// final FlutterOpenimSdk plugin = FlutterOpenimSdk();
// final String? version = await plugin.getPlatformVersion();
// // The version string depends on the host platform running the test, so
// // just assert that some non-empty string is returned.
// expect(version?.isNotEmpty, true);
// });
}

View File

@@ -1,198 +1,25 @@
import 'package:flutter/material.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
import 'package:flutter_openim_sdk/src/enum/group_notify_filter.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
void main() {
try {
runApp(const MyApp());
} catch (e, stackTrace) {
print('Error during app startup: $e');
print('Stack trace: $stackTrace');
}
runApp(MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool _isLoading = true;
bool _isLoggedIn = false;
@override
void initState() {
super.initState();
_init();
}
Future<void> _init() async {
await _requestPermissions();
await _initSDK();
setState(() {
_isLoading = false;
});
}
Future<void> _requestPermissions() async {
// 请求存储权限
var status = await Permission.storage.request();
if (status.isGranted) {
// 权限已授予,可以读写文件
}
}
Future<void> _initSDK() async {
var directory = await getApplicationDocumentsDirectory();
final rootPath = directory.path;
OpenIM.iMManager
.initSDK(
platformID: 2,
apiAddr: 'http://192.168.77.135:10002',
wsAddr: 'ws://192.168.77.135:10001',
dataDir: '$rootPath/',
listener: OnConnectListener(onConnectSuccess: () {
// Already connected to the server
_isLoggedIn = true;
}, onConnecting: () {
// Connecting to the server, can be used for UI prompts
}, onUserTokenExpired: () {
// User token has expired, can be used for UI prompts
_isLoggedIn = false;
}, onKickedOffline: () {
// The current user is kicked offline, and the user needs to be prompted to log in again
_isLoggedIn = false;
}))
.then((value) {
if (value) {
OpenIM.iMManager.userManager.setUserListener(OnUserListener(
onSelfInfoUpdated: (userInfo) {
debugPrint('onSelfInfoUpdated: ${userInfo.toJson()}');
},
));
OpenIM.iMManager.setNotificationVisibilityRule(
notificationType: MessageType.memberQuitNotification,
visibilityType:
GroupNotifyFilter.notificationVisibleToOperatorAndAdmin);
OpenIM.iMManager.setNotificationVisibilityRule(
notificationType: MessageType.memberKickedNotification,
visibilityType:
GroupNotifyFilter.notificationVisibleToOperatorAndAdmin);
// success
} else {
// fail
}
});
}
Future<void> _login() async {
try {
await OpenIM.iMManager
.login(
userID: "8bfe13b5eac44e87963652abb91d80d2",
token:
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiI4YmZlMTNiNWVhYzQ0ZTg3OTYzNjUyYWJiOTFkODBkMiIsIlBsYXRmb3JtSUQiOjIsImV4cCI6MTc3MTQwNzc2MCwiaWF0IjoxNzYzNjMxNzU1fQ.Da8DBofn085JsQlnSHfDqakH6puabZn7A2NAsUs9FoM")
.then((value) {
_isLoggedIn = true;
List<String> list = [];
OpenIM.iMManager.userManager.subscribeUsersStatus(list);
//send();
OpenIM.iMManager.messageManager
.setAdvancedMsgListener(OnAdvancedMsgListener(
// 当消息被撤回时调用
onRecvNewMessage: (msg) {
debugPrint('Received onRecvNewMessage: ${msg.toJson()}');
},
onRecvOnlineOnlyMessage: (msg) =>
debugPrint('Received online-only message: ${msg.toJson()}'),
onRecvOfflineNewMessage: (msg) =>
debugPrint('Received offline message: ${msg.toJson()}'),
));
OpenIM.iMManager.groupManager.setGroupListener(OnGroupListener(
// 当群组申请被接受时调用
onGroupApplicationAccepted: (groupApplication) {},
// 当群组申请被添加时调用
onGroupApplicationAdded: (groupApplication) {},
// 当群组申请被删除时调用
onGroupApplicationDeleted: (groupApplication) {},
// 当群组申请被拒绝时调用
onGroupApplicationRejected: (groupApplication) {
debugPrint('Group application rejected: $groupApplication');
},
// 当群组信息发生变化时调用
onGroupInfoChanged: (groupInfo) {
debugPrint('Group info changed: $groupInfo');
//等待一段时间,获得会话的最后一条消息
Future.delayed(const Duration(seconds: 2), () {
OpenIM.iMManager.conversationManager
.getOneConversation(
sourceID: groupInfo.groupID,
sessionType: ConversationType.superGroup)
.then((conversation) {
debugPrint(
'Updated conversation last message: ${conversation.latestMsg}');
});
});
},
// 当群组成员被添加时调用
onGroupMemberAdded: (groupMember) {
debugPrint('Group member added: $groupMember');
},
// 当群组成员被删除时调用
onGroupMemberDeleted: (groupMember) {
debugPrint('Group member deleted: $groupMember');
},
// 当群组成员信息发生变化时调用
onGroupMemberInfoChanged: (groupMember) {
debugPrint('Group member info changed: $groupMember');
},
// 当加入的群组被添加时调用
onJoinedGroupAdded: (groupInfo) {
debugPrint('Joined group added: $groupInfo');
},
// 当加入的群组被删除时调用
onJoinedGroupDeleted: (groupInfo) {
debugPrint('Joined group deleted: $groupInfo');
},
));
OpenIM.iMManager.conversationManager
.getAllConversationList()
.then((value) {
print('Get all conversation list successful');
});
});
} catch (error) {
_isLoggedIn = false;
} finally {
setState(() {
_isLoading = false;
});
}
}
Future<void> send() async {
OpenIM.iMManager.messageManager
.sendMessage(
userID: "724f91aceb434a28a1cd10f5564b2c68",
message: await OpenIM.iMManager.messageManager
.createTextMessage(text: 'hello openim'),
offlinePushInfo: OfflinePushInfo(title: 'title', desc: 'desc'))
.then((value) {
print('send success');
}).catchError((error) {
print('send error');
});
OpenIM.iMManager.initSDK(
platformID: 1,
apiAddr: '',
wsAddr: '',
dataDir: '/',
listener: OnConnectListener());
}
@override
@@ -202,35 +29,11 @@ class _MyAppState extends State<MyApp> {
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: _isLoading
? const Center(child: CircularProgressIndicator())
: _isLoggedIn
? Column(
children: [
TextButton(
onPressed: () {
OpenIM.iMManager.logout().then((_) {
setState(() {
_isLoggedIn = false;
});
});
},
child: const Text('logout')),
],
)
: Center(
child: TextButton(
onPressed: () {
setState(() {
_isLoading = true;
});
_login().then((_) {
setState(() {
_isLoading = false;
});
});
},
child: const Text('login'))),
body: Column(
children: [
TextButton(onPressed: () {}, child: Text('login')),
],
),
),
);
}

View File

@@ -1,114 +0,0 @@
# 本地 AAR 调试配置
此目录用于放置本地编译的 OpenIM SDK AAR 文件,仅在 example 项目调试时使用。
## 快速开始
### 步骤 1: 准备 AAR 文件
将你的 AAR 文件重命名为 `sdkcore-debug.aar` 并放在本目录:
```
example/libs/
└── sdkcore-debug.aar (你的本地编译 AAR 文件)
```
### 步骤 2: 复制到 Maven 仓库结构
```bash
# Linux/Mac/Git Bash
cd example
cp libs/sdkcore-debug.aar android/local-maven/com/openim/sdkcore/1.0.15-local/sdkcore-1.0.15-local.aar
# Windows PowerShell
cd example
Copy-Item libs\sdkcore-debug.aar android\local-maven\com\openim\sdkcore\1.0.15-local\sdkcore-1.0.15-local.aar
```
**注意**: POM 文件已自动创建在 `android/local-maven/com/openim/sdkcore/1.0.15-local/sdkcore-1.0.15-local.pom`
### 步骤 3: 启用本地 AAR
编辑 `example/android/build.gradle`,取消以下两处注释:
**1. 第 28 行 - 启用本地 Maven 仓库:**
```gradle
maven { url 'file://' + projectDir.absolutePath + '/local-maven' }
```
**2. 第 43-49 行 - 强制使用本地版本:**
```gradle
configurations.all {
resolutionStrategy {
force 'com.openim:sdkcore:1.0.15-local'
}
}
```
### 步骤 4: 清理并重新构建
```bash
cd example
flutter clean
flutter pub get
flutter build apk # 或 flutter run
```
## 更新 AAR 后快速替换
如果你已经配置过一次,只是更新了 AAR 文件:
```bash
cd example
# 复制新的 AAR 文件
cp libs/sdkcore-debug.aar android/local-maven/com/openim/sdkcore/1.0.15-local/sdkcore-1.0.15-local.aar
# 清理并重新构建
flutter clean && flutter pub get && flutter run
```
## 调试完成后恢复
重新注释掉 `example/android/build.gradle` 中的两处配置即可恢复使用远程 Maven 仓库的版本。
## 目录结构
```
example/
├── libs/
│ ├── README.md (本文件)
│ └── sdkcore-debug.aar (你的 AAR 源文件)
└── android/
└── local-maven/ (Git 已忽略)
└── com/openim/sdkcore/1.0.15-local/
├── sdkcore-1.0.15-local.aar (Maven 仓库中的 AAR)
└── sdkcore-1.0.15-local.pom (Maven 元数据)
```
## 注意事项
- ✅ 此配置只影响 example 项目,不会修改插件本身
- ✅ 切换远程/本地版本只需注释/取消注释即可
-`.gitignore` 已配置忽略 `android/local-maven/` 目录
- ⚠️ 每次修改 AAR 文件后需要重新复制到 Maven 目录并运行 `flutter clean`
- ⚠️ 确保 AAR 文件名和版本号匹配
## 故障排查
### 问题 1: Kotlin 版本不兼容错误
已修复:插件的 `android/build.gradle` 已添加 Kotlin 插件和正确的配置。
### 问题 2: "Zip file already contains entry" 错误
运行彻底清理:
```bash
cd example
flutter clean
rm -rf build
cd android && ./gradlew clean
```
### 问题 3: 找不到 sdkcore 依赖
确保:
1. `android/build.gradle` 中的本地 Maven 仓库已取消注释
2. `resolutionStrategy.force` 配置已取消注释
3. AAR 文件已正确复制到 Maven 目录结构中

View File

@@ -57,14 +57,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
url: "https://pub.dev"
source: hosted
version: "2.1.3"
flutter:
dependency: "direct main"
description: flutter
@@ -84,17 +76,12 @@ packages:
path: ".."
relative: true
source: path
version: "3.8.3+2"
version: "3.8.3+hotfix.3"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
leak_tracker:
dependency: transitive
description:
@@ -159,118 +146,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.9.0"
path_provider:
dependency: "direct main"
description:
name: path_provider
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev"
source: hosted
version: "2.1.5"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2"
url: "https://pub.dev"
source: hosted
version: "2.2.15"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.dev"
source: hosted
version: "2.2.1"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.dev"
source: hosted
version: "2.3.0"
permission_handler:
dependency: "direct main"
description:
name: permission_handler
sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849"
url: "https://pub.dev"
source: hosted
version: "11.4.0"
permission_handler_android:
dependency: transitive
description:
name: permission_handler_android
sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc
url: "https://pub.dev"
source: hosted
version: "12.1.0"
permission_handler_apple:
dependency: transitive
description:
name: permission_handler_apple
sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023
url: "https://pub.dev"
source: hosted
version: "9.4.7"
permission_handler_html:
dependency: transitive
description:
name: permission_handler_html
sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
url: "https://pub.dev"
source: hosted
version: "0.1.3+5"
permission_handler_platform_interface:
dependency: transitive
description:
name: permission_handler_platform_interface
sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878
url: "https://pub.dev"
source: hosted
version: "4.3.0"
permission_handler_windows:
dependency: transitive
description:
name: permission_handler_windows
sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e"
url: "https://pub.dev"
source: hosted
version: "0.2.1"
platform:
dependency: transitive
description:
name: platform
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev"
source: hosted
version: "3.1.6"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
sky_engine:
dependency: transitive
description: flutter
@@ -340,22 +215,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "14.2.5"
web:
dependency: transitive
description:
name: web
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
url: "https://pub.dev"
source: hosted
version: "1.1.1"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
sdks:
dart: ">=3.5.0 <4.0.0"
flutter: ">=3.24.0"
dart: ">=3.4.4 <4.0.0"
flutter: ">=3.18.0-18.0.pre.54"

View File

@@ -43,10 +43,6 @@ dependencies:
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.6
permission_handler: ^11.3.1
path_provider: ^2.1.4
dev_dependencies:
flutter_test:

View File

@@ -13,7 +13,7 @@ import 'package:flutter_openim_sdk_example/main.dart';
void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(const MyApp());
await tester.pumpWidget(MyApp());
// Verify that our counter starts at 0.
expect(find.text('0'), findsOneWidget);

View File

@@ -1,34 +0,0 @@
@echo off
REM ====================================
REM 更新本地 AAR 并重新构建
REM ====================================
echo [1/5] 复制 AAR 文件到 Maven 仓库...
copy /Y libs\sdkcore-debug.aar android\local-maven\com\openim\sdkcore\1.0.15-local\sdkcore-1.0.15-local.aar
if %errorlevel% neq 0 (
echo 错误: AAR 文件复制失败,请检查 libs\sdkcore-debug.aar 是否存在
pause
exit /b 1
)
echo [2/5] 清理 Flutter 缓存...
flutter clean
echo [3/5] 删除构建目录...
if exist build rmdir /S /Q build
echo [4/5] 清理 Gradle 缓存...
cd android
call gradlew.bat clean
cd ..
echo [5/5] 重新获取依赖...
flutter pub get
echo.
echo ========================================
echo 更新完成!现在可以运行:
echo flutter run (运行应用)
echo flutter build apk (构建 APK)
echo ========================================
pause

View File

@@ -1,34 +0,0 @@
#!/bin/bash
####################################
# 更新本地 AAR 并重新构建
####################################
set -e # 遇到错误立即退出
echo "[1/5] 复制 AAR 文件到 Maven 仓库..."
if [ ! -f "libs/sdkcore-debug.aar" ]; then
echo "错误: libs/sdkcore-debug.aar 不存在"
exit 1
fi
cp libs/sdkcore-debug.aar android/local-maven/com/openim/sdkcore/1.0.15-local/sdkcore-1.0.15-local.aar
echo "[2/5] 清理 Flutter 缓存..."
flutter clean
echo "[3/5] 删除构建目录..."
rm -rf build
echo "[4/5] 清理 Gradle 缓存..."
cd android
./gradlew clean
cd ..
echo "[5/5] 重新获取依赖..."
flutter pub get
echo ""
echo "========================================"
echo "更新完成!现在可以运行:"
echo " flutter run (运行应用)"
echo " flutter build apk (构建 APK)"
echo "========================================"

View File

@@ -1,17 +0,0 @@
flutter/ephemeral/
# Visual Studio user-specific files.
*.suo
*.user
*.userosscache
*.sln.docstates
# Visual Studio build-related files.
x64/
x86/
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/

View File

@@ -1,110 +0,0 @@
# Project-level configuration.
cmake_minimum_required(VERSION 3.14)
project(flutter_openim_sdk_example LANGUAGES CXX)
# The name of the executable created for the application. Change this to change
# the on-disk name of your application.
set(BINARY_NAME "flutter_openim_sdk_example")
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
# versions of CMake.
cmake_policy(VERSION 3.14...3.25)
# Define build configuration option.
get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(IS_MULTICONFIG)
set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release"
CACHE STRING "" FORCE)
else()
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE "Debug" CACHE
STRING "Flutter build mode" FORCE)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
"Debug" "Profile" "Release")
endif()
endif()
# Define settings for the Profile build mode.
set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}")
set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}")
# Use Unicode for all projects.
add_definitions(-DUNICODE -D_UNICODE)
# Compilation settings that should be applied to most targets.
#
# Be cautious about adding new options here, as plugins use this function by
# default. In most cases, you should add new options to specific targets instead
# of modifying this function.
function(APPLY_STANDARD_SETTINGS TARGET)
target_compile_features(${TARGET} PUBLIC cxx_std_17)
target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100")
target_compile_options(${TARGET} PRIVATE /EHsc)
target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0")
target_compile_definitions(${TARGET} PRIVATE "$<$<CONFIG:Debug>:_DEBUG>")
endfunction()
# Flutter library and tool build rules.
set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
add_subdirectory(${FLUTTER_MANAGED_DIR})
# Application build; see runner/CMakeLists.txt.
add_subdirectory("runner")
# Enable the test target.
set(include_flutter_openim_sdk_tests TRUE)
# Generated plugin build rules, which manage building the plugins and adding
# them to the application.
include(flutter/generated_plugins.cmake)
# === Installation ===
# Support files are copied into place next to the executable, so that it can
# run in place. This is done instead of making a separate bundle (as on Linux)
# so that building and running from within Visual Studio will work.
set(BUILD_BUNDLE_DIR "$<TARGET_FILE_DIR:${BINARY_NAME}>")
# Make the "install" step default, as it's required to run.
set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
endif()
set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}")
install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
COMPONENT Runtime)
install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
COMPONENT Runtime)
install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
COMPONENT Runtime)
if(PLUGIN_BUNDLED_LIBRARIES)
install(FILES "${PLUGIN_BUNDLED_LIBRARIES}"
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
COMPONENT Runtime)
endif()
# Copy the native assets provided by the build.dart from all packages.
set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/")
install(DIRECTORY "${NATIVE_ASSETS_DIR}"
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
COMPONENT Runtime)
# Fully re-copy the assets directory on each build to avoid having stale files
# from a previous install.
set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
install(CODE "
file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
" COMPONENT Runtime)
install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
# Install the AOT library on non-Debug builds only.
install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
CONFIGURATIONS Profile;Release
COMPONENT Runtime)

View File

@@ -1,109 +0,0 @@
# This file controls Flutter-level build steps. It should not be edited.
cmake_minimum_required(VERSION 3.14)
set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
# Configuration provided via flutter tool.
include(${EPHEMERAL_DIR}/generated_config.cmake)
# TODO: Move the rest of this into files in ephemeral. See
# https://github.com/flutter/flutter/issues/57146.
set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper")
# Set fallback configurations for older versions of the flutter tool.
if (NOT DEFINED FLUTTER_TARGET_PLATFORM)
set(FLUTTER_TARGET_PLATFORM "windows-x64")
endif()
# === Flutter Library ===
set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll")
# Published to parent scope for install step.
set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE)
list(APPEND FLUTTER_LIBRARY_HEADERS
"flutter_export.h"
"flutter_windows.h"
"flutter_messenger.h"
"flutter_plugin_registrar.h"
"flutter_texture_registrar.h"
)
list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/")
add_library(flutter INTERFACE)
target_include_directories(flutter INTERFACE
"${EPHEMERAL_DIR}"
)
target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib")
add_dependencies(flutter flutter_assemble)
# === Wrapper ===
list(APPEND CPP_WRAPPER_SOURCES_CORE
"core_implementations.cc"
"standard_codec.cc"
)
list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/")
list(APPEND CPP_WRAPPER_SOURCES_PLUGIN
"plugin_registrar.cc"
)
list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/")
list(APPEND CPP_WRAPPER_SOURCES_APP
"flutter_engine.cc"
"flutter_view_controller.cc"
)
list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/")
# Wrapper sources needed for a plugin.
add_library(flutter_wrapper_plugin STATIC
${CPP_WRAPPER_SOURCES_CORE}
${CPP_WRAPPER_SOURCES_PLUGIN}
)
apply_standard_settings(flutter_wrapper_plugin)
set_target_properties(flutter_wrapper_plugin PROPERTIES
POSITION_INDEPENDENT_CODE ON)
set_target_properties(flutter_wrapper_plugin PROPERTIES
CXX_VISIBILITY_PRESET hidden)
target_link_libraries(flutter_wrapper_plugin PUBLIC flutter)
target_include_directories(flutter_wrapper_plugin PUBLIC
"${WRAPPER_ROOT}/include"
)
add_dependencies(flutter_wrapper_plugin flutter_assemble)
# Wrapper sources needed for the runner.
add_library(flutter_wrapper_app STATIC
${CPP_WRAPPER_SOURCES_CORE}
${CPP_WRAPPER_SOURCES_APP}
)
apply_standard_settings(flutter_wrapper_app)
target_link_libraries(flutter_wrapper_app PUBLIC flutter)
target_include_directories(flutter_wrapper_app PUBLIC
"${WRAPPER_ROOT}/include"
)
add_dependencies(flutter_wrapper_app flutter_assemble)
# === Flutter tool backend ===
# _phony_ is a non-existent file to force this command to run every time,
# since currently there's no way to get a full input/output list from the
# flutter tool.
set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_")
set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE)
add_custom_command(
OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}
${CPP_WRAPPER_SOURCES_APP}
${PHONY_OUTPUT}
COMMAND ${CMAKE_COMMAND} -E env
${FLUTTER_TOOL_ENVIRONMENT}
"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"
${FLUTTER_TARGET_PLATFORM} $<CONFIG>
VERBATIM
)
add_custom_target(flutter_assemble DEPENDS
"${FLUTTER_LIBRARY}"
${FLUTTER_LIBRARY_HEADERS}
${CPP_WRAPPER_SOURCES_CORE}
${CPP_WRAPPER_SOURCES_PLUGIN}
${CPP_WRAPPER_SOURCES_APP}
)

View File

@@ -1,17 +0,0 @@
//
// Generated file. Do not edit.
//
// clang-format off
#include "generated_plugin_registrant.h"
#include <flutter_openim_sdk/flutter_openim_sdk_plugin.h>
#include <permission_handler_windows/permission_handler_windows_plugin.h>
void RegisterPlugins(flutter::PluginRegistry* registry) {
FlutterOpenimSdkPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FlutterOpenimSdkPlugin"));
PermissionHandlerWindowsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin"));
}

View File

@@ -1,15 +0,0 @@
//
// Generated file. Do not edit.
//
// clang-format off
#ifndef GENERATED_PLUGIN_REGISTRANT_
#define GENERATED_PLUGIN_REGISTRANT_
#include <flutter/plugin_registry.h>
// Registers Flutter plugins.
void RegisterPlugins(flutter::PluginRegistry* registry);
#endif // GENERATED_PLUGIN_REGISTRANT_

View File

@@ -1,25 +0,0 @@
#
# Generated file, do not edit.
#
list(APPEND FLUTTER_PLUGIN_LIST
flutter_openim_sdk
permission_handler_windows
)
list(APPEND FLUTTER_FFI_PLUGIN_LIST
)
set(PLUGIN_BUNDLED_LIBRARIES)
foreach(plugin ${FLUTTER_PLUGIN_LIST})
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin})
target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)
list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
endforeach(plugin)
foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
endforeach(ffi_plugin)

View File

@@ -1,40 +0,0 @@
cmake_minimum_required(VERSION 3.14)
project(runner LANGUAGES CXX)
# Define the application target. To change its name, change BINARY_NAME in the
# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer
# work.
#
# Any new source files that you add to the application should be added here.
add_executable(${BINARY_NAME} WIN32
"flutter_window.cpp"
"main.cpp"
"utils.cpp"
"win32_window.cpp"
"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
"Runner.rc"
"runner.exe.manifest"
)
# Apply the standard set of build settings. This can be removed for applications
# that need different build settings.
apply_standard_settings(${BINARY_NAME})
# Add preprocessor definitions for the build version.
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"")
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}")
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}")
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}")
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}")
# Disable Windows macros that collide with C++ standard library functions.
target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX")
# Add dependency libraries and include directories. Add any application-specific
# dependencies here.
target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)
target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib")
target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}")
# Run the Flutter tool portions of the build. This must not be removed.
add_dependencies(${BINARY_NAME} flutter_assemble)

View File

@@ -1,121 +0,0 @@
// Microsoft Visual C++ generated resource script.
//
#pragma code_page(65001)
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (United States) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_APP_ICON ICON "resources\\app_icon.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD)
#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD
#else
#define VERSION_AS_NUMBER 1,0,0,0
#endif
#if defined(FLUTTER_VERSION)
#define VERSION_AS_STRING FLUTTER_VERSION
#else
#define VERSION_AS_STRING "1.0.0"
#endif
VS_VERSION_INFO VERSIONINFO
FILEVERSION VERSION_AS_NUMBER
PRODUCTVERSION VERSION_AS_NUMBER
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
#ifdef _DEBUG
FILEFLAGS VS_FF_DEBUG
#else
FILEFLAGS 0x0L
#endif
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904e4"
BEGIN
VALUE "CompanyName", "io.openim" "\0"
VALUE "FileDescription", "flutter_openim_sdk_example" "\0"
VALUE "FileVersion", VERSION_AS_STRING "\0"
VALUE "InternalName", "flutter_openim_sdk_example" "\0"
VALUE "LegalCopyright", "Copyright (C) 2025 io.openim. All rights reserved." "\0"
VALUE "OriginalFilename", "flutter_openim_sdk_example.exe" "\0"
VALUE "ProductName", "flutter_openim_sdk_example" "\0"
VALUE "ProductVersion", VERSION_AS_STRING "\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1252
END
END
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View File

@@ -1,71 +0,0 @@
#include "flutter_window.h"
#include <optional>
#include "flutter/generated_plugin_registrant.h"
FlutterWindow::FlutterWindow(const flutter::DartProject& project)
: project_(project) {}
FlutterWindow::~FlutterWindow() {}
bool FlutterWindow::OnCreate() {
if (!Win32Window::OnCreate()) {
return false;
}
RECT frame = GetClientArea();
// The size here must match the window dimensions to avoid unnecessary surface
// creation / destruction in the startup path.
flutter_controller_ = std::make_unique<flutter::FlutterViewController>(
frame.right - frame.left, frame.bottom - frame.top, project_);
// Ensure that basic setup of the controller was successful.
if (!flutter_controller_->engine() || !flutter_controller_->view()) {
return false;
}
RegisterPlugins(flutter_controller_->engine());
SetChildContent(flutter_controller_->view()->GetNativeWindow());
flutter_controller_->engine()->SetNextFrameCallback([&]() {
this->Show();
});
// Flutter can complete the first frame before the "show window" callback is
// registered. The following call ensures a frame is pending to ensure the
// window is shown. It is a no-op if the first frame hasn't completed yet.
flutter_controller_->ForceRedraw();
return true;
}
void FlutterWindow::OnDestroy() {
if (flutter_controller_) {
flutter_controller_ = nullptr;
}
Win32Window::OnDestroy();
}
LRESULT
FlutterWindow::MessageHandler(HWND hwnd, UINT const message,
WPARAM const wparam,
LPARAM const lparam) noexcept {
// Give Flutter, including plugins, an opportunity to handle window messages.
if (flutter_controller_) {
std::optional<LRESULT> result =
flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,
lparam);
if (result) {
return *result;
}
}
switch (message) {
case WM_FONTCHANGE:
flutter_controller_->engine()->ReloadSystemFonts();
break;
}
return Win32Window::MessageHandler(hwnd, message, wparam, lparam);
}

View File

@@ -1,33 +0,0 @@
#ifndef RUNNER_FLUTTER_WINDOW_H_
#define RUNNER_FLUTTER_WINDOW_H_
#include <flutter/dart_project.h>
#include <flutter/flutter_view_controller.h>
#include <memory>
#include "win32_window.h"
// A window that does nothing but host a Flutter view.
class FlutterWindow : public Win32Window {
public:
// Creates a new FlutterWindow hosting a Flutter view running |project|.
explicit FlutterWindow(const flutter::DartProject& project);
virtual ~FlutterWindow();
protected:
// Win32Window:
bool OnCreate() override;
void OnDestroy() override;
LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,
LPARAM const lparam) noexcept override;
private:
// The project to run.
flutter::DartProject project_;
// The Flutter instance hosted by this window.
std::unique_ptr<flutter::FlutterViewController> flutter_controller_;
};
#endif // RUNNER_FLUTTER_WINDOW_H_

View File

@@ -1,43 +0,0 @@
#include <flutter/dart_project.h>
#include <flutter/flutter_view_controller.h>
#include <windows.h>
#include "flutter_window.h"
#include "utils.h"
int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
_In_ wchar_t *command_line, _In_ int show_command) {
// Attach to console when present (e.g., 'flutter run') or create a
// new console when running with a debugger.
if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
CreateAndAttachConsole();
}
// Initialize COM, so that it is available for use in the library and/or
// plugins.
::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
flutter::DartProject project(L"data");
std::vector<std::string> command_line_arguments =
GetCommandLineArguments();
project.set_dart_entrypoint_arguments(std::move(command_line_arguments));
FlutterWindow window(project);
Win32Window::Point origin(10, 10);
Win32Window::Size size(1280, 720);
if (!window.Create(L"flutter_openim_sdk_example", origin, size)) {
return EXIT_FAILURE;
}
window.SetQuitOnClose(true);
::MSG msg;
while (::GetMessage(&msg, nullptr, 0, 0)) {
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
::CoUninitialize();
return EXIT_SUCCESS;
}

View File

@@ -1,16 +0,0 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Runner.rc
//
#define IDI_APP_ICON 101
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

View File

@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
</windowsSettings>
</application>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 and Windows 11 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly>

View File

@@ -1,65 +0,0 @@
#include "utils.h"
#include <flutter_windows.h>
#include <io.h>
#include <stdio.h>
#include <windows.h>
#include <iostream>
void CreateAndAttachConsole() {
if (::AllocConsole()) {
FILE *unused;
if (freopen_s(&unused, "CONOUT$", "w", stdout)) {
_dup2(_fileno(stdout), 1);
}
if (freopen_s(&unused, "CONOUT$", "w", stderr)) {
_dup2(_fileno(stdout), 2);
}
std::ios::sync_with_stdio();
FlutterDesktopResyncOutputStreams();
}
}
std::vector<std::string> GetCommandLineArguments() {
// Convert the UTF-16 command line arguments to UTF-8 for the Engine to use.
int argc;
wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);
if (argv == nullptr) {
return std::vector<std::string>();
}
std::vector<std::string> command_line_arguments;
// Skip the first argument as it's the binary name.
for (int i = 1; i < argc; i++) {
command_line_arguments.push_back(Utf8FromUtf16(argv[i]));
}
::LocalFree(argv);
return command_line_arguments;
}
std::string Utf8FromUtf16(const wchar_t* utf16_string) {
if (utf16_string == nullptr) {
return std::string();
}
unsigned int target_length = ::WideCharToMultiByte(
CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
-1, nullptr, 0, nullptr, nullptr)
-1; // remove the trailing null character
int input_length = (int)wcslen(utf16_string);
std::string utf8_string;
if (target_length == 0 || target_length > utf8_string.max_size()) {
return utf8_string;
}
utf8_string.resize(target_length);
int converted_length = ::WideCharToMultiByte(
CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
input_length, utf8_string.data(), target_length, nullptr, nullptr);
if (converted_length == 0) {
return std::string();
}
return utf8_string;
}

View File

@@ -1,19 +0,0 @@
#ifndef RUNNER_UTILS_H_
#define RUNNER_UTILS_H_
#include <string>
#include <vector>
// Creates a console for the process, and redirects stdout and stderr to
// it for both the runner and the Flutter library.
void CreateAndAttachConsole();
// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string
// encoded in UTF-8. Returns an empty std::string on failure.
std::string Utf8FromUtf16(const wchar_t* utf16_string);
// Gets the command line arguments passed in as a std::vector<std::string>,
// encoded in UTF-8. Returns an empty std::vector<std::string> on failure.
std::vector<std::string> GetCommandLineArguments();
#endif // RUNNER_UTILS_H_

View File

@@ -1,288 +0,0 @@
#include "win32_window.h"
#include <dwmapi.h>
#include <flutter_windows.h>
#include "resource.h"
namespace {
/// Window attribute that enables dark mode window decorations.
///
/// Redefined in case the developer's machine has a Windows SDK older than
/// version 10.0.22000.0.
/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute
#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE
#define DWMWA_USE_IMMERSIVE_DARK_MODE 20
#endif
constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW";
/// Registry key for app theme preference.
///
/// A value of 0 indicates apps should use dark mode. A non-zero or missing
/// value indicates apps should use light mode.
constexpr const wchar_t kGetPreferredBrightnessRegKey[] =
L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize";
constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme";
// The number of Win32Window objects that currently exist.
static int g_active_window_count = 0;
using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd);
// Scale helper to convert logical scaler values to physical using passed in
// scale factor
int Scale(int source, double scale_factor) {
return static_cast<int>(source * scale_factor);
}
// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module.
// This API is only needed for PerMonitor V1 awareness mode.
void EnableFullDpiSupportIfAvailable(HWND hwnd) {
HMODULE user32_module = LoadLibraryA("User32.dll");
if (!user32_module) {
return;
}
auto enable_non_client_dpi_scaling =
reinterpret_cast<EnableNonClientDpiScaling*>(
GetProcAddress(user32_module, "EnableNonClientDpiScaling"));
if (enable_non_client_dpi_scaling != nullptr) {
enable_non_client_dpi_scaling(hwnd);
}
FreeLibrary(user32_module);
}
} // namespace
// Manages the Win32Window's window class registration.
class WindowClassRegistrar {
public:
~WindowClassRegistrar() = default;
// Returns the singleton registrar instance.
static WindowClassRegistrar* GetInstance() {
if (!instance_) {
instance_ = new WindowClassRegistrar();
}
return instance_;
}
// Returns the name of the window class, registering the class if it hasn't
// previously been registered.
const wchar_t* GetWindowClass();
// Unregisters the window class. Should only be called if there are no
// instances of the window.
void UnregisterWindowClass();
private:
WindowClassRegistrar() = default;
static WindowClassRegistrar* instance_;
bool class_registered_ = false;
};
WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr;
const wchar_t* WindowClassRegistrar::GetWindowClass() {
if (!class_registered_) {
WNDCLASS window_class{};
window_class.hCursor = LoadCursor(nullptr, IDC_ARROW);
window_class.lpszClassName = kWindowClassName;
window_class.style = CS_HREDRAW | CS_VREDRAW;
window_class.cbClsExtra = 0;
window_class.cbWndExtra = 0;
window_class.hInstance = GetModuleHandle(nullptr);
window_class.hIcon =
LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));
window_class.hbrBackground = 0;
window_class.lpszMenuName = nullptr;
window_class.lpfnWndProc = Win32Window::WndProc;
RegisterClass(&window_class);
class_registered_ = true;
}
return kWindowClassName;
}
void WindowClassRegistrar::UnregisterWindowClass() {
UnregisterClass(kWindowClassName, nullptr);
class_registered_ = false;
}
Win32Window::Win32Window() {
++g_active_window_count;
}
Win32Window::~Win32Window() {
--g_active_window_count;
Destroy();
}
bool Win32Window::Create(const std::wstring& title,
const Point& origin,
const Size& size) {
Destroy();
const wchar_t* window_class =
WindowClassRegistrar::GetInstance()->GetWindowClass();
const POINT target_point = {static_cast<LONG>(origin.x),
static_cast<LONG>(origin.y)};
HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);
UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);
double scale_factor = dpi / 96.0;
HWND window = CreateWindow(
window_class, title.c_str(), WS_OVERLAPPEDWINDOW,
Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
Scale(size.width, scale_factor), Scale(size.height, scale_factor),
nullptr, nullptr, GetModuleHandle(nullptr), this);
if (!window) {
return false;
}
UpdateTheme(window);
return OnCreate();
}
bool Win32Window::Show() {
return ShowWindow(window_handle_, SW_SHOWNORMAL);
}
// static
LRESULT CALLBACK Win32Window::WndProc(HWND const window,
UINT const message,
WPARAM const wparam,
LPARAM const lparam) noexcept {
if (message == WM_NCCREATE) {
auto window_struct = reinterpret_cast<CREATESTRUCT*>(lparam);
SetWindowLongPtr(window, GWLP_USERDATA,
reinterpret_cast<LONG_PTR>(window_struct->lpCreateParams));
auto that = static_cast<Win32Window*>(window_struct->lpCreateParams);
EnableFullDpiSupportIfAvailable(window);
that->window_handle_ = window;
} else if (Win32Window* that = GetThisFromHandle(window)) {
return that->MessageHandler(window, message, wparam, lparam);
}
return DefWindowProc(window, message, wparam, lparam);
}
LRESULT
Win32Window::MessageHandler(HWND hwnd,
UINT const message,
WPARAM const wparam,
LPARAM const lparam) noexcept {
switch (message) {
case WM_DESTROY:
window_handle_ = nullptr;
Destroy();
if (quit_on_close_) {
PostQuitMessage(0);
}
return 0;
case WM_DPICHANGED: {
auto newRectSize = reinterpret_cast<RECT*>(lparam);
LONG newWidth = newRectSize->right - newRectSize->left;
LONG newHeight = newRectSize->bottom - newRectSize->top;
SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth,
newHeight, SWP_NOZORDER | SWP_NOACTIVATE);
return 0;
}
case WM_SIZE: {
RECT rect = GetClientArea();
if (child_content_ != nullptr) {
// Size and position the child window.
MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left,
rect.bottom - rect.top, TRUE);
}
return 0;
}
case WM_ACTIVATE:
if (child_content_ != nullptr) {
SetFocus(child_content_);
}
return 0;
case WM_DWMCOLORIZATIONCOLORCHANGED:
UpdateTheme(hwnd);
return 0;
}
return DefWindowProc(window_handle_, message, wparam, lparam);
}
void Win32Window::Destroy() {
OnDestroy();
if (window_handle_) {
DestroyWindow(window_handle_);
window_handle_ = nullptr;
}
if (g_active_window_count == 0) {
WindowClassRegistrar::GetInstance()->UnregisterWindowClass();
}
}
Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {
return reinterpret_cast<Win32Window*>(
GetWindowLongPtr(window, GWLP_USERDATA));
}
void Win32Window::SetChildContent(HWND content) {
child_content_ = content;
SetParent(content, window_handle_);
RECT frame = GetClientArea();
MoveWindow(content, frame.left, frame.top, frame.right - frame.left,
frame.bottom - frame.top, true);
SetFocus(child_content_);
}
RECT Win32Window::GetClientArea() {
RECT frame;
GetClientRect(window_handle_, &frame);
return frame;
}
HWND Win32Window::GetHandle() {
return window_handle_;
}
void Win32Window::SetQuitOnClose(bool quit_on_close) {
quit_on_close_ = quit_on_close;
}
bool Win32Window::OnCreate() {
// No-op; provided for subclasses.
return true;
}
void Win32Window::OnDestroy() {
// No-op; provided for subclasses.
}
void Win32Window::UpdateTheme(HWND const window) {
DWORD light_mode;
DWORD light_mode_size = sizeof(light_mode);
LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey,
kGetPreferredBrightnessRegValue,
RRF_RT_REG_DWORD, nullptr, &light_mode,
&light_mode_size);
if (result == ERROR_SUCCESS) {
BOOL enable_dark_mode = light_mode == 0;
DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE,
&enable_dark_mode, sizeof(enable_dark_mode));
}
}

View File

@@ -1,102 +0,0 @@
#ifndef RUNNER_WIN32_WINDOW_H_
#define RUNNER_WIN32_WINDOW_H_
#include <windows.h>
#include <functional>
#include <memory>
#include <string>
// A class abstraction for a high DPI-aware Win32 Window. Intended to be
// inherited from by classes that wish to specialize with custom
// rendering and input handling
class Win32Window {
public:
struct Point {
unsigned int x;
unsigned int y;
Point(unsigned int x, unsigned int y) : x(x), y(y) {}
};
struct Size {
unsigned int width;
unsigned int height;
Size(unsigned int width, unsigned int height)
: width(width), height(height) {}
};
Win32Window();
virtual ~Win32Window();
// Creates a win32 window with |title| that is positioned and sized using
// |origin| and |size|. New windows are created on the default monitor. Window
// sizes are specified to the OS in physical pixels, hence to ensure a
// consistent size this function will scale the inputted width and height as
// as appropriate for the default monitor. The window is invisible until
// |Show| is called. Returns true if the window was created successfully.
bool Create(const std::wstring& title, const Point& origin, const Size& size);
// Show the current window. Returns true if the window was successfully shown.
bool Show();
// Release OS resources associated with window.
void Destroy();
// Inserts |content| into the window tree.
void SetChildContent(HWND content);
// Returns the backing Window handle to enable clients to set icon and other
// window properties. Returns nullptr if the window has been destroyed.
HWND GetHandle();
// If true, closing this window will quit the application.
void SetQuitOnClose(bool quit_on_close);
// Return a RECT representing the bounds of the current client area.
RECT GetClientArea();
protected:
// Processes and route salient window messages for mouse handling,
// size change and DPI. Delegates handling of these to member overloads that
// inheriting classes can handle.
virtual LRESULT MessageHandler(HWND window,
UINT const message,
WPARAM const wparam,
LPARAM const lparam) noexcept;
// Called when CreateAndShow is called, allowing subclass window-related
// setup. Subclasses should return false if setup fails.
virtual bool OnCreate();
// Called when Destroy is called.
virtual void OnDestroy();
private:
friend class WindowClassRegistrar;
// OS callback called by message pump. Handles the WM_NCCREATE message which
// is passed when the non-client area is being created and enables automatic
// non-client DPI scaling so that the non-client area automatically
// responds to changes in DPI. All other messages are handled by
// MessageHandler.
static LRESULT CALLBACK WndProc(HWND const window,
UINT const message,
WPARAM const wparam,
LPARAM const lparam) noexcept;
// Retrieves a class instance pointer for |window|
static Win32Window* GetThisFromHandle(HWND const window) noexcept;
// Update the window frame's theme to match the system theme.
static void UpdateTheme(HWND const window);
bool quit_on_close_ = false;
// window handle for top level window.
HWND window_handle_ = nullptr;
// window handle for hosted content.
HWND child_content_ = nullptr;
};
#endif // RUNNER_WIN32_WINDOW_H_

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

@@ -1,101 +0,0 @@
import Foundation
import OpenIMCore
public class ChannelManager: BaseServiceManager {
public override func registerHandlers() {
super.registerHandlers()
// self["changeChannelMemberMute"] = changeChannelMemberMute
// self["changeChannelMute"] = changeChannelMute
// self["getChannelMemberList"] = getChannelMemberList
self["getChannelMembersInfo"] = getChannelMembersInfo
self["getChannelsInfo"] = getChannelsInfo
self["getUsersInChannel"] = getUsersInChannel
self["isJoinChannel"] = isJoinChannel
self["joinChannel"] = joinChannel
self["quitChannel"] = quitChannel
self["setChannelListener"] = setChannelListener
}
// func changeChannelMemberMute(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
// Open_im_sdkChangeChannelMemberMute(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"], methodCall[string:"userID"], methodCall[int:"seconds"])
// }
//
// func changeChannelMute(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
// Open_im_sdkChangeChannelMute(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"], methodCall[bool: "mute"])
// }
//
// func getChannelMemberList(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
// Open_im_sdkGetChannelMemberList(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"], methodCall[int32: "filter"],
// methodCall[int32: "offset"], methodCall[int32: "count"])
// }
func getChannelMembersInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetSpecifiedChannelMembersInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"], methodCall[jsonString: "userIDList"])
}
func getChannelsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetSpecifiedChannelsInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "channelIDList"])
}
func getUsersInChannel(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetUsersInChannel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"],
methodCall[jsonString: "userIDs"])
}
func isJoinChannel(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkIsJoinChannel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"])
}
func joinChannel(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkJoinChannel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"], methodCall[string:
"reason"], methodCall[int32: "joinSource"], methodCall[jsonString: "ex"])
}
func quitChannel(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkQuitChannel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"])
}
func setChannelListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSetChannelListener(ChannelListener(channel: channel))
callBack(result)
}
}
public class ChannelListener: NSObject, Open_im_sdk_callbackOnChannelListenerProtocol {
private let channel: FlutterMethodChannel
init(channel: FlutterMethodChannel) {
self.channel = channel
}
public func onChannelDismissed(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "channelListener", type: "onChannelDismissed", errCode: nil, errMsg: nil, data: s)
}
public func onChannelInfoChanged(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "channelListener", type: "onChannelInfoChanged", errCode: nil, errMsg: nil, data: s)
}
public func onChannelMemberAdded(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "channelListener", type: "onChannelMemberAdded", errCode: nil, errMsg: nil, data: s)
}
public func onChannelMemberDeleted(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "channelListener", type: "onChannelMemberDeleted", errCode: nil, errMsg: nil, data: s)
}
public func onChannelMemberInfoChanged(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "channelListener", type: "onChannelMemberInfoChanged", errCode: nil, errMsg: nil, data: s)
}
}

View File

@@ -18,14 +18,6 @@ public class IMMananger: BaseServiceManager {
self["updateFcmToken"] = updateFcmToken
self["setAppBackgroundStatus"] = setAppBackgroundStatus
self["networkStatusChanged"] = networkStatusChanged
self["setNotificationVisibilityRule"] = setNotificationVisibilityRule
self["setNotificationVisibilityRules"] = setNotificationVisibilityRules
self["getNotificationVisibilityRule"] = getNotificationVisibilityRule
self["getNotificationVisibilityRules"] = getNotificationVisibilityRules
self["enableNotificationVisibilityRule"] = enableNotificationVisibilityRule
self["disableNotificationVisibilityRule"] = disableNotificationVisibilityRule
self["deleteNotificationVisibilityRule"] = deleteNotificationVisibilityRule
self["resetNotificationVisibilityRules"] = resetNotificationVisibilityRules
}
fileprivate func addObservers() {
@@ -115,38 +107,6 @@ public class IMMananger: BaseServiceManager {
func networkStatusChanged(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkNetworkStatusChanged(BaseCallback(result: result), methodCall[string: "operationID"])
}
func setNotificationVisibilityRule(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSetNotificationVisibilityRule(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int32: "notificationType"], methodCall[int32: "visibilityType"])
}
func setNotificationVisibilityRules(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSetNotificationVisibilityRules(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "rulesJSON"])
}
func getNotificationVisibilityRule(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetNotificationVisibilityRule(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int32: "notificationType"])
}
func getNotificationVisibilityRules(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkGetNotificationVisibilityRules(BaseCallback(result: result), methodCall[string: "operationID"])
}
func enableNotificationVisibilityRule(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkEnableNotificationVisibilityRule(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int32: "notificationType"])
}
func disableNotificationVisibilityRule(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkDisableNotificationVisibilityRule(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int32: "notificationType"])
}
func deleteNotificationVisibilityRule(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkDeleteNotificationVisibilityRule(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int32: "notificationType"])
}
func resetNotificationVisibilityRules(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkResetNotificationVisibilityRules(BaseCallback(result: result), methodCall[string: "operationID"])
}
}
public class ConnListener: NSObject, Open_im_sdk_callbackOnConnListenerProtocol {

View File

@@ -9,7 +9,6 @@ public class MessageManager: BaseServiceManager {
self["setAdvancedMsgListener"] = setAdvancedMsgListener
self["sendMessage"] = sendMessage
self["revokeMessage"] = revokeMessage
self["editMessage"] = editMessage
self["deleteMessageFromLocalStorage"] = deleteMessageFromLocalStorage
self["deleteMessageFromLocalAndSvr"] = deleteMessageFromLocalAndSvr
self["deleteAllMsgFromLocal"] = deleteAllMsgFromLocal
@@ -48,10 +47,6 @@ public class MessageManager: BaseServiceManager {
self["setMessageLocalEx"] = setMessageLocalEx
self["setAppBadge"] = setAppBadge
self["fetchSurroundingMessages"] = fetchSurroundingMessages
self["sendMessageNotOss"] = sendMessageNotOss
self["createImageMessageByURL"] = createImageMessageByURL
self["createSoundMessageByURL"] = createSoundMessageByURL
@@ -70,17 +65,13 @@ public class MessageManager: BaseServiceManager {
func sendMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let sendMsgProgressListener: SendMsgProgressListener = SendMsgProgressListener(channel: channel,result: result,methodCall: methodCall)
Open_im_sdkSendMessage(sendMsgProgressListener, methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[string: "userID"],
methodCall[string: "groupID"], methodCall[string: "channelID"],methodCall[jsonString: "offlinePushInfo"], methodCall[bool: "isOnlineOnly"])
methodCall[string: "groupID"], methodCall[jsonString: "offlinePushInfo"], methodCall[bool: "isOnlineOnly"])
}
func revokeMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkRevokeMessage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"],methodCall[string: "clientMsgID"])
}
func editMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkEditMessage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"],methodCall[string: "clientMsgID"],methodCall[jsonString: "message"])
}
func deleteMessageFromLocalStorage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkDeleteMessageFromLocalStorage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"],methodCall[string: "clientMsgID"])
}
@@ -104,7 +95,7 @@ public class MessageManager: BaseServiceManager {
func insertGroupMessageToLocalStorage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkInsertGroupMessageToLocalStorage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "message"],
methodCall[string: "groupID"], methodCall[string: "channelID"],methodCall[string: "senderID"])
methodCall[string: "groupID"], methodCall[string: "senderID"])
}
func markMessagesAsReadByMsgID(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -236,7 +227,7 @@ public class MessageManager: BaseServiceManager {
func sendMessageNotOss(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
let sendMsgProgressListener: SendMsgProgressListener = SendMsgProgressListener(channel: channel,result: result,methodCall: methodCall)
Open_im_sdkSendMessageNotOss(sendMsgProgressListener, methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[string: "userID"], methodCall[string: "groupID"], methodCall[string: "channelID"],methodCall[jsonString: "offlinePushInfo"], methodCall[bool: "isOnlineOnly"])
Open_im_sdkSendMessageNotOss(sendMsgProgressListener, methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[string: "userID"], methodCall[string: "groupID"], methodCall[jsonString: "offlinePushInfo"], methodCall[bool: "isOnlineOnly"])
}
func createImageMessageByURL(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -259,13 +250,6 @@ public class MessageManager: BaseServiceManager {
Open_im_sdkSetCustomBusinessListener(CustomBusinessListener(channel: channel))
callBack(result)
}
func fetchSurroundingMessages(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkFetchSurroundingMessages(BaseCallback(result: result),methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[int: "before"], methodCall[int: "after"])
}
}
public class SendMsgProgressListener: NSObject, Open_im_sdk_callbackSendMsgCallBackProtocol {
@@ -319,14 +303,7 @@ public class AdvancedMsgListener: NSObject, Open_im_sdk_callbackOnAdvancedMsgLis
values["messageRevoked"] = messageRevoked
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onNewRecvMessageRevoked", errCode: nil, errMsg: nil, data: values)
}
public func onNewRecvMessageEdited(_ messageEdited: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["messageEdited"] = messageEdited
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onNewRecvMessageEdited", errCode: nil, errMsg: nil, data: values)
}
public func onRecvC2CReadReceipt(_ msgReceiptList: String?) {
var values: [String: Any] = [:]
values["id"] = id

View File

@@ -8,15 +8,13 @@ public class SwiftFlutterOpenimSdkPlugin: NSObject, FlutterPlugin {
let messageManager: MessageManager
let groupManager: GroupManager
let userManger: UserManager
let channelManager: ChannelManager
init(channel: FlutterMethodChannel) {
self.imManager = IMMananger(channel: channel)
self.conversationManager = ConversationManager(channel: channel)
self.friendshipManager = FriendshipManager(channel: channel)
self.messageManager = MessageManager(channel: channel)
self.groupManager = GroupManager(channel: channel)
self.channelManager = ChannelManager(channel: channel)
self.userManger = UserManager(channel: channel)
}
@@ -39,8 +37,6 @@ public class SwiftFlutterOpenimSdkPlugin: NSObject, FlutterPlugin {
friendshipManager.handleMethod(call: call, result: result)
case "groupManager":
groupManager.handleMethod(call: call, result: result)
case "channelManager":
channelManager.handleMethod(call: call, result: result)
case "userManager":
userManger.handleMethod(call: call, result: result)
default:

View File

@@ -4,7 +4,7 @@
#
Pod::Spec.new do |s|
s.name = 'flutter_openim_sdk'
s.version = '0.0.13'
s.version = '0.0.1'
s.summary = 'A new Flutter project.'
s.description = <<-DESC
A new Flutter project.
@@ -15,17 +15,12 @@ A new Flutter project.
s.source = { :path => '.' }
s.source_files = 'Classes/**/*'
s.dependency 'Flutter'
s.platform = :ios, '13.0'
s.platform = :ios, '11.0'
#s.ios.vendored_frameworks = 'frameworks/*.xcframework'
#s.vendored_frameworks = 'frameworks/*.xcframework'
s.dependency 'openim_sdk_core_ios','0.13.0'
s.dependency 'OpenIMSDKCore','3.8.3+3'
s.static_framework = true
s.library = 'resolv'
# s.vendored_frameworks = 'Framework/*.xcframework'
# Flutter.framework does not contain a i386 slice.
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386 arm64' }

View File

@@ -17,7 +17,6 @@ export 'src/listener/conversation_listener.dart';
export 'src/listener/custom_business_listener.dart';
export 'src/listener/friendship_listener.dart';
export 'src/listener/group_listener.dart';
export 'src/listener/channel_listener.dart';
export 'src/listener/listener_for_service.dart';
export 'src/listener/msg_send_progress_listener.dart';
export 'src/listener/upload_file_listener.dart';
@@ -25,13 +24,11 @@ export 'src/listener/user_listener.dart';
export 'src/manager/im_conversation_manager.dart';
export 'src/manager/im_friendship_manager.dart';
export 'src/manager/im_group_manager.dart';
export 'src/manager/im_channel_manager.dart';
export 'src/manager/im_manager.dart';
export 'src/manager/im_message_manager.dart';
export 'src/manager/im_user_manager.dart';
export 'src/models/conversation_info.dart';
export 'src/models/group_info.dart';
export 'src/models/channel_info.dart';
export 'src/models/init_config.dart';
export 'src/models/message.dart';
export 'src/models/notification_info.dart';

View File

@@ -12,8 +12,4 @@ class ConversationType {
/// Notification
static const notification = 4;
/// Super channel chat
static const superChannel = 11;
}

View File

@@ -1,13 +0,0 @@
class GroupNotifyFilter {
static const notificationVisibleToAll = 0; // 所有人可见 - Visible to all
static const notificationVisibleToOperatorAndAdmin =
1; // 操作者、被操作者和管理员可见 - Visible to operator, target and admin
static const notificationVisibleToAdminOnly =
2; // 仅管理员可见 - Visible to admin only
static const notificationVisibleToOperatorOnly =
3; // 仅操作者本人可见 - Visible to operator only
static const notificationVisibleToTargetOnly =
4; // 仅被操作者本人可见 - Visible to target only
static const notificationVisibleToOperatorAndTarget =
5; // 操作者和被操作者可见 - Visible to operator and target
}

View File

@@ -4,7 +4,6 @@ class ListenerType {
static const connectListener = 'connectListener';
static const userListener = 'userListener';
static const groupListener = 'groupListener';
static const channelListener = 'channelListener';
static const advancedMsgListener = 'advancedMsgListener';
static const conversationListener = 'conversationListener';
static const friendListener = 'friendListener';

View File

@@ -168,9 +168,6 @@ class MessageType {
/// Recall Message
static const revokeMessageNotification = 2101;
/// Edit Message
static const editMessageNotification = 2108;
/// Single Chat Has Read Receipt
static const signalHasReadReceiptNotification = 2150;

View File

@@ -4,7 +4,6 @@ import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class OnAdvancedMsgListener {
Function(Message msg)? onMsgDeleted;
Function(RevokedInfo info)? onNewRecvMessageRevoked;
Function(EditedInfo info)? onNewRecvMessageEdited;
Function(List<ReadReceiptInfo> list)? onRecvC2CReadReceipt;
Function(Message msg)? onRecvNewMessage;
Function(Message msg)? onRecvOfflineNewMessage;
@@ -16,7 +15,6 @@ class OnAdvancedMsgListener {
OnAdvancedMsgListener({
this.onMsgDeleted,
this.onNewRecvMessageRevoked,
this.onNewRecvMessageEdited,
this.onRecvC2CReadReceipt,
this.onRecvNewMessage,
this.onRecvOfflineNewMessage,
@@ -32,12 +30,6 @@ class OnAdvancedMsgListener {
onNewRecvMessageRevoked?.call(info);
}
/// Message has been edited
void newRecvMessageEdited(EditedInfo info) {
onNewRecvMessageEdited?.call(info);
}
/// C2C Message Read Receipt
void recvC2CReadReceipt(List<ReadReceiptInfo> list) {
onRecvC2CReadReceipt?.call(list);

View File

@@ -1,60 +0,0 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
import '../models/channel_info.dart';
/// Channel Listener
class OnChannelListener {
Function(ChannelInfo info)? onChannelDismissed;
Function(ChannelInfo info)? onChannelInfoChanged;
Function(ChannelMembersInfo info)? onChannelMemberAdded;
Function(ChannelMembersInfo info)? onChannelMemberDeleted;
Function(ChannelMembersInfo info)? onChannelMemberInfoChanged;
Function(ChannelInfo info)? onJoinedChannelAdded;
Function(ChannelInfo info)? onJoinedChannelDeleted;
OnChannelListener({
this.onChannelDismissed,
this.onChannelInfoChanged,
this.onChannelMemberAdded,
this.onChannelMemberDeleted,
this.onChannelMemberInfoChanged,
this.onJoinedChannelAdded,
this.onJoinedChannelDeleted,
});
void channelDismissed(ChannelInfo info) {
onChannelDismissed?.call(info);
}
/// Channel information changed
void channelInfoChanged(ChannelInfo info) {
onChannelInfoChanged?.call(info);
}
/// Channel member added
void channelMemberAdded(ChannelMembersInfo info) {
onChannelMemberAdded?.call(info);
}
/// Channel member deleted
void channelMemberDeleted(ChannelMembersInfo info) {
onChannelMemberDeleted?.call(info);
}
/// Channel member information changed
void channelMemberInfoChanged(ChannelMembersInfo info) {
onChannelMemberInfoChanged?.call(info);
}
/// Joined channel added
void joinedChannelAdded(ChannelInfo info) {
onJoinedChannelAdded?.call(info);
}
/// Joined channel deleted
void joinedChannelDeleted(ChannelInfo info) {
onJoinedChannelDeleted?.call(info);
}
}

View File

@@ -1,319 +0,0 @@
import 'dart:developer';
import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class ChannelManager {
MethodChannel _channel;
late OnChannelListener listener;
ChannelManager(this._channel);
/// Channel relationship listener
Future setChannelListener(OnChannelListener listener) {
this.listener = listener;
return _channel.invokeMethod('setChannelListener', _buildParam({}));
}
/// Query channel member information
/// [channelID] Channel ID
/// [userIDList] List of user IDs
Future<List<ChannelMembersInfo>> getChannelMembersInfo({
required String channelID,
required List<String> userIDList,
String? operationID,
}) =>
_channel
.invokeMethod(
'getChannelMembersInfo',
_buildParam({
'channelID': channelID,
'userIDList': userIDList,
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map)));
/// Paginate and retrieve the channel member list
/// [channelID] Channel ID
/// [filter] Member filter (0: All, 1: Channel owner, 2: Administrator, 3: Regular member, 4: Admin + Regular member, 5: Channel owner + Admin)
/// [offset] Starting index
/// [count] Total count
Future<List<ChannelMembersInfo>> getChannelMemberList({
required String channelID,
int filter = 0,
int offset = 0,
int count = 0,
String? operationID,
}) =>
_channel
.invokeMethod(
'getChannelMemberList',
_buildParam({
'channelID': channelID,
'filter': filter,
'offset': offset,
'count': count,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map)));
// /// Paginate and retrieve the channel member list as a map
// /// [channelID] Channel ID
// /// [filter] Member filter (0: All, 1: Channel owner, 2: Administrator, 3: Regular member, 4: Admin + Regular member, 5: Channel owner + Admin)
// /// [offset] Starting index
// /// [count] Total count
// Future<List<dynamic>> getChannelMemberListMap({
// required String channelID,
// int filter = 0,
// int offset = 0,
// int count = 0,
// String? operationID,
// }) =>
// _channel
// .invokeMethod(
// 'getChannelMemberList',
// _buildParam({
// 'channelID': channelID,
// 'filter': filter,
// 'offset': offset,
// 'count': count,
// 'operationID': Utils.checkOperationID(operationID),
// }))
// .then((value) => Utils.toListMap(value));
// /// Query the list of joined channels
// Future<List<ChannelInfo>> getJoinedChannelList({String? operationID}) => _channel
// .invokeMethod(
// 'getJoinedChannelList',
// _buildParam({
// 'operationID': Utils.checkOperationID(operationID),
// }))
// .then((value) => Utils.toList(value, (map) => ChannelInfo.fromJson(map)));
//
// Future<List<ChannelInfo>> getJoinedChannelListPage({String? operationID, int offset = 0, int count = 40}) => _channel
// .invokeMethod(
// 'getJoinedChannelListPage',
// _buildParam({
// 'offset': offset,
// 'count': count,
// 'operationID': Utils.checkOperationID(operationID),
// }))
// .then((value) => Utils.toList(value, (map) => ChannelInfo.fromJson(map)));
// /// Query the list of joined channels
// Future<List<dynamic>> getJoinedChannelListMap({String? operationID}) =>
// _channel
// .invokeMethod(
// 'getJoinedChannelList',
// _buildParam({
// 'operationID': Utils.checkOperationID(operationID),
// }))
// .then((value) => Utils.toListMap(value));
/// Check if the user has joined a channel
/// [channelID] Channel ID
Future<bool> isJoinedChannel({
required String channelID,
String? operationID,
}) =>
_channel
.invokeMethod(
'isJoinChannel',
_buildParam({
'channelID': channelID,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => value == 'true' ? true : false);
/// Query channel information
Future<List<ChannelInfo>> getChannelsInfo({
required List<String> channelIDList,
String? operationID,
}) =>
_channel
.invokeMethod(
'getChannelsInfo',
_buildParam({
'channelIDList': channelIDList,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (map) => ChannelInfo.fromJson(map)));
/// Apply to join a channel, requiring approval from an administrator or the channel.
/// [joinSource] 2: Invited, 3: Searched, 4: Using a QR code
Future<dynamic> joinChannel(
{required String channelID,
String? reason,
String? operationID,
int joinSource = 3,
String? ex}) =>
_channel.invokeMethod(
'joinChannel',
_buildParam({
'channelID': channelID,
'reason': reason,
'joinSource': joinSource,
'ex': ex,
'operationID': Utils.checkOperationID(operationID),
}));
/// Exit a channel
Future<dynamic> quitChannel({
required String channelID,
String? operationID,
}) =>
_channel.invokeMethod(
'quitChannel',
_buildParam({
'channelID': channelID,
'operationID': Utils.checkOperationID(operationID),
}));
//
// /// Query a channel
// /// [keywordList] Search keywords; currently, only one keyword is supported, and it cannot be empty.
// /// [isSearchChannelID] Whether to search by channel ID (Note: cannot set both to false at the same time); defaults to false if not set.
// /// [isSearchChannelName] Whether to search by channel name; defaults to false if not set.
// Future<List<ChannelInfo>> searchChannels({
// List<String> keywordList = const [],
// bool isSearchChannelID = false,
// bool isSearchChannelName = false,
// String? operationID,
// }) =>
// _channel
// .invokeMethod(
// 'searchChannels',
// _buildParam({
// 'searchParam': {
// 'keywordList': keywordList,
// 'isSearchChannelID': isSearchChannelID,
// 'isSearchChannelName': isSearchChannelName,
// },
// 'operationID': Utils.checkOperationID(operationID),
// }))
// .then((value) => Utils.toList(value, (map) => ChannelInfo.fromJson(map)));
// /// Get a channel member list based on join time
// Future<List<ChannelMembersInfo>> getChannelMemberListByJoinTime({
// required String channelID,
// int offset = 0,
// int count = 0,
// int joinTimeBegin = 0,
// int joinTimeEnd = 0,
// List<String> filterUserIDList = const [],
// String? operationID,
// }) =>
// _channel
// .invokeMethod(
// 'getChannelMemberListByJoinTimeFilter',
// _buildParam({
// 'channelID': channelID,
// 'offset': offset,
// 'count': count,
// 'joinTimeBegin': joinTimeBegin,
// 'joinTimeEnd': joinTimeEnd,
// 'excludeUserIDList': filterUserIDList,
// 'operationID': Utils.checkOperationID(operationID),
// }))
// .then((value) => Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map)));
// /// Search for channel members
// /// [channelID] Channel ID
// /// [keywordList] Search keywords; currently, only one keyword is supported, and it cannot be empty.
// /// [isSearchUserID] Whether to search by member ID
// /// [isSearchMemberNickname] Whether to search by member nickname
// /// [offset] Start index
// /// [count] Total count to retrieve
// Future<List<ChannelMembersInfo>> searchChannelMembers({
// required String channelID,
// List<String> keywordList = const [],
// bool isSearchUserID = false,
// bool isSearchMemberNickname = false,
// int offset = 0,
// int count = 40,
// String? operationID,
// }) =>
// _channel
// .invokeMethod(
// 'searchChannelMembers',
// _buildParam({
// 'searchParam': {
// 'channelID': channelID,
// 'keywordList': keywordList,
// 'isSearchUserID': isSearchUserID,
// 'isSearchMemberNickname': isSearchMemberNickname,
// 'offset': offset,
// 'count': count,
// },
// 'operationID': Utils.checkOperationID(operationID),
// }))
// .then((value) => Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map)));
// /// Query a channel
// /// [channelID] Channel ID
// /// [keywordList] Search keyword, currently only supports searching with one keyword, and it cannot be empty
// /// [isSearchUserID] Whether to search member IDs with the keyword
// /// [isSearchMemberNickname] Whether to search member nicknames with the keyword
// /// [offset] Starting index
// /// [count] Total number to retrieve each time
// Future<List<dynamic>> searchChannelMembersListMap({
// required String channelID,
// List<String> keywordList = const [],
// bool isSearchUserID = false,
// bool isSearchMemberNickname = false,
// int offset = 0,
// int count = 40,
// String? operationID,
// }) =>
// _channel
// .invokeMethod(
// 'searchChannelMembers',
// _buildParam({
// 'searchParam': {
// 'channelID': channelID,
// 'keywordList': keywordList,
// 'isSearchUserID': isSearchUserID,
// 'isSearchMemberNickname': isSearchMemberNickname,
// 'offset': offset,
// 'count': count,
// },
// 'operationID': Utils.checkOperationID(operationID),
// }))
// .then((value) => Utils.toListMap(value));
//
// /// Modify the ChannelMemberInfo ex field
// Future<dynamic> setChannelMemberInfo({
// required SetChannelMemberInfo channelMembersInfo,
// String? operationID,
// }) =>
// _channel.invokeMethod(
// 'setChannelMemberInfo',
// _buildParam({
// 'info': channelMembersInfo.toJson(),
// 'operationID': Utils.checkOperationID(operationID),
// }));
Future<dynamic> getUsersInChannel(
String channelID,
List<String> userIDs, {
String? operationID,
}) =>
_channel.invokeMethod(
'getUsersInChannel',
_buildParam({
'channelID': channelID,
'userIDs': userIDs,
'operationID': Utils.checkOperationID(operationID),
}));
static Map _buildParam(Map<String, dynamic> param) {
param["ManagerName"] = "channelManager";
param = Utils.cleanMap(param);
log('param: $param');
return param;
}
}

View File

@@ -4,6 +4,7 @@ import 'dart:developer';
import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
import '../models/update_req.dart';
class ConversationManager {
MethodChannel _channel;

View File

@@ -3,6 +3,7 @@ import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
import '../models/update_req.dart';
class FriendshipManager {
MethodChannel _channel;

View File

@@ -2,6 +2,7 @@ import 'dart:developer';
import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
import 'package:flutter_openim_sdk/src/models/set_group_member_info.dart';
class GroupManager {
MethodChannel _channel;

View File

@@ -13,7 +13,6 @@ class IMManager {
late MessageManager messageManager;
late GroupManager groupManager;
late UserManager userManager;
late ChannelManager channelManager;
late OnConnectListener _connectListener;
OnListenerForService? _listenerForService;
@@ -30,7 +29,6 @@ class IMManager {
friendshipManager = FriendshipManager(_channel);
messageManager = MessageManager(_channel);
groupManager = GroupManager(_channel);
channelManager = ChannelManager(_channel);
userManager = UserManager(_channel);
_addNativeCallback(_channel);
}
@@ -72,8 +70,7 @@ class IMManager {
userManager.listener.selfInfoUpdated(userInfo);
break;
case 'onUserStatusChanged':
final status =
Utils.toObj(data, (map) => UserStatusInfo.fromJson(map));
final status = Utils.toObj(data, (map) => UserStatusInfo.fromJson(map));
userManager.listener.userStatusChanged(status);
break;
}
@@ -82,23 +79,19 @@ class IMManager {
dynamic data = call.arguments['data'];
switch (type) {
case 'onGroupApplicationAccepted':
final i = Utils.toObj(
data, (map) => GroupApplicationInfo.fromJson(map));
final i = Utils.toObj(data, (map) => GroupApplicationInfo.fromJson(map));
groupManager.listener.groupApplicationAccepted(i);
break;
case 'onGroupApplicationAdded':
final i = Utils.toObj(
data, (map) => GroupApplicationInfo.fromJson(map));
final i = Utils.toObj(data, (map) => GroupApplicationInfo.fromJson(map));
groupManager.listener.groupApplicationAdded(i);
break;
case 'onGroupApplicationDeleted':
final i = Utils.toObj(
data, (map) => GroupApplicationInfo.fromJson(map));
final i = Utils.toObj(data, (map) => GroupApplicationInfo.fromJson(map));
groupManager.listener.groupApplicationDeleted(i);
break;
case 'onGroupApplicationRejected':
final i = Utils.toObj(
data, (map) => GroupApplicationInfo.fromJson(map));
final i = Utils.toObj(data, (map) => GroupApplicationInfo.fromJson(map));
groupManager.listener.groupApplicationRejected(i);
break;
case 'onGroupDismissed':
@@ -110,18 +103,15 @@ class IMManager {
groupManager.listener.groupInfoChanged(i);
break;
case 'onGroupMemberAdded':
final i =
Utils.toObj(data, (map) => GroupMembersInfo.fromJson(map));
final i = Utils.toObj(data, (map) => GroupMembersInfo.fromJson(map));
groupManager.listener.groupMemberAdded(i);
break;
case 'onGroupMemberDeleted':
final i =
Utils.toObj(data, (map) => GroupMembersInfo.fromJson(map));
final i = Utils.toObj(data, (map) => GroupMembersInfo.fromJson(map));
groupManager.listener.groupMemberDeleted(i);
break;
case 'onGroupMemberInfoChanged':
final i =
Utils.toObj(data, (map) => GroupMembersInfo.fromJson(map));
final i = Utils.toObj(data, (map) => GroupMembersInfo.fromJson(map));
groupManager.listener.groupMemberInfoChanged(i);
break;
case 'onJoinedGroupAdded':
@@ -133,42 +123,6 @@ class IMManager {
groupManager.listener.joinedGroupDeleted(i);
break;
}
} else if (call.method == ListenerType.channelListener) {
String type = call.arguments['type'];
dynamic data = call.arguments['data'];
switch (type) {
case 'onChannelDismissed':
final i = Utils.toObj(data, (map) => ChannelInfo.fromJson(map));
channelManager.listener.channelDismissed(i);
break;
case 'onChannelInfoChanged':
final i = Utils.toObj(data, (map) => ChannelInfo.fromJson(map));
channelManager.listener.channelInfoChanged(i);
break;
case 'onChannelMemberAdded':
final i =
Utils.toObj(data, (map) => ChannelMembersInfo.fromJson(map));
channelManager.listener.channelMemberAdded(i);
break;
case 'onChannelMemberDeleted':
final i =
Utils.toObj(data, (map) => ChannelMembersInfo.fromJson(map));
channelManager.listener.channelMemberDeleted(i);
break;
case 'onChannelMemberInfoChanged':
final i =
Utils.toObj(data, (map) => ChannelMembersInfo.fromJson(map));
channelManager.listener.channelMemberInfoChanged(i);
break;
case 'onJoinedChannelAdded':
final i = Utils.toObj(data, (map) => ChannelInfo.fromJson(map));
channelManager.listener.joinedChannelAdded(i);
break;
case 'onJoinedChannelDeleted':
final i = Utils.toObj(data, (map) => ChannelInfo.fromJson(map));
channelManager.listener.joinedChannelDeleted(i);
break;
}
} else if (call.method == ListenerType.advancedMsgListener) {
var type = call.arguments['type'];
// var id = call.arguments['data']['id'];
@@ -183,15 +137,9 @@ class IMManager {
var info = Utils.toObj(value, (map) => RevokedInfo.fromJson(map));
messageManager.msgListener.newRecvMessageRevoked(info);
break;
case 'onNewRecvMessageEdited':
var value = call.arguments['data']['messageEdited'];
var info = Utils.toObj(value, (map) => EditedInfo.fromJson(map));
messageManager.msgListener.newRecvMessageEdited(info);
break;
case 'onRecvC2CReadReceipt':
var value = call.arguments['data']['msgReceiptList'];
var list =
Utils.toList(value, (map) => ReadReceiptInfo.fromJson(map));
var list = Utils.toList(value, (map) => ReadReceiptInfo.fromJson(map));
messageManager.msgListener.recvC2CReadReceipt(list);
break;
case 'onRecvNewMessage':
@@ -241,24 +189,19 @@ class IMManager {
conversationManager.listener.syncServerFailed(data);
break;
case 'onNewConversation':
var list =
Utils.toList(data, (map) => ConversationInfo.fromJson(map));
var list = Utils.toList(data, (map) => ConversationInfo.fromJson(map));
conversationManager.listener.newConversation(list);
break;
case 'onConversationChanged':
var list =
Utils.toList(data, (map) => ConversationInfo.fromJson(map));
var list = Utils.toList(data, (map) => ConversationInfo.fromJson(map));
conversationManager.listener.conversationChanged(list);
break;
case 'onTotalUnreadMessageCountChanged':
conversationManager.listener
.totalUnreadMessageCountChanged(data ?? 0);
conversationManager.listener.totalUnreadMessageCountChanged(data ?? 0);
break;
case 'onConversationUserInputStatusChanged':
final i = Utils.toObj(
data, (map) => InputStatusChangedData.fromJson(map));
conversationManager.listener
.conversationUserInputStatusChanged(i);
final i = Utils.toObj(data, (map) => InputStatusChangedData.fromJson(map));
conversationManager.listener.conversationUserInputStatusChanged(i);
break;
}
} else if (call.method == ListenerType.friendListener) {
@@ -279,23 +222,19 @@ class IMManager {
friendshipManager.listener.friendAdded(u);
break;
case 'onFriendApplicationAccepted':
final u = Utils.toObj(
data, (map) => FriendApplicationInfo.fromJson(map));
final u = Utils.toObj(data, (map) => FriendApplicationInfo.fromJson(map));
friendshipManager.listener.friendApplicationAccepted(u);
break;
case 'onFriendApplicationAdded':
final u = Utils.toObj(
data, (map) => FriendApplicationInfo.fromJson(map));
final u = Utils.toObj(data, (map) => FriendApplicationInfo.fromJson(map));
friendshipManager.listener.friendApplicationAdded(u);
break;
case 'onFriendApplicationDeleted':
final u = Utils.toObj(
data, (map) => FriendApplicationInfo.fromJson(map));
final u = Utils.toObj(data, (map) => FriendApplicationInfo.fromJson(map));
friendshipManager.listener.friendApplicationDeleted(u);
break;
case 'onFriendApplicationRejected':
final u = Utils.toObj(
data, (map) => FriendApplicationInfo.fromJson(map));
final u = Utils.toObj(data, (map) => FriendApplicationInfo.fromJson(map));
friendshipManager.listener.friendApplicationRejected(u);
break;
case 'onFriendDeleted':
@@ -312,8 +251,7 @@ class IMManager {
String data = call.arguments['data'];
switch (type) {
case 'onRecvCustomBusinessMessage':
messageManager.customBusinessListener
?.recvCustomBusinessMessage(data);
messageManager.customBusinessListener?.recvCustomBusinessMessage(data);
break;
}
} else if (call.method == ListenerType.listenerForService) {
@@ -321,23 +259,19 @@ class IMManager {
String data = call.arguments['data'];
switch (type) {
case 'onFriendApplicationAccepted':
final u = Utils.toObj(
data, (map) => FriendApplicationInfo.fromJson(map));
final u = Utils.toObj(data, (map) => FriendApplicationInfo.fromJson(map));
_listenerForService?.friendApplicationAccepted(u);
break;
case 'onFriendApplicationAdded':
final u = Utils.toObj(
data, (map) => FriendApplicationInfo.fromJson(map));
final u = Utils.toObj(data, (map) => FriendApplicationInfo.fromJson(map));
_listenerForService?.friendApplicationAdded(u);
break;
case 'onGroupApplicationAccepted':
final i = Utils.toObj(
data, (map) => GroupApplicationInfo.fromJson(map));
final i = Utils.toObj(data, (map) => GroupApplicationInfo.fromJson(map));
_listenerForService?.groupApplicationAccepted(i);
break;
case 'onGroupApplicationAdded':
final i = Utils.toObj(
data, (map) => GroupApplicationInfo.fromJson(map));
final i = Utils.toObj(data, (map) => GroupApplicationInfo.fromJson(map));
_listenerForService?.groupApplicationAdded(i);
break;
case 'onRecvNewMessage':
@@ -394,8 +328,7 @@ class IMManager {
int fileSize = data['fileSize'];
int streamSize = data['streamSize'];
int storageSize = data['storageSize'];
_uploadFileListener?.uploadProgress(
id, fileSize, streamSize, storageSize);
_uploadFileListener?.uploadProgress(id, fileSize, streamSize, storageSize);
break;
case 'uploadID':
String id = data['id'];
@@ -407,14 +340,12 @@ class IMManager {
int index = data['index'];
int partSize = data['partSize'];
String partHash = data['partHash'];
_uploadFileListener?.uploadPartComplete(
id, index, partSize, partHash);
_uploadFileListener?.uploadPartComplete(id, index, partSize, partHash);
break;
}
}
} catch (error, stackTrace) {
Logger.print(
"回调失败了。${call.method} ${call.arguments['type']} ${call.arguments['data']} $error $stackTrace");
Logger.print("回调失败了。${call.method} ${call.arguments['type']} ${call.arguments['data']} $error $stackTrace");
}
return Future.value(null);
});
@@ -481,8 +412,8 @@ class IMManager {
}
/// Deinitialize the SDK
Future<dynamic> unInitSDK() {
return _channel.invokeMethod('unInitSDK', _buildParam({}));
void unInitSDK() {
_channel.invokeMethod('unInitSDK', _buildParam({}));
}
/// Login
@@ -646,86 +577,6 @@ class IMManager {
}
}
//sdk多了这几个方法增加一下
Future setNotificationVisibilityRule(
{required int notificationType,
required int visibilityType,
String? operationID}) =>
_channel.invokeMethod(
'setNotificationVisibilityRule',
_buildParam({
'notificationType': notificationType,
'visibilityType': visibilityType,
'operationID': Utils.checkOperationID(operationID),
}),
);
Future setNotificationVisibilityRules(
{required String rulesJSON, String? operationID}) =>
_channel.invokeMethod(
'setNotificationVisibilityRules',
_buildParam({
'rulesJSON': rulesJSON,
'operationID': Utils.checkOperationID(operationID),
}),
);
Future getNotificationVisibilityRule(
{required int notificationType, String? operationID}) =>
_channel.invokeMethod<int>(
'getNotificationVisibilityRule',
_buildParam({
'notificationType': notificationType,
'operationID': Utils.checkOperationID(operationID),
}),
);
Future<Map<int, int>> getNotificationVisibilityRules(
{String? operationID}) async {
var result = await _channel.invokeMethod<Map<int, int>>(
'getNotificationVisibilityRules',
_buildParam({
'operationID': Utils.checkOperationID(operationID),
}),
);
return result ?? <int, int>{};
}
Future enableNotificationVisibilityRule(
{required int notificationType, String? operationID}) =>
_channel.invokeMethod(
'enableNotificationVisibilityRule',
_buildParam({
'notificationType': notificationType,
'operationID': Utils.checkOperationID(operationID),
}),
);
Future disableNotificationVisibilityRule(
{required int notificationType, String? operationID}) =>
_channel.invokeMethod(
'disableNotificationVisibilityRule',
_buildParam({
'notificationType': notificationType,
'operationID': Utils.checkOperationID(operationID),
}),
);
Future deleteNotificationVisibilityRule(
{required int notificationType, String? operationID}) =>
_channel.invokeMethod(
'deleteNotificationVisibilityRule',
_buildParam({
'notificationType': notificationType,
'operationID': Utils.checkOperationID(operationID),
}),
);
Future resetNotificationVisibilityRules({String? operationID}) =>
_channel.invokeMethod(
'resetNotificationVisibilityRules',
_buildParam({
'operationID': Utils.checkOperationID(operationID),
}),
);
MethodChannel get channel => _channel;
static Map _buildParam(Map<String, dynamic> param) {

View File

@@ -36,7 +36,6 @@ class MessageManager {
required OfflinePushInfo offlinePushInfo,
String? userID,
String? groupID,
String? channelID,
bool isOnlineOnly = false,
String? operationID,
}) =>
@@ -48,7 +47,6 @@ class MessageManager {
'offlinePushInfo': offlinePushInfo.toJson(),
'userID': userID ?? '',
'groupID': groupID ?? '',
'channelID': channelID ?? '',
'isOnlineOnly': isOnlineOnly,
'operationID': Utils.checkOperationID(operationID),
}))
@@ -132,7 +130,6 @@ class MessageManager {
/// [message] Message content
Future<Message> insertGroupMessageToLocalStorage({
String? groupID,
String? channelID,
String? senderID,
Message? message,
String? operationID,
@@ -143,7 +140,6 @@ class MessageManager {
_buildParam({
"message": message?.toJson(),
"groupID": groupID,
"channelID": channelID,
"senderID": senderID,
"operationID": Utils.checkOperationID(operationID),
}))
@@ -151,8 +147,7 @@ class MessageManager {
/// Typing status update
/// [msgTip] Custom content
@Deprecated(
'Use [OpenIM.iMManager.conversationManager.changeInputStates(conversationID:focus:)] instead')
@Deprecated('Use [OpenIM.iMManager.conversationManager.changeInputStates(conversationID:focus:)] instead')
Future typingStatusUpdate({
required String userID,
String? msgTip,
@@ -532,8 +527,7 @@ class MessageManager {
},
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toObj(value, (map) => SearchResult.fromJson(map)));
.then((value) => Utils.toObj(value, (map) => SearchResult.fromJson(map)));
/// Revoke a message
/// [message] The message to be revoked
@@ -550,23 +544,6 @@ class MessageManager {
"operationID": Utils.checkOperationID(operationID),
}));
/// Edit a message
/// [message] The message to be edited
Future editMessage({
required String conversationID,
required String clientMsgID,
String? operationID,
required Message message,
}) =>
_channel.invokeMethod(
'editMessage',
_buildParam({
'conversationID': conversationID,
'clientMsgID': clientMsgID,
"operationID": Utils.checkOperationID(operationID),
'message': message.toJson(),
}));
/// Mark messages as read
/// [conversationID] Conversation ID
/// [messageIDList] List of clientMsgIDs of messages to be marked as read
@@ -606,8 +583,7 @@ class MessageManager {
'viewType': viewType.rawValue,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toObj(value, (map) => AdvancedMessage.fromJson(map)));
.then((value) => 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.
/// [conversationID] Conversation ID, can be used for querying notifications
@@ -630,8 +606,7 @@ class MessageManager {
'viewType': viewType.rawValue,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toObj(value, (map) => AdvancedMessage.fromJson(map)));
.then((value) => Utils.toObj(value, (map) => AdvancedMessage.fromJson(map)));
/// Find message details
/// [conversationID] Conversation ID
@@ -647,8 +622,7 @@ class MessageManager {
'searchParams': searchParams.map((e) => e.toJson()).toList(),
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toObj(value, (map) => SearchResult.fromJson(map)));
.then((value) => Utils.toObj(value, (map) => SearchResult.fromJson(map)));
/// Rich text message
/// [text] Input content
@@ -700,7 +674,6 @@ class MessageManager {
required OfflinePushInfo offlinePushInfo,
String? userID,
String? groupID,
String? channelID,
bool isOnlineOnly = false,
String? operationID,
}) =>
@@ -712,7 +685,6 @@ class MessageManager {
'offlinePushInfo': offlinePushInfo.toJson(),
'userID': userID ?? '',
'groupID': groupID ?? '',
'channelID': channelID ?? '',
'isOnlineOnly': isOnlineOnly,
'operationID': Utils.checkOperationID(operationID),
}))
@@ -816,28 +788,6 @@ class MessageManager {
}));
}
/// Fetch Surrounding Messages
/// [message] Message content
/// [before] message index - before
/// [after] message index - after
/// [operationID] Operation ID
Future<List<Message>> FetchSurroundingMessages({
required Message message,
int? before,
int? after,
String? operationID,
}) =>
_channel
.invokeMethod(
'fetchSurroundingMessages',
_buildParam({
'message': message.toJson(),
'before': before ?? 0,
'after': after ?? 0,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (map) => Message.fromJson(map)));
static Map _buildParam(Map<String, dynamic> param) {
param["ManagerName"] = "messageManager";
param = Utils.cleanMap(param);

View File

@@ -1,165 +0,0 @@
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
/// Channel Information
class ChannelInfo {
/// Channel ID
String channelID;
/// Channel Name
String? channelName;
/// Channel Announcement
String? notification;
/// Channel Introduction
String? introduction;
/// Channel Avatar
String? faceURL;
/// Creation Time
int? createTime;
/// Number of Channel Members
int? memberCount;
/// Channel Status: 0 - Normal, 1 - Blocked, 2 - Dissolved, 3 - Muted
int? status;
/// Creator's ID
String? creatorUserID;
/// Channel Type [ChannelType]
int? channelType;
/// Extra Information
String? ex;
ChannelInfo({
required this.channelID,
this.channelName,
this.notification,
this.introduction,
this.faceURL,
this.createTime,
this.memberCount,
this.status,
this.creatorUserID,
this.channelType,
this.ex,
});
ChannelInfo.fromJson(Map<String, dynamic> json) : channelID = json['channelID'] {
channelName = json['channelName'];
notification = json['notification'];
introduction = json['introduction'];
faceURL = json['faceURL'];
createTime = json['createTime'];
memberCount = json['memberCount'];
status = json['status'];
creatorUserID = json['creatorUserID'];
channelType = json['channelType'];
ex = json['ex'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['channelID'] = this.channelID;
data['channelName'] = this.channelName;
data['notification'] = this.notification;
data['introduction'] = this.introduction;
data['faceURL'] = this.faceURL;
data['createTime'] = this.createTime;
data['memberCount'] = this.memberCount;
data['status'] = this.status;
data['creatorUserID'] = this.creatorUserID;
data['channelType'] = this.channelType;
data['ex'] = this.ex;
return data;
}
/// Corresponding Conversation Type for Channel Type
int get sessionType => ConversationType.superChannel;
@override
bool operator ==(Object other) =>
identical(this, other) || other is ChannelInfo && runtimeType == other.runtimeType && channelID == other.channelID;
@override
int get hashCode => channelID.hashCode;
}
/// Channel Member Information
class ChannelMembersInfo {
/// Channel ID
String? channelID;
/// User ID
String? userID;
/// Nickname
String? nickname;
/// Avatar
String? faceURL;
/// Role [ChannelRoleLevel]
int? roleLevel;
/// Join Time
int? joinTime;
/// Extra Information
String? ex;
/// Mute End Time (seconds)
int? muteEndTime;
ChannelMembersInfo({
this.channelID,
this.userID,
this.roleLevel,
this.joinTime,
this.nickname,
this.faceURL,
this.ex,
this.muteEndTime,
});
ChannelMembersInfo.fromJson(Map<String, dynamic> json) {
channelID = json['channelID'];
userID = json['userID'];
roleLevel = json['roleLevel'];
joinTime = json['joinTime'];
nickname = json['nickname'];
faceURL = json['faceURL'];
ex = json['ex'];
muteEndTime = json['muteEndTime'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['channelID'] = this.channelID;
data['userID'] = this.userID;
data['roleLevel'] = this.roleLevel;
data['joinTime'] = this.joinTime;
data['nickname'] = this.nickname;
data['faceURL'] = this.faceURL;
data['ex'] = this.ex;
data['muteEndTime'] = this.muteEndTime;
return data;
}
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is ChannelMembersInfo &&
runtimeType == other.runtimeType &&
channelID == other.channelID &&
userID == other.userID;
@override
int get hashCode => channelID.hashCode ^ userID.hashCode;
}

View File

@@ -15,9 +15,6 @@ class ConversationInfo {
// Group ID in case of a group chat
String? groupID;
// Channel ID in case of a channel chat
String? channelID;
// Display name or nickname
String? showName;
@@ -72,7 +69,6 @@ class ConversationInfo {
this.conversationType,
this.userID,
this.groupID,
this.channelID,
this.showName,
this.faceURL,
this.recvMsgOpt,
@@ -95,7 +91,6 @@ class ConversationInfo {
conversationType = json['conversationType'];
userID = json['userID'];
groupID = json['groupID'];
channelID = json['channelID'];
showName = json['showName'];
faceURL = json['faceURL'];
recvMsgOpt = json['recvMsgOpt'];
@@ -127,7 +122,6 @@ class ConversationInfo {
data['conversationType'] = this.conversationType;
data['userID'] = this.userID;
data['groupID'] = this.groupID;
data['channelID'] = this.channelID;
data['showName'] = this.showName;
data['faceURL'] = this.faceURL;
data['recvMsgOpt'] = this.recvMsgOpt;
@@ -153,10 +147,6 @@ class ConversationInfo {
// Check if it's a group chat
bool get isGroupChat => conversationType == ConversationType.group || conversationType == ConversationType.superGroup;
// Check if it's a channel chat
bool get isChannelChat => conversationType == ConversationType.superChannel;
// Check if it's a valid conversation (not in a group if isNotInGroup is true)
bool get isValid => isSingleChat || (isGroupChat && !isNotInGroup!);

View File

@@ -42,9 +42,6 @@ class Message {
/// Group ID.
String? groupID;
/// Channel ID.
String? channelID;
/// Message localEx.
String? localEx;
@@ -140,7 +137,6 @@ class Message {
this.senderNickname,
this.senderFaceUrl,
this.groupID,
this.channelID,
this.localEx,
this.seq,
this.isRead,
@@ -183,7 +179,6 @@ class Message {
senderNickname = json['senderNickname'];
senderFaceUrl = json['senderFaceUrl'];
groupID = json['groupID'];
channelID = json['channelID'];
localEx = json['localEx'];
seq = json['seq'];
isRead = json['isRead'];
@@ -229,7 +224,6 @@ class Message {
data['senderNickname'] = this.senderNickname;
data['senderFaceUrl'] = this.senderFaceUrl;
data['groupID'] = this.groupID;
data['channelID'] = this.channelID;
data['localEx'] = this.localEx;
data['seq'] = this.seq;
data['isRead'] = this.isRead;
@@ -281,7 +275,6 @@ class Message {
senderNickname = message.senderNickname;
senderFaceUrl = message.senderFaceUrl;
groupID = message.groupID;
channelID = message.channelID;
// content = message.content;
seq = message.seq;
isRead = message.isRead;
@@ -1123,82 +1116,6 @@ class RevokedInfo {
}
}
/// Message revocation details
class EditedInfo {
/// Editer's ID
String? editerID;
/// Message ID
String? clientMsgID;
/// Revocation time
int? editTime;
/// Message sending time
int? sourceMessageSendTime;
/// Message sender
String? sourceMessageSendID;
/// Message sender's nickname
String? sourceMessageSenderNickname;
/// Conversation type [ConversationType]
int? sessionType;
/// Message contentType
int? contentType;
/// Message content
String? content;
EditedInfo({
this.editerID,
this.clientMsgID,
this.editTime,
this.sourceMessageSendTime,
this.sourceMessageSendID,
this.sourceMessageSenderNickname,
this.sessionType,
this.contentType,
this.content,
});
EditedInfo.fromJson(Map<String, dynamic> json) {
editerID = json['editerID'];
clientMsgID = json['clientMsgID'];
editTime = json['editTime'];
sourceMessageSendTime = json['sourceMessageSendTime'];
sourceMessageSendID = json['sourceMessageSendID'];
sourceMessageSenderNickname = json['sourceMessageSenderNickname'];
sessionType = json['sessionType'];
contentType = json['contentType'];
content = json['content'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['editerID'] = this.editerID;
data['clientMsgID'] = this.clientMsgID;
data['editTime'] = this.editTime;
data['sourceMessageSendTime'] = this.sourceMessageSendTime;
data['sourceMessageSendID'] = this.sourceMessageSendID;
data['sourceMessageSenderNickname'] = this.sourceMessageSenderNickname;
data['sessionType'] = this.sessionType;
data['contentType'] = this.contentType;
data['content'] = this.content;
return data;
}
}
class AdvancedMessage {
List<Message>? messageList;
bool? isEnd;

View File

@@ -1,6 +1,6 @@
import '../../flutter_openim_sdk.dart';
/// OA notification
/// OA Notification
class OANotification {
/// Title
String? notificationName;
@@ -58,57 +58,50 @@ class OANotification {
text = json['text'];
externalUrl = json['externalUrl'];
mixType = json['mixType'];
pictureElem = json['pictureElem'] != null
? PictureElem.fromJson(json['pictureElem'])
: null;
soundElem = json['soundElem'] != null
? SoundElem.fromJson(json['soundElem'])
: null;
videoElem = json['videoElem'] != null
? VideoElem.fromJson(json['videoElem'])
: null;
fileElem =
json['fileElem'] != null ? FileElem.fromJson(json['fileElem']) : null;
pictureElem = json['pictureElem'] != null ? PictureElem.fromJson(json['pictureElem']) : null;
soundElem = json['soundElem'] != null ? SoundElem.fromJson(json['soundElem']) : null;
videoElem = json['videoElem'] != null ? VideoElem.fromJson(json['videoElem']) : null;
fileElem = json['fileElem'] != null ? FileElem.fromJson(json['fileElem']) : null;
ex = json['ex'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['notificationName'] = this.notificationName;
data['notificationFaceURL'] = this.notificationFaceURL;
data['notificationType'] = this.notificationType;
data['text'] = this.text;
data['externalUrl'] = this.externalUrl;
data['mixType'] = this.mixType;
if (this.pictureElem != null) {
data['pictureElem'] = this.pictureElem!.toJson();
data['notificationName'] = notificationName;
data['notificationFaceURL'] = notificationFaceURL;
data['notificationType'] = notificationType;
data['text'] = text;
data['externalUrl'] = externalUrl;
data['mixType'] = mixType;
if (pictureElem != null) {
data['pictureElem'] = pictureElem!.toJson();
}
if (this.soundElem != null) {
data['soundElem'] = this.soundElem!.toJson();
if (soundElem != null) {
data['soundElem'] = soundElem!.toJson();
}
if (this.videoElem != null) {
data['videoElem'] = this.videoElem!.toJson();
if (videoElem != null) {
data['videoElem'] = videoElem!.toJson();
}
if (this.fileElem != null) {
data['fileElem'] = this.fileElem!.toJson();
if (fileElem != null) {
data['fileElem'] = fileElem!.toJson();
}
data['ex'] = this.ex;
data['ex'] = ex;
return data;
}
}
/// 群事件通知
/// Group Event Notification
class GroupNotification {
/// 群信息
/// Group information
GroupInfo? group;
/// 当前事件操作者信息
/// Current event operator information
GroupMembersInfo? opUser;
/// 群拥有者信息
/// Group owner information
GroupMembersInfo? groupOwnerUser;
/// 产生影响的群成员列表
/// List of affected group members
List<GroupMembersInfo>? memberList;
GroupNotification({
@@ -120,12 +113,8 @@ class GroupNotification {
GroupNotification.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
opUser = json['opUser'] != null
? GroupMembersInfo.fromJson(json['opUser'])
: null;
groupOwnerUser = json['groupOwnerUser'] != null
? GroupMembersInfo.fromJson(json['groupOwnerUser'])
: null;
opUser = json['opUser'] != null ? GroupMembersInfo.fromJson(json['opUser']) : null;
groupOwnerUser = json['groupOwnerUser'] != null ? GroupMembersInfo.fromJson(json['groupOwnerUser']) : null;
if (json['memberList'] != null) {
memberList = <GroupMembersInfo>[];
json['memberList'].forEach((v) {
@@ -136,40 +125,42 @@ class GroupNotification {
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
if (group != null) {
data['group'] = group!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
if (opUser != null) {
data['opUser'] = opUser!.toJson();
}
if (this.groupOwnerUser != null) {
data['groupOwnerUser'] = this.groupOwnerUser!.toJson();
if (groupOwnerUser != null) {
data['groupOwnerUser'] = groupOwnerUser!.toJson();
}
if (this.memberList != null) {
data['memberList'] = this.memberList!.map((v) => v.toJson()).toList();
if (memberList != null) {
data['memberList'] = memberList!.map((v) => v.toJson()).toList();
}
return data;
}
}
/// 用户被邀请进群通知
/// User Invited to Join Group Notification
class InvitedJoinGroupNotification {
/// 群信息
/// Group information
GroupInfo? group;
/// 操作者信息
/// Operator information
GroupMembersInfo? opUser;
/// 被邀请进群的成员信息
/// Inviter information
GroupMembersInfo? inviterUser;
/// List of members invited to join the group
List<GroupMembersInfo>? invitedUserList;
InvitedJoinGroupNotification({this.group, this.opUser, this.invitedUserList});
InvitedJoinGroupNotification.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
opUser = json['opUser'] != null
? GroupMembersInfo.fromJson(json['opUser'])
: null;
opUser = json['opUser'] != null ? GroupMembersInfo.fromJson(json['opUser']) : null;
inviterUser = json['inviterUser'] != null ? GroupMembersInfo.fromJson(json['inviterUser']) : null;
if (json['invitedUserList'] != null) {
invitedUserList = <GroupMembersInfo>[];
json['invitedUserList'].forEach((v) {
@@ -179,40 +170,39 @@ class InvitedJoinGroupNotification {
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
final Map<String, dynamic> data = <String, dynamic>{};
if (group != null) {
data['group'] = group!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
if (opUser != null) {
data['opUser'] = opUser!.toJson();
}
if (this.invitedUserList != null) {
data['invitedUserList'] =
this.invitedUserList!.map((v) => v.toJson()).toList();
if (inviterUser != null) {
data['inviterUser'] = inviterUser!.toJson();
}
if (invitedUserList != null) {
data['invitedUserList'] = invitedUserList!.map((v) => v.toJson()).toList();
}
return data;
}
}
/// 组踢出成员通知
/// Group Member Kicked Notification
class KickedGroupMemeberNotification {
/// 群信息
/// Group information
GroupInfo? group;
/// 操作者信息
/// Operator information
GroupMembersInfo? opUser;
/// 被踢出群的成员信息列表
/// List of members kicked from the group
List<GroupMembersInfo>? kickedUserList;
KickedGroupMemeberNotification(
{this.group, this.opUser, this.kickedUserList});
KickedGroupMemeberNotification({this.group, this.opUser, this.kickedUserList});
KickedGroupMemeberNotification.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
opUser = json['opUser'] != null
? GroupMembersInfo.fromJson(json['opUser'])
: null;
opUser = json['opUser'] != null ? GroupMembersInfo.fromJson(json['opUser']) : null;
if (json['kickedUserList'] != null) {
kickedUserList = <GroupMembersInfo>[];
json['kickedUserList'].forEach((v) {
@@ -223,87 +213,82 @@ class KickedGroupMemeberNotification {
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
if (group != null) {
data['group'] = group!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
if (opUser != null) {
data['opUser'] = opUser!.toJson();
}
if (this.kickedUserList != null) {
data['kickedUserList'] =
this.kickedUserList!.map((v) => v.toJson()).toList();
if (kickedUserList != null) {
data['kickedUserList'] = kickedUserList!.map((v) => v.toJson()).toList();
}
return data;
}
}
/// 退出群通知
/// Quit Group Notification
class QuitGroupNotification {
/// 群信息
/// Group information
GroupInfo? group;
/// 退群的成员信息
/// Information of the member who quit the group
GroupMembersInfo? quitUser;
QuitGroupNotification({this.group, this.quitUser});
QuitGroupNotification.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
quitUser = json['quitUser'] != null
? GroupMembersInfo.fromJson(json['quitUser'])
: null;
quitUser = json['quitUser'] != null ? GroupMembersInfo.fromJson(json['quitUser']) : null;
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
if (group != null) {
data['group'] = group!.toJson();
}
if (this.quitUser != null) {
data['quitUser'] = this.quitUser!.toJson();
if (quitUser != null) {
data['quitUser'] = quitUser!.toJson();
}
return data;
}
}
/// 进群通知
/// Enter Group Notification
class EnterGroupNotification {
/// 群信息
/// Group information
GroupInfo? group;
/// 进入群的成员信息
/// Information of the member who entered the group
GroupMembersInfo? entrantUser;
EnterGroupNotification({this.group, this.entrantUser});
EnterGroupNotification.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
entrantUser = json['entrantUser'] != null
? GroupMembersInfo.fromJson(json['entrantUser'])
: null;
entrantUser = json['entrantUser'] != null ? GroupMembersInfo.fromJson(json['entrantUser']) : null;
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
if (group != null) {
data['group'] = group!.toJson();
}
if (this.entrantUser != null) {
data['quitUser'] = this.entrantUser!.toJson();
if (entrantUser != null) {
data['entrantUser'] = entrantUser!.toJson();
}
return data;
}
}
/// 群权转让通知
/// Group Rights Transfer Notification
class GroupRightsTransferNoticication {
/// 群信息
/// Group information
GroupInfo? group;
/// 操作者信息
/// Operator information
GroupMembersInfo? opUser;
/// 群新的拥有者信息
/// New group owner information
GroupMembersInfo? newGroupOwner;
GroupRightsTransferNoticication({
@@ -314,41 +299,37 @@ class GroupRightsTransferNoticication {
GroupRightsTransferNoticication.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
opUser = json['opUser'] != null
? GroupMembersInfo.fromJson(json['opUser'])
: null;
newGroupOwner = json['newGroupOwner'] != null
? GroupMembersInfo.fromJson(json['newGroupOwner'])
: null;
opUser = json['opUser'] != null ? GroupMembersInfo.fromJson(json['opUser']) : null;
newGroupOwner = json['newGroupOwner'] != null ? GroupMembersInfo.fromJson(json['newGroupOwner']) : null;
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
if (group != null) {
data['group'] = group!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
if (opUser != null) {
data['opUser'] = opUser!.toJson();
}
if (this.newGroupOwner != null) {
data['newGroupOwner'] = this.newGroupOwner!.toJson();
if (newGroupOwner != null) {
data['newGroupOwner'] = newGroupOwner!.toJson();
}
return data;
}
}
/// 禁言成员通知
/// Mute Member Notification
class MuteMemberNotification {
/// 群信息
/// Group information
GroupInfo? group;
/// 操作者信息
/// Operator information
GroupMembersInfo? opUser;
/// 被禁言的成员信息
/// Muted member information
GroupMembersInfo? mutedUser;
/// 禁言时间s
/// Mute duration in seconds
int? mutedSeconds;
MuteMemberNotification({
@@ -360,40 +341,36 @@ class MuteMemberNotification {
MuteMemberNotification.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
opUser = json['opUser'] != null
? GroupMembersInfo.fromJson(json['opUser'])
: null;
mutedUser = json['mutedUser'] != null
? GroupMembersInfo.fromJson(json['mutedUser'])
: null;
opUser = json['opUser'] != null ? GroupMembersInfo.fromJson(json['opUser']) : null;
mutedUser = json['mutedUser'] != null ? GroupMembersInfo.fromJson(json['mutedUser']) : null;
mutedSeconds = json['mutedSeconds'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
if (group != null) {
data['group'] = group!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
if (opUser != null) {
data['opUser'] = opUser!.toJson();
}
if (this.mutedUser != null) {
data['mutedUser'] = this.mutedUser!.toJson();
if (mutedUser != null) {
data['mutedUser'] = mutedUser!.toJson();
}
data['mutedSeconds'] = this.mutedSeconds;
data['mutedSeconds'] = mutedSeconds;
return data;
}
}
/// 阅后即焚通知
/// Burn After Reading Notification
class BurnAfterReadingNotification {
/// 接收者
/// Receiver
String? recvID;
/// 发送者
/// Sender
String? sendID;
/// 是否开启
/// Whether enabled
bool? isPrivate;
BurnAfterReadingNotification({this.recvID, this.sendID, this.isPrivate});
@@ -406,22 +383,22 @@ class BurnAfterReadingNotification {
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['recvID'] = this.recvID;
data['sendID'] = this.sendID;
data['isPrivate'] = this.isPrivate;
data['recvID'] = recvID;
data['sendID'] = sendID;
data['isPrivate'] = isPrivate;
return data;
}
}
/// 群成员信息发送变化通知
/// Group Member Information Changed Notification
class GroupMemberInfoChangedNotification {
/// 群信息
/// Group information
GroupInfo? group;
/// 操作者信息
/// Operator information
GroupMembersInfo? opUser;
/// 资料发生改变的成员
/// Member with changed information
GroupMembersInfo? changedUser;
GroupMemberInfoChangedNotification({
@@ -432,278 +409,21 @@ class GroupMemberInfoChangedNotification {
GroupMemberInfoChangedNotification.fromJson(Map<String, dynamic> json) {
group = json['group'] != null ? GroupInfo.fromJson(json['group']) : null;
opUser = json['opUser'] != null
? GroupMembersInfo.fromJson(json['opUser'])
: null;
changedUser = json['changedUser'] != null
? GroupMembersInfo.fromJson(json['changedUser'])
: null;
opUser = json['opUser'] != null ? GroupMembersInfo.fromJson(json['opUser']) : null;
changedUser = json['changedUser'] != null ? GroupMembersInfo.fromJson(json['changedUser']) : null;
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.group != null) {
data['group'] = this.group!.toJson();
if (group != null) {
data['group'] = group!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
if (opUser != null) {
data['opUser'] = opUser!.toJson();
}
if (this.changedUser != null) {
data['changedUser'] = this.changedUser!.toJson();
if (changedUser != null) {
data['changedUser'] = changedUser!.toJson();
}
return data;
}
}
///todo 所有的聊天的操作者都没有,暂时没有处理
/// 聊天室事件通知
class ChannelNotification {
/// 聊天室信息
ChannelInfo? Channel;
/// 当前事件操作者信息
ChannelMembersInfo? opUser;
/// 聊天室拥有者信息
ChannelMembersInfo? ChannelOwnerUser;
/// 产生影响的聊天室成员列表
List<ChannelMembersInfo>? memberList;
ChannelNotification({
this.Channel,
this.opUser,
this.ChannelOwnerUser,
this.memberList,
});
ChannelNotification.fromJson(Map<String, dynamic> json) {
Channel =
json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
opUser = json['opUser'] != null
? ChannelMembersInfo.fromJson(json['opUser'])
: null;
ChannelOwnerUser = json['channelOwnerUser'] != null
? ChannelMembersInfo.fromJson(json['channelOwnerUser'])
: null;
if (json['memberList'] != null) {
memberList = <ChannelMembersInfo>[];
json['memberList'].forEach((v) {
memberList!.add(ChannelMembersInfo.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.Channel != null) {
data['channel'] = this.Channel!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
}
if (this.ChannelOwnerUser != null) {
data['channelOwnerUser'] = this.ChannelOwnerUser!.toJson();
}
if (this.memberList != null) {
data['memberList'] = this.memberList!.map((v) => v.toJson()).toList();
}
return data;
}
}
/// 组踢出成员通知
class KickedChannelMemeberNotification {
/// 聊天室信息
ChannelInfo? Channel;
/// 操作者信息
ChannelMembersInfo? opUser;
/// 被踢出聊天室的成员信息列表
List<ChannelMembersInfo>? kickedUserList;
KickedChannelMemeberNotification(
{this.Channel, this.opUser, this.kickedUserList});
KickedChannelMemeberNotification.fromJson(Map<String, dynamic> json) {
Channel =
json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
opUser = json['opUser'] != null
? ChannelMembersInfo.fromJson(json['opUser'])
: null;
if (json['kickedUserList'] != null) {
kickedUserList = <ChannelMembersInfo>[];
json['kickedUserList'].forEach((v) {
kickedUserList!.add(ChannelMembersInfo.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.Channel != null) {
data['channel'] = this.Channel!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
}
if (this.kickedUserList != null) {
data['kickedUserList'] =
this.kickedUserList!.map((v) => v.toJson()).toList();
}
return data;
}
}
/// 退出聊天室通知
class QuitChannelNotification {
/// 聊天室信息
ChannelInfo? Channel;
/// 退聊天室的成员信息
ChannelMembersInfo? quitUser;
QuitChannelNotification({this.Channel, this.quitUser});
QuitChannelNotification.fromJson(Map<String, dynamic> json) {
Channel =
json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
quitUser = json['quitUser'] != null
? ChannelMembersInfo.fromJson(json['quitUser'])
: null;
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.Channel != null) {
data['channel'] = this.Channel!.toJson();
}
if (this.quitUser != null) {
data['quitUser'] = this.quitUser!.toJson();
}
return data;
}
}
/// 进聊天室通知
class EnterChannelNotification {
/// 聊天室信息
ChannelInfo? Channel;
/// 进入聊天室的成员信息
ChannelMembersInfo? entrantUser;
EnterChannelNotification({this.Channel, this.entrantUser});
EnterChannelNotification.fromJson(Map<String, dynamic> json) {
Channel =
json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
entrantUser = json['entrantUser'] != null
? ChannelMembersInfo.fromJson(json['entrantUser'])
: null;
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.Channel != null) {
data['channel'] = this.Channel!.toJson();
}
if (this.entrantUser != null) {
data['quitUser'] = this.entrantUser!.toJson();
}
return data;
}
}
/// 禁言成员通知
class MuteChannelMemberNotification {
/// 聊天室信息
ChannelInfo? Channel;
/// 操作者信息
ChannelMembersInfo? opUser;
/// 被禁言的成员信息
ChannelMembersInfo? mutedUser;
/// 禁言时间s
int? mutedSeconds;
MuteChannelMemberNotification({
this.Channel,
this.opUser,
this.mutedUser,
this.mutedSeconds,
});
MuteChannelMemberNotification.fromJson(Map<String, dynamic> json) {
Channel =
json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
opUser = json['opUser'] != null
? ChannelMembersInfo.fromJson(json['opUser'])
: null;
mutedUser = json['mutedUser'] != null
? ChannelMembersInfo.fromJson(json['mutedUser'])
: null;
mutedSeconds = json['mutedSeconds'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.Channel != null) {
data['channel'] = this.Channel!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
}
if (this.mutedUser != null) {
data['mutedUser'] = this.mutedUser!.toJson();
}
data['mutedSeconds'] = this.mutedSeconds;
return data;
}
}
/// 聊天室成员信息发送变化通知
class ChannelMemberInfoChangedNotification {
/// 聊天室信息
ChannelInfo? Channel;
/// 操作者信息
ChannelMembersInfo? opUser;
/// 资料发生改变的成员
ChannelMembersInfo? changedUser;
ChannelMemberInfoChangedNotification({
this.Channel,
this.opUser,
this.changedUser,
});
ChannelMemberInfoChangedNotification.fromJson(Map<String, dynamic> json) {
Channel =
json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
opUser = json['opUser'] != null
? ChannelMembersInfo.fromJson(json['opUser'])
: null;
changedUser = json['changedUser'] != null
? ChannelMembersInfo.fromJson(json['changedUser'])
: null;
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
if (this.Channel != null) {
data['Channel'] = this.Channel!.toJson();
}
if (this.opUser != null) {
data['opUser'] = this.opUser!.toJson();
}
if (this.changedUser != null) {
data['changedUser'] = this.changedUser!.toJson();
}
return data;
}
}
}

View File

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

View File

@@ -47,8 +47,6 @@ class ConversationReq {
final bool? isMsgDestruct;
final int? msgDestructTime;
final int? groupAtType;
final String? channelID;
final int? channelAtType;
ConversationReq({
this.userID,
@@ -61,8 +59,6 @@ class ConversationReq {
this.isMsgDestruct,
this.msgDestructTime,
this.groupAtType,
this.channelID,
this.channelAtType,
});
ConversationReq.fromJson(Map<String, dynamic> json)
@@ -75,11 +71,8 @@ class ConversationReq {
burnDuration = json['burnDuration'],
isMsgDestruct = json['isMsgDestruct'],
msgDestructTime = json['msgDestructTime'],
channelID=json['channelID'],
channelAtType = json['channelAtType'],
groupAtType = json['groupAtType'];
Map<String, dynamic> toJson() {
final data = <String, dynamic>{};
data['userID'] = userID;
@@ -92,8 +85,7 @@ class ConversationReq {
data['isMsgDestruct'] = isMsgDestruct;
data['msgDestructTime'] = msgDestructTime;
data['groupAtType'] = groupAtType;
data['channelID'] = channelID;
data['channelAtType'] = channelAtType;
return data;
}
}

View File

@@ -2,7 +2,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class OpenIM {
static const version = '3.8.3+2';
static const version = '3.8.3+hotfix.3';
static const _channel = MethodChannel('flutter_openim_sdk');

View File

@@ -1,6 +1,6 @@
name: flutter_openim_sdk
description: An instant messaging plug-in that supports Android and IOS. And the server is also all open source.
version: 3.8.3+2
version: 3.8.3+hotfix.3
homepage: https://www.openim.io
repository: https://github.com/openimsdk/open-im-sdk-flutter
@@ -32,8 +32,7 @@ flutter:
pluginClass: FlutterOpenimSdkPlugin
ios:
pluginClass: FlutterOpenimSdkPlugin
windows:
pluginClass: FlutterOpenimSdkPlugin
# To add assets to your plugin package, add an assets section, like this:
# assets:
# - images/a_dot_burr.jpeg

15
windows/.gitignore vendored
View File

@@ -1,15 +0,0 @@
flutter/
# Visual Studio user-specific files.
*.suo
*.user
*.userosscache
*.sln.docstates
# Visual Studio build-related files.
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/

View File

@@ -1,191 +0,0 @@
# The Flutter tooling requires that developers have a version of Visual Studio
# installed that includes CMake 3.14 or later. You should not increase this
# version, as doing so will cause the plugin to fail to compile for some
# customers of the plugin.
cmake_minimum_required(VERSION 3.14)
# Project-level configuration.
set(PROJECT_NAME "flutter_openim_sdk")
project(${PROJECT_NAME} LANGUAGES CXX)
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
# versions of CMake.
cmake_policy(VERSION 3.14...3.25)
# 定义一个函数用于下载和解压SDK
# 参数:
# DOWNLOAD_URL - 下载URL
# TARGET_DIR - 目标目录
function(download_and_extract_sdk)
# 解析参数
set(oneValueArgs DOWNLOAD_URL TARGET_DIR)
cmake_parse_arguments(PARSE_ARGV 0 ARG "" "${oneValueArgs}" "")
if(NOT ARG_DOWNLOAD_URL OR NOT ARG_TARGET_DIR)
message(FATAL_ERROR "DOWNLOAD_URL and TARGET_DIR must be specified")
endif()
# 从URL中提取文件名
set(SPLIT "download=")
string(LENGTH ${SPLIT} SPLIT_LENGTH)
string(LENGTH ${ARG_DOWNLOAD_URL} URL_LENGTH)
string(FIND ${ARG_DOWNLOAD_URL} ${SPLIT} POS)
if(POS GREATER_EQUAL 0)
math(EXPR SPLIT_POS "${POS}+${SPLIT_LENGTH}")
string(SUBSTRING ${ARG_DOWNLOAD_URL} ${SPLIT_POS} ${URL_LENGTH} FILE_NAME)
else()
# 如果没有找到分割字符串,使用默认文件名
set(FILE_NAME "sdk_package.tar.gz")
endif()
# 设置完整文件路径
set(FULL_PATH "${ARG_TARGET_DIR}/${FILE_NAME}")
# 检查文件是否存在且大小不为0
if(EXISTS "${FULL_PATH}")
file(SIZE "${FULL_PATH}" FILE_SIZE)
if(NOT ${FILE_SIZE})
file(REMOVE_RECURSE "${FULL_PATH}")
endif()
endif()
# 下载和解压
if(NOT EXISTS "${FULL_PATH}")
file(MAKE_DIRECTORY ${ARG_TARGET_DIR})
message("[download_sdk]: 开始从 ${ARG_DOWNLOAD_URL} 下载SDK")
# 下载文件
file(DOWNLOAD ${ARG_DOWNLOAD_URL} ${FULL_PATH}
STATUS DOWNLOAD_STATUS
LOG DOWNLOAD_LOG)
list(GET DOWNLOAD_STATUS 0 STATUS_CODE)
if(NOT STATUS_CODE EQUAL 0)
message(FATAL_ERROR "[download_sdk]: 下载失败: ${DOWNLOAD_STATUS}, 日志: ${DOWNLOAD_LOG}")
endif()
message("[download_sdk]: 下载完成")
else()
message("[download_sdk]: SDK包已存在跳过下载")
endif()
message("[download_sdk]: 开始解压 ${FILE_NAME}")
file(ARCHIVE_EXTRACT
INPUT ${FULL_PATH}
DESTINATION ${ARG_TARGET_DIR})
message("[download_sdk]: 解压完成")
endfunction()
# third_party
set(ALOG_SDK_URL "http://192.168.77.132:8081/repository/mvn2-group/com/alog/1.0/alog-1.0.zip?download=alog-1.0.zip")
download_and_extract_sdk(
DOWNLOAD_URL ${ALOG_SDK_URL}
TARGET_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party
)
# openim
set(OPENIM_SDK_URL "http://192.168.77.132:8081/repository/mvn2-group/com/openim_pc/1.0.0/openim_pc-1.0.0.zip?download=openim_pc-1.0.0.zip")
download_and_extract_sdk(
DOWNLOAD_URL ${OPENIM_SDK_URL}
TARGET_DIR ${CMAKE_CURRENT_SOURCE_DIR}/openlib
)
# This value is used when generating builds using this plugin, so it must
# not be changed
set(PLUGIN_NAME "flutter_openim_sdk_plugin")
set(PCH_HEADER_FILE ${CMAKE_CURRENT_LIST_DIR}/src/common/stable.h)
# third_party_libs
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/third_party/alog/include")
link_directories("${CMAKE_CURRENT_SOURCE_DIR}/third_party/alog/lib/x64/${CMAKE_BUILD_TYPE}")
FILE(GLOB SELF_TEMP_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/*.cpp src/*.h)
source_group(src FILES ${SELF_TEMP_SRC_FILES})
list(APPEND NIM_CORE_SOURCES ${SELF_TEMP_SRC_FILES})
FILE(GLOB SELF_TEMP_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/common/*.cpp src/common/*.h)
source_group(src/common FILES ${SELF_TEMP_SRC_FILES})
list(APPEND NIM_CORE_SOURCES ${SELF_TEMP_SRC_FILES})
FILE(GLOB SELF_TEMP_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/common/services/*.cpp src/common/services/*.h)
source_group(src/common/services FILES ${SELF_TEMP_SRC_FILES})
list(APPEND NIM_CORE_SOURCES ${SELF_TEMP_SRC_FILES})
FILE(GLOB SELF_TEMP_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/common/utils/*.cpp src/common/utils/*.h src/common/utils/*.hpp)
source_group(src/common/utils FILES ${SELF_TEMP_SRC_FILES})
list(APPEND NIM_CORE_SOURCES ${SELF_TEMP_SRC_FILES})
FILE(GLOB SELF_TEMP_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/utils/*.cpp src/utils/*.h)
source_group(src/utils FILES ${SELF_TEMP_SRC_FILES})
list(APPEND NIM_CORE_SOURCES ${SELF_TEMP_SRC_FILES})
FILE(GLOB SELF_TEMP_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/utils/dump/*.cpp src/utils/dump/*.h)
source_group(src/utils/dump FILES ${SELF_TEMP_SRC_FILES})
list(APPEND NIM_CORE_SOURCES ${SELF_TEMP_SRC_FILES})
# Any new source files that you add to the plugin should be added here.
list(APPEND PLUGIN_SOURCES
${CMAKE_CURRENT_LIST_DIR}/flutter_openim_sdk_plugin.cpp
)
add_library(${PLUGIN_NAME} SHARED
${PLUGIN_SOURCES}
${NIM_CORE_SOURCES}
)
target_precompile_headers(${PLUGIN_NAME} PRIVATE ${PCH_HEADER_FILE})
target_link_libraries(${PLUGIN_NAME} PRIVATE yx_alog)
# Apply a standard set of build settings that are configured in the
# application-level CMakeLists.txt. This can be removed for plugins that want
# full control over build settings.
apply_standard_settings(${PLUGIN_NAME})
# Symbols are hidden by default to reduce the chance of accidental conflicts
# between plugins. This should not be removed; any symbols that should be
# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro.
set_target_properties(${PLUGIN_NAME} PROPERTIES
CXX_VISIBILITY_PRESET hidden)
target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL)
target_compile_options(${PLUGIN_NAME} PRIVATE /W4 /WX- /wd4100 /wd4267 /wd4189 /wd4244 /wd4996 /bigobj /utf-8)
target_include_directories(${PLUGIN_NAME} PUBLIC
"${CMAKE_CURRENT_LIST_DIR}/include"
"${CMAKE_CURRENT_LIST_DIR}/"
"${CMAKE_CURRENT_LIST_DIR}/openlib/x64/include"
)
target_link_libraries(${PLUGIN_NAME} PRIVATE
flutter
flutter_wrapper_plugin
${CMAKE_CURRENT_LIST_DIR}/openlib/x64/libopenimsdk.lib
)
file(GLOB flutter_openim_sdk_bundled_libraries
"${CMAKE_CURRENT_LIST_DIR}/openlib/x64/*.dll"
)
file(GLOB LIBRARY_FILES "${CMAKE_CURRENT_LIST_DIR}/openlib/x64/*")
foreach(LIB_FILE ${LIBRARY_FILES})
if(LIB_FILE MATCHES "cacert\.pem")
# 添加库文件路径到变量
list(APPEND flutter_openim_sdk_bundled_libraries ${LIB_FILE})
endif()
endforeach()
set(flutter_openim_sdk_bundled_libraries ${flutter_openim_sdk_bundled_libraries} PARENT_SCOPE)
#install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/openlib/libopenimsdk.dll
# DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
#)

View File

@@ -1,110 +0,0 @@
#include "include/flutter_openim_sdk/flutter_openim_sdk_plugin.h"
// This must be included before many other Windows headers.
#include <windows.h>
// For getPlatformVersion; remove unless needed for your plugin implementation.
#include <VersionHelpers.h>
#include <flutter/method_channel.h>
#include <flutter/plugin_registrar_windows.h>
#include <flutter/standard_method_codec.h>
#include <memory>
#include <sstream>
#include "src/MethodCallHandlerImpl.h"
#include "src/common/stable.h"
#include "src/common/ThreadUtil.h"
class FlutterOpenimSdkPlugin : public flutter::Plugin {
public:
static void RegisterWithRegistrar(flutter::PluginRegistrarWindows *registrar);
FlutterOpenimSdkPlugin();
virtual ~FlutterOpenimSdkPlugin();
// Disallow copy and assign.
FlutterOpenimSdkPlugin(const FlutterOpenimSdkPlugin &) = delete;
FlutterOpenimSdkPlugin &operator=(const FlutterOpenimSdkPlugin &) = delete;
// Called when a method is called on this plugin's channel from Dart.
void HandleMethodCall(
const flutter::MethodCall <flutter::EncodableValue> &method_call,
std::unique_ptr <flutter::MethodResult<flutter::EncodableValue>> result);
public:
std::unique_ptr<MethodCallHandlerImpl> m_channel;
};
//std::string ws2s(const std::wstring& wstr) {
// using convert_typeX = std::codecvt_utf8<wchar_t>;
// std::wstring_convert<convert_typeX, wchar_t> converterX;
// return converterX.to_bytes(wstr);
//}
// static
void FlutterOpenimSdkPlugin::RegisterWithRegistrar(
flutter::PluginRegistrarWindows *registrar) {
//std::string filePath = ws2s(_wgetenv(L"LOCALAPPDATA"));
std::string filePath = std::getenv("LOCALAPPDATA");
std::string filePathApp;
if (!filePath.empty()) {
filePath.append("/OpenIM/OpenimPlugin");
} else {
std::cout << "log filePath empty!" << std::endl;
}
filePathApp = filePath;
filePathApp.append("/app");
std::cout << "log filePath: " << filePathApp.c_str() << std::endl;
ALog::CreateInstance(filePathApp, "nim_core_plugin", Info);
ALog::GetInstance()->setShortFileName(true);
YXLOG(Info) << "===================start===================" << YXLOGEnd;
YXLOG_API(Info) << "RegisterWithRegistrar, logPath: " << filePathApp
<< YXLOGEnd;
//InitDumpInfo("");
NimCore::getInstance()->setLogDir(filePath);
// Initialize ThreadUtil to capture the platform thread ID
// This is called on the platform thread already, so it will initialize correctly
ThreadUtil::InitializePlatformThreadId();
YXLOG_API(Info) << "ThreadUtil initialized on platform thread" << YXLOGEnd;
auto plugin = std::make_unique<FlutterOpenimSdkPlugin>();
auto channel = plugin->m_channel->startListening(registrar);
channel->SetMethodCallHandler(
[plugin_pointer = plugin.get()](const auto &call, auto result) {
plugin_pointer->HandleMethodCall(call, std::move(result));
});
registrar->AddPlugin(std::move(plugin));
}
FlutterOpenimSdkPlugin::FlutterOpenimSdkPlugin() {
m_channel = std::make_unique<MethodCallHandlerImpl>();
}
FlutterOpenimSdkPlugin::~FlutterOpenimSdkPlugin() {
m_channel.reset(nullptr);
}
void FlutterOpenimSdkPlugin::HandleMethodCall(
const flutter::MethodCall <flutter::EncodableValue> &method_call,
std::unique_ptr <flutter::MethodResult<flutter::EncodableValue>> result) {
m_channel->onMethodCall(method_call, std::move(result));
}
void FlutterOpenimSdkPluginRegisterWithRegistrar(FlutterDesktopPluginRegistrarRef registrar) {
FlutterOpenimSdkPlugin::RegisterWithRegistrar(
flutter::PluginRegistrarManager::GetInstance()
->GetRegistrar<flutter::PluginRegistrarWindows>(registrar));
}

View File

@@ -1,24 +0,0 @@
#ifndef FLUTTER_PLUGIN_FLUTTER_OPENIM_SDK_PLUGIN_H_
#define FLUTTER_PLUGIN_FLUTTER_OPENIM_SDK_PLUGIN_H_
#include <flutter/plugin_registrar_windows.h>
#include <flutter_plugin_registrar.h>
#ifdef FLUTTER_PLUGIN_IMPL
#define FLUTTER_PLUGIN_EXPORT __declspec(dllexport)
#else
#define FLUTTER_PLUGIN_EXPORT __declspec(dllimport)
#endif
#if defined(__cplusplus)
extern "C" {
#endif
FLUTTER_PLUGIN_EXPORT void FlutterOpenimSdkPluginRegisterWithRegistrar(
FlutterDesktopPluginRegistrarRef registrar);
#if defined(__cplusplus)
} // extern "C"
#endif
#endif // FLUTTER_PLUGIN_FLUTTER_OPENIM_SDK_PLUGIN_H_

View File

@@ -1,46 +0,0 @@
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
// Use of this source code is governed by a MIT license that can be
// found in the LICENSE file.
#include "FLTConvert.h"
Convert::Convert() {}
std::string Convert::getStringFormMapForLog(
const flutter::EncodableMap* arguments) const {
if (!arguments) {
return "";
}
// todo
return "";
}
void Convert::getLogList(const std::string& strLog,
std::list<std::string>& listLog) const {
listLog.clear();
int num = 15 * 1024; // 分割定长大小
int len = strLog.length(); // 字符串长度
int end = num;
for (int start = 0; start < len;) {
if (end > len) // 针对最后一个分割串
{
listLog.emplace_back(
strLog.substr(start, len - start)); // 最后一个字符串的原始部分
break;
}
listLog.emplace_back(
strLog.substr(start, num)); // 从0开始分割num位字符串
start = end;
end = end + num;
}
}
std::string Convert::getStringFormListForLog(
const flutter::EncodableList* arguments) const {
if (!arguments) {
return "";
}
return "";
}

View File

@@ -1,29 +0,0 @@
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
// Use of this source code is governed by a MIT license that can be
// found in the LICENSE file.
#ifndef FLTCONVERT_H
#define FLTCONVERT_H
#include <string>
#include <unordered_map>
#include "common/FLTService.h"
#include "common/utils/singleton.h"
class Convert {
public:
SINGLETONG(Convert)
std::string getStringFormMapForLog(
const flutter::EncodableMap* arguments) const;
void getLogList(const std::string& strLog,
std::list<std::string>& listLog) const;
std::string getStringFormListForLog(
const flutter::EncodableList* arguments) const;
private:
Convert();
};
#endif // FLTCONVERT_H

View File

@@ -1,45 +0,0 @@
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
// Use of this source code is governed by a MIT license that can be
// found in the LICENSE file.
#include "MethodCallHandlerImpl.h"
#include <flutter/method_channel.h>
#include <flutter/plugin_registrar_windows.h>
#include <flutter/standard_method_codec.h>
#include <memory>
#include "NimCore.h"
MethodCallHandlerImpl::MethodCallHandlerImpl() {}
void MethodCallHandlerImpl::onMethodCall(
const flutter::MethodCall <flutter::EncodableValue> &method_call,
std::shared_ptr <flutter::MethodResult<flutter::EncodableValue>> result) {
const auto *arguments =
std::get_if<flutter::EncodableMap>(method_call.arguments());
if (arguments) {
NimCore::getInstance()->onMethodCall(method_call.method_name(), arguments,
result);
} else {
if (result) {
result->NotImplemented();
}
}
}
flutter::MethodChannel <flutter::EncodableValue> *
MethodCallHandlerImpl::startListening(flutter::PluginRegistrar *registrar) {
m_methodChannel =
std::make_unique < flutter::MethodChannel < flutter::EncodableValue >> (
registrar->messenger(), "flutter_openim_sdk",
&flutter::StandardMethodCodec::GetInstance());
NimCore::getInstance()->setMethodChannel(m_methodChannel.get());
return m_methodChannel.get();
}
void MethodCallHandlerImpl::stopListening() {
NimCore::getInstance()->setMethodChannel(nullptr);
}

View File

@@ -1,34 +0,0 @@
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
// Use of this source code is governed by a MIT license that can be
// found in the LICENSE file.
#ifndef METHODCALLHANDLERIMPL_H
#define METHODCALLHANDLERIMPL_H
#include <flutter/method_channel.h>
#include <flutter/plugin_registrar_windows.h>
#include <flutter/standard_method_codec.h>
#include <memory>
#include "NimCore.h"
class MethodCallHandlerImpl {
public:
MethodCallHandlerImpl();
void onMethodCall(
const flutter::MethodCall<flutter::EncodableValue>& method_call,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
flutter::MethodChannel<flutter::EncodableValue>* startListening(
flutter::PluginRegistrar* registrar);
void stopListening();
private:
std::unique_ptr<flutter::MethodChannel<flutter::EncodableValue>>
m_methodChannel;
};
#endif // METHODCALLHANDLERIMPL_H

View File

@@ -1,272 +0,0 @@
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
// Use of this source code is governed by a MIT license that can be
// found in the LICENSE file.
#include "NimCore.h"
#include <flutter/encodable_value.h>
#include <flutter/method_channel.h>
#include <flutter/plugin_registrar_windows.h>
#include <flutter/standard_method_codec.h>
#include "FLTConvert.h"
#include "common/ThreadUtil.h"
#include "common/services/IMManager.h"
#include "common/services/UserManager.h"
#include "common/services/FriendManager.h"
#include "common/services/MessageManager.h"
#include "common/services/GroupManager.h"
#include "common/services/ChannelManager.h"
#include "common/services/ConversationManager.h"
#include "common/stable.h"
const std::string kFLTNimCoreService = "serviceName";
NimCore::NimCore() { regService(); }
NimCore::~NimCore() {}
void NimCore::regService() {
addService(new IMManagerService());
addService(new UserManagerService());
addService(new FriendshipManagerService());
addService(new MessageManagerService());
addService(new GroupManagerService());
addService(new ChannelManagerService());
addService(new ConversationManagerService());
}
void NimCore::cleanService() {
// m_services.clear();
}
void NimCore::addService(FLTService* service) {
m_services[service->getServiceName()] = service;
}
// FLTMessageService* NimCore::getFLTMessageService() const {
// return dynamic_cast<FLTMessageService*>(getService("MessageService"));
// }
FLTService* NimCore::getService(const std::string& serviceName) const {
auto service = m_services.find(serviceName);
if (m_services.end() == service) {
return nullptr;
}
return service->second;
}
void NimCore::onMethodCall(
const std::string& method, const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (nullptr == arguments) {
if (result) {
result->NotImplemented();
}
return;
}
auto serviceName_iter =
arguments->find(flutter::EncodableValue("ManagerName"));
if (serviceName_iter != arguments->end() &&
!serviceName_iter->second.IsNull()) {
std::string serviceName = std::get<std::string>(serviceName_iter->second);
auto* service = getService(serviceName);
if (service) {
std::shared_ptr<MockMethodResult> mockResult =
std::make_shared<MockMethodResult>(serviceName, method, result);
YXLOG_API(Info) << "mn: " << method << ", args: "
<< Convert::getInstance()->getStringFormMapForLog(
arguments)
<< YXLOGEnd;
service->onMethodCalled(method, arguments, mockResult);
return;
}
} else {
YXLOG_API(Warn) << "sn not found, mn: " << method << YXLOGEnd;
}
if (result) {
result->NotImplemented();
}
}
void NimCore::invokeMethod(const std::string& method,
const flutter::EncodableMap& arguments) {
if (m_channel) {
// Use ThreadUtil to ensure we're on the platform thread
ThreadUtil::InvokeMethodOnPlatformThread(
m_channel, method, std::make_unique<flutter::EncodableValue>(arguments));
}
}
template <typename T>
class InterResult : public flutter::MethodResult<T> {
protected:
void SuccessInternal(const T* result) override {
if (result != nullptr) {
NimCore::getInstance()->invokeCallback(flutter::EncodableValue(*result));
} else {
NimCore::getInstance()->invokeCallback(std::nullopt);
}
}
// Implementation of the public interface, to be provided by subclasses.
void ErrorInternal(const std::string& error_code,
const std::string& error_message,
const T* error_details) override {}
// Implementation of the public interface, to be provided by subclasses.
void NotImplementedInternal() override {}
};
void NimCore::invokeMethod(const std::string& eventName,
const flutter::EncodableMap& arguments,
const InvokeMehtodCallback& callback) {
invokeCallback = callback;
if (m_channel) {
// Create shared pointers for the data to ensure copy constructibility
auto eventNameCopy = std::make_shared<std::string>(eventName);
auto argsCopy = std::make_shared<flutter::EncodableMap>(arguments);
// Use ThreadUtil to ensure we're on the platform thread
ThreadUtil::RunOnPlatformThread([this, eventNameCopy, argsCopy]() {
m_channel->InvokeMethod(
*eventNameCopy, std::make_unique<flutter::EncodableValue>(*argsCopy),
std::make_unique<InterResult<flutter::EncodableValue>>());
});
}
}
void NimCore::setMethodChannel(NimMethodChannel* channel) {
m_channel = channel;
}
NimCore::NimMethodChannel* NimCore::getMethodChannel() { return m_channel; }
void NimCore::setAppkey(const std::string& appkey) { m_appKey = appkey; }
std::string NimCore::getAppkey() const { return m_appKey; }
void NimCore::setLogDir(const std::string& logDir) { m_logDir = logDir; }
std::string NimCore::getLogDir() const { return m_logDir; }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MockMethodResult::MockMethodResult(
const std::string serviceName, const std::string methodName,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
: m_serviceName(serviceName),
m_methodName(methodName),
m_result(std::move(result)) {}
void MockMethodResult::ErrorInternal(const std::string& error_code,
const std::string& error_message,
const flutter::EncodableValue* details) {
YXLOG_API(Warn) << "cb error, sn: " << m_serviceName
<< ", mn: " << m_methodName << ", error_code: " << error_code
<< ", error_msg: " << error_message
<< ", details: " << getStringFormEncodableValue(details)
<< YXLOGEnd;
if (m_result) m_result->Success(*details);
// //失败情况下, 也调用success接口避免dart层抛出异常
// m_result->Error(error_code, error_message, *details);
}
void MockMethodResult::NotImplementedInternal() {
YXLOG_API(Warn) << "cb notImplemented, sn: " << m_serviceName
<< ", mn: " << m_methodName << YXLOGEnd;
if (m_result) m_result->NotImplemented();
}
void MockMethodResult::SuccessInternal(const flutter::EncodableValue* result) {
std::string strLog;
strLog.append("cb succ, sn: ")
.append(m_serviceName)
.append(", mn: ")
.append(m_methodName)
.append(", result: ")
.append(getStringFormEncodableValue(result));
std::list<std::string> logList;
Convert::getInstance()->getLogList(strLog, logList);
for (auto& it : logList) {
YXLOG_API(Info) << it << YXLOGEnd;
}
if (m_result) m_result->Success(*result);
}
std::string MockMethodResult::getStringFormEncodableValue(
const flutter::EncodableValue* value) const {
if (!value) {
return "";
}
std::string result;
if (auto it = std::get_if<bool>(value); it) {
result = *it ? "true" : "false";
} else if (auto it1 = std::get_if<int32_t>(value); it1) {
result = std::to_string(*it1);
} else if (auto it2 = std::get_if<int64_t>(value); it2) {
result = std::to_string(*it2);
} else if (auto it3 = std::get_if<double>(value); it3) {
result = std::to_string(*it3);
} else if (auto it4 = std::get_if<std::string>(value); it4) {
result = *it4;
} else if (auto it5 = std::get_if<std::vector<uint8_t>>(value); it5) {
result.append("[");
bool bFirst = true;
for (auto& it5Tmp : *it5) {
if (!bFirst) {
result.append("");
}
result.append(std::to_string(it5Tmp));
bFirst = false;
}
result.append("]");
} else if (auto it6 = std::get_if<std::vector<int32_t>>(value); it6) {
result.append("[");
bool bFirst = true;
for (auto& it6Tmp : *it6) {
if (!bFirst) {
result.append("");
}
result.append(std::to_string(it6Tmp));
bFirst = false;
}
result.append("]");
} else if (auto it7 = std::get_if<std::vector<int64_t>>(value); it7) {
result.append("[");
bool bFirst = true;
for (auto& it7Tmp : *it7) {
if (!bFirst) {
result.append("");
}
result.append(std::to_string(it7Tmp));
bFirst = false;
}
result.append("]");
} else if (auto it8 = std::get_if<std::vector<double>>(value); it8) {
result.append("[");
bool bFirst = true;
for (auto& it8Tmp : *it8) {
if (!bFirst) {
result.append("");
}
result.append(std::to_string(it8Tmp));
bFirst = false;
}
result.append("]");
} else if (auto it9 = std::get_if<EncodableList>(value); it9) {
result = Convert::getInstance()->getStringFormListForLog(it9);
} else if (auto it10 = std::get_if<EncodableMap>(value); it10) {
result = Convert::getInstance()->getStringFormMapForLog(it10);
} else {
// wjzh
}
return result;
}

View File

@@ -1,105 +0,0 @@
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
// Use of this source code is governed by a MIT license that can be
// found in the LICENSE file.
#ifndef NIMCORE_H
#define NIMCORE_H
#include <flutter/encodable_value.h>
#include <flutter/method_channel.h>
#include <flutter/plugin_registrar_windows.h>
#include <flutter/standard_method_codec.h>
class FLTService;
class FLTAuthService;
class FLTMessageService;
class NimCore {
public:
using NimMethodChannel = flutter::MethodChannel<flutter::EncodableValue>;
public:
SINGLETONG(NimCore)
private:
NimCore();
~NimCore();
public:
using InvokeMehtodCallback =
std::function<void(const std::optional <flutter::EncodableValue> &)>;
InvokeMehtodCallback invokeCallback;
void regService();
void cleanService();
void addService(FLTService *service);
// FLTAuthService* getFLTAuthService() const;
// FLTMessageService* getFLTMessageService() const;
FLTService *getService(const std::string &serviceName) const;
void onMethodCall(
const std::string &method, const flutter::EncodableMap *arguments,
std::shared_ptr <flutter::MethodResult<flutter::EncodableValue>> result);
void invokeMethod(const std::string &method,
const flutter::EncodableMap &arguments);
void invokeMethod(const std::string &eventName,
const flutter::EncodableMap &arguments,
const InvokeMehtodCallback &callback);
void setMethodChannel(NimMethodChannel *channel);
NimMethodChannel *getMethodChannel();
public:
void setAppkey(const std::string &appkey);
std::string getAppkey() const;
void setLogDir(const std::string &logDir);
std::string getLogDir() const;
std::string getAccountId() const;
private:
std::unordered_map<std::string, FLTService *> m_services;
NimMethodChannel *m_channel = nullptr;
std::string m_appKey = "";
std::string m_logDir;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class MockMethodResult : public flutter::MethodResult<> {
public:
MockMethodResult(
const std::string serviceName, const std::string methodName,
std::shared_ptr <flutter::MethodResult<flutter::EncodableValue>> result);
virtual void ErrorInternal(const std::string &error_code,
const std::string &error_message,
const flutter::EncodableValue *details) override;
virtual void NotImplementedInternal() override;
virtual void SuccessInternal(const flutter::EncodableValue *result) override;
private:
std::string getStringFormEncodableValue(
const flutter::EncodableValue *value) const;
private:
std::string m_serviceName;
std::string m_methodName;
std::shared_ptr <flutter::MethodResult<flutter::EncodableValue>> m_result;
};
#endif // NIMCORE

View File

@@ -1,82 +0,0 @@
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
// Use of this source code is governed by a MIT license that can be
// found in the LICENSE file.
#include "FLTService.h"
#include "../FLTConvert.h"
#include "ThreadUtil.h"
std::string FLTService::getServiceName() const { return m_serviceName; }
void notifyEvent(const std::string& eventName,
flutter::EncodableMap& arguments) {
arguments.insert(std::make_pair(flutter::EncodableValue("serviceName"),
flutter::EncodableValue("")));
std::string strLog;
strLog.append("en: ")
.append(eventName)
.append(", args: ")
.append(Convert::getInstance()->getStringFormMapForLog(&arguments));
std::list<std::string> logList;
Convert::getInstance()->getLogList(strLog, logList);
for (auto& it : logList) {
YXLOG_API(Info) << it << YXLOGEnd;
}
// Create shared pointers for the data to ensure copy constructibility
auto eventNameCopy = std::make_shared<std::string>(eventName);
auto argsCopy = std::make_shared<flutter::EncodableMap>(arguments);
// Ensure we're on the platform thread
ThreadUtil::RunOnPlatformThread([eventNameCopy, argsCopy]() {
NimCore::getInstance()->invokeMethod(*eventNameCopy, *argsCopy);
YXLOG_API(Info) << "notifyEvent invoke completation." << YXLOGEnd;
});
}
//void FLTService::notifyEvent(const std::string& eventName,
// flutter::EncodableMap& arguments,
// const NimCore::InvokeMehtodCallback& callback) {
// arguments.insert(std::make_pair(flutter::EncodableValue("serviceName"),
// flutter::EncodableValue(m_serviceName)));
// std::string strLog;
// strLog.append("en: ")
// .append(eventName)
// .append(", args: ")
// .append(Convert::getInstance()->getStringFormMapForLog(&arguments));
// std::list<std::string> logList;
// Convert::getInstance()->getLogList(strLog, logList);
// for (auto& it : logList) {
// YXLOG_API(Info) << it << YXLOGEnd;
// }
// NimCore::getInstance()->invokeMethod(eventName, arguments, callback);
// YXLOG_API(Info) << "notifyEvent invoke completation." << YXLOGEnd;
//}
void FLTService::notifyEventEx(const std::string& serviceName,
const std::string& eventName,
flutter::EncodableMap& arguments) {
arguments.insert(std::make_pair(flutter::EncodableValue("serviceName"),
flutter::EncodableValue(serviceName)));
std::string strLog;
strLog.append("en: ")
.append(eventName)
.append(", args: ")
.append(Convert::getInstance()->getStringFormMapForLog(&arguments));
std::list<std::string> logList;
Convert::getInstance()->getLogList(strLog, logList);
for (auto& it : logList) {
YXLOG_API(Info) << it << YXLOGEnd;
}
// Create shared pointers for the data to ensure copy constructibility
auto eventNameCopy = std::make_shared<std::string>(eventName);
auto argsCopy = std::make_shared<flutter::EncodableMap>(arguments);
// Ensure we're on the platform thread
ThreadUtil::RunOnPlatformThread([eventNameCopy, argsCopy]() {
NimCore::getInstance()->invokeMethod(*eventNameCopy, *argsCopy);
YXLOG_API(Info) << "notifyEventEx invoke completation." << YXLOGEnd;
});
}

View File

@@ -1,46 +0,0 @@
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
// Use of this source code is governed by a MIT license that can be
// found in the LICENSE file.
#ifndef FLTSERVICE_H
#define FLTSERVICE_H
#include "../NimCore.h"
#include "NimResult.h"
#include "flutter/method_result.h"
#define DECLARE_FUN(fun) \
void fun(const flutter::EncodableMap* arguments, \
FLTService::MethodResult result);
void notifyEvent(const std::string& eventName,
flutter::EncodableMap& arguments);
class FLTService {
public:
using MethodResult =
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>>;
public:
virtual void onMethodCalled(
const std::string& method, const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>>
result) = 0;
std::string getServiceName() const;
//void notifyEvent(const std::string& eventName,
// flutter::EncodableMap& arguments,
// const NimCore::InvokeMehtodCallback& callback);
static void notifyEventEx(const std::string& serviceName,
const std::string& eventName,
flutter::EncodableMap& arguments);
protected:
std::string m_serviceName;
};
#endif // FLTSERVICE_H

View File

@@ -1,88 +0,0 @@
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
// Use of this source code is governed by a MIT license that can be
// found in the LICENSE file.
#include "NimResult.h"
using namespace flutter;
EncodableValue NimResult::getErrorResult(int code, const std::string& msg) {
EncodableMap result;
result.insert(std::make_pair(EncodableValue("code"), EncodableValue(code)));
result.insert(
std::make_pair(EncodableValue("errorDetails"), EncodableValue(msg)));
result.insert(std::make_pair(EncodableValue("data"), EncodableValue()));
return EncodableValue(result);
}
EncodableValue NimResult::getErrorResult(int code, const std::string& msg,
const EncodableMap& data) {
EncodableMap result;
result.insert(std::make_pair(EncodableValue("code"), EncodableValue(code)));
result.insert(
std::make_pair(EncodableValue("errorDetails"), EncodableValue(msg)));
result.insert(std::make_pair(EncodableValue("data"), EncodableValue(data)));
return EncodableValue(result);
}
EncodableValue NimResult::getSuccessResult() {
EncodableMap result;
result.insert(std::make_pair(EncodableValue("code"), EncodableValue(0)));
result.insert(
std::make_pair(EncodableValue("errorDetails"), EncodableValue("")));
result.insert(std::make_pair(EncodableValue("data"), EncodableValue()));
return EncodableValue(result);
}
EncodableValue NimResult::getSuccessResult(bool data) {
return getSuccessResult(EncodableValue(data));
}
EncodableValue NimResult::getSuccessResult(int32_t data) {
return getSuccessResult(EncodableValue(data));
}
EncodableValue NimResult::getSuccessResult(int64_t data) {
return getSuccessResult(EncodableValue(data));
}
EncodableValue NimResult::getSuccessResult(const std::string& data) {
return getSuccessResult(EncodableValue(data));
}
EncodableValue NimResult::getSuccessResult(const EncodableValue& data) {
EncodableMap result;
result.insert(std::make_pair(EncodableValue("code"), EncodableValue(0)));
result.insert(
std::make_pair(EncodableValue("errorDetails"), EncodableValue("")));
result.insert(std::make_pair(EncodableValue("data"), data));
return EncodableValue(result);
}
EncodableValue NimResult::getSuccessResult(const EncodableMap& data) {
EncodableMap result;
result.insert(std::make_pair(EncodableValue("code"), EncodableValue(0)));
result.insert(
std::make_pair(EncodableValue("errorDetails"), EncodableValue("")));
result.insert(std::make_pair(EncodableValue("data"), data));
return EncodableValue(result);
}
EncodableValue NimResult::getSuccessResult(const EncodableList& data) {
EncodableMap result;
result.insert(std::make_pair(EncodableValue("code"), EncodableValue(0)));
result.insert(
std::make_pair(EncodableValue("errorDetails"), EncodableValue("")));
result.insert(std::make_pair(EncodableValue("data"), data));
return EncodableValue(result);
}
EncodableValue NimResult::getSuccessResult(const std::string& msg,
const EncodableMap& data) {
EncodableMap result;
result.insert(std::make_pair(EncodableValue("code"), EncodableValue(0)));
result.insert(
std::make_pair(EncodableValue("errorDetails"), EncodableValue(msg)));
result.insert(std::make_pair(EncodableValue("data"), EncodableValue(data)));
return EncodableValue(result);
}

View File

@@ -1,34 +0,0 @@
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
// Use of this source code is governed by a MIT license that can be
// found in the LICENSE file.
#ifndef NIMRESULT_H
#define NIMRESULT_H
#include "flutter/encodable_value.h"
using namespace flutter;
class NimResult {
public:
static EncodableValue getErrorResult(int code, const std::string& msg);
static EncodableValue getErrorResult(int code, const std::string& msg,
const flutter::EncodableMap& data);
static EncodableValue getSuccessResult();
static EncodableValue getSuccessResult(bool data);
static EncodableValue getSuccessResult(int32_t data);
static EncodableValue getSuccessResult(int64_t data);
static EncodableValue getSuccessResult(const std::string& data);
static EncodableValue getSuccessResult(const flutter::EncodableValue& data);
static EncodableValue getSuccessResult(const flutter::EncodableMap& data);
static EncodableValue getSuccessResult(const flutter::EncodableList& data);
static EncodableValue getSuccessResult(const std::string& msg,
const flutter::EncodableMap& data);
};
#endif // NIMRESULT_H

View File

@@ -1,91 +0,0 @@
#include "ThreadUtil.h"
#include <windows.h>
#include <process.h>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <memory>
namespace ThreadUtil {
// Global variables for thread management
static DWORD g_platformThreadId = 0;
static std::queue<std::function<void()>> g_taskQueue;
static std::mutex g_queueMutex;
static std::condition_variable g_queueCondition;
static bool g_initialized = false;
static HANDLE g_workerThread = NULL;
// Worker thread function
unsigned __stdcall WorkerThreadProc(void* param) {
while (true) {
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(g_queueMutex);
g_queueCondition.wait(lock, [] { return !g_taskQueue.empty(); });
task = g_taskQueue.front();
g_taskQueue.pop();
}
// Execute the task
task();
}
return 0;
}
// Function to initialize the platform thread ID
void InitializePlatformThreadId() {
g_platformThreadId = GetCurrentThreadId();
// Create worker thread
g_workerThread = (HANDLE)_beginthreadex(NULL, 0, WorkerThreadProc, NULL, 0, NULL);
g_initialized = true;
}
// Function to ensure code runs on the platform thread
void RunOnPlatformThread(std::function<void()> callback) {
// Initialize on first call
if (!g_initialized) {
InitializePlatformThreadId();
}
// If we're already on the platform thread, execute directly
if (GetCurrentThreadId() == g_platformThreadId) {
callback();
return;
}
// Create a shared_ptr to the callback to ensure it's copy constructible
auto callbackPtr = std::make_shared<std::function<void()>>(std::move(callback));
// Otherwise, queue the task for execution on the platform thread
{
std::lock_guard<std::mutex> lock(g_queueMutex);
g_taskQueue.push([callbackPtr]() { (*callbackPtr)(); });
}
g_queueCondition.notify_one();
}
// Helper function to invoke method on platform thread
void InvokeMethodOnPlatformThread(
flutter::MethodChannel<flutter::EncodableValue>* channel,
const std::string& method,
std::unique_ptr<flutter::EncodableValue> arguments) {
if (!channel) return;
// Create shared pointers for the data to ensure copy constructibility
auto methodCopy = std::make_shared<std::string>(method);
auto argsCopy = std::shared_ptr<flutter::EncodableValue>(arguments.release());
RunOnPlatformThread([channel, methodCopy, argsCopy]() {
channel->InvokeMethod(
*methodCopy,
std::make_unique<flutter::EncodableValue>(*argsCopy)
);
});
}
}

View File

@@ -1,20 +0,0 @@
#pragma once
#include <functional>
#include <windows.h>
#include <flutter/method_channel.h>
#include <flutter/encodable_value.h>
namespace ThreadUtil {
// Function to initialize the platform thread ID
void InitializePlatformThreadId();
// Function to ensure code runs on the platform thread
void RunOnPlatformThread(std::function<void()> callback);
// Helper function to invoke method on platform thread
void InvokeMethodOnPlatformThread(
flutter::MethodChannel<flutter::EncodableValue>* channel,
const std::string& method,
std::unique_ptr<flutter::EncodableValue> arguments);
}

View File

@@ -1,74 +0,0 @@
#include "ZegoDataUtils.h"
bool zego_value_is_null(flutter::EncodableValue value) { return value.IsNull(); }
int32_t zego_value_get_int(flutter::EncodableValue value) {
// dart 没有 int32_t int64_t 区分,这里处理了 int32 最高位为 1负数的 case
return (int32_t)zego_value_get_long(value);
}
int64_t zego_value_get_long(flutter::EncodableValue value) { return value.LongValue(); }
bool zego_value_get_bool(flutter::EncodableValue value) { return std::get<bool>(value); }
double zego_value_get_double(flutter::EncodableValue value) { return std::get<double>(value); }
std::string zego_value_get_string(flutter::EncodableValue value) {
return std::get<std::string>(value);
}
std::vector<float> zego_value_get_vector_float(flutter::EncodableValue value) {
return std::get<std::vector<float>>(value);
}
std::vector<uint8_t> zego_value_get_vector_uint8(flutter::EncodableValue value) {
return std::get<std::vector<uint8_t>>(value);
}
ZFMap zego_value_get_map(flutter::EncodableValue value) { return std::get<ZFMap>(value); }
ZFArray zego_value_get_list(flutter::EncodableValue value) { return std::get<ZFArray>(value); }
// 将 EncodableValue 转换为 nlohmann::json
nlohmann::json EncodableValueToJson(const flutter::EncodableValue& value) {
if (std::holds_alternative<bool>(value)) {
return std::get<bool>(value);
} else if (std::holds_alternative<int32_t>(value)) {
return std::get<int32_t>(value);
} else if (std::holds_alternative<int64_t>(value)) {
return std::get<int64_t>(value);
} else if (std::holds_alternative<double>(value)) {
return std::get<double>(value);
} else if (std::holds_alternative<std::string>(value)) {
return std::get<std::string>(value);
} else if (std::holds_alternative<flutter::EncodableList>(value)) {
nlohmann::json json_array = nlohmann::json::array();
for (const auto& item : std::get<flutter::EncodableList>(value)) {
json_array.push_back(EncodableValueToJson(item));
}
return json_array;
} else if (std::holds_alternative<flutter::EncodableMap>(value)) {
nlohmann::json json_object = nlohmann::json::object();
for (const auto& pair : std::get<flutter::EncodableMap>(value)) {
std::string key = std::get<std::string>(pair.first); // 假设键是字符串
json_object[key] = EncodableValueToJson(pair.second);
}
return json_object;
}
return nullptr; // 处理空值或不支持的类型
}
// 将 EncodableMap 转换为 JSON 字符串
std::string map_2_json(const flutter::EncodableMap& map) {
nlohmann::json json_object = nlohmann::json::object();
for (const auto& pair : map) {
std::string key = std::get<std::string>(pair.first); // 假设键是字符串
json_object[key] = EncodableValueToJson(pair.second);
}
auto json_string = json_object.dump(); // 序列化为 JSON 字符串
return json_string; // 序列化为 JSON 字符串
}
std::string value_2_json(flutter::EncodableValue value){
return EncodableValueToJson(value).dump();
}

View File

@@ -1,36 +0,0 @@
#pragma once
#include <flutter/encodable_value.h>
#include <flutter/event_channel.h>
#include <memory>
#include "json.hpp"
#define ZFValue(varName) flutter::EncodableValue(varName)
#define ZFMap flutter::EncodableMap
#define ZFArray flutter::EncodableList
#define ZFArgument flutter::EncodableMap &
#define ZFResult std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>>
#define ZFEventSink std::unique_ptr<flutter::EventSink<flutter::EncodableValue>>
#define ZFMoveResult(result) std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>>(std::move(result))
#define ZFPluginRegistrar flutter::PluginRegistrarWindows
#define ZFBinaryMessenger flutter::BinaryMessenger
#define ZFTextureRegistrar flutter::TextureRegistrar
bool zego_value_is_null(flutter::EncodableValue value);
int32_t zego_value_get_int(flutter::EncodableValue value);
int64_t zego_value_get_long(flutter::EncodableValue value);
bool zego_value_get_bool(flutter::EncodableValue value);
double zego_value_get_double(flutter::EncodableValue value);
std::string zego_value_get_string(flutter::EncodableValue value);
std::vector<float> zego_value_get_vector_float(flutter::EncodableValue value);
std::vector<uint8_t> zego_value_get_vector_uint8(flutter::EncodableValue value);
ZFMap zego_value_get_map(flutter::EncodableValue value);
ZFArray zego_value_get_list(flutter::EncodableValue value);
std::string map_2_json(const flutter::EncodableMap& map);
std::string value_2_json(flutter::EncodableValue value);
nlohmann::json EncodableValueToJson(const flutter::EncodableValue& value);

File diff suppressed because it is too large Load Diff

View File

@@ -1,201 +0,0 @@
#include "ChannelManager.h"
#include <libopenimsdk.h>
#include "../NimResult.h"
#include "../ZegoDataUtils.h"
#include "ConstDefine.h"
#include "Listen.h"
ChannelManagerService::ChannelManagerService() {
m_serviceName = "channelManager";
}
void ChannelManagerService::onMethodCalled(
const std::string& method,
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (method == "setChannelListener") {
setChannelListener(arguments, result);
} else if (method == "getChannelMembersInfo") {
getChannelMembersInfo(arguments, result);
} else if (method == "getChannelMemberList") {
getChannelMemberList(arguments, result);
} else if (method == "getChannelsInfo") {
getChannelsInfo(arguments, result);
} else if (method == "joinChannel") {
joinChannel(arguments, result);
} else if (method == "quitChannel") {
quitChannel(arguments, result);
} else if (method == "changeChannelMute") {
changeChannelMute(arguments, result);
} else if (method == "changeChannelMemberMute") {
changeChannelMemberMute(arguments, result);
} else if (method == "isJoinChannel") {
isJoinChannel(arguments, result);
} else if (method == "getUsersInChannel") {
getUsersInChannel(arguments, result);
} else {
result->NotImplemented();
}
}
void ChannelManagerService::setChannelListener(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
set_channel_listener(NewChannelListenCallBack());
result->Success(flutter::EncodableValue());
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ChannelManagerService::getChannelMembersInfo(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
auto userIDList = value_2_json(arguments->at(flutter::EncodableValue("userIDList")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* channelID_cs = const_cast<char*>(channelID.c_str());
char* userIDList_cs = const_cast<char*>(userIDList.c_str());
get_specified_channel_members_info(NewBaseCallBack(result), operationID_cs, channelID_cs, userIDList_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ChannelManagerService::getChannelMemberList(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
auto filter = zego_value_get_int(arguments->at(flutter::EncodableValue("filter")));
auto offset = zego_value_get_int(arguments->at(flutter::EncodableValue("offset")));
auto count = zego_value_get_int(arguments->at(flutter::EncodableValue("count")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* channelID_cs = const_cast<char*>(channelID.c_str());
get_channel_member_list(NewBaseCallBack(result), operationID_cs, channelID_cs, filter, offset, count);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ChannelManagerService::getChannelsInfo(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto channelIDList = value_2_json(arguments->at(flutter::EncodableValue("channelIDList")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* channelIDList_cs = const_cast<char*>(channelIDList.c_str());
get_specified_channels_info(NewBaseCallBack(result), operationID_cs, channelIDList_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ChannelManagerService::joinChannel(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
auto reason = zego_value_get_string(arguments->at(flutter::EncodableValue("reason")));
auto joinSource = zego_value_get_int(arguments->at(flutter::EncodableValue("joinSource")));
auto ex = zego_value_get_string(arguments->at(flutter::EncodableValue("ex")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* channelID_cs = const_cast<char*>(channelID.c_str());
char* reason_cs = const_cast<char*>(reason.c_str());
char* ex_cs = const_cast<char*>(ex.c_str());
join_channel(NewBaseCallBack(result), operationID_cs, channelID_cs, reason_cs, joinSource, ex_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ChannelManagerService::quitChannel(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* channelID_cs = const_cast<char*>(channelID.c_str());
quit_channel(NewBaseCallBack(result), operationID_cs, channelID_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ChannelManagerService::changeChannelMute(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
// if (arguments) {
// auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
// auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
// auto mute = zego_value_get_bool(arguments->at(flutter::EncodableValue("mute")));
// char* operationID_cs = const_cast<char*>(operationID.c_str());
// char* channelID_cs = const_cast<char*>(channelID.c_str());
// change_channel_mute(NewBaseCallBack(result), operationID_cs, channelID_cs, mute);
// } else {
// result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
// }
}
void ChannelManagerService::changeChannelMemberMute(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
// if (arguments) {
// auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
// auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
// auto userID = zego_value_get_string(arguments->at(flutter::EncodableValue("userID")));
// auto seconds = zego_value_get_int(arguments->at(flutter::EncodableValue("seconds")));
// char* operationID_cs = const_cast<char*>(operationID.c_str());
// char* channelID_cs = const_cast<char*>(channelID.c_str());
// char* userID_cs = const_cast<char*>(userID.c_str());
// change_channel_member_mute(NewBaseCallBack(result), operationID_cs, channelID_cs, userID_cs, seconds);
// } else {
// result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
// }
}
void ChannelManagerService::isJoinChannel(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* channelID_cs = const_cast<char*>(channelID.c_str());
is_join_channel(NewBaseCallBack(result), operationID_cs, channelID_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ChannelManagerService::getUsersInChannel(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
auto userIDs = value_2_json(arguments->at(flutter::EncodableValue("userIDs")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* channelID_cs = const_cast<char*>(channelID.c_str());
char* userIDs_cs = const_cast<char*>(userIDs.c_str());
get_users_in_channel(NewBaseCallBack(result), operationID_cs, channelID_cs, userIDs_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}

View File

@@ -1,55 +0,0 @@
#ifndef CHANNEL_MANAGER_SERVICE_H
#define CHANNEL_MANAGER_SERVICE_H
#include "../FLTService.h"
#include "Listen.h"
#include <flutter/standard_method_codec.h>
#include <memory>
#include <string>
class ChannelManagerService : public FLTService
{
public:
ChannelManagerService();
virtual void onMethodCalled(
const std::string& method, const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
override;
// Method handlers
void setChannelListener(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
void getChannelMembersInfo(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
void getChannelMemberList(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
void getChannelsInfo(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
void joinChannel(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
void quitChannel(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
void changeChannelMute(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
void changeChannelMemberMute(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
void isJoinChannel(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
void getUsersInChannel(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
};
#endif // CHANNEL_MANAGER_SERVICE_H

View File

@@ -1,87 +0,0 @@
#ifndef CONST_DEFINE_H
#define CONST_DEFINE_H
enum class ConstDefine {
CONNECTING = 0,
CONNECT_SUCCESS,
CONNECT_FAILED,
KICKED_OFFLINE,
USER_TOKEN_EXPIRED,
JOINED_GROUP_ADDED,
JOINED_GROUP_DELETED,
GROUP_MEMBER_ADDED,
GROUP_MEMBER_DELETED,
GROUP_APPLICATION_ADDED,
GROUP_APPLICATION_DELETED,
GROUP_INFO_CHANGED,
GROUP_DISMISSED,
GROUP_MEMBER_INFO_CHANGED,
GROUP_APPLICATION_ACCEPTED,
GROUP_APPLICATION_REJECTED,
FRIEND_APPLICATION_ADDED,
FRIEND_APPLICATION_DELETED,
FRIEND_APPLICATION_ACCEPTED,
FRIEND_APPLICATION_REJECTED,
FRIEND_ADDED,
FRIEND_DELETED,
FRIEND_INFO_CHANGED,
BLACK_ADDED,
BLACK_DELETED,
SYNC_SERVER_START,
SYNC_SERVER_FINISH,
SYNC_SERVER_PROGRESS,
SYNC_SERVER_FAILED,
NEW_CONVERSATION,
CONVERSATION_CHANGED,
TOTAL_UNREAD_MESSAGE_COUNT_CHANGED,
RECV_NEW_MESSAGE,
RECV_C2C_READ_RECEIPT,
RECV_GROUP_READ_RECEIPT,
NEW_RECV_MESSAGE_REVOKED,
RECV_MESSAGE_EXTENSIONS_CHANGED,
RECV_MESSAGE_EXTENSIONS_DELETED,
RECV_MESSAGE_EXTENSIONS_ADDED,
RECV_OFFLINE_NEW_MESSAGE,
MSG_DELETED,
RECV_NEW_MESSAGES,
RECV_OFFLINE_NEW_MESSAGES,
SELF_INFO_UPDATED,
USER_STATUS_CHANGED,
RECV_CUSTOM_BUSINESS_MESSAGE,
MESSAGE_KV_INFO_CHANGED,
OPEN,
PART_SIZE,
HASH_PART_PROGRESS,
HASH_PART_COMPLETE,
UPLOAD_ID,
UPLOAD_PART_COMPLETE,
UPLOAD_COMPLETE,
COMPLETE,
CONVERSATION_USER_INPUT_STATUS_CHANGED,
RECV_ONLINE_ONLY_MESSAGE,
NEW_RECV_MESSAGE_EDIT,
USER_TOKEN_INVALID,
ON_PROGRESS,
JOINED_CHANNEL_ADDED,
JOINED_CHANNEL_DELETED,
CHANNEL_MEMBER_ADDED,
CHANNEL_MEMBER_DELETED,
CHANNEL_APPLICATION_ADDED,
CHANNEL_APPLICATION_DELETED,
CHANNEL_INFO_CHANGED,
CHANNEL_DISMISSED,
CHANNEL_MEMBER_INFO_CHANGED,
CHANNEL_APPLICATION_ACCEPTED,
CHANNEL_APPLICATION_REJECTED,
};
#endif // EVENT_TYPES_H

View File

@@ -1,341 +0,0 @@
#include "ConversationManager.h"
#include <libopenimsdk.h>
#include "../NimResult.h"
#include "../ZegoDataUtils.h"
#include "ConstDefine.h"
#include "Listen.h"
ConversationManagerService::ConversationManagerService() {
m_serviceName = "conversationManager";
}
void ConversationManagerService::onMethodCalled(
const std::string& method,
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (method == "setConversationListener") {
setConversationListener(arguments, result);
} else if (method == "getAllConversationList") {
getAllConversationList(arguments, result);
} else if (method == "getConversationListSplit") {
getConversationListSplit(arguments, result);
} else if (method == "getOneConversation") {
getOneConversation(arguments, result);
} else if (method == "getMultipleConversation") {
getMultipleConversation(arguments, result);
} else if (method == "setConversationDraft") {
setConversationDraft(arguments, result);
} else if (method == "hideConversation") {
hideConversation(arguments, result);
} else if (method == "markConversationMessageAsRead") {
markConversationMessageAsRead(arguments, result);
} else if (method == "getTotalUnreadMsgCount") {
getTotalUnreadMsgCount(arguments, result);
} else if (method == "getConversationIDBySessionType") {
getConversationIDBySessionType(arguments, result);
} else if (method == "clearConversationAndDeleteAllMsg") {
clearConversationAndDeleteAllMsg(arguments, result);
} else if (method == "deleteConversationAndDeleteAllMsg") {
deleteConversationAndDeleteAllMsg(arguments, result);
} else if (method == "getAtAllTag") {
getAtAllTag(arguments, result);
} else if (method == "hideAllConversations") {
hideAllConversations(arguments, result);
} else if (method == "searchConversation") {
searchConversation(arguments, result);
} else if (method == "changeInputStates") {
changeInputStates(arguments, result);
} else if (method == "getInputStates") {
getInputStates(arguments, result);
} else if (method == "setConversation") {
setConversation(arguments, result);
} else if (method == "searchConversations") {
searchConversations(arguments, result);
} else {
result->NotImplemented();
}
}
void ConversationManagerService::setConversationListener(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
set_conversation_listener(NewConversationListenerCallBack());
result->Success(flutter::EncodableValue());
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::getAllConversationList(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
get_all_conversation_list(NewBaseCallBack(result), operationID_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::getConversationListSplit(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto offset = zego_value_get_int(arguments->at(flutter::EncodableValue("offset")));
auto count = zego_value_get_int(arguments->at(flutter::EncodableValue("count")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
get_conversation_list_split(NewBaseCallBack(result), operationID_cs, offset, count);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::getOneConversation(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto sessionType = zego_value_get_int(arguments->at(flutter::EncodableValue("sessionType")));
auto sourceID = zego_value_get_string(arguments->at(flutter::EncodableValue("sourceID")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* sourceID_cs = const_cast<char*>(sourceID.c_str());
get_one_conversation(NewBaseCallBack(result), operationID_cs, sessionType, sourceID_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::getMultipleConversation(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto conversationIDList = value_2_json(arguments->at(flutter::EncodableValue("conversationIDList")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* conversationIDList_cs = const_cast<char*>(conversationIDList.c_str());
get_multiple_conversation(NewBaseCallBack(result), operationID_cs, conversationIDList_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::setConversationDraft(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
auto draftText = zego_value_get_string(arguments->at(flutter::EncodableValue("draftText")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
char* draftText_cs = const_cast<char*>(draftText.c_str());
set_conversation_draft(NewBaseCallBack(result), operationID_cs, conversationID_cs, draftText_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::hideConversation(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
hide_conversation(NewBaseCallBack(result), operationID_cs, conversationID_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::markConversationMessageAsRead(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
mark_conversation_message_as_read(NewBaseCallBack(result), operationID_cs, conversationID_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::getTotalUnreadMsgCount(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
get_total_unread_msg_count(NewBaseCallBack(result), operationID_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::getConversationIDBySessionType(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto sourceID = zego_value_get_string(arguments->at(flutter::EncodableValue("sourceID")));
auto sessionType = zego_value_get_int(arguments->at(flutter::EncodableValue("sessionType")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* sourceID_cs = const_cast<char*>(sourceID.c_str());
std::string conversationID = get_conversation_id_by_session_type(operationID_cs, sourceID_cs, sessionType);
result->Success(flutter::EncodableValue(conversationID));
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::clearConversationAndDeleteAllMsg(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
clear_conversation_and_delete_all_msg(NewBaseCallBack(result), operationID_cs, conversationID_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::deleteConversationAndDeleteAllMsg(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
delete_conversation_and_delete_all_msg(NewBaseCallBack(result), operationID_cs, conversationID_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::getAtAllTag(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
std::string tag = get_at_all_tag(operationID_cs);
result->Success(flutter::EncodableValue(tag));
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::hideAllConversations(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
hide_all_conversations(NewBaseCallBack(result), operationID_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::searchConversation(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto name = zego_value_get_string(arguments->at(flutter::EncodableValue("name")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* name_cs = const_cast<char*>(name.c_str());
search_conversation(NewBaseCallBack(result), operationID_cs, name_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::changeInputStates(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
auto focus = zego_value_get_bool(arguments->at(flutter::EncodableValue("focus")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
change_input_states(NewBaseCallBack(result), operationID_cs, conversationID_cs, focus);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::getInputStates(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
auto userID = zego_value_get_string(arguments->at(flutter::EncodableValue("userID")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
char* userID_cs = const_cast<char*>(userID.c_str());
get_input_states(NewBaseCallBack(result), operationID_cs, conversationID_cs, userID_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::setConversation(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
auto req = value_2_json(arguments->at(flutter::EncodableValue("req")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
char* req_cs = const_cast<char*>(req.c_str());
set_conversation(NewBaseCallBack(result), operationID_cs, conversationID_cs, req_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}
void ConversationManagerService::searchConversations(
const flutter::EncodableMap* arguments,
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (arguments) {
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
auto name = zego_value_get_string(arguments->at(flutter::EncodableValue("name")));
char* operationID_cs = const_cast<char*>(operationID.c_str());
char* name_cs = const_cast<char*>(name.c_str());
search_conversations(NewBaseCallBack(result), operationID_cs, name_cs);
} else {
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
}
}

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