Przeglądaj źródła

发送文本消息

xuqm 1 rok temu
rodzic
commit
50dbad6855
22 zmienionych plików z 592 dodań i 149 usunięć
  1. 0 56
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/bean/SZYXMessage.java
  2. 35 10
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/bean/UserInfo.java
  3. 0 27
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/bean/message/TextMessage.java
  4. 4 2
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/cfg/Constant.java
  5. 9 6
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/enums/PacketType.java
  6. 1 1
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/IMHelper.java
  7. 14 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/bean/PacketMessage.java
  8. 11 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/kit/IMInterface.java
  9. 187 13
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/manager/ImManager.java
  10. 30 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/manager/UserManager.java
  11. 30 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/msg/ConnectedMessage.java
  12. 112 1
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/msg/SZYXMessage.java
  13. 20 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/msg/SendAckMessage.java
  14. 17 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/msg/message/SZYXTextMessage.java
  15. 7 1
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/kit/MsgListener.java
  16. 4 2
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/kit/SdkInterface.java
  17. 19 4
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/manager/SZYXImManager.java
  18. 7 14
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/repository/bean/LoginBean.java
  19. 24 1
      app/src/main/java/cn/org/bjca/trust/android/imdemo/ui/ChatActivity.java
  20. 1 0
      app/src/main/java/cn/org/bjca/trust/android/imdemo/ui/FriendsActivity.java
  21. 2 2
      app/src/main/java/cn/org/bjca/trust/android/imdemo/ui/login/LoginActivity.java
  22. 58 9
      app/src/main/res/layout/activity_chat.xml

+ 0 - 56
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/bean/SZYXMessage.java

@@ -1,56 +0,0 @@
-package cn.org.bjca.trust.android.lib.im.bean;
-
-import cn.org.bjca.trust.android.lib.im.bean.message.TextMessage;
-import cn.org.bjca.trust.android.lib.im.enums.MsgType;
-
-public class SZYXMessage {
-    /**
-     * 消息id
-     */
-    private String msgId;
-    /**
-     *发送者信息
-     */
-    private UserInfo fromClient;
-    /**
-     *接收者信息
-     */
-    private UserInfo toClient;
-    /**
-     *真实讲话人
-     */
-    private UserInfo speaker;
-    /**
-     *自定义信息
-     */
-    private String describe;
-    /**
-     *是不是群消息
-     */
-    private boolean isGroup;
-    /**
-     *是不是接收消息
-     */
-    private boolean isArrive;
-    /**
-     *消息发送状态
-     */
-    private boolean isSuccess;
-    /**
-     *时间戳
-     */
-    private long timestamp;
-    /**
-     *租户编号
-     */
-    private String tenantNo;
-    /**
-     *消息序列号
-     */
-    private long seq;
-    /**
-     * 消息类型
-     */
-    private MsgType msgType;
-    private TextMessage textMessage;
-}

+ 35 - 10
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/bean/UserInfo.java

