This commit is contained in:
zlzw 2023-10-11 16:18:36 +08:00
parent fd377b5280
commit 729270c3d0
14 changed files with 485 additions and 47 deletions

View File

@ -10,9 +10,12 @@ import com.alibaba.android.arouter.launcher.ARouter;
import com.facebook.FacebookSdk;
import com.shayu.onetoone.activity.fragments.message.ChatMessageFragment;
import com.shayu.onetoone.activity.message.ChatActivity;
import com.shayu.onetoone.bean.MessageChatAuthContent;
import com.shayu.onetoone.bean.MessageChatGiftContent;
import com.shayu.onetoone.bean.MessageChatTipsContent;
import com.shayu.onetoone.manager.CommandMessageManager;
import com.shayu.onetoone.provider.CustomConversationProvider;
import com.shayu.onetoone.provider.MessageChatAutoItemProvider;
import com.shayu.onetoone.provider.MessageChatReceiveGiftItemProvider;
import com.shayu.onetoone.provider.MessageChatTipsItemProvider;
import com.shayu.onetoone.utils.NeverCrashUtils;
@ -39,6 +42,7 @@ import io.rong.imlib.IMLibRTCClient;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Message;
import io.rong.imlib.model.MessageContent;
import io.rong.message.CommandMessage;
import io.rong.message.TextMessage;
public class AppContext extends CommonAppContext {
@ -80,11 +84,13 @@ public class AppContext extends CommonAppContext {
ArrayList<Class<? extends MessageContent>> myMessages = new ArrayList<>();
myMessages.add(MessageChatTipsContent.class);
myMessages.add(MessageChatGiftContent.class);
myMessages.add(MessageChatAuthContent.class);
RongIMClient.registerMessageType(myMessages);
RongConfigCenter.conversationConfig().addMessageProvider(new InstructorSendRewardProvider(getApplicationContext()));
RongConfigCenter.conversationConfig().addMessageProvider(new MessageChatTipsItemProvider(getApplicationContext()));
RongConfigCenter.conversationConfig().addMessageProvider(new MessageChatReceiveGiftItemProvider(getApplicationContext()));
RongConfigCenter.conversationConfig().addMessageProvider(new MessageChatAutoItemProvider(getApplicationContext()));
String appKey = "pvxdm17jpd3hr";
boolean enablePush = true;
@ -101,9 +107,11 @@ public class AppContext extends CommonAppContext {
RongcloudIMManager.addRongcloudIMOnReceiveMessageListener(new RongIMClient.OnReceiveMessageWrapperListener() {
@Override
public boolean onReceived(Message message, int left, boolean hasPackage, boolean offline) {
System.out.println("初始化IM消息:"+message.getContent());
System.out.println("初始化IM消息:" + message.getContent());
if (message.getContent() instanceof TextMessage) {
TextMessage content = (TextMessage) message.getContent();
} else if (message.getContent() instanceof CommandMessage) {
CommandMessageManager.getInstance().onMessage((CommandMessage) message.getContent());
}
return false;
}

View File

@ -3,6 +3,7 @@ package com.shayu.onetoone.activity.fragments.message;
import android.app.Dialog;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -16,9 +17,11 @@ import androidx.annotation.Nullable;
import com.makeramen.roundedimageview.RoundedImageView;
import com.shayu.onetoone.R;
import com.shayu.onetoone.bean.MessageChatAuthContent;
import com.shayu.onetoone.bean.MessageChatTipsContent;
import com.shayu.onetoone.bean.UserBean;
import com.shayu.onetoone.dialog.TipsDialog;
import com.shayu.onetoone.listener.OnCallStatusListener;
import com.shayu.onetoone.listener.OnDialogClickListener;
import com.shayu.onetoone.listener.OnSendMessageListener;
import com.shayu.onetoone.manager.OTONetManager;
@ -68,6 +71,7 @@ public class ChatMessageFragment extends AbsConversationFragment {
Button follow;
private String token;
private static final String TAG = "聊天界面";
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
@ -81,24 +85,7 @@ public class ChatMessageFragment extends AbsConversationFragment {
img.setOnClickListener(v -> cameraUtil.getImageByCamera());
initCamera();
call.setOnClickListener(v -> {
MessageChatTipsContent bean = MessageChatTipsContent.obtain(WordUtil.getNewString(R.string.message_chat_tip1));
IMCenter.getInstance().insertOutgoingMessage(conversationType, targetId, Message.SentStatus.SENT, bean, System.currentTimeMillis(), new RongIMClient.ResultCallback<Message>() {
@Override
public void onSuccess(Message message) {
ToastUtil.show(R.string.system_tip_success);
}
@Override
public void onError(RongIMClient.ErrorCode e) {
ToastUtil.show(R.string.system_tip_failure);
System.out.println("失败:" + e.getMessage());
}
});
});
mSendBtn.setOnClickListener(v -> {
System.out.println("点击");
SendMessageManager.sendMessageForText(targetId, mEditText.getText().toString(), new OnSendMessageListener() {
@Override
public void onSuccess(String token) {
@ -187,12 +174,82 @@ public class ChatMessageFragment extends AbsConversationFragment {
gift.setOnClickListener(v -> {
giftPanel.show();
});
video.setOnClickListener(v -> {
checkAuth(new OnSendMessageListener() {
@Override
public void onSuccess(String token) {
super.onSuccess(token);
ToastUtil.show("弹视频聊天");
}
@Override
public void onError(int status, String msg) {
super.onError(status, msg);
sendAuthRequest();
}
});
});
call.setOnClickListener(v -> {
checkAuth(new OnSendMessageListener() {
@Override
public void onSuccess(String token) {
super.onSuccess(token);
ToastUtil.show("弹音频聊天");
}
@Override
public void onError(int status, String msg) {
super.onError(status, msg);
sendAuthRequest();
}
});
});
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private void checkAuth(OnSendMessageListener listener) {
OTONetManager.getInstance(mContext)
.getTargetUserInfo(Integer.parseInt(targetId), new HttpCallback<UserBean>() {
@Override
public void onSuccess(UserBean data) {
if (data.getInfo().getSage_auth() == 1) {
listener.onError(0, "");
} else {
listener.onSuccess("");
}
}
@Override
public void onError(String error) {
Log.e(TAG, "onError: " + error);
}
});
}
private void sendAuthRequest() {
MessageChatAuthContent content = MessageChatAuthContent.obtain("");
IMCenter.getInstance().sendMessage(Message.obtain(targetId, Conversation.ConversationType.PRIVATE, content), null, null, new IRongCallback.ISendMessageCallback() {
@Override
public void onAttached(Message message) {
}
@Override
public void onSuccess(Message message) {
}
@Override
public void onError(Message message, RongIMClient.ErrorCode errorCode) {
}
});
}
private void sendText() {
Conversation.ConversationType conversationType = Conversation.ConversationType.PRIVATE;

View File

@ -0,0 +1,121 @@
package com.shayu.onetoone.bean;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.NonNull;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.UnsupportedEncodingException;
import io.rong.common.ParcelUtils;
import io.rong.imlib.MessageTag;
import io.rong.imlib.model.MessageContent;
@MessageTag(value = "MessageChatAuthContent", flag = MessageTag.ISPERSISTED)
public class MessageChatAuthContent extends MessageContent implements Parcelable {
private String content;
private MessageChatAuthContent() {
}
public MessageChatAuthContent(byte[] data) {
if (data == null) {
return;
}
String jsonStr = null;
try {
jsonStr = new String(data, "UTF-8");
} catch (UnsupportedEncodingException e) {
}
if (jsonStr == null) {
return;
}
try {
JSONObject jsonObj = new JSONObject(jsonStr);
// 消息携带用户信息时, 自定义消息需添加下面代码
if (jsonObj.has("user")) {
setUserInfo(parseJsonToUserInfo(jsonObj.getJSONObject("user")));
}
// 用于群组聊天, 消息携带 @ 人信息时, 自定义消息需添加下面代码
if (jsonObj.has("mentionedInfo")) {
setMentionedInfo(parseJsonToMentionInfo(jsonObj.getJSONObject("mentionedInfo")));
}
// 将所有自定义变量从收到的 json 解析并赋值
if (jsonObj.has("content")) {
content = jsonObj.optString("content");
}
} catch (JSONException e) {
}
}
public MessageChatAuthContent setContent(String content) {
this.content = content;
return this;
}
public String getContent() {
return content;
}
protected MessageChatAuthContent(Parcel in) {
setExtra(ParcelUtils.readFromParcel(in));
setContent(ParcelUtils.readFromParcel(in));
}
// 快速构建消息对象方法
public static MessageChatAuthContent obtain(String content) {
MessageChatAuthContent msg = new MessageChatAuthContent();
msg.content = content;
return msg;
}
public static final Creator<MessageChatAuthContent> CREATOR = new Creator<MessageChatAuthContent>() {
@Override
public MessageChatAuthContent createFromParcel(Parcel in) {
return new MessageChatAuthContent(in);
}
@Override
public MessageChatAuthContent[] newArray(int size) {
return new MessageChatAuthContent[size];
}
};
@Override
public byte[] encode() {
JSONObject jsonObj = new JSONObject();
try {
// 消息携带用户信息时, 自定义消息需添加下面代码
if (getJSONUserInfo() != null) {
jsonObj.putOpt("user", getJSONUserInfo());
}
// 用于群组聊天, 消息携带 @ 人信息时, 自定义消息需添加下面代码
if (getJsonMentionInfo() != null) {
jsonObj.putOpt("mentionedInfo", getJsonMentionInfo());
}
// 将所有自定义消息的内容都序列化至 json 对象中
jsonObj.put("content", this.content);
} catch (JSONException e) {
}
try {
return jsonObj.toString().getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
}
return null;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
ParcelUtils.writeToParcel(dest, getExtra());
ParcelUtils.writeToParcel(dest, content);
}
}

View File

@ -0,0 +1,74 @@
package com.shayu.onetoone.bean;
import com.google.gson.annotations.SerializedName;
import com.yunbao.common.bean.BaseModel;
public class PurseBean extends BaseModel {
@SerializedName("yuanbao")
private long start;
private long coin;
private long gold;
private String msgYbDec;
private String msgYbInc;
private String msgYb;
private String msgZsDec;
public PurseBean() {
}
public long getStart() {
return start;
}
public void setStart(long start) {
this.start = start;
}
public long getCoin() {
return coin;
}
public void setCoin(long coin) {
this.coin = coin;
}
public long getGold() {
return gold;
}
public void setGold(long gold) {
this.gold = gold;
}
public String getMsgYbDec() {
return msgYbDec;
}
public void setMsgYbDec(String msgYbDec) {
this.msgYbDec = msgYbDec;
}
public String getMsgYbInc() {
return msgYbInc;
}
public void setMsgYbInc(String msgYbInc) {
this.msgYbInc = msgYbInc;
}
public String getMsgYb() {
return msgYb;
}
public void setMsgYb(String msgYb) {
this.msgYb = msgYb;
}
public String getMsgZsDec() {
return msgZsDec;
}
public void setMsgZsDec(String msgZsDec) {
this.msgZsDec = msgZsDec;
}
}

View File

@ -0,0 +1,19 @@
package com.shayu.onetoone.manager;
import io.rong.message.CommandMessage;
public class CommandMessageManager {
private static CommandMessageManager manager;
private CommandMessageManager() {
}
public static CommandMessageManager getInstance() {
if(manager==null){
manager=new CommandMessageManager();
}
return manager;
}
public void onMessage(CommandMessage message){
}
}

View File

@ -12,6 +12,7 @@ import com.shayu.onetoone.bean.HomeItemBean;
import com.shayu.onetoone.bean.JoinAnchorBean;
import com.shayu.onetoone.bean.MessageConsumeConfigBean;
import com.shayu.onetoone.bean.OfficialNoticeBean;
import com.shayu.onetoone.bean.PurseBean;
import com.shayu.onetoone.bean.SystemMessageBean;
import com.shayu.onetoone.bean.TargetUserInfoBean;
import com.shayu.onetoone.bean.UserBean;
@ -24,6 +25,7 @@ import com.yunbao.common.http.ResponseModel;
import com.yunbao.common.http.base.HttpCallback;
import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.common.utils.MD5Util;
import com.yunbao.faceunity.entity.PropBean;
import java.io.File;
import java.util.ArrayList;
@ -606,6 +608,27 @@ public class OTONetManager {
}).isDisposed();
}
public void getPurseInfo(HttpCallback<PurseBean> callback) {
API.get().otoApi(mContext)
.getPurseInfo()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(model -> {
if (callback != null) {
callback.onSuccess(model.getData().getInfo());
}
}, new Consumer<Throwable>() {
@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();
}
private MultipartBody.Part createUploadFile(File file) {
RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
return MultipartBody.Part.createFormData("file", file.getName(), requestBody);

View File

@ -7,6 +7,7 @@ import com.shayu.onetoone.bean.HomeItemBean;
import com.shayu.onetoone.bean.JoinAnchorBean;
import com.shayu.onetoone.bean.MessageConsumeConfigBean;
import com.shayu.onetoone.bean.OfficialNoticeBean;
import com.shayu.onetoone.bean.PurseBean;
import com.shayu.onetoone.bean.SystemMessageBean;
import com.shayu.onetoone.bean.TargetUserInfoBean;
import com.shayu.onetoone.bean.UserBean;
@ -134,6 +135,8 @@ public interface OneToOneApi {
@GET("/api/public/?service=Friendappmsg.giftList")
Observable<ResponseModel<List<GiftBean>>> getGiftList();
@GET("/api/public/?service=Friendappmoney.info")
Observable<ResponseModel<PurseBean>> getPurseInfo();
}

View File

@ -0,0 +1,84 @@
package com.shayu.onetoone.provider;
import android.content.Context;
import android.text.Spannable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import com.shayu.onetoone.R;
import com.shayu.onetoone.bean.MessageChatAuthContent;
import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.common.utils.ToastUtil;
import java.util.List;
import io.rong.common.RLog;
import io.rong.imkit.conversation.messgelist.provider.BaseMessageItemProvider;
import io.rong.imkit.model.UiMessage;
import io.rong.imkit.widget.adapter.IViewProviderListener;
import io.rong.imkit.widget.adapter.ViewHolder;
import io.rong.imlib.model.Message;
import io.rong.imlib.model.MessageContent;
/**
* 聊天认证适配器
*/
public class MessageChatAutoItemProvider extends BaseMessageItemProvider<MessageChatAuthContent> {
private Context mContext;
public MessageChatAutoItemProvider(Context mContext) {
this.mContext = mContext;
mConfig.showPortrait = true;
mConfig.showSummaryWithName = false;
mConfig.showContentBubble = false;
mConfig.centerInHorizontal = false;
}
@Override
protected ViewHolder onCreateMessageContentViewHolder(ViewGroup parent, int viewType) {
return ViewHolder.createViewHolder(mContext, parent, R.layout.view_message_chat_auth);
}
@Override
public void bindViewHolder(ViewHolder holder, UiMessage uiMessage, int position, List<UiMessage> list, IViewProviderListener<UiMessage> listener) {
super.bindViewHolder(holder, uiMessage, position, list, listener);
}
@Override
protected void bindMessageContentViewHolder(ViewHolder holder, ViewHolder parentHolder, MessageChatAuthContent content, UiMessage uiMessage, int position, List<UiMessage> list, IViewProviderListener<UiMessage> listener) {
if (uiMessage.getMessage().getMessageDirection() == Message.MessageDirection.SEND) {
holder.getView(R.id.btn).setBackgroundResource(R.drawable.background_d9d9d9);
holder.getView(R.id.btn).setEnabled(false);
holder.setText(R.id.tips,"邀請對方完成真人認證,開通通話權限");
((Button)holder.getView(R.id.btn)).setText("待开通");
} else {
holder.getView(R.id.btn).setBackgroundResource(R.drawable.background_8f7cdf);
((Button)holder.getView(R.id.btn)).setText("去开通");
holder.setText(R.id.tips,"對方邀請您完成真人認證,開通通話權限");
holder.getView(R.id.btn).setEnabled(true);
}
holder.setOnClickListener(R.id.btn, new View.OnClickListener() {
@Override
public void onClick(View v) {
ToastUtil.show("跳实名认证页面");
}
});
}
@Override
protected boolean onItemClick(ViewHolder holder, MessageChatAuthContent MessageChatAuthContent, UiMessage uiMessage, int position, List<UiMessage> list, IViewProviderListener<UiMessage> listener) {
return false;
}
@Override
protected boolean isMessageViewType(MessageContent messageContent) {
return messageContent instanceof MessageChatAuthContent;
}
@Override
public Spannable getSummarySpannable(Context context, MessageChatAuthContent MessageChatAuthContent) {
return null;
}
}

View File

@ -47,21 +47,6 @@ public class MessageChatReceiveGiftItemProvider extends BaseMessageItemProvider<
@Override
public void bindViewHolder(ViewHolder holder, UiMessage uiMessage, int position, List<UiMessage> list, IViewProviderListener<UiMessage> listener) {
if (holder instanceof MessageViewHolder) {
try {
MessageContent content = uiMessage.getMessage().getContent();
if (content instanceof MessageChatGiftContent) {
MessageChatGiftContent messageChatGiftContent = (MessageChatGiftContent) content;
if (messageChatGiftContent.getSendUid().equals(IMLoginManager.get(mContext).getUserInfo().getId() + "")) {
uiMessage.getMessage().setMessageDirection(Message.MessageDirection.SEND);
} else {
uiMessage.getMessage().setMessageDirection(Message.MessageDirection.RECEIVE);
}
}
} catch (ClassCastException var10) {
RLog.e("BaseMessageItemProvider", "bindViewHolder MessageContent cast Exception, e:" + var10);
}
}
super.bindViewHolder(holder, uiMessage, position, list, listener);
}

View File

@ -1,42 +1,37 @@
package com.shayu.onetoone.view;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.RecyclerView;
import com.alibaba.fastjson.JSONObject;
import com.shayu.onetoone.R;
import com.shayu.onetoone.adapter.GiftListAdapter;
import com.shayu.onetoone.bean.GiftBean;
import com.shayu.onetoone.bean.MessageChatGiftContent;
import com.shayu.onetoone.bean.MessageChatTipsContent;
import com.shayu.onetoone.bean.PurseBean;
import com.shayu.onetoone.listener.OnSendMessageListener;
import com.shayu.onetoone.manager.OTONetManager;
import com.shayu.onetoone.manager.SendMessageManager;
import com.shayu.onetoone.widget.PagerConfig;
import com.shayu.onetoone.widget.PagerGridLayoutManager;
import com.shayu.onetoone.widget.PagerGridSnapHelper;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.http.base.HttpCallback;
import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.common.utils.WordUtil;
import java.util.ArrayList;
import java.util.List;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.RecyclerView;
import io.rong.imkit.IMCenter;
import io.rong.imkit.conversation.extension.RongExtension;
import io.rong.imlib.IRongCallback;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.Message;
import io.rong.imlib.model.SendMessageOption;
import kotlinx.coroutines.channels.Send;
public class MsgInputPanelForGift extends AbsInputPanel {
RecyclerView gifList;
@ -102,6 +97,7 @@ public class MsgInputPanelForGift extends AbsInputPanel {
@Override
public void onSuccess(Message message) {
iniPurse();
SendMessageManager.onCallSuccess(token, new OnSendMessageListener() {
@Override
public void onError(int status, String msg) {
@ -121,20 +117,31 @@ public class MsgInputPanelForGift extends AbsInputPanel {
}
private void initData() {
iniPurse();
OTONetManager.getInstance(mContext)
.getGiftList(new HttpCallback<List<GiftBean>>() {
@Override
public void onSuccess(List<GiftBean> data) {
List<GiftBean> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.addAll(data);
}
mAdapter.setList(data);
}
@Override
public void onError(String error) {
}
});
}
private void iniPurse(){
OTONetManager.getInstance(mContext)
.getPurseInfo(new HttpCallback<PurseBean>() {
@Override
public void onSuccess(PurseBean data) {
money.setText(data.getStart() + "");
}
@Override
public void onError(String error) {
}
});
}

View File

@ -6,7 +6,7 @@
android:startColor="#8F7CDF"
android:endColor="#D56FF0"
android:centerColor="#D56FF0"
android:angle="40"
android:angle="45"
/>
<corners android:radius="30dp"></corners>
</shape>

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<gradient
android:startColor="#D9D9D9"
android:endColor="#D9D9D9"
android:centerColor="#D9D9D9"
android:angle="40"
/>
<corners android:radius="30dp"></corners>
</shape>
</item>
</selector>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:background="@drawable/bg_chat_gift"
android:layout_width="130dp"
android:layout_height="90dp">
<TextView
android:id="@+id/tips"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="11dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="8dp"
android:maxWidth="261dp"
android:text="對方邀請您完成真人認證,開通通話權限"
android:textColor="#333333"
android:textSize="12sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn"
android:layout_width="69dp"
android:layout_height="23dp"
android:layout_marginBottom="10dp"
android:background="@drawable/background_8f7cdf"
android:text="去开通"
android:textColor="#FFF"
android:textSize="10sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>