import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_openim_sdk/enum/listener_type.dart'; import 'package:flutter_openim_sdk/listener/int_sdk_listener.dart'; import 'package:flutter_openim_sdk/manager/im_conversation_manager.dart'; import 'package:flutter_openim_sdk/manager/im_friendship_manager.dart'; import 'package:flutter_openim_sdk/manager/im_group_manager.dart'; import 'package:flutter_openim_sdk/manager/im_message_manager.dart'; import 'package:flutter_openim_sdk/manager/im_offline_push_manager.dart'; import 'package:flutter_openim_sdk/manager/im_signaling_manager.dart'; import 'package:flutter_openim_sdk/models/conversation_info.dart'; import 'package:flutter_openim_sdk/models/message.dart'; import 'package:flutter_openim_sdk/models/user_info.dart'; class IMManager { MethodChannel _channel; late ConversationManager conversationManager; late FriendshipManager friendshipManager; late MessageManager messageManager; late GroupManager groupManager; late OfflinePushManager offlinePushManager; late SignalingManager signalingManager; late InitSDKListener _initSDKListener; IMManager(this._channel) { conversationManager = ConversationManager(_channel); friendshipManager = FriendshipManager(_channel); messageManager = MessageManager(_channel); groupManager = GroupManager(_channel); offlinePushManager = OfflinePushManager(_channel); signalingManager = SignalingManager(_channel); addNativeCallback(_channel); } void addNativeCallback(MethodChannel _channel) { _channel.setMethodCallHandler((call) { try { /*if (call.method == ListenerType.simpleMsgListener) { var args = call.arguments; var data = args['data']; String type = args['type']; switch (type) { case 'onRecvC2CCustomMessage': break; case 'onRecvC2CTextMessage': break; case 'onRecvGroupCustomMessage': break; case 'onRecvGroupTextMessage': break; } } else */ if (call.method == ListenerType.initSDKListener) { String type = call.arguments['type']; dynamic data = call.arguments['data']; switch (type) { case 'onSelfInfoUpdated': var u = UserInfo.fromJson(_formatJson(data)); _initSDKListener.onSelfInfoUpdated(u); break; case 'onConnectFailed': int? errCode = call.arguments['errCode']; String? errMsg = call.arguments['errMsg']; _initSDKListener.onConnectFailed(errCode, errMsg); break; case 'onConnecting': _initSDKListener.onConnecting(); break; case 'onConnectSuccess': _initSDKListener.onConnectSuccess(); break; case 'onKickedOffline': _initSDKListener.onKickedOffline(); break; case 'onUserSigExpired': _initSDKListener.onUserSigExpired(); break; } } else if (call.method == ListenerType.groupListener) { var args = call.arguments; String type = args['type']; Map params = args['data'] == null ? new Map() : new Map.from(args['data']); String groupID = params['groupID'] == null ? '' : params['groupID']; String opReason = params['opReason'] == null ? '' : params['opReason']; bool isAgreeJoin = params['isAgreeJoin'] == null ? false : params['isAgreeJoin']; String customData = params['customData'] == null ? '' : params['customData']; Map groupAttributeMap = params['groupAttributeMap'] == null ? new Map() : new Map.from(params['groupAttributeMap']); List> memberListMap = params['memberList'] == null ? List.empty(growable: true) : List.from(params['memberList']); List> groupMemberChangeInfoListMap = params['groupMemberChangeInfoList'] == null ? List.empty(growable: true) : List.from(params['groupMemberChangeInfoList']); List> groupChangeInfoListMap = params['groupChangeInfoList'] == null ? List.empty(growable: true) : List.from(params['groupChangeInfoList']); switch (type) { case 'onMemberEnter': break; case 'onMemberLeave': break; case 'onMemberInvited': break; case 'onMemberKicked': break; case 'onMemberInfoChanged': break; case 'onGroupCreated': break; case 'onGroupDismissed': break; case 'onGroupRecycled': break; case 'onGroupInfoChanged': break; case 'onReceiveJoinApplication': break; case 'onApplicationProcessed': break; case 'onGrantAdministrator': break; case 'onRevokeAdministrator': break; case 'onQuitFromGroup': break; case 'onReceiveRESTCustomData': break; case 'onGroupAttributeChanged': break; } } else if (call.method == ListenerType.advancedMsgListener) { var type = call.arguments['type']; var id = call.arguments['data']['id']; var msg = Message.fromJson(_formatJson(call.arguments['data']['message'])); switch (type) { case 'onRecvNewMessage': for (var listener in messageManager.advancedMsgListeners) { if (listener.id == id) { listener.onRecvNewMessage(msg); } } break; case 'onRecvMessageRevoked': for (var listener in messageManager.advancedMsgListeners) { if (listener.id == id) { listener.onRecvMessageRevoked(msg); } } break; case 'onRecvC2CReadReceipt': for (var listener in messageManager.advancedMsgListeners) { if (listener.id == id) { listener.onRecvC2CReadReceipt(msg); } } break; } } else if (call.method == ListenerType.messageProgressListener) { String type = call.arguments['type']; dynamic data = call.arguments['data']; String msgID = data['clientMsgID'] ?? ''; int progress = data['progress'] ?? 100; switch (type) { case 'onProgress': print('===========$msgID======$progress'); messageManager.msgSendProgressListener?.onProgress( msgID, progress, ); break; } } else if (call.method == ListenerType.conversationListener) { String type = call.arguments['type']; dynamic data = call.arguments['data']; switch (type) { case 'onSyncServerStart': conversationManager.conversationListener.onSyncServerStart(); break; case 'onSyncServerFinish': conversationManager.conversationListener.onSyncServerFinish(); break; case 'onSyncServerFailed': conversationManager.conversationListener.onSyncServerFailed(); break; case 'onNewConversation': List list = List.empty(growable: true); if (null != data) { list = (_formatJson(data) as List) .map((e) => ConversationInfo.fromJson(e)) .toList(); } conversationManager.conversationListener.onNewConversation(list); break; case 'onConversationChanged': List list = List.empty(growable: true); if (null != data) { list = (_formatJson(data) as List) .map((e) => ConversationInfo.fromJson(e)) .toList(); } conversationManager.conversationListener .onConversationChanged(list); break; case 'onTotalUnreadMessageCountChanged': conversationManager.conversationListener .onTotalUnreadMessageCountChanged(data ?? 0); break; } } else if (call.method == ListenerType.friendListener) { // int errCode = call.arguments['errCode']; // String errMsg = call.arguments['errMsg']; String type = call.arguments['type']; dynamic data = call.arguments['data']; switch (type) { case 'onBlackListAdd': friendshipManager.friendshipListener.onBlackListAdd(data); break; case 'onBlackListDeleted': friendshipManager.friendshipListener.onBlackListDeleted(data); break; case 'onFriendApplicationListAccept': friendshipManager.friendshipListener .onFriendApplicationListAccept(data); break; case 'onFriendApplicationListAdded': friendshipManager.friendshipListener .onFriendApplicationListAdded(data); break; case 'onFriendApplicationListDeleted': friendshipManager.friendshipListener .onFriendApplicationListDeleted(data); break; case 'onFriendApplicationListReject': friendshipManager.friendshipListener .onFriendApplicationListReject(data); break; case 'onFriendInfoChanged': friendshipManager.friendshipListener.onFriendInfoChanged(data); break; case 'onFriendListAdded': friendshipManager.friendshipListener.onFriendListAdded(data); break; case 'onFriendListDeleted': friendshipManager.friendshipListener.onFriendListDeleted(data); break; } } /*else if (call.method == 'logFromSwift') { var data = call.arguments["data"]; var msg = call.arguments["msg"]; } else if (call.method == ListenerType.signalingListener) { var args = call.arguments; String type = args['type']; Map params = args['data']; String inviteID = params['inviteID'] == null ? '' : params['inviteID']; String inviter = params['inviter'] == null ? '' : params['inviter']; String groupID = params['groupID'] == null ? '' : params['groupID']; List? inviteeList = params['inviteeList'] == null ? null : List.from(params['inviteeList']); String data = params['data'] == null ? '' : params['data']; String invitee = params['invitee'] == null ? '' : params['invitee']; switch (type) { case 'onReceiveNewInvitation': break; case 'onInviteeAccepted': break; case 'onInviteeRejected': break; case 'onInvitationCancelled': break; case 'onInvitationTimeout': break; } }*/ } catch (err) { print( "回调失败了,数据类型异常。$err ${call.method} ${call.arguments['type']} ${call.arguments['data']}"); } return Future.value(null); }); } Future initSDK({ required int platform, required String ipApi, required String ipWs, required String dbPath, required InitSDKListener listener, }) { _initSDKListener = listener; return _channel.invokeMethod( 'initSDK', _buildParam( {"platform": platform, "ipApi": ipApi, "ipWs": ipWs, "dbDir": dbPath}, ), ); } Future unInitSDK() { return _channel.invokeMethod('unInitSDK', _buildParam({})); } Future login({required String uid, required String token}) { return _channel.invokeMethod( 'login', _buildParam({'uid': uid, 'token': token}), ); } Future logout() { return _channel.invokeMethod('logout', _buildParam({})); } Future getLoginStatus() { return _channel.invokeMethod('getLoginStatus', _buildParam({})); } Future getLoginUid() { return _channel.invokeMethod('getLoginUid', _buildParam({})); } Future setSelfInfo(UserInfo info) { return _channel.invokeMethod('setSelfInfo', _buildParam(info.toJson())); // .then((value) => UserInfo.fromJson(value)); } Future> getUsersInfo(List uidList) { return _channel .invokeMethod('getUsersInfo', _buildParam({'uidList': uidList})) .then((value) => _toList(value)); } Future forceSyncLoginUerInfo(List uidList) { return _channel.invokeMethod('forceSyncLoginUerInfo', _buildParam({})); } ///@nodoc static Map _buildParam(Map param) { param["ManagerName"] = "imManager"; return param; } static List _toList(String value) => (_formatJson(value) as List).map((e) => UserInfo.fromJson(e)).toList(); ///@nodoc static dynamic _formatJson(value) { return jsonDecode(_printValue(value)); } static String _printValue(value) { return value; } }