@@ -2,27 +2,52 @@ package cn.org.bjca.trust.android.lib.im.bean;
 
 public class UserInfo {
     private String userId;
+    private String userName;
+    private String password;
+    private String appId;
+    private String osType;
     private String nickName;
     private String faceUrl;
     private String gender;
 
-    public UserInfo(String userId) {
-        this.userId = userId;
+    public String getUserId() {
+        return userId;
     }
 
-    public UserInfo(String userId, String nickName, String faceUrl, String gender) {
+    public void setUserId(String userId) {
         this.userId = userId;
-        this.nickName = nickName;
-        this.faceUrl = faceUrl;
-        this.gender = gender;
     }
 
-    public String getUserId() {
-        return userId;
+    public String getUserName() {
+        return userName;
     }
 
-    public void setUserId(String userId) {
-        this.userId = userId;
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public String getOsType() {
+        return osType;
+    }
+
+    public void setOsType(String osType) {
+        this.osType = osType;
     }
 
     public String getNickName() {

+ 0 - 27
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/bean/message/TextMessage.java

@@ -1,27 +0,0 @@
-package cn.org.bjca.trust.android.lib.im.bean.message;
-
-import androidx.annotation.NonNull;
-
-public class TextMessage {
-    private String text;
-
-    public TextMessage(String text) {
-        this.text = text;
-    }
-
-    public String getText() {
-        return text;
-    }
-
-    public void setText(String text) {
-        this.text = text;
-    }
-
-    @NonNull
-    @Override
-    public String toString() {
-        return "TextMessage{" +
-                "text='" + text + '\'' +
-                '}';
-    }
-}

+ 4 - 2
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/cfg/Constant.java

@@ -1,5 +1,7 @@
 package cn.org.bjca.trust.android.lib.im.cfg;
 
+import android.util.Log;
+
 public class Constant {
     public static final String BaseUrl = "https://221n3i2201.goho.co";
 
@@ -11,11 +13,11 @@ public class Constant {
     }
 
     public static String getSdkAppID() {
-        return sdkAppID;
+        return Constant.sdkAppID;
     }
 
     public static String getUserId() {
-        return userId;
+        return Constant.userId;
     }
 
     public static void setUserId(String userId) {

+ 9 - 6
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/enums/PacketType.java

@@ -6,15 +6,18 @@ public enum PacketType {
     CONNECTED(11),
     //发送消息
     SEND(20),
-    ARRIVE(21),
+    SEND_ACK(21),
+    ARRIVE(30),
+    ARRIVE_ACK(31),
     //心跳包
-    PING(30),
-    PANG(31),
+    PING(40),
+    PANG(41),
     //数据请求
-    REQUEST(40),
-    RESULT(41),
+    REQUEST(50),
+    RESULT(51),
     //系统通知
-    SYSTEM(50),
+    SYSTEM(60),
+    SYSTEM_ACK(61),
     UNKNOWN(-1);
 
     private int type = -1;

+ 1 - 1
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/IMHelper.java

@@ -10,7 +10,7 @@ public class IMHelper {
     }
 
     public static IMInterface getInstance() {
-        return IMHelper.IMHelperHolder.instance;
+        return IMHelperHolder.instance;
 
     }
 }

+ 14 - 0
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/bean/PacketMessage.java

@@ -1,9 +1,15 @@
 package cn.org.bjca.trust.android.lib.im.im.bean;
 
+import java.util.UUID;
+
 import cn.org.bjca.trust.android.lib.im.cfg.Constant;
 import cn.org.bjca.trust.android.lib.im.enums.PacketType;
 
 public abstract class PacketMessage {
+    /**
+     * 消息id
+     */
+    private String msgId = UUID.randomUUID().toString();
     private PacketType packetType;
     private long timestamp = System.currentTimeMillis();
     private String appId = Constant.getSdkAppID();
@@ -13,6 +19,14 @@ public abstract class PacketMessage {
         this.packetType = packetType;
     }
 
+    public String getMsgId() {
+        return msgId;
+    }
+
+    public void setMsgId(String msgId) {
+        this.msgId = msgId;
+    }
+
     public PacketType getPacketType() {
         return packetType;
     }

+ 11 - 0
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/kit/IMInterface.java

@@ -1,5 +1,6 @@
 package cn.org.bjca.trust.android.lib.im.im.kit;
 
+import cn.org.bjca.trust.android.lib.im.enums.MsgType;
 import cn.org.bjca.trust.android.lib.im.im.msg.SZYXMessage;
 import cn.org.bjca.trust.android.lib.im.im.opt.ImConnectOptions;
 import cn.org.bjca.trust.android.lib.im.kit.IMSDKCallback;
@@ -8,13 +9,23 @@ import cn.org.bjca.trust.android.lib.im.kit.MsgListener;
 
 public interface IMInterface {
     void addMsgListener(MsgListener listener);
+
     void removeMsgListener(MsgListener listener);
+
     void setStatusListener(IMSDKListener listener);
+
     void removeStatusListener(IMSDKListener listener);
+
     void login(ImConnectOptions imConnectOptions);
+
     void logout();
+
     boolean isConnect();
+
     boolean isConnecting();
+
     void sendSZYXMessage(SZYXMessage message, IMSDKCallback callback);
 
+    SZYXMessage createMsg(MsgType msgType, String toUserId, boolean isGroup, Object message, String describe);
+
 }

+ 187 - 13
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/manager/ImManager.java

@@ -1,7 +1,13 @@
 package cn.org.bjca.trust.android.lib.im.im.manager;
 
+import android.annotation.SuppressLint;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
+
 import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
 import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
 import org.eclipse.paho.client.mqttv3.MqttClient;
@@ -10,13 +16,23 @@ import org.eclipse.paho.client.mqttv3.MqttException;
 import org.eclipse.paho.client.mqttv3.MqttMessage;
 import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import cn.org.bjca.trust.android.lib.im.cfg.Constant;
 import cn.org.bjca.trust.android.lib.im.common.DeviceHelper;
 import cn.org.bjca.trust.android.lib.im.common.json.GsonImplHelp;
+import cn.org.bjca.trust.android.lib.im.enums.MsgType;
+import cn.org.bjca.trust.android.lib.im.enums.PacketType;
 import cn.org.bjca.trust.android.lib.im.im.bean.PacketMessage;
 import cn.org.bjca.trust.android.lib.im.im.kit.IMInterface;
 import cn.org.bjca.trust.android.lib.im.im.msg.ConnectMessage;
+import cn.org.bjca.trust.android.lib.im.im.msg.ConnectedMessage;
 import cn.org.bjca.trust.android.lib.im.im.msg.SZYXMessage;
+import cn.org.bjca.trust.android.lib.im.im.msg.SendAckMessage;
+import cn.org.bjca.trust.android.lib.im.im.msg.message.SZYXTextMessage;
 import cn.org.bjca.trust.android.lib.im.im.opt.ImConnectOptions;
 import cn.org.bjca.trust.android.lib.im.kit.IMSDKCallback;
 import cn.org.bjca.trust.android.lib.im.kit.IMSDKListener;
@@ -26,6 +42,25 @@ import kotlin.text.Charsets;
 public class ImManager implements IMInterface {
     private final String TAG = "ImManager";
 
+    //登录成功
+    private String topic_connected;
+
+    // 新消息到达
+    private String topic_arrive;
+
+    // 发送消息应答
+    private String topic_send_ack;
+
+    // 心跳应答
+    private String topic_pang;
+
+
+    // 数据请求回复
+    private String topic_result;
+
+    // 系统消息
+    private String topic_system;
+
     private MqttClient mqttClient;
     private MqttConnectOptions connectOptions;
 
@@ -33,15 +68,18 @@ public class ImManager implements IMInterface {
 
     private IMSDKListener statusListener;
 
+    private final List<MsgListener> msgListeners = new ArrayList<>();
+    private final Map<String, IMSDKCallback> msgListenerMap = new HashMap<>();
+
 
     @Override
     public void addMsgListener(MsgListener listener) {
-
+        msgListeners.add(listener);
     }
 
     @Override
     public void removeMsgListener(MsgListener listener) {
-
+        msgListeners.remove(listener);
     }
 
     @Override
@@ -54,6 +92,16 @@ public class ImManager implements IMInterface {
         this.statusListener = null;
     }
 
+
+    private void initTopic() {
+        topic_send_ack = Constant.getSdkAppID() + "/" + PacketType.SEND_ACK + Constant.getUserId();
+        topic_connected = Constant.getSdkAppID() + "/" + PacketType.CONNECTED + Constant.getUserId();
+        topic_arrive = Constant.getSdkAppID() + "/" + PacketType.ARRIVE + Constant.getUserId();
+        topic_pang = Constant.getSdkAppID() + "/" + PacketType.PANG + Constant.getUserId();
+        topic_result = Constant.getSdkAppID() + "/" + PacketType.RESULT + Constant.getUserId();
+        topic_system = Constant.getSdkAppID() + "/" + PacketType.SYSTEM + Constant.getUserId();
+    }
+
     @Override
     public void login(ImConnectOptions imConnectOptions) {
         if (this.isConnect()) this.logout();
@@ -65,6 +113,7 @@ public class ImManager implements IMInterface {
         connectOptions.setConnectionTimeout(30);
         connectOptions.setKeepAliveInterval(20);
         connectOptions.setAutomaticReconnect(true);
+        initTopic();
 
         try {
             mqttClient = new MqttClient("tcp://" + imConnectOptions.getHost() + ":" + imConnectOptions.getPort(),
@@ -76,11 +125,13 @@ public class ImManager implements IMInterface {
                     status = 0;
                     if (reconnect) return;
                     try {
-                        mqttClient.subscribe(Constant.getSdkAppID() + "/message:" + Constant.getUserId(), 2);
-                        mqttClient.subscribe(Constant.getSdkAppID() + "/pang:" + Constant.getUserId(), 2);
-                        mqttClient.subscribe(Constant.getSdkAppID() + "/connect:" + Constant.getUserId(), 2);
-                        mqttClient.subscribe(Constant.getSdkAppID() + "/result:" + Constant.getUserId(), 2);
-                        mqttClient.subscribe(Constant.getSdkAppID() + "/notice:" + Constant.getUserId(), 2);
+                        mqttClient.subscribe(topic_connected, 2);
+                        mqttClient.subscribe(topic_arrive, 2);
+                        mqttClient.subscribe(topic_send_ack, 2);
+                        mqttClient.subscribe(topic_pang, 2);
+                        mqttClient.subscribe(topic_result, 2);
+                        mqttClient.subscribe(topic_system, 2);
+                        Log.e("======>connectComplete", topic_send_ack);
                     } catch (MqttException e) {
                         Log.e(TAG, "=====>connectComplete", e);
                     }
@@ -97,12 +148,52 @@ public class ImManager implements IMInterface {
 
                 @Override
                 public void messageArrived(String topic, MqttMessage message) throws Exception {
-                    Log.e("======>messageArrived", topic + "::" + new String(message.getPayload(), Charsets.UTF_8));
+                    String msg = new String(message.getPayload(), Charsets.UTF_8);
+                    // 登录应答
+                    if (topic.equals(topic_connected)) {
+                        ConnectedMessage connectedMessage = GsonImplHelp.get().toObject(msg, ConnectedMessage.class);
+                        if (connectedMessage.getStatus() == 200) {
+                            if (statusListener != null) statusListener.onConnectSuccess();
+                        } else {
+                            if (statusListener != null)
+                                statusListener.onConnectFailed(connectedMessage.getStatus(), connectedMessage.getMsg());
+                        }
+                    }
+                    // 发送消息应答
+                    else if (topic.equals(topic_send_ack)) {
+                        SendAckMessage sendAckMessage = GsonImplHelp.get().toObject(msg, SendAckMessage.class);
+
+                        Message m = new Message();
+                        m.obj = sendAckMessage.getAckId();
+                        m.what = 10002;
+                        handler.sendMessage(m);
+
+                    }
+                    // 新消息送达
+                    else if (topic.equals(topic_arrive)) {
+                        SZYXMessage szyxMessage = GsonImplHelp.get().toObject(msg, SZYXMessage.class);
+                        sendAckMsg(szyxMessage.getMsgId());
+                        Log.d("======>新消息送达", topic + "::\n" + msg);
+                        for (MsgListener listener : msgListeners) {
+                            listener.messageArrive(new ArrayList<SZYXMessage>() {
+                                {
+                                    add(szyxMessage);
+                                }
+                            });
+                        }
+                    } else
+                        Log.e("======>messageArrived", topic + "::" + msg);
+
+
                 }
 
                 @Override
                 public void deliveryComplete(IMqttDeliveryToken token) {
-                    Log.e("======>deliveryComplete", "token.getMessage().toString()");
+                    try {
+                        if (token.getMessage() != null && token.getMessage().getPayload() != null)
+                            Log.e("======>deliveryComplete", new String(token.getMessage().getPayload(), Charsets.UTF_8));
+                    } catch (MqttException ignored) {
+                    }
                 }
 
             });
@@ -145,17 +236,47 @@ public class ImManager implements IMInterface {
         return this.status == 1;
     }
 
+    @Override
+    public SZYXMessage createMsg(MsgType msgType, String toUserId, boolean isGroup, Object message, String describe) {
+
+        SZYXMessage szyxMessage = new SZYXMessage(msgType);
+        szyxMessage.setArrive(false);
+        szyxMessage.setDescribe(describe);
+        szyxMessage.setGroup(isGroup);
+        szyxMessage.setStatus(1);
+        szyxMessage.setFromClient(UserManager.getInstance().getUserInfo());
+        if (isGroup)
+            szyxMessage.setGroupID(toUserId);
+        else
+            szyxMessage.setToClientId(toUserId);
+        switch (msgType) {
+            case Text:
+                szyxMessage.setTextMessage((SZYXTextMessage) message);
+                break;
+            case Voice:
+                break;
+        }
+
+        return szyxMessage;
+    }
+
     @Override
     public void sendSZYXMessage(SZYXMessage message, IMSDKCallback callback) {
-        sendPacketMessage(message, callback);
+        sendPacketMessage(PacketType.SEND, message, callback);
     }
 
     private void sendConnectMsg() {
         ConnectMessage message = new ConnectMessage(DeviceHelper.getDevice());
-        sendPacketMessage(message, null);
+        sendPacketMessage(PacketType.CONNECT, message, null);
+    }
+
+    private void sendAckMsg(String msgId) {
+        SendAckMessage message = new SendAckMessage();
+        message.setMsgId(msgId);
+        sendPacketMessage(PacketType.SEND_ACK, message, null);
     }
 
-    private void sendPacketMessage(PacketMessage message, IMSDKCallback callback) {
+    private void sendPacketMessage(PacketType packetType, PacketMessage message, IMSDKCallback callback) {
         if (null == connectOptions) {
             if (null != callback) callback.failed(204, "未登录");
             return;
@@ -166,10 +287,63 @@ public class ImManager implements IMInterface {
         }
         String msg = GsonImplHelp.get().toJson(message);
         try {
-            mqttClient.publish("server", msg.getBytes(Charsets.UTF_8), 2, false);
+            mqttClient.publish("server" + packetType, msg.getBytes(Charsets.UTF_8), 2, false);
+            // 如果是发送的消息,需要应答
+            if (PacketType.SEND == packetType) {
+                if (null != callback)
+                    msgListenerMap.put(message.getMsgId(), callback);
+                else msgListenerMap.put(message.getMsgId(), new IMSDKCallback() {
+                    @Override
+                    public void success() {
+
+                    }
+
+                    @Override
+                    public void failed(int code, String error) {
+
+                    }
+                });
+                Message m = new Message();
+                m.obj = message.getMsgId();
+                m.what = 10001;
+                handler.sendMessageDelayed(m, 1500);
+            }
         } catch (MqttException e) {
             if (null != callback) callback.failed(206, e.getMessage());
         }
 
     }
+
+    private final Handler handler = new Handler(Looper.getMainLooper()) {
+        @SuppressLint("HandlerLeak")
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            super.handleMessage(msg);
+            String msgId = (String) msg.obj;
+            switch (msg.what) {
+                case 10001:
+                    IMSDKCallback callback = msgListenerMap.get(msgId);
+                    if (null != callback) {
+                        callback.failed(207, "发送超时");
+                        msgListenerMap.remove(msgId);
+
+                        for (MsgListener listener : msgListeners) {
+                            listener.statusChange(msgId, -1);
+                        }
+                    }
+                    break;
+                case 10002:
+                    IMSDKCallback callback1 = msgListenerMap.get(msgId);
+                    if (null != callback1) {
+                        for (MsgListener listener : msgListeners) {
+                            listener.statusChange(msgId, 0);
+                        }
+                        callback1.success();
+                        msgListenerMap.remove(msgId);
+                    }
+                    break;
+            }
+        }
+    };
+
 }

+ 30 - 0
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/manager/UserManager.java

@@ -0,0 +1,30 @@
+package cn.org.bjca.trust.android.lib.im.im.manager;
+
+import cn.org.bjca.trust.android.lib.im.bean.UserInfo;
+
+public class UserManager {
+
+    public static UserManager getInstance() {
+        return UserManagerHolder.instance;
+    }
+
+    private static final class UserManagerHolder {
+        static final UserManager instance = new UserManager();
+    }
+
+    private UserManager() {
+
+    }
+    private UserInfo userInfo;
+
+    public UserInfo getUserInfo() {
+        return userInfo;
+    }
+    public UserInfo getUserInfoForMessage() {
+        return userInfo;
+    }
+
+    public void setUserInfo(UserInfo userInfo) {
+        this.userInfo = userInfo;
+    }
+}

+ 30 - 0
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/msg/ConnectedMessage.java

@@ -0,0 +1,30 @@
+package cn.org.bjca.trust.android.lib.im.im.msg;
+
+
+import cn.org.bjca.trust.android.lib.im.enums.PacketType;
+import cn.org.bjca.trust.android.lib.im.im.bean.PacketMessage;
+
+public class ConnectedMessage extends PacketMessage {
+    public ConnectedMessage() {
+        super(PacketType.CONNECTED);
+    }
+
+    private int status;
+    private String msg;
+
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

+ 112 - 1
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/msg/SZYXMessage.java

@@ -1,10 +1,121 @@
 package cn.org.bjca.trust.android.lib.im.im.msg;
 
+import cn.org.bjca.trust.android.lib.im.bean.UserInfo;
+import cn.org.bjca.trust.android.lib.im.enums.MsgType;
 import cn.org.bjca.trust.android.lib.im.enums.PacketType;
 import cn.org.bjca.trust.android.lib.im.im.bean.PacketMessage;
+import cn.org.bjca.trust.android.lib.im.im.msg.message.SZYXTextMessage;
 
 public class SZYXMessage extends PacketMessage {
-    public SZYXMessage() {
+    public SZYXMessage(MsgType msgType) {
         super(PacketType.SEND);
+        this.msgType = msgType;
     }
+
+    /**
+     * 发送者信息
+     */
+    private UserInfo fromClient;
+    /**
+     * 接收者信息
+     */
+    private String toClientId;
+    /**
+     * 群id
+     */
+    private String groupID;
+    /**
+     * 自定义信息(备注信息,描述信息)
+     */
+    private String describe;
+    /**
+     * 是不是群消息
+     */
+    private boolean isGroup;
+    /**
+     * 是不是接收消息
+     */
+    private boolean isArrive;
+    /**
+     * 消息发送状态 -1=失败;0=成功;1=发送中
+     */
+    private int status;
+    /**
+     * 消息类型
+     */
+    private MsgType msgType;
+    private SZYXTextMessage textMessage;
+
+    public UserInfo getFromClient() {
+        return fromClient;
+    }
+
+    public void setFromClient(UserInfo fromClient) {
+        this.fromClient = fromClient;
+    }
+
+    public String getToClientId() {
+        return toClientId;
+    }
+
+    public void setToClientId(String toClientId) {
+        this.toClientId = toClientId;
+    }
+
+    public String getGroupID() {
+        return groupID;
+    }
+
+    public void setGroupID(String groupID) {
+        this.groupID = groupID;
+    }
+
+    public String getDescribe() {
+        return describe;
+    }
+
+    public void setDescribe(String describe) {
+        this.describe = describe;
+    }
+
+    public boolean isGroup() {
+        return isGroup;
+    }
+
+    public void setGroup(boolean group) {
+        isGroup = group;
+    }
+
+    public boolean isArrive() {
+        return isArrive;
+    }
+
+    public void setArrive(boolean arrive) {
+        isArrive = arrive;
+    }
+
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    public MsgType getMsgType() {
+        return msgType;
+    }
+
+    public void setMsgType(MsgType msgType) {
+        this.msgType = msgType;
+    }
+
+    public SZYXTextMessage getTextMessage() {
+        return textMessage;
+    }
+
+    public void setTextMessage(SZYXTextMessage textMessage) {
+        this.textMessage = textMessage;
+    }
+
 }

+ 20 - 0
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/msg/SendAckMessage.java

@@ -0,0 +1,20 @@
+package cn.org.bjca.trust.android.lib.im.im.msg;
+
+
+import cn.org.bjca.trust.android.lib.im.enums.PacketType;
+import cn.org.bjca.trust.android.lib.im.im.bean.PacketMessage;
+
+public class SendAckMessage extends PacketMessage {
+    public SendAckMessage() {
+        super(PacketType.SEND_ACK);
+    }
+    private String ackId;
+
+    public String getAckId() {
+        return ackId;
+    }
+
+    public void setAckId(String ackId) {
+        this.ackId = ackId;
+    }
+}

+ 17 - 0
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/msg/message/SZYXTextMessage.java

@@ -0,0 +1,17 @@
+package cn.org.bjca.trust.android.lib.im.im.msg.message;
+
+public class SZYXTextMessage {
+    private String text;
+
+    public SZYXTextMessage(String text) {
+        this.text = text;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+}

+ 7 - 1
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/kit/MsgListener.java

@@ -2,8 +2,14 @@ package cn.org.bjca.trust.android.lib.im.kit;
 
 import java.util.List;
 
-import cn.org.bjca.trust.android.lib.im.bean.SZYXMessage;
+import cn.org.bjca.trust.android.lib.im.im.msg.SZYXMessage;
 
 public interface MsgListener {
     void messageArrive(List<SZYXMessage> messages);
+
+    /**
+     * @param msgId  消息唯一id
+     * @param status -1=失败;0=成功;1=发送中
+     */
+    void statusChange(String msgId, int status);
 }

+ 4 - 2
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/kit/SdkInterface.java

@@ -2,6 +2,8 @@ package cn.org.bjca.trust.android.lib.im.kit;
 
 import android.content.Context;
 
+import cn.org.bjca.trust.android.lib.im.im.msg.SZYXMessage;
+
 public interface SdkInterface {
 
     void setIMSDKListener(IMSDKListener listener);
@@ -18,9 +20,9 @@ public interface SdkInterface {
 
     void removeMsgListener(MsgListener listener);
 
-    void sendMsgForTextToC(String toUserId, String text, IMSDKCallback callback);
+    SZYXMessage sendMsgForTextToC(String toUserId, String text, IMSDKCallback callback);
 
-    void sendMsgForTextToG(String toGroupId, String text, IMSDKCallback callback);
+    SZYXMessage sendMsgForTextToG(String toGroupId, String text, IMSDKCallback callback);
 
     String getVersion();
 }

+ 19 - 4
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/manager/SZYXImManager.java

@@ -6,8 +6,12 @@ import cn.org.bjca.trust.android.lib.im.BuildConfig;
 import cn.org.bjca.trust.android.lib.im.SZYXDbHelper;
 import cn.org.bjca.trust.android.lib.im.cfg.Constant;
 import cn.org.bjca.trust.android.lib.im.common.DeviceHelper;
+import cn.org.bjca.trust.android.lib.im.enums.MsgType;
 import cn.org.bjca.trust.android.lib.im.http.HttpManage;
 import cn.org.bjca.trust.android.lib.im.im.IMHelper;
+import cn.org.bjca.trust.android.lib.im.im.manager.UserManager;
+import cn.org.bjca.trust.android.lib.im.im.msg.SZYXMessage;
+import cn.org.bjca.trust.android.lib.im.im.msg.message.SZYXTextMessage;
 import cn.org.bjca.trust.android.lib.im.im.opt.ImConnectOptions;
 import cn.org.bjca.trust.android.lib.im.kit.IMSDKCallback;
 import cn.org.bjca.trust.android.lib.im.kit.IMSDKListener;
@@ -58,7 +62,8 @@ public class SZYXImManager implements SdkInterface {
                         if (null != callback) callback.success();
                         if (null != imsdkListener) imsdkListener.onConnecting();
                         LoginBean bean = httpResult.getData();
-                        imLogin(bean.getHost(), bean.getPort(), bean.getClientId(), bean.getToken());
+                        UserManager.getInstance().setUserInfo(bean.getUserInfo());
+                        imLogin(bean.getHost(), bean.getPort(), bean.getUserInfo().getUserName(), bean.getUserInfo().getPassword());
                     } else if (null != callback) callback.failed(1001, httpResult.getMsg());
                 }, throwable -> {
                     if (null != callback) callback.failed(1001, throwable.getMessage());
@@ -85,13 +90,23 @@ public class SZYXImManager implements SdkInterface {
     }
 
     @Override
-    public void sendMsgForTextToC(String toUserId, String text, IMSDKCallback callback) {
-//        IMHelper.getInstance().sendSZYXMessage();
+    public SZYXMessage sendMsgForTextToC(String toUserId, String text, IMSDKCallback callback) {
+        SZYXTextMessage textMessage = new SZYXTextMessage(text);
+
+        SZYXMessage szyxMessage = IMHelper.getInstance().createMsg(MsgType.Text, toUserId, false, textMessage, null);
+
+        IMHelper.getInstance().sendSZYXMessage(szyxMessage, callback);
+        return szyxMessage;
     }
 
     @Override
-    public void sendMsgForTextToG(String toGroupId, String text, IMSDKCallback callback) {
+    public SZYXMessage sendMsgForTextToG(String toGroupId, String text, IMSDKCallback callback) {
+        SZYXTextMessage textMessage = new SZYXTextMessage(text);
+
+        SZYXMessage szyxMessage = IMHelper.getInstance().createMsg(MsgType.Text, toGroupId, true, textMessage, null);
 
+        IMHelper.getInstance().sendSZYXMessage(szyxMessage, callback);
+        return szyxMessage;
     }
 
     @Override

+ 7 - 14
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/repository/bean/LoginBean.java

@@ -1,10 +1,11 @@
 package cn.org.bjca.trust.android.lib.im.repository.bean;
 
+import cn.org.bjca.trust.android.lib.im.bean.UserInfo;
+
 public class LoginBean {
     private String host;
     private String port;
-    private String clientId;
-    private String token;
+    private UserInfo userInfo;
 
     public String getHost() {
         return host;
@@ -22,19 +23,11 @@ public class LoginBean {
         this.port = port;
     }
 
-    public String getClientId() {
-        return clientId;
-    }
-
-    public void setClientId(String clientId) {
-        this.clientId = clientId;
-    }
-
-    public String getToken() {
-        return token;
+    public UserInfo getUserInfo() {
+        return userInfo;
     }
 
-    public void setToken(String token) {
-        this.token = token;
+    public void setUserInfo(UserInfo userInfo) {
+        this.userInfo = userInfo;
     }
 }

+ 24 - 1
app/src/main/java/cn/org/bjca/trust/android/imdemo/ui/ChatActivity.java

@@ -1,11 +1,15 @@
 package cn.org.bjca.trust.android.imdemo.ui;
 
 import android.os.Bundle;
+import android.view.View;
 
+import com.xuqm.base.common.ToolsHelper;
 import com.xuqm.base.ui.BaseActivity;
 
 import cn.org.bjca.trust.android.imdemo.R;
 import cn.org.bjca.trust.android.imdemo.databinding.ActivityChatBinding;
+import cn.org.bjca.trust.android.lib.im.SZYXImSdk;
+import cn.org.bjca.trust.android.lib.im.kit.IMSDKCallback;
 
 public class ChatActivity extends BaseActivity<ActivityChatBinding> {
 
@@ -18,6 +22,25 @@ public class ChatActivity extends BaseActivity<ActivityChatBinding> {
     public void initView(Bundle savedInstanceState) {
         super.initView(savedInstanceState);
         String userId = getIntent().getStringExtra("userId");
-        getBinding().text.setText(userId);
+        String userName = getIntent().getStringExtra("userName");
+        setTitleText(userName + "(" + userId + ")");
+        getBaseBinding().baseToolbar.getToolbarMenu().setVisibility(View.VISIBLE);
+
+        getBinding().btnSend.setOnClickListener(v -> {
+            String msg = getBinding().et.getText().toString();
+            if (!ToolsHelper.isNull(msg)) {
+                SZYXImSdk.getInstance().sendMsgForTextToC(userId, "hello world", new IMSDKCallback() {
+                    @Override
+                    public void success() {
+                        ToolsHelper.showMessage("发送消息成功");
+                    }
+
+                    @Override
+                    public void failed(int code, String error) {
+                        ToolsHelper.showMessage("发送消息失败" + error);
+                    }
+                });
+            }
+        });
     }
 }

+ 1 - 0
app/src/main/java/cn/org/bjca/trust/android/imdemo/ui/FriendsActivity.java

@@ -30,6 +30,7 @@ public class FriendsActivity extends BaseListActivity<UserItem, FriendsVM> {
         } else {
             Intent intent = new Intent(mContext, ChatActivity.class);
             intent.putExtra("userId", item.getUserId());
+            intent.putExtra("userName", item.getNickName());
             startActivity(intent);
         }
     }

+ 2 - 2
app/src/main/java/cn/org/bjca/trust/android/imdemo/ui/login/LoginActivity.java

@@ -120,8 +120,8 @@ public class LoginActivity extends AppCompatActivity {
         });
 
         loadingProgressBar.setVisibility(View.VISIBLE);
-        loginViewModel.login(usernameEditText.getText().toString(),
-                passwordEditText.getText().toString());
+//        loginViewModel.login(usernameEditText.getText().toString(),
+//                passwordEditText.getText().toString());
     }
 
     private void updateUiWithUser(LoggedInUserView model) {

+ 58 - 9
app/src/main/res/layout/activity_chat.xml

@@ -8,15 +8,64 @@
         android:layout_height="match_parent"
         tools:context=".ui.ChatActivity">
 
-        <TextView
-            android:id="@+id/text"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="hello"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
 
+        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+            android:id="@+id/refreshLayout"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:tag="layout/activity_base_list_0"
+            app:layout_constraintBottom_toTopOf="@+id/line"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <com.xuqm.base.view.EmptyView
+                android:id="@+id/baseEmptyView"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/baseRecyclerView"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:overScrollMode="never" />
+
+            </com.xuqm.base.view.EmptyView>
+
+        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+
+        <View
+            android:id="@+id/line"
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="@color/line"
+            app:layout_constraintBottom_toTopOf="@+id/tools" />
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/tools"
+            android:layout_width="match_parent"
+            android:layout_height="60dp"
+            app:layout_constraintBottom_toBottomOf="parent">
+
+            <EditText
+                android:id="@+id/et"
+                android:layout_width="0dp"
+                android:layout_height="50dp"
+                android:layout_marginHorizontal="5dp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toStartOf="@+id/btn_send"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <Button
+                android:id="@+id/btn_send"
+                android:layout_width="65dp"
+                android:layout_height="40dp"
+                android:layout_marginHorizontal="5dp"
+                android:text="发送"
+                android:textSize="11sp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
     </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>