pengwuliang пре 1 година
родитељ
комит
87f8fee5cb
25 измењених фајлова са 256 додато и 404 уклоњено
  1. 6 1
      app/src/main/java/com/adealink/weparty/module/wallet/data/WalletData.kt
  2. 1 6
      app/src/main/java/com/adealink/weparty/module/wallet/viewmodel/IWalletViewModel.kt
  3. 1 0
      module/wallet/build.gradle
  4. 1 6
      module/wallet/src/main/java/com/adealink/weparty/wallet/WalletActivity.kt
  5. 8 7
      module/wallet/src/main/java/com/adealink/weparty/wallet/coin/CoinHistoryListActivity.kt
  6. 0 1
      module/wallet/src/main/java/com/adealink/weparty/wallet/data/Constants.kt
  7. 1 1
      module/wallet/src/main/java/com/adealink/weparty/wallet/datasource/remote/WalletHttpService.kt
  8. 0 2
      module/wallet/src/main/java/com/adealink/weparty/wallet/diamond/DiamondActivity.kt
  9. 0 132
      module/wallet/src/main/java/com/adealink/weparty/wallet/diamond/DiamondFragment.kt
  10. 65 17
      module/wallet/src/main/java/com/adealink/weparty/wallet/diamond/DiamondRecordFragment.kt
  11. 69 37
      module/wallet/src/main/java/com/adealink/weparty/wallet/diamond/DiamondStatisticsFragment.kt
  12. 1 1
      module/wallet/src/main/java/com/adealink/weparty/wallet/manager/IWalletManager.kt
  13. 11 2
      module/wallet/src/main/java/com/adealink/weparty/wallet/manager/WalletManager.kt
  14. 0 82
      module/wallet/src/main/java/com/adealink/weparty/wallet/orderhistory/IncomeHistoryFragment.kt
  15. 1 2
      module/wallet/src/main/java/com/adealink/weparty/wallet/orderhistory/OrderHistoryActivity.kt
  16. 1 1
      module/wallet/src/main/java/com/adealink/weparty/wallet/util/CurrencyUtil.kt
  17. 6 6
      module/wallet/src/main/java/com/adealink/weparty/wallet/view/CurrencyHistoryListItemViewBinder.kt
  18. 18 0
      module/wallet/src/main/java/com/adealink/weparty/wallet/view/DiamondTypeView.kt
  19. 4 74
      module/wallet/src/main/java/com/adealink/weparty/wallet/viewmodel/WalletViewModel.kt
  20. 6 13
      module/wallet/src/main/res/layout/activity_coin_history.xml
  21. 2 1
      module/wallet/src/main/res/layout/activity_diamond.xml
  22. 14 9
      module/wallet/src/main/res/layout/fragment_diamond_record.xml
  23. 15 3
      module/wallet/src/main/res/layout/fragment_diamond_statistics.xml
  24. 0 0
      module/wallet/src/main/res/layout/layout_currency_history_item.xml
  25. 25 0
      module/wallet/src/main/res/layout/layout_diamond_type.xml

+ 6 - 1
app/src/main/java/com/adealink/weparty/module/wallet/data/WalletData.kt

