فهرست منبع

房间礼物面板

DoggyZhang 1 هفته پیش
والد
کامیت
18536dad99

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

@@ -28,6 +28,7 @@ import com.adealink.weparty.room.applymic.ApplyMicStore.onRecordChangedLD
 import com.adealink.weparty.room.applymic.HostApplyMicListDialog
 import com.adealink.weparty.room.chat.ChatInputDialog
 import com.adealink.weparty.room.databinding.FragmentDispatchRoomBottomOperateBinding
+import com.adealink.weparty.room.gift.RoomGiftPanelDialog
 import com.adealink.weparty.room.micseat.dispatcenter.MIC_HOST
 import com.adealink.weparty.room.sdk.service.roomService
 import com.adealink.weparty.room.setting.RoomSettingDialog
@@ -303,8 +304,7 @@ open class DispatchRoomBottomOperateFragment : BaseFragment(R.layout.fragment_di
     }
 
     private fun onGiftIconClick() {
-//        Router.getRouterInstance<BaseDialogFragment>(Room.SendGiftPanel.PATH)
-//            ?.show(parentFragmentManager, Room.SendGiftPanel.TAG)
+        RoomGiftPanelDialog().show(childFragmentManager)
     }
 
     private fun inputBoxClick() {

+ 192 - 0
module/room/src/main/java/com/adealink/weparty/room/gift/RoomGiftPanelDialog.kt

@@ -0,0 +1,192 @@
+package com.adealink.weparty.room.gift
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.core.content.ContextCompat
+import androidx.recyclerview.widget.GridLayoutManager
+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.frame.util.onClick
+import com.adealink.weparty.commonui.ext.gone
+import com.adealink.weparty.commonui.ext.show
+import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
+import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
+import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
+import com.adealink.weparty.commonui.widget.BottomDialogFragment
+import com.adealink.weparty.room.R
+import com.adealink.weparty.room.databinding.DialogRoomGiftPanelBinding
+import com.adealink.weparty.room.databinding.ItemRoomGiftBinding
+import com.adealink.weparty.room.databinding.ItemRoomGiftUserBinding
+
+data class RoomGiftUserData(
+    val id: String,
+    val avatar: String,
+    val tag: String,
+    var isSelected: Boolean = false
+)
+
+data class RoomGiftData(
+    val id: String,
+    val icon: String,
+    val name: String,
+    val price: Int,
+    var isSelected: Boolean = false
+)
+
+class RoomGiftUserItemViewBinder(private val listener: (RoomGiftUserData) -> Unit) :
+    ItemViewBinder<RoomGiftUserData, BindingViewHolder<ItemRoomGiftUserBinding>>() {
+
+    override fun onCreateViewHolder(
+        inflater: LayoutInflater,
+        parent: ViewGroup
+    ): BindingViewHolder<ItemRoomGiftUserBinding> {
+        return BindingViewHolder(ItemRoomGiftUserBinding.inflate(inflater, parent, false))
+    }
+
+    override fun onBindViewHolder(
+        holder: BindingViewHolder<ItemRoomGiftUserBinding>,
+        item: RoomGiftUserData
+    ) {
+        val context = holder.binding.root.context
+        holder.binding.ivAvatar.setImageUrl(item.avatar)
+        holder.binding.tvTag.text = item.tag
+
+        if (item.isSelected) {
+            holder.binding.ivAvatar.setBackgroundResource(R.drawable.shape_room_gift_user_avatar_border)
+            holder.binding.tvTag.setBackgroundResource(R.drawable.shape_room_gift_user_tag_bg_selected)
+            holder.binding.tvTag.setTextColor(ContextCompat.getColor(context, com.adealink.weparty.R.color.white))
+        } else {
+            holder.binding.ivAvatar.background = null
+            holder.binding.tvTag.setBackgroundResource(R.drawable.shape_room_gift_user_tag_bg)
+            holder.binding.tvTag.setTextColor(ContextCompat.getColor(context, com.adealink.weparty.R.color.color_FF2C2945))
+        }
+
+        holder.binding.root.onClick {
+            listener.invoke(item)
+        }
+    }
+}
+
+class RoomGiftItemViewBinder(private val listener: (RoomGiftData) -> Unit) :
+    ItemViewBinder<RoomGiftData, BindingViewHolder<ItemRoomGiftBinding>>() {
+
+    override fun onCreateViewHolder(
+        inflater: LayoutInflater,
+        parent: ViewGroup
+    ): BindingViewHolder<ItemRoomGiftBinding> {
+        return BindingViewHolder(ItemRoomGiftBinding.inflate(inflater, parent, false))
+    }
+
+    override fun onBindViewHolder(
+        holder: BindingViewHolder<ItemRoomGiftBinding>,
+        item: RoomGiftData
+    ) {
+        holder.binding.ivIcon.setImageUrl(item.icon)
+        holder.binding.tvName.text = item.name
+        holder.binding.tvPrice.text = item.price.toString()
+
+        if (item.isSelected) {
+            holder.binding.root.setBackgroundResource(R.drawable.shape_room_gift_item_bg_selected)
+        } else {
+            holder.binding.root.setBackgroundResource(R.drawable.shape_room_gift_item_bg)
+        }
+
+        holder.binding.root.onClick {
+            listener.invoke(item)
+        }
+    }
+}
+
+class RoomGiftPanelDialog : BottomDialogFragment(R.layout.dialog_room_gift_panel) {
+
+    private val binding by viewBinding(DialogRoomGiftPanelBinding::bind)
+
+    private val userAdapter by fastLazy { MultiTypeListAdapter<RoomGiftUserData>() }
+    private val giftAdapter by fastLazy { MultiTypeListAdapter<RoomGiftData>() }
+
+    private var giftQuantity = 1
+
+    override fun initViews() {
+        super.initViews()
+        initRecyclerViews()
+        initListeners()
+
+        // Mock data
+        val mockUsers = listOf(
+            RoomGiftUserData("1", "", "Host", isSelected = true),
+            RoomGiftUserData("2", "", "1", isSelected = false),
+            RoomGiftUserData("3", "", "2", isSelected = false)
+        )
+        userAdapter.submitList(mockUsers)
+
+        val mockGifts = (1..12).map {
+            RoomGiftData(it.toString(), "", "宇宙飞船", 32000)
+        }
+        giftAdapter.submitList(mockGifts)
+
+        updateBottomPanel()
+    }
+
+    private fun initRecyclerViews() {
+        // Users RecyclerView
+        userAdapter.register(RoomGiftUserItemViewBinder { clickedItem ->
+            val list = userAdapter.getCurrentList().map {
+                it.copy(isSelected = it.id == clickedItem.id)
+            }
+            userAdapter.submitList(list)
+            updateBottomPanel()
+        })
+        binding.rvUsers.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)
+        binding.rvUsers.adapter = userAdapter
+
+        // Gifts RecyclerView
+        giftAdapter.register(RoomGiftItemViewBinder { clickedItem ->
+            val list = giftAdapter.getCurrentList().map {
+                it.copy(isSelected = it.id == clickedItem.id)
+            }
+            giftAdapter.submitList(list)
+            giftQuantity = 1 // Reset quantity when a new gift is selected
+            updateBottomPanel()
+        })
+        binding.rvGifts.layoutManager = GridLayoutManager(context, 4)
+        binding.rvGifts.adapter = giftAdapter
+    }
+
+    private fun initListeners() {
+        binding.btnPlus.onClick {
+            giftQuantity++
+            updateBottomPanel()
+        }
+        binding.btnMinus.onClick {
+            if (giftQuantity > 1) {
+                giftQuantity--
+                updateBottomPanel()
+            }
+        }
+        binding.btnSend.onClick {
+            val selectedGift = giftAdapter.getCurrentList().find { it.isSelected }
+            if (selectedGift != null) {
+                // Send gift logic
+                dismiss()
+            }
+        }
+    }
+
+    private fun updateBottomPanel() {
+        val selectedGift = giftAdapter.getCurrentList().find { it.isSelected }
+        if (selectedGift != null) {
+            binding.llQuantity.show()
+            binding.tvQuantity.text = giftQuantity.toString()
+            binding.btnSend.setBackgroundResource(R.drawable.shape_room_gift_btn_send_bg_selected)
+            val color = ContextCompat.getColor(requireContext(), com.adealink.weparty.R.color.color_FF2C2945)
+            binding.btnSend.setTextColor(color)
+        } else {
+            binding.llQuantity.gone()
+            binding.btnSend.setBackgroundResource(R.drawable.shape_room_gift_btn_send_bg_unselected)
+            val color = ContextCompat.getColor(requireContext(), com.adealink.weparty.R.color.color_80FFFFFF)
+            binding.btnSend.setTextColor(color)
+        }
+    }
+}

