新增贵族特权详情弹窗
This commit is contained in:
@@ -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", "")
|
||||
}
|
||||
}
|
@@ -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() {
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
}
|
BIN
app/src/main/res/drawable-xhdpi/bg_vip_auth_img.png
Normal file
BIN
app/src/main/res/drawable-xhdpi/bg_vip_auth_img.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 56 KiB |
BIN
app/src/main/res/drawable-xhdpi/bg_vip_dialog.png
Normal file
BIN
app/src/main/res/drawable-xhdpi/bg_vip_dialog.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 91 KiB |
BIN
app/src/main/res/drawable-xhdpi/ic_vip_dialog_close.png
Normal file
BIN
app/src/main/res/drawable-xhdpi/ic_vip_dialog_close.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
74
app/src/main/res/layout/dialog_vip_auth_details.xml
Normal file
74
app/src/main/res/layout/dialog_vip_auth_details.xml
Normal 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>
|
@@ -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
|
||||
|
Reference in New Issue
Block a user