xuqm před 1 rokem
rodič
revize
7eb33aae86
20 změnil soubory, kde provedl 705 přidání a 14 odebrání
  1. 1 8
      SzyxImSdk/build.gradle
  2. 11 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/SZYXImSdk.java
  3. 270 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/common/ToolsHelper.java
  4. 11 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/bean/PacketMessage.java
  5. 9 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/kit/RequestImCallback.java
  6. 63 3
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/manager/ImManager.java
  7. 40 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/msg/RequestMessage.java
  8. 48 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/msg/ResultMessage.java
  9. 4 3
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/kit/IMInterface.java
  10. 15 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/kit/SdkGroupInterface.java
  11. 80 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/manager/SZYXGroupManager.java
  12. 3 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/repository/Service.java
  13. 39 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/repository/group/GroupCreateData.java
  14. 12 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/request/RequestCallback.java
  15. 5 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/request/RequestConstant.java
  16. 12 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/request/RequestHelper.java
  17. 5 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/request/RequestInterface.java
  18. 55 0
      SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/request/RequestManager.java
  19. 1 0
      app/build.gradle
  20. 21 0
      app/src/main/java/cn/org/bjca/trust/android/imdemo/ui/FriendsActivity.java

+ 1 - 8
SzyxImSdk/build.gradle

