master 84a314326778 cached
268 files
560.3 KB
155.9k tokens
855 symbols
1 requests
Download .txt
Showing preview only (671K chars total). Download the full file or copy to clipboard to get everything.
Repository: JiangJuHong/FlutterTencentImPlugin
Branch: master
Commit: 84a314326778
Files: 268
Total size: 560.3 KB

Directory structure:
gitextract_zorfcym6/

├── .all-contributorsrc
├── .github/
│   └── FUNDING.yml
├── .gitignore
├── .metadata
├── CHANGELOG.md
├── LICENSE
├── README.md
├── README_3.0_upgrade.md
├── android/
│   ├── .gitignore
│   ├── build.gradle
│   ├── consumer-proguard-rules.txt
│   ├── gradle/
│   │   └── wrapper/
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── settings.gradle
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── top/
│                   └── huic/
│                       └── tencent_im_plugin/
│                           ├── DownloadCallBack.java
│                           ├── TencentImPlugin.java
│                           ├── ValueCallBack.java
│                           ├── VoidCallBack.java
│                           ├── entity/
│                           │   ├── CustomConversationEntity.java
│                           │   ├── CustomConversationResultEntity.java
│                           │   ├── CustomFriendAddApplication.java
│                           │   ├── CustomMessageEntity.java
│                           │   ├── FindFriendApplicationEntity.java
│                           │   ├── FindGroupApplicationEntity.java
│                           │   └── FindMessageEntity.java
│                           ├── enums/
│                           │   ├── ListenerTypeEnum.java
│                           │   └── MessageNodeType.java
│                           ├── listener/
│                           │   ├── CustomAdvancedMsgListener.java
│                           │   ├── CustomConversationListener.java
│                           │   ├── CustomFriendshipListener.java
│                           │   ├── CustomGroupListener.java
│                           │   ├── CustomSDKListener.java
│                           │   └── CustomSignalingListener.java
│                           ├── message/
│                           │   ├── AbstractMessageNode.java
│                           │   ├── CustomMessageNode.java
│                           │   ├── FaceMessageNode.java
│                           │   ├── FileMessageNode.java
│                           │   ├── GroupTipsMessageNode.java
│                           │   ├── ImageMessageNode.java
│                           │   ├── LocationMessageNode.java
│                           │   ├── SoundMessageNode.java
│                           │   ├── TextMessageNode.java
│                           │   ├── VideoMessageNode.java
│                           │   └── entity/
│                           │       ├── AbstractMessageEntity.java
│                           │       ├── CustomMessageEntity.java
│                           │       ├── FaceMessageEntity.java
│                           │       ├── FileMessageEntity.java
│                           │       ├── GroupTipsMessageEntity.java
│                           │       ├── ImageMessageEntity.java
│                           │       ├── LocationMessageEntity.java
│                           │       ├── SoundMessageEntity.java
│                           │       ├── TextMessageEntity.java
│                           │       └── VideoMessageEntity.java
│                           └── util/
│                               ├── BeanUtils.java
│                               ├── CommonUtil.java
│                               ├── JsonUtil.java
│                               └── TencentImUtils.java
├── example/
│   ├── .gitignore
│   ├── .metadata
│   ├── README.md
│   ├── android/
│   │   ├── .gitignore
│   │   ├── app/
│   │   │   ├── agconnect-services.json
│   │   │   ├── build.gradle
│   │   │   ├── key.jks
│   │   │   └── src/
│   │   │       ├── debug/
│   │   │       │   └── AndroidManifest.xml
│   │   │       ├── main/
│   │   │       │   ├── AndroidManifest.xml
│   │   │       │   ├── java/
│   │   │       │   │   └── top/
│   │   │       │   │       └── huic/
│   │   │       │   │           └── tencent_im_plugin_example/
│   │   │       │   │               └── MainActivity.java
│   │   │       │   └── res/
│   │   │       │       ├── drawable/
│   │   │       │       │   └── launch_background.xml
│   │   │       │       └── values/
│   │   │       │           └── styles.xml
│   │   │       └── profile/
│   │   │           └── AndroidManifest.xml
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   └── settings.gradle
│   ├── ios/
│   │   ├── .gitignore
│   │   ├── Flutter/
│   │   │   ├── AppFrameworkInfo.plist
│   │   │   ├── Debug.xcconfig
│   │   │   └── Release.xcconfig
│   │   ├── Podfile
│   │   ├── Runner/
│   │   │   ├── AppDelegate.swift
│   │   │   ├── Assets.xcassets/
│   │   │   │   ├── AppIcon.appiconset/
│   │   │   │   │   └── Contents.json
│   │   │   │   └── LaunchImage.imageset/
│   │   │   │       ├── Contents.json
│   │   │   │       └── README.md
│   │   │   ├── Base.lproj/
│   │   │   │   ├── LaunchScreen.storyboard
│   │   │   │   └── Main.storyboard
│   │   │   ├── Info.plist
│   │   │   └── Runner-Bridging-Header.h
│   │   ├── Runner.xcodeproj/
│   │   │   ├── project.pbxproj
│   │   │   ├── project.xcworkspace/
│   │   │   │   └── contents.xcworkspacedata
│   │   │   └── xcshareddata/
│   │   │       └── xcschemes/
│   │   │           └── Runner.xcscheme
│   │   └── Runner.xcworkspace/
│   │       └── contents.xcworkspacedata
│   ├── lib/
│   │   ├── main.dart
│   │   ├── page/
│   │   │   ├── chat.dart
│   │   │   ├── home.dart
│   │   │   ├── interfaces_test.dart
│   │   │   ├── login.dart
│   │   │   └── main/
│   │   │       ├── components/
│   │   │       │   ├── conversation.dart
│   │   │       │   ├── friend.dart
│   │   │       │   └── group.dart
│   │   │       └── main.dart
│   │   └── utils/
│   │       └── GenerateTestUserSig.dart
│   ├── pubspec.yaml
│   └── test/
│       └── widget_test.dart
├── ios/
│   ├── .gitignore
│   ├── Assets/
│   │   └── .gitkeep
│   ├── Classes/
│   │   ├── SwiftTencentImPlugin.swift
│   │   ├── TencentImPlugin.h
│   │   ├── TencentImPlugin.m
│   │   ├── entity/
│   │   │   ├── CustomConversationEntity.swift
│   │   │   ├── CustomConversationResultEntity.swift
│   │   │   ├── CustomCreateGroupMemberEntity.swift
│   │   │   ├── CustomFriendAddApplicationEntity.swift
│   │   │   ├── CustomFriendApplicationEntity.swift
│   │   │   ├── CustomFriendApplicationResultEntity.swift
│   │   │   ├── CustomFriendCheckResultEntity.swift
│   │   │   ├── CustomFriendGroupEntity.swift
│   │   │   ├── CustomFriendInfoEntity.swift
│   │   │   ├── CustomFriendInfoResultEntity.swift
│   │   │   ├── CustomFriendOperationResultEntity.swift
│   │   │   ├── CustomGroupApplicationEntity.swift
│   │   │   ├── CustomGroupApplicationResultEntity.swift
│   │   │   ├── CustomGroupAtInfoEntity.swift
│   │   │   ├── CustomGroupChangeInfoEntity.swift
│   │   │   ├── CustomGroupInfoEntity.swift
│   │   │   ├── CustomGroupInfoResultEntity.swift
│   │   │   ├── CustomGroupMemberChangeInfoEntity.swift
│   │   │   ├── CustomGroupMemberFullInfoEntity.swift
│   │   │   ├── CustomGroupMemberInfoResultEntity.swift
│   │   │   ├── CustomGroupMemberOperationResultEntity.swift
│   │   │   ├── CustomMessageReceiptEntity.swift
│   │   │   ├── CustomOfflinePushInfoEntity.swift
│   │   │   ├── CustomSignalingInfoEntity.swift
│   │   │   ├── CustomUserEntity.swift
│   │   │   ├── FindFriendApplicationEntity.swift
│   │   │   ├── FindGroupApplicationEntity.swift
│   │   │   ├── FindMessageEntity.swift
│   │   │   └── MessageEntity.swift
│   │   ├── enums/
│   │   │   ├── DownloadType.swift
│   │   │   ├── ListenerType.swift
│   │   │   └── MessageNodeType.swift
│   │   ├── listener/
│   │   │   ├── CustomAPNSListener.swift
│   │   │   ├── CustomAdvancedMsgListener.swift
│   │   │   ├── CustomConversationListener.swift
│   │   │   ├── CustomFriendshipListener.swift
│   │   │   ├── CustomGroupListener.swift
│   │   │   ├── CustomSDKListener.swift
│   │   │   └── CustomSignalingListener.swift
│   │   ├── message/
│   │   │   ├── AbstractMessageNode.swift
│   │   │   ├── CustomMessageNode.swift
│   │   │   ├── FaceMessageNode.swift
│   │   │   ├── FileMessageNode.swift
│   │   │   ├── GroupTipsMessageNode.swift
│   │   │   ├── ImageMessageNode.swift
│   │   │   ├── LocationMessageNode.swift
│   │   │   ├── SoundMessageNode.swift
│   │   │   ├── TextMessageNode.swift
│   │   │   ├── VideoMessageNode.swift
│   │   │   └── entity/
│   │   │       ├── AbstractMessageEntity.swift
│   │   │       ├── CustomMessageEntity.swift
│   │   │       ├── FaceMessageEntity.swift
│   │   │       ├── FileMessageEntity.swift
│   │   │       ├── LocationMessageEntity.swift
│   │   │       ├── SoundMessageEntity.swift
│   │   │       ├── TextMessageEntity.swift
│   │   │       ├── VideoMessageEntity.swift
│   │   │       ├── group_tips/
│   │   │       │   └── GroupTipsMessageEntity.swift
│   │   │       └── image/
│   │   │           ├── ImageEntity.swift
│   │   │           └── ImageMessageEntity.swift
│   │   └── utils/
│   │       ├── CommonUtils.swift
│   │       ├── JsonUtil.swift
│   │       └── TencentImUtil.swift
│   └── tencent_im_plugin.podspec
├── lib/
│   ├── entity/
│   │   ├── conversation_entity.dart
│   │   ├── conversation_result_entity.dart
│   │   ├── download_progress_entity.dart
│   │   ├── error_entity.dart
│   │   ├── find_friend_application_entity.dart
│   │   ├── find_group_application_entity.dart
│   │   ├── find_message_entity.dart
│   │   ├── friend_add_application_entity.dart
│   │   ├── friend_application_entity.dart
│   │   ├── friend_application_result_entity.dart
│   │   ├── friend_check_result_entity.dart
│   │   ├── friend_group_entity.dart
│   │   ├── friend_info_entity.dart
│   │   ├── friend_info_result_entity.dart
│   │   ├── friend_operation_result_entity.dart
│   │   ├── group_administrator_op_entity.dart
│   │   ├── group_application_entity.dart
│   │   ├── group_application_processed_entity.dart
│   │   ├── group_application_result_entity.dart
│   │   ├── group_at_info_entity.dart
│   │   ├── group_attribute_changed_entity.dart
│   │   ├── group_changed_entity.dart
│   │   ├── group_create_member_entity.dart
│   │   ├── group_dismissed_or_recycled_entity.dart
│   │   ├── group_info_entity.dart
│   │   ├── group_info_result_entity.dart
│   │   ├── group_member_changed_entity.dart
│   │   ├── group_member_enter_entity.dart
│   │   ├── group_member_entity.dart
│   │   ├── group_member_info_result_entity.dart
│   │   ├── group_member_invited_or_kicked_entity.dart
│   │   ├── group_member_leave_entity.dart
│   │   ├── group_member_operation_result_entity.dart
│   │   ├── group_receive_join_application_entity.dart
│   │   ├── group_receive_rest_entity.dart
│   │   ├── message_entity.dart
│   │   ├── message_receipt_entity.dart
│   │   ├── message_search_param.dart
│   │   ├── message_send_fail_entity.dart
│   │   ├── message_send_progress_entity.dart
│   │   ├── offline_push_info_entity.dart
│   │   ├── signaling_common_entity.dart
│   │   ├── signaling_info_entity.dart
│   │   └── user_entity.dart
│   ├── entity_factory.dart
│   ├── enums/
│   │   ├── conversation_type_enum.dart
│   │   ├── download_type_enum.dart
│   │   ├── friend_application_agree_type_enum.dart
│   │   ├── friend_application_type_enum.dart
│   │   ├── friend_relation_type_enum.dart
│   │   ├── friend_status_enum.dart
│   │   ├── friend_type_enum.dart
│   │   ├── get_message_type_enum.dart
│   │   ├── group_add_opt_enum.dart
│   │   ├── group_application_handler_result_enum.dart
│   │   ├── group_application_handler_status_enum.dart
│   │   ├── group_application_type_enum.dart
│   │   ├── group_at_type_enum.dart
│   │   ├── group_info_changed_type_enum.dart
│   │   ├── group_member_filter_enum.dart
│   │   ├── group_member_role_enum.dart
│   │   ├── group_system_type.dart
│   │   ├── group_tips_group_info_type.dart
│   │   ├── group_tips_type_enum.dart
│   │   ├── group_type_enum.dart
│   │   ├── image_type_enum.dart
│   │   ├── log_print_level.dart
│   │   ├── login_status_enum.dart
│   │   ├── message_elem_type_enum.dart
│   │   ├── message_priority_enum.dart
│   │   ├── message_status_enum.dart
│   │   ├── operation_result_enum.dart
│   │   ├── pendency_examine_type_enum.dart
│   │   ├── pendency_type_enum.dart
│   │   ├── receive_message_opt_enum.dart
│   │   ├── signaling_action_type_enum.dart
│   │   ├── sns_tips_type.dart
│   │   ├── tencent_im_listener_type_enum.dart
│   │   ├── user_allow_type_enum.dart
│   │   └── user_gender_enum.dart
│   ├── list_util.dart
│   ├── listener/
│   │   └── tencent_im_plugin_listener.dart
│   ├── message_node/
│   │   ├── custom_message_node.dart
│   │   ├── face_message_node.dart
│   │   ├── file_message_node.dart
│   │   ├── group_tips_message_node.dart
│   │   ├── image_message_node.dart
│   │   ├── location_message_node.dart
│   │   ├── message_node.dart
│   │   ├── sound_message_node.dart
│   │   ├── text_message_node.dart
│   │   └── video_message_node.dart
│   ├── tencent_im_plugin.dart
│   └── utils/
│       └── enum_util.dart
└── pubspec.yaml

================================================
FILE CONTENTS
================================================

================================================
FILE: .all-contributorsrc
================================================
{
  "files": [
    "README.md"
  ],
  "imageSize": 100,
  "commit": false,
  "contributors": [
    {
      "login": "kxr224",
      "name": "cyrus",
      "avatar_url": "https://avatars.githubusercontent.com/u/28681083?v=4",
      "profile": "https://github.com/kxr224",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "songjiabin",
      "name": "宋佳宾",
      "avatar_url": "https://avatars.githubusercontent.com/u/13177100?v=4",
      "profile": "https://github.com/songjiabin",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "ligui-iOS",
      "name": "ligui-iOS",
      "avatar_url": "https://avatars.githubusercontent.com/u/20856361?v=4",
      "profile": "https://github.com/ligui-iOS",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "laiiihz",
      "name": "LAIIIHZ",
      "avatar_url": "https://avatars.githubusercontent.com/u/35956195?v=4",
      "profile": "http://laiiihz.github.io",
      "contributions": [
        "code"
      ]
    }
  ],
  "contributorsPerLine": 7,
  "projectName": "FlutterTencentImPlugin",
  "projectOwner": "JiangJuHong",
  "repoType": "github",
  "repoHost": "https://github.com",
  "skipCi": true
}


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: https://www.yuque.com/jiangjuhong/tencent-im-flutter/ygi582 # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']


================================================
FILE: .gitignore
================================================
.DS_Store
.dart_tool/

.packages
.pub/
.idea
*.iml
build/


================================================
FILE: .metadata
================================================
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.

version:
  revision: d345a3b303ce041846ff895eb49a104bef133c4b
  channel: master

project_type: plugin


================================================
FILE: CHANGELOG.md
================================================
## 0.1.0
* 集成腾讯云IMSDK,包含Android 和 IOS

## 0.1.1
* 修复Android设备上找不到符号的BUG

## 0.1.2
* 修复IOS上Json字符串中包含特殊字符的问题
* 修复IOS监听器无效的问题

## 0.1.3
* 修复 MessageEntity 中 sessionType 始终为空的问题

## 0.1.4
* 修复 GroupTipsNode 节点nil对象引起闪退问题

## 0.1.5
* 修复 GroupTipsNode 节点nil对象引起闪退问题

## 0.1.6
* 修复IOS上添加好友必须传递所有参数的问题
* 修改 getParam 方法代码结构

## 0.1.7
* 修复IOS上获得未决列表时解析异常的问题

## 0.1.8
* 修复Android设备上自定义消息未解码的问题

## 0.1.9
* 修复安卓上获得单个会话异常

## 0.1.10
* 修复IOS设备上回调数据非JSON类型时多了个 ""

## 0.1.11
* 修复消息解析异常

## 0.1.12
* 移除base64 工具类
* 解决fastjson byte[] 序列化为base64字符串的问题

## 0.1.13
* 修复运行异常

## 0.1.14
* 完成消息撤回功能

## 0.1.15
* 增加删除单条消息功能
* 修改json工具类,解决非字符串类型以字符串类型返回

## 0.1.16
* 修复字符串数组解析JSON时格式问题

## 0.1.17
* 增加设置消息自定义字符串和自定义整型

## 0.1.18
* 增加发送消息后返回消息对象

## 0.1.19
* 兼容所有发送消息后返回消息对象

## 0.1.20
* 会话列表增加能够获得发送人信息

## 0.1.21
* 发送新消息后,返回的数据对象有问题

## 0.1.22
* 修复 setMessageCustomInt 和 setMessageCustomString 报错的问题

## 0.2.0
1. 将发送消息统一更改为 sendMessage ,使用不同消息节点即可发送不同消息
1. MessageEntity 增加 note 属性,对非自定消息可直接用于展示
1. 发送节点和接收实体合二为一,发送时仅需设置构造器参数即可,接收时会自动填充内容
1. 视频、语音,将不再自动下载,提供语音/视频下载方法
1. 视频、语音和图片提供上传/下载进度监听器,分别为:ListenerTypeEnum.UploadProgress/ListenerTypeEnum.DownloadProgress
1. 除 PendencyPageEntity 和 GroupPendencyPageEntity 外的所有Entity 重写 == 和 hashCode,可直接进行判断是否相等

## 0.2.1
* 修订文档

## 0.2.2
* 修改类名称

## 0.2.3
* 修复枚举名称

## 0.2.4
* 图片节点增加清晰度参数
* 图片增加默认值填充

## 0.2.5
* 移除图片节点转换

## 0.2.6
修复ImageNode无法赋值的问题

## 0.2.7
修复自定义消息无法赋值的问题

## 0.2.8
修复删除会话无法删除本地消息的问题

## 0.2.9
* 修复MessageEntity传递方式
* getMessages 和 getLocalMessages 增加根据lastMessage来筛选

## 0.2.10
* 修复 getMessage 和 getLocalMessage 根据lastMessage筛选 无效的问题

## 0.2.11
* 修复IOS无法获得消息的问题

## 0.2.12
* 修复Android获得消息报错

## 0.2.13
* 增加通用节点 Other

## 0.2.14
* 增加GroupTips节点

## 0.2.15
* 升级版本,无改动

## 0.2.16
* 优化:无论是群聊还是个人都会触发撤回回调

## 0.2.17
* 优化:群提示通知、群通知节点,使用同一个实体

## 0.2.18
* 修复:群提示节点userList始终为空的问题

## 0.2.19
* 增加: SNSSystemElem 的解析

## 0.2.20
* 增加:findMessage、saveMessage
* 增加:init 时可配置日志相关内容

## 0.2.21
* 修复:IOS onReConnFailed、onConnFailed和onDisconnect 回调时崩溃的问题

## 0.2.22
* 修复:获取会话用户时,有时候获取不到

## 0.2.23
* 解决代码错误

## 0.2.24
* 修复Android:获取会话用户时,有时候获取不到

## 0.2.25
* 取消Android logout 方法的校验
* 修改离线获取会话列表
* 修改离线获取会话列表
* 修改离线获取消息

## 0.2.26
* 增加监听器文档说明
* 修改 modifyMemberInfo 参数不一致的问题
* 修复Android创建群聊时,无法设置群成员的问题
* 修复IOS创建群聊无法设置群成员问题

## 0.2.27
* 升级IM SDK版本为 4.8.10
* 增加离线推送

## 0.2.28
* 修复 setToken int 无法转换为 long 的问题
* 离线推送注册增加文档说明

## 0.2.30
* 修复 Android Int 转换为 Long 时报错

## 0.2.31
* 创建群组的群成员设置为可选属性

## 0.2.32
* 修复IOS applyJoinGroup 包错问题
* 修复Demo NewMessages 监听器添加数据失败

## 0.2.33
* 修复IOS申请加入群组闪退问题
* 修改申请加入群组 reason 为必传

## 0.2.34
* 修复 Native 和 Flutter 模型参数不一致

## 0.2.35
* 解决群未决处理TIMGroupPendencyItem的selfIdentifier为空的问题

## 0.2.36
* 解决发送图片后可能出现的错误
* createGroup 接口增加 customInfo 信息
* 替换Demo中视频缩略图获取的方案
* 解决IOS Pod Install 后会报错

## 0.2.37
* 更换离线推送Token字符串解析方式(原方式不支持APNS)

## 0.2.38
* 修改 android getConversation 传入非存在sessionId的时候闪退问题

## 0.2.39
* 增加 GroupSystem 节点解析

## 0.2.40
* 增加 TIMProfileSystemElem 节点解析

## 0.2.41
* 修复IOS设备下 deleteConversation 接口无法接收返回值的问题

## 0.2.42
* 修复IOS运行报错

## 0.2.43
* 修复 ValueCallBack 错误码和描述信息反了的问题
* 对登录操作不再做 isEmpty 验证

## 0.2.44
* 优化文本节点隐晦出现BUG的问题

## 1.0.0
* 集成 SDK 5.1.1

## 1.0.1
* 优化Demo

## 1.0.2
* 修复回调调用异常的问题

## 1.0.3
* 修复对象解析错误异常

## 1.0.4
* 修复 getFriendGroups 接口参数为必传的问题

## 1.0.5
* 升级SDK到 5.1.2
* 增加 getGroupOnlineMemberCount 接口

## 1.0.6
* 修复 C2CReadReceipt 回调异常的问题

## 1.1.0
* 优化会话相关接口,提供内部转换
* 增加 getHistoryMessageList 和 markMessageAsRead 接口

## 1.1.1
* 修改混淆文件

## 1.1.2
* 修复 SignalingCommonEntity 实体转换失败的问题

## 1.1.3
* 修复消息发送进度回调数据转换异常的问题

## 1.1.4
* 修复 addFriend 添加好友异常的问题

## 1.1.5
* 修复 MessageRevoked 监听没有参数问题

## 1.1.6
* 增加 GroupTips 数据节点解析

## 1.2.0
* 1. Android 和 IOS 将所有监听器的参数二次转换为 json 取消
* 2. 适配Flutter

## 1.2.1
* 增加 setMessageLocalCustomStr 和 setMessageLocalCustomInt 接口

## 1.2.2
* 修复下载进度出现Optiona的问题

## 1.2.3
* 修复部分回调没有正确接收到参数的问题
* Demo增加生成签名
* 修复部分回调在 IOS 端下包含 Optional 的问题
* 升级SDK版本为 5.1.10

## 1.2.4
* 修复 setMessageLocalCustomStr 执行失败的问题
* Demo增加发起会话
* 修复 onReceiveNewInvitation 解包失败的问题

## 1.2.5
* 修复回调非主线程闪退问题

## 1.2.6
* 修复获得会话传递nextSeq异常的问题

## 1.2.7
* 修复Android端fastjson打包闪退的问题
* DownloadProgress 回调增加 type 属性
* 消息重发接口
* IOS发送消息进度和失败消息的ID未解包的问题

## 1.2.8
* 新增 downloadFile 接口
* 新增 findMessages 接口
* 对部分关键实体实体重写 == 操作符(非所有实体)
* 修复IOS端不能发送视频的问题
* 修复 BeanUtils 访问权限导致调用内部方法报错的问题

## 1.2.9
* 修复文件发送失败的问题

## 1.2.10
* 修复发送文件FileName不生效的问题

## 1.2.11
* 修复 Android getGroupOnlineMemberCount 接口无法解析的问题

## 1.2.12
* 修复信令data为空的问题

## 1.2.13
* 修复unInit后再次init,会导致监听器重复的问题
* 修复IOS上at列表为空时会导致闪退
* 修复ios上at功能异常的问题
* 增加getVersion、和getServerTime接口
* 增加群自定义字段
* 升级SDK为 5.1.50
* 自定义节点增加 desc 和 ext 字段
* 用户资料增加 role 和 level 字段
* 更新getHistoryMessageList接口,增加type属性
* 消息对象增加 random

## 1.2.14
* fix "修复IOS环境下自定义节点 desc 和 ext 无法使用的问题"
* fix "修复 inviteInGroup 接口在Android下会闪退的问题"
* feat "更新内部依赖插件版本"
* docs "更新文档"

## 2.0.0
* feat 增加空安全

## 2.0.1
* docs 格式化文档

## 2.0.2
* 优化空安全

## 2.0.3
* fix 修复android调用createGroup返回的群ID中含有字符串的问题
* feat Demo中增加创建群聊
* feat 升级SDK版本为 5.1.62
* fix 修复ios setGroupInfo 接口会清空其它字段的问题
* fix 修复ios setSelfInfo 无效的问题

## 2.0.4
* feat 增加FindFriendApplicationEntity 快速创建方法

## 2.0.5
* feat FileMessageNode 节点中,filePath 和 fileName 增加可为空选择

## 3.0.0
* feat 调整所有空返回值结果为明确指定
* feat 升级版本到最新增强版 `5.5.897`
* feat ``setGroupReceiveMessageOpt`` 设置群接收消息选项接口
* feat ``setC2CReceiveMessageOpt`` 设置C2C接收消息选项接口
* feat ``ReceiveMessageOptEnum`` 接收消息选项枚举类
* feat ``pinConversation`` 置顶会话接口
* feat ``getTotalUnreadMessageCount`` 获得会话总未读数接口
* feat ``conversation`` 增加 ``pinned`` 会话是否置顶属性
* feat `MessageStatusEnum` 增加 Imported 属性
* Remove ``setReceiveMessageOpt`` 接口
* Remove ``GroupReceiveMessageOptEnum`` 枚举
* fix 修复 SignalingInfoEntity 反序列化报错的问题
* fix 修复信令邀请回调没有群ID的问题
* fix 修复IOS信令相关接口闪退的问题
* fix 修复Android CustomMessageEntity 创建抛出空指针问题
* fix 修复Android getGroupMemberList 接口nextSeq传递无效的问题
* fix 修复部分接口在ios设置自定义字段无效
* fix 修复Android和IOS Tag_Profile_Custom_ 不统一问题

================================================
FILE: LICENSE
================================================

                                 Apache License
                           Version 2.0, January 2004
                        https://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   Copyright 2013-2018 Docker, Inc.

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       https://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README.md
================================================
<div align="center">

