onItemClickListener) {
+ this.onItemClickListener = onItemClickListener;
+ return this;
+ }
+
+ @Override
+ protected int getImplLayoutId() {
+ return R.layout.dialog_msg_tips;
+ }
+
+ @Override
+ protected boolean isShowUpToTarget() {
+ return true;
+ }
+
+ @Override
+ protected void onCreate() {
+ super.onCreate();
+ isShowUp = true;
+ tipsView = findViewById(R.id.tips);
+ LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT);
+ params.gravity = Gravity.CENTER;
+ tipsView.setText(tips);
+ tipsView.setTextColor(Color.WHITE);
+ tipsView.setLayoutParams(params);
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (onItemClickListener != null) {
+ onItemClickListener.onItemClick(((TextView) v).getText().toString(), (Integer) v.getTag());
+ }
+ dismiss();
+ }
+
+ public void updateTips(String s) {
+ tipsView.setText(s);
+ }
+}
diff --git a/OneToOne/src/main/java/com/shayu/onetoone/listener/OnCallStatusListener.java b/OneToOne/src/main/java/com/shayu/onetoone/listener/OnCallStatusListener.java
index 3d5bccd10..da9b4d4cc 100644
--- a/OneToOne/src/main/java/com/shayu/onetoone/listener/OnCallStatusListener.java
+++ b/OneToOne/src/main/java/com/shayu/onetoone/listener/OnCallStatusListener.java
@@ -10,7 +10,9 @@ public abstract class OnCallStatusListener {
public abstract void onCallEnd();
public abstract void onStartFirstFrame();
- public void onTime(String time){
+ public void onTime(String time){}
+ public void onErrorNotPrice(String msg){}
+ public void onTimeWarning(long warningTime) {
}
}
diff --git a/OneToOne/src/main/java/com/shayu/onetoone/listener/OnSendMessageListener.java b/OneToOne/src/main/java/com/shayu/onetoone/listener/OnSendMessageListener.java
index 0aa7ea5b9..271e8ee79 100644
--- a/OneToOne/src/main/java/com/shayu/onetoone/listener/OnSendMessageListener.java
+++ b/OneToOne/src/main/java/com/shayu/onetoone/listener/OnSendMessageListener.java
@@ -1,14 +1,19 @@
package com.shayu.onetoone.listener;
+import com.shayu.onetoone.bean.SendConsumeBean;
+
public abstract class OnSendMessageListener {
public static final int STATUS_NOT_PRICE = 0;//金额不够
public static final int STATUS_ERROR = 1;//接口错误
- public void onSuccess(String token) {
+ public void onSuccess(String token, SendConsumeBean bean) {
}
public void onError(int status, String msg) {
}
+ public void onError(int status, String msg, SendConsumeBean bean){
+ onError(status, msg);
+ }
}
diff --git a/OneToOne/src/main/java/com/shayu/onetoone/manager/CallClientManager.java b/OneToOne/src/main/java/com/shayu/onetoone/manager/CallClientManager.java
index 07a945d20..411941382 100644
--- a/OneToOne/src/main/java/com/shayu/onetoone/manager/CallClientManager.java
+++ b/OneToOne/src/main/java/com/shayu/onetoone/manager/CallClientManager.java
@@ -8,7 +8,11 @@ import android.text.TextUtils;
import android.view.SurfaceView;
import com.blankj.utilcode.util.PermissionUtils;
+import com.shayu.onetoone.bean.SendConsumeBean;
import com.shayu.onetoone.listener.OnCallStatusListener;
+import com.shayu.onetoone.listener.OnSendMessageListener;
+import com.yunbao.common.CommonAppContext;
+import com.yunbao.common.utils.StringUtil;
import com.yunbao.common.utils.ToastUtil;
import java.util.ArrayList;
@@ -75,11 +79,19 @@ public class CallClientManager {
listeners.remove(statusListener);
}
- private void startTimer() {
+ public void checkMoney(String targetId, boolean video, OnSendMessageListener listener) {
+ if (video) {
+ SendMessageManager.checkVideoMessage(targetId, "1", listener);
+ } else {
+ SendMessageManager.checkAudioMessage(targetId, "1", listener);
+ }
+ }
+
+ private void startTimer(String targetId) {
if (timeTask != null) {
timeTask.cancel();
}
- timeTask = new CallTimeTask();
+ timeTask = new CallTimeTask(targetId);
new Timer().schedule(timeTask, 0, 1000);
}
@@ -106,7 +118,7 @@ public class CallClientManager {
listener.onCallStart(userId, remoteVideo);
}
ToastUtil.show("连接成功");
- startTimer();
+ startTimer(targetId);
}
@Override
@@ -145,7 +157,7 @@ public class CallClientManager {
listener.onCallStart(userId, remoteVideo);
}
ToastUtil.show("连接成功");
- startTimer();
+ startTimer(targetId);
}
@Override
@@ -182,7 +194,7 @@ public class CallClientManager {
for (OnCallStatusListener listener : listeners) {
listener.onCallStart(userId, remoteVideo);
}
- startTimer();
+ startTimer(null);
}
@Override
@@ -224,6 +236,30 @@ public class CallClientManager {
private class CallTimeTask extends TimerTask {
Handler handler = new Handler(Looper.getMainLooper());
+ private String targetId;
+ private boolean isCallVideo = false;
+ long warningTime;
+ long activeTime;
+
+ public CallTimeTask(String targetId) {
+ this.targetId = targetId;
+ }
+
+ @Override
+ public boolean cancel() {
+ long time = getTime(activeTime);
+ time = time % 10;
+ if (time == 0) {
+ time = 10;
+ }
+ if (isCallVideo) {
+ SendMessageManager.pingVideoMessage(targetId, time + "", new SendMessageListener());
+ } else {
+ SendMessageManager.pingAudioMessage(targetId, time + "", new SendMessageListener());
+ }
+ return super.cancel();
+ }
+
@Override
public void run() {
RongCallSession callSession = RongCallClient.getInstance().getCallSession();
@@ -232,7 +268,10 @@ public class CallClientManager {
timeTask = null;
return;
}
- long time = getTime(callSession.getActiveTime());
+ isCallVideo = callSession.getMediaType() == RongCallCommon.CallMediaType.VIDEO;
+ activeTime = callSession.getActiveTime();
+ long time = getTime(activeTime);
+ checkTime(time);
String extra;
if (time > 0) {
if (time >= 3600) {
@@ -249,11 +288,57 @@ public class CallClientManager {
handler.post(() -> {
for (OnCallStatusListener listener : listeners) {
listener.onTime(extra);
+ listener.onTimeWarning(warningTime--);
}
});
}
+ }
+ private void checkTime(long time) {
+ if (StringUtil.isEmpty(targetId)) {
+ return;
+ }
+ time = time % 10;
+ if (time == 0) {
+ time = 10;
+ } else {
+ return;
+ }
+ if (isCallVideo) {
+ SendMessageManager.pingVideoMessage(targetId, time + "", new SendMessageListener());
+ } else {
+ SendMessageManager.pingAudioMessage(targetId, time + "", new SendMessageListener());
+ }
+ }
+
+ private class SendMessageListener extends OnSendMessageListener {
+ @Override
+ public void onSuccess(String token, SendConsumeBean bean) {
+ super.onSuccess(token, bean);
+
+ if (isCallVideo) {
+ warningTime = bean.getVideoTime();
+ } else {
+ warningTime = bean.getMp3Time();
+ }
+ if (warningTime <= 60) {
+ for (OnCallStatusListener listener : listeners) {
+ listener.onTimeWarning(warningTime);
+ }
+ }
+ }
+
+ @Override
+ public void onError(int status, String msg) {
+ super.onError(status, msg);
+ if (status == OnSendMessageListener.STATUS_NOT_PRICE) {
+ for (OnCallStatusListener listener : listeners) {
+ listener.onErrorNotPrice(msg);
+ }
+ endCall();
+ }
+ }
}
}
@@ -435,12 +520,12 @@ public class CallClientManager {
* 如果对端调用{@link RongCallClient#startCall(int, boolean, Conversation.ConversationType, String, List, List, RongCallCommon.CallMediaType, String, StartCameraCallback)} 或
* {@link RongCallClient#acceptCall(String, int, boolean, StartCameraCallback)}开始的音视频通话,则可以使用如下设置改变对端视频流的镜像显示:
*
- * public void onRemoteUserJoined(String userId, RongCallCommon.CallMediaType mediaType, int userType, SurfaceView remoteVideo) {
- * if (null != remoteVideo) {
- * ((RongRTCVideoView) remoteVideo).setMirror( boolean);//观看对方视频流是否镜像处理
- * }
- * }
- *
+ * public void onRemoteUserJoined(String userId, RongCallCommon.CallMediaType mediaType, int userType, SurfaceView remoteVideo) {
+ * if (null != remoteVideo) {
+ * ((RongRTCVideoView) remoteVideo).setMirror( boolean);//观看对方视频流是否镜像处理
+ * }
+ * }
+ *
*/
@Override
public void onRemoteUserJoined(String userId, RongCallCommon.CallMediaType mediaType, int userType, SurfaceView remoteVideo) {
diff --git a/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java b/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java
index fec7da482..6385a2a80 100644
--- a/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java
+++ b/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java
@@ -17,12 +17,16 @@ import com.shayu.onetoone.bean.HomeItemBean;
import com.shayu.onetoone.bean.HomeRankBean;
import com.shayu.onetoone.bean.JoinAnchorBean;
import com.shayu.onetoone.bean.LabelBean;
+import com.shayu.onetoone.bean.MatchingInfoBean;
+import com.shayu.onetoone.bean.MatchingItemSizeBean;
import com.shayu.onetoone.bean.MessageConsumeConfigBean;
import com.shayu.onetoone.bean.OfficialNoticeBean;
import com.shayu.onetoone.bean.PurseBean;
+import com.shayu.onetoone.bean.SendConsumeBean;
import com.shayu.onetoone.bean.SystemMessageBean;
import com.shayu.onetoone.bean.TargetUserInfoBean;
import com.shayu.onetoone.bean.UserBean;
+import com.shayu.onetoone.bean.UserItemBean;
import com.shayu.onetoone.network.API;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.bean.BaseModel;
@@ -38,6 +42,8 @@ import java.io.File;
import java.util.List;
import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.functions.Action;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import io.rong.imkit.userinfo.RongUserInfoManager;
@@ -539,14 +545,14 @@ public class OTONetManager {
}).isDisposed();
}
- public void sendMessage(int tuid,
+ public void sendMessage(String tuid,
int type,
String giftId,
String msg,
String time,
int online,
String method,
- HttpCallback callback) {
+ HttpCallback callback) {
API.get().otoApi(mContext)
.sendMessage(tuid, type, giftId, msg, time, online, method)
@@ -554,7 +560,18 @@ public class OTONetManager {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(model -> {
if (callback != null) {
- callback.onSuccess(new HttpCallbackModel(model.getData().getCode(), model.getData().getMsg()));
+ if (model.isError()) {
+ JSONObject json = JSONObject.parseObject(model.getJsonSrc());
+ SendConsumeBean bean = new SendConsumeBean();
+ bean.setCode(json.getJSONObject("data").getInteger("code"));
+ bean.setMsg(json.getJSONObject("data").getString("msg"));
+ callback.onSuccess(bean);
+ return;
+ }
+ SendConsumeBean bean = model.getData().getInfo();
+ bean.setCode(model.getData().getCode());
+ bean.setMsg(model.getData().getMsg());
+ callback.onSuccess(bean);
}
}, new Consumer() {
@Override
@@ -819,7 +836,110 @@ public class OTONetManager {
}).isDisposed();
}
+ public void getUserItems(String page, HttpCallback> callback) {
+ API.get().otoApi(mContext)
+ .getUserItems(page)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(model -> {
+ if (callback != null) {
+ callback.onSuccess(model.getData().getInfo());
+ }
+ }, new Consumer() {
+ @Override
+ public void accept(Throwable throwable) throws Exception {
+ Log.e(TAG, "accept: ", throwable);
+ if (callback != null) {
+ callback.onError(mContext.getString(com.yunbao.common.R.string.net_error));
+ }
+ }
+ }).isDisposed();
+ }
+ public void getMatchingNum(HttpCallback callback) {
+ API.get().otoApi(mContext)
+ .getMatchingNum()
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(model -> {
+ if (callback != null) {
+ callback.onSuccess(model.getData().getInfo());
+ }
+ }, new Consumer() {
+ @Override
+ public void accept(Throwable throwable) throws Exception {
+ Log.e(TAG, "accept: ", throwable);
+ if (callback != null) {
+ callback.onError(mContext.getString(com.yunbao.common.R.string.net_error));
+ }
+ }
+ }).isDisposed();
+ }
+
+
+
+ public void getMatchingInfo(HttpCallback callback) {
+
+ API.get().otoApi(mContext)
+ .getMatchingInfo()
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(model -> {
+ if (callback != null) {
+ callback.onSuccess(model.getData().getInfo());
+ }
+ }, new Consumer() {
+ @Override
+ public void accept(Throwable throwable) throws Exception {
+ Log.e(TAG, "accept: ", throwable);
+ if (callback != null) {
+ callback.onError(mContext.getString(com.yunbao.common.R.string.net_error));
+ }
+ }
+ }).isDisposed();
+ }
+
+ public void getChatTips(String toUid, HttpCallback callback) {
+
+ API.get().otoApi(mContext)
+ .getChatTips(toUid)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(model -> {
+ if (callback != null) {
+ callback.onSuccess(JSONObject.parseObject(model.getJsonSrc()));
+ }
+ }, new Consumer() {
+ @Override
+ public void accept(Throwable throwable) throws Exception {
+ Log.e(TAG, "accept: ", throwable);
+ if (callback != null) {
+ callback.onError(mContext.getString(com.yunbao.common.R.string.net_error));
+ }
+ }
+ }).isDisposed();
+ }
+
+ public void updateChatTips(String toUid, HttpCallback callback) {
+
+ API.get().otoApi(mContext)
+ .updateChatTips(toUid)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(model -> {
+ if (callback != null) {
+ callback.onSuccess(null);
+ }
+ }, new Consumer() {
+ @Override
+ public void accept(Throwable throwable) throws Exception {
+ Log.e(TAG, "accept: ", throwable);
+ if (callback != null) {
+ callback.onError(mContext.getString(com.yunbao.common.R.string.net_error));
+ }
+ }
+ }).isDisposed();
+ }
/**
* 设置基本资料
*/
@@ -849,7 +969,16 @@ public class OTONetManager {
/**
* 设置
+ * @param key 'signature' => "签名",
+ * 'sex' => "性别",
+ * 'user_nicename' => "昵称",
+ * 'avatar' => "头像",
+ * 'birthday' => "生日",
+ * 'area' => "地区"
+ * is_login=> 首次登录
+ * is_chat=>聊天首次登录
*/
+
public void setFiled(
String key, String val,
HttpCallback callback) {
diff --git a/OneToOne/src/main/java/com/shayu/onetoone/manager/RouteManager.java b/OneToOne/src/main/java/com/shayu/onetoone/manager/RouteManager.java
index 59f3a139d..e8c8cfc23 100644
--- a/OneToOne/src/main/java/com/shayu/onetoone/manager/RouteManager.java
+++ b/OneToOne/src/main/java/com/shayu/onetoone/manager/RouteManager.java
@@ -4,6 +4,8 @@ import android.os.Bundle;
import com.alibaba.android.arouter.launcher.ARouter;
+import java.io.Serializable;
+
/**
* 路由跳转Activity
*/
@@ -22,6 +24,7 @@ public class RouteManager {
public static final String ACTIVITY_CALL_VIDEO = "/activity/CallVideoActivity";
public static final String ACTIVITY_CALL_AUDIO = "/activity/CallVAudioActivity";
public static final String PATH_EDITPROFILE = "/main/EditProfileActivity";
+ public static final String ACTIVITY_MATCHING = "/activity/MatchingActivity";
//设置基本资料
public static final String ACTIVITY_COMPLETE = "/activity/CompleteActivity";
@@ -104,6 +107,9 @@ public class RouteManager {
public static void forwardActivity(String path, Bundle bundle) {
ARouter.getInstance().build(path).withBundle("bundle", bundle).navigation();
}
+ public static void forwardActivity(String path, Serializable serializable) {
+ ARouter.getInstance().build(path).withSerializable("data", serializable).navigation();
+ }
}
diff --git a/OneToOne/src/main/java/com/shayu/onetoone/manager/SendMessageManager.java b/OneToOne/src/main/java/com/shayu/onetoone/manager/SendMessageManager.java
index 64d78b162..9fbbf46a5 100644
--- a/OneToOne/src/main/java/com/shayu/onetoone/manager/SendMessageManager.java
+++ b/OneToOne/src/main/java/com/shayu/onetoone/manager/SendMessageManager.java
@@ -1,8 +1,8 @@
package com.shayu.onetoone.manager;
import com.shayu.onetoone.bean.MessageConsumeConfigBean;
+import com.shayu.onetoone.bean.SendConsumeBean;
import com.shayu.onetoone.listener.OnSendMessageListener;
-import com.yunbao.common.bean.HttpCallbackModel;
import com.yunbao.common.http.base.HttpCallback;
import com.yunbao.common.utils.ToastUtil;
@@ -13,8 +13,8 @@ import java.util.UUID;
public class SendMessageManager {
private static final Map cache = new HashMap<>();
- public static void sendMessageForGift(String toUid,String giftId,OnSendMessageListener listener){
- SendData sendData = new SendData(Integer.parseInt(toUid),
+ public static void sendMessageForGift(String toUid, String giftId, OnSendMessageListener listener) {
+ SendData sendData = new SendData(toUid,
3,
giftId,
"礼物消息",
@@ -22,8 +22,9 @@ public class SendMessageManager {
1);
send(sendData, listener);
}
- public static void sendMessageForAudio(String toUid,OnSendMessageListener listener){
- SendData sendData = new SendData(Integer.parseInt(toUid),
+
+ public static void sendMessageForAudio(String toUid, OnSendMessageListener listener) {
+ SendData sendData = new SendData(toUid,
1,
"not",
"录音消息",
@@ -31,8 +32,9 @@ public class SendMessageManager {
1);
send(sendData, listener);
}
+
public static void sendMessageForText(String toUid, String text, OnSendMessageListener messageListener) {
- SendData sendData = new SendData(Integer.parseInt(toUid),
+ SendData sendData = new SendData(toUid,
1,
"not",
text,
@@ -41,6 +43,82 @@ public class SendMessageManager {
send(sendData, messageListener);
}
+ public static void checkVideoMessage(String toUid, String time, OnSendMessageListener listener) {
+ SendData sendData = new SendData(toUid,
+ 2,
+ "not",
+ "视频消息",
+ time,
+ 2,
+ false
+ );
+ send(sendData, listener);
+ }
+
+ public static void checkAudioMessage(String toUid, String time, OnSendMessageListener listener) {
+ SendData sendData = new SendData(toUid,
+ 5,
+ "not",
+ "音频消息",
+ time,
+ 2,
+ false
+ );
+ send(sendData, listener);
+ }
+
+ public static void pingVideoMessage(String toUid, String time, OnSendMessageListener listener) {
+ SendData sendData = new SendData(toUid,
+ 2,
+ "not",
+ "视频消息",
+ time,
+ 2,
+ "after",
+ false
+ );
+ send(sendData, listener);
+ }
+
+ public static void pingAudioMessage(String toUid, String time, OnSendMessageListener listener) {
+ SendData sendData = new SendData(toUid,
+ 5,
+ "not",
+ "音频消息",
+ time,
+ 2,
+ "after",
+ false
+ );
+ send(sendData, listener);
+ }
+
+ public static void matching(OnSendMessageListener listener) {
+ SendData sendData = new SendData("not",
+ 9,
+ "not",
+ "灵魂匹配",
+ "1",
+ 1,
+ "after",
+ false
+ );
+ send(sendData, listener);
+ }
+
+ public static void chatUp(String toUid, OnSendMessageListener listener) {
+ SendData sendData = new SendData(toUid,
+ 4,
+ "not",
+ "搭讪消息",
+ "1",
+ 1,
+ "after",
+ false
+ );
+ send(sendData, listener);
+ }
+
private static void send(SendData sendData, OnSendMessageListener messageListener) {
OTONetManager.getInstance(null)
.sendMessage(sendData.toUid,
@@ -49,35 +127,24 @@ public class SendMessageManager {
sendData.content,
sendData.time,
sendData.online,
- "before",
- new HttpCallback() {
+ sendData.method,
+ new HttpCallback() {
@Override
- public void onSuccess(HttpCallbackModel data) {
- if (data.getCode() != 0) {
- OTONetManager.getInstance(null)
- .getMessageConsumeConfig(sendData.toUid + "", new HttpCallback() {
- @Override
- public void onSuccess(MessageConsumeConfigBean data) {
- String msg;
- if (sendData.type == 2) {
- msg = data.getVideoPrice() + "";
- } else if (sendData.type == 5) {
- msg = data.getMp3Price() + "";
- } else {
- msg = data.getPrice() + "";
- }
- messageListener.onError(OnSendMessageListener.STATUS_NOT_PRICE, msg);
- }
+ public void onSuccess(SendConsumeBean consumeBean) {
+ if (consumeBean.getCode() != 0) {
+ if (consumeBean.getCode() == 500) {
+ messageListener.onError(OnSendMessageListener.STATUS_NOT_PRICE, consumeBean.getMsg(), consumeBean);
+ } else {
+ messageListener.onError(OnSendMessageListener.STATUS_ERROR, consumeBean.getMsg(), consumeBean);
+ }
- @Override
- public void onError(String error) {
-
- }
- });
} else {
- String token = UUID.randomUUID().toString();
- cache.put(token, sendData);
- messageListener.onSuccess(token);
+ String token = null;
+ if (sendData.needToken) {
+ token = UUID.randomUUID().toString();
+ cache.put(token, sendData);
+ }
+ messageListener.onSuccess(token, consumeBean);
}
}
@@ -102,17 +169,17 @@ public class SendMessageManager {
sendData.time,
sendData.online,
"after",
- new HttpCallback() {
+ new HttpCallback() {
@Override
- public void onSuccess(HttpCallbackModel sd) {
+ public void onSuccess(SendConsumeBean sd) {
if (sd.getCode() != 0) {
- if(listener!=null) {
- listener.onSuccess(sd.getMsg());
+ if (listener != null) {
+ listener.onSuccess(sd.getMsg(), sd);
}
} else {
cache.remove(token);
- if(listener!=null) {
- listener.onSuccess(null);
+ if (listener != null) {
+ listener.onSuccess(null, sd);
}
}
@@ -122,7 +189,7 @@ public class SendMessageManager {
public void onError(String error) {
ToastUtil.show(error);
System.err.println(error);
- if(listener!=null) {
+ if (listener != null) {
listener.onError(OnSendMessageListener.STATUS_ERROR, error);
}
}
@@ -140,14 +207,16 @@ public class SendMessageManager {
}
public static class SendData {
- private int toUid;
+ public boolean needToken = true;
+ private String toUid;
private int type;
private String giftId;
private String content;
private String time;
private int online;
+ private String method = "before";
- public SendData(int toUid, int type, String giftId, String content, String time, int online) {
+ public SendData(String toUid, int type, String giftId, String content, String time, int online) {
this.toUid = toUid;
this.type = type;
this.giftId = giftId;
@@ -155,6 +224,37 @@ public class SendMessageManager {
this.time = time;
this.online = online;
}
+
+ public SendData(String toUid, int type, String giftId, String content, String time, int online, boolean needToken) {
+ this.needToken = needToken;
+ this.toUid = toUid;
+ this.type = type;
+ this.giftId = giftId;
+ this.content = content;
+ this.time = time;
+ this.online = online;
+ }
+
+ public SendData(String toUid, int type, String giftId, String content, String time, int online, String method) {
+ this.toUid = toUid;
+ this.type = type;
+ this.giftId = giftId;
+ this.content = content;
+ this.time = time;
+ this.online = online;
+ this.method = method;
+ }
+
+ public SendData(String toUid, int type, String giftId, String content, String time, int online, String method, boolean needToken) {
+ this.needToken = needToken;
+ this.toUid = toUid;
+ this.type = type;
+ this.giftId = giftId;
+ this.content = content;
+ this.time = time;
+ this.online = online;
+ this.method = method;
+ }
}
}
diff --git a/OneToOne/src/main/java/com/shayu/onetoone/network/API.java b/OneToOne/src/main/java/com/shayu/onetoone/network/API.java
index e1f5634e4..412fbb455 100644
--- a/OneToOne/src/main/java/com/shayu/onetoone/network/API.java
+++ b/OneToOne/src/main/java/com/shayu/onetoone/network/API.java
@@ -10,6 +10,7 @@ import com.yunbao.common.CommonAppContext;
import com.yunbao.common.http.HttpLoggingInterceptor;
import com.yunbao.common.http.base.BaseApi;
import com.yunbao.common.http.base.ParamsContext;
+import com.yunbao.common.http.converter.JsonConverterFactory;
import java.io.IOException;
import java.util.Date;
@@ -81,7 +82,7 @@ public class API extends BaseApi {
.addInterceptor(initQuery(isNeedUid, isNeedToken, CommonAppContext.sInstance.getApplicationContext()))
.addInterceptor(loggingInterceptor);
return create(builder.build(),
- GsonConverterFactory.create(gson), RxJava2CallAdapterFactory.create(), CommonAppConfig.HOST, OneToOneApi.class);
+ JsonConverterFactory.create(gson), RxJava2CallAdapterFactory.create(), CommonAppConfig.HOST, OneToOneApi.class);
}
//公共参数
diff --git a/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java b/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java
index 638448fd2..4245c9cab 100644
--- a/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java
+++ b/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java
@@ -12,12 +12,16 @@ import com.shayu.onetoone.bean.HomeItemBean;
import com.shayu.onetoone.bean.HomeRankBean;
import com.shayu.onetoone.bean.JoinAnchorBean;
import com.shayu.onetoone.bean.LabelBean;
+import com.shayu.onetoone.bean.MatchingInfoBean;
+import com.shayu.onetoone.bean.MatchingItemSizeBean;
import com.shayu.onetoone.bean.MessageConsumeConfigBean;
import com.shayu.onetoone.bean.OfficialNoticeBean;
import com.shayu.onetoone.bean.PurseBean;
+import com.shayu.onetoone.bean.SendConsumeBean;
import com.shayu.onetoone.bean.SystemMessageBean;
import com.shayu.onetoone.bean.TargetUserInfoBean;
import com.shayu.onetoone.bean.UserBean;
+import com.shayu.onetoone.bean.UserItemBean;
import com.yunbao.common.bean.BaseModel;
import com.yunbao.common.bean.IMLoginModel;
import com.yunbao.common.bean.UserAvatarSelectBean;
@@ -130,8 +134,8 @@ public interface OneToOneApi {
Observable>> getSystemMessageList(@Query("type") int type);
@GET("/api/public/?service=Friendappmsg.sendAfter")
- Observable> sendMessage(
- @Query("tuid") int tuid,
+ Observable> sendMessage(
+ @Query("tuid") String tuid,
@Query("type") int type,
@Query("gift_id") String giftId,
@Query("msg") String msg,
@@ -263,6 +267,21 @@ public interface OneToOneApi {
Observable> getAuthInfo(
);
+
+ @GET("/api/public/?service=Friendappuserprop.list")
+ Observable>> getUserItems(@Query("p") String p);
+
+ @GET("/api/public/?service=Friendappuserprop.count")
+ Observable> getMatchingNum();
+
+ @GET("/api/public/?service=Friendappuser.makeList")
+ Observable> getMatchingInfo();
+
+ @GET("/api/public/?service=Friendappmsg.getTips")
+ Observable> getChatTips(@Query("tuid") String tuid);
+ @GET("/api/public/?service=Friendappmsg.setTips")
+ Observable> updateChatTips(@Query("tuid") String tuid);
+
}
diff --git a/OneToOne/src/main/java/com/shayu/onetoone/utils/ConversationUtils.java b/OneToOne/src/main/java/com/shayu/onetoone/utils/ConversationUtils.java
index 34961499e..039532824 100644
--- a/OneToOne/src/main/java/com/shayu/onetoone/utils/ConversationUtils.java
+++ b/OneToOne/src/main/java/com/shayu/onetoone/utils/ConversationUtils.java
@@ -11,8 +11,12 @@ import io.rong.imlib.model.ConversationIdentifier;
* 跳转到会话页面
*/
public class ConversationUtils {
- public static void startConversation(Context mContext,String targetId){
+ public static void startConversation(Context mContext, String targetId) {
+ startConversation(mContext, targetId, new Bundle());
+ }
+
+ public static void startConversation(Context mContext, String targetId, Bundle bundle) {
ConversationIdentifier conversationIdentifier = new ConversationIdentifier(Conversation.ConversationType.PRIVATE, targetId);
- RouteUtils.routeToConversationActivity(mContext, conversationIdentifier, false, new Bundle());
+ RouteUtils.routeToConversationActivity(mContext, conversationIdentifier, false, bundle);
}
}
diff --git a/OneToOne/src/main/java/com/shayu/onetoone/view/MatchingBtnView.java b/OneToOne/src/main/java/com/shayu/onetoone/view/MatchingBtnView.java
new file mode 100644
index 000000000..a72b7f745
--- /dev/null
+++ b/OneToOne/src/main/java/com/shayu/onetoone/view/MatchingBtnView.java
@@ -0,0 +1,176 @@
+package com.shayu.onetoone.view;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.os.Handler;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.AnimationSet;
+import android.view.animation.ScaleAnimation;
+import android.view.animation.TranslateAnimation;
+import android.widget.FrameLayout;
+import android.widget.RelativeLayout;
+
+import com.shayu.onetoone.R;
+import com.yunbao.common.bean.AnchorRecommendItemModel;
+import com.yunbao.common.glide.ImgLoader;
+import com.yunbao.common.views.weight.ClipPathCircleImage;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 首页精彩推荐banner自定义组件
+ */
+public class MatchingBtnView extends FrameLayout {
+ private View rootView;
+ private RelativeLayout bannerLayout1, bannerLayout2, bannerLayout3, bannerLayout4;
+ private ClipPathCircleImage clipImage1, clipImage2, clipImage3, clipImage4;
+ private List list = new ArrayList<>();
+ //默认定时器时间
+ private int delayMillis = 1000;
+ //Handler定时加载下一张的数据
+ private Handler bannerHandler = new Handler();
+ private int index = 0;
+ private String Uid;
+ //小图标没必要用高清原图,压缩至x32可以节约内存
+ private final int iconWidth=32;
+ private final int iconHeight=32;
+
+ public MatchingBtnView(Context context) {
+ super(context);
+ }
+
+ public MatchingBtnView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ rootView = View.inflate(context, R.layout.view_matching_btn, this);
+ clipImage4 = rootView.findViewById(R.id.clip_image4);
+ clipImage3 = rootView.findViewById(R.id.clip_image3);
+ clipImage2 = rootView.findViewById(R.id.clip_image2);
+ clipImage1 = rootView.findViewById(R.id.clip_image1);
+ bannerLayout1 = rootView.findViewById(R.id.banner_layout1);
+ bannerLayout2 = rootView.findViewById(R.id.banner_layout2);
+ bannerLayout3 = rootView.findViewById(R.id.banner_layout3);
+ bannerLayout4 = rootView.findViewById(R.id.banner_layout4);
+
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+
+ super.onDraw(canvas);
+ }
+
+ public String getUid() {
+ return Uid;
+ }
+
+ /**
+ * 设置轮播数据
+ */
+ public void showBanner(List mList) {
+ release();
+ post(() -> {
+ if (mList.size() < 3) {
+ setVisibility(GONE);
+ return;
+ }
+ list.clear();
+ list.addAll(mList);
+ ImgLoader.displayAvatar(getContext(), list.get(0).getAvatar(), clipImage3,iconWidth,iconHeight);
+ ImgLoader.displayAvatar(getContext(), list.get(1).getAvatar(), clipImage2,iconWidth,iconHeight);
+ ImgLoader.displayAvatar(getContext(), list.get(2).getAvatar(), clipImage1,iconWidth,iconHeight);
+
+ bannerHandler.post(mFlipRunnable);
+ });
+
+
+ }
+
+ /**
+ * 释放资源
+ */
+ public void release() {
+ bannerHandler.removeCallbacks(mFlipRunnable);
+ bannerLayout4.clearAnimation();
+ bannerLayout2.clearAnimation();
+ }
+
+ private final Runnable mFlipRunnable = new Runnable() {
+ @Override
+ public void run() {
+ int next = index + 1;
+ next = (next >= list.size() ? 0 : next);
+ if (next == 0) {
+ index = 0;
+ }
+ Uid = String.valueOf(list.get(next).getUid());
+ float targetX = bannerLayout2.getX() - bannerLayout3.getX();
+ float targetY = bannerLayout2.getY() - bannerLayout3.getY();
+ bannerLayout3.setVisibility(GONE);
+ ImgLoader.displayAvatar(getContext(), list.get(next).getAvatar(), clipImage3,iconWidth,iconHeight);
+ ImgLoader.displayAvatar(getContext(), list.get(next).getAvatar(), clipImage2,iconWidth,iconHeight);
+ TranslateAnimation animationTranslate = new TranslateAnimation(0, -targetX / 1.2f, 0, -targetY / 1.2f);
+ ScaleAnimation scaleAnimation = new ScaleAnimation(1f, 1.2f, 1f, 1.2f);
+ AnimationSet animationSet1 = new AnimationSet(true);
+ animationSet1.setFillAfter(true);
+ animationSet1.setDuration(500);
+ animationSet1.addAnimation(animationTranslate);
+ animationSet1.addAnimation(scaleAnimation);
+ final int finalNext = next;
+ animationSet1.setAnimationListener(new Animation.AnimationListener() {
+ @Override
+ public void onAnimationStart(Animation animation) {
+ int show = finalNext + 1;
+
+ ImgLoader.displayAvatar(getContext(), list.get(show >= list.size() ? 0 : show).getAvatar(), clipImage1,iconWidth,iconHeight);
+ }
+
+ @Override
+ public void onAnimationEnd(Animation animation) {
+
+ bannerLayout3.setVisibility(VISIBLE);
+
+ }
+
+ @Override
+ public void onAnimationRepeat(Animation animation) {
+
+ }
+ });
+ ScaleAnimation scaleAnimation2 = new ScaleAnimation(1f, 0.8f, 1f, 0.8f);
+ TranslateAnimation animationTranslate2 = new TranslateAnimation(0, -bannerLayout4.getX()/0.8f, 0, bannerLayout4.getY()*0.8f);
+ AlphaAnimation animationAlpha = new AlphaAnimation(1, 0);
+ AnimationSet animationSet2 = new AnimationSet(true);
+ animationSet2.setFillAfter(true);
+ animationSet2.setDuration(800);
+ animationSet2.addAnimation(animationTranslate2);
+ animationSet2.addAnimation(animationAlpha);
+ animationSet2.addAnimation(scaleAnimation2);
+ animationSet2.setAnimationListener(new Animation.AnimationListener() {
+ @Override
+ public void onAnimationStart(Animation animation) {
+
+ }
+
+ @Override
+ public void onAnimationEnd(Animation animation) {
+ ImgLoader.displayAvatar(getContext(), list.get(finalNext).getAvatar(), clipImage4,iconWidth,iconHeight);
+ index = index + 1;
+ bannerHandler.postDelayed(mFlipRunnable, delayMillis);
+ bannerLayout3.clearAnimation();
+ }
+
+ @Override
+ public void onAnimationRepeat(Animation animation) {
+
+ }
+ });
+ bannerLayout4.startAnimation(animationSet2);
+ bannerLayout2.startAnimation(animationSet1);
+ }
+ };
+
+}
diff --git a/OneToOne/src/main/java/com/shayu/onetoone/view/MsgInputPanelForAudio.java b/OneToOne/src/main/java/com/shayu/onetoone/view/MsgInputPanelForAudio.java
index 17ac31b32..00716196b 100644
--- a/OneToOne/src/main/java/com/shayu/onetoone/view/MsgInputPanelForAudio.java
+++ b/OneToOne/src/main/java/com/shayu/onetoone/view/MsgInputPanelForAudio.java
@@ -12,6 +12,7 @@ import android.widget.Toast;
import com.blankj.utilcode.util.PermissionUtils;
import com.shayu.onetoone.R;
+import com.shayu.onetoone.bean.SendConsumeBean;
import com.shayu.onetoone.dialog.TipsDialog;
import com.shayu.onetoone.listener.OnDialogClickListener;
import com.shayu.onetoone.listener.OnSendMessageListener;
@@ -115,8 +116,8 @@ public class MsgInputPanelForAudio extends AbsInputPanel {
System.out.println("点击事件:调用token");
SendMessageManager.sendMessageForAudio(targetId, new OnSendMessageListener() {
@Override
- public void onSuccess(String token) {
- super.onSuccess(token);
+ public void onSuccess(String token, SendConsumeBean bean) {
+ super.onSuccess(token,bean);
MsgInputPanelForAudio.this.token = token;
isAudio = true;
onDown(v, mLastTouchY);
diff --git a/OneToOne/src/main/java/com/shayu/onetoone/view/MsgInputPanelForGift.java b/OneToOne/src/main/java/com/shayu/onetoone/view/MsgInputPanelForGift.java
index 6076bdacc..d93b53845 100644
--- a/OneToOne/src/main/java/com/shayu/onetoone/view/MsgInputPanelForGift.java
+++ b/OneToOne/src/main/java/com/shayu/onetoone/view/MsgInputPanelForGift.java
@@ -13,6 +13,8 @@ import com.shayu.onetoone.adapter.GiftListAdapter;
import com.shayu.onetoone.bean.GiftBean;
import com.shayu.onetoone.bean.MessageChatGiftContent;
import com.shayu.onetoone.bean.PurseBean;
+import com.shayu.onetoone.bean.SendConsumeBean;
+import com.shayu.onetoone.dialog.TipsDialog;
import com.shayu.onetoone.listener.OnSendMessageListener;
import com.shayu.onetoone.manager.OTONetManager;
import com.shayu.onetoone.manager.SendMessageManager;
@@ -69,8 +71,8 @@ public class MsgInputPanelForGift extends AbsInputPanel {
GiftBean item = mAdapter.getItem();
SendMessageManager.sendMessageForGift(targetId, item.getId() + "", new OnSendMessageListener() {
@Override
- public void onSuccess(String token) {
- super.onSuccess(token);
+ public void onSuccess(String token, SendConsumeBean bean) {
+ super.onSuccess(token,bean);
MsgInputPanelForGift.this.token = token;
sendGift(item);
@@ -79,6 +81,9 @@ public class MsgInputPanelForGift extends AbsInputPanel {
@Override
public void onError(int status, String msg) {
super.onError(status, msg);
+ new TipsDialog(mContext)
+ .setTitle("餘額不足")
+ .showDialog();
}
});
});
diff --git a/OneToOne/src/main/res/drawable/bg_matching_btn.xml b/OneToOne/src/main/res/drawable/bg_matching_btn.xml
new file mode 100644
index 000000000..f50dbb757
--- /dev/null
+++ b/OneToOne/src/main/res/drawable/bg_matching_btn.xml
@@ -0,0 +1,9 @@
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OneToOne/src/main/res/layout/activity_full_image.xml b/OneToOne/src/main/res/layout/activity_full_image.xml
new file mode 100644
index 000000000..8bc6b9a0a
--- /dev/null
+++ b/OneToOne/src/main/res/layout/activity_full_image.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/OneToOne/src/main/res/layout/activity_matching.xml b/OneToOne/src/main/res/layout/activity_matching.xml
new file mode 100644
index 000000000..370a13fd4
--- /dev/null
+++ b/OneToOne/src/main/res/layout/activity_matching.xml
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OneToOne/src/main/res/layout/dialog_msg_tips.xml b/OneToOne/src/main/res/layout/dialog_msg_tips.xml
new file mode 100644
index 000000000..6a1cbd250
--- /dev/null
+++ b/OneToOne/src/main/res/layout/dialog_msg_tips.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/OneToOne/src/main/res/layout/dialog_tips1.xml b/OneToOne/src/main/res/layout/dialog_tips1.xml
index 3203eeae6..f86e769b1 100644
--- a/OneToOne/src/main/res/layout/dialog_tips1.xml
+++ b/OneToOne/src/main/res/layout/dialog_tips1.xml
@@ -5,18 +5,25 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_dialog_tip"
+ android:minWidth="256dp"
android:orientation="vertical">
+ android:textStyle="bold"
+ tools:text="余额不足,请充值后再进行尝试吧~" />
+
+ tools:text="" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OneToOne/src/main/res/layout/view_message_input_gift.xml b/OneToOne/src/main/res/layout/view_message_input_gift.xml
index 768884700..82ea39818 100644
--- a/OneToOne/src/main/res/layout/view_message_input_gift.xml
+++ b/OneToOne/src/main/res/layout/view_message_input_gift.xml
@@ -4,7 +4,8 @@
xmlns:tools="http://schemas.android.com/tools"
android:background="@color/white"
android:layout_width="match_parent"
- android:layout_height="210dp">
+ android:layout_marginBottom="10dp"
+ android:layout_height="wrap_content">
diff --git a/OneToOne/src/main/res/mipmap-xxhdpi/bg_firstlogin_tips.png b/OneToOne/src/main/res/mipmap-xxhdpi/bg_firstlogin_tips.png
new file mode 100644
index 000000000..ea5052742
Binary files /dev/null and b/OneToOne/src/main/res/mipmap-xxhdpi/bg_firstlogin_tips.png differ
diff --git a/OneToOne/src/main/res/mipmap-xxhdpi/bg_firstlogin_tips_man.png b/OneToOne/src/main/res/mipmap-xxhdpi/bg_firstlogin_tips_man.png
new file mode 100644
index 000000000..b2d1ef372
Binary files /dev/null and b/OneToOne/src/main/res/mipmap-xxhdpi/bg_firstlogin_tips_man.png differ
diff --git a/OneToOne/src/main/res/mipmap-xxhdpi/bg_firstlogin_tips_woman.png b/OneToOne/src/main/res/mipmap-xxhdpi/bg_firstlogin_tips_woman.png
new file mode 100644
index 000000000..74663c8a2
Binary files /dev/null and b/OneToOne/src/main/res/mipmap-xxhdpi/bg_firstlogin_tips_woman.png differ
diff --git a/OneToOne/src/main/res/mipmap-xxhdpi/bg_matching.png b/OneToOne/src/main/res/mipmap-xxhdpi/bg_matching.png
new file mode 100644
index 000000000..5b1625984
Binary files /dev/null and b/OneToOne/src/main/res/mipmap-xxhdpi/bg_matching.png differ
diff --git a/OneToOne/src/main/res/mipmap-xxhdpi/bg_matching_star.png b/OneToOne/src/main/res/mipmap-xxhdpi/bg_matching_star.png
new file mode 100644
index 000000000..c150f19d0
Binary files /dev/null and b/OneToOne/src/main/res/mipmap-xxhdpi/bg_matching_star.png differ
diff --git a/OneToOne/src/main/res/mipmap-xxhdpi/ic_matching_back.png b/OneToOne/src/main/res/mipmap-xxhdpi/ic_matching_back.png
new file mode 100644
index 000000000..b25faf449
Binary files /dev/null and b/OneToOne/src/main/res/mipmap-xxhdpi/ic_matching_back.png differ
diff --git a/OneToOne/src/main/res/mipmap-xxhdpi/ic_matching_free.png b/OneToOne/src/main/res/mipmap-xxhdpi/ic_matching_free.png
new file mode 100644
index 000000000..da39752c5
Binary files /dev/null and b/OneToOne/src/main/res/mipmap-xxhdpi/ic_matching_free.png differ
diff --git a/common/build.gradle b/common/build.gradle
index 81d495e34..ca3fd6dc6 100644
--- a/common/build.gradle
+++ b/common/build.gradle
@@ -208,5 +208,6 @@ dependencies {
api 'com.github.xuexiangjys.XUtil:xutil-core:2.0.0'
// api files('libs/svgaplayer-release-v1.2.1.aar')
+ api 'com.blankj:utilcode:1.30.0'//獲取uuid
}
diff --git a/common/src/main/java/com/yunbao/common/dialog/AbsFullDialogPopupWindow.java b/common/src/main/java/com/yunbao/common/dialog/AbsFullDialogPopupWindow.java
new file mode 100644
index 000000000..34929ae15
--- /dev/null
+++ b/common/src/main/java/com/yunbao/common/dialog/AbsFullDialogPopupWindow.java
@@ -0,0 +1,40 @@
+package com.yunbao.common.dialog;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+
+import com.lxj.xpopup.XPopup;
+import com.lxj.xpopup.core.BottomPopupView;
+import com.lxj.xpopup.impl.FullScreenPopupView;
+
+/**
+ * 全屏弹窗
+ */
+public abstract class AbsFullDialogPopupWindow extends FullScreenPopupView {
+ public final Context mContext;
+
+ public AbsFullDialogPopupWindow(@NonNull Context context) {
+ super(context);
+ this.mContext = context;
+ }
+
+ /**
+ * 参考配置
+ */
+ public abstract void buildDialog(XPopup.Builder builder);
+ public abstract int bindLayoutId();
+
+ @Override
+ protected int getImplLayoutId() {
+ return bindLayoutId();
+ }
+
+ public void showDialog() {
+ XPopup.Builder builder = new XPopup.Builder(mContext);
+ builder.isDestroyOnDismiss(true);
+ builder.enableDrag(false);
+ buildDialog(builder);
+ builder.asCustom(this).show();
+ }
+}
diff --git a/common/src/main/java/com/yunbao/common/http/ResponseModel.java b/common/src/main/java/com/yunbao/common/http/ResponseModel.java
index 3008ebf5f..d03cb4ce2 100644
--- a/common/src/main/java/com/yunbao/common/http/ResponseModel.java
+++ b/common/src/main/java/com/yunbao/common/http/ResponseModel.java
@@ -20,6 +20,8 @@ public class ResponseModel {
@SerializedName("msg")
private String msg;
+ private String jsonSrc;
+
public int getRet() {
return ret;
}
@@ -46,4 +48,16 @@ public class ResponseModel {
this.msg = msg;
return this;
}
+
+ public void setJsonSrc(String jsonSrc) {
+ this.jsonSrc = jsonSrc;
+ }
+
+ public String getJsonSrc() {
+ return jsonSrc;
+ }
+
+ public boolean isError() {
+ return data == null;
+ }
}
diff --git a/common/src/main/java/com/yunbao/common/http/converter/JsonConverterFactory.java b/common/src/main/java/com/yunbao/common/http/converter/JsonConverterFactory.java
new file mode 100644
index 000000000..0c5a6f08e
--- /dev/null
+++ b/common/src/main/java/com/yunbao/common/http/converter/JsonConverterFactory.java
@@ -0,0 +1,39 @@
+package com.yunbao.common.http.converter;
+
+import com.google.gson.Gson;
+import com.google.gson.TypeAdapter;
+import com.google.gson.reflect.TypeToken;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+
+import okhttp3.RequestBody;
+import okhttp3.ResponseBody;
+import retrofit2.Converter;
+import retrofit2.Retrofit;
+
+public class JsonConverterFactory extends Converter.Factory {
+ private final Gson gson;
+
+ public static Converter.Factory create(Gson gson) {
+ return new JsonConverterFactory(gson);
+ }
+
+ private JsonConverterFactory(Gson gson) {
+ this.gson = gson;
+ }
+
+ @Override
+ public Converter, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations,
+ Annotation[] methodAnnotations, Retrofit retrofit) {
+ TypeAdapter> adapter = gson.getAdapter(TypeToken.get(type));
+ return new JsonRequestConverter<>(gson, adapter);
+ }
+
+ @Override
+ public Converter responseBodyConverter(Type type, Annotation[] annotations,
+ Retrofit retrofit) {
+ TypeAdapter> adapter = gson.getAdapter(TypeToken.get(type));
+ return new JsonResponseBodyConverter<>(gson, adapter);
+ }
+}
diff --git a/common/src/main/java/com/yunbao/common/http/converter/JsonRequestConverter.java b/common/src/main/java/com/yunbao/common/http/converter/JsonRequestConverter.java
new file mode 100644
index 000000000..17667fddb
--- /dev/null
+++ b/common/src/main/java/com/yunbao/common/http/converter/JsonRequestConverter.java
@@ -0,0 +1,38 @@
+package com.yunbao.common.http.converter;
+
+import com.google.gson.Gson;
+import com.google.gson.TypeAdapter;
+import com.google.gson.stream.JsonWriter;
+
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+import okhttp3.MediaType;
+import okhttp3.RequestBody;
+import okio.Buffer;
+import retrofit2.Converter;
+
+public class JsonRequestConverter implements Converter {
+ private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
+ private static final Charset UTF_8 = StandardCharsets.UTF_8;
+
+ private final Gson gson;
+ private final TypeAdapter adapter;
+ JsonRequestConverter(Gson gson, TypeAdapter adapter) {
+ this.gson = gson;
+ this.adapter = adapter;
+ }
+
+ @Override
+ public RequestBody convert(T value) throws IOException {
+ Buffer buffer = new Buffer();
+ Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);
+ JsonWriter jsonWriter = gson.newJsonWriter(writer);
+ adapter.write(jsonWriter, value);
+ jsonWriter.close();
+ return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
+ }
+}
diff --git a/common/src/main/java/com/yunbao/common/http/converter/JsonResponseBodyConverter.java b/common/src/main/java/com/yunbao/common/http/converter/JsonResponseBodyConverter.java
new file mode 100644
index 000000000..3500bef18
--- /dev/null
+++ b/common/src/main/java/com/yunbao/common/http/converter/JsonResponseBodyConverter.java
@@ -0,0 +1,41 @@
+package com.yunbao.common.http.converter;
+
+import com.google.gson.Gson;
+import com.google.gson.TypeAdapter;
+import com.google.gson.stream.JsonReader;
+import com.yunbao.common.http.ResponseModel;
+
+import java.io.IOException;
+
+import okhttp3.ResponseBody;
+import retrofit2.Converter;
+
+public class JsonResponseBodyConverter implements Converter {
+ private final Gson gson;
+ private final TypeAdapter adapter;
+
+ public JsonResponseBodyConverter(Gson gson, TypeAdapter adapter) {
+ this.gson = gson;
+ this.adapter = adapter;
+ }
+
+ @Override
+ public T convert(ResponseBody value) throws IOException {
+ byte[] copy=value.bytes().clone();
+ value=ResponseBody.create(value.contentType(),copy.clone());
+ JsonReader jsonReader = gson.newJsonReader(value.charStream());
+ try {
+ ResponseModel model= (ResponseModel) adapter.read(jsonReader);
+ model.setJsonSrc(new String(copy));
+ return (T) model;
+ } catch (Exception e) {
+ e.printStackTrace();
+ String src = new String(copy);
+ ResponseModel model = new ResponseModel();
+ model.setJsonSrc(src);
+ return (T) model;
+ } finally {
+ value.close();
+ }
+ }
+}