@@ -20,13 +20,6 @@ android {
     }
 
     buildTypes {
-        debug {
-            // 开启混淆
-            minifyEnabled false
-            // Zipalign压缩优化
-            zipAlignEnabled true
-            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
-        }
         release {
             // 开启混淆
             minifyEnabled true
@@ -43,7 +36,7 @@ android {
 
 dependencies {
 
-    implementation 'androidx.appcompat:appcompat:1.4.1'
+    implementation 'androidx.appcompat:appcompat:1.4.2'
     implementation 'com.google.android.material:material:1.5.0'
     testImplementation 'junit:junit:4.13.2'
     androidTestImplementation 'androidx.test.ext:junit:1.1.3'

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

@@ -1,7 +1,9 @@
 package cn.org.bjca.trust.android.lib.im;
 
+import cn.org.bjca.trust.android.lib.im.kit.SdkGroupInterface;
 import cn.org.bjca.trust.android.lib.im.kit.SdkInterface;
 import cn.org.bjca.trust.android.lib.im.kit.SdkMsgInterface;
+import cn.org.bjca.trust.android.lib.im.manager.SZYXGroupManager;
 import cn.org.bjca.trust.android.lib.im.manager.SZYXImManager;
 import cn.org.bjca.trust.android.lib.im.manager.SZYXMessageManager;
 
@@ -15,6 +17,10 @@ public class SZYXImSdk {
         static final SdkMsgInterface instance = new SZYXMessageManager();
     }
 
+    private static final class SdkGroupInterfaceHolder {
+        static final SdkGroupInterface instance = new SZYXGroupManager();
+    }
+
     public static SdkInterface getInstance() {
         return SdkInterfaceHolder.instance;
 
@@ -24,4 +30,9 @@ public class SZYXImSdk {
         return SdkMsgInterfaceHolder.instance;
 
     }
+
+    public static SdkGroupInterface getGroupManager() {
+        return SdkGroupInterfaceHolder.instance;
+
+    }
 }

+ 270 - 0
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/common/ToolsHelper.java

@@ -0,0 +1,270 @@
+package cn.org.bjca.trust.android.lib.im.common;
+
+import android.content.Context;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import com.google.android.material.snackbar.Snackbar;
+import com.google.android.material.textfield.TextInputLayout;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ToolsHelper {
+
+    public static boolean isNull(Object obj) {
+        if (null == obj)
+            return true;
+        String str = obj.toString();
+        if (str.isEmpty())
+            return true;
+        return str.equalsIgnoreCase("null");
+    }
+
+    public static Long toLong(Object obj) {
+        if (isNull(obj))
+            return 0L;
+        try {
+            return Long.parseLong(obj.toString());
+        } catch (Exception e) {
+            return 0L;
+        }
+    }
+
+    public static int toInt(Object obj) {
+        if (isNull(obj))
+            return 0;
+        try {
+            return Integer.parseInt(obj.toString());
+        } catch (Exception e) {
+            return 0;
+        }
+    }
+
+    public static Double toDouble(Object obj) {
+        if (isNull(obj))
+            return 0.0;
+        try {
+            return Double.parseDouble(obj.toString());
+        } catch (Exception e) {
+            return 0D;
+        }
+    }
+
+    public static String toString(Object obj) {
+        if (isNull(obj))
+            return "";
+        return obj.toString();
+    }
+
+
+    /**
+     * 格式化json字符串
+     *
+     * @param jsonStr 需要格式化的json串
+     * @return 格式化后的json串
+     */
+    public static String formatJson(String jsonStr) {
+        if (null == jsonStr || "".equals(jsonStr)) return "";
+        StringBuilder sb = new StringBuilder();
+        char last = '\0';
+        char current = '\0';
+        int indent = 0;
+        for (int i = 0; i < jsonStr.length(); i++) {
+            last = current;
+            current = jsonStr.charAt(i);
+            //遇到{ [换行,且下一行缩进
+            switch (current) {
+                case '{':
+                case '[':
+                    sb.append(current);
+                    sb.append('\n');
+                    indent++;
+                    addIndentBlank(sb, indent);
+                    break;
+                //遇到} ]换行,当前行缩进
+                case '}':
+                case ']':
+                    sb.append('\n');
+                    indent--;
+                    addIndentBlank(sb, indent);
+                    sb.append(current);
+                    break;
+                //遇到,换行
+                case ',':
+                    sb.append(current);
+                    if (last != '\\') {
+                        sb.append('\n');
+                        addIndentBlank(sb, indent);
+                    }
+                    break;
+                default:
+                    sb.append(current);
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 添加space
+     */
+    private static void addIndentBlank(StringBuilder sb, int indent) {
+        for (int i = 0; i < indent; i++) {
+            sb.append('\t');
+        }
+    }
+
+    /**
+     * http 请求数据返回 json 中中文字符为 unicode 编码转汉字转码
+     *
+     * @param theString
+     * @return 转化后的结果.
+     */
+    public static String decodeUnicode(String theString) {
+        char aChar;
+        int len = theString.length();
+        StringBuilder outBuffer = new StringBuilder(len);
+        for (int x = 0; x < len; ) {
+            aChar = theString.charAt(x++);
+            if (aChar == '\\') {
+                aChar = theString.charAt(x++);
+                if (aChar == 'u') {
+                    int value = 0;
+                    for (int i = 0; i < 4; i++) {
+                        aChar = theString.charAt(x++);
+                        switch (aChar) {
+                            case '0':
+                            case '1':
+                            case '2':
+                            case '3':
+                            case '4':
+                            case '5':
+                            case '6':
+                            case '7':
+                            case '8':
+                            case '9':
+                                value = (value << 4) + aChar - '0';
+                                break;
+                            case 'a':
+                            case 'b':
+                            case 'c':
+                            case 'd':
+                            case 'e':
+                            case 'f':
+                                value = (value << 4) + 10 + aChar - 'a';
+                                break;
+                            case 'A':
+                            case 'B':
+                            case 'C':
+                            case 'D':
+                            case 'E':
+                            case 'F':
+                                value = (value << 4) + 10 + aChar - 'A';
+                                break;
+                            default:
+                                throw new IllegalArgumentException(
+                                        "Malformed   \\uxxxx   encoding.");
+                        }
+
+                    }
+                    outBuffer.append((char) value);
+                } else {
+                    if (aChar == 't') {
+                        aChar = '\t';
+                    } else if (aChar != 'r') {
+                        if (aChar == 'n') {
+                            aChar = '\n';
+                        } else if (aChar == 'f') {
+                            aChar = '\f';
+                        }
+                    } else {
+                        aChar = '\r';
+                    }
+                    outBuffer.append(aChar);
+                }
+            } else {
+                outBuffer.append(aChar);
+            }
+        }
+        return outBuffer.toString();
+    }
+
+    /**
+     * 弹出提示信息  感觉比Toast好看点  不过Toast不需要依赖view
+     *
+     * @param view    绑定一个view才能展示
+     * @param content 需要展示的内容
+     */
+    public static void snack(View view, CharSequence content) {
+        Snackbar.make(view, content, Snackbar.LENGTH_SHORT).show();
+    }
+
+    public static void showMessage(Context context, CharSequence content) {
+        Toast.makeText(context, content, Toast.LENGTH_SHORT).show();
+    }
+
+    /**
+     * EditText绑定TextInputLayout,处理一下
+     *
+     * @param editText        editText
+     * @param textInputLayout textInputLayout
+     */
+    public static void addTextChangedListener(EditText editText, TextInputLayout textInputLayout) {
+        editText.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                if (!TextUtils.isEmpty(textInputLayout.getError())) {//输入的时候不提示错误信息
+                    textInputLayout.setErrorEnabled(true);
+                    textInputLayout.setError("");
+                    textInputLayout.setErrorEnabled(false);
+                }
+            }
+        });
+    }
+
+    /**
+     * 使用 TextInputLayout  提示错误信息
+     *
+     * @param textInputLayout TextInputLayout
+     * @param msg             错判的内容
+     */
+    public static void showError(TextInputLayout textInputLayout, String msg) {
+        textInputLayout.setErrorEnabled(true);
+        textInputLayout.setError(msg);
+    }
+
+    /**
+     * 将Object对象里面的属性和值转化成Map对象
+     *
+     * @param obj
+     * @return
+     * @throws IllegalAccessException
+     */
+    public static <T> Map<String, T> objectToMap(Object obj) throws IllegalAccessException {
+        Map<String, T> map = new HashMap<>();
+        Class<?> clazz = obj.getClass();
+        for (Field field : clazz.getDeclaredFields()) {
+            field.setAccessible(true);
+            String fieldName = field.getName();
+            T value = (T) field.get(obj);
+            if (null != value)
+                map.put(fieldName, value);
+        }
+        return map;
+    }
+}

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

@@ -3,6 +3,7 @@ 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.OsType;
 import cn.org.bjca.trust.android.lib.im.enums.PacketType;
 
 public abstract class PacketMessage {
@@ -15,6 +16,7 @@ public abstract class PacketMessage {
     private String appId;
     private String userName;
     private String token;
+    private String osType;
 
     public PacketMessage(PacketType packetType) {
         this.packetType = packetType;
@@ -22,6 +24,15 @@ public abstract class PacketMessage {
         this.appId = Constant.getSdkAppID();
         this.userName = Constant.getUserId();
         this.token = Constant.getToken();
+        this.osType = String.valueOf(OsType.ANDROID.type());
+    }
+
+    public String getOsType() {
+        return osType;
+    }
+
+    public void setOsType(String osType) {
+        this.osType = osType;
     }
 
     public String getMsgId() {

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

@@ -0,0 +1,9 @@
+package cn.org.bjca.trust.android.lib.im.im.kit;
+
+import cn.org.bjca.trust.android.lib.im.im.msg.ResultMessage;
+
+public interface RequestImCallback {
+    void success(ResultMessage message);
+
+    void failed(int code, String error);
+}

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

@@ -23,17 +23,22 @@ 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.ToolsHelper;
 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.http.HttpResult;
 import cn.org.bjca.trust.android.lib.im.im.bean.PacketMessage;
-import cn.org.bjca.trust.android.lib.im.kit.IMInterface;
+import cn.org.bjca.trust.android.lib.im.im.kit.RequestImCallback;
 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.message.SZYXMessage;
+import cn.org.bjca.trust.android.lib.im.im.msg.RequestMessage;
+import cn.org.bjca.trust.android.lib.im.im.msg.ResultMessage;
 import cn.org.bjca.trust.android.lib.im.im.msg.SendAckMessage;
+import cn.org.bjca.trust.android.lib.im.im.msg.message.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.IMInterface;
 import cn.org.bjca.trust.android.lib.im.kit.IMSDKCallback;
 import cn.org.bjca.trust.android.lib.im.kit.IMSDKListener;
 import cn.org.bjca.trust.android.lib.im.kit.MsgListener;
@@ -70,6 +75,7 @@ public class ImManager implements IMInterface {
 
     private final List<MsgListener> msgListeners = new ArrayList<>();
     private final Map<String, IMSDKCallback> msgListenerMap = new HashMap<>();
+    private final Map<String, RequestImCallback> requestMap = new HashMap<>();
 
 
     @Override
@@ -168,6 +174,16 @@ public class ImManager implements IMInterface {
                         m.what = 10002;
                         handler.sendMessage(m);
 
+                    }
+                    // 接口请求应答
+                    else if (topic.equals(topic_result)) {
+                        ResultMessage resultMessage = GsonImplHelp.get().toObject(msg, ResultMessage.class);
+
+                        Message m = new Message();
+                        m.obj = resultMessage;
+                        m.what = 10004;
+                        handler.sendMessage(m);
+
                     }
                     // 新消息送达
                     else if (topic.equals(topic_arrive)) {
@@ -262,7 +278,34 @@ public class ImManager implements IMInterface {
 
     @Override
     public void sendSZYXMessage(SZYXMessage message, IMSDKCallback callback) {
-        sendPacketMessage(PacketType.SEND, message, callback);
+        if (ToolsHelper.isNull(message.getToClientId())) {
+            if (null != callback) callback.failed(202, "没有消息接收者[toClientId]");
+            for (MsgListener listener : msgListeners) {
+                listener.statusChange(message.getMsgId(), -1);
+            }
+        } else
+            sendPacketMessage(PacketType.SEND, message, callback);
+    }
+
+    @Override
+    public void request(RequestMessage message, RequestImCallback callback) {
+        this.sendPacketMessage(PacketType.REQUEST, message, new IMSDKCallback() {
+            @Override
+            public void success() {
+
+            }
+
+            @Override
+            public void failed(int code, String error) {
+                callback.failed(4001, error);
+            }
+        });
+
+        requestMap.put(message.getMsgId(), callback);
+        Message m = new Message();
+        m.obj = message.getMsgId();
+        m.what = 10003;
+        handler.sendMessageDelayed(m, 600);
     }
 
     private void sendConnectMsg() {
@@ -347,6 +390,23 @@ public class ImManager implements IMInterface {
                         msgListenerMap.remove(msgId1);
                     }
                     break;
+                case 10003:
+                    String msgId3 = (String) msg.obj;
+                    RequestImCallback imCallback = requestMap.get(msgId3);
+                    if (null != imCallback) {
+                        imCallback.failed(4001, "发送超时");
+                        requestMap.remove(msgId3);
+                    }
+                    break;
+                case 10004:
+                    ResultMessage resultMessage = (ResultMessage) msg.obj;
+                    String msgId4 = resultMessage.getAckId();
+                    RequestImCallback callback4 = requestMap.get(msgId4);
+                    if (null != callback4) {
+                        callback4.success(resultMessage);
+                        requestMap.remove(msgId4);
+                    }
+                    break;
             }
         }
     };

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

@@ -0,0 +1,40 @@
+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 RequestMessage extends PacketMessage {
+    public RequestMessage() {
+        super(PacketType.REQUEST);
+    }
+
+    private String path;
+    private String body;
+
+    public RequestMessage(String path) {
+        super(PacketType.REQUEST);
+        this.path = path;
+    }
+
+    public RequestMessage(String path, String body) {
+        super(PacketType.REQUEST);
+        this.path = path;
+        this.body = body;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public String getBody() {
+        return body;
+    }
+
+    public void setBody(String body) {
+        this.body = body;
+    }
+}

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

@@ -0,0 +1,48 @@
+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 ResultMessage extends PacketMessage {
+    public ResultMessage() {
+        super(PacketType.RESULT);
+    }
+
+    private String path;
+    private String body;
+    private String ackId;
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public String getBody() {
+        return body;
+    }
+
+    public void setBody(String body) {
+        this.body = body;
+    }
+
+    public String getAckId() {
+        return ackId;
+    }
+
+    public void setAckId(String ackId) {
+        this.ackId = ackId;
+    }
+
+    @Override
+    public String toString() {
+        return "ResultMessage{" +
+                "path='" + path + '\'' +
+                ", body='" + body + '\'' +
+                ", ackId='" + ackId + '\'' +
+                '}';
+    }
+}

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

@@ -1,11 +1,10 @@
 package cn.org.bjca.trust.android.lib.im.kit;
 
 import cn.org.bjca.trust.android.lib.im.enums.MsgType;
+import cn.org.bjca.trust.android.lib.im.im.kit.RequestImCallback;
+import cn.org.bjca.trust.android.lib.im.im.msg.RequestMessage;
 import cn.org.bjca.trust.android.lib.im.im.msg.message.SZYXMessage;
 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;
-import cn.org.bjca.trust.android.lib.im.kit.MsgListener;
 
 public interface IMInterface {
     void addMsgListener(MsgListener listener);
@@ -26,6 +25,8 @@ public interface IMInterface {
 
     void sendSZYXMessage(SZYXMessage message, IMSDKCallback callback);
 
+    <T> void request(RequestMessage message, RequestImCallback callback);
+
     SZYXMessage createMsg(MsgType msgType, String toUserId, boolean isGroup, Object message, String describe);
 
 }

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

@@ -0,0 +1,15 @@
+package cn.org.bjca.trust.android.lib.im.kit;
+
+import java.util.List;
+
+public interface SdkGroupInterface {
+
+
+    void create(List<String> userList, IMSDKCallback callback);
+
+    void create(String groupName, List<String> userList, IMSDKCallback callback);
+
+    void create(String groupName, List<String> userList, String faceUrl, IMSDKCallback callback);
+
+
+}

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

@@ -0,0 +1,80 @@
+package cn.org.bjca.trust.android.lib.im.manager;
+
+import static cn.org.bjca.trust.android.lib.im.request.RequestConstant.Group_create_v1;
+
+import android.annotation.SuppressLint;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+
+import androidx.annotation.NonNull;
+
+import java.util.List;
+
+import cn.org.bjca.trust.android.lib.im.http.HttpManage;
+import cn.org.bjca.trust.android.lib.im.http.HttpResult;
+import cn.org.bjca.trust.android.lib.im.im.msg.SendAckMessage;
+import cn.org.bjca.trust.android.lib.im.kit.IMSDKCallback;
+import cn.org.bjca.trust.android.lib.im.kit.MsgListener;
+import cn.org.bjca.trust.android.lib.im.kit.SdkGroupInterface;
+import cn.org.bjca.trust.android.lib.im.repository.Service;
+import cn.org.bjca.trust.android.lib.im.repository.group.GroupCreateData;
+import cn.org.bjca.trust.android.lib.im.request.RequestCallback;
+import cn.org.bjca.trust.android.lib.im.request.RequestHelper;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+
+public class SZYXGroupManager implements SdkGroupInterface {
+
+
+    @Override
+    public void create(List<String> userList, IMSDKCallback callback) {
+        this.create(null, userList, null, callback);
+    }
+
+    @Override
+    public void create(String groupName, List<String> userList, IMSDKCallback callback) {
+        this.create(groupName, userList, null, callback);
+    }
+
+    @Override
+    public void create(String groupName, List<String> userList, String faceUrl, IMSDKCallback callback) {
+        if (null == userList || userList.size() < 2) {
+            if (null != callback) callback.failed(2001, "群成员需要大于一个");
+            return;
+        }
+        GroupCreateData data = new GroupCreateData(groupName, faceUrl, userList);
+        RequestHelper.getInstance().request(Group_create_v1, data, new RequestCallback<String>() {
+
+            @Override
+            public void success(HttpResult<String> result) {
+                if (null != callback) callback.success();
+            }
+
+            @Override
+            public void failed(int code, String error) {
+                if (null != callback) callback.failed(code, error);
+            }
+
+            @Override
+            public void standby(RequestCallback<String> imCallback) {
+
+                Disposable d = HttpManage.getApi(Service.class)
+                        .groupCreate(data)
+                        .subscribeOn(Schedulers.io())
+                        .observeOn(AndroidSchedulers.mainThread())
+                        .subscribe(httpResult -> {
+                            if (httpResult.getCode() == 200) {
+                                imCallback.success(httpResult);
+                            } else
+                                imCallback.failed(httpResult.getCode(), httpResult.getMsg());
+                        }, throwable -> {
+                            imCallback.failed(4002, throwable.getMessage());
+                        });
+            }
+
+        });
+    }
+
+}

+ 3 - 0
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/repository/Service.java

@@ -4,6 +4,7 @@ import cn.org.bjca.trust.android.lib.im.bean.UserInfo;
 import cn.org.bjca.trust.android.lib.im.http.HttpResult;
 import cn.org.bjca.trust.android.lib.im.repository.bean.LoginBean;
 import cn.org.bjca.trust.android.lib.im.repository.data.LoginData;
+import cn.org.bjca.trust.android.lib.im.repository.group.GroupCreateData;
 import io.reactivex.Observable;
 import retrofit2.http.Body;
 import retrofit2.http.GET;
@@ -17,4 +18,6 @@ public interface Service {
 
     @POST("user/v1/register")
     Observable<HttpResult<LoginBean>> register(@Body LoginData loginData);
+    @POST("group/v1/create")
+    Observable<HttpResult<String>> groupCreate(@Body GroupCreateData data);
 }

+ 39 - 0
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/repository/group/GroupCreateData.java

@@ -0,0 +1,39 @@
+package cn.org.bjca.trust.android.lib.im.repository.group;
+
+import java.util.List;
+
+public class GroupCreateData {
+    private String groupName;
+    private String faceUrl;
+    private List<String> userIdList;
+
+    public GroupCreateData(String groupName, String faceUrl, List<String> userIdList) {
+        this.groupName = groupName;
+        this.faceUrl = faceUrl;
+        this.userIdList = userIdList;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public String getFaceUrl() {
+        return faceUrl;
+    }
+
+    public void setFaceUrl(String faceUrl) {
+        this.faceUrl = faceUrl;
+    }
+
+    public List<String> getUserIdList() {
+        return userIdList;
+    }
+
+    public void setUserIdList(List<String> userIdList) {
+        this.userIdList = userIdList;
+    }
+}

+ 12 - 0
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/request/RequestCallback.java

@@ -0,0 +1,12 @@
+package cn.org.bjca.trust.android.lib.im.request;
+
+import cn.org.bjca.trust.android.lib.im.http.HttpResult;
+import cn.org.bjca.trust.android.lib.im.im.kit.RequestImCallback;
+
+public interface RequestCallback<T> {
+    void success(HttpResult<T> result);
+
+    void failed(int code, String error);
+
+    void standby(RequestCallback<T> imCallback);
+}

+ 5 - 0
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/request/RequestConstant.java

@@ -0,0 +1,5 @@
+package cn.org.bjca.trust.android.lib.im.request;
+
+public class RequestConstant {
+    public static final String Group_create_v1 = "/group/v1/create";
+}

+ 12 - 0
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/request/RequestHelper.java

@@ -0,0 +1,12 @@
+package cn.org.bjca.trust.android.lib.im.request;
+
+public class RequestHelper {
+    private static final class RequestHelperHolder {
+        static final RequestInterface instance = new RequestManager();
+    }
+
+    public static RequestInterface getInstance() {
+        return RequestHelperHolder.instance;
+
+    }
+}

+ 5 - 0
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/request/RequestInterface.java

@@ -0,0 +1,5 @@
+package cn.org.bjca.trust.android.lib.im.request;
+
+public interface RequestInterface {
+    <T> void request(String path, Object data, RequestCallback<T> callback);
+}

+ 55 - 0
SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/request/RequestManager.java

@@ -0,0 +1,55 @@
+package cn.org.bjca.trust.android.lib.im.request;
+
+import cn.org.bjca.trust.android.lib.im.common.json.GsonImplHelp;
+import cn.org.bjca.trust.android.lib.im.http.HttpResult;
+import cn.org.bjca.trust.android.lib.im.im.IMHelper;
+import cn.org.bjca.trust.android.lib.im.im.kit.RequestImCallback;
+import cn.org.bjca.trust.android.lib.im.im.msg.RequestMessage;
+import cn.org.bjca.trust.android.lib.im.im.msg.ResultMessage;
+
+public class RequestManager implements RequestInterface {
+
+
+    public <T> void request(String path, Object data, RequestCallback<T> callback) {
+
+        RequestMessage rm = new RequestMessage(path, GsonImplHelp.get().toJson(data));
+
+        IMHelper.getInstance().request(rm, new RequestImCallback() {
+
+            @Override
+            public void success(ResultMessage message) {
+                HttpResult<T> h = GsonImplHelp.get().toObject(message.getBody(), HttpResult.class);
+                if (h.getCode() == 200) {
+                    callback.success(h);
+                } else {
+                    callback.failed(h.getCode(), h.getMsg());
+                }
+            }
+
+            @Override
+            public void failed(int code, String error) {
+                if (null != callback) {
+                    callback.standby(new RequestCallback<T>() {
+                        @Override
+                        public void success(HttpResult<T> result) {
+                            callback.success(result);
+                        }
+
+                        @Override
+                        public void failed(int code, String error) {
+                            callback.failed(code, error);
+                        }
+
+                        @Override
+                        public void standby(RequestCallback<T> imCallback) {
+
+                        }
+                    });
+
+                }
+            }
+
+        });
+    }
+
+}

+ 1 - 0
app/build.gradle

@@ -21,6 +21,7 @@ android {
         release {
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+            signingConfig signingConfigs.debug
         }
     }
     compileOptions {

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

@@ -7,11 +7,17 @@ import android.view.View;
 import com.xuqm.base.adapter.BasePagedAdapter;
 import com.xuqm.base.adapter.CommonPagedAdapter;
 import com.xuqm.base.adapter.ViewHolder;
+import com.xuqm.base.common.LogHelper;
 import com.xuqm.base.ui.BaseListActivity;
 
+import java.util.ArrayList;
+
 import cn.org.bjca.trust.android.imdemo.R;
 import cn.org.bjca.trust.android.imdemo.data.item.UserItem;
 import cn.org.bjca.trust.android.imdemo.vm.FriendsVM;
+import cn.org.bjca.trust.android.lib.im.SZYXImSdk;
+import cn.org.bjca.trust.android.lib.im.common.ToolsHelper;
+import cn.org.bjca.trust.android.lib.im.kit.IMSDKCallback;
 
 public class FriendsActivity extends BaseListActivity<UserItem, FriendsVM> {
     @Override
@@ -19,7 +25,22 @@ public class FriendsActivity extends BaseListActivity<UserItem, FriendsVM> {
         super.initView(savedInstanceState);
         setTitleText("好友列表");
         setConfirmText("添加好友", v -> {
+            SZYXImSdk.getGroupManager().create(new ArrayList<String>() {{
+                add("13666666666");
+                add("13811111111");
+            }
+            }, new IMSDKCallback() {
+                @Override
+                public void success() {
+                    ToolsHelper.showMessage(mContext, "创建成功");
+                }
 
+                @Override
+                public void failed(int code, String error) {
+                    ToolsHelper.showMessage(mContext, "创建失败" + code + error);
+                    LogHelper.e("=====>", "创建失败" + code + error);
+                }
+            });
         });
     }