Explorar o código

feat:标签改版,统一样式(#21)

* feat:标签改版

* feat:标签改版

* feat:标签改版,魅力等级

* feat:标签改版,调整目录

* feat:标签改版,财富等级标签和SVIP标签

* feat:标签改版,财富等级标签和SVIP标签

* feat:标签改版,调整文件目录

* feat:标签改版,vip标签

* feat:标签改版,聊天成就标签

* feat:标签改版,性别标签

* feat:标签改版,性别标签

* feat:标签改版,榜单标签

* feat:标签改版,榜单标签

* feat:标签改版,家族标签

* feat:ui规范适配

* feat:ui规范适配

* feat:ui规范适配,应用场景2

* feat:ui规范适配,资源替换

* feat:ui规范适配,修复性别标签展示异常

* feat:ui规范适配,场景适配

* feat:ui规范适配,场景适配

* feat:语音房修改

* feat:全局体验优化

* feat:全局体验优化

* feat:全局体验优化

* feat:ui规范适配,替换svip资源

* feat:ui规范适配,修复编译问题

* feat:ui规范适配,替换svip资源

* feat:ui规范适配,替换财富等级资源

* feat:补充日志

* feat:补充日志

* 处理review问题

* bugfix:官方认证的icon与设计稿不符

* baseLabelView标签支持大小变化自适应

* baseLabelView标签支持大小变化自适应

* feat:房间个人资料卡,财富等级标签内容展示不完整

* bugfix:个人资料页面,用户id展示位置不正确

* bugfix:doOnPreDraw替换post,个人资料页语音条颜色与设计稿不符

* bugfix:部分逻辑保留post,不用doOnPreDraw,避免没有下一次绘制View

* bugfix:真人认证页面的认证icon未修改

* bugfix:群聊界面用户的财富等级标签字体偏小

* feat:补充弹窗日志信息

* bugfix:群聊界面用户的财富等级标签字体偏小

* Revert "bugfix:群聊界面用户的财富等级标签字体偏小"

This reverts commit e33cc35733db13b826d42be81e821562d091866e.

* feat:语音房资料卡不要聊天成就标签

* bugfix:修复个人页榜单标签闪烁问题

* bugfix:适配财富等级占位文本大小

* bugfix:im私聊页顶部资料卡空白

* bugfix:适配财富等级占位文本大小

* feat:修复一波UI验收问题

* feat:修复UI问题

* feat:修复一波UI验收问题
LiuFJie hai 7 meses
pai
achega
b3728aadfd
Modificáronse 100 ficheiros con 1150 adicións e 669 borrados
  1. BIN=BIN
      app/src/main/assets/level/wealth_level_0_to_29_bg.svga
  2. BIN=BIN
      app/src/main/assets/level/wealth_level_0_to_9_bg.svga
  3. BIN=BIN
      app/src/main/assets/level/wealth_level_100_bg.svga
  4. BIN=BIN
      app/src/main/assets/level/wealth_level_10_to_19_bg.svga
  5. BIN=BIN
      app/src/main/assets/level/wealth_level_20_to_29_bg.svga
  6. BIN=BIN
      app/src/main/assets/level/wealth_level_30_to_39_bg.svga
  7. BIN=BIN
      app/src/main/assets/level/wealth_level_40_to_49_bg.svga
  8. BIN=BIN
      app/src/main/assets/level/wealth_level_50_to_59_bg.svga
  9. BIN=BIN
      app/src/main/assets/level/wealth_level_60_to_69_bg.svga
  10. BIN=BIN
      app/src/main/assets/level/wealth_level_70_to_79_bg.svga
  11. BIN=BIN
      app/src/main/assets/level/wealth_level_80_to_89_bg.svga
  12. BIN=BIN
      app/src/main/assets/level/wealth_level_90_to_99_bg.svga
  13. 1 2
      app/src/main/java/com/adealink/weparty/commonui/dialogchain/DialogTaskManager.kt
  14. 1 1
      app/src/main/java/com/adealink/weparty/module/level/data/LevelData.kt
  15. 21 0
      app/src/main/java/com/adealink/weparty/module/level/label/AgencyView.kt
  16. 12 0
      app/src/main/java/com/adealink/weparty/module/level/label/CharmLevelView.kt
  17. 12 0
      app/src/main/java/com/adealink/weparty/module/level/label/ChatAchievementView.kt
  18. 20 0
      app/src/main/java/com/adealink/weparty/module/level/label/FamilyNewcomerView.kt
  19. 33 0
      app/src/main/java/com/adealink/weparty/module/level/label/FamilyRoleTagView.kt
  20. 21 0
      app/src/main/java/com/adealink/weparty/module/level/label/MerchantView.kt
  21. 12 0
      app/src/main/java/com/adealink/weparty/module/level/label/RankMarkTopTagView.kt
  22. 38 0
      app/src/main/java/com/adealink/weparty/module/level/label/UserSVipLevelView.kt
  23. 83 0
      app/src/main/java/com/adealink/weparty/module/level/label/UserSexView.kt
  24. 81 0
      app/src/main/java/com/adealink/weparty/module/level/label/UserWealthLevelView.kt
  25. 28 0
      app/src/main/java/com/adealink/weparty/module/level/label/VipRechargeLabelView.kt
  26. 120 0
      app/src/main/java/com/adealink/weparty/module/level/label/base/BaseCustomLabelView.kt
  27. 134 0
      app/src/main/java/com/adealink/weparty/module/level/label/base/BaseImageLabelView.kt
  28. 132 0
      app/src/main/java/com/adealink/weparty/module/level/label/base/BaseNinePatchLabelView.kt
  29. 116 0
      app/src/main/java/com/adealink/weparty/module/level/label/base/BaseSvgaLabelView.kt
  30. 3 3
      app/src/main/java/com/adealink/weparty/module/level/util/LevelUIUtil.kt
  31. 0 61
      app/src/main/java/com/adealink/weparty/module/level/view/UserSVipLevelView.kt
  32. 0 142
      app/src/main/java/com/adealink/weparty/module/level/view/UserWealthLevelView.kt
  33. 0 44
      app/src/main/java/com/adealink/weparty/module/level/view/VipRechargeLabelView.kt
  34. 1 1
      app/src/main/java/com/adealink/weparty/module/profile/view/MerchantLabelView.kt
  35. 1 1
      app/src/main/java/com/adealink/weparty/module/profile/view/UserActivityTagListView.kt
  36. 27 4
      app/src/main/java/com/adealink/weparty/module/profile/view/UserCertificationView.kt
  37. 4 21
      app/src/main/java/com/adealink/weparty/module/profile/view/UserRankTagView.kt
  38. 0 134
      app/src/main/java/com/adealink/weparty/module/profile/view/UserSexView.kt
  39. 9 17
      app/src/main/java/com/adealink/weparty/module/profile/viewbinder/RankTagViewHolder.kt
  40. 5 8
      app/src/main/java/com/adealink/weparty/module/userlist/binder/UserInfoItemViewBinder.kt
  41. BIN=BIN
      app/src/main/res/drawable-xhdpi/charm_label_top1.webp
  42. BIN=BIN
      app/src/main/res/drawable-xhdpi/charm_label_top2.webp
  43. BIN=BIN
      app/src/main/res/drawable-xhdpi/charm_label_top3.webp
  44. BIN=BIN
      app/src/main/res/drawable-xhdpi/common_female_ic.webp
  45. BIN=BIN
      app/src/main/res/drawable-xhdpi/common_label_official_ic.webp
  46. BIN=BIN
      app/src/main/res/drawable-xhdpi/common_male_ic.webp
  47. BIN=BIN
      app/src/main/res/drawable-xhdpi/ic_profile_play_voice.webp
  48. BIN=BIN
      app/src/main/res/drawable-xhdpi/merchant_coin_ic.webp
  49. BIN=BIN
      app/src/main/res/drawable-xhdpi/merchant_diamond_ic.webp
  50. BIN=BIN
      app/src/main/res/drawable-xhdpi/profile_chat_achievement_label_activist_ic.webp
  51. BIN=BIN
      app/src/main/res/drawable-xhdpi/profile_chat_achievement_label_charmer_ic.webp
  52. BIN=BIN
      app/src/main/res/drawable-xhdpi/profile_chat_achievement_label_star_ic.webp
  53. BIN=BIN
      app/src/main/res/drawable-xhdpi/profile_me_avatar_certification_ic.webp
  54. BIN=BIN
      app/src/main/res/drawable-xhdpi/profile_me_avatar_certification_simple_ic.webp
  55. BIN=BIN
      app/src/main/res/drawable-xhdpi/profile_me_gender_certification_ic.webp
  56. BIN=BIN
      app/src/main/res/drawable-xhdpi/profile_me_gender_certification_simple_ic.webp
  57. BIN=BIN
      app/src/main/res/drawable-xhdpi/room_label_top1.webp
  58. BIN=BIN
      app/src/main/res/drawable-xhdpi/room_label_top2.webp
  59. BIN=BIN
      app/src/main/res/drawable-xhdpi/room_label_top3.webp
  60. BIN=BIN
      app/src/main/res/drawable-xhdpi/wealth_label_top1.webp
  61. BIN=BIN
      app/src/main/res/drawable-xhdpi/wealth_label_top2.webp
  62. BIN=BIN
      app/src/main/res/drawable-xhdpi/wealth_label_top3.webp
  63. 0 0
      app/src/main/res/drawable/bg_family_new_member_tag.xml
  64. 1 1
      app/src/main/res/drawable/common_sex_female_bg.xml
  65. 1 1
      app/src/main/res/drawable/common_sex_male_bg.xml
  66. 0 0
      app/src/main/res/drawable/family_role_admin_tag_bg.xml
  67. 0 0
      app/src/main/res/drawable/family_role_owner_tag_bg.xml
  68. 1 1
      app/src/main/res/drawable/profile_agent_bg.xml
  69. 6 0
      app/src/main/res/drawable/profile_avatar_certification_tag_bg.xml
  70. 6 0
      app/src/main/res/drawable/profile_gender_certification_tag_bg.xml
  71. 3 3
      app/src/main/res/drawable/profile_merchant_bg.xml
  72. 1 1
      app/src/main/res/layout/dialog_family_operate_confirm.xml
  73. 1 1
      app/src/main/res/layout/entereffect_layout_user_enter_banner_view.xml
  74. 10 10
      app/src/main/res/layout/item_home_user_info.xml
  75. 27 0
      app/src/main/res/layout/layout_base_nine_patch_label.xml
  76. 41 0
      app/src/main/res/layout/layout_common_custom_label.xml
  77. 2 2
      app/src/main/res/layout/layout_identity_label_container.xml
  78. 9 77
      app/src/main/res/layout/layout_merchat_label.xml
  79. 2 3
      app/src/main/res/layout/layout_profile_label_official.xml
  80. 10 28
      app/src/main/res/layout/layout_rank_mark_top_tag.xml
  81. 0 20
      app/src/main/res/layout/layout_svip_level_view.xml
  82. 66 19
      app/src/main/res/layout/layout_user_certification.xml
  83. 0 17
      app/src/main/res/layout/layout_vip_recharge_label_view.xml
  84. 0 19
      app/src/main/res/layout/level_layout_user_level.xml
  85. 2 0
      app/src/main/res/values-ar/strings.xml
  86. 2 0
      app/src/main/res/values-zh/strings.xml
  87. 4 0
      app/src/main/res/values/attrs.xml
  88. 3 0
      app/src/main/res/values/colors.xml
  89. 4 0
      app/src/main/res/values/strings.xml
  90. 1 1
      module/backpack/src/main/res/layout/layout_goods_using_item.xml
  91. 10 3
      module/call/src/main/java/com/adealink/weparty/call/comp/UserInfoComp.kt
  92. 10 11
      module/call/src/main/res/layout/layout_call_userinfo.xml
  93. 2 2
      module/call/src/main/res/layout/layout_call_video_userinfo.xml
  94. 1 1
      module/family/src/main/res/layout/item_family_added_captain.xml
  95. 1 1
      module/family/src/main/res/layout/item_family_join_apply.xml
  96. 2 2
      module/family/src/main/res/layout/item_family_msgs_list.xml
  97. 2 2
      module/family/src/main/res/layout/item_family_search_captain.xml
  98. 1 1
      module/family/src/main/res/layout/layout_family_member_view.xml
  99. 1 1
      module/family/src/main/res/layout/layout_family_owner_view.xml
  100. 2 2
      module/follow/src/main/res/layout/item_relationship_list.xml

BIN=BIN
app/src/main/assets/level/wealth_level_0_to_29_bg.svga


BIN=BIN
app/src/main/assets/level/wealth_level_0_to_9_bg.svga


BIN=BIN
app/src/main/assets/level/wealth_level_100_bg.svga


BIN=BIN
app/src/main/assets/level/wealth_level_10_to_19_bg.svga


BIN=BIN
app/src/main/assets/level/wealth_level_20_to_29_bg.svga


BIN=BIN
app/src/main/assets/level/wealth_level_30_to_39_bg.svga


BIN=BIN
app/src/main/assets/level/wealth_level_40_to_49_bg.svga


BIN=BIN
app/src/main/assets/level/wealth_level_50_to_59_bg.svga


BIN=BIN
app/src/main/assets/level/wealth_level_60_to_69_bg.svga


BIN=BIN
app/src/main/assets/level/wealth_level_70_to_79_bg.svga


BIN=BIN
app/src/main/assets/level/wealth_level_80_to_89_bg.svga


BIN=BIN
app/src/main/assets/level/wealth_level_90_to_99_bg.svga


+ 1 - 2
app/src/main/java/com/adealink/weparty/commonui/dialogchain/DialogTaskManager.kt

@@ -5,7 +5,6 @@ import com.adealink.frame.log.Log
 import com.adealink.weparty.commonui.ext.isSuccess
 import kotlinx.coroutines.GlobalScope
 import kotlinx.coroutines.launch
-import java.util.PriorityQueue
 import java.util.concurrent.PriorityBlockingQueue
 
 /**
@@ -45,7 +44,7 @@ object DialogTaskManager : IDialogTaskManager {
             try {
                 task as BaseDialogTask<BaseDialogData>
                 val rlt = task.canShow()
-                Log.i(TAG, "runNext, task:$task,  rlt.isSuccess:${rlt.isSuccess}")
+                Log.i(TAG, "runNext, task:${task.javaClass.simpleName},  rlt.isSuccess:${rlt.isSuccess}")
                 if (rlt is Rlt.Success) {
                     task.dialogData = rlt.data
                     DialogShowManager.submit(task, rlt.data)

+ 1 - 1
app/src/main/java/com/adealink/weparty/module/level/data/LevelData.kt

@@ -728,7 +728,7 @@ data class VipRechargeLevelConfig(
     val medalShow: Boolean = false,
 
     /** 标签 URL */
-    @SerializedName("labelUrl")
+    @SerializedName("newLabelUrl")
     val labelUrl: String = "",
 
     /** 房间成员列表置顶 */

+ 21 - 0
app/src/main/java/com/adealink/weparty/module/level/label/AgencyView.kt

@@ -0,0 +1,21 @@
+package com.adealink.weparty.module.level.label
+
+import android.content.Context
+import android.util.AttributeSet
+import com.adealink.frame.aab.util.getCompatString
+import com.adealink.weparty.R
+import com.adealink.weparty.module.level.label.base.BaseCustomLabelView
+
+/**
+ * Created by LfJ on 2025/8/4.
+ */
+class AgencyView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null
+) : BaseCustomLabelView(context, attrs) {
+
+    init {
+        setIconResource(R.drawable.merchant_diamond_ic)
+        getBinding().rootContainer.setBackgroundResource(R.drawable.profile_agent_bg)
+        getBinding().tvContent.text = getCompatString(R.string.profile_agency)
+    }
+}