[![](https://img.shields.io/badge/flutter2.0-NullSafety-1)](#)
[![All Contributors](https://img.shields.io/badge/all_contributors-4-orange.svg?style=flat-square)](#contributors-)
[![](https://img.shields.io/badge/Version-社区版-1)](#)
[![](https://img.shields.io/pub/v/tencent_im_plugin.svg)](https://pub.dartlang.org/packages/tencent_im_plugin)
[![](https://img.shields.io/github/license/JiangJuHong/FlutterTencentImPlugin)](https://www.apache.org/licenses/LICENSE-2.0)
[![](https://img.shields.io/badge/qq群-850923396-1)](https://jq.qq.com/?_wv=1027&k=QxCWMlUf)

</div>

# What is FlutterTencentIm ?

# 终章
## 致所有FlutterTencentIm贡献者及用户
````
即日起,FlutterTencentIm停止维护,永久保留仓库代码。感谢所有贡献者的帮助,同时感谢所有用户长期以来的支持。
如果您的项目中还需要集成TIM服务,请移至: https://cloud.tencent.com/document/product/269/51940 或 https://github.com/TencentCloud/chat-sdk-flutter/tree/main/example。
关闭说明:
    1. 腾讯终于推出了官方SDK,维护更稳定,推荐使用

一个项目的征途结束了,开源的步伐永远不滞。
欢迎加入Flutter讨论群,QQ群号: 850923396
````

FlutterTencentIM是基于[腾讯云即时通讯](https://cloud.tencent.com/product/im)服务进行的Flutter封装,为Flutter提供即时通讯服务.

# 3. X has arrived?

最新计划为3.x,大致更改内容如下:  
【注意: 这是未完成的内容,请谨慎使用】3.x对原有接口进行了细微调整,您可根据 [升级文档](/README_3.0_upgrade.md) 进行升级

| 功能列表                 | 进度 |
|:-----------------------|:-----|
| 保持基础接口不变          | ✅   |
| SDK从原有标准版升级为增强版 | ✅   |
| 增加增强版所有功能         | ☑️   |

# Notice

💐💐
新版插件支持空安全(`null-safety`),如需查看非空安全版本,请切换分支到:`sdk-5.1.x-non-null-safety`💐💐  
💐 FlutterTencentIm 开放 Pull Request,merge 成功后会在 README.md
上留下您的大名并超链到您的 Github 主页!

# 官方版和社区版的区别

* 两者的区别:本质上官方版和社区版都是基于IM的SDK进行封装,官方版的更偏向三端写法类似(Android、IOS、Flutter),社区版则提供更便捷的使用方式(1分钟上手即用)(例:
  FlutterImPlugin.login)。
* 该如何选择:根据个人编码习惯选择即可。
* 维护的周期:社区版和官方版均在持续迭代,发现异常将会在第一时间进行修复。

# Sdk Version

| 平台     | SDK版本 |
|:--------|:-------|
| Android | 5.5.897 |
| IOS     | 5.5.897 |

# Links

* [Document](https://www.yuque.com/jiangjuhong/tencent-im-flutter/zk6p14)
* [Chat](https://jq.qq.com/?_wv=1027&k=QxCWMlUf)
* [Sponsor](https://www.yuque.com/jiangjuhong/tencent-im-flutter/ygi582)

# Customization

如果您的项目有定制化需求,可通过QQ(690717394) 或 邮箱(690717394@qq.com)
联系我,该项服务为有偿服务,具体价格根据需求量进行决定。

# Other Plugins

````
我同时维护的还有以下插件,如果您感兴趣与我一起进行维护,请通过Github联系我,欢迎 issues 和 PR。
````

| 平台     | 插件                                                                                            | 描述                       | 版本                                                                                                                                 |
|:--------|:------------------------------------------------------------------------------------------------|:--------------------------|:------------------------------------------------------------------------------------------------------------------------------------|
| Flutter | [FlutterVideoPlayerLibrary-Desc](https://github.com/JiangJuHong/FlutterVideoPlayerLibrary-Desc) | Flutter 最好用的播放器(UI库) | -                                                                                                                                   |
| Flutter | [FlutterPerfectVolumeControl](https://github.com/JiangJuHong/FlutterPerfectVolumeControl)       | Flutter 完美的音量控制器插件  | [![pub package](https://img.shields.io/pub/v/perfect_volume_control.svg)](https://pub.dartlang.org/packages/perfect_volume_control) |
| Flutter | [FlutterTencentImPlugin](https://github.com/JiangJuHong/FlutterTencentImPlugin)                 | 腾讯云IM插件                | [![pub package](https://img.shields.io/pub/v/tencent_im_plugin.svg)](https://pub.dartlang.org/packages/tencent_im_plugin)           |
| Flutter | [FlutterTencentRtcPlugin](https://github.com/JiangJuHong/FlutterTencentRtcPlugin)               | 腾讯云Rtc插件               | [![pub package](https://img.shields.io/pub/v/tencent_rtc_plugin.svg)](https://pub.dartlang.org/packages/tencent_rtc_plugin)         |
| Flutter | [FlutterXiaoMiPushPlugin](https://github.com/JiangJuHong/FlutterXiaoMiPushPlugin)               | 小米推送SDK插件             | [![pub package](https://img.shields.io/pub/v/xiao_mi_push_plugin.svg)](https://pub.dartlang.org/packages/xiao_mi_push_plugin)       |
| Flutter | [FlutterHuaWeiPushPlugin](https://github.com/JiangJuHong/FlutterHuaWeiPushPlugin)               | 华为推送(HMS Push)插件      | [![pub package](https://img.shields.io/pub/v/hua_wei_push_plugin.svg)](https://pub.dartlang.org/packages/hua_wei_push_plugin)       |
| Flutter | [FlutterTextSpanField](https://github.com/JiangJuHong/FlutterTextSpanField)                     | 自定义文本样式输入框          | [![pub package](https://img.shields.io/pub/v/text_span_field.svg)](https://pub.dartlang.org/packages/text_span_field)               |
| Flutter | [FlutterClipboardListener](https://github.com/JiangJuHong/FlutterClipboardListener)             | 粘贴板监听器                | [![pub package](https://img.shields.io/pub/v/clipboard_listener.svg)](https://pub.dartlang.org/packages/clipboard_listener)         |
| Flutter | [FlutterQiniucloudLivePlugin](https://github.com/JiangJuHong/FlutterQiniucloudLivePlugin)       | Flutter 七牛云直播云插件     | 暂未发布,通过 git 集成                                                                                                                |

## Contributors ✨

Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->

<table>
  <tr>
    <td align="center"><a href="https://github.com/kxr224"><img src="https://avatars.githubusercontent.com/u/28681083?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cyrus</b></sub></a><br /><a href="https://github.com/JiangJuHong/FlutterTencentImPlugin/issues?q=author%3Akxr224" title="Bug reports">🐛</a></td>
    <td align="center"><a href="https://github.com/songjiabin"><img src="https://avatars.githubusercontent.com/u/13177100?v=4?s=100" width="100px;" alt=""/><br /><sub><b>宋佳宾</b></sub></a><br /><a href="https://github.com/JiangJuHong/FlutterTencentImPlugin/commits?author=songjiabin" title="Code">💻</a></td>
    <td align="center"><a href="https://github.com/ligui-iOS"><img src="https://avatars.githubusercontent.com/u/20856361?v=4?s=100" width="100px;" alt=""/><br /><sub><b>ligui-iOS</b></sub></a><br /><a href="https://github.com/JiangJuHong/FlutterTencentImPlugin/commits?author=ligui-iOS" title="Code">💻</a></td>
    <td align="center"><a href="http://laiiihz.github.io"><img src="https://avatars.githubusercontent.com/u/35956195?v=4?s=100" width="100px;" alt=""/><br /><sub><b>LAIIIHZ</b></sub></a><br /><a href="https://github.com/JiangJuHong/FlutterTencentImPlugin/commits?author=laiiihz" title="Code">💻</a></td>
  </tr>
</table>

<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->

<!-- ALL-CONTRIBUTORS-LIST:END -->

This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!


================================================
FILE: README_3.0_upgrade.md
================================================
# 3.0升级文档

## 通用变化

* 将 `setReceiveMessageOpt` 替换为 `setGroupReceiveMessageOpt`
* 将 `GroupReceiveMessageOptEnum` 替换为 `ReceiveMessageOptEnum`
* `MessageStatusEnum` 增加 Imported 属性

## 新增内容

* 新增 ``setGroupReceiveMessageOpt`` 设置群接收消息选项接口
* 新增 ``setC2CReceiveMessageOpt`` 设置C2C接收消息选项接口
* 新增 ``ReceiveMessageOptEnum`` 接收消息选项枚举类
* 新增 ``pinConversation`` 置顶会话接口
* 新增 ``getTotalUnreadMessageCount`` 获得会话总未读数接口
* 新增 ``conversation`` 增加 ``pinned`` 会话是否置顶属性
* 新增 ``insertC2CMessageToLocalStorage`` 添加C2C会话接口
* 新增 ``setOfflinePushConfig`` 接口增加 tpns 参数
* 新增 ``searchGroups`` 搜索群接口
* 新增 ``searchGroupMembers`` 搜索群成员接口
* 新增 ``UserEntity`` 增加 生日(birthday) 属性

## 移除内容

* 移除 ``setReceiveMessageOpt`` 接口
* 移除 ``GroupReceiveMessageOptEnum`` 枚举

================================================
FILE: android/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures


================================================
FILE: android/build.gradle
================================================
group 'top.huic.tencent_im_plugin'
version '1.0'

buildscript {
    repositories {
//        maven { url 'https://maven.aliyun.com/repository/google' }
//        maven { url 'https://maven.aliyun.com/repository/jcenter' }
//        maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3'
    }
}

rootProject.allprojects {
    repositories {
//        maven { url 'https://maven.aliyun.com/repository/google' }
//        maven { url 'https://maven.aliyun.com/repository/jcenter' }
//        maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
        google()
        jcenter()
    }
}

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28

    defaultConfig {
        minSdkVersion 16
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        ndk {
            abiFilters "armeabi-v7a"
        }
        // library 混淆 -> 随 library 引用,自动添加到 apk 打包混淆
        consumerProguardFiles 'consumer-proguard-rules.txt'
    }
    lintOptions {
        disable 'InvalidPackage'
    }
    dependencies {
        api 'com.tencent.imsdk:imsdk-plus:6.1.2155'
        api 'com.alibaba:fastjson:1.1.72.android'
    }
}


================================================
FILE: android/consumer-proguard-rules.txt
================================================
# 腾讯云IM
-keep class com.tencent.** { *; }

# FastJson
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.**{*;}

# 泛型
-keepattributes Signature

# 不混淆Serializable接口的子类
-keepclassmembers class * implements java.io.Serializable { *; }

# 忽略实体类
-keep class top.huic.tencent_im_plugin.** {*;}

================================================
FILE: android/gradle/wrapper/gradle-wrapper.properties
================================================
#Thu Dec 05 14:15:15 CST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip


================================================
FILE: android/gradle.properties
================================================
org.gradle.jvmargs=-Xmx1536M
android.enableR8=true
android.useAndroidX=true
android.enableJetifier=true


================================================
FILE: android/settings.gradle
================================================
rootProject.name = 'tencent_im_plugin'


================================================
FILE: android/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="top.huic.tencent_im_plugin">
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/DownloadCallBack.java
================================================
package top.huic.tencent_im_plugin;

import com.tencent.imsdk.v2.V2TIMDownloadCallback;
import com.tencent.imsdk.v2.V2TIMElem;

import java.util.HashMap;

import io.flutter.plugin.common.MethodChannel;
import top.huic.tencent_im_plugin.enums.ListenerTypeEnum;

/**
 * 下载回调
 */
public class DownloadCallBack implements V2TIMDownloadCallback {

    /**
     * 结果方法
     */
    private MethodChannel.Result result;

    /**
     * 下载路径
     */
    private String path;

    /**
     * 消息ID
     */
    private String msgId;

    /**
     * 下载类型
     */
    private DownloadTypeEnum type;

    public DownloadCallBack() {
    }

    public DownloadCallBack(String path) {
        this.path = path;
    }

    public DownloadCallBack(MethodChannel.Result result, String path, String msgId, DownloadTypeEnum type) {
        this.result = result;
        this.path = path;
        this.msgId = msgId;
        this.type = type;
    }

    @Override
    public void onProgress(final V2TIMElem.V2ProgressInfo v2ProgressInfo) {
        TencentImPlugin.invokeListener(ListenerTypeEnum.DownloadProgress, new HashMap<String, Object>() {
            {
                put("type", type.getValue());
                put("msgId", msgId);
                put("currentSize", v2ProgressInfo.getCurrentSize());
                put("totalSize", v2ProgressInfo.getTotalSize());
            }
        });
    }

    /**
     * 成功事件
     */
    @Override
    public void onSuccess() {
        if (result != null) {
            result.success(path);
        }
    }


    /**
     * 失败事件
     *
     * @param code 错误码
     * @param desc 错误描述
     */
    @Override
    public void onError(int code, String desc) {
        if (this.result != null) {
            result.error(String.valueOf(code), desc, desc);
        }
    }

    /**
     * 下载类型枚举
     */
    public enum DownloadTypeEnum {
        /**
         * 语音
         */
        Sound(0),

        /**
         * 视频
         */
        Video(1),

        /**
         * 视频缩略图
         */
        VideoThumbnail(2),

        /**
         * 视频缩略图
         */
        File(3);

        /**
         * 枚举对应的常量值
         */
        private Integer value;

        DownloadTypeEnum(Integer value) {
            this.value = value;
        }

        public Integer getValue() {
            return value;
        }
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/TencentImPlugin.java
================================================
package top.huic.tencent_im_plugin;

import android.content.Context;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.tencent.imsdk.v2.V2TIMConversation;
import com.tencent.imsdk.v2.V2TIMConversationResult;
import com.tencent.imsdk.v2.V2TIMCreateGroupMemberInfo;
import com.tencent.imsdk.v2.V2TIMFriendApplication;
import com.tencent.imsdk.v2.V2TIMFriendApplicationResult;
import com.tencent.imsdk.v2.V2TIMFriendCheckResult;
import com.tencent.imsdk.v2.V2TIMFriendGroup;
import com.tencent.imsdk.v2.V2TIMFriendInfo;
import com.tencent.imsdk.v2.V2TIMFriendInfoResult;
import com.tencent.imsdk.v2.V2TIMFriendOperationResult;
import com.tencent.imsdk.v2.V2TIMGroupApplication;
import com.tencent.imsdk.v2.V2TIMGroupApplicationResult;
import com.tencent.imsdk.v2.V2TIMGroupInfo;
import com.tencent.imsdk.v2.V2TIMGroupInfoResult;
import com.tencent.imsdk.v2.V2TIMGroupMemberFullInfo;
import com.tencent.imsdk.v2.V2TIMGroupMemberInfoResult;
import com.tencent.imsdk.v2.V2TIMGroupMemberOperationResult;
import com.tencent.imsdk.v2.V2TIMGroupMemberSearchParam;
import com.tencent.imsdk.v2.V2TIMGroupSearchParam;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;
import com.tencent.imsdk.v2.V2TIMMessageListGetOption;
import com.tencent.imsdk.v2.V2TIMMessageSearchParam;
import com.tencent.imsdk.v2.V2TIMMessageSearchResult;
import com.tencent.imsdk.v2.V2TIMOfflinePushConfig;
import com.tencent.imsdk.v2.V2TIMOfflinePushInfo;
import com.tencent.imsdk.v2.V2TIMReceiveMessageOptInfo;
import com.tencent.imsdk.v2.V2TIMSDKConfig;
import com.tencent.imsdk.v2.V2TIMSendCallback;
import com.tencent.imsdk.v2.V2TIMSignalingInfo;
import com.tencent.imsdk.v2.V2TIMUserFullInfo;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.PluginRegistry.Registrar;
import top.huic.tencent_im_plugin.entity.CustomConversationEntity;
import top.huic.tencent_im_plugin.entity.CustomConversationResultEntity;
import top.huic.tencent_im_plugin.entity.CustomFriendAddApplication;
import top.huic.tencent_im_plugin.entity.CustomMessageEntity;
import top.huic.tencent_im_plugin.entity.FindMessageEntity;
import top.huic.tencent_im_plugin.enums.ListenerTypeEnum;
import top.huic.tencent_im_plugin.enums.MessageNodeType;
import top.huic.tencent_im_plugin.listener.CustomAdvancedMsgListener;
import top.huic.tencent_im_plugin.listener.CustomConversationListener;
import top.huic.tencent_im_plugin.listener.CustomFriendshipListener;
import top.huic.tencent_im_plugin.listener.CustomGroupListener;
import top.huic.tencent_im_plugin.listener.CustomSDKListener;
import top.huic.tencent_im_plugin.listener.CustomSignalingListener;
import top.huic.tencent_im_plugin.message.AbstractMessageNode;
import top.huic.tencent_im_plugin.message.entity.AbstractMessageEntity;
import top.huic.tencent_im_plugin.util.CommonUtil;
import top.huic.tencent_im_plugin.util.JsonUtil;
import top.huic.tencent_im_plugin.util.TencentImUtils;

/**
 * TencentImPlugin
 */
public class TencentImPlugin implements FlutterPlugin, MethodCallHandler {
    /**
     * 全局上下文
     */
    public static Context context;

    /**
     * 与Flutter的通信管道
     */
    private static MethodChannel channel;

    /**
     * Sdk监听器
     */
    private final CustomSDKListener sdkListener = new CustomSDKListener();

    /**
     * 消息监听器
     */
    private final CustomAdvancedMsgListener advancedMsgListener = new CustomAdvancedMsgListener();

    /**
     * 会话监听器
     */
    private final CustomConversationListener conversationListener = new CustomConversationListener();

    /**
     * 群监听器
     */
    private final CustomGroupListener groupListener = new CustomGroupListener();

    /**
     * 关系链监听器
     */
    private final CustomFriendshipListener friendshipListener = new CustomFriendshipListener();

    /**
     * 信令监听器
     */
    private final CustomSignalingListener signalingListener = new CustomSignalingListener();

    public TencentImPlugin() {
    }

    private TencentImPlugin(Context context, MethodChannel channel) {
        TencentImPlugin.context = context;
        TencentImPlugin.channel = channel;
        JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.mask;
    }

    @Override
    public void onAttachedToEngine(FlutterPluginBinding flutterPluginBinding) {
        final MethodChannel channel = new MethodChannel(flutterPluginBinding.getFlutterEngine().getDartExecutor(), "tencent_im_plugin");
        channel.setMethodCallHandler(new TencentImPlugin(flutterPluginBinding.getApplicationContext(), channel));
    }

    // This static function is optional and equivalent to onAttachedToEngine. It supports the old
    // pre-Flutter-1.12 Android projects. You are encouraged to continue supporting
    // plugin registration via this function while apps migrate to use the new Android APIs
    // post-flutter-1.12 via https://flutter.dev/go/android-project-migration.
    //
    // It is encouraged to share logic between onAttachedToEngine and registerWith to keep
    // them functionally equivalent. Only one of onAttachedToEngine or registerWith will be called
    // depending on the user's project. onAttachedToEngine or registerWith must both be defined
    // in the same class.
    public static void registerWith(Registrar registrar) {
        final MethodChannel channel = new MethodChannel(registrar.messenger(), "tencent_im_plugin");
        channel.setMethodCallHandler(new TencentImPlugin(registrar.context(), channel));
    }

    @Override
    public void onMethodCall(MethodCall call, Result result) {
        try {
            Method method = this.getClass().getDeclaredMethod(call.method, MethodCall.class, Result.class);
            method.setAccessible(true);
            method.invoke(this, call, result);
        } catch (NoSuchMethodException e) {
            result.notImplemented();
        } catch (IllegalAccessException e) {
            result.notImplemented();
        } catch (InvocationTargetException ignored) {
        }
    }


    @Override
    public void onDetachedFromEngine(FlutterPluginBinding binding) {
    }

    /**
     * 腾讯云Im初始化事件
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void initSDK(MethodCall methodCall, Result result) {
        String appid = CommonUtil.getParam(methodCall, result, "appid");
        Integer logPrintLevel = methodCall.argument("logPrintLevel");

        // 初始化 SDK
        V2TIMSDKConfig sdkConfig = new V2TIMSDKConfig();
        if (logPrintLevel != null) {
            sdkConfig.setLogLevel(logPrintLevel);
        }
        V2TIMManager.getInstance().initSDK(context, Integer.parseInt(appid), sdkConfig, sdkListener);

        // 绑定消息监听
        V2TIMManager.getMessageManager().addAdvancedMsgListener(this.advancedMsgListener);

        // 绑定会话监听器
        V2TIMManager.getConversationManager().setConversationListener(this.conversationListener);

        // 绑定群监听器
        V2TIMManager.getInstance().setGroupListener(this.groupListener);

        // 绑定关系链监听器
        V2TIMManager.getFriendshipManager().setFriendListener(this.friendshipListener);

        // 绑定信令监听器
        V2TIMManager.getSignalingManager().addSignalingListener(this.signalingListener);

        result.success(null);
    }


    /**
     * 反初始化
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void unInitSDK(MethodCall methodCall, Result result) {
        V2TIMManager.getInstance().unInitSDK();
        V2TIMManager.getMessageManager().removeAdvancedMsgListener(this.advancedMsgListener);
        V2TIMManager.getSignalingManager().removeSignalingListener(this.signalingListener);
        result.success(null);
    }

    /**
     * 获得SDK版本
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getVersion(MethodCall methodCall, Result result) {
        result.success(V2TIMManager.getInstance().getVersion());
    }

    /**
     * 获得服务器当前时间
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getServerTime(MethodCall methodCall, Result result) {
        result.success(V2TIMManager.getInstance().getServerTime());
    }

    /**
     * 腾讯云 IM 登录
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void login(MethodCall methodCall, final Result result) {
        String userID = CommonUtil.getParam(methodCall, result, "userID");
        String userSig = CommonUtil.getParam(methodCall, result, "userSig");

        // 登录操作
        V2TIMManager.getInstance().login(userID, userSig, new VoidCallBack(result));
    }

    /**
     * 腾讯云 IM 退出登录
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void logout(MethodCall methodCall, final Result result) {
        V2TIMManager.getInstance().logout(new VoidCallBack(result));
    }

    /**
     * 获得登录状态
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getLoginStatus(MethodCall methodCall, final Result result) {
        result.success(V2TIMManager.getInstance().getLoginStatus());
    }

    /**
     * 腾讯云 获得当前登录用户
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getLoginUser(MethodCall methodCall, final Result result) {
        result.success(V2TIMManager.getInstance().getLoginUser());
    }

    /**
     * 邀请某个人
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void invite(MethodCall methodCall, final Result result) {
        String invitee = CommonUtil.getParam(methodCall, result, "invitee");
        String data = CommonUtil.getParam(methodCall, result, "data");
        Boolean onlineUserOnly = CommonUtil.getParam(methodCall, result, "onlineUserOnly");
        String offlinePushInfoStr = CommonUtil.getParam(methodCall, result, "offlinePushInfo");
        int timeout = CommonUtil.getParam(methodCall, result, "timeout");

        // 将离线推送配置转换为JSON对象以及离线推送对象
        JSONObject jsonObject = JSON.parseObject(offlinePushInfoStr);
        V2TIMOfflinePushInfo offlinePushInfo = JSON.parseObject(offlinePushInfoStr, V2TIMOfflinePushInfo.class);
        if (jsonObject.get("disablePush") != null) {
            offlinePushInfo.disablePush(jsonObject.getBoolean("disablePush"));
        }

        // 发送邀请,并同步返回结果
        result.success(V2TIMManager.getSignalingManager().invite(invitee, data, onlineUserOnly, offlinePushInfo, timeout, new VoidCallBack(null)));
    }

    /**
     * 邀请群内的某些人
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void inviteInGroup(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        List<String> inviteeList = new ArrayList<>(Arrays.asList(CommonUtil.getParam(methodCall, result, "inviteeList").toString().split(",")));
        String data = CommonUtil.getParam(methodCall, result, "data");
        Boolean onlineUserOnly = CommonUtil.getParam(methodCall, result, "onlineUserOnly");
        int timeout = CommonUtil.getParam(methodCall, result, "timeout");

        // 发送邀请,并同步返回结果
        result.success(V2TIMManager.getSignalingManager().inviteInGroup(groupID, inviteeList, data, onlineUserOnly, timeout, new VoidCallBack(null)));
    }

    /**
     * 邀请方取消邀请
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void cancel(MethodCall methodCall, final Result result) {
        String inviteID = CommonUtil.getParam(methodCall, result, "inviteID");
        String data = CommonUtil.getParam(methodCall, result, "data");
        V2TIMManager.getSignalingManager().cancel(inviteID, data, new VoidCallBack(result));
    }

    /**
     * 接收方接收邀请
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void accept(MethodCall methodCall, final Result result) {
        String inviteID = CommonUtil.getParam(methodCall, result, "inviteID");
        String data = CommonUtil.getParam(methodCall, result, "data");
        V2TIMManager.getSignalingManager().accept(inviteID, data, new VoidCallBack(result));
    }

    /**
     * 接收方拒绝邀请
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void reject(MethodCall methodCall, final Result result) {
        String inviteID = CommonUtil.getParam(methodCall, result, "inviteID");
        String data = CommonUtil.getParam(methodCall, result, "data");
        V2TIMManager.getSignalingManager().reject(inviteID, data, new VoidCallBack(result));
    }

    /**
     * 获得信令信息
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getSignalingInfo(MethodCall methodCall, final Result result) {
        String message = CommonUtil.getParam(methodCall, result, "message");
        TencentImUtils.getMessageByFindMessageEntity(message, new ValueCallBack<V2TIMMessage>(result) {
            @Override
            public void onSuccess(V2TIMMessage message) {
                result.success(JsonUtil.toJSONString(V2TIMManager.getSignalingManager().getSignalingInfo(message)));
            }
        });
    }

    /**
     * 添加邀请信令(可以用于群离线推送消息触发的邀请信令)
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void addInvitedSignaling(MethodCall methodCall, final Result result) {
        String info = CommonUtil.getParam(methodCall, result, "info");
        V2TIMManager.getSignalingManager().addInvitedSignaling(JSON.parseObject(info, V2TIMSignalingInfo.class), new VoidCallBack(result));
    }

    /**
     * 发送消息
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void sendMessage(MethodCall methodCall, final Result result) {
        String nodeStr = CommonUtil.getParam(methodCall, result, "node");
        Map node = JSON.parseObject(nodeStr, Map.class);

        // 设置节点信息获得V2TIMMessage对象
        AbstractMessageNode messageNode = MessageNodeType.getMessageNodeTypeByV2TIMConstant(Integer.valueOf(node.get("nodeType").toString())).getMessageNodeInterface();
        AbstractMessageEntity messageEntity = (AbstractMessageEntity) JSON.parseObject(nodeStr, messageNode.getEntityClass());
        V2TIMMessage message = messageNode.getV2TIMMessage(messageEntity);

        // 发送消息
        this._sendMessage(message, methodCall, result);
    }

    /**
     * 重发消息
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void resendMessage(final MethodCall methodCall, final Result result) {
        String message = CommonUtil.getParam(methodCall, result, "message");
        TencentImUtils.getMessageByFindMessageEntity(message, new ValueCallBack<V2TIMMessage>(result) {
            @Override
            public void onSuccess(V2TIMMessage message) {
                _sendMessage(message, methodCall, result);
            }
        });
    }

    /**
     * 发送消息
     *
     * @param message    V2TIMMessage消息对象
     * @param methodCall Flutter方法调用对象
     * @param result     Flutter 返回结果
     */
    private void _sendMessage(V2TIMMessage message, MethodCall methodCall, final Result result) {
        String receiver = methodCall.argument("receiver");
        final String groupID = methodCall.argument("groupID");
        boolean ol = CommonUtil.getParam(methodCall, result, "ol");
        Integer priority = CommonUtil.getParam(methodCall, result, "priority");
        String offlinePushInfo = methodCall.argument("offlinePushInfo");
        Integer localCustomInt = methodCall.argument("localCustomInt");
        String localCustomStr = methodCall.argument("localCustomStr");

        if (localCustomInt != null) {
            message.setLocalCustomInt(localCustomInt);
        }
        if (localCustomStr != null) {
            message.setLocalCustomData(localCustomStr);
        }

        final String[] msgId = new String[1];
        V2TIMSendCallback<V2TIMMessage> callback = new V2TIMSendCallback<V2TIMMessage>() {
            @Override
            public void onError(final int i, final String s) {
                TencentImPlugin.invokeListener(ListenerTypeEnum.MessageSendFail, new HashMap<String, Object>() {
                    {
                        put("msgId", msgId[0]);
                        put("code", i);
                        put("desc", s);
                    }
                });
            }

            @Override
            public void onSuccess(V2TIMMessage o) {
                TencentImPlugin.invokeListener(ListenerTypeEnum.MessageSendSucc, new CustomMessageEntity(o));
            }

            @Override
            public void onProgress(final int i) {
                TencentImPlugin.invokeListener(ListenerTypeEnum.MessageSendProgress, new HashMap<String, Object>() {
                    {
                        put("msgId", msgId[0]);
                        put("progress", i);
                    }
                });
            }
        };

        // 发送消息
        msgId[0] = V2TIMManager.getMessageManager().sendMessage(message, receiver, groupID, priority, ol, offlinePushInfo == null ? null : JSON.parseObject(offlinePushInfo, V2TIMOfflinePushInfo.class), callback);
        result.success(msgId[0]);
    }


    /**
     * 撤回消息
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void revokeMessage(MethodCall methodCall, final Result result) {
        String message = CommonUtil.getParam(methodCall, result, "message");
        TencentImUtils.getMessageByFindMessageEntity(message, new ValueCallBack<V2TIMMessage>(result) {
            @Override
            public void onSuccess(V2TIMMessage message) {
                V2TIMManager.getMessageManager().revokeMessage(message, new VoidCallBack(result));
            }
        });
    }

    /**
     * 获得单聊历史记录
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getC2CHistoryMessageList(MethodCall methodCall, final Result result) {
        final String userID = CommonUtil.getParam(methodCall, result, "userID");
        final int count = CommonUtil.getParam(methodCall, result, "count");
        final String lastMsgStr = methodCall.argument("lastMsg");

        // 返回回调对象
        final ValueCallBack<List<V2TIMMessage>> resultCallBack = new ValueCallBack<List<V2TIMMessage>>(result) {
            @Override
            public void onSuccess(List<V2TIMMessage> v2TIMMessages) {
                List<CustomMessageEntity> resultData = new ArrayList<>(v2TIMMessages.size());
                for (V2TIMMessage v2TIMMessage : v2TIMMessages) {
                    resultData.add(new CustomMessageEntity(v2TIMMessage));
                }
                result.success(JsonUtil.toJSONString(resultData));
            }
        };


        // 根据是否传递最后一条消息进行特殊处理
        if (lastMsgStr == null) {
            V2TIMManager.getMessageManager().getC2CHistoryMessageList(userID, count, null, resultCallBack);
        } else {
            TencentImUtils.getMessageByFindMessageEntity(lastMsgStr, new ValueCallBack<V2TIMMessage>(result) {
                @Override
                public void onSuccess(V2TIMMessage message) {
                    V2TIMManager.getMessageManager().getC2CHistoryMessageList(userID, count, message, resultCallBack);
                }
            });
        }
    }

    /**
     * 获得群聊历史记录
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getGroupHistoryMessageList(MethodCall methodCall, final Result result) {
        final String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        final int count = CommonUtil.getParam(methodCall, result, "count");
        String lastMsgStr = methodCall.argument("lastMsg");

        // 返回回调对象
        final ValueCallBack<List<V2TIMMessage>> resultCallBack = new ValueCallBack<List<V2TIMMessage>>(result) {
            @Override
            public void onSuccess(List<V2TIMMessage> v2TIMMessages) {
                List<CustomMessageEntity> resultData = new ArrayList<>(v2TIMMessages.size());
                for (V2TIMMessage v2TIMMessage : v2TIMMessages) {
                    resultData.add(new CustomMessageEntity(v2TIMMessage));
                }
                result.success(JsonUtil.toJSONString(resultData));
            }
        };


        // 根据是否传递最后一条消息进行特殊处理
        if (lastMsgStr == null) {
            V2TIMManager.getMessageManager().getGroupHistoryMessageList(groupID, count, null, resultCallBack);
        } else {
            TencentImUtils.getMessageByFindMessageEntity(lastMsgStr, new ValueCallBack<V2TIMMessage>(result) {
                @Override
                public void onSuccess(V2TIMMessage message) {
                    V2TIMManager.getMessageManager().getGroupHistoryMessageList(groupID, count, message, resultCallBack);
                }
            });
        }
    }

    /**
     * 获得消息记录
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getHistoryMessageList(MethodCall methodCall, final Result result) {
        final String groupID = methodCall.argument("groupID");
        final String userID = methodCall.argument("userID");
        final int count = CommonUtil.getParam(methodCall, result, "count");
        final int type = CommonUtil.getParam(methodCall, result, "type");
        String lastMsgStr = methodCall.argument("lastMsg");

        // 返回回调对象
        final ValueCallBack<List<V2TIMMessage>> resultCallBack = new ValueCallBack<List<V2TIMMessage>>(result) {
            @Override
            public void onSuccess(List<V2TIMMessage> v2TIMMessages) {
                List<CustomMessageEntity> resultData = new ArrayList<>(v2TIMMessages.size());
                for (V2TIMMessage v2TIMMessage : v2TIMMessages) {
                    resultData.add(new CustomMessageEntity(v2TIMMessage));
                }
                result.success(JsonUtil.toJSONString(resultData));
            }
        };

        // 根据是否传递最后一条消息进行特殊处理
        final V2TIMMessageListGetOption opt = new V2TIMMessageListGetOption();
        opt.setUserID(userID);
        opt.setGroupID(groupID);
        opt.setGetType(type);
        opt.setCount(count);
        if (lastMsgStr == null) {
            V2TIMManager.getMessageManager().getHistoryMessageList(opt, resultCallBack);
        } else {
            TencentImUtils.getMessageByFindMessageEntity(lastMsgStr, new ValueCallBack<V2TIMMessage>(result) {
                @Override
                public void onSuccess(V2TIMMessage message) {
                    opt.setLastMsg(message);
                    V2TIMManager.getMessageManager().getHistoryMessageList(opt, resultCallBack);
                }
            });
        }
    }

    /**
     * 设置单聊已读
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void markC2CMessageAsRead(MethodCall methodCall, final Result result) {
        String userID = CommonUtil.getParam(methodCall, result, "userID");
        V2TIMManager.getMessageManager().markC2CMessageAsRead(userID, new VoidCallBack(result));
    }

    /**
     * 设置群聊已读
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void markGroupMessageAsRead(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        V2TIMManager.getMessageManager().markGroupMessageAsRead(groupID, new VoidCallBack(result));
    }

    /**
     * 删除本地消息
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void deleteMessageFromLocalStorage(MethodCall methodCall, final Result result) {
        String message = CommonUtil.getParam(methodCall, result, "message");
        TencentImUtils.getMessageByFindMessageEntity(message, new ValueCallBack<V2TIMMessage>(result) {
            @Override
            public void onSuccess(V2TIMMessage message) {
                V2TIMManager.getMessageManager().deleteMessageFromLocalStorage(message, new VoidCallBack(result));
            }
        });
    }

    /**
     * 删除本地及漫游消息
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void deleteMessages(MethodCall methodCall, final Result result) {
        String message = CommonUtil.getParam(methodCall, result, "message");
        TencentImUtils.getMessageByFindMessageEntity(JSON.parseArray(message, FindMessageEntity.class), new ValueCallBack<List<V2TIMMessage>>(result) {
            @Override
            public void onSuccess(List<V2TIMMessage> ms) {
                V2TIMManager.getMessageManager().deleteMessages(ms, new VoidCallBack(result));
            }
        });


    }

    /**
     * 向群组消息列表中添加一条消息
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void insertGroupMessageToLocalStorage(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        String sender = CommonUtil.getParam(methodCall, result, "sender");
        String nodeStr = CommonUtil.getParam(methodCall, result, "node");
        Map node = JSON.parseObject(nodeStr, Map.class);

        // 获得消息对象
        AbstractMessageNode messageNode = MessageNodeType.getMessageNodeTypeByV2TIMConstant(Integer.valueOf(node.get("nodeType").toString())).getMessageNodeInterface();
        AbstractMessageEntity messageEntity = (AbstractMessageEntity) JSON.parseObject(nodeStr, messageNode.getEntityClass());

        // 添加消息
        V2TIMManager.getMessageManager().insertGroupMessageToLocalStorage(messageNode.getV2TIMMessage(messageEntity), groupID, sender, new ValueCallBack<V2TIMMessage>(result) {
            @Override
            public void onSuccess(V2TIMMessage message) {
                result.success(null);
            }
        });
    }


    /**
     * 向群组消息列表中添加一条消息
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void insertC2CMessageToLocalStorage(MethodCall methodCall, final Result result) {
        String userID = CommonUtil.getParam(methodCall, result, "userID");
        String sender = CommonUtil.getParam(methodCall, result, "sender");
        String nodeStr = CommonUtil.getParam(methodCall, result, "node");
        Map node = JSON.parseObject(nodeStr, Map.class);

        // 获得消息对象
        AbstractMessageNode messageNode = MessageNodeType.getMessageNodeTypeByV2TIMConstant(Integer.valueOf(node.get("nodeType").toString())).getMessageNodeInterface();
        AbstractMessageEntity messageEntity = (AbstractMessageEntity) JSON.parseObject(nodeStr, messageNode.getEntityClass());

        // 添加消息
        V2TIMManager.getMessageManager().insertC2CMessageToLocalStorage(messageNode.getV2TIMMessage(messageEntity), userID, sender, new ValueCallBack<V2TIMMessage>(result) {
            @Override
            public void onSuccess(V2TIMMessage message) {
                result.success(null);
            }
        });
    }

    /**
     * 下载视频
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void downloadVideo(MethodCall methodCall, final Result result) {
        final String path = CommonUtil.getParam(methodCall, result, "path");
        String message = CommonUtil.getParam(methodCall, result, "message");
        TencentImUtils.getMessageByFindMessageEntity(message, new ValueCallBack<V2TIMMessage>(result) {
            @Override
            public void onSuccess(V2TIMMessage message) {
                message.getVideoElem().downloadVideo(path, new DownloadCallBack(result, path, message.getMsgID(), DownloadCallBack.DownloadTypeEnum.Video));
            }
        });
    }

    /**
     * 下载视频缩略图
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void downloadVideoThumbnail(MethodCall methodCall, final Result result) {
        final String path = CommonUtil.getParam(methodCall, result, "path");
        String message = CommonUtil.getParam(methodCall, result, "message");
        TencentImUtils.getMessageByFindMessageEntity(message, new ValueCallBack<V2TIMMessage>(result) {
            @Override
            public void onSuccess(V2TIMMessage message) {
                message.getVideoElem().downloadSnapshot(path, new DownloadCallBack(result, path, message.getMsgID(), DownloadCallBack.DownloadTypeEnum.VideoThumbnail));
            }
        });
    }

    /**
     * 下载语音
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void downloadSound(MethodCall methodCall, final Result result) {
        final String path = CommonUtil.getParam(methodCall, result, "path");
        String message = CommonUtil.getParam(methodCall, result, "message");
        TencentImUtils.getMessageByFindMessageEntity(message, new ValueCallBack<V2TIMMessage>(result) {
            @Override
            public void onSuccess(V2TIMMessage message) {
                message.getSoundElem().downloadSound(path, new DownloadCallBack(result, path, message.getMsgID(), DownloadCallBack.DownloadTypeEnum.Sound));
            }
        });
    }

    /**
     * 下载文件
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void downloadFile(MethodCall methodCall, final Result result) {
        final String path = CommonUtil.getParam(methodCall, result, "path");
        String message = CommonUtil.getParam(methodCall, result, "message");
        TencentImUtils.getMessageByFindMessageEntity(message, new ValueCallBack<V2TIMMessage>(result) {
            @Override
            public void onSuccess(V2TIMMessage message) {
                message.getFileElem().downloadFile(path, new DownloadCallBack(result, path, message.getMsgID(), DownloadCallBack.DownloadTypeEnum.File));
            }
        });
    }

    /**
     * 设置消息本地Str
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void setMessageLocalCustomStr(MethodCall methodCall, final Result result) {
        final String data = CommonUtil.getParam(methodCall, result, "data");
        String message = CommonUtil.getParam(methodCall, result, "message");
        TencentImUtils.getMessageByFindMessageEntity(message, new ValueCallBack<V2TIMMessage>(result) {
            @Override
            public void onSuccess(V2TIMMessage message) {
                message.setLocalCustomData(data);
                result.success(null);
            }
        });
    }

    /**
     * 设置消息本地Int
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void setMessageLocalCustomInt(MethodCall methodCall, final Result result) {
        final Integer data = CommonUtil.getParam(methodCall, result, "data");
        String message = CommonUtil.getParam(methodCall, result, "message");
        TencentImUtils.getMessageByFindMessageEntity(message, new ValueCallBack<V2TIMMessage>(result) {
            @Override
            public void onSuccess(V2TIMMessage message) {
                message.setLocalCustomInt(data);
                result.success(null);
            }
        });
    }

    /**
     * 查找消息列表
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void findMessages(MethodCall methodCall, final Result result) {
        String messages = CommonUtil.getParam(methodCall, result, "messages");
        TencentImUtils.getMessageByFindMessageEntity(JSON.parseArray(messages, FindMessageEntity.class), new ValueCallBack<List<V2TIMMessage>>(result) {
            @Override
            public void onSuccess(List<V2TIMMessage> v2TIMMessages) {
                List<CustomMessageEntity> ms = new ArrayList<>(v2TIMMessages.size());
                for (V2TIMMessage v2TIMMessage : v2TIMMessages) {
                    ms.add(new CustomMessageEntity(v2TIMMessage));
                }
                result.success(JsonUtil.toJSONString(ms));
            }
        });
    }

    /**
     * 创建群
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void createGroup(MethodCall methodCall, final Result result) {
        String info = CommonUtil.getParam(methodCall, result, "info");
        String memberListStr = methodCall.argument("memberList");
        V2TIMManager.getGroupManager().createGroup(JSON.parseObject(info, V2TIMGroupInfo.class), memberListStr == null ? null : JSON.parseArray(memberListStr, V2TIMCreateGroupMemberInfo.class), new ValueCallBack<String>(result));
    }

    /**
     * 加入群
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void joinGroup(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        String message = CommonUtil.getParam(methodCall, result, "message");
        V2TIMManager.getInstance().joinGroup(groupID, message, new VoidCallBack(result));
    }

    /**
     * 退出群
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void quitGroup(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        V2TIMManager.getInstance().quitGroup(groupID, new VoidCallBack(result));
    }

    /**
     * 解散群
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void dismissGroup(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        V2TIMManager.getInstance().dismissGroup(groupID, new VoidCallBack(result));
    }

    /**
     * 获得已加入的群列表
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getJoinedGroupList(MethodCall methodCall, final Result result) {
        V2TIMManager.getGroupManager().getJoinedGroupList(new ValueCallBack<List<V2TIMGroupInfo>>(result));
    }

    /**
     * 拉取群资料
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getGroupsInfo(MethodCall methodCall, final Result result) {
        String groupIDList = CommonUtil.getParam(methodCall, result, "groupIDList");
        V2TIMManager.getGroupManager().getGroupsInfo(Arrays.asList(groupIDList.split(",")), new ValueCallBack<List<V2TIMGroupInfoResult>>(result));
    }

    /**
     * 修改群资料
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void setGroupInfo(MethodCall methodCall, final Result result) {
        String info = CommonUtil.getParam(methodCall, result, "info");
        V2TIMManager.getGroupManager().setGroupInfo(JSON.parseObject(info, V2TIMGroupInfo.class), new VoidCallBack(result));
    }

    /**
     * 搜索群
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void searchGroups(MethodCall methodCall, final Result result) {
        List<String> keywordList = CommonUtil.getParam(methodCall, result, "keywordList");
        Boolean isSearchGroupID = CommonUtil.getParam(methodCall, result, "isSearchGroupID");
        Boolean isSearchGroupName = CommonUtil.getParam(methodCall, result, "isSearchGroupName");

        // 群搜索
        V2TIMGroupSearchParam param = new V2TIMGroupSearchParam();
        param.setKeywordList(keywordList);
        param.setSearchGroupName(isSearchGroupName);
        param.setSearchGroupID(isSearchGroupID);
        V2TIMManager.getGroupManager().searchGroups(param, new ValueCallBack<List<V2TIMGroupInfo>>(result));
    }

    /**
     * 搜索群成员
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void searchGroupMembers(MethodCall methodCall, final Result result) {
        List<String> keywordList = CommonUtil.getParam(methodCall, result, "keywordList");
        List<String> groupIDList = CommonUtil.getParam(methodCall, result, "groupIDList");
        Boolean isSearchMemberNameCard = CommonUtil.getParam(methodCall, result, "isSearchMemberNameCard");
        Boolean isSearchMemberUserID = CommonUtil.getParam(methodCall, result, "isSearchMemberUserID");
        Boolean isSearchMemberRemark = CommonUtil.getParam(methodCall, result, "isSearchMemberRemark");
        Boolean isSearchMemberNickName = CommonUtil.getParam(methodCall, result, "isSearchMemberNickName");

        // 搜索群成员
        V2TIMGroupMemberSearchParam param = new V2TIMGroupMemberSearchParam();
        param.setKeywordList(keywordList);
        param.setGroupIDList(groupIDList);
        param.setSearchMemberNameCard(isSearchMemberNameCard);
        param.setSearchMemberUserID(isSearchMemberUserID);
        param.setSearchMemberRemark(isSearchMemberRemark);
        param.setSearchMemberNickName(isSearchMemberNickName);

        V2TIMManager.getGroupManager().searchGroupMembers(param, new ValueCallBack<HashMap<String, List<V2TIMGroupMemberFullInfo>>>(result));
    }

    /**
     * 修改C2C消息接收选项
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void setC2CReceiveMessageOpt(MethodCall methodCall, final Result result) {
        List<String> ids = CommonUtil.getParam(methodCall, result, "ids");
        int opt = CommonUtil.getParam(methodCall, result, "opt");
        V2TIMManager.getMessageManager().setC2CReceiveMessageOpt(ids, opt, new VoidCallBack(result));
    }

    /**
     * 修改群消息接收选项
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void setGroupReceiveMessageOpt(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        int opt = CommonUtil.getParam(methodCall, result, "opt");
        V2TIMManager.getMessageManager().setGroupReceiveMessageOpt(groupID, opt, new VoidCallBack(result));
    }

    /**
     * 获得C2C消息接收选项
     */
    private void getC2CReceiveMessageOpt(MethodCall call, final Result result) {
        V2TIMManager.getMessageManager().getC2CReceiveMessageOpt(call.<List<String>>arguments(), new ValueCallBack<List<V2TIMReceiveMessageOptInfo>>(result) {
            @Override
            public void onSuccess(List<V2TIMReceiveMessageOptInfo> v2TIMReceiveMessageOptInfos) {
                Map<String, Integer> res = new HashMap<>(v2TIMReceiveMessageOptInfos.size(), 1);
                for (V2TIMReceiveMessageOptInfo item : v2TIMReceiveMessageOptInfos) {
                    res.put(item.getUserID(), item.getC2CReceiveMessageOpt());
                }
                result.success(res);
            }
        });
    }

    /**
     * 初始化群属性,会清空原有的群属性列表
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void initGroupAttributes(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        String attributes = CommonUtil.getParam(methodCall, result, "attributes");
        V2TIMManager.getGroupManager().initGroupAttributes(groupID, JSON.parseObject(attributes, HashMap.class), new VoidCallBack(result));
    }

    /**
     * 设置群属性。已有该群属性则更新其 value 值,没有该群属性则添加该属性。
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void setGroupAttributes(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        String attributes = CommonUtil.getParam(methodCall, result, "attributes");
        V2TIMManager.getGroupManager().setGroupAttributes(groupID, JSON.parseObject(attributes, HashMap.class), new VoidCallBack(result));
    }

    /**
     * 删除指定群属性,keys 传 null 则清空所有群属性。
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void deleteGroupAttributes(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        String keys = methodCall.argument("keys");
        V2TIMManager.getGroupManager().deleteGroupAttributes(groupID, keys == null ? null : Arrays.asList(keys.split(",")), new VoidCallBack(result));
    }

    /**
     * 获取指定群属性,keys 传 null 则获取所有群属性。
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getGroupAttributes(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        String keys = methodCall.argument("keys");
        V2TIMManager.getGroupManager().getGroupAttributes(groupID, keys == null ? null : Arrays.asList(keys.split(",")), new ValueCallBack<Map<String, String>>(result));
    }

    /**
     * 获取指定群在线人数
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getGroupOnlineMemberCount(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        V2TIMManager.getGroupManager().getGroupOnlineMemberCount(groupID, new ValueCallBack<Integer>(result) {
            @Override
            public void onSuccess(Integer data) {
                result.success(data);
            }
        });
    }

    /**
     * 获取群成员列表。
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getGroupMemberList(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        int filter = CommonUtil.getParam(methodCall, result, "filter");
        long nextSeq = Long.parseLong(CommonUtil.getParam(methodCall, result, "nextSeq").toString());
        V2TIMManager.getGroupManager().getGroupMemberList(groupID, filter, nextSeq, new ValueCallBack<V2TIMGroupMemberInfoResult>(result));
    }

    /**
     * 获取指定的群成员资料。
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getGroupMembersInfo(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        String memberList = CommonUtil.getParam(methodCall, result, "memberList");
        V2TIMManager.getGroupManager().getGroupMembersInfo(groupID, Arrays.asList(memberList.split(",")), new ValueCallBack<List<V2TIMGroupMemberFullInfo>>(result));
    }

    /**
     * 修改指定的群成员资料。
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void setGroupMemberInfo(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        String info = CommonUtil.getParam(methodCall, result, "info");
        V2TIMManager.getGroupManager().setGroupMemberInfo(groupID, JSON.parseObject(info, V2TIMGroupMemberFullInfo.class), new VoidCallBack(result));
    }

    /**
     * 禁言。
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void muteGroupMember(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        String userID = CommonUtil.getParam(methodCall, result, "userID");
        int seconds = CommonUtil.getParam(methodCall, result, "seconds");
        V2TIMManager.getGroupManager().muteGroupMember(groupID, userID, seconds, new VoidCallBack(result));
    }


    /**
     * 邀请他人入群。
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void inviteUserToGroup(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        String userList = CommonUtil.getParam(methodCall, result, "userList");
        V2TIMManager.getGroupManager().inviteUserToGroup(groupID, Arrays.asList(userList.split(",")), new ValueCallBack<List<V2TIMGroupMemberOperationResult>>(result));
    }

    /**
     * 踢人。
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void kickGroupMember(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        String memberList = CommonUtil.getParam(methodCall, result, "memberList");
        String reason = CommonUtil.getParam(methodCall, result, "reason");
        V2TIMManager.getGroupManager().kickGroupMember(groupID, Arrays.asList(memberList.split(",")), reason, new ValueCallBack<List<V2TIMGroupMemberOperationResult>>(result));
    }

    /**
     * 切换群成员角色。
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void setGroupMemberRole(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        String userID = CommonUtil.getParam(methodCall, result, "userID");
        int role = CommonUtil.getParam(methodCall, result, "role");
        V2TIMManager.getGroupManager().setGroupMemberRole(groupID, userID, role, new VoidCallBack(result));
    }

    /**
     * 转让群主。
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void transferGroupOwner(MethodCall methodCall, final Result result) {
        String groupID = CommonUtil.getParam(methodCall, result, "groupID");
        String userID = CommonUtil.getParam(methodCall, result, "userID");
        V2TIMManager.getGroupManager().transferGroupOwner(groupID, userID, new VoidCallBack(result));
    }

    /**
     * 获得群申请列表。
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getGroupApplicationList(MethodCall methodCall, final Result result) {
        V2TIMManager.getGroupManager().getGroupApplicationList(new ValueCallBack<V2TIMGroupApplicationResult>(result));
    }


    /**
     * 同意某一条加群申请。
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void acceptGroupApplication(MethodCall methodCall, final Result result) {
        String application = CommonUtil.getParam(methodCall, result, "application");
        final String reason = CommonUtil.getParam(methodCall, result, "reason");
        TencentImUtils.getGroupApplicationByFindGroupApplicationEntity(application, new ValueCallBack<V2TIMGroupApplication>(result) {
            @Override
            public void onSuccess(V2TIMGroupApplication v2TIMGroupApplication) {
                V2TIMManager.getGroupManager().acceptGroupApplication(v2TIMGroupApplication, reason, new VoidCallBack(result));
            }
        });
    }


    /**
     * 拒绝某一条加群申请。
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void refuseGroupApplication(MethodCall methodCall, final Result result) {
        final String application = CommonUtil.getParam(methodCall, result, "application");
        final String reason = CommonUtil.getParam(methodCall, result, "reason");
        TencentImUtils.getGroupApplicationByFindGroupApplicationEntity(application, new ValueCallBack<V2TIMGroupApplication>(result) {
            @Override
            public void onSuccess(V2TIMGroupApplication v2TIMGroupApplication) {
                V2TIMManager.getGroupManager().refuseGroupApplication(v2TIMGroupApplication, reason, new VoidCallBack(result));
            }
        });
    }

    /**
     * 标记申请列表为已读
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void setGroupApplicationRead(MethodCall methodCall, final Result result) {
        V2TIMManager.getGroupManager().setGroupApplicationRead(new VoidCallBack(result));
    }

    /**
     * 获得会话列表
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getConversationList(MethodCall methodCall, final Result result) {
        Long nextSeq = Long.parseLong(CommonUtil.getParam(methodCall, result, "nextSeq").toString());
        Integer count = CommonUtil.getParam(methodCall, result, "count");
        V2TIMManager.getConversationManager().getConversationList(nextSeq, count, new ValueCallBack<V2TIMConversationResult>(result) {
            @Override
            public void onSuccess(V2TIMConversationResult v2TIMConversationResult) {
                result.success(JsonUtil.toJSONString(new CustomConversationResultEntity(v2TIMConversationResult)));
            }
        });
    }

    /**
     * 获得指定会话
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getConversation(MethodCall methodCall, final Result result) {
        String conversationID = CommonUtil.getParam(methodCall, result, "conversationID");
        V2TIMManager.getConversationManager().getConversation(conversationID, new ValueCallBack<V2TIMConversation>(result) {
            @Override
            public void onSuccess(V2TIMConversation v2TIMConversation) {
                result.success(JsonUtil.toJSONString(new CustomConversationEntity(v2TIMConversation)));
            }
        });
    }

    /**
     * 删除会话
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void deleteConversation(MethodCall methodCall, final Result result) {
        String conversationID = CommonUtil.getParam(methodCall, result, "conversationID");
        V2TIMManager.getConversationManager().deleteConversation(conversationID, new VoidCallBack(result));
    }

    /**
     * 设置会话草稿
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void setConversationDraft(MethodCall methodCall, final Result result) {
        String conversationID = CommonUtil.getParam(methodCall, result, "conversationID");
        String draftText = methodCall.argument("draftText");
        V2TIMManager.getConversationManager().setConversationDraft(conversationID, draftText, new VoidCallBack(result));
    }

    /**
     * 会话置顶
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void pinConversation(MethodCall methodCall, final Result result) {
        String conversationID = CommonUtil.getParam(methodCall, result, "conversationID");
        boolean isPinned = methodCall.argument("isPinned");
        V2TIMManager.getConversationManager().pinConversation(conversationID, isPinned, new VoidCallBack(result));
    }

    /**
     * 获得未读会话总数
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getTotalUnreadMessageCount(MethodCall methodCall, final Result result) {
        V2TIMManager.getConversationManager().getTotalUnreadMessageCount(new ValueCallBack<Long>(result));
    }

    /**
     * 获得用户信息
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getUsersInfo(MethodCall methodCall, final Result result) {
        String userIDList = CommonUtil.getParam(methodCall, result, "userIDList");
        V2TIMManager.getInstance().getUsersInfo(Arrays.asList(userIDList.split(",")), new ValueCallBack<List<V2TIMUserFullInfo>>(result));
    }

    /**
     * 修改个人资料
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void setSelfInfo(MethodCall methodCall, final Result result) {
        String info = CommonUtil.getParam(methodCall, result, "info");
        V2TIMManager.getInstance().setSelfInfo(JSON.parseObject(info, V2TIMUserFullInfo.class), new VoidCallBack(result));
    }

    /**
     * 添加到黑名单
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void addToBlackList(MethodCall methodCall, final Result result) {
        String userIDList = CommonUtil.getParam(methodCall, result, "userIDList");
        V2TIMManager.getFriendshipManager().addToBlackList(Arrays.asList(userIDList.split(",")), new ValueCallBack<List<V2TIMFriendOperationResult>>(result));
    }

    /**
     * 从黑名单中删除
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void deleteFromBlackList(MethodCall methodCall, final Result result) {
        String userIDList = CommonUtil.getParam(methodCall, result, "userIDList");
        V2TIMManager.getFriendshipManager().deleteFromBlackList(Arrays.asList(userIDList.split(",")), new ValueCallBack<List<V2TIMFriendOperationResult>>(result));
    }

    /**
     * 获得黑名单列表
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getBlackList(MethodCall methodCall, final Result result) {
        V2TIMManager.getFriendshipManager().getBlackList(new ValueCallBack<List<V2TIMFriendInfo>>(result));
    }

    /**
     * 腾讯云 设置离线推送Token
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void setOfflinePushConfig(MethodCall methodCall, final Result result) {
        String token = CommonUtil.getParam(methodCall, result, "token");
        Long bussid = Long.parseLong(CommonUtil.getParam(methodCall, result, "bussid").toString());
        Boolean tpns = CommonUtil.getParam(methodCall, result, "tpns");
        V2TIMManager.getOfflinePushManager().setOfflinePushConfig(new V2TIMOfflinePushConfig(bussid, token, tpns), new VoidCallBack(result));
    }


    /**
     * 腾讯云 设置未读桌标
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void setUnreadBadge(MethodCall methodCall, final Result result) {
        int number = CommonUtil.getParam(methodCall, result, "number");
        V2TIMManager.getOfflinePushManager().doBackground(number, new VoidCallBack(result));
    }

    /**
     * 腾讯云 获得好友列表
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getFriendList(MethodCall methodCall, final Result result) {
        V2TIMManager.getFriendshipManager().getFriendList(new ValueCallBack<List<V2TIMFriendInfo>>(result));
    }

    /**
     * 获得指定好友信息
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getFriendsInfo(MethodCall methodCall, final Result result) {
        String userIDList = CommonUtil.getParam(methodCall, result, "userIDList");
        V2TIMManager.getFriendshipManager().getFriendsInfo(Arrays.asList(userIDList.split(",")), new ValueCallBack<List<V2TIMFriendInfoResult>>(result));
    }

    /**
     * 设置好友资料
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void setFriendInfo(MethodCall methodCall, final Result result) {
        String info = CommonUtil.getParam(methodCall, result, "info");
        V2TIMManager.getFriendshipManager().setFriendInfo(JSON.parseObject(info, V2TIMFriendInfo.class), new VoidCallBack(result));
    }

    /**
     * 添加好友
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void addFriend(MethodCall methodCall, final Result result) {
        String info = CommonUtil.getParam(methodCall, result, "info");
        V2TIMManager.getFriendshipManager().addFriend(JSON.parseObject(info, CustomFriendAddApplication.class), new ValueCallBack<V2TIMFriendOperationResult>(result));
    }

    /**
     * 删除好友
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void deleteFromFriendList(MethodCall methodCall, final Result result) {
        String userIDList = CommonUtil.getParam(methodCall, result, "userIDList");
        int deleteType = CommonUtil.getParam(methodCall, result, "deleteType");
        V2TIMManager.getFriendshipManager().deleteFromFriendList(Arrays.asList(userIDList.split(",")), deleteType, new ValueCallBack<List<V2TIMFriendOperationResult>>(result));
    }

    /**
     * 检查好友关系
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void checkFriend(MethodCall methodCall, final Result result) {
        String userID = CommonUtil.getParam(methodCall, result, "userID");
        int checkType = CommonUtil.getParam(methodCall, result, "checkType");
        V2TIMManager.getFriendshipManager().checkFriend(Collections.singletonList(userID), checkType, new ValueCallBack<List<V2TIMFriendCheckResult>>(result) {
            @Override
            public void onSuccess(List<V2TIMFriendCheckResult> v2TIMFriendCheckResults) {
                result.success(v2TIMFriendCheckResults.size() == 0 ? null : JsonUtil.toJSONString(v2TIMFriendCheckResults.get(0)));
            }
        });
    }

    /**
     * 获得好友申请列表
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getFriendApplicationList(MethodCall methodCall, final Result result) {
        V2TIMManager.getFriendshipManager().getFriendApplicationList(new ValueCallBack<V2TIMFriendApplicationResult>(result));
    }

    /**
     * 好友同意申请
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void acceptFriendApplication(MethodCall methodCall, final Result result) {
        final String application = CommonUtil.getParam(methodCall, result, "application");
        final int responseType = CommonUtil.getParam(methodCall, result, "responseType");
        TencentImUtils.getFriendApplicationByFindGroupApplicationEntity(application, new ValueCallBack<V2TIMFriendApplication>(result) {
            @Override
            public void onSuccess(V2TIMFriendApplication v2TIMFriendApplication) {
                V2TIMManager.getFriendshipManager().acceptFriendApplication(v2TIMFriendApplication, responseType, new ValueCallBack<V2TIMFriendOperationResult>(result));
            }
        });
    }

    /**
     * 好友拒绝申请
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void refuseFriendApplication(MethodCall methodCall, final Result result) {
        String application = CommonUtil.getParam(methodCall, result, "application");
        TencentImUtils.getFriendApplicationByFindGroupApplicationEntity(application, new ValueCallBack<V2TIMFriendApplication>(result) {
            @Override
            public void onSuccess(V2TIMFriendApplication v2TIMFriendApplication) {
                V2TIMManager.getFriendshipManager().refuseFriendApplication(v2TIMFriendApplication, new ValueCallBack<V2TIMFriendOperationResult>(result));
            }
        });
    }

    /**
     * 删除好友申请
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void deleteFriendApplication(MethodCall methodCall, final Result result) {
        String application = CommonUtil.getParam(methodCall, result, "application");
        TencentImUtils.getFriendApplicationByFindGroupApplicationEntity(application, new ValueCallBack<V2TIMFriendApplication>(result) {
            @Override
            public void onSuccess(V2TIMFriendApplication v2TIMFriendApplication) {
                V2TIMManager.getFriendshipManager().deleteFriendApplication(v2TIMFriendApplication, new VoidCallBack(result));
            }
        });
    }

    /**
     * 设置好友申请为已读
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void setFriendApplicationRead(MethodCall methodCall, final Result result) {
        V2TIMManager.getFriendshipManager().setFriendApplicationRead(new VoidCallBack(result));
    }

    /**
     * 新建好友分组
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void createFriendGroup(MethodCall methodCall, final Result result) {
        String groupName = CommonUtil.getParam(methodCall, result, "groupName");
        String userIDList = CommonUtil.getParam(methodCall, result, "userIDList");
        V2TIMManager.getFriendshipManager().createFriendGroup(groupName, Arrays.asList(userIDList.split(",")), new ValueCallBack<List<V2TIMFriendOperationResult>>(result));
    }

    /**
     * 获得分组信息
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void getFriendGroups(MethodCall methodCall, final Result result) {
        String groupNameList = methodCall.argument("groupNameList");
        V2TIMManager.getFriendshipManager().getFriendGroups(groupNameList == null ? null : Arrays.asList(groupNameList.split(",")), new ValueCallBack<List<V2TIMFriendGroup>>(result));
    }

    /**
     * 删除好友分组
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void deleteFriendGroup(MethodCall methodCall, final Result result) {
        String groupNameList = CommonUtil.getParam(methodCall, result, "groupNameList");
        V2TIMManager.getFriendshipManager().deleteFriendGroup(Arrays.asList(groupNameList.split(",")), new VoidCallBack(result));
    }

    /**
     * 修改分组名称
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void renameFriendGroup(MethodCall methodCall, final Result result) {
        String oldName = CommonUtil.getParam(methodCall, result, "oldName");
        String newName = CommonUtil.getParam(methodCall, result, "newName");
        V2TIMManager.getFriendshipManager().renameFriendGroup(oldName, newName, new VoidCallBack(result));
    }

    /**
     * 添加好友到分组
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void addFriendsToFriendGroup(MethodCall methodCall, final Result result) {
        String groupName = CommonUtil.getParam(methodCall, result, "groupName");
        String userIDList = CommonUtil.getParam(methodCall, result, "userIDList");
        V2TIMManager.getFriendshipManager().addFriendsToFriendGroup(groupName, Arrays.asList(userIDList.split(",")), new ValueCallBack<List<V2TIMFriendOperationResult>>(result));
    }

    /**
     * 从分组中删除好友
     *
     * @param methodCall 方法调用对象
     * @param result     返回结果对象
     */
    private void deleteFriendsFromFriendGroup(MethodCall methodCall, final Result result) {
        String groupName = CommonUtil.getParam(methodCall, result, "groupName");
        String userIDList = CommonUtil.getParam(methodCall, result, "userIDList");
        V2TIMManager.getFriendshipManager().deleteFriendsFromFriendGroup(groupName, Arrays.asList(userIDList.split(",")), new ValueCallBack<List<V2TIMFriendOperationResult>>(result));
    }

    /**
     * 搜索本地消息
     */
    private void searchLocalMessages(MethodCall call, final Result result) {
        V2TIMMessageSearchParam param = new V2TIMMessageSearchParam();
        param.setConversationID(call.<String>argument("conversationId"));
        param.setKeywordList(call.<List<String>>argument("keyword"));
        param.setKeywordListMatchType(call.<Integer>argument("keywordMatchType"));
        param.setSenderUserIDList(call.<List<String>>argument("senderUserIds"));
        param.setMessageTypeList(call.<List<Integer>>argument("messageTypes"));
        param.setSearchTimePosition(call.<Long>argument("searchTimePosition"));
        param.setSearchTimePeriod(call.<Long>argument("searchTimePeriod"));
        param.setPageSize(call.<Integer>argument("pageSize"));
        param.setPageIndex(call.<Integer>argument("pageIndex"));
        V2TIMManager.getMessageManager().searchLocalMessages(param, new ValueCallBack<V2TIMMessageSearchResult>(result) {
            @Override
            public void onSuccess(V2TIMMessageSearchResult v2TIMMessageSearchResult) {

            }
        });
    }

    /**
     * 调用监听器
     *
     * @param type   类型
     * @param params 参数
     */
    public static void invokeListener(ListenerTypeEnum type, Object params) {
        final Map<String, Object> resultParams = new HashMap<>(2, 1);
        resultParams.put("type", type);
        resultParams.put("params", params);
        CommonUtil.runMainThreadMethod(new Runnable() {
            @Override
            public void run() {
                channel.invokeMethod("onListener", JsonUtil.toJSONString(resultParams));
            }
        });
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/ValueCallBack.java
================================================
package top.huic.tencent_im_plugin;

import com.tencent.imsdk.v2.V2TIMValueCallback;

import io.flutter.plugin.common.MethodChannel.Result;
import top.huic.tencent_im_plugin.util.JsonUtil;

/**
 * 值改变回调
 *
 * @author 蒋具宏
 */
public class ValueCallBack<T> implements V2TIMValueCallback<T> {
    /**
     * 回调
     */
    private Result result;

    public ValueCallBack(Result result) {
        this.result = result;
    }

    /**
     * 成功事件
     *
     * @param t 结果
     */
    @Override
    public void onSuccess(T t) {
        if (result != null) {
            if(t instanceof Number || t instanceof String || t instanceof Boolean){
                result.success(t);
            }else{
                result.success(JsonUtil.toJSONString(t));
            }
        }
    }


    /**
     * 失败事件
     *
     * @param code 错误码
     * @param desc 错误描述
     */
    @Override
    public void onError(int code, String desc) {
        if (this.result != null) {
            result.error(String.valueOf(code), desc, desc);
        }
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/VoidCallBack.java
================================================
package top.huic.tencent_im_plugin;

import com.tencent.imsdk.v2.V2TIMCallback;

import io.flutter.plugin.common.MethodChannel;

/**
 * 操作结果回调
 *
 * @author 蒋具宏
 */
public class VoidCallBack implements V2TIMCallback {
    /**
     * 回调
     */
    private MethodChannel.Result result;

    public VoidCallBack(MethodChannel.Result result) {
        this.result = result;
    }

    @Override
    public void onError(int code, String desc) {
        if (result != null) {
            result.error(String.valueOf(code), "Execution Error", desc);
        }
    }

    @Override
    public void onSuccess() {
        if (result != null) {
            result.success(null);
        }
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/entity/CustomConversationEntity.java
================================================
package top.huic.tencent_im_plugin.entity;

import com.tencent.imsdk.v2.V2TIMConversation;
import com.tencent.imsdk.v2.V2TIMGroupAtInfo;

import java.util.List;

import top.huic.tencent_im_plugin.util.BeanUtils;

/**
 * 自定义会话实体
 */
public class CustomConversationEntity {

    /**
     * 会话ID
     */
    String conversationID;

    /**
     * 会话类型
     */
    int type;

    /**
     * 用户ID
     */
    String userID;

    /**
     * 群ID
     */
    String groupID;

    /**
     * 显示名称
     */
    String showName;

    /**
     * 头像
     */
    String faceUrl;

    /**
     * 接收消息选项(群会话有效)
     */
    int recvOpt;

    /**
     * 群类型
     */
    String groupType;

    /**
     * 未读数量
     */
    int unreadCount;

    /**
     * 最后一条消息
     */
    CustomMessageEntity lastMessage;

    /**
     * 草稿文本
     */
    String draftText;

    /**
     * 草稿时间
     */
    Long draftTimestamp;

    /**
     * 是否置顶
     */
    boolean pinned;

    /**
     * \@信息列表
     */
    List<V2TIMGroupAtInfo> groupAtInfoList;

    public CustomConversationEntity() {
    }

    public CustomConversationEntity(V2TIMConversation data) {
        BeanUtils.copyProperties(data, this, "lastMessage");
        if (data.getLastMessage() != null) {
            this.lastMessage = new CustomMessageEntity(data.getLastMessage());
        }
    }

    public String getConversationID() {
        return conversationID;
    }

    public void setConversationID(String conversationID) {
        this.conversationID = conversationID;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getUserID() {
        return userID;
    }

    public void setUserID(String userID) {
        this.userID = userID;
    }

    public String getGroupID() {
        return groupID;
    }

    public void setGroupID(String groupID) {
        this.groupID = groupID;
    }

    public String getShowName() {
        return showName;
    }

    public void setShowName(String showName) {
        this.showName = showName;
    }

    public String getFaceUrl() {
        return faceUrl;
    }

    public void setFaceUrl(String faceUrl) {
        this.faceUrl = faceUrl;
    }

    public int getRecvOpt() {
        return recvOpt;
    }

    public void setRecvOpt(int recvOpt) {
        this.recvOpt = recvOpt;
    }

    public String getGroupType() {
        return groupType;
    }

    public void setGroupType(String groupType) {
        this.groupType = groupType;
    }

    public int getUnreadCount() {
        return unreadCount;
    }

    public void setUnreadCount(int unreadCount) {
        this.unreadCount = unreadCount;
    }

    public CustomMessageEntity getLastMessage() {
        return lastMessage;
    }

    public void setLastMessage(CustomMessageEntity lastMessage) {
        this.lastMessage = lastMessage;
    }

    public String getDraftText() {
        return draftText;
    }

    public void setDraftText(String draftText) {
        this.draftText = draftText;
    }

    public Long getDraftTimestamp() {
        return draftTimestamp;
    }

    public void setDraftTimestamp(Long draftTimestamp) {
        this.draftTimestamp = draftTimestamp;
    }

    public List<V2TIMGroupAtInfo> getGroupAtInfoList() {
        return groupAtInfoList;
    }

    public void setGroupAtInfoList(List<V2TIMGroupAtInfo> groupAtInfoList) {
        this.groupAtInfoList = groupAtInfoList;
    }

    public boolean isPinned() {
        return pinned;
    }

    public void setPinned(boolean pinned) {
        this.pinned = pinned;
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/entity/CustomConversationResultEntity.java
================================================
package top.huic.tencent_im_plugin.entity;

import com.tencent.imsdk.v2.V2TIMConversation;
import com.tencent.imsdk.v2.V2TIMConversationResult;

import java.util.ArrayList;
import java.util.List;

import top.huic.tencent_im_plugin.util.BeanUtils;

/**
 * 自定义会话结果实体
 */
public class CustomConversationResultEntity {

    /**
     * 下一次分页拉取的游标
     */
    private Long nextSeq;

    /**
     * 会话列表是否已经拉取完毕
     */
    private Boolean finished;

    /**
     * 会话列表
     */
    private List<CustomConversationEntity> conversationList;

    public CustomConversationResultEntity() {
    }

    public CustomConversationResultEntity(V2TIMConversationResult data) {
        BeanUtils.copyProperties(data, this, "conversationList");

        if (data.getConversationList() != null) {
            List<CustomConversationEntity> conversationList = new ArrayList<>(data.getConversationList().size());
            for (V2TIMConversation item : data.getConversationList()) {
                conversationList.add(new CustomConversationEntity(item));
            }
            this.conversationList = conversationList;
        }
    }

    public Long getNextSeq() {
        return nextSeq;
    }

    public void setNextSeq(Long nextSeq) {
        this.nextSeq = nextSeq;
    }

    public Boolean getFinished() {
        return finished;
    }

    public void setFinished(Boolean finished) {
        this.finished = finished;
    }

    public List<CustomConversationEntity> getConversationList() {
        return conversationList;
    }

    public void setConversationList(List<CustomConversationEntity> conversationList) {
        this.conversationList = conversationList;
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/entity/CustomFriendAddApplication.java
================================================
package top.huic.tencent_im_plugin.entity;

import com.tencent.imsdk.v2.V2TIMFriendAddApplication;

/**
 * 自定义好友添加申请实体
 */
public class CustomFriendAddApplication extends V2TIMFriendAddApplication {
    public CustomFriendAddApplication() {
        super(null);
    }

    public CustomFriendAddApplication(String userID) {
        super(userID);
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/entity/CustomMessageEntity.java
================================================
package top.huic.tencent_im_plugin.entity;

import com.tencent.imsdk.v2.V2TIMElem;
import com.tencent.imsdk.v2.V2TIMMessage;
import com.tencent.imsdk.v2.V2TIMOfflinePushInfo;

import java.io.Serializable;
import java.util.List;

import top.huic.tencent_im_plugin.enums.MessageNodeType;
import top.huic.tencent_im_plugin.message.AbstractMessageNode;
import top.huic.tencent_im_plugin.message.entity.AbstractMessageEntity;
import top.huic.tencent_im_plugin.util.BeanUtils;

/**
 * 自定义消息实体
 *
 * @author 蒋具宏
 */
public class CustomMessageEntity implements Serializable {

    /**
     * 消息 ID
     */
    private String msgID;

    /**
     * 消息时间戳
     */
    private Long timestamp;

    /**
     * 消息发送者 userID
     */
    private String sender;

    /**
     * 消息发送者昵称
     */
    private String nickName;

    /**
     * 好友备注。如果没有拉取过好友信息或者不是好友,返回 null
     */
    private String friendRemark;

    /**
     * 发送者头像 url
     */
    private String faceUrl;

    /**
     * 群组消息,nameCard 为发送者的群名片
     */
    private String nameCard;

    /**
     * 群组消息,groupID 为接收消息的群组 ID,否则为 null
     */
    private String groupID;

    /**
     * 单聊消息,userID 为会话用户 ID,否则为 null。 假设自己和 userA 聊天,无论是自己发给 userA 的消息还是 userA 发给自己的消息,这里的 userID 均为 userA
     */
    private String userID;

    /**
     * 消息发送状态
     */
    private Integer status;

    /**
     * 消息类型
     */
    private Integer elemType;

    /**
     * 消息自定义数据(本地保存,不会发送到对端,程序卸载重装后失效)
     */
    private String localCustomData;

    /**
     * 消息自定义数据(本地保存,不会发送到对端,程序卸载重装后失效)
     */
    private Integer localCustomInt;

    /**
     * 消息发送者是否是自己
     */
    private Boolean self;

    /**
     * 消息自己是否已读
     */
    private Boolean read;

    /**
     * 消息对方是否已读(只有 C2C 消息有效)
     */
    private Boolean peerRead;

    /**
     * 消息优先级
     */
    private Integer priority;

    /**
     * 消息的离线推送信息
     */
    private V2TIMOfflinePushInfo offlinePushInfo;

    /**
     * 群@用户列表
     */
    private List<String> groupAtUserList;

    /**
     * 消息的序列号
     * 群聊中的消息序列号云端生成,在群里是严格递增且唯一的。 单聊中的序列号是本地生成,不能保证严格递增且唯一。
     */
    private Long seq;

    /**
     * 描述信息
     */
    private String note;

    /**
     * 节点信息
     */
    private AbstractMessageEntity node;

    /**
     * 消息随机码
     */
    private long random;

    public CustomMessageEntity() {
    }

    public CustomMessageEntity(V2TIMMessage message) {
        BeanUtils.copyProperties(message, this);

        // 解析接口
        MessageNodeType nodeType = MessageNodeType.getMessageNodeTypeByV2TIMConstant(this.elemType);
        if (nodeType != MessageNodeType.None) {
            AbstractMessageNode _node = nodeType.getMessageNodeInterface();
            V2TIMElem elem = nodeType.getElemByMessage(message);
            this.note = _node.getNote(elem);
            this.node = _node.analysis(elem);
        }
    }

    public String getMsgID() {
        return msgID;
    }

    public void setMsgID(String msgID) {
        this.msgID = msgID;
    }

    public Long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
    }

    public String getSender() {
        return sender;
    }

    public void setSender(String sender) {
        this.sender = sender;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getFriendRemark() {
        return friendRemark;
    }

    public void setFriendRemark(String friendRemark) {
        this.friendRemark = friendRemark;
    }

    public String getFaceUrl() {
        return faceUrl;
    }

    public void setFaceUrl(String faceUrl) {
        this.faceUrl = faceUrl;
    }

    public String getNameCard() {
        return nameCard;
    }

    public void setNameCard(String nameCard) {
        this.nameCard = nameCard;
    }

    public String getGroupID() {
        return groupID;
    }

    public void setGroupID(String groupID) {
        this.groupID = groupID;
    }

    public String getUserID() {
        return userID;
    }

    public void setUserID(String userID) {
        this.userID = userID;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Integer getElemType() {
        return elemType;
    }

    public void setElemType(Integer elemType) {
        this.elemType = elemType;
    }

    public String getLocalCustomData() {
        return localCustomData;
    }

    public void setLocalCustomData(String localCustomData) {
        this.localCustomData = localCustomData;
    }

    public Integer getLocalCustomInt() {
        return localCustomInt;
    }

    public void setLocalCustomInt(Integer localCustomInt) {
        this.localCustomInt = localCustomInt;
    }

    public Boolean getSelf() {
        return self;
    }

    public void setSelf(Boolean self) {
        this.self = self;
    }

    public Boolean getRead() {
        return read;
    }

    public void setRead(Boolean read) {
        this.read = read;
    }

    public Boolean getPeerRead() {
        return peerRead;
    }

    public void setPeerRead(Boolean peerRead) {
        this.peerRead = peerRead;
    }

    public Integer getPriority() {
        return priority;
    }

    public void setPriority(Integer priority) {
        this.priority = priority;
    }

    public V2TIMOfflinePushInfo getOfflinePushInfo() {
        return offlinePushInfo;
    }

    public void setOfflinePushInfo(V2TIMOfflinePushInfo offlinePushInfo) {
        this.offlinePushInfo = offlinePushInfo;
    }

    public List<String> getGroupAtUserList() {
        return groupAtUserList;
    }

    public void setGroupAtUserList(List<String> groupAtUserList) {
        this.groupAtUserList = groupAtUserList;
    }

    public Long getSeq() {
        return seq;
    }

    public void setSeq(Long seq) {
        this.seq = seq;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }

    public AbstractMessageEntity getNode() {
        return node;
    }

    public void setNode(AbstractMessageEntity node) {
        this.node = node;
    }

    public long getRandom() {
        return random;
    }

    public void setRandom(long random) {
        this.random = random;
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/entity/FindFriendApplicationEntity.java
================================================
package top.huic.tencent_im_plugin.entity;

/**
 * 查找好友申请实体
 */
public class FindFriendApplicationEntity {
    /**
     * 用户ID
     */
    String userID;

    /**
     * 类型
     */
    int type;

    public String getUserID() {
        return userID;
    }

    public void setUserID(String userID) {
        this.userID = userID;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/entity/FindGroupApplicationEntity.java
================================================
package top.huic.tencent_im_plugin.entity;

/**
 * 查找群申请实体
 */
public class FindGroupApplicationEntity {
    /**
     * 来自用户
     */
    String fromUser;

    /**
     * 群ID
     */
    String groupID;

    public String getFromUser() {
        return fromUser;
    }

    public void setFromUser(String fromUser) {
        this.fromUser = fromUser;
    }

    public String getGroupID() {
        return groupID;
    }

    public void setGroupID(String groupID) {
        this.groupID = groupID;
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/entity/FindMessageEntity.java
================================================
package top.huic.tencent_im_plugin.entity;

/**
 * 查找消息实体
 */
public class FindMessageEntity {
    /**
     * 消息ID
     */
    private String msgId;

    public FindMessageEntity() {
    }

    public FindMessageEntity(String msgId) {
        this.msgId = msgId;
    }

    public String getMsgId() {
        return msgId;
    }

    public void setMsgId(String msgId) {
        this.msgId = msgId;
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/enums/ListenerTypeEnum.java
================================================
package top.huic.tencent_im_plugin.enums;

/**
 * 监听器类型枚举
 */
public enum ListenerTypeEnum {

    /**
     * 新消息通知
     */
    NewMessage,

    /**
     * C2C已读回执
     */
    C2CReadReceipt,

    /**
     * 消息撤回
     */
    MessageRevoked,

    /**
     * 同步服务开始
     */
    SyncServerStart,

    /**
     * 同步服务完成
     */
    SyncServerFinish,

    /**
     * 同步服务失败
     */
    SyncServerFailed,

    /**
     * 新会话
     */
    NewConversation,

    /**
     * 会话刷新
     */
    ConversationChanged,

    /**
     * 好友申请新增通知
     */
    FriendApplicationListAdded,

    /**
     * 好友申请删除通知
     */
    FriendApplicationListDeleted,

    /**
     * 好友申请已读通知
     */
    FriendApplicationListRead,

    /**
     * 好友新增通知
     */
    FriendListAdded,

    /**
     * 好友删除通知
     */
    FriendListDeleted,

    /**
     * 黑名单新增通知
     */
    BlackListAdd,

    /**
     * 黑名单删除通知
     */
    BlackListDeleted,

    /**
     * 好友资料更新通知
     */
    FriendInfoChanged,

    /**
     * 有用户加入群
     */
    MemberEnter,

    /**
     * 有用户离开群
     */
    MemberLeave,

    /**
     * 有用户被拉入群
     */
    MemberInvited,

    /**
     * 有用户被踢出群
     */
    MemberKicked,

    /**
     * 群成员信息被修改
     */
    MemberInfoChanged,

    /**
     * 创建群
     */
    GroupCreated,

    /**
     * 群被解散
     */
    GroupDismissed,

    /**
     * 群被回收
     */
    GroupRecycled,

    /**
     * 群信息被修改
     */
    GroupInfoChanged,

    /**
     * 有新的加群申请
     */
    ReceiveJoinApplication,

    /**
     * 加群信息已被管理员处理
     */
    ApplicationProcessed,

    /**
     * 指定管理员身份
     */
    GrantAdministrator,

    /**
     * 取消管理员身份
     */
    RevokeAdministrator,

    /**
     * 主动退出群组
     */
    QuitFromGroup,

    /**
     * 收到 RESTAPI 下发的自定义系统消息
     */
    ReceiveRESTCustomData,

    /**
     * 收到群属性更新的回调
     */
    GroupAttributeChanged,

    /**
     * 正在连接到腾讯云服务器
     */
    Connecting,

    /**
     * 网络连接成功
     */
    ConnectSuccess,

    /**
     * 网络连接失败
     */
    ConnectFailed,

    /**
     * 踢下线
     */
    KickedOffline,

    /**
     * 当前用户的资料发生了更新
     */
    SelfInfoUpdated,

    /**
     * 用户登录的 userSig 过期(用户需要重新获取 userSig 后登录)
     */
    UserSigExpired,

    /**
     * 收到信令邀请
     */
    ReceiveNewInvitation,

    /**
     * 信令被邀请者接受邀请
     */
    InviteeAccepted,

    /**
     * 信令被邀请者拒绝邀请
     */
    InviteeRejected,

    /**
     * 信令邀请被取消
     */
    InvitationCancelled,

    /**
     * 信令邀请超时
     */
    InvitationTimeout,

    /**
     * 下载进度
     */
    DownloadProgress,

    /**
     * 消息发送成功
     */
    MessageSendSucc,

    /**
     * 消息发送失败
     */
    MessageSendFail,

    /**
     * 消息发送进度更新
     */
    MessageSendProgress,
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/enums/MessageNodeType.java
================================================
package top.huic.tencent_im_plugin.enums;

import com.tencent.imsdk.v2.V2TIMElem;
import com.tencent.imsdk.v2.V2TIMMessage;

import top.huic.tencent_im_plugin.message.AbstractMessageNode;
import top.huic.tencent_im_plugin.message.CustomMessageNode;
import top.huic.tencent_im_plugin.message.FaceMessageNode;
import top.huic.tencent_im_plugin.message.FileMessageNode;
import top.huic.tencent_im_plugin.message.GroupTipsMessageNode;
import top.huic.tencent_im_plugin.message.ImageMessageNode;
import top.huic.tencent_im_plugin.message.LocationMessageNode;
import top.huic.tencent_im_plugin.message.SoundMessageNode;
import top.huic.tencent_im_plugin.message.TextMessageNode;
import top.huic.tencent_im_plugin.message.VideoMessageNode;

/**
 * 消息节点类型
 *
 * @author 蒋具宏
 */
public enum MessageNodeType {
    /**
     * 没有元素
     */
    None(null) {
        @Override
        public V2TIMElem getElemByMessage(V2TIMMessage message) {
            return null;
        }
    },

    /**
     * 文本
     */
    Text(new TextMessageNode()) {
        @Override
        public V2TIMElem getElemByMessage(V2TIMMessage message) {
            return message.getTextElem();
        }
    },

    /**
     * 自定义
     */
    Custom(new CustomMessageNode()) {
        @Override
        public V2TIMElem getElemByMessage(V2TIMMessage message) {
            return message.getCustomElem();
        }
    },

    /**
     * 图片
     */
    Image(new ImageMessageNode()) {
        @Override
        public V2TIMElem getElemByMessage(V2TIMMessage message) {
            return message.getImageElem();
        }
    },

    /**
     * 语音
     */
    Sound(new SoundMessageNode()) {
        @Override
        public V2TIMElem getElemByMessage(V2TIMMessage message) {
            return message.getSoundElem();
        }
    },

    /**
     * 视频
     */
    Video(new VideoMessageNode()) {
        @Override
        public V2TIMElem getElemByMessage(V2TIMMessage message) {
            return message.getVideoElem();
        }
    },

    /**
     * 文件
     */
    File(new FileMessageNode()) {
        @Override
        public V2TIMElem getElemByMessage(V2TIMMessage message) {
            return message.getFileElem();
        }
    },

    /**
     * 位置
     */
    Location(new LocationMessageNode()) {
        @Override
        public V2TIMElem getElemByMessage(V2TIMMessage message) {
            return message.getLocationElem();
        }
    },

    /**
     * 表情
     */
    Face(new FaceMessageNode()) {
        @Override
        public V2TIMElem getElemByMessage(V2TIMMessage message) {
            return message.getFaceElem();
        }
    },

    /**
     * 群提示
     */
    GroupTips(new GroupTipsMessageNode()) {
        @Override
        public V2TIMElem getElemByMessage(V2TIMMessage message) {
            return message.getGroupTipsElem();
        }
    };

    /**
     * 消息节点接口
     * 通过枚举的方法反向绑定接口,和业务强关联
     */
    private AbstractMessageNode messageNodeInterface;

    MessageNodeType(AbstractMessageNode messageNodeInterface) {
        this.messageNodeInterface = messageNodeInterface;
    }

    /**
     * 获得消息节点接口
     */
    public AbstractMessageNode getMessageNodeInterface() {
        return messageNodeInterface;
    }

    /**
     * 根据Message获得节点信息
     *
     * @param message 消息对象
     * @return 节点对象
     */
    public abstract V2TIMElem getElemByMessage(V2TIMMessage message);

    /**
     * 根据TIM V2版本的常量进行获取
     *
     * @param constant 常量值
     * @return 结果
     */
    public static MessageNodeType getMessageNodeTypeByV2TIMConstant(int constant) {
        return MessageNodeType.values()[constant];
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/listener/CustomAdvancedMsgListener.java
================================================
package top.huic.tencent_im_plugin.listener;

import com.tencent.imsdk.v2.V2TIMAdvancedMsgListener;
import com.tencent.imsdk.v2.V2TIMMessage;
import com.tencent.imsdk.v2.V2TIMMessageReceipt;

import java.util.List;

import top.huic.tencent_im_plugin.TencentImPlugin;
import top.huic.tencent_im_plugin.entity.CustomMessageEntity;
import top.huic.tencent_im_plugin.enums.ListenerTypeEnum;

/**
 * 消息相关监听器
 */
public class CustomAdvancedMsgListener extends V2TIMAdvancedMsgListener {
    /**
     * 新消息通知
     */
    @Override
    public void onRecvNewMessage(V2TIMMessage msg) {
        super.onRecvNewMessage(msg);
        TencentImPlugin.invokeListener(ListenerTypeEnum.NewMessage, new CustomMessageEntity(msg));
    }

    /**
     * C2C已读回执
     */
    @Override
    public void onRecvC2CReadReceipt(List<V2TIMMessageReceipt> receiptList) {
        super.onRecvC2CReadReceipt(receiptList);
        TencentImPlugin.invokeListener(ListenerTypeEnum.C2CReadReceipt, receiptList);
    }

    /**
     * 消息撤回
     */
    @Override
    public void onRecvMessageRevoked(String msgID) {
        super.onRecvMessageRevoked(msgID);
        TencentImPlugin.invokeListener(ListenerTypeEnum.MessageRevoked, msgID);
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/listener/CustomConversationListener.java
================================================
package top.huic.tencent_im_plugin.listener;

import com.tencent.imsdk.v2.V2TIMConversation;
import com.tencent.imsdk.v2.V2TIMConversationListener;

import java.util.ArrayList;
import java.util.List;

import top.huic.tencent_im_plugin.TencentImPlugin;
import top.huic.tencent_im_plugin.entity.CustomConversationEntity;
import top.huic.tencent_im_plugin.enums.ListenerTypeEnum;

/**
 * 自定义会话监听
 */
public class CustomConversationListener extends V2TIMConversationListener {
    /**
     * 同步服务开始
     */
    @Override
    public void onSyncServerStart() {
        super.onSyncServerStart();
        TencentImPlugin.invokeListener(ListenerTypeEnum.SyncServerStart, null);
    }

    /**
     * 同步服务完成
     */
    @Override
    public void onSyncServerFinish() {
        super.onSyncServerFinish();
        TencentImPlugin.invokeListener(ListenerTypeEnum.SyncServerFinish, null);
    }

    /**
     * 同步服务失败
     */
    @Override
    public void onSyncServerFailed() {
        super.onSyncServerFailed();
        TencentImPlugin.invokeListener(ListenerTypeEnum.SyncServerFailed, null);
    }

    /**
     * 新会话
     */
    @Override
    public void onNewConversation(List<V2TIMConversation> conversationList) {
        super.onNewConversation(conversationList);
        List<CustomConversationEntity> data = new ArrayList<>(conversationList.size());
        for (V2TIMConversation v2TIMConversation : conversationList) {
            data.add(new CustomConversationEntity(v2TIMConversation));
        }
        TencentImPlugin.invokeListener(ListenerTypeEnum.NewConversation, data);
    }

    /**
     * 会话刷新
     */
    @Override
    public void onConversationChanged(List<V2TIMConversation> conversationList) {
        super.onConversationChanged(conversationList);
        List<CustomConversationEntity> data = new ArrayList<>(conversationList.size());
        for (V2TIMConversation v2TIMConversation : conversationList) {
            data.add(new CustomConversationEntity(v2TIMConversation));
        }
        TencentImPlugin.invokeListener(ListenerTypeEnum.ConversationChanged, data);
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/listener/CustomFriendshipListener.java
================================================
package top.huic.tencent_im_plugin.listener;

import com.tencent.imsdk.v2.V2TIMFriendApplication;
import com.tencent.imsdk.v2.V2TIMFriendInfo;
import com.tencent.imsdk.v2.V2TIMFriendshipListener;

import java.util.List;

import top.huic.tencent_im_plugin.TencentImPlugin;
import top.huic.tencent_im_plugin.enums.ListenerTypeEnum;

/**
 * 自定义关系链监听器
 */
public class CustomFriendshipListener extends V2TIMFriendshipListener {
    /**
     * 好友申请新增通知,两种情况会收到这个回调:
     * <p>
     * 自己申请加别人好友
     * 别人申请加自己好友
     */
    @Override
    public void onFriendApplicationListAdded(List<V2TIMFriendApplication> applicationList) {
        super.onFriendApplicationListAdded(applicationList);
        TencentImPlugin.invokeListener(ListenerTypeEnum.FriendApplicationListAdded, applicationList);
    }

    /**
     * 好友申请删除通知,四种情况会收到这个回调
     * <p>
     * 调用 deleteFriendApplication 主动删除好友申请
     * 调用 refuseFriendApplication 拒绝好友申请
     * 调用 acceptFriendApplication 同意好友申请且同意类型为 V2TIM_FRIEND_ACCEPT_AGREE 时
     * 申请加别人好友被拒绝
     */
    @Override
    public void onFriendApplicationListDeleted(List<String> userIDList) {
        super.onFriendApplicationListDeleted(userIDList);
        TencentImPlugin.invokeListener(ListenerTypeEnum.FriendApplicationListDeleted, userIDList);
    }

    /**
     * 好友申请已读通知,如果调用 setFriendApplicationRead 设置好友申请列表已读,会收到这个回调(主要用于多端同步)
     */
    @Override
    public void onFriendApplicationListRead() {
        super.onFriendApplicationListRead();
        TencentImPlugin.invokeListener(ListenerTypeEnum.FriendApplicationListRead, null);
    }

    /**
     * 好友新增通知
     */
    @Override
    public void onFriendListAdded(List<V2TIMFriendInfo> users) {
        super.onFriendListAdded(users);
        TencentImPlugin.invokeListener(ListenerTypeEnum.FriendListAdded, users);
    }

    /**
     * 好友删除通知,,两种情况会收到这个回调:
     * <p>
     * 自己删除好友(单向和双向删除都会收到回调)
     * 好友把自己删除(双向删除会收到)
     */
    @Override
    public void onFriendListDeleted(List<String> userList) {
        super.onFriendListDeleted(userList);
        TencentImPlugin.invokeListener(ListenerTypeEnum.FriendListDeleted, userList);
    }

    /**
     * 黑名单新增通知
     */
    @Override
    public void onBlackListAdd(List<V2TIMFriendInfo> infoList) {
        super.onBlackListAdd(infoList);
        TencentImPlugin.invokeListener(ListenerTypeEnum.BlackListAdd, infoList);
    }

    /**
     * 黑名单删除通知
     */
    @Override
    public void onBlackListDeleted(List<String> userList) {
        super.onBlackListDeleted(userList);
        TencentImPlugin.invokeListener(ListenerTypeEnum.BlackListDeleted, userList);
    }

    /**
     * 好友资料更新通知
     */
    @Override
    public void onFriendInfoChanged(List<V2TIMFriendInfo> infoList) {
        super.onFriendInfoChanged(infoList);
        TencentImPlugin.invokeListener(ListenerTypeEnum.FriendInfoChanged, infoList);
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/listener/CustomGroupListener.java
================================================
package top.huic.tencent_im_plugin.listener;

import com.tencent.imsdk.v2.V2TIMGroupChangeInfo;
import com.tencent.imsdk.v2.V2TIMGroupListener;
import com.tencent.imsdk.v2.V2TIMGroupMemberChangeInfo;
import com.tencent.imsdk.v2.V2TIMGroupMemberInfo;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import top.huic.tencent_im_plugin.TencentImPlugin;
import top.huic.tencent_im_plugin.enums.ListenerTypeEnum;

/**
 * 自定义群监听
 */
public class CustomGroupListener extends V2TIMGroupListener {
    /**
     * 有用户加入群(全员能够收到)
     */
    @Override
    public void onMemberEnter(final String groupID, final List<V2TIMGroupMemberInfo> memberList) {
        super.onMemberEnter(groupID, memberList);
        TencentImPlugin.invokeListener(ListenerTypeEnum.MemberEnter, new HashMap<String, Object>() {
            {
                put("groupID", groupID);
                put("memberList", memberList);
            }
        });
    }

    /**
     * 有用户离开群(全员能够收到)
     */
    @Override
    public void onMemberLeave(final String groupID, final V2TIMGroupMemberInfo member) {
        super.onMemberLeave(groupID, member);
        TencentImPlugin.invokeListener(ListenerTypeEnum.MemberLeave, new HashMap<String, Object>() {
            {
                put("groupID", groupID);
                put("member", member);
            }
        });
    }

    /**
     * 某些人被拉入某群(全员能够收到)
     */
    @Override
    public void onMemberInvited(final String groupID, final V2TIMGroupMemberInfo opUser, final List<V2TIMGroupMemberInfo> memberList) {
        super.onMemberInvited(groupID, opUser, memberList);
        TencentImPlugin.invokeListener(ListenerTypeEnum.MemberInvited, new HashMap<String, Object>() {
            {
                put("groupID", groupID);
                put("opUser", opUser);
                put("memberList", memberList);
            }
        });
    }

    /**
     * 某些人被踢出某群(全员能够收到)
     */
    @Override
    public void onMemberKicked(final String groupID, final V2TIMGroupMemberInfo opUser, final List<V2TIMGroupMemberInfo> memberList) {
        super.onMemberKicked(groupID, opUser, memberList);
        TencentImPlugin.invokeListener(ListenerTypeEnum.MemberKicked, new HashMap<String, Object>() {
            {
                put("groupID", groupID);
                put("opUser", opUser);
                put("memberList", memberList);
            }
        });
    }

    /**
     * 群成员信息被修改(全员能收到)
     */
    @Override
    public void onMemberInfoChanged(final String groupID, final List<V2TIMGroupMemberChangeInfo> v2TIMGroupMemberChangeInfoList) {
        super.onMemberInfoChanged(groupID, v2TIMGroupMemberChangeInfoList);
        TencentImPlugin.invokeListener(ListenerTypeEnum.MemberInfoChanged, new HashMap<String, Object>() {
            {
                put("groupID", groupID);
                put("changInfo", v2TIMGroupMemberChangeInfoList);
            }
        });
    }

    /**
     * 创建群(主要用于多端同步)
     */
    @Override
    public void onGroupCreated(String groupID) {
        super.onGroupCreated(groupID);
        TencentImPlugin.invokeListener(ListenerTypeEnum.GroupCreated, groupID);
    }

    /**
     * 群被解散了(全员能收到)
     */
    @Override
    public void onGroupDismissed(final String groupID, final V2TIMGroupMemberInfo opUser) {
        super.onGroupDismissed(groupID, opUser);
        TencentImPlugin.invokeListener(ListenerTypeEnum.GroupDismissed, new HashMap<String, Object>() {
            {
                put("groupID", groupID);
                put("opUser", opUser);
            }
        });
    }

    /**
     * 群被回收(全员能收到)
     */
    @Override
    public void onGroupRecycled(final String groupID, final V2TIMGroupMemberInfo opUser) {
        super.onGroupRecycled(groupID, opUser);
        TencentImPlugin.invokeListener(ListenerTypeEnum.GroupRecycled, new HashMap<String, Object>() {
            {
                put("groupID", groupID);
                put("opUser", opUser);
            }
        });
    }

    /**
     * 群信息被修改(全员能收到)
     */
    @Override
    public void onGroupInfoChanged(final String groupID, final List<V2TIMGroupChangeInfo> changeInfos) {
        super.onGroupInfoChanged(groupID, changeInfos);
        TencentImPlugin.invokeListener(ListenerTypeEnum.GroupInfoChanged, new HashMap<String, Object>() {
            {
                put("groupID", groupID);
                put("changInfo", changeInfos);
            }
        });
    }

    /**
     * 有新的加群请求(只有群主或管理员会收到)
     */
    @Override
    public void onReceiveJoinApplication(final String groupID, final V2TIMGroupMemberInfo member, final String opReason) {
        super.onReceiveJoinApplication(groupID, member, opReason);
        TencentImPlugin.invokeListener(ListenerTypeEnum.ReceiveJoinApplication, new HashMap<String, Object>() {
            {
                put("groupID", groupID);
                put("member", member);
                put("opReason", opReason);
            }
        });
    }

    /**
     * 加群请求已经被群主或管理员处理了(只有申请人能够收到)
     */
    @Override
    public void onApplicationProcessed(final String groupID, final V2TIMGroupMemberInfo opUser, final boolean isAgreeJoin, final String opReason) {
        super.onApplicationProcessed(groupID, opUser, isAgreeJoin, opReason);
        TencentImPlugin.invokeListener(ListenerTypeEnum.ApplicationProcessed, new HashMap<String, Object>() {
            {
                put("groupID", groupID);
                put("opUser", opUser);
                put("isAgreeJoin", isAgreeJoin);
                put("opReason", opReason);
            }
        });
    }

    /**
     * 指定管理员身份
     */
    @Override
    public void onGrantAdministrator(final String groupID, final V2TIMGroupMemberInfo opUser, final List<V2TIMGroupMemberInfo> memberList) {
        super.onGrantAdministrator(groupID, opUser, memberList);
        TencentImPlugin.invokeListener(ListenerTypeEnum.GrantAdministrator, new HashMap<String, Object>() {
            {
                put("groupID", groupID);
                put("opUser", opUser);
                put("memberList", memberList);
            }
        });
    }

    /**
     * 取消管理员身份
     */
    @Override
    public void onRevokeAdministrator(final String groupID, final V2TIMGroupMemberInfo opUser, final List<V2TIMGroupMemberInfo> memberList) {
        super.onRevokeAdministrator(groupID, opUser, memberList);
        TencentImPlugin.invokeListener(ListenerTypeEnum.RevokeAdministrator, new HashMap<String, Object>() {
            {
                put("groupID", groupID);
                put("opUser", opUser);
                put("memberList", memberList);
            }
        });
    }

    /**
     * 主动退出群组(主要用于多端同步,直播群(AVChatRoom)不支持)
     */
    @Override
    public void onQuitFromGroup(String groupID) {
        super.onQuitFromGroup(groupID);
        TencentImPlugin.invokeListener(ListenerTypeEnum.QuitFromGroup, groupID);
    }

    /**
     * 收到 RESTAPI 下发的自定义系统消息
     */
    @Override
    public void onReceiveRESTCustomData(final String groupID, final byte[] customData) {
        super.onReceiveRESTCustomData(groupID, customData);
        TencentImPlugin.invokeListener(ListenerTypeEnum.ReceiveRESTCustomData, new HashMap<String, Object>() {
            {
                put("groupID", groupID);
                put("customData", new String(customData));
            }
        });
    }

    /**
     * 收到群属性更新的回调
     */
    @Override
    public void onGroupAttributeChanged(final String groupID, final Map<String, String> groupAttributeMap) {
        super.onGroupAttributeChanged(groupID, groupAttributeMap);
        TencentImPlugin.invokeListener(ListenerTypeEnum.GroupAttributeChanged, new HashMap<String, Object>() {
            {
                put("groupID", groupID);
                put("attributes", groupAttributeMap);
            }
        });
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/listener/CustomSDKListener.java
================================================
package top.huic.tencent_im_plugin.listener;

import com.tencent.imsdk.v2.V2TIMSDKListener;
import com.tencent.imsdk.v2.V2TIMUserFullInfo;

import java.util.HashMap;

import top.huic.tencent_im_plugin.TencentImPlugin;
import top.huic.tencent_im_plugin.enums.ListenerTypeEnum;

/**
 * SDK基本监听器
 */
public class CustomSDKListener extends V2TIMSDKListener {
    /**
     * 正在连接到腾讯云服务器
     */
    @Override
    public void onConnecting() {
        super.onConnecting();
        TencentImPlugin.invokeListener(ListenerTypeEnum.Connecting, null);
    }

    /**
     * 网络连接成功
     */
    @Override
    public void onConnectSuccess() {
        super.onConnectSuccess();
        TencentImPlugin.invokeListener(ListenerTypeEnum.ConnectSuccess, null);
    }

    /**
     * 网络连接失败
     */
    @Override
    public void onConnectFailed(final int code, final String error) {
        super.onConnectFailed(code, error);
        TencentImPlugin.invokeListener(ListenerTypeEnum.ConnectFailed, new HashMap<String, Object>() {
            {
                put("code", code);
                put("error", error);
            }
        });
    }

    /**
     * 踢下线通知
     */
    @Override
    public void onKickedOffline() {
        super.onKickedOffline();
        TencentImPlugin.invokeListener(ListenerTypeEnum.KickedOffline, null);
    }

    /**
     * 当前用户的资料发生了更新
     */
    @Override
    public void onSelfInfoUpdated(V2TIMUserFullInfo info) {
        super.onSelfInfoUpdated(info);
        TencentImPlugin.invokeListener(ListenerTypeEnum.SelfInfoUpdated, info);
    }

    /**
     * 用户登录的 userSig 过期(用户需要重新获取 userSig 后登录)
     */
    @Override
    public void onUserSigExpired() {
        super.onUserSigExpired();
        TencentImPlugin.invokeListener(ListenerTypeEnum.UserSigExpired, null);
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/listener/CustomSignalingListener.java
================================================
package top.huic.tencent_im_plugin.listener;

import com.tencent.imsdk.v2.V2TIMSignalingListener;

import java.util.HashMap;
import java.util.List;

import top.huic.tencent_im_plugin.TencentImPlugin;
import top.huic.tencent_im_plugin.enums.ListenerTypeEnum;

/**
 * 自定义信令监听器
 */
public class CustomSignalingListener extends V2TIMSignalingListener {
    /**
     * 收到新邀请时
     */
    @Override
    public void onReceiveNewInvitation(final String inviteID, final String inviter, final String groupID, final List<String> inviteeList, final String data) {
        super.onReceiveNewInvitation(inviteID, inviter, groupID, inviteeList, data);
        TencentImPlugin.invokeListener(ListenerTypeEnum.ReceiveNewInvitation, new HashMap<String, Object>() {
            {
                put("inviteID", inviteID);
                put("inviter", inviter);
                put("groupID", groupID);
                put("inviteeList", inviteeList);
                put("data", data);
            }
        });
    }

    /**
     * 被邀请者接受邀请
     */
    @Override
    public void onInviteeAccepted(final String inviteID, final String invitee, final String data) {
        super.onInviteeAccepted(inviteID, invitee, data);
        TencentImPlugin.invokeListener(ListenerTypeEnum.InviteeAccepted, new HashMap<String, Object>() {
            {
                put("inviteID", inviteID);
                put("invitee", invitee);
                put("data", data);
            }
        });
    }

    /**
     * 被邀请者拒绝邀请
     */
    @Override
    public void onInviteeRejected(final String inviteID, final String invitee, final String data) {
        super.onInviteeRejected(inviteID, invitee, data);
        TencentImPlugin.invokeListener(ListenerTypeEnum.InviteeRejected, new HashMap<String, Object>() {
            {
                put("inviteID", inviteID);
                put("invitee", invitee);
                put("data", data);
            }
        });
    }

    /**
     * 邀请被取消
     */
    @Override
    public void onInvitationCancelled(final String inviteID, final String inviter, final String data) {
        super.onInvitationCancelled(inviteID, inviter, data);
        TencentImPlugin.invokeListener(ListenerTypeEnum.InvitationCancelled, new HashMap<String, Object>() {
            {
                put("inviteID", inviteID);
                put("inviter", inviter);
                put("data", data);
            }
        });
    }

    /**
     * 邀请超时
     */
    @Override
    public void onInvitationTimeout(final String inviteID, final List<String> inviteeList) {
        super.onInvitationTimeout(inviteID, inviteeList);
        TencentImPlugin.invokeListener(ListenerTypeEnum.InvitationTimeout, new HashMap<String, Object>() {
            {
                put("inviteID", inviteID);
                put("inviteeList", inviteeList);
            }
        });
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/AbstractMessageNode.java
================================================
package top.huic.tencent_im_plugin.message;

import com.tencent.imsdk.v2.V2TIMMessage;

import top.huic.tencent_im_plugin.message.entity.AbstractMessageEntity;

/**
 * 消息节点接口
 *
 * @param <N> 节点类型,对应腾讯云 TIMElem
 */
public abstract class AbstractMessageNode<N, E extends AbstractMessageEntity> {
    /**
     * 获得发送的消息体
     *
     * @param entity 消息实体
     * @return 结果
     */
    public V2TIMMessage getV2TIMMessage(E entity) {
        throw new RuntimeException("This node does not support sending");
    }

    /**
     * 根据消息节点获得描述
     *
     * @param elem 节点
     */
    public abstract String getNote(N elem);

    /**
     * 将节点解析为实体对象
     *
     * @param elem 节点
     * @return 实体对象
     */
    public abstract E analysis(N elem);

    /**
     * 获得实体类型
     *
     * @return 类型
     */
    public abstract Class<E> getEntityClass();
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/CustomMessageNode.java
================================================
package top.huic.tencent_im_plugin.message;

import com.tencent.imsdk.v2.V2TIMCustomElem;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;

import top.huic.tencent_im_plugin.message.entity.CustomMessageEntity;

/**
 * 自定义消息节点
 */
public class CustomMessageNode extends AbstractMessageNode<V2TIMCustomElem, CustomMessageEntity> {

    @Override
    public V2TIMMessage getV2TIMMessage(CustomMessageEntity entity) {
        return V2TIMManager.getMessageManager().createCustomMessage(entity.getData().getBytes(), entity.getDesc(), entity.getExt() == null ? null : entity.getExt().getBytes());
    }

    @Override
    public String getNote(V2TIMCustomElem elem) {
        return "[其它消息]";
    }

    @Override
    public CustomMessageEntity analysis(V2TIMCustomElem elem) {
        return new CustomMessageEntity(elem);
    }

    @Override
    public Class<CustomMessageEntity> getEntityClass() {
        return CustomMessageEntity.class;
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/FaceMessageNode.java
================================================
package top.huic.tencent_im_plugin.message;

import com.tencent.imsdk.v2.V2TIMFaceElem;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;

import top.huic.tencent_im_plugin.message.entity.FaceMessageEntity;

/**
 * 表情消息节点
 */
public class FaceMessageNode extends AbstractMessageNode<V2TIMFaceElem, FaceMessageEntity> {

    @Override
    public V2TIMMessage getV2TIMMessage(FaceMessageEntity entity) {
        return V2TIMManager.getMessageManager().createFaceMessage(entity.getIndex(), entity.getData().getBytes());
    }

    @Override
    public String getNote(V2TIMFaceElem elem) {
        return "[表情]";
    }

    @Override
    public FaceMessageEntity analysis(V2TIMFaceElem elem) {
        return new FaceMessageEntity(elem);
    }

    @Override
    public Class<FaceMessageEntity> getEntityClass() {
        return FaceMessageEntity.class;
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/FileMessageNode.java
================================================
package top.huic.tencent_im_plugin.message;

import com.tencent.imsdk.v2.V2TIMFileElem;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;

import top.huic.tencent_im_plugin.message.entity.FileMessageEntity;

/**
 * 文件消息节点
 */
public class FileMessageNode extends AbstractMessageNode<V2TIMFileElem, FileMessageEntity> {
    @Override
    public V2TIMMessage getV2TIMMessage(FileMessageEntity entity) {
        return V2TIMManager.getMessageManager().createFileMessage(entity.getFilePath(), entity.getFileName());
    }

    @Override
    public String getNote(V2TIMFileElem elem) {
        return "[文件]";
    }

    @Override
    public FileMessageEntity analysis(V2TIMFileElem elem) {
        return new FileMessageEntity(elem);
    }

    @Override
    public Class<FileMessageEntity> getEntityClass() {
        return FileMessageEntity.class;
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/GroupTipsMessageNode.java
================================================
package top.huic.tencent_im_plugin.message;

import com.tencent.imsdk.v2.V2TIMGroupTipsElem;

import top.huic.tencent_im_plugin.message.entity.GroupTipsMessageEntity;

/**
 * 群提示消息节点
 */
public class GroupTipsMessageNode extends AbstractMessageNode<V2TIMGroupTipsElem, GroupTipsMessageEntity> {
    @Override
    public String getNote(V2TIMGroupTipsElem elem) {
        return "[群提示]";
    }

    @Override
    public GroupTipsMessageEntity analysis(V2TIMGroupTipsElem elem) {
        return new GroupTipsMessageEntity(elem);
    }

    @Override
    public Class<GroupTipsMessageEntity> getEntityClass() {
        return GroupTipsMessageEntity.class;
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/ImageMessageNode.java
================================================
package top.huic.tencent_im_plugin.message;

import com.tencent.imsdk.v2.V2TIMImageElem;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;

import top.huic.tencent_im_plugin.message.entity.ImageMessageEntity;

/**
 * 图片消息节点
 */
public class ImageMessageNode extends AbstractMessageNode<V2TIMImageElem, ImageMessageEntity> {
    @Override
    public V2TIMMessage getV2TIMMessage(ImageMessageEntity entity) {
        return V2TIMManager.getMessageManager().createImageMessage(entity.getPath());
    }

    @Override
    public String getNote(V2TIMImageElem elem) {
        return "[图片]";
    }

    @Override
    public ImageMessageEntity analysis(V2TIMImageElem elem) {
        ImageMessageEntity entity = new ImageMessageEntity();
        entity.setPath(elem.getPath());
        entity.setImageData(elem.getImageList());
        return entity;
    }

    @Override
    public Class<ImageMessageEntity> getEntityClass() {
        return ImageMessageEntity.class;
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/LocationMessageNode.java
================================================
package top.huic.tencent_im_plugin.message;

import com.tencent.imsdk.v2.V2TIMLocationElem;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;

import top.huic.tencent_im_plugin.message.entity.LocationMessageEntity;

/**
 * 位置消息节点
 */
public class LocationMessageNode extends AbstractMessageNode<V2TIMLocationElem, LocationMessageEntity> {
    @Override
    public V2TIMMessage getV2TIMMessage(LocationMessageEntity entity) {
        return V2TIMManager.getMessageManager().createLocationMessage(entity.getDesc(), entity.getLongitude(), entity.getLatitude());
    }

    @Override
    public String getNote(V2TIMLocationElem elem) {
        return "[位置消息]";
    }

    @Override
    public LocationMessageEntity analysis(V2TIMLocationElem elem) {
        return new LocationMessageEntity(elem);
    }

    @Override
    public Class<LocationMessageEntity> getEntityClass() {
        return LocationMessageEntity.class;
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/SoundMessageNode.java
================================================
package top.huic.tencent_im_plugin.message;

import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;
import com.tencent.imsdk.v2.V2TIMSoundElem;

import top.huic.tencent_im_plugin.message.entity.SoundMessageEntity;

/**
 * 语音消息节点
 */
public class SoundMessageNode extends AbstractMessageNode<V2TIMSoundElem, SoundMessageEntity> {

    @Override
    public V2TIMMessage getV2TIMMessage(SoundMessageEntity entity) {
        return V2TIMManager.getMessageManager().createSoundMessage(entity.getPath(), entity.getDuration());
    }

    @Override
    public String getNote(V2TIMSoundElem elem) {
        return "[语音]";
    }

    @Override
    public SoundMessageEntity analysis(V2TIMSoundElem elem) {
        return new SoundMessageEntity(elem);
    }

    @Override
    public Class<SoundMessageEntity> getEntityClass() {
        return SoundMessageEntity.class;
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/TextMessageNode.java
================================================
package top.huic.tencent_im_plugin.message;

import com.tencent.imsdk.v2.V2TIMGroupAtInfo;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;
import com.tencent.imsdk.v2.V2TIMTextElem;
import java.util.ArrayList;
import java.util.List;

import top.huic.tencent_im_plugin.message.entity.TextMessageEntity;

/**
 * 文本消息节点
 */
public class TextMessageNode extends AbstractMessageNode<V2TIMTextElem, TextMessageEntity> {
    @Override
    public V2TIMMessage getV2TIMMessage(TextMessageEntity entity) {

        // 有@用户或者@所有人则进入分支
        if ((entity.getAtUserList() != null && entity.getAtUserList().size() >= 1) || (entity.getAtAll() != null && entity.getAtAll())) {
            List<String> atList = new ArrayList<>();
            // @所有人
            if (entity.getAtAll() != null && entity.getAtAll()) {
                atList.add(V2TIMGroupAtInfo.AT_ALL_TAG);
            }

            // @目标用户
            if (entity.getAtUserList() != null) {
                atList.addAll(entity.getAtUserList());
            }
            return V2TIMManager.getMessageManager().createTextAtMessage(entity.getContent(), atList);
        }
        return V2TIMManager.getMessageManager().createTextMessage(entity.getContent());
    }

    @Override
    public String getNote(V2TIMTextElem elem) {
        return elem.getText();
    }

    @Override
    public TextMessageEntity analysis(V2TIMTextElem elem) {
        return new TextMessageEntity(elem);
    }

    @Override
    public Class<TextMessageEntity> getEntityClass() {
        return TextMessageEntity.class;
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/VideoMessageNode.java
================================================
package top.huic.tencent_im_plugin.message;

import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;
import com.tencent.imsdk.v2.V2TIMVideoElem;

import top.huic.tencent_im_plugin.message.entity.VideoMessageEntity;

/**
 * 视频消息节点
 */
public class VideoMessageNode extends AbstractMessageNode<V2TIMVideoElem, VideoMessageEntity> {
    @Override
    public V2TIMMessage getV2TIMMessage(VideoMessageEntity entity) {
        String suffix = null;
        if (entity.getVideoPath().contains(".")) {
            String[] ss = entity.getVideoPath().split("\\.");
            suffix = ss[ss.length - 1];
        }
        return V2TIMManager.getMessageManager().createVideoMessage(entity.getVideoPath(), suffix, entity.getDuration(), entity.getSnapshotPath());
    }

    @Override
    public String getNote(V2TIMVideoElem elem) {
        return "[视频]";
    }

    @Override
    public VideoMessageEntity analysis(V2TIMVideoElem elem) {
        return new VideoMessageEntity(elem);
    }

    @Override
    public Class<VideoMessageEntity> getEntityClass() {
        return VideoMessageEntity.class;
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/AbstractMessageEntity.java
================================================
package top.huic.tencent_im_plugin.message.entity;

import java.io.Serializable;

import top.huic.tencent_im_plugin.enums.MessageNodeType;

/**
 * 消息实体
 *
 * @author 蒋具宏
 */
public class AbstractMessageEntity implements Serializable {
    private MessageNodeType nodeType;

    public AbstractMessageEntity(MessageNodeType nodeType) {
        this.nodeType = nodeType;
    }

    public MessageNodeType getNodeType() {
        return nodeType;
    }

    public void setNodeType(MessageNodeType nodeType) {
        this.nodeType = nodeType;
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/CustomMessageEntity.java
================================================
package top.huic.tencent_im_plugin.message.entity;

import com.tencent.imsdk.v2.V2TIMCustomElem;

import top.huic.tencent_im_plugin.enums.MessageNodeType;

/**
 * 自定义消息实体
 *
 * @author 蒋具宏
 */
public class CustomMessageEntity extends AbstractMessageEntity {
    /**
     * 自定义内容
     */
    private String data;

    /**
     * 描述
     */
    private String desc;

    /**
     * 扩展内容
     */
    private String ext;

    public CustomMessageEntity() {
        super(MessageNodeType.Custom);
    }

    public CustomMessageEntity(V2TIMCustomElem elem) {
        super(MessageNodeType.Custom);
        if (elem.getData() == null || elem.getData().length == 0) {
            this.data = null;
        } else {
            this.data = new String(elem.getData());
        }
        this.desc = elem.getDescription();
        if (elem.getExtension() != null && elem.getExtension().length != 0) {
            this.ext = new String(elem.getExtension());
        }
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getExt() {
        return ext;
    }

    public void setExt(String ext) {
        this.ext = ext;
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/FaceMessageEntity.java
================================================
package top.huic.tencent_im_plugin.message.entity;

import com.tencent.imsdk.v2.V2TIMFaceElem;

import top.huic.tencent_im_plugin.enums.MessageNodeType;

/**
 * 表情消息实体
 */
public class FaceMessageEntity extends AbstractMessageEntity {

    /**
     * 索引
     */
    private int index;

    /**
     * 数据
     */
    private String data;


    public FaceMessageEntity() {
        super(MessageNodeType.Face);
    }

    public FaceMessageEntity(V2TIMFaceElem elem) {
        super(MessageNodeType.Face);
        this.setIndex(elem.getIndex());
        this.setData(elem.getData() == null ? null : new String(elem.getData()));
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/FileMessageEntity.java
================================================
package top.huic.tencent_im_plugin.message.entity;

import com.tencent.imsdk.v2.V2TIMFileElem;

import top.huic.tencent_im_plugin.enums.MessageNodeType;

/**
 * 文件消息实体
 */
public class FileMessageEntity extends AbstractMessageEntity {
    /**
     * 文件路径
     */
    private String filePath;

    /**
     * 文件名
     */
    private String fileName;

    /**
     * 文件UUID
     */
    private String uuid;

    /**
     * 文件大小
     */
    private int size;

    public FileMessageEntity() {
        super(MessageNodeType.File);
    }

    public FileMessageEntity(V2TIMFileElem elem) {
        super(MessageNodeType.File);
        this.setFileName(elem.getFileName());
        this.setFilePath(elem.getPath());
        this.setSize(elem.getFileSize());
        this.setUuid(elem.getUUID());
    }

    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/GroupTipsMessageEntity.java
================================================
package top.huic.tencent_im_plugin.message.entity;

import com.tencent.imsdk.v2.V2TIMGroupChangeInfo;
import com.tencent.imsdk.v2.V2TIMGroupMemberChangeInfo;
import com.tencent.imsdk.v2.V2TIMGroupMemberInfo;
import com.tencent.imsdk.v2.V2TIMGroupTipsElem;

import java.util.List;

import top.huic.tencent_im_plugin.enums.MessageNodeType;

/**
 * 群提示消息实体
 *
 * @author 蒋具宏
 */
public class GroupTipsMessageEntity extends AbstractMessageEntity {

    /**
     * 群ID
     */
    private String groupID;

    /**
     * 群事件通知类型
     */
    private int type;

    /**
     * 操作用户
     */
    private V2TIMGroupMemberInfo opMember;

    /**
     * 被操作人列表
     */
    private List<V2TIMGroupMemberInfo> memberList;

    /**
     * 群资料变更信息列表,仅当tipsType值为V2TIMGroupTipsElem#V2TIM_GROUP_TIPS_TYPE_GROUP_INFO_CHANGE时有效
     */
    private List<V2TIMGroupChangeInfo> groupChangeInfoList	;

    /**
     * 获取群成员变更信息列表,仅当tipsType值为V2TIMGroupTipsElem#V2TIM_GROUP_TIPS_TYPE_MEMBER_INFO_CHANGE时有效
     */
    private List<V2TIMGroupMemberChangeInfo> memberChangeInfoList;

    /**
     * 当前群成员数,仅当tipsType值为V2TIMGroupTipsElem#V2TIM_GROUP_TIPS_TYPE_JOIN, V2TIMGroupTipsElem#V2TIM_GROUP_TIPS_TYPE_QUIT, V2TIMGroupTipsElem#V2TIM_GROUP_TIPS_TYPE_KICKED的时候有效
     */
    private int memberCount;

    public GroupTipsMessageEntity() {
        super(MessageNodeType.GroupTips);
    }

    public GroupTipsMessageEntity(V2TIMGroupTipsElem elem){
        super(MessageNodeType.GroupTips);
        this.groupID = elem.getGroupID();
        this.type = elem.getType();
        this.opMember = elem.getOpMember();
        this.memberList = elem.getMemberList();
        this.groupChangeInfoList = elem.getGroupChangeInfoList();
        this.memberChangeInfoList = elem.getMemberChangeInfoList();
        this.memberCount = elem.getMemberCount();
    }

    public String getGroupID() {
        return groupID;
    }

    public void setGroupID(String groupID) {
        this.groupID = groupID;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public V2TIMGroupMemberInfo getOpMember() {
        return opMember;
    }

    public void setOpMember(V2TIMGroupMemberInfo opMember) {
        this.opMember = opMember;
    }

    public List<V2TIMGroupMemberInfo> getMemberList() {
        return memberList;
    }

    public void setMemberList(List<V2TIMGroupMemberInfo> memberList) {
        this.memberList = memberList;
    }

    public List<V2TIMGroupChangeInfo> getGroupChangeInfoList() {
        return groupChangeInfoList;
    }

    public void setGroupChangeInfoList(List<V2TIMGroupChangeInfo> groupChangeInfoList) {
        this.groupChangeInfoList = groupChangeInfoList;
    }

    public List<V2TIMGroupMemberChangeInfo> getMemberChangeInfoList() {
        return memberChangeInfoList;
    }

    public void setMemberChangeInfoList(List<V2TIMGroupMemberChangeInfo> memberChangeInfoList) {
        this.memberChangeInfoList = memberChangeInfoList;
    }

    public int getMemberCount() {
        return memberCount;
    }

    public void setMemberCount(int memberCount) {
        this.memberCount = memberCount;
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/ImageMessageEntity.java
================================================
package top.huic.tencent_im_plugin.message.entity;

import com.tencent.imsdk.v2.V2TIMImageElem;

import java.util.List;

import top.huic.tencent_im_plugin.enums.MessageNodeType;

/**
 * 图片消息实体
 *
 * @author 蒋具宏
 */
public class ImageMessageEntity extends AbstractMessageEntity {
    /**
     * 原图本地文件路径,发送方有效
     */
    private String path;

    /**
     * 图片列表,根据类型分开
     */
    private List<V2TIMImageElem.V2TIMImage> imageData;

    public ImageMessageEntity() {
        super(MessageNodeType.Image);
    }

    public ImageMessageEntity(V2TIMImageElem elem) {
        super(MessageNodeType.Image);
        this.setPath(elem.getPath());
        this.setImageData(elem.getImageList());
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public List<V2TIMImageElem.V2TIMImage> getImageData() {
        return imageData;
    }

    public void setImageData(List<V2TIMImageElem.V2TIMImage> imageData) {
        this.imageData = imageData;
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/LocationMessageEntity.java
================================================
package top.huic.tencent_im_plugin.message.entity;

import com.tencent.imsdk.v2.V2TIMLocationElem;

import top.huic.tencent_im_plugin.enums.MessageNodeType;

/**
 * 位置消息实体
 *
 * @author 蒋具宏
 */
public class LocationMessageEntity extends AbstractMessageEntity {
    /**
     * 描述
     */
    private String desc;

    /**
     * 经度
     */
    private double latitude;

    /**
     * 纬度
     */
    private double longitude;

    public LocationMessageEntity() {
        super(MessageNodeType.Location);
    }

    public LocationMessageEntity(V2TIMLocationElem elem) {
        super(MessageNodeType.Location);
        this.setDesc(elem.getDesc());
        this.setLongitude(elem.getLongitude());
        this.setLatitude(elem.getLatitude());
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/SoundMessageEntity.java
================================================
package top.huic.tencent_im_plugin.message.entity;

import com.tencent.imsdk.v2.V2TIMSoundElem;

import top.huic.tencent_im_plugin.enums.MessageNodeType;

/**
 * 语音消息实体
 *
 * @author 蒋具宏
 */
public class SoundMessageEntity extends AbstractMessageEntity {

    /**
     * 语音ID
     */
    private String uuid;

    /**
     * 路径
     */
    private String path;

    /**
     * 时长
     */
    private Integer duration;

    /**
     * 数据大小
     */
    private Integer dataSize;

    public SoundMessageEntity() {
        super(MessageNodeType.Sound);
    }

    public SoundMessageEntity(V2TIMSoundElem elem) {
        super(MessageNodeType.Sound);
        this.setPath(elem.getPath());
        this.setDuration(elem.getDuration());
        this.setDataSize(elem.getDataSize());
        this.setUuid(elem.getUUID());
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public Integer getDuration() {
        return duration;
    }

    public void setDuration(Integer duration) {
        this.duration = duration;
    }

    public Integer getDataSize() {
        return dataSize;
    }

    public void setDataSize(Integer dataSize) {
        this.dataSize = dataSize;
    }

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/TextMessageEntity.java
================================================
package top.huic.tencent_im_plugin.message.entity;

import com.tencent.imsdk.v2.V2TIMTextElem;

import java.util.List;

import top.huic.tencent_im_plugin.enums.MessageNodeType;

/**
 * 文本消息实体
 *
 * @author 蒋具宏
 */
public class TextMessageEntity extends AbstractMessageEntity {
    /**
     * 消息内容
     */
    private String content;

    /**
     * \@的用户列表
     */
    private List<String> atUserList;

    /**
     * 是否@所有人
     */
    private Boolean atAll;

    public TextMessageEntity() {
        super(MessageNodeType.Text);
    }

    public TextMessageEntity(V2TIMTextElem elem) {
        super(MessageNodeType.Text);
        this.content = elem.getText();
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public List<String> getAtUserList() {
        return atUserList;
    }

    public void setAtUserList(List<String> atUserList) {
        this.atUserList = atUserList;
    }

    public Boolean getAtAll() {
        return atAll;
    }

    public void setAtAll(Boolean atAll) {
        this.atAll = atAll;
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/VideoMessageEntity.java
================================================
package top.huic.tencent_im_plugin.message.entity;

import com.tencent.imsdk.v2.V2TIMVideoElem;

import java.io.Serializable;

import top.huic.tencent_im_plugin.enums.MessageNodeType;

/**
 * 视频消息实体
 *
 * @author 蒋具宏
 */
public class VideoMessageEntity extends AbstractMessageEntity implements Serializable {
    /**
     * 视频路径
     */
    private String videoPath;
    /**
     * 视频UUID
     */
    private String videoUuid;
    /**
     * 视频大小
     */
    private int videoSize;
    /**
     * 时长
     */
    private int duration;
    /**
     * 缩略图路径
     */
    private String snapshotPath;
    /**
     * 缩略图UUID
     */
    private String snapshotUuid;
    /**
     * 缩略图大小
     */
    private int snapshotSize;
    /**
     * 缩略图宽度
     */
    private int snapshotWidth;
    /**
     * 缩略图高度
     */
    private int snapshotHeight;

    public VideoMessageEntity() {
        super(MessageNodeType.Video);
    }

    public VideoMessageEntity(V2TIMVideoElem elem) {
        super(MessageNodeType.Video);
        this.setVideoUuid(elem.getVideoUUID());
        this.setVideoPath(elem.getVideoPath());
        this.setVideoSize(elem.getVideoSize());
        this.setDuration(elem.getDuration());
        this.setSnapshotUuid(elem.getSnapshotUUID());
        this.setSnapshotWidth(elem.getSnapshotWidth());
        this.setSnapshotHeight(elem.getSnapshotHeight());
        this.setSnapshotPath(elem.getSnapshotPath());
        this.setSnapshotSize(elem.getSnapshotSize());
    }

    public String getVideoPath() {
        return videoPath;
    }

    public void setVideoPath(String videoPath) {
        this.videoPath = videoPath;
    }

    public String getVideoUuid() {
        return videoUuid;
    }

    public void setVideoUuid(String videoUuid) {
        this.videoUuid = videoUuid;
    }

    public int getVideoSize() {
        return videoSize;
    }

    public void setVideoSize(int videoSize) {
        this.videoSize = videoSize;
    }

    public int getDuration() {
        return duration;
    }

    public void setDuration(int duration) {
        this.duration = duration;
    }

    public String getSnapshotPath() {
        return snapshotPath;
    }

    public void setSnapshotPath(String snapshotPath) {
        this.snapshotPath = snapshotPath;
    }

    public String getSnapshotUuid() {
        return snapshotUuid;
    }

    public void setSnapshotUuid(String snapshotUuid) {
        this.snapshotUuid = snapshotUuid;
    }

    public int getSnapshotSize() {
        return snapshotSize;
    }

    public void setSnapshotSize(int snapshotSize) {
        this.snapshotSize = snapshotSize;
    }

    public int getSnapshotWidth() {
        return snapshotWidth;
    }

    public void setSnapshotWidth(int snapshotWidth) {
        this.snapshotWidth = snapshotWidth;
    }

    public int getSnapshotHeight() {
        return snapshotHeight;
    }

    public void setSnapshotHeight(int snapshotHeight) {
        this.snapshotHeight = snapshotHeight;
    }
}

================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/util/BeanUtils.java
================================================
package top.huic.tencent_im_plugin.util;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * Bean工具类
 */
public class BeanUtils {
    /**
     * 复制属性
     *
     * @param source           源对象
     * @param target           目标对象
     * @param ignoreProperties 忽略的参数列表
     */
    public static void copyProperties(Object source, Object target, String... ignoreProperties) {
        Class<?> sourceClass = source.getClass();
        Class<?> targetClass = target.getClass();

        // 填充目标方法列表
        Map<String, Method> targetMethodMap = new HashMap<>();
        for (Method method : targetClass.getDeclaredMethods()) {
            targetMethodMap.put(method.getName(), method);
        }

        try {
            for (Method method : sourceClass.getDeclaredMethods()) {
                String name = method.getName();

                // 验证是否是属性方法(get / is)
                if (method.getReturnType() != Void.class || method.getParameterTypes().length >= 1 || !(name.startsWith("get") || name.startsWith("is"))) {

                    // 获得方法后缀名(不包含 get is 前缀的内容)
                    String methodSuffixName = name.replaceFirst(name.startsWith("get") ? "get" : "is", "");
                    if (methodSuffixName.length() == 0) {
                        continue;
                    }
                    // 获得真实属性名
                    String fieldName = methodSuffixName.substring(0, 1).toLowerCase() + methodSuffixName.substring(1);

                    // 如果是忽略的属性
                    if (ignoreProperties != null && Arrays.asList(ignoreProperties).contains(fieldName)) {
                        continue;
                    }

                    // 如果不存在设置方法
                    String setMethodName = "set" + methodSuffixName;
                    if (!targetMethodMap.containsKey(setMethodName)) {
                        continue;
                    }

                    // 方法校验(非普通set参数(1个参数)) 或 不是公开方法,则不进行赋值确认
                    Method targetMethod = targetMethodMap.get(setMethodName);
                    if (targetMethod.getParameterTypes().length != 1 || targetMethod.getModifiers() != Modifier.PUBLIC) {
                        continue;
                    }

                    // 获得值,如果为null则忽略
                    Object resultValue = method.invoke(source);
                    if (resultValue == null) {
                        continue;
                    }

                    // 赋值
                    targetMethod.invoke(target, resultValue);
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/util/CommonUtil.java
================================================
package top.huic.tencent_im_plugin.util;

import android.os.Handler;
import android.os.Looper;

import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;

/**
 * 工具类
 */
public class CommonUtil {
    /**
     * 主线程处理器
     */
    private final static Handler MAIN_HANDLER = new Handler(Looper.getMainLooper());

    /**
     * 通用方法,获得参数值,如未找到参数,则直接中断
     *
     * @param methodCall 方法调用对象
     * @param result     返回对象
     * @param param      参数名
     */
    public static <T> T getParam(MethodCall methodCall, MethodChannel.Result result, String param) {
        T par = methodCall.argument(param);
        if (par == null) {
            result.error("Missing parameter", "Cannot find parameter `" + param + "` or `" + param + "` is null!", 5);
            throw new RuntimeException("Cannot find parameter `" + param + "` or `" + param + "` is null!");
        }
        return par;
    }

    /**
     * 运行主线程返回结果执行
     *
     * @param result 返回结果对象
     * @param param  返回参数
     */
    public static void runMainThreadReturn(final MethodChannel.Result result, final Object param) {
        MAIN_HANDLER.post(new Runnable() {
            @Override
            public void run() {
                result.success(param);
            }
        });
    }

    /**
     * 运行主线程返回错误结果执行
     *
     * @param result       返回结果对象
     * @param errorCode    错误码
     * @param errorMessage 错误信息
     * @param errorDetails 错误内容
     */
    public static void runMainThreadReturnError(final MethodChannel.Result result, final String errorCode, final String errorMessage, final Object errorDetails) {
        MAIN_HANDLER.post(new Runnable() {
            @Override
            public void run() {
                result.error(errorCode, errorMessage, errorDetails);
            }
        });
    }

    /**
     * 运行主线程方法
     */
    public static void runMainThreadMethod(Runnable runnable){
        MAIN_HANDLER.post(runnable);
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/util/JsonUtil.java
================================================
package top.huic.tencent_im_plugin.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.ValueFilter;

/**
 * JSON工具类
 *
 * @author 蒋具宏
 */
public class JsonUtil {
    /**
     * 自定义数据过滤器
     */
    private static final ValueFilter filter = new ValueFilter() {
        @Override
        public Object process(Object object, String name, Object value) {
            if (value instanceof byte[]) {
                return new String((byte[]) value);
            }
            return value;
        }
    };

    /**
     * 将对象序列化为JSON
     *
     * @param data 对象
     * @return 解析结果
     */
    public static String toJSONString(Object data) {
        if (data instanceof String) return data.toString();
        return JSON.toJSONString(data, filter);
    }
}


================================================
FILE: android/src/main/java/top/huic/tencent_im_plugin/util/TencentImUtils.java
================================================
package top.huic.tencent_im_plugin.util;

import com.alibaba.fastjson.JSON;
import com.tencent.imsdk.v2.V2TIMFriendApplication;
import com.tencent.imsdk.v2.V2TIMFriendApplicationResult;
import com.tencent.imsdk.v2.V2TIMGroupApplication;
import com.tencent.imsdk.v2.V2TIMGroupApplicationResult;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;
import com.tencent.imsdk.v2.V2TIMValueCallback;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import top.huic.tencent_im_plugin.ValueCallBack;
import top.huic.tencent_im_plugin.entity.FindFriendApplicationEntity;
import top.huic.tencent_im_plugin.entity.FindGroupApplicationEntity;
import top.huic.tencent_im_plugin.entity.FindMessageEntity;

/**
 * 腾讯云IM工具类
 */
public class TencentImUtils {

    /**
     * 获得好友申请对象
     *
     * @param json json 字符串
     * @param call 回调对象
     */
    public static void getFriendApplicationByFindGroupApplicationEntity(String json, ValueCallBack<V2TIMFriendApplication> call) {
        getFriendApplicationByFindGroupApplicationEntity(JSON.parseObject(json, FindFriendApplicationEntity.class), call);
    }

    /**
     * 获得好友申请对象
     *
     * @param data 实体对象
     * @param call 回调对象
     */
    public static void getFriendApplicationByFindGroupApplicationEntity(final FindFriendApplicationEntity data, final ValueCallBack<V2TIMFriendApplication> call) {
        V2TIMManager.getFriendshipManager().getFriendApplicationList(new V2TIMValueCallback<V2TIMFriendApplicationResult>() {
            @Override
            public void onError(int i, String s) {
                call.onError(i, s);
            }

            @Override
            public void onSuccess(V2TIMFriendApplicationResult v2TIMFriendApplicationResult) {
                if (v2TIMFriendApplicationResult.getFriendApplicationList() != null) {
                    for (V2TIMFriendApplication item : v2TIMFriendApplicationResult.getFriendApplicationList()) {
                        if (item.getUserID().equals(data.getUserID()) && item.getType() == data.getType()) {
                            call.onSuccess(item);
                            return;
                        }
                    }
                }
                call.onSuccess(null);
            }
        });
    }

    /**
     * 获得群申请对象
     *
     * @param json json 字符串
     * @param call 回调对象
     */
    public static void getGroupApplicationByFindGroupApplicationEntity(String json, ValueCallBack<V2TIMGroupApplication> call) {
        getGroupApplicationByFindGroupApplicationEntity(JSON.parseObject(json, FindGroupApplicationEntity.class), call);
    }

    /**
     * 获得群申请对象
     *
     * @param data 实体对象
     * @param call 回调对象
     */
    public static void getGroupApplicationByFindGroupApplicationEntity(final FindGroupApplicationEntity data, final ValueCallBack<V2TIMGroupApplication> call) {
        V2TIMManager.getGroupManager().getGroupApplicationList(new V2TIMValueCallback<V2TIMGroupApplicationResult>() {
            @Override
            public void onError(int i, String s) {
                call.onError(i, s);
            }

            @Override
            public void onSuccess(V2TIMGroupApplicationResult v2TIMGroupApplicationResult) {
                if (v2TIMGroupApplicationResult.getGroupApplicationList() != null) {
                    for (V2TIMGroupApplication item : v2TIMGroupApplicationResult.getGroupApplicationList()) {
                        if (item.getGroupID().equals(data.getGroupID()) && item.getFromUser().equals(data.getFromUser())) {
                            call.onSuccess(item);
                            return;
                        }
                    }
                }
                call.onSuccess(null);
            }
        });
    }

    /**
     * 获得消息对象
     *
     * @param json json字符串
     * @param call 回调对象
     */
    public static void getMessageByFindMessageEntity(String json, ValueCallBack<V2TIMMessage> call) {
        getMessageByFindMessageEntity(JSON.parseObject(json, FindMessageEntity.class), call);
    }

    /**
     * 获得消息对象
     *
     * @param data 查找消息对象实体
     * @param call 回调对象
     */
    public static void getMessageByFindMessageEntity(final FindMessageEntity data, final ValueCallBack<V2TIMMessage> call) {
        getMessageByFindMessageEntity(Collections.singletonList(data), new ValueCallBack<List<V2TIMMessage>>(null) {
            @Override
            public void onSuccess(List<V2TIMMessage> v2TIMMessages) {
                if (v2TIMMessages == null || v2TIMMessages.size() == 0) {
                    call.onError(-1, "未找到消息对象!消息ID不存在");
                    return;
                }
                call.onSuccess(v2TIMMessages.get(0));
            }

            @Override
            public void onError(int code, String desc) {
                call.onError(code, desc);
            }
        });
    }

    /**
     * 获得消息对象
     *
     * @param data 查找消息对象实体
     * @param call 回调对象
     */
    public static void getMessageByFindMessageEntity(List<FindMessageEntity> data, final ValueCallBack<List<V2TIMMessage>> call) {
        List<String> ids = new ArrayList<>();
        for (FindMessageEntity datum : data) {
            ids.add(datum.getMsgId());
        }
        V2TIMManager.getMessageManager().findMessages(ids, new V2TIMValueCallback<List<V2TIMMessage>>() {
            @Override
            public void onError(int i, String s) {
                call.onError(i, s);
            }

            @Override
            public void onSuccess(List<V2TIMMessage> v2TIMMessages) {
                call.onSuccess(v2TIMMessages);
            }
        });
    }
}

================================================
FILE: example/.gitignore
================================================
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/

# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
/build/

# Web related
lib/generated_plugin_registrant.dart

# Exceptions to above rules.
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages


================================================
FILE: example/.metadata
================================================
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.

version:
  revision: d345a3b303ce041846ff895eb49a104bef133c4b
  channel: master

project_type: app


================================================
FILE: example/README.md
================================================
# tencent_im_plugin_example

Demonstrates how to use the tencent_im_plugin plugin.

## Getting Started

This project is a starting point for a Flutter application.

A few resources to get you started if this is your first Flutter project:

- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)

For help getting started with Flutter, view our
[online documentation](https://flutter.dev/docs), which offers tutorials,
samples, guidance on mobile development, and a full API reference.


================================================
FILE: example/android/.gitignore
================================================
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java


================================================
FILE: example/android/app/agconnect-services.json
================================================
{
	"agcgw":{
		"backurl":"connect-drcn.dbankcloud.cn",
		"url":"connect-drcn.hispace.hicloud.com"
	},
	"client":{
		"cp_id":"890086000102176873",
		"product_id":"736430079244549109",
		"client_id":"400572237515588608",
		"client_secret":"76A8613ED5A461B6AA74396CAF70DBB0B23690F8B4136A0A66AA202FFEEA890D",
		"app_id":"102514829",
		"package_name":"top.huic.tencent_im_plugin_example",
		"api_key":"CgB6e3x9I8KuPeIag8AT0fhvvrEf57HaQCYqoB91348bgNFNEim2y+8s3/ervtmQDygm6EKiBqCBRdNurhYotfYi"
	},
	"service":{
		"analytics":{
			"collector_url":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn",
			"resource_id":"p1",
			"channel_id":""
		},
		"cloudstorage":{
			"storage_url":"https://agc-storage-drcn.platform.dbankcloud.cn"
		},
		"ml":{
			"mlservice_url":"ml-api-drcn.ai.dbankcloud.com,ml-api-drcn.ai.dbankcloud.cn"
		}
	},
	"region":"CN",
	"configuration_version":"1.0"
}

================================================
FILE: example/android/app/build.gradle
================================================
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

//def keystorePropertiesFile = rootProject.file("key.properties")
//def keystoreProperties = new Properties()
//keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
    compileSdkVersion 28

    lintOptions {
        disable 'InvalidPackage'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "top.huic.tencent_im_plugin_example"
        minSdkVersion 17
        targetSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    // 证书参数
    signingConfigs {
        config {
            storeFile file('key.jks')
            storePassword '123456'
            keyAlias 'key'
            keyPassword '123456'
            v1SigningEnabled true
            v2SigningEnabled true
        }
    }

    buildTypes {
        debug {
            signingConfig signingConfigs.config
        }

        release {
            signingConfig signingConfigs.config
//            // 开启混淆
//            minifyEnabled true
//            useProguard true
        }
    }
    compileOptions {
        sourceCompatibility = 1.8
        targetCompatibility = 1.8
    }

    // 减小应用程序大小的配置
    aaptOptions {
        ignoreAssetsPattern "!x86:!*ffprobe"
    }
}

flutter {
    source '../..'
}

dependencies {
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}

apply plugin: 'com.huawei.agconnect'

================================================
FILE: example/android/app/src/debug/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="top.huic.tencent_im_plugin_example">
    <!-- Flutter needs it to communicate with the running application
         to allow setting breakpoints, to provide hot reload, etc.
    -->
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>


================================================
FILE: example/android/app/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="top.huic.tencent_im_plugin_example">
    <!-- io.flutter.app.FlutterApplication is an android.app.Application that
         calls FlutterMain.startInitialization(this); in its onCreate method.
         In most cases you can leave this as-is, but you if you want to provide
         additional functionality it is fine to subclass or reimplement
         FlutterApplication and put your custom class here. -->

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.VIBRATE" />

    <permission
        android:name="top.huic.tencent_im_plugin_example.permission.MIPUSH_RECEIVE"
        android:protectionLevel="signature" />
    <uses-permission android:name="top.huic.tencent_im_plugin_example.permission.MIPUSH_RECEIVE" />


    <application
        android:name="io.flutter.app.FlutterApplication"
        android:icon="@mipmap/ic_launcher"
        android:label="tencent_im_plugin_example"
        tools:replace="android:label">
        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
</manifest>


================================================
FILE: example/android/app/src/main/java/top/huic/tencent_im_plugin_example/MainActivity.java
================================================
package top.huic.tencent_im_plugin_example;

import android.app.ActivityManager;
import android.content.Context;
import android.os.Bundle;
import java.util.List;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity {

    /**
     * Flutter 通知器
     */
    public static MethodChannel channel;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        channel = new MethodChannel(this.getFlutterEngine().getDartExecutor(), "tencent_im_plugin_example");
    }

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
    }
}


================================================
FILE: example/android/app/src/main/res/drawable/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/white" />

    <!-- You can insert your own image assets here -->
    <!-- <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/launch_image" />
    </item> -->
</layer-list>


================================================
FILE: example/android/app/src/main/res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <!-- Show a splash screen on the activity. Automatically removed when
             Flutter draws its first frame -->
        <item name="android:windowBackground">@drawable/launch_background</item>
    </style>
</resources>


================================================
FILE: example/android/app/src/profile/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="top.huic.tencent_im_plugin_example">
    <!-- Flutter needs it to communicate with the running application
         to allow setting breakpoints, to provide hot reload, etc.
    -->
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>


================================================
FILE: example/android/build.gradle
================================================
buildscript {
    repositories {
        google()
        jcenter()
        maven {url 'https://developer.huawei.com/repo/'}
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.3'
        classpath 'com.huawei.agconnect:agcp:1.2.1.301'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: example/android/gradle/wrapper/gradle-wrapper.properties
================================================
#Fri Feb 28 14:11:06 CST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip


================================================
FILE: example/android/gradle.properties
================================================
org.gradle.jvmargs=-Xmx1536M
android.enableR8=true
android.useAndroidX=true
android.enableJetifier=true


================================================
FILE: example/android/settings.gradle
================================================
include ':app'

def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()

def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
if (pluginsFile.exists()) {
    pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}

plugins.each { name, path ->
    def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
    include ":$name"
    project(":$name").projectDir = pluginDirectory
}


================================================
FILE: example/ios/.gitignore
================================================
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*

# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3


================================================
FILE: example/ios/Flutter/AppFrameworkInfo.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleDevelopmentRegion</key>
  <string>$(DEVELOPMENT_LANGUAGE)</string>
  <key>CFBundleExecutable</key>
  <string>App</string>
  <key>CFBundleIdentifier</key>
  <string>io.flutter.flutter.app</string>
  <key>CFBundleInfoDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundleName</key>
  <string>App</string>
  <key>CFBundlePackageType</key>
  <string>FMWK</string>
  <key>CFBundleShortVersionString</key>
  <string>1.0</string>
  <key>CFBundleSignature</key>
  <string>????</string>
  <key>CFBundleVersion</key>
  <string>1.0</string>
  <key>MinimumOSVersion</key>
  <string>9.0</string>
</dict>
</plist>


================================================
FILE: example/ios/Flutter/Debug.xcconfig
================================================
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"


================================================
FILE: example/ios/Flutter/Release.xcconfig
================================================
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"


================================================
FILE: example/ios/Podfile
================================================
# Uncomment this line to define a global platform for your project
platform :ios, '8.0'

# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

project 'Runner', {
  'Debug' => :debug,
  'Profile' => :release,
  'Release' => :release,
}

def flutter_root
  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
  unless File.exist?(generated_xcode_build_settings_path)
    raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
  end

  File.foreach(generated_xcode_build_settings_path) do |line|
    matches = line.match(/FLUTTER_ROOT\=(.*)/)
    return matches[1].strip if matches
  end
  raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end

require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)

flutter_ios_podfile_setup

def install_plugin_pods(application_path = nil, relative_symlink_dir, platform)
  # defined_in_file is set by CocoaPods and is a Pathname to the Podfile.
  application_path ||= File.dirname(defined_in_file.realpath) if self.respond_to?(:defined_in_file)
  raise 'Could not find application path' unless application_path

  # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
  # referring to absolute paths on developers' machines.

  symlink_dir = File.expand_path(relative_symlink_dir, application_path)
  system('rm', '-rf', symlink_dir) # Avoid the complication of dependencies like FileUtils.

  symlink_plugins_dir = File.expand_path('plugins', symlink_dir)
  system('mkdir', '-p', symlink_plugins_dir)

  plugins_file = File.join(application_path, '..', '.flutter-plugin
Download .txt
gitextract_zorfcym6/

├── .all-contributorsrc
├── .github/
│   └── FUNDING.yml
├── .gitignore
├── .metadata
├── CHANGELOG.md
├── LICENSE
├── README.md
├── README_3.0_upgrade.md
├── android/
│   ├── .gitignore
│   ├── build.gradle
│   ├── consumer-proguard-rules.txt
│   ├── gradle/
│   │   └── wrapper/
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── settings.gradle
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── top/
│                   └── huic/
│                       └── tencent_im_plugin/
│                           ├── DownloadCallBack.java
│                           ├── TencentImPlugin.java
│                           ├── ValueCallBack.java
│                           ├── VoidCallBack.java
│                           ├── entity/
│                           │   ├── CustomConversationEntity.java
│                           │   ├── CustomConversationResultEntity.java
│                           │   ├── CustomFriendAddApplication.java
│                           │   ├── CustomMessageEntity.java
│                           │   ├── FindFriendApplicationEntity.java
│                           │   ├── FindGroupApplicationEntity.java
│                           │   └── FindMessageEntity.java
│                           ├── enums/
│                           │   ├── ListenerTypeEnum.java
│                           │   └── MessageNodeType.java
│                           ├── listener/
│                           │   ├── CustomAdvancedMsgListener.java
│                           │   ├── CustomConversationListener.java
│                           │   ├── CustomFriendshipListener.java
│                           │   ├── CustomGroupListener.java
│                           │   ├── CustomSDKListener.java
│                           │   └── CustomSignalingListener.java
│                           ├── message/
│                           │   ├── AbstractMessageNode.java
│                           │   ├── CustomMessageNode.java
│                           │   ├── FaceMessageNode.java
│                           │   ├── FileMessageNode.java
│                           │   ├── GroupTipsMessageNode.java
│                           │   ├── ImageMessageNode.java
│                           │   ├── LocationMessageNode.java
│                           │   ├── SoundMessageNode.java
│                           │   ├── TextMessageNode.java
│                           │   ├── VideoMessageNode.java
│                           │   └── entity/
│                           │       ├── AbstractMessageEntity.java
│                           │       ├── CustomMessageEntity.java
│                           │       ├── FaceMessageEntity.java
│                           │       ├── FileMessageEntity.java
│                           │       ├── GroupTipsMessageEntity.java
│                           │       ├── ImageMessageEntity.java
│                           │       ├── LocationMessageEntity.java
│                           │       ├── SoundMessageEntity.java
│                           │       ├── TextMessageEntity.java
│                           │       └── VideoMessageEntity.java
│                           └── util/
│                               ├── BeanUtils.java
│                               ├── CommonUtil.java
│                               ├── JsonUtil.java
│                               └── TencentImUtils.java
├── example/
│   ├── .gitignore
│   ├── .metadata
│   ├── README.md
│   ├── android/
│   │   ├── .gitignore
│   │   ├── app/
│   │   │   ├── agconnect-services.json
│   │   │   ├── build.gradle
│   │   │   ├── key.jks
│   │   │   └── src/
│   │   │       ├── debug/
│   │   │       │   └── AndroidManifest.xml
│   │   │       ├── main/
│   │   │       │   ├── AndroidManifest.xml
│   │   │       │   ├── java/
│   │   │       │   │   └── top/
│   │   │       │   │       └── huic/
│   │   │       │   │           └── tencent_im_plugin_example/
│   │   │       │   │               └── MainActivity.java
│   │   │       │   └── res/
│   │   │       │       ├── drawable/
│   │   │       │       │   └── launch_background.xml
│   │   │       │       └── values/
│   │   │       │           └── styles.xml
│   │   │       └── profile/
│   │   │           └── AndroidManifest.xml
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   └── settings.gradle
│   ├── ios/
│   │   ├── .gitignore
│   │   ├── Flutter/
│   │   │   ├── AppFrameworkInfo.plist
│   │   │   ├── Debug.xcconfig
│   │   │   └── Release.xcconfig
│   │   ├── Podfile
│   │   ├── Runner/
│   │   │   ├── AppDelegate.swift
│   │   │   ├── Assets.xcassets/
│   │   │   │   ├── AppIcon.appiconset/
│   │   │   │   │   └── Contents.json
│   │   │   │   └── LaunchImage.imageset/
│   │   │   │       ├── Contents.json
│   │   │   │       └── README.md
│   │   │   ├── Base.lproj/
│   │   │   │   ├── LaunchScreen.storyboard
│   │   │   │   └── Main.storyboard
│   │   │   ├── Info.plist
│   │   │   └── Runner-Bridging-Header.h
│   │   ├── Runner.xcodeproj/
│   │   │   ├── project.pbxproj
│   │   │   ├── project.xcworkspace/
│   │   │   │   └── contents.xcworkspacedata
│   │   │   └── xcshareddata/
│   │   │       └── xcschemes/
│   │   │           └── Runner.xcscheme
│   │   └── Runner.xcworkspace/
│   │       └── contents.xcworkspacedata
│   ├── lib/
│   │   ├── main.dart
│   │   ├── page/
│   │   │   ├── chat.dart
│   │   │   ├── home.dart
│   │   │   ├── interfaces_test.dart
│   │   │   ├── login.dart
│   │   │   └── main/
│   │   │       ├── components/
│   │   │       │   ├── conversation.dart
│   │   │       │   ├── friend.dart
│   │   │       │   └── group.dart
│   │   │       └── main.dart
│   │   └── utils/
│   │       └── GenerateTestUserSig.dart
│   ├── pubspec.yaml
│   └── test/
│       └── widget_test.dart
├── ios/
│   ├── .gitignore
│   ├── Assets/
│   │   └── .gitkeep
│   ├── Classes/
│   │   ├── SwiftTencentImPlugin.swift
│   │   ├── TencentImPlugin.h
│   │   ├── TencentImPlugin.m
│   │   ├── entity/
│   │   │   ├── CustomConversationEntity.swift
│   │   │   ├── CustomConversationResultEntity.swift
│   │   │   ├── CustomCreateGroupMemberEntity.swift
│   │   │   ├── CustomFriendAddApplicationEntity.swift
│   │   │   ├── CustomFriendApplicationEntity.swift
│   │   │   ├── CustomFriendApplicationResultEntity.swift
│   │   │   ├── CustomFriendCheckResultEntity.swift
│   │   │   ├── CustomFriendGroupEntity.swift
│   │   │   ├── CustomFriendInfoEntity.swift
│   │   │   ├── CustomFriendInfoResultEntity.swift
│   │   │   ├── CustomFriendOperationResultEntity.swift
│   │   │   ├── CustomGroupApplicationEntity.swift
│   │   │   ├── CustomGroupApplicationResultEntity.swift
│   │   │   ├── CustomGroupAtInfoEntity.swift
│   │   │   ├── CustomGroupChangeInfoEntity.swift
│   │   │   ├── CustomGroupInfoEntity.swift
│   │   │   ├── CustomGroupInfoResultEntity.swift
│   │   │   ├── CustomGroupMemberChangeInfoEntity.swift
│   │   │   ├── CustomGroupMemberFullInfoEntity.swift
│   │   │   ├── CustomGroupMemberInfoResultEntity.swift
│   │   │   ├── CustomGroupMemberOperationResultEntity.swift
│   │   │   ├── CustomMessageReceiptEntity.swift
│   │   │   ├── CustomOfflinePushInfoEntity.swift
│   │   │   ├── CustomSignalingInfoEntity.swift
│   │   │   ├── CustomUserEntity.swift
│   │   │   ├── FindFriendApplicationEntity.swift
│   │   │   ├── FindGroupApplicationEntity.swift
│   │   │   ├── FindMessageEntity.swift
│   │   │   └── MessageEntity.swift
│   │   ├── enums/
│   │   │   ├── DownloadType.swift
│   │   │   ├── ListenerType.swift
│   │   │   └── MessageNodeType.swift
│   │   ├── listener/
│   │   │   ├── CustomAPNSListener.swift
│   │   │   ├── CustomAdvancedMsgListener.swift
│   │   │   ├── CustomConversationListener.swift
│   │   │   ├── CustomFriendshipListener.swift
│   │   │   ├── CustomGroupListener.swift
│   │   │   ├── CustomSDKListener.swift
│   │   │   └── CustomSignalingListener.swift
│   │   ├── message/
│   │   │   ├── AbstractMessageNode.swift
│   │   │   ├── CustomMessageNode.swift
│   │   │   ├── FaceMessageNode.swift
│   │   │   ├── FileMessageNode.swift
│   │   │   ├── GroupTipsMessageNode.swift
│   │   │   ├── ImageMessageNode.swift
│   │   │   ├── LocationMessageNode.swift
│   │   │   ├── SoundMessageNode.swift
│   │   │   ├── TextMessageNode.swift
│   │   │   ├── VideoMessageNode.swift
│   │   │   └── entity/
│   │   │       ├── AbstractMessageEntity.swift
│   │   │       ├── CustomMessageEntity.swift
│   │   │       ├── FaceMessageEntity.swift
│   │   │       ├── FileMessageEntity.swift
│   │   │       ├── LocationMessageEntity.swift
│   │   │       ├── SoundMessageEntity.swift
│   │   │       ├── TextMessageEntity.swift
│   │   │       ├── VideoMessageEntity.swift
│   │   │       ├── group_tips/
│   │   │       │   └── GroupTipsMessageEntity.swift
│   │   │       └── image/
│   │   │           ├── ImageEntity.swift
│   │   │           └── ImageMessageEntity.swift
│   │   └── utils/
│   │       ├── CommonUtils.swift
│   │       ├── JsonUtil.swift
│   │       └── TencentImUtil.swift
│   └── tencent_im_plugin.podspec
├── lib/
│   ├── entity/
│   │   ├── conversation_entity.dart
│   │   ├── conversation_result_entity.dart
│   │   ├── download_progress_entity.dart
│   │   ├── error_entity.dart
│   │   ├── find_friend_application_entity.dart
│   │   ├── find_group_application_entity.dart
│   │   ├── find_message_entity.dart
│   │   ├── friend_add_application_entity.dart
│   │   ├── friend_application_entity.dart
│   │   ├── friend_application_result_entity.dart
│   │   ├── friend_check_result_entity.dart
│   │   ├── friend_group_entity.dart
│   │   ├── friend_info_entity.dart
│   │   ├── friend_info_result_entity.dart
│   │   ├── friend_operation_result_entity.dart
│   │   ├── group_administrator_op_entity.dart
│   │   ├── group_application_entity.dart
│   │   ├── group_application_processed_entity.dart
│   │   ├── group_application_result_entity.dart
│   │   ├── group_at_info_entity.dart
│   │   ├── group_attribute_changed_entity.dart
│   │   ├── group_changed_entity.dart
│   │   ├── group_create_member_entity.dart
│   │   ├── group_dismissed_or_recycled_entity.dart
│   │   ├── group_info_entity.dart
│   │   ├── group_info_result_entity.dart
│   │   ├── group_member_changed_entity.dart
│   │   ├── group_member_enter_entity.dart
│   │   ├── group_member_entity.dart
│   │   ├── group_member_info_result_entity.dart
│   │   ├── group_member_invited_or_kicked_entity.dart
│   │   ├── group_member_leave_entity.dart
│   │   ├── group_member_operation_result_entity.dart
│   │   ├── group_receive_join_application_entity.dart
│   │   ├── group_receive_rest_entity.dart
│   │   ├── message_entity.dart
│   │   ├── message_receipt_entity.dart
│   │   ├── message_search_param.dart
│   │   ├── message_send_fail_entity.dart
│   │   ├── message_send_progress_entity.dart
│   │   ├── offline_push_info_entity.dart
│   │   ├── signaling_common_entity.dart
│   │   ├── signaling_info_entity.dart
│   │   └── user_entity.dart
│   ├── entity_factory.dart
│   ├── enums/
│   │   ├── conversation_type_enum.dart
│   │   ├── download_type_enum.dart
│   │   ├── friend_application_agree_type_enum.dart
│   │   ├── friend_application_type_enum.dart
│   │   ├── friend_relation_type_enum.dart
│   │   ├── friend_status_enum.dart
│   │   ├── friend_type_enum.dart
│   │   ├── get_message_type_enum.dart
│   │   ├── group_add_opt_enum.dart
│   │   ├── group_application_handler_result_enum.dart
│   │   ├── group_application_handler_status_enum.dart
│   │   ├── group_application_type_enum.dart
│   │   ├── group_at_type_enum.dart
│   │   ├── group_info_changed_type_enum.dart
│   │   ├── group_member_filter_enum.dart
│   │   ├── group_member_role_enum.dart
│   │   ├── group_system_type.dart
│   │   ├── group_tips_group_info_type.dart
│   │   ├── group_tips_type_enum.dart
│   │   ├── group_type_enum.dart
│   │   ├── image_type_enum.dart
│   │   ├── log_print_level.dart
│   │   ├── login_status_enum.dart
│   │   ├── message_elem_type_enum.dart
│   │   ├── message_priority_enum.dart
│   │   ├── message_status_enum.dart
│   │   ├── operation_result_enum.dart
│   │   ├── pendency_examine_type_enum.dart
│   │   ├── pendency_type_enum.dart
│   │   ├── receive_message_opt_enum.dart
│   │   ├── signaling_action_type_enum.dart
│   │   ├── sns_tips_type.dart
│   │   ├── tencent_im_listener_type_enum.dart
│   │   ├── user_allow_type_enum.dart
│   │   └── user_gender_enum.dart
│   ├── list_util.dart
│   ├── listener/
│   │   └── tencent_im_plugin_listener.dart
│   ├── message_node/
│   │   ├── custom_message_node.dart
│   │   ├── face_message_node.dart
│   │   ├── file_message_node.dart
│   │   ├── group_tips_message_node.dart
│   │   ├── image_message_node.dart
│   │   ├── location_message_node.dart
│   │   ├── message_node.dart
│   │   ├── sound_message_node.dart
│   │   ├── text_message_node.dart
│   │   └── video_message_node.dart
│   ├── tencent_im_plugin.dart
│   └── utils/
│       └── enum_util.dart
└── pubspec.yaml
Download .txt
SYMBOL INDEX (855 symbols across 149 files)

FILE: android/src/main/java/top/huic/tencent_im_plugin/DownloadCallBack.java
  class DownloadCallBack (line 14) | public class DownloadCallBack implements V2TIMDownloadCallback {
    method DownloadCallBack (line 36) | public DownloadCallBack() {
    method DownloadCallBack (line 39) | public DownloadCallBack(String path) {
    method DownloadCallBack (line 43) | public DownloadCallBack(MethodChannel.Result result, String path, Stri...
    method onProgress (line 50) | @Override
    method onSuccess (line 65) | @Override
    method onError (line 79) | @Override
    type DownloadTypeEnum (line 89) | public enum DownloadTypeEnum {
      method DownloadTypeEnum (line 115) | DownloadTypeEnum(Integer value) {
      method getValue (line 119) | public Integer getValue() {

FILE: android/src/main/java/top/huic/tencent_im_plugin/TencentImPlugin.java
  class TencentImPlugin (line 77) | public class TencentImPlugin implements FlutterPlugin, MethodCallHandler {
    method TencentImPlugin (line 118) | public TencentImPlugin() {
    method TencentImPlugin (line 121) | private TencentImPlugin(Context context, MethodChannel channel) {
    method onAttachedToEngine (line 127) | @Override
    method registerWith (line 142) | public static void registerWith(Registrar registrar) {
    method onMethodCall (line 147) | @Override
    method onDetachedFromEngine (line 162) | @Override
    method initSDK (line 172) | private void initSDK(MethodCall methodCall, Result result) {
    method unInitSDK (line 208) | private void unInitSDK(MethodCall methodCall, Result result) {
    method getVersion (line 221) | private void getVersion(MethodCall methodCall, Result result) {
    method getServerTime (line 231) | private void getServerTime(MethodCall methodCall, Result result) {
    method login (line 241) | private void login(MethodCall methodCall, final Result result) {
    method logout (line 255) | private void logout(MethodCall methodCall, final Result result) {
    method getLoginStatus (line 265) | private void getLoginStatus(MethodCall methodCall, final Result result) {
    method getLoginUser (line 275) | private void getLoginUser(MethodCall methodCall, final Result result) {
    method invite (line 285) | private void invite(MethodCall methodCall, final Result result) {
    method inviteInGroup (line 309) | private void inviteInGroup(MethodCall methodCall, final Result result) {
    method cancel (line 326) | private void cancel(MethodCall methodCall, final Result result) {
    method accept (line 338) | private void accept(MethodCall methodCall, final Result result) {
    method reject (line 350) | private void reject(MethodCall methodCall, final Result result) {
    method getSignalingInfo (line 362) | private void getSignalingInfo(MethodCall methodCall, final Result resu...
    method addInvitedSignaling (line 378) | private void addInvitedSignaling(MethodCall methodCall, final Result r...
    method sendMessage (line 389) | private void sendMessage(MethodCall methodCall, final Result result) {
    method resendMessage (line 408) | private void resendMessage(final MethodCall methodCall, final Result r...
    method _sendMessage (line 425) | private void _sendMessage(V2TIMMessage message, MethodCall methodCall,...
    method revokeMessage (line 482) | private void revokeMessage(MethodCall methodCall, final Result result) {
    method getC2CHistoryMessageList (line 498) | private void getC2CHistoryMessageList(MethodCall methodCall, final Res...
    method getGroupHistoryMessageList (line 535) | private void getGroupHistoryMessageList(MethodCall methodCall, final R...
    method getHistoryMessageList (line 572) | private void getHistoryMessageList(MethodCall methodCall, final Result...
    method markC2CMessageAsRead (line 616) | private void markC2CMessageAsRead(MethodCall methodCall, final Result ...
    method markGroupMessageAsRead (line 627) | private void markGroupMessageAsRead(MethodCall methodCall, final Resul...
    method deleteMessageFromLocalStorage (line 638) | private void deleteMessageFromLocalStorage(MethodCall methodCall, fina...
    method deleteMessages (line 654) | private void deleteMessages(MethodCall methodCall, final Result result) {
    method insertGroupMessageToLocalStorage (line 672) | private void insertGroupMessageToLocalStorage(MethodCall methodCall, f...
    method insertC2CMessageToLocalStorage (line 698) | private void insertC2CMessageToLocalStorage(MethodCall methodCall, fin...
    method downloadVideo (line 723) | private void downloadVideo(MethodCall methodCall, final Result result) {
    method downloadVideoThumbnail (line 740) | private void downloadVideoThumbnail(MethodCall methodCall, final Resul...
    method downloadSound (line 757) | private void downloadSound(MethodCall methodCall, final Result result) {
    method downloadFile (line 774) | private void downloadFile(MethodCall methodCall, final Result result) {
    method setMessageLocalCustomStr (line 791) | private void setMessageLocalCustomStr(MethodCall methodCall, final Res...
    method setMessageLocalCustomInt (line 809) | private void setMessageLocalCustomInt(MethodCall methodCall, final Res...
    method findMessages (line 827) | private void findMessages(MethodCall methodCall, final Result result) {
    method createGroup (line 847) | private void createGroup(MethodCall methodCall, final Result result) {
    method joinGroup (line 859) | private void joinGroup(MethodCall methodCall, final Result result) {
    method quitGroup (line 871) | private void quitGroup(MethodCall methodCall, final Result result) {
    method dismissGroup (line 882) | private void dismissGroup(MethodCall methodCall, final Result result) {
    method getJoinedGroupList (line 893) | private void getJoinedGroupList(MethodCall methodCall, final Result re...
    method getGroupsInfo (line 903) | private void getGroupsInfo(MethodCall methodCall, final Result result) {
    method setGroupInfo (line 914) | private void setGroupInfo(MethodCall methodCall, final Result result) {
    method searchGroups (line 925) | private void searchGroups(MethodCall methodCall, final Result result) {
    method searchGroupMembers (line 944) | private void searchGroupMembers(MethodCall methodCall, final Result re...
    method setC2CReceiveMessageOpt (line 970) | private void setC2CReceiveMessageOpt(MethodCall methodCall, final Resu...
    method setGroupReceiveMessageOpt (line 982) | private void setGroupReceiveMessageOpt(MethodCall methodCall, final Re...
    method getC2CReceiveMessageOpt (line 991) | private void getC2CReceiveMessageOpt(MethodCall call, final Result res...
    method initGroupAttributes (line 1010) | private void initGroupAttributes(MethodCall methodCall, final Result r...
    method setGroupAttributes (line 1022) | private void setGroupAttributes(MethodCall methodCall, final Result re...
    method deleteGroupAttributes (line 1034) | private void deleteGroupAttributes(MethodCall methodCall, final Result...
    method getGroupAttributes (line 1046) | private void getGroupAttributes(MethodCall methodCall, final Result re...
    method getGroupOnlineMemberCount (line 1058) | private void getGroupOnlineMemberCount(MethodCall methodCall, final Re...
    method getGroupMemberList (line 1074) | private void getGroupMemberList(MethodCall methodCall, final Result re...
    method getGroupMembersInfo (line 1087) | private void getGroupMembersInfo(MethodCall methodCall, final Result r...
    method setGroupMemberInfo (line 1099) | private void setGroupMemberInfo(MethodCall methodCall, final Result re...
    method muteGroupMember (line 1111) | private void muteGroupMember(MethodCall methodCall, final Result resul...
    method inviteUserToGroup (line 1125) | private void inviteUserToGroup(MethodCall methodCall, final Result res...
    method kickGroupMember (line 1137) | private void kickGroupMember(MethodCall methodCall, final Result resul...
    method setGroupMemberRole (line 1150) | private void setGroupMemberRole(MethodCall methodCall, final Result re...
    method transferGroupOwner (line 1163) | private void transferGroupOwner(MethodCall methodCall, final Result re...
    method getGroupApplicationList (line 1175) | private void getGroupApplicationList(MethodCall methodCall, final Resu...
    method acceptGroupApplication (line 1186) | private void acceptGroupApplication(MethodCall methodCall, final Resul...
    method refuseGroupApplication (line 1204) | private void refuseGroupApplication(MethodCall methodCall, final Resul...
    method setGroupApplicationRead (line 1221) | private void setGroupApplicationRead(MethodCall methodCall, final Resu...
    method getConversationList (line 1231) | private void getConversationList(MethodCall methodCall, final Result r...
    method getConversation (line 1248) | private void getConversation(MethodCall methodCall, final Result resul...
    method deleteConversation (line 1264) | private void deleteConversation(MethodCall methodCall, final Result re...
    method setConversationDraft (line 1275) | private void setConversationDraft(MethodCall methodCall, final Result ...
    method pinConversation (line 1287) | private void pinConversation(MethodCall methodCall, final Result resul...
    method getTotalUnreadMessageCount (line 1299) | private void getTotalUnreadMessageCount(MethodCall methodCall, final R...
    method getUsersInfo (line 1309) | private void getUsersInfo(MethodCall methodCall, final Result result) {
    method setSelfInfo (line 1320) | private void setSelfInfo(MethodCall methodCall, final Result result) {
    method addToBlackList (line 1331) | private void addToBlackList(MethodCall methodCall, final Result result) {
    method deleteFromBlackList (line 1342) | private void deleteFromBlackList(MethodCall methodCall, final Result r...
    method getBlackList (line 1353) | private void getBlackList(MethodCall methodCall, final Result result) {
    method setOfflinePushConfig (line 1363) | private void setOfflinePushConfig(MethodCall methodCall, final Result ...
    method setUnreadBadge (line 1377) | private void setUnreadBadge(MethodCall methodCall, final Result result) {
    method getFriendList (line 1388) | private void getFriendList(MethodCall methodCall, final Result result) {
    method getFriendsInfo (line 1398) | private void getFriendsInfo(MethodCall methodCall, final Result result) {
    method setFriendInfo (line 1409) | private void setFriendInfo(MethodCall methodCall, final Result result) {
    method addFriend (line 1420) | private void addFriend(MethodCall methodCall, final Result result) {
    method deleteFromFriendList (line 1431) | private void deleteFromFriendList(MethodCall methodCall, final Result ...
    method checkFriend (line 1443) | private void checkFriend(MethodCall methodCall, final Result result) {
    method getFriendApplicationList (line 1460) | private void getFriendApplicationList(MethodCall methodCall, final Res...
    method acceptFriendApplication (line 1470) | private void acceptFriendApplication(MethodCall methodCall, final Resu...
    method refuseFriendApplication (line 1487) | private void refuseFriendApplication(MethodCall methodCall, final Resu...
    method deleteFriendApplication (line 1503) | private void deleteFriendApplication(MethodCall methodCall, final Resu...
    method setFriendApplicationRead (line 1519) | private void setFriendApplicationRead(MethodCall methodCall, final Res...
    method createFriendGroup (line 1529) | private void createFriendGroup(MethodCall methodCall, final Result res...
    method getFriendGroups (line 1541) | private void getFriendGroups(MethodCall methodCall, final Result resul...
    method deleteFriendGroup (line 1552) | private void deleteFriendGroup(MethodCall methodCall, final Result res...
    method renameFriendGroup (line 1563) | private void renameFriendGroup(MethodCall methodCall, final Result res...
    method addFriendsToFriendGroup (line 1575) | private void addFriendsToFriendGroup(MethodCall methodCall, final Resu...
    method deleteFriendsFromFriendGroup (line 1587) | private void deleteFriendsFromFriendGroup(MethodCall methodCall, final...
    method searchLocalMessages (line 1596) | private void searchLocalMessages(MethodCall call, final Result result) {
    method invokeListener (line 1621) | public static void invokeListener(ListenerTypeEnum type, Object params) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/ValueCallBack.java
  class ValueCallBack (line 13) | public class ValueCallBack<T> implements V2TIMValueCallback<T> {
    method ValueCallBack (line 19) | public ValueCallBack(Result result) {
    method onSuccess (line 28) | @Override
    method onError (line 46) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/VoidCallBack.java
  class VoidCallBack (line 12) | public class VoidCallBack implements V2TIMCallback {
    method VoidCallBack (line 18) | public VoidCallBack(MethodChannel.Result result) {
    method onError (line 22) | @Override
    method onSuccess (line 29) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/entity/CustomConversationEntity.java
  class CustomConversationEntity (line 13) | public class CustomConversationEntity {
    method CustomConversationEntity (line 85) | public CustomConversationEntity() {
    method CustomConversationEntity (line 88) | public CustomConversationEntity(V2TIMConversation data) {
    method getConversationID (line 95) | public String getConversationID() {
    method setConversationID (line 99) | public void setConversationID(String conversationID) {
    method getType (line 103) | public int getType() {
    method setType (line 107) | public void setType(int type) {
    method getUserID (line 111) | public String getUserID() {
    method setUserID (line 115) | public void setUserID(String userID) {
    method getGroupID (line 119) | public String getGroupID() {
    method setGroupID (line 123) | public void setGroupID(String groupID) {
    method getShowName (line 127) | public String getShowName() {
    method setShowName (line 131) | public void setShowName(String showName) {
    method getFaceUrl (line 135) | public String getFaceUrl() {
    method setFaceUrl (line 139) | public void setFaceUrl(String faceUrl) {
    method getRecvOpt (line 143) | public int getRecvOpt() {
    method setRecvOpt (line 147) | public void setRecvOpt(int recvOpt) {
    method getGroupType (line 151) | public String getGroupType() {
    method setGroupType (line 155) | public void setGroupType(String groupType) {
    method getUnreadCount (line 159) | public int getUnreadCount() {
    method setUnreadCount (line 163) | public void setUnreadCount(int unreadCount) {
    method getLastMessage (line 167) | public CustomMessageEntity getLastMessage() {
    method setLastMessage (line 171) | public void setLastMessage(CustomMessageEntity lastMessage) {
    method getDraftText (line 175) | public String getDraftText() {
    method setDraftText (line 179) | public void setDraftText(String draftText) {
    method getDraftTimestamp (line 183) | public Long getDraftTimestamp() {
    method setDraftTimestamp (line 187) | public void setDraftTimestamp(Long draftTimestamp) {
    method getGroupAtInfoList (line 191) | public List<V2TIMGroupAtInfo> getGroupAtInfoList() {
    method setGroupAtInfoList (line 195) | public void setGroupAtInfoList(List<V2TIMGroupAtInfo> groupAtInfoList) {
    method isPinned (line 199) | public boolean isPinned() {
    method setPinned (line 203) | public void setPinned(boolean pinned) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/entity/CustomConversationResultEntity.java
  class CustomConversationResultEntity (line 14) | public class CustomConversationResultEntity {
    method CustomConversationResultEntity (line 31) | public CustomConversationResultEntity() {
    method CustomConversationResultEntity (line 34) | public CustomConversationResultEntity(V2TIMConversationResult data) {
    method getNextSeq (line 46) | public Long getNextSeq() {
    method setNextSeq (line 50) | public void setNextSeq(Long nextSeq) {
    method getFinished (line 54) | public Boolean getFinished() {
    method setFinished (line 58) | public void setFinished(Boolean finished) {
    method getConversationList (line 62) | public List<CustomConversationEntity> getConversationList() {
    method setConversationList (line 66) | public void setConversationList(List<CustomConversationEntity> convers...

FILE: android/src/main/java/top/huic/tencent_im_plugin/entity/CustomFriendAddApplication.java
  class CustomFriendAddApplication (line 8) | public class CustomFriendAddApplication extends V2TIMFriendAddApplication {
    method CustomFriendAddApplication (line 9) | public CustomFriendAddApplication() {
    method CustomFriendAddApplication (line 13) | public CustomFriendAddApplication(String userID) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/entity/CustomMessageEntity.java
  class CustomMessageEntity (line 20) | public class CustomMessageEntity implements Serializable {
    method CustomMessageEntity (line 138) | public CustomMessageEntity() {
    method CustomMessageEntity (line 141) | public CustomMessageEntity(V2TIMMessage message) {
    method getMsgID (line 154) | public String getMsgID() {
    method setMsgID (line 158) | public void setMsgID(String msgID) {
    method getTimestamp (line 162) | public Long getTimestamp() {
    method setTimestamp (line 166) | public void setTimestamp(Long timestamp) {
    method getSender (line 170) | public String getSender() {
    method setSender (line 174) | public void setSender(String sender) {
    method getNickName (line 178) | public String getNickName() {
    method setNickName (line 182) | public void setNickName(String nickName) {
    method getFriendRemark (line 186) | public String getFriendRemark() {
    method setFriendRemark (line 190) | public void setFriendRemark(String friendRemark) {
    method getFaceUrl (line 194) | public String getFaceUrl() {
    method setFaceUrl (line 198) | public void setFaceUrl(String faceUrl) {
    method getNameCard (line 202) | public String getNameCard() {
    method setNameCard (line 206) | public void setNameCard(String nameCard) {
    method getGroupID (line 210) | public String getGroupID() {
    method setGroupID (line 214) | public void setGroupID(String groupID) {
    method getUserID (line 218) | public String getUserID() {
    method setUserID (line 222) | public void setUserID(String userID) {
    method getStatus (line 226) | public Integer getStatus() {
    method setStatus (line 230) | public void setStatus(Integer status) {
    method getElemType (line 234) | public Integer getElemType() {
    method setElemType (line 238) | public void setElemType(Integer elemType) {
    method getLocalCustomData (line 242) | public String getLocalCustomData() {
    method setLocalCustomData (line 246) | public void setLocalCustomData(String localCustomData) {
    method getLocalCustomInt (line 250) | public Integer getLocalCustomInt() {
    method setLocalCustomInt (line 254) | public void setLocalCustomInt(Integer localCustomInt) {
    method getSelf (line 258) | public Boolean getSelf() {
    method setSelf (line 262) | public void setSelf(Boolean self) {
    method getRead (line 266) | public Boolean getRead() {
    method setRead (line 270) | public void setRead(Boolean read) {
    method getPeerRead (line 274) | public Boolean getPeerRead() {
    method setPeerRead (line 278) | public void setPeerRead(Boolean peerRead) {
    method getPriority (line 282) | public Integer getPriority() {
    method setPriority (line 286) | public void setPriority(Integer priority) {
    method getOfflinePushInfo (line 290) | public V2TIMOfflinePushInfo getOfflinePushInfo() {
    method setOfflinePushInfo (line 294) | public void setOfflinePushInfo(V2TIMOfflinePushInfo offlinePushInfo) {
    method getGroupAtUserList (line 298) | public List<String> getGroupAtUserList() {
    method setGroupAtUserList (line 302) | public void setGroupAtUserList(List<String> groupAtUserList) {
    method getSeq (line 306) | public Long getSeq() {
    method setSeq (line 310) | public void setSeq(Long seq) {
    method getNote (line 314) | public String getNote() {
    method setNote (line 318) | public void setNote(String note) {
    method getNode (line 322) | public AbstractMessageEntity getNode() {
    method setNode (line 326) | public void setNode(AbstractMessageEntity node) {
    method getRandom (line 330) | public long getRandom() {
    method setRandom (line 334) | public void setRandom(long random) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/entity/FindFriendApplicationEntity.java
  class FindFriendApplicationEntity (line 6) | public class FindFriendApplicationEntity {
    method getUserID (line 17) | public String getUserID() {
    method setUserID (line 21) | public void setUserID(String userID) {
    method getType (line 25) | public int getType() {
    method setType (line 29) | public void setType(int type) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/entity/FindGroupApplicationEntity.java
  class FindGroupApplicationEntity (line 6) | public class FindGroupApplicationEntity {
    method getFromUser (line 17) | public String getFromUser() {
    method setFromUser (line 21) | public void setFromUser(String fromUser) {
    method getGroupID (line 25) | public String getGroupID() {
    method setGroupID (line 29) | public void setGroupID(String groupID) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/entity/FindMessageEntity.java
  class FindMessageEntity (line 6) | public class FindMessageEntity {
    method FindMessageEntity (line 12) | public FindMessageEntity() {
    method FindMessageEntity (line 15) | public FindMessageEntity(String msgId) {
    method getMsgId (line 19) | public String getMsgId() {
    method setMsgId (line 23) | public void setMsgId(String msgId) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/enums/ListenerTypeEnum.java
  type ListenerTypeEnum (line 6) | public enum ListenerTypeEnum {

FILE: android/src/main/java/top/huic/tencent_im_plugin/enums/MessageNodeType.java
  type MessageNodeType (line 22) | public enum MessageNodeType {
    method getElemByMessage (line 27) | @Override
    method getElemByMessage (line 37) | @Override
    method getElemByMessage (line 47) | @Override
    method getElemByMessage (line 57) | @Override
    method getElemByMessage (line 67) | @Override
    method getElemByMessage (line 77) | @Override
    method getElemByMessage (line 87) | @Override
    method getElemByMessage (line 97) | @Override
    method getElemByMessage (line 107) | @Override
    method getElemByMessage (line 117) | @Override
    method MessageNodeType (line 129) | MessageNodeType(AbstractMessageNode messageNodeInterface) {
    method getMessageNodeInterface (line 136) | public AbstractMessageNode getMessageNodeInterface() {
    method getElemByMessage (line 146) | public abstract V2TIMElem getElemByMessage(V2TIMMessage message);
    method getMessageNodeTypeByV2TIMConstant (line 154) | public static MessageNodeType getMessageNodeTypeByV2TIMConstant(int co...

FILE: android/src/main/java/top/huic/tencent_im_plugin/listener/CustomAdvancedMsgListener.java
  class CustomAdvancedMsgListener (line 16) | public class CustomAdvancedMsgListener extends V2TIMAdvancedMsgListener {
    method onRecvNewMessage (line 20) | @Override
    method onRecvC2CReadReceipt (line 29) | @Override
    method onRecvMessageRevoked (line 38) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/listener/CustomConversationListener.java
  class CustomConversationListener (line 16) | public class CustomConversationListener extends V2TIMConversationListener {
    method onSyncServerStart (line 20) | @Override
    method onSyncServerFinish (line 29) | @Override
    method onSyncServerFailed (line 38) | @Override
    method onNewConversation (line 47) | @Override
    method onConversationChanged (line 60) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/listener/CustomFriendshipListener.java
  class CustomFriendshipListener (line 15) | public class CustomFriendshipListener extends V2TIMFriendshipListener {
    method onFriendApplicationListAdded (line 22) | @Override
    method onFriendApplicationListDeleted (line 36) | @Override
    method onFriendApplicationListRead (line 45) | @Override
    method onFriendListAdded (line 54) | @Override
    method onFriendListDeleted (line 66) | @Override
    method onBlackListAdd (line 75) | @Override
    method onBlackListDeleted (line 84) | @Override
    method onFriendInfoChanged (line 93) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/listener/CustomGroupListener.java
  class CustomGroupListener (line 18) | public class CustomGroupListener extends V2TIMGroupListener {
    method onMemberEnter (line 22) | @Override
    method onMemberLeave (line 36) | @Override
    method onMemberInvited (line 50) | @Override
    method onMemberKicked (line 65) | @Override
    method onMemberInfoChanged (line 80) | @Override
    method onGroupCreated (line 94) | @Override
    method onGroupDismissed (line 103) | @Override
    method onGroupRecycled (line 117) | @Override
    method onGroupInfoChanged (line 131) | @Override
    method onReceiveJoinApplication (line 145) | @Override
    method onApplicationProcessed (line 160) | @Override
    method onGrantAdministrator (line 176) | @Override
    method onRevokeAdministrator (line 191) | @Override
    method onQuitFromGroup (line 206) | @Override
    method onReceiveRESTCustomData (line 215) | @Override
    method onGroupAttributeChanged (line 229) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/listener/CustomSDKListener.java
  class CustomSDKListener (line 14) | public class CustomSDKListener extends V2TIMSDKListener {
    method onConnecting (line 18) | @Override
    method onConnectSuccess (line 27) | @Override
    method onConnectFailed (line 36) | @Override
    method onKickedOffline (line 50) | @Override
    method onSelfInfoUpdated (line 59) | @Override
    method onUserSigExpired (line 68) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/listener/CustomSignalingListener.java
  class CustomSignalingListener (line 14) | public class CustomSignalingListener extends V2TIMSignalingListener {
    method onReceiveNewInvitation (line 18) | @Override
    method onInviteeAccepted (line 35) | @Override
    method onInviteeRejected (line 50) | @Override
    method onInvitationCancelled (line 65) | @Override
    method onInvitationTimeout (line 80) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/AbstractMessageNode.java
  class AbstractMessageNode (line 12) | public abstract class AbstractMessageNode<N, E extends AbstractMessageEn...
    method getV2TIMMessage (line 19) | public V2TIMMessage getV2TIMMessage(E entity) {
    method getNote (line 28) | public abstract String getNote(N elem);
    method analysis (line 36) | public abstract E analysis(N elem);
    method getEntityClass (line 43) | public abstract Class<E> getEntityClass();

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/CustomMessageNode.java
  class CustomMessageNode (line 12) | public class CustomMessageNode extends AbstractMessageNode<V2TIMCustomEl...
    method getV2TIMMessage (line 14) | @Override
    method getNote (line 19) | @Override
    method analysis (line 24) | @Override
    method getEntityClass (line 29) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/FaceMessageNode.java
  class FaceMessageNode (line 12) | public class FaceMessageNode extends AbstractMessageNode<V2TIMFaceElem, ...
    method getV2TIMMessage (line 14) | @Override
    method getNote (line 19) | @Override
    method analysis (line 24) | @Override
    method getEntityClass (line 29) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/FileMessageNode.java
  class FileMessageNode (line 12) | public class FileMessageNode extends AbstractMessageNode<V2TIMFileElem, ...
    method getV2TIMMessage (line 13) | @Override
    method getNote (line 18) | @Override
    method analysis (line 23) | @Override
    method getEntityClass (line 28) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/GroupTipsMessageNode.java
  class GroupTipsMessageNode (line 10) | public class GroupTipsMessageNode extends AbstractMessageNode<V2TIMGroup...
    method getNote (line 11) | @Override
    method analysis (line 16) | @Override
    method getEntityClass (line 21) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/ImageMessageNode.java
  class ImageMessageNode (line 12) | public class ImageMessageNode extends AbstractMessageNode<V2TIMImageElem...
    method getV2TIMMessage (line 13) | @Override
    method getNote (line 18) | @Override
    method analysis (line 23) | @Override
    method getEntityClass (line 31) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/LocationMessageNode.java
  class LocationMessageNode (line 12) | public class LocationMessageNode extends AbstractMessageNode<V2TIMLocati...
    method getV2TIMMessage (line 13) | @Override
    method getNote (line 18) | @Override
    method analysis (line 23) | @Override
    method getEntityClass (line 28) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/SoundMessageNode.java
  class SoundMessageNode (line 12) | public class SoundMessageNode extends AbstractMessageNode<V2TIMSoundElem...
    method getV2TIMMessage (line 14) | @Override
    method getNote (line 19) | @Override
    method analysis (line 24) | @Override
    method getEntityClass (line 29) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/TextMessageNode.java
  class TextMessageNode (line 15) | public class TextMessageNode extends AbstractMessageNode<V2TIMTextElem, ...
    method getV2TIMMessage (line 16) | @Override
    method getNote (line 36) | @Override
    method analysis (line 41) | @Override
    method getEntityClass (line 46) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/VideoMessageNode.java
  class VideoMessageNode (line 12) | public class VideoMessageNode extends AbstractMessageNode<V2TIMVideoElem...
    method getV2TIMMessage (line 13) | @Override
    method getNote (line 23) | @Override
    method analysis (line 28) | @Override
    method getEntityClass (line 33) | @Override

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/AbstractMessageEntity.java
  class AbstractMessageEntity (line 12) | public class AbstractMessageEntity implements Serializable {
    method AbstractMessageEntity (line 15) | public AbstractMessageEntity(MessageNodeType nodeType) {
    method getNodeType (line 19) | public MessageNodeType getNodeType() {
    method setNodeType (line 23) | public void setNodeType(MessageNodeType nodeType) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/CustomMessageEntity.java
  class CustomMessageEntity (line 12) | public class CustomMessageEntity extends AbstractMessageEntity {
    method CustomMessageEntity (line 28) | public CustomMessageEntity() {
    method CustomMessageEntity (line 32) | public CustomMessageEntity(V2TIMCustomElem elem) {
    method getData (line 45) | public String getData() {
    method setData (line 49) | public void setData(String data) {
    method getDesc (line 53) | public String getDesc() {
    method setDesc (line 57) | public void setDesc(String desc) {
    method getExt (line 61) | public String getExt() {
    method setExt (line 65) | public void setExt(String ext) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/FaceMessageEntity.java
  class FaceMessageEntity (line 10) | public class FaceMessageEntity extends AbstractMessageEntity {
    method FaceMessageEntity (line 23) | public FaceMessageEntity() {
    method FaceMessageEntity (line 27) | public FaceMessageEntity(V2TIMFaceElem elem) {
    method getIndex (line 33) | public int getIndex() {
    method setIndex (line 37) | public void setIndex(int index) {
    method getData (line 41) | public String getData() {
    method setData (line 45) | public void setData(String data) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/FileMessageEntity.java
  class FileMessageEntity (line 10) | public class FileMessageEntity extends AbstractMessageEntity {
    method FileMessageEntity (line 31) | public FileMessageEntity() {
    method FileMessageEntity (line 35) | public FileMessageEntity(V2TIMFileElem elem) {
    method getFilePath (line 43) | public String getFilePath() {
    method setFilePath (line 47) | public void setFilePath(String filePath) {
    method getFileName (line 51) | public String getFileName() {
    method setFileName (line 55) | public void setFileName(String fileName) {
    method getUuid (line 59) | public String getUuid() {
    method setUuid (line 63) | public void setUuid(String uuid) {
    method getSize (line 67) | public int getSize() {
    method setSize (line 71) | public void setSize(int size) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/GroupTipsMessageEntity.java
  class GroupTipsMessageEntity (line 17) | public class GroupTipsMessageEntity extends AbstractMessageEntity {
    method GroupTipsMessageEntity (line 54) | public GroupTipsMessageEntity() {
    method GroupTipsMessageEntity (line 58) | public GroupTipsMessageEntity(V2TIMGroupTipsElem elem){
    method getGroupID (line 69) | public String getGroupID() {
    method setGroupID (line 73) | public void setGroupID(String groupID) {
    method getType (line 77) | public int getType() {
    method setType (line 81) | public void setType(int type) {
    method getOpMember (line 85) | public V2TIMGroupMemberInfo getOpMember() {
    method setOpMember (line 89) | public void setOpMember(V2TIMGroupMemberInfo opMember) {
    method getMemberList (line 93) | public List<V2TIMGroupMemberInfo> getMemberList() {
    method setMemberList (line 97) | public void setMemberList(List<V2TIMGroupMemberInfo> memberList) {
    method getGroupChangeInfoList (line 101) | public List<V2TIMGroupChangeInfo> getGroupChangeInfoList() {
    method setGroupChangeInfoList (line 105) | public void setGroupChangeInfoList(List<V2TIMGroupChangeInfo> groupCha...
    method getMemberChangeInfoList (line 109) | public List<V2TIMGroupMemberChangeInfo> getMemberChangeInfoList() {
    method setMemberChangeInfoList (line 113) | public void setMemberChangeInfoList(List<V2TIMGroupMemberChangeInfo> m...
    method getMemberCount (line 117) | public int getMemberCount() {
    method setMemberCount (line 121) | public void setMemberCount(int memberCount) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/ImageMessageEntity.java
  class ImageMessageEntity (line 14) | public class ImageMessageEntity extends AbstractMessageEntity {
    method ImageMessageEntity (line 25) | public ImageMessageEntity() {
    method ImageMessageEntity (line 29) | public ImageMessageEntity(V2TIMImageElem elem) {
    method getPath (line 35) | public String getPath() {
    method setPath (line 39) | public void setPath(String path) {
    method getImageData (line 43) | public List<V2TIMImageElem.V2TIMImage> getImageData() {
    method setImageData (line 47) | public void setImageData(List<V2TIMImageElem.V2TIMImage> imageData) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/LocationMessageEntity.java
  class LocationMessageEntity (line 12) | public class LocationMessageEntity extends AbstractMessageEntity {
    method LocationMessageEntity (line 28) | public LocationMessageEntity() {
    method LocationMessageEntity (line 32) | public LocationMessageEntity(V2TIMLocationElem elem) {
    method getDesc (line 39) | public String getDesc() {
    method setDesc (line 43) | public void setDesc(String desc) {
    method getLatitude (line 47) | public double getLatitude() {
    method setLatitude (line 51) | public void setLatitude(double latitude) {
    method getLongitude (line 55) | public double getLongitude() {
    method setLongitude (line 59) | public void setLongitude(double longitude) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/SoundMessageEntity.java
  class SoundMessageEntity (line 12) | public class SoundMessageEntity extends AbstractMessageEntity {
    method SoundMessageEntity (line 34) | public SoundMessageEntity() {
    method SoundMessageEntity (line 38) | public SoundMessageEntity(V2TIMSoundElem elem) {
    method getPath (line 46) | public String getPath() {
    method setPath (line 50) | public void setPath(String path) {
    method getDuration (line 54) | public Integer getDuration() {
    method setDuration (line 58) | public void setDuration(Integer duration) {
    method getDataSize (line 62) | public Integer getDataSize() {
    method setDataSize (line 66) | public void setDataSize(Integer dataSize) {
    method getUuid (line 70) | public String getUuid() {
    method setUuid (line 74) | public void setUuid(String uuid) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/TextMessageEntity.java
  class TextMessageEntity (line 14) | public class TextMessageEntity extends AbstractMessageEntity {
    method TextMessageEntity (line 30) | public TextMessageEntity() {
    method TextMessageEntity (line 34) | public TextMessageEntity(V2TIMTextElem elem) {
    method getContent (line 39) | public String getContent() {
    method setContent (line 43) | public void setContent(String content) {
    method getAtUserList (line 47) | public List<String> getAtUserList() {
    method setAtUserList (line 51) | public void setAtUserList(List<String> atUserList) {
    method getAtAll (line 55) | public Boolean getAtAll() {
    method setAtAll (line 59) | public void setAtAll(Boolean atAll) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/message/entity/VideoMessageEntity.java
  class VideoMessageEntity (line 14) | public class VideoMessageEntity extends AbstractMessageEntity implements...
    method VideoMessageEntity (line 52) | public VideoMessageEntity() {
    method VideoMessageEntity (line 56) | public VideoMessageEntity(V2TIMVideoElem elem) {
    method getVideoPath (line 69) | public String getVideoPath() {
    method setVideoPath (line 73) | public void setVideoPath(String videoPath) {
    method getVideoUuid (line 77) | public String getVideoUuid() {
    method setVideoUuid (line 81) | public void setVideoUuid(String videoUuid) {
    method getVideoSize (line 85) | public int getVideoSize() {
    method setVideoSize (line 89) | public void setVideoSize(int videoSize) {
    method getDuration (line 93) | public int getDuration() {
    method setDuration (line 97) | public void setDuration(int duration) {
    method getSnapshotPath (line 101) | public String getSnapshotPath() {
    method setSnapshotPath (line 105) | public void setSnapshotPath(String snapshotPath) {
    method getSnapshotUuid (line 109) | public String getSnapshotUuid() {
    method setSnapshotUuid (line 113) | public void setSnapshotUuid(String snapshotUuid) {
    method getSnapshotSize (line 117) | public int getSnapshotSize() {
    method setSnapshotSize (line 121) | public void setSnapshotSize(int snapshotSize) {
    method getSnapshotWidth (line 125) | public int getSnapshotWidth() {
    method setSnapshotWidth (line 129) | public void setSnapshotWidth(int snapshotWidth) {
    method getSnapshotHeight (line 133) | public int getSnapshotHeight() {
    method setSnapshotHeight (line 137) | public void setSnapshotHeight(int snapshotHeight) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/util/BeanUtils.java
  class BeanUtils (line 12) | public class BeanUtils {
    method copyProperties (line 20) | public static void copyProperties(Object source, Object target, String...

FILE: android/src/main/java/top/huic/tencent_im_plugin/util/CommonUtil.java
  class CommonUtil (line 12) | public class CommonUtil {
    method getParam (line 25) | public static <T> T getParam(MethodCall methodCall, MethodChannel.Resu...
    method runMainThreadReturn (line 40) | public static void runMainThreadReturn(final MethodChannel.Result resu...
    method runMainThreadReturnError (line 57) | public static void runMainThreadReturnError(final MethodChannel.Result...
    method runMainThreadMethod (line 69) | public static void runMainThreadMethod(Runnable runnable){

FILE: android/src/main/java/top/huic/tencent_im_plugin/util/JsonUtil.java
  class JsonUtil (line 11) | public class JsonUtil {
    method process (line 16) | @Override
    method toJSONString (line 31) | public static String toJSONString(Object data) {

FILE: android/src/main/java/top/huic/tencent_im_plugin/util/TencentImUtils.java
  class TencentImUtils (line 24) | public class TencentImUtils {
    method getFriendApplicationByFindGroupApplicationEntity (line 32) | public static void getFriendApplicationByFindGroupApplicationEntity(St...
    method getFriendApplicationByFindGroupApplicationEntity (line 42) | public static void getFriendApplicationByFindGroupApplicationEntity(fi...
    method getGroupApplicationByFindGroupApplicationEntity (line 70) | public static void getGroupApplicationByFindGroupApplicationEntity(Str...
    method getGroupApplicationByFindGroupApplicationEntity (line 80) | public static void getGroupApplicationByFindGroupApplicationEntity(fin...
    method getMessageByFindMessageEntity (line 108) | public static void getMessageByFindMessageEntity(String json, ValueCal...
    method getMessageByFindMessageEntity (line 118) | public static void getMessageByFindMessageEntity(final FindMessageEnti...
    method getMessageByFindMessageEntity (line 142) | public static void getMessageByFindMessageEntity(List<FindMessageEntit...

FILE: example/android/app/src/main/java/top/huic/tencent_im_plugin_example/MainActivity.java
  class MainActivity (line 15) | public class MainActivity extends FlutterActivity {
    method onCreate (line 22) | @Override
    method configureFlutterEngine (line 28) | @Override

FILE: example/lib/main.dart
  function main (line 8) | void main()
  class MyApp (line 10) | class MyApp extends StatefulWidget {
    method createState (line 12) | _MyAppState createState()
  class _MyAppState (line 15) | class _MyAppState extends State<MyApp> {
    method build (line 17) | Widget build(BuildContext context)

FILE: example/lib/page/chat.dart
  class Chat (line 28) | class Chat extends StatefulWidget {
    method createState (line 30) | _ChatState createState()
  class _ChatState (line 33) | class _ChatState extends State<Chat> {
    method initState (line 50) | void initState()
    method dispose (line 64) | void dispose()
    method build (line 304) | Widget build(BuildContext context)

FILE: example/lib/page/home.dart
  class HomePage (line 6) | class HomePage extends StatefulWidget {
    method createState (line 8) | _HomePageState createState()
  class _HomePageState (line 11) | class _HomePageState extends State<HomePage> {
    method initState (line 13) | void initState()
    method build (line 19) | Widget build(BuildContext context)

FILE: example/lib/page/interfaces_test.dart
  type TestCallback (line 18) | typedef TestCallback = Future<dynamic> Function();
  class InterfacesTest (line 21) | class InterfacesTest extends StatefulWidget {
    method createState (line 23) | _InterfacesTestState createState()
  class _InterfacesTestState (line 26) | class _InterfacesTestState extends State<InterfacesTest> {
    method initState (line 227) | void initState()
    method dispose (line 237) | void dispose()
    method build (line 276) | Widget build(BuildContext context)

FILE: example/lib/page/login.dart
  class Login (line 7) | class Login extends StatefulWidget {
    method createState (line 9) | _LoginState createState()
  class _LoginState (line 12) | class _LoginState extends State<Login> {
    method initState (line 19) | void initState()
    method build (line 41) | Widget build(BuildContext context)

FILE: example/lib/page/main/components/conversation.dart
  class Conversation (line 10) | class Conversation extends StatefulWidget {
    method createState (line 12) | _ConversationState createState()
  class _ConversationState (line 15) | class _ConversationState extends State<Conversation> {
    method initState (line 23) | void initState()
    method dispose (line 33) | void dispose()
    method _onRefresh (line 46) | Future<dynamic> _onRefresh()
    method build (line 58) | Widget build(BuildContext context)

FILE: example/lib/page/main/components/friend.dart
  class Friend (line 13) | class Friend extends StatefulWidget {
    method createState (line 15) | _FriendState createState()
  class _FriendState (line 18) | class _FriendState extends State<Friend> {
    method initState (line 26) | void initState()
    method dispose (line 36) | void dispose()
    method _onRefresh (line 49) | Future<dynamic> _onRefresh()
    method build (line 54) | Widget build(BuildContext context)

FILE: example/lib/page/main/components/group.dart
  class Group (line 8) | class Group extends StatefulWidget {
    method createState (line 10) | _GroupState createState()
  class _GroupState (line 13) | class _GroupState extends State<Group> {
    method initState (line 21) | void initState()
    method dispose (line 31) | void dispose()
    method _onRefresh (line 40) | Future<dynamic> _onRefresh()
    method build (line 46) | Widget build(BuildContext context)

FILE: example/lib/page/main/main.dart
  class Main (line 15) | class Main extends StatefulWidget {
    method createState (line 17) | _MainState createState()
  class _MainState (line 20) | class _MainState extends State<Main> {
    method initState (line 28) | void initState()
    method _startConversation (line 52) | void _startConversation()
    method _startGroupChat (line 69) | void _startGroupChat()
    method _startAddFriend (line 92) | void _startAddFriend()
    method _showDialog (line 115) | Future<bool> _showDialog(String title, Widget child)
    method build (line 136) | Widget build(BuildContext context)
  class GroupSelect (line 198) | class GroupSelect<T> extends StatefulWidget {
    method createState (line 216) | _GroupSelectState createState()
  class _GroupSelectState (line 219) | class _GroupSelectState<T> extends State<GroupSelect> {
    method build (line 224) | Widget build(BuildContext context)

FILE: example/lib/utils/GenerateTestUserSig.dart
  class GenerateTestUserSig (line 11) | class GenerateTestUserSig {
    method genSig (line 17) | String genSig({
    method _getCurrentTime (line 44) | int _getCurrentTime()
    method _hmacsha256 (line 48) | String _hmacsha256({
    method _escape (line 62) | String _escape({

FILE: example/test/widget_test.dart
  function main (line 13) | void main()

FILE: lib/entity/conversation_entity.dart
  class ConversationEntity (line 10) | class ConversationEntity {

FILE: lib/entity/conversation_result_entity.dart
  class ConversationResultEntity (line 7) | class ConversationResultEntity {

FILE: lib/entity/download_progress_entity.dart
  class DownloadProgressEntity (line 6) | class DownloadProgressEntity {

FILE: lib/entity/error_entity.dart
  class ErrorEntity (line 4) | class ErrorEntity {

FILE: lib/entity/find_friend_application_entity.dart
  class FindFriendApplicationEntity (line 5) | class FindFriendApplicationEntity {
    method toJson (line 22) | Map<String, dynamic> toJson()

FILE: lib/entity/find_group_application_entity.dart
  class FindGroupApplicationEntity (line 2) | class FindGroupApplicationEntity {
    method toJson (line 14) | Map<String, dynamic> toJson()

FILE: lib/entity/find_message_entity.dart
  class FindMessageEntity (line 2) | class FindMessageEntity {
    method toJson (line 10) | Map<String, dynamic> toJson()

FILE: lib/entity/friend_add_application_entity.dart
  class FriendAddApplicationEntity (line 4) | class FriendAddApplicationEntity {
    method toJson (line 28) | Map<String, dynamic> toJson()

FILE: lib/entity/friend_application_entity.dart
  class FriendApplicationEntity (line 5) | class FriendApplicationEntity {

FILE: lib/entity/friend_application_result_entity.dart
  class FriendApplicationResultEntity (line 6) | class FriendApplicationResultEntity {

FILE: lib/entity/friend_check_result_entity.dart
  class FriendCheckResultEntity (line 5) | class FriendCheckResultEntity {

FILE: lib/entity/friend_group_entity.dart
  class FriendGroupEntity (line 4) | class FriendGroupEntity {

FILE: lib/entity/friend_info_entity.dart
  class FriendInfoEntity (line 5) | class FriendInfoEntity {
    method toJson (line 36) | Map<String, dynamic> toJson()

FILE: lib/entity/friend_info_result_entity.dart
  class FriendInfoResultEntity (line 6) | class FriendInfoResultEntity {

FILE: lib/entity/friend_operation_result_entity.dart
  class FriendOperationResultEntity (line 4) | class FriendOperationResultEntity {

FILE: lib/entity/group_administrator_op_entity.dart
  class GroupAdministratorOpEntity (line 6) | class GroupAdministratorOpEntity {

FILE: lib/entity/group_application_entity.dart
  class GroupApplicationEntity (line 7) | class GroupApplicationEntity {

FILE: lib/entity/group_application_processed_entity.dart
  class GroupApplicationProcessedEntity (line 5) | class GroupApplicationProcessedEntity {

FILE: lib/entity/group_application_result_entity.dart
  class GroupApplicationResultEntity (line 6) | class GroupApplicationResultEntity {

FILE: lib/entity/group_at_info_entity.dart
  class GroupAtInfoEntity (line 5) | class GroupAtInfoEntity {

FILE: lib/entity/group_attribute_changed_entity.dart
  class GroupAttributeChangedEntity (line 4) | class GroupAttributeChangedEntity {

FILE: lib/entity/group_changed_entity.dart
  class GroupChangedEntity (line 6) | class GroupChangedEntity {
  class GroupChangedInfoEntity (line 24) | class GroupChangedInfoEntity {

FILE: lib/entity/group_create_member_entity.dart
  class GroupCreateMemberEntity (line 4) | class GroupCreateMemberEntity {
    method toJson (line 16) | Map<String, dynamic> toJson()

FILE: lib/entity/group_dismissed_or_recycled_entity.dart
  class GroupDismissedOrRecycledEntity (line 5) | class GroupDismissedOrRecycledEntity {

FILE: lib/entity/group_info_entity.dart
  class GroupInfoEntity (line 8) | class GroupInfoEntity {
    method toJson (line 117) | Map<String, dynamic> toJson()

FILE: lib/entity/group_info_result_entity.dart
  class GroupInfoResultEntity (line 5) | class GroupInfoResultEntity {

FILE: lib/entity/group_member_changed_entity.dart
  class GroupMemberChangedEntity (line 5) | class GroupMemberChangedEntity {
  class GroupMemberChangedInfoEntity (line 23) | class GroupMemberChangedInfoEntity {

FILE: lib/entity/group_member_enter_entity.dart
  class GroupMemberEnterEntity (line 6) | class GroupMemberEnterEntity {

FILE: lib/entity/group_member_entity.dart
  class GroupMemberEntity (line 5) | class GroupMemberEntity {
    method toJson (line 52) | Map<String, dynamic> toJson()

FILE: lib/entity/group_member_info_result_entity.dart
  class GroupMemberInfoResultEntity (line 6) | class GroupMemberInfoResultEntity {

FILE: lib/entity/group_member_invited_or_kicked_entity.dart
  class GroupMemberInvitedOrKickedEntity (line 6) | class GroupMemberInvitedOrKickedEntity {

FILE: lib/entity/group_member_leave_entity.dart
  class GroupMemberLeaveEntity (line 5) | class GroupMemberLeaveEntity {

FILE: lib/entity/group_member_operation_result_entity.dart
  class GroupMemberOperationResultEntity (line 5) | class GroupMemberOperationResultEntity {

FILE: lib/entity/group_receive_join_application_entity.dart
  class GroupReceiveJoinApplicationEntity (line 5) | class GroupReceiveJoinApplicationEntity {

FILE: lib/entity/group_receive_rest_entity.dart
  class GroupReceiveRESTEntity (line 4) | class GroupReceiveRESTEntity {

FILE: lib/entity/message_entity.dart
  class MessageEntity (line 9) | class MessageEntity {
    method toJson (line 142) | Map<String, dynamic> toJson()

FILE: lib/entity/message_receipt_entity.dart
  class MessageReceiptEntity (line 4) | class MessageReceiptEntity {

FILE: lib/entity/message_search_param.dart
  class MessageSearchParam (line 8) | class MessageSearchParam {
    method toRawJson (line 50) | String toRawJson()
    method toJson (line 64) | Map<String, dynamic> toJson()

FILE: lib/entity/message_send_fail_entity.dart
  class MessageSendFailEntity (line 4) | class MessageSendFailEntity {

FILE: lib/entity/message_send_progress_entity.dart
  class MessageSendProgressEntity (line 4) | class MessageSendProgressEntity {

FILE: lib/entity/offline_push_info_entity.dart
  class OfflinePushInfoEntity (line 4) | class OfflinePushInfoEntity {
    method toJson (line 49) | Map<String, dynamic> toJson()

FILE: lib/entity/signaling_common_entity.dart
  class SignalingCommonEntity (line 4) | class SignalingCommonEntity {

FILE: lib/entity/signaling_info_entity.dart
  class SignalingInfoEntity (line 8) | class SignalingInfoEntity {
    method toJson (line 65) | Map<String, dynamic> toJson()

FILE: lib/entity/user_entity.dart
  class UserEntity (line 7) | class UserEntity {
    method toJson (line 63) | Map<String, dynamic> toJson()

FILE: lib/entity_factory.dart
  class EntityFactory (line 22) | class EntityFactory {
    method generateOBJ (line 23) | T? generateOBJ<T>(json)

FILE: lib/enums/conversation_type_enum.dart
  type ConversationTypeEnum (line 2) | enum ConversationTypeEnum {
  class ConversationTypeTool (line 13) | class ConversationTypeTool {
    method getByInt (line 17) | ConversationTypeEnum getByInt(int index)
    method toInt (line 21) | int toInt(ConversationTypeEnum level)

FILE: lib/enums/download_type_enum.dart
  type DownloadTypeEnum (line 2) | enum DownloadTypeEnum {
  class DownloadTypeTool (line 16) | class DownloadTypeTool {
    method getByInt (line 20) | DownloadTypeEnum getByInt(int index)
    method toInt (line 23) | int toInt(DownloadTypeEnum level)

FILE: lib/enums/friend_application_agree_type_enum.dart
  type FriendApplicationAgreeTypeEnum (line 2) | enum FriendApplicationAgreeTypeEnum {
  class FriendApplicationAgreeTypeTool (line 10) | class FriendApplicationAgreeTypeTool {
    method getByInt (line 14) | FriendApplicationAgreeTypeEnum getByInt(int index)
    method toInt (line 18) | int toInt(FriendApplicationAgreeTypeEnum level)

FILE: lib/enums/friend_application_type_enum.dart
  type FriendApplicationTypeEnum (line 2) | enum FriendApplicationTypeEnum {
  class FriendApplicationTypeTool (line 12) | class FriendApplicationTypeTool {
    method getByInt (line 16) | FriendApplicationTypeEnum getByInt(int index)
    method toInt (line 20) | int toInt(FriendApplicationTypeEnum level)

FILE: lib/enums/friend_relation_type_enum.dart
  type FriendRelationTypeEnum (line 2) | enum FriendRelationTypeEnum {
  class FriendRelationTypeTool (line 14) | class FriendRelationTypeTool {
    method getByInt (line 18) | FriendRelationTypeEnum getByInt(int index)
    method toInt (line 22) | int toInt(FriendRelationTypeEnum level)

FILE: lib/enums/friend_status_enum.dart
  type FriendStatusEnum (line 2) | enum FriendStatusEnum {
  class FriendStatusEnumTool (line 29) | class FriendStatusEnumTool {
    method getEnumByIndex (line 31) | FriendStatusEnum? getEnumByIndex(index)
    method getIndexByEnum (line 55) | int? getIndexByEnum(e)

FILE: lib/enums/friend_type_enum.dart
  type FriendTypeEnum (line 2) | enum FriendTypeEnum {
  class FriendTypeTool (line 10) | class FriendTypeTool {
    method getByInt (line 14) | FriendTypeEnum getByInt(int index)
    method toInt (line 17) | int toInt(FriendTypeEnum level)

FILE: lib/enums/get_message_type_enum.dart
  type GetMessageTypeEnum (line 2) | enum GetMessageTypeEnum {
  class GetMessageTypeTool (line 14) | class GetMessageTypeTool {
    method getByInt (line 18) | GetMessageTypeEnum getByInt(int index)
    method toInt (line 22) | int toInt(GetMessageTypeEnum level)

FILE: lib/enums/group_add_opt_enum.dart
  type GroupAddOptEnum (line 2) | enum GroupAddOptEnum {
  class GroupAddOptTool (line 13) | class GroupAddOptTool {
    method getByInt (line 17) | GroupAddOptEnum getByInt(int index)
    method toInt (line 20) | int toInt(GroupAddOptEnum level)

FILE: lib/enums/group_application_handler_result_enum.dart
  type GroupApplicationHandlerResultEnum (line 2) | enum GroupApplicationHandlerResultEnum {
  class GroupApplicationHandlerResultTool (line 10) | class GroupApplicationHandlerResultTool {
    method getByInt (line 14) | GroupApplicationHandlerResultEnum getByInt(int index)
    method toInt (line 18) | int toInt(GroupApplicationHandlerResultEnum level)

FILE: lib/enums/group_application_handler_status_enum.dart
  type GroupApplicationHandlerStatusEnum (line 2) | enum GroupApplicationHandlerStatusEnum {
  class GroupApplicationHandlerStatusTool (line 13) | class GroupApplicationHandlerStatusTool {
    method getByInt (line 17) | GroupApplicationHandlerStatusEnum getByInt(int index)
    method toInt (line 21) | int toInt(GroupApplicationHandlerStatusEnum level)

FILE: lib/enums/group_application_type_enum.dart
  type GroupApplicationTypeEnum (line 2) | enum GroupApplicationTypeEnum {
  class GroupApplicationTypeTool (line 10) | class GroupApplicationTypeTool {
    method getByInt (line 14) | GroupApplicationTypeEnum getByInt(int index)
    method toInt (line 18) | int toInt(GroupApplicationTypeEnum level)

FILE: lib/enums/group_at_type_enum.dart
  type GroupAtTypeEnum (line 2) | enum GroupAtTypeEnum {
  class GroupAtTypeTool (line 16) | class GroupAtTypeTool {
    method getByInt (line 20) | GroupAtTypeEnum getByInt(int index)
    method toInt (line 23) | int toInt(GroupAtTypeEnum level)

FILE: lib/enums/group_info_changed_type_enum.dart
  type GroupInfoChangedTypeEnum (line 2) | enum GroupInfoChangedTypeEnum {
  class GroupInfoChangedTypeTool (line 25) | class GroupInfoChangedTypeTool {
    method getByInt (line 29) | GroupInfoChangedTypeEnum getByInt(int index)
    method toInt (line 33) | int toInt(GroupInfoChangedTypeEnum level)

FILE: lib/enums/group_member_filter_enum.dart
  type GroupMemberFilterEnum (line 2) | enum GroupMemberFilterEnum {
  class GroupMemberFilterTool (line 16) | class GroupMemberFilterTool {
    method getByInt (line 20) | GroupMemberFilterEnum getByInt(int index)
    method toInt (line 35) | int toInt(GroupMemberFilterEnum role)

FILE: lib/enums/group_member_role_enum.dart
  type GroupMemberRoleEnum (line 2) | enum GroupMemberRoleEnum {
  class GroupMemberRoleTool (line 16) | class GroupMemberRoleTool {
    method getByInt (line 20) | GroupMemberRoleEnum getByInt(int index)
    method toInt (line 35) | int toInt(GroupMemberRoleEnum role)

FILE: lib/enums/group_system_type.dart
  type GroupSystemType (line 2) | enum GroupSystemType {
  class GroupSystemTypeTool (line 21) | class GroupSystemTypeTool {
    method intToGroupSystemType (line 23) | GroupSystemType? intToGroupSystemType(int value)

FILE: lib/enums/group_tips_group_info_type.dart
  type GroupTipsGroupInfoType (line 2) | enum GroupTipsGroupInfoType {

FILE: lib/enums/group_tips_type_enum.dart
  type GroupTipsTypeEnum (line 2) | enum GroupTipsTypeEnum {
  class GroupTipsTypeTool (line 32) | class GroupTipsTypeTool {
    method getByInt (line 36) | GroupTipsTypeEnum getByInt(int index)
    method toInt (line 40) | int toInt(GroupTipsTypeEnum data)

FILE: lib/enums/group_type_enum.dart
  type GroupTypeEnum (line 4) | enum GroupTypeEnum {
  class GroupTypeTool (line 18) | class GroupTypeTool {
    method getByString (line 22) | GroupTypeEnum? getByString(String type)
    method toTypeString (line 26) | String toTypeString(GroupTypeEnum type)

FILE: lib/enums/image_type_enum.dart
  type ImageTypeEnum (line 6) | enum ImageTypeEnum {
  class ImageTypeTool (line 17) | class ImageTypeTool {
    method getByInt (line 21) | ImageTypeEnum getByInt(int /*!*/ index)
    method toInt (line 39) | int toInt(ImageTypeEnum data)

FILE: lib/enums/log_print_level.dart
  type LogPrintLevel (line 2) | enum LogPrintLevel {
  class LogPrintLevelTool (line 10) | class LogPrintLevelTool {
    method toInt (line 12) | int? toInt(LogPrintLevel level)

FILE: lib/enums/login_status_enum.dart
  type LoginStatusEnum (line 2) | enum LoginStatusEnum {
  class LoginStatusTool (line 11) | class LoginStatusTool {
    method getByInt (line 15) | LoginStatusEnum getByInt(int index)

FILE: lib/enums/message_elem_type_enum.dart
  type MessageElemTypeEnum (line 13) | enum MessageElemTypeEnum {
  class MessageElemTypeTool (line 45) | class MessageElemTypeTool {
    method getByInt (line 49) | MessageElemTypeEnum getByInt(int index)
    method toInt (line 53) | int toInt(MessageElemTypeEnum level)
    method getMessageNodeByMessageNodeType (line 58) | MessageNode? getMessageNodeByMessageNodeType(

FILE: lib/enums/message_priority_enum.dart
  type MessagePriorityEnum (line 2) | enum MessagePriorityEnum {
  class MessagePriorityTool (line 15) | class MessagePriorityTool {
    method getByInt (line 19) | MessagePriorityEnum getByInt(int index)
    method toInt (line 22) | int toInt(MessagePriorityEnum level)

FILE: lib/enums/message_status_enum.dart
  type MessageStatusEnum (line 2) | enum MessageStatusEnum {
  class MessageStatusTool (line 25) | class MessageStatusTool {
    method getByInt (line 29) | MessageStatusEnum getByInt(int index)
    method toInt (line 50) | int toInt(MessageStatusEnum status)

FILE: lib/enums/operation_result_enum.dart
  type OperationResultEnum (line 2) | enum OperationResultEnum {
  class OperationResultTool (line 16) | class OperationResultTool {
    method getByInt (line 20) | OperationResultEnum getByInt(int index)
    method toInt (line 24) | int toInt(OperationResultEnum level)

FILE: lib/enums/pendency_examine_type_enum.dart
  type PendencyExamineTypeEnum (line 2) | enum PendencyExamineTypeEnum {
  class PendencyExamineTypeEnumTool (line 12) | class PendencyExamineTypeEnumTool {
    method getEnumByIndex (line 14) | PendencyExamineTypeEnum? getEnumByIndex(index)
    method getIndexByEnum (line 28) | int? getIndexByEnum(e)

FILE: lib/enums/pendency_type_enum.dart
  type PendencyTypeEnum (line 2) | enum PendencyTypeEnum {
  class PendencyTypeTool (line 14) | class PendencyTypeTool {
    method getEnumByIndex (line 16) | PendencyTypeEnum? getEnumByIndex(index)
    method getIndexByEnum (line 30) | int? getIndexByEnum(e)

FILE: lib/enums/receive_message_opt_enum.dart
  type ReceiveMessageOptEnum (line 2) | enum ReceiveMessageOptEnum {
  class ReceiveMessageOptTool (line 13) | class ReceiveMessageOptTool {
    method getByInt (line 17) | ReceiveMessageOptEnum getByInt(int index)
    method toInt (line 20) | int toInt(ReceiveMessageOptEnum level)

FILE: lib/enums/signaling_action_type_enum.dart
  type SignalingActionTypeEnum (line 2) | enum SignalingActionTypeEnum {
  class SignalingActionTypeTool (line 15) | class SignalingActionTypeTool {
    method getByInt (line 19) | SignalingActionTypeEnum getByInt(int index)
    method toInt (line 23) | int toInt(SignalingActionTypeEnum level)

FILE: lib/enums/sns_tips_type.dart
  type SnsTipsType (line 2) | enum SnsTipsType {

FILE: lib/enums/tencent_im_listener_type_enum.dart
  type TencentImListenerTypeEnum (line 2) | enum TencentImListenerTypeEnum {

FILE: lib/enums/user_allow_type_enum.dart
  type UserAllowTypeEnum (line 2) | enum UserAllowTypeEnum {
  class UserAllowTypeTool (line 11) | class UserAllowTypeTool {
    method getByInt (line 15) | UserAllowTypeEnum getByInt(int index)
    method toInt (line 19) | int toInt(UserAllowTypeEnum level)

FILE: lib/enums/user_gender_enum.dart
  type UserGenderEnum (line 2) | enum UserGenderEnum {
  class UserGenderTool (line 11) | class UserGenderTool {
    method getByInt (line 15) | UserGenderEnum getByInt(int index)
    method toInt (line 18) | int toInt(UserGenderEnum level)

FILE: lib/list_util.dart
  class ListUtil (line 5) | class ListUtil {
    method generateOBJList (line 7) | List<T> generateOBJList<T>(arr)

FILE: lib/listener/tencent_im_plugin_listener.dart
  class TencentImPluginListener (line 32) | class TencentImPluginListener {
    method addListener (line 217) | void addListener(TencentImListenerValue func)
    method removeListener (line 222) | void removeListener(TencentImListenerValue func)
  type TencentImListenerValue (line 228) | typedef TencentImListenerValue<P> = void Function(

FILE: lib/message_node/custom_message_node.dart
  class CustomMessageNode (line 5) | class CustomMessageNode extends MessageNode {
    method toJson (line 28) | Map<String, dynamic> toJson()

FILE: lib/message_node/face_message_node.dart
  class FaceMessageNode (line 5) | class FaceMessageNode extends MessageNode {
    method toJson (line 24) | Map<String, dynamic> toJson()

FILE: lib/message_node/file_message_node.dart
  class FileMessageNode (line 5) | class FileMessageNode extends MessageNode {
    method toJson (line 37) | Map<String, dynamic> toJson()

FILE: lib/message_node/group_tips_message_node.dart
  class GroupTipsMessageNode (line 10) | class GroupTipsMessageNode extends MessageNode {

FILE: lib/message_node/image_message_node.dart
  class ImageMessageNode (line 7) | class ImageMessageNode extends MessageNode {
    method toJson (line 34) | Map<String, dynamic> toJson()
  class ImageEntity (line 42) | class ImageEntity {

FILE: lib/message_node/location_message_node.dart
  class LocationMessageNode (line 5) | class LocationMessageNode extends MessageNode {
    method toJson (line 29) | Map<String, dynamic> toJson()

FILE: lib/message_node/message_node.dart
  class MessageNode (line 4) | class MessageNode {
    method toJson (line 10) | Map<String, dynamic> toJson()

FILE: lib/message_node/sound_message_node.dart
  class SoundMessageNode (line 5) | class SoundMessageNode extends MessageNode {
    method toJson (line 38) | Map<String, dynamic> toJson()

FILE: lib/message_node/text_message_node.dart
  class TextMessageNode (line 5) | class TextMessageNode extends MessageNode {
    method toJson (line 34) | Map<String, dynamic> toJson()

FILE: lib/message_node/video_message_node.dart
  class VideoMessageNode (line 5) | class VideoMessageNode extends MessageNode {
    method toJson (line 72) | Map<String, dynamic> toJson()

FILE: lib/tencent_im_plugin.dart
  class TencentImPlugin (line 41) | class TencentImPlugin {
    method _getConversationID (line 54) | String _getConversationID({String? conversationID, String? userID, Str...
    method initSDK (line 68) | initSDK({required String appid, LogPrintLevel logPrintLevel: LogPrintL...
    method unInitSDK (line 73) | unInitSDK()
    method getVersion (line 77) | Future<String> getVersion()
    method getServerTime (line 81) | Future<int> getServerTime()
    method login (line 86) | Future<void> login({required String userID, required String userSig})
    method logout (line 91) | Future<void> logout()
    method getLoginStatus (line 95) | Future<LoginStatusEnum> getLoginStatus()
    method getLoginUser (line 99) | Future<String?> getLoginUser()
    method invite (line 108) | Future<String?> invite({required String invitee, required String data,...
    method inviteInGroup (line 125) | Future<String?> inviteInGroup({required String groupID, required List<...
    method cancel (line 138) | Future<String?> cancel({required String inviteID, required String data})
    method accept (line 148) | Future<String?> accept({required String inviteID, required String data})
    method reject (line 158) | Future<String?> reject({required String inviteID, required String data})
    method getSignalingInfo (line 168) | Future<SignalingInfoEntity> getSignalingInfo({required FindMessageEnti...
    method addInvitedSignaling (line 176) | Future<void> addInvitedSignaling({required SignalingInfoEntity info})
    method sendMessage (line 192) | Future<String?> sendMessage({
    method resendMessage (line 227) | Future<String?> resendMessage({
    method revokeMessage (line 254) | Future<void> revokeMessage({required FindMessageEntity message})
    method getHistoryMessageList (line 266) | Future<List<MessageEntity>> getHistoryMessageList({String? userID, Str...
    method getC2CHistoryMessageList (line 284) | Future<List<MessageEntity>> getC2CHistoryMessageList({required String ...
    method getGroupHistoryMessageList (line 299) | Future<List<MessageEntity>> getGroupHistoryMessageList({required Strin...
    method markMessageAsRead (line 313) | Future<void> markMessageAsRead({String? userID, String? groupID})
    method markC2CMessageAsRead (line 324) | Future<void> markC2CMessageAsRead({required String userID})
    method markGroupMessageAsRead (line 332) | Future<void> markGroupMessageAsRead({required String groupID})
    method deleteMessageFromLocalStorage (line 340) | Future<void> deleteMessageFromLocalStorage({required FindMessageEntity...
    method deleteMessages (line 353) | Future<void> deleteMessages({required List<FindMessageEntity> message})
    method insertGroupMessageToLocalStorage (line 363) | Future<void> insertGroupMessageToLocalStorage({required String groupID...
    method insertC2CMessageToLocalStorage (line 375) | Future<void> insertC2CMessageToLocalStorage({required String userID, r...
    method downloadVideo (line 386) | Future<void> downloadVideo({required FindMessageEntity message, requir...
    method downloadVideoThumbnail (line 396) | Future<void> downloadVideoThumbnail({required FindMessageEntity messag...
    method downloadSound (line 406) | Future<void> downloadSound({required FindMessageEntity message, requir...
    method downloadFile (line 416) | Future<void> downloadFile({required FindMessageEntity message, require...
    method setMessageLocalCustomStr (line 426) | Future<void> setMessageLocalCustomStr({required FindMessageEntity mess...
    method setMessageLocalCustomInt (line 436) | Future<void> setMessageLocalCustomInt({required FindMessageEntity mess...
    method findMessages (line 445) | Future<List<MessageEntity>> findMessages({required List<FindMessageEnt...
    method createGroup (line 455) | Future<String?> createGroup({required GroupInfoEntity info, List<Group...
    method joinGroup (line 468) | Future<void> joinGroup({required String groupID, required String messa...
    method quitGroup (line 477) | Future<void> quitGroup({required String groupID})
    method dismissGroup (line 485) | Future<void> dismissGroup({required String groupID})
    method getJoinedGroupList (line 492) | Future<List<GroupInfoEntity>> getJoinedGroupList()
    method getGroupsInfo (line 498) | Future<List<GroupInfoResultEntity>> getGroupsInfo({required List<Strin...
    method setGroupInfo (line 506) | Future<void> setGroupInfo({required GroupInfoEntity info})
    method searchGroups (line 517) | Future<List<GroupInfoResultEntity>> searchGroups({required List<String...
    method searchGroupMembers (line 533) | Future<void> searchGroupMembers({
    method setC2CReceiveMessageOpt (line 554) | Future<void> setC2CReceiveMessageOpt({required List<String> ids, requi...
    method setGroupReceiveMessageOpt (line 561) | Future<void> setGroupReceiveMessageOpt({required String groupID, requi...
    method getC2CReceiveMessageOpt (line 568) | Future<Map<String, ReceiveMessageOptEnum>> getC2CReceiveMessageOpt({re...
    method initGroupAttributes (line 583) | Future<void> initGroupAttributes({required String groupID, required Ma...
    method setGroupAttributes (line 593) | Future<void> setGroupAttributes({required String groupID, required Map...
    method deleteGroupAttributes (line 603) | Future<void> deleteGroupAttributes({required String groupID, List<Stri...
    method getGroupAttributes (line 616) | Future<Map<String, String>> getGroupAttributes({required String groupI...
    method getGroupOnlineMemberCount (line 629) | Future<int> getGroupOnlineMemberCount({required String groupID})
    method getGroupMemberList (line 639) | Future<GroupMemberInfoResultEntity> getGroupMemberList({required Strin...
    method getGroupMembersInfo (line 650) | Future<List<GroupMemberEntity>> getGroupMembersInfo({required String g...
    method setGroupMemberInfo (line 660) | Future<void> setGroupMemberInfo({required String groupID, required Gro...
    method muteGroupMember (line 671) | Future<void> muteGroupMember({required String groupID, required String...
    method inviteUserToGroup (line 682) | Future<List<GroupMemberOperationResultEntity>> inviteUserToGroup({requ...
    method kickGroupMember (line 693) | Future<List<GroupMemberOperationResultEntity>> kickGroupMember({requir...
    method setGroupMemberRole (line 705) | Future<void> setGroupMemberRole({required String groupID, required Str...
    method transferGroupOwner (line 712) | Future<void> transferGroupOwner({required String groupID, required Str...
    method getGroupApplicationList (line 717) | Future<GroupApplicationResultEntity> getGroupApplicationList()
    method acceptGroupApplication (line 724) | Future<void> acceptGroupApplication({required FindGroupApplicationEnti...
    method refuseGroupApplication (line 731) | Future<void> refuseGroupApplication({required FindGroupApplicationEnti...
    method setGroupApplicationRead (line 736) | Future<void> setGroupApplicationRead()
    method getConversationList (line 743) | Future<ConversationResultEntity> getConversationList({int nextSeq: 0, ...
    method getConversation (line 751) | Future<ConversationEntity> getConversation({String? conversationID, St...
    method deleteConversation (line 759) | Future<void> deleteConversation({String? conversationID, String? userI...
    method setConversationDraft (line 768) | Future<void> setConversationDraft({String? conversationID, String? use...
    method pinConversation (line 780) | Future<void> pinConversation({String? conversationID, String? userID, ...
    method getTotalUnreadMessageCount (line 786) | Future<int> getTotalUnreadMessageCount()
    method getUsersInfo (line 790) | Future<List<UserEntity>> getUsersInfo({required List<String> userIDList})
    method setSelfInfo (line 798) | Future<void> setSelfInfo({required UserEntity info})
    method addToBlackList (line 804) | Future<List<FriendOperationResultEntity>> addToBlackList({
    method deleteFromBlackList (line 812) | Future<List<FriendOperationResultEntity>> deleteFromBlackList({
    method getBlackList (line 819) | Future<List<FriendInfoEntity>> getBlackList()
    method setOfflinePushConfig (line 828) | Future<void> setOfflinePushConfig({required String token, required int...
    method setUnreadBadge (line 838) | Future<void> setUnreadBadge({required int number})
    method getFriendList (line 845) | Future<List<FriendInfoEntity>> getFriendList()
    method getFriendsInfo (line 851) | Future<List<FriendInfoResultEntity>> getFriendsInfo({required List<Str...
    method setFriendInfo (line 859) | Future<void> setFriendInfo({required FriendInfoEntity info})
    method addFriend (line 867) | Future<FriendOperationResultEntity> addFriend({required FriendAddAppli...
    method deleteFromFriendList (line 876) | Future<List<FriendOperationResultEntity>> deleteFromFriendList({requir...
    method checkFriend (line 886) | Future<FriendCheckResultEntity> checkFriend({required String userID, r...
    method getFriendApplicationList (line 894) | Future<FriendApplicationResultEntity> getFriendApplicationList()
    method acceptFriendApplication (line 901) | Future<FriendOperationResultEntity> acceptFriendApplication({required ...
    method refuseFriendApplication (line 910) | Future<FriendOperationResultEntity> refuseFriendApplication({required ...
    method deleteFriendApplication (line 918) | Future<void> deleteFriendApplication({required FindFriendApplicationEn...
    method setFriendApplicationRead (line 925) | Future<void> setFriendApplicationRead()
    method createFriendGroup (line 932) | Future<List<FriendOperationResultEntity>> createFriendGroup({required ...
    method getFriendGroups (line 941) | Future<List<FriendGroupEntity>> getFriendGroups({List<String>? groupNa...
    method deleteFriendGroup (line 952) | Future<void> deleteFriendGroup({required List<String> groupNameList})
    method renameFriendGroup (line 961) | Future<void> renameFriendGroup({required String oldName, required Stri...
    method addFriendsToFriendGroup (line 971) | Future<List<FriendOperationResultEntity>> addFriendsToFriendGroup({req...
    method deleteFriendsFromFriendGroup (line 981) | Future<List<FriendOperationResultEntity>> deleteFriendsFromFriendGroup...
    method searchLocalMessages (line 989) | Future<void> searchLocalMessages({required MessageSearchParam param})
    method addListener (line 994) | void addListener(TencentImListenerValue func)
    method removeListener (line 997) | void removeListener(TencentImListenerValue func)

FILE: lib/utils/enum_util.dart
  class EnumUtil (line 2) | class EnumUtil {
    method getEnumName (line 4) | String getEnumName(enumObj)
    method nameOf (line 10) | T? nameOf<T>(List<T> array, String name)
Condensed preview — 268 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (658K chars).
[
  {
    "path": ".all-contributorsrc",
    "chars": 1223,
    "preview": "{\n  \"files\": [\n    \"README.md\"\n  ],\n  \"imageSize\": 100,\n  \"commit\": false,\n  \"contributors\": [\n    {\n      \"login\": \"kxr"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 771,
    "preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
  },
  {
    "path": ".gitignore",
    "chars": 58,
    "preview": ".DS_Store\n.dart_tool/\n\n.packages\n.pub/\n.idea\n*.iml\nbuild/\n"
  },
  {
    "path": ".metadata",
    "chars": 308,
    "preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 5834,
    "preview": "## 0.1.0\n* 集成腾讯云IMSDK,包含Android 和 IOS\n\n## 0.1.1\n* 修复Android设备上找不到符号的BUG\n\n## 0.1.2\n* 修复IOS上Json字符串中包含特殊字符的问题\n* 修复IOS监听器无效"
  },
  {
    "path": "LICENSE",
    "chars": 10765,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "README.md",
    "chars": 6901,
    "preview": "<div align=\"center\">\n\n[![](https://img.shields.io/badge/flutter2.0-NullSafety-1)](#)\n[![All Contributors](https://img.sh"
  },
  {
    "path": "README_3.0_upgrade.md",
    "chars": 723,
    "preview": "# 3.0升级文档\n\n## 通用变化\n\n* 将 `setReceiveMessageOpt` 替换为 `setGroupReceiveMessageOpt`\n* 将 `GroupReceiveMessageOptEnum` 替换为 `Rec"
  },
  {
    "path": "android/.gitignore",
    "chars": 97,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n"
  },
  {
    "path": "android/build.gradle",
    "chars": 1293,
    "preview": "group 'top.huic.tencent_im_plugin'\nversion '1.0'\n\nbuildscript {\n    repositories {\n//        maven { url 'https://maven."
  },
  {
    "path": "android/consumer-proguard-rules.txt",
    "chars": 304,
    "preview": "# 腾讯云IM\n-keep class com.tencent.** { *; }\n\n# FastJson\n-dontwarn com.alibaba.fastjson.**\n-keep class com.alibaba.fastjson"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "chars": 232,
    "preview": "#Thu Dec 05 14:15:15 CST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "android/gradle.properties",
    "chars": 104,
    "preview": "org.gradle.jvmargs=-Xmx1536M\nandroid.enableR8=true\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
  },
  {
    "path": "android/settings.gradle",
    "chars": 39,
    "preview": "rootProject.name = 'tencent_im_plugin'\n"
  },
  {
    "path": "android/src/main/AndroidManifest.xml",
    "chars": 796,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"top.huic.tencent_im_plugin\">\n    <uses-p"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/DownloadCallBack.java",
    "chars": 2345,
    "preview": "package top.huic.tencent_im_plugin;\n\nimport com.tencent.imsdk.v2.V2TIMDownloadCallback;\nimport com.tencent.imsdk.v2.V2TI"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/TencentImPlugin.java",
    "chars": 64072,
    "preview": "package top.huic.tencent_im_plugin;\n\nimport android.content.Context;\n\nimport com.alibaba.fastjson.JSON;\nimport com.aliba"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/ValueCallBack.java",
    "chars": 1040,
    "preview": "package top.huic.tencent_im_plugin;\n\nimport com.tencent.imsdk.v2.V2TIMValueCallback;\n\nimport io.flutter.plugin.common.Me"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/VoidCallBack.java",
    "chars": 687,
    "preview": "package top.huic.tencent_im_plugin;\n\nimport com.tencent.imsdk.v2.V2TIMCallback;\n\nimport io.flutter.plugin.common.MethodC"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/entity/CustomConversationEntity.java",
    "chars": 3618,
    "preview": "package top.huic.tencent_im_plugin.entity;\n\nimport com.tencent.imsdk.v2.V2TIMConversation;\nimport com.tencent.imsdk.v2.V"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/entity/CustomConversationResultEntity.java",
    "chars": 1674,
    "preview": "package top.huic.tencent_im_plugin.entity;\n\nimport com.tencent.imsdk.v2.V2TIMConversation;\nimport com.tencent.imsdk.v2.V"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/entity/CustomFriendAddApplication.java",
    "chars": 355,
    "preview": "package top.huic.tencent_im_plugin.entity;\n\nimport com.tencent.imsdk.v2.V2TIMFriendAddApplication;\n\n/**\n * 自定义好友添加申请实体\n "
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/entity/CustomMessageEntity.java",
    "chars": 6442,
    "preview": "package top.huic.tencent_im_plugin.entity;\n\nimport com.tencent.imsdk.v2.V2TIMElem;\nimport com.tencent.imsdk.v2.V2TIMMess"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/entity/FindFriendApplicationEntity.java",
    "chars": 463,
    "preview": "package top.huic.tencent_im_plugin.entity;\n\n/**\n * 查找好友申请实体\n */\npublic class FindFriendApplicationEntity {\n    /**\n     "
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/entity/FindGroupApplicationEntity.java",
    "chars": 506,
    "preview": "package top.huic.tencent_im_plugin.entity;\n\n/**\n * 查找群申请实体\n */\npublic class FindGroupApplicationEntity {\n    /**\n     * "
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/entity/FindMessageEntity.java",
    "chars": 407,
    "preview": "package top.huic.tencent_im_plugin.entity;\n\n/**\n * 查找消息实体\n */\npublic class FindMessageEntity {\n    /**\n     * 消息ID\n     "
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/enums/ListenerTypeEnum.java",
    "chars": 2668,
    "preview": "package top.huic.tencent_im_plugin.enums;\n\n/**\n * 监听器类型枚举\n */\npublic enum ListenerTypeEnum {\n\n    /**\n     * 新消息通知\n     "
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/enums/MessageNodeType.java",
    "chars": 3628,
    "preview": "package top.huic.tencent_im_plugin.enums;\n\nimport com.tencent.imsdk.v2.V2TIMElem;\nimport com.tencent.imsdk.v2.V2TIMMessa"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/listener/CustomAdvancedMsgListener.java",
    "chars": 1211,
    "preview": "package top.huic.tencent_im_plugin.listener;\n\nimport com.tencent.imsdk.v2.V2TIMAdvancedMsgListener;\nimport com.tencent.i"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/listener/CustomConversationListener.java",
    "chars": 2099,
    "preview": "package top.huic.tencent_im_plugin.listener;\n\nimport com.tencent.imsdk.v2.V2TIMConversation;\nimport com.tencent.imsdk.v2"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/listener/CustomFriendshipListener.java",
    "chars": 2862,
    "preview": "package top.huic.tencent_im_plugin.listener;\n\nimport com.tencent.imsdk.v2.V2TIMFriendApplication;\nimport com.tencent.ims"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/listener/CustomGroupListener.java",
    "chars": 7870,
    "preview": "package top.huic.tencent_im_plugin.listener;\n\nimport com.tencent.imsdk.v2.V2TIMGroupChangeInfo;\nimport com.tencent.imsdk"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/listener/CustomSDKListener.java",
    "chars": 1797,
    "preview": "package top.huic.tencent_im_plugin.listener;\n\nimport com.tencent.imsdk.v2.V2TIMSDKListener;\nimport com.tencent.imsdk.v2."
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/listener/CustomSignalingListener.java",
    "chars": 2877,
    "preview": "package top.huic.tencent_im_plugin.listener;\n\nimport com.tencent.imsdk.v2.V2TIMSignalingListener;\n\nimport java.util.Hash"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/AbstractMessageNode.java",
    "chars": 846,
    "preview": "package top.huic.tencent_im_plugin.message;\n\nimport com.tencent.imsdk.v2.V2TIMMessage;\n\nimport top.huic.tencent_im_plugi"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/CustomMessageNode.java",
    "chars": 980,
    "preview": "package top.huic.tencent_im_plugin.message;\n\nimport com.tencent.imsdk.v2.V2TIMCustomElem;\nimport com.tencent.imsdk.v2.V2"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/FaceMessageNode.java",
    "chars": 892,
    "preview": "package top.huic.tencent_im_plugin.message;\n\nimport com.tencent.imsdk.v2.V2TIMFaceElem;\nimport com.tencent.imsdk.v2.V2TI"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/FileMessageNode.java",
    "chars": 887,
    "preview": "package top.huic.tencent_im_plugin.message;\n\nimport com.tencent.imsdk.v2.V2TIMFileElem;\nimport com.tencent.imsdk.v2.V2TI"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/GroupTipsMessageNode.java",
    "chars": 659,
    "preview": "package top.huic.tencent_im_plugin.message;\n\nimport com.tencent.imsdk.v2.V2TIMGroupTipsElem;\n\nimport top.huic.tencent_im"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/ImageMessageNode.java",
    "chars": 1003,
    "preview": "package top.huic.tencent_im_plugin.message;\n\nimport com.tencent.imsdk.v2.V2TIMImageElem;\nimport com.tencent.imsdk.v2.V2T"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/LocationMessageNode.java",
    "chars": 959,
    "preview": "package top.huic.tencent_im_plugin.message;\n\nimport com.tencent.imsdk.v2.V2TIMLocationElem;\nimport com.tencent.imsdk.v2."
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/SoundMessageNode.java",
    "chars": 896,
    "preview": "package top.huic.tencent_im_plugin.message;\n\nimport com.tencent.imsdk.v2.V2TIMManager;\nimport com.tencent.imsdk.v2.V2TIM"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/TextMessageNode.java",
    "chars": 1597,
    "preview": "package top.huic.tencent_im_plugin.message;\n\nimport com.tencent.imsdk.v2.V2TIMGroupAtInfo;\nimport com.tencent.imsdk.v2.V"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/VideoMessageNode.java",
    "chars": 1127,
    "preview": "package top.huic.tencent_im_plugin.message;\n\nimport com.tencent.imsdk.v2.V2TIMManager;\nimport com.tencent.imsdk.v2.V2TIM"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/entity/AbstractMessageEntity.java",
    "chars": 549,
    "preview": "package top.huic.tencent_im_plugin.message.entity;\n\nimport java.io.Serializable;\n\nimport top.huic.tencent_im_plugin.enum"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/entity/CustomMessageEntity.java",
    "chars": 1348,
    "preview": "package top.huic.tencent_im_plugin.message.entity;\n\nimport com.tencent.imsdk.v2.V2TIMCustomElem;\n\nimport top.huic.tencen"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/entity/FaceMessageEntity.java",
    "chars": 894,
    "preview": "package top.huic.tencent_im_plugin.message.entity;\n\nimport com.tencent.imsdk.v2.V2TIMFaceElem;\n\nimport top.huic.tencent_"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/entity/FileMessageEntity.java",
    "chars": 1360,
    "preview": "package top.huic.tencent_im_plugin.message.entity;\n\nimport com.tencent.imsdk.v2.V2TIMFileElem;\n\nimport top.huic.tencent_"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/entity/GroupTipsMessageEntity.java",
    "chars": 3189,
    "preview": "package top.huic.tencent_im_plugin.message.entity;\n\nimport com.tencent.imsdk.v2.V2TIMGroupChangeInfo;\nimport com.tencent"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/entity/ImageMessageEntity.java",
    "chars": 1037,
    "preview": "package top.huic.tencent_im_plugin.message.entity;\n\nimport com.tencent.imsdk.v2.V2TIMImageElem;\n\nimport java.util.List;\n"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/entity/LocationMessageEntity.java",
    "chars": 1194,
    "preview": "package top.huic.tencent_im_plugin.message.entity;\n\nimport com.tencent.imsdk.v2.V2TIMLocationElem;\n\nimport top.huic.tenc"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/entity/SoundMessageEntity.java",
    "chars": 1395,
    "preview": "package top.huic.tencent_im_plugin.message.entity;\n\nimport com.tencent.imsdk.v2.V2TIMSoundElem;\n\nimport top.huic.tencent"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/entity/TextMessageEntity.java",
    "chars": 1136,
    "preview": "package top.huic.tencent_im_plugin.message.entity;\n\nimport com.tencent.imsdk.v2.V2TIMTextElem;\n\nimport java.util.List;\n\n"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/message/entity/VideoMessageEntity.java",
    "chars": 2996,
    "preview": "package top.huic.tencent_im_plugin.message.entity;\n\nimport com.tencent.imsdk.v2.V2TIMVideoElem;\n\nimport java.io.Serializ"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/util/BeanUtils.java",
    "chars": 2704,
    "preview": "package top.huic.tencent_im_plugin.util;\n\nimport java.lang.reflect.Method;\nimport java.lang.reflect.Modifier;\nimport jav"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/util/CommonUtil.java",
    "chars": 1966,
    "preview": "package top.huic.tencent_im_plugin.util;\n\nimport android.os.Handler;\nimport android.os.Looper;\n\nimport io.flutter.plugin"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/util/JsonUtil.java",
    "chars": 785,
    "preview": "package top.huic.tencent_im_plugin.util;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.serializer.Value"
  },
  {
    "path": "android/src/main/java/top/huic/tencent_im_plugin/util/TencentImUtils.java",
    "chars": 5685,
    "preview": "package top.huic.tencent_im_plugin.util;\n\nimport com.alibaba.fastjson.JSON;\nimport com.tencent.imsdk.v2.V2TIMFriendAppli"
  },
  {
    "path": "example/.gitignore",
    "chars": 615,
    "preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.i"
  },
  {
    "path": "example/.metadata",
    "chars": 305,
    "preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
  },
  {
    "path": "example/README.md",
    "chars": 586,
    "preview": "# tencent_im_plugin_example\n\nDemonstrates how to use the tencent_im_plugin plugin.\n\n## Getting Started\n\nThis project is "
  },
  {
    "path": "example/android/.gitignore",
    "chars": 110,
    "preview": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n"
  },
  {
    "path": "example/android/app/agconnect-services.json",
    "chars": 895,
    "preview": "{\n\t\"agcgw\":{\n\t\t\"backurl\":\"connect-drcn.dbankcloud.cn\",\n\t\t\"url\":\"connect-drcn.hispace.hicloud.com\"\n\t},\n\t\"client\":{\n\t\t\"cp_"
  },
  {
    "path": "example/android/app/build.gradle",
    "chars": 2529,
    "preview": "def localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertie"
  },
  {
    "path": "example/android/app/src/debug/AndroidManifest.xml",
    "chars": 342,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"top.huic.tencent_im_plugin_example\">\n "
  },
  {
    "path": "example/android/app/src/main/AndroidManifest.xml",
    "chars": 2487,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n"
  },
  {
    "path": "example/android/app/src/main/java/top/huic/tencent_im_plugin_example/MainActivity.java",
    "chars": 975,
    "preview": "package top.huic.tencent_im_plugin_example;\n\nimport android.app.ActivityManager;\nimport android.content.Context;\nimport "
  },
  {
    "path": "example/android/app/src/main/res/drawable/launch_background.xml",
    "chars": 434,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
  },
  {
    "path": "example/android/app/src/main/res/values/styles.xml",
    "chars": 361,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Black.NoTi"
  },
  {
    "path": "example/android/app/src/profile/AndroidManifest.xml",
    "chars": 342,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"top.huic.tencent_im_plugin_example\">\n "
  },
  {
    "path": "example/android/build.gradle",
    "chars": 583,
    "preview": "buildscript {\n    repositories {\n        google()\n        jcenter()\n        maven {url 'https://developer.huawei.com/rep"
  },
  {
    "path": "example/android/gradle/wrapper/gradle-wrapper.properties",
    "chars": 232,
    "preview": "#Fri Feb 28 14:11:06 CST 2020\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "example/android/gradle.properties",
    "chars": 104,
    "preview": "org.gradle.jvmargs=-Xmx1536M\nandroid.enableR8=true\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
  },
  {
    "path": "example/android/settings.gradle",
    "chars": 484,
    "preview": "include ':app'\n\ndef flutterProjectRoot = rootProject.projectDir.parentFile.toPath()\n\ndef plugins = new Properties()\ndef "
  },
  {
    "path": "example/ios/.gitignore",
    "chars": 542,
    "preview": "*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/DerivedDat"
  },
  {
    "path": "example/ios/Flutter/AppFrameworkInfo.plist",
    "chars": 794,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "example/ios/Flutter/Debug.xcconfig",
    "chars": 106,
    "preview": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "example/ios/Flutter/Release.xcconfig",
    "chars": 108,
    "preview": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "example/ios/Podfile",
    "chars": 2597,
    "preview": "# Uncomment this line to define a global platform for your project\nplatform :ios, '8.0'\n\n# CocoaPods analytics sends net"
  },
  {
    "path": "example/ios/Runner/AppDelegate.swift",
    "chars": 404,
    "preview": "import UIKit\nimport Flutter\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n  override func applicatio"
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 2519,
    "preview": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n   "
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "chars": 391,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage.png\",\n      \"scale\" : \"1x\"\n    },\n  "
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "chars": 336,
    "preview": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in"
  },
  {
    "path": "example/ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "chars": 2377,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
  },
  {
    "path": "example/ios/Runner/Base.lproj/Main.storyboard",
    "chars": 1605,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
  },
  {
    "path": "example/ios/Runner/Info.plist",
    "chars": 2346,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "example/ios/Runner/Runner-Bridging-Header.h",
    "chars": 38,
    "preview": "#import \"GeneratedPluginRegistrant.h\"\n"
  },
  {
    "path": "example/ios/Runner.xcodeproj/project.pbxproj",
    "chars": 24389,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 135,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef"
  },
  {
    "path": "example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "chars": 3185,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1300\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "example/ios/Runner.xcworkspace/contents.xcworkspacedata",
    "chars": 224,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodepr"
  },
  {
    "path": "example/lib/main.dart",
    "chars": 892,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:tencent_im_plugin_example/page/chat.dart';\nimport 'package:tence"
  },
  {
    "path": "example/lib/page/chat.dart",
    "chars": 14138,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flu"
  },
  {
    "path": "example/lib/page/home.dart",
    "chars": 1036,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/widgets.dart';\n"
  },
  {
    "path": "example/lib/page/interfaces_test.dart",
    "chars": 14784,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:tencent_im_plugin/tencent"
  },
  {
    "path": "example/lib/page/login.dart",
    "chars": 1842,
    "preview": "import 'package:flutter/widgets.dart';\nimport 'package:flutter/material.dart';\nimport 'package:tencent_im_plugin/tencent"
  },
  {
    "path": "example/lib/page/main/components/conversation.dart",
    "chars": 3542,
    "preview": "import 'package:flutter/scheduler.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:flutter/material.dart';\n"
  },
  {
    "path": "example/lib/page/main/components/friend.dart",
    "chars": 6145,
    "preview": "import 'package:flutter/scheduler.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:flutter/material.dart';\n"
  },
  {
    "path": "example/lib/page/main/components/group.dart",
    "chars": 2077,
    "preview": "import 'package:flutter/scheduler.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:flutter/material.dart';\n"
  },
  {
    "path": "example/lib/page/main/main.dart",
    "chars": 6562,
    "preview": "import 'package:flutter/widgets.dart';\nimport 'package:flutter/material.dart';\nimport 'package:fluttertoast/fluttertoast"
  },
  {
    "path": "example/lib/utils/GenerateTestUserSig.dart",
    "chars": 1804,
    "preview": "library generate_test_im_usersig;\n\nimport 'dart:convert';\nimport 'dart:io';\n\nimport 'package:crypto/crypto.dart';\nimport"
  },
  {
    "path": "example/pubspec.yaml",
    "chars": 2311,
    "preview": "name: tencent_im_plugin_example\ndescription: Demonstrates how to use the tencent_im_plugin plugin.\npublish_to: 'none'\n\ne"
  },
  {
    "path": "example/test/widget_test.dart",
    "chars": 902,
    "preview": "// This is a basic Flutter widget test.\n//\n// To perform an interaction with a widget in your test, use the WidgetTester"
  },
  {
    "path": "ios/.gitignore",
    "chars": 398,
    "preview": ".idea/\n.vagrant/\n.sconsign.dblite\n.svn/\n\n.DS_Store\n*.swp\nprofile\n\nDerivedData/\nbuild/\nGeneratedPluginRegistrant.h\nGenera"
  },
  {
    "path": "ios/Assets/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "ios/Classes/SwiftTencentImPlugin.swift",
    "chars": 77328,
    "preview": "import Flutter\nimport UIKit\nimport HandyJSON\nimport ImSDK_Plus\n\npublic class SwiftTencentImPlugin: NSObject, FlutterPlug"
  },
  {
    "path": "ios/Classes/TencentImPlugin.h",
    "chars": 87,
    "preview": "#import <Flutter/Flutter.h>\n\n@interface TencentImPlugin : NSObject<FlutterPlugin>\n@end\n"
  },
  {
    "path": "ios/Classes/TencentImPlugin.m",
    "chars": 601,
    "preview": "#import \"TencentImPlugin.h\"\n#if __has_include(<tencent_im_plugin/tencent_im_plugin-Swift.h>)\n#import <tencent_im_plugin/"
  },
  {
    "path": "ios/Classes/entity/CustomConversationEntity.swift",
    "chars": 1365,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/29.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义会话实体\nclass CustomConversationEntity:"
  },
  {
    "path": "ios/Classes/entity/CustomConversationResultEntity.swift",
    "chars": 667,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/29.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义会话结果实体\nclass CustomConversationResul"
  },
  {
    "path": "ios/Classes/entity/CustomCreateGroupMemberEntity.swift",
    "chars": 535,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/29.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义群创建群成员实体\nclass CustomCreateGroupMemb"
  },
  {
    "path": "ios/Classes/entity/CustomFriendAddApplicationEntity.swift",
    "chars": 703,
    "preview": "//\n// Created by 蒋具宏 on 2020/11/3.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 好友申请实体\nclass CustomFriendAddApplicationE"
  },
  {
    "path": "ios/Classes/entity/CustomFriendApplicationEntity.swift",
    "chars": 628,
    "preview": "//\n// Created by 蒋具宏 on 2020/11/3.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 好友申请实体\nclass CustomFriendApplicationEnti"
  },
  {
    "path": "ios/Classes/entity/CustomFriendApplicationResultEntity.swift",
    "chars": 686,
    "preview": "//\n// Created by 蒋具宏 on 2020/11/3.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 好友申请结果实体\nclass CustomFriendApplicationRe"
  },
  {
    "path": "ios/Classes/entity/CustomFriendCheckResultEntity.swift",
    "chars": 521,
    "preview": "//\n// Created by 蒋具宏 on 2020/11/3.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义好友检查结果实体\nclass CustomFriendCheckResul"
  },
  {
    "path": "ios/Classes/entity/CustomFriendGroupEntity.swift",
    "chars": 445,
    "preview": "//\n// Created by 蒋具宏 on 2020/11/3.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义好友分组实体\nclass CustomFriendGroupEntity:"
  },
  {
    "path": "ios/Classes/entity/CustomFriendInfoEntity.swift",
    "chars": 1140,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/29.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义好友信息实体\nclass CustomFriendInfoEntity:"
  },
  {
    "path": "ios/Classes/entity/CustomFriendInfoResultEntity.swift",
    "chars": 542,
    "preview": "//\n// Created by 蒋具宏 on 2020/11/3.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\nclass CustomFriendInfoResultEntity: V2TIMFri"
  },
  {
    "path": "ios/Classes/entity/CustomFriendOperationResultEntity.swift",
    "chars": 472,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/29.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 好友操作结果实体\nclass CustomFriendOperationRes"
  },
  {
    "path": "ios/Classes/entity/CustomGroupApplicationEntity.swift",
    "chars": 873,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/29.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义群申请实体\nclass CustomGroupApplicationEn"
  },
  {
    "path": "ios/Classes/entity/CustomGroupApplicationResultEntity.swift",
    "chars": 677,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/29.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 群申请结果实体\nclass CustomGroupApplicationRes"
  },
  {
    "path": "ios/Classes/entity/CustomGroupAtInfoEntity.swift",
    "chars": 390,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/29.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义群@信息实体\nclass CustomGroupAtInfoEntity"
  },
  {
    "path": "ios/Classes/entity/CustomGroupChangeInfoEntity.swift",
    "chars": 434,
    "preview": "//\n// Created by 蒋具宏 on 2020/11/4.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义群改变信息\nclass CustomGroupChangeInfoEnti"
  },
  {
    "path": "ios/Classes/entity/CustomGroupInfoEntity.swift",
    "chars": 2524,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/29.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义群信息实体\nclass CustomGroupInfoEntity: V"
  },
  {
    "path": "ios/Classes/entity/CustomGroupInfoResultEntity.swift",
    "chars": 540,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/29.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义群信息结果实体\nclass CustomGroupInfoResultE"
  },
  {
    "path": "ios/Classes/entity/CustomGroupMemberChangeInfoEntity.swift",
    "chars": 419,
    "preview": "//\n// Created by 蒋具宏 on 2020/11/4.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义群信息实体\nclass CustomGroupMemberChangeIn"
  },
  {
    "path": "ios/Classes/entity/CustomGroupMemberFullInfoEntity.swift",
    "chars": 1673,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/29.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义群成员信息实体\nclass CustomGroupMemberFullI"
  },
  {
    "path": "ios/Classes/entity/CustomGroupMemberInfoResultEntity.swift",
    "chars": 566,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/29.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\nclass CustomGroupMemberInfoResultEntity: NS"
  },
  {
    "path": "ios/Classes/entity/CustomGroupMemberOperationResultEntity.swift",
    "chars": 444,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/29.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义群成员操作结果\nclass CustomGroupMemberOpera"
  },
  {
    "path": "ios/Classes/entity/CustomMessageReceiptEntity.swift",
    "chars": 401,
    "preview": "//\n// Created by 蒋具宏 on 2020/11/3.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义消息响应实体\nclass CustomMessageReceiptEnti"
  },
  {
    "path": "ios/Classes/entity/CustomOfflinePushInfoEntity.swift",
    "chars": 904,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/27.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义离线推送数据实体\nclass CustomOfflinePushInfo"
  },
  {
    "path": "ios/Classes/entity/CustomSignalingInfoEntity.swift",
    "chars": 1391,
    "preview": "//\n// Created by 蒋具宏 on 2020/11/6.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义信令信息实体\nclass CustomSignalingInfoEntit"
  },
  {
    "path": "ios/Classes/entity/CustomUserEntity.swift",
    "chars": 2055,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/29.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义用户实体\nclass CustomUserEntity: V2TIMUs"
  },
  {
    "path": "ios/Classes/entity/FindFriendApplicationEntity.swift",
    "chars": 511,
    "preview": "//\n// Created by 蒋具宏 on 2020/11/3.\n//\n\nimport Foundation\n\n/// 查找好友申请实体\nclass FindFriendApplicationEntity: NSObject {\n\n  "
  },
  {
    "path": "ios/Classes/entity/FindGroupApplicationEntity.swift",
    "chars": 538,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/28.\n//\n\nimport Foundation\n\n/// 查找群申请信息实体\nclass FindGroupApplicationEntity: NSObject {\n\n "
  },
  {
    "path": "ios/Classes/entity/FindMessageEntity.swift",
    "chars": 441,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/27.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 查找消息实体\nclass FindMessageEntity: NSObjec"
  },
  {
    "path": "ios/Classes/entity/MessageEntity.swift",
    "chars": 3229,
    "preview": "import ImSDK_Plus\n\n//\n//  MessageEntity.swift\n//  tencent_im_plugin\n//\n//  Created by 蒋具宏 on 2020/2/10.\n//\npublic class "
  },
  {
    "path": "ios/Classes/enums/DownloadType.swift",
    "chars": 227,
    "preview": "//\n// Created by 蒋具宏 on 2021/1/5.\n//\n\nimport Foundation\n\n/// 下载类型\nenum DownloadType: Int {\n    /// 语音\n    case Sound = 0"
  },
  {
    "path": "ios/Classes/enums/ListenerType.swift",
    "chars": 2127,
    "preview": "//  Created by 蒋具宏 on 2020/2/15.\n//  监听器类型\npublic enum ListenerType {\n    /// 新消息通知\n    case NewMessage\n\n    /// C2C已读回执"
  },
  {
    "path": "ios/Classes/enums/MessageNodeType.swift",
    "chars": 2090,
    "preview": "import ImSDK_Plus\n\n//  Created by 蒋具宏 on 2020/3/13.\n//  消息节点类型\nenum MessageNodeType: Int {\n    // 没有元素\n    case None\n\n  "
  },
  {
    "path": "ios/Classes/listener/CustomAPNSListener.swift",
    "chars": 339,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/29.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义APNS监听器\nclass CustomAPNSListener: NS"
  },
  {
    "path": "ios/Classes/listener/CustomAdvancedMsgListener.swift",
    "chars": 859,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/27.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 消息相关监听器\nclass CustomAdvancedMsgListener"
  },
  {
    "path": "ios/Classes/listener/CustomConversationListener.swift",
    "chars": 1291,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/27.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义会话监听\nclass CustomConversationListene"
  },
  {
    "path": "ios/Classes/listener/CustomFriendshipListener.swift",
    "chars": 2772,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/27.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 关系链相关监听器\nclass CustomFriendshipListener"
  },
  {
    "path": "ios/Classes/listener/CustomGroupListener.swift",
    "chars": 6527,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/27.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 群监听器\nclass CustomGroupListener: NSObjec"
  },
  {
    "path": "ios/Classes/listener/CustomSDKListener.swift",
    "chars": 1222,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/27.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义SDK监听器\nclass CustomSDKListener: NSOb"
  },
  {
    "path": "ios/Classes/listener/CustomSignalingListener.swift",
    "chars": 2144,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/27.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 自定义信令监听\nclass CustomSignalingListener: "
  },
  {
    "path": "ios/Classes/message/AbstractMessageNode.swift",
    "chars": 771,
    "preview": "import ImSDK_Plus\n\n//\n//  AbstractMessageNode.swift\n//  tencent_im_plugin\n//\n//  Created by 蒋具宏 on 2020/3/13.\n//  消息节点抽象"
  },
  {
    "path": "ios/Classes/message/CustomMessageNode.swift",
    "chars": 820,
    "preview": "import ImSDK_Plus\n\n//\n//  TextMessageNode.swift\n//  tencent_im_plugin\n//\n//  Created by 蒋具宏 on 2020/3/13.\n//  自定义消息节点\npu"
  },
  {
    "path": "ios/Classes/message/FaceMessageNode.swift",
    "chars": 689,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/27.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 表情消息实体\nclass FaceMessageNode: AbstractM"
  },
  {
    "path": "ios/Classes/message/FileMessageNode.swift",
    "chars": 670,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/27.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\nclass FileMessageNode: AbstractMessageNode "
  },
  {
    "path": "ios/Classes/message/GroupTipsMessageNode.swift",
    "chars": 405,
    "preview": "import ImSDK_Plus\n\n//\n//  GroupTipsMessageNode.swift\n//  tencent_im_plugin\n//\n//  Created by 蒋具宏 on 2020/3/21.\n//  群提示消息"
  },
  {
    "path": "ios/Classes/message/ImageMessageNode.swift",
    "chars": 610,
    "preview": "import ImSDK_Plus\n\n//\n//  TextMessageNode.swift\n//  tencent_im_plugin\n//\n//  Created by 蒋具宏 on 2020/3/13.\n//  图片消息节点\npub"
  },
  {
    "path": "ios/Classes/message/LocationMessageNode.swift",
    "chars": 829,
    "preview": "import ImSDK_Plus\n\n//\n//  TextMessageNode.swift\n//  tencent_im_plugin\n//\n//  Created by 蒋具宏 on 2020/3/13.\n//  位置消息节点\npub"
  },
  {
    "path": "ios/Classes/message/SoundMessageNode.swift",
    "chars": 710,
    "preview": "import ImSDK_Plus\n\n//\n//  TextMessageNode.swift\n//  tencent_im_plugin\n//\n//  Created by 蒋具宏 on 2020/3/13.\n//  语音消息节点\npub"
  },
  {
    "path": "ios/Classes/message/TextMessageNode.swift",
    "chars": 1590,
    "preview": "import ImSDK_Plus\n\n//\n//  TextMessageNode.swift\n//  tencent_im_plugin\n//\n//  Created by 蒋具宏 on 2020/3/13.\n//  文本消息节点\npub"
  },
  {
    "path": "ios/Classes/message/VideoMessageNode.swift",
    "chars": 1037,
    "preview": "import ImSDK_Plus\n\n//\n//  TextMessageNode.swift\n//  tencent_im_plugin\n//\n//  Created by 蒋具宏 on 2020/3/13.\n//  视频消息节点\npub"
  },
  {
    "path": "ios/Classes/message/entity/AbstractMessageEntity.swift",
    "chars": 296,
    "preview": "//\n//  AbstractMessageEntity.swift\n//  tencent_im_plugin\n//\n//  Created by 蒋具宏 on 2020/3/15.\n//  抽象消息实体\npublic class Abs"
  },
  {
    "path": "ios/Classes/message/entity/CustomMessageEntity.swift",
    "chars": 608,
    "preview": "import ImSDK_Plus\n\n//  Created by 蒋具宏 on 2020/3/15.\n//  自定义消息实体\npublic class CustomMessageEntity: AbstractMessageEntity "
  },
  {
    "path": "ios/Classes/message/entity/FaceMessageEntity.swift",
    "chars": 451,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/27.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 表情消息实体\nclass FaceMessageEntity: Abstrac"
  },
  {
    "path": "ios/Classes/message/entity/FileMessageEntity.swift",
    "chars": 646,
    "preview": "//\n// Created by 蒋具宏 on 2020/10/27.\n//\n\nimport Foundation\nimport ImSDK_Plus\n\n/// 文件消息实体\nclass FileMessageEntity: Abstrac"
  },
  {
    "path": "ios/Classes/message/entity/LocationMessageEntity.swift",
    "chars": 512,
    "preview": "import ImSDK_Plus\n\n//  Created by 蒋具宏 on 2020/3/15.\n//  位置消息实体\npublic class LocationMessageEntity: AbstractMessageEntity"
  },
  {
    "path": "ios/Classes/message/entity/SoundMessageEntity.swift",
    "chars": 566,
    "preview": "import ImSDK_Plus\n\n//  Created by 蒋具宏 on 2020/3/15.\n//  语音消息实体\npublic class SoundMessageEntity: AbstractMessageEntity {\n"
  },
  {
    "path": "ios/Classes/message/entity/TextMessageEntity.swift",
    "chars": 402,
    "preview": "import ImSDK_Plus\n\n//\n//  TextMessageEntity.swift\n//  tencent_im_plugin\n//\n//  Created by 蒋具宏 on 2020/3/15.\n//  文本消息实体\np"
  },
  {
    "path": "ios/Classes/message/entity/VideoMessageEntity.swift",
    "chars": 1201,
    "preview": "import ImSDK_Plus\n\n//  Created by 蒋具宏 on 2020/3/15.\n//  视频消息实体\npublic class VideoMessageEntity: AbstractMessageEntity {\n"
  },
  {
    "path": "ios/Classes/message/entity/group_tips/GroupTipsMessageEntity.swift",
    "chars": 1989,
    "preview": "import ImSDK_Plus\n\n//\n//  GroupTipsMessageself.swift\n//  tencent_im_plugin\n//\n//  Created by 蒋具宏 on 2020/3/21.\n//  群体是消息"
  },
  {
    "path": "ios/Classes/message/entity/image/ImageEntity.swift",
    "chars": 675,
    "preview": "import ImSDK_Plus\n\n//  Created by 蒋具宏 on 2020/2/10.\n//  图片实体\npublic class ImageEntity: NSObject {\n\n    /**\n     * 大小\n   "
  },
  {
    "path": "ios/Classes/message/entity/image/ImageMessageEntity.swift",
    "chars": 530,
    "preview": "import ImSDK_Plus\n\n//  Created by 蒋具宏 on 2020/3/15.\n//  图片消息实体\npublic class ImageMessageEntity: AbstractMessageEntity {\n"
  },
  {
    "path": "ios/Classes/utils/CommonUtils.swift",
    "chars": 1251,
    "preview": "import Flutter\n\n//  通用工具类\n//  Created by 蒋具宏 on 2020/2/10.\npublic class CommonUtils {\n    /**\n     * 通用方法,获得参数值,如未找到参数,则"
  },
  {
    "path": "ios/Classes/utils/JsonUtil.swift",
    "chars": 6139,
    "preview": "import Foundation\n\n//  Json工具类\n//  Created by 蒋具宏 on 2020/2/11.\npublic class JsonUtil {\n\n    /**\n     *  字典转模型\n     */\n "
  },
  {
    "path": "ios/Classes/utils/TencentImUtil.swift",
    "chars": 4058,
    "preview": "import ImSDK_Plus\n\n//  腾讯云工具类\n//  Created by 蒋具宏 on 2020/2/10.\npublic class TencentImUtils {\n    /**\n     * 返回[错误返回闭包],腾"
  },
  {
    "path": "ios/tencent_im_plugin.podspec",
    "chars": 1310,
    "preview": "#\n# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.\n# Run `pod lib lint tencent_im_pl"
  },
  {
    "path": "lib/entity/conversation_entity.dart",
    "chars": 2450,
    "preview": "import 'package:tencent_im_plugin/entity/group_at_info_entity.dart';\nimport 'package:tencent_im_plugin/entity/message_en"
  },
  {
    "path": "lib/entity/conversation_result_entity.dart",
    "chars": 756,
    "preview": "import 'dart:convert';\n\nimport 'package:tencent_im_plugin/entity/conversation_entity.dart';\nimport 'package:tencent_im_p"
  },
  {
    "path": "lib/entity/download_progress_entity.dart",
    "chars": 700,
    "preview": "import 'dart:convert';\n\nimport 'package:tencent_im_plugin/enums/download_type_enum.dart';\n\n/// 下载进度实体\nclass DownloadProg"
  },
  {
    "path": "lib/entity/error_entity.dart",
    "chars": 355,
    "preview": "import 'dart:convert';\n\n/// 错误实体\nclass ErrorEntity {\n  /// 错误码\n  late int code;\n\n  /// 错误描述\n  String? error;\n\n  ErrorEnt"
  },
  {
    "path": "lib/entity/find_friend_application_entity.dart",
    "chars": 783,
    "preview": "import 'package:tencent_im_plugin/entity/friend_application_entity.dart';\nimport 'package:tencent_im_plugin/enums/friend"
  },
  {
    "path": "lib/entity/find_group_application_entity.dart",
    "chars": 387,
    "preview": "/// 查找群申请实体\nclass FindGroupApplicationEntity {\n  /// 来自用户\n  String fromUser;\n\n  /// 群ID\n  String groupID;\n\n  FindGroupAp"
  },
  {
    "path": "lib/entity/find_message_entity.dart",
    "chars": 274,
    "preview": "/// 查找消息实体\nclass FindMessageEntity {\n  /// 消息ID\n  String msgId;\n\n  FindMessageEntity({\n    required this.msgId,\n  });\n\n "
  },
  {
    "path": "lib/entity/friend_add_application_entity.dart",
    "chars": 869,
    "preview": "import 'package:tencent_im_plugin/enums/friend_type_enum.dart';\n\n/// 好友添加申请实体\nclass FriendAddApplicationEntity {\n  /// 用"
  },
  {
    "path": "lib/entity/friend_application_entity.dart",
    "chars": 1008,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/enums/friend_application_type_enum.dart';\n\n/// 好友申请实体\nclass Fri"
  },
  {
    "path": "lib/entity/friend_application_result_entity.dart",
    "chars": 710,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/entity/friend_application_entity.dart';\nimport 'package:tencent"
  },
  {
    "path": "lib/entity/friend_check_result_entity.dart",
    "chars": 756,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/enums/friend_relation_type_enum.dart';\n\n/// 好友检测结果实体\nclass Frie"
  },
  {
    "path": "lib/entity/friend_group_entity.dart",
    "chars": 541,
    "preview": "import 'dart:convert';\n\n/// 好友分组实体\nclass FriendGroupEntity {\n  /// 组名\n  late String name;\n\n  /// 好友数量\n  late int friendC"
  },
  {
    "path": "lib/entity/friend_info_entity.dart",
    "chars": 1535,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/entity/user_entity.dart';\n\n/// 好友信息实体\nclass FriendInfoEntity {\n"
  },
  {
    "path": "lib/entity/friend_info_result_entity.dart",
    "chars": 862,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/entity/friend_info_entity.dart';\nimport 'package:tencent_im_plu"
  },
  {
    "path": "lib/entity/friend_operation_result_entity.dart",
    "chars": 526,
    "preview": "import 'dart:convert';\n\n/// 好友操作结果实体\nclass FriendOperationResultEntity {\n  /// 用户ID\n  late String userID;\n\n  /// 返回码\n  l"
  },
  {
    "path": "lib/entity/group_administrator_op_entity.dart",
    "chars": 752,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/entity/group_member_entity.dart';\nimport 'package:tencent_im_pl"
  },
  {
    "path": "lib/entity/group_application_entity.dart",
    "chars": 2093,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/enums/group_application_handler_result_enum.dart';\nimport 'pack"
  },
  {
    "path": "lib/entity/group_application_processed_entity.dart",
    "chars": 730,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/entity/group_member_entity.dart';\n\n/// 群申请处理\nclass GroupApplica"
  },
  {
    "path": "lib/entity/group_application_result_entity.dart",
    "chars": 705,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/entity/group_application_entity.dart';\nimport 'package:tencent_"
  },
  {
    "path": "lib/entity/group_at_info_entity.dart",
    "chars": 474,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/enums/group_at_type_enum.dart';\n\n/// 群@信息实体\nclass GroupAtInfoEn"
  },
  {
    "path": "lib/entity/group_attribute_changed_entity.dart",
    "chars": 480,
    "preview": "import 'dart:convert';\n\n/// 群属性更新实体\nclass GroupAttributeChangedEntity {\n  /// 群ID\n  late String groupID;\n\n  /// 属性对象\n  l"
  },
  {
    "path": "lib/entity/group_changed_entity.dart",
    "chars": 1116,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/enums/group_info_changed_type_enum.dart';\nimport 'package:tence"
  },
  {
    "path": "lib/entity/group_create_member_entity.dart",
    "chars": 509,
    "preview": "import 'package:tencent_im_plugin/enums/group_member_role_enum.dart';\n\n/// 群创建时需要传递的群成员实体\nclass GroupCreateMemberEntity "
  },
  {
    "path": "lib/entity/group_dismissed_or_recycled_entity.dart",
    "chars": 532,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/entity/group_member_entity.dart';\n\n/// 群解散或被回收通知实体\nclass GroupD"
  },
  {
    "path": "lib/entity/group_info_entity.dart",
    "chars": 4070,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/enums/group_add_opt_enum.dart';\nimport 'package:tencent_im_plug"
  },
  {
    "path": "lib/entity/group_info_result_entity.dart",
    "chars": 654,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/entity/group_info_entity.dart';\n\n/// 群信息结果实体\nclass GroupInfoRes"
  },
  {
    "path": "lib/entity/group_member_changed_entity.dart",
    "chars": 970,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/list_util.dart';\n\n/// 群成员改变通知实体\nclass GroupMemberChangedEntity "
  },
  {
    "path": "lib/entity/group_member_enter_entity.dart",
    "chars": 619,
    "preview": "import 'dart:convert';\nimport 'package:tencent_im_plugin/entity/group_member_entity.dart';\nimport 'package:tencent_im_pl"
  }
]

// ... and 68 more files (download for full content)

About this extraction

This page contains the full source code of the JiangJuHong/FlutterTencentImPlugin GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 268 files (560.3 KB), approximately 155.9k tokens, and a symbol index with 855 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!