messageEx

This commit is contained in:
2026-01-08 14:09:20 +08:00
parent 26a40f8ffb
commit ac09992b01
6 changed files with 761 additions and 28 deletions

View File

@@ -0,0 +1,704 @@
package com.xscm.moduleutil.listener;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;
import com.blankj.utilcode.util.GsonUtils;
import com.blankj.utilcode.util.LogUtils;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.tencent.imsdk.v2.V2TIMAdvancedMsgListener;
import com.tencent.imsdk.v2.V2TIMCallback;
import com.tencent.imsdk.v2.V2TIMConversationListener;
import com.tencent.imsdk.v2.V2TIMGroupListener;
import com.tencent.imsdk.v2.V2TIMGroupMemberInfo;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;
import com.tencent.imsdk.v2.V2TIMSendCallback;
import com.tencent.imsdk.v2.V2TIMSimpleMsgListener;
import com.tencent.imsdk.v2.V2TIMUserInfo;
import com.xscm.moduleutil.base.CommonAppContext;
import com.xscm.moduleutil.bean.HeadlineBean;
import com.xscm.moduleutil.bean.RoomMessageEvent;
import com.xscm.moduleutil.event.UnreadCountEvent;
import com.xscm.moduleutil.http.RetrofitClient;
import com.xscm.moduleutil.utils.CustomMsgCode;
import com.xscm.moduleutil.utils.SpUtil;
import org.greenrobot.eventbus.EventBus;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
/**
* @author qx
* @data 2025/6/17
* @description: 接收消息
*/
public class MessageExListenerSingleton {
private static boolean isInitialized = false;
private static MessageExListenerSingleton instance;
private List<OnMessageReceivedListener> listeners = new ArrayList<>();
private V2TIMSimpleMsgListener simpleMsgListener;
private V2TIMAdvancedMsgListener v2TIMAdvancedMsgListener;
private static String mRoomId = "";
public static String groupId;
private V2TIMGroupListener groupListener;
private V2TIMConversationListener conversationListener; // 需要保存引用
// 添加操作状态标记
private volatile boolean isGroupOperationInProgress = false;
private final Object groupOperationLock = new Object();
private Handler mainHandler = new Handler(Looper.getMainLooper());
// 添加消息缓存机制
private static final int MAX_CACHED_MESSAGES = 20;
private final Map<String, List<RoomMessageEvent>> cachedMessages = new ConcurrentHashMap<>();
private final Set<String> joinedRooms = ConcurrentHashMap.newKeySet();
private OnMsgTaskListener onMsgTaskListener;
// private boolean listenersAdded = false; // 标记监听器是否已添加
// 1. 添加新的监听器接口
public interface PublicScreenMessageListener {
void onPublicScreenMessageReceived(RoomMessageEvent message);
}
private List<PublicScreenMessageListener> publicScreenListeners = new ArrayList<>();
// 添加监听器 // 替换原有的 addPublicScreenMessageListener 方法
public void addPublicScreenMessageListener(PublicScreenMessageListener listener) {
if (listener == null) {
return;
}
synchronized (publicScreenListeners) {
if (!publicScreenListeners.contains(listener)) {
try {
publicScreenListeners.add(listener);
} catch (Exception e) {
LogUtils.e("MessageListener", "添加 PublicScreenMessageListener 失败: " + e.getMessage());
}
}
}
}
// 同时修改 removePublicScreenMessageListener 方法
public void removePublicScreenMessageListener(PublicScreenMessageListener listener) {
mRoomId = "";
if (listener == null) {
return;
}
synchronized (publicScreenListeners) {
try {
publicScreenListeners.remove(listener);
} catch (Exception e) {
LogUtils.e("MessageListener", "移除 PublicScreenMessageListener 失败: " + e.getMessage());
}
}
}
// 修改 notify 方法以增加保护
private void notifyPublicScreenListeners(RoomMessageEvent message) {
synchronized (publicScreenListeners) {
// 创建副本以避免并发修改异常
List<PublicScreenMessageListener> listenersCopy = new ArrayList<>(publicScreenListeners);
for (PublicScreenMessageListener listener : listenersCopy) {
try {
listener.onPublicScreenMessageReceived(message);
} catch (Exception e) {
LogUtils.e("MessageListener", "通知 PublicScreenMessageListener 失败: " + e.getMessage());
}
}
}
}
private MessageExListenerSingleton() {
if (!isInitialized) {
isInitialized = true;
}
}
public static MessageExListenerSingleton getInstance() {
synchronized (MessageExListenerSingleton.class) {
if (instance == null) {
instance = new MessageExListenerSingleton();
}
return instance;
}
}
/**
* 缓存消息用于在Fragment未准备好时存储消息
*/
private void cacheMessage(String roomId, RoomMessageEvent message) {
if (TextUtils.isEmpty(roomId) || message == null) {
return;
}
// 标记该房间有待处理的消息
List<RoomMessageEvent> roomMessages = cachedMessages.computeIfAbsent(roomId, k -> new ArrayList<>());
// 限制每个房间的缓存消息数量
if (roomMessages.size() >= MAX_CACHED_MESSAGES) {
roomMessages.remove(0); // 移除最旧的消息
}
roomMessages.add(message);
LogUtils.d("MessageListener", "缓存消息: roomId=" + roomId + ", msgType=" + message.getMsgType());
}
/**
* 获取并清除指定房间的缓存消息
*/
public List<RoomMessageEvent> getAndClearCachedMessages(String roomId) {
if (TextUtils.isEmpty(roomId)) {
return new ArrayList<>();
}
List<RoomMessageEvent> messages = cachedMessages.remove(roomId);
if (messages == null) {
messages = new ArrayList<>();
}
LogUtils.d("MessageListener", "获取并清除缓存消息: roomId=" + roomId + ", count=" + messages.size());
return messages;
}
/**
* 标记房间已加入
*/
public void markRoomJoined(String roomId) {
if (!TextUtils.isEmpty(roomId)) {
joinedRooms.add(roomId);
LogUtils.d("MessageListener", "标记房间已加入: " + roomId);
}
}
/**
* 检查房间是否已加入
*/
public boolean isRoomJoined(String roomId) {
return !TextUtils.isEmpty(roomId) && joinedRooms.contains(roomId);
}
/**
* 清除房间加入标记
*/
public void clearRoomJoined(String roomId) {
if (!TextUtils.isEmpty(roomId)) {
joinedRooms.remove(roomId);
LogUtils.d("MessageListener", "清除房间加入标记: " + roomId);
}
}
// 修改 joinGroup 方法,确保先退出再加入
public void joinGroup(String roomId) {
if (TextUtils.isEmpty(roomId)) {
return;
}
if (Objects.equals(mRoomId, roomId))
return;
synchronized (groupOperationLock) {
if (isGroupOperationInProgress) {
// 如果有操作正在进行,延迟执行
mainHandler.removeCallbacksAndMessages(null);
mainHandler.postDelayed(() -> joinGroup(roomId), 100);
return;
}
isGroupOperationInProgress = true;
}
mRoomId = roomId;
new Thread(() -> {
try {
// 先退出当前群组(如果需要)
if (groupId != null && !groupId.equals(roomId)) {
LogUtils.d("MessageListener", "开始退出群组: " + groupId + "____room:" + roomId);
CountDownLatch quitLatch = new CountDownLatch(1);
boolean[] quitSuccess = {false};
try {
V2TIMManager.getInstance().quitGroup("room" + groupId, new V2TIMCallback() {
@Override
public void onSuccess() {
LogUtils.d("MessageListener", "退出群组成功: " + groupId + "____room:" + roomId);
quitSuccess[0] = true;
quitLatch.countDown();
}
@Override
public void onError(int code, String desc) {
LogUtils.e("MessageListener", "退出群组失败: " + groupId + "____room:" + roomId + ", code=" + code + ", desc=" + desc);
quitSuccess[0] = false;
quitLatch.countDown();
}
});
// 等待退出操作完成最多等待3秒
try {
quitLatch.await(3, java.util.concurrent.TimeUnit.SECONDS);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
} catch (Exception e) {
LogUtils.e("MessageListener", "退出群组异常: " + e.getMessage());
}
}
// 加入新群组
LogUtils.d("MessageListener", "开始加入群组: " + roomId);
CountDownLatch joinLatch = new CountDownLatch(1);
boolean[] joinSuccess = {false};
try {
// 确保监听器已添加
ensureListenersAdded();
V2TIMManager.getInstance().joinGroup("room" + roomId, "申请加入", new V2TIMCallback() {
@Override
public void onSuccess() {
LogUtils.d("MessageListener", "加入im群组成功: " + roomId);
joinSuccess[0] = true;
groupId = roomId;
joinLatch.countDown();
// 标记房间已加入
markRoomJoined(roomId);
}
@Override
public void onError(int code, String desc) {
LogUtils.e("MessageListener", "加入群组失败: " + roomId + ", code=" + code + ", desc=" + desc);
joinSuccess[0] = false;
joinLatch.countDown();
}
});
// 等待加入操作完成最多等待3秒
try {
joinLatch.await(3, java.util.concurrent.TimeUnit.SECONDS);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
} catch (Exception e) {
LogUtils.e("MessageListener", "加入群组异常: " + e.getMessage());
}
LogUtils.d("MessageListener", "群组操作完成 - 退出成功: " + (groupId == null || !groupId.equals(roomId)) + ", 加入成功: " + joinSuccess[0]);
} finally {
synchronized (groupOperationLock) {
isGroupOperationInProgress = false;
}
}
}).start();
}
private void initListeners() {
// 简单消息监听器
if (simpleMsgListener == null) {
simpleMsgListener = new V2TIMSimpleMsgListener() {
@Override
public void onRecvC2CTextMessage(String msgID, V2TIMUserInfo sender, String text) {
LogUtils.d("C2C 文本消息 " + sender.getNickName());
}
@Override
public void onRecvC2CCustomMessage(String msgID, V2TIMUserInfo sender, byte[] customData) {
LogUtils.d("C2C 自定义(信令)消息 " + sender.getNickName());
String message = new String(customData, StandardCharsets.UTF_8);
RoomMessageEvent event = GsonUtils.fromJson(message, RoomMessageEvent.class);
if (event.getMsgType() == 130 || event.getMsgType() == 131) {
// EventBus.getDefault().post(event);
RetrofitClient.getInstance().getCpListener().onReceiveMsg(event);
} else if (event.getMsgType() == CustomMsgCode.INSTANCE.getCODE_TASK_APPRENTICE_JOIN_ROOM()) {
if (onMsgTaskListener != null) {
onMsgTaskListener.onMsgTask(event);
}
} else {
notifyMessageReceived(event);
}
}
@Override
public void onRecvGroupTextMessage(String msgID, String groupID, V2TIMGroupMemberInfo sender, String text) {
LogUtils.d("群文本消息:群组 " + groupID + "" + sender.getNickName());
}
@Override
public void onRecvGroupCustomMessage(String msgID, String groupID, V2TIMGroupMemberInfo sender, byte[] customData) {
LogUtils.d("收到群自定义消息:群组 " + groupID + "" + sender.getNickName());
if (!groupID.equals("")) {
String message = new String(customData, StandardCharsets.UTF_8);
RoomMessageEvent event = GsonUtils.fromJson(message, RoomMessageEvent.class);
notifyMessageReceived(event);
LogUtils.d("收到群自定义消息(信令):", message);
} else {
String message = new String(customData, StandardCharsets.UTF_8);
LogUtils.d("收到群自定义消息(信令):", message);
HeadlineBean event = GsonUtils.fromJson(message, HeadlineBean.class);
EventBus.getDefault().post(event);
}
}
};
}
// 高级消息监听器
if (v2TIMAdvancedMsgListener == null) {
v2TIMAdvancedMsgListener = new V2TIMAdvancedMsgListener() {
@Override
public void onRecvNewMessage(V2TIMMessage msg) {
super.onRecvNewMessage(msg);
if (msg.isBroadcastMessage()) {
// 收到了广播消息
String message = new String(msg.getCustomElem().getData(), StandardCharsets.UTF_8);
LogUtils.e("收到广播消息(系统):", message);
}
}
};
}
// 群组监听器
if (groupListener == null) {
groupListener = new V2TIMGroupListener() {
@Override
public void onMemberEnter(String groupID, List<V2TIMGroupMemberInfo> memberList) {
// 有新成员加入群,该群所有的成员都能收到
}
@Override
public void onMemberLeave(String groupID, V2TIMGroupMemberInfo member) {
// 有成员离开群,该群所有的成员都能收到
}
@Override
public void onReceiveRESTCustomData(String groupID, byte[] customData) {
String message = "";
try {
message = new String(customData, StandardCharsets.UTF_8);
LogUtils.e("收到群自定义消息(系统)" + message);
} catch (Exception e) {
// 处理转换过程中可能出现的异常,例如记录日志
LogUtils.e("转换 customData 为 String 时出错:" + e.getMessage());
return; // 退出方法,避免后续代码执行
}
RoomMessageEvent event = null;
try {
// 特殊处理某些消息类型
event = parseSpecialMessageTypes(message);
if (event == null) {
// 使用默认解析
event = GsonUtils.fromJson(message, RoomMessageEvent.class);
}
LogUtils.e("收到群自定义消息:" + mRoomId + "===" + event);
// event = GsonUtils.fromJson(message, RoomMessageEvent.class);
} catch (Exception e) {
// 处理 JSON 解析过程中可能出现的异常,例如记录日志
LogUtils.e("解析 JSON 数据时出错:" + e.getMessage());
return; // 退出方法,避免后续代码执行
}
if (groupID.contains(mRoomId)) {
notifyMessageReceived(event);
}
}
};
}
// 会话监听器
if (conversationListener == null) {
conversationListener = new V2TIMConversationListener() {
@Override
public void onTotalUnreadMessageCountChanged(long totalUnreadCount) {
super.onTotalUnreadMessageCountChanged(totalUnreadCount);
UnreadCountEvent event = CommonAppContext.getInstance().getUnreadCountEvent();
if (event == null) {
event = new UnreadCountEvent();
event.setBLong(0);
}
event.setALong(totalUnreadCount);
CommonAppContext.getInstance().setUnreadCountEvent(event);
EventBus.getDefault().post(event);
}
};
}
}
// 添加所有监听器
private void addAllListeners() {
if (simpleMsgListener != null) {
V2TIMManager.getInstance().addSimpleMsgListener(simpleMsgListener);
}
if (v2TIMAdvancedMsgListener != null) {
V2TIMManager.getMessageManager().addAdvancedMsgListener(v2TIMAdvancedMsgListener);
}
if (groupListener != null) {
V2TIMManager.getInstance().addGroupListener(groupListener);
}
if (conversationListener != null) {
V2TIMManager.getConversationManager().addConversationListener(conversationListener);
}
}
// 移除所有监听器
private static void removeAllListeners() {
if (instance != null) {
if (instance.simpleMsgListener != null) {
V2TIMManager.getInstance().removeSimpleMsgListener(instance.simpleMsgListener);
}
if (instance.v2TIMAdvancedMsgListener != null) {
V2TIMManager.getMessageManager().removeAdvancedMsgListener(instance.v2TIMAdvancedMsgListener);
}
if (instance.groupListener != null) {
V2TIMManager.getInstance().removeGroupListener(instance.groupListener);
}
if (instance.conversationListener != null) {
V2TIMManager.getConversationManager().removeConversationListener(instance.conversationListener);
}
// instance.listenersAdded = false; // 重置标记
}
}
// 修改 quitGroup 方法
public static void quitGroup(String mRoomId) {
V2TIMManager.getInstance().quitGroup("room" + mRoomId, new V2TIMCallback() {
@Override
public void onSuccess() {
LogUtils.d("@@@", "退出群组成功" + mRoomId);
// removeAllListeners(); // 移除所有监听器
}
@Override
public void onError(int code, String desc) {
LogUtils.d("@@@", "退出群组失败" + mRoomId, code, desc);
// removeAllListeners(); // 即使失败也移除监听器
}
});
if (instance != null) {
instance.listeners.clear();
// removeAllListeners();
isInitialized = false;
groupId = null;
LogUtils.e("@@@", "重置成功");
}
}
// 修改 reset 方法
public static void reset(String roomId) {
if (instance != null) {
instance.listeners.clear();
// removeAllListeners();
isInitialized = false;
groupId = null;
// instance = null;
quitGroup(roomId);
LogUtils.e("@@@", "重置成功");
}
}
// 确保监听器已添加
public void ensureListenersAdded() {
initListeners();
addAllListeners();
}
private RoomMessageEvent parseSpecialMessageTypes(String message) {
try {
JsonObject jsonObject = new JsonParser().parse(message).getAsJsonObject();
int msgType = jsonObject.get("MsgType").getAsInt();
if (msgType == 1053) {
return CustomMessageParser.parseMessageType1053(jsonObject);
} else if (msgType == 1054) {
return CustomMessageParser.parseMessageType1054(jsonObject);
}
return null; // 不是特殊类型,使用默认解析
} catch (Exception e) {
LogUtils.e("特殊消息解析失败: " + e.getMessage());
return null;
}
}
public void addOnMessageReceivedListener(OnMessageReceivedListener listener) {
listeners.add(listener);
}
/**
* 移除群组相关的监听器
*/
private static void removeGroupListeners() {
if (instance != null) {
// 移除消息监听器
if (instance.simpleMsgListener != null) {
V2TIMManager.getInstance().removeSimpleMsgListener(instance.simpleMsgListener);
}
if (instance.v2TIMAdvancedMsgListener != null) {
V2TIMManager.getMessageManager().removeAdvancedMsgListener(instance.v2TIMAdvancedMsgListener);
}
// 移除群组监听器
if (instance.groupListener != null) {
V2TIMManager.getInstance().removeGroupListener(instance.groupListener);
}
}
}
public void sendCustomRoomMessage(String roomId, byte[] binaryData) {
// 创建自定义群消息
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createCustomMessage(binaryData);
// v2TIMMessage.setNeedReadReceipt(true);
// 发送消息
V2TIMManager.getMessageManager().sendMessage(
v2TIMMessage,
null,
"room" + roomId,
V2TIMMessage.V2TIM_PRIORITY_NORMAL,
false,
null,
sendCallback
);
}
// TODO: 2025/11/19 添加发送公共方法messageType发送的typemessage发送的内容 userId发送给谁
public void sendCustomC2CMessage(int messageType, String message, String userId) {
RoomMessageEvent.T t = new RoomMessageEvent.T();
t.setFromUserInfo(SpUtil.getUserInfo());
t.setText(message);
RoomMessageEvent roomMessageEvent = new RoomMessageEvent(messageType, mRoomId, t);
String json = GsonUtils.toJson(roomMessageEvent);
// 转换为 byte[]
byte[] binaryData = json.getBytes(StandardCharsets.UTF_8);
// 创建自定义群消息
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createCustomMessage(binaryData);
v2TIMMessage.setExcludedFromUnreadCount(true);
v2TIMMessage.setExcludedFromContentModeration(true);
// v2TIMMessage.setNeedReadReceipt(true);
//
// // 发送消息
V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "u" + userId, null, V2TIMMessage.V2TIM_PRIORITY_HIGH,
true,
null,
sendCallback);
}
// TODO: 2025/11/19 添加发送公共方法messageType发送的typemessage发送的内容 userId发送给谁
public void sendCustomC2CMessage(int messageType, String userId,RoomMessageEvent.T text) {
text.setFromUserInfo(SpUtil.getUserInfo());
LogUtils.e("发送消息", "messageType:" + messageType + "\nuserId:" + userId + "\ntext:" + text,toString());
RoomMessageEvent roomMessageEvent = new RoomMessageEvent(messageType, mRoomId, text);
String json = GsonUtils.toJson(roomMessageEvent);
// 转换为 byte[]
byte[] binaryData = json.getBytes(StandardCharsets.UTF_8);
// 创建自定义群消息
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createCustomMessage(binaryData);
v2TIMMessage.setExcludedFromUnreadCount(true);
v2TIMMessage.setExcludedFromContentModeration(true);
// v2TIMMessage.setNeedReadReceipt(true);
//
// // 发送消息
V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "u" + userId, null, V2TIMMessage.V2TIM_PRIORITY_HIGH,
true,
null,
sendCallback);
}
public void sendCustomC2CMessage125(String userId, byte[] binaryData) {
// 创建自定义群消息
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createCustomMessage(binaryData);
v2TIMMessage.setExcludedFromUnreadCount(true);
v2TIMMessage.setExcludedFromContentModeration(true);
// v2TIMMessage.setNeedReadReceipt(true);
//
// // 发送消息
V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "u" + userId, null, V2TIMMessage.V2TIM_PRIORITY_HIGH,
true,
null,
sendCallback);
}
// RoomFragment.java 中添加
private final V2TIMSendCallback<V2TIMMessage> sendCallback = new V2TIMSendCallback<V2TIMMessage>() {
@Override
public void onProgress(int progress) {
// 可选实现
}
@Override
public void onSuccess(V2TIMMessage message) {
Log.d("MessageSender", "发送成功");
}
@Override
public void onError(int code, String desc) {
Log.e("MessageSender", "发送失败: code=" + code + ", desc=" + desc);
}
};
private void notifyMessageReceived(RoomMessageEvent message) {
// for (OnMessageReceivedListener listener : listeners) {
// listener.onMessageReceived(message);
// }
if ((message.getMsgType() == 1001 || message.getMsgType() == 1080) && publicScreenListeners.isEmpty()) {
cacheMessage(message.getRoomId(), message);
}
// 通知原有的监听器
for (OnMessageReceivedListener listener : listeners) {
listener.onMessageReceived(message);
}
// 通知 PublicScreenEaseChatFragment 监听器
for (PublicScreenMessageListener listener : publicScreenListeners) {
listener.onPublicScreenMessageReceived(message);
}
}
public interface OnMessageReceivedListener {
void onMessageReceived(RoomMessageEvent message);
}
public void setOnMsgTaskListener(OnMsgTaskListener listener) {
this.onMsgTaskListener = listener;
}
public interface OnMsgTaskListener {
void onMsgTask(RoomMessageEvent message);
}
}