+ 12 - 0
app/src/main/java/com/adealink/weparty/module/level/label/CharmLevelView.kt

@@ -0,0 +1,12 @@
+package com.adealink.weparty.module.level.label
+
+import android.content.Context
+import android.util.AttributeSet
+import com.adealink.weparty.module.level.label.base.BaseImageLabelView
+
+/**
+ * Created by LfJ on 2025/8/6.
+ */
+class CharmLevelView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null
+) : BaseImageLabelView(context, attrs)

+ 12 - 0
app/src/main/java/com/adealink/weparty/module/level/label/ChatAchievementView.kt

@@ -0,0 +1,12 @@
+package com.adealink.weparty.module.level.label
+
+import android.content.Context
+import android.util.AttributeSet
+import com.adealink.weparty.module.level.label.base.BaseImageLabelView
+
+/**
+ * Created by LfJ on 2025/8/7.
+ */
+class ChatAchievementView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null
+) : BaseImageLabelView(context, attrs)

+ 20 - 0
app/src/main/java/com/adealink/weparty/module/level/label/FamilyNewcomerView.kt

@@ -0,0 +1,20 @@
+package com.adealink.weparty.module.level.label
+
+import android.content.Context
+import android.util.AttributeSet
+import com.adealink.frame.aab.util.getCompatString
+import com.adealink.weparty.R
+import com.adealink.weparty.module.level.label.base.BaseCustomLabelView
+
+/**
+ * Created by LfJ on 2025/8/12.
+ */
+class FamilyNewcomerView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null
+) : BaseCustomLabelView(context, attrs) {
+
+    init {
+        getBinding().tvContent.text = getCompatString(R.string.common_new)
+        getBinding().rootContainer.setBackgroundResource(R.drawable.bg_family_new_member_tag)
+    }
+}

+ 33 - 0
app/src/main/java/com/adealink/weparty/module/level/label/FamilyRoleTagView.kt

@@ -0,0 +1,33 @@
+package com.adealink.weparty.module.level.label
+
+import android.content.Context
+import android.util.AttributeSet
+import com.adealink.frame.aab.util.getCompatString
+import com.adealink.weparty.R
+import com.adealink.weparty.commonui.ext.gone
+import com.adealink.weparty.commonui.ext.show
+import com.adealink.weparty.module.level.label.base.BaseCustomLabelView
+import com.adealink.weparty.module.profile.data.UserInfo
+
+/**
+ * Created by LfJ on 2025/7/7.
+ */
+class FamilyRoleTagView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null
+) : BaseCustomLabelView(context, attrs) {
+
+    fun updateRole(userInfo: UserInfo?) {
+        val familyMemberInfo = userInfo?.familyMemberInfo
+        if (familyMemberInfo?.isOwner() == true) {
+            show()
+            getBinding().tvContent.text = getCompatString(R.string.family_role_owner)
+            getBinding().rootContainer.setBackgroundResource(R.drawable.family_role_owner_tag_bg)
+        } else if (familyMemberInfo?.isAdmin() == true) {
+            show()
+            getBinding().tvContent.text = getCompatString(R.string.family_role_admin)
+            getBinding().rootContainer.setBackgroundResource(R.drawable.family_role_admin_tag_bg)
+        } else {
+            gone()
+        }
+    }
+}

+ 21 - 0
app/src/main/java/com/adealink/weparty/module/level/label/MerchantView.kt

@@ -0,0 +1,21 @@
+package com.adealink.weparty.module.level.label
+
+import android.content.Context
+import android.util.AttributeSet
+import com.adealink.frame.aab.util.getCompatString
+import com.adealink.weparty.R
+import com.adealink.weparty.module.level.label.base.BaseCustomLabelView
+
+/**
+ * Created by LfJ on 2025/8/6.
+ */
+class MerchantView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null
+) : BaseCustomLabelView(context, attrs) {
+
+    init {
+        setIconResource(R.drawable.merchant_coin_ic)
+        getBinding().rootContainer.setBackgroundResource(R.drawable.profile_merchant_bg)
+        getBinding().tvContent.text = getCompatString(R.string.profile_merchant)
+    }
+}

+ 12 - 0
app/src/main/java/com/adealink/weparty/module/level/label/RankMarkTopTagView.kt

@@ -0,0 +1,12 @@
+package com.adealink.weparty.module.level.label
+
+import android.content.Context
+import android.util.AttributeSet
+import com.adealink.weparty.module.level.label.base.BaseNinePatchLabelView
+
+/**
+ * Created by LfJ on 2025/8/12.
+ */
+class RankMarkTopTagView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null
+) : BaseNinePatchLabelView(context, attrs)

+ 38 - 0
app/src/main/java/com/adealink/weparty/module/level/label/UserSVipLevelView.kt

@@ -0,0 +1,38 @@
+package com.adealink.weparty.module.level.label
+
+import android.content.Context
+import android.util.AttributeSet
+import com.adealink.weparty.commonui.ext.show
+import com.adealink.weparty.module.level.label.base.BaseSvgaLabelView
+
+/**
+ * SVIP等级标签View,外部只需要指定高度就行
+ * Created by XiaoDongLin.
+ * Date: 2025/7/18
+ */
+interface IUserSVipLevelView {
+    /**
+     * 更新SVIP等级
+     * @param level SVIP等级
+     */
+    fun updateLevel(level: Int)
+}
+
+class UserSVipLevelView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : BaseSvgaLabelView(context, attrs, defStyleAttr), IUserSVipLevelView {
+
+    init {
+        //默认不可见
+        show(false)
+    }
+
+    override fun updateLevel(level: Int) {
+        if (level <= 0) {
+            decodeFromAssets(null)
+            return
+        }
+        show()
+        decodeFromAssets("svip_level_$level.svga")
+    }
+}

+ 83 - 0
app/src/main/java/com/adealink/weparty/module/level/label/UserSexView.kt

@@ -0,0 +1,83 @@
+package com.adealink.weparty.module.level.label
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.util.AttributeSet
+import com.adealink.frame.aab.util.getCompatDrawable
+import com.adealink.frame.util.getAgeFromBirthDay
+import com.adealink.weparty.R
+import com.adealink.weparty.commonui.ext.gone
+import com.adealink.weparty.module.level.label.base.BaseCustomLabelView
+import com.adealink.weparty.module.profile.data.Gender
+import androidx.core.content.withStyledAttributes
+import com.adealink.frame.aab.util.getCompatString
+
+/**
+ * 性别标签view
+ * Created by XiaoDongLin.
+ * Date: 2025/2/26
+ */
+class UserSexView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null
+) : BaseCustomLabelView(context, attrs) {
+
+    private var femaleIcon: Drawable? = null
+    private var maleIcon: Drawable? = null
+    private var femaleBackground: Drawable? = null
+    private var maleBackground: Drawable? = null
+
+    init {
+        attrs?.let {
+            context.withStyledAttributes(it, R.styleable.UserSexView) {
+                femaleIcon = getDrawable(R.styleable.UserSexView_femaleIcon)
+                maleIcon = getDrawable(R.styleable.UserSexView_maleIcon)
+                femaleBackground = getDrawable(R.styleable.UserSexView_femaleBackground)
+                maleBackground = getDrawable(R.styleable.UserSexView_maleBackground)
+            }
+        }
+        if (femaleIcon == null) {
+            femaleIcon = getCompatDrawable(R.drawable.common_female_ic)
+        }
+        if (maleIcon == null) {
+            maleIcon = getCompatDrawable(R.drawable.common_male_ic)
+        }
+        if (femaleBackground == null) {
+            femaleBackground = getCompatDrawable(R.drawable.common_sex_female_bg)
+        }
+        if (maleBackground == null) {
+            maleBackground = getCompatDrawable(R.drawable.common_sex_male_bg)
+        }
+    }
+
+    fun setSex(gender: Int?, birthday: Long?) {
+        if (gender == null) {
+            return
+        }
+        setSex(Gender.getGender(gender), birthday)
+    }
+
+    @SuppressLint("SetTextI18n")
+    fun setSex(gender: Gender?, birthday: Long?) {
+        if (gender == null) {
+            gone()
+            return
+        }
+        when (gender) {
+            Gender.MALE -> {
+                setIconDrawable(maleIcon)
+                getBinding().rootContainer.setBackgroundDrawable(maleBackground)
+            }
+
+            else -> {
+                setIconDrawable(femaleIcon)
+                getBinding().rootContainer.setBackgroundDrawable(femaleBackground)
+            }
+        }
+        getBinding().tvContent.text = if (birthday != null && birthday > 0) {
+            "${getAgeFromBirthDay(birthday)}"
+        } else {
+            null
+        }
+    }
+}

+ 81 - 0
app/src/main/java/com/adealink/weparty/module/level/label/UserWealthLevelView.kt

