diff --git a/VisualNovel/app/src/main/assets/uitoken/token_sys.json b/VisualNovel/app/src/main/assets/uitoken/token_sys.json index 6f19e8a..2d24f54 100644 --- a/VisualNovel/app/src/main/assets/uitoken/token_sys.json +++ b/VisualNovel/app/src/main/assets/uitoken/token_sys.json @@ -202,7 +202,14 @@ "color.chat.setting.item.bg": "$glo.color.chat.setting.item.bg", "color.switch.view.normal": "$glo.color.switchview.normal", "color.switch.view.checked": "$glo.color.switchview.checked", - "color.switch.view.stroke": "$glo.color.switchview.stroke" + "color.switch.view.stroke": "$glo.color.switchview.stroke", + + "female.text.color": "$female.text.color", + "male.text.color": "$male.text.color", + "female.bg": "$female.bg", + "male.bg": "$male.bg" + + } diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/entity/response/ChatBubble.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/entity/response/ChatBubble.kt index 9fd0233..a13570b 100644 --- a/VisualNovel/app/src/main/java/com/remax/visualnovel/entity/response/ChatBubble.kt +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/entity/response/ChatBubble.kt @@ -3,9 +3,7 @@ package com.remax.visualnovel.entity.response import android.os.Parcelable import kotlinx.parcelize.Parcelize -/** - * Created by HJW on 2025/8/18 - */ + @Parcelize data class ChatBubble( /** diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/entity/response/ChatSound.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/entity/response/ChatSound.kt new file mode 100644 index 0000000..e3b0354 --- /dev/null +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/entity/response/ChatSound.kt @@ -0,0 +1,60 @@ +package com.remax.visualnovel.entity.response + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + + +@Parcelize +data class ChatSound( + /** + * code + */ + val code: String, + + /** + * id + */ + val id: Long, + + /** + * 图片url + */ + val imgUrl: String?, + + /** + * 名称 + */ + val name: String, + + /** + * 名称 + */ + val description: String, + + /** + * actor 性别 + */ + var isMale: Boolean, + + /** + * 当前用户是否解锁 false:未解锁,true:解锁 + */ + val isUnlock: Boolean? = null, + + /** + * 解锁心动等级 类型为HEARTBEAT_LEVEL时才有用 + */ + val unlockHeartbeatLevel: String? = null, + + /** + * 解锁类型 MEMBER:会员 HEARTBEAT_LEVEL:心动等级 + */ + val unlockType: String? = null, + var isDefault: Boolean, + var select: Boolean = false +) : Parcelable { + companion object { + const val MEMBER = "MEMBER" + const val HEARTBEAT_LEVEL = "HEARTBEAT_LEVEL" + } +} diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/ChatSettingItemView.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/ChatSettingItemView.kt deleted file mode 100644 index 1f98741..0000000 --- a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/ChatSettingItemView.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.remax.visualnovel.ui.chat.ui - - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import android.widget.LinearLayout -import com.remax.visualnovel.databinding.ChatSettingItemBinding - -class ChatSettingItemView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : LinearLayout(context, attrs, defStyleAttr) { - - private var mLeftIconRes : Int = 0 - private var mTitleRes : Int = 0 - private var mRightIconRes : Int = 0 - private lateinit var mRightView : View - - private var mBinding = ChatSettingItemBinding.inflate(LayoutInflater.from(context)) - - - fun setItemClickListener (clickHandler: () -> Unit) { - setOnClickListener { - clickHandler.invoke() - } - } - - fun setLeftIconRes (leftIconRes: Int) { - - } - -} diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/expandableSelector/ExpandBgSubView.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/expandableSelector/ExpandBgSubView.kt new file mode 100644 index 0000000..60cc574 --- /dev/null +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/expandableSelector/ExpandBgSubView.kt @@ -0,0 +1,42 @@ +package com.remax.visualnovel.ui.chat.ui.expandableSelector + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.drake.brv.annotaion.DividerOrientation +import com.drake.brv.utils.divider +import com.drake.brv.utils.grid +import com.drake.brv.utils.setup +import com.remax.visualnovel.databinding.LayoutSettingBgSubViewBinding + +class ExpandBgSubView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr) { + + private var mBinding: LayoutSettingBgSubViewBinding + + + init { + mBinding = LayoutSettingBgSubViewBinding.inflate(LayoutInflater.from(context)) + with(mBinding) { + initRv(itemsRv) + } + } + + + private fun initRv(itemsRv: RecyclerView) { + itemsRv.grid(2) + .divider { + setDivider(16, true) + orientation = DividerOrientation.VERTICAL + }.setup { + + } + } + + +} \ No newline at end of file diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/expandableSelector/ExpandBubbleSubView.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/expandableSelector/ExpandBubbleSubView.kt new file mode 100644 index 0000000..b488795 --- /dev/null +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/expandableSelector/ExpandBubbleSubView.kt @@ -0,0 +1,41 @@ +package com.remax.visualnovel.ui.chat.ui.expandableSelector + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.drake.brv.annotaion.DividerOrientation +import com.drake.brv.utils.divider +import com.drake.brv.utils.grid +import com.drake.brv.utils.setup +import com.remax.visualnovel.databinding.LayoutSettingBubbleSubViewBinding + +class ExpandBubbleSubView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr) { + + private var mBinding: LayoutSettingBubbleSubViewBinding + + + init { + mBinding = LayoutSettingBubbleSubViewBinding.inflate(LayoutInflater.from(context)) + with(mBinding) { + initRv(itemsRv) + } + } + + private fun initRv(itemsRv: RecyclerView) { + itemsRv.grid(2) + .divider { + setDivider(16, true) + orientation = DividerOrientation.VERTICAL + }.setup { + + } + } + + +} \ No newline at end of file diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/expandableSelector/MaxNumView.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/expandableSelector/ExpandSoundSelectView.kt similarity index 61% rename from VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/expandableSelector/MaxNumView.kt rename to VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/expandableSelector/ExpandSoundSelectView.kt index e0c871e..8360981 100644 --- a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/expandableSelector/MaxNumView.kt +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/expandableSelector/ExpandSoundSelectView.kt @@ -5,29 +5,25 @@ import android.animation.AnimatorListenerAdapter import android.animation.ObjectAnimator import android.animation.ValueAnimator import android.content.Context -import android.graphics.drawable.GradientDrawable import android.util.AttributeSet import android.view.LayoutInflater -import android.view.View +import android.view.ViewGroup import android.view.animation.AccelerateDecelerateInterpolator import android.widget.LinearLayout -import android.widget.TextView import com.remax.visualnovel.R -import com.remax.visualnovel.databinding.LayoutExpandSelectViewBinding -import com.remax.visualnovel.utils.spannablex.utils.dp +import com.remax.visualnovel.databinding.LayoutExpandSoundSelectViewBinding -class MaxNumView @JvmOverloads constructor( +class ExpandSoundSelectView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : LinearLayout(context, attrs, defStyleAttr) { - private lateinit var mBinding: LayoutExpandSelectViewBinding + private lateinit var mBinding: LayoutExpandSoundSelectViewBinding private var isExpanded = false private var animationDuration = 300 - private var items: List = emptyList() private var itemSelectedListener: OnItemSelectedListener? = null init { @@ -35,7 +31,7 @@ class MaxNumView @JvmOverloads constructor( } private fun initView(context: Context, attrs: AttributeSet?) { - mBinding = LayoutExpandSelectViewBinding.inflate(LayoutInflater.from(context), this, true) + mBinding = LayoutExpandSoundSelectViewBinding.inflate(LayoutInflater.from(context)) setupAttributes(attrs) setupClickListeners() } @@ -63,76 +59,6 @@ class MaxNumView @JvmOverloads constructor( mBinding.titleText.text = context.resources.getString(titleRes) } - fun setItems(newItems: List) { - items = newItems - updateItemsView() - } - - - - private fun updateItemsView() { - mBinding.itemsContainer.removeAllViews() - - items.forEachIndexed { index, item -> - val itemView = createItemView(item, index) - mBinding.itemsContainer.addView(itemView) - - if (index < items.size - 1) { - addDivider() - } - } - } - - private fun createItemView(item: SelectorItem, position: Int): View { - val itemView = LayoutInflater.from(context) - .inflate(R.layout.layout_expand_view_item, mBinding.itemsContainer, false) - - val colorIndicator = itemView.findViewById(R.id.colorIndicator) - val itemName = itemView.findViewById(R.id.itemName) - val itemDesc = itemView.findViewById(R.id.itemDesc) - val recommendedTag = itemView.findViewById(R.id.recommendedTag) - val selectedDot = itemView.findViewById(R.id.selectedDot) - - (colorIndicator.background as? GradientDrawable)?.setColor(item.color) - - itemName.text = item.name - itemDesc.text = item.description - recommendedTag.text = item.pointsInfo - selectedDot.visibility = if (item.isSelected) VISIBLE else GONE - - itemView.setOnClickListener { - selectItem(position) - itemSelectedListener?.onItemSelected(position, item) - } - - return itemView - } - - private fun addDivider() { - val divider = View(context).apply { - layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, 1.dp).apply { - setBackgroundColor(context.resources.getColor(R.color.chat_setting_divider_color)) - marginStart = 10.dp - marginEnd = 10.dp - } - } - mBinding.itemsContainer.addView(divider) - } - - - fun selectItem(position: Int) { - items.forEachIndexed { index, item -> - item.isSelected = index == position - } - updateItemsView() - - if (position in items.indices) { - mBinding.titleText.text = items[position].name - } - - collapse() - } - fun toggle() { if (isExpanded) collapse() else expand() @@ -208,4 +134,11 @@ class MaxNumView @JvmOverloads constructor( interface OnItemSelectedListener { fun onItemSelected(position: Int, item: SelectorItem) } + + + /* new added */ + fun setCustomExpandView(expandView: ViewGroup) { + mBinding.itemsContainer.addView(expandView) + } + } \ No newline at end of file diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/expandableSelector/ExpandSoundSubView.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/expandableSelector/ExpandSoundSubView.kt new file mode 100644 index 0000000..fc98a3e --- /dev/null +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ui/expandableSelector/ExpandSoundSubView.kt @@ -0,0 +1,91 @@ +package com.remax.visualnovel.ui.chat.ui.expandableSelector + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.drake.brv.annotaion.DividerOrientation +import com.drake.brv.utils.bindingAdapter +import com.drake.brv.utils.divider +import com.drake.brv.utils.grid +import com.drake.brv.utils.setup +import com.remax.visualnovel.R +import com.remax.visualnovel.databinding.LayoutItemSettingSoundBinding +import com.remax.visualnovel.databinding.LayoutSettingSoundSubViewBinding +import com.remax.visualnovel.entity.response.ChatSound +import com.remax.visualnovel.widget.uitoken.changeBackground +import com.remax.visualnovel.widget.uitoken.view.UITokenLinearLayout + +class ExpandSoundSubView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr) { + private var mBinding: LayoutSettingSoundSubViewBinding + + + init { + mBinding = LayoutSettingSoundSubViewBinding.inflate(LayoutInflater.from(context)) + with(mBinding) { + initRadioGroup(radioGroup) + initRv(itemsRv) + } + } + + private fun initRadioGroup(radioGroup: UITokenLinearLayout) { + // TODO("Not yet implemented") + } + + fun playActorSound(bubble : ChatSound) { + + } + + fun setSelectedSound() { + + } + + private fun initRv(itemsRv: RecyclerView) { + itemsRv.grid(2) + .divider { + setDivider(16, true) + orientation = DividerOrientation.VERTICAL + }.setup { + addType(R.layout.layout_item_setting_sound) + + onClick(R.id.left_container) { + val bubble = getModel() + playActorSound(bubble) + } + + onClick(R.id.tv_select) { + val bubble = getModel() + if (!bubble.select) { + itemsRv.bindingAdapter.models?.filterIsInstance()?.forEach { item -> + item.select = item == bubble + } + itemsRv.bindingAdapter.notifyDataSetChanged() + setSelectedSound() + } + } + + onBind { + val item = getModel() + with(getBinding()) { + if (!item.imgUrl.isNullOrEmpty()) { + userAvatar.setImageResource(R.mipmap.sex_man_big) + } else { + userAvatar.setImageResource(if (item.isMale) R.mipmap.ic_gender_male else R.mipmap.ic_gender_female) + } + + tvSoundName.text = item.name + itemRoot.changeBackground(backgroundUIColorToken = if (item.isMale) R.string.male_bg else R.string.female_bg) + tvSoundDescrible.setTextColor(context.resources.getColor(if (item.isMale) R.color.male_text_color else R.color.female_text_color)) + tvSoundDescrible.text = item.description + } + } + } + } + + +} \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/layout/layout_chat_menu_view.xml b/VisualNovel/app/src/main/res/layout/layout_chat_menu_view.xml index 48623c3..722ec86 100644 --- a/VisualNovel/app/src/main/res/layout/layout_chat_menu_view.xml +++ b/VisualNovel/app/src/main/res/layout/layout_chat_menu_view.xml @@ -120,7 +120,7 @@ android:layout_marginTop="10dp" > - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/layout/layout_item_setting_bg.xml b/VisualNovel/app/src/main/res/layout/layout_item_setting_bg.xml new file mode 100644 index 0000000..cfdf1f7 --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/layout_item_setting_bg.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/layout/layout_item_setting_bubble.xml b/VisualNovel/app/src/main/res/layout/layout_item_setting_bubble.xml new file mode 100644 index 0000000..b606fd1 --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/layout_item_setting_bubble.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/layout/layout_item_setting_sound.xml b/VisualNovel/app/src/main/res/layout/layout_item_setting_sound.xml new file mode 100644 index 0000000..8b7e488 --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/layout_item_setting_sound.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/layout/layout_setting_bg_sub_view.xml b/VisualNovel/app/src/main/res/layout/layout_setting_bg_sub_view.xml new file mode 100644 index 0000000..26d6d57 --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/layout_setting_bg_sub_view.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/layout/layout_setting_bubble_sub_view.xml b/VisualNovel/app/src/main/res/layout/layout_setting_bubble_sub_view.xml new file mode 100644 index 0000000..c17fc60 --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/layout_setting_bubble_sub_view.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/layout/layout_setting_sound_sub_view.xml b/VisualNovel/app/src/main/res/layout/layout_setting_sound_sub_view.xml new file mode 100644 index 0000000..a7ba96e --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/layout_setting_sound_sub_view.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/setting_sound_play.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/setting_sound_play.webp new file mode 100644 index 0000000..803a4fa Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/setting_sound_play.webp differ diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/temp_avatar.jpg b/VisualNovel/app/src/main/res/mipmap-xxhdpi/temp_avatar.jpg new file mode 100644 index 0000000..69e254c Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/temp_avatar.jpg differ diff --git a/VisualNovel/app/src/main/res/values/colors.xml b/VisualNovel/app/src/main/res/values/colors.xml index 545a157..126a3a6 100644 --- a/VisualNovel/app/src/main/res/values/colors.xml +++ b/VisualNovel/app/src/main/res/values/colors.xml @@ -203,6 +203,12 @@ #ffececf9 + #ff7326ae + #ff4876c9 + #ffe5c4ff + #ffc7dbff + + diff --git a/VisualNovel/app/src/main/res/values/ui_tokens.xml b/VisualNovel/app/src/main/res/values/ui_tokens.xml index caa2105..194b317 100644 --- a/VisualNovel/app/src/main/res/values/ui_tokens.xml +++ b/VisualNovel/app/src/main/res/values/ui_tokens.xml @@ -211,4 +211,9 @@ color.switch.view.stroke + female.text.color + male.text.color + female.bg + male.bg + \ No newline at end of file