View File

@@ -155,6 +155,7 @@ import com.xscm.moduleutil.http.BaseObserver
import com.xscm.moduleutil.http.RetrofitClient
import com.xscm.moduleutil.http.RetrofitClient.TasksMessageListener
import com.xscm.moduleutil.interfaces.OnMusicItemClickListener
import com.xscm.moduleutil.listener.MessageExListenerSingleton
import com.xscm.moduleutil.listener.MessageListenerSingleton
import com.xscm.moduleutil.listener.MessageListenerSingleton.OnMessageReceivedListener
import com.xscm.moduleutil.rtc.AgoraManager
@@ -1580,11 +1581,16 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
} else if (msgType == EMMessageInfo.QXRoomMessageTypeFlirtatious) { //酒吧房撩ta推送的信息
roomFragment?.handleRoomMessage(messageEvent)
} else if (msgType == EMMessageInfo.QXRoomMessageTypeFlirtatiousRoom) {//酒吧房约她进入小黑屋
if (mRoomInfoResp?.user_info?.user_id == messageEvent.text.user_id.toInt() || mRoomInfoResp?.user_info?.user_id == messageEvent.text.meet_user_id.toInt()) {
if (mRoomInfoResp?.user_info?.user_id.toString() == messageEvent.text.user_id
|| mRoomInfoResp?.user_info?.user_id.toString() == messageEvent.text.meet_user_id) {
if (mRoomInfoResp?.user_info?.pit_number !=0) {
MvpPre?.downPit(roomId, mRoomInfoResp?.user_info?.pit_number.toString())
}
MvpPre?.postRoomInfo(messageEvent.text.room_id)
if (publicScreenFragment != null){
MessageExListenerSingleton.getInstance().joinGroup(messageEvent.text.room_id)
publicScreenFragment?.setupExMessageListener()
}
}
}
}
@@ -2911,6 +2917,10 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
if (voive) View.VISIBLE else View.GONE
mBinding!!.clFirstCharge.visibility =
if (voive) View.VISIBLE else View.GONE
mBinding!!.rlMessage.visibility =
if (voive) View.VISIBLE else View.GONE
mBinding!!.rlMai.visibility =
if (voive) View.VISIBLE else View.VISIBLE
}
/** 进入小黑屋将所有的底部隐藏 */

