DoggyZhang 2 недель назад
Родитель
Сommit
b998b17a0e
18 измененных файлов с 144 добавлено и 30 удалено
  1. 18 11
      app/src/main/java/com/adealink/weparty/module/room/chat/data/Message.kt
  2. 1 0
      app/src/main/res/values/strings.xml
  3. 3 1
      frame/room/src/main/java/com/adealink/frame/room/data/RoomFlowData.kt
  4. 0 1
      module/profile/src/main/res/layout/activity_user_search.xml
  5. 1 1
      module/profile/src/main/res/layout/fragment_search_room.xml
  6. 6 3
      module/room/src/main/java/com/adealink/weparty/room/applymic/ApplyMicListDialog.kt
  7. 5 0
      module/room/src/main/java/com/adealink/weparty/room/applymic/HostApplyListFragment.kt
  8. 8 1
      module/room/src/main/java/com/adealink/weparty/room/applymic/viewmodel/ApplyMicViewModel.kt
  9. 2 2
      module/room/src/main/java/com/adealink/weparty/room/chat/viewmodel/ChatMessageViewModel.kt
  10. 1 0
      module/room/src/main/java/com/adealink/weparty/room/chatroom/page/dispatchcenter/DispatchCenterRoomInfoFragment.kt
  11. 4 1
      module/room/src/main/java/com/adealink/weparty/room/data/RoomData.kt
  12. 4 0
      module/room/src/main/java/com/adealink/weparty/room/invite/InviteMicDialog.kt
  13. 7 1
      module/room/src/main/java/com/adealink/weparty/room/invite/viewmodel/InviteViewModel.kt
  14. 27 4
      module/room/src/main/java/com/adealink/weparty/room/micseat/dispatcenter/DispatchCenterSeatsTemplate.kt
  15. 27 0
      module/room/src/main/java/com/adealink/weparty/room/sdk/controller/impl/JoinController.kt
  16. 5 1
      module/room/src/main/java/com/adealink/weparty/room/sdk/controller/impl/MessageController.kt
  17. 22 3
      module/room/src/main/java/com/adealink/weparty/room/setting/RoomSettingDialog.kt
  18. 3 0
      module/room/src/main/res/values/strings.xml

+ 18 - 11
app/src/main/java/com/adealink/weparty/module/room/chat/data/Message.kt

@@ -6,29 +6,36 @@ import com.adealink.weparty.module.room.chat.livemessage.ILiveMessage
 import io.trtc.tuikit.atomicxcore.api.barrage.Barrage
 import io.trtc.tuikit.atomicxcore.api.barrage.BarrageType
 
+const val MESSAGE_TYPE = "type"
+
+//房间用户消息子类型
+const val MESSAGE_TYPE_TEXT = "0"
 
 //房间消息
 const val ROOM_MESSAGE_ENTER_ROOM = "room_message_enter_room"
 
+//fun Barrage.isSupportMessage(): Boolean {
+//    if (messageType == BarrageType.TEXT) {
+//        return true
+//    }
+//    return false
+//}
 
-fun Barrage.isSupportMessage(): Boolean {
-    if (messageType == BarrageType.TEXT) {
-        return true
-    }
-    return false
-}
-
-fun List<Barrage>.toMessages(filterUnSupport: Boolean): List<Message> {
-    return filter { it.isSupportMessage() }
-        .map { it.toMessage() }
+fun List<Barrage>.toMessages(filterUnSupport: Boolean = true): List<Message> {
+    return map { it.toMessage() }
+        .filter { it !is UnknownMessage }
 }
 
 fun Barrage.toMessage(): Message {
     if (messageType == BarrageType.TEXT) {
+        when (extensionInfo[MESSAGE_TYPE]) {
+            MESSAGE_TYPE_TEXT -> {
+                return TextMessage(this)
+            }
+        }
         if (businessID == ROOM_MESSAGE_ENTER_ROOM) {
             return EnterRoomMessage(this)
         }
-        return TextMessage(this)
     }
     return UnknownMessage(this)
 }

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -407,4 +407,5 @@
     <string name="room_mic_7">7</string>
     <string name="room_mic_8">8</string>
     <string name="common_send_gift">Send Gifts</string>
+    <string name="common_think_more">再想一下</string>
 </resources>

+ 3 - 1
frame/room/src/main/java/com/adealink/frame/room/data/RoomFlowData.kt

@@ -49,7 +49,9 @@ data class JoinRoomReq(
 
 enum class LeaveRoomReason(val reason: String) {
     INITIATIVE("initiative"),
-    ENTER_OTHER_MEDIA("enter_other_room")
+    ENTER_OTHER_MEDIA("enter_other_room"),
+
+    LIVE_END("live_end")
 }
 
 enum class JoinChannelReason(val reason: String) {

+ 0 - 1
module/profile/src/main/res/layout/activity_user_search.xml

@@ -34,7 +34,6 @@
         layout="@layout/layout_search_result"
         android:layout_width="match_parent"
         android:layout_height="0dp"
-        android:layout_marginTop="12dp"
         android:paddingHorizontal="16dp"
         android:visibility="gone"
         app:layout_constraintBottom_toBottomOf="parent"

+ 1 - 1
module/profile/src/main/res/layout/fragment_search_room.xml

@@ -38,7 +38,7 @@
             style="@style/CommonVerticalFade"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            tools:listitem="@layout/layout_profile_search_user_item" />
+            tools:listitem="@layout/layout_profile_search_room_item" />
 
     </com.scwang.smart.refresh.layout.SmartRefreshLayout>
 

+ 6 - 3
module/room/src/main/java/com/adealink/weparty/room/applymic/ApplyMicListDialog.kt

@@ -4,6 +4,7 @@ import android.graphics.Color
 import androidx.fragment.app.activityViewModels
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
+import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.base.fastLazy
 import com.adealink.frame.mvvm.view.viewBinding
@@ -16,7 +17,6 @@ import com.adealink.weparty.commonui.widget.BottomDialogFragment
 import com.adealink.weparty.room.R
 import com.adealink.weparty.room.applymic.adapter.ApplyMemberViewBinder
 import com.adealink.weparty.room.applymic.data.APPLY_MIC_LIST_TYPE_ALL
-import com.adealink.weparty.room.applymic.data.APPLY_MIC_LIST_TYPE_GUEST
 import com.adealink.weparty.room.applymic.data.ApplyMicItemData
 import com.adealink.weparty.room.applymic.viewmodel.ApplyMicViewModel
 import com.adealink.weparty.room.databinding.DialogRoomApplyMicListBinding
@@ -64,13 +64,15 @@ class ApplyMicListDialog : BottomDialogFragment(R.layout.dialog_room_apply_mic_l
 
     override fun observeViewModel() {
         super.observeViewModel()
+        listViewModel.totalLD.observe(viewLifecycleOwner) {
+            binding.tvTitle.text = getCompatString(R.string.room_apply_mic_count_in_room, it.toString())
+        }
         listViewModel.applyListRltLD.observe(viewLifecycleOwner) { rlt ->
             binding.vRefresh.finishRefresh()
             binding.vRefresh.finishLoadMore()
             binding.vRefresh.setEnableLoadMore(listViewModel.hasMoreData())
             showFailedToast(rlt)
         }
-
         listViewModel.applyListLD.observe(viewLifecycleOwner) { list ->
             if (list.isNullOrEmpty()) {
                 binding.rvList.gone()
@@ -97,10 +99,11 @@ class ApplyMicListDialog : BottomDialogFragment(R.layout.dialog_room_apply_mic_l
 
     private fun cancelApply() {
         listViewModel.cancelApply().observe(viewLifecycleOwner) { rlt ->
-            when(rlt){
+            when (rlt) {
                 is Rlt.Failed -> {
                     showFailedToast(rlt)
                 }
+
                 is Rlt.Success -> {
                     listViewModel.notifyApplyCanceled()
                 }

+ 5 - 0
module/room/src/main/java/com/adealink/weparty/room/applymic/HostApplyListFragment.kt

@@ -5,6 +5,7 @@ import android.os.Bundle
 import androidx.fragment.app.viewModels
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
+import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.base.fastLazy
 import com.adealink.frame.mvvm.view.viewBinding
@@ -91,6 +92,10 @@ class HostApplyListFragment : BaseFragment(R.layout.fragment_room_apply_mic_list
 
     override fun observeViewModel() {
         super.observeViewModel()
+        listViewModel.totalLD.observe(viewLifecycleOwner) {
+            binding.tvTitle.text = getCompatString(R.string.room_apply_mic_count_in_room, it.toString())
+        }
+
         listViewModel.applyListRltLD.observe(viewLifecycleOwner) { rlt ->
             binding.vRefresh.finishRefresh()
             binding.vRefresh.finishLoadMore()

+ 8 - 1
module/room/src/main/java/com/adealink/weparty/room/applymic/viewmodel/ApplyMicViewModel.kt

@@ -31,7 +31,8 @@ class ApplyMicViewModel : BaseViewModel() {
         App.instance.networkService.getHttpService(RoomHttpService::class.java)
     }
 
-
+    private var total = 0L
+    val totalLD = ExtMutableLiveData<Long>()
     private val applyList = mutableListOf<ApplyMicItemData>()
     private val applyIds = mutableSetOf<String>()
     private val pageHandler = PageHandler()
@@ -51,6 +52,7 @@ class ApplyMicViewModel : BaseViewModel() {
         applyList.clear()
         applyIds.clear()
         pageHandler.reset()
+        total = 0
         loadMoreList()
     }
 
@@ -93,6 +95,11 @@ class ApplyMicViewModel : BaseViewModel() {
 
                 is Rlt.Success -> {
                     pageHandler.nextPage(rlt.data.data?.next)
+                    rlt.data.data?.total?.let {
+                        total = it
+                        totalLD.send(it)
+                    }
+
                     rlt.data.data?.list?.forEach {
                         if (!applyIds.contains(it.applyId)) {
                             applyList.add(ApplyMicItemData(it))

+ 2 - 2
module/room/src/main/java/com/adealink/weparty/room/chat/viewmodel/ChatMessageViewModel.kt

@@ -48,9 +48,9 @@ class ChatMessageViewModel : BaseViewModel(), IChatMessageViewModel, IMessageLis
     }
 
 
-    private suspend fun onBarrageListChanged(barrages: List<Barrage>) {
+    private fun onBarrageListChanged(barrages: List<Barrage>) {
         messagesLD.send(
-            barrages.toMessages(true)
+            barrages.toMessages()
         )
     }
 

+ 1 - 0
module/room/src/main/java/com/adealink/weparty/room/chatroom/page/dispatchcenter/DispatchCenterRoomInfoFragment.kt

@@ -2,6 +2,7 @@ package com.adealink.weparty.room.chatroom.page.dispatchcenter
 
 import android.annotation.SuppressLint
 import com.adealink.frame.mvvm.view.viewBinding
+import com.adealink.frame.util.onClick
 import com.adealink.weparty.commonui.BaseFragment
 import com.adealink.weparty.commonui.ext.gone
 import com.adealink.weparty.commonui.ext.show

+ 4 - 1
module/room/src/main/java/com/adealink/weparty/room/data/RoomData.kt

@@ -48,9 +48,10 @@ data class ApplyMicListReq(
 
 data class ApplyMicListRes(
     @SerializedName("list") val list: List<ApplyMicData>,
-
     @GsonNullable
     @SerializedName("next") val next: String?,
+    @GsonNullable
+    @SerializedName("total") val total: Long?,
 )
 
 data class ClearApplyMicListReq(
@@ -92,6 +93,8 @@ data class GetRoomMemberRes(
     @SerializedName("list") val list: List<MemberUserData>,
     @GsonNullable
     @SerializedName("next") val next: String?,
+    @GsonNullable
+    @SerializedName("total") val total: Long?,
 )
 
 data class MemberUserData(

+ 4 - 0
module/room/src/main/java/com/adealink/weparty/room/invite/InviteMicDialog.kt

@@ -4,6 +4,7 @@ import androidx.fragment.app.viewModels
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.adealink.frame.aab.util.getCompatColor
+import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.base.fastLazy
 import com.adealink.frame.mvvm.view.viewBinding
@@ -81,6 +82,9 @@ class InviteMicDialog : BottomDialogFragment(R.layout.dialog_room_invite_mic) {
 
     override fun observeViewModel() {
         super.observeViewModel()
+        inviteViewModel.totalLD.observe(viewLifecycleOwner) {
+            binding.tvTitle.text = getCompatString(R.string.room_member_count_in_room, it.toString())
+        }
         inviteViewModel.memberListRltLD.observe(viewLifecycleOwner) { rlt ->
             binding.vRefresh.finishRefresh()
             binding.vRefresh.finishLoadMore()

+ 7 - 1
module/room/src/main/java/com/adealink/weparty/room/invite/viewmodel/InviteViewModel.kt

@@ -43,6 +43,8 @@ class InviteViewModel : BaseViewModel() {
 
 
     private val memberListResultSet = mutableSetOf<String>()
+    private var total = 0L
+    val totalLD = ExtMutableLiveData<Long>()
     val memberListResultLD = ExtMutableLiveData<List<RoomMemberItemData>>()
     val memberListRltLD = ExtMutableLiveData<Rlt<Any>>()
     private val memberList = mutableListOf<RoomMemberItemData>()
@@ -63,6 +65,7 @@ class InviteViewModel : BaseViewModel() {
         pageHandler.reset()
         memberListResultSet.clear()
         memberList.clear()
+        total = 0
         loadMore()
     }
 
@@ -97,7 +100,10 @@ class InviteViewModel : BaseViewModel() {
 
                 is Rlt.Success -> {
                     pageHandler.nextPage(rlt.data.data?.next)
-
+                    rlt.data.data?.total?.let {
+                        total = it
+                        totalLD.send(it)
+                    }
                     val nextList = rlt.data.data?.list?.filter {
                         !memberListResultSet.contains(it.user.uid)
                     } ?: emptyList()

+ 27 - 4
module/room/src/main/java/com/adealink/weparty/room/micseat/dispatcenter/DispatchCenterSeatsTemplate.kt

@@ -137,11 +137,21 @@ class DispatchCenterSeatsTemplate :
 //                    } else {
 //                        showToast(R.string.room_request_host_mic_fail_for_no_host_permission)
 //                    }
-                    return
+                } else if (seatView.micIndex.index == MIC_GUEST) {
+                    //申请上嘉宾麦位
+                    ApplyMicDialog().apply {
+                        setApplyMic(MIC_GUEST)
+                    }.show(childFragmentManager)
+
                 } else {
-                    actionList.add(Pair(R.id.id_mic_operate_on, getCompatString(R.string.room_mic_operate_on)))
+                    //申请上陪玩师麦位
+                    if (ProfileModule.getMyUserInfo()?.isPlaymate() == true) {
+                        ApplyMicDialog().apply {
+                            setApplyMic(MIC_ASSIGN_BY_REMOTE)
+                        }.show(childFragmentManager)
+                    }
                 }
-
+                return
             } else {
                 //麦上有人
                 actionList.add(Pair(R.id.id_mic_operate_member_info, getCompatString(R.string.room_mic_operate_member_info)))
@@ -189,8 +199,21 @@ class DispatchCenterSeatsTemplate :
                         }
 
                         R.id.id_mic_operate_on -> {
+                            val reqMicIndex = when (seatView.micIndex.index) {
+                                in MIC_1..MIC_8 -> {
+                                    MIC_ASSIGN_BY_REMOTE
+                                }
+
+                                MIC_GUEST -> {
+                                    MIC_GUEST
+                                }
+
+                                else -> {
+                                    return
+                                }
+                            }
                             ApplyMicDialog().apply {
-                                setApplyMic(seatView.micIndex.index)
+                                setApplyMic(reqMicIndex)
                             }.show(childFragmentManager)
                         }
 

+ 27 - 0
module/room/src/main/java/com/adealink/weparty/room/sdk/controller/impl/JoinController.kt

@@ -20,11 +20,14 @@ import com.adealink.weparty.room.sdk.controller.IJoinController
 import com.adealink.weparty.room.sdk.listener.IJoinListener
 import com.tencent.cloud.tuikit.engine.extension.TUILiveListManager
 import io.trtc.tuikit.atomicxcore.api.CompletionHandler
+import io.trtc.tuikit.atomicxcore.api.live.LiveEndedReason
 import io.trtc.tuikit.atomicxcore.api.live.LiveInfo
 import io.trtc.tuikit.atomicxcore.api.live.LiveInfoCompletionHandler
+import io.trtc.tuikit.atomicxcore.api.live.LiveListListener
 import io.trtc.tuikit.atomicxcore.api.live.LiveListStore
 import io.trtc.tuikit.atomicxcore.api.live.StopLiveCompletionHandler
 import kotlinx.coroutines.async
+import kotlinx.coroutines.launch
 import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlinx.coroutines.withContext
 import kotlin.coroutines.resume
@@ -38,6 +41,23 @@ open class JoinController(override val ctx: IRoomContext, serialHandler: Handler
     override var joiningRoomId: String? = null
     override var joinedRoomInfo: LiveInfo? = null
 
+    private val liveListListener = object : LiveListListener() {
+        override fun onLiveEnded(liveId: String, reason: LiveEndedReason, message: String) {
+            if (liveId != joinedRoomInfo?.liveID) return
+            notifyLiveEnd(liveId, reason)
+        }
+    }
+
+    override fun onRoomIn(flowStateInfo: FlowStateInfo) {
+        super.onRoomIn(flowStateInfo)
+        LiveListStore.shared().addLiveListListener(liveListListener)
+    }
+
+    override fun onRoomLeaved(flowStateInfo: FlowStateInfo) {
+        super.onRoomLeaved(flowStateInfo)
+        LiveListStore.shared().removeLiveListListener(liveListListener)
+    }
+
     override fun onRoomStateChanged(
         fromState: RoomState,
         toState: RoomState,
@@ -235,6 +255,13 @@ open class JoinController(override val ctx: IRoomContext, serialHandler: Handler
         }
     }
 
+    private fun notifyLiveEnd(roomId: String, reason: LiveEndedReason) {
+        Log.i(TAG_ROOM_FLOW, "notifyLiveEnd, roomId:$roomId, reason:${reason.name}")
+        launch {
+            leaveRoom(LeaveRoomReason.LIVE_END, true)
+        }
+    }
+
 
     private fun changeRoomState(toState: RoomState, flowStateInfo: FlowStateInfo) {
         Log.i(

+ 5 - 1
module/room/src/main/java/com/adealink/weparty/room/sdk/controller/impl/MessageController.kt

@@ -6,6 +6,8 @@ import com.adealink.frame.base.IError
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.ext.safeSubList
 import com.adealink.frame.room.data.FlowStateInfo
+import com.adealink.weparty.module.room.chat.data.MESSAGE_TYPE
+import com.adealink.weparty.module.room.chat.data.MESSAGE_TYPE_TEXT
 import com.adealink.weparty.module.room.chat.data.Notification
 import com.adealink.weparty.module.room.chat.data.toNotifications
 import com.adealink.weparty.room.sdk.context.IRoomContext
@@ -104,7 +106,9 @@ class MessageController(override val ctx: IRoomContext, serialHandler: Handler)
                 }
                 return@suspendCancellableCoroutine
             }
-            barrage.sendTextMessage(text, null, object : CompletionHandler {
+            barrage.sendTextMessage(text, mapOf(
+                MESSAGE_TYPE to MESSAGE_TYPE_TEXT
+            ), object : CompletionHandler {
                 override fun onFailure(code: Int, desc: String) {
                     if (continuation.isActive) {
                         continuation.resume(Rlt.Failed(IError(serverCode = code, msg = desc)))

+ 22 - 3
module/room/src/main/java/com/adealink/weparty/room/setting/RoomSettingDialog.kt

@@ -1,16 +1,19 @@
 package com.adealink.weparty.room.setting
 
+import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.coroutine.dispatcher.Dispatcher
 import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.frame.util.onClick
 import com.adealink.weparty.commonui.ext.show
 import com.adealink.weparty.commonui.widget.BottomDialogFragment
+import com.adealink.weparty.commonui.widget.CommonDialog
 import com.adealink.weparty.room.R
 import com.adealink.weparty.room.create.EditRoomDialog
 import com.adealink.weparty.room.databinding.DialogRoomSettingBinding
 import com.adealink.weparty.room.sdk.service.roomService
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.launch
+import com.adealink.weparty.R as APP_R
 
 class RoomSettingDialog : BottomDialogFragment(R.layout.dialog_room_setting) {
 
@@ -23,10 +26,26 @@ class RoomSettingDialog : BottomDialogFragment(R.layout.dialog_room_setting) {
             EditRoomDialog().show(childFragmentManager)
         }
         binding.btnClose.onClick {
-            CoroutineScope(Dispatcher.UI).launch {
-                roomService.joinController.closeRoom()
-            }
+            closeRoomDialog()
         }
     }
 
+    private fun closeRoomDialog() {
+        CommonDialog.Builder()
+            .title(getCompatString(APP_R.string.common_tips))
+            .message(getCompatString(R.string.room_close_tips))
+            .positiveText(getCompatString(APP_R.string.common_think_more))
+            .negativeText(getCompatString(APP_R.string.commonui_confirm))
+            .setShowDefaultCancel(true)
+            .onPositive {
+                //Ntd.
+            }
+            .onNegative {
+                CoroutineScope(Dispatcher.UI).launch {
+                    roomService.joinController.closeRoom()
+                }
+            }
+            .show(childFragmentManager)
+    }
+
 }

+ 3 - 0
module/room/src/main/res/values/strings.xml

@@ -61,4 +61,7 @@
     <string name="room_err_seat_audio_locked">Current seat audio is locked</string>
     <string name="room_enter_room_message">%s Enter Room</string>
     <string name="room_request_host_mic_fail_for_no_host_permission">没有主持人权限</string>
+    <string name="room_member_count_in_room">%s在房间内</string>
+    <string name="room_apply_mic_count_in_room">%s在申请上麦</string>
+    <string name="room_close_tips">关闭房间讲清空房间人员哦~</string>
 </resources>