diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/listener/MessageExListenerSingleton.java b/BaseModule/src/main/java/com/xscm/moduleutil/listener/MessageExListenerSingleton.java new file mode 100644 index 00000000..82204896 --- /dev/null +++ b/BaseModule/src/main/java/com/xscm/moduleutil/listener/MessageExListenerSingleton.java @@ -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 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> cachedMessages = new ConcurrentHashMap<>(); + private final Set joinedRooms = ConcurrentHashMap.newKeySet(); + + private OnMsgTaskListener onMsgTaskListener; + + // private boolean listenersAdded = false; // 标记监听器是否已添加 + // 1. 添加新的监听器接口 + public interface PublicScreenMessageListener { + void onPublicScreenMessageReceived(RoomMessageEvent message); + } + + private List 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 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 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 getAndClearCachedMessages(String roomId) { + if (TextUtils.isEmpty(roomId)) { + return new ArrayList<>(); + } + + List 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 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:发送的type;message:发送的内容 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:发送的type;message:发送的内容 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 sendCallback = new V2TIMSendCallback() { + @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); + } +} diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/activity/RoomActivity.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/room/activity/RoomActivity.kt index 28d81d5e..c9194964 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/activity/RoomActivity.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/activity/RoomActivity.kt @@ -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(), } 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() + } } } } @@ -2766,7 +2772,7 @@ class RoomActivity : BaseMvpActivity(), // 执行退出房间逻辑 CommonAppContext.getInstance().isPlaying = false CommonAppContext.getInstance().isShow = false -// QXGiftPlayerManager.getInstance(this).destroyEffectSvga() +// QXGiftPlayerManager.getInstance(this).destroyEffectSvga() AgoraManager.getInstance().cleanup() MyRoomSingleton.getInstance().onExitRoom() @@ -2911,6 +2917,10 @@ class RoomActivity : BaseMvpActivity(), 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 } /** 进入小黑屋将所有的底部隐藏 */ diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/PrivateContacts.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/PrivateContacts.kt index ccb9832d..1363925e 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/PrivateContacts.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/PrivateContacts.kt @@ -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,walletBean: WalletBean?) - fun sendGiftResult(success:Boolean) + fun sendGiftResult(success:Boolean,imageView: ImageView) fun getGiftList(list: List) } @@ -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) diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/ChatRoomFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/ChatRoomFragment.java index 6dc0a616..8e2c122d 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/ChatRoomFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/ChatRoomFragment.java @@ -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 { + // 确保在主线程更新 UI + if (getActivity() != null) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + handleRoomMessage(message); + } + }); + } + }; + MessageExListenerSingleton.getInstance().addPublicScreenMessageListener(messageExListener); + } + /** * 检查并处理缓存的消息 */ diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomPrivateFragment.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomPrivateFragment.kt index bbe5ea79..f4422e03 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomPrivateFragment.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomPrivateFragment.kt @@ -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) { @@ -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 diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/PrivatePresenter.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/PrivatePresenter.kt index 2fb3a20e..a55be2c9 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/PrivatePresenter.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/PrivatePresenter.kt @@ -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() { 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) } }) }