diff --git a/CHANGELOG.md b/CHANGELOG.md index f52e7061..8b210343 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.8.1 + +- [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.8.1) + ## 3.8.1-rc.0 - [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.8.1-rc.0) @@ -9,7 +13,7 @@ ## 3.8.0-rc.16 - [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.8.0-rc.16) - + ## 3.5.1 - [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.5.1) diff --git a/android/build.gradle b/android/build.gradle index 97cf3b24..d1b584a2 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -52,5 +52,5 @@ android { dependencies { // 本地依赖,现将aar复制到libs/io/openim/core-sdk/0.0.1/ 下,命名core-sdk-0.0.1.aar // implementation 'io.openim:core-sdk:0.0.1@aar' - implementation 'io.openim:core-sdk:3.8.1-rc.0@aar' + implementation 'io.openim:core-sdk:3.8.1@aar' } \ No newline at end of file diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnAdvancedMsgListener.java b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnAdvancedMsgListener.java index 62d381a8..d9e472d7 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnAdvancedMsgListener.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnAdvancedMsgListener.java @@ -37,42 +37,6 @@ public void onRecvC2CReadReceipt(String s) { CommonUtil.emitEvent("advancedMsgListener", "onRecvC2CReadReceipt", values); } - @Override - public void onRecvGroupReadReceipt(String s) { - final Map values = new ArrayMap<>(); - values.put("id", id); - values.put("groupMsgReceiptList", s); - CommonUtil.emitEvent("advancedMsgListener", "onRecvGroupReadReceipt", values); - } - - - @Override - public void onRecvMessageExtensionsAdded(String s, String s1) { - final Map values = new ArrayMap<>(); - values.put("id", id); - values.put("msgID", s); - values.put("reactionExtensionList", s1); - CommonUtil.emitEvent("advancedMsgListener", "onRecvMessageExtensionsAdded", values); - } - - @Override - public void onRecvMessageExtensionsChanged(String s, String s1) { - final Map values = new ArrayMap<>(); - values.put("id", id); - values.put("msgID", s); - values.put("reactionExtensionList", s1); - CommonUtil.emitEvent("advancedMsgListener", "onRecvMessageExtensionsChanged", values); - } - - @Override - public void onRecvMessageExtensionsDeleted(String s, String s1) { - final Map values = new ArrayMap<>(); - values.put("id", id); - values.put("msgID", s); - values.put("reactionExtensionKeyList", s1); - CommonUtil.emitEvent("advancedMsgListener", "onRecvMessageExtensionsDeleted", values); - } - @Override public void onRecvNewMessage(String s) { final Map values = new ArrayMap<>(); diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnBaseListener.java b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnBaseListener.java index 82fef79d..ca906b16 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnBaseListener.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnBaseListener.java @@ -19,13 +19,15 @@ public OnBaseListener(MethodChannel.Result result, MethodCall call) { @Override public void onError(int l, String s) { - Log.i("F-OpenIMSDK(native call flutter)", "method: 【 " + call.method + " 】, onError: { code:" + l + ", message:" + s + "}"); + String threadName = Thread.currentThread().getName(); + Log.i("F-OpenIMSDK(native call flutter)", "thread: " + threadName + " method: 【 " + call.method + " 】, onError: { code:" + l + ", message:" + s + "}"); CommonUtil.runMainThreadReturnError(result, l, s, null); } @Override public void onSuccess(String s) { - Log.i("F-OpenIMSDK(native call flutter)", "method: 【 " + call.method + " 】, onSuccess: " + s); + String threadName = Thread.currentThread().getName(); + Log.i("F-OpenIMSDK(native call flutter)", "thread: " + threadName + " method: 【 " + call.method + " 】, onSuccess: " + s); CommonUtil.runMainThreadReturn(result, s); } } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnListenerForService.java b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnListenerForService.java index 75d1d5ba..38774a9b 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnListenerForService.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnListenerForService.java @@ -24,66 +24,6 @@ // } // // @Override -// public void onHangUp(String s) { -// -// } -// -// @Override -// public void onInvitationCancelled(String s) { -// -// } -// -// @Override -// public void onInvitationTimeout(String s) { -// -// } -// -// @Override -// public void onInviteeAccepted(String s) { -// -// } -// -// @Override -// public void onInviteeAcceptedByOtherDevice(String s) { -// -// } -// -// @Override -// public void onInviteeRejected(String s) { -// -// } -// -// @Override -// public void onInviteeRejectedByOtherDevice(String s) { -// -// } -// -// @Override -// public void onReceiveCustomSignal(String s) { -// -// } -// -// @Override -// public void onReceiveNewInvitation(String s) { -// -// } -// -// @Override -// public void onRoomParticipantConnected(String s) { -// -// } -// -// @Override -// public void onRoomParticipantDisconnected(String s) { -// -// } -// -// @Override -// public void onStreamChange(String s) { -// -// } -// -// @Override // public void onRecvNewMessage(String s) { // CommonUtil.emitEvent("listenerForService", "onRecvNewMessage", s); // } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/ConversationManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/ConversationManager.java index 5fc05fab..3c37320f 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/ConversationManager.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/ConversationManager.java @@ -59,15 +59,6 @@ public void setConversationDraft(MethodCall methodCall, MethodChannel.Result res ); } - public void pinConversation(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.pinConversation( - new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - value(methodCall, "conversationID"), - value(methodCall, "isPinned") - ); - } - public void hideConversation(MethodCall methodCall, MethodChannel.Result result) { Open_im_sdk.hideConversation( new OnBaseListener(result, methodCall), @@ -98,32 +89,6 @@ public void getConversationIDBySessionType(MethodCall methodCall, MethodChannel. int2long(methodCall, "sessionType"))); } - public void setConversationRecvMessageOpt(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setConversationRecvMessageOpt( - new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - value(methodCall, "conversationID"), - int2long(methodCall, "status") - ); - } - - public void getConversationRecvMessageOpt(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.getConversationRecvMessageOpt( - new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - jsonValue(methodCall, "conversationIDList") - ); - } - - public void setConversationPrivateChat(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setConversationPrivateChat( - new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - value(methodCall, "conversationID"), - value(methodCall, "isPrivate") - ); - } - public void clearConversationAndDeleteAllMsg(MethodCall methodCall, MethodChannel.Result result) { Open_im_sdk.clearConversationAndDeleteAllMsg( new OnBaseListener(result, methodCall), @@ -140,56 +105,10 @@ public void deleteConversationAndDeleteAllMsg(MethodCall methodCall, MethodChann ); } - public void deleteAllConversationFromLocal(MethodCall methodCall, MethodChannel.Result result) { - } - - public void resetConversationGroupAtType(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.resetConversationGroupAtType( - new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - value(methodCall, "conversationID") - ); - } - public void getAtAllTag(MethodCall methodCall, MethodChannel.Result result) { CommonUtil.runMainThreadReturn(result, Open_im_sdk.getAtAllTag(value(methodCall, "operationID"))); } - public void setGlobalRecvMessageOpt(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setGlobalRecvMessageOpt( - new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - int2long(methodCall, "status") - ); - } - - public void setConversationBurnDuration(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setConversationBurnDuration( - new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - value(methodCall, "conversationID"), - value(methodCall, "burnDuration") - ); - } - - public void setConversationIsMsgDestruct(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setConversationIsMsgDestruct( - new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - value(methodCall, "conversationID"), - value(methodCall, "isMsgDestruct") - ); - } - - public void setConversationMsgDestructTime(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setConversationMsgDestructTime( - new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - value(methodCall, "conversationID"), - int2long(methodCall, "duration") - ); - } - public void hideAllConversations(MethodCall methodCall, MethodChannel.Result result) { Open_im_sdk.hideAllConversations( new OnBaseListener(result, methodCall), @@ -205,15 +124,6 @@ public void searchConversation(MethodCall methodCall, MethodChannel.Result resu ); } - public void setConversationEx(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setConversationEx( - new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - value(methodCall, "conversationID"), - value(methodCall, "ex") - ); - } - public void changeInputStates(MethodCall methodCall, MethodChannel.Result result) { Open_im_sdk.changeInputStates( new OnBaseListener(result, methodCall), @@ -231,4 +141,22 @@ public void getInputStates(MethodCall methodCall, MethodChannel.Result result) { value(methodCall, "userID") ); } + + public void setConversation(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.setConversation( + new OnBaseListener(result, methodCall), + value(methodCall, "operationID"), + value(methodCall, "conversationID"), + jsonValue(methodCall, "req") + ); + } + + + public void searchConversations(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.searchConversation( + new OnBaseListener(result, methodCall), + value(methodCall, "operationID"), + value(methodCall, "name") + ); + } } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/FriendshipManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/FriendshipManager.java index 6a445ff5..d987f60f 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/FriendshipManager.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/FriendshipManager.java @@ -19,7 +19,8 @@ public void getFriendsInfo(MethodCall methodCall, MethodChannel.Result result) { Open_im_sdk.getSpecifiedFriendsInfo( new OnBaseListener(result, methodCall), value(methodCall, "operationID"), - jsonValue(methodCall, "userIDList") + jsonValue(methodCall, "userIDList"), + value(methodCall, "filterBlack") ); } @@ -48,7 +49,8 @@ public void getFriendApplicationListAsApplicant(MethodCall methodCall, MethodCha public void getFriendList(MethodCall methodCall, MethodChannel.Result result) { Open_im_sdk.getFriendList( new OnBaseListener(result, methodCall), - value(methodCall, "operationID") + value(methodCall, "operationID"), + value(methodCall, "filterBlack") ); } @@ -57,15 +59,8 @@ public void getFriendListPage(MethodCall methodCall, MethodChannel.Result result new OnBaseListener(result, methodCall), value(methodCall, "operationID"), value(methodCall, "offset"), - value(methodCall, "count") - ); - } - - public void setFriendRemark(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setFriendRemark( - new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - jsonValue(methodCall) + value(methodCall, "count"), + value(methodCall, "filterBlack") ); } @@ -133,12 +128,11 @@ public void searchFriends(MethodCall methodCall, MethodChannel.Result result) { ); } - public void setFriendsEx(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setFriendsEx( + public void updateFriends(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.updateFriends( new OnBaseListener(result, methodCall), value(methodCall, "operationID"), - jsonValue(methodCall, "friendIDs"), - value(methodCall, "ex") + jsonValue(methodCall, "req") ); } } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/GroupManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/GroupManager.java index 3abf079e..a5a26676 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/GroupManager.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/GroupManager.java @@ -186,15 +186,6 @@ public void changeGroupMemberMute(MethodCall methodCall, MethodChannel.Result re ); } - public void setGroupMemberNickname(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setGroupMemberNickname(new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - value(methodCall, "groupID"), - value(methodCall, "userID"), - value(methodCall, "groupNickname") - ); - } - public void searchGroups(MethodCall methodCall, MethodChannel.Result result) { Open_im_sdk.searchGroups(new OnBaseListener(result, methodCall), value(methodCall, "operationID"), @@ -202,15 +193,6 @@ public void searchGroups(MethodCall methodCall, MethodChannel.Result result) { ); } - public void setGroupMemberRoleLevel(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setGroupMemberRoleLevel(new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - value(methodCall, "groupID"), - value(methodCall, "userID"), - int2long(methodCall, "roleLevel") - ); - } - public void getGroupMemberListByJoinTimeFilter(MethodCall methodCall, MethodChannel.Result result) { Open_im_sdk.getGroupMemberListByJoinTimeFilter(new OnBaseListener(result, methodCall), value(methodCall, "operationID"), @@ -223,30 +205,6 @@ public void getGroupMemberListByJoinTimeFilter(MethodCall methodCall, MethodChan ); } - public void setGroupVerification(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setGroupVerification(new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - value(methodCall, "groupID"), - value(methodCall, "needVerification") - ); - } - - public void setGroupLookMemberInfo(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setGroupLookMemberInfo(new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - value(methodCall, "groupID"), - value(methodCall, "status") - ); - } - - public void setGroupApplyMemberFriend(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setGroupApplyMemberFriend(new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - value(methodCall, "groupID"), - value(methodCall, "status") - ); - } - public void getGroupMemberOwnerAndAdmin(MethodCall methodCall, MethodChannel.Result result) { Open_im_sdk.getGroupMemberOwnerAndAdmin(new OnBaseListener(result, methodCall), value(methodCall, "operationID"), diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/IMManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/IMManager.java index ce223782..febe22bc 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/IMManager.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/IMManager.java @@ -73,6 +73,19 @@ public void uploadLogs(MethodCall methodCall, MethodChannel.Result result) { ); } + public void logs(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.logs( + new OnBaseListener(result, methodCall), + value(methodCall, "operationID"), + int2long(methodCall, "logLevel"), + value(methodCall, "file"), + int2long(methodCall, "line"), + value(methodCall, "msgs"), + value(methodCall, "err"), + value(methodCall, "keyAndValue") + ); + } + public void setAppBackgroundStatus(MethodCall methodCall, MethodChannel.Result result) { Open_im_sdk.setAppBackgroundStatus( new OnBaseListener(result, methodCall), diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/UserManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/UserManager.java index fc3df3a2..3a77553c 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/UserManager.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/UserManager.java @@ -61,20 +61,4 @@ public void getUserStatus(MethodCall methodCall, MethodChannel.Result result) { value(methodCall, "operationID"), jsonValue(methodCall, "userIDs")); } - - public void getUsersInfoWithCache(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.getUsersInfoWithCache( - new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - jsonValue(methodCall, "userIDs"), - value(methodCall, "groupID")); - } - /* - public void setSelfInfoEx(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setSelfInfoEx( - new OnBaseListener(result, methodCall), - value(methodCall, "operationID"), - jsonValue(methodCall)); - } - */ } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/util/CommonUtil.java b/android/src/main/java/io/openim/flutter_openim_sdk/util/CommonUtil.java index fb3a1bb3..91bff390 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/util/CommonUtil.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/util/CommonUtil.java @@ -33,6 +33,7 @@ public static void runMainThreadReturnError(final MethodChannel.Result result, f } public synchronized static void emitEvent(String method, String type, Object errCode, String errMsg, T data) { + String threadName = Thread.currentThread().getName(); runMainThread(() -> { Map res = new ArrayMap<>(); if (null != type) { @@ -47,7 +48,7 @@ public synchronized static void emitEvent(String method, String type, Object if (null != errMsg) { res.put("errMsg", errMsg); } - Log.i("F-OpenIMSDK(native call flutter)", "{ method:" + method + ", type:" + type + " }"); + Log.i("F-OpenIMSDK(native call flutter)", "thread: " + threadName + " { method:" + method + ", type:" + type + " }"); FlutterOpenimSdkPlugin.channel.invokeMethod(method, res); }); } diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index fa1befe4..be728264 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -341,15 +341,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = BDLHL8GNFV; + DEVELOPMENT_TEAM = V57RT7LMFH; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = cn.rentsoft.uni; + PRODUCT_BUNDLE_IDENTIFIER = io.openim.sdk.example; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -474,15 +473,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = BDLHL8GNFV; + DEVELOPMENT_TEAM = V57RT7LMFH; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = cn.rentsoft.uni; + PRODUCT_BUNDLE_IDENTIFIER = io.openim.sdk.example; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -499,15 +497,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = BDLHL8GNFV; + DEVELOPMENT_TEAM = V57RT7LMFH; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = cn.rentsoft.uni; + PRODUCT_BUNDLE_IDENTIFIER = io.openim.sdk.example; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/example/lib/main.dart b/example/lib/main.dart index 7521056f..554deef2 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -14,7 +14,12 @@ class _MyAppState extends State { @override void initState() { super.initState(); - OpenIM.iMManager.initSDK(platformID: 1, apiAddr: '', wsAddr: '', dataDir: '/', listener: OnConnectListener()); + OpenIM.iMManager.initSDK( + platformID: 1, + apiAddr: '', + wsAddr: '', + dataDir: '/', + listener: OnConnectListener()); } @override diff --git a/example/pubspec.lock b/example/pubspec.lock index a053a4b1..d80e804b 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -68,7 +68,7 @@ packages: path: ".." relative: true source: path - version: "3.8.0" + version: "3.8.1" flutter_test: dependency: "direct dev" description: flutter diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart index 6357ca5f..d9adc263 100644 --- a/example/test/widget_test.dart +++ b/example/test/widget_test.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_openim_sdk_example/main.dart'; +import '../lib/main.dart'; void main() { testWidgets('Verify Platform version', (WidgetTester tester) async { @@ -18,8 +18,7 @@ void main() { // Verify that platform version is retrieved. expect( find.byWidgetPredicate( - (Widget widget) => widget is Text && - widget.data!.startsWith('Running on:'), + (Widget widget) => widget is Text && widget.data!.startsWith('Running on:'), ), findsOneWidget, ); diff --git a/ios/Classes/Module/ConversationManager.swift b/ios/Classes/Module/ConversationManager.swift index bbba2c38..6da400bc 100644 --- a/ios/Classes/Module/ConversationManager.swift +++ b/ios/Classes/Module/ConversationManager.swift @@ -2,193 +2,146 @@ import Foundation import OpenIMCore public class ConversationManager: BaseServiceManager { - + public override func registerHandlers() { super.registerHandlers() - self["setConversationListener"] = setConversationListener + self["changeInputStates"] = changeInputStates + self["clearConversationAndDeleteAllMsg"] = clearConversationAndDeleteAllMsg + self["deleteConversationAndDeleteAllMsg"] = deleteConversationAndDeleteAllMsg self["getAllConversationList"] = getAllConversationList + self["getAtAllTag"] = getAtAllTag + self["getConversationIDBySessionType"] = getConversationIDBySessionType self["getConversationListSplit"] = getConversationListSplit - self["getOneConversation"] = getOneConversation + self["getInputStates"] = getInputStates self["getMultipleConversation"] = getMultipleConversation - self["setConversationDraft"] = setConversationDraft - self["pinConversation"] = pinConversation - self["hideConversation"] = hideConversation - self["markConversationMessageAsRead"] = markConversationMessageAsRead + self["getOneConversation"] = getOneConversation self["getTotalUnreadMsgCount"] = getTotalUnreadMsgCount - self["getConversationIDBySessionType"] = getConversationIDBySessionType - self["setConversationRecvMessageOpt"] = setConversationRecvMessageOpt - self["getConversationRecvMessageOpt"] = getConversationRecvMessageOpt - self["setConversationPrivateChat"] = setConversationPrivateChat - self["clearConversationAndDeleteAllMsg"] = clearConversationAndDeleteAllMsg - self["deleteConversationAndDeleteAllMsg"] = deleteConversationAndDeleteAllMsg - self["resetConversationGroupAtType"] = resetConversationGroupAtType - self["getAtAllTag"] = getAtAllTag - self["setGlobalRecvMessageOpt"] = setGlobalRecvMessageOpt - self["setConversationBurnDuration"] = setConversationBurnDuration - self["setConversationIsMsgDestruct"] = setConversationIsMsgDestruct - self["setConversationMsgDestructTime"] = setConversationMsgDestructTime self["hideAllConversations"] = hideAllConversations + self["hideConversation"] = hideConversation + self["markConversationMessageAsRead"] = markConversationMessageAsRead self["searchConversation"] = searchConversation - self["setConversationEx"] = setConversationEx - self["changeInputStates"] = changeInputStates - self["getInputStates"] = getInputStates - } - - func setConversationListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetConversationListener(ConversationListener(channel: channel)) - callBack(result) - } - - func getAllConversationList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetAllConversationList(BaseCallback(result: result), methodCall[string: "operationID"]) + self["setConversationDraft"] = setConversationDraft + self["setConversationListener"] = setConversationListener + self["setConversation"] = setConversation + self["searchConversations"] = searchConversations } - func getConversationListSplit(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetConversationListSplit(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "offset"], methodCall[int: "count"]) + func changeInputStates(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkChangeInputStates(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[bool: "focus"]) } - func getOneConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetOneConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int32: "sessionType"], methodCall[string: "sourceID"]) - } - - func getMultipleConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetMultipleConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "conversationIDList"]) - } - - func setConversationDraft(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetConversationDraft(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[string: "draftText"]) - } - - func pinConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkPinConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[bool: "isPinned"]) + func clearConversationAndDeleteAllMsg(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkClearConversationAndDeleteAllMsg(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"]) } - - func hideConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkHideConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"]) + + func deleteConversationAndDeleteAllMsg(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkDeleteConversationAndDeleteAllMsg(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"]) } - - func markConversationMessageAsRead(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkMarkConversationMessageAsRead(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"]) + + func getAllConversationList(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetAllConversationList(BaseCallback(result: result), methodCall[string: "operationID"]) } - - func getTotalUnreadMsgCount(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetTotalUnreadMsgCount(BaseCallback(result: result), methodCall[string: "operationID"]) + + func getAtAllTag(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + callBack(result, Open_im_sdkGetAtAllTag(methodCall[string: "operationID"])) } - - func getConversationIDBySessionType(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - let conversationID = Open_im_sdkGetConversationIDBySessionType( methodCall[string: "operationID"],methodCall[string: "sourceID"], methodCall[int: "sessionType"]) + + func getConversationIDBySessionType(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + let conversationID = Open_im_sdkGetConversationIDBySessionType(methodCall[string: "operationID"], methodCall[string: "sourceID"], methodCall[int: "sessionType"]) callBack(result, conversationID) } - func setConversationRecvMessageOpt(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetConversationRecvMessageOpt(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[int: "status"]) + func getConversationListSplit(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetConversationListSplit(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "offset"], methodCall[int: "count"]) } - func getConversationRecvMessageOpt(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetConversationRecvMessageOpt(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "conversationIDList"]) - } - - func setConversationPrivateChat(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetConversationPrivateChat(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"],methodCall[bool: "isPrivate"]) - } - - func clearConversationAndDeleteAllMsg(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkClearConversationAndDeleteAllMsg(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"]) - } - - func deleteConversationAndDeleteAllMsg(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkDeleteConversationAndDeleteAllMsg(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"]) - } - - func deleteAllConversationFromLocal(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - } - - func resetConversationGroupAtType(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkResetConversationGroupAtType(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"]) + func getInputStates(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetInputStates(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[string: "userID"]) } - - func getAtAllTag(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - callBack(result, Open_im_sdkGetAtAllTag(methodCall[string: "operationID"])) + + func getMultipleConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetMultipleConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "conversationIDList"]) } - - func setGlobalRecvMessageOpt(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetGlobalRecvMessageOpt(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "status"]) + + func getOneConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetOneConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int32: "sessionType"], methodCall[string: "sourceID"]) } - - func setConversationBurnDuration(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetConversationBurnDuration(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[int32: "burnDuration"]) + + func getTotalUnreadMsgCount(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetTotalUnreadMsgCount(BaseCallback(result: result), methodCall[string: "operationID"]) } - func setConversationIsMsgDestruct(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetConversationIsMsgDestruct(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[bool: "isMsgDestruct"]) + func hideAllConversations(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkHideAllConversations(BaseCallback(result: result), methodCall[string: "operationID"]) } - func setConversationMsgDestructTime(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetConversationMsgDestructTime(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[int64: "duration"]) + func hideConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkHideConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"]) } - func hideAllConversations(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkHideAllConversations(BaseCallback(result: result), methodCall[string: "operationID"]) + func markConversationMessageAsRead(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkMarkConversationMessageAsRead(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"]) } - func searchConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + func searchConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { Open_im_sdkSearchConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "name"]) } - func setConversationEx(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetConversationEx(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[string: "ex"]) + func setConversationDraft(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkSetConversationDraft(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[string: "draftText"]) } - func changeInputStates(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkChangeInputStates(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[bool: "focus"]) + func setConversationListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkSetConversationListener(ConversationListener(channel: channel)) + callBack(result) } - func getInputStates(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetInputStates(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[string: "userID"]) + func setConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkSetConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[jsonString: "req"]) } -} + func searchConversations(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkSearchConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "name"]) + } +} public class ConversationListener: NSObject, Open_im_sdk_callbackOnConversationListenerProtocol { - public func onSyncServerProgress(_ progress: Int) { - CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerProgress", errCode: nil, errMsg: nil, data: progress) - } - - - private let channel:FlutterMethodChannel - - init(channel:FlutterMethodChannel) { + private let channel: FlutterMethodChannel + + init(channel: FlutterMethodChannel) { self.channel = channel } - + public func onConversationChanged(_ conversationList: String?) { CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onConversationChanged", errCode: nil, errMsg: nil, data: conversationList) } - + + public func onConversationUserInputStatusChanged(_ change: String?) { + CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onConversationUserInputStatusChanged", errCode: nil, errMsg: nil, data: change) + } + public func onNewConversation(_ conversationList: String?) { CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onNewConversation", errCode: nil, errMsg: nil, data: conversationList) } - + public func onSyncServerFailed(_ reinstalled: Bool) { CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerFailed", errCode: nil, errMsg: nil, data: reinstalled) } - + public func onSyncServerFinish(_ reinstalled: Bool) { CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerFinish", errCode: nil, errMsg: nil, data: reinstalled) } - + + public func onSyncServerProgress(_ progress: Int) { + CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerProgress", errCode: nil, errMsg: nil, data: progress) + } + public func onSyncServerStart(_ reinstalled: Bool) { CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerStart", errCode: nil, errMsg: nil, data: reinstalled) } - + public func onTotalUnreadMessageCountChanged(_ totalUnreadCount: Int32) { CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onTotalUnreadMessageCountChanged", errCode: nil, errMsg: nil, data: totalUnreadCount) } - - public func onConversationUserInputStatusChanged(_ change: String?) { - CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onConversationUserInputStatusChanged", errCode: nil, errMsg: nil, data: change) - } } - - diff --git a/ios/Classes/Module/FriendshipManager.swift b/ios/Classes/Module/FriendshipManager.swift index 6ff2faac..06fd37ba 100644 --- a/ios/Classes/Module/FriendshipManager.swift +++ b/ios/Classes/Module/FriendshipManager.swift @@ -5,92 +5,87 @@ public class FriendshipManager: BaseServiceManager { public override func registerHandlers() { super.registerHandlers() - self["setFriendListener"] = setFriendListener - self["getFriendsInfo"] = getFriendsInfo + self["acceptFriendApplication"] = acceptFriendApplication + self["addBlacklist"] = addBlacklist self["addFriend"] = addFriend - self["getFriendApplicationListAsRecipient"] = getFriendApplicationListAsRecipient + self["checkFriend"] = checkFriend + self["deleteFriend"] = deleteFriend + self["getBlacklist"] = getBlacklist self["getFriendApplicationListAsApplicant"] = getFriendApplicationListAsApplicant + self["getFriendApplicationListAsRecipient"] = getFriendApplicationListAsRecipient self["getFriendList"] = getFriendList self["getFriendListPage"] = getFriendListPage - self["setFriendRemark"] = setFriendRemark - self["addBlacklist"] = addBlacklist - self["getBlacklist"] = getBlacklist - self["removeBlacklist"] = removeBlacklist - self["checkFriend"] = checkFriend - self["deleteFriend"] = deleteFriend - self["acceptFriendApplication"] = acceptFriendApplication + self["getFriendsInfo"] = getFriendsInfo self["refuseFriendApplication"] = refuseFriendApplication + self["removeBlacklist"] = removeBlacklist self["searchFriends"] = searchFriends - self["setFriendsEx"] = setFriendsEx + self["setFriendListener"] = setFriendListener + self["updateFriends"] = updateFriends } - func setFriendListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetFriendListener(FriendshipListener(channel: channel)) - callBack(result) + func acceptFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkAcceptFriendApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) } - - func getFriendsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetSpecifiedFriendsInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "userIDList"]) + + func addBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkAddBlack(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"], methodCall[string: "ex"]) } func addFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ Open_im_sdkAddFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) } - func getFriendApplicationListAsRecipient(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetFriendApplicationListAsRecipient(BaseCallback(result: result), methodCall[string: "operationID"]) + func checkFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkCheckFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "userIDList"]) } - + + func deleteFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkDeleteFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"]) + } + + func getBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetBlackList(BaseCallback(result: result), methodCall[string: "operationID"]) + } + func getFriendApplicationListAsApplicant(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ Open_im_sdkGetFriendApplicationListAsApplicant(BaseCallback(result: result), methodCall[string: "operationID"]) } - func getFriendList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetFriendList(BaseCallback(result: result), methodCall[string: "operationID"]) + func getFriendApplicationListAsRecipient(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetFriendApplicationListAsRecipient(BaseCallback(result: result), methodCall[string: "operationID"]) } - func getFriendListPage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetFriendListPage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int32: "offset"], methodCall[int32: "count"]) + func getFriendList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetFriendList(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[bool: "filterBlack"]) } - func setFriendRemark(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetFriendRemark(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) + func getFriendListPage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetFriendListPage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int32: "offset"], methodCall[int32: "count"], methodCall[bool: "filterBlack"]) } - - func addBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkAddBlack(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"], methodCall[string: "ex"]) + + func getFriendsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetSpecifiedFriendsInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "userIDList"], methodCall[bool: "filterBlack"]) } - func getBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetBlackList(BaseCallback(result: result), methodCall[string: "operationID"]) + func refuseFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkRefuseFriendApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) } func removeBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ Open_im_sdkRemoveBlack(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"]) } - func checkFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkCheckFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "userIDList"]) - } - - func deleteFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkDeleteFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"]) - } - - func acceptFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkAcceptFriendApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) + func searchFriends(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkSearchFriends(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"]) } - func refuseFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkRefuseFriendApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) + func setFriendListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkSetFriendListener(FriendshipListener(channel: channel)) + callBack(result) } - func searchFriends(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSearchFriends(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"]) - } - - func setFriendsEx(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetFriendsEx(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "friendIDs"], methodCall[string: "ex"]) + func updateFriends(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkUpdateFriends(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "req"]) } } @@ -137,4 +132,3 @@ public class FriendshipListener: NSObject, Open_im_sdk_callbackOnFriendshipListe CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendInfoChanged", errCode: nil, errMsg: nil, data: friendInfo) } } - diff --git a/ios/Classes/Module/GroupManager.swift b/ios/Classes/Module/GroupManager.swift index cf1984bd..62e2bd3a 100644 --- a/ios/Classes/Module/GroupManager.swift +++ b/ios/Classes/Module/GroupManager.swift @@ -5,219 +5,194 @@ public class GroupManager: BaseServiceManager { public override func registerHandlers() { super.registerHandlers() - self["setGroupListener"] = setGroupListener - self["inviteUserToGroup"] = inviteUserToGroup - self["kickGroupMember"] = kickGroupMember - self["getGroupMembersInfo"] = getGroupMembersInfo + self["acceptGroupApplication"] = acceptGroupApplication + self["changeGroupMemberMute"] = changeGroupMemberMute + self["changeGroupMute"] = changeGroupMute + self["createGroup"] = createGroup + self["dismissGroup"] = dismissGroup + self["getGroupApplicationListAsApplicant"] = getGroupApplicationListAsApplicant + self["getGroupApplicationListAsRecipient"] = getGroupApplicationListAsRecipient self["getGroupMemberList"] = getGroupMemberList + self["getGroupMemberListByJoinTimeFilter"] = getGroupMemberListByJoinTimeFilter + self["getGroupMemberOwnerAndAdmin"] = getGroupMemberOwnerAndAdmin + self["getGroupMembersInfo"] = getGroupMembersInfo + self["getGroupsInfo"] = getGroupsInfo self["getJoinedGroupList"] = getJoinedGroupList self["getJoinedGroupListPage"] = getJoinedGroupListPage - self["createGroup"] = createGroup - self["setGroupInfo"] = setGroupInfo - self["getGroupsInfo"] = getGroupsInfo + self["getUsersInGroup"] = getUsersInGroup + self["inviteUserToGroup"] = inviteUserToGroup + self["isJoinGroup"] = isJoinGroup self["joinGroup"] = joinGroup + self["kickGroupMember"] = kickGroupMember self["quitGroup"] = quitGroup - self["transferGroupOwner"] = transferGroupOwner - self["getGroupApplicationListAsRecipient"] = getGroupApplicationListAsRecipient - self["getGroupApplicationListAsApplicant"] = getGroupApplicationListAsApplicant - self["acceptGroupApplication"] = acceptGroupApplication self["refuseGroupApplication"] = refuseGroupApplication - self["dismissGroup"] = dismissGroup - self["changeGroupMute"] = changeGroupMute - self["changeGroupMemberMute"] = changeGroupMemberMute - self["setGroupMemberNickname"] = setGroupMemberNickname - self["searchGroups"] = searchGroups - self["setGroupMemberRoleLevel"] = setGroupMemberRoleLevel - self["getGroupMemberListByJoinTimeFilter"] = getGroupMemberListByJoinTimeFilter - self["setGroupVerification"] = setGroupVerification - self["setGroupLookMemberInfo"] = setGroupLookMemberInfo - self["setGroupApplyMemberFriend"] = setGroupApplyMemberFriend - self["getGroupMemberOwnerAndAdmin"] = getGroupMemberOwnerAndAdmin self["searchGroupMembers"] = searchGroupMembers + self["searchGroups"] = searchGroups + self["setGroupInfo"] = setGroupInfo + self["setGroupListener"] = setGroupListener self["setGroupMemberInfo"] = setGroupMemberInfo - self["isJoinGroup"] = isJoinGroup - self["getUsersInGroup"] = getUsersInGroup + self["transferGroupOwner"] = transferGroupOwner } - func setGroupListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetGroupListener(GroupListener(channel: channel)) - callBack(result) + func acceptGroupApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkAcceptGroupApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "userID"], methodCall[string: "handleMsg"]) } - func inviteUserToGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkInviteUserToGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "reason"], - methodCall[jsonString: "userIDList"]) - } - - func kickGroupMember(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkKickGroupMember(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "reason"], - methodCall[jsonString: "userIDList"]) - } - - func getGroupMembersInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetSpecifiedGroupMembersInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[jsonString: "userIDList"]) - } - - func getGroupMemberList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetGroupMemberList(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32: "filter"], - methodCall[int32: "offset"], methodCall[int32: "count"]) - } - - func getJoinedGroupList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetJoinedGroupList(BaseCallback(result: result), methodCall[string: "operationID"]) + func changeGroupMemberMute(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkChangeGroupMemberMute(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string:"userID"], methodCall[int:"seconds"]) } - func getJoinedGroupListPage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetJoinedGroupListPage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int32: "offset"], methodCall[int32: "count"]) + func changeGroupMute(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkChangeGroupMute(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[bool: "mute"]) } - - func createGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + + func createGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { Open_im_sdkCreateGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) } - - func setGroupInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetGroupInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "groupInfo"]) + + func dismissGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkDismissGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"]) } - - func getGroupsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetSpecifiedGroupsInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "groupIDList"]) + + func getGroupApplicationListAsApplicant(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetGroupApplicationListAsApplicant(BaseCallback(result: result), methodCall[string: "operationID"]) } - - func joinGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkJoinGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: - "reason"], methodCall[int32: "joinSource"], methodCall[jsonString: "ex"]) + + func getGroupApplicationListAsRecipient(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetGroupApplicationListAsRecipient(BaseCallback(result: result), methodCall[string: "operationID"]) } - - func quitGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkQuitGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"]) + + func getGroupMemberList(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetGroupMemberList(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32: "filter"], + methodCall[int32: "offset"], methodCall[int32: "count"]) } - - func transferGroupOwner(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkTransferGroupOwner(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "userID"]) + + func getGroupMemberListByJoinTimeFilter(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetGroupMemberListByJoinTimeFilter(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32: "offset"], methodCall[int32: "count"], methodCall[int64: "joinTimeBegin"], methodCall[int64: "joinTimeEnd"], methodCall[jsonString: "excludeUserIDList"]) } - - func getGroupApplicationListAsRecipient(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetGroupApplicationListAsRecipient(BaseCallback(result: result), methodCall[string: "operationID"]) + + func getGroupMemberOwnerAndAdmin(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetGroupMemberOwnerAndAdmin(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"]) } - - func getGroupApplicationListAsApplicant(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetGroupApplicationListAsApplicant(BaseCallback(result: result), methodCall[string: "operationID"]) + + func getGroupMembersInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetSpecifiedGroupMembersInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[jsonString: "userIDList"]) } - func acceptGroupApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkAcceptGroupApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "userID"], methodCall[string: "handleMsg"]) + func getGroupsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetSpecifiedGroupsInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "groupIDList"]) } - - func refuseGroupApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkRefuseGroupApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "userID"], methodCall[string: "handleMsg"]) + + func getJoinedGroupList(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetJoinedGroupList(BaseCallback(result: result), methodCall[string: "operationID"]) } - - func dismissGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkDismissGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"]) + + func getJoinedGroupListPage(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetJoinedGroupListPage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int32: "offset"], methodCall[int32: "count"]) } - - func changeGroupMute(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkChangeGroupMute(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[bool: "mute"]) + + func getUsersInGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetUsersInGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], + methodCall[jsonString: "userIDs"]) } - - func changeGroupMemberMute(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkChangeGroupMemberMute(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string:"userID"],methodCall[int:"seconds"]) + + func inviteUserToGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkInviteUserToGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "reason"], + methodCall[jsonString: "userIDList"]) } - - func setGroupMemberNickname(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetGroupMemberNickname(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string:"userID"],methodCall[string:"groupNickname"]) + + func isJoinGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkIsJoinGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"]) } - - func searchGroups(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSearchGroups(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"]) + + func joinGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkJoinGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: + "reason"], methodCall[int32: "joinSource"], methodCall[jsonString: "ex"]) } - - func setGroupMemberRoleLevel(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetGroupMemberRoleLevel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string:"userID"],methodCall[int:"roleLevel"]) + + func kickGroupMember(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkKickGroupMember(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "reason"], + methodCall[jsonString: "userIDList"]) } - - func getGroupMemberListByJoinTimeFilter(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetGroupMemberListByJoinTimeFilter(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32: "offset"], methodCall[int32: "count"], methodCall[int64: "joinTimeBegin"], methodCall[int64: "joinTimeEnd"], methodCall[jsonString: "excludeUserIDList"]) + + func quitGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkQuitGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"]) } - - func setGroupVerification(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetGroupVerification(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32:"needVerification"]) + + func refuseGroupApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkRefuseGroupApplication(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "userID"], methodCall[string: "handleMsg"]) } - - func setGroupLookMemberInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetGroupLookMemberInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32:"status"]) + + func searchGroupMembers(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkSearchGroupMembers(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"]) } - - func setGroupApplyMemberFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetGroupApplyMemberFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32:"status"]) + + func searchGroups(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkSearchGroups(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"]) } - - func getGroupMemberOwnerAndAdmin(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetGroupMemberOwnerAndAdmin(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"]) + + func setGroupInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkSetGroupInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "groupInfo"]) } - - func searchGroupMembers(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSearchGroupMembers(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"]) + + func setGroupListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkSetGroupListener(GroupListener(channel: channel)) + callBack(result) } - - func setGroupMemberInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + + func setGroupMemberInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { Open_im_sdkSetGroupMemberInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "info"]) } - - func isJoinGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkIsJoinGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"]) - } - func getUsersInGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetUsersInGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], - methodCall[jsonString: "userIDs"]) + func transferGroupOwner(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkTransferGroupOwner(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "userID"]) } } public class GroupListener: NSObject, Open_im_sdk_callbackOnGroupListenerProtocol { - private let channel:FlutterMethodChannel + private let channel: FlutterMethodChannel - init(channel:FlutterMethodChannel) { + init(channel: FlutterMethodChannel) { self.channel = channel } public func onGroupApplicationAccepted(_ s: String?) { CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationAccepted", errCode: nil, errMsg: nil, data: s) } - + public func onGroupApplicationAdded(_ s: String?) { CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationAdded", errCode: nil, errMsg: nil, data: s) } - + public func onGroupApplicationDeleted(_ s: String?) { CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationDeleted", errCode: nil, errMsg: nil, data: s) } - + public func onGroupApplicationRejected(_ s: String?) { CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupApplicationRejected", errCode: nil, errMsg: nil, data: s) } - + public func onGroupDismissed(_ s: String?) { CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupDismissed", errCode: nil, errMsg: nil, data: s) } - + public func onGroupInfoChanged(_ s: String?) { CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupInfoChanged", errCode: nil, errMsg: nil, data: s) } - + public func onGroupMemberAdded(_ s: String?) { CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupMemberAdded", errCode: nil, errMsg: nil, data: s) } - + public func onGroupMemberDeleted(_ s: String?) { CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupMemberDeleted", errCode: nil, errMsg: nil, data: s) } - + public func onGroupMemberInfoChanged(_ s: String?) { CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onGroupMemberInfoChanged", errCode: nil, errMsg: nil, data: s) } - + public func onJoinedGroupAdded(_ s: String?) { CommonUtil.emitEvent(channel: channel, method: "groupListener", type: "onJoinedGroupAdded", errCode: nil, errMsg: nil, data: s) } diff --git a/ios/Classes/Module/IMManager.swift b/ios/Classes/Module/IMManager.swift index 42880dc3..119599eb 100644 --- a/ios/Classes/Module/IMManager.swift +++ b/ios/Classes/Module/IMManager.swift @@ -14,6 +14,7 @@ public class IMMananger: BaseServiceManager { self["getLoginStatus"] = getLoginStatus self["uploadFile"] = uploadFile self["uploadLogs"] = uploadLogs + self["logs"] = logs self["updateFcmToken"] = updateFcmToken self["setAppBackgroundStatus"] = setAppBackgroundStatus self["networkStatusChanged"] = networkStatusChanged @@ -89,6 +90,10 @@ public class IMMananger: BaseServiceManager { Open_im_sdkUploadLogs(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "line"], methodCall[string: "ex"], UploadLogsListener(channel: self.channel)) } + + func logs(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkLogs(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[int: "logLevel"], methodCall[string: "file"], methodCall[int: "line"], methodCall[string: "msgs"], methodCall[string: "err"], methodCall[string: "keyAndValue"]) + } func updateFcmToken(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { Open_im_sdkUpdateFcmToken(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "fcmToken"], methodCall[int64: diff --git a/ios/Classes/Module/MessageManager.swift b/ios/Classes/Module/MessageManager.swift index e560d301..e2b28f14 100644 --- a/ios/Classes/Module/MessageManager.swift +++ b/ios/Classes/Module/MessageManager.swift @@ -227,8 +227,7 @@ public class MessageManager: BaseServiceManager { func sendMessageNotOss(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ let sendMsgProgressListener: SendMsgProgressListener = SendMsgProgressListener(channel: channel,result: result,methodCall: methodCall) - Open_im_sdkSendMessageNotOss(sendMsgProgressListener, methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[string: "userID"], - methodCall[string: "groupID"], methodCall[jsonString: "offlinePushInfo"], methodCall[bool: "isOnlineOnly"]) + Open_im_sdkSendMessageNotOss(sendMsgProgressListener, methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[string: "userID"], methodCall[string: "groupID"], methodCall[jsonString: "offlinePushInfo"], methodCall[bool: "isOnlineOnly"]) } func createImageMessageByURL(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ @@ -312,58 +311,26 @@ public class AdvancedMsgListener: NSObject, Open_im_sdk_callbackOnAdvancedMsgLis CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvC2CReadReceipt", errCode: nil, errMsg: nil, data: values) } - public func onRecvGroupReadReceipt(_ groupMsgReceiptList: String?) { - var values: [String: Any] = [:] - values["id"] = id - values["groupMsgReceiptList"] = groupMsgReceiptList - CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvGroupReadReceipt", errCode: nil, errMsg: nil, data: values) - } - - public func onRecvMessageExtensionsAdded(_ msgID: String?, reactionExtensionList: String?) { - var values: [String: Any] = [:] - values["id"] = id - values["msgID"] = msgID - values["reactionExtensionList"] = reactionExtensionList - CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageExtensionsAdded", errCode: nil, errMsg: nil, data: values) - } - - public func onRecvMessageExtensionsChanged(_ msgID: String?, reactionExtensionList: String?) { + public func onRecvNewMessage(_ message: String?) { var values: [String: Any] = [:] values["id"] = id - values["msgID"] = msgID - values["reactionExtensionList"] = reactionExtensionList - CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageExtensionsChanged", errCode: nil, errMsg: nil, data: values) + values["message"] = message + CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvNewMessage", errCode: nil, errMsg: nil, data: values) } - - public func onRecvMessageExtensionsDeleted(_ msgID: String?, reactionExtensionKeyList: String?) { + + public func onRecvOfflineNewMessage(_ message: String?) { var values: [String: Any] = [:] values["id"] = id - values["msgID"] = msgID - values["reactionExtensionKeyList"] = reactionExtensionKeyList - CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageExtensionsDeleted", errCode: nil, errMsg: nil, data: values) + values["message"] = message + CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvOfflineNewMessage", errCode: nil, errMsg: nil, data: values); } - - public func onRecvNewMessage(_ message: String?) { + + public func onRecvOnlineOnlyMessage(_ message: String?) { var values: [String: Any] = [:] values["id"] = id values["message"] = message - CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvNewMessage", errCode: nil, errMsg: nil, data: values) + CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvOnlineOnlyMessage", errCode: nil, errMsg: nil, data: values); } - - - public func onRecvOfflineNewMessage(_ message: String?) { - var values: [String: Any] = [:] - values["id"] = id - values["message"] = message - CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvOfflineNewMessage", errCode: nil, errMsg: nil, data: values); - } - - public func onRecvOnlineOnlyMessage(_ message: String?) { - var values: [String: Any] = [:] - values["id"] = id - values["message"] = message - CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvOnlineOnlyMessage", errCode: nil, errMsg: nil, data: values); - } } public class CustomBusinessListener: NSObject, Open_im_sdk_callbackOnCustomBusinessListenerProtocol { @@ -377,4 +344,3 @@ public class CustomBusinessListener: NSObject, Open_im_sdk_callbackOnCustomBusin CommonUtil.emitEvent(channel: channel, method: "customBusinessListener", type: "onRecvCustomBusinessMessage", errCode: nil, errMsg: nil, data: s) } } - diff --git a/ios/Classes/Module/UserManager.swift b/ios/Classes/Module/UserManager.swift index 41f235fc..4562197a 100644 --- a/ios/Classes/Module/UserManager.swift +++ b/ios/Classes/Module/UserManager.swift @@ -13,10 +13,6 @@ public class UserManager: BaseServiceManager { self["unsubscribeUsersStatus"] = unsubscribeUsersStatus self["getSubscribeUsersStatus"] = getSubscribeUsersStatus self["getUserStatus"] = getUserStatus - self["getUsersInfoWithCache"] = getUsersInfoWithCache - /* - self["setSelfInfoEx"] = setSelfInfoEx - */ } func setUserListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ @@ -51,44 +47,34 @@ public class UserManager: BaseServiceManager { func getUserStatus(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ Open_im_sdkGetUserStatus(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "userIDs"]) } - - func getUsersInfoWithCache(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkGetUsersInfoWithCache(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "userIDs"], - methodCall[string: "groupID"]) - } -/* - func setSelfInfoEx(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetSelfInfoEx(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString()) - } - */ } public class UserListener: NSObject, Open_im_sdk_callbackOnUserListenerProtocol { public func onUserCommandAdd(_ userCommand: String?) { CommonUtil.emitEvent(channel: self.channel, method: "userListener", type: "onUserCommandAdd", errCode: nil, errMsg: nil, data: userCommand) } - + public func onUserCommandDelete(_ userCommand: String?) { CommonUtil.emitEvent(channel: self.channel, method: "userListener", type: "onUserCommandDelete", errCode: nil, errMsg: nil, data: userCommand) } - + public func onUserCommandUpdate(_ userCommand: String?) { CommonUtil.emitEvent(channel: self.channel, method: "userListener", type: "onUserCommandUpdate", errCode: nil, errMsg: nil, data: userCommand) } - - + + private let channel:FlutterMethodChannel init(channel:FlutterMethodChannel) { self.channel = channel } - + public func onSelfInfoUpdated(_ userInfo: String?) { CommonUtil.emitEvent(channel: self.channel, method: "userListener", type: "onSelfInfoUpdated", errCode: nil, errMsg: nil, data: userInfo) } - + public func onUserStatusChanged(_ statusInfo: String?) { CommonUtil.emitEvent(channel: self.channel, method: "userListener", type: "onUserStatusChanged", errCode: nil, errMsg: nil, data: statusInfo) } -} \ No newline at end of file +} diff --git a/ios/flutter_openim_sdk.podspec b/ios/flutter_openim_sdk.podspec index e986788a..2aae01df 100644 --- a/ios/flutter_openim_sdk.podspec +++ b/ios/flutter_openim_sdk.podspec @@ -17,7 +17,7 @@ A new Flutter project. s.dependency 'Flutter' s.platform = :ios, '11.0' - s.dependency 'OpenIMSDKCore','3.8.1-rc.0' + s.dependency 'OpenIMSDKCore','3.8.1' s.static_framework = true s.library = 'resolv' diff --git a/lib/.DS_Store b/lib/.DS_Store index 79543060..84d7f2ab 100644 Binary files a/lib/.DS_Store and b/lib/.DS_Store differ diff --git a/lib/src/listener/advanced_msg_listener.dart b/lib/src/listener/advanced_msg_listener.dart index f9eca83c..27a2a8c0 100644 --- a/lib/src/listener/advanced_msg_listener.dart +++ b/lib/src/listener/advanced_msg_listener.dart @@ -5,8 +5,6 @@ class OnAdvancedMsgListener { Function(Message msg)? onMsgDeleted; Function(RevokedInfo info)? onNewRecvMessageRevoked; Function(List list)? onRecvC2CReadReceipt; - Function(List list)? onRecvGroupReadReceipt; - Function(String msgID, List list)? onRecvMessageExtensionsDeleted; Function(Message msg)? onRecvNewMessage; Function(Message msg)? onRecvOfflineNewMessage; Function(Message msg)? onRecvOnlineOnlyMessage; @@ -18,8 +16,6 @@ class OnAdvancedMsgListener { this.onMsgDeleted, this.onNewRecvMessageRevoked, this.onRecvC2CReadReceipt, - this.onRecvGroupReadReceipt, - this.onRecvMessageExtensionsDeleted, this.onRecvNewMessage, this.onRecvOfflineNewMessage, this.onRecvOnlineOnlyMessage, @@ -39,17 +35,6 @@ class OnAdvancedMsgListener { onRecvC2CReadReceipt?.call(list); } - /// Group Message Read Receipt - void recvGroupReadReceipt(List list) { - onRecvGroupReadReceipt?.call(list); - } - - /// Received Extended Message Deleted - /// [list] TypeKey that was deleted - void recvMessageExtensionsDeleted(String msgID, List list) { - onRecvMessageExtensionsDeleted?.call(msgID, list); - } - /// Received a new message void recvNewMessage(Message msg) { onRecvNewMessage?.call(msg); diff --git a/lib/src/listener/upload_file_listener.dart b/lib/src/listener/upload_file_listener.dart index 8dea4f12..9854a657 100644 --- a/lib/src/listener/upload_file_listener.dart +++ b/lib/src/listener/upload_file_listener.dart @@ -8,16 +8,25 @@ class OnUploadLogsListener { } class OnUploadFileListener { + OnUploadFileListener({ + this.onComplete, + this.onHashPartComplete, + this.onHashPartProgress, + this.onOpen, + this.onPartSize, + this.onUploadID, + this.onUploadPartComplete, + this.onUploadProgress, + }); + Function(String id, int size, String url, int type)? onComplete; Function(String id, String partHash, String fileHash)? onHashPartComplete; Function(String id, int index, int size, String partHash)? onHashPartProgress; Function(String id, int size)? onOpen; Function(String id, int partSize, int num)? onPartSize; - Function(String id, int fileSize, int streamSize, int storageSize)? - onUploadProgress; + Function(String id, int fileSize, int streamSize, int storageSize)? onUploadProgress; Function(String id, String uploadID)? onUploadID; - Function(String id, int index, int partSize, String partHash)? - onUploadPartComplete; + Function(String id, int index, int partSize, String partHash)? onUploadPartComplete; void complete(String id, int size, String url, int type) { onComplete?.call(id, size, url, type); @@ -39,8 +48,7 @@ class OnUploadFileListener { onPartSize?.call(id, partSize, num); } - void uploadProgress( - String id, int fileSize, int streamSize, int storageSize) { + void uploadProgress(String id, int fileSize, int streamSize, int storageSize) { onUploadProgress?.call(id, fileSize, streamSize, storageSize); } diff --git a/lib/src/manager/im_conversation_manager.dart b/lib/src/manager/im_conversation_manager.dart index fa6ab24d..cbbb6b28 100644 --- a/lib/src/manager/im_conversation_manager.dart +++ b/lib/src/manager/im_conversation_manager.dart @@ -1,8 +1,11 @@ +import 'dart:async'; import 'dart:developer'; import 'package:flutter/services.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; +import '../models/update_req.dart'; + class ConversationManager { MethodChannel _channel; late OnConversationListener listener; @@ -98,14 +101,11 @@ class ConversationManager { required String conversationID, required bool isPinned, String? operationID, - }) => - _channel.invokeMethod( - 'pinConversation', - _buildParam({ - "conversationID": conversationID, - "isPinned": isPinned, - "operationID": Utils.checkOperationID(operationID), - })); + }) { + final req = ConversationReq(isPinned: isPinned); + + return setConversation(conversationID, req, operationID: operationID); + } /// Hide a Conversation /// [conversationID] Conversation ID @@ -161,22 +161,20 @@ class ConversationManager { /// Message Do-Not-Disturb Setting /// [conversationID] Conversation ID /// [status] 0: normal; 1: not receiving messages; 2: receive online messages but not offline messages + @Deprecated('use [setConversation] instead') Future setConversationRecvMessageOpt({ required String conversationID, required int status, String? operationID, - }) => - _channel.invokeMethod( - 'setConversationRecvMessageOpt', - _buildParam({ - "conversationID": conversationID, - "status": status, - "operationID": Utils.checkOperationID(operationID), - })); + }) { + final req = ConversationReq(recvMsgOpt: status); - /// Query Do-Not-Disturb Status - /// [conversationIDList] List of conversation IDs - /// Returns: [{"conversationId":"single_13922222222","result":0}], result values: 0: normal; 1: not receiving messages; 2: receive online messages but not offline messages + return setConversation(conversationID, req, operationID: operationID); + } + + /// Message Do-Not-Disturb Setting + /// [conversationID] Conversation ID + /// [status] 0: normal; 1: not receiving messages; 2: receive online messages but not offline messages Future> getConversationRecvMessageOpt({ required List conversationIDList, String? operationID, @@ -193,18 +191,16 @@ class ConversationManager { /// Self-Destruct Messages /// [conversationID] Conversation ID /// [isPrivate] true: enable, false: disable + @Deprecated('use [setConversation] instead') Future setConversationPrivateChat({ required String conversationID, required bool isPrivate, String? operationID, - }) => - _channel.invokeMethod( - 'setConversationPrivateChat', - _buildParam({ - "conversationID": conversationID, - "isPrivate": isPrivate, - "operationID": Utils.checkOperationID(operationID), - })); + }) { + final req = ConversationReq(isPrivateChat: isPrivate); + + return setConversation(conversationID, req, operationID: operationID); + } /// Delete a Conversation Locally and from the Server /// [conversationID] Conversation ID @@ -245,16 +241,15 @@ class ConversationManager { /// Reset Mentioned (Group At) Flags [GroupAtType] /// [conversationID] Conversation ID + @Deprecated('use [setConversation] instead') Future resetConversationGroupAtType({ required String conversationID, String? operationID, - }) => - _channel.invokeMethod( - 'resetConversationGroupAtType', - _buildParam({ - "conversationID": conversationID, - "operationID": Utils.checkOperationID(operationID), - })); + }) { + final req = ConversationReq(groupAtType: 0); + + return setConversation(conversationID, req, operationID: operationID); + } /// Query @ All Flag Future getAtAllTag({ @@ -271,32 +266,27 @@ class ConversationManager { /// Global Do-Not-Disturb /// [status] 0: normal; 1: not receiving messages; 2: receive online messages but not offline messages + @Deprecated('use [OpenIM.iMManager.userManager.setSelfInfo()] instead') Future setGlobalRecvMessageOpt({ required int status, String? operationID, - }) => - _channel.invokeMethod( - 'setGlobalRecvMessageOpt', - _buildParam({ - "status": status, - "operationID": Utils.checkOperationID(operationID), - })); + }) { + throw UnimplementedError('setGlobalRecvMessageOpt'); + } /// Set Self-Destruct Message Duration /// [conversationID] Conversation ID /// [burnDuration] Duration in seconds, default: 30s + @Deprecated('use [setConversation] instead') Future setConversationBurnDuration({ required String conversationID, int burnDuration = 30, String? operationID, - }) => - _channel.invokeMethod( - 'setConversationBurnDuration', - _buildParam({ - "conversationID": conversationID, - "burnDuration": burnDuration, - "operationID": Utils.checkOperationID(operationID), - })); + }) { + final req = ConversationReq(burnDuration: burnDuration); + + return setConversation(conversationID, req, operationID: operationID); + } /// Mark Messages as Read /// [conversationID] Conversation ID @@ -311,36 +301,6 @@ class ConversationManager { "operationID": Utils.checkOperationID(operationID), })); - /// Enable Regular Deletion - /// [isMsgDestruct] true: enable - Future setConversationIsMsgDestruct({ - required String conversationID, - bool isMsgDestruct = true, - String? operationID, - }) => - _channel.invokeMethod( - 'setConversationIsMsgDestruct', - _buildParam({ - "conversationID": conversationID, - "isMsgDestruct": isMsgDestruct, - "operationID": Utils.checkOperationID(operationID), - })); - - /// Regularly Delete Chat Records - /// [duration] Seconds - Future setConversationMsgDestructTime({ - required String conversationID, - int duration = 1 * 24 * 60 * 60, - String? operationID, - }) => - _channel.invokeMethod( - 'setConversationMsgDestructTime', - _buildParam({ - "conversationID": conversationID, - "duration": duration, - "operationID": Utils.checkOperationID(operationID), - })); - /// search Conversations Future> searchConversations( String name, { @@ -356,18 +316,15 @@ class ConversationManager { .then((value) => Utils.toList(value, (map) => ConversationInfo.fromJson(map))); } + @Deprecated('use [setConversation] instead') Future setConversationEx( String conversationID, { String? ex, String? operationID, }) { - return _channel.invokeMethod( - 'setConversationEx', - _buildParam({ - 'conversationID': conversationID, - 'ex': ex, - "operationID": Utils.checkOperationID(operationID), - })); + final req = ConversationReq(ex: ex); + + return setConversation(conversationID, req, operationID: operationID); } /// Custom Sort for Conversation List @@ -424,14 +381,34 @@ class ConversationManager { ), ) .then((value) { + print('getInputStates: $value'); final result = Utils.toListMap(value); return List.from(result); }); } - static Map _buildParam(Map param) { + Future setConversation( + String conversationID, + ConversationReq req, { + String? operationID, + }) { + return _channel.invokeMethod( + 'setConversation', + _buildParam( + { + 'conversationID': conversationID, + 'req': req.toJson(), + 'operationID': Utils.checkOperationID(operationID), + }, + ), + ); + } + + static Map _buildParam(Map param) { param["ManagerName"] = "conversationManager"; + param = Utils.cleanMap(param); log('param: $param'); + return param; } } diff --git a/lib/src/manager/im_friendship_manager.dart b/lib/src/manager/im_friendship_manager.dart index df35301f..82f25ad5 100644 --- a/lib/src/manager/im_friendship_manager.dart +++ b/lib/src/manager/im_friendship_manager.dart @@ -1,6 +1,10 @@ +import 'dart:async'; + import 'package:flutter/services.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; +import '../models/update_req.dart'; + class FriendshipManager { MethodChannel _channel; late OnFriendshipListener listener; @@ -15,8 +19,9 @@ class FriendshipManager { /// Query Friend Information /// [userIDList] List of user IDs - Future> getFriendsInfo({ + Future> getFriendsInfo({ required List userIDList, + bool filterBlack = false, String? operationID, }) => _channel @@ -24,9 +29,10 @@ class FriendshipManager { 'getFriendsInfo', _buildParam({ "userIDList": userIDList, + 'filterBlack': filterBlack, "operationID": Utils.checkOperationID(operationID), })) - .then((value) => Utils.toList(value, (v) => FullUserInfo.fromJson(v))); + .then((value) => Utils.toList(value, (v) => PublicUserInfo.fromJson(v))); /// Send a Friend Request, the other party needs to accept the request to become friends. /// [userID] User ID to be invited @@ -63,23 +69,35 @@ class FriendshipManager { .then((value) => Utils.toList(value, (v) => FriendApplicationInfo.fromJson(v))); /// Get Friend List, including friends who have been put into the blacklist - Future> getFriendList({String? operationID}) => _channel - .invokeMethod( - 'getFriendList', - _buildParam({ - "operationID": Utils.checkOperationID(operationID), - })) - .then((value) => Utils.toList(value, (v) => FullUserInfo.fromJson(v))); + Future> getFriendList({ + String? operationID, + bool filterBlack = false, + }) => + _channel + .invokeMethod( + 'getFriendList', + _buildParam({ + 'filterBlack': filterBlack, + "operationID": Utils.checkOperationID(operationID), + })) + .then((value) => Utils.toList(value, (v) => PublicUserInfo.fromJson(v))); - Future> getFriendListPage({String? operationID, int offset = 0, int count = 40}) => _channel - .invokeMethod( - 'getFriendListPage', - _buildParam({ - 'offset': offset, - 'count': count, - "operationID": Utils.checkOperationID(operationID), - })) - .then((value) => Utils.toList(value, (v) => FullUserInfo.fromJson(v))); + Future> getFriendListPage({ + bool filterBlack = false, + int offset = 0, + int count = 40, + String? operationID, + }) => + _channel + .invokeMethod( + 'getFriendListPage', + _buildParam({ + 'offset': offset, + 'count': count, + 'filterBlack': filterBlack, + "operationID": Utils.checkOperationID(operationID), + })) + .then((value) => Utils.toList(value, (v) => PublicUserInfo.fromJson(v))); /// Get Friend List, including friends who have been put into the blacklist (returns a map) Future> getFriendListMap({String? operationID}) => _channel @@ -90,31 +108,36 @@ class FriendshipManager { })) .then((value) => Utils.toListMap(value)); - Future> getFriendListPageMap({String? operationID, int offset = 0, int count = 40}) => _channel - .invokeMethod( - 'getFriendListPage', - _buildParam({ - 'offset': offset, - 'count': count, - "operationID": Utils.checkOperationID(operationID), - })) - .then((value) => Utils.toListMap(value)); + Future> getFriendListPageMap({ + bool filterBlack = false, + String? operationID, + int offset = 0, + int count = 40, + }) => + _channel + .invokeMethod( + 'getFriendListPage', + _buildParam({ + 'offset': offset, + 'count': count, + 'filterBlack': filterBlack, + "operationID": Utils.checkOperationID(operationID), + })) + .then((value) => Utils.toListMap(value)); /// Set Friend's Remark /// [userID] Friend's userID /// [remark] Friend's remark + @Deprecated('Use [updateFriends] instead') Future setFriendRemark({ required String userID, required String remark, String? operationID, - }) => - _channel.invokeMethod( - 'setFriendRemark', - _buildParam({ - 'toUserID': userID, - 'remark': remark, - "operationID": Utils.checkOperationID(operationID), - })); + }) { + final req = UpdateFriendsReq(friendUserIDs: [userID], remark: remark); + + return updateFriends(req, operationID: operationID); + } /// Add to Blacklist /// [userID] Friend's ID to be added to the blacklist @@ -239,22 +262,35 @@ class FriendshipManager { })) .then((value) => Utils.toList(value, (map) => SearchFriendsInfo.fromJson(map))); - Future setFriendsEx( + @Deprecated('Use [updateFriends] instead') + Future setFriendsEx( List friendIDs, { String? ex, String? operationID, }) { - return _channel.invokeMethod( - 'setFriendsEx', - _buildParam({ - "friendIDs": friendIDs, - "ex": ex, - "operationID": Utils.checkOperationID(operationID), - })); + final req = UpdateFriendsReq(friendUserIDs: friendIDs, ex: ex); + + return updateFriends(req, operationID: operationID); } - static Map _buildParam(Map param) { + Future updateFriends( + UpdateFriendsReq updateFriendsReq, { + String? operationID, + }) { + return _channel + .invokeMethod( + 'updateFriends', + _buildParam({ + 'req': updateFriendsReq.toJson(), + 'operationID': Utils.checkOperationID(operationID), + })) + .then((value) => value); + } + + static Map _buildParam(Map param) { param["ManagerName"] = "friendshipManager"; + param = Utils.cleanMap(param); + return param; } } diff --git a/lib/src/manager/im_group_manager.dart b/lib/src/manager/im_group_manager.dart index c33cb019..5cf15a35 100644 --- a/lib/src/manager/im_group_manager.dart +++ b/lib/src/manager/im_group_manager.dart @@ -2,6 +2,7 @@ import 'dart:developer'; import 'package:flutter/services.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; +import 'package:flutter_openim_sdk/src/models/set_group_member_info.dart'; class GroupManager { MethodChannel _channel; @@ -18,39 +19,43 @@ class GroupManager { /// Invite users to a group, allowing them to join without approval. /// [groupID] Group ID /// [userIDList] List of user IDs - Future inviteUserToGroup({ + Future> inviteUserToGroup({ required String groupID, required List userIDList, String? reason, String? operationID, }) => - _channel.invokeMethod( - 'inviteUserToGroup', - _buildParam({ - 'groupID': groupID, - 'userIDList': userIDList, - 'reason': reason, - "operationID": Utils.checkOperationID(operationID), - })); + _channel + .invokeMethod( + 'inviteUserToGroup', + _buildParam({ + 'groupID': groupID, + 'userIDList': userIDList, + 'reason': reason, + "operationID": Utils.checkOperationID(operationID), + })) + .then((value) => Utils.toList(value, (map) => GroupInviteResult.fromJson(map))); /// Remove group members /// [groupID] Group ID /// [userIDList] List of user IDs /// [reason] Reason for removal - Future kickGroupMember({ + Future> kickGroupMember({ required String groupID, required List userIDList, String? reason, String? operationID, }) => - _channel.invokeMethod( - 'kickGroupMember', - _buildParam({ - 'groupID': groupID, - 'userIDList': userIDList, - 'reason': reason, - "operationID": Utils.checkOperationID(operationID), - })); + _channel + .invokeMethod( + 'kickGroupMember', + _buildParam({ + 'groupID': groupID, + 'userIDList': userIDList, + 'reason': reason, + "operationID": Utils.checkOperationID(operationID), + })) + .then((value) => Utils.toList(value, (map) => GroupInviteResult.fromJson(map))); /// Query group member information /// [groupID] Group ID @@ -213,15 +218,17 @@ class GroupManager { /// Apply to join a group, requiring approval from an administrator or the group. /// [joinSource] 2: Invited, 3: Searched, 4: Using a QR code - Future joinGroup({required String groupID, String? reason, String? operationID, int joinSource = 3, String? ex}) => _channel.invokeMethod( - 'joinGroup', - _buildParam({ - 'groupID': groupID, - 'reason': reason, - 'joinSource': joinSource, - 'ex': ex, - 'operationID': Utils.checkOperationID(operationID), - })); + Future joinGroup( + {required String groupID, String? reason, String? operationID, int joinSource = 3, String? ex}) => + _channel.invokeMethod( + 'joinGroup', + _buildParam({ + 'groupID': groupID, + 'reason': reason, + 'joinSource': joinSource, + 'ex': ex, + 'operationID': Utils.checkOperationID(operationID), + })); /// Exit a group Future quitGroup({ @@ -357,20 +364,17 @@ class GroupManager { /// [groupID] Group ID /// [userID] User ID of the group member /// [groupNickname] Group nickname + @Deprecated('Use [setGroupMemberInfo] instead') Future setGroupMemberNickname({ required String groupID, required String userID, String? groupNickname, String? operationID, - }) => - _channel.invokeMethod( - 'setGroupMemberNickname', - _buildParam({ - 'groupID': groupID, - 'userID': userID, - 'groupNickname': groupNickname ?? '', - 'operationID': Utils.checkOperationID(operationID), - })); + }) { + final req = SetGroupMemberInfo(groupID: groupID, userID: userID, nickname: groupNickname); + + return setGroupMemberInfo(groupMembersInfo: req, operationID: operationID); + } /// Query a group /// [keywordList] Search keywords; currently, only one keyword is supported, and it cannot be empty. @@ -399,20 +403,17 @@ class GroupManager { /// [groupID] Group ID /// [userID] User ID of the group member /// [roleLevel] Role level; see [GroupRoleLevel] + @Deprecated('Use [setGroupMemberInfo] instead') Future setGroupMemberRoleLevel({ required String groupID, required String userID, required int roleLevel, String? operationID, - }) => - _channel.invokeMethod( - 'setGroupMemberRoleLevel', - _buildParam({ - 'groupID': groupID, - 'userID': userID, - 'roleLevel': roleLevel, - 'operationID': Utils.checkOperationID(operationID), - })); + }) { + final req = SetGroupMemberInfo(groupID: groupID, userID: userID, roleLevel: roleLevel); + + return setGroupMemberInfo(groupMembersInfo: req, operationID: operationID); + } /// Get a group member list based on join time Future> getGroupMemberListByJoinTime({ @@ -441,50 +442,44 @@ class GroupManager { /// Set group verification for joining /// [groupID] Group ID /// [needVerification] Verification setting; see [GroupVerification] class + @Deprecated('Use [setGroupInfo] instead') Future setGroupVerification({ required String groupID, required int needVerification, String? operationID, - }) => - _channel.invokeMethod( - 'setGroupVerification', - _buildParam({ - 'groupID': groupID, - 'needVerification': needVerification, - 'operationID': Utils.checkOperationID(operationID), - })); + }) { + final req = GroupInfo(groupID: groupID, needVerification: needVerification); + + return setGroupInfo(req, operationID: operationID); + } - /// Allow/disallow members to view each other's information through the group + /// Allow/disallow members to add friends through the group /// [groupID] Group ID /// [status] 0: Disable, 1: Enable + @Deprecated('Use [setGroupInfo] instead') Future setGroupLookMemberInfo({ required String groupID, required int status, String? operationID, - }) => - _channel.invokeMethod( - 'setGroupLookMemberInfo', - _buildParam({ - 'groupID': groupID, - 'status': status, - 'operationID': Utils.checkOperationID(operationID), - })); + }) { + final req = GroupInfo(groupID: groupID, lookMemberInfo: status); + + return setGroupInfo(req, operationID: operationID); + } /// Allow/disallow members to add friends through the group /// [groupID] Group ID /// [status] 0: Disable, 1: Enable + @Deprecated('Use [setGroupInfo] instead') Future setGroupApplyMemberFriend({ required String groupID, required int status, String? operationID, - }) => - _channel.invokeMethod( - 'setGroupApplyMemberFriend', - _buildParam({ - 'groupID': groupID, - 'status': status, - 'operationID': Utils.checkOperationID(operationID), - })); + }) { + final req = GroupInfo(groupID: groupID, applyMemberFriend: status); + + return setGroupInfo(req, operationID: operationID); + } /// Get group owners and administrators /// [groupId] Group ID @@ -567,7 +562,7 @@ class GroupManager { /// Modify the GroupMemberInfo ex field Future setGroupMemberInfo({ - required GroupMembersInfo groupMembersInfo, + required SetGroupMemberInfo groupMembersInfo, String? operationID, }) => _channel.invokeMethod( @@ -590,9 +585,13 @@ class GroupManager { 'operationID': Utils.checkOperationID(operationID), })); - static Map _buildParam(Map param) { + static Map _buildParam(Map param) { param["ManagerName"] = "groupManager"; + param = Utils.cleanMap(param); log('param: $param'); + return param; } + + } diff --git a/lib/src/manager/im_manager.dart b/lib/src/manager/im_manager.dart index 0881420b..322f6a47 100644 --- a/lib/src/manager/im_manager.dart +++ b/lib/src/manager/im_manager.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:developer'; import 'dart:io'; @@ -141,18 +142,6 @@ class IMManager { var list = Utils.toList(value, (map) => ReadReceiptInfo.fromJson(map)); messageManager.msgListener.recvC2CReadReceipt(list); break; - case 'onRecvGroupReadReceipt': - var value = call.arguments['data']['groupMsgReceiptList']; - var list = Utils.toList(value, (map) => ReadReceiptInfo.fromJson(map)); - messageManager.msgListener.recvGroupReadReceipt(list); - break; - case 'onRecvMessageExtensionsDeleted': - var msgID = call.arguments['data']['msgID']; - var value = call.arguments['data']['reactionExtensionKeyList']; - var list = Utils.toList(value, (map) => '$map'); - messageManager.msgListener.recvMessageExtensionsDeleted(msgID, list); - break; - case 'onRecvNewMessage': var value = call.arguments['data']['message']; final msg = Utils.toObj(value, (map) => Message.fromJson(map)); @@ -367,10 +356,8 @@ class IMManager { OnConnectListener listener, { String? operationID, }) { - this._connectListener = listener; - if (config.logFilePath == null) { - config.logFilePath = config.dataDir; - } + _connectListener = listener; + config.logFilePath ??= config.dataDir; return _channel.invokeMethod( 'initSDK', _buildParam( @@ -387,7 +374,6 @@ class IMManager { /// [apiAddr] SDK API address /// [wsAddr] SDK WebSocket address /// [dataDir] SDK database storage directory - /// [objectStorage] Object storage minio /// [logLevel] Log level, 1: no printing /// [enabledEncryption] true: encryption /// [enabledCompression] true: compression @@ -398,12 +384,13 @@ class IMManager { required String dataDir, required OnConnectListener listener, int logLevel = 6, + bool isNeedEncryption = false, bool isCompression = false, bool isLogStandardOutput = true, String? logFilePath, String? operationID, }) { - this._connectListener = listener; + _connectListener = listener; return _channel.invokeMethod( 'initSDK', _buildParam( @@ -414,8 +401,10 @@ class IMManager { "dataDir": dataDir, "logLevel": logLevel, "isCompression": isCompression, + 'isNeedEncryption': isNeedEncryption, "isLogStandardOutput": isLogStandardOutput, "logFilePath": logFilePath, + 'systemType': 'flutter', "operationID": Utils.checkOperationID(operationID), }, ), @@ -535,7 +524,7 @@ class IMManager { 'operationID': Utils.checkOperationID(operationID), })); - /// 上传日志 + /// Upload logs Future uploadLogs({ String? ex, int line = 0, @@ -549,6 +538,27 @@ class IMManager { 'operationID': Utils.checkOperationID(operationID), })); + Future logs({ + int logLevel = 5, + String? file, + int line = 0, + String? msgs, + String? err, + List? keyAndValues, + String? operationID, + }) => + _channel.invokeMethod( + 'logs', + _buildParam({ + 'line': line, + 'logLevel': logLevel, + 'file': file, + 'msgs': msgs, + 'err': err, + if (keyAndValues != null) 'keyAndValue': jsonEncode(keyAndValues), + 'operationID': Utils.checkOperationID(operationID), + })); + void setUploadLogsListener(OnUploadLogsListener listener) { _uploadLogsListener = listener; } @@ -569,8 +579,10 @@ class IMManager { MethodChannel get channel => _channel; - static Map _buildParam(Map param) { + static Map _buildParam(Map param) { param["ManagerName"] = "imManager"; + param = Utils.cleanMap(param); + return param; } } diff --git a/lib/src/manager/im_message_manager.dart b/lib/src/manager/im_message_manager.dart index 29d6a6f2..eb04f9d3 100644 --- a/lib/src/manager/im_message_manager.dart +++ b/lib/src/manager/im_message_manager.dart @@ -147,18 +147,14 @@ class MessageManager { /// Typing status update /// [msgTip] Custom content + @Deprecated('Use [OpenIM.iMManager.conversationManager.changeInputStates(conversationID:focus:)] instead') Future typingStatusUpdate({ required String userID, String? msgTip, String? operationID, - }) => - _channel.invokeMethod( - 'typingStatusUpdate', - _buildParam({ - "msgTip": msgTip, - "userID": userID, - "operationID": Utils.checkOperationID(operationID), - })); + }) { + throw UnimplementedError('typingStatusUpdate'); + } /// Create a text message Future createTextMessage({ @@ -551,6 +547,7 @@ class MessageManager { /// Mark messages as read /// [conversationID] Conversation ID /// [messageIDList] List of clientMsgIDs of messages to be marked as read + @Deprecated('Use markConversationMessageAsRead instead') Future markMessagesAsReadByMsgID({ required String conversationID, required List messageIDList, @@ -791,8 +788,10 @@ class MessageManager { })); } - static Map _buildParam(Map param) { + static Map _buildParam(Map param) { param["ManagerName"] = "messageManager"; + param = Utils.cleanMap(param); + return param; } } diff --git a/lib/src/manager/im_user_manager.dart b/lib/src/manager/im_user_manager.dart index 6927fd17..14743e77 100644 --- a/lib/src/manager/im_user_manager.dart +++ b/lib/src/manager/im_user_manager.dart @@ -15,7 +15,7 @@ class UserManager { /// Get user information /// [userIDList] List of user IDs - Future> getUsersInfo({ + Future> getUsersInfo({ required List userIDList, String? operationID, }) => @@ -26,7 +26,7 @@ class UserManager { 'userIDList': userIDList, 'operationID': Utils.checkOperationID(operationID), })) - .then((value) => Utils.toList(value, (v) => FullUserInfo.fromJson(v))); + .then((value) => Utils.toList(value, (v) => PublicUserInfo.fromJson(v))); /// Get information of the currently logged-in user Future getSelfUserInfo({ @@ -48,17 +48,16 @@ class UserManager { Future setSelfInfo({ String? nickname, String? faceURL, - int? appManagerLevel, + int? globalRecvMsgOpt, String? ex, String? operationID, }) => _channel.invokeMethod( 'setSelfInfo', _buildParam({ - // 'userID': userID, 'nickname': nickname, 'faceURL': faceURL, - 'appManagerLevel': appManagerLevel, + 'globalRecvMsgOpt': globalRecvMsgOpt, 'ex': ex, 'operationID': Utils.checkOperationID(operationID), })); @@ -115,37 +114,28 @@ class UserManager { .then((value) => Utils.toList(value, (map) => UserStatusInfo.fromJson(map))); } - Future> getUsersInfoWithCache( + @Deprecated('Use [getUsersInfo] instead') + Future> getUsersInfoWithCache( List userIDs, { - String? groupID, String? operationID, }) { - return _channel - .invokeMethod( - 'getUsersInfoWithCache', - _buildParam({ - 'userIDs': userIDs, - 'groupID': groupID, - 'operationID': Utils.checkOperationID(operationID), - })) - .then((value) => Utils.toList(value, (map) => FullUserInfo.fromJson(map))); + return getUsersInfo(userIDList: userIDs, operationID: operationID); } -/* - Future setSelfUserInfoEx( - UserInfo userInfo, { +/// Global Do Not Disturb +/// [status] 0: Normal; 1: Do not accept messages; 2: Accept online messages but not offline messages; + @Deprecated('use [setSelfInfo] instead') + Future setGlobalRecvMessageOpt({ + required int status, String? operationID, }) { - return _channel.invokeMethod( - 'setSelfUserInfoEx', - _buildParam({ - ...userInfo.toJson(), - 'operationID': Utils.checkOperationID(operationID), - })); + return setSelfInfo(globalRecvMsgOpt: status); } -*/ - static Map _buildParam(Map param) { + + static Map _buildParam(Map param) { param["ManagerName"] = "userManager"; + param = Utils.cleanMap(param); + return param; } } diff --git a/lib/src/models/group_info.dart b/lib/src/models/group_info.dart index 0eaf5e56..df65b139 100644 --- a/lib/src/models/group_info.dart +++ b/lib/src/models/group_info.dart @@ -115,16 +115,11 @@ class GroupInfo { } /// Corresponding Conversation Type for Group Type - int get sessionType => groupType == GroupType.general - ? ConversationType.group - : ConversationType.superGroup; + int get sessionType => groupType == GroupType.general ? ConversationType.group : ConversationType.superGroup; @override bool operator ==(Object other) => - identical(this, other) || - other is GroupInfo && - runtimeType == other.runtimeType && - groupID == other.groupID; + identical(this, other) || other is GroupInfo && runtimeType == other.runtimeType && groupID == other.groupID; @override int get hashCode => groupID.hashCode; diff --git a/lib/src/models/init_config.dart b/lib/src/models/init_config.dart index 33c8a3b1..fd928afc 100644 --- a/lib/src/models/init_config.dart +++ b/lib/src/models/init_config.dart @@ -1,4 +1,5 @@ class InitConfig { + String systemType; int platformID; String apiAddr; String wsAddr; @@ -6,6 +7,7 @@ class InitConfig { int logLevel; bool isLogStandardOutput; String? logFilePath; + bool enabledCompression; InitConfig({ required this.platformID, @@ -15,18 +17,21 @@ class InitConfig { this.logLevel = 6, this.isLogStandardOutput = true, this.logFilePath, + this.enabledCompression = false, + this.systemType = 'flutter', }); factory InitConfig.fromJson(Map json) { return InitConfig( - platformID: json['platformID'], - apiAddr: json['apiAddr'], - wsAddr: json['wsAddr'], - dataDir: json['dataDir'], - logLevel: json['logLevel'], - isLogStandardOutput: json['isLogStandardOutput'], - logFilePath: json['logFilePath'], - ); + platformID: json['platformID'], + apiAddr: json['apiAddr'], + wsAddr: json['wsAddr'], + dataDir: json['dataDir'], + logLevel: json['logLevel'], + isLogStandardOutput: json['isLogStandardOutput'], + logFilePath: json['logFilePath'], + enabledCompression: json['isCompression'], + systemType: json['systemType']); } Map toMap() { @@ -38,6 +43,8 @@ class InitConfig { 'logLevel': logLevel, 'isLogStandardOutput': isLogStandardOutput, 'logFilePath': logFilePath, + 'isCompression': enabledCompression, + 'systemType': systemType, }; } } diff --git a/lib/src/models/set_group_member_info.dart b/lib/src/models/set_group_member_info.dart new file mode 100644 index 00000000..a3feb53d --- /dev/null +++ b/lib/src/models/set_group_member_info.dart @@ -0,0 +1,41 @@ +class SetGroupMemberInfo { + SetGroupMemberInfo({ + required this.groupID, + required this.userID, + this.roleLevel, + this.nickname, + this.faceURL, + this.ex, + }); + + final String groupID; + final String userID; + final int? roleLevel; + final String? nickname; + final String? faceURL; + final String? ex; + + SetGroupMemberInfo.fromJson(Map json) + : groupID = json['groupID'], + userID = json['userID'], + roleLevel = json['roleLevel'], + nickname = json['nickname'], + faceURL = json['faceURL'], + ex = json['ex']; + + Map toJson() { + final data = Map(); + data['groupID'] = groupID; + data['userID'] = userID; + data['roleLevel'] = roleLevel; + data['nickname'] = nickname; + data['faceURL'] = faceURL; + data['ex'] = ex; + return data; + } + + @override + String toString() { + return 'SetGroupMemberInfo{groupID: $groupID, userID: $userID, roleLevel: $roleLevel, nickname: $nickname, faceURL: $faceURL, ex: $ex}'; + } +} diff --git a/lib/src/models/update_req.dart b/lib/src/models/update_req.dart new file mode 100644 index 00000000..2dd4b42d --- /dev/null +++ b/lib/src/models/update_req.dart @@ -0,0 +1,91 @@ +class UpdateFriendsReq { + final String? ownerUserID; + final List? friendUserIDs; + final bool? isPinned; + final String? remark; + final String? ex; + + UpdateFriendsReq({ + this.ownerUserID, + this.friendUserIDs, + this.isPinned, + this.remark, + this.ex, + }); + + UpdateFriendsReq.fromJson(Map json) + : ownerUserID = json['ownerUserID'], + friendUserIDs = json['friendUserIDs'], + isPinned = json['isPinned'], + remark = json['remark'], + ex = json['ex']; + + Map toJson() { + final data = {}; + data['ownerUserID'] = ownerUserID; + data['friendUserIDs'] = friendUserIDs; + data['isPinned'] = isPinned; + data['remark'] = remark; + data['ex'] = ex; + return data; + } + + @override + String toString() { + return 'UpdateFriendsReq{ownerUserID: $ownerUserID, friendUserIDs: $friendUserIDs, isPinned: $isPinned, remark: $remark, ex: $ex}'; + } +} + +class ConversationReq { + final String? userID; + final String? groupID; + final int? recvMsgOpt; + final bool? isPinned; + final bool? isPrivateChat; + final String? ex; + final int? burnDuration; + final bool? isMsgDestruct; + final int? msgDestructTime; + final int? groupAtType; + + ConversationReq({ + this.userID, + this.groupID, + this.recvMsgOpt, + this.isPinned, + this.isPrivateChat, + this.ex, + this.burnDuration, + this.isMsgDestruct, + this.msgDestructTime, + this.groupAtType, + }); + + ConversationReq.fromJson(Map json) + : userID = json['userID'], + groupID = json['groupID'], + recvMsgOpt = json['recvMsgOpt'], + isPinned = json['isPinned'], + isPrivateChat = json['isPrivateChat'], + ex = json['ex'], + burnDuration = json['burnDuration'], + isMsgDestruct = json['isMsgDestruct'], + msgDestructTime = json['msgDestructTime'], + groupAtType = json['groupAtType']; + + Map toJson() { + final data = {}; + data['userID'] = userID; + data['groupID'] = groupID; + data['recvMsgOpt'] = recvMsgOpt; + data['isPinned'] = isPinned; + data['isPrivateChat'] = isPrivateChat; + data['ex'] = ex; + data['burnDuration'] = burnDuration; + data['isMsgDestruct'] = isMsgDestruct; + data['msgDestructTime'] = msgDestructTime; + data['groupAtType'] = groupAtType; + + return data; + } +} diff --git a/lib/src/models/user_info.dart b/lib/src/models/user_info.dart index 428ed608..7f3e4631 100644 --- a/lib/src/models/user_info.dart +++ b/lib/src/models/user_info.dart @@ -74,48 +74,6 @@ class UserInfo { int get hashCode => userID.hashCode; } -class FullUserInfo { - /// User's public information - PublicUserInfo? publicInfo; - - /// Information visible only to friends - FriendInfo? friendInfo; - - /// Blacklist information - BlacklistInfo? blackInfo; - - FullUserInfo.fromJson(Map json) { - publicInfo = json['publicInfo'] != null ? PublicUserInfo.fromJson(json['publicInfo']) : null; - friendInfo = json['friendInfo'] != null ? FriendInfo.fromJson(json['friendInfo']) : null; - blackInfo = json['blackInfo'] != null ? BlacklistInfo.fromJson(json['blackInfo']) : null; - } - - Map toJson() { - final data = Map(); - data['publicInfo'] = this.publicInfo?.toJson(); - data['friendInfo'] = this.friendInfo?.toJson(); - data['blackInfo'] = this.blackInfo?.toJson(); - - return data; - } - - String get userID { - return publicInfo?.userID ?? friendInfo?.userID ?? blackInfo?.userID ?? ''; - } - - String get nickname { - return publicInfo?.nickname ?? friendInfo?.nickname ?? blackInfo?.nickname ?? ''; - } - - String get faceURL { - return publicInfo?.faceURL ?? friendInfo?.faceURL ?? blackInfo?.faceURL ?? ''; - } - - String get showName { - return friendInfo?.nickname ?? nickname; - } -} - class PublicUserInfo { /// User ID String? userID; diff --git a/lib/src/openim.dart b/lib/src/openim.dart index f954b5a1..d2a6890a 100644 --- a/lib/src/openim.dart +++ b/lib/src/openim.dart @@ -2,9 +2,9 @@ import 'package:flutter/services.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; class OpenIM { - static const version = '3.8.1-rc.0'; + static const version = '3.8.1'; - static const _channel = const MethodChannel('flutter_openim_sdk'); + static const _channel = MethodChannel('flutter_openim_sdk'); static final iMManager = IMManager(_channel); diff --git a/lib/src/utils.dart b/lib/src/utils.dart index 7c6975a8..4ec2b9cc 100644 --- a/lib/src/utils.dart +++ b/lib/src/utils.dart @@ -4,13 +4,21 @@ class Utils { static List toList(String value, T f(Map map)) => (formatJson(value) as List).map((e) => f(e)).toList(); - static T toObj(String value, T f(Map map)) => - f(formatJson(value)); + static T toObj(String value, T f(Map map)) => f(formatJson(value)); static List toListMap(String value) => formatJson(value); static dynamic formatJson(String value) => jsonDecode(value); - static String checkOperationID(String? obj) => - obj ?? DateTime.now().millisecondsSinceEpoch.toString(); + static String checkOperationID(String? obj) => obj ?? DateTime.now().millisecondsSinceEpoch.toString(); + + static Map cleanMap(Map map) { + map.removeWhere((key, value) { + if (value is Map) { + cleanMap(value); + } + return value == null; + }); + return map; + } } diff --git a/pubspec.yaml b/pubspec.yaml index e6a4622f..6984d6a3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_openim_sdk description: An instant messaging plug-in that supports Android and IOS. And the server is also all open source. -version: 3.8.1-rc.0 +version: 3.8.1 homepage: https://www.openim.io repository: https://github.com/openimsdk/open-im-sdk-flutter