Kaynağa Gözat

feat: 一些问题修复

DoggyZhang 3 ay önce
ebeveyn
işleme
2d71c997ff
31 değiştirilmiş dosya ile 530 ekleme ve 75 silme
  1. 4 3
      app/src/main/java/com/adealink/weparty/commonui/WEUI.kt
  2. 127 20
      app/src/main/java/com/adealink/weparty/ui/category/CategoryFragment.kt
  3. 7 2
      app/src/main/java/com/adealink/weparty/ui/category/adapter/CategoryListItemViewBinder.kt
  4. 16 2
      app/src/main/java/com/adealink/weparty/ui/category/adapter/CategoryTabTitleViewBinder.kt
  5. 4 1
      app/src/main/java/com/adealink/weparty/ui/category/data/CategoryData.kt
  6. 3 6
      app/src/main/java/com/adealink/weparty/webview/WebViewActivity.kt
  7. 1 0
      app/src/main/res/layout/layout_category_tab_title.xml
  8. 1 1
      gradle.properties
  9. 2 2
      module/account/src/main/java/com/adealink/weparty/account/register/fragment/SelectCategoryFragment.kt
  10. 3 1
      module/im/src/main/java/com/adealink/weparty/im/list/adapter/viewbinder/OfficialListItemViewBinder.kt
  11. 1 0
      module/im/src/main/res/values-in/strings.xml
  12. 1 0
      module/im/src/main/res/values-zh/strings.xml
  13. 1 0
      module/im/src/main/res/values/strings.xml
  14. 85 3
      module/order/src/main/java/com/adealink/weparty/order/OrderDetailActivity.kt
  15. 1 4
      module/order/src/main/java/com/adealink/weparty/order/adapter/PlaymateListItemViewBinder.kt
  16. 1 1
      module/order/src/main/java/com/adealink/weparty/order/dialog/EvaluateOrderDialog.kt
  17. 218 14
      module/order/src/main/res/layout/activity_order_detail.xml
  18. 2 0
      module/order/src/main/res/values-in/strings.xml
  19. 2 0
      module/order/src/main/res/values-zh/strings.xml
  20. 2 0
      module/order/src/main/res/values/strings.xml
  21. 1 1
      module/playmate/src/main/java/com/adealink/weparty/playmate/findpartner/page/SelectCategoryFragment.kt
  22. 5 2
      module/playmate/src/main/res/layout/activity_playmate_list.xml
  23. 1 0
      module/profile/src/main/java/com/adealink/weparty/profile/dialog/CharmStarDialog.kt
  24. 5 1
      module/profile/src/main/java/com/adealink/weparty/profile/edit/dialog/adapter/InterestListViewBinder.kt
  25. 6 6
      module/profile/src/main/java/com/adealink/weparty/profile/relation/viewmodel/RelationShipTab.kt
  26. 1 1
      module/setting/src/main/java/com/adealink/weparty/setting/helpcenter/HelpCenterActivity.kt
  27. 1 1
      module/setting/src/main/java/com/adealink/weparty/setting/report/ReportActivity.kt
  28. 1 1
      module/setting/src/main/res/layout/activity_report.xml
  29. 13 0
      module/wallet/src/main/java/com/adealink/weparty/wallet/recharge/dialog/ConvertCurrencyDialog.kt
  30. 12 1
      module/wallet/src/main/java/com/adealink/weparty/wallet/recharge/dialog/RechargeDialog.kt
  31. 2 1
      module/wallet/src/main/res/layout/dialog_convert_currency.xml

+ 4 - 3
app/src/main/java/com/adealink/weparty/commonui/WEUI.kt

@@ -5,6 +5,7 @@ import com.adealink.frame.aab.util.getCompatString
 import com.adealink.weparty.R
 import com.adealink.weparty.commonui.ext.dp
 import com.scwang.smart.refresh.footer.ClassicsFooter