+ 5 - 0
module/room/src/main/res/drawable/shape_room_gift_btn_send_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#2A86E6" />
+    <corners android:radius="16dp" />
+</shape>

+ 5 - 0
module/room/src/main/res/drawable/shape_room_gift_btn_send_bg_selected.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#00DFD7" />
+    <corners android:radius="16dp" />
+</shape>

+ 5 - 0
module/room/src/main/res/drawable/shape_room_gift_btn_send_bg_unselected.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#33FFFFFF" />
+    <corners android:radius="16dp" />
+</shape>

+ 5 - 0
module/room/src/main/res/drawable/shape_room_gift_item_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@android:color/transparent" />
+    <corners android:radius="12dp" />
+</shape>

+ 6 - 0
module/room/src/main/res/drawable/shape_room_gift_item_bg_selected.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#1A00DFD7" />
+    <stroke android:width="1dp" android:color="#FF00DFD7" />
+    <corners android:radius="12dp" />
+</shape>

+ 5 - 0
module/room/src/main/res/drawable/shape_room_gift_panel_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#242138" />
+    <corners android:topLeftRadius="20dp" android:topRightRadius="20dp" />
+</shape>

+ 5 - 0
module/room/src/main/res/drawable/shape_room_gift_quantity_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#33FFFFFF" />
+    <corners android:radius="16dp" />
+</shape>

