소스 검색

feat: 新人承接

DoggyZhang 3 주 전
부모
커밋
bccba7a882
28개의 변경된 파일767개의 추가작업 그리고 22개의 파일을 삭제
  1. 12 0
      app/src/main/java/com/adealink/weparty/module/playmate/Router.kt
  2. 3 1
      app/src/main/java/com/adealink/weparty/module/playmate/data/PlaymateData.kt
  3. 1 0
      app/src/main/res/values/strings.xml
  4. 3 0
      module/im/src/main/java/com/adealink/weparty/im/constant/Data.kt
  5. 4 4
      module/order/src/main/java/com/adealink/weparty/order/center/comp/OrderCenterDashboardComp.kt
  6. 10 10
      module/order/src/main/res/layout/layout_order_center_dashboard.xml
  7. 10 0
      module/playmate/src/main/AndroidManifest.xml
  8. 21 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/data/PlaymateData.kt
  9. 9 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/datasource/remote/PlaymateHttpService.kt
  10. 43 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/saywelcome/SayWelcomeActivity.kt
  11. 2 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/setting/PlaymateOrderSettingActivity.kt
  12. 54 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/setting/comp/OrderSayWelcomeComp.kt
  13. 19 1
      module/playmate/src/main/java/com/adealink/weparty/playmate/setting/viewmodel/OrderSettingViewModel.kt
  14. 45 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/userpush/UserPushActivity.kt
  15. 109 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/userpush/UserPushFragment.kt
  16. 54 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/userpush/adapter/UserPushItemViewBinder.kt
  17. 8 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/userpush/data/UserPushData.kt
  18. 70 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/userpush/viewmodel/UserPushViewModel.kt
  19. 4 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/viewmodel/PlaymateViewModelFactory.kt
  20. 7 0
      module/playmate/src/main/res/layout/activity_playmate_order_setting.xml
  21. 25 0
      module/playmate/src/main/res/layout/activity_playmate_user_push.xml
  22. 47 0
      module/playmate/src/main/res/layout/activity_say_welcome.xml
  23. 28 0
      module/playmate/src/main/res/layout/fragment_user_push.xml
  24. 88 0
      module/playmate/src/main/res/layout/item_user_push.xml
  25. 82 0
      module/playmate/src/main/res/layout/layout_playmate_order_setting_say_welcome.xml
  26. 2 0
      module/playmate/src/main/res/values/strings.xml
  27. 2 1
      module/profile/src/main/java/com/adealink/weparty/profile/me/comp/OrderCenterComp.kt
  28. 5 5
      module/profile/src/main/res/layout/layout_me_order_center.xml

+ 12 - 0
app/src/main/java/com/adealink/weparty/module/playmate/Router.kt

@@ -92,4 +92,16 @@ interface Playmate {
         }
     }
 
+    interface UserPush {
+        companion object {
+            const val PATH = "${Common.PATH}/user_push"
+        }
+    }
+
+    interface SayWelcome {
+        companion object {
+            const val PATH = "${Common.PATH}/say_welcome"
+        }
+    }
+
 }

+ 3 - 1
app/src/main/java/com/adealink/weparty/module/playmate/data/PlaymateData.kt

