@@ -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' | |||
@@ -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; | |||
} | |||
} |
@@ -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; | |||
} | |||
} |
@@ -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() { | |||
@@ -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); | |||
} |
@@ -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 | |||
@@ -169,6 +175,16 @@ public class ImManager implements IMInterface { | |||
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)) { | |||
SZYXMessage szyxMessage = GsonImplHelp.get().toObject(msg, SZYXMessage.class); | |||
@@ -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; | |||
} | |||
} | |||
}; | |||
@@ -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; | |||
} | |||
} |
@@ -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 + '\'' + | |||
'}'; | |||
} | |||
} |
@@ -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); | |||
} |
@@ -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); | |||
} |
@@ -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()); | |||
}); | |||
} | |||
}); | |||
} | |||
} |
@@ -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); | |||
} |
@@ -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; | |||
} | |||
} |
@@ -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); | |||
} |
@@ -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"; | |||
} |
@@ -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; | |||
} | |||
} |
@@ -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); | |||
} |
@@ -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) { | |||
} | |||
}); | |||
} | |||
} | |||
}); | |||
} | |||
} |
@@ -21,6 +21,7 @@ android { | |||
release { | |||
minifyEnabled false | |||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' | |||
signingConfig signingConfigs.debug | |||
} | |||
} | |||
compileOptions { | |||
@@ -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); | |||
} | |||
}); | |||
}); | |||
} | |||