+ 6 - 0
module/room/src/main/res/drawable/shape_room_gift_user_avatar_border.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <stroke android:width="1dp" android:color="#00DFD7" />
+    <solid android:color="@android:color/transparent" />
+</shape>

+ 5 - 0
module/room/src/main/res/drawable/shape_room_gift_user_tag_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#FFFFFF" />
+    <corners android:radius="7dp" />
+</shape>

+ 5 - 0
module/room/src/main/res/drawable/shape_room_gift_user_tag_bg_selected.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#00DFD7" />
+    <corners android:radius="7dp" />
+</shape>

+ 137 - 0
module/room/src/main/res/layout/dialog_room_gift_panel.xml

@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/shape_room_gift_panel_bg"
+    android:paddingBottom="20dp">
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_send_to"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="20dp"
+        android:text="Send to :"
+        android:textColor="@color/color_FF86909C"
+        android:textSize="14sp"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_users"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginEnd="16dp"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_send_to"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/tv_send_to"
+        app:layout_constraintTop_toTopOf="@+id/tv_send_to" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_gifts"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:layout_marginStart="12dp"
+        android:layout_marginEnd="12dp"
+        android:minHeight="200dp"
+        app:layout_constraintTop_toBottomOf="@+id/rv_users" />
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_bottom"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:layout_marginStart="16dp"
+        android:layout_marginEnd="16dp"
+        app:layout_constraintTop_toBottomOf="@+id/rv_gifts">
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_diamond"
+            android:layout_width="16dp"
+            android:layout_height="16dp"
+            android:src="@drawable/common_wallet_diamond_ic"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_balance"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="4dp"
+            android:text="100 >"
+            android:textColor="@color/white"
+            android:textSize="16sp"
+            android:textStyle="bold"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toEndOf="@+id/iv_diamond"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/btn_send"
+            android:layout_width="wrap_content"
+            android:layout_height="32dp"
+            android:background="@drawable/shape_room_gift_btn_send_bg"
+            android:gravity="center"
+            android:paddingHorizontal="20dp"
+            android:text="Send"
+            android:textColor="@color/white"
+            android:textSize="14sp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <LinearLayout
+            android:id="@+id/ll_quantity"
+            android:layout_width="wrap_content"
+            android:layout_height="32dp"
+            android:layout_marginEnd="12dp"
+            android:background="@drawable/shape_room_gift_quantity_bg"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:visibility="gone"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@+id/btn_send"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/btn_minus"
+                android:layout_width="24dp"
+                android:layout_height="24dp"
+                android:layout_marginStart="4dp"
+                android:gravity="center"
+                android:text="-"
+                android:textColor="@color/white"
+                android:textSize="18sp"
+                android:textStyle="bold" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_quantity"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:layout_marginEnd="8dp"
+                android:minWidth="30dp"
+                android:gravity="center"
+                android:text="999"
+                android:textColor="@color/white"
+                android:textSize="14sp" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/btn_plus"
+                android:layout_width="24dp"
+                android:layout_height="24dp"
+                android:layout_marginEnd="4dp"
+                android:gravity="center"
+                android:text="+"
+                android:textColor="@color/white"
+                android:textSize="18sp"
+                android:textStyle="bold" />
+        </LinearLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 61 - 0
module/room/src/main/res/layout/item_room_gift.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="120dp"
+    android:layout_margin="4dp"
+    android:background="@drawable/shape_room_gift_item_bg">
+
+    <com.adealink.frame.image.view.NetworkImageView
+        android:id="@+id/iv_icon"
+        style="@style/CommonNetworkImage"
+        android:layout_width="64dp"
+        android:layout_height="64dp"
+        android:layout_marginTop="8dp"
+        app:actualImageScaleType="fitCenter"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:src="@color/color_AAAAAA" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_name"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="4dp"
+        android:gravity="center"
+        android:singleLine="true"
+        android:ellipsize="end"
+        android:textColor="@color/white"
+        android:textSize="12sp"
+        app:layout_constraintTop_toBottomOf="@+id/iv_icon"
+        tools:text="宇宙飞船" />
+
+    <LinearLayout
+        android:id="@+id/ll_price"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="2dp"
+        android:gravity="center_vertical"
+        android:orientation="horizontal"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/tv_name">
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:layout_width="10dp"
+            android:layout_height="10dp"
+            android:src="@drawable/common_wallet_diamond_ic" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_price"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="2dp"
+            android:textColor="@color/color_FF86909C"
+            android:textSize="10sp"
+            tools:text="32000" />
+    </LinearLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 38 - 0
module/room/src/main/res/layout/item_room_gift_user.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_marginEnd="12dp">
+
+    <com.adealink.frame.image.view.NetworkImageView
+        android:id="@+id/iv_avatar"
+        style="@style/CommonNetworkImage"
+        android:layout_width="36dp"
+        android:layout_height="36dp"
+        app:actualImageScaleType="focusCrop"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:roundAsCircle="true"
+        tools:src="@color/color_AAAAAA" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_tag"
+        android:layout_width="wrap_content"
+        android:layout_height="14dp"
+        android:layout_marginTop="-6dp"
+        android:background="@drawable/shape_room_gift_user_tag_bg"
+        android:gravity="center"
+        android:minWidth="24dp"
+        android:paddingHorizontal="4dp"
+        android:textColor="@color/color_FF2C2945"
+        android:textSize="9sp"
+        android:textStyle="bold"
+        app:layout_constraintEnd_toEndOf="@+id/iv_avatar"
+        app:layout_constraintStart_toStartOf="@+id/iv_avatar"
+        app:layout_constraintTop_toBottomOf="@+id/iv_avatar"
+        tools:text="Host" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>