@@ -0,0 +1,81 @@
+package com.adealink.weparty.module.level.label
+
+import android.content.Context
+import android.graphics.LinearGradient
+import android.graphics.Paint
+import android.graphics.Shader
+import android.graphics.Typeface
+import android.text.TextPaint
+import android.util.AttributeSet
+import com.adealink.frame.aab.util.getCompatColor
+import com.adealink.frame.aab.util.getCompatString
+import com.adealink.weparty.R
+import com.adealink.weparty.commonui.ext.show
+import com.adealink.weparty.module.level.label.base.BaseSvgaLabelView
+import com.adealink.weparty.module.level.util.getLevelLabelSvgaUrl
+import com.opensource.svgaplayer.SVGADynamicEntity
+
+/**
+ * 1. 用户财富等级标签View,必须指定默认高度, 宽度为wrap_content
+ * 2. 里面参数根据设计图大小设置
+ */
+class UserWealthLevelView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : BaseSvgaLabelView(context, attrs, defStyleAttr) {
+
+    companion object {
+        private const val KEY_LABEL_LEVEL_TEXT = "text2"
+        private const val LABEL_LEVEL_TEXT_SIZE = 80
+    }
+
+    init {
+        show(false)
+    }
+
+    var level: Int = 0
+
+    fun updateLevel(level: Int, quickRecycled: Boolean = true) {
+        this.level = level
+        if (level <= 0) {
+            decodeFromAssets(null)
+            return
+        }
+        show()
+        val levelText = getCompatString(R.string.level_user_level, level)
+        val name = getLevelLabelSvgaUrl(level)
+        setDynamicCallback(object : DynamicCallback {
+            override fun getSVGADynamicEntity(scale: Double): SVGADynamicEntity {
+                val textPaint = TextPaint().apply {
+                    textSize = (LABEL_LEVEL_TEXT_SIZE * scale).toFloat()
+                    isAntiAlias = true
+                    textAlign = Paint.Align.CENTER
+                    typeface = Typeface.DEFAULT_BOLD
+                }
+                setGradation(textPaint, levelText)
+                return SVGADynamicEntity().apply {
+                    setDynamicText(levelText, textPaint, KEY_LABEL_LEVEL_TEXT)
+                }
+            }
+        })
+        decodeFromAssets(name, quickRecycled)
+    }
+
+    private fun setGradation(textPaint: TextPaint, levelText: String) {
+        // 设渐变置
+        val textWidth = textPaint.measureText(levelText)
+        val colorArray = if (level >= 50) {
+            intArrayOf(
+                getCompatColor(R.color.color_FFFFFF),
+                getCompatColor(R.color.color_FFFFECB2),
+            )
+        } else {
+            intArrayOf(
+                getCompatColor(R.color.color_FFFFFF),
+                getCompatColor(R.color.color_FFDAE5ED),
+            )
+        }
+        textPaint.shader = LinearGradient(
+            0f, 0f, textWidth, 0f, colorArray, floatArrayOf(0f, 1f), Shader.TileMode.CLAMP
+        )
+    }
+}

+ 28 - 0
app/src/main/java/com/adealink/weparty/module/level/label/VipRechargeLabelView.kt

@@ -0,0 +1,28 @@
+package com.adealink.weparty.module.level.label
+
+import android.content.Context
+import android.util.AttributeSet
+import androidx.lifecycle.LifecycleOwner
+import com.adealink.weparty.commonui.ext.gone
+import com.adealink.weparty.commonui.ext.show
+import com.adealink.weparty.module.level.LevelModule
+import com.adealink.weparty.module.level.label.base.BaseImageLabelView
+
+/**
+ * Vip充值标签View
+ */
+class VipRechargeLabelView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null
+) : BaseImageLabelView(context, attrs) {
+
+    fun updateVipRechargeLevel(level: Int) {
+        val vipRechargeLevelConfigs = LevelModule.getVipRechargeLevelConfigs()
+        val labelUrl = vipRechargeLevelConfigs[level]?.labelUrl ?: ""
+        if (labelUrl.isEmpty() || context !is LifecycleOwner) {
+            gone()
+        } else {
+            show()
+            setImageUrl(labelUrl)
+        }
+    }
+}

+ 120 - 0
app/src/main/java/com/adealink/weparty/module/level/label/base/BaseCustomLabelView.kt

@@ -0,0 +1,120 @@
+package com.adealink.weparty.module.level.label.base
+
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.util.AttributeSet
+import android.util.TypedValue
+import android.view.LayoutInflater
+import androidx.annotation.DrawableRes
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.view.doOnPreDraw
+import androidx.core.view.updateLayoutParams
+import com.adealink.weparty.commonui.ext.dpf
+import com.adealink.weparty.commonui.ext.show
+import com.adealink.weparty.databinding.LayoutCommonCustomLabelBinding
+import androidx.core.view.marginBottom
+import androidx.core.view.marginStart
+import androidx.core.view.marginTop
+import com.adealink.frame.log.Log
+import com.adealink.weparty.commonui.ext.bottomMargin
+import com.adealink.weparty.commonui.ext.startMargin
+import com.adealink.weparty.commonui.ext.topMargin
+
+/**
+ * Created by LfJ on 2025/8/4.
+ */
+open class BaseCustomLabelView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null
+) : ConstraintLayout(context, attrs) {
+
+    companion object {
+        const val TAG = "BaseCustomLabelView"
+        private const val VIEW_DEFAULT_HEIGHT = 50f
+    }
+
+    private val binding =
+        LayoutCommonCustomLabelBinding.inflate(LayoutInflater.from(context), this, true)
+    private var mScale: Float = 1f
+
+    init {
+        doOnPreDraw {
+            updateLayoutParams {
+                width = 0
+            }
+        }
+    }
+
+    fun getBinding() = binding
+
+    fun setIconResource(@DrawableRes resId: Int) {
+        binding.ivIcon.show()
+        binding.ivIcon.setImageResource(resId)
+    }
+
+    fun setIconDrawable(drawable: Drawable?) {
+        if (drawable == null) {
+            binding.ivIcon.show(false)
+        } else {
+            binding.ivIcon.show()
+            binding.ivIcon.setImageDrawable(drawable)
+        }
+    }
+
+    private fun adjustViewScale(scale: Float) {
+        binding.rootContainer.apply {
+            val scalePaddingTop = (paddingTop * scale).toInt()
+            val scalePaddingBottom = (paddingBottom * scale).toInt()
+            val scalePaddingStart = (paddingStart * scale).toInt()
+            val scalePaddingEnd = (paddingEnd * scale).toInt()
+            setPaddingRelative(
+                scalePaddingStart, scalePaddingTop, scalePaddingEnd, scalePaddingBottom
+            )
+            val scaleMarginTop = (marginTop * scale).toInt()
+            val scaleMarginBottom = (marginBottom * scale).toInt()
+            updateLayoutParams {
+                topMargin = scaleMarginTop
+                bottomMargin = scaleMarginBottom
+            }
+        }
+        binding.ivIcon.apply {
+            val iconScaleHeight = (layoutParams.height * scale).toInt()
+            val iconScaleWidth = (layoutParams.width * scale).toInt()
+            updateLayoutParams {
+                width = iconScaleWidth
+                height = iconScaleHeight
+            }
+        }
+        binding.tvContent.apply {
+            val scaleTextSize = textSize * scale
+            setTextSize(TypedValue.COMPLEX_UNIT_PX, scaleTextSize)
+            val iconScaleMarginStart = (marginStart * scale).toInt()
+            updateLayoutParams {
+                startMargin = iconScaleMarginStart
+            }
+        }
+    }
+
+    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
+        super.onSizeChanged(w, h, oldw, oldh)
+        if (oldh != h && h > 0) {
+            adjustViewSize()
+        }
+    }
+
+    private fun adjustViewSize() {
+        doOnPreDraw {
+            Log.i(TAG, "${this.javaClass.simpleName} adjustViewSize viewHeight:$height")
+            val targetScale = height / VIEW_DEFAULT_HEIGHT.dpf()
+            if (targetScale != mScale && targetScale > 0) {
+                if (mScale != 1f) {
+                    adjustViewScale(1 / mScale)
+                }
+                mScale = targetScale
+                adjustViewScale(mScale)
+                updateLayoutParams {
+                    width = LayoutParams.WRAP_CONTENT
+                }
+            }
+        }
+    }
+}

+ 134 - 0
app/src/main/java/com/adealink/weparty/module/level/label/base/BaseImageLabelView.kt

@@ -0,0 +1,134 @@
+package com.adealink.weparty.module.level.label.base
+
+import android.content.Context
+import android.graphics.BitmapFactory
+import android.util.AttributeSet
+import com.adealink.frame.image.view.NetworkImageView
+import com.facebook.common.executors.CallerThreadExecutor
+import com.facebook.common.memory.PooledByteBuffer
+import com.facebook.common.references.CloseableReference
+import com.facebook.datasource.BaseDataSubscriber
+import com.facebook.datasource.DataSource
+import com.facebook.drawee.backends.pipeline.Fresco
+import com.facebook.drawee.drawable.ScalingUtils
+import com.facebook.imagepipeline.request.ImageRequestBuilder
+import androidx.core.net.toUri
+import androidx.core.view.updateLayoutParams
+import com.adealink.frame.log.Log
+import com.facebook.imagepipeline.image.EncodedImage
+
+/**
+ * Created by LfJ on 2025/8/6.
+ */
+open class BaseImageLabelView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null
+) : NetworkImageView(context, attrs) {
+
+    private var mWHRatio = -1f
+
+    companion object {
+        const val TAG = "BasePngLabelView"
+    }
+
+    init {
+        hierarchy.actualImageScaleType = ScalingUtils.ScaleType.FIT_CENTER
+    }
+
+    override fun setImageURI(uriString: String?) {
+        super.setImageURI(uriString)
+        adjustViewWidth(uriString)
+    }
+
+    override fun setImageUrl(url: String?, reload: Boolean) {
+        super.setImageURI(url, reload)
+        adjustViewWidth(url)
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun setImageResource(resId: Int) {
+        super.setImageResource(resId)
+        adjustViewWidth(resId)
+    }
+
+    private fun adjustViewWidth(resId: Int) {
+        val options = BitmapFactory.Options().apply {
+            inJustDecodeBounds = true // 只读取图片宽高,不加载到内存
+        }
+        BitmapFactory.decodeResource(context.resources, resId, options)
+        val imageWidth = options.outWidth.toFloat()
+        val imageHeight = options.outHeight.toFloat()
+        if (imageWidth > 0 && imageHeight > 0) {
+            mWHRatio = imageWidth / imageHeight
+        }
+        updateViewWidthIfNeed()
+    }
+
+    private fun adjustViewWidth(url: String?) {
+        if (url.isNullOrEmpty()) {
+            return
+        }
+        val uri = url.toUri()
+        val imageRequest = ImageRequestBuilder.newBuilderWithSource(uri).build()
+        val dataSource = Fresco.getImagePipeline().fetchEncodedImage(imageRequest, null)
+        dataSource.subscribe(
+            object : BaseDataSubscriber<CloseableReference<PooledByteBuffer>>() {
+                override fun onNewResultImpl(dataSource: DataSource<CloseableReference<PooledByteBuffer>>) {
+                    if (!dataSource.isFinished) return
+                    val resultReference = dataSource.result
+                    val pooledByteBufferRef = CloseableReference.cloneOrNull(resultReference)
+                    if (pooledByteBufferRef != null) {
+                        val encodedImage = EncodedImage(pooledByteBufferRef)
+                        try {
+                            encodedImage.parseMetaData()
+                            val imageWidth = encodedImage.width.toFloat()
+                            val imageHeight = encodedImage.height.toFloat()
+                            if (imageWidth > 0 && imageHeight > 0) {
+                                mWHRatio = imageWidth / imageHeight
+                            }
+                            updateViewWidthIfNeed()
+                        } catch (e: Exception) {
+                            Log.e(TAG, "catch exception:$e")
+                        } finally {
+                            EncodedImage.closeSafely(encodedImage)
+                            CloseableReference.closeSafely(resultReference)
+                        }
+                    }
+                    dataSource.close()
+                }
+
+                override fun onFailureImpl(dataSource: DataSource<CloseableReference<PooledByteBuffer>>) {
+                    val throwable = dataSource.failureCause
+                    Log.e(TAG, "Failed to fetch image dimensions", throwable)
+                    dataSource.close()
+                }
+
+                override fun onProgressUpdate(progress: DataSource<CloseableReference<PooledByteBuffer>>) {
+                    // 可选:处理进度更新
+                }
+            }, CallerThreadExecutor.getInstance() // 指定回调执行线程
+        )
+    }
+
+    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
+        super.onSizeChanged(w, h, oldw, oldh)
+        if (oldh != h && h > 0) {
+            updateViewWidthIfNeed()
+        }
+    }
+
+    private fun updateViewWidthIfNeed() {
+        post {
+            Log.i(
+                TAG,
+                "${this.javaClass.simpleName} updateViewWidth viewHeight:$height mWHRatio:$mWHRatio"
+            )
+            if (mWHRatio == -1f || height == 0) {
+                return@post
+            }
+            val newViewWidth = (height.toFloat() * mWHRatio).toInt()
+            this@BaseImageLabelView.updateLayoutParams {
+                width = newViewWidth
+            }
+        }
+    }
+}

