diff --git a/im_flutter_sdk/CHANGELOG.md b/im_flutter_sdk/CHANGELOG.md index 88c2c04b..ad470432 100644 --- a/im_flutter_sdk/CHANGELOG.md +++ b/im_flutter_sdk/CHANGELOG.md @@ -1,3 +1,17 @@ + +## 4.14.0 + +- 安卓依赖 SDK 升级到 4.14.0; +- iOS以来 SDK 升级到 4.14.0; +- 支持 Gif 图片消息; +- 支持 群头像功能; +- 支持 消息附件鉴权,该功能需要联系商务开通,开通后必须调用 SDK 的 API 才能下载消息附件。 +- 支持 拉取漫游消息时,只拉取指定的群成员发送的消息; +- 支持 加载本地会话消息时,只加载指定群成员发送的消息; +- 支持 获取群成员信息 时包括成员加群时间; +- 修复 安卓获取自己的群成员属性时解释失败的问题; +- + ## 4.13.0+1 - 修复收到 `onAnnouncementChangedFromChatRoom` 回调时,`announcement` 为空导致的崩溃问题。 diff --git a/im_flutter_sdk/README.md b/im_flutter_sdk/README.md index dcf13a7d..7a0bdb96 100644 --- a/im_flutter_sdk/README.md +++ b/im_flutter_sdk/README.md @@ -111,7 +111,7 @@ class _MyHomePageState extends State { mainAxisSize: MainAxisSize.max, children: [ TextField( - decoration: const InputDecoration(hintText: "Enter username"), + decoration: const InputDecoration(hintText: "Enter userId"), onChanged: (username) => _username = username, ), TextField( @@ -250,14 +250,14 @@ Demo 中使用 sdk 注册环信id,在真实环境中,可以由你的后台 ```dart void _signUp() async { if (_username.isEmpty || _password.isEmpty) { - _addLogToConsole("username or password is null"); + _addLogToConsole("userId or password is null"); return; } try { _addLogToConsole("begin create account..."); await EMClient.getInstance.createAccount(_username, _password); - _addLogToConsole("create account succeed, username: $_username"); + _addLogToConsole("create account succeed, userId: $_username"); } on EMError catch (e) { _addLogToConsole( "create account failed, code: ${e.code}, desc: ${e.description}"); @@ -273,7 +273,7 @@ void _signUp() async { ```dart void _signIn() async { if (_userId.isEmpty || _password.isEmpty) { - _addLogToConsole("username or password is null"); + _addLogToConsole("userId or password is null"); return; } diff --git a/im_flutter_sdk/example/android/app/build.gradle.kts b/im_flutter_sdk/example/android/app/build.gradle.kts index 21ecea97..fa833b66 100644 --- a/im_flutter_sdk/example/android/app/build.gradle.kts +++ b/im_flutter_sdk/example/android/app/build.gradle.kts @@ -8,7 +8,8 @@ plugins { android { namespace = "com.example.example" compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion + // ndkVersion = flutter.ndkVersion + ndkVersion = "27.0.12077973" compileOptions { sourceCompatibility = JavaVersion.VERSION_11 diff --git a/im_flutter_sdk/example/android/app/proguard-rules.pro b/im_flutter_sdk/example/android/app/proguard-rules.pro new file mode 100644 index 00000000..9b59ca0a --- /dev/null +++ b/im_flutter_sdk/example/android/app/proguard-rules.pro @@ -0,0 +1,2 @@ +-keep class com.hyphenate.** {*;} +-dontwarn com.hyphenate.** diff --git a/im_flutter_sdk/example/ios/Podfile.lock b/im_flutter_sdk/example/ios/Podfile.lock index bf509e24..9cbdf286 100644 --- a/im_flutter_sdk/example/ios/Podfile.lock +++ b/im_flutter_sdk/example/ios/Podfile.lock @@ -1,11 +1,11 @@ PODS: - AgoraInfra_iOS (1.2.13) - Flutter (1.0.0) - - HyphenateChat (4.13.0): + - HyphenateChat (4.14.0): - AgoraInfra_iOS (= 1.2.13) - - im_flutter_sdk_ios (0.0.1): + - im_flutter_sdk_ios (4.14.0): - Flutter - - HyphenateChat (= 4.13.0) + - HyphenateChat (= 4.14.0) DEPENDENCIES: - Flutter (from `Flutter`) @@ -25,8 +25,8 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: AgoraInfra_iOS: 65e11a2183ab7836258768868d06058c22701b13 Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - HyphenateChat: c2ecd32ae5328c027d8e270bdbe63c0902cfc828 - im_flutter_sdk_ios: 989968246d61b7472044cd19c93ff2bb70194a10 + HyphenateChat: d80b23361c8acb051139b1d72bf51dace91780f8 + im_flutter_sdk_ios: eca95917b0dce926ca600bb0ce2b247ba170c888 PODFILE CHECKSUM: 4305caec6b40dde0ae97be1573c53de1882a07e5 diff --git a/im_flutter_sdk/example/ios/Runner.xcodeproj/project.pbxproj b/im_flutter_sdk/example/ios/Runner.xcodeproj/project.pbxproj index 04364134..4d0a657c 100644 --- a/im_flutter_sdk/example/ios/Runner.xcodeproj/project.pbxproj +++ b/im_flutter_sdk/example/ios/Runner.xcodeproj/project.pbxproj @@ -7,15 +7,15 @@ objects = { /* Begin PBXBuildFile section */ - 0C48B98CC9446265AD828C79 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D19248540D5B1AA333418786 /* Pods_Runner.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 5A80D467FBBEAF714D6B730D /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7903C97A369B7E7078E7E7A9 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 909333AD9D9762C2D34EACC7 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 744623C6D7B7EE4F6E2665D8 /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B820150341DEBEF5DB9DC70E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA93737D539BF6D6BA11D729 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,17 +44,19 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 2E25D9B056A0B5242EC9A930 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3AD51E7C6D4DB64665B521B9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 4C8462DEECBFCE467F07D5FC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 442FCC01CCA9177717C5189E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 744623C6D7B7EE4F6E2665D8 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7504A39E78D4D25B2230686E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 7810DB5FB82E21A4D4695896 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 7903C97A369B7E7078E7E7A9 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 83970F5C31E532CBB032E652 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 84FF92E6115F741F9CF5A353 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 8039096ACDACDFE408B88837 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 8C6F9A09034CD610B7478111 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -62,9 +64,7 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - AF47A5DFA9BBEA11FF071231 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - D19248540D5B1AA333418786 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DA93737D539BF6D6BA11D729 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B073DB20E418666D8231E9F9 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,7 +72,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0C48B98CC9446265AD828C79 /* Pods_Runner.framework in Frameworks */, + 5A80D467FBBEAF714D6B730D /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,42 +80,41 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B820150341DEBEF5DB9DC70E /* Pods_RunnerTests.framework in Frameworks */, + 909333AD9D9762C2D34EACC7 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 331C8082294A63A400263BE5 /* RunnerTests */ = { + 317F796DED573E876CFB2853 /* Pods */ = { isa = PBXGroup; children = ( - 331C807B294A618700263BE5 /* RunnerTests.swift */, + 8C6F9A09034CD610B7478111 /* Pods-Runner.debug.xcconfig */, + B073DB20E418666D8231E9F9 /* Pods-Runner.release.xcconfig */, + 8039096ACDACDFE408B88837 /* Pods-Runner.profile.xcconfig */, + 7810DB5FB82E21A4D4695896 /* Pods-RunnerTests.debug.xcconfig */, + 442FCC01CCA9177717C5189E /* Pods-RunnerTests.release.xcconfig */, + 3AD51E7C6D4DB64665B521B9 /* Pods-RunnerTests.profile.xcconfig */, ); - path = RunnerTests; + path = Pods; sourceTree = ""; }; - 3CB80B79A7411D91DC16F8FD /* Frameworks */ = { + 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( - D19248540D5B1AA333418786 /* Pods_Runner.framework */, - DA93737D539BF6D6BA11D729 /* Pods_RunnerTests.framework */, + 331C807B294A618700263BE5 /* RunnerTests.swift */, ); - name = Frameworks; + path = RunnerTests; sourceTree = ""; }; - 573C4E9BB301DF155B2E749D /* Pods */ = { + 89565C7B201E74E3F8F5FA8F /* Frameworks */ = { isa = PBXGroup; children = ( - AF47A5DFA9BBEA11FF071231 /* Pods-Runner.debug.xcconfig */, - 83970F5C31E532CBB032E652 /* Pods-Runner.release.xcconfig */, - 4C8462DEECBFCE467F07D5FC /* Pods-Runner.profile.xcconfig */, - 84FF92E6115F741F9CF5A353 /* Pods-RunnerTests.debug.xcconfig */, - 7504A39E78D4D25B2230686E /* Pods-RunnerTests.release.xcconfig */, - 2E25D9B056A0B5242EC9A930 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; + 7903C97A369B7E7078E7E7A9 /* Pods_Runner.framework */, + 744623C6D7B7EE4F6E2665D8 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; sourceTree = ""; }; 9740EEB11CF90186004384FC /* Flutter */ = { @@ -136,8 +135,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 573C4E9BB301DF155B2E749D /* Pods */, - 3CB80B79A7411D91DC16F8FD /* Frameworks */, + 317F796DED573E876CFB2853 /* Pods */, + 89565C7B201E74E3F8F5FA8F /* Frameworks */, ); sourceTree = ""; }; @@ -172,7 +171,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 61FD24FDAB11DBEFD20ADA68 /* [CP] Check Pods Manifest.lock */, + F29BCA785B15B9D93D56B541 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, D27C5DE0AFBA19E9E019BAE9 /* Frameworks */, @@ -191,14 +190,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - A788DE5337B3AD371C58AFB4 /* [CP] Check Pods Manifest.lock */, + 1FAA1EEED5819D4111B26CFD /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 5063D47E4027977340C7BD89 /* [CP] Embed Pods Frameworks */, + 5477663F1B35A3964E769037 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,59 +269,59 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 1FAA1EEED5819D4111B26CFD /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\"> /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\">&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\"> \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 5063D47E4027977340C7BD89 /* [CP] Embed Pods Frameworks */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + name = "Thin Binary"; + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 61FD24FDAB11DBEFD20ADA68 /* [CP] Check Pods Manifest.lock */ = { + 5477663F1B35A3964E769037 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\"> /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\">&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\"> \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 9740EEB61CF901F6004384FC /* Run Script */ = { @@ -340,7 +339,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - A788DE5337B3AD371C58AFB4 /* [CP] Check Pods Manifest.lock */ = { + F29BCA785B15B9D93D56B541 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -355,7 +354,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -471,6 +470,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = JC854K845H; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 84FF92E6115F741F9CF5A353 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 7810DB5FB82E21A4D4695896 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7504A39E78D4D25B2230686E /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 442FCC01CCA9177717C5189E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2E25D9B056A0B5242EC9A930 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 3AD51E7C6D4DB64665B521B9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -653,6 +653,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = JC854K845H; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -675,6 +676,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = JC854K845H; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( diff --git a/im_flutter_sdk/example/lib/main.dart b/im_flutter_sdk/example/lib/main.dart index 9740e8fb..683d405d 100644 --- a/im_flutter_sdk/example/lib/main.dart +++ b/im_flutter_sdk/example/lib/main.dart @@ -12,7 +12,6 @@ void main() async { EMOptions options = EMOptions.withAppKey( appKey, autoLogin: false, - extSettings: {ExtSettings.kDisableIosEnterBackground: false}, ); await EMClient.getInstance.init(options); @@ -20,7 +19,7 @@ void main() async { } class MyApp extends StatelessWidget { - const MyApp({Key? key}) : super(key: key); + const MyApp({super.key}); // This widget is the root of your application. @override @@ -67,7 +66,7 @@ class _MyHomePageState extends State { mainAxisSize: MainAxisSize.max, children: [ TextField( - decoration: const InputDecoration(hintText: "Enter username"), + decoration: const InputDecoration(hintText: "Enter userId"), onChanged: (username) => _userId = username, ), TextField( @@ -258,7 +257,7 @@ class _MyHomePageState extends State { void _signIn() async { if (_userId.isEmpty || _password.isEmpty) { - _addLogToConsole("username or password is null"); + _addLogToConsole("userId or password is null"); return; } diff --git a/im_flutter_sdk/example/pubspec.lock b/im_flutter_sdk/example/pubspec.lock index 4b003f0f..d917732e 100644 --- a/im_flutter_sdk/example/pubspec.lock +++ b/im_flutter_sdk/example/pubspec.lock @@ -83,26 +83,26 @@ packages: source: path version: "4.13.0+1" im_flutter_sdk_android: - dependency: "direct overridden" + dependency: transitive description: path: "../../im_flutter_sdk_android" relative: true source: path - version: "4.13.0+1" + version: "4.14.0" im_flutter_sdk_interface: - dependency: "direct overridden" + dependency: transitive description: path: "../../im_flutter_sdk_interface" relative: true source: path - version: "4.13.0" + version: "4.14.0" im_flutter_sdk_ios: - dependency: "direct overridden" + dependency: transitive description: path: "../../im_flutter_sdk_ios" relative: true source: path - version: "4.13.0+1" + version: "4.14.0" leak_tracker: dependency: transitive description: diff --git a/im_flutter_sdk/example/pubspec.yaml b/im_flutter_sdk/example/pubspec.yaml index ac6ea0ee..820c9215 100644 --- a/im_flutter_sdk/example/pubspec.yaml +++ b/im_flutter_sdk/example/pubspec.yaml @@ -40,16 +40,7 @@ dependencies: im_flutter_sdk: path: ../ -dependency_overrides: - # im_flutter_sdk_interface: - # path: ../../im_flutter_sdk_interface - - # im_flutter_sdk_ios: - # path: ../../im_flutter_sdk_ios - - # im_flutter_sdk_android: - # path: ../../im_flutter_sdk_android dev_dependencies: flutter_test: diff --git a/im_flutter_sdk/lib/im_flutter_sdk.dart b/im_flutter_sdk/lib/im_flutter_sdk.dart index d08fcf98..666cf546 100644 --- a/im_flutter_sdk/lib/im_flutter_sdk.dart +++ b/im_flutter_sdk/lib/im_flutter_sdk.dart @@ -74,6 +74,7 @@ export 'package:im_flutter_sdk_interface/im_flutter_sdk_interface.dart' MessagePinInfo, LoginExtensionInfo, MessageSearchOptions, + GroupMemberInfo, ChatAreaCode; export 'src/chat_manager.dart'; diff --git a/im_flutter_sdk/lib/src/group_manager.dart b/im_flutter_sdk/lib/src/group_manager.dart index a2635f77..425b6166 100644 --- a/im_flutter_sdk/lib/src/group_manager.dart +++ b/im_flutter_sdk/lib/src/group_manager.dart @@ -248,13 +248,16 @@ class EMGroupManager { /// ~end Future createGroup({ String? groupName, + String? avatar, String? desc, List? inviteMembers, String? inviteReason, - required EMGroupOptions options, + EMGroupOptions? options, }) async { + options ??= EMGroupOptions(); return Client.instance.groupManager.createGroup( groupName: groupName, + avatar: avatar, desc: desc, inviteMembers: inviteMembers, inviteReason: inviteReason, @@ -1697,4 +1700,75 @@ class EMGroupManager { Future clearAllGroupsFromLocal() async { return Client.instance.groupManager.clearAllGroupsFromLocal(); } + + /// + /// \~chinese + /// 获取群组成员列表。 + /// 这里需要注意的是: + /// - 每次调用只返回一页的数据。首次调用传空值,会从最新的第一条开始取; + /// - aPageSize 是这次接口调用期望返回的列表数据个数,如当前在最后一页,返回的数据会是 count < aPageSize; + /// - 列表页码 aPageNum 是方便服务器分页查询返回,对于数据量未知且很大的情况,分页获取,服务器会根据每次的页数和每次的pagesize 返回数据,直到返回所有数据。 + /// + /// Param [groupId] 群组 ID。 + /// Param [cursor] 游标,首次调用传空。下次传上次返回的值。 + /// Param [limit] 获取多少条。 + /// + /// ~end + /// + /// + /// \~english + /// Gets the list of group members from the server. + /// + /// Param [groupId] The group ID. + /// Param [cursor] The cursor when joins the group. Sets the parameter as nil for the first time. Next time, pass the value returned last time. + /// Param [limit ] The page size. + /// + /// ~end + /// + Future> fetchGroupMembersInfo({ + required String groupId, + String? cursor, + int limit = 20, + }) async { + return Client.instance.groupManager.fetchGroupMembersInfo( + groupId: groupId, + cursor: cursor, + limit: limit, + ); + } + + /// ~english + /// 更改群组头像 。 + /// + /// 该方法只有群主才有权限调用。 + /// + /// Param [groupId] 群组 ID。 + /// Param [avatarUrl] 新头像。 + /// + /// **Return** [EMGroup], 群组对象。 + /// **Throws** 如果有异常会在此抛出,包括错误码和错误信息,详见 [EMError]。 + /// + /// ~english + /// Changes the group avatar. + /// + /// Only the group owner can call this method. + /// + /// Param [groupId] The group ID. + /// Param [avatarUrl] The new avatar. + /// + /// **Return** [EMGroup] + /// **Throws** A description of the exception. See [EMError]. + /// + /// ~end + /// + + Future updateGroupAvatar({ + required String groupId, + required String avatarUrl, + }) async { + return Client.instance.groupManager.updateGroupAvatar( + groupId: groupId, + avatarUrl: avatarUrl, + ); + } } diff --git a/im_flutter_sdk/pubspec.yaml b/im_flutter_sdk/pubspec.yaml index e07d125c..e64a0a5c 100644 --- a/im_flutter_sdk/pubspec.yaml +++ b/im_flutter_sdk/pubspec.yaml @@ -11,12 +11,14 @@ dependencies: flutter: sdk: flutter - im_flutter_sdk_interface: ^4.13.0+1 + im_flutter_sdk_interface: + path: ../im_flutter_sdk_interface - im_flutter_sdk_ios: ^4.13.0+1 - - im_flutter_sdk_android: ^4.13.0+1 + im_flutter_sdk_ios: + path: ../im_flutter_sdk_ios + im_flutter_sdk_android: + path: ../im_flutter_sdk_android dev_dependencies: flutter_lints: ^4.0.0 diff --git a/im_flutter_sdk_android/android/build.gradle b/im_flutter_sdk_android/android/build.gradle index 520be5da..5c31eb97 100644 --- a/im_flutter_sdk_android/android/build.gradle +++ b/im_flutter_sdk_android/android/build.gradle @@ -47,6 +47,6 @@ tasks.withType(JavaCompile){ dependencies { api 'androidx.appcompat:appcompat:1.1.0' // implementation 'cn.shengwang:chat-sdk:1.3.2' - implementation 'io.hyphenate:hyphenate-chat:4.13.0' + implementation 'io.hyphenate:hyphenate-chat:4.14.0' implementation fileTree(dir: 'libs', include: ['*.jar']) } diff --git a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ChatManagerWrapper.java b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ChatManagerWrapper.java index 5af0e5de..4b7dd7da 100644 --- a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ChatManagerWrapper.java +++ b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ChatManagerWrapper.java @@ -266,7 +266,7 @@ public void onError(int code, String desc) { } private void ackMessageRead(JSONObject params, String channelName, Result result) throws JSONException { - String msgId = params.getString("msg_id"); + String msgId = params.getString("msgId"); String to = params.getString("to"); asyncRunnable(() -> { @@ -280,7 +280,7 @@ private void ackMessageRead(JSONObject params, String channelName, Result result } private void ackGroupMessageRead(JSONObject params, String channelName, Result result) throws JSONException { - String msgId = params.getString("msg_id"); + String msgId = params.getString("msgId"); String to = params.getString("group_id"); String content = null; if(params.has("content")) { @@ -310,7 +310,7 @@ private void ackConversationRead(JSONObject params, String channelName, Result r } private void recallMessage(JSONObject params, String channelName, Result result) throws JSONException { - String msgId = params.getString("msg_id"); + String msgId = params.getString("msgId"); String ext; if (params.has("ext")) { ext = params.getString("ext"); @@ -333,7 +333,7 @@ private void recallMessage(JSONObject params, String channelName, Result result) } private void getMessage(JSONObject params, String channelName, Result result) throws JSONException { - String msgId = params.getString("msg_id"); + String msgId = params.getString("msgId"); asyncRunnable(() -> { EMMessage msg = EMClient.getInstance().chatManager().getMessage(msgId); @@ -838,7 +838,7 @@ private void searchChatMsgFromDB(JSONObject params, String channelName, Result r private void asyncFetchGroupMessageAckFromServer(JSONObject params, String channelName, Result result) throws JSONException { - String msgId = params.getString("msg_id"); + String msgId = params.getString("msgId"); String ackId = null; if (params.has("ack_id")){ ackId = params.getString("ack_id"); @@ -858,7 +858,7 @@ public void onSuccess(EMCursorResult result) { private void deleteRemoteConversation(JSONObject params, String channelName, Result result) throws JSONException { - String conversationId = params.getString("conversationId"); + String conversationId = params.getString("convId"); EMConversationType type = EnumTools.conversationTypeFromInt(params.getInt("conversationType")); boolean isDeleteRemoteMessage = params.getBoolean("isDeleteRemoteMessage"); EMClient.getInstance().chatManager().deleteConversationFromServer(conversationId, type, isDeleteRemoteMessage, new EMWrapperCallBack(result, channelName, null)); @@ -1225,8 +1225,8 @@ public void onMessageContentChanged(EMMessage messageModified, String operatorId @Override public void onMessagePinChanged(String messageId, String conversationId, EMMessagePinInfo.PinOperation pinOperation, EMMessagePinInfo pinInfo) { Map map = new HashMap(); - map.put("messageId", messageId); - map.put("conversationId", conversationId); + map.put("msgId", messageId); + map.put("convId", conversationId); map.put("pinOperation", pinOperation.ordinal()); map.put("pinInfo", MessagePinInfoHelper.toJson(pinInfo)); post(() -> channel.invokeMethod(MethodKey.onMessagePinChanged, map)); diff --git a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ChatThreadManagerWrapper.java b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ChatThreadManagerWrapper.java index 5cbf6f33..3a5988c8 100644 --- a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ChatThreadManagerWrapper.java +++ b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ChatThreadManagerWrapper.java @@ -171,7 +171,7 @@ private void updateChatThreadSubject(JSONObject param, String channelName, Metho } private void createChatThread(JSONObject param, String channelName, MethodChannel.Result result) throws JSONException { - String messageId = param.getString("messageId"); + String messageId = param.getString("msgId"); String name = param.getString("name"); String parentId = param.getString("parentId"); EMClient.getInstance().chatThreadManager().createChatThread(parentId, messageId, name, new EMValueWrapperCallBack(result, channelName){ diff --git a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ClientWrapper.java b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ClientWrapper.java index d160524d..f988ff9c 100644 --- a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ClientWrapper.java +++ b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ClientWrapper.java @@ -179,7 +179,7 @@ else if (MethodKey.changeAppId.equals(call.method)) { private void createAccount(JSONObject param, String channelName, Result result) throws JSONException { - String username = param.getString("username"); + String username = param.getString("userId"); String password = param.getString("password"); asyncRunnable(()->{ try { @@ -193,7 +193,7 @@ private void createAccount(JSONObject param, String channelName, Result result) private void login(JSONObject param, String channelName, Result result) throws JSONException { boolean isPwd = param.getBoolean("isPassword"); - String username = param.getString("username"); + String username = param.getString("userId"); String pwdOrToken = param.getString("pwdOrToken"); EMWrapperCallBack callBack = new EMWrapperCallBack(result, channelName, null) { @Override @@ -243,7 +243,7 @@ private void getCurrentUser(JSONObject param, String channelName, Result result) private void loginWithAgoraToken(JSONObject param, String channelName, Result result) throws JSONException { - String username = param.getString("username"); + String username = param.getString("userId"); String agoraToken = param.getString("agora_token"); EMWrapperCallBack callBack = new EMWrapperCallBack(result, channelName, null) { @Override @@ -265,7 +265,7 @@ private void getToken(JSONObject param, String channelName, Result result) throw private void isLoggedInBefore(JSONObject param, String channelName, Result result) throws JSONException { asyncRunnable(()->{ EMOptions emOptions = EMClient.getInstance().getOptions(); - onSuccess(result, channelName, EMClient.getInstance().isLoggedInBefore() && emOptions.getAutoLogin()); + onSuccess(result, channelName, EMClient.getInstance().isLoggedInBefore() && emOptions.getAutoLogin() || EMClient.getInstance().isLoggedIn()); }); } @@ -290,7 +290,7 @@ private void compressLogs(JSONObject param, String channelName, Result result) t private void kickDevice(JSONObject param, String channelName, Result result) throws JSONException { - String username = param.getString("username"); + String username = param.getString("userId"); String password = param.getString("password"); String resource = param.getString("resource"); boolean isPwd = param.optBoolean("isPwd"); @@ -316,7 +316,7 @@ private void kickDevice(JSONObject param, String channelName, Result result) thr } private void kickAllDevices(JSONObject param, String channelName, Result result) throws JSONException { - String username = param.getString("username"); + String username = param.getString("userId"); String password = param.getString("password"); boolean isPwd = param.optBoolean("isPwd"); if (isPwd) { @@ -362,7 +362,7 @@ private void renewToken(JSONObject param, String channelName, Result result) thr } private void getLoggedInDevicesFromServer(JSONObject param, String channelName, Result result) throws JSONException { - String username = param.getString("username"); + String username = param.getString("userId"); String password = param.getString("password"); boolean isPwd = param.optBoolean("isPwd"); if (isPwd) { @@ -458,7 +458,7 @@ public void onGroupEvent(int event, String target, List userNames) { Map data = new HashMap(); data.put("event", event); data.put("target", target); - data.put("users", userNames); + data.put("userIds", userNames); post(()-> channel.invokeMethod(MethodKey.onMultiDeviceGroupEvent, data)); } @@ -466,7 +466,7 @@ public void onChatThreadEvent(int event, String target, List usernames) Map data = new HashMap(); data.put("event", event); data.put("target", target); - data.put("users", usernames); + data.put("userIds", usernames); post(()-> channel.invokeMethod(MethodKey.onMultiDeviceThreadEvent, data)); } diff --git a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ContactManagerWrapper.java b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ContactManagerWrapper.java index edd0d448..f4c7f37f 100644 --- a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ContactManagerWrapper.java +++ b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ContactManagerWrapper.java @@ -75,7 +75,7 @@ public void onMethodCall(MethodCall call, Result result) { } private void addContact(JSONObject param, String channelName, Result result) throws JSONException { - String username = param.getString("username"); + String username = param.getString("userId"); String reason = null; if(param.has("reason")) { reason = param.getString("reason"); @@ -92,7 +92,7 @@ private void addContact(JSONObject param, String channelName, Result result) thr } private void deleteContact(JSONObject param, String channelName, Result result) throws JSONException { - String username = param.getString("username"); + String username = param.getString("userId"); boolean keepConversation = param.getBoolean("keepConversation"); asyncRunnable(() -> { try { @@ -127,7 +127,7 @@ private void getAllContactsFromDB(JSONObject params, String channelName, Result } private void addUserToBlockList(JSONObject params, String channelName, Result result) throws JSONException { - String username = params.getString("username"); + String username = params.getString("userId"); asyncRunnable(() -> { try { EMClient.getInstance().contactManager().addUserToBlackList(username, false); @@ -139,7 +139,7 @@ private void addUserToBlockList(JSONObject params, String channelName, Result re } private void removeUserFromBlockList(JSONObject params, String channelName, Result result) throws JSONException { - String username = params.getString("username"); + String username = params.getString("userId"); asyncRunnable(() -> { try { EMClient.getInstance().contactManager().removeUserFromBlackList(username); @@ -169,7 +169,7 @@ private void getBlockListFromDB(JSONObject params, String channelName, Result re } private void acceptInvitation(JSONObject params, String channelName, Result result) throws JSONException { - String username = params.getString("username"); + String username = params.getString("userId"); asyncRunnable(() -> { try { EMClient.getInstance().contactManager().acceptInvitation(username); @@ -181,7 +181,7 @@ private void acceptInvitation(JSONObject params, String channelName, Result resu } private void declineInvitation(JSONObject params, String channelName, Result result) throws JSONException { - String username = params.getString("username"); + String username = params.getString("userId"); asyncRunnable(() -> { try { EMClient.getInstance().contactManager().declineInvitation(username); @@ -280,7 +280,7 @@ public void onContactAdded(String userName) { ()-> { Map data = new HashMap(); data.put("type", "onContactAdded"); - data.put("username", userName); + data.put("userId", userName); post(() -> channel.invokeMethod(MethodKey.onContactChanged, data)); } ); @@ -292,7 +292,7 @@ public void onContactDeleted(String userName) { ()-> { Map data = new HashMap(); data.put("type", "onContactDeleted"); - data.put("username", userName); + data.put("userId", userName); post(() -> channel.invokeMethod(MethodKey.onContactChanged, data)); } ); @@ -304,7 +304,7 @@ public void onContactInvited(String userName, String reason) { ()-> { Map data = new HashMap(); data.put("type", "onContactInvited"); - data.put("username", userName); + data.put("userId", userName); data.put("reason", reason); post(() -> channel.invokeMethod(MethodKey.onContactChanged, data)); } @@ -317,7 +317,7 @@ public void onFriendRequestAccepted(String userName) { ()-> { Map data = new HashMap(); data.put("type", "onFriendRequestAccepted"); - data.put("username", userName); + data.put("userId", userName); post(() -> channel.invokeMethod(MethodKey.onContactChanged, data)); } ); @@ -329,7 +329,7 @@ public void onFriendRequestDeclined(String userName) { ()-> { Map data = new HashMap(); data.put("type", "onFriendRequestDeclined"); - data.put("username", userName); + data.put("userId", userName); post(() -> channel.invokeMethod(MethodKey.onContactChanged, data)); } ); diff --git a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ConversationWrapper.java b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ConversationWrapper.java index 31f760e8..88a22a74 100644 --- a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ConversationWrapper.java +++ b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ConversationWrapper.java @@ -5,6 +5,7 @@ import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; +import com.hyphenate.EMValueCallBack; import com.hyphenate.chat.EMClient; import com.hyphenate.chat.EMConversation; import com.hyphenate.chat.EMMessage; @@ -92,9 +93,6 @@ else if (MethodKey.loadMsgWithTime.equals(call.method)) { else if(MethodKey.messageCount.equals(call.method)) { messageCount(param, call.method, result); } - else if (MethodKey.removeMsgFromServerWithMsgList.equals(call.method)) { - removeMsgFromServerWithMsgList(param, call.method, result); - } else if (MethodKey.removeMsgFromServerWithTimeStamp.equals(call.method)) { removeMsgFromServerWithTimeStamp(param, call.method, result); } @@ -144,10 +142,10 @@ private void markAllMessagesAsRead(JSONObject params, String channelName, Result private void markMessageAsRead(JSONObject params, String channelName, Result result) throws JSONException { EMConversation conversation = conversationWithParam(params); - String msg_id = params.getString("msg_id"); + String msgId = params.getString("msgId"); asyncRunnable(()->{ - conversation.markMessageAsRead(msg_id); + conversation.markMessageAsRead(msgId); onSuccess(result, channelName, true); }); } @@ -168,10 +166,10 @@ private void syncConversationExt(JSONObject params, String channelName, Result r private void removeMessage(JSONObject params, String channelName, Result result) throws JSONException { EMConversation conversation = conversationWithParam(params); - String msg_id = params.getString("msg_id"); + String msgId = params.getString("msgId"); asyncRunnable(()->{ - conversation.removeMessage(msg_id); + conversation.removeMessage(msgId); onSuccess(result, channelName, true); }); } @@ -277,7 +275,7 @@ private void updateConversationMessage(JSONObject params, String channelName, Re } private void loadMsgWithId(JSONObject params, String channelName, Result result) throws JSONException { - String msgId = params.getString("msg_id"); + String msgId = params.getString("msgId"); asyncRunnable(()->{ EMMessage msg = EMClient.getInstance().chatManager().getMessage(msgId); if(msg == null) { @@ -306,11 +304,17 @@ private void loadMsgWithStartId(JSONObject params, String channelName, Result re private void loadMsgWithKeywords(JSONObject params, String channelName, Result result) throws JSONException { EMConversation conversation = conversationWithParam(params); String keywords = params.getString("keywords"); - String sender = null; - if (params.has("from")) { - sender = params.getString("from"); + List senders; + if (params.has("senders")) { + senders = new ArrayList(); + JSONArray jsonArray = params.getJSONArray("senders"); + for (int i = 0; i < jsonArray.length(); i++) { + senders.add(jsonArray.getString(i)); + } + } else { + senders = null; } - final String name = sender; + int count = params.getInt("count"); long timestamp = params.getLong("timestamp"); EMConversation.EMSearchDirection direction = EnumTools.searchDirectionFromInt(params.getInt("direction")); @@ -320,13 +324,16 @@ private void loadMsgWithKeywords(JSONObject params, String channelName, Result r }else { scope = EMConversation.EMMessageSearchScope.ALL; } - asyncRunnable(()->{ - List msgList = conversation.searchMsgFromDB(keywords, timestamp, count, name, direction, scope); - List
    messages = new ArrayList(); - for(EMMessage msg: msgList) { - messages.add(MessageHelper.toJson(msg)); + + conversation.asyncSearchMsgFromDB(keywords, timestamp, count, senders, direction, scope, new EMValueWrapperCallBack>(result, channelName) { + @Override + public void onSuccess(List msgList) { + List
      messages = new ArrayList(); + for(EMMessage msg: msgList) { + messages.add(MessageHelper.toJson(msg)); + } + super.updateObject(messages); } - onSuccess(result, channelName, messages); }); } @@ -374,17 +381,7 @@ private void messageCount(JSONObject params, String channelName, Result result) asyncRunnable(()->{ onSuccess(result, channelName, conversation.getAllMsgCount()); }); - } - - private void removeMsgFromServerWithMsgList(JSONObject params, String channelName, Result result) throws JSONException { - JSONArray jsonAry = params.getJSONArray("msgIds"); - List msgIds = new ArrayList(); - for (int i = 0; i < jsonAry.length(); i++) { - msgIds.add((String) jsonAry.get(i)); - } - EMConversation conversation = conversationWithParam(params); - conversation.removeMessagesFromServer(msgIds, new EMWrapperCallBack(result, channelName, null)); - } + } private void removeMsgFromServerWithTimeStamp(JSONObject params, String channelName, Result result) throws JSONException { long timestamp = params.getLong("timestamp"); @@ -438,8 +435,8 @@ private void searchMsgByOptions(JSONObject params, String channelName, Result re private void getLocalMessageCount(JSONObject params, String channelName, Result result) throws JSONException { EMConversation conversation = conversationWithParam(params); - long startMs = params.optLong("startMs"); - long endMs = params.optLong("endMs"); + long startMs = params.optLong("startTs"); + long endMs = params.optLong("endTs"); int count = conversation.getAllMsgCount(startMs, endMs); asyncRunnable(()->{ onSuccess(result, channelName, count); @@ -460,7 +457,7 @@ private void deleteLocalAndServerMessages(JSONObject params, String channelName, private void deleteLocalAndServerMessagesByTime(JSONObject params, String channelName, Result result) throws JSONException { EMConversation conversation = conversationWithParam(params); - long beforeMs = params.optLong("beforeMs"); + long beforeMs = params.optLong("beforeTs"); conversation.removeMessagesFromServer(beforeMs, new EMWrapperCallBack(result, channelName,null)); } diff --git a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/EMHelper.java b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/EMHelper.java index a47c31bf..45f773c0 100644 --- a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/EMHelper.java +++ b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/EMHelper.java @@ -17,6 +17,7 @@ import com.hyphenate.chat.EMGroup; import com.hyphenate.chat.EMGroupInfo; import com.hyphenate.chat.EMGroupManager; +import com.hyphenate.chat.EMGroupMemberInfo; import com.hyphenate.chat.EMGroupOptions; import com.hyphenate.chat.EMGroupReadAck; import com.hyphenate.chat.EMImageMessageBody; @@ -181,6 +182,7 @@ static Map toJson(EMGroup group) { Map data = new HashMap(); CommonUtil.putObjectToMap(data, "groupId", group.getGroupId()); CommonUtil.putObjectToMap(data, "name", group.getGroupName()); + CommonUtil.putObjectToMap(data, "avatarUrl", group.getGroupAvatar()); CommonUtil.putObjectToMap(data, "desc", group.getDescription()); CommonUtil.putObjectToMap(data, "owner", group.getOwner()); CommonUtil.putObjectToMap(data, "announcement", group.getAnnouncement()); @@ -201,6 +203,16 @@ static Map toJson(EMGroup group) { } } +class GroupMemberInfoHelper { + static Map toJson(EMGroupMemberInfo info) { + Map data = new HashMap(); + data.put("userId", info.getMemberId()); + data.put("joinedTs", info.getJoinTime()); + data.put("role", EnumTools.groupPermissionTypeToInt(info.getRole())); + return data; + } +} + class GroupInfoHelper { static Map toJson(EMGroupInfo group) { Map data = new HashMap(); @@ -557,7 +569,7 @@ static Map toJson(EMMessage message) { data.put("status", EnumTools.messageStatusToInt(message.status())); data.put("chatType", EnumTools.chatTypeToInt(message.getChatType())); data.put("direction", EnumTools.messageDirectToInt(message.direct())); - data.put("conversationId", message.conversationId()); + data.put("convId", message.conversationId()); data.put("msgId", message.getMsgId()); data.put("hasRead", !message.isUnread()); data.put("needGroupAck", message.isNeedGroupAck()); @@ -575,7 +587,7 @@ static Map toJson(EMMessage message) { class GroupAckHelper { static MaptoJson(EMGroupReadAck ack) { Map data = new HashMap(); - data.put("msg_id", ack.getMsgId()); + data.put("msgId", ack.getMsgId()); data.put("ack_id", ack.getAckId()); data.put("from", ack.getFrom()); data.put("count", ack.getCount()); @@ -824,6 +836,9 @@ static EMImageMessageBody imageBodyFromJson(JSONObject json) throws JSONExceptio if (json.has("sendOriginalImage")){ body.setSendOriginalImage(json.getBoolean("sendOriginalImage")); } + if(json.has("isGif")) { + body.setGif(json.getBoolean("isGif")); + } if (json.has("fileStatus")){ body.setDownloadStatus(EnumTools.downloadStatusFromInt(json.getInt("fileStatus"))); @@ -848,6 +863,7 @@ static Map imageBodyToJson(EMImageMessageBody body) { data.put("sendOriginalImage", body.isSendOriginalImage()); data.put("fileSize", body.getFileSize()); data.put("type", EnumTools.messageBodyTypeToInt(Type.IMAGE)); + data.put("isGif", body.isGif()); return data; } @@ -1137,6 +1153,10 @@ static Map toJson(EMCursorResult result) { if (obj instanceof EMContact) { jsonList.add(ContactHelper.toJson((EMContact) obj)); } + + if (obj instanceof EMGroupMemberInfo) { + jsonList.add(GroupMemberInfoHelper.toJson((EMGroupMemberInfo) obj)); + } } } data.put("list", jsonList); @@ -1285,8 +1305,8 @@ static Map toJson(EMMessageReaction reaction) { class MessageReactionChangeHelper { static Map toJson(EMMessageReactionChange change) { Map data = new HashMap(); - data.put("conversationId", change.getConversionID()); - data.put("messageId", change.getMessageId()); + data.put("convId", change.getConversionID()); + data.put("msgId", change.getMessageId()); ArrayList
        > reactions = new ArrayList(); for (int i = 0; i < change.getMessageReactionList().size(); i++) { reactions.add(MessageReactionHelper.toJson(change.getMessageReactionList().get(i))); @@ -1389,7 +1409,7 @@ static Map toJson(EMSilentModeResult modeResult) { Map data = new HashMap(); data.put("expireTs", modeResult.getExpireTimestamp()); if (modeResult.getConversationId() != null) { - data.put("conversationId", modeResult.getConversationId()); + data.put("convId", modeResult.getConversationId()); } if (modeResult.getConversationType() != null) { data.put("conversationType", EnumTools.conversationTypeToInt(modeResult.getConversationType())); @@ -1418,6 +1438,17 @@ static EMFetchMessageOption fromJson(JSONObject json) throws JSONException { if (json.has("from")){ options.setFrom(json.getString("from")); } + if(json.has("senders")) { + List list = new ArrayList(); + JSONArray array = json.getJSONArray("senders"); + for (int i = 0; i < array.length(); i++) { + String sender = array.getString(i); + list.add(sender); + } + if (list.size()> 0) { + options.setFromIds(list); + } + } if (json.has("msgTypes")){ List list = new ArrayList(); JSONArray array = json.getJSONArray("msgTypes"); @@ -1496,7 +1527,7 @@ static Map toJson(EMRecallMessageInfo info) { // 4.10 if(info.getConversationId() != null) { - data.put("conversationId", info.getConversationId()); + data.put("convId", info.getConversationId()); } return data; } diff --git a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/EnumTools.java b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/EnumTools.java index 1bb672e4..a0cbfb67 100644 --- a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/EnumTools.java +++ b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/EnumTools.java @@ -67,9 +67,13 @@ static int chatRoomPermissionTypeToInt(@NonNull EMChatRoomPermissionType type) { int ret = -1; switch (type) { case none: ret = -1; + break; case member: ret = 0; + break; case admin: ret = 1; + break; case owner: ret = 2; + break; } return ret; } @@ -78,9 +82,13 @@ static int groupPermissionTypeToInt(@NonNull EMGroup.EMGroupPermissionType type) int ret = -1; switch (type) { case none: ret = -1; + break; case member: ret = 0; + break; case admin: ret = 1; + break; case owner: ret = 2; + break; } return ret; } diff --git a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/GroupManagerWrapper.java b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/GroupManagerWrapper.java index 32884167..dbdf6571 100644 --- a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/GroupManagerWrapper.java +++ b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/GroupManagerWrapper.java @@ -10,6 +10,7 @@ import com.hyphenate.chat.EMCursorResult; import com.hyphenate.chat.EMGroup; import com.hyphenate.chat.EMGroupInfo; +import com.hyphenate.chat.EMGroupMemberInfo; import com.hyphenate.chat.EMGroupOptions; import com.hyphenate.chat.EMMucSharedFile; import com.hyphenate.exceptions.HyphenateException; @@ -40,7 +41,7 @@ public class GroupManagerWrapper extends Wrapper implements MethodCallHandler { } @Override - public void onMethodCall(MethodCall call, MethodChannel.Result result) { + public void onMethodCall(MethodCall call, Result result) { JSONObject param = (JSONObject) call.arguments; try { @@ -151,6 +152,13 @@ else if (MethodKey.clearAllGroupsFromDB.equals(call.method)) { else if (MethodKey.isMemberInGroupMuteList.equals(call.method)) { isMemberInGroupMuteList(param, call.method, result); } + // 4.14.0 + else if (MethodKey.fetchGroupMembersInfo.equals(call.method)) { + fetchGroupMembersInfo(param, call.method, result); + } + else if (MethodKey.updateGroupAvatar.equals(call.method)) { + updateGroupAvatar(param, call.method, result); + } else { super.onMethodCall(call, result); } @@ -245,6 +253,11 @@ private void createGroup(JSONObject param, String channelName, Result result) th groupName = param.getString("groupName"); } + String avatar = null; + if(param.has("avatar")) { + avatar = param.getString("avatar"); + } + String desc = null; if(param.has("desc")){ desc = param.getString("desc"); @@ -275,9 +288,7 @@ public void onSuccess(EMGroup object) { updateObject(GroupHelper.toJson(object)); } }; - - EMClient.getInstance().groupManager().asyncCreateGroup(groupName, desc, members, inviteReason, options, - callBack); + EMClient.getInstance().groupManager().asyncCreateGroup(groupName, avatar, desc, members, inviteReason, options, callBack); } private void getGroupSpecificationFromServer(JSONObject param, String channelName, Result result) @@ -791,8 +802,8 @@ private void acceptJoinApplication(JSONObject param, String channelName, Result String groupId = param.getString("groupId"); String username = null; - if (param.has("username")){ - username = param.getString("username"); + if (param.has("userId")){ + username = param.getString("userId"); } EMClient.getInstance().groupManager().asyncAcceptApplication(username, groupId, new EMWrapperCallBack(result, channelName, null)); @@ -801,8 +812,8 @@ private void acceptJoinApplication(JSONObject param, String channelName, Result private void declineJoinApplication(JSONObject param, String channelName, Result result) throws JSONException { String groupId = param.getString("groupId"); String username = null; - if (param.has("username")){ - username = param.getString("username"); + if (param.has("userId")){ + username = param.getString("userId"); } String reason = null; if (param.has("reason")){ @@ -832,8 +843,8 @@ public void onSuccess(EMGroup object) { private void declineInvitationFromGroup(JSONObject param, String channelName, Result result) throws JSONException { String groupId = param.getString("groupId"); String username = null; - if (param.has("username")){ - username = param.getString("username"); + if (param.has("userId")){ + username = param.getString("userId"); } String reason = null; if (param.has("reason")){ @@ -888,7 +899,7 @@ private void fetchMemberAttributes(JSONObject param, String channelName, Result @Override public void onSuccess(Map> object) { - updateObject(object); + updateObject(object.get(finalUserId)); } }); } @@ -1322,4 +1333,27 @@ public void onSuccess(Boolean object) { }); } + private void fetchGroupMembersInfo(JSONObject param, String channelName, Result result) throws JSONException{ + String groupId = param.getString("groupId"); + int limit = param.getInt("limit"); + String cursor = param.optString("cursor"); + EMClient.getInstance().groupManager().asyncFetchGroupMembersInfo(groupId, cursor, limit, new EMValueWrapperCallBack>(result, channelName){ + @Override + public void onSuccess(EMCursorResult object) { + updateObject(CursorResultHelper.toJson(object)); + } + }); + } + + private void updateGroupAvatar(JSONObject param, String channelName, Result result) throws JSONException{ + String groupId = param.getString("groupId"); + String avatarUrl = param.optString("avatarUrl"); + EMClient.getInstance().groupManager().asyncChangeGroupAvatar(groupId, avatarUrl, new EMWrapperCallBack(result, channelName, null) { + @Override + public void onSuccess() { + EMGroup group = EMClient.getInstance().groupManager().getGroup(groupId); + super.updateObject(GroupHelper.toJson(group)); + } + }); + } } \ No newline at end of file diff --git a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ImFlutterSdkPlugin.java b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ImFlutterSdkPlugin.java index dce13494..651ccbc1 100644 --- a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ImFlutterSdkPlugin.java +++ b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/ImFlutterSdkPlugin.java @@ -72,6 +72,16 @@ public void onSuccess() { }); } + public void updateObject(Object object) { + post(()-> { + Map data = new HashMap(); + if (object != null) { + data.put(channelName, object); + } + result.success(data); + }); + } + @Override public void onError(int code, String desc) { post(() -> { diff --git a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/MethodKey.java b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/MethodKey.java index 59f9302e..d79d3a31 100644 --- a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/MethodKey.java +++ b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/MethodKey.java @@ -149,7 +149,6 @@ public class MethodKey { static final String loadMsgWithMsgType = "loadMsgWithMsgType"; static final String loadMsgWithTime = "loadMsgWithTime"; static final String messageCount = "messageCount"; - static final String removeMsgFromServerWithMsgList = "removeMsgFromServerWithMsgList"; static final String removeMsgFromServerWithTimeStamp = "removeMsgFromServerWithTimeStamp"; // EMMessage method @@ -370,4 +369,9 @@ public class MethodKey { // 4.12.1 static final String isMemberInChatRoomMuteList = "isMemberInChatRoomMuteList"; + + // 4.14.0 + static final String fetchGroupMembersInfo = "fetchGroupMembersInfo"; + + static final String updateGroupAvatar = "updateGroupAvatar"; } diff --git a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/PushManagerWrapper.java b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/PushManagerWrapper.java index e566a9b7..88149e34 100644 --- a/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/PushManagerWrapper.java +++ b/im_flutter_sdk_android/android/src/main/java/com/easemob/im_flutter_sdk/PushManagerWrapper.java @@ -156,7 +156,7 @@ private void reportPushAction(JSONObject params, String channelName, Result resu } private void setConversationSilentMode(JSONObject params, String channelName, Result result) throws JSONException { - String conversationId = params.getString("conversationId"); + String conversationId = params.getString("convId"); EMConversation.EMConversationType type = EnumTools.conversationTypeFromInt(params.getInt("conversationType")); EMSilentModeParam param = SilentModeParamHelper.fromJson(params.getJSONObject("param")); EMClient.getInstance().pushManager().setSilentModeForConversation(conversationId, type, param, new EMValueWrapperCallBack(result, channelName){ @@ -167,13 +167,13 @@ public void onSuccess(EMSilentModeResult object) { }); } private void removeConversationSilentMode(JSONObject params, String channelName, Result result) throws JSONException { - String conversationId = params.getString("conversationId"); + String conversationId = params.getString("convId"); EMConversation.EMConversationType type = EnumTools.conversationTypeFromInt(params.getInt("conversationType")); EMClient.getInstance().pushManager().clearRemindTypeForConversation(conversationId, type, new EMWrapperCallBack(result, channelName, null)); } private void fetchConversationSilentMode(JSONObject params, String channelName, Result result) throws JSONException { - String conversationId = params.getString("conversationId"); + String conversationId = params.getString("convId"); EMConversation.EMConversationType type = EnumTools.conversationTypeFromInt(params.getInt("conversationType")); EMClient.getInstance().pushManager().getSilentModeForConversation(conversationId, type, new EMValueWrapperCallBack(result, channelName){ @Override diff --git a/im_flutter_sdk_android/lib/src/chat_manager_android.dart b/im_flutter_sdk_android/lib/src/chat_manager_android.dart index 50816789..4d038c79 100644 --- a/im_flutter_sdk_android/lib/src/chat_manager_android.dart +++ b/im_flutter_sdk_android/lib/src/chat_manager_android.dart @@ -139,7 +139,7 @@ class ChatManagerAndroid extends ChatManager { /// ~end @override Future sendMessageReadAck(EMMessage message) async { - Map req = {"to": message.from, "msg_id": message.msgId}; + Map req = {"to": message.from, "msgId": message.msgId}; Map result = await ChatChannel.invokeMethod(ChatMethodKeys.ackMessageRead, req); try { @@ -191,7 +191,7 @@ class ChatManagerAndroid extends ChatManager { String? content, }) async { Map req = { - "msg_id": msgId, + "msgId": msgId, "group_id": groupId, }; req.putIfNotNull("content", content); @@ -261,7 +261,7 @@ class ChatManagerAndroid extends ChatManager { @override Future recallMessage(String messageId, {String? ext}) async { Map req = { - "msg_id": messageId, + "msgId": messageId, }; req.putIfNotNull('ext', ext); Map result = @@ -294,7 +294,7 @@ class ChatManagerAndroid extends ChatManager { /// ~end @override Future loadMessage(String messageId) async { - Map req = {"msg_id": messageId}; + Map req = {"msgId": messageId}; Map result = await ChatChannel.invokeMethod(ChatMethodKeys.getMessage, req); try { @@ -1248,7 +1248,7 @@ class ChatManagerAndroid extends ChatManager { String? startAckId, int pageSize = 0, }) async { - Map req = {"msg_id": msgId, "group_id": groupId}; + Map req = {"msgId": msgId, "group_id": groupId}; req["pageSize"] = pageSize; req.putIfNotNull("ack_id", startAckId); @@ -1306,7 +1306,7 @@ class ChatManagerAndroid extends ChatManager { bool isDeleteMessage = true, }) async { Map req = {}; - req["conversationId"] = conversationId; + req["convId"] = conversationId; if (conversationType == EMConversationType.Chat) { req["conversationType"] = 0; } else if (conversationType == EMConversationType.GroupChat) { diff --git a/im_flutter_sdk_android/lib/src/chat_thread_manager_android.dart b/im_flutter_sdk_android/lib/src/chat_thread_manager_android.dart index 5420622d..7232a79c 100644 --- a/im_flutter_sdk_android/lib/src/chat_thread_manager_android.dart +++ b/im_flutter_sdk_android/lib/src/chat_thread_manager_android.dart @@ -435,7 +435,7 @@ class ChatThreadManagerAndroid extends ChatThreadManager { }) async { Map req = { "name": name, - "messageId": messageId, + "msgId": messageId, "parentId": parentId, }; Map result = await ThreadChannel.invokeMethod( diff --git a/im_flutter_sdk_android/lib/src/client_android.dart b/im_flutter_sdk_android/lib/src/client_android.dart index 930e92d3..ddf1ae93 100644 --- a/im_flutter_sdk_android/lib/src/client_android.dart +++ b/im_flutter_sdk_android/lib/src/client_android.dart @@ -247,7 +247,7 @@ class ClientAndroid extends Client { @override Future createAccount(String userId, String password) async { EMLog.v('create account: $userId : $password'); - Map req = {'username': userId, 'password': password}; + Map req = {'userId': userId, 'password': password}; Map result = await ClientChannel.invokeMethod(ChatMethodKeys.createAccount, req); try { @@ -299,7 +299,7 @@ class ClientAndroid extends Client { ]) async { EMLog.v('login: $userId : $pwdOrToken, isPassword: $isPassword'); Map req = { - 'username': userId, + 'userId': userId, 'pwdOrToken': pwdOrToken, 'isPassword': isPassword }; @@ -607,7 +607,7 @@ class ClientAndroid extends Client { /// ~end Future> getLoggedInDevicesFromServer( {required String userId, required String password}) async { - Map req = {'username': userId, 'password': password}; + Map req = {'userId': userId, 'password': password}; Map result = await ClientChannel.invokeMethod( ChatMethodKeys.getLoggedInDevicesFromServer, req); try { @@ -655,7 +655,7 @@ class ClientAndroid extends Client { required String pwdOrToken, bool isPwd = true, }) async { - Map req = {'username': userId, 'password': pwdOrToken, 'isPwd': isPwd}; + Map req = {'userId': userId, 'password': pwdOrToken, 'isPwd': isPwd}; Map result = await ClientChannel.invokeMethod( ChatMethodKeys.getLoggedInDevicesFromServer, req); try { @@ -702,7 +702,7 @@ class ClientAndroid extends Client { }) async { EMLog.v('kickDevice: $userId, "******"'); Map req = { - 'username': userId, + 'userId': userId, 'password': pwdOrToken, 'resource': resource, 'isPwd': isPwd, @@ -746,7 +746,7 @@ class ClientAndroid extends Client { required String pwdOrToken, bool isPwd = true, }) async { - Map req = {'username': userId, 'password': pwdOrToken, 'isPwd': isPwd}; + Map req = {'userId': userId, 'password': pwdOrToken, 'isPwd': isPwd}; Map result = await ClientChannel.invokeMethod(ChatMethodKeys.kickAllDevices, req); try { diff --git a/im_flutter_sdk_android/lib/src/contact_manager_android.dart b/im_flutter_sdk_android/lib/src/contact_manager_android.dart index 063166c4..64999216 100644 --- a/im_flutter_sdk_android/lib/src/contact_manager_android.dart +++ b/im_flutter_sdk_android/lib/src/contact_manager_android.dart @@ -26,7 +26,7 @@ class ContactManagerAndroid extends ContactManager { String? reason, }) async { Map req = { - 'username': userId, + 'userId': userId, }; req.putIfNotNull("reason", reason); @@ -67,7 +67,7 @@ class ContactManagerAndroid extends ContactManager { String userId, { bool keepConversation = false, }) async { - Map req = {'username': userId, 'keepConversation': keepConversation}; + Map req = {'userId': userId, 'keepConversation': keepConversation}; Map result = await ContactChannel.invokeMethod(ChatMethodKeys.deleteContact, req); try { @@ -236,7 +236,7 @@ class ContactManagerAndroid extends ContactManager { Future addUserToBlockList( String userId, ) async { - Map req = {'username': userId}; + Map req = {'userId': userId}; Map result = await ContactChannel.invokeMethod( ChatMethodKeys.addUserToBlockList, req, @@ -265,7 +265,7 @@ class ContactManagerAndroid extends ContactManager { /// ~end @override Future removeUserFromBlockList(String userId) async { - Map req = {'username': userId}; + Map req = {'userId': userId}; Map result = await ContactChannel.invokeMethod( ChatMethodKeys.removeUserFromBlockList, req); try { @@ -428,7 +428,7 @@ class ContactManagerAndroid extends ContactManager { /// ~end @override Future acceptInvitation(String userId) async { - Map req = {'username': userId}; + Map req = {'userId': userId}; Map result = await ContactChannel.invokeMethod(ChatMethodKeys.acceptInvitation, req); try { @@ -455,7 +455,7 @@ class ContactManagerAndroid extends ContactManager { /// ~end @override Future declineInvitation(String userId) async { - Map req = {'username': userId}; + Map req = {'userId': userId}; Map result = await ContactChannel.invokeMethod( ChatMethodKeys.declineInvitation, req); try { diff --git a/im_flutter_sdk_android/lib/src/group_manager_android.dart b/im_flutter_sdk_android/lib/src/group_manager_android.dart index a23fddb2..e305375f 100644 --- a/im_flutter_sdk_android/lib/src/group_manager_android.dart +++ b/im_flutter_sdk_android/lib/src/group_manager_android.dart @@ -221,6 +221,7 @@ class GroupManagerAndroid extends GroupManager { @override Future createGroup({ String? groupName, + String? avatar, String? desc, List? inviteMembers, String? inviteReason, @@ -228,6 +229,7 @@ class GroupManagerAndroid extends GroupManager { }) async { Map req = {'options': options.toJson()}; req.putIfNotNull("groupName", groupName); + req.putIfNotNull("avatar", avatar); req.putIfNotNull("desc", desc); req.putIfNotNull("inviteMembers", inviteMembers); req.putIfNotNull("inviteReason", inviteReason); @@ -1659,7 +1661,7 @@ class GroupManagerAndroid extends GroupManager { String groupId, String username, ) async { - Map req = {'groupId': groupId, 'username': username}; + Map req = {'groupId': groupId, 'userId': username}; Map result = await GroupChannel.invokeMethod( ChatMethodKeys.acceptJoinApplication, req); try { @@ -1702,7 +1704,7 @@ class GroupManagerAndroid extends GroupManager { String username, { String? reason, }) async { - Map req = {'groupId': groupId, 'username': username}; + Map req = {'groupId': groupId, 'userId': username}; req.putIfNotNull('reason', reason); Map result = await GroupChannel.invokeMethod( @@ -2052,4 +2054,52 @@ class GroupManagerAndroid extends GroupManager { rethrow; } } + + @override + Future> fetchGroupMembersInfo({ + required String groupId, + String? cursor, + int limit = 20, + }) async { + Map req = { + "groupId": groupId, + "limit": limit, + }; + + req.putIfNotNull('cursor', cursor); + + Map result = await GroupChannel.invokeMethod( + ChatMethodKeys.fetchGroupMembersInfo, + req, + ); + try { + EMError.hasErrorFromResult(result); + return EMCursorResult.fromJson( + result[ChatMethodKeys.fetchGroupMembersInfo], + dataItemCallback: (value) { + return GroupMemberInfo.fromJson(value); + }); + } catch (e) { + rethrow; + } + } + + @override + Future updateGroupAvatar({ + required String groupId, + required String avatarUrl, + }) async { + Map req = { + "groupId": groupId, + "avatarUrl": avatarUrl, + }; + Map result = + await GroupChannel.invokeMethod(ChatMethodKeys.updateGroupAvatar, req); + try { + EMError.hasErrorFromResult(result); + return EMGroup.fromJson(result[ChatMethodKeys.updateGroupAvatar]); + } catch (e) { + rethrow; + } + } } diff --git a/im_flutter_sdk_android/lib/src/push_manager_android.dart b/im_flutter_sdk_android/lib/src/push_manager_android.dart index ac0f1e80..0b15425c 100644 --- a/im_flutter_sdk_android/lib/src/push_manager_android.dart +++ b/im_flutter_sdk_android/lib/src/push_manager_android.dart @@ -233,7 +233,7 @@ class PushManagerAndroid extends PushManager { required ChatSilentModeParam param, }) async { Map req = {}; - req["conversationId"] = conversationId; + req["convId"] = conversationId; req["conversationType"] = type.index; req["param"] = param.toJson(); @@ -275,7 +275,7 @@ class PushManagerAndroid extends PushManager { required EMConversationType type, }) async { Map req = {}; - req["conversationId"] = conversationId; + req["convId"] = conversationId; req["conversationType"] = type.index; Map result = await PushChannel.invokeMethod( ChatMethodKeys.removeConversationSilentMode, req); @@ -315,7 +315,7 @@ class PushManagerAndroid extends PushManager { required EMConversationType type, }) async { Map req = {}; - req["conversationId"] = conversationId; + req["convId"] = conversationId; req["conversationType"] = type.index; Map result = await PushChannel.invokeMethod( ChatMethodKeys.fetchConversationSilentMode, req); diff --git a/im_flutter_sdk_android/pubspec.yaml b/im_flutter_sdk_android/pubspec.yaml index 253d283a..d1cb28d1 100644 --- a/im_flutter_sdk_android/pubspec.yaml +++ b/im_flutter_sdk_android/pubspec.yaml @@ -1,6 +1,6 @@ name: im_flutter_sdk_android description: Integrate the Chat SDK to enjoy the global IM services with high reliability, ultra-low latency, and high concurrency. -version: 4.13.0+1 +version: 4.14.0 homepage: https://www.easemob.com environment: @@ -11,7 +11,8 @@ dependencies: flutter: sdk: flutter - im_flutter_sdk_interface: ^4.13.0+1 + im_flutter_sdk_interface: + path: ../im_flutter_sdk_interface dev_dependencies: flutter_test: diff --git a/im_flutter_sdk_interface/lib/im_flutter_sdk_interface.dart b/im_flutter_sdk_interface/lib/im_flutter_sdk_interface.dart index 86120e53..65420d2c 100644 --- a/im_flutter_sdk_interface/lib/im_flutter_sdk_interface.dart +++ b/im_flutter_sdk_interface/lib/im_flutter_sdk_interface.dart @@ -1,13 +1,13 @@ -export 'package:im_flutter_sdk_interface/interface/platform_interface/client.dart'; -export 'package:im_flutter_sdk_interface/interface/platform_interface/chat_manager.dart'; -export 'package:im_flutter_sdk_interface/interface/platform_interface/chat_room_manager.dart'; -export 'package:im_flutter_sdk_interface/interface/platform_interface/chat_thread_manager.dart'; -export 'package:im_flutter_sdk_interface/interface/platform_interface/contact_manager.dart'; -export 'package:im_flutter_sdk_interface/interface/platform_interface/group_manager.dart'; -export 'package:im_flutter_sdk_interface/interface/platform_interface/presence_manager.dart'; -export 'package:im_flutter_sdk_interface/interface/platform_interface/push_manager.dart'; -export 'package:im_flutter_sdk_interface/interface/platform_interface/user_info_manager.dart'; -export 'package:im_flutter_sdk_interface/interface/platform_interface/progress_manager.dart'; +export 'package:im_flutter_sdk_interface/src/interface/platform_interface/client.dart'; +export 'package:im_flutter_sdk_interface/src/interface/platform_interface/chat_manager.dart'; +export 'package:im_flutter_sdk_interface/src/interface/platform_interface/chat_room_manager.dart'; +export 'package:im_flutter_sdk_interface/src/interface/platform_interface/chat_thread_manager.dart'; +export 'package:im_flutter_sdk_interface/src/interface/platform_interface/contact_manager.dart'; +export 'package:im_flutter_sdk_interface/src/interface/platform_interface/group_manager.dart'; +export 'package:im_flutter_sdk_interface/src/interface/platform_interface/presence_manager.dart'; +export 'package:im_flutter_sdk_interface/src/interface/platform_interface/push_manager.dart'; +export 'package:im_flutter_sdk_interface/src/interface/platform_interface/user_info_manager.dart'; +export 'package:im_flutter_sdk_interface/src/interface/platform_interface/progress_manager.dart'; export 'src/models/em_group_message_ack.dart'; export 'src/models/em_chat_room.dart'; @@ -21,6 +21,7 @@ export 'src/models/em_translate_language.dart'; export 'src/models/em_presence.dart'; export 'src/models/login_extension_info.dart'; export 'src/models/message_search_options.dart'; +export 'src/models/group_member_info.dart'; export 'src/models/em_options.dart'; export 'src/models/em_push_configs.dart'; diff --git a/im_flutter_sdk_interface/lib/interface/method_channel/default_channels.dart b/im_flutter_sdk_interface/lib/interface/method_channel/default_channels.dart deleted file mode 100644 index 4e5a6e0d..00000000 --- a/im_flutter_sdk_interface/lib/interface/method_channel/default_channels.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:im_flutter_sdk_interface/interface/platform_interface/chat_manager.dart'; -import 'package:im_flutter_sdk_interface/interface/platform_interface/chat_room_manager.dart'; -import 'package:im_flutter_sdk_interface/interface/platform_interface/chat_thread_manager.dart'; -import 'package:im_flutter_sdk_interface/interface/platform_interface/contact_manager.dart'; -import 'package:im_flutter_sdk_interface/interface/platform_interface/group_manager.dart'; -import 'package:im_flutter_sdk_interface/interface/platform_interface/presence_manager.dart'; -import 'package:im_flutter_sdk_interface/interface/platform_interface/push_manager.dart'; -import 'package:im_flutter_sdk_interface/interface/platform_interface/user_info_manager.dart'; - -import '../platform_interface/client.dart'; -import '../platform_interface/progress_manager.dart'; - -class ClientDefault extends Client { - @override - void initHandler() {} -} - -class ChatManagerDefault extends ChatManager {} - -class ChatRoomManagerDefault extends ChatRoomManager {} - -class ChatThreadManagerDefault extends ChatThreadManager {} - -class ContactManagerDefault extends ContactManager {} - -class GroupManagerDefault extends GroupManager {} - -class PresenceManagerDefault extends PresenceManager {} - -class PushManagerDefault extends PushManager {} - -class UserInfoManagerDefault extends UserInfoManager {} - -class ProgressManagerDefault extends ProgressManager {} diff --git a/im_flutter_sdk_interface/lib/interface/manager_mixin.dart b/im_flutter_sdk_interface/lib/src/interface/manager_mixin.dart similarity index 100% rename from im_flutter_sdk_interface/lib/interface/manager_mixin.dart rename to im_flutter_sdk_interface/lib/src/interface/manager_mixin.dart diff --git a/im_flutter_sdk_interface/lib/src/interface/method_channel/default_channels.dart b/im_flutter_sdk_interface/lib/src/interface/method_channel/default_channels.dart new file mode 100644 index 00000000..cdd0b94b --- /dev/null +++ b/im_flutter_sdk_interface/lib/src/interface/method_channel/default_channels.dart @@ -0,0 +1,33 @@ +import '../platform_interface/chat_manager.dart'; +import '../platform_interface/chat_room_manager.dart'; +import '../platform_interface/chat_thread_manager.dart'; +import '../platform_interface/client.dart'; +import '../platform_interface/contact_manager.dart'; +import '../platform_interface/group_manager.dart'; +import '../platform_interface/presence_manager.dart'; +import '../platform_interface/progress_manager.dart'; +import '../platform_interface/push_manager.dart'; +import '../platform_interface/user_info_manager.dart'; + +class ClientDefault extends Client { + @override + void initHandler() {} +} + +class ChatManagerDefault extends ChatManager {} + +class ChatRoomManagerDefault extends ChatRoomManager {} + +class ChatThreadManagerDefault extends ChatThreadManager {} + +class ContactManagerDefault extends ContactManager {} + +class GroupManagerDefault extends GroupManager {} + +class PresenceManagerDefault extends PresenceManager {} + +class PushManagerDefault extends PushManager {} + +class UserInfoManagerDefault extends UserInfoManager {} + +class ProgressManagerDefault extends ProgressManager {} diff --git a/im_flutter_sdk_interface/lib/interface/platform_interface/chat_manager.dart b/im_flutter_sdk_interface/lib/src/interface/platform_interface/chat_manager.dart similarity index 99% rename from im_flutter_sdk_interface/lib/interface/platform_interface/chat_manager.dart rename to im_flutter_sdk_interface/lib/src/interface/platform_interface/chat_manager.dart index efadefcf..a317b69b 100644 --- a/im_flutter_sdk_interface/lib/interface/platform_interface/chat_manager.dart +++ b/im_flutter_sdk_interface/lib/src/interface/platform_interface/chat_manager.dart @@ -2,7 +2,7 @@ import 'package:flutter/services.dart'; import 'package:im_flutter_sdk_interface/im_flutter_sdk_interface.dart'; -import 'package:im_flutter_sdk_interface/interface/manager_mixin.dart'; +import 'package:im_flutter_sdk_interface/src/interface/manager_mixin.dart'; class ChatManager with ManagerMixin { final Map _eventHandlesMap = {}; @@ -161,8 +161,8 @@ class ChatManager with ManagerMixin { } Future _onMessagePinChanged(dynamic obj) async { - String messageId = obj["messageId"] ?? ""; - String conversationId = obj["conversationId"] ?? ""; + String messageId = obj["msgId"] ?? ""; + String conversationId = obj["convId"] ?? ""; MessagePinOperation pinOperation = MessagePinOperation.values[obj["pinOperation"]]; MessagePinInfo pinInfo = MessagePinInfo.fromJson(obj["pinInfo"]); diff --git a/im_flutter_sdk_interface/lib/interface/platform_interface/chat_room_manager.dart b/im_flutter_sdk_interface/lib/src/interface/platform_interface/chat_room_manager.dart similarity index 99% rename from im_flutter_sdk_interface/lib/interface/platform_interface/chat_room_manager.dart rename to im_flutter_sdk_interface/lib/src/interface/platform_interface/chat_room_manager.dart index 0bda76ee..950b4bbe 100644 --- a/im_flutter_sdk_interface/lib/interface/platform_interface/chat_room_manager.dart +++ b/im_flutter_sdk_interface/lib/src/interface/platform_interface/chat_room_manager.dart @@ -1,6 +1,6 @@ import 'package:flutter/services.dart'; import 'package:im_flutter_sdk_interface/im_flutter_sdk_interface.dart'; -import 'package:im_flutter_sdk_interface/interface/manager_mixin.dart'; +import 'package:im_flutter_sdk_interface/src/interface/manager_mixin.dart'; class ChatRoomManager with ManagerMixin { final Map _eventHandlesMap = {}; diff --git a/im_flutter_sdk_interface/lib/interface/platform_interface/chat_thread_manager.dart b/im_flutter_sdk_interface/lib/src/interface/platform_interface/chat_thread_manager.dart similarity index 100% rename from im_flutter_sdk_interface/lib/interface/platform_interface/chat_thread_manager.dart rename to im_flutter_sdk_interface/lib/src/interface/platform_interface/chat_thread_manager.dart diff --git a/im_flutter_sdk_interface/lib/interface/platform_interface/client.dart b/im_flutter_sdk_interface/lib/src/interface/platform_interface/client.dart similarity index 99% rename from im_flutter_sdk_interface/lib/interface/platform_interface/client.dart rename to im_flutter_sdk_interface/lib/src/interface/platform_interface/client.dart index 2e45c6d1..17ab5128 100644 --- a/im_flutter_sdk_interface/lib/interface/platform_interface/client.dart +++ b/im_flutter_sdk_interface/lib/src/interface/platform_interface/client.dart @@ -1,9 +1,10 @@ import 'package:flutter/services.dart'; -import 'package:im_flutter_sdk_interface/interface/manager_mixin.dart'; -import 'package:im_flutter_sdk_interface/interface/method_channel/default_channels.dart'; +import 'package:im_flutter_sdk_interface/src/interface/manager_mixin.dart'; +import 'package:im_flutter_sdk_interface/src/interface/method_channel/default_channels.dart'; + import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import '../../src/internal/inner_headers.dart'; +import '../../internal/inner_headers.dart'; abstract class Client extends PlatformInterface with ManagerMixin { static final Object _token = Object(); @@ -308,7 +309,7 @@ abstract class Client extends PlatformInterface with ManagerMixin { Future _onMultiDeviceGroupEvent(Map map) async { EMMultiDevicesEvent event = convertIntToEMMultiDevicesEvent(map['event'])!; String target = map['target']; - List? users = map.getList("users"); + List? users = map.getList("userIds"); for (var handler in _multiDeviceHandlers.values) { handler.onGroupEvent?.call(event, target, users); @@ -328,7 +329,7 @@ abstract class Client extends PlatformInterface with ManagerMixin { Future _onMultiDeviceThreadEvent(Map map) async { EMMultiDevicesEvent event = convertIntToEMMultiDevicesEvent(map['event'])!; String target = map['target'] ?? ''; - List users = map.getList("users") ?? []; + List users = map.getList("userIds") ?? []; for (var handler in _multiDeviceHandlers.values) { handler.onChatThreadEvent?.call(event, target, users); diff --git a/im_flutter_sdk_interface/lib/interface/platform_interface/contact_manager.dart b/im_flutter_sdk_interface/lib/src/interface/platform_interface/contact_manager.dart similarity index 99% rename from im_flutter_sdk_interface/lib/interface/platform_interface/contact_manager.dart rename to im_flutter_sdk_interface/lib/src/interface/platform_interface/contact_manager.dart index 351b518f..0e617245 100644 --- a/im_flutter_sdk_interface/lib/interface/platform_interface/contact_manager.dart +++ b/im_flutter_sdk_interface/lib/src/interface/platform_interface/contact_manager.dart @@ -1,6 +1,6 @@ import 'package:flutter/services.dart'; import 'package:im_flutter_sdk_interface/im_flutter_sdk_interface.dart'; -import 'package:im_flutter_sdk_interface/interface/manager_mixin.dart'; +import 'package:im_flutter_sdk_interface/src/interface/manager_mixin.dart'; class ContactManager with ManagerMixin { final Map _eventHandlesMap = {}; @@ -18,7 +18,7 @@ class ContactManager with ManagerMixin { Future _onContactChanged(Map event) async { var type = event['type']; - String username = event['username']; + String username = event['userId']; String? reason = event['reason']; for (var element in _eventHandlesMap.values) { diff --git a/im_flutter_sdk_interface/lib/interface/platform_interface/group_manager.dart b/im_flutter_sdk_interface/lib/src/interface/platform_interface/group_manager.dart similarity index 97% rename from im_flutter_sdk_interface/lib/interface/platform_interface/group_manager.dart rename to im_flutter_sdk_interface/lib/src/interface/platform_interface/group_manager.dart index 026cf1f5..97828309 100644 --- a/im_flutter_sdk_interface/lib/interface/platform_interface/group_manager.dart +++ b/im_flutter_sdk_interface/lib/src/interface/platform_interface/group_manager.dart @@ -1,6 +1,6 @@ import 'package:flutter/services.dart'; import 'package:im_flutter_sdk_interface/im_flutter_sdk_interface.dart'; -import 'package:im_flutter_sdk_interface/interface/manager_mixin.dart'; +import 'package:im_flutter_sdk_interface/src/interface/manager_mixin.dart'; class GroupManager with ManagerMixin { /// ~english @@ -369,6 +369,8 @@ class GroupManager with ManagerMixin { /// /// Param [groupName] The group name. /// + /// Param [avatar] The group avatar. + /// /// Param [desc] The group description. /// /// Param [inviteMembers] The group member array. The group owner ID is optional. @@ -395,6 +397,8 @@ class GroupManager with ManagerMixin { /// /// Param [groupName] 群组名称。 /// + /// Param [avatar] 群组头像。 + /// /// Param [desc] 群组描述。 /// /// Param [inviteMembers] 群成员数组。群主 ID 可选。 @@ -414,6 +418,7 @@ class GroupManager with ManagerMixin { /// ~end Future createGroup({ String? groupName, + String? avatar, String? desc, List? inviteMembers, String? inviteReason, @@ -1760,6 +1765,7 @@ class GroupManager with ManagerMixin { throw UnimplementedError("not implemented"); } + /// Future isMemberInGroupMuteList(String groupId) async { throw UnimplementedError("not implemented"); } @@ -1778,4 +1784,45 @@ class GroupManager with ManagerMixin { Future clearAllGroupsFromLocal() async { throw UnimplementedError("not implemented"); } + + /// + /// \~chinese + /// 获取群组成员列表。 + /// 这里需要注意的是: + /// - 每次调用只返回一页的数据。首次调用传空值,会从最新的第一条开始取; + /// - aPageSize 是这次接口调用期望返回的列表数据个数,如当前在最后一页,返回的数据会是 count < aPageSize; + /// - 列表页码 aPageNum 是方便服务器分页查询返回,对于数据量未知且很大的情况,分页获取,服务器会根据每次的页数和每次的pagesize 返回数据,直到返回所有数据。 + /// + /// Param [groupId] 群组 ID。 + /// Param [cursor] 游标,首次调用传空。下次传上次返回的值。 + /// Param [limit] 获取多少条。 + /// + /// ~end + /// + /// + /// \~english + /// Gets the list of group members from the server. + /// + /// Param [groupId] The group ID. + /// Param [cursor] The cursor when joins the group. Sets the parameter as nil for the first time. Next time, pass the value returned last time. + /// Param [limit ] The page size. + /// + /// ~end + /// + + Future> fetchGroupMembersInfo({ + required String groupId, + String? cursor, + int limit = 20, + }) async { + throw UnimplementedError("not implemented"); + } + + + Future updateGroupAvatar({ + required String groupId, + required String avatarUrl, + }) async { + throw UnimplementedError("not implemented"); + } } diff --git a/im_flutter_sdk_interface/lib/interface/platform_interface/presence_manager.dart b/im_flutter_sdk_interface/lib/src/interface/platform_interface/presence_manager.dart similarity index 98% rename from im_flutter_sdk_interface/lib/interface/platform_interface/presence_manager.dart rename to im_flutter_sdk_interface/lib/src/interface/platform_interface/presence_manager.dart index 4976a172..97ceb01f 100644 --- a/im_flutter_sdk_interface/lib/interface/platform_interface/presence_manager.dart +++ b/im_flutter_sdk_interface/lib/src/interface/platform_interface/presence_manager.dart @@ -1,6 +1,6 @@ import 'package:flutter/services.dart'; import 'package:im_flutter_sdk_interface/im_flutter_sdk_interface.dart'; -import 'package:im_flutter_sdk_interface/interface/manager_mixin.dart'; +import 'package:im_flutter_sdk_interface/src/interface/manager_mixin.dart'; class PresenceManager with ManagerMixin { final Map _eventHandlesMap = {}; diff --git a/im_flutter_sdk_interface/lib/interface/platform_interface/progress_manager.dart b/im_flutter_sdk_interface/lib/src/interface/platform_interface/progress_manager.dart similarity index 93% rename from im_flutter_sdk_interface/lib/interface/platform_interface/progress_manager.dart rename to im_flutter_sdk_interface/lib/src/interface/platform_interface/progress_manager.dart index 2ff85a08..4632b2c9 100644 --- a/im_flutter_sdk_interface/lib/interface/platform_interface/progress_manager.dart +++ b/im_flutter_sdk_interface/lib/src/interface/platform_interface/progress_manager.dart @@ -1,5 +1,5 @@ import 'package:im_flutter_sdk_interface/im_flutter_sdk_interface.dart'; -import 'package:im_flutter_sdk_interface/interface/manager_mixin.dart'; +import 'package:im_flutter_sdk_interface/src/interface/manager_mixin.dart'; class ProgressManager with ManagerMixin { @override diff --git a/im_flutter_sdk_interface/lib/interface/platform_interface/push_manager.dart b/im_flutter_sdk_interface/lib/src/interface/platform_interface/push_manager.dart similarity index 99% rename from im_flutter_sdk_interface/lib/interface/platform_interface/push_manager.dart rename to im_flutter_sdk_interface/lib/src/interface/platform_interface/push_manager.dart index 11325cb5..505ca14c 100644 --- a/im_flutter_sdk_interface/lib/interface/platform_interface/push_manager.dart +++ b/im_flutter_sdk_interface/lib/src/interface/platform_interface/push_manager.dart @@ -1,5 +1,5 @@ import 'package:im_flutter_sdk_interface/im_flutter_sdk_interface.dart'; -import 'package:im_flutter_sdk_interface/interface/manager_mixin.dart'; +import 'package:im_flutter_sdk_interface/src/interface/manager_mixin.dart'; class PushManager with ManagerMixin { @override diff --git a/im_flutter_sdk_interface/lib/interface/platform_interface/user_info_manager.dart b/im_flutter_sdk_interface/lib/src/interface/platform_interface/user_info_manager.dart similarity index 98% rename from im_flutter_sdk_interface/lib/interface/platform_interface/user_info_manager.dart rename to im_flutter_sdk_interface/lib/src/interface/platform_interface/user_info_manager.dart index fc5910fd..38c750b8 100644 --- a/im_flutter_sdk_interface/lib/interface/platform_interface/user_info_manager.dart +++ b/im_flutter_sdk_interface/lib/src/interface/platform_interface/user_info_manager.dart @@ -1,5 +1,5 @@ import 'package:im_flutter_sdk_interface/im_flutter_sdk_interface.dart'; -import 'package:im_flutter_sdk_interface/interface/manager_mixin.dart'; +import 'package:im_flutter_sdk_interface/src/interface/manager_mixin.dart'; class UserInfoManager with ManagerMixin { @override diff --git a/im_flutter_sdk_interface/lib/src/internal/chat_method_keys.dart b/im_flutter_sdk_interface/lib/src/internal/chat_method_keys.dart index 0d44c7aa..1375dd7c 100644 --- a/im_flutter_sdk_interface/lib/src/internal/chat_method_keys.dart +++ b/im_flutter_sdk_interface/lib/src/internal/chat_method_keys.dart @@ -172,8 +172,7 @@ class ChatMethodKeys { static const String loadMsgWithMsgType = "loadMsgWithMsgType"; static const String loadMsgWithTime = "loadMsgWithTime"; static const String messageCount = "messageCount"; - static const String removeMsgFromServerWithMsgList = - "removeMsgFromServerWithMsgList"; + static const String removeMsgFromServerWithTimeStamp = "removeMsgFromServerWithTimeStamp"; @@ -430,4 +429,9 @@ class ChatMethodKeys { // 4.12.1 static const String isMemberInChatRoomMuteList = "isMemberInChatRoomMuteList"; + + // 4.14.0 + static const String fetchGroupMembersInfo = "fetchGroupMembersInfo"; + + static const String updateGroupAvatar = "updateGroupAvatar"; } diff --git a/im_flutter_sdk_interface/lib/src/internal/inner_headers.dart b/im_flutter_sdk_interface/lib/src/internal/inner_headers.dart index b8b93bf6..091fb6f3 100644 --- a/im_flutter_sdk_interface/lib/src/internal/inner_headers.dart +++ b/im_flutter_sdk_interface/lib/src/internal/inner_headers.dart @@ -33,17 +33,17 @@ export '../models/message_search_options.dart'; export '../tools/em_extension.dart'; export '../tools/em_log.dart'; -export '../../interface/platform_interface/chat_manager.dart'; -export '../../interface/platform_interface/chat_room_manager.dart'; -export '../../interface/platform_interface/chat_thread_manager.dart'; -export '../../interface/platform_interface/client.dart'; -export '../../interface/platform_interface/contact_manager.dart'; -export '../../interface/platform_interface/group_manager.dart'; -export '../../interface/platform_interface/progress_manager.dart'; +export '../interface/platform_interface/chat_manager.dart'; +export '../interface/platform_interface/chat_room_manager.dart'; +export '../interface/platform_interface/chat_thread_manager.dart'; +export '../interface/platform_interface/client.dart'; +export '../interface/platform_interface/contact_manager.dart'; +export '../interface/platform_interface/group_manager.dart'; +export '../interface/platform_interface/progress_manager.dart'; -export '../../interface/platform_interface/presence_manager.dart'; -export '../../interface/platform_interface/push_manager.dart'; -export '../../interface/platform_interface/user_info_manager.dart'; +export '../interface/platform_interface/presence_manager.dart'; +export '../interface/platform_interface/push_manager.dart'; +export '../interface/platform_interface/user_info_manager.dart'; export '../event_handler/manager_event_handler.dart'; export '../tools/chat_area_code.dart'; export '../tools/em_tools.dart'; diff --git a/im_flutter_sdk_interface/lib/src/models/chat_silent_mode.dart b/im_flutter_sdk_interface/lib/src/models/chat_silent_mode.dart index dd846696..ac9e9cde 100644 --- a/im_flutter_sdk_interface/lib/src/models/chat_silent_mode.dart +++ b/im_flutter_sdk_interface/lib/src/models/chat_silent_mode.dart @@ -259,7 +259,7 @@ class ChatSilentModeResult { ChatSilentModeTime endTime = ChatSilentModeTime.fromJson(map["endTime"]); ChatPushRemindType remindType = ChatPushRemindType.values[map["remindType"]]; - String conversationId = map["conversationId"]; + String conversationId = map["convId"]; EMConversationType conversationType = EMConversationType.values[map["conversationType"]]; return ChatSilentModeResult( diff --git a/im_flutter_sdk_interface/lib/src/models/em_chat_enums.dart b/im_flutter_sdk_interface/lib/src/models/em_chat_enums.dart index e3897b64..d6d4be04 100644 --- a/im_flutter_sdk_interface/lib/src/models/em_chat_enums.dart +++ b/im_flutter_sdk_interface/lib/src/models/em_chat_enums.dart @@ -1180,3 +1180,11 @@ enum ConversationMarkType { Type18, Type19, } + + + +extension EMGroupPermissionTypeExtension on EMGroupPermissionType { + static EMGroupPermissionType values(int type) { + return EMGroupPermissionType.values[type + 1]; + } +} diff --git a/im_flutter_sdk_interface/lib/src/models/em_conversation.dart b/im_flutter_sdk_interface/lib/src/models/em_conversation.dart index ca5814a3..d1521532 100644 --- a/im_flutter_sdk_interface/lib/src/models/em_conversation.dart +++ b/im_flutter_sdk_interface/lib/src/models/em_conversation.dart @@ -295,7 +295,7 @@ class EMConversation { /// ~end Future markMessageAsRead(String messageId) async { Map req = _toJson(); - req['msg_id'] = messageId; + req['msgId'] = messageId; Map result = await _emConversationChannel.invokeMethod( ChatMethodKeys.markMessageAsRead, req); try { @@ -434,7 +434,7 @@ class EMConversation { /// ~end Future deleteMessage(String messageId) async { Map req = _toJson(); - req['msg_id'] = messageId; + req['msgId'] = messageId; Map result = await _emConversationChannel.invokeMethod( ChatMethodKeys.removeMessage, req); try { @@ -523,7 +523,7 @@ class EMConversation { /// ~end Future loadMessage(String messageId) async { Map req = _toJson(); - req['msg_id'] = messageId; + req['msgId'] = messageId; Map result = await _emConversationChannel.invokeMethod( ChatMethodKeys.loadMsgWithId, req); try { @@ -674,7 +674,7 @@ class EMConversation { /// /// Param [keywords] The keywords in message. /// - /// Param [sender] The message sender. If you do not set this parameter, the SDK ignores this parameter when retrieving messages. + /// Param [senders] The message sender list. If you do not set this parameter, the SDK ignores this parameter when retrieving messages. /// /// Param [timestamp] The starting message timestamp for search. /// @@ -698,7 +698,7 @@ class EMConversation { /// /// Param [keywords] 搜索消息中的关键词。 /// - /// Param [sender] 消息发送方。若不设置该参数,SDK 搜索消息时会忽略该参数。 + /// Param [senders] 消息发送方列表。若不设置该参数,SDK 搜索消息时会忽略该参数。 /// /// Param [timestamp] 搜索的起始消息时间戳。 /// @@ -714,7 +714,7 @@ class EMConversation { /// ~end Future> loadMessagesWithKeyword( String keywords, { - String? sender, + List? senders, int timestamp = -1, int count = 20, MessageSearchScope searchScope = MessageSearchScope.All, @@ -726,7 +726,7 @@ class EMConversation { req['timestamp'] = timestamp; req['searchScope'] = MessageSearchScope.values.indexOf(searchScope); req['direction'] = direction.index; - req.putIfNotNull("from", sender); + req.putIfNotNull("senders", senders); Map result = await _emConversationChannel.invokeMethod( ChatMethodKeys.loadMsgWithKeywords, req); @@ -979,8 +979,8 @@ class EMConversation { required int endMs, }) async { Map req = _toJson(); - req.putIfNotNull("startMs", startMs); - req.putIfNotNull("endMs", endMs); + req.putIfNotNull("startTs", startMs); + req.putIfNotNull("endTs", endMs); Map result = await _emConversationChannel.invokeMethod( ChatMethodKeys.conversationGetLocalMessageCount, req); try { @@ -1046,7 +1046,7 @@ class EMConversation { Future deleteLocalAndServerMessagesByTime( {required int beforeMs}) async { Map req = _toJson(); - req.putIfNotNull("beforeMs", beforeMs); + req.putIfNotNull("beforeTs", beforeMs); Map result = await _emConversationChannel.invokeMethod( ChatMethodKeys.conversationDeleteServerMessageWithTime, req); try { diff --git a/im_flutter_sdk_interface/lib/src/models/em_group.dart b/im_flutter_sdk_interface/lib/src/models/em_group.dart index 1c06fb14..79016fef 100644 --- a/im_flutter_sdk_interface/lib/src/models/em_group.dart +++ b/im_flutter_sdk_interface/lib/src/models/em_group.dart @@ -14,6 +14,7 @@ class EMGroup { EMGroup({ required this.groupId, this.name, + this.avatarUrl, this.description, this.owner, this.announcement, @@ -58,6 +59,15 @@ class EMGroup { /// ~end final String? name; + /// ~english + /// Gets the group avatar. + /// ~end + /// + /// ~chinese + /// 从内存中获取群组头像。 + /// ~end + final String? avatarUrl; + /// ~english /// Gets the group description. /// @@ -347,6 +357,7 @@ class EMGroup { factory EMGroup.fromJson(Map map) { String groupId = map['groupId']; String? name = map["name"]; + String? avatarUrl = map["avatarUrl"]; String? description = map["desc"]; String? owner = map["owner"]; String? announcement = map["announcement"]; @@ -358,7 +369,7 @@ class EMGroup { bool? messageBlocked = map["messageBlocked"]; bool? isAllMemberMuted = map["isAllMemberMuted"]; EMGroupPermissionType? permissionType = - _EMGroupPermissionType.values(map['permissionType']); + EMGroupPermissionTypeExtension.values(map['permissionType']); int? maxUserCount = map["maxUserCount"]; bool? isMemberOnly = map["isMemberOnly"]; bool? isMemberAllowToInvite = map["isMemberAllowToInvite"]; @@ -367,6 +378,7 @@ class EMGroup { return EMGroup( groupId: groupId, + avatarUrl: avatarUrl, name: name, description: description, owner: owner, @@ -391,6 +403,7 @@ class EMGroup { Map data = {}; data.putIfNotNull("groupId", groupId); data.putIfNotNull("name", name); + data.putIfNotNull("avatarUrl", avatarUrl); data.putIfNotNull("desc", description); data.putIfNotNull("owner", owner); data.putIfNotNull("announcement", announcement); @@ -453,9 +466,3 @@ class EMGroupInfo { ); } } - -extension _EMGroupPermissionType on EMGroupPermissionType { - static EMGroupPermissionType values(int type) { - return EMGroupPermissionType.values[type + 1]; - } -} diff --git a/im_flutter_sdk_interface/lib/src/models/em_group_message_ack.dart b/im_flutter_sdk_interface/lib/src/models/em_group_message_ack.dart index 0d59ba6a..15ab152f 100644 --- a/im_flutter_sdk_interface/lib/src/models/em_group_message_ack.dart +++ b/im_flutter_sdk_interface/lib/src/models/em_group_message_ack.dart @@ -91,7 +91,7 @@ class EMGroupMessageAck { factory EMGroupMessageAck.fromJson(Map map) { EMGroupMessageAck ack = EMGroupMessageAck( ackId: map["ack_id"], - messageId: map["msg_id"] as String, + messageId: map["msgId"] as String, from: map["from"] as String, content: map["content"], readCount: map["count"] ?? 0, diff --git a/im_flutter_sdk_interface/lib/src/models/em_message.dart b/im_flutter_sdk_interface/lib/src/models/em_message.dart index 56883b47..4bc34228 100644 --- a/im_flutter_sdk_interface/lib/src/models/em_message.dart +++ b/im_flutter_sdk_interface/lib/src/models/em_message.dart @@ -545,6 +545,7 @@ class EMMessage { String? displayName, String? thumbnailLocalPath, bool sendOriginalImage = false, + bool isGif = false, int? fileSize, double? width, double? height, @@ -559,6 +560,7 @@ class EMMessage { sendOriginalImage: sendOriginalImage, width: width, height: height, + isGif: isGif, )); /// ~english @@ -909,7 +911,7 @@ class EMMessage { data.putIfNotNull("hasDeliverAck", hasDeliverAck); data.putIfNotNull("needGroupAck", needGroupAck); data.putIfNotNull("msgId", msgId); - data.putIfNotNull("conversationId", conversationId ?? to); + data.putIfNotNull("convId", conversationId ?? to); data.putIfNotNull("chatType", chatType.index); data.putIfNotNull("localTime", localTime); data.putIfNotNull("serverTime", serverTime); @@ -939,7 +941,7 @@ class EMMessage { ..needGroupAck = map.boolValue('needGroupAck') ..hasDeliverAck = map.boolValue('hasDeliverAck') .._msgId = map["msgId"] - ..conversationId = map["conversationId"] + ..conversationId = map["convId"] ..chatType = ChatType.values[map["chatType"]] ..localTime = map["localTime"] ?? 0 ..serverTime = map["serverTime"] ?? 0 @@ -1482,6 +1484,7 @@ class EMImageMessageBody extends EMFileMessageBody { super.fileSize, this.width, this.height, + this.isGif = false, }) : super( type: MessageType.IMAGE, ); @@ -1495,6 +1498,7 @@ class EMImageMessageBody extends EMFileMessageBody { height = (map["height"] ?? 0).toDouble(); width = (map["width"] ?? 0).toDouble(); thumbnailStatus = DownloadStatus.values[map["thumbnailStatus"]]; + isGif = map["isGif"] ?? false; } @override @@ -1507,6 +1511,7 @@ class EMImageMessageBody extends EMFileMessageBody { data.putIfNotNull("height", height ?? 0.0); data.putIfNotNull("width", width ?? 0.0); data.putIfNotNull("thumbnailStatus", thumbnailStatus.index); + data.putIfNotNull('isGif', isGif); return data; } @@ -1577,6 +1582,12 @@ class EMImageMessageBody extends EMFileMessageBody { /// 图片高度,单位为像素。 /// ~end double? height; + + /// ~english + /// ~end + /// ~chinese + /// ~end + bool isGif = false; } /// ~english diff --git a/im_flutter_sdk_interface/lib/src/models/em_message_reaction.dart b/im_flutter_sdk_interface/lib/src/models/em_message_reaction.dart index 5bd161fd..1581a9c9 100644 --- a/im_flutter_sdk_interface/lib/src/models/em_message_reaction.dart +++ b/im_flutter_sdk_interface/lib/src/models/em_message_reaction.dart @@ -150,8 +150,8 @@ class EMMessageReactionEvent { }); factory EMMessageReactionEvent.fromJson(Map map) { - String conversationId = map["conversationId"]; - String messageId = map["messageId"]; + String conversationId = map["convId"]; + String messageId = map["msgId"]; List reactions = []; map["reactions"]?.forEach((element) { reactions.add(EMMessageReaction.fromJson(element)); diff --git a/im_flutter_sdk_interface/lib/src/models/fetch_message_options.dart b/im_flutter_sdk_interface/lib/src/models/fetch_message_options.dart index 36d6ba2f..17c7303a 100644 --- a/im_flutter_sdk_interface/lib/src/models/fetch_message_options.dart +++ b/im_flutter_sdk_interface/lib/src/models/fetch_message_options.dart @@ -1,3 +1,5 @@ +// ignore_for_file: deprecated_member_use_from_same_package + import '../internal/inner_headers.dart'; /// ~english @@ -15,6 +17,8 @@ class FetchMessageOptions { /// /// Param [from] The user ID of the message sender in the group conversation. /// + /// Param [senders] The user IDs of the message senders in the group conversation. + /// /// Param [msgTypes] The array of message types for query. The default value is `null`, indicating that all types of messages are retrieved. /// /// Param [startTs] The start time for message query. The time is a UNIX timestamp in milliseconds. @@ -43,6 +47,8 @@ class FetchMessageOptions { /// /// Param [from] 群组会话中的消息发送方的用户 ID。 /// + /// Param [senders] 群组会话中的消息发送方的用户 ID 列表。 + /// /// Param [msgTypes] 要查询的消息类型数组。默认值为 `null`,表示返回所有类型的消息。 /// /// Param [startTs] 消息查询的起始时间,Unix 时间戳,单位为毫秒。默认为 `-1`,表示消息查询时会忽略该参数。 @@ -59,6 +65,7 @@ class FetchMessageOptions { /// ~end const FetchMessageOptions({ this.from, + this.senders, this.msgTypes, this.startTs = -1, this.endTs = -1, @@ -66,6 +73,8 @@ class FetchMessageOptions { this.direction = EMSearchDirection.Up, }); + @Deprecated('Use [senders] instead') + /// ~english /// The user ID of the message sender in the group conversation. /// ~end @@ -75,6 +84,15 @@ class FetchMessageOptions { /// ~end final String? from; + /// ~english + /// The user IDs of the message senders in the group conversation. + /// ~end + /// + /// ~chinese + /// 群组会话中的消息发送方的用户 ID 列表。 + /// ~end + final List? senders; + /// ~english /// The array of message types for query. The default value is `null`, indicating that all types of messages are retrieved. /// ~end @@ -144,6 +162,7 @@ class FetchMessageOptions { data.putIfNotNull('startTs', startTs); data.putIfNotNull('endTs', endTs); data.putIfNotNull('from', from); + data.putIfNotNull('senders', senders); data.putIfNotNull('needSave', needSave); data.putIfNotNull( 'msgTypes', msgTypes?.toSet().map((e) => e.index).toList()); diff --git a/im_flutter_sdk_interface/lib/src/models/group_member_info.dart b/im_flutter_sdk_interface/lib/src/models/group_member_info.dart new file mode 100644 index 00000000..6bbbdfff --- /dev/null +++ b/im_flutter_sdk_interface/lib/src/models/group_member_info.dart @@ -0,0 +1,17 @@ +import 'package:im_flutter_sdk_interface/im_flutter_sdk_interface.dart'; + +class GroupMemberInfo { + final String userId; + final int joinedTs; + final EMGroupPermissionType role; + GroupMemberInfo( + this.userId, + this.joinedTs, + this.role, + ); + + GroupMemberInfo.fromJson(Map map) + : userId = map["userId"], + joinedTs = map["joinedTs"], + role = EMGroupPermissionTypeExtension.values(map["role"]); +} diff --git a/im_flutter_sdk_interface/lib/src/models/recall_message_info.dart b/im_flutter_sdk_interface/lib/src/models/recall_message_info.dart index 78e339af..e854f21b 100644 --- a/im_flutter_sdk_interface/lib/src/models/recall_message_info.dart +++ b/im_flutter_sdk_interface/lib/src/models/recall_message_info.dart @@ -5,7 +5,7 @@ class RecallMessageInfo { return RecallMessageInfo( recallMessageId: map['recallMsgId'], recallBy: map['recallBy'], - conversationId: map['conversationId'], + conversationId: map['convId'], recallMessage: map.getValue( "msg", callback: (map) { diff --git a/im_flutter_sdk_interface/pubspec.yaml b/im_flutter_sdk_interface/pubspec.yaml index 900aab75..322bbd67 100644 --- a/im_flutter_sdk_interface/pubspec.yaml +++ b/im_flutter_sdk_interface/pubspec.yaml @@ -1,6 +1,6 @@ name: im_flutter_sdk_interface description: Integrate the Chat SDK to enjoy the global IM services with high reliability, ultra-low latency, and high concurrency. -version: 4.13.0+1 +version: 4.14.0 homepage: https://www.easemob.com environment: diff --git a/im_flutter_sdk_ios/ios/Classes/ChatHeaders.h b/im_flutter_sdk_ios/ios/Classes/ChatHeaders.h index 773c49c7..59895560 100644 --- a/im_flutter_sdk_ios/ios/Classes/ChatHeaders.h +++ b/im_flutter_sdk_ios/ios/Classes/ChatHeaders.h @@ -177,7 +177,7 @@ #define EMConnectionConnected AgoraChatConnectionConnected #define EMMultiDevicesEvent AgoraChatMultiDevicesEvent - +#define EMGroupMemberInfo AgoraGroupMemberInfo #else #import diff --git a/im_flutter_sdk_ios/ios/Classes/ChatManagerWrapper.m b/im_flutter_sdk_ios/ios/Classes/ChatManagerWrapper.m index 3b36db8d..bbc32868 100644 --- a/im_flutter_sdk_ios/ios/Classes/ChatManagerWrapper.m +++ b/im_flutter_sdk_ios/ios/Classes/ChatManagerWrapper.m @@ -328,7 +328,7 @@ - (void)ackMessageRead:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self) weakSelf = self; - NSString *msgId = param[@"msg_id"]; + NSString *msgId = param[@"msgId"]; NSString *to = param[@"to"]; [EMClient.sharedClient.chatManager sendMessageReadAck:msgId toUser:to @@ -345,7 +345,7 @@ - (void)ackGroupMessageRead:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self) weakSelf = self; - NSString *msgId = param[@"msg_id"]; + NSString *msgId = param[@"msgId"]; NSString *groupId = param[@"group_id"]; NSString *content = param[@"content"]; [EMClient.sharedClient.chatManager sendGroupMessageReadAck:msgId @@ -380,7 +380,7 @@ - (void)recallMessage:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self) weakSelf = self; - NSString *msgId = param[@"msg_id"]; + NSString *msgId = param[@"msgId"]; NSString *ext = param[@"ext"]; EMChatMessage *msg = [EMClient.sharedClient.chatManager getMessageWithMessageId:msgId]; if (!msg) { @@ -406,7 +406,7 @@ - (void)getMessageWithMessageId:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self) weakSelf = self; - NSString *msgId = param[@"msg_id"]; + NSString *msgId = param[@"msgId"]; EMChatMessage *msg = [EMClient.sharedClient.chatManager getMessageWithMessageId:msgId]; [weakSelf wrapperCallBack:result channelName:aChannelName @@ -830,7 +830,7 @@ - (void)fetchHistoryMessagesByOptions:(NSDictionary *)param - (void)fetchGroupReadAck:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult) result { - NSString *msgId = param[@"msg_id"]; + NSString *msgId = param[@"msgId"]; int pageSize = [param[@"pageSize"] intValue]; NSString *ackId = param[@"ack_id"]; __weak typeof(self) weakSelf = self; @@ -897,7 +897,7 @@ - (void)deleteRemoteConversation:(NSDictionary *)param result:(FlutterResult)result { __weak typeof(self) weakSelf = self; - NSString *conversationId = param[@"conversationId"]; + NSString *conversationId = param[@"convId"]; EMConversationType type = [EnumTools conversationTypeFromInt:[param[@"conversationType"] intValue]]; BOOL isDeleteRemoteMessage = [param[@"isDeleteRemoteMessage"] boolValue]; @@ -1487,8 +1487,8 @@ - (void)onMessagePinChanged:(NSString *)messageId operation:(EMMessagePinOperation)pinOperation pinInfo:(EMMessagePinInfo *)pinInfo{ NSDictionary *dict = @{ - @"messageId": messageId, - @"conversationId": conversationId, + @"msgId": messageId, + @"convId": conversationId, @"pinOperation": @(pinOperation), @"pinInfo": [pinInfo toJson] }; diff --git a/im_flutter_sdk_ios/ios/Classes/ClientWrapper.m b/im_flutter_sdk_ios/ios/Classes/ClientWrapper.m index 7cd65617..9088d1ca 100644 --- a/im_flutter_sdk_ios/ios/Classes/ClientWrapper.m +++ b/im_flutter_sdk_ios/ios/Classes/ClientWrapper.m @@ -342,7 +342,7 @@ - (ProgressManager *)progressManager { - (void)createAccount:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self)weakSelf = self; - NSString *username = param[@"username"]; + NSString *username = param[@"userId"]; NSString *password = param[@"password"]; [EMClient.sharedClient registerWithUsername:username password:password @@ -357,7 +357,7 @@ - (void)createAccount:(NSDictionary *)param channelName:(NSString *)aChannelName - (void)login:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self)weakSelf = self; - NSString *username = param[@"username"]; + NSString *username = param[@"userId"]; NSString *pwdOrToken = param[@"pwdOrToken"]; BOOL isPwd = [param[@"isPassword"] boolValue]; @@ -442,7 +442,7 @@ - (void)compressLogs:(NSDictionary *)param channelName:(NSString *)aChannelName - (void)kickDevice:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self)weakSelf = self; - NSString *username = param[@"username"]; + NSString *username = param[@"userId"]; NSString *pwdOrToken = param[@"password"]; NSString *resource = param[@"resource"]; bool isPwd = [param[@"isPwd"] boolValue]; @@ -469,7 +469,7 @@ - (void)kickDevice:(NSDictionary *)param channelName:(NSString *)aChannelName re - (void)kickAllDevices:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self)weakSelf = self; - NSString *username = param[@"username"]; + NSString *username = param[@"userId"]; NSString *pwdOrToken = param[@"password"]; bool isPwd = [param[@"isPwd"] boolValue]; if(isPwd) { @@ -503,7 +503,7 @@ - (void)isLoggedInBefore:(NSDictionary *)param channelName:(NSString *)aChannelN - (void)loginWithAgoraToken:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self) weakSelf = self; - NSString *username = param[@"username"]; + NSString *username = param[@"userId"]; NSString *agoraToken = param[@"agora_token"]; [EMClient.sharedClient loginWithUsername:username agoraToken:agoraToken @@ -545,7 +545,7 @@ - (void)renewToken:(NSDictionary *)param channelName:(NSString *)aChannelName re - (void)getLoggedInDevicesFromServer:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self)weakSelf = self; - NSString *username = param[@"username"]; + NSString *username = param[@"userId"]; NSString *pwdOrToken = param[@"password"]; bool isPwd = [param[@"isPwd"] boolValue]; if(isPwd) { @@ -695,7 +695,7 @@ - (void)multiDevicesGroupEventDidReceive:(EMMultiDevicesEvent)aEvent NSMutableDictionary *data = [NSMutableDictionary dictionary]; data[@"event"] = @(aEvent); data[@"target"] = aGroupId; - data[@"users"] = aExt; + data[@"userIds"] = aExt; [self.channel invokeMethod:ChatOnMultiDeviceGroupEvent arguments:data]; } @@ -705,7 +705,7 @@ - (void)multiDevicesChatThreadEventDidReceive:(EMMultiDevicesEvent)aEvent NSMutableDictionary *data = [NSMutableDictionary dictionary]; data[@"event"] = @(aEvent); data[@"threadId"] = aThreadId; - data[@"users"] = aExt; + data[@"userIds"] = aExt; [self.channel invokeMethod:ChatOnMultiDeviceThreadEvent arguments:data]; } diff --git a/im_flutter_sdk_ios/ios/Classes/ContactManagerWrapper.m b/im_flutter_sdk_ios/ios/Classes/ContactManagerWrapper.m index 000d8940..82c83a08 100644 --- a/im_flutter_sdk_ios/ios/Classes/ContactManagerWrapper.m +++ b/im_flutter_sdk_ios/ios/Classes/ContactManagerWrapper.m @@ -107,7 +107,7 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { #pragma mark - Actions - (void)addContact:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self)weakSelf = self; - NSString *username = param[@"username"]; + NSString *username = param[@"userId"]; NSString *reason = param[@"reason"]; [EMClient.sharedClient.contactManager addContact:username message:reason @@ -122,7 +122,7 @@ - (void)addContact:(NSDictionary *)param channelName:(NSString *)aChannelName re - (void)deleteContact:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self)weakSelf = self; - NSString *username = param[@"username"]; + NSString *username = param[@"userId"]; BOOL keepConversation = [param[@"keepConversation"] boolValue]; [EMClient.sharedClient.contactManager deleteContact:username isDeleteConversation:keepConversation @@ -158,7 +158,7 @@ - (void)getAllContactsFromDB:(NSDictionary *)param channelName:(NSString *)aChan - (void)addUserToBlockList:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self)weakSelf = self; - NSString *username = param[@"username"]; + NSString *username = param[@"userId"]; [EMClient.sharedClient.contactManager addUserToBlackList:username completion:^(NSString *aUsername, EMError *aError) { @@ -171,7 +171,7 @@ - (void)addUserToBlockList:(NSDictionary *)param channelName:(NSString *)aChanne - (void)removeUserFromBlockList:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self)weakSelf = self; - NSString *username = param[@"username"]; + NSString *username = param[@"userId"]; [EMClient.sharedClient.contactManager removeUserFromBlackList:username completion:^(NSString *aUsername, EMError *aError) { @@ -202,7 +202,7 @@ - (void)getBlockListFromDB:(NSDictionary *)param channelName:(NSString *)aChanne - (void)acceptInvitation:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self)weakSelf = self; - NSString *username = param[@"username"]; + NSString *username = param[@"userId"]; [EMClient.sharedClient.contactManager approveFriendRequestFromUser:username completion:^(NSString *aUsername, EMError *aError) { @@ -215,7 +215,7 @@ - (void)acceptInvitation:(NSDictionary *)param channelName:(NSString *)aChannelN - (void)declineInvitation:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self)weakSelf = self; - NSString *username = param[@"username"]; + NSString *username = param[@"userId"]; [EMClient.sharedClient.contactManager declineFriendRequestFromUser:username completion:^(NSString *aUsername, EMError *aError) { @@ -320,7 +320,7 @@ - (void)friendshipDidAddByUser:(NSString *)aUsername { [ListenerHandle.sharedInstance addHandle:^{ NSDictionary *map = @{ @"type":@"onContactAdded", - @"username":aUsername + @"userId":aUsername }; [weakSelf.channel invokeMethod:ChatOnContactChanged arguments:map]; }]; @@ -332,7 +332,7 @@ - (void)friendshipDidRemoveByUser:(NSString *)aUsername { [ListenerHandle.sharedInstance addHandle:^{ NSDictionary *map = @{ @"type":@"onContactDeleted", - @"username":aUsername + @"userId":aUsername }; [weakSelf.channel invokeMethod:ChatOnContactChanged arguments:map]; }]; @@ -344,7 +344,7 @@ - (void)friendRequestDidReceiveFromUser:(NSString *)aUsername [ListenerHandle.sharedInstance addHandle:^{ NSDictionary *map = @{ @"type":@"onContactInvited", - @"username":aUsername, + @"userId":aUsername, @"reason":aMessage }; [weakSelf.channel invokeMethod:ChatOnContactChanged arguments:map]; @@ -357,7 +357,7 @@ - (void)friendRequestDidApproveByUser:(NSString *)aUsername { [ListenerHandle.sharedInstance addHandle:^{ NSDictionary *map = @{ @"type":@"onFriendRequestAccepted", - @"username":aUsername + @"userId":aUsername }; [weakSelf.channel invokeMethod:ChatOnContactChanged arguments:map]; }]; @@ -368,7 +368,7 @@ - (void)friendRequestDidDeclineByUser:(NSString *)aUsername { [ListenerHandle.sharedInstance addHandle:^{ NSDictionary *map = @{ @"type":@"onFriendRequestDeclined", - @"username":aUsername + @"userId":aUsername }; [weakSelf.channel invokeMethod:ChatOnContactChanged arguments:map]; }]; diff --git a/im_flutter_sdk_ios/ios/Classes/ConversationWrapper.m b/im_flutter_sdk_ios/ios/Classes/ConversationWrapper.m index a7b8e483..400c93c1 100644 --- a/im_flutter_sdk_ios/ios/Classes/ConversationWrapper.m +++ b/im_flutter_sdk_ios/ios/Classes/ConversationWrapper.m @@ -110,10 +110,6 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { [self messageCount:call.arguments channelName:call.method result:result]; - } else if ([ChatRemoveMsgFromServerWithMsgList isEqualToString:call.method]) { - [self removeMsgFromServerWithMsgList:call.arguments - channelName:call.method - result:result]; } else if ([ChatRemoveMsgFromServerWithTimeStamp isEqualToString:call.method]) { [self removeMsgFromServerWithTimeStamp:call.arguments channelName:call.method @@ -231,7 +227,7 @@ - (void)markMessageAsRead:(NSDictionary *)param [self getConversationWithParam:param completion:^(EMConversation *conversation) { - NSString *msgId = param[@"msg_id"]; + NSString *msgId = param[@"msgId"]; EMError *error = nil; [conversation markMessageAsReadWithId:msgId error:&error]; @@ -383,7 +379,7 @@ - (void)removeMessage:(NSDictionary *)param channelName:(NSString *)aChannelName [self getConversationWithParam:param completion:^(EMConversation *conversation) { - NSString *msgId = param[@"msg_id"]; + NSString *msgId = param[@"msgId"]; EMError *error = nil; [conversation deleteMessageWithId:msgId error:&error]; @@ -442,21 +438,6 @@ - (void)deleteMessagesWithTs:(NSDictionary *)param channelName:(NSString *)aChan }]; } -- (void)removeMsgFromServerWithMsgList:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result -{ - __weak typeof(self) weakSelf = self; - [self getConversationWithParam:param - completion:^(EMConversation *conversation){ - NSArray *msgIds = param[@"msgIds"]; - [conversation removeMessagesFromServerMessageIds:msgIds completion:^(EMError * _Nullable aError) { - [weakSelf wrapperCallBack:result - channelName:aChannelName - error:aError - object:nil]; - }]; - }]; -} - - (void)removeMsgFromServerWithTimeStamp:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self) weakSelf = self; @@ -476,7 +457,7 @@ - (void)removeMsgFromServerWithTimeStamp:(NSDictionary *)param channelName:(NSSt - (void)loadMsgWithId:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self) weakSelf = self; - NSString *msgId = param[@"msg_id"]; + NSString *msgId = param[@"msgId"]; [self getConversationWithParam:param completion:^(EMConversation *conversation) { @@ -556,17 +537,16 @@ - (void)loadMsgWithKeywords:(NSDictionary *)param channelName:(NSString *)aChann NSString * keywords = param[@"keywords"]; long long timestamp = [param[@"timestamp"] longLongValue]; int count = [param[@"count"] intValue]; - NSString *sender = param[@"from"]; + NSArray *senders = param[@"senders"]; EMMessageSearchScope scope = (EMMessageSearchScope)[param[@"searchScope"] intValue]; EMMessageSearchDirection direction = [EnumTools searchDirectionFromInt:[param[@"direction"] integerValue]]; [self getConversationWithParam:param completion:^(EMConversation *conversation) { - [conversation loadMessagesWithKeyword:keywords timestamp:timestamp count:count - fromUser:sender + fromUsers:senders searchDirection:direction scope:scope completion:^(NSArray *aMessages, EMError *aError) @@ -685,8 +665,8 @@ - (void)searchMessageByOptions:(NSDictionary *)param - (void)getLocalMessageCount:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result{ - NSInteger startMs = [param[@"startMs"] integerValue]; - NSInteger endMs = [param[@"endMs"] longLongValue]; + NSInteger startMs = [param[@"startTs"] integerValue]; + NSInteger endMs = [param[@"endTs"] longLongValue]; __weak typeof(self) weakSelf = self; [self getConversationWithParam:param @@ -721,7 +701,7 @@ - (void)deleteServerMessages:(NSDictionary *)param - (void)deleteServerMessagesByTime:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result{ - long long ts = [param[@"beforeMs"] longLongValue]; + long long ts = [param[@"beforeTs"] longLongValue]; __weak typeof(self) weakSelf = self; [self getConversationWithParam:param completion:^(EMConversation *conversation) diff --git a/im_flutter_sdk_ios/ios/Classes/FetchServerMessagesOptionHelper.m b/im_flutter_sdk_ios/ios/Classes/FetchServerMessagesOptionHelper.m index 61879aaa..6a1221e0 100644 --- a/im_flutter_sdk_ios/ios/Classes/FetchServerMessagesOptionHelper.m +++ b/im_flutter_sdk_ios/ios/Classes/FetchServerMessagesOptionHelper.m @@ -16,6 +16,7 @@ + (EMFetchServerMessagesOption *)fromJson:(NSDictionary *)dict { options.startTime = [dict[@"startTs"] longValue]; options.endTime = [dict[@"endTs"] longValue]; options.from = dict[@"from"]; + options.fromIds = dict[@"senders"]; options.isSave = [dict[@"needSave"] boolValue]; NSArray *types = dict[@"msgTypes"]; NSMutableArray *list = [NSMutableArray new]; diff --git a/im_flutter_sdk_ios/ios/Classes/GroupHelper.m b/im_flutter_sdk_ios/ios/Classes/GroupHelper.m index a9030e9d..06db352a 100644 --- a/im_flutter_sdk_ios/ios/Classes/GroupHelper.m +++ b/im_flutter_sdk_ios/ios/Classes/GroupHelper.m @@ -15,6 +15,7 @@ - (NSDictionary *)toJson { NSMutableDictionary *ret = [NSMutableDictionary dictionary]; ret[@"groupId"] = self.groupId; ret[@"name"] = self.groupName; + ret[@"avatarUrl"] = self.groupAvatar; ret[@"desc"] = self.description; ret[@"owner"] = self.owner; ret[@"announcement"] = self.announcement; diff --git a/im_flutter_sdk_ios/ios/Classes/GroupManagerWrapper.m b/im_flutter_sdk_ios/ios/Classes/GroupManagerWrapper.m index 570b1995..82f73a8e 100644 --- a/im_flutter_sdk_ios/ios/Classes/GroupManagerWrapper.m +++ b/im_flutter_sdk_ios/ios/Classes/GroupManagerWrapper.m @@ -9,6 +9,7 @@ #import "GroupManagerWrapper.h" #import "GroupHelper.h" +#import "GroupMemberInfoHelper.h" #import "CursorResultHelper.h" #import "ListenerHandle.h" #import "MethodKeys.h" @@ -41,7 +42,7 @@ - (void)handleMethodCall:(FlutterMethodCall*)call if([ChatGetGroupWithId isEqualToString:call.method]) { [self getGroupWithId:call.arguments - channelName:call.method + channelName:call.method result:result]; } else if ([ChatGetJoinedGroups isEqualToString:call.method]) @@ -50,7 +51,7 @@ - (void)handleMethodCall:(FlutterMethodCall*)call channelName:call.method result:result]; } - + else if ([ChatGetJoinedGroupsFromServer isEqualToString:call.method]) { [self getJoinedGroupsFromServer:call.arguments @@ -325,6 +326,13 @@ - (void)handleMethodCall:(FlutterMethodCall*)call else if ([isMemberInGroupMuteList isEqualToString:call.method]) { [self isMemberInGroupMuteList:call.arguments channelName:call.method result:result]; } + // 4.14.0 + else if ([fetchGroupMembersInfo isEqual:call.method]) { + [self fetchGroupMembersInfo:call.arguments channelName:call.method result:result]; + } + else if ([updateGroupAvatar isEqual:call.method]) { + [self updateGroupAvatar:call.arguments channelName:call.method result:result]; + } else { [super handleMethodCall:call result:result]; @@ -380,7 +388,7 @@ - (void)getJoinedGroupsFromServer:(NSDictionary *)param channelName:(NSString *) error:aError object:list]; }]; - + } - (void)getPublicGroupsFromServer:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { @@ -399,6 +407,7 @@ - (void)getPublicGroupsFromServer:(NSDictionary *)param channelName:(NSString *) - (void)createGroup:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self) weakSelf = self; [EMClient.sharedClient.groupManager createGroupWithSubject:param[@"groupName"] + avatar:param[@"avatar"] description:param[@"desc"] invitees:param[@"inviteMembers"] message:param[@"inviteReason"] @@ -542,9 +551,9 @@ - (void)addMembers:(NSDictionary *)param channelName:(NSString *)aChannelName re - (void)inviterUsers:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self) weakSelf = self; [EMClient.sharedClient.groupManager addMembers:param[@"members"] - toGroup:param[@"groupId"] - message:param[@"reason"] - completion:^(EMGroup *aGroup, EMError *aError) { + toGroup:param[@"groupId"] + message:param[@"reason"] + completion:^(EMGroup *aGroup, EMError *aError) { [weakSelf wrapperCallBack:result channelName:aChannelName error:aError @@ -772,15 +781,15 @@ - (void)addWhiteList:(NSDictionary *)param channelName:(NSString *)aChannelName } - (void)removeWhiteList:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { - __weak typeof(self) weakSelf = self; - [EMClient.sharedClient.groupManager removeWhiteListMembers:param[@"members"] - fromGroup:param[@"groupId"] - completion:^(EMGroup *aGroup, EMError *aError) { - [weakSelf wrapperCallBack:result - channelName:aChannelName - error:aError - object:[aGroup toJson]]; - }]; + __weak typeof(self) weakSelf = self; + [EMClient.sharedClient.groupManager removeWhiteListMembers:param[@"members"] + fromGroup:param[@"groupId"] + completion:^(EMGroup *aGroup, EMError *aError) { + [weakSelf wrapperCallBack:result + channelName:aChannelName + error:aError + object:[aGroup toJson]]; + }]; } @@ -818,9 +827,9 @@ - (void)downloadGroupSharedFile:(NSDictionary *)param channelName:(NSString *)aC } }]; [self wrapperCallBack:result - channelName:aChannelName - error:nil - object:@(YES)]; + channelName:aChannelName + error:nil + object:@(YES)]; } - (void)removeGroupSharedFile:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { @@ -892,7 +901,7 @@ - (void)requestToJoinPublicGroup:(NSDictionary *)param channelName:(NSString *)a - (void)acceptJoinApplication:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self) weakSelf = self; [EMClient.sharedClient.groupManager approveJoinGroupRequest:param[@"groupId"] - sender:param[@"username"] + sender:param[@"userId"] completion:^(EMGroup *aGroup, EMError *aError) { [weakSelf wrapperCallBack:result @@ -905,7 +914,7 @@ - (void)acceptJoinApplication:(NSDictionary *)param channelName:(NSString *)aCha - (void)declineJoinApplication:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self) weakSelf = self; [EMClient.sharedClient.groupManager declineJoinGroupRequest:param[@"groupId"] - sender:param[@"username"] + sender:param[@"userId"] reason:param[@"reason"] completion:^(EMGroup *aGroup, EMError *aError) { @@ -1000,9 +1009,9 @@ - (void)fetchMemberAttributes:(NSDictionary *)param channelName:(NSString *)aCha userId = EMClient.sharedClient.currentUsername; } [EMClient.sharedClient.groupManager fetchMemberAttribute:groupId - userId:userId - completion:^(NSDictionary * properties, EMError * aError) - { + userId:userId + completion:^(NSDictionary * properties, EMError * aError) + { [weakSelf wrapperCallBack:result channelName:aChannelName error:aError @@ -1019,7 +1028,7 @@ - (void)fetchMembersAttributes:(NSDictionary *)param channelName:(NSString *)aCh if(!keys) { keys = [NSArray new]; } - + [EMClient.sharedClient.groupManager fetchMembersAttributes:groupId userIds:userIds keys:keys completion:^(NSDictionary *> * _Nullable attributes, EMError * _Nullable error) { [weakSelf wrapperCallBack:result channelName:aChannelName @@ -1031,7 +1040,7 @@ - (void)fetchMembersAttributes:(NSDictionary *)param channelName:(NSString *)aCh - (void)fetchJoinedGroupCount:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self) weakSelf = self; - + [EMClient.sharedClient.groupManager getJoinedGroupsCountFromServerWithCompletion:^(NSInteger groupCount, EMError * _Nullable aError) { [weakSelf wrapperCallBack:result channelName:aChannelName @@ -1048,7 +1057,7 @@ - (void)groupInvitationDidReceive:(NSString *)aGroupId inviter:(NSString * _Nonnull)aInviter message:(NSString * _Nullable)aMessage { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1060,14 +1069,14 @@ - (void)groupInvitationDidReceive:(NSString *)aGroupId @"message":aMessage }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } - (void)groupInvitationDidAccept:(EMGroup *)aGroup invitee:(NSString *)aInvitee { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1077,7 +1086,7 @@ - (void)groupInvitationDidAccept:(EMGroup *)aGroup @"invitee":aInvitee }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } @@ -1085,7 +1094,7 @@ - (void)groupInvitationDidAccept:(EMGroup *)aGroup - (void)groupInvitationDidDecline:(EMGroup *)aGroup invitee:(NSString *)aInvitee reason:(NSString *)aReason { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1096,14 +1105,14 @@ - (void)groupInvitationDidDecline:(EMGroup *)aGroup @"reason":aReason }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } - (void)didJoinGroup:(EMGroup *)aGroup inviter:(NSString *)aInviter message:(NSString *)aMessage { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1114,13 +1123,13 @@ - (void)didJoinGroup:(EMGroup *)aGroup @"inviter":aInviter }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } - (void)didLeaveGroup:(EMGroup *)aGroup reason:(EMGroupLeaveReason)aReason { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1136,7 +1145,7 @@ - (void)didLeaveGroup:(EMGroup *)aGroup @"groupName":aGroup.groupName }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } @@ -1144,7 +1153,7 @@ - (void)didLeaveGroup:(EMGroup *)aGroup - (void)joinGroupRequestDidReceive:(EMGroup *)aGroup user:(NSString *)aUsername reason:(NSString *)aReason { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1155,7 +1164,7 @@ - (void)joinGroupRequestDidReceive:(EMGroup *)aGroup @"reason":aReason }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } @@ -1163,7 +1172,7 @@ - (void)joinGroupRequestDidDecline:(NSString *_Nonnull)aGroupId reason:(NSString *_Nullable)aReason decliner:(NSString *_Nullable)aDecliner applicant:(NSString* _Nonnull )aApplicant { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1175,12 +1184,12 @@ - (void)joinGroupRequestDidDecline:(NSString *_Nonnull)aGroupId @"applicant": aApplicant }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } - (void)joinGroupRequestDidApprove:(EMGroup *)aGroup { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1191,14 +1200,14 @@ - (void)joinGroupRequestDidApprove:(EMGroup *)aGroup { @"accepter":aGroup.owner, }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } - (void)groupMuteListDidUpdate:(EMGroup *)aGroup addedMutedMembers:(NSArray *)aMutedMembers muteExpire:(NSInteger)aMuteExpire { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1209,7 +1218,7 @@ - (void)groupMuteListDidUpdate:(EMGroup *)aGroup @"muteExpire":[NSNumber numberWithInteger:aMuteExpire] }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } @@ -1223,13 +1232,13 @@ - (void)groupMuteListDidUpdate:(EMGroup *)aGroup @"mutes":aMutedMembers }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } - (void)groupWhiteListDidUpdate:(EMGroup *)aGroup addedWhiteListMembers:(NSArray *)aMembers { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1239,13 +1248,13 @@ - (void)groupWhiteListDidUpdate:(EMGroup *)aGroup @"whitelist":aMembers }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } - (void)groupWhiteListDidUpdate:(EMGroup *)aGroup removedWhiteListMembers:(NSArray *)aMembers { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1255,13 +1264,13 @@ - (void)groupWhiteListDidUpdate:(EMGroup *)aGroup @"whitelist":aMembers }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } - (void)groupAllMemberMuteChanged:(EMGroup *)aGroup isAllMemberMuted:(BOOL)aMuted { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1271,13 +1280,13 @@ - (void)groupAllMemberMuteChanged:(EMGroup *)aGroup @"isMuted":@(aMuted) }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } - (void)groupAdminListDidUpdate:(EMGroup *)aGroup addedAdmin:(NSString *)aAdmin { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1287,13 +1296,13 @@ - (void)groupAdminListDidUpdate:(EMGroup *)aGroup @"administrator":aAdmin }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } - (void)groupAdminListDidUpdate:(EMGroup *)aGroup removedAdmin:(NSString *)aAdmin { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1303,14 +1312,14 @@ - (void)groupAdminListDidUpdate:(EMGroup *)aGroup @"administrator":aAdmin }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } - (void)groupOwnerDidUpdate:(EMGroup *)aGroup newOwner:(NSString *)aNewOwner oldOwner:(NSString *)aOldOwner { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1321,13 +1330,13 @@ - (void)groupOwnerDidUpdate:(EMGroup *)aGroup @"oldOwner":aOldOwner }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } - (void)userDidJoinGroup:(EMGroup *)aGroup user:(NSString *)aUsername { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1337,13 +1346,13 @@ - (void)userDidJoinGroup:(EMGroup *)aGroup @"member":aUsername }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } - (void)userDidLeaveGroup:(EMGroup *)aGroup user:(NSString *)aUsername { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1353,7 +1362,7 @@ - (void)userDidLeaveGroup:(EMGroup *)aGroup @"member":aUsername }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } @@ -1371,14 +1380,14 @@ - (void)groupAnnouncementDidUpdate:(EMGroup *)aGroup map[@"announcement"] = @""; } [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } - (void)groupFileListDidUpdate:(EMGroup *)aGroup addedSharedFile:(EMGroupSharedFile *)aSharedFile { - + __weak typeof(self) weakSelf = self; [ListenerHandle.sharedInstance addHandle:^{ @@ -1388,7 +1397,7 @@ - (void)groupFileListDidUpdate:(EMGroup *)aGroup @"sharedFile":[aSharedFile toJson] }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } @@ -1402,7 +1411,7 @@ - (void)groupFileListDidUpdate:(EMGroup *)aGroup @"fileId":aFileId }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } @@ -1420,7 +1429,7 @@ - (void)onAttributesChangedOfGroupMember:(NSString *)groupId @"operatorId": operatorId }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } @@ -1432,7 +1441,7 @@ - (void)groupSpecificationDidUpdate:(EMGroup *)aGroup { @"group": [aGroup toJson] }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } - (void)groupStateChanged:(EMGroup *)aGroup @@ -1445,7 +1454,7 @@ - (void)groupStateChanged:(EMGroup *)aGroup @"isDisabled":@(aDisabled) }; [weakSelf.channel invokeMethod:ChatOnGroupChanged - arguments:map]; + arguments:map]; }]; } @@ -1465,7 +1474,7 @@ - (void)isMemberInGroupMuteList:(NSDictionary *)param channelName:(NSString *)aC __weak typeof(self) weakSelf = self; [EMClient.sharedClient.groupManager isMemberInMuteListFromServerWithGroupId:param[@"groupId"] completion:^(BOOL inMuteList, EMError * _Nullable aError) { - + [weakSelf wrapperCallBack:result channelName:aChannelName error:aError @@ -1473,7 +1482,36 @@ - (void)isMemberInGroupMuteList:(NSDictionary *)param channelName:(NSString *)aC }]; } +- (void)fetchGroupMembersInfo:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { + __weak typeof(self) weakSelf = self; + NSString *groupId = param[@"groupId"]; + NSString *cursor = param[@"cursor"]; + NSInteger limit = [param[@"limit"] intValue]; + [EMClient.sharedClient.groupManager fetchGroupMemberInfoListFromServerWithGroupId:groupId + cursor:cursor + limit:limit + completion:^(EMCursorResult * _Nullable cursorResult, EMError * _Nullable error) + { + [weakSelf wrapperCallBack:result + channelName:aChannelName + error:error + object:[cursorResult toJson]]; + }]; +} +- (void)updateGroupAvatar:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { + __weak typeof(self) weakSelf = self; + NSString *groupId = param[@"groupId"]; + NSString *avatarUrl = param[@"avatarUrl"]; + [EMClient.sharedClient.groupManager updateGroupAvatar:avatarUrl + groupId:groupId + completion:^(EMGroup * _Nullable group, EMError * _Nullable error) { + [weakSelf wrapperCallBack:result + channelName:aChannelName + error:error + object:[group toJson]]; + }]; +} @end diff --git a/im_flutter_sdk_ios/ios/Classes/GroupMemberInfoHelper.h b/im_flutter_sdk_ios/ios/Classes/GroupMemberInfoHelper.h new file mode 100644 index 00000000..341b1088 --- /dev/null +++ b/im_flutter_sdk_ios/ios/Classes/GroupMemberInfoHelper.h @@ -0,0 +1,18 @@ +// +// GroupMemberInfoHelper.h +// im_flutter_sdk_ios +// +// Created by 杜洁鹏 on 2025年5月7日. +// + +#import "ChatHeaders.h" +#import "ModeToJson.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface EMGroupMemberInfo (Helper) +- (NSDictionary *)toJson; +@end + + +NS_ASSUME_NONNULL_END diff --git a/im_flutter_sdk_ios/ios/Classes/GroupMemberInfoHelper.m b/im_flutter_sdk_ios/ios/Classes/GroupMemberInfoHelper.m new file mode 100644 index 00000000..50102a99 --- /dev/null +++ b/im_flutter_sdk_ios/ios/Classes/GroupMemberInfoHelper.m @@ -0,0 +1,19 @@ +// +// GroupMemberInfoHelper.m +// im_flutter_sdk_ios +// +// Created by 杜洁鹏 on 2025年5月7日. +// + +#import "GroupMemberInfoHelper.h" +#import "EnumTools.h" + +@implementation EMGroupMemberInfo (Helper) +- (NSDictionary *)toJson { + NSMutableDictionary *ret = [NSMutableDictionary dictionary]; + ret[@"userId"] = self.userId; + ret[@"joinedTs"] = @(self.joinedTimestamp); + ret[@"role"] = [NSNumber numberWithInteger:[EnumTools groupPermissionTypeToInt:self.role]]; + return ret; +} +@end diff --git a/im_flutter_sdk_ios/ios/Classes/GroupMessageAckHelper.m b/im_flutter_sdk_ios/ios/Classes/GroupMessageAckHelper.m index 415a8ca4..d82e5c74 100644 --- a/im_flutter_sdk_ios/ios/Classes/GroupMessageAckHelper.m +++ b/im_flutter_sdk_ios/ios/Classes/GroupMessageAckHelper.m @@ -10,7 +10,7 @@ @implementation EMGroupMessageAck (Helper) - (NSDictionary *)toJson{ NSMutableDictionary *data = [NSMutableDictionary dictionary]; - data[@"msg_id"] = self.messageId; + data[@"msgId"] = self.messageId; data[@"ack_id"] = self.readAckId; data[@"from"] = self.from; data[@"content"] = self.content; diff --git a/im_flutter_sdk_ios/ios/Classes/MessageHelper.m b/im_flutter_sdk_ios/ios/Classes/MessageHelper.m index c45e2c42..f870060f 100644 --- a/im_flutter_sdk_ios/ios/Classes/MessageHelper.m +++ b/im_flutter_sdk_ios/ios/Classes/MessageHelper.m @@ -27,7 +27,7 @@ + (EMChatMessage *)fromJson:(NSDictionary *)aJson } NSString *to = aJson[@"to"]; - NSString *conversationId = aJson[@"conversationId"]; + NSString *conversationId = aJson[@"convId"]; @@ -74,7 +74,7 @@ - (NSDictionary *)toJson ret[@"from"] = self.from; ret[@"msgId"] = self.messageId; ret[@"to"] = self.to; - ret[@"conversationId"] = self.conversationId; + ret[@"convId"] = self.conversationId; ret[@"hasRead"] = @(self.isRead); ret[@"hasDeliverAck"] = @(self.isDeliverAcked); ret[@"hasReadAck"] = @(self.isReadAcked); @@ -380,6 +380,7 @@ + (EMMessageBody *)fromJson:(NSDictionary *)aJson { ret.size = CGSizeMake([aJson[@"width"] floatValue], [aJson[@"height"] floatValue]); ret.thumbnailDownloadStatus = [EnumTools downloadStatusFromInt:[aJson[@"thumbnailStatus"] integerValue]]; ret.compressionRatio = [aJson[@"sendOriginalImage"] boolValue] ? 1.0 : 0.6; + ret.isGif = [aJson[@"isGif"] boolValue]; return ret; } @@ -398,6 +399,7 @@ - (NSDictionary *)toJson { ret[@"displayName"] = self.displayName; ret[@"localPath"] = self.localPath; ret[@"sendOriginalImage"] = self.compressionRatio == 1.0 ? @(YES) : @(NO); + ret[@"isGif"] = @(self.isGif); return ret; } @end diff --git a/im_flutter_sdk_ios/ios/Classes/MessageReactionChangeHelper.m b/im_flutter_sdk_ios/ios/Classes/MessageReactionChangeHelper.m index 452bd362..ff5608dc 100644 --- a/im_flutter_sdk_ios/ios/Classes/MessageReactionChangeHelper.m +++ b/im_flutter_sdk_ios/ios/Classes/MessageReactionChangeHelper.m @@ -13,8 +13,8 @@ @implementation EMMessageReactionChange (Helper) - (nonnull NSDictionary *)toJson { NSMutableDictionary *ret = [NSMutableDictionary dictionary]; - ret[@"conversationId"] = self.conversationId; - ret[@"messageId"] = self.messageId; + ret[@"convId"] = self.conversationId; + ret[@"msgId"] = self.messageId; NSMutableArray *reactions = [NSMutableArray array]; for (EMMessageReaction *reaction in self.reactions) { [reactions addObject:[reaction toJson]]; diff --git a/im_flutter_sdk_ios/ios/Classes/MethodKeys.h b/im_flutter_sdk_ios/ios/Classes/MethodKeys.h index e9de62d1..9432ae43 100644 --- a/im_flutter_sdk_ios/ios/Classes/MethodKeys.h +++ b/im_flutter_sdk_ios/ios/Classes/MethodKeys.h @@ -167,7 +167,6 @@ static NSString *const ChatLoadMsgWithKeywords = @"loadMsgWithKeywords"; static NSString *const ChatLoadMsgWithMsgType = @"loadMsgWithMsgType"; static NSString *const ChatLoadMsgWithTime = @"loadMsgWithTime"; static NSString *const ChatConversationMessageCount = @"messageCount"; -static NSString *const ChatRemoveMsgFromServerWithMsgList = @"removeMsgFromServerWithMsgList"; static NSString *const ChatRemoveMsgFromServerWithTimeStamp = @"removeMsgFromServerWithTimeStamp"; #pragma mark - EMChatMessageWrapper @@ -395,3 +394,7 @@ static NSString *const changeAppId = @"changeAppId"; // 4.12.1 static NSString *const isMemberInChatRoomMuteList = @"isMemberInChatRoomMuteList"; + +static NSString *const fetchGroupMembersInfo = @"fetchGroupMembersInfo"; + +static NSString *const updateGroupAvatar = @"updateGroupAvatar"; \ No newline at end of file diff --git a/im_flutter_sdk_ios/ios/Classes/PushManagerWrapper.m b/im_flutter_sdk_ios/ios/Classes/PushManagerWrapper.m index be3291a6..c801e469 100644 --- a/im_flutter_sdk_ios/ios/Classes/PushManagerWrapper.m +++ b/im_flutter_sdk_ios/ios/Classes/PushManagerWrapper.m @@ -209,10 +209,10 @@ - (void)setConversationSilentMode:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self) weakSelf = self; - NSString *conversaionId = param[@"conversationId"]; + NSString *convId = param[@"convId"]; EMConversationType type = [EnumTools conversationTypeFromInt:[param[@"conversationType"] intValue]]; EMSilentModeParam *silmentParam = [EMSilentModeParam fromJson:param[@"param"]]; - [EMClient.sharedClient.pushManager setSilentModeForConversation:conversaionId + [EMClient.sharedClient.pushManager setSilentModeForConversation:convId conversationType:type params:silmentParam completion:^(EMSilentModeResult * _Nullable aResult, EMError * _Nullable aError) @@ -228,9 +228,9 @@ - (void)removeConversationSilentMode:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self) weakSelf = self; - NSString *conversaionId = param[@"conversationId"]; + NSString *convId = param[@"convId"]; EMConversationType type = [EnumTools conversationTypeFromInt:[param[@"conversationType"] intValue]]; - [EMClient.sharedClient.pushManager clearRemindTypeForConversation:conversaionId + [EMClient.sharedClient.pushManager clearRemindTypeForConversation:convId conversationType:type completion:^(EMSilentModeResult * _Nullable aResult, EMError * _Nullable aError) { @@ -244,9 +244,9 @@ - (void)fetchConversationSilentMode:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { __weak typeof(self) weakSelf = self; - NSString *conversaionId = param[@"conversationId"]; + NSString *convId = param[@"convId"]; EMConversationType type = [EnumTools conversationTypeFromInt:[param[@"conversationType"] intValue]]; - [EMClient.sharedClient.pushManager getSilentModeForConversation:conversaionId + [EMClient.sharedClient.pushManager getSilentModeForConversation:convId conversationType:type completion:^(EMSilentModeResult * _Nullable aResult, EMError * _Nullable aError) { [weakSelf wrapperCallBack:result diff --git a/im_flutter_sdk_ios/ios/Classes/RecallInfoHelper.m b/im_flutter_sdk_ios/ios/Classes/RecallInfoHelper.m index dedc3bc7..8fc3239c 100644 --- a/im_flutter_sdk_ios/ios/Classes/RecallInfoHelper.m +++ b/im_flutter_sdk_ios/ios/Classes/RecallInfoHelper.m @@ -16,7 +16,7 @@ - (NSDictionary *)toJson { ret[@"ext"] = self.ext; ret[@"msg"] = [self.recallMessage toJson]; // 4.10 - ret[@"conversationId"] = self.conversationId; + ret[@"convId"] = self.conversationId; return ret; } @end diff --git a/im_flutter_sdk_ios/ios/Classes/SilentModeResultHelper.m b/im_flutter_sdk_ios/ios/Classes/SilentModeResultHelper.m index 418aaabd..fa1ad023 100644 --- a/im_flutter_sdk_ios/ios/Classes/SilentModeResultHelper.m +++ b/im_flutter_sdk_ios/ios/Classes/SilentModeResultHelper.m @@ -18,7 +18,7 @@ - (NSDictionary *)toJson { ret[@"startTime"] = [self.silentModeStartTime toJson]; ret[@"endTime"] = [self.silentModeEndTime toJson]; ret[@"remindType"] = @([EMSilentModeParam remindTypeToInt:self.remindType]); - ret[@"conversationId"] = self.conversationID; + ret[@"convId"] = self.conversationID; ret[@"conversationType"] = [NSNumber numberWithInteger:[EnumTools conversationTypeToInt:self.conversationType]]; return ret; } diff --git a/im_flutter_sdk_ios/ios/Classes/ThreadManagerWrapper.m b/im_flutter_sdk_ios/ios/Classes/ThreadManagerWrapper.m index cb5cbd11..8bea2308 100644 --- a/im_flutter_sdk_ios/ios/Classes/ThreadManagerWrapper.m +++ b/im_flutter_sdk_ios/ios/Classes/ThreadManagerWrapper.m @@ -210,7 +210,7 @@ - (void)updateChatThreadSubject:(NSDictionary *)param channelName:(NSString *)aC } - (void)createChatThread:(NSDictionary *)param channelName:(NSString *)aChannelName result:(FlutterResult)result { - NSString *messageId = param[@"messageId"]; + NSString *messageId = param[@"msgId"]; NSString *name = param[@"name"]; NSString *parentId = param[@"parentId"]; __weak typeof(self)weakSelf = self; diff --git a/im_flutter_sdk_ios/ios/im_flutter_sdk_ios.podspec b/im_flutter_sdk_ios/ios/im_flutter_sdk_ios.podspec index ae17ff4f..e7cbcac7 100644 --- a/im_flutter_sdk_ios/ios/im_flutter_sdk_ios.podspec +++ b/im_flutter_sdk_ios/ios/im_flutter_sdk_ios.podspec @@ -3,7 +3,7 @@ # Pod::Spec.new do |s| s.name = 'im_flutter_sdk_ios' - s.version = '0.0.1' + s.version = '4.14.0' s.summary = 'A new flutter plugin project.' s.description = <<-desc A new flutter plugin project. @@ -17,7 +17,7 @@ A new flutter plugin project. s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - s.dependency 'HyphenateChat','4.13.0' + s.dependency 'HyphenateChat','4.14.0' # s.dependency 'ShengwangChat_iOS','1.3.2' s.ios.vendored_frameworks = 'framework/HyphenateChat.xcframework', 'framework/aosl.xcframework' s.ios.deployment_target = '12.0' diff --git a/im_flutter_sdk_ios/lib/src/chat_manager_ios.dart b/im_flutter_sdk_ios/lib/src/chat_manager_ios.dart index cbc5f735..d8218aaa 100644 --- a/im_flutter_sdk_ios/lib/src/chat_manager_ios.dart +++ b/im_flutter_sdk_ios/lib/src/chat_manager_ios.dart @@ -139,7 +139,7 @@ class ChatManagerIOS extends ChatManager { /// ~end @override Future sendMessageReadAck(EMMessage message) async { - Map req = {"to": message.from, "msg_id": message.msgId}; + Map req = {"to": message.from, "msgId": message.msgId}; Map result = await ChatChannel.invokeMethod(ChatMethodKeys.ackMessageRead, req); try { @@ -191,7 +191,7 @@ class ChatManagerIOS extends ChatManager { String? content, }) async { Map req = { - "msg_id": msgId, + "msgId": msgId, "group_id": groupId, }; req.putIfNotNull("content", content); @@ -261,7 +261,7 @@ class ChatManagerIOS extends ChatManager { @override Future recallMessage(String messageId, {String? ext}) async { Map req = { - "msg_id": messageId, + "msgId": messageId, }; req.putIfNotNull('ext', ext); Map result = @@ -294,7 +294,7 @@ class ChatManagerIOS extends ChatManager { /// ~end @override Future loadMessage(String messageId) async { - Map req = {"msg_id": messageId}; + Map req = {"msgId": messageId}; Map result = await ChatChannel.invokeMethod(ChatMethodKeys.getMessage, req); try { @@ -1248,7 +1248,7 @@ class ChatManagerIOS extends ChatManager { String? startAckId, int pageSize = 0, }) async { - Map req = {"msg_id": msgId, "group_id": groupId}; + Map req = {"msgId": msgId, "group_id": groupId}; req["pageSize"] = pageSize; req.putIfNotNull("ack_id", startAckId); @@ -1306,7 +1306,7 @@ class ChatManagerIOS extends ChatManager { bool isDeleteMessage = true, }) async { Map req = {}; - req["conversationId"] = conversationId; + req["convId"] = conversationId; if (conversationType == EMConversationType.Chat) { req["conversationType"] = 0; } else if (conversationType == EMConversationType.GroupChat) { diff --git a/im_flutter_sdk_ios/lib/src/chat_thread_manager_ios.dart b/im_flutter_sdk_ios/lib/src/chat_thread_manager_ios.dart index dd88bb84..94c54b73 100644 --- a/im_flutter_sdk_ios/lib/src/chat_thread_manager_ios.dart +++ b/im_flutter_sdk_ios/lib/src/chat_thread_manager_ios.dart @@ -435,7 +435,7 @@ class ChatThreadManagerIOS extends ChatThreadManager { }) async { Map req = { "name": name, - "messageId": messageId, + "msgId": messageId, "parentId": parentId, }; Map result = await ThreadChannel.invokeMethod( diff --git a/im_flutter_sdk_ios/lib/src/client_ios.dart b/im_flutter_sdk_ios/lib/src/client_ios.dart index 1b84cf3f..661a8145 100644 --- a/im_flutter_sdk_ios/lib/src/client_ios.dart +++ b/im_flutter_sdk_ios/lib/src/client_ios.dart @@ -248,7 +248,7 @@ class ClientIOS extends Client { @override Future createAccount(String userId, String password) async { EMLog.v('create account: $userId : $password'); - Map req = {'username': userId, 'password': password}; + Map req = {'userId': userId, 'password': password}; Map result = await ClientChannel.invokeMethod(ChatMethodKeys.createAccount, req); try { @@ -300,7 +300,7 @@ class ClientIOS extends Client { ]) async { EMLog.v('login: $userId : $pwdOrToken, isPassword: $isPassword'); Map req = { - 'username': userId, + 'userId': userId, 'pwdOrToken': pwdOrToken, 'isPassword': isPassword }; @@ -608,7 +608,7 @@ class ClientIOS extends Client { /// ~end Future> getLoggedInDevicesFromServer( {required String userId, required String password}) async { - Map req = {'username': userId, 'password': password}; + Map req = {'userId': userId, 'password': password}; Map result = await ClientChannel.invokeMethod( ChatMethodKeys.getLoggedInDevicesFromServer, req); try { @@ -656,7 +656,7 @@ class ClientIOS extends Client { required String pwdOrToken, bool isPwd = true, }) async { - Map req = {'username': userId, 'password': pwdOrToken, 'isPwd': isPwd}; + Map req = {'userId': userId, 'password': pwdOrToken, 'isPwd': isPwd}; Map result = await ClientChannel.invokeMethod( ChatMethodKeys.getLoggedInDevicesFromServer, req); try { @@ -703,7 +703,7 @@ class ClientIOS extends Client { }) async { EMLog.v('kickDevice: $userId, "******"'); Map req = { - 'username': userId, + 'userId': userId, 'password': pwdOrToken, 'resource': resource, 'isPwd': isPwd, @@ -747,7 +747,7 @@ class ClientIOS extends Client { required String pwdOrToken, bool isPwd = true, }) async { - Map req = {'username': userId, 'password': pwdOrToken, 'isPwd': isPwd}; + Map req = {'userId': userId, 'password': pwdOrToken, 'isPwd': isPwd}; Map result = await ClientChannel.invokeMethod(ChatMethodKeys.kickAllDevices, req); try { diff --git a/im_flutter_sdk_ios/lib/src/contact_manager_ios.dart b/im_flutter_sdk_ios/lib/src/contact_manager_ios.dart index fd3e8ee9..be47181e 100644 --- a/im_flutter_sdk_ios/lib/src/contact_manager_ios.dart +++ b/im_flutter_sdk_ios/lib/src/contact_manager_ios.dart @@ -26,7 +26,7 @@ class ContactManagerIOS extends ContactManager { String? reason, }) async { Map req = { - 'username': userId, + 'userId': userId, }; req.putIfNotNull("reason", reason); @@ -67,7 +67,7 @@ class ContactManagerIOS extends ContactManager { String userId, { bool keepConversation = false, }) async { - Map req = {'username': userId, 'keepConversation': keepConversation}; + Map req = {'userId': userId, 'keepConversation': keepConversation}; Map result = await ContactChannel.invokeMethod(ChatMethodKeys.deleteContact, req); try { @@ -236,7 +236,7 @@ class ContactManagerIOS extends ContactManager { Future addUserToBlockList( String userId, ) async { - Map req = {'username': userId}; + Map req = {'userId': userId}; Map result = await ContactChannel.invokeMethod( ChatMethodKeys.addUserToBlockList, req, @@ -265,7 +265,7 @@ class ContactManagerIOS extends ContactManager { /// ~end @override Future removeUserFromBlockList(String userId) async { - Map req = {'username': userId}; + Map req = {'userId': userId}; Map result = await ContactChannel.invokeMethod( ChatMethodKeys.removeUserFromBlockList, req); try { @@ -428,7 +428,7 @@ class ContactManagerIOS extends ContactManager { /// ~end @override Future acceptInvitation(String userId) async { - Map req = {'username': userId}; + Map req = {'userId': userId}; Map result = await ContactChannel.invokeMethod(ChatMethodKeys.acceptInvitation, req); try { @@ -455,7 +455,7 @@ class ContactManagerIOS extends ContactManager { /// ~end @override Future declineInvitation(String userId) async { - Map req = {'username': userId}; + Map req = {'userId': userId}; Map result = await ContactChannel.invokeMethod( ChatMethodKeys.declineInvitation, req); try { diff --git a/im_flutter_sdk_ios/lib/src/group_manager_ios.dart b/im_flutter_sdk_ios/lib/src/group_manager_ios.dart index f1e1cf58..0b927cd8 100644 --- a/im_flutter_sdk_ios/lib/src/group_manager_ios.dart +++ b/im_flutter_sdk_ios/lib/src/group_manager_ios.dart @@ -221,6 +221,7 @@ class GroupManagerIOS extends GroupManager { @override Future createGroup({ String? groupName, + String? avatar, String? desc, List? inviteMembers, String? inviteReason, @@ -228,6 +229,7 @@ class GroupManagerIOS extends GroupManager { }) async { Map req = {'options': options.toJson()}; req.putIfNotNull("groupName", groupName); + req.putIfNotNull("avatar", avatar); req.putIfNotNull("desc", desc); req.putIfNotNull("inviteMembers", inviteMembers); req.putIfNotNull("inviteReason", inviteReason); @@ -1659,7 +1661,7 @@ class GroupManagerIOS extends GroupManager { String groupId, String username, ) async { - Map req = {'groupId': groupId, 'username': username}; + Map req = {'groupId': groupId, 'userId': username}; Map result = await GroupChannel.invokeMethod( ChatMethodKeys.acceptJoinApplication, req); try { @@ -1702,7 +1704,7 @@ class GroupManagerIOS extends GroupManager { String username, { String? reason, }) async { - Map req = {'groupId': groupId, 'username': username}; + Map req = {'groupId': groupId, 'userId': username}; req.putIfNotNull('reason', reason); Map result = await GroupChannel.invokeMethod( @@ -2052,4 +2054,52 @@ class GroupManagerIOS extends GroupManager { rethrow; } } + + @override + Future> fetchGroupMembersInfo({ + required String groupId, + String? cursor, + int limit = 20, + }) async { + Map req = { + "groupId": groupId, + "limit": limit, + }; + + req.putIfNotNull('cursor', cursor); + + Map result = await GroupChannel.invokeMethod( + ChatMethodKeys.fetchGroupMembersInfo, + req, + ); + try { + EMError.hasErrorFromResult(result); + return EMCursorResult.fromJson( + result[ChatMethodKeys.fetchGroupMembersInfo], + dataItemCallback: (value) { + return GroupMemberInfo.fromJson(value); + }); + } catch (e) { + rethrow; + } + } + + @override + Future updateGroupAvatar({ + required String groupId, + required String avatarUrl, + }) async { + Map req = { + "groupId": groupId, + "avatarUrl": avatarUrl, + }; + Map result = + await GroupChannel.invokeMethod(ChatMethodKeys.updateGroupAvatar, req); + try { + EMError.hasErrorFromResult(result); + return EMGroup.fromJson(result[ChatMethodKeys.updateGroupAvatar]); + } catch (e) { + rethrow; + } + } } diff --git a/im_flutter_sdk_ios/lib/src/push_manager_ios.dart b/im_flutter_sdk_ios/lib/src/push_manager_ios.dart index 98fc07c0..6c659d25 100644 --- a/im_flutter_sdk_ios/lib/src/push_manager_ios.dart +++ b/im_flutter_sdk_ios/lib/src/push_manager_ios.dart @@ -233,7 +233,7 @@ class PushManagerIOS extends PushManager { required ChatSilentModeParam param, }) async { Map req = {}; - req["conversationId"] = conversationId; + req["convId"] = conversationId; req["conversationType"] = type.index; req["param"] = param.toJson(); @@ -275,7 +275,7 @@ class PushManagerIOS extends PushManager { required EMConversationType type, }) async { Map req = {}; - req["conversationId"] = conversationId; + req["convId"] = conversationId; req["conversationType"] = type.index; Map result = await PushChannel.invokeMethod( ChatMethodKeys.removeConversationSilentMode, req); @@ -315,7 +315,7 @@ class PushManagerIOS extends PushManager { required EMConversationType type, }) async { Map req = {}; - req["conversationId"] = conversationId; + req["convId"] = conversationId; req["conversationType"] = type.index; Map result = await PushChannel.invokeMethod( ChatMethodKeys.fetchConversationSilentMode, req); diff --git a/im_flutter_sdk_ios/pubspec.yaml b/im_flutter_sdk_ios/pubspec.yaml index 626256aa..5c269a8e 100644 --- a/im_flutter_sdk_ios/pubspec.yaml +++ b/im_flutter_sdk_ios/pubspec.yaml @@ -1,6 +1,6 @@ name: im_flutter_sdk_ios description: Integrate the Chat SDK to enjoy the global IM services with high reliability, ultra-low latency, and high concurrency. -version: 4.13.0+1 +version: 4.14.0 homepage: https://www.easemob.com environment: @@ -11,7 +11,9 @@ dependencies: flutter: sdk: flutter - im_flutter_sdk_interface: ^4.13.0+1 + im_flutter_sdk_interface: + path: ../im_flutter_sdk_interface + dev_dependencies: flutter_lints: ^3.0.0

        AltStyle によって変換されたページ (->オリジナル) /