diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnConversationListener.java b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnConversationListener.java index cdaaf8b..1e2f2f8 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnConversationListener.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnConversationListener.java @@ -2,6 +2,7 @@ package io.openim.flutter_openim_sdk.listener; import io.openim.flutter_openim_sdk.util.CommonUtil; + public class OnConversationListener implements open_im_sdk_callback.OnConversationListener { @Override @@ -43,4 +44,4 @@ public class OnConversationListener implements open_im_sdk_callback.OnConversati public void onTotalUnreadMessageCountChanged(int i) { CommonUtil.emitEvent("conversationListener", "onTotalUnreadMessageCountChanged", i); } -} \ No newline at end of file +} 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 df4797f..5fc05fa 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 @@ -213,4 +213,22 @@ public class ConversationManager extends BaseManager { value(methodCall, "ex") ); } + + public void changeInputStates(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.changeInputStates( + new OnBaseListener(result, methodCall), + value(methodCall, "operationID"), + value(methodCall, "conversationID"), + value(methodCall, "focus") + ); + } + + public void getInputStates(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.getInputStates( + new OnBaseListener(result, methodCall), + value(methodCall, "operationID"), + value(methodCall, "conversationID"), + value(methodCall, "userID") + ); + } } diff --git a/example/ios/Podfile b/example/ios/Podfile index 313ea4a..e7c8067 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,5 +1,4 @@ # Uncomment this line to define a global platform for your project -platform :ios, '11.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 6a68a1e..9d154c2 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2,8 +2,8 @@ PODS: - Flutter (1.0.0) - flutter_openim_sdk (0.0.1): - Flutter - - OpenIMSDKCore (= 3.4.0) - - OpenIMSDKCore (3.4.0) + - OpenIMSDKCore (= 3.8.1-rc.0) + - OpenIMSDKCore (3.8.1-rc.0) DEPENDENCIES: - Flutter (from `Flutter`) @@ -20,10 +20,10 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_openim_sdk/ios" SPEC CHECKSUMS: - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 - flutter_openim_sdk: 54d1c836ff60ebb5b99d246521ef0cb1d834fb13 - OpenIMSDKCore: 47e0e830afe0d2dd905ad3dda255e6a6d26a555c + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + flutter_openim_sdk: 754e4ad0177918ce2c37dfba63973db26ce89c90 + OpenIMSDKCore: 0c92e9e3eb2a91b6b6528e7781a1e28ed42bc518 -PODFILE CHECKSUM: 7368163408c647b7eb699d0d788ba6718e18fb8d +PODFILE CHECKSUM: d4ba08011ff3d270b662299a448a7c436eb30089 -COCOAPODS: 1.13.0 +COCOAPODS: 1.14.3 diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index b25c9d9..fa1befe 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -344,6 +344,7 @@ DEVELOPMENT_TEAM = BDLHL8GNFV; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -476,6 +477,7 @@ DEVELOPMENT_TEAM = BDLHL8GNFV; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -500,6 +502,7 @@ DEVELOPMENT_TEAM = BDLHL8GNFV; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ios/Classes/Module/ConversationManager.swift b/ios/Classes/Module/ConversationManager.swift index 15aac4d..bbba2c3 100644 --- a/ios/Classes/Module/ConversationManager.swift +++ b/ios/Classes/Module/ConversationManager.swift @@ -21,14 +21,17 @@ public class ConversationManager: BaseServiceManager { self["setConversationPrivateChat"] = setConversationPrivateChat self["clearConversationAndDeleteAllMsg"] = clearConversationAndDeleteAllMsg self["deleteConversationAndDeleteAllMsg"] = deleteConversationAndDeleteAllMsg - self["deleteAllConversationFromLocal"] = deleteAllConversationFromLocal self["resetConversationGroupAtType"] = resetConversationGroupAtType self["getAtAllTag"] = getAtAllTag self["setGlobalRecvMessageOpt"] = setGlobalRecvMessageOpt self["setConversationBurnDuration"] = setConversationBurnDuration + self["setConversationIsMsgDestruct"] = setConversationIsMsgDestruct + self["setConversationMsgDestructTime"] = setConversationMsgDestructTime self["hideAllConversations"] = hideAllConversations self["searchConversation"] = searchConversation self["setConversationEx"] = setConversationEx + self["changeInputStates"] = changeInputStates + self["getInputStates"] = getInputStates } func setConversationListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ @@ -116,8 +119,16 @@ public class ConversationManager: BaseServiceManager { Open_im_sdkSetConversationBurnDuration(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[int32: "burnDuration"]) } + func setConversationIsMsgDestruct(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkSetConversationIsMsgDestruct(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[bool: "isMsgDestruct"]) + } + + func setConversationMsgDestructTime(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkSetConversationMsgDestructTime(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[int64: "duration"]) + } + func hideAllConversations(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkHideAllConversations(BaseCallback(result: result), methodCall[string: "operationID"]) + Open_im_sdkHideAllConversations(BaseCallback(result: result), methodCall[string: "operationID"]) } func searchConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ @@ -125,7 +136,15 @@ public class ConversationManager: BaseServiceManager { } func setConversationEx(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ - Open_im_sdkSetConversationEx(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[jsonString: "ex"]) + Open_im_sdkSetConversationEx(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[string: "ex"]) + } + + func changeInputStates(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkChangeInputStates(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[bool: "focus"]) + } + + func getInputStates(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetInputStates(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[string: "userID"]) } } @@ -135,30 +154,30 @@ public class ConversationListener: NSObject, Open_im_sdk_callbackOnConversationL 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) { self.channel = channel } - + public func onConversationChanged(_ conversationList: String?) { CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onConversationChanged", errCode: nil, errMsg: nil, data: conversationList) } - + 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 onSyncServerStart(_ reinstalled: Bool) { CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerStart", errCode: nil, errMsg: nil, data: reinstalled) } diff --git a/ios/Classes/Module/IMManager.swift b/ios/Classes/Module/IMManager.swift index bd89aff..42880dc 100644 --- a/ios/Classes/Module/IMManager.swift +++ b/ios/Classes/Module/IMManager.swift @@ -108,7 +108,7 @@ public class ConnListener: NSObject, Open_im_sdk_callbackOnConnListenerProtocol public func onUserTokenInvalid(_ errMsg: String?) { CommonUtil.emitEvent(channel: self.channel, method: "connectListener", type: "onUserTokenInvalid", errCode: nil, errMsg: errMsg, data: nil) } - + private let channel:FlutterMethodChannel init(channel:FlutterMethodChannel) { diff --git a/lib/flutter_openim_sdk.dart b/lib/flutter_openim_sdk.dart index b1e4f69..6808ffc 100644 --- a/lib/flutter_openim_sdk.dart +++ b/lib/flutter_openim_sdk.dart @@ -34,5 +34,6 @@ export 'src/models/message.dart'; export 'src/models/notification_info.dart'; export 'src/models/search_info.dart'; export 'src/models/user_info.dart'; +export 'src/models/input_status_changed_data.dart'; export 'src/openim.dart'; export 'src/utils.dart'; diff --git a/lib/src/listener/connect_listener.dart b/lib/src/listener/connect_listener.dart index baad63a..b4d6dc0 100644 --- a/lib/src/listener/connect_listener.dart +++ b/lib/src/listener/connect_listener.dart @@ -5,6 +5,7 @@ class OnConnectListener { Function()? onConnecting; Function()? onKickedOffline; Function()? onUserTokenExpired; + Function()? onUserTokenInvalid; OnConnectListener({ this.onConnectFailed, @@ -12,6 +13,7 @@ class OnConnectListener { this.onConnecting, this.onKickedOffline, this.onUserTokenExpired, + this.onUserTokenInvalid, }); /// SDK failed to connect to the server @@ -38,4 +40,8 @@ class OnConnectListener { void userTokenExpired() { onUserTokenExpired?.call(); } + + void userTokenInvalid() { + onUserTokenInvalid?.call(); + } } diff --git a/lib/src/listener/conversation_listener.dart b/lib/src/listener/conversation_listener.dart index 2db54c8..6f4b18b 100644 --- a/lib/src/listener/conversation_listener.dart +++ b/lib/src/listener/conversation_listener.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; /// Conversation Listener @@ -5,17 +6,21 @@ class OnConversationListener { Function(List list)? onConversationChanged; Function(List list)? onNewConversation; Function(int count)? onTotalUnreadMessageCountChanged; - Function()? onSyncServerFailed; - Function()? onSyncServerFinish; - Function()? onSyncServerStart; + Function(bool? reinstalled)? onSyncServerStart; + Function(int? progress)? onSyncServerProgress; + Function(bool? reinstalled)? onSyncServerFinish; + Function(bool? reinstalled)? onSyncServerFailed; + ValueChanged? onInputStatusChanged; OnConversationListener({ this.onConversationChanged, this.onNewConversation, this.onTotalUnreadMessageCountChanged, - this.onSyncServerFailed, - this.onSyncServerFinish, this.onSyncServerStart, + this.onSyncServerProgress, + this.onSyncServerFinish, + this.onSyncServerFailed, + this.onInputStatusChanged, }); /// Conversations have changed @@ -33,15 +38,23 @@ class OnConversationListener { onTotalUnreadMessageCountChanged?.call(count); } - void syncServerFailed() { - onSyncServerFailed?.call(); + void syncServerStart(bool? reinstalled) { + onSyncServerStart?.call(reinstalled); + } + + void syncServerProgress(int? progress) { + onSyncServerProgress?.call(progress); + } + + void syncServerFailed(bool? reinstalled) { + onSyncServerFailed?.call(reinstalled); } - void syncServerFinish() { - onSyncServerFinish?.call(); + void syncServerFinish(bool? reinstalled) { + onSyncServerFinish?.call(reinstalled); } - void syncServerStart() { - onSyncServerStart?.call(); + void conversationUserInputStatusChanged(InputStatusChangedData data) { + onInputStatusChanged?.call(data); } } diff --git a/lib/src/manager/im_conversation_manager.dart b/lib/src/manager/im_conversation_manager.dart index 72ff8f2..fa6ab24 100644 --- a/lib/src/manager/im_conversation_manager.dart +++ b/lib/src/manager/im_conversation_manager.dart @@ -361,14 +361,13 @@ class ConversationManager { String? ex, String? operationID, }) { - return _channel - .invokeMethod( - 'setConversationEx', - _buildParam({ - 'conversationID': conversationID, - 'ex': ex, - "operationID": Utils.checkOperationID(operationID), - })); + return _channel.invokeMethod( + 'setConversationEx', + _buildParam({ + 'conversationID': conversationID, + 'ex': ex, + "operationID": Utils.checkOperationID(operationID), + })); } /// Custom Sort for Conversation List @@ -391,6 +390,45 @@ class ConversationManager { } }); + Future changeInputStates({ + required String conversationID, + required bool focus, + String? operationID, + }) { + return _channel.invokeMethod( + 'changeInputStates', + _buildParam( + { + 'focus': focus, + 'conversationID': conversationID, + 'operationID': Utils.checkOperationID(operationID), + }, + ), + ); + } + + Future?> getInputStates( + String conversationID, + String userID, { + String? operationID, + }) { + return _channel + .invokeMethod( + 'getInputStates', + _buildParam( + { + 'conversationID': conversationID, + 'userID': userID, + 'operationID': Utils.checkOperationID(operationID), + }, + ), + ) + .then((value) { + final result = Utils.toListMap(value); + return List.from(result); + }); + } + static Map _buildParam(Map param) { param["ManagerName"] = "conversationManager"; log('param: $param'); diff --git a/lib/src/manager/im_manager.dart b/lib/src/manager/im_manager.dart index abdfb24..0881420 100644 --- a/lib/src/manager/im_manager.dart +++ b/lib/src/manager/im_manager.dart @@ -56,6 +56,9 @@ class IMManager { case 'onUserTokenExpired': _connectListener.userTokenExpired(); break; + case 'onUserTokenInvalid': + _connectListener.userTokenInvalid(); + break; } } else if (call.method == ListenerType.userListener) { String type = call.arguments['type']; @@ -184,14 +187,17 @@ class IMManager { dynamic data = call.arguments['data']; switch (type) { case 'onSyncServerStart': - conversationManager.listener.syncServerStart(); + print('dart onSyncServerStart: $data'); + conversationManager.listener.syncServerStart(data); + break; + case 'onSyncServerProgress': + conversationManager.listener.syncServerProgress(data); break; case 'onSyncServerFinish': - conversationManager.listener.syncServerFinish(); + conversationManager.listener.syncServerFinish(data); break; - case 'onSyncServerFailed': - conversationManager.listener.syncServerFailed(); + conversationManager.listener.syncServerFailed(data); break; case 'onNewConversation': var list = Utils.toList(data, (map) => ConversationInfo.fromJson(map)); @@ -204,6 +210,10 @@ class IMManager { case 'onTotalUnreadMessageCountChanged': conversationManager.listener.totalUnreadMessageCountChanged(data ?? 0); break; + case 'onConversationUserInputStatusChanged': + final i = Utils.toObj(data, (map) => InputStatusChangedData.fromJson(map)); + conversationManager.listener.conversationUserInputStatusChanged(i); + break; } } else if (call.method == ListenerType.friendListener) { String type = call.arguments['type']; diff --git a/lib/src/models/input_status_changed_data.dart b/lib/src/models/input_status_changed_data.dart new file mode 100644 index 0000000..8a2e069 --- /dev/null +++ b/lib/src/models/input_status_changed_data.dart @@ -0,0 +1,24 @@ +class InputStatusChangedData { + final String userID; + final String conversationID; + final List? platformIDs; + + InputStatusChangedData({ + required this.userID, + required this.conversationID, + this.platformIDs, + }); + + InputStatusChangedData.fromJson(Map json) + : userID = json['userID'], + conversationID = json['conversationID'], + platformIDs = List.from(json['platformIDs'] ?? []); + + Map toJson() { + final data = {}; + data['userID'] = userID; + data['conversationID'] = conversationID; + data['platformIDs'] = platformIDs; + return data; + } +}