From a125d8d9b4ca2fd518ccda4009c6bdc62e7c77dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E5=B0=8F=E6=B1=9F?= <461355754@qq.com> Date: Sat, 22 Nov 2025 18:55:17 +0800 Subject: [PATCH] =?UTF-8?q?1:=E6=B7=BB=E5=8A=A0Cp=E5=8A=A8=E7=94=BB?= =?UTF-8?q?=EF=BC=8C=E9=9C=80=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moduleutil/bean/RoomMessageEvent.java | 2 + .../moduleutil/bean/room/EMMessageInfo.java | 1 + .../activity/room/activity/RoomActivity.kt | 162 +++++++++++++++++- .../room/fragment/ChatRoomFragment.java | 1 + .../activity/room/fragment/RoomFragment.java | 26 +-- .../room/fragment/RoomJukeboxFragment.java | 104 ++++++++++- .../src/main/res/layout/activity_room.xml | 7 + 7 files changed, 271 insertions(+), 32 deletions(-) diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/RoomMessageEvent.java b/BaseModule/src/main/java/com/xscm/moduleutil/bean/RoomMessageEvent.java index c4970a53..82f1440f 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/RoomMessageEvent.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/RoomMessageEvent.java @@ -104,6 +104,8 @@ public class RoomMessageEvent extends BaseEvent { private SingerInfo.SongInfo song_info; private SingerInfo.SongInfo next_song_info; + private String rights_icon;//Cp特效 + } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/EMMessageInfo.java b/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/EMMessageInfo.java index bd2878f5..ac6f5926 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/EMMessageInfo.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/EMMessageInfo.java @@ -132,6 +132,7 @@ public class EMMessageInfo implements MultiItemEntity { ///房间内换麦 public static final int QXRoomMessageTypehm = 1039; + public static final int QXRoomMessageTypeCPText = 1080;//CP特效,进入房间的特效, 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 e92e0e40..1bd41ab0 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 @@ -28,6 +28,7 @@ import android.view.KeyEvent import android.view.LayoutInflater import android.view.MotionEvent import android.view.View +import android.view.View.GONE import android.view.ViewGroup import android.view.WindowManager import android.view.animation.Animation @@ -49,6 +50,7 @@ import com.alibaba.android.arouter.facade.annotation.Autowired import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.launcher.ARouter import com.blankj.utilcode.util.ActivityUtils +import com.blankj.utilcode.util.FileUtils import com.blankj.utilcode.util.GsonUtils import com.blankj.utilcode.util.LogUtils import com.blankj.utilcode.util.ThreadUtils @@ -64,6 +66,9 @@ import com.tencent.imsdk.v2.V2TIMManager import com.tencent.imsdk.v2.V2TIMSDKListener import com.tencent.imsdk.v2.V2TIMUserFullInfo import com.tencent.imsdk.v2.V2TIMValueCallback +import com.tencent.qgame.animplayer.AnimConfig +import com.tencent.qgame.animplayer.AnimView +import com.tencent.qgame.animplayer.inter.IAnimListener import com.xscm.modulemain.BaseMvpActivity import com.xscm.modulemain.R import com.xscm.modulemain.activity.main.activity.MainActivity @@ -102,6 +107,7 @@ import com.xscm.moduleutil.adapter.LikeUserAdapter import com.xscm.moduleutil.base.AppStateListener import com.xscm.moduleutil.base.AppStateManager import com.xscm.moduleutil.base.CommonAppContext +import com.xscm.moduleutil.base.CommonAppContext.post import com.xscm.moduleutil.bean.GiftBean import com.xscm.moduleutil.bean.HeadlineBean import com.xscm.moduleutil.bean.MqttXlhEnd @@ -166,6 +172,7 @@ import com.xscm.moduleutil.utils.SystemUtils import com.xscm.moduleutil.utils.roomview.GiftDisplayManager import com.xscm.moduleutil.widget.CircularProgressView import com.xscm.moduleutil.widget.CustomMusicFloatingView +import com.xscm.moduleutil.widget.GiftAnimView import com.xscm.moduleutil.widget.QXGiftPlayerManager import com.xscm.moduleutil.widget.RoomKtvWheatView import com.xscm.moduleutil.widget.SilentCountDownTimer @@ -177,12 +184,20 @@ import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers +import okhttp3.Call +import okhttp3.Callback +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import pub.devrel.easypermissions.AppSettingsDialog import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks +import java.io.File +import java.io.FileOutputStream +import java.io.IOException import java.lang.ref.WeakReference import java.nio.charset.StandardCharsets import java.util.Arrays @@ -1374,7 +1389,7 @@ class RoomActivity : BaseMvpActivity(), handleMsgType1054(messageEvent, text) } else if (msgType == EMMessageInfo.QXRoomMessageTypeHeartDid) { handleMsgType1055(messageEvent) - } else if (msgType == EMMessageInfo.QXRoomMessageTypeRoomDress) { + } else if (msgType == EMMessageInfo.QXRoomMessageTypeRoomDress) {//用户修改装扮 handleMsgType1035(messageEvent, text) } else if (msgType == EMMessageInfo.QXRoomMessageTypeRoomPKAgreeOrRefuse || msgType == EMMessageInfo.QXRoomMessageTypeRoomPKStart @@ -1473,11 +1488,154 @@ class RoomActivity : BaseMvpActivity(), if (mRoomInfoResp != null && mRoomInfoResp!!.room_info != null) { roomFragment!!.handleRoomMessage(messageEvent) } + }else if(msgType == EMMessageInfo.QXRoomMessageTypeCPText){ + if(messageEvent.text.rights_icon.isNotEmpty()){ + mBinding?.roomCpView?.fl!!.visibility = View.VISIBLE + ImageUtils.loadHead(messageEvent.text.fromUserInfo.avatar, mBinding?.roomCpView?.roomCpHead1) + mBinding?.roomCpView?.roomCpName1?.text = messageEvent.text.fromUserInfo.nickname + mBinding?.roomCpView?.roomCpName2?.text = messageEvent.text.toUserInfo.nickname + ImageUtils.loadHead(messageEvent.text.toUserInfo.avatar, mBinding?.roomCpView?.roomCpHead2) + playVap(messageEvent.text.rights_icon, mBinding?.roomCpView?.animCp!!, true) + } } } + fun playVap(url: String, animView: AnimView, isTxk: Boolean) { + + if (!FileUtils.isFileExists(this.cacheDir.absolutePath + url.substring(url.lastIndexOf("/")))) { + LogUtils.e("无缓存") + + downloadAndPlay(this, url, object : GiftAnimView.DownloadCallback { + override fun onSuccess(file: File) { + post(Runnable { + animView.startPlay(file) + }) + } + + override fun onFailure(e: java.lang.Exception) { + LogUtils.e("MP4下载或播放失败: " + e.message) + } + }) + } else { + LogUtils.e("有缓存") + if (isTxk) { + animView.setLoop(20) + } + animView.startPlay( + File(this.cacheDir.absolutePath + url.substring(url.lastIndexOf("/"))) + ) + } + //情侣特效播放回调 + mBinding?.roomCpView?.animCp?.setAnimListener(object : IAnimListener { + override fun onFailed(errorType: Int, errorMsg: String?) { + } + + override fun onVideoComplete() { + runOnUiThread { + //播放结束后隐藏 + mBinding?.roomCpView?.fl.let { view -> + if (view?.visibility == View.VISIBLE) { + // 你的代码 + view?.visibility = GONE + } + } + } + } + + override fun onVideoDestroy() { + } + + override fun onVideoRender(frameIndex: Int, config: AnimConfig?) { + } + + override fun onVideoStart() { + } + + }) + } + fun downloadAndPlay( + context: Context, + playImage: String, + callback: GiftAnimView.DownloadCallback? + ) { + + val filePath = context.cacheDir.absolutePath + playImage.substring(playImage.lastIndexOf("/")) + val file = File(filePath) + + if (!FileUtils.isFileExists(this.cacheDir.absolutePath + playImage.substring(playImage.lastIndexOf("/")))) { + LogUtils.e("无缓存") + // 使用OkHttp进行下载 + val client = OkHttpClient() + val request = Request.Builder() + .url(playImage) + .build() + + client.newCall(request).enqueue(object : Callback { + override fun onFailure(call: Call, e: IOException) { + LogUtils.e("MP4下载失败: " + e.toString()) + // 在主线程中回调失败 + post(Runnable { + if (callback != null) { + callback.onFailure(e) + } + }) + } + + @Throws(IOException::class) + override fun onResponse(call: Call, response: Response) { + if (response.isSuccessful()) { + try { + response.body().use { responseBody -> + if (responseBody != null) { + val downloadedFile = File(filePath) + val fos = FileOutputStream(downloadedFile) + fos.write(responseBody.bytes()) + fos.close() + + // 在主线程中回调成功 + post(Runnable { + if (callback != null) { + callback.onSuccess(downloadedFile) + } + }) + } else { + // 在主线程中回调失败 + post(Runnable { + if (callback != null) { + callback.onFailure(IOException("Response body is null")) + } + }) + } + } + } catch (e: java.lang.Exception) { + LogUtils.e("MP4文件保存失败: " + e.message) + // 在主线程中回调失败 + post(Runnable { + if (callback != null) { + callback.onFailure(e) + } + }) + } + } else { + LogUtils.e("MP4下载响应失败") + // 在主线程中回调失败 + post(Runnable { + if (callback != null) { + callback.onFailure(IOException("Response not successful: " + response.code())) + } + }) + } + } + }) + } else { + // 文件已存在,直接回调成功 + if (callback != null) { + callback.onSuccess(file) + } + } + } private var endTime: Long = 0 private fun xlhDjs(endTimeStr: String?) { @@ -2093,7 +2251,7 @@ class RoomActivity : BaseMvpActivity(), val typeId = mRoomInfoResp!!.room_info.type_id if ("2" == typeId) { roomFragment!!.handleRoomMessage(messageEvent) - } else if ("1" == typeId || "4" == typeId || "3" == typeId || "8" == typeId) { + } else if ("1" == typeId || "4" == typeId || "3" == typeId || "8" == typeId || "9" == typeId) { val labelId = mRoomInfoResp!!.room_info.label_id if ("2" == labelId) { roomFragment!!.handleRoomMessage(messageEvent) 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 ced044ac..7d78d3f7 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 @@ -547,6 +547,7 @@ public class ChatRoomFragment extends BaseMvpFragment dataList = adapter.getData(); + + if (mBinding.wvZc.getUserId().equals(message.getText().getFromUserInfo().getUser_id() + "")) { + RoomPitBean roomPitBean = mBinding.wvZc.pitBean; + roomPitBean.setNickname(message.getText().getFromUserInfo().getNickname()); + roomPitBean.setDress(message.getText().getFromUserInfo().getDress()); + roomPitBean.setAvatar(message.getText().getFromUserInfo().getAvatar()); + mBinding.wvZc.setData(roomPitBean); + } + + for (int i = 0; i < dataList.size(); i++) { + RoomPitBean roomPitBean2 = dataList.get(i); + if (roomPitBean2.getUser_id().equals(message.getText().getFromUserInfo().getUser_id() + "")) { + dataList.set(i, roomPitBean); + adapter.notifyItemChanged(i); + } + } + } + + public void event1021(RoomMessageEvent messageEvent) { + if (mBinding.wvZc.pitBean != null) { + mBinding.wvZc.setCharm("0"); + } + + List dataList = adapter.getData(); + for (int i = 0; i < dataList.size(); i++) { + RoomPitBean roomPitBean2 = dataList.get(i); + roomPitBean2.setCharm("0"); + adapter.notifyItemChanged(adapter.getData().indexOf(roomPitBean2)); + } + } + + /// 1005 + public void event1005(RoomMessageEvent message) { + // 检查是否有多个用户信息 + if (message.getText().getToUserInfos() != null && !message.getText().getToUserInfos().isEmpty()) { + // 处理多个用户的情况 + for (UserInfo userOnlineStatusBean : message.getText().getToUserInfos()) { + updateCharmForUser(userOnlineStatusBean); + } + } else { + // 处理单个用户的情况 + UserInfo toUserInfo = message.getText().getToUserInfo(); + if (toUserInfo != null) { + updateCharmForUser(toUserInfo); + } + } + } + + /** + * 更新单个用户的魅力值 + * + * @param userInfo 用户信息 + */ + private void updateCharmForUser(UserInfo userInfo) { + String userId = String.valueOf(userInfo.getUser_id()); + String charm = userInfo.getCharm(); + if (mBinding.wvZc.getUserId()!=null && mBinding.wvZc.getUserId().equals(userId)) { + mBinding.wvZc.setCharm(charm); + } + // 更新麦位列表中的魅力值 + for (RoomPitBean pitBean : adapter.getData()) { + if (pitBean.getUser_id().equals(userId)) + pitBean.setCharm(charm); + adapter.notifyItemChanged(adapter.getData().indexOf(pitBean)); + } + } + + // TODO: 2025/11/22 清除个人魅力 + public void event1059(RoomMessageEvent message) { + + String userId = message.getText().getUser_id(); + if (mBinding.wvZc.getUserId()!=null &&mBinding.wvZc.getUserId().equals(userId)) { + mBinding.wvZc.setCharm("0"); + } + List dataList = adapter.getData(); + for (int i = 0; i < dataList.size(); i++) { + RoomPitBean roomPitBean2 = dataList.get(i); + if (roomPitBean2.getUser_id().equals(userId)) + roomPitBean2.setCharm("0"); + adapter.notifyItemChanged(adapter.getData().indexOf(roomPitBean2)); + } + } } \ No newline at end of file diff --git a/MainModule/src/main/res/layout/activity_room.xml b/MainModule/src/main/res/layout/activity_room.xml index e5f014ea..493dda89 100644 --- a/MainModule/src/main/res/layout/activity_room.xml +++ b/MainModule/src/main/res/layout/activity_room.xml @@ -143,6 +143,13 @@ android:elevation="2dp" app:layout_constraintTop_toTopOf="parent" /> + +