新增贵族特权详情弹窗

This commit is contained in:
huangjian
2021-12-30 11:45:16 +08:00
parent a8ce76e649
commit dd845adcac
8 changed files with 219 additions and 71 deletions

View File

@@ -0,0 +1,30 @@
package com.yizhuan.erban.vip
import android.os.Bundle
import com.yizhuan.erban.base.BaseDialog
import com.yizhuan.erban.databinding.DialogRoomPkRuleBinding
import com.yizhuan.erban.databinding.DialogVipAuthDetailsBinding
import com.yizhuan.erban.ui.utils.load
class VipAuthDetailsDialog : BaseDialog<DialogVipAuthDetailsBinding>() {
companion object {
@JvmStatic
fun newInstance(icon: String, name: String, desc: String): VipAuthDetailsDialog {
val args = Bundle()
args.putString("icon", icon)
args.putString("name", name)
args.putString("desc", desc)
val fragment = VipAuthDetailsDialog()
fragment.arguments = args
return fragment
}
}
override fun init() {
binding.ivClose.setOnClickListener { dismissAllowingStateLoss() }
binding.ivAuthIcon.load(requireArguments().getString("icon", ""))
binding.tvAuthDesc.text = requireArguments().getString("desc", "")
binding.tvAuthName.text = requireArguments().getString("name", "")
}
}

View File