+ 132 - 0
app/src/main/java/com/adealink/weparty/module/level/label/base/BaseNinePatchLabelView.kt

@@ -0,0 +1,132 @@
+package com.adealink.weparty.module.level.label.base
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.BitmapFactory
+import android.util.AttributeSet
+import android.util.TypedValue
+import android.view.LayoutInflater
+import androidx.annotation.DrawableRes
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.view.marginBottom
+import androidx.core.view.marginEnd
+import androidx.core.view.marginStart
+import androidx.core.view.marginTop
+import androidx.core.view.updateLayoutParams
+import com.adealink.weparty.commonui.ext.bottomMargin
+import com.adealink.weparty.commonui.ext.dpf
+import com.adealink.weparty.commonui.ext.endMargin
+import com.adealink.weparty.commonui.ext.startMargin
+import com.adealink.weparty.commonui.ext.topMargin
+import com.adealink.weparty.databinding.LayoutBaseNinePatchLabelBinding
+import com.adealink.weparty.module.level.svip.NinePatchBuilder
+import androidx.core.graphics.scale
+import androidx.core.view.doOnPreDraw
+import com.adealink.frame.log.Log
+
+/**
+ * Created by LfJ on 2025/8/11.
+ */
+open class BaseNinePatchLabelView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null
+) : ConstraintLayout(context, attrs) {
+
+    companion object {
+        private const val TAG = "BaseNinePatchLabelView"
+        private const val VIEW_DEFAULT_HEIGHT = 50f
+    }
+
+    private val binding =
+        LayoutBaseNinePatchLabelBinding.inflate(LayoutInflater.from(context), this)
+    private var mScale: Float = 1f
+    private var bgResId = 0
+
+    init {
+        doOnPreDraw {
+            updateLayoutParams {
+                width = 0
+            }
+        }
+    }
+
+    fun setText(text: CharSequence) {
+        binding.tvContent.text = text
+    }
+
+    fun setNinePatchBg(@DrawableRes resId: Int) {
+        bgResId = resId
+        adjustViewSizeIfNeed()
+    }
+
+    private fun adjustViewScale(scale: Float) {
+        binding.tvContent.apply {
+            val scaleMarginTop = (marginTop * scale).toInt()
+            val scaleMarginBottom = (marginBottom * scale).toInt()
+            val scaleMarginStart = (marginStart * scale).toInt()
+            val scaleMarginEnd = (marginEnd * scale).toInt()
+            updateLayoutParams {
+                topMargin = scaleMarginTop
+                bottomMargin = scaleMarginBottom
+                startMargin = scaleMarginStart
+                endMargin = scaleMarginEnd
+            }
+            val scaleTextSize = textSize * scale
+            setTextSize(TypedValue.COMPLEX_UNIT_PX, scaleTextSize)
+            val scaleMaxWidth = (maxWidth * scale).toInt()
+            maxWidth = scaleMaxWidth
+        }
+    }
+
+    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
+        super.onSizeChanged(w, h, oldw, oldh)
+        if (oldh != h && h > 0) {
+            adjustViewSizeIfNeed()
+        }
+    }
+
+    private fun adjustViewSizeIfNeed() {
+        post {
+            Log.i(TAG, "${this.javaClass.simpleName} adjustViewSize viewHeight:$height")
+            if (height == 0 || bgResId == 0) {
+                return@post
+            }
+            val targetScale = height / VIEW_DEFAULT_HEIGHT.dpf()
+            if (targetScale != mScale && targetScale > 0) {
+                if (mScale != 1f) {
+                    adjustViewScale(1 / mScale)
+                }
+                mScale = targetScale
+                adjustViewScale(mScale)
+                setNinePatchDrawableIfNeed(mScale)
+                binding.root.updateLayoutParams {
+                    width = LayoutParams.WRAP_CONTENT
+                }
+            }
+        }
+    }
+
+    private fun setNinePatchDrawableIfNeed(scale: Float) {
+        if (bgResId == 0) {
+            return
+        }
+        val bitmap = decodeResourceWithScale(bgResId, scale)
+        val builder = NinePatchBuilder(context.resources, bitmap).addXRegion(
+            bitmap.width / 2, 1
+        ).addYRegion(
+            bitmap.height / 2, 1
+        ).setPadding(
+            0, 0, 0, 0
+        )
+        val ninePatchDrawable = builder.build()
+        binding.root.background = ninePatchDrawable
+    }
+
+    private fun decodeResourceWithScale(
+        resId: Int, scale: Float
+    ): Bitmap {
+        val originBitmap = BitmapFactory.decodeResource(resources, resId)
+        val scaleWidth = (originBitmap.width * scale).toInt()
+        val scaleHeight = (originBitmap.height * scale).toInt()
+        return originBitmap.scale(scaleWidth, scaleHeight)
+    }
+}

+ 116 - 0
app/src/main/java/com/adealink/weparty/module/level/label/base/BaseSvgaLabelView.kt

@@ -0,0 +1,116 @@
+package com.adealink.weparty.module.level.label.base
+
+import android.content.Context
+import android.util.AttributeSet
+import android.util.Log
+import android.util.LruCache
+import androidx.core.view.doOnPreDraw
+import androidx.core.view.updateLayoutParams
+import com.adealink.weparty.commonui.ext.show
+import com.opensource.svgaplayer.SVGADynamicEntity
+import com.opensource.svgaplayer.SVGAParser
+import com.opensource.svgaplayer.SVGAVideoEntity
+import com.opensource.svgaplayer.WenextSvgaView
+import com.opensource.svgaplayer.control.SVGAManager.Companion.parser
+
+/**
+ * Created by LfJ on 2025/8/7.
+ */
+open class BaseSvgaLabelView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : WenextSvgaView(context, attrs, defStyleAttr) {
+
+    companion object {
+        private const val TAG = "BaseSvgaLabelView"
+        private val cache = LruCache<String, SVGAVideoEntity>(20) // 缓存SVGAVideoEntity,避免内存过载
+    }
+
+    private var mDynamicCallback: DynamicCallback? = null
+    private var mCurEntity: SVGAVideoEntity? = null
+
+    fun setDynamicCallback(callback: DynamicCallback) {
+        mDynamicCallback = callback
+    }
+
+    fun decodeFromAssets(name: String?, quickRecycled: Boolean = true) {
+        if (name.isNullOrEmpty()) {
+            show(false)
+            setVideoItem(null, null)
+            stopAnimation()
+            return
+        }
+        show()
+        setQuickRecycled(quickRecycled)
+        val parseCompletion = object : SVGAParser.ParseCompletion {
+            override fun onComplete(svgaEntity: SVGAVideoEntity) {
+                mCurEntity = svgaEntity
+                adjustViewWidthIfNeed { scale ->
+                    val dynamicEntity = mDynamicCallback?.getSVGADynamicEntity(scale)
+                    setVideoItem(mCurEntity, dynamicEntity)
+                    startAnimation()
+                }
+                // **解析成功后,将解析结果缓存起来**
+                cache.put(name, mCurEntity)
+            }
+
+            override fun onError(error: Throwable?) {
+                Log.e(TAG, "onError $error")
+            }
+        }
+        // **先检查缓存,是否已经解析过该资源**
+        cache.get(name)?.let {
+            parseCompletion.onComplete(it) // 直接返回缓存的解析结果
+            return
+        }
+        parser.decodeFromAssets(
+            name, parseCompletion, 0
+        )
+    }
+
+    override fun onAttachedToWindow() {
+        super.onAttachedToWindow()
+        startAnimation()
+    }
+
+    override fun onDetachedFromWindow() {
+        super.onDetachedFromWindow()
+        stopAnimation()
+    }
+
+    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
+        super.onSizeChanged(w, h, oldw, oldh)
+        if (oldh != h && h > 0) {
+            adjustViewWidthIfNeed()
+        }
+    }
+
+    private fun adjustViewWidthIfNeed(resultCallback: ((Double) -> Unit?)? = null) {
+        doOnPreDraw {
+            if (mCurEntity == null || height == 0) {
+                return@doOnPreDraw
+            }
+            mCurEntity?.let {
+                val resWidth = it.videoSize.width
+                val resHeight = it.videoSize.height
+                Log.i(
+                    TAG,
+                    "${this.javaClass.simpleName} adjustViewWidth resWidth:$resWidth resHeight:$resHeight viewHeight:$height"
+                )
+                if (resWidth > 0 && resHeight > 0) {
+                    val scale = height / resHeight
+                    val newViewWidth = (scale * resWidth).toInt()
+                    this@BaseSvgaLabelView.apply {
+                        updateLayoutParams {
+                            width = newViewWidth
+                        }
+                    }
+                    resultCallback?.invoke(scale)
+                }
+            }
+        }
+    }
+
+    interface DynamicCallback {
+        fun getSVGADynamicEntity(scale: Double): SVGADynamicEntity?
+    }
+}

+ 3 - 3
app/src/main/java/com/adealink/weparty/module/level/util/LevelUIUtil.kt