View File

@@ -1,6 +1,8 @@
package com.xscm.modulemain.activity.room.contacts
import android.app.Activity
import android.media.Image
import android.widget.ImageView
import com.xscm.moduleutil.activity.IPresenter
import com.xscm.moduleutil.activity.IView
import com.xscm.moduleutil.bean.GiftBean
@@ -13,7 +15,7 @@ class PrivateContacts {
fun wallet(list:List<String>,walletBean: WalletBean?)
fun sendGiftResult(success:Boolean)
fun sendGiftResult(success:Boolean,imageView: ImageView)
fun getGiftList(list: List<RoonGiftModel>)
}
@@ -23,7 +25,7 @@ class PrivateContacts {
fun getGiftList(roomId: String)
fun sendGift(mRoomId:String,giftId: String,mUserId:String)
fun sendGift(mRoomId:String,giftId: String,mUserId:String,imageView: ImageView)
fun wallet(list:List<String>)

View File

@@ -41,6 +41,7 @@ import com.xscm.moduleutil.bean.room.RoomInfoResp;
import com.xscm.moduleutil.bean.room.RoomUserBean;
import com.xscm.moduleutil.event.RoomJoinMountModel;
import com.xscm.moduleutil.event.RoomTaskEvent;
import com.xscm.moduleutil.listener.MessageExListenerSingleton;
import com.xscm.moduleutil.listener.MessageListenerSingleton;
import com.xscm.moduleutil.rtc.MusicPlayBean;
import com.xscm.moduleutil.utils.SpUtil;
@@ -55,6 +56,8 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import lombok.Setter;
/**
* @author qx
* @data 2025/6/17
@@ -69,6 +72,9 @@ public class ChatRoomFragment extends BaseMvpFragment<ChatRoomPresenter, RoomFra
private EaseChatAdapter easeChatAdapter;
private String roomId;
private MessageListenerSingleton.PublicScreenMessageListener messageListener;
private MessageExListenerSingleton.PublicScreenMessageListener messageExListener;
@Setter
private boolean isPriRoom = false;
// 在需要的地方调用 Activity 的方法
public void someMethod() {
@@ -166,6 +172,25 @@ public class ChatRoomFragment extends BaseMvpFragment<ChatRoomPresenter, RoomFra
}
/**
* 设置消息监听器
*/
public void setupExMessageListener() {
// 创建并添加监听器
messageExListener = message -> {
// 确保在主线程更新 UI
if (getActivity() != null) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
handleRoomMessage(message);
}
});
}
};
MessageExListenerSingleton.getInstance().addPublicScreenMessageListener(messageExListener);
}
/**
* 检查并处理缓存的消息
*/