@@ -34,7 +34,6 @@ import com.yizhuan.xchat_android_core.pay.bean.PaymentResult
import com.yizhuan.xchat_android_core.pay.model.unionpay.UnionPayModel
import com.yizhuan.xchat_android_core.vip.VipAuthInfo
import com.yizhuan.xchat_android_core.vip.VipInfo
import com.yizhuan.xchat_android_core.vip.VipPageInfo
import com.yizhuan.xchat_android_library.utils.JavaUtil
import java.util.*
@@ -53,16 +52,11 @@ class VipMainActivity : BaseViewBindingActivity<ActivityVipMainBinding>(),
private const val BIND_CODE_GOLD = 200
}
private val perAdapter = VipAuthAdapter()
private val authAdapter = VipAuthAdapter()
private lateinit var rvDelegate: RVDelegate<VipAuthInfo>
private val roomUid by lazy { intent.getLongExtra("roomUid", 0) }
private val vipViewModel: VipViewModel by viewModels()
private var currVipInfo: VipInfo? = null
private var vipInfos: List<VipInfo>? = null
private var myVipInfo: VipInfo? = null
private var vipPageInfo: VipPageInfo? = null
@SuppressLint("SetTextI18n")
override fun init() {
initWhiteTitleBar("贵族中心")
@@ -70,61 +64,79 @@ class VipMainActivity : BaseViewBindingActivity<ActivityVipMainBinding>(),
override fun performAction(view: View) {
}
})
rvDelegate = RVDelegate.Builder<VipAuthInfo>()
.setLayoutManager(GridLayoutManager(this, 3))
.setRecyclerView(binding.recyclerView)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "没有搜索结果"))
.setAdapter(perAdapter)
.setAdapter(authAdapter)
.build()
binding.recyclerView.isNestedScrollingEnabled = false
authAdapter.setOnItemClickListener { _, _, position ->
authAdapter.getItem(position)?.let {
VipAuthDetailsDialog.newInstance(it.descPic, it.authName, it.authIntro).show(this)
}
}
vipViewModel.getVipPageInfo()
vipViewModel.vipInfoLiveData.observe(this) {
vipPageInfo = it
vipViewModel.authInfosLiveData.observe(this) {
authAdapter.setNewData(it)
}
vipViewModel.vipInfosLiveData.observe(this) {
it?.let {
vipInfos = it.vipInfos
myVipInfo = it.vipInfos?.find { vipInfo -> it.currLevel == vipInfo.vipLevel }
val nextVipInfo =
it.vipInfos?.getOrNull((it.vipInfos?.indexOf(myVipInfo) ?: -1) + 1)
initTitleTab(it)
}
}
if (nextVipInfo == null || nextVipInfo == myVipInfo) {
vipViewModel.myVipInfoLiveData.observe(this) {
it?.let {
binding.llMyVipInfo.isVisible = true
binding.tvOpenVip.isVisible = false
binding.tvNotOpen.text = "当前权力值:${it.currScore}"
binding.tvCurrValue.text = "当前${it.currScore}"
binding.tvCurrLevelName.text = it.vipName
binding.tvNextLevelName.text = it.nextVipName
binding.tvKeepValue.text = "保级${it.levelKeepScore}"
binding.tvUpValue.text = "升级${it.levelUpScore}"
binding.tvUpgradeValue.text = "${it.levelUpScore - it.currScore}"
binding.tvResidueTime.text = TimeUtil.getElapseTimeForVip(it.remainSeconds)
binding.seekBar.max = it.levelUpScore
binding.seekBar.progress = it.currScore
}
val currValueParams =
binding.tvCurrValue.layoutParams as ConstraintLayout.LayoutParams
currValueParams.horizontalBias = it.currScore.toFloat() / it.levelUpScore
binding.tvCurrValue.layoutParams = currValueParams
myVipInfo?.let { vipInfo ->
val keepParams =
binding.ivKeepIndicator.layoutParams as ConstraintLayout.LayoutParams
keepParams.horizontalBias = it.levelKeepScore.toFloat() / it.levelUpScore
binding.ivKeepIndicator.layoutParams = keepParams
binding.llMyVipInfo.isVisible = true
binding.tvOpenVip.isVisible = false
binding.tvNotOpen.text = "当前权力值:${it.currScore}"
binding.tvCurrValue.text = "当前${it.currScore}"
binding.tvCurrLevelName.text = myVipInfo?.vipName
binding.tvNextLevelName.text = nextVipInfo?.vipName
binding.tvKeepValue.text = "保级${vipInfo.levelKeepScore}"
binding.tvUpValue.text = "升级${vipInfo.levelUpScore}"
binding.tvUpgradeValue.text = "${vipInfo.levelUpScore - it.currScore}"
binding.tvResidueTime.text = TimeUtil.getElapseTimeForVip(it.remainSeconds)
binding.seekBar.max = vipInfo.levelUpScore
binding.seekBar.progress = it.currScore
} ?: run {
binding.llMyVipInfo.isVisible = false
binding.tvOpenVip.isVisible = true
binding.tvNotOpen.text = "尚未开通贵族"
}
}
val currValueParams =
binding.tvCurrValue.layoutParams as ConstraintLayout.LayoutParams
currValueParams.horizontalBias = it.currScore.toFloat() / vipInfo.levelUpScore
binding.tvCurrValue.layoutParams = currValueParams
vipViewModel.currVipInfoLiveData.observe(this) {
val myVipInfo = vipViewModel.myVipInfoLiveData.value
binding.ivMyLevel.isInvisible = it?.vipLevel != myVipInfo?.vipLevel
binding.tvNotOpen.isInvisible =
!(it?.vipLevel == myVipInfo?.vipLevel || myVipInfo == null)
binding.ivVipIcon.load(it?.vipLogo)
binding.tvAuthNum.text =
"${it?.ownAuthTypes?.size ?: 0}/${vipViewModel.authInfosLiveData.value?.size ?: 0}"
authAdapter.setVipInfo(it)
authAdapter.notifyDataSetChanged()
}
val keepParams =
binding.ivKeepIndicator.layoutParams as ConstraintLayout.LayoutParams
keepParams.horizontalBias =
vipInfo.levelKeepScore.toFloat() / vipInfo.levelUpScore
binding.ivKeepIndicator.layoutParams = keepParams
} ?: run {
binding.llMyVipInfo.isVisible = false
binding.tvOpenVip.isVisible = true
binding.tvNotOpen.text = "尚未开通贵族"
}
initTitleTab()
perAdapter.setNewData(it.vipAuthInfos)
vipViewModel.pageLiveData.observe(this) {
it?.let {
binding.magicIndicator.onPageSelected(it)
}
}
@@ -142,13 +154,12 @@ class VipMainActivity : BaseViewBindingActivity<ActivityVipMainBinding>(),
}
}
/**
* 初始化推荐和派对tab
*/
private fun initTitleTab() {
private fun initTitleTab(vipInfos: List<VipInfo>) {
val tagList: MutableList<String> = ArrayList()
vipInfos?.forEach {
vipInfos.forEach {
tagList.add(it.vipName)
}
val commonNavigator = CommonNavigator(context)
@@ -158,26 +169,11 @@ class VipMainActivity : BaseViewBindingActivity<ActivityVipMainBinding>(),
commonNavigator.adapter = magicIndicatorAdapter
binding.magicIndicator.navigator = commonNavigator
commonNavigator.titleContainer.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE
onItemSelect(if (myVipInfo == null) 0 else vipInfos?.indexOf(myVipInfo) ?: 0, null)
}
@SuppressLint("SetTextI18n")
override fun onItemSelect(position: Int, view: TextView?) {
currVipInfo = vipInfos?.getOrNull(position)
binding.ivMyLevel.isInvisible = currVipInfo?.vipLevel != myVipInfo?.vipLevel
binding.tvNotOpen.text = if (myVipInfo == null) {
"尚未开通贵族"
} else {
"当前权力值:${vipPageInfo?.currScore ?: 0}"
}
binding.tvNotOpen.isInvisible =
!(currVipInfo?.vipLevel == myVipInfo?.vipLevel || myVipInfo == null)
binding.ivVipIcon.load(currVipInfo?.vipLogo)
binding.tvAuthNum.text =
"${currVipInfo?.ownAuthTypes?.size ?: 0}/${vipPageInfo?.vipAuthInfos?.size ?: 0}"
perAdapter.setVipInfo(currVipInfo)
binding.magicIndicator.onPageSelected(position)
perAdapter.notifyDataSetChanged()
vipViewModel.onItemSelect(position)
}
override fun onResume() {

View File

@@ -8,6 +8,7 @@ import com.yizhuan.xchat_android_core.home.bean.*
import com.yizhuan.xchat_android_core.home.model.HomeModel
import com.yizhuan.xchat_android_core.utils.net.ServerException
import com.yizhuan.xchat_android_core.utils.toast
import com.yizhuan.xchat_android_core.vip.VipAuthInfo
import com.yizhuan.xchat_android_core.vip.VipInfo
import com.yizhuan.xchat_android_core.vip.VipModel
import com.yizhuan.xchat_android_core.vip.VipPageInfo
@@ -16,13 +17,56 @@ import kotlinx.coroutines.async
class VipViewModel : BaseViewModel() {
private val _vipInfoLiveData = MutableLiveData<VipPageInfo>()
val vipInfoLiveData: LiveData<VipPageInfo> = _vipInfoLiveData
fun getVipPageInfo(){
private val _authInfosLiveData = MutableLiveData<List<VipAuthInfo>>()
val authInfosLiveData: LiveData<List<VipAuthInfo>> = _authInfosLiveData
private val _vipInfosLiveData = MutableLiveData<List<VipInfo>>()
val vipInfosLiveData: LiveData<List<VipInfo>> = _vipInfosLiveData
private val _myVipInfoLiveData = MutableLiveData<VipInfo>()
val myVipInfoLiveData: LiveData<VipInfo> = _myVipInfoLiveData
private val _currVipInfoLiveData = MutableLiveData<VipInfo>()
val currVipInfoLiveData: LiveData<VipInfo> = _currVipInfoLiveData
private val _pageLiveData = MutableLiveData<Int>()
val pageLiveData: LiveData<Int> = _pageLiveData
fun getVipPageInfo() {
safeLaunch {
_vipInfoLiveData.value = VipModel.getVipPageInfo()
val vipPageInfo = VipModel.getVipPageInfo()
vipPageInfo?.let {
_authInfosLiveData.value = it.vipAuthInfos
_vipInfosLiveData.value = it.vipInfos
if (it.currLevel == 0) {
_myVipInfoLiveData.value = null
_pageLiveData.value = 0
} else {
var position = 0
_myVipInfoLiveData.value =
it.vipInfos?.find { vipInfo -> it.currLevel == vipInfo.vipLevel }?.copy()
?.apply {
position = it.vipInfos?.indexOf(this) ?: -1
val nextVipInfo =
it.vipInfos?.getOrNull(position + 1)
nextVipName =
if (nextVipInfo?.vipName == vipName) null else nextVipInfo?.vipName
remainSeconds = it.remainSeconds
currLevel = it.currLevel
currScore = it.currScore
}
onItemSelect(if (position < 0) 0 else position)
}
}
}
}
fun onItemSelect(position: Int) {
_currVipInfoLiveData.value = vipInfosLiveData.value?.getOrNull(position)
_pageLiveData.value = position
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:layout_gravity="center">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="300dp"
android:layout_height="286dp"
android:layout_gravity="center"
android:background="@drawable/bg_vip_dialog"
android:orientation="vertical">
<FrameLayout
android:id="@+id/fl_auth_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:background="@drawable/bg_vip_auth_img"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv_auth_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</FrameLayout>
<TextView
android:id="@+id/tv_auth_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:textColor="#ffffe3af"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/fl_auth_icon"
tools:text="聊天气泡" />
<TextView
android:id="@+id/tv_auth_desc"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="12dp"
android:ellipsize="end"
android:maxLines="3"
android:textColor="#ffffe3af"
android:textSize="14sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_auth_name"
tools:text="剩余时间说明剩余时间说明剩余时间明明铭剩余时间说明剩余时间说明剩余时间说明明剩余时间说明说明说明说明说明说明说明说" />
<ImageView
android:id="@+id/iv_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="9dp"
android:layout_marginEnd="14dp"
android:src="@drawable/ic_vip_dialog_close"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>

View File

@@ -10,7 +10,11 @@ data class VipInfo(
val vipIcon: String = "",
val vipLevel: Int = 0,
val vipLogo: String = "",
val vipName: String = ""
val vipName: String = "",
var remainSeconds: Int = 0,
var currLevel: Int = 0,
var currScore: Int = 0,
var nextVipName: String? = null
) {
override fun equals(other: Any?): Boolean {
return other is VipInfo && other.vipLevel == vipLevel