|
|
@@ -1,331 +1,169 @@
|
|
|
package com.adealink.weparty.room.attr.info
|
|
|
|
|
|
-import android.os.Bundle
|
|
|
-import android.text.Editable
|
|
|
-import android.text.TextWatcher
|
|
|
-import android.view.KeyEvent
|
|
|
-import android.view.View
|
|
|
+import androidx.fragment.app.Fragment
|
|
|
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.ext.isUIValid
|
|
|
import com.adealink.frame.mvvm.view.viewBinding
|
|
|
-import com.adealink.frame.util.noOpDelegate
|
|
|
+import com.adealink.frame.util.DisplayUtil
|
|
|
import com.adealink.weparty.App
|
|
|
-import com.adealink.weparty.commonui.dialogfragment.showDialogFragment
|
|
|
import com.adealink.weparty.commonui.ext.gone
|
|
|
-import com.adealink.weparty.commonui.ext.hide
|
|
|
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.toast.util.showToast
|
|
|
+import com.adealink.weparty.commonui.recycleview.adapter.BaseTabFragmentStateAdapter
|
|
|
import com.adealink.weparty.commonui.widget.BottomDialogFragment
|
|
|
-import com.adealink.weparty.commonui.widget.CommonDialog
|
|
|
-import com.adealink.weparty.module.follow.FollowModule
|
|
|
-import com.adealink.weparty.module.follow.data.FollowOpFrom
|
|
|
-import com.adealink.weparty.module.medal.MedalModule
|
|
|
-import com.adealink.weparty.module.medal.view.MedalItem
|
|
|
-import com.adealink.weparty.module.profile.ProfileModule
|
|
|
-import com.adealink.weparty.module.profile.data.UserInfo
|
|
|
-import com.adealink.weparty.module.rank.RankModule
|
|
|
-import com.adealink.weparty.module.rank.data.MarkItem
|
|
|
-import com.adealink.weparty.module.room.Room
|
|
|
import com.adealink.weparty.module.room.data.MemberRoomRole
|
|
|
-import com.adealink.weparty.module.room.data.RoomData
|
|
|
-import com.adealink.weparty.module.room.sdk.data.RoomType
|
|
|
import com.adealink.weparty.module.userprotect.UserProtectModule
|
|
|
import com.adealink.weparty.module.userprotect.data.ReportFrom
|
|
|
-import com.adealink.weparty.module.userprotect.data.ReportType
|
|
|
import com.adealink.weparty.room.R
|
|
|
-import com.adealink.weparty.room.attr.adapter.RoomMemberSearchEmptyViewBinder
|
|
|
-import com.adealink.weparty.room.attr.data.RoomMemberSearchEmptyData
|
|
|
-import com.adealink.weparty.room.attr.info.adapter.MemberDetailInfoViewBinder
|
|
|
-import com.adealink.weparty.room.attr.info.stat.RoomInfoStatEvent
|
|
|
-import com.adealink.weparty.room.attr.info.stat.RoomInfoStatEvent.Companion.reportBtnClick
|
|
|
-import com.adealink.weparty.room.constant.RoomCantKickAntiKickError
|
|
|
+import com.adealink.weparty.room.attr.info.viewmodel.RoomDetailInfoViewModel
|
|
|
import com.adealink.weparty.room.databinding.FragmentRoomDetailInfoBinding
|
|
|
-import com.adealink.weparty.room.diff.RoomDataDiffUtil
|
|
|
-import com.adealink.weparty.room.member.RoomMemberInfoFragment
|
|
|
-import com.adealink.weparty.room.member.listener.IMemberMedalListener
|
|
|
-import com.adealink.weparty.room.member.listener.IMemberOperaListener
|
|
|
import com.adealink.weparty.room.member.viewmodel.RoomMemberViewModel
|
|
|
-import com.adealink.weparty.room.sdk.service.roomService
|
|
|
import com.adealink.weparty.room.viewmodel.RoomViewModelFactory
|
|
|
-import com.qmuiteam.qmui.widget.util.QMUIKeyboardHelper
|
|
|
-import com.adealink.weparty.R as APP_R
|
|
|
|
|
|
-/**
|
|
|
- * Created by sunxiaodong on 2021/6/24.
|
|
|
- */
|
|
|
-class RoomDetailInfoFragment : BottomDialogFragment(R.layout.fragment_room_detail_info),
|
|
|
- IMemberOperaListener, IMemberMedalListener {
|
|
|
+class RoomDetailInfoFragment : BottomDialogFragment(R.layout.fragment_room_detail_info) {
|
|
|
|
|
|
companion object {
|
|
|
const val TAG = "RoomDetailInfoFragment"
|
|
|
+
|
|
|
+ private const val ROOM_SETTING_PAGE = 0L
|
|
|
+ private const val ROOM_ONLINE_USER_PAGE = 1L
|
|
|
+ private const val ROOM_SUMMARY_PAGE = 2L
|
|
|
+
|
|
|
+ private val OWNER_ADMIN_PAGES = listOf(ROOM_SETTING_PAGE, ROOM_ONLINE_USER_PAGE)
|
|
|
+ private val AUDIENCE_PAGES = listOf(ROOM_SUMMARY_PAGE)
|
|
|
+
|
|
|
+ private val UNKNOW_PAGE = -1
|
|
|
+ private val OWNER_ADMIN_PAGE = 0
|
|
|
+ private val AUDIENCE_PAGE = 1
|
|
|
}
|
|
|
|
|
|
override val fgTag: String = TAG
|
|
|
|
|
|
private val binding by viewBinding(FragmentRoomDetailInfoBinding::bind)
|
|
|
- private val adapter by fastLazy { MultiTypeListAdapter(RoomDataDiffUtil()) }
|
|
|
+ private val adapter by fastLazy { RoomDetailAdapter() }
|
|
|
private val memberViewModel by viewModels<RoomMemberViewModel> { RoomViewModelFactory() }
|
|
|
- private val followViewModel by fastLazy { FollowModule.getFollowViewModel(this.requireActivity()) }
|
|
|
- private val medalViewModel by fastLazy { MedalModule.getMedalViewModel(requireActivity()) }
|
|
|
- private val rankViewModel by fastLazy { RankModule.getRankViewModel(this) }
|
|
|
- private val followedMap = HashMap<Long, Boolean>()
|
|
|
- private var members = mutableListOf<UserInfo>()
|
|
|
-
|
|
|
- override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
- super.onCreate(savedInstanceState)
|
|
|
- RoomInfoStatEvent.reportShow()
|
|
|
- }
|
|
|
+ private val dialogViewModel by viewModels<RoomDetailInfoViewModel>()
|
|
|
+ private var pageType = UNKNOW_PAGE
|
|
|
+ private var pages = listOf<Long>()
|
|
|
|
|
|
override fun initViews() {
|
|
|
super.initViews()
|
|
|
- binding.memberList.layoutManager =
|
|
|
- LinearLayoutManager(context, RecyclerView.VERTICAL, false)
|
|
|
- adapter.register(MemberDetailInfoViewBinder(this, this))
|
|
|
- adapter.register(RoomMemberSearchEmptyViewBinder())
|
|
|
- binding.memberList.adapter = adapter
|
|
|
- val ownerUid = memberViewModel.getJoinedRoomOwnerUid()
|
|
|
- binding.reportIv.visibility =
|
|
|
- if (ownerUid == ProfileModule.getMyUid()) View.GONE else View.VISIBLE
|
|
|
+ binding.vpContent.adapter = adapter
|
|
|
+ binding.tabTitle.createMediatorAndAttach(
|
|
|
+ binding.vpContent,
|
|
|
+ adapter,
|
|
|
+ 0
|
|
|
+ )
|
|
|
binding.reportIv.setOnClickListener {
|
|
|
- val roomId =
|
|
|
- App.instance.mediaManager.getJoinedMediaRoomId() ?: return@setOnClickListener
|
|
|
+ val roomId = App.instance.mediaManager.getJoinedMediaRoomId() ?: return@setOnClickListener
|
|
|
UserProtectModule.showReportRoomDialog(roomId, ReportFrom.ROOM_DETAIL)
|
|
|
}
|
|
|
- binding.searchEditText.setOnKeyListener(object : View.OnKeyListener {
|
|
|
-
|
|
|
- override fun onKey(v: View?, keyCode: Int, event: KeyEvent): Boolean {
|
|
|
- if (keyCode == KeyEvent.KEYCODE_ENTER && event.action == KeyEvent.ACTION_UP) {
|
|
|
- QMUIKeyboardHelper.hideKeyboard(v)
|
|
|
- search()
|
|
|
- return true
|
|
|
- }
|
|
|
- return false
|
|
|
- }
|
|
|
-
|
|
|
- })
|
|
|
- binding.searchEditText.addTextChangedListener(object : TextWatcher by noOpDelegate() {
|
|
|
-
|
|
|
- override fun afterTextChanged(s: Editable) {
|
|
|
- if (s.toString().trim().isEmpty()) {
|
|
|
- finishSearch()
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- })
|
|
|
- binding.searchCancel.setOnClickListener {
|
|
|
- binding.searchEditText.setText("")
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- override fun observeViewModel() {
|
|
|
- super.observeViewModel()
|
|
|
- memberViewModel.rankBoardRoomMembersLD.observe(viewLifecycleOwner) { rlt ->
|
|
|
- when (rlt) {
|
|
|
- is Rlt.Success -> {
|
|
|
- val members = rlt.data
|
|
|
- this.members.clear()
|
|
|
- this.members.addAll(members)
|
|
|
- notifyMembersChanged()
|
|
|
- }
|
|
|
|
|
|
- else -> {}
|
|
|
- }
|
|
|
- }
|
|
|
- if (roomService.attrController.getRoomType() != RoomType.MIC_GRAB) {
|
|
|
- binding.layoutRoomInfo.root.show()
|
|
|
- binding.reportIv.show()
|
|
|
+ if (isOwnerAdminPage()) {
|
|
|
+ roleToAdmin()
|
|
|
} else {
|
|
|
- binding.layoutRoomInfo.root.gone()
|
|
|
- binding.reportIv.hide()
|
|
|
+ roleToAudience()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private fun notifyMembersChanged() {
|
|
|
- updateMemberCount(members.size)
|
|
|
- adapter.submitList(members)
|
|
|
- }
|
|
|
-
|
|
|
- override fun initComponents() {
|
|
|
- super.initComponents()
|
|
|
- RoomInfoComp(this, binding.layoutRoomInfo, binding.familyInfoView).attach()
|
|
|
- }
|
|
|
-
|
|
|
- override fun loadData() {
|
|
|
- super.loadData()
|
|
|
- memberViewModel.getRankBoardRoomMembers()
|
|
|
+ private fun isOwnerAdminPage(): Boolean {
|
|
|
+ return memberViewModel.isIAmRoomOwner() || memberViewModel.isIAmRoomAdmin()
|
|
|
}
|
|
|
|
|
|
- override fun getMedalList(
|
|
|
- userInfo: UserInfo,
|
|
|
- callback: (List<MedalItem>?) -> Unit
|
|
|
- ) {
|
|
|
- if (!isUIValid()) {
|
|
|
- callback.invoke(null)
|
|
|
- return
|
|
|
- }
|
|
|
- medalViewModel?.getUserProfileMedalList(userInfo)?.observe(viewLifecycleOwner) {
|
|
|
- callback.invoke(it)
|
|
|
- } ?: let {
|
|
|
- callback.invoke(null)
|
|
|
+ override fun observeViewModel() {
|
|
|
+ super.observeViewModel()
|
|
|
+ dialogViewModel.dismissLiveData.observe(viewLifecycleOwner) {
|
|
|
+ dismiss()
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- override fun getUserProfileMarkList(
|
|
|
- uid: Long,
|
|
|
- goodsList: List<Long>?,
|
|
|
- callback: (List<MarkItem>?) -> Unit
|
|
|
- ) {
|
|
|
- if (goodsList != null) {
|
|
|
- rankViewModel?.getUserProfileMarkList(uid, goodsList)
|
|
|
- ?.observe(viewLifecycleOwner) { list ->
|
|
|
- callback.invoke(list)
|
|
|
+ memberViewModel.roleChangeLD.observe(viewLifecycleOwner) {
|
|
|
+ when (it.second) {
|
|
|
+ MemberRoomRole.ADMIN -> {
|
|
|
+ roleToAdmin()
|
|
|
}
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- override fun onMemberClick(member: UserInfo) {
|
|
|
- showDialogFragment<RoomMemberInfoFragment>(parentFragmentManager, Bundle().apply {
|
|
|
- putLong(Room.Common.EXTRA_UID, member.uid)
|
|
|
- })
|
|
|
- dismiss()
|
|
|
- }
|
|
|
-
|
|
|
- override fun onKickOutClick(member: UserInfo) {
|
|
|
- showLoading()
|
|
|
- memberViewModel.kickOutRoom(member.uid).observe(viewLifecycleOwner) { rlt ->
|
|
|
- dismissLoading()
|
|
|
- when (rlt) {
|
|
|
- is Rlt.Success -> {
|
|
|
- this.members.find { it.uid == member.uid }?.let { member ->
|
|
|
- this.members.remove(member)
|
|
|
+ MemberRoomRole.AUDIENCE -> {
|
|
|
+ if (it.first == MemberRoomRole.ADMIN) {
|
|
|
+ roleToAudience()
|
|
|
}
|
|
|
- notifyMembersChanged()
|
|
|
}
|
|
|
|
|
|
- is Rlt.Failed -> {
|
|
|
- if (rlt.error is RoomCantKickAntiKickError) {
|
|
|
- CommonDialog.Builder()
|
|
|
- .message(rlt.error.msg)
|
|
|
- .setShowDefaultCancel(false)
|
|
|
- .build()
|
|
|
- .show(childFragmentManager)
|
|
|
- } else {
|
|
|
- showFailedToast(rlt)
|
|
|
- }
|
|
|
- }
|
|
|
+ else -> {}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- override fun onFollowClick(uid: Long) {
|
|
|
- super.onFollowClick(uid)
|
|
|
- val followed = followedMap[uid] ?: return
|
|
|
- if (followed) {
|
|
|
- unfollowUser(uid)
|
|
|
- reportBtnClick(RoomInfoStatEvent.Btn.UN_FOLLOWING)
|
|
|
- } else {
|
|
|
- followUser(uid)
|
|
|
- reportBtnClick(RoomInfoStatEvent.Btn.FOLLOWING)
|
|
|
+ private fun roleToAdmin() {
|
|
|
+ if (pageType == OWNER_ADMIN_PAGE) {
|
|
|
+ return
|
|
|
}
|
|
|
+ binding.reportIv.gone()
|
|
|
+ pageType = OWNER_ADMIN_PAGE
|
|
|
+ pages = OWNER_ADMIN_PAGES
|
|
|
+ adapter.notifyDataSetChanged()
|
|
|
+ binding.vpContent.currentItem = 0
|
|
|
}
|
|
|
|
|
|
- override fun onReportClick(uid: Long) {
|
|
|
- super.onReportClick(uid)
|
|
|
- UserProtectModule.showReportUserDialog(uid, ReportFrom.ROOM_MEMBER, ReportType.USER_INFO)
|
|
|
- }
|
|
|
-
|
|
|
- override fun isFollowed(uid: Long): Boolean {
|
|
|
- if (followedMap.containsKey(uid)) {
|
|
|
- return followedMap[uid] ?: false
|
|
|
+ private fun roleToAudience() {
|
|
|
+ if (pages == AUDIENCE_PAGES) {
|
|
|
+ return
|
|
|
}
|
|
|
-
|
|
|
- followViewModel?.isUserFollowed(uid)
|
|
|
- return false
|
|
|
+ binding.reportIv.show()
|
|
|
+ pageType = AUDIENCE_PAGE
|
|
|
+ pages = AUDIENCE_PAGES
|
|
|
+ adapter.notifyDataSetChanged()
|
|
|
+ binding.vpContent.currentItem = 0
|
|
|
}
|
|
|
|
|
|
- override fun isRoomOwner(uid: Long): Boolean {
|
|
|
- return memberViewModel.isRoomOwner(uid)
|
|
|
- }
|
|
|
+ //弹窗高度为屏幕高度的80%
|
|
|
+ override val height: Int
|
|
|
+ get() = (DisplayUtil.getScreenHeight() * 0.8f).toInt()
|
|
|
|
|
|
- override fun isRoomAdmin(uid: Long): Boolean {
|
|
|
- return memberViewModel.isRoomAdmin(uid)
|
|
|
- }
|
|
|
+ internal inner class RoomDetailAdapter : BaseTabFragmentStateAdapter(this) {
|
|
|
|
|
|
- override fun getMemberInfo(uid: Long, callback: (UserInfo?) -> Unit) {
|
|
|
- memberViewModel.getRoomMemberInfo(uid).observe(viewLifecycleOwner) { memberRlt ->
|
|
|
- when (memberRlt) {
|
|
|
- is Rlt.Success -> {
|
|
|
- callback(memberRlt.data)
|
|
|
- //更新members
|
|
|
- val indexOfMember = members.indexOfFirst { it.uid == uid }
|
|
|
- members[indexOfMember] = memberRlt.data
|
|
|
+ override fun getTabName(pos: Int): String {
|
|
|
+ return when (pages.getOrNull(pos)) {
|
|
|
+ ROOM_SETTING_PAGE -> {
|
|
|
+ getCompatString(R.string.room_setting)
|
|
|
}
|
|
|
|
|
|
- is Rlt.Failed -> {
|
|
|
- callback(null)
|
|
|
+ ROOM_ONLINE_USER_PAGE -> {
|
|
|
+ getCompatString(R.string.room_online_user)
|
|
|
+ }
|
|
|
+
|
|
|
+ else -> {
|
|
|
+ //ROOM_SUMMARY_PAGE
|
|
|
+ getCompatString(R.string.room_detail)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- override fun getMemberRole(uid: Long): MemberRoomRole {
|
|
|
- return memberViewModel.getRoomRole(uid)
|
|
|
- }
|
|
|
-
|
|
|
- private fun updateMemberCount(count: Int) {
|
|
|
- binding.memberCount.text =
|
|
|
- getCompatString(R.string.room_online_member_count, count)
|
|
|
- }
|
|
|
-
|
|
|
- private fun followUser(uid: Long) {
|
|
|
- followViewModel?.followUser(
|
|
|
- uid,
|
|
|
- FollowOpFrom.ROOM_DETAIL,
|
|
|
- followInRoom = App.instance.mediaManager.getJoinedMediaRoomId()
|
|
|
- )?.observe(viewLifecycleOwner) {
|
|
|
- showFailedToast(it)
|
|
|
+ override fun getItemCount(): Int {
|
|
|
+ return pages.size
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- private fun unfollowUser(uid: Long) {
|
|
|
- followViewModel?.unFollowUser(uid, FollowOpFrom.ROOM_DETAIL)?.observe(viewLifecycleOwner) {
|
|
|
- showFailedToast(it)
|
|
|
+ override fun getItemId(position: Int): Long {
|
|
|
+ return pages.getOrNull(position) ?: RecyclerView.NO_ID
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- private fun search() {
|
|
|
- val keyword = binding.searchEditText.text.toString().trim()
|
|
|
- if (keyword.isEmpty()) {
|
|
|
- showToast(getCompatString(APP_R.string.common_input_empty))
|
|
|
- return
|
|
|
+ override fun containsItem(itemId: Long): Boolean {
|
|
|
+ return pages.contains(itemId)
|
|
|
}
|
|
|
|
|
|
- binding.searchCancel.visibility = View.VISIBLE
|
|
|
- val resultList = members.filter {
|
|
|
- it.containsKeywordBySearch(keyword)
|
|
|
- }
|
|
|
- if (resultList.isEmpty()) {
|
|
|
- showSearchEmpty()
|
|
|
- return
|
|
|
- }
|
|
|
- adapter.submitList(resultList)
|
|
|
- }
|
|
|
+ override fun createFragment(position: Int): Fragment {
|
|
|
+ return when (pages.getOrNull(position)) {
|
|
|
+ ROOM_SETTING_PAGE -> {
|
|
|
+ RoomSettingFragment()
|
|
|
+ }
|
|
|
|
|
|
- private fun finishSearch() {
|
|
|
- binding.searchCancel.visibility = View.GONE
|
|
|
- adapter.submitList(members)
|
|
|
- }
|
|
|
+ ROOM_ONLINE_USER_PAGE -> {
|
|
|
+ RoomOnlineUserFragment()
|
|
|
+ }
|
|
|
|
|
|
- private fun showSearchEmpty() {
|
|
|
- val resultList = mutableListOf<RoomData>()
|
|
|
- resultList.add(RoomMemberSearchEmptyData)
|
|
|
- adapter.submitList(resultList)
|
|
|
+ else -> {
|
|
|
+ RoomSummaryFragment()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|