View File

@@ -22,6 +22,8 @@ import com.xscm.moduleutil.bean.room.RoomCpUserBean
import com.xscm.moduleutil.bean.room.RoomInfoResp
import com.xscm.moduleutil.bean.room.RoomPitBean
import com.xscm.moduleutil.bean.room.RoomUserBean
import com.xscm.moduleutil.listener.MessageExListenerSingleton
import com.xscm.moduleutil.listener.MessageListenerSingleton
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import java.util.concurrent.TimeUnit
@@ -58,11 +60,6 @@ class RoomPrivateFragment(var mRoomInfoResp: RoomInfoResp?) :
private val cpUserBean: RoomCpUserBean? = mRoomInfoResp?.cp_user
private var currSendGiftImageView: ImageView? = null
override fun initData() {
MvpPre?.getGiftList(mRoomId)
}
override fun initView() {
giftViewList.clear()
@@ -75,15 +72,9 @@ class RoomPrivateFragment(var mRoomInfoResp: RoomInfoResp?) :
giftViewList.forEach { it ->
it.setOnClickListener {
val sendGiftUserId =
if (mUserInfo?.user_id!!.toString() == mBinding.rpwv1.pitBean.user_id) {
mBinding.rpwv2.pitBean.user_id
} else {
mBinding.rpwv1.pitBean.user_id
}
MvpPre.sendGift(mRoomId, it.tag.toString(), sendGiftUserId)
val sendGiftUserId = mBinding.rpwv2.pitBean.user_id
MvpPre.sendGift(mRoomId, it.tag.toString(), sendGiftUserId,it as ImageView)
it.visibility = View.INVISIBLE
currSendGiftImageView = it as? ImageView
}
}
@@ -95,7 +86,6 @@ class RoomPrivateFragment(var mRoomInfoResp: RoomInfoResp?) :
}
// 定义两个 RoomPitBean 对象,分别用于显示在 roomMakeWheat1 和 roomMakeWheat2
val selfBean = RoomPitBean() // 自己的 bean
val otherBean = RoomPitBean() // 另一个用户的 bean
@@ -142,8 +132,10 @@ class RoomPrivateFragment(var mRoomInfoResp: RoomInfoResp?) :
countDownTime(cpUserBean.time_day.toLong())
}
}
override fun initData() {
MvpPre?.getGiftList(mRoomId)
}
fun roomInfoUpdate(roomInfoResp: RoomInfoResp) {
@@ -171,10 +163,9 @@ class RoomPrivateFragment(var mRoomInfoResp: RoomInfoResp?) :
}
override fun sendGiftResult(success: Boolean) {
override fun sendGiftResult(success: Boolean,itemImage: ImageView) {
// 随机选择一个礼物
val showList = giftList.shuffled().take(1)
val itemImage = currSendGiftImageView
val price = showList[0].gift_price.toInt()
// 根据价格设置不同的宽高
val (width, height) = when {
@@ -186,18 +177,18 @@ class RoomPrivateFragment(var mRoomInfoResp: RoomInfoResp?) :
val layoutParams = itemImage?.layoutParams
layoutParams?.width = width.dpToPx() // 需要实现dp转px的扩展函数
layoutParams?.height = height.dpToPx()
itemImage?.layoutParams = layoutParams
itemImage.layoutParams = layoutParams
// 假设 padding 值单位dp
val paddingDp = 8
val paddingPx = paddingDp.dpToPx() // 转换为 px
// 设置 padding左、上、右、下
itemImage?.setPadding(paddingPx, paddingPx, paddingPx, paddingPx)
currSendGiftImageView?.tag = showList[0].gift_id
itemImage.setPadding(paddingPx, paddingPx, paddingPx, paddingPx)
itemImage.tag = showList[0].gift_id
Glide.with(itemImage!!)
.load(showList[0].base_image)
.into(itemImage)
currSendGiftImageView?.visibility = View.VISIBLE
itemImage.visibility = View.VISIBLE
}
override fun getGiftList(list: List<RoonGiftModel>) {
@@ -205,7 +196,7 @@ class RoomPrivateFragment(var mRoomInfoResp: RoomInfoResp?) :
giftList = list.toMutableList()
val showList = list.shuffled().take(6)
for (i in 0 until showList.size) {
for (i in showList.indices) {
val itemImage = giftViewList[i]
val price = showList[i].gift_price.toInt()
itemImage.tag = showList[i].gift_id

View File

@@ -1,6 +1,7 @@
package com.xscm.modulemain.activity.room.presenter
import android.content.Context
import android.widget.ImageView
import com.xscm.modulemain.activity.room.contacts.MentorShipContacts
import com.xscm.modulemain.activity.room.contacts.PrivateContacts
import com.xscm.modulemain.activity.room.contacts.PubContacts
@@ -48,7 +49,7 @@ class PrivatePresenter(context: Context, val view: PrivateContacts.View?) :
})
}
override fun sendGift(mRoomId:String,giftId: String,mUserId:String) {
override fun sendGift(mRoomId:String,giftId: String,mUserId:String,imageView: ImageView) {
RetrofitClient.getInstance().roomGift(mRoomId,giftId,"1",mUserId,"1","","","",object : BaseObserver<RoomGiftData>() {
override fun onSubscribe(d: Disposable) {
}
@@ -57,7 +58,7 @@ class PrivatePresenter(context: Context, val view: PrivateContacts.View?) :
if (MvpRef == null) {
MvpRef = WeakReference(view)
}
MvpRef.get()?.sendGiftResult(true)
MvpRef.get()?.sendGiftResult(true,imageView)
}
})
}