@@ -40,7 +40,9 @@ data class PlaymateDetailData(
 data class PlaymateBusinessData(
     @SerializedName("weekBeanIncome") val weekIncome: Float, //本周金豆收入
     @SerializedName("exposureCountDay") val todayExposure: Long, //今日曝光
-    @SerializedName("visitorCount") val visitor: Long, //访客数
+    //@SerializedName("visitorCount") val visitor: Long, //访客数,(字段废弃)
+    // TODO: zhangfei
+    @SerializedName("userPush") val userPush: Long, //新用户推送
     @SerializedName("playmateOpen") val businessOpen: Boolean, //陪玩师是否营业
 ) : Parcelable
 

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

@@ -378,4 +378,5 @@
     <string name="common_price_discount_new_only">New Only | %s%% OFF</string>
     <string name="common_discount">Discount</string>
     <string name="common_newbie">Newbie</string>
+    <string name="common_user_push">User Push</string>
 </resources>

+ 3 - 0
module/im/src/main/java/com/adealink/weparty/im/constant/Data.kt

@@ -27,6 +27,9 @@ const val OFFICIAL_IMAGE_TEXT_BUSINESS_ID = "official_image_text"
 //陪玩订单消息
 const val PLAYMATE_ORDER_BUSINESS_ID = "playmate_order"
 
+//陪玩SayWelcome
+const val PLAYMATE_SAY_WELCOME_BUSINESS_ID = "playmate_say_welcome"
+
 
 /**
  * 支持的消息类型

+ 4 - 4
module/order/src/main/java/com/adealink/weparty/order/center/comp/OrderCenterDashboardComp.kt

@@ -35,8 +35,8 @@ class OrderCenterDashboardComp(
         binding.clIncome.onClick {
             goIncome()
         }
-        binding.clVisitor.onClick {
-            goVisitor()
+        binding.clUserPush.onClick {
+            goUserPush()
         }
     }
 
@@ -50,7 +50,7 @@ class OrderCenterDashboardComp(
     private fun updateBusiness(business: PlaymateBusinessData?) {
         binding.tvIncome.text = formatNumberStr(business?.weekIncome ?: 0f, false)
         binding.tvExposure.text = formatNumberStr(business?.todayExposure ?: 0, false)
-        binding.tvVisitor.text = formatNumberStr(business?.visitor ?: 0, false)
+        binding.tvUserPush.text = formatNumberStr(business?.userPush ?: 0, false)
         if (business == null) {
             binding.btnService.buttonType = CommonButton.BUTTON_NORMAL_1
             binding.btnService.isEnabled = false
@@ -105,7 +105,7 @@ class OrderCenterDashboardComp(
             .start()
     }
 
-    private fun goVisitor() {
+    private fun goUserPush() {
         val act = activity ?: return
         Router.build(act, Profile.Visitor.PATH).start()
     }

+ 10 - 10
module/order/src/main/res/layout/layout_order_center_dashboard.xml

@@ -88,7 +88,7 @@
         android:layout_height="wrap_content"
         android:paddingHorizontal="12dp"
         android:paddingBottom="16dp"
-        app:layout_constraintEnd_toStartOf="@id/cl_visitor"
+        app:layout_constraintEnd_toStartOf="@id/cl_user_push"
         app:layout_constraintHorizontal_weight="1"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@id/cl_income">
@@ -142,7 +142,7 @@
 
     <!--本周收入-->
     <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/cl_visitor"
+        android:id="@+id/cl_user_push"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginEnd="16dp"
@@ -154,7 +154,7 @@
         app:layout_constraintTop_toBottomOf="@id/cl_income">
 
         <androidx.appcompat.widget.AppCompatTextView
-            android:id="@+id/tv_visitor"
+            android:id="@+id/tv_user_push"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginStart="3dp"
@@ -173,7 +173,7 @@
             app:layout_constraintTop_toTopOf="parent" />
 
         <androidx.appcompat.widget.AppCompatTextView
-            android:id="@+id/tv_visitor_desc"
+            android:id="@+id/tv_user_push_desc"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="2dp"
@@ -181,23 +181,23 @@
             android:gravity="center"
             android:includeFontPadding="false"
             android:maxLines="2"
-            android:text="@string/common_recent_visitor"
+            android:text="@string/common_user_push"
             android:textColor="@color/color_FF4E5969"
             android:textSize="12sp"
             app:layout_constrainedWidth="true"
             app:layout_constraintEnd_toStartOf="@id/iv_visitor_desc"
             app:layout_constraintHorizontal_chainStyle="packed"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@id/tv_visitor" />
+            app:layout_constraintTop_toBottomOf="@id/tv_user_push" />
 
         <androidx.appcompat.widget.AppCompatImageView
             android:id="@+id/iv_visitor_desc"
             android:layout_width="12dp"
             android:layout_height="12dp"
-            app:layout_constraintBottom_toBottomOf="@id/tv_visitor_desc"
+            app:layout_constraintBottom_toBottomOf="@id/tv_user_push_desc"
             app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toEndOf="@id/tv_visitor_desc"
-            app:layout_constraintTop_toTopOf="@id/tv_visitor_desc"
+            app:layout_constraintStart_toEndOf="@id/tv_user_push_desc"
+            app:layout_constraintTop_toTopOf="@id/tv_user_push_desc"
             app:srcCompat="@drawable/common_go_ic" />
 
     </androidx.constraintlayout.widget.ConstraintLayout>
@@ -207,7 +207,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         app:barrierDirection="bottom"
-        app:constraint_referenced_ids="cl_income,cl_exposure,cl_visitor" />
+        app:constraint_referenced_ids="cl_income,cl_exposure,cl_user_push" />
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="0dp"

+ 10 - 0
module/playmate/src/main/AndroidManifest.xml

@@ -39,5 +39,15 @@
             android:screenOrientation="portrait"
             android:theme="@style/AppTheme" />
 
+        <activity
+            android:name=".userpush.UserPushActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme" />
+
+        <activity
+            android:name=".saywelcome.SayWelcomeActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme" />
+
     </application>
 </manifest>

+ 21 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/data/PlaymateData.kt

@@ -1,9 +1,11 @@
 package com.adealink.weparty.playmate.data
 
+import com.adealink.frame.network.data.PageReq
 import com.adealink.weparty.module.playmate.data.SkillSettingData
 import com.adealink.weparty.module.playmate.data.UserPlaymateCategoryData
 import com.adealink.weparty.util.TimeHour
 import com.adealink.weparty.util.WeekDay
+import com.google.gson.annotations.GsonNullable
 import com.google.gson.annotations.SerializedName
 
 data class PlaymateDetailReq(
@@ -75,4 +77,23 @@ data class SwitchSkillReq(
     @SerializedName("skillId") val skillId: String,
     @SerializedName("open") val open: Boolean,
     @SerializedName("mainSkill") val mainSkill: Boolean? = null,
+)
+
+data class UserPushListReq(
+    @SerializedName("page") val page: PageReq, //游标分页查询
+)
+
+data class UserPushListRes(
+    @SerializedName("list") val list: List<UserPushListData>,
+    @GsonNullable
+    @SerializedName("next") val next: String?
+)
+
+data class UserPushListData(
+    @SerializedName("userNo") val uid: String,
+)
+
+
+data class EnableAutoWelcomeReq(
+    @SerializedName("enable") val enable: Boolean
 )

+ 9 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/datasource/remote/PlaymateHttpService.kt

@@ -7,6 +7,7 @@ import com.adealink.weparty.module.playmate.data.PlaymateDetailData
 import com.adealink.weparty.playmate.comment.data.PlaymateCommentReq
 import com.adealink.weparty.playmate.comment.data.PlaymateCommentRes
 import com.adealink.weparty.playmate.data.BusinessTimeData
+import com.adealink.weparty.playmate.data.EnableAutoWelcomeReq
 import com.adealink.weparty.playmate.data.GetSkillSwitchReq
 import com.adealink.weparty.playmate.data.PlaymateCategoryConditionRes
 import com.adealink.weparty.playmate.data.PlaymateCategoryRes
@@ -21,6 +22,8 @@ import com.adealink.weparty.playmate.data.SwitchBusinessReq
 import com.adealink.weparty.playmate.data.SwitchSkillReq
 import com.adealink.weparty.playmate.data.UserPlaymateCategoryReq
 import com.adealink.weparty.playmate.data.UserPlaymateCategoryRes
+import com.adealink.weparty.playmate.data.UserPushListReq
+import com.adealink.weparty.playmate.data.UserPushListRes
 import retrofit2.http.Body
 import retrofit2.http.POST
 
@@ -71,4 +74,10 @@ interface PlaymateHttpService {
     @POST("playmate/acceptSet")
     suspend fun setupBusinessTime(@Body req: SetupBusinessTimeReq): Rlt<Res<Any>>
 
+    @POST("userpush")
+    suspend fun getUserPushList(@Body req: UserPushListReq): Rlt<Res<UserPushListRes>>
+
+    @POST("userpush")
+    suspend fun enableAutoWelcome(@Body req: EnableAutoWelcomeReq): Rlt<Res<Any>>
+
 }

+ 43 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/saywelcome/SayWelcomeActivity.kt

@@ -0,0 +1,43 @@
+package com.adealink.weparty.playmate.saywelcome
+
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.view.updateLayoutParams
+import com.adealink.frame.aab.util.getCompatDimension
+import com.adealink.frame.mvvm.view.viewBinding
+import com.adealink.frame.router.Router
+import com.adealink.frame.router.annotation.RouterUri
+import com.adealink.weparty.commonui.BaseActivity
+import com.adealink.weparty.module.playmate.Playmate
+import com.adealink.weparty.playmate.databinding.ActivitySayWelcomeBinding
+import com.adealink.weparty.util.applyImmersive
+import com.adealink.weparty.R as APP_R
+
+@RouterUri(
+    path = [Playmate.SayWelcome.PATH],
+    desc = "欢迎语设置"
+)
+class SayWelcomeActivity : BaseActivity() {
+
+    private val binding by viewBinding(ActivitySayWelcomeBinding::inflate)
+    override fun onBeforeCreate() {
+        super.onBeforeCreate()
+        Router.bind(this)
+    }
+
+    override fun initViews() {
+        super.initViews()
+        setContentView(binding.root)
+        applyImmersive { top ->
+            binding.topBar.setPadding(0, top, 0, 0)
+            binding.topBar.updateLayoutParams<ConstraintLayout.LayoutParams> {
+                height = getCompatDimension(APP_R.dimen.common_top_bar_height).toInt() + top
+            }
+        }
+        inflateFragment()
+    }
+
+    private fun inflateFragment() {
+
+    }
+
+}

+ 2 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/setting/PlaymateOrderSettingActivity.kt

@@ -10,6 +10,7 @@ import com.adealink.weparty.commonui.BaseActivity
 import com.adealink.weparty.commonui.toast.util.showFailedToast
 import com.adealink.weparty.module.playmate.Playmate
 import com.adealink.weparty.playmate.databinding.ActivityPlaymateOrderSettingBinding
+import com.adealink.weparty.playmate.setting.comp.OrderSayWelcomeComp
 import com.adealink.weparty.playmate.setting.comp.OrderTimeRangeComp
 import com.adealink.weparty.playmate.setting.comp.OrderWeekDayComp
 import com.adealink.weparty.playmate.setting.viewmodel.OrderSettingViewModel
@@ -41,6 +42,7 @@ class PlaymateOrderSettingActivity : BaseActivity() {
         super.initComponents()
         OrderTimeRangeComp(this, binding.vTimeRange).attach()
         OrderWeekDayComp(this, binding.vWeekDay).attach()
+        OrderSayWelcomeComp(this, binding.vSayWelcome).attach()
     }
 
     override fun loadData() {

+ 54 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/setting/comp/OrderSayWelcomeComp.kt

@@ -0,0 +1,54 @@
+package com.adealink.weparty.playmate.setting.comp
+
+import androidx.lifecycle.LifecycleOwner
+import com.adealink.frame.mvvm.viewmodel.viewModels
+import com.adealink.frame.router.Router
+import com.adealink.frame.util.onClick
+import com.adealink.weparty.commonui.BaseViewComponent
+import com.adealink.weparty.commonui.toast.util.showToast
+import com.adealink.weparty.commonui.widget.switchbutton.SwitchButton.OnCheckChangedListener
+import com.adealink.weparty.module.playmate.Playmate
+import com.adealink.weparty.playmate.databinding.LayoutPlaymateOrderSettingSayWelcomeBinding
+import com.adealink.weparty.playmate.setting.viewmodel.OrderSettingViewModel
+import com.adealink.weparty.playmate.viewmodel.PlaymateViewModelFactory
+
+class OrderSayWelcomeComp(
+    lifecycleOwner: LifecycleOwner,
+    val binding: LayoutPlaymateOrderSettingSayWelcomeBinding
+) : BaseViewComponent(lifecycleOwner) {
+    private val viewModel by viewModels<OrderSettingViewModel> { PlaymateViewModelFactory() }
+
+    override fun initViews() {
+        super.initViews()
+        binding.root.onClick {
+            goWelcomeSetting()
+        }
+        binding.vSwitch.checkChangedListener = object : OnCheckChangedListener {
+            override fun onChecked(isChecked: Boolean, fromUser: Boolean) {
+                if (fromUser) {
+                    switchAutoWelcome(isChecked)
+                }
+            }
+        }
+    }
+
+    override fun observeViewModel() {
+        super.observeViewModel()
+        viewModel.enableAutoWelcomeLD.observe(viewLifecycleOwner) {
+            binding.vSwitch.setChecked(it)
+        }
+    }
+
+    private fun switchAutoWelcome(enable: Boolean) {
+        showLoading()
+        viewModel.updateAutoWelcome(enable).observe(viewLifecycleOwner) { rlt ->
+            dismissLoading()
+            showToast(rlt)
+        }
+    }
+
+    private fun goWelcomeSetting() {
+        val act = activity ?: return
+        Router.build(act, Playmate.SayWelcome.PATH).start()
+    }
+}

+ 19 - 1
module/playmate/src/main/java/com/adealink/weparty/playmate/setting/viewmodel/OrderSettingViewModel.kt

@@ -7,6 +7,7 @@ import com.adealink.frame.mvvm.livedata.OnceMutableLiveData
 import com.adealink.frame.mvvm.viewmodel.BaseViewModel
 import com.adealink.weparty.App
 import com.adealink.weparty.commonui.ext.isSuccess
+import com.adealink.weparty.playmate.data.EnableAutoWelcomeReq
 import com.adealink.weparty.playmate.data.SetupBusinessTimeReq
 import com.adealink.weparty.playmate.datasource.remote.PlaymateHttpService
 import com.adealink.weparty.util.TimeHour
@@ -20,8 +21,11 @@ class OrderSettingViewModel : BaseViewModel() {
     }
 
     val timeRangeLD = ExtMutableLiveData<Pair<TimeHour, TimeHour>>()
-
     val weekDayLD = ExtMutableLiveData<List<WeekDay>>()
+
+    val enableAutoWelcomeLD = ExtMutableLiveData<Boolean>()
+
+
     fun getOrderSetting(): LiveData<Rlt<Any>> {
         val liveData = OnceMutableLiveData<Rlt<Any>>()
         viewModelScope.launch {
@@ -80,4 +84,18 @@ class OrderSettingViewModel : BaseViewModel() {
         return liveData
     }
 
+
+    fun updateAutoWelcome(enable: Boolean): LiveData<Rlt<Any>> {
+        val liveData = OnceMutableLiveData<Rlt<Any>>()
+        viewModelScope.launch {
+            val rlt = playmateHttpService.enableAutoWelcome(
+                EnableAutoWelcomeReq(enable)
+            )
+            if (rlt.isSuccess) {
+                enableAutoWelcomeLD.send(enable)
+            }
+            liveData.send(rlt)
+        }
+        return liveData
+    }
 }

+ 45 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/userpush/UserPushActivity.kt

@@ -0,0 +1,45 @@
+package com.adealink.weparty.playmate.userpush
+
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.view.updateLayoutParams
+import com.adealink.frame.aab.util.getCompatDimension
+import com.adealink.frame.mvvm.view.viewBinding
+import com.adealink.frame.router.Router
+import com.adealink.frame.router.annotation.RouterUri
+import com.adealink.weparty.commonui.BaseActivity
+import com.adealink.weparty.module.playmate.Playmate
+import com.adealink.weparty.playmate.databinding.ActivityPlaymateUserPushBinding
+import com.adealink.weparty.util.applyImmersive
+import com.adealink.weparty.R as APP_R
+
+@RouterUri(
+    path = [Playmate.UserPush.PATH],
+    desc = "潜在用户推送"
+)
+class UserPushActivity : BaseActivity() {
+
+    private val binding by viewBinding(ActivityPlaymateUserPushBinding::inflate)
+    override fun onBeforeCreate() {
+        super.onBeforeCreate()
+        Router.bind(this)
+    }
+
+    override fun initViews() {
+        super.initViews()
+        setContentView(binding.root)
+        applyImmersive { top ->
+            binding.topBar.setPadding(0, top, 0, 0)
+            binding.topBar.updateLayoutParams<ConstraintLayout.LayoutParams> {
+                height = getCompatDimension(APP_R.dimen.common_top_bar_height).toInt() + top
+            }
+        }
+        inflateFragment()
+    }
+
+    private fun inflateFragment() {
+        supportFragmentManager.beginTransaction()
+            .replace(binding.fcvContainer.id, UserPushFragment(), "VisitorFragment")
+            .commitAllowingStateLoss()
+    }
+
+}

+ 109 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/userpush/UserPushFragment.kt

@@ -0,0 +1,109 @@
+package com.adealink.weparty.playmate.userpush
+
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.adealink.frame.base.fastLazy
+import com.adealink.frame.mvvm.view.viewBinding
+import com.adealink.frame.router.Router
+import com.adealink.weparty.commonui.BaseFragment
+import com.adealink.weparty.commonui.ext.dp
+import com.adealink.weparty.commonui.ext.gone
+import com.adealink.weparty.commonui.ext.show
+import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
+import com.adealink.weparty.commonui.recycleview.itemdecoration.VerticalSpaceItemDecoration
+import com.adealink.weparty.commonui.toast.util.showFailedToast
+import com.adealink.weparty.module.im.IM
+import com.adealink.weparty.module.profile.Profile
+import com.adealink.weparty.playmate.R
+import com.adealink.weparty.playmate.databinding.FragmentUserPushBinding
+import com.adealink.weparty.playmate.userpush.adapter.UserPushItemViewBinder
+import com.adealink.weparty.playmate.userpush.data.UserPushItemData
+import com.adealink.weparty.playmate.userpush.viewmodel.UserPushViewModel
+import com.adealink.weparty.playmate.viewmodel.PlaymateViewModelFactory
+import com.scwang.smart.refresh.layout.api.RefreshLayout
+import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
+import com.adealink.weparty.R as APP_R
+
+class UserPushFragment : BaseFragment(R.layout.fragment_user_push) {
+    private val binding by viewBinding(FragmentUserPushBinding::bind)
+    private val viewModel by activityViewModels<UserPushViewModel> { PlaymateViewModelFactory() }
+    private val listAdapter by fastLazy { MultiTypeListAdapter<UserPushItemData>() }
+    override fun initViews() {
+        super.initViews()
+        binding.vRefresh.setEnableRefresh(true)
+        binding.vRefresh.setEnableLoadMore(true)
+        binding.vRefresh.setEnableAutoLoadMore(true)
+        binding.vRefresh.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener {
+            override fun onRefresh(refreshLayout: RefreshLayout) {
+                viewModel.pullVisitorList()
+            }
+
+
+            override fun onLoadMore(refreshLayout: RefreshLayout) {
+                viewModel.loadMoreVisitorList()
+            }
+        })
+
+        listAdapter.register(
+            UserPushItemViewBinder(
+                goProfile = { uid ->
+                    this@UserPushFragment.goProfile(uid)
+                },
+                goSession = { uid ->
+                    this@UserPushFragment.goSession(uid)
+                }
+            ))
+        binding.rvVisitor.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
+        binding.rvVisitor.adapter = listAdapter
+        binding.rvVisitor.addItemDecoration(
+            VerticalSpaceItemDecoration(
+                0,
+                firstSpaceHeight = 6.dp()
+            )
+        )
+    }
+
+    override fun loadData() {
+        super.loadData()
+        viewModel.pullVisitorList()
+    }
+
+    override fun observeViewModel() {
+        super.observeViewModel()
+        viewModel.userPushListLD.observe(viewLifecycleOwner) {
+            if (it.isNullOrEmpty()) {
+                binding.rvVisitor.gone()
+                binding.vErrorView.show(
+                    errorEmptyResId = APP_R.drawable.common_follow_list_empty_ic,
+                    title = APP_R.string.commonui_list_empty
+                )
+            } else {
+                listAdapter.submitList(it)
+                binding.rvVisitor.show()
+                binding.vErrorView.gone()
+            }
+        }
+        viewModel.userPushListRltLD.observe(viewLifecycleOwner) { rlt ->
+            binding.vRefresh.finishRefresh()
+            binding.vRefresh.finishLoadMore()
+            binding.vRefresh.setEnableLoadMore(viewModel.hasMoreData())
+            showFailedToast(rlt)
+        }
+    }
+
+    private fun goProfile(uid: String) {
+        val act = activity ?: return
+        Router.build(act, Profile.UserProfile.PATH)
+            .putExtra(Profile.Common.EXTRA_UID, uid)
+            .start()
+    }
+
+    private fun goSession(uid: String) {
+        val act = activity ?: return
+        Router.build(act, IM.Session.PATH)
+            .putExtra(IM.Session.EXTRA_CHAT_ID, uid)
+            .start()
+    }
+
+}

+ 54 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/userpush/adapter/UserPushItemViewBinder.kt

@@ -0,0 +1,54 @@
+package com.adealink.weparty.playmate.userpush.adapter
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import com.adealink.frame.util.onClick
+import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
+import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
+import com.adealink.weparty.playmate.databinding.ItemUserPushBinding
+import com.adealink.weparty.playmate.userpush.data.UserPushItemData
+
+
+class UserPushItemViewBinder(
+    val goProfile: (uid: String) -> Unit,
+    val goSession: (uid: String) -> Unit
+) : ItemViewBinder<UserPushItemData, BindingViewHolder<ItemUserPushBinding>>() {
+
+    override fun onBindViewHolder(
+        holder: BindingViewHolder<ItemUserPushBinding>,
+        item: UserPushItemData,
+    ) {
+        holder.binding.root.onClick {
+            goProfile.invoke(item.data.uid)
+        }
+//        holder.binding.ivAvatar.setImageUrl(item.data.avatar)
+//        holder.binding.tvUserName.text = item.data.nickName
+//        holder.binding.vGender.setGender(item.data.gender)
+//        holder.binding.vGender.setAge(item.data.age)
+
+//        if (item.data.online) {
+//            holder.binding.vOnline.show()
+//            holder.binding.vOnline.onStart()
+//        } else {
+//            holder.binding.vOnline.gone()
+//            holder.binding.vOnline.onStop()
+//        }
+
+        holder.binding.btnChat.onClick {
+            goSession.invoke(item.data.uid)
+        }
+    }
+
+    override fun onCreateViewHolder(
+        inflater: LayoutInflater,
+        parent: ViewGroup,
+    ): BindingViewHolder<ItemUserPushBinding> {
+        return BindingViewHolder(
+            ItemUserPushBinding.inflate(
+                inflater,
+                parent,
+                false
+            )
+        )
+    }
+}

+ 8 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/userpush/data/UserPushData.kt

@@ -0,0 +1,8 @@
+package com.adealink.weparty.playmate.userpush.data
+
+import com.adealink.weparty.commonui.recycleview.diffutil.BaseListItemData
+import com.adealink.weparty.playmate.data.UserPushListData
+
+data class UserPushItemData(
+    val data: UserPushListData
+) : BaseListItemData

+ 70 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/userpush/viewmodel/UserPushViewModel.kt

@@ -0,0 +1,70 @@
+package com.adealink.weparty.playmate.userpush.viewmodel
+
+import androidx.lifecycle.MutableLiveData
+import com.adealink.frame.base.Rlt
+import com.adealink.frame.mvvm.livedata.ExtMutableLiveData
+import com.adealink.frame.mvvm.viewmodel.BaseViewModel
+import com.adealink.frame.network.data.PageReq
+import com.adealink.weparty.App
+import com.adealink.weparty.playmate.data.UserPushListReq
+import com.adealink.weparty.playmate.datasource.remote.PlaymateHttpService
+import com.adealink.weparty.playmate.userpush.data.UserPushItemData
+import com.adealink.weparty.util.PageHandler
+import kotlinx.coroutines.launch
+
+class UserPushViewModel : BaseViewModel() {
+
+    private val userPushHttpService by lazy {
+        App.instance.networkService.getHttpService(PlaymateHttpService::class.java)
+    }
+
+    private val userPushItemList = mutableListOf<UserPushItemData>()
+    private val userPushUids = mutableSetOf<String>()
+    private val pageHandler = PageHandler()
+
+    val userPushListRltLD = ExtMutableLiveData<Rlt<Any>>()
+    val userPushListLD = MutableLiveData<List<UserPushItemData>>()
+    fun pullVisitorList() {
+        userPushItemList.clear()
+        userPushUids.clear()
+        pageHandler.reset()
+        loadMoreVisitorList()
+    }
+
+    fun hasMoreData(): Boolean {
+        return !pageHandler.isEnd
+    }
+
+    fun loadMoreVisitorList() {
+        viewModelScope.launch {
+            val rlt = userPushHttpService.getUserPushList(
+                UserPushListReq(
+                    PageReq(
+                        size = pageHandler.pageSize,
+                        next = pageHandler.currentPage
+                    )
+                )
+            )
+            when (rlt) {
+                is Rlt.Failed -> {
+                    userPushListRltLD.send(rlt)
+                }
+
+                is Rlt.Success -> {
+                    pageHandler.nextPage(rlt.data.data?.next)
+                    rlt.data.data?.list?.forEach {
+//                        ProfileModule.updateUserOnline(it.uid, it.online)
+                        if (!userPushUids.contains(it.uid)) {
+                            userPushItemList.add(UserPushItemData(it))
+                            userPushUids.add(it.uid)
+                        }
+                    }
+                    userPushListRltLD.send(rlt)
+                    userPushListLD.send(userPushItemList)
+                }
+            }
+        }
+    }
+
+
+}

+ 4 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/viewmodel/PlaymateViewModelFactory.kt

@@ -8,6 +8,7 @@ import com.adealink.weparty.playmate.list.viewmodel.GuestPlaymateListViewModel
 import com.adealink.weparty.playmate.list.viewmodel.PlaymateListViewModel
 import com.adealink.weparty.playmate.setting.viewmodel.OrderSettingViewModel
 import com.adealink.weparty.playmate.setting.viewmodel.SkillSettingViewModel
+import com.adealink.weparty.playmate.userpush.viewmodel.UserPushViewModel
 
 @Suppress("UNCHECKED_CAST")
 class PlaymateViewModelFactory : ViewModelProvider.NewInstanceFactory() {
@@ -36,6 +37,9 @@ class PlaymateViewModelFactory : ViewModelProvider.NewInstanceFactory() {
                 isAssignableFrom(OrderSettingViewModel::class.java) ->
                     OrderSettingViewModel()
 
+                isAssignableFrom(UserPushViewModel::class.java) ->
+                    UserPushViewModel()
+
                 else ->
                     throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}")
             } as T

+ 7 - 0
module/playmate/src/main/res/layout/activity_playmate_order_setting.xml

@@ -42,6 +42,13 @@
                 android:layout_height="60dp"
                 android:layout_marginTop="10dp" />
 
+            <include
+                android:id="@+id/v_say_welcome"
+                layout="@layout/layout_playmate_order_setting_say_welcome"
+                android:layout_width="match_parent"
+                android:layout_height="86dp"
+                android:layout_marginTop="10dp" />
+
         </androidx.appcompat.widget.LinearLayoutCompat>
 
     </androidx.core.widget.NestedScrollView>

+ 25 - 0
module/playmate/src/main/res/layout/activity_playmate_user_push.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/color_FFF2F3F5">
+
+    <com.adealink.weparty.commonui.widget.CommonTopBar
+        android:id="@+id/top_bar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/common_top_bar_height"
+        app:bar_background="@color/white"
+        app:layout_constraintTop_toTopOf="parent"
+        app:top_bar_title="@string/playmate_user_push" />
+
+    <androidx.fragment.app.FragmentContainerView
+        android:id="@+id/fcv_container"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/top_bar" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 47 - 0
module/playmate/src/main/res/layout/activity_say_welcome.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/color_FFF2F3F5">
+
+    <com.adealink.weparty.commonui.widget.CommonTopBar
+        android:id="@+id/top_bar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/common_top_bar_height"
+        app:bar_background="@color/white"
+        app:layout_constraintTop_toTopOf="parent"
+        app:top_bar_title="@string/playmate_user_push" />
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/top_bar">
+
+        <com.scwang.smart.refresh.layout.SmartRefreshLayout
+            android:id="@+id/v_refresh"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/rv_visitor"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent" />
+        </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+        <com.adealink.weparty.commonui.widget.CommonEmptyErrorView
+            android:id="@+id/v_error_view"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:visibility="gone"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 28 - 0
module/playmate/src/main/res/layout/fragment_user_push.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/v_refresh"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/rv_visitor"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+    <com.adealink.weparty.commonui.widget.CommonEmptyErrorView
+        android:id="@+id/v_error_view"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 88 - 0
module/playmate/src/main/res/layout/item_user_push.xml

@@ -0,0 +1,88 @@
+<?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:layout_width="match_parent"
+    android:layout_height="60dp">
+
+    <com.adealink.weparty.commonui.imageview.AvatarView
+        android:id="@+id/iv_avatar"
+        android:layout_width="40dp"
+        android:layout_height="40dp"
+        android:layout_marginStart="16dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:roundingBorderColor="@color/white"
+        app:roundingBorderWidth="1dp" />
+
+    <com.adealink.weparty.commonui.ripple.RippleView
+        android:id="@+id/v_online"
+        style="@style/CommonOnlineRipple"
+        android:layout_width="48dp"
+        android:layout_height="48dp"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="@id/iv_avatar"
+        app:layout_constraintEnd_toEndOf="@id/iv_avatar"
+        app:layout_constraintStart_toStartOf="@id/iv_avatar"
+        app:layout_constraintTop_toTopOf="@id/iv_avatar"
+        app:ripple_circle_min_radius="20dp"
+        tools:visibility="visible" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_user_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="12dp"
+        android:ellipsize="end"
+        android:fontFamily="@font/poppins_semibold"
+        android:includeFontPadding="false"
+        android:singleLine="true"
+        android:textColor="@color/color_FF1D2129"
+        android:textSize="14sp"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/v_gender"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintStart_toEndOf="@id/iv_avatar"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="Super Beautiful Girl" />
+
+    <com.adealink.weparty.module.profile.widget.GenderView
+        android:id="@+id/v_gender"
+        style="@style/CommonGenderView"
+        android:layout_marginStart="4dp"
+        android:layout_marginEnd="4dp"
+        app:layout_constraintBottom_toBottomOf="@id/tv_user_name"
+        app:layout_constraintEnd_toStartOf="@id/right_barrier"
+        app:layout_constraintStart_toEndOf="@id/tv_user_name"
+        app:layout_constraintTop_toTopOf="@id/tv_user_name" />
+
+    <androidx.constraintlayout.widget.Barrier
+        android:id="@+id/right_barrier"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:barrierDirection="start"
+        app:constraint_referenced_ids="btn_chat" />
+
+    <com.adealink.weparty.commonui.widget.CommonButton
+        android:id="@+id/btn_chat"
+        android:layout_width="wrap_content"
+        android:layout_height="22dp"
+        android:layout_marginEnd="16dp"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:minWidth="56dp"
+        android:paddingHorizontal="6dp"
+        android:textColor="@color/color_FF86909C"
+        android:textSize="11sp"
+        app:common_button_type="business_open"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:text="@string/common_chat"
+        app:textColor="@color/white"
+        app:textSize="12sp" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 82 - 0
module/playmate/src/main/res/layout/layout_playmate_order_setting_say_welcome.xml

@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="86dp"
+    android:background="@drawable/common_white_radius_16_bg"
+    android:paddingHorizontal="12dp">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_top"
+        android:layout_width="match_parent"
+        android:layout_height="52dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:ellipsize="end"
+            android:fontFamily="@font/poppins_semibold"
+            android:gravity="start|center_vertical"
+            android:includeFontPadding="false"
+            android:singleLine="true"
+            android:text="@string/playmate_order_setting_week_day"
+            android:textColor="@color/color_FF1D2129"
+            android:textSize="14sp"
+            app:layout_constrainedWidth="true"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintVertical_chainStyle="packed" />
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_go"
+            android:layout_width="16dp"
+            android:layout_height="16dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:srcCompat="@drawable/common_go_ic" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_bottom"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/cl_top">
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_auto_reply"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:ellipsize="end"
+            android:gravity="start|center_vertical"
+            android:includeFontPadding="false"
+            android:singleLine="true"
+            android:text="@string/playmate_enable_auto_replay"
+            android:textColor="@color/color_FF1D2129"
+            android:textSize="14sp"
+            app:layout_constrainedWidth="true"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintVertical_chainStyle="packed" />
+
+        <com.adealink.weparty.commonui.widget.switchbutton.SwitchButton
+            android:id="@+id/v_switch"
+            style="@style/CommonSwitchButton"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

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

@@ -38,4 +38,6 @@
     <string name="playmate_apply_for_skill">Apply for Skill</string>
     <string name="playmate_setting_accept_order">Accept Orders</string>
     <string name="playmate_setting_main_category">Set Default Primary Skill</string>
+    <string name="playmate_user_push">潜在用户推荐</string>
+    <string name="playmate_enable_auto_replay">开启自动回复</string>
 </resources>

+ 2 - 1
module/profile/src/main/java/com/adealink/weparty/profile/me/comp/OrderCenterComp.kt

@@ -74,7 +74,8 @@ class OrderCenterComp(
     private fun updateBusiness(business: PlaymateBusinessData?) {
         binding.tvIncome.text = formatNumberStr(business?.weekIncome ?: 0f)
         binding.tvExposure.text = formatNumberStr(business?.todayExposure ?: 0)
-        binding.tvVisitor.text = formatNumberStr(business?.visitor ?: 0)
+        binding.tvUserPush.text = formatNumberStr(business?.userPush ?: 0)
+
         if (business == null) {
             binding.btnService.buttonType = CommonButton.BUTTON_NORMAL_1
             binding.btnService.isEnabled = false

+ 5 - 5
module/profile/src/main/res/layout/layout_me_order_center.xml

@@ -107,7 +107,7 @@
         android:layout_height="wrap_content"
         android:paddingHorizontal="8dp"
         android:paddingBottom="16dp"
-        app:layout_constraintEnd_toStartOf="@id/cl_visitor"
+        app:layout_constraintEnd_toStartOf="@id/cl_user_push"
         app:layout_constraintHorizontal_weight="1"
         app:layout_constraintStart_toEndOf="@id/cl_income"
         app:layout_constraintTop_toBottomOf="@id/tv_accept_order">
@@ -151,7 +151,7 @@
 
     <!--本周收入-->
     <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/cl_visitor"
+        android:id="@+id/cl_user_push"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginEnd="16dp"
@@ -163,7 +163,7 @@
         app:layout_constraintTop_toBottomOf="@id/tv_accept_order">
 
         <androidx.appcompat.widget.AppCompatTextView
-            android:id="@+id/tv_visitor"
+            android:id="@+id/tv_user_push"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginStart="3dp"
@@ -189,13 +189,13 @@
             android:gravity="center"
             android:includeFontPadding="false"
             android:maxLines="2"
-            android:text="@string/common_recent_visitor"
+            android:text="@string/common_user_push"
             android:textColor="@color/color_FF4E5969"
             android:textSize="12sp"
             app:layout_constrainedWidth="true"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@id/tv_visitor" />
+            app:layout_constraintTop_toBottomOf="@id/tv_user_push" />
 
     </androidx.constraintlayout.widget.ConstraintLayout>