From dce8b08a3fec5e412b025f84936b5f9e3784729d Mon Sep 17 00:00:00 2001 From: lzl <1239365383@qq.com> Date: Fri, 28 Nov 2025 09:00:38 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AD=BE=E7=BA=A6=E4=B8=8A=E4=B8=8B=E9=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/room/activity/RoomActivity.kt | 15 +- .../room/contacts/MentorShipContacts.kt | 4 + .../activity/room/fragment/RoomFragment.java | 16 +- .../room/fragment/RoomMentorShipFragment.kt | 229 +++++++++++++++++- .../room/presenter/MentorShipPresenter.kt | 45 +++- .../user/presenter/HeartCpPresenter.kt | 2 +- .../widget/RoomMentorShipWheatView.kt | 175 +++++++------ .../main/res/layout/fragment_mentor_ship.xml | 112 ++++++--- .../layout/layout_room_mentorship_wheat.xml | 18 +- MainModule/src/main/res/layout/popup_menu.xml | 41 ++-- 10 files changed, 511 insertions(+), 146 deletions(-) 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 a26978dd..cdab4b0c 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 @@ -1789,7 +1789,14 @@ class RoomActivity : BaseMvpActivity(), roomFragment?.handleRoomMessage(messageEvent) } - + RoomType.SIGN_CONTRACT -> { + mRoomInfoResp?.room_info?.pit_list!![pitNumber.toInt() - 1] = + getPitBean(messageEvent, 1) + roomFragment?.upRoomInfo(mRoomInfoResp) + mBinding!!.rlMore.visibility = View.GONE + mBinding!!.rlMisc.visibility = View.GONE + roomFragment?.handleRoomMessage(messageEvent) + } else -> { roomFragment!!.updateSeatViewExchangedWithPitArray(mRoomInfoResp) } @@ -1872,6 +1879,12 @@ class RoomActivity : BaseMvpActivity(), roomFragment!!.upRoomInfoData(mRoomInfoResp) roomFragment!!.handleRoomMessage(messageEvent) } + RoomType.SIGN_CONTRACT -> { + mRoomInfoResp?.room_info?.pit_list!![pitNumber.toInt() - 1] = RoomPitBean(pitNumber) + + roomFragment!!.upRoomInfoData(mRoomInfoResp) + roomFragment!!.handleRoomMessage(messageEvent) + } else -> { roomFragment!!.updateSeatViewExchangedWithPitArray(mRoomInfoResp) diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/MentorShipContacts.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/MentorShipContacts.kt index 8309d62d..ef98626a 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/MentorShipContacts.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/MentorShipContacts.kt @@ -11,6 +11,10 @@ class MentorShipContacts { } interface Ipre : IPresenter{ + fun applyPit(roomId:String,pitNumber:String) + fun setMutePit(roomId:String,pitNumber:String,isMute:String) + + fun setLockPit(roomId:String,pitNumber:String,isLock:String) } } \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomFragment.java index fa5283a1..bf8875a2 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomFragment.java @@ -922,7 +922,21 @@ public class RoomFragment extends BaseMvpFragment(), MentorShipContacts.View { companion object { @@ -24,9 +38,17 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp) : INSTANCE ?: RoomMentorShipFragment(roomInfoResp).also { INSTANCE = it } } } - } + + private var viewList: MutableList = mutableListOf() + private val indexList: MutableList = mutableListOf("9", "1", "2", "3", "4", "5") + private var popupWindow: PopupWindow? = null + + private var pitBean: RoomPitBean? = null + private var roomId: String = mRoomInfo?.room_info?.room_id!! + + override fun getLayoutId(): Int { return R.layout.fragment_mentor_ship } @@ -35,16 +57,217 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp) : return MentorShipPresenter(ActivityUtils.getTopActivity(), this) } - override fun initData() { } override fun initView() { + initPopupWindow() + + viewList.add(mBinding.rmsw1) + viewList.add(mBinding.rmswMidd) + viewList.add(mBinding.rmswLeft) + viewList.add(mBinding.rmswRightLeft) + viewList.add(mBinding.rmswRightMidd) + viewList.add(mBinding.rmswRightRight) + + for ((idx, view) in viewList.withIndex()) { + if (mRoomInfo?.room_info?.pit_list!!.size > indexList[idx].toInt() - 1) { + view.setRoomWheatNumber(indexList[idx]) + view.setData(mRoomInfo?.room_info?.pit_list!![indexList[idx].toInt() - 1]) + view.setOnClickListener { v -> + if (ClickUtils.isFastDoubleClick(v)) { + return@setOnClickListener + } + + if (!view.getUserId().equals("") && !view.getUserId().equals("0")) { + RoomUserInfoFragment.show( + mRoomInfo?.room_info?.room_id, + view.getUserId(), + view.pitNumber, + getHostUser(), + false, + 2, + isNumberWhether(), + childFragmentManager + ) + } else { + if (getHostUser() == 4) { + MvpPre!!.applyPit(mRoomInfo?.room_info?.room_id!!, "") + } else { + when (indexList[idx]) { + "9" -> { + MvpPre.applyPit(mRoomInfo?.room_info?.room_id!!, "9") + } + + "2" -> { + + } + + "1", "3", "4", "5" -> { + pitBean = + mRoomInfo?.room_info?.pit_list!![indexList[idx].toInt() - 1] + + showPopupMenu(view) + } + } + } + } + } + } + } } fun roomInfoUpdate(mRoomInfoResp: RoomInfoResp) { mRoomInfo = mRoomInfoResp } + private fun setPitData() { + + } + + + fun event1003(messageEvent: RoomMessageEvent) { + val fromUserInfo = messageEvent.text.fromUserInfo ?: return + + val pitNumber = messageEvent.text.pit_number + val userId = fromUserInfo.user_id + + if (indexList.contains(pitNumber)) { + val viewPos = indexList.indexOf(pitNumber) + viewList[viewPos].setData(mRoomInfo?.room_info?.pit_list!![pitNumber.toInt() - 1]) + } + + + } + + fun event1004(messageEvent: RoomMessageEvent) { + val fromUserInfo = messageEvent.text.fromUserInfo ?: return + + val pitNumber = messageEvent.text.pit_number + val userId = fromUserInfo.user_id + + if (indexList.contains(pitNumber)) { + val viewPos = indexList.indexOf(pitNumber) + viewList[viewPos].setData(mRoomInfo?.room_info?.pit_list!![pitNumber.toInt() - 1]) + + + } + } + + fun event1035(messageEvent: RoomMessageEvent) { + + } + + fun event1039(messageEvent: RoomMessageEvent) { + + } + + + private fun initPopupWindow() { + // 加载弹出视图布局 + val popupView = LayoutInflater.from(context).inflate(R.layout.popup_menu, null, false) + + // 创建 PopupWindow + val displayMetrics = resources.displayMetrics + // 设置固定宽高(单位是像素) + val screenWidth = displayMetrics.widthPixels + val screenHeight = displayMetrics.heightPixels + + val popupWidth = (screenWidth * 0.25).toInt() // 屏幕宽度的 60% + val popupHeight = (screenHeight * 0.13).toInt() // 屏幕高度的 40% + + popupWindow = PopupWindow(popupView, popupWidth, popupHeight, true) + + // 必须设置背景,否则布局会压缩 + popupWindow?.setBackgroundDrawable(resources.getDrawable(com.xscm.moduleutil.R.drawable.bg_r16_fff)) + + // 设置动画效果(可选) + popupWindow?.animationStyle = com.xscm.moduleutil.R.style.PopupAnimation + + // 设置点击外部区域时自动关闭 + popupWindow?.isOutsideTouchable = true + popupWindow?.isFocusable = true + + // 设置弹出视图中的点击事件 + setPopupMenuClickListener(popupView, null) + } + + private fun showPopupMenu(anchorView: View) { + if (popupWindow != null && !popupWindow?.isShowing!!) { + // 获取锚点视图的坐标 + val location = IntArray(2) + anchorView.getLocationOnScreen(location) + + // 设置弹出位置 + popupWindow?.showAtLocation( + anchorView, Gravity.NO_GRAVITY, + location[0], location[1] + anchorView.height + ) + + popupWindow?.contentView?.let { setPopupMenuClickListener(it, anchorView) } + } + } + + @SuppressLint("UseSwitchCompatOrMaterialCode") + private fun setPopupMenuClickListener(popupView: View, view: View?) { + val tvHugMic = popupView.findViewById(R.id.tv_hug_mic) + val switchCloseMic = popupView.findViewById(R.id.sw_close_mic) + val switchLockMic = popupView.findViewById(R.id.sw_lock_mic) + if (view != null) { + switchCloseMic.isChecked = pitBean?.is_mute == 1 //是否禁麦 + switchLockMic.isChecked = pitBean?.is_lock == 1 //是否闭麦 + } + switchCloseMic.setOnCheckedChangeListener { compoundButton, b -> + MvpPre.setMutePit( + roomId, + pitBean?.pit_number!!, + if (b) "2" else "4" + ) + } + + + switchLockMic.setOnCheckedChangeListener { compoundButton, b -> + MvpPre.setLockPit( + roomId, + pitBean?.pit_number!!, + if (b) "1" else "0" + ) + } + + + tvHugMic.setOnClickListener { v: View? -> + // 处理抱麦逻辑 + RoomOnlineDialogFragment.show( + roomId, pitBean?.pit_number, mRoomInfo?.user_info, mRoomInfo, + childFragmentManager + ) + popupWindow!!.dismiss() + } + } + + + private fun getHostUser(): Int { + return if (mRoomInfo?.user_info?.is_room_owner == 1) { + 1 + } else if (mRoomInfo?.user_info?.is_management == 1) { + 2 + } else if (mRoomInfo?.user_info?.is_host == 1) { + 3 + } else { + 4 + } + } + + private fun isNumberWhether(): Int { + if (mRoomInfo?.user_info?.pit_number == 9) { + return 1 + } + return 0 + } + + override fun onDestroyView() { + super.onDestroyView() + viewList.clear() + } } \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/MentorShipPresenter.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/MentorShipPresenter.kt index 42914554..5e7843ac 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/MentorShipPresenter.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/MentorShipPresenter.kt @@ -1,10 +1,53 @@ package com.xscm.modulemain.activity.room.presenter import android.content.Context +import com.xscm.modulemain.activity.room.contacts.JukeboxContacts import com.xscm.modulemain.activity.room.contacts.MentorShipContacts +import com.xscm.moduleutil.http.BaseObserver +import com.xscm.moduleutil.http.RetrofitClient import com.xscm.moduleutil.presenter.BasePresenter +import io.reactivex.disposables.Disposable +import java.lang.ref.WeakReference -class MentorShipPresenter(context: Context, view: MentorShipContacts.View) : + +class MentorShipPresenter(context: Context, val view: MentorShipContacts.View) : BasePresenter(view, context), MentorShipContacts.Ipre { + override fun applyPit(roomId: String, pitNumber: String) { + RetrofitClient.getInstance().applyPit(roomId, pitNumber, object : BaseObserver() { + override fun onSubscribe(d: Disposable) { + addDisposable(d) + } + + override fun onNext(s: String) { + + } + }) + } + + override fun setMutePit(roomId: String, pitNumber: String, isMute: String) { + RetrofitClient.getInstance() + .setMutePit(roomId, pitNumber, isMute, object : BaseObserver() { + override fun onSubscribe(d: Disposable) { + addDisposable(d) + } + + override fun onNext(string: String) { + + } + }) + } + + override fun setLockPit(roomId: String, pitNumber: String, isLock: String) { + RetrofitClient.getInstance() + .setLockPit(roomId, pitNumber, isLock, object : BaseObserver() { + override fun onSubscribe(d: Disposable) { + addDisposable(d) + } + + override fun onNext(string: String) { + + } + }) + } } \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/presenter/HeartCpPresenter.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/user/presenter/HeartCpPresenter.kt index 681876c3..b4cd0254 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/presenter/HeartCpPresenter.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/presenter/HeartCpPresenter.kt @@ -8,7 +8,7 @@ import com.xscm.moduleutil.presenter.BasePresenter import io.reactivex.disposables.Disposable import java.lang.ref.WeakReference -class HeartCpPresenter(view: HeartCpContact.View, context: Context) : +class HeartCpPresenter(val view: HeartCpContact.View, context: Context) : BasePresenter(view, context), HeartCpContact.IPre { override fun getHeartCpData(userId: Int) { api.getCpRoom(userId.toString(), object : BaseObserver() { diff --git a/MainModule/src/main/java/com/xscm/modulemain/widget/RoomMentorShipWheatView.kt b/MainModule/src/main/java/com/xscm/modulemain/widget/RoomMentorShipWheatView.kt index d31f676f..29d1908d 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/widget/RoomMentorShipWheatView.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/widget/RoomMentorShipWheatView.kt @@ -4,89 +4,30 @@ import android.content.Context import android.content.res.TypedArray import android.text.TextUtils import android.util.AttributeSet +import android.widget.ImageView import com.xscm.modulemain.R import com.xscm.moduleutil.bean.room.RoomPitBean import com.xscm.moduleutil.utils.ImageUtils import com.xscm.moduleutil.widget.BaseWheatView -class RoomMentorShipWheatView(context: Context?) : BaseWheatView(context) { +class RoomMentorShipWheatView : BaseWheatView { + private var iv_tag_type: ImageView? = null - constructor(context: Context?, attrs: AttributeSet?) : this(context) { - initPit(context, attrs) - } + constructor(context: Context?) : super(context) - override fun getLayoutId(): Int { - return R.layout.layout_room_mentorship_wheat - } - - // 提供一个方法来设置这个属性,便于在代码中动态更改 - fun setRoomWheatNumber(number: String?) { - this.pitNumber = number - } - - override fun setPitData(bean: RoomPitBean?) { - if (bean == null) return - - pitBean = bean // 统一使用参数 bean - stopAndClearAnimation() // 清理之前的动画资源 - - if (isOn) { - handleOnState(bean) - } else { - handleOffState(bean) - } - } - - private fun stopAndClearAnimation() { - if (mIvRipple != null) { - mIvRipple.stopAnimation(true) - } - } + constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) - private fun handleOnState(bean: RoomPitBean) { - mIvRipple.visibility = VISIBLE - mTvName.visibility = VISIBLE - mTvName.text = bean.nickname - ImageUtils.loadHeadCC(bean.avatar, mRiv) - mCharmView.visibility = VISIBLE - if (TextUtils.isEmpty(bean.dress)) { - mIvFrame.stopAll() - mIvFrame.visibility = INVISIBLE - } else { - mIvFrame.visibility = VISIBLE - mIvFrame.setSource(bean.dress, 3) - } - } + constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr + ) - private fun handleOffState(bean: RoomPitBean) { - if (bean.pit_number == "9") { - mTvName.visibility = GONE - } else { - mTvName.visibility = VISIBLE - mTvName.setText(getPitNumberText()) - } - mCharmView.visibility = GONE - mRiv.visibility = VISIBLE - mRiv.setImageResource(R.mipmap.jukebox_room_mask) - mIvShutup.visibility = GONE - mIvFrame.stopAll() - mIvFrame.visibility = GONE - mIvRipple.visibility = GONE - } - - - private fun getPitNumberText(): String { - if ("-1" == pitNumber) return "" - if ("9" == pitNumber) return "" - if ("10" == pitNumber) return "老板" - return pitNumber + "号麦" - } - - override fun initPit(context: Context?, attrs: AttributeSet?) { + override fun initPit(context: Context, attrs: AttributeSet) { var typedArray: TypedArray? = null try { - typedArray = context!!.obtainStyledAttributes( + typedArray = context.obtainStyledAttributes( attrs, com.xscm.moduleutil.R.styleable.RoomDefaultWheatView ) @@ -101,26 +42,104 @@ class RoomMentorShipWheatView(context: Context?) : BaseWheatView(context) { mIvFrame = findViewById(R.id.iv_frame) mIvShutup = findViewById(R.id.iv_shutup) mRiv = findViewById(R.id.riv) + iv_tag_type = findViewById(R.id.iv_tag_type) } - override fun onRemoteSoundLevelUpdate(userId: String?, soundLevel: Int) { + override fun getLayoutId(): Int { + return R.layout.layout_room_mentorship_wheat + } + // 提供一个方法来设置这个属性,便于在代码中动态更改 + fun setRoomWheatNumber(number: String?) { + this.pitNumber = number + } + + public override fun setPitData(bean: RoomPitBean) { + pitBean = bean // 统一使用参数 bean + stopAndClearAnimation() // 清理之前的动画资源 + + if (pitBean.pit_number == "9" || pitBean.pit_number == "1") { + mCharmView.visibility = VISIBLE + }else{ + mCharmView.visibility = INVISIBLE + } + + if (isOn) { + handleOnState(bean) + } else { + handleOffState(bean) + } + + iv_tag_type!!.visibility = if (bean.isImageType) VISIBLE else GONE + iv_tag_type!!.setImageResource(com.xscm.moduleutil.R.mipmap.mu_yc) + } + + fun setSex(value: String?, format: Boolean) { + mCharmView.setSex("", "", value, format) + } + + fun setImageType(b: Boolean) { + if (b) { + iv_tag_type!!.visibility = VISIBLE + } else iv_tag_type!!.visibility = GONE + } + + private fun handleOnState(bean: RoomPitBean) { + mIvRipple.visibility = VISIBLE + mTvName.visibility = VISIBLE + mTvName.text = bean.nickname + ImageUtils.loadHeadCC(bean.avatar, mRiv) + mCharmView.visibility = VISIBLE + + if (TextUtils.isEmpty(bean.dress)) { + mIvFrame.stopAll() + mIvFrame.visibility = INVISIBLE + } else { + mIvFrame.visibility = VISIBLE + mIvFrame.setSource(bean.dress, 3) + } + } + + private val pitNumberText: String + get() { + return "虚位以待" + } + + private fun handleOffState(bean: RoomPitBean) { + mTvName.text = pitNumberText + mCharmView.visibility = GONE + mRiv.visibility = VISIBLE + mRiv.setImageResource(com.xscm.moduleutil.R.mipmap.room_ic_wheat_default) + mIvShutup.visibility = GONE + iv_tag_type!!.visibility = GONE + // ImageUtils.loadRes(com.xscm.moduleutil.R.mipmap.room_microphone_off, mIvShutup); + mIvFrame.stopAll() + mIvFrame.visibility = GONE + mIvRipple.visibility = GONE + } + + private fun stopAndClearAnimation() { + if (mIvRipple != null) { +// mIvRipple.stopAnimation(); + mIvRipple.stopAnimation(true) + // 清理SVGA资源,避免内存泄漏 +// mIvRipple.clear(); + } + } + + + override fun onRemoteSoundLevelUpdate(userId: String, soundLevel: Int) { } override fun onLocalSoundLevelUpdate(volume: Int) { - } override fun userJoined(userId: Int, elapsd: Int) { - } override fun userOffline(userId: Int, reason: Int) { - } override fun pkOffSide(userId: Int) { - } - -} \ No newline at end of file +} diff --git a/MainModule/src/main/res/layout/fragment_mentor_ship.xml b/MainModule/src/main/res/layout/fragment_mentor_ship.xml index 5c22cfee..7421d722 100644 --- a/MainModule/src/main/res/layout/fragment_mentor_ship.xml +++ b/MainModule/src/main/res/layout/fragment_mentor_ship.xml @@ -89,7 +89,7 @@ android:layout_width="@dimen/dp_36" android:layout_height="0dp" android:layout_marginStart="@dimen/dp_10" - app:layout_constraintDimensionRatio="1:1.4.4" + app:layout_constraintDimensionRatio="1:1.4" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/gl_top" /> @@ -207,7 +207,7 @@ android:layout_width="@dimen/dp_50" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="@id/fly_bottom" - app:layout_constraintDimensionRatio="1:1.4" + app:layout_constraintDimensionRatio="1:1.2" app:layout_constraintEnd_toEndOf="@id/iv_left_bg" app:layout_constraintStart_toStartOf="@id/iv_left_bg" app:layout_constraintTop_toTopOf="@id/fly_bottom" /> @@ -220,46 +220,82 @@ app:layout_constraintGuide_percent="0.86" /> - + app:layout_constraintEnd_toEndOf="parent" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + - - + + + + + + + + + + + + - \ No newline at end of file diff --git a/MainModule/src/main/res/layout/layout_room_mentorship_wheat.xml b/MainModule/src/main/res/layout/layout_room_mentorship_wheat.xml index 52e886f8..67805d11 100644 --- a/MainModule/src/main/res/layout/layout_room_mentorship_wheat.xml +++ b/MainModule/src/main/res/layout/layout_room_mentorship_wheat.xml @@ -17,7 +17,7 @@ @@ -148,6 +148,18 @@ app:layout_constraintHeight_percent="0.2" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/gl_center" /> + + + diff --git a/MainModule/src/main/res/layout/popup_menu.xml b/MainModule/src/main/res/layout/popup_menu.xml index f9d03cdc..fcefebfb 100644 --- a/MainModule/src/main/res/layout/popup_menu.xml +++ b/MainModule/src/main/res/layout/popup_menu.xml @@ -1,24 +1,24 @@ + android:padding="@dimen/dp_10" + android:orientation="vertical"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + tools:ignore="UseSwitchCompatOrMaterialXml" /> + app:layout_constraintTop_toBottomOf="@+id/tv_close_mic" /> + app:layout_constraintTop_toBottomOf="@+id/tv_lock_mic" />