diff --git a/android/build.gradle b/android/build.gradle
index 12f4ba1..040fccc 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -7,8 +7,8 @@ buildscript {
         maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
         maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
         maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }
-//        maven { url 'http://47.112.160.66:8081/repository/maven-releases'}
-        maven { url 'http://127.0.0.1:8081/repository/maven-releases' }
+        maven { url 'http://47.112.160.66:8081/repository/maven-releases'}
+//        maven { url 'http://127.0.0.1:8081/repository/maven-releases' }
         google()
         mavenCentral()
     }
@@ -24,8 +24,8 @@ rootProject.allprojects {
         maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
         maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
         maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }
-//        maven { url 'http://47.112.160.66:8081/repository/maven-releases'}
-        maven { url 'http://127.0.0.1:8081/repository/maven-releases' }
+        maven { url 'http://47.112.160.66:8081/repository/maven-releases'}
+//        maven { url 'http://127.0.0.1:8081/repository/maven-releases' }
         google()
         mavenCentral()
     }
@@ -45,6 +45,6 @@ android {
     }
 }
 dependencies {
-    implementation 'io.openim:client:0.0.7@aar'
-//    implementation 'io.openim:client-sdk:1.0.0@aar'//graoupId:artifactId:version@aar
+//    implementation 'io.openim:client:0.0.7@aar'
+    implementation 'io.openim:client-sdk:0.0.2@aar'//graoupId:artifactId:version@aar
 }