@@ -24,9 +24,9 @@ fun getLevelMedalStageDesc(level: Int): String {
 fun getLevelLabelSvgaUrl(level: Int): String {
     val path = "level/"
     return when (level) {
-        in 0..9 -> "${path}wealth_level_0_to_9_bg.svga"
-        in 10..19 -> "${path}wealth_level_10_to_19_bg.svga"
-        in 20..29 -> "${path}wealth_level_20_to_29_bg.svga"
+        in 0..9 -> "${path}wealth_level_0_to_29_bg.svga"
+        in 10..19 -> "${path}wealth_level_0_to_29_bg.svga"
+        in 20..29 -> "${path}wealth_level_0_to_29_bg.svga"
         in 30..39 -> "${path}wealth_level_30_to_39_bg.svga"
         in 40..49 -> "${path}wealth_level_40_to_49_bg.svga"
         in 50..59 -> "${path}wealth_level_50_to_59_bg.svga"

+ 0 - 61
app/src/main/java/com/adealink/weparty/module/level/view/UserSVipLevelView.kt

@@ -1,61 +0,0 @@
-package com.adealink.weparty.module.level.view
-
-import android.content.Context
-import android.util.AttributeSet
-import android.view.LayoutInflater
-import androidx.constraintlayout.widget.ConstraintLayout
-import androidx.core.view.updateLayoutParams
-import com.adealink.weparty.commonui.ext.gone
-import com.adealink.weparty.commonui.ext.show
-import com.adealink.weparty.databinding.LayoutSvipLevelViewBinding
-import com.opensource.svgaplayer.control.ControllerListener
-import com.opensource.svgaplayer.entities.SvgaInfo
-
-/**
- * SVIP等级标签View,外部只需要指定高度就行
- * Created by XiaoDongLin.
- * Date: 2025/7/18
- */
-interface IUserSVipLevelView {
-    /**
-     * 更新SVIP等级
-     * @param level SVIP等级
-     */
-    fun updateLevel(level: Int)
-}
-
-class UserSVipLevelView @JvmOverloads constructor(
-    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : ConstraintLayout(context, attrs, defStyleAttr), IUserSVipLevelView {
-
-    private val binding = LayoutSvipLevelViewBinding.inflate(LayoutInflater.from(context), this)
-
-    init {
-        //默认不可见
-        gone()
-    }
-
-    override fun updateLevel(level: Int) {
-        if (level <= 0) {
-            gone()
-            return
-        }
-        show()
-
-        binding.svgaSvip.setAsset("svip_level_$level.svga", listener = object : ControllerListener {
-            override fun onBeforeImageSet(id: String?, svgaInfo: SvgaInfo?) {
-                super.onBeforeImageSet(id, svgaInfo)
-                svgaInfo ?: return
-                val svgaWidth = svgaInfo.width
-                val svgaHeight = svgaInfo.height
-                if (svgaWidth > 0 && svgaHeight > 0) {
-                    binding.svgaSvip.updateLayoutParams<ConstraintLayout.LayoutParams> {
-                        dimensionRatio = "${svgaWidth}:${svgaHeight}"
-                    }
-                }
-            }
-        })
-        binding.svgaSvip.startAnimation()
-    }
-
-}

+ 0 - 142
app/src/main/java/com/adealink/weparty/module/level/view/UserWealthLevelView.kt

@@ -1,142 +0,0 @@
-package com.adealink.weparty.module.level.view
-
-import android.content.Context
-import android.graphics.LinearGradient
-import android.graphics.Paint
-import android.graphics.Shader
-import android.graphics.Typeface
-import android.text.TextPaint
-import android.util.AttributeSet
-import android.util.LruCache
-import android.view.LayoutInflater
-import android.view.View
-import androidx.constraintlayout.widget.ConstraintLayout
-import androidx.core.view.updateLayoutParams
-import com.adealink.frame.aab.util.getCompatColor
-import com.adealink.frame.aab.util.getCompatString
-import com.adealink.weparty.R
-import com.adealink.weparty.commonui.ext.dp
-import com.adealink.weparty.databinding.LevelLayoutUserLevelBinding
-import com.adealink.weparty.module.level.util.getLevelLabelSvgaUrl
-import com.opensource.svgaplayer.SVGADynamicEntity
-import com.opensource.svgaplayer.SVGAParser
-import com.opensource.svgaplayer.SVGAVideoEntity
-import com.opensource.svgaplayer.control.SVGAManager.Companion.parser
-
-/**
- * 1. 用户财富等级标签View,必须指定默认高度, 宽度为wrap_content
- * 2. 里面参数根据设计图大小设置
- */
-class UserWealthLevelView @JvmOverloads constructor(
-    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : ConstraintLayout(context, attrs, defStyleAttr) {
-
-    companion object {
-        private val cache = LruCache<String, SVGAVideoEntity>(20) // 缓存SVGAVideoEntity,避免内存过载
-        private const val KEY_LEVEL_LABEL_SVGA = "text"
-        private const val LEVEL_BELOW_60_WIDTH = 132f
-        private const val LEVEL_BELOW_60_HEIGHT = 50f
-        private const val LEVEL_EXCEED_60_WIDTH = 143f
-        private const val LEVEL_EXCEED_60_HEIGHT = 50f
-    }
-
-    private val binding = LevelLayoutUserLevelBinding.inflate(LayoutInflater.from(context), this)
-
-    var level: Int = 0
-
-    init {
-        visibility = View.GONE
-    }
-
-    fun updateLevel(level: Int, quickRecycled: Boolean = true) {
-        this.level = level
-        if (level <= 0) {
-            visibility = View.GONE
-            binding.svgaLevelBg.setVideoItem(null, null)
-            binding.svgaLevelBg.stopAnimation()
-            return
-        }
-        visibility = View.VISIBLE
-        val levelText = getCompatString(R.string.level_user_level, level)
-        //根据比例设置宽度
-        updateLayoutParams(level)
-        val name = getLevelLabelSvgaUrl(level)
-        binding.svgaLevelBg.setQuickRecycled(quickRecycled)
-        val callback = object : SVGAParser.ParseCompletion {
-            override fun onComplete(svgaEntity: SVGAVideoEntity) {
-                val textPaint = TextPaint().apply {
-                    textSize = 56f
-                    isAntiAlias = true
-                    textAlign = Paint.Align.CENTER
-                    typeface = Typeface.DEFAULT_BOLD
-                }
-                setGradation(textPaint, levelText)
-                val dynamicEntity = SVGADynamicEntity().apply {
-                    setDynamicText(levelText, textPaint, KEY_LEVEL_LABEL_SVGA)
-                }
-                binding.svgaLevelBg.setVideoItem(svgaEntity, dynamicEntity)
-                binding.svgaLevelBg.startAnimation()
-                // **解析成功后,将解析结果缓存起来**
-                cache.put(name, svgaEntity)
-            }
-
-            override fun onError(error: Throwable?) {
-
-            }
-        }
-        // **先检查缓存,是否已经解析过该资源**
-        cache.get(name)?.let {
-            callback.onComplete(it) // 直接返回缓存的解析结果
-            return
-        }
-        parser.decodeFromAssets(
-            name,
-            callback,
-            if (level < 60) LEVEL_BELOW_60_WIDTH.dp() else LEVEL_EXCEED_60_WIDTH.dp()
-        )
-    }
-
-    private fun updateLayoutParams(level: Int) {
-        val viewHeight = layoutParams.height
-        if (level < 60) {
-            binding.svgaLevelBg.updateLayoutParams {
-                width = (viewHeight / LEVEL_BELOW_60_HEIGHT * LEVEL_BELOW_60_WIDTH).toInt()
-                height = viewHeight
-            }
-        } else {
-            binding.svgaLevelBg.updateLayoutParams {
-                width = (viewHeight / LEVEL_EXCEED_60_HEIGHT * LEVEL_EXCEED_60_WIDTH).toInt()
-                height = viewHeight
-            }
-        }
-    }
-
-    private fun setGradation(textPaint: TextPaint, levelText: String) {
-        // 设渐变置
-        val textWidth = textPaint.measureText(levelText)
-        val colorArray = if (level >= 50) {
-            intArrayOf(
-                getCompatColor(R.color.color_FFFFFF),
-                getCompatColor(R.color.color_FFFFECB2),
-            )
-        } else {
-            intArrayOf(
-                getCompatColor(R.color.color_FFFFFF),
-                getCompatColor(R.color.color_FFDAE5ED),
-            )
-        }
-        textPaint.shader = LinearGradient(
-            0f, 0f, textWidth, 0f, colorArray, floatArrayOf(0f, 1f), Shader.TileMode.CLAMP
-        )
-    }
-
-    override fun onAttachedToWindow() {
-        super.onAttachedToWindow()
-        binding.svgaLevelBg.startAnimation()
-    }
-
-    override fun onDetachedFromWindow() {
-        super.onDetachedFromWindow()
-        binding.svgaLevelBg.stopAnimation()
-    }
-}

+ 0 - 44
app/src/main/java/com/adealink/weparty/module/level/view/VipRechargeLabelView.kt

@@ -1,44 +0,0 @@
-package com.adealink.weparty.module.level.view
-
-import android.content.Context
-import android.util.AttributeSet
-import android.view.LayoutInflater
-import android.view.View
-import androidx.constraintlayout.widget.ConstraintLayout
-import androidx.lifecycle.LifecycleOwner
-import com.adealink.weparty.commonui.ext.gone
-import com.adealink.weparty.commonui.ext.show
-import com.adealink.weparty.databinding.LayoutVipRechargeLabelViewBinding
-import com.adealink.weparty.module.level.LevelModule
-
-/**
- * Vip充值标签View
- */
-class VipRechargeLabelView @JvmOverloads constructor(
-    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : ConstraintLayout(context, attrs, defStyleAttr) {
-
-    val binding = LayoutVipRechargeLabelViewBinding.inflate(LayoutInflater.from(context), this)
-
-    init {
-        initView()
-    }
-
-    private fun initView() {
-        if (isInEditMode) {
-            return
-        }
-        visibility = View.GONE
-    }
-
-    fun updateVipRechargeLevel(level: Int) {
-        val vipRechargeLevelConfigs = LevelModule.getVipRechargeLevelConfigs()
-        val labelUrl = vipRechargeLevelConfigs[level]?.labelUrl ?: ""
-        if (labelUrl.isEmpty() || context !is LifecycleOwner) {
-            gone()
-        } else {
-            show()
-            binding.ivVipRechargeLevel.setImageUrl(labelUrl)
-        }
-    }
-}

+ 1 - 1
app/src/main/java/com/adealink/weparty/module/profile/view/MerchantLabelView.kt

@@ -15,7 +15,7 @@ import com.adealink.weparty.module.profile.data.RECHARGE_WITHDRAW_MERCHANT
 class MerchantLabelView @JvmOverloads constructor(
     context: Context, attrs: AttributeSet? = null
 ) : LinearLayout(context, attrs) {
-    val binding = LayoutMerchatLabelBinding.inflate(LayoutInflater.from(context), this, true)
+    private val binding = LayoutMerchatLabelBinding.inflate(LayoutInflater.from(context), this, true)
 
     init {
         gone()

+ 1 - 1
app/src/main/java/com/adealink/weparty/module/profile/view/UserActivityTagListView.kt

@@ -50,7 +50,7 @@ class UserActivityTagListView @JvmOverloads constructor(
                 state: State
             ) {
                 outRect.right= 4.dp()
-                outRect.bottom = 2.dp()
+                outRect.bottom = 4.dp()
             }
         })
     }

+ 27 - 4
app/src/main/java/com/adealink/weparty/module/profile/view/UserCertificationView.kt

@@ -1,15 +1,18 @@
 package com.adealink.weparty.module.profile.view
 
+import android.annotation.SuppressLint
 import android.content.Context
 import android.util.AttributeSet
 import android.view.LayoutInflater
 import androidx.constraintlayout.widget.ConstraintLayout
+import com.adealink.weparty.R
 import com.adealink.weparty.commonui.ext.gone
 import com.adealink.weparty.commonui.ext.show
 import com.adealink.weparty.databinding.LayoutUserCertificationBinding
 import com.adealink.weparty.module.profile.data.UserCertificationInfo
 import com.adealink.weparty.module.profile.data.UserCommonConfig
 import com.adealink.weparty.module.profile.data.UserConfigType
+import androidx.core.content.withStyledAttributes
 
 /**
  * Created by PengWuLiang on 2025/4/3
@@ -19,15 +22,35 @@ class UserCertificationView @JvmOverloads constructor(
 ): ConstraintLayout(context, attrs, defStyleAttr) {
     val binding = LayoutUserCertificationBinding.inflate(LayoutInflater.from(context), this, true)
 
+    private var onlyShowIcon = false
+
+    init {
+        context.withStyledAttributes(attrs, R.styleable.UserCertificationView, defStyleAttr, 0) {
+            onlyShowIcon = getBoolean(R.styleable.UserCertificationView_only_show_icon, false)
+        }
+    }
+
     fun setCertificationStatus(config: UserCommonConfig? = null) {
         val data = config?.userConfigValue?.get(UserConfigType.USER_REAL_AUTH.type)
                 ?.convertToUserConfigContent() as? UserCertificationInfo
         if(data == null) {
-            binding.userAvatarCertification.gone()
-            binding.userGenderCertification.gone()
+            binding.userAvatarCertificationContainer.gone()
+            binding.userGenderCertificationContainer.gone()
             return
         }
-        binding.userAvatarCertification.show(data.isAvatarCertificated())
-        binding.userGenderCertification.show(data.isGenderCertificated())
+        if (data.isAvatarCertificated()) {
+            binding.userAvatarCertificationContainer.show(true)
+            binding.avatarCertificationIcon.show(onlyShowIcon)
+            binding.avatarCertificationTag.show(!onlyShowIcon)
+        } else {
+            binding.userAvatarCertificationContainer.show(false)
+        }
+        if (data.isGenderCertificated()) {
+            binding.userGenderCertificationContainer.show(true)
+            binding.genderCertificationIcon.show(onlyShowIcon)
+            binding.genderCertificationTag.show(!onlyShowIcon)
+        } else {
+            binding.userGenderCertificationContainer.show(false)
+        }
     }
 }

+ 4 - 21
app/src/main/java/com/adealink/weparty/module/profile/view/UserRankTagView.kt

@@ -4,11 +4,8 @@ import android.content.Context
 import android.util.AttributeSet
 import android.view.LayoutInflater
 import androidx.constraintlayout.widget.ConstraintLayout
-import androidx.core.view.updateLayoutParams
 import com.adealink.frame.aab.util.getCompatString
-import com.adealink.frame.util.DisplayUtil
 import com.adealink.weparty.R
-import com.adealink.weparty.commonui.ext.dp
 import com.adealink.weparty.databinding.LayoutRankMarkTopTagBinding
 import com.adealink.weparty.module.profile.viewbinder.RankTagItemData
 import com.adealink.weparty.module.profile.viewbinder.RankTagViewHolder.Companion.getRankTagResId
@@ -20,35 +17,21 @@ context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
 ): ConstraintLayout(context, attrs, defStyleAttr) {
     private val binding = LayoutRankMarkTopTagBinding.inflate(LayoutInflater.from(context), this, true)
 
-    init {
-        binding.root.updateLayoutParams<LayoutParams> {
-            width = 60.dp()
-            height = 12.dp()
-        }
-    }
     fun setRank(item: RankTagItemData) {
-        binding.ivBg.setImageResource(
+        binding.rankTag.setNinePatchBg(
             getRankTagResId(
                 item.rankInfo.rankBoardType,
                 item.rankInfo.cycleType
             )
         )
-        binding.tvContent.apply {
-            updateLayoutParams<LayoutParams> {
-                if (DisplayUtil.isRtlLayout()) {
-                    marginEnd = 15.dp()
-                } else {
-                    marginStart = 15.dp()
-                }
-            }
-            text = buildString {
+        binding.rankTag.setText(
+            buildString {
                 append(getCompatString(getRankBoardType(item.rankInfo.rankBoardType)))
                 append(" ")
                 append(getCompatString(getTimeForType(item.rankInfo.cycleType)))
                 append(" ")
                 append(getCompatString(R.string.rank_top_N, item.rankInfo.rank))
                 append(" ")
-            }
-        }
+            })
     }
 }

+ 0 - 134
app/src/main/java/com/adealink/weparty/module/profile/view/UserSexView.kt

@@ -1,134 +0,0 @@
-package com.adealink.weparty.module.profile.view
-
-import android.annotation.SuppressLint
-import android.content.Context
-import android.graphics.drawable.Drawable
-import android.util.AttributeSet
-import android.view.Gravity
-import android.view.ViewGroup
-import androidx.appcompat.widget.AppCompatTextView
-import com.adealink.frame.aab.util.getCompatColor
-import com.adealink.frame.aab.util.getCompatDrawable
-import com.adealink.frame.util.getAgeFromBirthDay
-import com.adealink.weparty.R
-import com.adealink.weparty.commonui.ext.dp
-import com.adealink.weparty.commonui.ext.gone
-import com.adealink.weparty.commonui.ext.mediumText
-import com.adealink.weparty.module.profile.data.Gender
-
-/**
- * 性别标签view
- * Created by XiaoDongLin.
- * Date: 2025/2/26
- */
-class UserSexView @JvmOverloads constructor(
-    context: Context, attrs: AttributeSet? = null
-) : AppCompatTextView(context, attrs) {
-
-
-    private var femaleIcon: Drawable? = null
-    private var maleIcon: Drawable? = null
-    private var femaleBackground: Drawable? = null
-    private var maleBackground: Drawable? = null
-
-
-    init {
-        attrs?.let {
-            val ta = context.obtainStyledAttributes(it, R.styleable.UserSexView)
-            femaleIcon = ta.getDrawable(R.styleable.UserSexView_femaleIcon)
-            maleIcon = ta.getDrawable(R.styleable.UserSexView_maleIcon)
-            femaleBackground = ta.getDrawable(R.styleable.UserSexView_femaleBackground)
-            maleBackground = ta.getDrawable(R.styleable.UserSexView_maleBackground)
-
-            if (femaleIcon == null) {
-                femaleIcon = getCompatDrawable(R.drawable.common_female_ic)
-            }
-            if (maleIcon == null) {
-                maleIcon = getCompatDrawable(R.drawable.common_male_ic)
-            }
-            if (femaleBackground == null) {
-                femaleBackground = getCompatDrawable(R.drawable.common_sex_female_bg)
-            }
-            if (maleBackground == null) {
-                maleBackground = getCompatDrawable(R.drawable.common_sex_male_bg)
-            }
-            ta.recycle()
-        }
-        initView()
-    }
-
-    private val defaultHeight = 15.dp()
-
-    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
-        val heightMode = MeasureSpec.getMode(heightMeasureSpec)
-        val heightSize = MeasureSpec.getSize(heightMeasureSpec)
-
-        val finalHeight = when (heightMode) {
-            MeasureSpec.EXACTLY -> heightSize // 明确指定高度
-            MeasureSpec.AT_MOST -> defaultHeight.coerceAtMost(heightSize) // 不能超过父容器允许的大小
-            MeasureSpec.UNSPECIFIED -> defaultHeight // 没有约束,用默认
-            else -> defaultHeight
-        }
-        setMeasuredDimension(measuredWidth, finalHeight)
-    }
-
-    private fun initView() {
-        if (isInEditMode) {
-            return
-        }
-        compoundDrawablePadding = 2.dp()
-        gravity = Gravity.CENTER
-        includeFontPadding = false
-        setPaddingRelative(4.dp(), 0, 4.dp(), 0)
-        setTextColor(getCompatColor(R.color.white))
-        textSize = 9f
-        layoutParams = ViewGroup.LayoutParams(
-            ViewGroup.LayoutParams.WRAP_CONTENT,
-            ViewGroup.LayoutParams.WRAP_CONTENT
-        )
-        mediumText()
-    }
-
-    fun setSex(gender: Int?, birthday: Long?) {
-        if (gender == null) {
-            return
-        }
-        setSex(Gender.getGender(gender), birthday)
-    }
-
-    @SuppressLint("SetTextI18n")
-    fun setSex(gender: Gender?, birthday: Long?) {
-        if (gender == null) {
-            gone()
-            return
-        }
-        when (gender) {
-            Gender.MALE -> {
-                setBackgroundDrawable(maleBackground)
-                setCompoundDrawablesRelativeWithIntrinsicBounds(
-                    maleIcon,
-                    null,
-                    null,
-                    null
-                )
-            }
-
-            else -> {
-                setBackgroundDrawable(femaleBackground)
-                setCompoundDrawablesRelativeWithIntrinsicBounds(
-                    femaleIcon,
-                    null,
-                    null,
-                    null
-                )
-            }
-        }
-
-        text = if (birthday != null && birthday > 0) {
-            "${getAgeFromBirthDay(birthday)}"
-        } else {
-            null
-        }
-    }
-}

+ 9 - 17
app/src/main/java/com/adealink/weparty/module/profile/viewbinder/RankTagViewHolder.kt

@@ -2,12 +2,8 @@ package com.adealink.weparty.module.profile.viewbinder
 
 import android.view.LayoutInflater
 import android.view.ViewGroup
-import androidx.constraintlayout.widget.ConstraintLayout
-import androidx.core.view.updateLayoutParams
 import com.adealink.frame.aab.util.getCompatString
-import com.adealink.frame.util.DisplayUtil
 import com.adealink.weparty.R
-import com.adealink.weparty.commonui.ext.dp
 import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
 import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
 import com.adealink.weparty.commonui.recycleview.diffutil.BaseListItemData
@@ -22,7 +18,11 @@ import com.adealink.weparty.module.rank.resource.RankResourceProvider.getTimeFor
  * Created by XiaoDongLin.
  * Date: 2025/7/5
  */
-class RankTagItemData(val rankInfo: RankboardRewardInfo) : BaseListItemData
+data class RankTagItemData(val rankInfo: RankboardRewardInfo) : BaseListItemData {
+    override fun areItemsTheSame(newItem: Any): Boolean {
+        return newItem is RankTagItemData
+    }
+}
 class RankTagViewHolder :
     ItemViewBinder<RankTagItemData, BindingViewHolder<LayoutRankMarkTopTagBinding>>() {
     override fun onCreateViewHolder(
@@ -37,29 +37,21 @@ class RankTagViewHolder :
         holder: BindingViewHolder<LayoutRankMarkTopTagBinding>,
         item: RankTagItemData
     ) {
-        holder.binding.ivBg.setImageResource(
+        holder.binding.rankTag.setNinePatchBg(
             getRankTagResId(
                 item.rankInfo.rankBoardType,
                 item.rankInfo.cycleType
             )
         )
-        holder.binding.tvContent.apply {
-            updateLayoutParams<ConstraintLayout.LayoutParams> {
-                if (DisplayUtil.isRtlLayout()) {
-                    marginEnd = 20.dp()
-                } else {
-                    marginStart = 20.dp()
-                }
-            }
-            text = buildString {
+        holder.binding.rankTag.setText(
+            buildString {
                 append(getCompatString(getRankBoardType(item.rankInfo.rankBoardType)))
                 append(" ")
                 append(getCompatString(getTimeForType(item.rankInfo.cycleType)))
                 append(" ")
                 append(getCompatString(R.string.rank_top_N, item.rankInfo.rank))
                 append(" ")
-            }
-        }
+            })
     }
 
     companion object {

+ 5 - 8
app/src/main/java/com/adealink/weparty/module/userlist/binder/UserInfoItemViewBinder.kt

@@ -63,15 +63,12 @@ class UserInfoItemViewBinder(val lifecycleOwner: LifecycleOwner) :
             } else {
                 svgaInRoom.hide()
             }
-            if (item.userInfo.sVipLevel > 0) {
-                svipLevelView.updateLevel(item.userInfo.sVipLevel)
-                vipRechargeLabelView.gone()
-            } else if (item.userInfo.getVipRechargeLevel()>0){
-                svipLevelView.gone()
+            val sVipLevel = item.userInfo.sVipLevel
+            svipLevelView.updateLevel(sVipLevel)
+            if (sVipLevel > 0) {
+                vipRechargeLabelView.show(false)
+            } else {
                 vipRechargeLabelView.updateVipRechargeLevel(item.userInfo.getVipRechargeLevel())
-            }else{
-                svipLevelView.gone()
-                vipRechargeLabelView.gone()
             }
 
             updateChatAchievementLabel(

BIN=BIN
app/src/main/res/drawable-xhdpi/charm_label_top1.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/charm_label_top2.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/charm_label_top3.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/common_female_ic.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/common_label_official_ic.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/common_male_ic.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/ic_profile_play_voice.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/merchant_coin_ic.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/merchant_diamond_ic.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/profile_chat_achievement_label_activist_ic.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/profile_chat_achievement_label_charmer_ic.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/profile_chat_achievement_label_star_ic.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/profile_me_avatar_certification_ic.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/profile_me_avatar_certification_simple_ic.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/profile_me_gender_certification_ic.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/profile_me_gender_certification_simple_ic.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/room_label_top1.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/room_label_top2.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/room_label_top3.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/wealth_label_top1.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/wealth_label_top2.webp


BIN=BIN
app/src/main/res/drawable-xhdpi/wealth_label_top3.webp


+ 0 - 0
module/message/src/main/res/drawable/im_bg_family_new_member_tag.xml → app/src/main/res/drawable/bg_family_new_member_tag.xml


+ 1 - 1
app/src/main/res/drawable/common_sex_female_bg.xml

@@ -2,5 +2,5 @@
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
     <solid android:color="#FF79D9" />
-    <corners android:radius="8dp" />
+    <corners android:radius="35dp" />
 </shape>

+ 1 - 1
app/src/main/res/drawable/common_sex_male_bg.xml

@@ -2,5 +2,5 @@
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
     <solid android:color="#55CCFF" />
-    <corners android:radius="8dp" />
+    <corners android:radius="35dp" />
 </shape>

+ 0 - 0
module/message/src/main/res/drawable/im_family_admin_tag_bg.xml → app/src/main/res/drawable/family_role_admin_tag_bg.xml


+ 0 - 0
module/message/src/main/res/drawable/im_family_owner_tag_bg.xml → app/src/main/res/drawable/family_role_owner_tag_bg.xml


+ 1 - 1
app/src/main/res/drawable/profile_agent_bg.xml

@@ -5,5 +5,5 @@
         android:startColor="@color/color_FF11B8FF"
         android:endColor="@color/color_FF0047FF"
         android:angle="180"/>
-    <corners android:radius="20dp" />
+    <corners android:radius="35dp" />
 </shape>

+ 6 - 0
app/src/main/res/drawable/profile_avatar_certification_tag_bg.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="#1A9352FC" />
+    <corners android:radius="13dp" />
+</shape>

+ 6 - 0
app/src/main/res/drawable/profile_gender_certification_tag_bg.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="#1A68CAA1" />
+    <corners android:radius="13dp" />
+</shape>

+ 3 - 3
app/src/main/res/drawable/profile_merchant_bg.xml

@@ -2,8 +2,8 @@
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
     <gradient
-        android:startColor="@color/color_FFFFA800"
-        android:endColor="@color/color_FFFA0202"
+        android:endColor="@color/color_C75325"
+        android:startColor="@color/color_FFAA01"
         android:angle="180"/>
-    <corners android:radius="20dp" />
+    <corners android:radius="35dp" />
 </shape>

+ 1 - 1
app/src/main/res/layout/dialog_family_operate_confirm.xml

@@ -77,7 +77,7 @@
                     app:layout_constraintTop_toTopOf="parent"
                     tools:text="User Name" />
 
-                <com.adealink.weparty.module.profile.view.UserSexView
+                <com.adealink.weparty.module.level.label.UserSexView
                     android:id="@+id/user_sex_view"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"

+ 1 - 1
app/src/main/res/layout/entereffect_layout_user_enter_banner_view.xml

@@ -40,7 +40,7 @@
             app:layout_constraintBottom_toBottomOf="@id/avatar"
             app:layout_constraintEnd_toEndOf="@id/avatar" />
 
-        <com.adealink.weparty.module.level.view.UserSVipLevelView
+        <com.adealink.weparty.module.level.label.UserSVipLevelView
             android:id="@+id/v_s_vip_level"
             android:layout_width="wrap_content"
             android:layout_height="15dp"

+ 10 - 10
app/src/main/res/layout/item_home_user_info.xml

@@ -71,6 +71,7 @@
         android:id="@+id/user_certification_view"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        app:only_show_icon="true"
         app:layout_constraintBottom_toBottomOf="@id/tv_user_name"
         app:layout_constraintStart_toEndOf="@+id/tv_user_name"
         app:layout_constraintTop_toTopOf="@+id/tv_user_name" />
@@ -90,35 +91,34 @@
 
         <com.adealink.weparty.module.profile.view.UserCountryView
             android:id="@+id/user_country_view"
-            android:layout_width="18dp"
-            android:layout_height="18dp"
+            android:layout_width="16dp"
+            android:layout_height="16dp"
             tools:background="@drawable/label_good_id_bg" />
 
-        <com.adealink.weparty.module.profile.view.UserSexView
+        <com.adealink.weparty.module.level.label.UserSexView
             android:id="@+id/user_sex_view"
             android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_height="18dp"
             android:layout_marginStart="4dp" />
 
-        <com.adealink.weparty.module.level.view.UserSVipLevelView
+        <com.adealink.weparty.module.level.label.UserSVipLevelView
             android:id="@+id/svip_level_view"
             android:layout_width="wrap_content"
-            android:layout_height="15dp" />
+            android:layout_height="18dp" />
 
-        <com.adealink.weparty.module.level.view.VipRechargeLabelView
+        <com.adealink.weparty.module.level.label.VipRechargeLabelView
             android:id="@+id/vip_recharge_label_view"
             android:layout_width="wrap_content"
-            android:layout_height="14.5dp"
+            android:layout_height="18dp"
             android:layout_marginStart="4dp"
             tools:background="@drawable/label_good_id_bg"
             tools:visibility="visible" />
 
-        <androidx.appcompat.widget.AppCompatImageView
+        <com.adealink.weparty.module.level.label.ChatAchievementView
             android:id="@+id/iv_chat_achievement"
             android:layout_width="wrap_content"
             android:layout_height="18dp"
             android:layout_marginStart="4dp"
-            android:adjustViewBounds="true"
             tools:src="@drawable/profile_chat_achievement_label_star_ic" />
     </com.google.android.flexbox.FlexboxLayout>
 

+ 27 - 0
app/src/main/res/layout/layout_base_nine_patch_label.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="0dp"
+    android:layout_height="match_parent">
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_content"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="46dp"
+        android:layout_marginEnd="8dp"
+        android:textStyle="bold"
+        android:ellipsize="end"
+        android:includeFontPadding="false"
+        android:maxWidth="136dp"
+        android:singleLine="true"
+        android:textColor="@color/white"
+        android:textSize="24sp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="@string/profile_agency" />
+
+</merge>

+ 41 - 0
app/src/main/res/layout/layout_common_custom_label.xml

@@ -0,0 +1,41 @@
+<?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"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/root_container"
+    android:layout_width="wrap_content"
+    android:layout_height="match_parent"
+    android:layout_marginTop="9dp"
+    android:layout_marginBottom="9dp"
+    android:paddingStart="6dp"
+    android:paddingEnd="10dp">
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_icon"
+        android:layout_width="24dp"
+        android:layout_height="24dp"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@+id/tv_content"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:src="@drawable/merchant_diamond_ic"
+        tools:visibility="visible" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_content"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:includeFontPadding="false"
+        android:layout_marginStart="4dp"
+        android:textColor="@color/white"
+        android:textSize="24sp"
+        android:textStyle="bold"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@id/iv_icon"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="@string/profile_agency" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 2
app/src/main/res/layout/layout_identity_label_container.xml

@@ -30,10 +30,10 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintStart_toEndOf="@id/real_person_auth_iv" />
     
-    <com.adealink.weparty.module.profile.view.UserSexView
+    <com.adealink.weparty.module.level.label.UserSexView
         android:id="@+id/user_sex_view"
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:layout_height="22dp"
         android:layout_marginStart="4dp"
         app:layout_goneMarginStart="4dp"
         app:layout_constraintTop_toTopOf="parent"

+ 9 - 77
app/src/main/res/layout/layout_merchat_label.xml

@@ -1,85 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="wrap_content"
-    android:layout_height="15dp">
+    android:layout_height="match_parent">
 
-    <androidx.constraintlayout.widget.ConstraintLayout
+    <com.adealink.weparty.module.level.label.MerchantView
         android:id="@+id/cl_merchant"
-        android:layout_width="wrap_content"
-        android:layout_height="15dp"
-        android:background="@drawable/profile_merchant_bg">
+        android:layout_width="0dp"
+        android:layout_height="match_parent" />
 
-        <androidx.appcompat.widget.AppCompatImageView
-            android:id="@+id/iv_merchant_left"
-            android:layout_width="17dp"
-            android:layout_height="13dp"
-            android:src="@drawable/merchant_coin_ic"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            android:layout_marginStart="1dp"/>
-
-        <androidx.appcompat.widget.AppCompatTextView
-            android:id="@+id/tv_merchant"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:gravity="center"
-            android:includeFontPadding="false"
-            android:text="@string/profile_merchant"
-            android:textColor="@color/white"
-            android:textSize="9sp"
-            android:paddingStart="2dp"
-            android:paddingEnd="4dp"
-            app:autoSizeMaxTextSize="9sp"
-            app:autoSizeMinTextSize="6sp"
-            app:autoSizeStepGranularity="1sp"
-            app:autoSizeTextType="uniform"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toEndOf="@id/iv_merchant_left"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:ignore="SmallSp" />
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
-    <androidx.constraintlayout.widget.ConstraintLayout
+    <com.adealink.weparty.module.level.label.AgencyView
         android:id="@+id/cl_agent"
-        android:layout_width="wrap_content"
-        android:layout_height="15dp"
-        android:background="@drawable/profile_agent_bg"
-        android:layout_marginStart="4dp">
-
-        <androidx.appcompat.widget.AppCompatImageView
-            android:id="@+id/iv_agent"
-            android:layout_width="15dp"
-            android:layout_height="15dp"
-            android:src="@drawable/merchant_diamond_ic"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            android:layout_marginStart="1dp"/>
-
-        <androidx.appcompat.widget.AppCompatTextView
-            android:id="@+id/tv_agent"
-            android:layout_width="wrap_content"
-            android:layout_height="15dp"
-            android:gravity="center"
-            android:includeFontPadding="false"
-            android:text="@string/profile_agency"
-            android:textColor="@color/white"
-            android:textSize="9sp"
-            android:paddingStart="2dp"
-            android:paddingEnd="4dp"
-            app:autoSizeMaxTextSize="9sp"
-            app:autoSizeMinTextSize="6sp"
-            app:autoSizeStepGranularity="1sp"
-            app:autoSizeTextType="uniform"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintStart_toEndOf="@id/iv_agent"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:ignore="SmallSp" />
-    </androidx.constraintlayout.widget.ConstraintLayout>
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_marginStart="4dp" />
 
 </LinearLayout>

+ 2 - 3
app/src/main/res/layout/layout_profile_label_official.xml

@@ -7,14 +7,13 @@
     android:layout_height="wrap_content"
     android:background="@drawable/label_official_bg"
     android:paddingVertical="1dp"
-    android:paddingStart="2dp"
-    android:paddingEnd="6dp">
+    android:paddingStart="2.5dp"
+    android:paddingEnd="4dp">
 
     <androidx.appcompat.widget.AppCompatImageView
         android:id="@+id/icon"
         android:layout_width="10dp"
         android:layout_height="10dp"
-        android:layout_marginStart="2dp"
         android:src="@drawable/common_label_official_inside_ic"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintStart_toStartOf="parent"

+ 10 - 28
app/src/main/res/layout/layout_rank_mark_top_tag.xml

@@ -1,36 +1,18 @@
 <?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"
-    xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/cl_root"
-    android:layout_width="76dp"
-    android:layout_height="15dp">
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content">
 
-   <androidx.appcompat.widget.AppCompatImageView
-       android:id="@+id/iv_bg"
-       android:layout_width="match_parent"
-       android:layout_height="match_parent"
-       app:layout_constraintStart_toStartOf="parent"
-       app:layout_constraintTop_toTopOf="parent"
-       tools:srcCompat="@drawable/wealth_label_top1"/>
-
-   <com.adealink.weparty.commonui.widget.AutoMarqueeTextView
-       android:id="@+id/tv_content"
-       android:layout_width="0dp"
-       android:layout_height="match_parent"
-       android:ellipsize="marquee"
-       android:focusable="false"
-       android:focusableInTouchMode="false"
-       android:gravity="start|center_vertical"
-       android:marqueeRepeatLimit="marquee_forever"
-       android:scrollHorizontally="true"
-       android:singleLine="true"
-       android:textColor="@color/white"
-       android:textSize="9sp"
-       app:layout_constraintTop_toTopOf="parent"
-       app:layout_constraintStart_toStartOf="parent"
-       app:layout_constraintEnd_toEndOf="parent"
-       tools:text="content content content content" />
+    <com.adealink.weparty.module.level.label.RankMarkTopTagView
+        android:id="@+id/rank_tag"
+        android:layout_width="wrap_content"
+        android:layout_height="22dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>
 

+ 0 - 20
app/src/main/res/layout/layout_svip_level_view.xml

@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<merge xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent"
-    tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
-
-    <!--> 高度外部指定,宽度自适应 -->
-    <com.opensource.svgaplayer.WenextSvgaView
-        android:id="@+id/svga_svip"
-        android:layout_width="0dp"
-        android:layout_height="match_parent"
-        tools:layout_constraintDimensionRatio="280:100"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        tools:layout_height="50dp" />
-
-</merge>

+ 66 - 19
app/src/main/res/layout/layout_user_certification.xml

@@ -5,25 +5,72 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools">
 
-    <androidx.appcompat.widget.AppCompatImageView
-        android:id="@+id/user_avatar_certification"
-        android:layout_width="12dp"
-        android:layout_height="12dp"
-        app:srcCompat="@drawable/profile_me_avatar_certification_ic"
+    <FrameLayout
+        android:id="@+id/user_avatar_certification_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingEnd="4dp"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"
-        android:layout_marginStart="4dp"
-        android:visibility="gone"
-        tools:visibility="visible"/>
-
-    <androidx.appcompat.widget.AppCompatImageView
-        android:id="@+id/user_gender_certification"
-        android:layout_width="12dp"
-        android:layout_height="12dp"
-        app:srcCompat="@drawable/profile_me_gender_certification_ic"
-        app:layout_constraintStart_toEndOf="@id/user_avatar_certification"
-        app:layout_constraintTop_toTopOf="parent"
-        android:layout_marginStart="4dp"
-        android:visibility="gone"
-        tools:visibility="visible"/>
+        tools:ignore="RtlSymmetry">
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/avatar_certification_icon"
+            android:layout_width="12dp"
+            android:layout_height="12dp"
+            android:visibility="gone"
+            app:srcCompat="@drawable/profile_me_avatar_certification_simple_ic"
+            tools:visibility="visible" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/avatar_certification_tag"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@drawable/profile_avatar_certification_tag_bg"
+            android:drawableStart="@drawable/profile_me_avatar_certification_ic"
+            android:drawablePadding="2dp"
+            android:paddingHorizontal="4dp"
+            android:paddingVertical="1dp"
+            android:text="@string/profile_avatar_certification"
+            android:textColor="@color/color_9352FC"
+            android:textSize="9sp"
+            android:visibility="gone"
+            tools:visibility="visible"
+            tools:ignore="SmallSp" />
+
+    </FrameLayout>
+
+    <FrameLayout
+        android:id="@+id/user_gender_certification_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:layout_constraintStart_toEndOf="@id/user_avatar_certification_container"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/gender_certification_icon"
+            android:layout_width="12dp"
+            android:layout_height="12dp"
+            android:visibility="gone"
+            app:srcCompat="@drawable/profile_me_gender_certification_simple_ic"
+            tools:visibility="visible" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/gender_certification_tag"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@drawable/profile_gender_certification_tag_bg"
+            android:drawableStart="@drawable/profile_me_gender_certification_ic"
+            android:drawablePadding="2dp"
+            android:paddingHorizontal="4dp"
+            android:paddingVertical="1dp"
+            android:text="@string/profile_gender_certification"
+            android:textColor="@color/color_31C7A3"
+            android:textSize="9sp"
+            android:visibility="gone"
+            tools:visibility="visible"
+            tools:ignore="SmallSp" />
+
+    </FrameLayout>
+
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 17
app/src/main/res/layout/layout_vip_recharge_label_view.xml

@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<merge xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
-
-    <com.adealink.frame.image.view.NetworkImageView
-        android:id="@+id/iv_vip_recharge_level"
-        android:layout_width="0dp"
-        android:layout_height="match_parent"
-        app:layout_constraintDimensionRatio="65:29"
-        app:actualImageScaleType="fitCenter"
-        tools:layout_height="25dp" />
-
-</merge>

+ 0 - 19
app/src/main/res/layout/level_layout_user_level.xml

@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<merge xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
-
-    <com.opensource.svgaplayer.WenextSvgaView
-        android:id="@+id/svga_level_bg"
-        android:layout_width="0dp"
-        android:layout_height="match_parent"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        tools:layout_height="29dp" />
-
-</merge>

+ 2 - 0
app/src/main/res/values-ar/strings.xml

@@ -713,4 +713,6 @@
     <string name="family_join_prompt_female">انضم إلى العائلة للحصول على الماس</string>
     <string name="common_completed">بالفعل تم الانتهاء</string>
     <string name="common_game">لعبة</string>
+    <string name="family_role_owner">مالك العائلة</string>
+    <string name="family_role_admin">إدارة الأسرة</string>
 </resources>

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

@@ -712,4 +712,6 @@
     <string name="family_join_prompt_female">加入家庭即可获得钻石</string>
     <string name="common_completed">已完成</string>
     <string name="common_game">游戏</string>
+    <string name="family_role_owner">家庭主人</string>
+    <string name="family_role_admin">家庭管理员</string>
 </resources>

+ 4 - 0
app/src/main/res/values/attrs.xml

@@ -757,4 +757,8 @@
         <attr name="round_radius" format="dimension" />
     </declare-styleable>
 
+    <declare-styleable name="UserCertificationView">
+        <attr name="only_show_icon" format="boolean" />
+    </declare-styleable>
+
 </resources>

+ 3 - 0
app/src/main/res/values/colors.xml

@@ -1163,4 +1163,7 @@
     <color name="color_FFB8CACB">#FFB8CACB</color>
     <color name="color_FFF9E88D">#FFF9E88D</color>
     <color name="color_FFFFE6CA">#FFFFE6CA</color>
+    <color name="color_31C7A3">#31C7A3</color>
+    <color name="color_C75325">#C75325</color>
+    <color name="color_FFAA01">#FFAA01</color>
 </resources>

+ 4 - 0
app/src/main/res/values/strings.xml

@@ -830,4 +830,8 @@
     <string name="common_completed">Completed</string>
     <string name="common_mini_slot">Mini Slot</string>
     <string name="common_game">Game</string>
+    <string name="profile_avatar_certification">Avatar Verification</string>
+    <string name="profile_gender_certification">Gender Verification</string>
+    <string name="family_role_owner">Family Owner</string>
+    <string name="family_role_admin">Family Admin</string>
 </resources>

+ 1 - 1
module/backpack/src/main/res/layout/layout_goods_using_item.xml

@@ -106,7 +106,7 @@
         app:layout_constraintTop_toBottomOf="@id/tv_remain_time"
         app:layout_goneMarginTop="20dp" />
 
-    <com.adealink.weparty.module.level.view.VipRechargeLabelView
+    <com.adealink.weparty.module.level.label.VipRechargeLabelView
         android:id="@+id/vip_recharge_label_view"
         android:layout_width="wrap_content"
         android:layout_height="20dp"

+ 10 - 3
module/call/src/main/java/com/adealink/weparty/call/comp/UserInfoComp.kt

@@ -7,6 +7,7 @@ import com.adealink.frame.base.fastLazy
 import com.adealink.frame.mvvm.view.ViewComponent
 import com.adealink.frame.router.Router
 import com.adealink.weparty.call.databinding.LayoutCallUserinfoBinding
+import com.adealink.weparty.commonui.ext.show
 import com.adealink.weparty.commonui.widget.BottomDialogFragment
 import com.adealink.weparty.module.account.util.isUidValid
 import com.adealink.weparty.module.call.Call
@@ -75,13 +76,19 @@ class UserInfoComp(
         binding.vSex.setSex(userInfo?.gender, userInfo?.birthday)
 
         binding.merchantLabel.setMerchantType(userInfo?.merchantType)
-        binding.vSVipLevel.updateLevel(userInfo?.sVipLevel?:0)
 
         binding.userCertificationView.setCertificationStatus(userInfo?.commonConfigInfo)
         binding.merchantLabel.setMerchantType(userInfo?.merchantType)
 
-        binding.vipRechargeLabelView.updateVipRechargeLevel(userInfo?.getVipRechargeLevel() ?: 0)
-
+        val sVipLevel = userInfo?.sVipLevel ?: 0
+        binding.vSVipLevel.updateLevel(sVipLevel)
+        if (sVipLevel > 0) {
+            binding.vipRechargeLabelView.show(false)
+        } else {
+            binding.vipRechargeLabelView.updateVipRechargeLevel(
+                userInfo?.getVipRechargeLevel() ?: 0
+            )
+        }
         //binding.levelView.updateLevel(userInfo?.level ?: 0)
 
 //        updateCharmLevelLabel(

+ 10 - 11
module/call/src/main/res/layout/layout_call_userinfo.xml

@@ -59,39 +59,39 @@
             android:orientation="horizontal">
 
             <!-- 性别 -->
-            <com.adealink.weparty.module.profile.view.UserSexView
+            <com.adealink.weparty.module.level.label.UserSexView
                 android:id="@+id/v_sex"
                 android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
+                android:layout_height="22dp"
                 tools:layout_width="22dp" />
 
             <com.adealink.weparty.module.profile.view.MerchantLabelView
                 android:id="@+id/merchant_label"
                 android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
+                android:layout_height="22dp"
                 app:layout_constraintStart_toEndOf="@id/v_sex"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintTop_toTopOf="@id/v_sex"
                 app:layout_constraintBottom_toBottomOf="@id/v_sex"
                 android:layout_marginStart="4dp"/>
 
-            <com.adealink.weparty.module.level.view.UserSVipLevelView
+            <com.adealink.weparty.module.level.label.UserSVipLevelView
                 android:id="@+id/v_s_vip_level"
                 android:layout_width="wrap_content"
-                android:layout_height="15dp"
+                android:layout_height="22dp"
                 android:layout_marginStart="4dp"
                 android:visibility="gone"
                 tools:visibility="visible" />
 
-            <com.adealink.weparty.module.level.view.VipRechargeLabelView
+            <com.adealink.weparty.module.level.label.VipRechargeLabelView
                 android:id="@+id/vip_recharge_label_view"
                 android:layout_width="wrap_content"
-                android:layout_height="14.5dp"
+                android:layout_height="22dp"
                 android:layout_marginStart="4dp"
                 android:visibility="gone"
                 tools:visibility="visible" />
 
-<!--            <com.adealink.weparty.module.level.view.UserWealthLevelView-->
+<!--            <com.adealink.weparty.module.level.label.UserWealthLevelView-->
 <!--                android:id="@+id/level_view"-->
 <!--                android:layout_width="wrap_content"-->
 <!--                android:layout_height="18dp"-->
@@ -107,12 +107,11 @@
 <!--                android:visibility="gone"-->
 <!--                tools:visibility="visible" />-->
 
-            <androidx.appcompat.widget.AppCompatImageView
+            <com.adealink.weparty.module.level.label.ChatAchievementView
                 android:id="@+id/iv_chat_achievement"
                 android:layout_width="wrap_content"
-                android:layout_height="15dp"
+                android:layout_height="22dp"
                 android:layout_marginStart="4dp"
-                android:adjustViewBounds="true"
                 android:visibility="gone"
                 tools:src="@drawable/profile_chat_achievement_label_star_ic"
                 tools:visibility="visible" />

+ 2 - 2
module/call/src/main/res/layout/layout_call_video_userinfo.xml

@@ -49,10 +49,10 @@
             app:layout_constraintWidth_max="90dp"
             tools:text="Lish Practice Lish PracticeLish PracticeLish Practice" />
 
-        <com.adealink.weparty.module.profile.view.UserSexView
+        <com.adealink.weparty.module.level.label.UserSexView
             android:id="@+id/v_sex"
             android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_height="22dp"
             android:layout_marginTop="3dp"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintStart_toStartOf="@id/tv_name"

+ 1 - 1
module/family/src/main/res/layout/item_family_added_captain.xml

@@ -52,7 +52,7 @@
             app:layout_constraintStart_toStartOf="parent"
             tools:text="User Name" />
 
-        <com.adealink.weparty.module.profile.view.UserSexView
+        <com.adealink.weparty.module.level.label.UserSexView
             android:id="@+id/user_sex_view"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"

+ 1 - 1
module/family/src/main/res/layout/item_family_join_apply.xml

@@ -92,7 +92,7 @@
         app:layout_constraintStart_toStartOf="@+id/name_tv"
         app:layout_constraintTop_toBottomOf="@+id/name_tv">
 
-        <com.adealink.weparty.module.level.view.UserSVipLevelView
+        <com.adealink.weparty.module.level.label.UserSVipLevelView
             android:id="@+id/v_s_vip_level"
             android:layout_width="wrap_content"
             android:layout_height="15dp"

+ 2 - 2
module/family/src/main/res/layout/item_family_msgs_list.xml

@@ -62,7 +62,7 @@
             app:layout_constraintTop_toBottomOf="@+id/tv_user_name"
             tools:ignore="MissingConstraints">
 
-            <com.adealink.weparty.module.profile.view.UserSexView
+            <com.adealink.weparty.module.level.label.UserSexView
                 android:id="@+id/user_sex_view"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
@@ -70,7 +70,7 @@
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toTopOf="parent" />
 
-            <com.adealink.weparty.module.level.view.UserWealthLevelView
+            <com.adealink.weparty.module.level.label.UserWealthLevelView
                 android:id="@+id/user_level_view"
                 android:layout_width="wrap_content"
                 android:layout_height="18dp"

+ 2 - 2
module/family/src/main/res/layout/item_family_search_captain.xml

@@ -64,7 +64,7 @@
             app:layout_constraintTop_toBottomOf="@+id/tv_user_name"
             tools:ignore="MissingConstraints">
 
-            <com.adealink.weparty.module.profile.view.UserSexView
+            <com.adealink.weparty.module.level.label.UserSexView
                 android:id="@+id/user_sex_view"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
@@ -72,7 +72,7 @@
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toTopOf="parent" />
 
-            <com.adealink.weparty.module.level.view.UserWealthLevelView
+            <com.adealink.weparty.module.level.label.UserWealthLevelView
                 android:id="@+id/user_level_view"
                 android:layout_width="wrap_content"
                 android:layout_height="19dp"

+ 1 - 1
module/family/src/main/res/layout/layout_family_member_view.xml

@@ -155,7 +155,7 @@
                 app:layout_constraintTop_toTopOf="parent"
                 tools:visibility="visible" />
 
-            <com.adealink.weparty.module.level.view.UserSVipLevelView
+            <com.adealink.weparty.module.level.label.UserSVipLevelView
                 android:id="@+id/v_s_vip_level"
                 android:layout_width="wrap_content"
                 android:layout_height="15dp"

+ 1 - 1
module/family/src/main/res/layout/layout_family_owner_view.xml

@@ -166,7 +166,7 @@
             tools:layout_height="20dp">
 
 
-            <com.adealink.weparty.module.level.view.UserSVipLevelView
+            <com.adealink.weparty.module.level.label.UserSVipLevelView
                 android:id="@+id/v_s_vip_level"
                 android:layout_width="wrap_content"
                 android:layout_height="15dp"

+ 2 - 2
module/follow/src/main/res/layout/item_relationship_list.xml

@@ -56,10 +56,10 @@
         app:layout_constraintTop_toTopOf="@id/tv_name"
         tools:visibility="visible" />
 
-    <com.adealink.weparty.module.profile.view.UserSexView
+    <com.adealink.weparty.module.level.label.UserSexView
         android:id="@+id/age_sex"
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:layout_height="22dp"
         android:layout_marginStart="4dp"
         android:layout_marginEnd="16dp"
         app:layout_constraintBottom_toBottomOf="@id/tv_name"

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio