Kaynağa Gözat

成员过滤

DoggyZhang 1 hafta önce
ebeveyn
işleme
46d1d5abd6

+ 104 - 0
module/room/src/main/java/com/adealink/weparty/room/applymic/ApplyMicFilterDialog.kt

@@ -0,0 +1,104 @@
+package com.adealink.weparty.room.applymic
+
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.adealink.frame.base.fastLazy
+import com.adealink.frame.mvvm.view.viewBinding
+import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
+import com.adealink.weparty.commonui.toast.util.showFailedToast
+import com.adealink.weparty.commonui.widget.BottomDialogFragment
+import com.adealink.weparty.module.playmate.data.PlaymateCategoryData
+import com.adealink.weparty.room.R
+import com.adealink.weparty.room.applymic.viewmodel.ApplyMicFilterViewModel
+import com.adealink.weparty.room.databinding.DialogRoomPlaymateCategoryFilterBinding
+import com.adealink.weparty.room.member.adapter.RoomPlaymateAllCategoryItemBinder
+import com.adealink.weparty.room.member.adapter.RoomPlaymateCategoryItemBinder
+import com.adealink.weparty.room.member.data.BasePlaymateCategoryItem
+import com.adealink.weparty.room.member.data.PlaymateCategoryAllItemData
+import com.adealink.weparty.room.member.data.PlaymateCategoryItemData
+
+class ApplyMicFilterDialog : BottomDialogFragment(R.layout.dialog_room_playmate_category_filter) {
+
+    private val binding by viewBinding(DialogRoomPlaymateCategoryFilterBinding::bind)
+    private val categoryAdapter by fastLazy { MultiTypeListAdapter<BasePlaymateCategoryItem>() }
+
+    private val viewModel by activityViewModels<ApplyMicFilterViewModel>()
+
+    private var listener: OnCategorySelectListener? = null
+
+    private var currentSkillId: String? = null
+
+    fun setListener(listener: OnCategorySelectListener?) {
+        this.listener = listener
+    }
+
+    fun setCurrentSelect(skillId: String?) {
+        this.currentSkillId = skillId
+    }
+
+    override fun initViews() {
+        super.initViews()
+        categoryAdapter.register(
+            RoomPlaymateCategoryItemBinder {
+                select(it.skill)
+            }
+        )
+        categoryAdapter.register(
+            RoomPlaymateAllCategoryItemBinder {
+                selectAll()
+            }
+        )
+        binding.rvCategory.adapter = categoryAdapter
+        binding.rvCategory.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
+    }
+
+    override fun observeViewModel() {
+        super.observeViewModel()
+        viewModel.skillListLD.observe(viewLifecycleOwner) { list ->
+            val itemList = mutableListOf<BasePlaymateCategoryItem>()
+            var hasSelected = false
+            itemList.addAll(
+                list.map { skill ->
+                    PlaymateCategoryItemData(
+                        skill
+                    ).also {
+                        hasSelected = it.skill.code == currentSkillId
+                        it.selected = hasSelected
+                    }
+                }
+            )
+            itemList.add(
+                PlaymateCategoryAllItemData.also {
+                    it.selected = !hasSelected && currentSkillId.isNullOrEmpty()
+                }
+            )
+            categoryAdapter.submitList(itemList)
+        }
+    }
+
+    override fun loadData() {
+        super.loadData()
+        viewModel.loadApplyList().observe(viewLifecycleOwner) {
+            showFailedToast(it)
+        }
+    }
+
+    private fun select(skill: PlaymateCategoryData) {
+        listener?.onSelect(skill)
+        dismiss()
+    }
+
+    private fun selectAll() {
+        listener?.onSelectAll()
+        dismiss()
+    }
+
+
+    interface OnCategorySelectListener {
+        fun onSelect(skill: PlaymateCategoryData)
+
+        fun onSelectAll()
+    }
+
+}

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

@@ -2,7 +2,6 @@ package com.adealink.weparty.room.applymic
 
 import android.graphics.Color
 import android.os.Bundle
-import androidx.fragment.app.activityViewModels
 import androidx.fragment.app.viewModels
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
@@ -17,11 +16,11 @@ import com.adealink.weparty.commonui.ext.show
 import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
 import com.adealink.weparty.commonui.toast.util.showFailedToast
 import com.adealink.weparty.commonui.widget.BottomDialogFragment
+import com.adealink.weparty.module.playmate.data.PlaymateCategoryData
 import com.adealink.weparty.module.room.Room
 import com.adealink.weparty.room.R
 import com.adealink.weparty.room.applymic.adapter.HostApplyMemberViewBinder
 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.FragmentRoomApplyMicListBinding