@@ -40,7 +40,7 @@ enum class CoinCategory(val value: Int, val detail: String) {
     DIAMOND_CHAT(8,"Chat"),                 //聊天收钻
     DIAMOND_LIVE_TALK(9, "Live Talk"),      //实时通话收钻
     DIAMOND_ROOM_GIFT(10,"Chat Room Gift"), //语音房收礼
-    DIAMOND_IM_GIFT(11,"Im Gift"),          //私聊收礼
+    DIAMOND_IM_GIFT(11,"IM Gift"),          //私聊收礼
     DIAMOND_TASK_CENTER(12,"Recharge"),     //任务中心奖励钻石
     DIAMOND_EVENT(13, "Event"),             //活动奖励钻石
     DIAMOND_BACKGROUND(14,"Background"),    //后台发放钻石
@@ -365,6 +365,11 @@ data class CoinTransactionInfo(
     @SerializedName("category")
     val category: Int
 )
+@JsonAdapter(ExtReflectiveTypeAdapterFactory::class)
+data class DiamondTypeProportion(
+    val category: Int,
+    val proportion: Int,
+)
 
 @JsonAdapter(ExtReflectiveTypeAdapterFactory::class)
 data class UserRechargeRecordInfo(

+ 1 - 6
app/src/main/java/com/adealink/weparty/module/wallet/viewmodel/IWalletViewModel.kt

@@ -16,9 +16,8 @@ interface IWalletViewModel {
     val rechargeList: LiveData<Rlt<List<ProductInfo>>>
     val thirdPayOpen: LiveData<Rlt<Boolean>>
     val exchangeRltLd: LiveData<Rlt<Boolean>>
-    val diamondTransferGoldConfigLd: LiveData<Rlt<List<GoldDiamondConfigInfo>>>
-    val diamondRecordListLd: LiveData<Rlt<List<Triple<UserDiamondRecordInfo, com.adealink.weparty.module.profile.data.UserInfo?, String?>>>>//third: giftIcon
     val diamondHistoryListLd: LiveData<Rlt<List<CoinTransactionInfo>>>
+    val diamondTypeProportionListLd: LiveData<Rlt<List<DiamondTypeProportion>>>
     val coinHistoryListLd: LiveData<Rlt<List<CoinTransactionInfo>>>
     val rechargeRecordList: LiveData<Rlt<List<UserRechargeRecordInfo>>>
     val coinConsumeRecordList: LiveData<Rlt<List<UserCoinConsumeRecordInfo>>>
@@ -48,12 +47,8 @@ interface IWalletViewModel {
 
     fun queryPayerMaxOrder(orderId: String): LiveData<Rlt<PayerMaxOrderStatus>>
 
-    fun getDiamondTransferGoldConfig(versionCode: Long)
-
     fun exchange(id: Long)
 
-    fun getDiamondRecordList()
-
     fun getRechargeRecordList()
 
     fun getCoinConsumeRecordList()

+ 1 - 0
module/wallet/build.gradle

@@ -43,6 +43,7 @@ dependencies {
     implementation libs.google.billing.library
     implementation libs.google.billing.library.ktx
     implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+    implementation 'com.google.android.flexbox:flexbox:3.0.0'
     //frame
     kapt libs.frame.router.compiler
 

+ 1 - 6
module/wallet/src/main/java/com/adealink/weparty/wallet/WalletActivity.kt

@@ -24,7 +24,6 @@ import com.adealink.weparty.stat.manager.serveReportManager
 import com.adealink.weparty.wallet.coin.CoinFragment
 import com.adealink.weparty.wallet.data.*
 import com.adealink.weparty.wallet.databinding.ActivityWalletBinding
-import com.adealink.weparty.wallet.diamond.DiamondFragment
 import com.adealink.weparty.wallet.gamecoins.GameCoinsFragment
 import com.adealink.weparty.wallet.stat.PayStatEvent
 import com.adealink.weparty.wallet.viewmodel.WalletViewModel
@@ -185,11 +184,7 @@ class WalletActivity: BaseActivity() {
         }
 
         override fun createFragment(position: Int): Fragment {
-            return when (position) {
-                Wallet.Common.TAB_COIN -> CoinFragment()
-                Wallet.Common.TAB_GAME_COIN -> GameCoinsFragment()
-                else -> DiamondFragment()
-            }
+            return GameCoinsFragment()
         }
 
         fun getFragmentByPos(position: Int): BaseFragment? {

+ 8 - 7
module/wallet/src/main/java/com/adealink/weparty/wallet/coin/CoinHistoryListActivity.kt

@@ -22,7 +22,7 @@ import com.adealink.weparty.wallet.databinding.ActivityCoinHistoryBinding
 import com.adealink.weparty.wallet.diamond.CategorySelectDialog
 import com.adealink.weparty.wallet.util.CurrencyHistoryListItemDiffUtil
 import com.adealink.weparty.wallet.view.CurrencyHistoryErrorEmptyViewBinder
-import com.adealink.weparty.wallet.view.DiamondRecordItemViewBinder
+import com.adealink.weparty.wallet.view.CurrencyHistoryListItemViewBinder
 import com.adealink.weparty.wallet.viewmodel.WalletViewModel
 import com.adealink.weparty.wallet.viewmodel.WalletViewModelFactory
 import com.qmuiteam.qmui.widget.util.QMUIStatusBarHelper
@@ -62,7 +62,8 @@ class CoinHistoryListActivity: BaseActivity() {
         binding.tvTime.setOnClickListener {
             showDatePicker()
         }
-        binding.ivFilter.setOnClickListener {
+        binding.tvFilter.text = CoinCategory.ALL.detail
+        binding.tvFilter.setOnClickListener {
             CategorySelectDialog().apply {
                 arguments = Bundle().apply {
                     putParcelableArrayList(CategorySelectDialog.TYPE_LIST, coinSource)
@@ -74,10 +75,10 @@ class CoinHistoryListActivity: BaseActivity() {
                     }
                     if(category == CoinCategory.ALL.value) {
                         category = null
-                        binding.ivFilter.isSelected = false
+                        binding.tvFilter.isSelected = false
                         binding.tvFilter.setTextColor(getCompatColor(APP_R.color.color_222222))
                     } else {
-                        binding.ivFilter.isSelected = true
+                        binding.tvFilter.isSelected = true
                         binding.tvFilter.setTextColor(getCompatColor(APP_R.color.color_FF9352FC))
                     }
                     binding.tvFilter.text = it.detail
@@ -85,7 +86,7 @@ class CoinHistoryListActivity: BaseActivity() {
                 }
             }.show(supportFragmentManager)
         }
-        listAdapter.register(DiamondRecordItemViewBinder(true))
+        listAdapter.register(CurrencyHistoryListItemViewBinder(true))
         listAdapter.register(CurrencyHistoryErrorEmptyViewBinder())
         binding.rvRecord.apply {
             adapter = listAdapter
@@ -100,7 +101,7 @@ class CoinHistoryListActivity: BaseActivity() {
 
     //todo pwl 分页处理
     private fun requestData() {
-        walletViewModel.getCoinHistoryList(date, 0, 5, category)
+        walletViewModel.getCoinHistoryList(date, 0, 20, category)
     }
 
     override fun observeViewModel() {
@@ -134,7 +135,7 @@ class CoinHistoryListActivity: BaseActivity() {
     }
 
     private fun showDatePicker() {
-        val currentTime = System.currentTimeMillis()  // 获取当前时间(毫秒)
+        val currentTime = System.currentTimeMillis()
         val threeMonthAgo = Calendar.getInstance().apply {
             add(Calendar.MONTH, -3)
         }.timeInMillis

+ 0 - 1
module/wallet/src/main/java/com/adealink/weparty/wallet/data/Constants.kt

@@ -35,7 +35,6 @@ const val PAY_TYPE_MADA= "MADA"
 
 const val HISTORY_TAB_INDEX_RECHARGE = 0
 const val HISTORY_TAB_INDEX_CONSUMPTION = 1
-const val HISTORY_TAB_INDEX_INCOME = 2
 const val HISTORY_TAB_INDEX_GAME_COINS = 3
 
 fun getStatThirdPayType(payType: String?): IEventValue? {

+ 1 - 1
module/wallet/src/main/java/com/adealink/weparty/wallet/datasource/remote/WalletHttpService.kt

@@ -95,7 +95,7 @@ interface WalletHttpService {
     suspend fun coinExchange(@Query("id") id: Long): Rlt<Res<Any>>
 
     @GET("es/search/getDiamondCategoryIncome")
-    suspend fun getDiamondCategoryIncome(@Query("date") date: String): Rlt<Res<Long>>
+    suspend fun getDiamondCategoryIncome(@Query("date") date: String): Rlt<Res<Map<String, Int>>>
 
     @GET("es/search/getCoinHistoryList")
     suspend fun getCoinHistoryList(

+ 0 - 2
module/wallet/src/main/java/com/adealink/weparty/wallet/diamond/DiamondActivity.kt

@@ -16,7 +16,6 @@ import com.adealink.weparty.commonui.widget.EmptyFragment
 import com.adealink.weparty.module.wallet.Wallet
 import com.adealink.weparty.wallet.R
 import com.adealink.weparty.wallet.databinding.ActivityDiamondBinding
-import com.adealink.weparty.wallet.util.getDate
 import com.adealink.weparty.wallet.viewmodel.WalletViewModel
 import com.adealink.weparty.wallet.viewmodel.WalletViewModelFactory
 import com.google.android.material.tabs.TabLayout
@@ -56,7 +55,6 @@ class DiamondActivity: BaseActivity() {
     override fun loadData() {
         super.loadData()
         walletViewModel.getMyDiamondCount()
-        walletViewModel.getDiamondCategoryIncome(getDate())
     }
 
     override fun observeViewModel() {

+ 0 - 132
module/wallet/src/main/java/com/adealink/weparty/wallet/diamond/DiamondFragment.kt

@@ -1,132 +0,0 @@
-package com.adealink.weparty.wallet.diamond
-
-import androidx.fragment.app.viewModels
-import androidx.recyclerview.widget.LinearLayoutManager
-import com.adealink.frame.aab.util.getCompatString
-import com.adealink.frame.base.Rlt
-import com.adealink.frame.base.fastLazy
-import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
-import com.adealink.weparty.commonui.toast.util.showToast
-import com.adealink.weparty.commonui.BaseFragment
-import com.adealink.weparty.commonui.widget.CommonDialog
-import com.adealink.frame.mvvm.view.viewBinding
-import com.adealink.frame.router.Router
-import com.adealink.frame.util.PackageUtil
-import com.adealink.weparty.module.wallet.data.GoldDiamondConfigInfo
-import com.adealink.weparty.url.UrlConfig
-import com.adealink.weparty.wallet.R
-import com.adealink.weparty.wallet.data.*
-import com.adealink.weparty.wallet.databinding.FragmentDiamondBinding
-import com.adealink.weparty.wallet.util.DiamondListItemDiffUtil
-import com.adealink.weparty.wallet.view.DiamondErrorEmptyViewBinder
-import com.adealink.weparty.wallet.view.DiamondItemViewBinder
-import com.adealink.weparty.wallet.viewmodel.WalletViewModel
-import com.adealink.weparty.wallet.viewmodel.WalletViewModelFactory
-import com.adealink.weparty.module.webview.Web
-
-class DiamondFragment : BaseFragment(R.layout.fragment_diamond),
-    DiamondItemViewBinder.IDiamondItemListener {
-    private val binding by viewBinding(FragmentDiamondBinding::bind)
-    private val walletViewModel by viewModels<WalletViewModel> { WalletViewModelFactory() }
-    private val listAdapter by fastLazy { MultiTypeListAdapter(DiamondListItemDiffUtil()) }
-
-    override fun onResume() {
-        super.onResume()
-        walletViewModel.getMyDiamondCount()
-        requestDiamondExchangeList()
-    }
-
-    override fun initViews() {
-        super.initViews()
-        //listAdapter.register(DiamondRecordItemViewBinder(this))
-        listAdapter.register(DiamondErrorEmptyViewBinder())
-        activity?.let {
-            binding.rvDiamondList.apply {
-                adapter = listAdapter
-                layoutManager = LinearLayoutManager(it)
-            }
-        }
-        binding.viewFaqClickArea.setOnClickListener {
-            val activity = activity ?: return@setOnClickListener
-            Router.build(activity, Web.FullScreen.PATH)
-                .putExtra(Web.Common.EXTRA_URL, UrlConfig.faqDiamondUrl)
-                .start()
-        }
-    }
-
-    private fun updateMyDiamondCount(diamondCount: Long) {
-        binding.tvDiamondCount.text = "$diamondCount"
-    }
-
-    private fun requestDiamondExchangeList() {
-        walletViewModel.getDiamondTransferGoldConfig(PackageUtil.getVersionCode().toLong())
-    }
-
-    override fun observeViewModel() {
-        super.observeViewModel()
-        walletViewModel.myDiamondCount.observe(viewLifecycleOwner) {
-
-            when (it) {
-                is Rlt.Success -> {
-                    updateMyDiamondCount(it.data)
-                }
-                is Rlt.Failed -> {
-                    if (it.error.msg.isNotEmpty()) {
-                        showToast(it.error.msg)
-                    }
-                }
-                else -> {
-                }
-            }
-        }
-        walletViewModel.diamondTransferGoldConfigLd.observe(viewLifecycleOwner) {
-
-            when (it) {
-                is Rlt.Success -> {
-                    if (it.data.isNullOrEmpty()) {
-                        showExchangeListEmptyView()
-                        return@observe
-                    }
-                    val exchangeDataList = mutableListOf<ExchangeListData>()
-                    it.data.forEach { info ->
-                        exchangeDataList.add(ExchangeListItemData(info))
-                    }
-                    listAdapter.submitList(exchangeDataList)
-                }
-                else -> {
-                    showExchangeNetErrorView()
-                }
-            }
-        }
-        walletViewModel.exchangeRltLd.observe(viewLifecycleOwner) {
-
-            dismissLoading()
-            showToast(it)
-            walletViewModel.getMyDiamondCount()
-            requestDiamondExchangeList()
-        }
-    }
-
-    private fun showExchangeNetErrorView() {
-        listAdapter.submitList(listOf(ExchangeListErrorEmptyData(ExchangeListErrorEmptyType.NetError)))
-    }
-
-    private fun showExchangeListEmptyView() {
-        listAdapter.submitList(listOf(ExchangeListErrorEmptyData(ExchangeListErrorEmptyType.ExchangeListEmpty)))
-    }
-
-    private fun showExchangeListDisableView() {
-        listAdapter.submitList(listOf(ExchangeListErrorEmptyData(ExchangeListErrorEmptyType.DisableExchange)))
-    }
-
-    override fun onExchangeClick(diamondConfigInfo: GoldDiamondConfigInfo) {
-        CommonDialog.Builder()
-            .message(getCompatString(R.string.wallet_exchange_confirm_tip))
-            .onPositive {
-                showLoading()
-                walletViewModel.exchange(diamondConfigInfo.id.toLong())
-            }
-            .setShowDefaultCancel(true)
-            .build().show(childFragmentManager)
-    }
-}

+ 65 - 17
module/wallet/src/main/java/com/adealink/weparty/wallet/diamond/DiamondRecordFragment.kt

@@ -3,21 +3,28 @@ package com.adealink.weparty.wallet.diamond
 import android.os.Bundle
 import androidx.fragment.app.viewModels
 import androidx.recyclerview.widget.LinearLayoutManager
+import com.adealink.frame.aab.util.getCompatColor
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.base.fastLazy
 import com.adealink.frame.mvvm.view.viewBinding
+import com.adealink.frame.util.timeToEnYM
 import com.adealink.weparty.commonui.BaseFragment
-import com.adealink.weparty.commonui.dialogfragment.WheelDatePickerDialogFragment
+import com.adealink.weparty.commonui.datepicker.CustomDatePicker
 import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
 import com.adealink.weparty.module.wallet.data.CoinCategory
 import com.adealink.weparty.wallet.R
+import com.adealink.weparty.wallet.data.CurrencyHistoryErrorEmptyData
+import com.adealink.weparty.wallet.data.CurrencyHistoryErrorEmptyDataType
+import com.adealink.weparty.wallet.data.CurrencyHistoryListItemData
 import com.adealink.weparty.wallet.data.DiamondSource
 import com.adealink.weparty.wallet.databinding.FragmentDiamondRecordBinding
 import com.adealink.weparty.wallet.util.CurrencyHistoryListItemDiffUtil
-import com.adealink.weparty.wallet.view.DiamondRecordItemViewBinder
+import com.adealink.weparty.wallet.view.CurrencyHistoryErrorEmptyViewBinder
+import com.adealink.weparty.wallet.view.CurrencyHistoryListItemViewBinder
 import com.adealink.weparty.wallet.viewmodel.WalletViewModel
 import com.adealink.weparty.wallet.viewmodel.WalletViewModelFactory
 import java.text.SimpleDateFormat
+import java.util.Calendar
 import java.util.Date
 import java.util.Locale
 
@@ -30,6 +37,7 @@ class DiamondRecordFragment: BaseFragment(R.layout.fragment_diamond_record) {
     private val listAdapter by fastLazy { MultiTypeListAdapter(CurrencyHistoryListItemDiffUtil()) }
     private val walletViewModel by viewModels<WalletViewModel> { WalletViewModelFactory() }
     private val diamondSource = arrayListOf(
+        DiamondSource(CoinCategory.ALL.value, CoinCategory.ALL.detail),
         DiamondSource(CoinCategory.DIAMOND_CHAT.value, CoinCategory.DIAMOND_CHAT.detail),
         DiamondSource(CoinCategory.DIAMOND_LIVE_TALK.value, CoinCategory.DIAMOND_LIVE_TALK.detail),
         DiamondSource(CoinCategory.DIAMOND_ROOM_GIFT.value, CoinCategory.DIAMOND_ROOM_GIFT.detail),
@@ -40,20 +48,40 @@ class DiamondRecordFragment: BaseFragment(R.layout.fragment_diamond_record) {
         DiamondSource(CoinCategory.DIAMOND_AGENT.value, CoinCategory.DIAMOND_AGENT.detail),
         DiamondSource(CoinCategory.DIAMOND_PAYOUT_EXCHANGE.value, CoinCategory.DIAMOND_PAYOUT_EXCHANGE.detail)
     )
+    private var category: Int? = null
+    private var date = SimpleDateFormat("yyyyMM", Locale.ENGLISH).format(Date())
 
     override fun initViews() {
-        binding.tvTime.text = SimpleDateFormat("yyyy.MM.dd", Locale.ENGLISH).format(Date())
+        binding.tvTime.text = SimpleDateFormat("yyyy.MM", Locale.ENGLISH).format(Date())
         binding.tvTime.setOnClickListener {
-            showWheelDatePicker()
+            showDatePicker()
         }
-        binding.ivFilter.setOnClickListener {
+        binding.tvFilter.text = CoinCategory.ALL.detail
+        binding.tvFilter.setOnClickListener {
             CategorySelectDialog().apply {
                 arguments = Bundle().apply {
                     putParcelableArrayList(CategorySelectDialog.TYPE_LIST, diamondSource)
                 }
+                selectCallback = {
+                    category = it.category
+                    diamondSource.forEach { source ->
+                        source.isSelected = it.category == source.category
+                    }
+                    if(category == CoinCategory.ALL.value) {
+                        category = null
+                        binding.tvFilter.isSelected = false
+                        binding.tvFilter.setTextColor(getCompatColor(com.adealink.weparty.R.color.color_222222))
+                    } else {
+                        binding.tvFilter.isSelected = true
+                        binding.tvFilter.setTextColor(getCompatColor(com.adealink.weparty.R.color.color_FF9352FC))
+                    }
+                    binding.tvFilter.text = it.detail
+                    requestData()
+                }
             }.show(childFragmentManager)
         }
-        listAdapter.register(DiamondRecordItemViewBinder(false))
+        listAdapter.register(CurrencyHistoryListItemViewBinder(false))
+        listAdapter.register(CurrencyHistoryErrorEmptyViewBinder())
         binding.rvRecord.apply {
             adapter = listAdapter
             layoutManager = LinearLayoutManager(context)
@@ -62,7 +90,7 @@ class DiamondRecordFragment: BaseFragment(R.layout.fragment_diamond_record) {
 
     override fun loadData() {
         super.loadData()
-        walletViewModel.getDiamondRecordList()
+        requestData()
     }
 
     override fun observeViewModel() {
@@ -70,22 +98,42 @@ class DiamondRecordFragment: BaseFragment(R.layout.fragment_diamond_record) {
         walletViewModel.diamondHistoryListLd.observe(viewLifecycleOwner) {
             when (it) {
                 is Rlt.Success -> {
-                    listAdapter.items = it.data
-                    listAdapter.notifyDataSetChanged()
+                    if(it.data.isNotEmpty()) {
+                        val list = it.data.map { item -> CurrencyHistoryListItemData(item) }
+                        listAdapter.submitList(list)
+                    } else {
+                        listAdapter.submitList(
+                            listOf(CurrencyHistoryErrorEmptyData(CurrencyHistoryErrorEmptyDataType.EmptyList))
+                        )
+                    }
+
+                }
+                else -> {
+                    listAdapter.submitList(
+                        listOf(CurrencyHistoryErrorEmptyData(CurrencyHistoryErrorEmptyDataType.NetError))
+                    )
                 }
-                else -> {}
             }
         }
     }
 
-    private fun showWheelDatePicker() {
-        val dialog = WheelDatePickerDialogFragment.newInstance(targetMonthScope = -3) //支持最近三个月
-        dialog.selectBirthdayCallback = object : WheelDatePickerDialogFragment.ISelectDateCallback {
-            override fun onSelectComplete(timestamp: Long, timeStr: String) {
-                binding.tvTime.text = timeStr
-                //todo pwl 传参刷新列表
+    private fun requestData() {
+        walletViewModel.getDiamondHistoryList(date, 0, 20, category)
+    }
+
+    private fun showDatePicker() {
+        val currentTime = System.currentTimeMillis()
+        val threeMonthAgo = Calendar.getInstance().apply {
+            add(Calendar.MONTH, -3)
+        }.timeInMillis
+        val dialog = CustomDatePicker.newInstance(threeMonthAgo, currentTime, false, false)
+        dialog.mCallback = object : CustomDatePicker.Callback {
+            override fun onTimeSelected(timestamp: Long) {
+                binding.tvTime.text = timeToEnYM(timestamp)
+                date = SimpleDateFormat("yyyyMM", Locale.ENGLISH).format(timestamp)
+                requestData()
             }
         }
-        dialog.show(childFragmentManager, WheelDatePickerDialogFragment.SIMPLE_NAME)
+        dialog.show(childFragmentManager)
     }
 }

+ 69 - 37
module/wallet/src/main/java/com/adealink/weparty/wallet/diamond/DiamondStatisticsFragment.kt

@@ -1,19 +1,28 @@
 package com.adealink.weparty.wallet.diamond
 
 import android.graphics.Color
+import android.widget.TextView
+import androidx.fragment.app.viewModels
 import com.adealink.frame.aab.util.getCompatColor
 import com.adealink.frame.base.fastLazy
+import com.adealink.frame.imkit.utils.TextViewUtils
 import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.weparty.commonui.BaseFragment
-import com.adealink.weparty.commonui.dialogfragment.WheelDatePickerDialogFragment
+import com.adealink.weparty.commonui.datepicker.CustomDatePicker
 import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
 import com.adealink.weparty.wallet.R
-import com.adealink.weparty.R as APP_R
 import com.adealink.weparty.wallet.databinding.FragmentDiamondStatisticsBinding
 import com.adealink.weparty.wallet.util.RechargeListItemDiffUtil
+import com.adealink.weparty.wallet.util.getDate
+import com.adealink.weparty.wallet.viewmodel.WalletViewModel
+import com.adealink.weparty.wallet.viewmodel.WalletViewModelFactory
 import com.github.mikephil.charting.data.PieData
 import com.github.mikephil.charting.data.PieDataSet
 import com.github.mikephil.charting.data.PieEntry
+import java.text.SimpleDateFormat
+import java.util.Calendar
+import java.util.Locale
+import com.adealink.weparty.R as APP_R
 
 /**
  * Created by PengWuLiang on 2025/3/7
@@ -22,60 +31,83 @@ class DiamondStatisticsFragment: BaseFragment(R.layout.fragment_diamond_statisti
 
     private val binding by viewBinding(FragmentDiamondStatisticsBinding::bind)
     private val listAdapter by fastLazy { MultiTypeListAdapter(RechargeListItemDiffUtil()) }
-
-    private val colorList = listOf(
-        getCompatColor(APP_R.color.color_FFA576FF),
-        getCompatColor(APP_R.color.color_FFFF50AE),
-        getCompatColor(APP_R.color.color_FF59CDFF),
-        getCompatColor(APP_R.color.color_FF00E3C8),
-        getCompatColor(APP_R.color.color_FFFF7852),
-        getCompatColor(APP_R.color.color_FFD18E0E),
-        getCompatColor(APP_R.color.color_FFFFD730),
-        getCompatColor(APP_R.color.color_FFE13EBD),
-        getCompatColor(APP_R.color.color_FFF778D3),
-    )
+    private val walletViewModel by viewModels<WalletViewModel> { WalletViewModelFactory() }
 
     override fun initViews() {
         binding.ivCalendar.setOnClickListener {
-            showWheelDatePicker()
+            showDatePicker()
         }
         val entries = listOf(
-            PieEntry(20f, "Type1"),
-            PieEntry(10f, "Type2"),
-            PieEntry(40f, "Type3"),
-            PieEntry(15f, "Type4"),
-            PieEntry(15f, "Type5")
+            PieEntry(9.8f, "Chat"),
+            PieEntry(6.2f, "Live Talk"),
+            PieEntry(38f, "Chat Room Gift"),
+            PieEntry(5.6f, "IM Gift"),
+            PieEntry(14.4f, "Recharge"),
+            PieEntry(9f, "Event"),
+            PieEntry(5f, "Background"),
+            PieEntry(7f, "Payout & Exchange")
         )
 
         val dataSet = PieDataSet(entries, "").apply {
             colors = colorList
-            valueTextColor = Color.BLACK
-            valueTextSize = 12f
-            valueLinePart1Length = 0.4f
-            valueLinePart2Length = 0.4f
+            setDrawValues(false)
         }
         binding.vPieChart.apply {
-            holeRadius = 100f
+            isDrawHoleEnabled = true
+            setHoleColor(Color.WHITE)
+            holeRadius = 63f
+            isRotationEnabled = false
             description.isEnabled = false
-            legend.isEnabled = false
-            isRotationEnabled = true
-            setUsePercentValues(true)
             setDrawEntryLabels(false)
-            setHoleColor(Color.WHITE)
-            setTransparentCircleAlpha(0)
-            isHighlightPerTapEnabled = false
+            legend.isEnabled = false
         }
         binding.vPieChart.data = PieData(dataSet)
         binding.vPieChart.invalidate()
+
+        binding.fbContainer.removeAllViews()
+        entries.forEach { item ->
+            val textView = TextView(requireActivity())
+            textView.text = "${item.label} ${item.value}"
+            binding.fbContainer.addView(textView)
+        }
     }
 
-    private fun showWheelDatePicker() {
-        val dialog = WheelDatePickerDialogFragment.newInstance()
-        dialog.selectBirthdayCallback = object : WheelDatePickerDialogFragment.ISelectDateCallback {
-            override fun onSelectComplete(timestamp: Long, timeStr: String) {
-                binding.tvTime.text = timeStr
+    override fun loadData() {
+        super.loadData()
+        walletViewModel.getDiamondCategoryIncome(getDate())
+    }
+
+    override fun observeViewModel() {
+        super.observeViewModel()
+        walletViewModel.diamondTypeProportionListLd.observe(viewLifecycleOwner) {
+
+        }
+    }
+    private fun showDatePicker() {
+        val currentTime = System.currentTimeMillis()
+        val threeMonthAgo = Calendar.getInstance().apply {
+            add(Calendar.MONTH, -3)
+        }.timeInMillis
+        val dialog = CustomDatePicker.newInstance(threeMonthAgo, currentTime, false, false)
+        dialog.mCallback = object : CustomDatePicker.Callback {
+            override fun onTimeSelected(timestamp: Long) {
+                val date = SimpleDateFormat("yyyyMM", Locale.ENGLISH).format(timestamp)
             }
         }
-        dialog.show(childFragmentManager, WheelDatePickerDialogFragment.SIMPLE_NAME)
+        dialog.show(childFragmentManager)
+    }
+
+    companion object {
+        val colorList = listOf(
+            getCompatColor(APP_R.color.color_FFA576FF),
+            getCompatColor(APP_R.color.color_FFFF50AE),
+            getCompatColor(APP_R.color.color_FF59CDFF),
+            getCompatColor(APP_R.color.color_FF00E3C8),
+            getCompatColor(APP_R.color.color_FFFF7852),
+            getCompatColor(APP_R.color.color_FFD18E0E),
+            getCompatColor(APP_R.color.color_FFFFD730),
+            getCompatColor(APP_R.color.color_FFE13EBD),
+            getCompatColor(APP_R.color.color_FFF778D3),
+        )
     }
 }

+ 1 - 1
module/wallet/src/main/java/com/adealink/weparty/wallet/manager/IWalletManager.kt

@@ -46,7 +46,7 @@ interface IWalletManager : IBaseFrame<IWalletListener> {
 
     suspend fun coinExchange(id: Long): Rlt<Res<Any>>
 
-    suspend fun getDiamondCategoryIncome(date: String): Rlt<Res<Long>>
+    suspend fun getDiamondCategoryIncome(date: String): Rlt<List<DiamondTypeProportion>>
 
     suspend fun getDiamondHistoryList(date: String, page: Int, size: Int, category: Int? = null): Rlt<Res<List<CoinTransactionInfo>>>
 

+ 11 - 2
module/wallet/src/main/java/com/adealink/weparty/wallet/manager/WalletManager.kt

@@ -30,6 +30,7 @@ import com.adealink.weparty.module.profile.ProfileModule
 import com.adealink.weparty.module.wallet.Wallet
 import com.adealink.weparty.module.wallet.data.CoinTransactionInfo
 import com.adealink.weparty.module.wallet.data.Currency.Companion.getCurrencyByValue
+import com.adealink.weparty.module.wallet.data.DiamondTypeProportion
 import com.adealink.weparty.module.wallet.data.GetUserCurrencyRes
 import com.adealink.weparty.module.wallet.data.GoldDiamondConfigInfo
 import com.adealink.weparty.module.wallet.data.GoldGameCoinsConfigInfo
@@ -329,8 +330,16 @@ class WalletManager : BaseFrame<IWalletListener>(), IWalletManager, OnNetworkLis
         return walletHttpService.coinExchange(id)
     }
 
-    override suspend fun getDiamondCategoryIncome(date: String): Rlt<Res<Long>> {
-        return walletHttpService.getDiamondCategoryIncome(date)
+    override suspend fun getDiamondCategoryIncome(date: String): Rlt<List<DiamondTypeProportion>> {
+        return when(val rlt = walletHttpService.getDiamondCategoryIncome(date)) {
+            is Rlt.Success -> {
+                val list = rlt.data.data?.map { item ->
+                    DiamondTypeProportion(item.key.toInt(), item.value)
+                } ?: listOf()
+                Rlt.Success(list)
+            }
+            is Rlt.Failed -> rlt
+        }
     }
 
     override suspend fun getDiamondHistoryList(

+ 0 - 82
module/wallet/src/main/java/com/adealink/weparty/wallet/orderhistory/IncomeHistoryFragment.kt

@@ -1,82 +0,0 @@
-package com.adealink.weparty.wallet.orderhistory
-
-import androidx.fragment.app.viewModels
-import androidx.recyclerview.widget.LinearLayoutManager
-import com.adealink.frame.base.Rlt
-import com.adealink.frame.base.fastLazy
-import com.adealink.weparty.commonui.BaseFragment
-import com.adealink.weparty.commonui.recycleview.adapter.multitype.MultiTypeAdapter
-import com.adealink.weparty.commonui.recycleview.itemdecoration.VerticalSpaceItemDecoration
-import com.adealink.frame.mvvm.view.viewBinding
-import com.adealink.frame.util.DisplayUtil
-import com.adealink.weparty.wallet.R
-import com.adealink.weparty.wallet.data.*
-import com.adealink.weparty.wallet.databinding.FragmentIncomeHistoryBinding
-import com.adealink.weparty.wallet.view.IncomeHistoryItemViewBinder
-import com.adealink.weparty.wallet.view.OrderHistoryErrorEmptyViewBinder
-import com.adealink.weparty.wallet.viewmodel.WalletViewModel
-import com.adealink.weparty.wallet.viewmodel.WalletViewModelFactory
-
-class IncomeHistoryFragment : BaseFragment(R.layout.fragment_income_history) {
-    private val binding by viewBinding(FragmentIncomeHistoryBinding::bind)
-    private val listAdapter by fastLazy { MultiTypeAdapter() }
-    private val walletViewModel by viewModels<WalletViewModel> { WalletViewModelFactory() }
-
-    override fun initViews() {
-        super.initViews()
-        listAdapter.register(IncomeHistoryItemViewBinder())
-        listAdapter.register(OrderHistoryErrorEmptyViewBinder())
-        binding.rvIncome.apply {
-            adapter = listAdapter
-            layoutManager = LinearLayoutManager(context)
-            addItemDecoration(VerticalSpaceItemDecoration(DisplayUtil.dp2px(8f), DisplayUtil.dp2px(40f)))
-        }
-        binding.refreshLayout.setEnableLoadMore(false)
-        binding.refreshLayout.setOnRefreshListener {
-            walletViewModel.getDiamondRecordList()
-        }
-    }
-
-    override fun loadData() {
-        super.loadData()
-        walletViewModel.getDiamondRecordList()
-    }
-
-    private fun showNetErrorView() {
-        listAdapter.items =
-            listOf(OrderHistoryListErrorEmptyData(OrderHistoryListErrorEmptyType.NetError))
-        listAdapter.notifyDataSetChanged()
-    }
-
-    private fun showListEmptyView() {
-        listAdapter.items =
-            listOf(OrderHistoryListErrorEmptyData(OrderHistoryListErrorEmptyType.ListEmpty))
-        listAdapter.notifyDataSetChanged()
-    }
-
-    override fun observeViewModel() {
-        super.observeViewModel()
-        walletViewModel.diamondRecordListLd.observe(viewLifecycleOwner) {
-            binding.refreshLayout.finishRefresh()
-            when (it) {
-                is Rlt.Success -> {
-                    if (it.data.isNullOrEmpty()) {
-                        showListEmptyView()
-                        return@observe
-                    }
-                    val itemsData = mutableListOf<OrderHistoryListData>()
-                    it.data.forEach { info ->
-                        itemsData.add(IncomeHistoryListItemData(info.first,
-                            info.second,
-                            info.third))
-                    }
-                    listAdapter.items = itemsData
-                    listAdapter.notifyDataSetChanged()
-                }
-                else -> {
-                    showNetErrorView()
-                }
-            }
-        }
-    }
-}

+ 1 - 2
module/wallet/src/main/java/com/adealink/weparty/wallet/orderhistory/OrderHistoryActivity.kt

@@ -55,8 +55,7 @@ class OrderHistoryActivity: BaseActivity() {
             return when (position) {
                 HISTORY_TAB_INDEX_RECHARGE -> RechargeHistoryFragment()
                 HISTORY_TAB_INDEX_CONSUMPTION -> ConsumptionHistoryFragment()
-                HISTORY_TAB_INDEX_GAME_COINS -> GameCoinsConsumptionHistoryFragment()
-                else -> IncomeHistoryFragment()
+                else -> GameCoinsConsumptionHistoryFragment()
             }
         }
     }

+ 1 - 1
module/wallet/src/main/java/com/adealink/weparty/wallet/util/CurrencyUtil.kt

@@ -64,5 +64,5 @@ fun getDate(timeStamp: Long? = null): String {
     } else {
         Date(timeStamp)
     }
-    return SimpleDateFormat("yyyyMMdd", Locale.ENGLISH).format(date)
+    return SimpleDateFormat("yyyyMM", Locale.ENGLISH).format(date)
 }

+ 6 - 6
module/wallet/src/main/java/com/adealink/weparty/wallet/view/DiamondRecordItemViewBinder.kt → module/wallet/src/main/java/com/adealink/weparty/wallet/view/CurrencyHistoryListItemViewBinder.kt

@@ -8,25 +8,25 @@ import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinde
 import com.adealink.weparty.module.wallet.data.CoinCategory
 import com.adealink.weparty.module.wallet.data.DiamondRecordType
 import com.adealink.weparty.wallet.data.CurrencyHistoryListItemData
-import com.adealink.weparty.wallet.databinding.LayoutDiamondRecordItemBinding
+import com.adealink.weparty.wallet.databinding.LayoutCurrencyHistoryItemBinding
 import com.adealink.weparty.R as APP_R
 
 /**
  * Created by PengWuLiang on 2025/3/8
  */
-class DiamondRecordItemViewBinder(private val showCoin: Boolean):
-    ItemViewBinder<CurrencyHistoryListItemData, BindingViewHolder<LayoutDiamondRecordItemBinding>>()  {
+class CurrencyHistoryListItemViewBinder(private val showCoin: Boolean):
+    ItemViewBinder<CurrencyHistoryListItemData, BindingViewHolder<LayoutCurrencyHistoryItemBinding>>()  {
     override fun onCreateViewHolder(
         inflater: LayoutInflater,
         parent: ViewGroup
-    ): BindingViewHolder<LayoutDiamondRecordItemBinding> {
+    ): BindingViewHolder<LayoutCurrencyHistoryItemBinding> {
         return BindingViewHolder(
-            LayoutDiamondRecordItemBinding.inflate(inflater, parent, false)
+            LayoutCurrencyHistoryItemBinding.inflate(inflater, parent, false)
         )
     }
 
     override fun onBindViewHolder(
-        holder: BindingViewHolder<LayoutDiamondRecordItemBinding>,
+        holder: BindingViewHolder<LayoutCurrencyHistoryItemBinding>,
         item: CurrencyHistoryListItemData
     ) {
         if(showCoin) {

+ 18 - 0
module/wallet/src/main/java/com/adealink/weparty/wallet/view/DiamondTypeView.kt

@@ -0,0 +1,18 @@
+package com.adealink.weparty.wallet.view
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import androidx.constraintlayout.widget.ConstraintLayout
+import com.adealink.weparty.databinding.FamilyLayoutLogoBinding
+
+/**
+ * Created by PengWuLiang on 2025/3/14
+ */
+class DiamondTypeView @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0
+) : ConstraintLayout(context, attrs, defStyleAttr) {
+    val binding = FamilyLayoutLogoBinding.inflate(LayoutInflater.from(context), this, true)
+}

+ 4 - 74
module/wallet/src/main/java/com/adealink/weparty/wallet/viewmodel/WalletViewModel.kt

@@ -16,22 +16,18 @@ import com.adealink.frame.mvvm.viewmodel.BaseViewModel
 import com.adealink.frame.statistics.CommonEventValue
 import com.adealink.frame.util.PackageUtil
 import com.adealink.weparty.commonui.toast.util.showToast
-import com.adealink.weparty.module.gift.GiftModule
-import com.adealink.weparty.module.gift.data.GiftInfo
 import com.adealink.weparty.module.operation.banner.data.BannerInfo
 import com.adealink.weparty.module.profile.ProfileModule
-import com.adealink.weparty.module.profile.data.UserConfigType
 import com.adealink.weparty.module.wallet.data.CoinTransactionInfo
 import com.adealink.weparty.module.wallet.data.Currency
+import com.adealink.weparty.module.wallet.data.DiamondTypeProportion
 import com.adealink.weparty.module.wallet.data.GetUserCurrencyRes
-import com.adealink.weparty.module.wallet.data.GoldDiamondConfigInfo
 import com.adealink.weparty.module.wallet.data.GoldGameCoinsConfigInfo
 import com.adealink.weparty.module.wallet.data.PayChannel
 import com.adealink.weparty.module.wallet.data.PayerMaxOrderStatus
 import com.adealink.weparty.module.wallet.data.ProductInfo
 import com.adealink.weparty.module.wallet.data.UserCoinConsumeRecordInfo
 import com.adealink.weparty.module.wallet.data.UserCurrencyRecordInfo
-import com.adealink.weparty.module.wallet.data.UserDiamondRecordInfo
 import com.adealink.weparty.module.wallet.data.UserRechargeRecordInfo
 import com.adealink.weparty.module.wallet.data.getErrorByServerError
 import com.adealink.weparty.module.wallet.viewmodel.IWalletViewModel
@@ -54,11 +50,8 @@ class WalletViewModel : BaseViewModel(), IWalletViewModel, IWalletListener {
     override val rechargeList: LiveData<Rlt<List<ProductInfo>>> = MutableLiveData()
     override val thirdPayOpen: LiveData<Rlt<Boolean>> = MutableLiveData()
     override val exchangeRltLd: LiveData<Rlt<Boolean>> = MutableLiveData()
-    override val diamondTransferGoldConfigLd: LiveData<Rlt<List<GoldDiamondConfigInfo>>> =
-        MutableLiveData()
-    override val diamondRecordListLd: LiveData<Rlt<List<Triple<UserDiamondRecordInfo, com.adealink.weparty.module.profile.data.UserInfo?, String?>>>> =
-        MutableLiveData()
     override val diamondHistoryListLd: LiveData<Rlt<List<CoinTransactionInfo>>> = MutableLiveData()
+    override val diamondTypeProportionListLd: LiveData<Rlt<List<DiamondTypeProportion>>> = MutableLiveData()
     override val coinHistoryListLd: LiveData<Rlt<List<CoinTransactionInfo>>> = MutableLiveData()
     override val rechargeRecordList: LiveData<Rlt<List<UserRechargeRecordInfo>>> = MutableLiveData()
     override val coinConsumeRecordList: LiveData<Rlt<List<UserCoinConsumeRecordInfo>>> = MutableLiveData()
@@ -187,19 +180,6 @@ class WalletViewModel : BaseViewModel(), IWalletViewModel, IWalletListener {
         return liveData
     }
 
-    override fun getDiamondTransferGoldConfig(versionCode: Long) {
-        viewModelScope.launch {
-            when (val rlt = walletManager.getDiamondTransferGoldConfig(versionCode)) {
-                is Rlt.Success -> {
-                    diamondTransferGoldConfigLd.send(Rlt.Success(rlt.data.data!!))
-                }
-                else -> {
-                    diamondTransferGoldConfigLd.send(Rlt.Failed(IError()))
-                }
-            }
-        }
-    }
-
     override fun exchange(id: Long) {
         viewModelScope.launch {
             when (val rlt = walletManager.exchange(id)) {
@@ -213,51 +193,6 @@ class WalletViewModel : BaseViewModel(), IWalletViewModel, IWalletListener {
         }
     }
 
-    override fun getDiamondRecordList() {
-        viewModelScope.launch {
-            val recordRlt = walletManager.getDiamondRecordList()
-            if (recordRlt is Rlt.Success) {
-                val fetchGiftIdSet = mutableSetOf<Long>()
-                val fetchUidSet = mutableSetOf<Long>()
-                recordRlt.data.data?.forEach { recordInfo ->
-                    if (recordInfo.giftId > 0) {
-                        fetchGiftIdSet.add(recordInfo.giftId.toLong())
-                    }
-                    if (recordInfo.sender > 0) {
-                        fetchUidSet.add(recordInfo.sender.toLong())
-                    }
-                }
-                val giftIdToGiftInfoMap = hashMapOf<Long, GiftInfo>()
-                var uidToUserInfoMap = hashMapOf<Long, com.adealink.weparty.module.profile.data.UserInfo>()
-                if (fetchGiftIdSet.isNotEmpty()) {
-                    val giftListRlt = GiftModule.getGifts(fetchGiftIdSet)
-                    if (giftListRlt is Rlt.Success) {
-                        giftListRlt.data.forEach { giftInfo ->
-                            giftIdToGiftInfoMap[giftInfo.id] = giftInfo
-                        }
-
-                    }
-                }
-                if (fetchUidSet.isNotEmpty()) {
-                    val userInfoListRlt = ProfileModule.getUsersInfoByUid(fetchUidSet, true, setOf(UserConfigType.USER_ATTR_BASIC))
-                    if (userInfoListRlt is Rlt.Success) {
-                        uidToUserInfoMap = userInfoListRlt.data as HashMap<Long, com.adealink.weparty.module.profile.data.UserInfo>
-                    }
-                }
-                val diamondRecordData =
-                    mutableListOf<Triple<UserDiamondRecordInfo, com.adealink.weparty.module.profile.data.UserInfo?, String?>>()
-                recordRlt.data.data?.forEach {
-                    diamondRecordData.add(Triple(it,
-                        uidToUserInfoMap[it.sender.toLong()],
-                        giftIdToGiftInfoMap[it.giftId.toLong()]?.iconUrl))
-                }
-                diamondRecordListLd.send(Rlt.Success(diamondRecordData))
-            } else {
-                diamondRecordListLd.send(Rlt.Failed(IError()))
-            }
-        }
-    }
-
     override fun getRechargeRecordList() {
         viewModelScope.launch {
             when (val rlt = walletManager.getRechargeRecordList()) {
@@ -311,16 +246,11 @@ class WalletViewModel : BaseViewModel(), IWalletViewModel, IWalletListener {
         viewModelScope.launch {
             when (val rlt = walletManager.getDiamondCategoryIncome(date)) {
                 is Rlt.Success -> {
-                    val res = rlt.data.data
-                    if (res == null) {
-                        todayDiamond.send(Rlt.Failed(CommonDataNullError()))
-                    } else {
-                        todayDiamond.send(Rlt.Success(res))
-                    }
+                    diamondTypeProportionListLd.send(Rlt.Success(rlt.data))
                 }
 
                 is Rlt.Failed -> {
-                    todayDiamond.send(Rlt.Failed(rlt.error))
+                    diamondTypeProportionListLd.send(Rlt.Failed(IError()))
                 }
             }
         }

+ 6 - 13
module/wallet/src/main/res/layout/activity_coin_history.xml

@@ -33,16 +33,6 @@
         app:layout_constraintBottom_toBottomOf="@id/v_time_bg"
         android:layout_marginStart="16dp" />
 
-    <androidx.appcompat.widget.AppCompatImageView
-        android:id="@+id/iv_filter"
-        android:layout_width="24dp"
-        android:layout_height="24dp"
-        android:background="@drawable/common_ic_filter_state"
-        app:layout_constraintTop_toTopOf="@id/v_time_bg"
-        app:layout_constraintBottom_toBottomOf="@id/v_time_bg"
-        app:layout_constraintEnd_toEndOf="parent"
-        android:layout_marginEnd="16dp"/>
-
     <androidx.appcompat.widget.AppCompatTextView
         android:id="@+id/tv_filter"
         android:layout_width="wrap_content"
@@ -50,10 +40,13 @@
         tools:text="All"
         android:textSize="13sp"
         android:textColor="@color/color_222222"
+        android:gravity="center"
+        app:drawableEndCompat="@drawable/common_ic_filter_state"
+        android:drawablePadding="4dp"
         app:layout_constraintTop_toTopOf="@id/v_time_bg"
         app:layout_constraintBottom_toBottomOf="@id/v_time_bg"
-        app:layout_constraintEnd_toStartOf="@id/iv_filter"
-        android:layout_marginEnd="4dp"/>
+        app:layout_constraintEnd_toEndOf="parent"
+        android:layout_marginEnd="16dp"/>
 
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/rv_record"
@@ -61,5 +54,5 @@
         android:layout_height="0dp"
         app:layout_constraintTop_toBottomOf="@id/v_time_bg"
         app:layout_constraintBottom_toBottomOf="parent"
-        tools:listitem="@layout/layout_diamond_record_item"/>
+        tools:listitem="@layout/layout_currency_history_item"/>
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 1
module/wallet/src/main/res/layout/activity_diamond.xml

@@ -74,7 +74,8 @@
                 android:textColor="@color/color_FF9352FC"
                 app:layout_constraintTop_toTopOf="@id/tv_balance_label"
                 app:layout_constraintBottom_toBottomOf="@id/tv_balance"
-                app:layout_constraintEnd_toEndOf="parent"/>
+                app:layout_constraintEnd_toEndOf="parent"
+                android:visibility="gone"/>
 
             <View
                 android:id="@+id/today_diamond_bg"

+ 14 - 9
module/wallet/src/main/res/layout/fragment_diamond_record.xml

@@ -25,15 +25,20 @@
         app:layout_constraintBottom_toBottomOf="@id/v_time_bg"
         android:layout_marginStart="16dp" />
 
-    <ImageView
-        android:id="@+id/iv_filter"
-        android:layout_width="24dp"
-        android:layout_height="24dp"
-        android:src="@drawable/common_ic_filter"
-        app:layout_constraintTop_toTopOf="parent"
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_filter"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        tools:text="All"
+        android:textSize="13sp"
+        android:textColor="@color/color_222222"
+        android:gravity="center"
+        app:drawableEndCompat="@drawable/common_ic_filter_state"
+        android:drawablePadding="4dp"
+        app:layout_constraintTop_toTopOf="@id/v_time_bg"
+        app:layout_constraintBottom_toBottomOf="@id/v_time_bg"
         app:layout_constraintEnd_toEndOf="parent"
-        android:layout_marginEnd="16dp"
-        android:layout_marginTop="6dp"/>
+        android:layout_marginEnd="16dp"/>
 
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/rv_record"
@@ -41,5 +46,5 @@
         android:layout_height="0dp"
         app:layout_constraintTop_toBottomOf="@id/v_time_bg"
         app:layout_constraintBottom_toBottomOf="parent"
-        tools:listitem="@layout/layout_diamond_record_item"/>
+        tools:listitem="@layout/layout_currency_history_item"/>
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 15 - 3
module/wallet/src/main/res/layout/fragment_diamond_statistics.xml

@@ -35,10 +35,22 @@
 
     <com.github.mikephil.charting.charts.PieChart
         android:id="@+id/v_pie_chart"
-        android:layout_width="150dp"
-        android:layout_height="150dp"
+        android:layout_width="180dp"
+        android:layout_height="180dp"
         app:layout_constraintTop_toBottomOf="@id/v_time_bg"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent" />
+        app:layout_constraintEnd_toEndOf="parent"
+        android:layout_marginTop="32dp"/>
 
+    <com.google.android.flexbox.FlexboxLayout
+        android:id="@+id/fb_container"
+        android:layout_width="200dp"
+        android:layout_height="wrap_content"
+        app:flexWrap="wrap"
+        app:alignItems="flex_start"
+        app:alignContent="flex_start"
+        app:layout_constraintTop_toBottomOf="@id/v_pie_chart"
+        app:layout_constraintStart_toStartOf="parent"
+        android:layout_marginTop="32dp"
+        android:layout_marginHorizontal="16dp"/>
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 0
module/wallet/src/main/res/layout/layout_diamond_record_item.xml → module/wallet/src/main/res/layout/layout_currency_history_item.xml


+ 25 - 0
module/wallet/src/main/res/layout/layout_diamond_type.xml

@@ -0,0 +1,25 @@
+<?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"
+    android:layout_width="wrap_content"
+    android:layout_height="12dp">
+
+    <View
+        android:id="@+id/iv_type"
+        android:layout_width="6dp"
+        android:layout_height="6dp"
+        android:background="#A576FF"
+        app:layout_constraintCircleRadius="6dp"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintStart_toStartOf="parent"/>
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_type"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textSize="11sp"
+        android:textColor="@color/color_222222"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toEndOf="@id/iv_type"/>
+</androidx.constraintlayout.widget.ConstraintLayout>