\ No newline at end of file
diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java
index 6827a78..4997b6d 100644
--- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java
+++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java
@@ -54,7 +54,7 @@ public class MessageManager {
     }
 
     public void deleteMessages(MethodCall methodCall, MethodChannel.Result result) {
-//        Open_im_sdk.deleteMessages(new BaseImpl(result), CommonUtil.getSDKJsonParam(methodCall));
+//        Open_im_sdk.deleteMessages(new BaseListener(result), CommonUtil.getSDKJsonParam(methodCall));
     }
 
     public void insertSingleMessageToLocalStorage(MethodCall methodCall, MethodChannel.Result result) {
@@ -65,7 +65,7 @@ public class MessageManager {
     }
 
     public void findMessages(MethodCall methodCall, MethodChannel.Result result) {
-        Open_im_sdk.findMessages(new BaseListener(result), CommonUtil.getFindMessageIds(methodCall));
+        Open_im_sdk.findMessages(new BaseListener(result), CommonUtil.getMessageIdList(methodCall));
     }
 
     public void markSingleMessageHasRead(MethodCall methodCall, MethodChannel.Result result) {
@@ -77,7 +77,14 @@ public class MessageManager {
     }
 
     public void markC2CMessageAsRead(MethodCall methodCall, MethodChannel.Result result) {
-//        Open_im_sdk.markC2CMessageAsRead(new BaseImpl(result), CommonUtil.getSingleMessageUserid(methodCall));
+        Open_im_sdk.markC2CMessageAsRead(new BaseListener(result),
+                CommonUtil.getSingleMessageUserid(methodCall),
+                CommonUtil.getMessageIdList(methodCall));
+    }
+
+    public void typingStatusUpdate(MethodCall methodCall, MethodChannel.Result result) {
+        Open_im_sdk.typingStatusUpdate(CommonUtil.getSingleMessageUserid(methodCall),
+                CommonUtil.getSingleMessageTyping(methodCall));
     }
 
     public void createTextMessage(MethodCall methodCall, MethodChannel.Result result) {
diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/util/CommonUtil.java b/android/src/main/java/io/openim/flutter_openim_sdk/util/CommonUtil.java
index a5403fd..8ee3be3 100644
--- a/android/src/main/java/io/openim/flutter_openim_sdk/util/CommonUtil.java
+++ b/android/src/main/java/io/openim/flutter_openim_sdk/util/CommonUtil.java
@@ -199,7 +199,11 @@ public class CommonUtil {
         return getParamValue(methodCall, KEY_SINGLE_MESSAGE_SENDER);
     }
 
-    public static String getFindMessageIds(MethodCall methodCall) {
+    public static String getSingleMessageTyping(MethodCall methodCall) {
+        return getParamValue(methodCall, KEY_SINGLE_MESSAGE_TYPING);
+    }
+
+    public static String getMessageIdList(MethodCall methodCall) {
         return getSDKJsonParam(methodCall, KEY_FIND_MESSAGE_IDS);
     }
 
@@ -288,6 +292,7 @@ public class CommonUtil {
     final static String KEY_SINGLE_MESSAGE_CONTENT = "message";
     final static String KEY_SINGLE_MESSAGE_USERID = "userID";
     final static String KEY_SINGLE_MESSAGE_SENDER = "sender";
+    final static String KEY_SINGLE_MESSAGE_TYPING = "typing";
     //group chat
     final static String KEY_GROUP_MESSAGE_GROUPID = "groupID";
     // find message
diff --git a/lib/src/enum/message_type.dart b/lib/src/enum/message_type.dart
index 657e9ee..95fd296 100644
--- a/lib/src/enum/message_type.dart
+++ b/lib/src/enum/message_type.dart
@@ -9,7 +9,7 @@ class MessageType {
   static const merger = 107;
   static const revoke = 111;
   static const has_read_receipt = 112;
-  static const typing = 112;
+  static const typing = 113;
 
   ///
   static const accept_friend = 201;
diff --git a/lib/src/listener/advanced_msg_listener.dart b/lib/src/listener/advanced_msg_listener.dart
index 116a9a1..41809b0 100644
--- a/lib/src/listener/advanced_msg_listener.dart
+++ b/lib/src/listener/advanced_msg_listener.dart
@@ -9,7 +9,7 @@ class AdvancedMsgListener {
 
   void onRecvNewMessage(Message msg) {}
 
-  void onRecvC2CReadReceipt(Message msg) {}
+  void onRecvC2CReadReceipt(HaveReadInfo info) {}
 
   void onRecvMessageRevoked(String msgId) {}
 }
diff --git a/lib/src/manager/im_manager.dart b/lib/src/manager/im_manager.dart
index 62a6d86..08f73c5 100644
--- a/lib/src/manager/im_manager.dart
+++ b/lib/src/manager/im_manager.dart
@@ -1,4 +1,5 @@
 import 'dart:convert';
+import 'dart:developer';
 
 import 'package:flutter/services.dart';
 import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
@@ -138,11 +139,11 @@ class IMManager {
         } else if (call.method == ListenerType.advancedMsgListener) {
           var type = call.arguments['type'];
           var id = call.arguments['data']['id'];
-
+          var value = call.arguments['data']['message'];
+          log('====================type:$type    $value');
           switch (type) {
             case 'onRecvNewMessage':
-              var msg = Message.fromJson(
-                  _formatJson(call.arguments['data']['message']));
+              var msg = Message.fromJson(_formatJson(value));
               for (var listener in messageManager.advancedMsgListeners) {
                 if (listener.id == id) {
                   listener.onRecvNewMessage(msg);
@@ -150,17 +151,17 @@ class IMManager {
               }
               break;
             case 'onRecvMessageRevoked':
-              var msgId = call.arguments['data']['message'];
               for (var listener in messageManager.advancedMsgListeners) {
                 if (listener.id == id) {
-                  listener.onRecvMessageRevoked(msgId);
+                  listener.onRecvMessageRevoked(value);
                 }
               }
               break;
             case 'onRecvC2CReadReceipt':
+              var info = HaveReadInfo.fromJson(_formatJson(value));
               for (var listener in messageManager.advancedMsgListeners) {
                 if (listener.id == id) {
-                  listener.onRecvC2CReadReceipt(Message());
+                  listener.onRecvC2CReadReceipt(info);
                 }
               }
               break;
diff --git a/lib/src/manager/im_message_manager.dart b/lib/src/manager/im_message_manager.dart
index 7f14e0a..4db74a0 100644
--- a/lib/src/manager/im_message_manager.dart
+++ b/lib/src/manager/im_message_manager.dart
@@ -36,7 +36,7 @@ class MessageManager {
   }
 
   /// send a message to user or to group
-  ///
+  /// userID: receiver's user ID
   Future<dynamic> sendMessage({
     required Message message,
     String? userID,
@@ -55,6 +55,7 @@ class MessageManager {
   }
 
   /// find all history message
+  /// userID: the user id of the chat partner
   Future<List<Message>> getHistoryMessageList({
     String? userID,
     String? groupID,
@@ -93,6 +94,8 @@ class MessageManager {
   }
 
   ///
+  /// @params userID: receiver's user ID
+  /// @params sender: current user ID
   Future insertSingleMessageToLocalStorage({
     String? userID,
     Message? message,
@@ -117,6 +120,7 @@ class MessageManager {
   }
 
   ///
+  /// @params userID: receiver's userID
   Future<dynamic> markSingleMessageHasRead({required String userID}) {
     return _channel.invokeMethod(
         'markSingleMessageHasRead', _buildParam({'userID': userID}));
@@ -128,6 +132,35 @@ class MessageManager {
         'markGroupMessageHasRead', _buildParam({'groupID': groupID}));
   }
 
+  ///
+  /// @params userID: receiver's user ID
+  Future markC2CMessageAsRead({
+    required String userID,
+    required List<String> messageIDList,
+  }) {
+    return _channel.invokeMethod(
+        'markC2CMessageAsRead',
+        _buildParam({
+          "messageIDList": messageIDList,
+          "userID": userID,
+        }));
+  }
+
+  ///
+  /// @params userID: receiver's user ID
+  /// @params status: default no
+  Future typingStatusUpdate({
+    required String userID,
+    bool typing = false,
+  }) {
+    return _channel.invokeMethod(
+        'typingStatusUpdate',
+        _buildParam({
+          "typing": typing ? 'yes' : 'no',
+          "userID": userID,
+        }));
+  }
+
   ///
   Future<Message> createTextMessage({required String text}) {
     return _channel
diff --git a/lib/src/models/message.dart b/lib/src/models/message.dart
index 1ef2a59..884726b 100644
--- a/lib/src/models/message.dart
+++ b/lib/src/models/message.dart
@@ -368,43 +368,41 @@ class AtElem {
   }
 }
 
-class RevokeMessage {
-  String? serverMsgID;
-  String? sendID;
-  String? senderNickname;
-  String? recvID;
-  String? groupID;
+class HaveReadInfo {
+  String? uid;
+  List<String>? msgIDList;
+  int? readTime;
+  int? msgFrom;
   int? contentType;
-  int? sendTime;
+  int? sessionType;
 
-  RevokeMessage(
-      {this.serverMsgID,
-      this.sendID,
-      this.senderNickname,
-      this.recvID,
-      this.groupID,
+  HaveReadInfo(
+      {this.uid,
+      this.msgIDList,
+      this.readTime,
+      this.msgFrom,
       this.contentType,
-      this.sendTime});
+      this.sessionType});
 
-  RevokeMessage.fromJson(Map<String, dynamic> json) {
-    serverMsgID = json['serverMsgID'];
-    sendID = json['sendID'];
-    senderNickname = json['senderNickname'];
-    recvID = json['recvID'];
-    groupID = json['groupID'];
+  HaveReadInfo.fromJson(Map<String, dynamic> json) {
+    uid = json['uid'];
+    if (json['msgIDList'] is List) {
+      msgIDList = (json['msgIDList'] as List).map((e) => '$e').toList();
+    }
+    readTime = json['readTime'];
+    msgFrom = json['msgFrom'];
     contentType = json['contentType'];
-    sendTime = json['sendTime'];
+    sessionType = json['sessionType'];
   }
 
   Map<String, dynamic> toJson() {
     final Map<String, dynamic> data = new Map<String, dynamic>();
-    data['serverMsgID'] = this.serverMsgID;
-    data['sendID'] = this.sendID;
-    data['senderNickname'] = this.senderNickname;
-    data['recvID'] = this.recvID;
-    data['groupID'] = this.groupID;
+    data['uid'] = this.uid;
+    data['msgIDList'] = this.msgIDList;
+    data['readTime'] = this.readTime;
+    data['msgFrom'] = this.msgFrom;
     data['contentType'] = this.contentType;
-    data['sendTime'] = this.sendTime;
+    data['sessionType'] = this.sessionType;
     return data;
   }
 }