@@ -39,16 +38,23 @@ class HostApplyListFragment : BaseFragment(R.layout.fragment_room_apply_mic_list
     private val listViewModel by viewModels<ApplyMicViewModel>()
 
     private var searchType: Int = APPLY_MIC_LIST_TYPE_ALL
+
+    private var showFilter: Boolean = false
     private var skillCategories: List<String>? = null
 
-    fun setSearchType(searchType: Int, skillCategories: List<String>?) {
+    fun setSearchType(searchType: Int, showFilter: Boolean) {
         this.searchType = searchType
-        this.skillCategories = skillCategories
+        this.showFilter = showFilter
     }
 
     override fun initViews() {
         super.initViews()
 
+        binding.btnFilter.show(showFilter)
+        binding.btnFilter.onClick {
+            showFilter()
+        }
+
         binding.vRefresh.setEnableRefresh(true)
         binding.vRefresh.setEnableLoadMore(true)
         binding.vRefresh.setEnableAutoLoadMore(true)
@@ -113,7 +119,7 @@ class HostApplyListFragment : BaseFragment(R.layout.fragment_room_apply_mic_list
         if (roomId.isNullOrEmpty()) {
             return
         }
-        listViewModel.pullList(roomId, searchType, null)
+        listViewModel.pullList(roomId, searchType, skillCategories)
     }
 
     private fun onAvatarClick(item: ApplyMicItemData) {
@@ -137,6 +143,28 @@ class HostApplyListFragment : BaseFragment(R.layout.fragment_room_apply_mic_list
         }
     }
 
+    private fun showFilter() {
+        ApplyMicFilterDialog().apply {
+            setListener(object : ApplyMicFilterDialog.OnCategorySelectListener {
+                override fun onSelect(skill: PlaymateCategoryData) {
+                    notifyMemberListRefresh(skill.code)
+                }
+
+                override fun onSelectAll() {
+                    notifyMemberListRefresh(null)
+                }
+            })
+            setCurrentSelect(skillCategories?.firstOrNull())
+        }.show(childFragmentManager)
+    }
+
+    private fun notifyMemberListRefresh(category: String?) {
+        this.skillCategories = category?.let {
+            listOf(it)
+        }
+        binding.vRefresh.autoRefresh()
+    }
+
     private fun clearAllApply() {
         val roomId = roomService.joinController.getJoinedRoomId()
         if (roomId.isNullOrEmpty()) {

+ 2 - 2
module/room/src/main/java/com/adealink/weparty/room/applymic/HostApplyMicTab.kt

@@ -24,7 +24,7 @@ val GUEST_TAB = Tab(
     },
     fragmentBuilder = {
         HostApplyListFragment().apply {
-            setSearchType(APPLY_MIC_LIST_TYPE_GUEST, null)
+            setSearchType(APPLY_MIC_LIST_TYPE_GUEST, false)
         }
     }
 )
@@ -36,7 +36,7 @@ val PLAYMATE_TAB = Tab(
     },
     fragmentBuilder = {
         HostApplyListFragment().apply {
-            setSearchType(APPLY_MIC_LIST_TYPE_PLAYMATE, null)
+            setSearchType(APPLY_MIC_LIST_TYPE_PLAYMATE, true)
         }
     }
 )

+ 49 - 0
module/room/src/main/java/com/adealink/weparty/room/applymic/viewmodel/ApplyMicFilterViewModel.kt

@@ -0,0 +1,49 @@
+package com.adealink.weparty.room.applymic.viewmodel
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import com.adealink.frame.base.Rlt
+import com.adealink.frame.base.fastLazy
+import com.adealink.frame.mvvm.livedata.OnceMutableLiveData
+import com.adealink.frame.mvvm.viewmodel.BaseViewModel
+import com.adealink.weparty.App
+import com.adealink.weparty.module.playmate.data.PlaymateCategoryData
+import com.adealink.weparty.room.data.ApplyMicPlaymateCategoryReq
+import com.adealink.weparty.room.datasource.remote.RoomHttpService
+import com.adealink.weparty.room.sdk.service.roomService
+import kotlinx.coroutines.launch
+
+class ApplyMicFilterViewModel : BaseViewModel() {
+
+    private val roomHttpService by fastLazy {
+        App.instance.networkService.getHttpService(RoomHttpService::class.java)
+    }
+
+    val skillListLD = MutableLiveData<List<PlaymateCategoryData>>()
+
+    fun loadApplyList(): LiveData<Rlt<Any>> {
+        val liveData = OnceMutableLiveData<Rlt<Any>>()
+        viewModelScope.launch {
+            val roomId = roomService.joinController.getJoinedRoomId()
+            if (roomId.isNullOrEmpty()) {
+                return@launch
+            }
+            val rlt = roomHttpService.getApplyMicPlaymateCategory(
+                ApplyMicPlaymateCategoryReq(roomId)
+            )
+            when (rlt) {
+                is Rlt.Failed -> {
+                    //Ntd.
+                }
+
+                is Rlt.Success -> {
+                    skillListLD.send(rlt.data.data?.categorys ?: emptyList())
+                }
+            }
+            liveData.send(rlt)
+        }
+        return liveData
+    }
+
+
+}

+ 2 - 2
module/room/src/main/java/com/adealink/weparty/room/chatroom/page/dispatchcenter/DispatchRoomBottomOperateFragment.kt

@@ -203,9 +203,8 @@ open class DispatchRoomBottomOperateFragment : BaseFragment(R.layout.fragment_di
         }
         binding.btnLeaveMic.gone()
 
-        //陪玩师可申请上麦
         val myUserInfo = ProfileModule.getMyUserInfo()
-        if (myUserInfo == null || myUserInfo.isPlaymate()) {
+        if (myUserInfo == null || !myUserInfo.isPlaymate()) {
             //申请上麦
             binding.btnApplyMic.gone()
             //申请列表
@@ -215,6 +214,7 @@ open class DispatchRoomBottomOperateFragment : BaseFragment(R.layout.fragment_di
             binding.btnLeaveMic.gone()
             return
         }
+        //陪玩师可申请上麦
         val hasApply = ApplyMicStore.hasApply(roomId)
         if (hasApply) {
             //申请上麦

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

@@ -99,9 +99,17 @@ data class MemberUserData(
 )
 
 data class RoomPlaymateCategoryReq(
-    @SerializedName("id") val roomId: String,
+    @SerializedName("roomId") val roomId: String,
 )
 
 data class RoomPlaymateCategoryRes(
     @SerializedName("list") val categorys: List<PlaymateCategoryData>,
+)
+
+data class ApplyMicPlaymateCategoryReq(
+    @SerializedName("id") val roomId: String,
+)
+
+data class ApplyMicPlaymateCategoryRes(
+    @SerializedName("list") val categorys: List<PlaymateCategoryData>,
 )

+ 6 - 1
module/room/src/main/java/com/adealink/weparty/room/datasource/remote/RoomHttpService.kt

@@ -5,6 +5,8 @@ import com.adealink.frame.network.data.Res
 import com.adealink.weparty.room.data.AcceptApplyMicReq
 import com.adealink.weparty.room.data.ApplyMicListReq
 import com.adealink.weparty.room.data.ApplyMicListRes
+import com.adealink.weparty.room.data.ApplyMicPlaymateCategoryReq
+import com.adealink.weparty.room.data.ApplyMicPlaymateCategoryRes
 import com.adealink.weparty.room.data.ApplyMicReq
 import com.adealink.weparty.room.data.CancelApplyMicReq
 import com.adealink.weparty.room.data.CheckCreateRoomPermissionRes
@@ -57,6 +59,9 @@ interface RoomHttpService {
     @POST("live/viewer/list")
     suspend fun getRoomMembers(@Body req: GetRoomMemberReq): Rlt<Res<GetRoomMemberRes>>
 
-    @POST("live/mic/apply/category")
+    @POST("live/viewer/category")
     suspend fun getRoomPlaymateCategory(@Body req: RoomPlaymateCategoryReq): Rlt<Res<RoomPlaymateCategoryRes>>
+
+    @POST("live/mic/apply/category")
+    suspend fun getApplyMicPlaymateCategory(@Body req: ApplyMicPlaymateCategoryReq): Rlt<Res<ApplyMicPlaymateCategoryRes>>
 }

+ 1 - 1
module/room/src/main/java/com/adealink/weparty/room/member/RoomPlaymateFilterDialog.kt

@@ -50,7 +50,7 @@ class RoomPlaymateFilterDialog : BottomDialogFragment(R.layout.dialog_room_playm
             }
         )
         binding.rvCategory.adapter = categoryAdapter
-        binding.rvCategory.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)
+        binding.rvCategory.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
     }
 
     override fun observeViewModel() {

+ 7 - 1
module/room/src/main/java/com/adealink/weparty/room/member/adapter/RoomPlaymateCategoryItemBinder.kt

@@ -7,6 +7,7 @@ import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
 import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
 import com.adealink.weparty.room.databinding.LayoutRoomPlaymateCategoryFilterItemBinding
 import com.adealink.weparty.room.member.data.PlaymateCategoryItemData
+import com.adealink.weparty.R as APP_R
 
 class RoomPlaymateCategoryItemBinder(
     private val onClick: (item: PlaymateCategoryItemData) -> Unit
@@ -21,6 +22,11 @@ class RoomPlaymateCategoryItemBinder(
         holder.binding.root.onClick {
             onClick.invoke(item)
         }
-
+        holder.binding.tvTitle.text = item.skill.name
+        if (item.selected) {
+            holder.binding.ivSelected.setImageResource(APP_R.drawable.common_check_selected_ic)
+        } else {
+            holder.binding.ivSelected.setImageResource(APP_R.drawable.common_check_unselected_ic)
+        }
     }
 }

+ 2 - 0
module/room/src/main/java/com/adealink/weparty/room/sdk/controller/IJoinController.kt

@@ -18,6 +18,8 @@ interface IJoinController<L : IJoinListener> : IController<L> {
      */
     fun getJoinedRoomId(): String?
 
+    fun isOwner(): Boolean
+
     /**
      * 是否进房或在房
      */

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

@@ -67,6 +67,10 @@ open class JoinController(override val ctx: IRoomContext, serialHandler: Handler
         return joinedRoomInfo?.liveID
     }
 
+    override fun isOwner(): Boolean {
+        return joinedRoomInfo?.liveOwner?.userID == ctx.appSupplier.selfUid
+    }
+
     override fun isRoomJoiningOrJoined(): Boolean {
         return joiningRoomId != null || joinedRoomInfo != null
     }

+ 2 - 0
module/room/src/main/java/com/adealink/weparty/room/setting/RoomSettingDialog.kt

@@ -3,6 +3,7 @@ package com.adealink.weparty.room.setting
 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.room.R
 import com.adealink.weparty.room.create.EditRoomDialog
@@ -17,6 +18,7 @@ class RoomSettingDialog : BottomDialogFragment(R.layout.dialog_room_setting) {
 
     override fun initViews() {
         super.initViews()
+        binding.btnSetting.show(roomService.joinController.isOwner())
         binding.btnSetting.onClick {
             EditRoomDialog().show(childFragmentManager)
         }

+ 1 - 0
module/room/src/main/res/layout/dialog_room_invite_mic.xml

@@ -32,6 +32,7 @@
             android:id="@+id/btn_filter"
             android:layout_width="wrap_content"
             android:layout_height="30dp"
+            android:layout_marginEnd="11dp"
             android:background="@drawable/room_bottom_item_bg"
             android:paddingHorizontal="16dp"
             app:layout_constraintBottom_toBottomOf="parent"

+ 34 - 0
module/room/src/main/res/layout/fragment_room_apply_mic_list.xml

@@ -21,6 +21,40 @@
         app:layout_constraintTop_toTopOf="parent"
         tools:text="10人申请上麦" />
 
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/btn_filter"
+        android:layout_width="wrap_content"
+        android:layout_height="30dp"
+        android:layout_marginEnd="11dp"
+        android:background="@drawable/room_bottom_item_bg"
+        android:paddingHorizontal="16dp"
+        app:layout_constraintBottom_toBottomOf="@id/tv_title"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="@id/tv_title">
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_filter"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:gravity="start|center_vertical"
+            android:includeFontPadding="false"
+            android:text="@string/room_playmate_category_filter"
+            android:textColor="@color/white"
+            android:textSize="14sp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:layout_width="13dp"
+            android:layout_height="13dp"
+            android:src="@drawable/common_go_white_ic"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toEndOf="@id/tv_filter"
+            app:layout_constraintTop_toTopOf="parent" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
     <com.scwang.smart.refresh.layout.SmartRefreshLayout
         android:id="@+id/v_refresh"
         android:layout_width="match_parent"

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

@@ -41,7 +41,7 @@
     <string name="room_mic_operate_mute">禁麦</string>
     <string name="room_mic_operate_un_mute">解除禁麦</string>
     <string name="room_mic_operate_on">上麦</string>
-    <string name="room_mic_operate_off">下麦</string>
+    <string name="room_mic_operate_off">下麦围观</string>
     <string name="room_mic_operate_kick">请下麦</string>
     <string name="room_mic_index_title">Mic%s</string>
     <string name="room_how_to_order_1_title">Step 1: Request to Go On-Mic</string>