+import com.scwang.smart.refresh.header.MaterialHeader
 import com.scwang.smart.refresh.layout.SmartRefreshLayout
 
 object WEUI {
@@ -12,11 +13,11 @@ object WEUI {
     fun init(ctx: Context) {
         //设置全局的Header构建器
         SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, layout ->
-//            layout.setPrimaryColorsId(R.color.color_app_main_btn_text, R.color.white) //全局设置主题颜色
+            layout.setPrimaryColorsId(R.color.color_app_main_btn_text, R.color.color_FF1D2129) //全局设置主题颜色
             layout.setHeaderHeightPx(70.dp()) //默认100ddp
 //            layout.setDragRate(1f)
-//            MaterialHeader(context)
-            SVGARefreshHeader(context)
+            MaterialHeader(context)
+            //SVGARefreshHeader(context)
         }
         //设置全局的Footer构建器
         SmartRefreshLayout.setDefaultRefreshFooterCreator { context, _ -> //指定为经典Footer,默认是 BallPulseFooter

+ 127 - 20
app/src/main/java/com/adealink/weparty/ui/category/CategoryFragment.kt

@@ -5,6 +5,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.adealink.frame.base.fastLazy
 import com.adealink.frame.mvvm.view.viewBinding
+import com.adealink.frame.router.Router
 import com.adealink.weparty.R
 import com.adealink.weparty.commonui.BaseFragment
 import com.adealink.weparty.commonui.ext.dp
@@ -12,6 +13,7 @@ import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
 import com.adealink.weparty.commonui.recycleview.itemdecoration.GridSpacingMultiSpanSizeItemDecoration
 import com.adealink.weparty.commonui.recycleview.itemdecoration.VerticalSpaceItemDecoration
 import com.adealink.weparty.databinding.FragmentCategoryBinding
+import com.adealink.weparty.module.playmate.Playmate
 import com.adealink.weparty.module.playmate.PlaymateModule
 import com.adealink.weparty.module.playmate.data.PlaymateCategoryData
 import com.adealink.weparty.ui.category.adapter.CategoryListItemViewBinder
@@ -30,14 +32,32 @@ class CategoryFragment : BaseFragment(R.layout.fragment_category) {
 
     private val binding by viewBinding(FragmentCategoryBinding::bind)
 
-    private val tabAdapter by fastLazy { MultiTypeListAdapter<CategoryItemData>() }
+    private val titleAdapter by fastLazy { MultiTypeListAdapter<CategoryItemData>() }
     private val listAdapter by fastLazy { MultiTypeListAdapter<CategoryItemData>() }
 
     private val categoryViewModel by fastLazy { PlaymateModule.getPlaymateViewModel(this) }
 
-    private lateinit var tabLayoutManger: LinearLayoutManager
+    private lateinit var titleLayoutManger: LinearLayoutManager
     private lateinit var listLayoutManger: GridLayoutManager
-    private var categoryList = listOf<CategoryItemData>()
+
+    private var titleList = listOf<CategoryListTitleData>()
+    private var itemList = listOf<CategoryItemData>()
+
+
+    //Item到Tab的位置映射
+    private var itemToTitlePosition = mutableListOf<Int>()
+    private var titleToItemPosition = mutableListOf<Int>()
+
+    private val itemScrollListener = object : RecyclerView.OnScrollListener() {
+
+        override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
+            val firstVisibleItemPosition = listLayoutManger.findFirstVisibleItemPosition()
+            if (firstVisibleItemPosition != RecyclerView.NO_POSITION) {
+                scrollToTitle(firstVisibleItemPosition)
+            }
+        }
+    }
+
     override fun initViews() {
         super.initViews()
         initTab()
@@ -45,10 +65,12 @@ class CategoryFragment : BaseFragment(R.layout.fragment_category) {
     }
 
     private fun initTab() {
-        binding.rvTab.adapter = tabAdapter
-        tabAdapter.register(CategoryTabTitleViewBinder())
-        tabLayoutManger = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
-        binding.rvTab.layoutManager = tabLayoutManger
+        binding.rvTab.adapter = titleAdapter
+        titleAdapter.register(CategoryTabTitleViewBinder { _, position ->
+            selectTitle(position)
+        })
+        titleLayoutManger = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
+        binding.rvTab.layoutManager = titleLayoutManger
         binding.rvTab.addItemDecoration(
             VerticalSpaceItemDecoration(24.dp())
         )
@@ -62,7 +84,9 @@ class CategoryFragment : BaseFragment(R.layout.fragment_category) {
     private fun initList() {
         binding.rvList.adapter = listAdapter
         listAdapter.register(CategoryListTitleViewBinder())
-        listAdapter.register(CategoryListItemViewBinder())
+        listAdapter.register(CategoryListItemViewBinder { item, position ->
+            selectItem(item)
+        })
         listLayoutManger = GridLayoutManager(context, SPAN_COUNT, RecyclerView.VERTICAL, false)
         listLayoutManger.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
             override fun getSpanSize(position: Int): Int {
@@ -77,12 +101,39 @@ class CategoryFragment : BaseFragment(R.layout.fragment_category) {
         binding.rvList.addItemDecoration(
             GridSpacingMultiSpanSizeItemDecoration(SPAN_COUNT, 12.dp(), 10.dp(), false)
         )
-        binding.rvList.addOnScrollListener(object : RecyclerView.OnScrollListener() {
+        binding.rvList.addOnScrollListener(itemScrollListener)
+    }
 
-            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
+    private fun selectTitle(position: Int) {
+        val toPosition = titleToItemPosition.getOrNull(position)
+        if (toPosition != null && toPosition >= 0) {
+            titleList.forEachIndexed { index, data ->
+                data.selected = index == position
+            }
+            titleAdapter.notifyDataSetChanged()
+
+            binding.rvList.removeOnScrollListener(itemScrollListener)
+            listLayoutManger.scrollToPosition(toPosition)
+            binding.rvList.addOnScrollListener(itemScrollListener)
+        }
+    }
 
+    private fun scrollToTitle(position: Int) {
+        val titlePosition = itemToTitlePosition.getOrNull(position)
+        if (titlePosition != null && titlePosition >= 0) {
+            var changed = false
+            titleList.forEachIndexed { index, data ->
+                val nextSelect = index == position
+                if (nextSelect != data.selected) {
+                    data.selected = nextSelect
+                    changed = true
+                }
             }
-        })
+            if (changed) {
+                titleAdapter.notifyDataSetChanged()
+            }
+            titleLayoutManger.scrollToPosition(titlePosition)
+        }
     }
 
 
@@ -103,31 +154,87 @@ class CategoryFragment : BaseFragment(R.layout.fragment_category) {
                     onlineList.add(entry.value)
                 }
             }
+            val titleList = mutableListOf<CategoryListTitleData>()
             val itemList = mutableListOf<CategoryItemData>()
+
+            var titlePosition = -1
             for (data in onlineList) {
+                titlePosition++
+                titleList.add(CategoryListTitleData(data))
+
+                itemToTitlePosition.add(titlePosition)
                 itemList.add(CategoryListTitleData(data))
 
+                titleToItemPosition.add(itemList.size + 1)
+                for (subData in data.subCategoryList) {
+                    itemToTitlePosition.add(titlePosition)
+                    itemList.add(CategoryListItemData(data.code, subData))
+                }
+                // TODO: 测试 
+                for (subData in data.subCategoryList) {
+                    itemToTitlePosition.add(titlePosition)
+                    itemList.add(CategoryListItemData(data.code, subData))
+                }
                 for (subData in data.subCategoryList) {
-                    itemList.add(CategoryListItemData(subData))
+                    itemToTitlePosition.add(titlePosition)
+                    itemList.add(CategoryListItemData(data.code, subData))
+                }
+                for (subData in data.subCategoryList) {
+                    itemToTitlePosition.add(titlePosition)
+                    itemList.add(CategoryListItemData(data.code, subData))
+                }
+                for (subData in data.subCategoryList) {
+                    itemToTitlePosition.add(titlePosition)
+                    itemList.add(CategoryListItemData(data.code, subData))
                 }
             }
             for (data in activityList) {
+                titlePosition++
+                titleList.add(CategoryListTitleData(data))
+
+                itemToTitlePosition.add(titlePosition)
                 itemList.add(CategoryListTitleData(data))
 
+                titleToItemPosition.add(itemList.size + 1)
                 for (subData in data.subCategoryList) {
-                    itemList.add(CategoryListItemData(subData))
+                    itemToTitlePosition.add(titlePosition)
+                    itemList.add(CategoryListItemData(data.code, subData))
+                }
+
+                // TODO: 测试
+                for (subData in data.subCategoryList) {
+                    itemToTitlePosition.add(titlePosition)
+                    itemList.add(CategoryListItemData(data.code, subData))
+                }
+                for (subData in data.subCategoryList) {
+                    itemToTitlePosition.add(titlePosition)
+                    itemList.add(CategoryListItemData(data.code, subData))
+                }
+                for (subData in data.subCategoryList) {
+                    itemToTitlePosition.add(titlePosition)
+                    itemList.add(CategoryListItemData(data.code, subData))
                 }
             }
-            submitCategoryList(itemList)
+            submitCategoryList(titleList, itemList)
         }
     }
 
-    private fun submitCategoryList(list: List<CategoryItemData>) {
-        tabAdapter.submitList(list.filter {
-            it is CategoryListTitleData
-        })
-        this.categoryList = list
-        listAdapter.submitList(list)
+    private fun submitCategoryList(
+        titleList: List<CategoryListTitleData>,
+        itemList: List<CategoryItemData>
+    ) {
+        this.titleList = titleList
+        titleAdapter.submitList(titleList)
+        this.itemList = itemList
+        listAdapter.submitList(itemList)
+    }
+
+    private fun selectItem(item: CategoryListItemData) {
+        val act = activity ?: return
+        Router.build(act, Playmate.List.PATH)
+            .putExtra(Playmate.Common.EXTRA_FIRST_CATEGORY_CODE, item.firstCode)
+            .putExtra(Playmate.Common.EXTRA_CATEGORY, item.data)
+            .start()
     }
 
 

+ 7 - 2
app/src/main/java/com/adealink/weparty/ui/category/adapter/CategoryListItemViewBinder.kt

@@ -2,18 +2,23 @@ package com.adealink.weparty.ui.category.adapter
 
 import android.view.LayoutInflater
 import android.view.ViewGroup
+import com.adealink.frame.util.onClick
 import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
 import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
 import com.adealink.weparty.databinding.LayoutCategoryItemBinding
 import com.adealink.weparty.ui.category.data.CategoryListItemData
 
-class CategoryListItemViewBinder :
-    ItemViewBinder<CategoryListItemData, BindingViewHolder<LayoutCategoryItemBinding>>() {
+class CategoryListItemViewBinder(
+    val onItemSelect: (item: CategoryListItemData, position: Int)->Unit
+) : ItemViewBinder<CategoryListItemData, BindingViewHolder<LayoutCategoryItemBinding>>() {
 
     override fun onBindViewHolder(
         holder: BindingViewHolder<LayoutCategoryItemBinding>,
         item: CategoryListItemData,
     ) {
+        holder.binding.root.onClick {
+            onItemSelect.invoke(item, holder.layoutPosition)
+        }
         holder.binding.ivImg.setImageUrl(item.data.icon)
         holder.binding.tvTab.text = item.data.name
     }

+ 16 - 2
app/src/main/java/com/adealink/weparty/ui/category/adapter/CategoryTabTitleViewBinder.kt

@@ -2,19 +2,33 @@ package com.adealink.weparty.ui.category.adapter
 
 import android.view.LayoutInflater
 import android.view.ViewGroup
+import com.adealink.frame.aab.util.getCompatColor
+import com.adealink.frame.util.onClick
+import com.adealink.weparty.R
 import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
 import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
 import com.adealink.weparty.databinding.LayoutCategoryTabTitleBinding
 import com.adealink.weparty.ui.category.data.CategoryListTitleData
 
-class CategoryTabTitleViewBinder :
-    ItemViewBinder<CategoryListTitleData, BindingViewHolder<LayoutCategoryTabTitleBinding>>() {
+class CategoryTabTitleViewBinder(
+    val onTabSelected: (item: CategoryListTitleData, position: Int) -> Unit
+) : ItemViewBinder<CategoryListTitleData, BindingViewHolder<LayoutCategoryTabTitleBinding>>() {
 
     override fun onBindViewHolder(
         holder: BindingViewHolder<LayoutCategoryTabTitleBinding>,
         item: CategoryListTitleData,
     ) {
+        holder.binding.root.onClick {
+            onTabSelected.invoke(item, holder.layoutPosition)
+        }
         holder.binding.tvTitle.text = item.data.name
+        if (item.selected) {
+            holder.binding.clContent.setBackgroundResource(R.drawable.category_tab_item_bg)
+            holder.binding.tvTitle.setTextColor(getCompatColor(R.color.white))
+        } else {
+            holder.binding.clContent.setBackgroundResource(0)
+            holder.binding.tvTitle.setTextColor(getCompatColor(R.color.color_FF4E5969))
+        }
     }
 
     override fun onCreateViewHolder(

+ 4 - 1
app/src/main/java/com/adealink/weparty/ui/category/data/CategoryData.kt

@@ -7,7 +7,9 @@ import com.adealink.weparty.module.profile.data.UserInterest
 
 sealed class CategoryItemData : BaseListItemData
 data class CategoryListTitleData(
-    val data: PlaymateCategoryData
+    val data: PlaymateCategoryData,
+
+    var selected: Boolean = false
 ) : CategoryItemData()
 
 data class CategoryListData(
@@ -27,6 +29,7 @@ data class CategoryListData(
 }
 
 data class CategoryListItemData(
+    val firstCode: String,
     val data: PlaymateCategoryData,
     var selected: Boolean = false
 ) : CategoryItemData() {

+ 3 - 6
app/src/main/java/com/adealink/weparty/webview/WebViewActivity.kt

@@ -30,7 +30,7 @@ class WebViewActivity : BaseActivity(), IWebViewFragmentCallback {
     var url: String? = null
 
     @BindExtra(name = Web.Common.EXTRA_SHOW_TOPBAR, desc = "显示顶部栏")
-    var showTopbar: Boolean = false
+    var showTopbar: Boolean = true
 
     @BindExtra(name = Web.Common.EXTRA_SAFE_AREA, desc = "控制安全区域(顶部状态栏)")
     var safeArea: Boolean = false
@@ -59,13 +59,10 @@ class WebViewActivity : BaseActivity(), IWebViewFragmentCallback {
             binding.topBar.updateLayoutParams<ConstraintLayout.LayoutParams> {
                 topMargin = this@WebViewActivity.statusBarHeight()
             }
+            binding.root.fitsSystemWindows = false
         } else {
             binding.topBar.gone()
-        }
-        if (safeArea) {
-            binding.root.fitsSystemWindows = true
-        } else {
-            binding.root.fitsSystemWindows = false
+            binding.root.fitsSystemWindows = safeArea
         }
 
         webFragment.arguments = Bundle().apply {

+ 1 - 0
app/src/main/res/layout/layout_category_tab_title.xml

@@ -6,6 +6,7 @@
     android:layout_height="wrap_content">
 
     <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_content"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:background="@drawable/category_tab_item_bg"

+ 1 - 1
gradle.properties

@@ -30,7 +30,7 @@ OFFICIAL=false
 IS_RELEASE=true
 
 VERSION_CODE=10
-VERSION_NAME=1.0.0(ahpha 22)
+VERSION_NAME=1.0.0(ahpha 23)
 
 OFFICIAL_UID=10000
 OFFICIAL_CONVERSATION_ID=c2c_10000

+ 2 - 2
module/account/src/main/java/com/adealink/weparty/account/register/fragment/SelectCategoryFragment.kt

@@ -111,14 +111,14 @@ class SelectCategoryFragment : BaseFragment(R.layout.fragment_register_select_ca
                 itemList.add(CategoryListTitleData(data))
 
                 for (subData in data.subCategoryList) {
-                    itemList.add(CategoryListItemData(subData))
+                    itemList.add(CategoryListItemData(data.code, subData))
                 }
             }
             for (data in activityList) {
                 itemList.add(CategoryListTitleData(data))
 
                 for (subData in data.subCategoryList) {
-                    itemList.add(CategoryListItemData(subData))
+                    itemList.add(CategoryListItemData(data.code, subData))
                 }
             }
             submitCategoryList(itemList)

+ 3 - 1
module/im/src/main/java/com/adealink/weparty/im/list/adapter/viewbinder/OfficialListItemViewBinder.kt

@@ -2,11 +2,13 @@ package com.adealink.weparty.im.list.adapter.viewbinder
 
 import android.view.LayoutInflater
 import android.view.ViewGroup
+import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.data.json.froJsonErrorNull
 import com.adealink.frame.dot.NumDot
 import com.adealink.frame.util.onClick
 import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
 import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
+import com.adealink.weparty.im.R
 import com.adealink.weparty.im.databinding.LayoutSessionListOfficialItemBinding
 import com.adealink.weparty.im.list.adapter.data.OfficialSessionListItem
 import com.adealink.weparty.util.formatTimeStr
@@ -27,7 +29,7 @@ class OfficialListItemViewBinder(
         holder.binding.root.onClick {
             listener.onItemClick(it, item.data.type, item.data)
         }
-        holder.binding.tvTitle.text = item.data.title
+        holder.binding.tvTitle.text = getCompatString(R.string.im_official_msg_name)
         setLastMessageAndStatus(holder, item)
     }
 

+ 1 - 0
module/im/src/main/res/values-in/strings.xml

@@ -17,4 +17,5 @@
     <string name="im_setting_black">Tambahkan ke daftar hitam</string>
     <string name="im_setting_report">Laporkan</string>
     <string name="im_playmate_order_title">Pesanan Playmate</string>
+    <string name="im_official_msg_name">Pesan Resmi</string>
 </resources>

+ 1 - 0
module/im/src/main/res/values-zh/strings.xml

@@ -17,4 +17,5 @@
     <string name="im_setting_black">拉黑</string>
     <string name="im_setting_report">举报</string>
     <string name="im_playmate_order_title">陪玩订单</string>
+    <string name="im_official_msg_name">官方消息</string>
 </resources>

+ 1 - 0
module/im/src/main/res/values/strings.xml

@@ -18,4 +18,5 @@
     <string name="im_setting_report">Report</string>
     <string name="im_playmate_order_title">Playmate Orders</string>
     <string name="im_playmate_reply">Reply</string>
+    <string name="im_official_msg_name">Official Message</string>
 </resources>

+ 85 - 3
module/order/src/main/java/com/adealink/weparty/order/OrderDetailActivity.kt

@@ -4,8 +4,11 @@ import android.annotation.SuppressLint
 import androidx.activity.viewModels
 import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.core.view.updateLayoutParams
+import androidx.recyclerview.widget.GridLayoutManager
+import com.adealink.frame.aab.util.getCompatDimension
 import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.base.Rlt
+import com.adealink.frame.base.fastLazy
 import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.frame.router.Router
 import com.adealink.frame.router.annotation.BindExtra
@@ -14,10 +17,14 @@ import com.adealink.frame.util.formatTime
 import com.adealink.frame.util.onClick
 import com.adealink.frame.util.statusBarHeight
 import com.adealink.weparty.commonui.BaseActivity
+import com.adealink.weparty.commonui.ext.dp
 import com.adealink.weparty.commonui.ext.gone
 import com.adealink.weparty.commonui.ext.show
+import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
+import com.adealink.weparty.commonui.recycleview.itemdecoration.GridSpacingItemDecoration
 import com.adealink.weparty.commonui.toast.util.showFailedToast
 import com.adealink.weparty.commonui.widget.CommonDialog
+import com.adealink.weparty.module.image.data.PhotoData
 import com.adealink.weparty.module.order.Order
 import com.adealink.weparty.module.order.data.OrderDetailData
 import com.adealink.weparty.module.order.data.OrderDetailInfo
@@ -26,11 +33,16 @@ import com.adealink.weparty.module.order.util.getUserOrderStatusIcon
 import com.adealink.weparty.module.order.util.getUserOrderStatusText
 import com.adealink.weparty.order.databinding.ActivityOrderDetailBinding
 import com.adealink.weparty.order.dialog.EvaluateOrderDialog
+import com.adealink.weparty.order.refund.PlaymateEvidenceActivity.Companion.PICTURE_SPAN
+import com.adealink.weparty.order.refund.adapter.PhotoItemViewBinder
+import com.adealink.weparty.order.refund.data.BasePhotoItemData
+import com.adealink.weparty.order.refund.data.PhotoItemData
 import com.adealink.weparty.order.util.getOrderAllCost
 import com.adealink.weparty.order.viewmodel.OrderViewModel
 import com.adealink.weparty.order.viewmodel.OrderViewModelFactory
 import com.adealink.weparty.order.viewmodel.UserOrderViewModel
 import com.adealink.weparty.util.TIME_FORMAT_DMY_HMS
+import com.adealink.weparty.util.goImagePreviewActivity
 import com.adealink.weparty.R as APP_R
 
 @RouterUri(path = [Order.Detail.PATH], desc = "订单详情")
@@ -49,6 +61,8 @@ class OrderDetailActivity : BaseActivity() {
     private var orderDetail: OrderDetailData? = null
 
     private val binding by viewBinding(ActivityOrderDetailBinding::inflate)
+
+    private val pictureAdapter by fastLazy { MultiTypeListAdapter<BasePhotoItemData>() }
     private val orderViewModel by viewModels<OrderViewModel> { OrderViewModelFactory() }
     private val userOrderViewModel by viewModels<UserOrderViewModel> { OrderViewModelFactory() }
 
@@ -60,8 +74,10 @@ class OrderDetailActivity : BaseActivity() {
     override fun initViews() {
         super.initViews()
         setContentView(binding.root)
+        val statusBarHeight = this@OrderDetailActivity.statusBarHeight()
+        binding.topBar.setPadding(0, statusBarHeight, 0, 0)
         binding.topBar.updateLayoutParams<ConstraintLayout.LayoutParams> {
-            topMargin = this@OrderDetailActivity.statusBarHeight()
+            height = statusBarHeight + getCompatDimension(APP_R.dimen.common_top_bar_height).toInt()
         }
 
         binding.btnCancel.onClick {
@@ -76,6 +92,21 @@ class OrderDetailActivity : BaseActivity() {
         binding.btnEvaluate.onClick {
             clickEvaluate()
         }
+
+        pictureAdapter.register(
+            PhotoItemViewBinder(
+                onItemClick = {
+                    previewPicture(it.data)
+                },
+                onDeleteClick = {
+                }
+            ))
+        binding.rvReasonPicture.adapter = pictureAdapter
+        binding.rvReasonPicture.layoutManager = GridLayoutManager(this, PICTURE_SPAN)
+        binding.rvReasonPicture.addItemDecoration(
+            GridSpacingItemDecoration(PICTURE_SPAN, 4.dp(), 4.dp(), false)
+        )
+
         val orderData = this@OrderDetailActivity.orderInfo
         if (orderData != null) {
             updateOrderDetail(OrderDetailData(orderData, null, null, null, null))
@@ -119,14 +150,33 @@ class OrderDetailActivity : BaseActivity() {
         )
         binding.tvOrderStatus.text = getUserOrderStatusText(orderStatus, data?.order?.refundApply)
 
+        if (data?.order?.refundApply == true
+            || data?.order?.status == OrderStatus.USER_REFUND.status
+            || data?.order?.status == OrderStatus.PLAYMATE_REFUSE.status
+            || data?.order?.status == OrderStatus.USER_CANCEL.status
+        ) {
+            binding.ivTopBg.setImageResource(R.drawable.order_detail_top_cancel_bg)
+        } else {
+            binding.ivTopBg.setImageResource(R.drawable.order_detail_top_bg)
+        }
+
         binding.ivOrderAvatar.setImageUrl(data?.order?.avatar)
         binding.tvOrderName.text = data?.order?.nickname
 
         binding.tvProductTypeDetail.text = data?.order?.categoryName
+        binding.tvProductPriceDetail.text = data?.order?.price?.toString()
         binding.tvOrderCountDetail.text = "${data?.order?.purchaseQty} x ${data?.order?.unit}"
+        if (data?.order?.customerRemark.isNullOrEmpty()) {
+            binding.clOrderRemark.gone()
+        } else {
+            binding.clOrderRemark.show()
+            binding.tvOrderRemarkDetail.text = data?.order?.customerRemark
+        }
         binding.tvOrderIdDetail.text = data?.order?.orderId
-        binding.tvOrderTimeDetail.text = formatTime(data?.order?.createTime ?: 0, TIME_FORMAT_DMY_HMS)
-        binding.tvOrderCostDetail.text = getOrderAllCost(data?.order?.price ?: 0f, data?.order?.purchaseQty ?: 0)
+        binding.tvOrderTimeDetail.text =
+            formatTime(data?.order?.createTime ?: 0, TIME_FORMAT_DMY_HMS)
+        binding.tvOrderCostDetail.text =
+            getOrderAllCost(data?.order?.price ?: 0f, data?.order?.purchaseQty ?: 0)
 
         if (data?.order?.refundApply == true) {
             binding.clOrderCancel.gone()
@@ -184,6 +234,27 @@ class OrderDetailActivity : BaseActivity() {
                 }
             }
         }
+
+        if (data?.order?.refundApply == true || data?.order?.status == OrderStatus.USER_REFUND.status) {
+            binding.clUserRefund.show()
+            binding.tvReason.text = data.refundReason
+            val imageItemList = data.refundAttachments?.map {
+                PhotoItemData(
+                    PhotoData(url = it.attachmentUrl, path = null, uri = null),
+                    showDelete = false
+                )
+            }
+            if (imageItemList.isNullOrEmpty()) {
+                binding.tvReasonPictureTitle.gone()
+                binding.rvReasonPicture.gone()
+            } else {
+                binding.tvReasonPictureTitle.show()
+                binding.rvReasonPicture.show()
+                pictureAdapter.submitList(imageItemList)
+            }
+        } else {
+            binding.clUserRefund.gone()
+        }
     }
 
     private fun clickCancel() {
@@ -246,4 +317,15 @@ class OrderDetailActivity : BaseActivity() {
         }.show(supportFragmentManager, "EvaluateOrderDialog")
     }
 
+    private fun previewPicture(data: PhotoData) {
+        val uri = data.uri
+        if (uri.isNullOrEmpty()) {
+            return
+        }
+        goImagePreviewActivity(
+            this,
+            arrayListOf(uri)
+        )
+    }
+
 }

+ 1 - 4
module/order/src/main/java/com/adealink/weparty/order/adapter/PlaymateListItemViewBinder.kt

@@ -112,10 +112,7 @@ class PlaymateListItemViewBinder(
             status == OrderStatus.USER_REFUND -> {
                 holder.binding.btnFinish.gone()
                 holder.binding.btnRefuse.gone()
-                holder.binding.btnSubmitEvidence.show()
-                holder.binding.btnSubmitEvidence.onClick {
-                    listener.submitEvidence(item, holder.layoutPosition)
-                }
+                holder.binding.btnSubmitEvidence.gone()
             }
 
             status == OrderStatus.PLAYMATE_END_SERVICE -> {

+ 1 - 1
module/order/src/main/java/com/adealink/weparty/order/dialog/EvaluateOrderDialog.kt

@@ -82,7 +82,7 @@ class EvaluateOrderDialog : BottomDialogFragment(R.layout.dialog_evaluate_order)
                 }
             }
         })
-
+        binding.btnSubmit.isEnabled = false
         binding.btnSubmit.onClick {
             submit()
         }

+ 218 - 14
module/order/src/main/res/layout/activity_order_detail.xml

@@ -3,21 +3,32 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:background="@color/color_FFF1F2F5">
 
     <com.adealink.weparty.commonui.widget.CommonTopBar
         android:id="@+id/top_bar"
         android:layout_width="match_parent"
         android:layout_height="@dimen/common_top_bar_height"
+        android:background="@color/white"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"
         app:top_bar_title="@string/order_detail_title" />
 
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_top_bg"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        app:layout_constraintDimensionRatio="375:193"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/top_bar"
+        app:srcCompat="@drawable/order_detail_top_bg" />
+
     <androidx.core.widget.NestedScrollView
         android:layout_width="match_parent"
         android:layout_height="0dp"
-        android:background="@color/color_FFF1F2F5"
         android:orientation="vertical"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
@@ -29,16 +40,6 @@
             android:layout_height="wrap_content"
             android:paddingBottom="60dp">
 
-            <androidx.appcompat.widget.AppCompatImageView
-                android:id="@+id/iv_top_bg"
-                android:layout_width="0dp"
-                android:layout_height="0dp"
-                app:layout_constraintDimensionRatio="375:193"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent"
-                app:srcCompat="@drawable/order_detail_top_bg" />
-
             <com.adealink.weparty.commonui.widget.EvaluateView
                 android:id="@+id/v_evaluate"
                 android:layout_width="wrap_content"
@@ -95,6 +96,7 @@
             </androidx.constraintlayout.widget.ConstraintLayout>
 
             <androidx.constraintlayout.widget.ConstraintLayout
+                android:id="@+id/cl_order"
                 android:layout_width="0dp"
                 android:layout_height="wrap_content"
                 android:layout_marginHorizontal="16dp"
@@ -192,6 +194,72 @@
 
                 </androidx.constraintlayout.widget.ConstraintLayout>
 
+                <!-- 产品单价 -->
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/cl_order_product_price"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:minHeight="30dp"
+                    android:paddingVertical="6dp"
+                    app:layout_constraintTop_toBottomOf="@id/cl_order_product_type">
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:id="@+id/tv_product_price"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:includeFontPadding="false"
+                        android:text="@string/order_product_price"
+                        android:textColor="@color/color_FF1D2129"
+                        android:textSize="12sp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintEnd_toStartOf="@id/cl_product_price_detail"
+                        app:layout_constraintHorizontal_weight="2"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <androidx.constraintlayout.widget.ConstraintLayout
+                        android:id="@+id/cl_product_price_detail"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintHorizontal_bias="1"
+                        app:layout_constraintHorizontal_weight="3"
+                        app:layout_constraintStart_toEndOf="@id/tv_product_price"
+                        app:layout_constraintTop_toTopOf="parent">
+
+                        <androidx.appcompat.widget.AppCompatImageView
+                            android:id="@+id/iv_product_price_detail"
+                            android:layout_width="11dp"
+                            android:layout_height="11dp"
+                            app:layout_constraintBottom_toBottomOf="parent"
+                            app:layout_constraintEnd_toStartOf="@id/tv_product_price_detail"
+                            app:layout_constraintHorizontal_bias="1"
+                            app:layout_constraintHorizontal_chainStyle="packed"
+                            app:layout_constraintStart_toStartOf="parent"
+                            app:layout_constraintTop_toTopOf="parent"
+                            app:srcCompat="@drawable/common_wallet_coin_32_ic" />
+
+                        <androidx.appcompat.widget.AppCompatTextView
+                            android:id="@+id/tv_product_price_detail"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginStart="2dp"
+                            android:gravity="end"
+                            android:includeFontPadding="false"
+                            android:textColor="@color/color_FF1D2129"
+                            android:textSize="12sp"
+                            app:layout_constrainedWidth="true"
+                            app:layout_constraintBottom_toBottomOf="parent"
+                            app:layout_constraintEnd_toEndOf="parent"
+                            app:layout_constraintStart_toEndOf="@id/iv_product_price_detail"
+                            app:layout_constraintTop_toTopOf="parent"
+                            tools:text="1000" />
+
+                    </androidx.constraintlayout.widget.ConstraintLayout>
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
                 <!-- 购买数量 -->
                 <androidx.constraintlayout.widget.ConstraintLayout
                     android:id="@+id/cl_order_count"
@@ -199,7 +267,7 @@
                     android:layout_height="wrap_content"
                     android:minHeight="30dp"
                     android:paddingVertical="6dp"
-                    app:layout_constraintTop_toBottomOf="@id/cl_order_product_type">
+                    app:layout_constraintTop_toBottomOf="@id/cl_order_product_price">
 
                     <androidx.appcompat.widget.AppCompatTextView
                         android:id="@+id/tv_order_count"
@@ -234,6 +302,48 @@
 
                 </androidx.constraintlayout.widget.ConstraintLayout>
 
+                <!-- 备注 -->
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/cl_order_remark"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:minHeight="30dp"
+                    android:paddingVertical="6dp"
+                    app:layout_constraintTop_toBottomOf="@id/cl_order_count">
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:id="@+id/tv_order_remark"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:includeFontPadding="false"
+                        android:text="@string/order_remark"
+                        android:textColor="@color/color_FF1D2129"
+                        android:textSize="12sp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintEnd_toStartOf="@id/tv_order_remark_detail"
+                        app:layout_constraintHorizontal_weight="2"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:id="@+id/tv_order_remark_detail"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:gravity="end"
+                        android:includeFontPadding="false"
+                        android:textColor="@color/color_FF1D2129"
+                        android:textSize="12sp"
+                        app:layout_constrainedWidth="true"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintHorizontal_bias="1"
+                        app:layout_constraintHorizontal_weight="3"
+                        app:layout_constraintStart_toEndOf="@id/tv_order_remark"
+                        app:layout_constraintTop_toTopOf="parent"
+                        tools:text="1" />
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
                 <!-- 订单编号 -->
                 <androidx.constraintlayout.widget.ConstraintLayout
                     android:id="@+id/cl_order_id"
@@ -241,7 +351,7 @@
                     android:layout_height="wrap_content"
                     android:minHeight="30dp"
                     android:paddingVertical="6dp"
-                    app:layout_constraintTop_toBottomOf="@id/cl_order_count">
+                    app:layout_constraintTop_toBottomOf="@id/cl_order_remark">
 
                     <androidx.appcompat.widget.AppCompatTextView
                         android:id="@+id/tv_order_id"
@@ -360,6 +470,100 @@
 
             </androidx.constraintlayout.widget.ConstraintLayout>
 
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:id="@+id/cl_user_refund"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginHorizontal="16dp"
+                android:layout_marginTop="10dp"
+                android:background="@drawable/order_detail_bg"
+                android:paddingHorizontal="12dp"
+                android:paddingVertical="8dp"
+                android:visibility="gone"
+                app:layout_constraintTop_toBottomOf="@id/cl_order"
+                tools:visibility="visible">
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_reason_title"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:ellipsize="end"
+                    android:gravity="start|center"
+                    android:includeFontPadding="false"
+                    android:text="@string/order_playmate_customer_refund_reason"
+                    android:textColor="@color/color_FF1D2129"
+                    android:textSize="14sp"
+                    android:textStyle="bold"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/v_reason"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dp"
+                    android:background="@drawable/common_input_edit_bg"
+                    android:paddingHorizontal="12dp"
+                    android:paddingVertical="8dp"
+                    app:layout_constrainedHeight="true"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_reason_title">
+
+                    <androidx.core.widget.NestedScrollView
+                        android:id="@+id/sv_reason"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        app:layout_constrainedHeight="true"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintHeight_max="250dp"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:layout_constraintVertical_chainStyle="spread_inside">
+
+                        <androidx.appcompat.widget.AppCompatTextView
+                            android:id="@+id/tv_reason"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:background="@null"
+                            android:gravity="start|top"
+                            android:includeFontPadding="false"
+                            android:maxLength="800"
+                            android:textColor="@color/color_FF1D2129"
+                            android:textColorHint="@color/color_FFCDCFD9"
+                            tools:hint="asdf;asdjfka;" />
+
+                    </androidx.core.widget.NestedScrollView>
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_reason_picture_title"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="16dp"
+                    android:ellipsize="end"
+                    android:includeFontPadding="false"
+                    android:singleLine="true"
+                    android:text="@string/order_playmate_customer_refund_picture"
+                    android:textColor="@color/color_FF1D2129"
+                    android:textSize="14sp"
+                    android:textStyle="bold"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/v_reason" />
+
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/rv_reason_picture"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dp"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_reason_picture_title" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
 
         </androidx.constraintlayout.widget.ConstraintLayout>
 

+ 2 - 0
module/order/src/main/res/values-in/strings.xml

@@ -5,6 +5,8 @@
     <string name="order_refunded_success">Jumlah yang dikembalikan ke dompet Anda</string>
     <string name="order_detail_title">Detail Pesanan</string>
     <string name="order_product_type">Jenis Produk</string>
+    <string name="order_product_price">Harga</string>
+    <string name="order_buy_remark">Komentar</string>
     <string name="order_buy_count">Kuantitas</string>
     <string name="order_id">Nomor Pesanan</string>
     <string name="order_time">Waktu Pembelian</string>

+ 2 - 0
module/order/src/main/res/values-zh/strings.xml

@@ -5,6 +5,8 @@
     <string name="order_refunded_success">金额已退还至您的钱包</string>
     <string name="order_detail_title">订单详情</string>
     <string name="order_product_type">产品类型</string>
+    <string name="order_product_price">单价</string>
+    <string name="order_buy_remark">备注</string>
     <string name="order_buy_count">购买数量</string>
     <string name="order_id">订单编号</string>
     <string name="order_time">购买时间</string>

+ 2 - 0
module/order/src/main/res/values/strings.xml

@@ -5,6 +5,8 @@
     <string name="order_refunded_success">Amount refunded to your wallet</string>
     <string name="order_detail_title">Order Details</string>
     <string name="order_product_type">Product Type</string>
+    <string name="order_product_price">Price</string>
+    <string name="order_buy_remark">Remark</string>
     <string name="order_buy_count">Quantity</string>
     <string name="order_id">Order Number</string>
     <string name="order_time">Purchase Time</string>

+ 1 - 1
module/playmate/src/main/java/com/adealink/weparty/playmate/findpartner/page/SelectCategoryFragment.kt

@@ -113,7 +113,7 @@ class SelectCategoryFragment : BaseFragment(R.layout.fragment_find_partner_categ
         val tabData = tabList.getOrNull(positon)
 
         val itemList = tabData?.data?.subCategoryList?.map {
-            CategoryListItemData(it)
+            CategoryListItemData(tabData.data.code, it)
         } ?: emptyList()
 
         listAdapter.submitList(itemList)

+ 5 - 2
module/playmate/src/main/res/layout/activity_playmate_list.xml

@@ -9,14 +9,17 @@
         android:layout_width="0dp"
         android:layout_height="@dimen/common_top_bar_height"
         app:layout_constraintEnd_toEndOf="parent"
-        app:top_bar_title="@string/playmate_list_title"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
+        app:layout_constraintTop_toTopOf="parent"
+        app:top_bar_title="@string/playmate_list_title" />
 
     <androidx.fragment.app.FragmentContainerView
         android:id="@+id/fl_content"
         android:layout_width="0dp"
         android:layout_height="0dp"
+        android:layout_marginTop="8dp"
+        android:background="@color/color_FFF1F2F5"
+        android:paddingHorizontal="16dp"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"

+ 1 - 0
module/profile/src/main/java/com/adealink/weparty/profile/dialog/CharmStarDialog.kt

@@ -29,6 +29,7 @@ class CharmStarDialog : BottomDialogFragment(R.layout.dialog_playmate_charm_star
                 binding.btnSubmit.isEnabled = score > 0
             }
         })
+        binding.btnSubmit.isEnabled = false
         binding.btnSubmit.onClick {
             submit()
         }

+ 5 - 1
module/profile/src/main/java/com/adealink/weparty/profile/edit/dialog/adapter/InterestListViewBinder.kt

@@ -61,7 +61,11 @@ class InterestListViewBinder() :
         fun update(item: CategoryListData) {
             itemData = item
             val items = item.data.subCategoryList.map {
-                CategoryListItemData(it, selected = item.selectedCodes.contains(it.code))
+                CategoryListItemData(
+                    item.data.code,
+                    it,
+                    selected = item.selectedCodes.contains(it.code)
+                )
             }
             listAdapter.submitList(items)
         }

+ 6 - 6
module/profile/src/main/java/com/adealink/weparty/profile/relation/viewmodel/RelationShipTab.kt

@@ -5,15 +5,15 @@ import com.adealink.weparty.profile.relation.FansFragment
 import com.adealink.weparty.profile.relation.FollowFragment
 
 enum class RelationShipTab(val index: Int) {
-
     /**
-     * 粉丝
+     * 关注
      */
-    FANS(0),
+    FOLLOW(0),
+
     /**
-     * 关注
+     * 粉丝
      */
-    FOLLOW(1),
+    FANS(1),
 }
 
 data class Tab(
@@ -37,5 +37,5 @@ val FANS_TAB = Tab(
 
 
 val RELATIONSHIP_TABS = listOf(
-    FANS_TAB, FOLLOW_TAB
+    FOLLOW_TAB, FANS_TAB
 )

+ 1 - 1
module/setting/src/main/java/com/adealink/weparty/setting/helpcenter/HelpCenterActivity.kt

@@ -105,7 +105,7 @@ class HelpCenterActivity : BaseActivity() {
                 }
             }
         })
-
+        binding.btnSubmit.isEnabled = false
 
         pictureAdapter.register(
             AddPictureItemViewBinder {

+ 1 - 1
module/setting/src/main/java/com/adealink/weparty/setting/report/ReportActivity.kt

@@ -108,7 +108,7 @@ class ReportActivity : BaseActivity() {
                 }
             }
         })
-
+        binding.btnSubmit.isEnabled = false
 
         pictureAdapter.register(
             AddPictureItemViewBinder {

+ 1 - 1
module/setting/src/main/res/layout/activity_report.xml

@@ -98,7 +98,7 @@
                         android:gravity="center|end"
                         android:includeFontPadding="false"
                         android:singleLine="true"
-                        android:text="0/800"
+                        android:text="0/200"
                         android:textColor="@color/color_FFCDCFD9"
                         android:textSize="14sp"
                         app:layout_constraintBottom_toBottomOf="parent"

+ 13 - 0
module/wallet/src/main/java/com/adealink/weparty/wallet/recharge/dialog/ConvertCurrencyDialog.kt

@@ -15,6 +15,7 @@ import com.adealink.weparty.wallet.R
 import com.adealink.weparty.wallet.databinding.DialogConvertCurrencyBinding
 import com.adealink.weparty.wallet.viewmodel.WalletViewModel
 import com.adealink.weparty.wallet.viewmodel.WalletViewModelFactory
+import com.qmuiteam.qmui.widget.util.QMUIKeyboardHelper
 import com.adealink.weparty.R as APP_R
 
 class ConvertCurrencyDialog : BottomDialogFragment(R.layout.dialog_convert_currency) {
@@ -37,21 +38,27 @@ class ConvertCurrencyDialog : BottomDialogFragment(R.layout.dialog_convert_curre
         super.initViews()
         binding.tvTitle.text =
             getCompatString(R.string.wallet_convert_currency_title, toCurrency.desc())
+        binding.btnClose.onClick {
+            dismiss()
+        }
 
         when (fromCurrency) {
             Currency.COIN -> {
                 binding.tvFromCurrency.text = getCompatString(R.string.wallet_convert_from_coin)
                 binding.ivFromCurrency.setImageResource(APP_R.drawable.common_wallet_coin_32_ic)
+                binding.ivFromCurrencyAmount.setImageResource(APP_R.drawable.common_wallet_coin_32_ic)
             }
 
             Currency.DIAMOND -> {
                 binding.tvFromCurrency.text = getCompatString(R.string.wallet_convert_from_diamond)
                 binding.ivFromCurrency.setImageResource(APP_R.drawable.common_wallet_diamond_32_ic)
+                binding.ivFromCurrencyAmount.setImageResource(APP_R.drawable.common_wallet_diamond_32_ic)
             }
 
             Currency.BEAN -> {
                 binding.tvFromCurrency.text = getCompatString(R.string.wallet_convert_from_bean)
                 binding.ivFromCurrency.setImageResource(APP_R.drawable.common_wallet_bean_32_ic)
+                binding.ivFromCurrencyAmount.setImageResource(APP_R.drawable.common_wallet_bean_32_ic)
             }
         }
 
@@ -75,6 +82,12 @@ class ConvertCurrencyDialog : BottomDialogFragment(R.layout.dialog_convert_curre
         binding.btnAllConvert.onClick {
             allExchanged()
         }
+        binding.clFromDetail.onClick {
+            if (binding.etFromCurrencyAmount.isEnabled) {
+                QMUIKeyboardHelper.showKeyboard(binding.etFromCurrencyAmount, 50)
+                binding.etFromCurrencyAmount.requestFocus()
+            }
+        }
 
         binding.etFromCurrencyAmount.isEnabled = false
         binding.btnExchange.onClick {

+ 12 - 1
module/wallet/src/main/java/com/adealink/weparty/wallet/recharge/dialog/RechargeDialog.kt

@@ -4,12 +4,14 @@ import androidx.fragment.app.activityViewModels
 import androidx.fragment.app.viewModels
 import androidx.recyclerview.widget.GridLayoutManager
 import com.adealink.frame.aab.util.getCompatString
+import com.adealink.frame.base.Rlt
 import com.adealink.frame.base.fastLazy
 import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.frame.util.onClick
 import com.adealink.weparty.commonui.ext.dp
 import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
 import com.adealink.weparty.commonui.recycleview.itemdecoration.GridSpacingItemDecoration
+import com.adealink.weparty.commonui.toast.util.showFailedToast
 import com.adealink.weparty.commonui.toast.util.showToast
 import com.adealink.weparty.commonui.widget.BottomDialogFragment
 import com.adealink.weparty.module.wallet.data.Currency
@@ -136,8 +138,17 @@ class RechargeDialog : BottomDialogFragment(R.layout.dialog_recharge) {
             return
         }
         showLoading()
-        rechargeViewModel.recharge(act, selectItem.data).observe(viewLifecycleOwner) {
+        rechargeViewModel.recharge(act, selectItem.data).observe(viewLifecycleOwner) { rlt ->
             dismissLoading()
+            when (rlt) {
+                is Rlt.Failed -> {
+                    showFailedToast(rlt)
+                }
+
+                is Rlt.Success -> {
+                    dismiss()
+                }
+            }
         }
     }
 

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

@@ -66,8 +66,9 @@
         <androidx.appcompat.widget.AppCompatTextView
             android:id="@+id/btn_all_convert"
             android:layout_width="wrap_content"
+            android:paddingHorizontal="8dp"
+            android:paddingVertical="4dp"
             android:layout_height="wrap_content"
-            android:layout_marginStart="2dp"
             android:includeFontPadding="false"
             android:text="@string/wallet_all_convert_button"
             android:textColor="@color/color_FF3FBFBD"