Procházet zdrojové kódy

feat: 完成首页大致布局

DoggyZhang před 4 měsíci
rodič
revize
e1c5be2d17
100 změnil soubory, kde provedl 1125 přidání a 322 odebrání
  1. 2 1
      app/build.gradle
  2. 0 2
      app/src/main/java/com/adealink/weparty/commonui/recycleview/diffutil/BaseListDiffUtil.kt
  3. 64 0
      app/src/main/java/com/adealink/weparty/commonui/widget/EvaluateView.kt
  4. 13 12
      app/src/main/java/com/adealink/weparty/debug/DebugActivity.kt
  5. 23 0
      app/src/main/java/com/adealink/weparty/module/activity/ActivityModule.kt
  6. 7 0
      app/src/main/java/com/adealink/weparty/module/activity/IActivityService.kt
  7. 20 0
      app/src/main/java/com/adealink/weparty/module/activity/Router.kt
  8. 4 0
      app/src/main/java/com/adealink/weparty/module/activity/listener/IActivityListener.kt
  9. 4 0
      app/src/main/java/com/adealink/weparty/module/activity/viewmodel/IActivityViewModel.kt
  10. 7 0
      app/src/main/java/com/adealink/weparty/module/playmate/IPlaymateService.kt
  11. 23 0
      app/src/main/java/com/adealink/weparty/module/playmate/PlaymateModule.kt
  12. 20 0
      app/src/main/java/com/adealink/weparty/module/playmate/Router.kt
  13. 4 0
      app/src/main/java/com/adealink/weparty/module/playmate/listener/IPlaymateListener.kt
  14. 4 0
      app/src/main/java/com/adealink/weparty/module/playmate/viewmodel/IPlaymateViewModel.kt
  15. 43 0
      app/src/main/java/com/adealink/weparty/module/profile/widget/GenderView.kt
  16. 166 13
      app/src/main/java/com/adealink/weparty/ui/home/HomeFragment.kt
  17. 60 0
      app/src/main/java/com/adealink/weparty/ui/home/tab/HomeTab.kt
  18. 8 0
      app/src/main/java/com/adealink/weparty/ui/home/tab/Tab.kt
  19. 36 0
      app/src/main/java/com/adealink/weparty/ui/home/tab/TabManager.kt
  20. binární
      app/src/main/res/drawable-xhdpi/common_app_language_ic.png
  21. binární
      app/src/main/res/drawable-xhdpi/common_app_logo_ic.png
  22. binární
      app/src/main/res/drawable-xhdpi/common_app_profile_ic.png
  23. binární
      app/src/main/res/drawable-xhdpi/common_app_top_bg_ic.png
  24. binární
      app/src/main/res/drawable-xhdpi/common_debug_ic.png
  25. binární
      app/src/main/res/drawable-xhdpi/common_diamond_16_ic.png
  26. binární
      app/src/main/res/drawable-xhdpi/common_diamond_32_ic.png
  27. binární
      app/src/main/res/drawable-xhdpi/common_diamond_64_ic.png
  28. binární
      app/src/main/res/drawable-xhdpi/common_evaluate_star_disable_ic.png
  29. binární
      app/src/main/res/drawable-xhdpi/common_evaluate_star_ic.png
  30. binární
      app/src/main/res/drawable-xhdpi/common_filter_ic.png
  31. binární
      app/src/main/res/drawable-xhdpi/common_find_partner_bg.9.png
  32. binární
      app/src/main/res/drawable-xhdpi/common_find_your_partner_ic.png
  33. binární
      app/src/main/res/drawable-xhdpi/common_gender_female_bg.9.png
  34. binární
      app/src/main/res/drawable-xhdpi/common_gender_male_bg.9.png
  35. binární
      app/src/main/res/drawable-xhdpi/common_location_ic.png
  36. binární
      app/src/main/res/drawable-xhdpi/common_playmate_bubble_bg.9.png
  37. binární
      app/src/main/res/drawable-xhdpi/common_voice_summary_ic.png
  38. 7 0
      app/src/main/res/drawable/common_evaluate_view_divider.xml
  39. 8 0
      app/src/main/res/layout/activity_debug.xml
  40. 63 32
      app/src/main/res/layout/fragment_home.xml
  41. 26 0
      app/src/main/res/layout/layout_gender_view.xml
  42. 35 0
      app/src/main/res/layout/layout_main_tab_normal.xml
  43. 5 0
      app/src/main/res/values/colors.xml
  44. 5 1
      app/src/main/res/values/strings.xml
  45. 6 1
      app/src/main/res/values/styles.xml
  46. 2 0
      app/src/main/resources/META-INF/services/com.adealink.frame.router.IRouterInit
  47. binární
      module/account/src/main/res/drawable-xhdpi/account_area_code_arrow_ic.webp
  48. binární
      module/account/src/main/res/drawable-xhdpi/account_birthday_arrow_ic.webp
  49. binární
      module/account/src/main/res/drawable-xhdpi/account_cancel_icon_tip.webp
  50. binární
      module/account/src/main/res/drawable-xhdpi/account_checked_green_ic.webp
  51. binární
      module/account/src/main/res/drawable-xhdpi/account_country_search_ic.webp
  52. binární
      module/account/src/main/res/drawable-xhdpi/account_email_bind_next_ic.webp
  53. binární
      module/account/src/main/res/drawable-xhdpi/account_email_content_clear_ic.webp
  54. binární
      module/account/src/main/res/drawable-xhdpi/account_email_forget_help_ic.webp
  55. binární
      module/account/src/main/res/drawable-xhdpi/account_email_hight_risk_ic.webp
  56. binární
      module/account/src/main/res/drawable-xhdpi/account_email_ic.webp
  57. binární
      module/account/src/main/res/drawable-xhdpi/account_email_list_close_ic.webp
  58. binární
      module/account/src/main/res/drawable-xhdpi/account_email_list_open_ic.webp
  59. binární
      module/account/src/main/res/drawable-xhdpi/account_email_low_risk.webp
  60. binární
      module/account/src/main/res/drawable-xhdpi/account_email_pwd_see.webp
  61. binární
      module/account/src/main/res/drawable-xhdpi/account_email_pwd_see_no.webp
  62. binární
      module/account/src/main/res/drawable-xhdpi/account_eye_close_ic.webp
  63. binární
      module/account/src/main/res/drawable-xhdpi/account_eye_open_ic.webp
  64. binární
      module/account/src/main/res/drawable-xhdpi/account_fb_ic.webp
  65. binární
      module/account/src/main/res/drawable-xhdpi/account_fb_icon.webp
  66. binární
      module/account/src/main/res/drawable-xhdpi/account_fb_login_ic.webp
  67. binární
      module/account/src/main/res/drawable-xhdpi/account_female_selected_ic.webp
  68. binární
      module/account/src/main/res/drawable-xhdpi/account_female_unselected_ic.webp
  69. binární
      module/account/src/main/res/drawable-xhdpi/account_gender_checked_ic.webp
  70. binární
      module/account/src/main/res/drawable-xhdpi/account_gender_select_default_avatar.webp
  71. binární
      module/account/src/main/res/drawable-xhdpi/account_google_ic.webp
  72. binární
      module/account/src/main/res/drawable-xhdpi/account_icon_no_protection.webp
  73. binární
      module/account/src/main/res/drawable-xhdpi/account_last_login_ic.webp
  74. binární
      module/account/src/main/res/drawable-xhdpi/account_login_apple.webp
  75. binární
      module/account/src/main/res/drawable-xhdpi/account_login_feedback_ic.webp
  76. binární
      module/account/src/main/res/drawable-xhdpi/account_login_top_icon.png
  77. binární
      module/account/src/main/res/drawable-xhdpi/account_male_selected_ic.webp
  78. binární
      module/account/src/main/res/drawable-xhdpi/account_male_unselected_ic.webp
  79. binární
      module/account/src/main/res/drawable-xhdpi/account_tiktok_login_ic.webp
  80. 0 98
      module/account/src/main/res/values-in/strings.xml
  81. 0 145
      module/account/src/main/res/values-zh/strings.xml
  82. 0 17
      module/account/src/main/res/values/style.xml
  83. 1 0
      module/activity/.gitignore
  84. 56 0
      module/activity/build.gradle
  85. 0 0
      module/activity/consumer-rules.pro
  86. 21 0
      module/activity/proguard-rules.pro
  87. 70 0
      module/activity/src/main/AndroidManifest.xml
  88. 21 0
      module/activity/src/main/java/com/adealink/weparty/activity/ActivityServiceImpl.kt
  89. 17 0
      module/activity/src/main/java/com/adealink/weparty/activity/datasource/local/ActivityLocalService.kt
  90. 5 0
      module/activity/src/main/java/com/adealink/weparty/activity/datasource/remote/ActivityHttpService.kt
  91. 15 0
      module/activity/src/main/java/com/adealink/weparty/activity/list/ActivityHomeListFragment.kt
  92. 9 0
      module/activity/src/main/java/com/adealink/weparty/activity/viewmodel/ActivityViewModel.kt
  93. 21 0
      module/activity/src/main/java/com/adealink/weparty/activity/viewmodel/ActivityViewModelFactory.kt
  94. 34 0
      module/activity/src/main/res/layout/fragment_activity_home_list.xml
  95. 103 0
      module/activity/src/main/res/layout/layout_activity_home_list_filter.xml
  96. 47 0
      module/activity/src/main/res/layout/layout_activity_home_list_top.xml
  97. 31 0
      module/activity/src/main/res/layout/layout_activity_home_list_top_item.xml
  98. 3 0
      module/activity/src/main/res/values-in/strings.xml
  99. 3 0
      module/activity/src/main/res/values-zh/strings.xml
  100. 3 0
      module/activity/src/main/res/values/attrs.xml

+ 2 - 1
app/build.gradle

@@ -211,7 +211,8 @@ android {
     dynamicFeatures = [
             ':module:account',
             ':module:profile',
-            ':module:im'
+            ':module:im',
+            ':module:playmate',
     ]
     buildFeatures {
         viewBinding true

+ 0 - 2
app/src/main/java/com/adealink/weparty/commonui/recycleview/diffutil/BaseListDiffUtil.kt

@@ -4,8 +4,6 @@ import androidx.recyclerview.widget.DiffUtil
 
 /**
  * DiffUtil 的回调类,支持 DiffableItemData 的数据比较.
- * Created by XiaoDongLin.
- * Date: 2025/4/8
  */
 class BaseListDiffUtil<T : BaseListItemData> : DiffUtil.ItemCallback<T>() {
     override fun areItemsTheSame(oldItem: T, newItem: T): Boolean {

+ 64 - 0
app/src/main/java/com/adealink/weparty/commonui/widget/EvaluateView.kt

@@ -0,0 +1,64 @@
+package com.adealink.weparty.commonui.widget
+
+import android.content.Context
+import android.util.AttributeSet
+import androidx.appcompat.widget.AppCompatImageView
+import androidx.appcompat.widget.LinearLayoutCompat
+import com.adealink.frame.aab.util.getCompatDrawable
+import com.adealink.weparty.R
+import kotlin.math.min
+
+class EvaluateView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : LinearLayoutCompat(context, attrs, defStyleAttr) {
+
+    private var maxScore = 5 //最高评分
+    private var curScore = 5 //当前评分
+    private var itemViewSize = 10
+    private var itemDivider = 4
+
+    init {
+        inflateEvaluateView()
+        setShowDividers(SHOW_DIVIDER_MIDDLE)
+        setDividerDrawable(getCompatDrawable(R.drawable.common_evaluate_view_divider))
+    }
+
+    fun setMaxScore(score: Int) {
+        if (score < 0) {
+            return
+        }
+        if (maxScore != score) {
+            inflateEvaluateView()
+        }
+    }
+
+    fun setCurScore(score: Int) {
+        if (curScore == score) {
+            return
+        }
+        curScore = score
+        val ii = min(curScore, childCount)
+        for (i in 0 until childCount) {
+            val itemView = getChildAt(i) as? AppCompatImageView ?: return
+            if (i < score) {
+                itemView.setImageResource(R.drawable.common_evaluate_star_ic)
+            } else {
+                itemView.setImageResource(R.drawable.common_evaluate_star_disable_ic)
+            }
+        }
+    }
+
+    private fun inflateEvaluateView() {
+        removeAllViews()
+        for (i in 0 until maxScore) {
+            val itemView = AppCompatImageView(context)
+            addView(itemView, LayoutParams(itemViewSize, itemViewSize))
+            if (i < curScore) {
+                itemView.setImageResource(R.drawable.common_evaluate_star_ic)
+            } else {
+                itemView.setImageResource(R.drawable.common_evaluate_star_disable_ic)
+            }
+        }
+    }
+
+}

+ 13 - 12
app/src/main/java/com/adealink/weparty/debug/DebugActivity.kt

@@ -22,6 +22,7 @@ import com.adealink.weparty.commonui.widget.floatview.data.MODE_APPLICATION
 import com.adealink.weparty.databinding.ActivityDebugBinding
 import com.adealink.weparty.log.viewmodel.LogViewModelFactory
 import com.adealink.weparty.module.account.AccountLocalService
+import com.adealink.weparty.module.account.AccountModule
 import com.adealink.weparty.storage.AppPref
 import com.adealink.weparty.util.goLocalLinkPage
 import com.google.gson.annotations.SerializedName
@@ -43,6 +44,17 @@ class DebugActivity : BaseActivity(), OnReturnValue {
         //用户/APP信息
         binding.etTestAccount.setText(AccountLocalService.testAccount)
         binding.userInfo.text = "uid: ${AppPref.uid}"
+        binding.btnSwitchAccount.setOnClickListener {
+            val fbAccount = binding.etTestAccount.text.toString()
+            if (fbAccount.isEmpty()) {
+                return@setOnClickListener
+            }
+            AccountLocalService.testAccount = fbAccount
+            AccountModule.logout(true)
+        }
+        binding.btnLogout.setOnClickListener {
+            AccountModule.logout(true)
+        }
 
         //网络
         binding.httpUrl.setText(DebugPrefs.httpUrl)
@@ -52,9 +64,6 @@ class DebugActivity : BaseActivity(), OnReturnValue {
             saveHttpUrl()
 //            saveSocketUrl()
             saveWebHttpUrl()
-            saveWebUrlEd()
-            saveWebWhiteHostEd()
-            saveFBAccount()
             showToast("请杀死App重启")
         }
 
@@ -68,6 +77,7 @@ class DebugActivity : BaseActivity(), OnReturnValue {
         binding.webWhiteHostBtn.setOnClickListener {
             saveWebWhiteHostEd()
             addWhiteHost()
+            showToast("请杀死App重启")
         }
 
         //其他工具
@@ -179,15 +189,6 @@ class DebugActivity : BaseActivity(), OnReturnValue {
 //        DebugPrefs.socketUrl = socketUrl
 //    }
 
-    private fun saveFBAccount() {
-        val fbAccount = binding.etTestAccount.text.toString()
-        if (fbAccount.isEmpty()) {
-            return
-        }
-
-        AccountLocalService.testAccount = fbAccount
-    }
-
     private fun goWebTest() {
         val webTestUrl = binding.webUrlEd.text.toString()
         if (webTestUrl.isEmpty()) {

+ 23 - 0
app/src/main/java/com/adealink/weparty/module/activity/ActivityModule.kt

@@ -0,0 +1,23 @@
+package com.adealink.weparty.module.activity
+
+import com.adealink.frame.aab.BaseDynamicModule
+import com.adealink.weparty.R
+
+object ActivityModule : BaseDynamicModule<IActivityService>(IActivityService::class),
+    IActivityService {
+
+    override val featureName: String
+        get() = "activity"
+
+    override val moduleNameResId: Int
+        get() = R.string.module_activity
+
+    override fun emptyService(): IActivityService {
+        return object : IActivityService {
+
+            override fun getService(): IActivityService? {
+                return null
+            }
+        }
+    }
+}

+ 7 - 0
app/src/main/java/com/adealink/weparty/module/activity/IActivityService.kt

@@ -0,0 +1,7 @@
+package com.adealink.weparty.module.activity
+
+import com.adealink.frame.aab.IService
+
+interface IActivityService : IService<IActivityService> {
+
+}

+ 20 - 0
app/src/main/java/com/adealink/weparty/module/activity/Router.kt

@@ -0,0 +1,20 @@
+package com.adealink.weparty.module.activity
+
+
+interface Activity {
+
+    interface Common {
+
+        companion object {
+            const val PATH = "/activity"
+        }
+
+    }
+
+    interface ActivityList {
+        companion object {
+            const val PATH = "${Common.PATH}/activity_list"
+        }
+    }
+
+}

+ 4 - 0
app/src/main/java/com/adealink/weparty/module/activity/listener/IActivityListener.kt

@@ -0,0 +1,4 @@
+package com.adealink.weparty.module.activity.listener
+
+interface IActivityListener {
+}

+ 4 - 0
app/src/main/java/com/adealink/weparty/module/activity/viewmodel/IActivityViewModel.kt

@@ -0,0 +1,4 @@
+package com.adealink.weparty.module.activity.viewmodel
+
+interface IActivityViewModel {
+}

+ 7 - 0
app/src/main/java/com/adealink/weparty/module/playmate/IPlaymateService.kt

@@ -0,0 +1,7 @@
+package com.adealink.weparty.module.playmate
+
+import com.adealink.frame.aab.IService
+
+interface IPlaymateService : IService<IPlaymateService> {
+
+}

+ 23 - 0
app/src/main/java/com/adealink/weparty/module/playmate/PlaymateModule.kt

@@ -0,0 +1,23 @@
+package com.adealink.weparty.module.playmate
+
+import com.adealink.frame.aab.BaseDynamicModule
+import com.adealink.weparty.R
+
+object PlaymateModule : BaseDynamicModule<IPlaymateService>(IPlaymateService::class),
+    IPlaymateService {
+
+    override val featureName: String
+        get() = "playmate"
+
+    override val moduleNameResId: Int
+        get() = R.string.module_playmate
+
+    override fun emptyService(): IPlaymateService {
+        return object : IPlaymateService {
+
+            override fun getService(): IPlaymateService? {
+                return null
+            }
+        }
+    }
+}

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

@@ -0,0 +1,20 @@
+package com.adealink.weparty.module.playmate
+
+
+interface Playmate {
+
+    interface Common {
+
+        companion object {
+            const val PATH = "/playmate"
+        }
+
+    }
+
+    interface PlaymateList {
+        companion object {
+            const val PATH = "${Common.PATH}/playmate_list"
+        }
+    }
+
+}

+ 4 - 0
app/src/main/java/com/adealink/weparty/module/playmate/listener/IPlaymateListener.kt

@@ -0,0 +1,4 @@
+package com.adealink.weparty.module.playmate.listener
+
+interface IPlaymateListener {
+}

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

@@ -0,0 +1,4 @@
+package com.adealink.weparty.module.playmate.viewmodel
+
+interface IPlaymateViewModel {
+}

+ 43 - 0
app/src/main/java/com/adealink/weparty/module/profile/widget/GenderView.kt

@@ -0,0 +1,43 @@
+package com.adealink.weparty.module.profile.widget
+
+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.databinding.LayoutGenderViewBinding
+import com.adealink.weparty.module.profile.data.Gender
+
+@SuppressLint("SetTextI18n")
+class GenderView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : ConstraintLayout(context, attrs, defStyleAttr) {
+
+    private val binding = LayoutGenderViewBinding.inflate(LayoutInflater.from(context), this)
+
+    init {
+        if (isInEditMode) {
+            binding.root.setBackgroundResource(R.drawable.common_gender_female_bg)
+            binding.tvAge.text = "20"
+        }
+    }
+
+    fun setSex(gender: Gender) {
+        when (gender) {
+            Gender.MALE -> {
+                binding.root.setBackgroundResource(R.drawable.common_gender_male_bg)
+            }
+
+            Gender.FEMALE,
+            Gender.NO_INIT -> {
+                binding.root.setBackgroundResource(R.drawable.common_gender_female_bg)
+            }
+        }
+    }
+
+    fun setAge(age: Int) {
+        binding.tvAge.text = age.toString()
+    }
+
+}

+ 166 - 13
app/src/main/java/com/adealink/weparty/ui/home/HomeFragment.kt

@@ -3,6 +3,11 @@ package com.adealink.weparty.ui.home
 import android.annotation.SuppressLint
 import android.os.Bundle
 import android.view.View
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.view.updateLayoutParams
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.RecyclerView
+import com.adealink.frame.base.AppBase
 import com.adealink.frame.log.Log
 import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.frame.router.Router
@@ -10,15 +15,33 @@ import com.adealink.frame.startup.DistributedLoadManager
 import com.adealink.weparty.AppModule
 import com.adealink.weparty.R
 import com.adealink.weparty.commonui.BaseFragment
+import com.adealink.weparty.commonui.ext.show
+import com.adealink.weparty.commonui.recycleview.adapter.BaseTabFragmentStateAdapter
+import com.adealink.weparty.commonui.widget.EmptyFragment
 import com.adealink.weparty.constant.TAG_TIME_APP_START
 import com.adealink.weparty.constant.logTime
 import com.adealink.weparty.databinding.FragmentHomeBinding
-import com.adealink.weparty.module.account.AccountModule
-import com.adealink.weparty.module.im.IM
+import com.adealink.weparty.databinding.LayoutMainTabNormalBinding
+import com.adealink.weparty.debug.Debug
+import com.adealink.weparty.debug.DebugActivity
+import com.adealink.weparty.module.profile.Profile
+import com.adealink.weparty.ui.home.tab.ACTIVITY
+import com.adealink.weparty.ui.home.tab.HOME_TABS
+import com.adealink.weparty.ui.home.tab.HomeTab
+import com.adealink.weparty.ui.home.tab.ITabManager
+import com.adealink.weparty.ui.home.tab.ONLINE_PLAY_TAB
+import com.adealink.weparty.ui.home.tab.PC_GAME
+import com.adealink.weparty.ui.home.tab.Tab
+import com.adealink.weparty.ui.home.tab.TabManager
+import com.google.android.material.tabs.TabLayout
+import com.google.android.material.tabs.TabLayoutMediator
+import com.qmuiteam.qmui.widget.util.QMUIStatusBarHelper
 import java.util.LinkedList
 import java.util.Queue
+import kotlin.collections.get
+import kotlin.text.get
 
-class HomeFragment : BaseFragment(R.layout.fragment_home) {
+class HomeFragment : BaseFragment(R.layout.fragment_home), ITabManager by TabManager() {
 
     companion object {
         const val TAG = "HomeFragment"
@@ -34,12 +57,17 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
     }
 
     private val binding by viewBinding(FragmentHomeBinding::bind)
-
     private lateinit var dlManager: DistributedLoadManager
+    private lateinit var homePagerAdapter: HomePageAdapter
 
     @SuppressLint("MissingSuperCall")
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         logTime(TAG_TIME_APP_START, "HomeFragment.onViewCreated()")
+        binding.clTopBar.updateLayoutParams<ConstraintLayout.LayoutParams> {
+            topMargin = activity?.let { act ->
+                QMUIStatusBarHelper.getStatusbarHeight(act)
+            } ?: 0
+        }
         dlManager = DistributedLoadManager(lifecycle, stepsLoad())
         activity?.let { dlManager.triggerDistributedLoad(it) }
     }
@@ -61,22 +89,147 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
 
     override fun initViews() {
         super.initViews()
-        binding.btnLogout.setOnClickListener {
-            logout()
+        //顶部栏控件
+        //Debug测试按钮
+        if (!AppBase.isRelease) {
+            binding.ivDebug.show()
+            binding.ivDebug.setOnClickListener {
+                activity?.let { act ->
+                    Router.build(act, Debug.Debug.PATH).start()
+                }
+            }
+        }
+        binding.ivLanguage.setOnClickListener {
+            goLanguageSetting()
+        }
+        binding.ivProfile.setOnClickListener {
+            goProfile()
         }
 
-        binding.btnImList.setOnClickListener {
-            testIMList()
+        //主内容
+        initHomeTabs()
+    }
+
+    private fun initHomeTabs() {
+        initTabs(HOME_TABS)
+        homePagerAdapter = HomePageAdapter()
+        binding.vpContent.offscreenPageLimit = 1
+        binding.vpContent.adapter = homePagerAdapter
+        binding.vpContent.isSaveEnabled = false
+        binding.vpContent.isUserInputEnabled = false
+        (binding.vpContent.getChildAt(0) as? RecyclerView)?.setItemViewCacheSize(getCount())
+        TabLayoutMediator(
+            binding.tlTab,
+            binding.vpContent,
+            true,
+            false
+        ) { tabLayout, position ->
+            tabLayout.setCustomView(R.layout.layout_main_tab_normal)
+            tabLayout.customView?.let { customView ->
+                val customBinding = LayoutMainTabNormalBinding.bind(customView)
+                val tab = getTab(position) ?: return@let
+                onConfigureTab(tab, customBinding)
+                updateTabView(
+                    tabLayout,
+                    0 == position,
+                    position
+                )
+            }
+        }.attach()
+        binding.tlTab.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
+
+            override fun onTabSelected(tab: TabLayout.Tab?) {
+                updateTabView(tab, true, tab?.position ?: 0)
+            }
+
+            override fun onTabUnselected(tab: TabLayout.Tab?) {
+                updateTabView(tab, false, tab?.position ?: 0)
+            }
+
+            override fun onTabReselected(tab: TabLayout.Tab?) {
+            }
+
+        })
+
+        setDefaultTab(tabKey = arguments?.getString(AppModule.Main.EXTRA_MAIN_TAB))
+    }
+
+    private fun goLanguageSetting() {
+        activity?.let { act ->
+            Router.build(act, Debug.Debug.PATH).start()
         }
     }
 
-    private fun logout() {
-        AccountModule.logout(true)
+    private fun goProfile() {
+        activity?.let { act ->
+            Router.build(act, Debug.Debug.PATH).start()
+        }
     }
 
-    private fun testIMList() {
-        val act = activity ?: return
-        Router.build(act, IM.SessionList.PATH).start()
+    private fun onConfigureTab(tab: Tab, binding: LayoutMainTabNormalBinding) {
+        when (tab) {
+            ONLINE_PLAY_TAB -> {
+
+            }
+
+            PC_GAME -> {
+
+            }
+
+            ACTIVITY -> {
+
+            }
+
+            else -> {}
+        }
+    }
+
+    private fun updateTabView(
+        tabView: TabLayout.Tab?,
+        isSelected: Boolean,
+        position: Int
+    ) {
+        tabView?.customView?.let {
+            val customViewBinding = LayoutMainTabNormalBinding.bind(it)
+//            customViewBinding.ivTabIcon.setImageURI(
+//                if (isSelected) {
+//                    HOME_TABS[position].selectedImage
+//                } else {
+//                    HOME_TABS[position].normalImage
+//                }
+//            )
+        }
     }
 
+    /**
+     * adb shell am start -a android.intent.action.VIEW -d "partyki://yoki/main?tab=room&&subTab=XXXX"
+     */
+    private fun setDefaultTab(tabKey: String? = "") {
+        val tab = tabKey
+        if (tab.isNullOrEmpty()) {
+            return
+        }
+        val tabIndex = HOME_TABS.indexOfFirst { it.type.tab == tab }
+        if (tabIndex != -1) {
+            binding.vpContent.setCurrentItem(tabIndex, false)
+        }
+    }
+
+    internal inner class HomePageAdapter : BaseTabFragmentStateAdapter(this) {
+        override fun getTabName(pos: Int): String {
+            return ""
+        }
+
+        override fun getItemCount(): Int {
+            return HOME_TABS.size
+        }
+
+        override fun createFragment(position: Int): Fragment {
+            val homeTab = HOME_TABS.getOrNull(position) ?: return EmptyFragment()
+            return homeTab.fragmentBuilder.invoke()
+        }
+
+    }
+
+
 }

+ 60 - 0
app/src/main/java/com/adealink/weparty/ui/home/tab/HomeTab.kt

@@ -0,0 +1,60 @@
+package com.adealink.weparty.ui.home.tab
+
+import com.adealink.frame.router.Router
+import com.adealink.weparty.commonui.BaseFragment
+import com.adealink.weparty.commonui.widget.EmptyFragment
+import com.adealink.weparty.module.activity.Activity
+import com.adealink.weparty.module.playmate.Playmate
+
+/**
+ * @param tab tab的唯一标识,可以用于deeplink跳转到指定tab
+ */
+enum class HomeTab(val tab: String, val number: Int) {
+    /**
+     * 在线陪玩
+     */
+    ONLINE_PLAY("online_play", 0),
+
+    /**
+     * PC游戏
+     */
+    PC_GAME("pc_game", 1),
+
+    /**
+     * 活动
+     */
+    ACTIVITY("activity", 2);
+
+    companion object {
+        @JvmStatic
+        fun map(number: Int): HomeTab? {
+            return entries.find { it.number == number }
+        }
+    }
+}
+
+val ONLINE_PLAY_TAB = Tab(
+    HomeTab.ONLINE_PLAY,
+) {
+    Router.getRouterInstance<BaseFragment>(Playmate.PlaymateList.PATH) ?: EmptyFragment()
+}
+
+val PC_GAME = Tab(
+    HomeTab.PC_GAME,
+) {
+    Router.getRouterInstance<BaseFragment>(Playmate.PlaymateList.PATH) ?: EmptyFragment()
+}
+
+val ACTIVITY = Tab(
+    HomeTab.ACTIVITY,
+) {
+    Router.getRouterInstance<BaseFragment>(Activity.ActivityList.PATH) ?: EmptyFragment()
+}
+
+
+/**
+ * 首页HomeTab配置
+ */
+val HOME_TABS = listOf(
+    ONLINE_PLAY_TAB, PC_GAME, ACTIVITY
+)

+ 8 - 0
app/src/main/java/com/adealink/weparty/ui/home/tab/Tab.kt

@@ -0,0 +1,8 @@
+package com.adealink.weparty.ui.home.tab
+
+import com.adealink.weparty.commonui.BaseFragment
+
+data class Tab(
+    val type: HomeTab,
+    val fragmentBuilder: () -> BaseFragment
+)

+ 36 - 0
app/src/main/java/com/adealink/weparty/ui/home/tab/TabManager.kt

@@ -0,0 +1,36 @@
+package com.adealink.weparty.ui.home.tab
+
+interface ITabManager {
+    fun initTabs(tabs: List<Tab>) {}
+
+    fun getTabs(): List<Tab> = arrayListOf()
+
+    fun getCount(): Int = 0
+
+    fun getTab(index: Int): Tab? = null
+
+    fun getTabIndex(tab: Tab): Int = 0
+}
+
+class TabManager : ITabManager {
+    private var tabs = mutableListOf<Tab>()
+
+    override fun initTabs(tabs: List<Tab>) {
+        this.tabs.clear()
+        this.tabs.addAll(tabs)
+    }
+
+    override fun getTabs() = tabs
+
+    override fun getCount(): Int {
+        return tabs.size
+    }
+
+    override fun getTab(index: Int): Tab? {
+        return if (index in tabs.indices) tabs[index] else null
+    }
+
+    override fun getTabIndex(tab: Tab): Int {
+        return tabs.indexOf(tab)
+    }
+}

binární
app/src/main/res/drawable-xhdpi/common_app_language_ic.png


binární
app/src/main/res/drawable-xhdpi/common_app_logo_ic.png


binární
app/src/main/res/drawable-xhdpi/common_app_profile_ic.png


binární
app/src/main/res/drawable-xhdpi/common_app_top_bg_ic.png


binární
app/src/main/res/drawable-xhdpi/common_debug_ic.png


binární
app/src/main/res/drawable-xhdpi/common_diamond_16_ic.png


binární
app/src/main/res/drawable-xhdpi/common_diamond_32_ic.png


binární
app/src/main/res/drawable-xhdpi/common_diamond_64_ic.png


binární
app/src/main/res/drawable-xhdpi/common_evaluate_star_disable_ic.png


binární
app/src/main/res/drawable-xhdpi/common_evaluate_star_ic.png


binární
app/src/main/res/drawable-xhdpi/common_filter_ic.png


binární
app/src/main/res/drawable-xhdpi/common_find_partner_bg.9.png


binární
app/src/main/res/drawable-xhdpi/common_find_your_partner_ic.png


binární
app/src/main/res/drawable-xhdpi/common_gender_female_bg.9.png


binární
app/src/main/res/drawable-xhdpi/common_gender_male_bg.9.png


binární
app/src/main/res/drawable-xhdpi/common_location_ic.png


binární
app/src/main/res/drawable-xhdpi/common_playmate_bubble_bg.9.png


binární
app/src/main/res/drawable-xhdpi/common_voice_summary_ic.png


+ 7 - 0
app/src/main/res/drawable/common_evaluate_view_divider.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <size
+        android:width="4dp"
+        android:height="4dp" />
+</shape>

+ 8 - 0
app/src/main/res/layout/activity_debug.xml

@@ -56,6 +56,14 @@
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:text="切换账号" />
+
+                    <androidx.appcompat.widget.AppCompatButton
+                        android:id="@+id/btn_logout"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="登出"
+                        android:textColor="@color/color_red_4" />
+
                 </androidx.appcompat.widget.LinearLayoutCompat>
 
 

+ 63 - 32
app/src/main/res/layout/fragment_home.xml

@@ -4,23 +4,76 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:background="@color/color_FFF1F2F5"
     tools:context=".ui.home.HomeFragment">
 
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/cl_top"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
+    <androidx.appcompat.widget.AppCompatImageView
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        app:layout_constraintDimensionRatio="375:173"
         app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:srcCompat="@drawable/common_app_top_bg_ic" />
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_top_bar"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content">
+        android:layout_height="wrap_content"
+        android:paddingTop="16dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_logo"
+            android:layout_width="60dp"
+            android:layout_height="22dp"
+            android:layout_marginStart="16dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:srcCompat="@drawable/common_app_logo_ic" />
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_debug"
+            android:layout_width="30dp"
+            android:layout_height="30dp"
+            android:layout_marginEnd="14dp"
+            android:visibility="gone"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@id/iv_language"
+            app:layout_constraintTop_toTopOf="parent"
+            app:srcCompat="@drawable/common_debug_ic"
+            tools:visibility="visible" />
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_language"
+            android:layout_width="30dp"
+            android:layout_height="30dp"
+            android:layout_marginEnd="14dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@id/iv_profile"
+            app:layout_constraintTop_toTopOf="parent"
+            app:srcCompat="@drawable/common_app_language_ic" />
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_profile"
+            android:layout_width="30dp"
+            android:layout_height="30dp"
+            android:layout_marginEnd="20dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:srcCompat="@drawable/common_app_profile_ic" />
 
     </androidx.constraintlayout.widget.ConstraintLayout>
-    
+
     <com.google.android.material.tabs.TabLayout
         android:id="@+id/tl_tab"
         android:layout_width="match_parent"
-        android:layout_height="54dp"
-        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_height="wrap_content"
+        app:layout_constraintTop_toBottomOf="@id/cl_top_bar"
         app:tabBackground="@null"
         app:tabIndicatorHeight="0dp"
         app:tabMode="fixed"
@@ -28,34 +81,12 @@
 
     <androidx.viewpager2.widget.ViewPager2
         android:id="@+id/vp_content"
-        android:layout_width="match_parent"
+        android:layout_width="0dp"
         android:layout_height="0dp"
-        app:layout_constraintBottom_toTopOf="@+id/tl_tab"
-        app:layout_constraintTop_toTopOf="parent" />
-
-
-    <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent">
-
-        <Button
-            android:id="@+id/btn_logout"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="登出" />
-
-        <Button
-            android:id="@+id/btn_im_list"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="IM会话列表" />
-
-    </LinearLayout>
+        app:layout_constraintTop_toBottomOf="@id/tl_tab" />
 
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 26 - 0
app/src/main/res/layout/layout_gender_view.xml

@@ -0,0 +1,26 @@
+<?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"
+    android:background="@drawable/common_gender_female_bg"
+    tools:layout_height="15dp"
+    tools:layout_width="wrap_content"
+    tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_age"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="14.5dp"
+        android:includeFontPadding="false"
+        android:paddingEnd="3.5dp"
+        android:textColor="@color/white"
+        android:textSize="14sp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="20" />
+
+</merge>

+ 35 - 0
app/src/main/res/layout/layout_main_tab_normal.xml

@@ -0,0 +1,35 @@
+<?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="wrap_content">
+
+    <!--暂时不支持换肤-->
+    <com.adealink.frame.image.view.NetworkImageView
+        android:id="@+id/iv_tab_icon"
+        android:layout_width="54dp"
+        android:layout_height="54dp"
+        android:layout_marginTop="0dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <Space
+        android:id="@+id/space"
+        android:layout_width="2dp"
+        android:layout_height="2dp"
+        android:layout_marginTop="11dp"
+        android:layout_marginEnd="12dp"
+        app:layout_constraintEnd_toEndOf="@+id/iv_tab_icon"
+        app:layout_constraintTop_toTopOf="@+id/iv_tab_icon" />
+
+    <com.adealink.frame.dot.DotView
+        android:id="@+id/tab_dot_view"
+        style="@style/CommonRedDot"
+        app:layout_constraintBottom_toBottomOf="@+id/space"
+        app:layout_constraintEnd_toEndOf="@+id/space"
+        app:layout_constraintStart_toStartOf="@+id/space"
+        app:layout_constraintTop_toTopOf="@+id/space" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

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

@@ -1207,4 +1207,9 @@
     <color name="color_FFFFC1DD">#FFFFC1DD</color>
     <color name="color_FF002280">#FF002280</color>
     <color name="color_FF65010D">#FF65010D</color>
+    <color name="color_FF1B1919">#FF1B1919</color>
+    <color name="color_FF4E5969">#FF4E5969</color>
+    <color name="color_FF3FBFBD">#FF3FBFBD</color>
+    <color name="color_FF8E8E8E">#FF8E8E8E</color>
+    <color name="color_FFF1F2F5">#FFF1F2F5</color>
 </resources>

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

@@ -4,6 +4,8 @@
     <string name="module_account" translatable="false">Account</string>
     <string name="module_profile" translatable="false">profile</string>
     <string name="module_im" translatable="false">IM</string>
+    <string name="module_playmate" translatable="false">playmate</string>
+    <string name="module_activity" translatable="false">activity</string>
     <string name="common_create">Create</string>
     <string name="common_send">Send</string>
     <string name="common_sending">Sending</string>
@@ -230,5 +232,7 @@
     <string name="image_select_room_cover_select_gif_tip">%1$s Gold ≥80M room open GIF upload privilege (subject to review)</string>
     <string name="image_select_avatar_select_gif_tip">%1$s level ≥50 open GIF upload privilege (subject to review)</string>
     <string name="image_select_room_cover_family">%1$s You have obtained the privilege to upload room animations during family activities (requires review), and the privilege will expire in %2$s. Free upload permission 2 times a week, if more than that, you need to pay additional gold coins</string>
-
+    <string name="common_score_rank_filter_to_low">评分高到低</string>
+    <string name="common_score_rank_filter_to_high">评分低到高</string>
+    <string name="common_find_your_partner">Find your partner</string>
 </resources>

+ 6 - 1
app/src/main/res/values/styles.xml

@@ -141,7 +141,6 @@
         <item name="android:includeFontPadding">false</item>
     </style>
 
-
     <!-- 透明弹窗主题 -->
     <style name="TransparentDialogTheme" parent="Theme.AppCompat.Dialog">
         <item name="android:windowBackground">@android:color/transparent</item>
@@ -152,4 +151,10 @@
         <item name="android:windowIsFloating">true</item>
         <item name="windowActionBar">false</item>
     </style>
+
+    <style name="CommonGenderView">
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">15dp</item>
+        <item name="android:minWidth">28dp</item>
+    </style>
 </resources>

+ 2 - 0
app/src/main/resources/META-INF/services/com.adealink.frame.router.IRouterInit

@@ -2,3 +2,5 @@ com.adealink.frame.router.RouterInit_app
 com.adealink.frame.router.RouterInit_module_account
 com.adealink.frame.router.RouterInit_module_profile
 com.adealink.frame.router.RouterInit_module_im
+com.adealink.frame.router.RouterInit_module_playmate
+com.adealink.frame.router.RouterInit_module_activity

binární
module/account/src/main/res/drawable-xhdpi/account_area_code_arrow_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_birthday_arrow_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_cancel_icon_tip.webp


binární
module/account/src/main/res/drawable-xhdpi/account_checked_green_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_country_search_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_email_bind_next_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_email_content_clear_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_email_forget_help_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_email_hight_risk_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_email_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_email_list_close_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_email_list_open_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_email_low_risk.webp


binární
module/account/src/main/res/drawable-xhdpi/account_email_pwd_see.webp


binární
module/account/src/main/res/drawable-xhdpi/account_email_pwd_see_no.webp


binární
module/account/src/main/res/drawable-xhdpi/account_eye_close_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_eye_open_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_fb_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_fb_icon.webp


binární
module/account/src/main/res/drawable-xhdpi/account_fb_login_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_female_selected_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_female_unselected_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_gender_checked_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_gender_select_default_avatar.webp


binární
module/account/src/main/res/drawable-xhdpi/account_google_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_icon_no_protection.webp


binární
module/account/src/main/res/drawable-xhdpi/account_last_login_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_login_apple.webp


binární
module/account/src/main/res/drawable-xhdpi/account_login_feedback_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_login_top_icon.png


binární
module/account/src/main/res/drawable-xhdpi/account_male_selected_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_male_unselected_ic.webp


binární
module/account/src/main/res/drawable-xhdpi/account_tiktok_login_ic.webp


+ 0 - 98
module/account/src/main/res/values-in/strings.xml

@@ -1,101 +1,3 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-    <string name="account_gender_can_not_modify">Gender tidak dapat diubah setelah seleksi</string>
-    <string name="account_choose_country">Pilih [Negara/Wilayah]</string>
-    <string name="account_login_banned">Halo, akun kamu memiliki %1$s pelanggaran dan dilarang masuk %2$s. Kamu dapat mengklik \"OK\" untuk mengajukan banding.</string>
-    <string name="account_fb">Facebook</string>
-    <string name="account_sign_up_or_login">Daftar/masuk</string>
-    <string name="account_enter_your_phone">Masukkan nomor ponsel</string>
-    <string name="account_country_not_support">Belum tersedia di negara ini</string>
-    <string name="account_auth_error">Otorisasi gagal, silakan coba metode login lainnya atau coba lagi setelah terhubung ke VPN</string>
-    <string name="account_login_with_invalid_device_id">Nonaktifkan login perangkat yang tidak valid</string>
-    <string name="account_google">Google</string>
-    <string name="account_register_limit">Hanya 3 akun yang dapat didaftarkan pada satu perangkat</string>
-    <string name="account_password_frequently_error">Kata sandi terlalu sering salah, silakan coba lagi nanti.</string>
-    <string name="account_password_error">Kata sandi salah</string>
-    <string name="account_enter_password_tip">Silakan masukkan kata sandi</string>
-    <string name="account_invalid_verify_code">Kode verifikasi tidak valid</string>
-    <string name="account_server_auth_failed">Otorisasi pihak ketiga gagal, coba lagi</string>
-    <string name="account_login_virtual_apk">Dilarang login beberapa aplikasi</string>
-    <string name="account_phone">Telepon selular</string>
-    <string name="account_kick_off">Akun Yoki Kamu masuk menggunakan %1$s di perangkat lain. Jika itu bukan operasi Kamu, harap segera periksa apakah akun %2$s telah dicuri.</string>
-    <string name="account_privacy_policy">Kebijakan pribadi</string>
-    <string name="account_password">Kata sandi</string>
-    <string name="account_copy_device_id_success">ID Perangkat disalin</string>
-    <string name="account_banned">Akun Kamu telah diblokir</string>
-    <string name="account_copy_device_id_fail">Gagal mendapatkan ID perangkat</string>
-    <string name="account_login_net_error">Kelainan jaringan, silakan periksa jaringan</string>
-    <string name="account_feedback">Masukan</string>
-    <string name="account_set_password">Mengatur kata sandi</string>
-    <string name="account_resend">Kirim ulang</string>
-    <string name="account_choose_gender">Silakan pilih jenis kelamin Kamu</string>
-    <string name="account_choose_birthday">Kapan ulang tahunmu?</string>
-    <string name="account_female">Perempuan</string>
-    <string name="account_forget_password">Lupa kata sandi</string>
-    <string name="account_next">Langkah berikutnya</string>
-    <string name="account_friend_recommend">Rekomendasi teman</string>
-    <string name="account_male">Pria</string>
-    <string name="account_send">Mengirim</string>
-    <string name="account_login_common_failed">Jaringan tidak normal, silakan ganti jaringan dan coba lagi</string>
-    <string name="account_login">Gabung</string>
-    <string name="account_confirm_phone_right">Harap konfirmasi apakah nomor ponsel sudah benar?\n\n%s</string>
-    <string name="account_user_agreement_tips">Dengan masuk, Kamu menyetujui %1$s dan %2$s</string>
-    <string name="account_resend_left_time">Kirim ulang %ss</string>
-    <string name="account_service_terms">Ketentuan Layanan</string>
-    <string name="account_enter_verify_code">Masukkan kode verifikasi</string>
-    <string name="account_finish">Menyelesaikan</string>
-    <string name="account_server_op_failed">Operasi gagal, silakan coba lagi</string>
-    <string name="account_send_verify_code">Kirim kode verifikasi</string>
-    <string name="account_token_expire">Informasi login tidak valid, silakan login lagi</string>
-    <string name="account_password_input_tip">Silakan atur kata sandi 6-12 digit</string>
-    <string name="account_server_exception">Kesalahan layanan, silakan coba lagi</string>
-    <string name="account_verfiy_code_limit">Kode verifikasi yang dikirim mencapai batas hari ini</string>
-    <string name="account_login_email">Login Email</string>
-    <string name="account_login_email_hint">Masukkan email Anda</string>
-    <string name="account_login_confirm">Login</string>
-    <string name="account_login_forget">Lupa kata sandi</string>
-    <string name="account_login_email_bind">Pengikatan Email</string>
-    <string name="account_login_email_input">Masukkan Email Anda</string>
-    <string name="account_login_email_input_hint">Silakan masukkan informasi email Anda untuk mengikat</string>
-    <string name="account_login_email_set_password">Tetapkan kata sandi</string>
-    <string name="account_login_email_set_password_warn">Berisi huruf dan angka, tidak kurang dari 6 digit dan tidak lebih dari 12 digit</string>
-    <string name="account_login_email_froget_account_point">Silakan masukkan akun email Anda yang terikat</string>
-    <string name="account_email_account_reminder">Pengingat Akun</string>
-    <string name="account_email_account_unbind_hint">Ikat lebih banyak cara login, yang dapat digunakan untuk login guna menghindari kehilangan akun</string>
-    <string name="account_email_account_bind_hint">Akun yang telah terikat dapat digunakan untuk login</string>
-    <string name="account_email_str">Email</string>
-    <string name="account_email_bind_state_no_bind">Tidak Terikat</string>
-    <string name="account_email_bind_unbind">Lepaskan Ikatan</string>
-    <string name="account_email_account_binding">Pengikatan Akun</string>
-    <string name="account_email_binding">Pengikatan Akun</string>
-    <string name="account_email_dialog_unbind_tips">Apakah Anda yakin ingin melepaskan ikatan email Anda?</string>
-    <string name="account_email_verify_code_hint">Masukkan kode 6 digit</string>
-    <string name="account_email_bind_state_bind"> Pengikatan</string>
-    <string name="account_email_bind_success">Pengikatan email berhasil</string>
-    <string name="account_email_device_limit">Pengoperasian perangkat terbatas</string>
-    <string name="account_phone_password_confirm_password_no_valid">Kedua kata sandi yang dimasukkan tidak cocok</string>
-    <string name="account_enter_password">Masukkan Kata Sandi</string>
-    <string name="account_enter_password_again">Masukkan Kata Sandi lagi</string>
-    <string name="account_login_email_title">Login Email&amp; Kata Sandi</string>
-    <string name="account_login_email_prompt">Masukkan email dan kata sandi yang Anda masukkan ke dalam Pengikatan Email %s</string>
-    <string name="account_login_account_prompt">Email yang Anda Masukkan ke dalam %s</string>
-    <string name="account_login_password_prompt">Kata Sandi untuk Pengikatan Email</string>
-    <string name="account_login_email_password">Login Email &amp; Kata Sandi</string>
-    <string name="account_login_email_code">Login Email &amp; Kode Verifikasi</string>
-    <string name="account_login_email_code_prompt">Anda harus memasukkan email yang digunakan oleh Google Anda. Email ini mungkin bukan email yang Anda gunakan dalam Pengikatan Email %s</string>
-    <string name="account_login_account_google_prompt">Email yang Digunakan Oleh Google Anda</string>
-    <string name="account_login_account_google_code_prompt">Kode Verifikasi</string>
-    <string name="account_login_send_code_dialog_prompt">%s telah mengirimkan kode verifikasi ke %s Anda dapat memeriksanya di email ini, kode verifikasi berlaku dalam waktu 10 menit.</string>
-    <string name="account_login_email_account_hint">Masukkan email yang Anda ikat di %s</string>
-    <string name="account_login_email_password_hint">Kata sandi untuk Pengikatan Email</string>
-    <string name="account_login_email_account_google_hint">Masukkan email</string>
-    <string name="account_login_failed_prompt">Kata sandi Anda mengandung huruf dan angka, dan panjangnya antara 6 dan 12 digit</string>
-    <string name="account_email_bind_title">Pengaturan Email</string>
-    <string name="account_email_password_title">Pengaturan Kata Sandi</string>
-    <string name="account_email_unregister">Email belum terdaftar, tidak dapat masuk</string>
-    <string name="account_email_deRegister">Akun telah dibatalkan, untuk sementara tidak dapat masuk</string>
-    <string name="account_email_banned">Akun telah diblokir, untuk sementara tidak dapat masuk</string>
-    <string name="account_select_account_mes">Akun Facebook Anda %1$s %2$s telah membuat 2 akun berikut, silakan pilih akun yang ingin Anda login</string>
-    <string name="account_select_account_title">Masuk dengan Facebook</string>
-    <string name="account_last_used">Terakhir digunakan</string>
 </resources>

+ 0 - 145
module/account/src/main/res/values-zh/strings.xml

@@ -1,148 +1,3 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-   <string name="account_login_net_error">网络异常,请检查网络</string>
-   <string name="account_auth_error">授权失败,请尝试其他登录方式或连接vpn后重试</string>
-   <string name="account_user_agreement_tips">登录即表示您同意%1$s和%2$s。</string>
-   <string name="account_privacy_policy">隐私政策</string>
-   <string name="account_service_terms">服务条款</string>
-   <string name="account_fb">Facebook</string>
-   <string name="account_google">Google</string>
-   <string name="account_phone">手机</string>
-   <string name="account_choose_gender">请选择你的性别</string>
-   <string name="account_choose_birthday">请选择你的生日</string>
-   <string name="account_female">女</string>
-   <string name="account_male">男</string>
-   <string name="account_finish">完成</string>
-   <string name="account_gender_can_not_modify">性别选择后不可修改</string>
-   <string name="account_next">下一步</string>
-   <string name="account_friend_recommend">可能跟你聊得来的朋友</string>
-   <string name="account_kick_off">你的Yoki账号在另一台设备上用%1$s登陆,如果不是你的操作,请立刻查看%2$s账号是否被盗.</string>
-   <string name="account_token_expire">登录信息失效,请重新登录</string>
-   <string name="account_banned">你的账号被封禁了</string>
-   <string name="account_feedback">反馈</string>
-   <string name="account_register_limit">一个设备只能注册3个账号</string>
-   <string name="account_server_auth_failed">第三方授权失败, 请重试</string>
-   <string name="account_server_op_failed">操作失败,请重试</string>
-   <string name="account_server_exception">服务异常,请重试</string>
-   <string name="account_login_common_failed">网络异常, 请切换网络重试</string>
-   <string name="account_login_banned">你好,你的账号存在%1$s类违规,已被限制登录%2$s,可以点击“确定”申诉</string>
-   <string name="account_enter_your_phone">输入手机号</string>
-   <string name="account_sign_up_or_login">注册/登录</string>
-   <string name="account_login">登录</string>
-   <string name="account_enter_password_tip">请输入密码</string>
-   <string name="account_password">请输入密码</string>
-   <string name="account_forget_password">忘记密码?</string>
-   <string name="account_enter_verify_code">输入验证码</string>
-   <string name="account_send_verify_code">发送验证码到</string>
-   <string name="account_set_password">设置密码</string>
-   <string name="account_password_input_tip">请设置6-12位的密码</string>
-   <string name="account_confirm_phone_right">请确认手机号是否正确?\n\n%1$s</string>
-   <string name="account_send">发送</string>
-   <string name="account_resend">重发</string>
-   <string name="account_resend_left_time">重发 %1$ss</string>
-   <string name="account_choose_country">选择[国家/地区]</string>
-   <string name="account_invalid_verify_code">验证码无效</string>
-   <string name="account_password_error">密码错误</string>
-   <string name="account_password_frequently_error">密码错误太频繁, 请稍后重试</string>
-   <string name="account_verfiy_code_limit">验证码发送到达今日上限</string>
-   <string name="account_country_not_support">国家暂不支持</string>
-   <string name="account_login_with_invalid_device_id">禁止无效设备登录</string>
-   <string name="account_login_virtual_apk">禁止多开应用登录</string>
-   <string name="account_copy_device_id_success">已复制设备ID至粘贴板</string>
-   <string name="account_copy_device_id_fail">设备ID获取失败</string>
-   <string name="account_login_email">邮箱登录</string>
-   <string name="account_login_email_hint">输入邮箱</string>
-   <string name="account_login_confirm">登录</string>
-   <string name="account_login_forget">忘记密码</string>
-   <string name="account_login_email_bind">邮箱绑定</string>
-   <string name="account_login_email_input">输入邮箱</string>
-   <string name="account_login_email_input_hint">请输入要绑定的邮箱信息</string>
-   <string name="account_login_email_set_password">设置密码</string>
-   <string name="account_login_email_set_password_warn">包含字母和数字,不少于6位且不超过12位</string>
-   <string name="account_login_email_froget_account_point">请输入您绑定的邮箱账号</string>
-   <string name="account_email_account_reminder">账号提醒</string>
-   <string name="account_email_account_unbind_hint">绑定更多登录方式,可用于登录,避免账号丢失</string>
-   <string name="account_email_account_bind_hint">已绑定的账号可用于登录</string>
-   <string name="account_email_str">邮箱</string>
-   <string name="account_email_bind_state_no_bind">未绑定</string>
-   <string name="account_email_bind_unbind">解除绑定</string>
-   <string name="account_email_account_binding">账号绑定</string>
-   <string name="account_email_binding">账户绑定</string>
-   <string name="account_email_dialog_unbind_tips">您确定要解除邮箱吗?</string>
-   <string name="account_email_verify_code_hint">输入6位验证码</string>
-   <string name="account_email_bind_state_bind">绑定</string>
-   <string name="account_email_bind_success">邮箱绑定成功</string>
-   <string name="account_email_device_limit">设备操作受限</string>
-   <string name="account_phone_password_confirm_password_no_valid">两次输入的密码不匹配</string>
-   <string name="account_enter_password">输入密码</string>
-   <string name="account_enter_password_again">再次输入密码</string>
-   <string name="account_login_email_title">邮箱和密码登录</string>
-   <string name="account_login_email_prompt">输入您在 %1$s 邮箱绑定中绑定的邮箱和密码</string>
-   <string name="account_login_account_prompt">您在 %1$s 中绑定的邮箱</string>
-   <string name="account_login_password_prompt">邮箱绑定的密码</string>
-   <string name="account_login_email_password">邮箱密码登录</string>
-   <string name="account_login_email_code">邮箱和验证码登录</string>
-   <string name="account_login_email_code_prompt">请输入您 Google 使用的邮箱。此邮箱可能不是您在 %1$s 邮箱绑定中使用的邮箱</string>
-   <string name="account_login_account_google_prompt">您的 Google 邮箱</string>
-   <string name="account_login_account_google_code_prompt">验证码</string>
-   <string name="account_login_send_code_dialog_prompt">%1$s 已向 %2$s 发送验证码,您可以在此邮件中查看,验证码 10 分钟内有效。</string>
-   <string name="account_login_email_account_hint">输入您在 %1$s 中绑定的邮箱</string>
-   <string name="account_login_email_password_hint">邮箱绑定的密码</string>
-   <string name="account_login_email_account_google_hint">输入邮箱</string>
-   <string name="account_login_failed_prompt">您的密码包含字母和数字,长度在6到12位之间</string>
-   <string name="account_email_bind_title">邮箱设置</string>
-   <string name="account_email_password_title">密码设置</string>
-   <string name="account_email_unregister">邮箱尚未注册,无法登录</string>
-   <string name="account_email_deRegister">账号已注销,暂时无法登录</string>
-   <string name="account_email_banned">账号已被封禁,暂时无法登录</string>
-   <string name="account_select_account_mes">您的 Facebook 帐户 %1$s %2$s 已创建以下 2 个帐户,请选择您要登录的帐户</string>
-   <string name="account_select_account_title">使用 Facebook 登录</string>
-   <string name="account_last_used">上次使用</string>
-   <string name="account_bind_phone_number_tips">当前绑定的手机号:%1$s</string>
-   <string name="account_phone_binding">手机绑定</string>
-   <string name="account_mobile_bind_title">手机绑定</string>
-   <string name="account_user_notices_list">1、账号一旦注销,便无法再恢复使用。注销成功后,您将失去登录、操作该账号的权限,同时该账号内所有的内容、消息和资产也都将无法找回,重新注册只能得到一个全新账号;\n2、您主动选择注销账号即表示自愿放弃与之相关的一切权益,包括个人信息、发布内容、金币、钻石,以及VIP、财富等级、魅力等级等虚拟资产权益;\n3、在注销处理期间,若发现您的账号存在未解决的争议或纠纷(例如投诉、举报或涉嫌违反法律法规等),我们有权拒绝继续注销,而无需再次征求您的同意;\n4、注销流程结束后,Yoki APP将依据法律规定对您的个人信息进行处理,可能会予以删除或匿名化,除非相关法规另有要求。</string>
-   <string name="account_enter_old_password">请输入您的旧密码</string>
-   <string name="account_delete_dialog_tips">确定删除账号?若删除账号,您的所有数据将被清除,永久无法登录,请谨慎操作!!!</string>
-   <string name="account_enter_your_passowrd">请输入您的密码</string>
-   <string name="account_no_protection">没有保护</string>
-   <string name="account_delete_btn">删除账户</string>
-   <string name="account_upload_avatar_tips">上传您最好的自拍照,让交友更轻松</string>
-   <string name="account_bind_phone_first">请先绑定您的手机号</string>
-   <string name="account_delete_title">账户注销</string>
-   <string name="account_send_to_phone_tips">验证码已发送至您的手机</string>
-   <string name="account_length_tips">昵称不能超过28个字符</string>
-   <string name="account_toast_birthday">请选择你的生日</string>
-   <string name="account_toast_nickname">请输入昵称</string>
-   <string name="account_paassword_modification">修改密码</string>
-   <string name="account_toast_country">请选择您的国家</string>
-   <string name="account_management">帐户管理</string>
-   <string name="account_and_security">帐户和安全</string>
-   <string name="account_toast_nickname_illegal">昵称包含非法符号,请修改并保存</string>
-   <string name="account_send_to_whatsapp_tips">验证码已发送至 WhatsApp</string>
-   <string name="account_complete_information_title">完善信息</string>
-   <string name="account_toast_gender">请确认您的性别</string>
-   <string name="account_enter_new_password">请输入您的新密码</string>
-   <string name="account_date_of_birth">生日</string>
-   <string name="account_login_name_input">输入您的姓名</string>
-   <string name="account_password_setting">密码设置</string>
-   <string name="account_toast_gender_tips">注册后性别不可更改。</string>
-   <string name="account_user_id">用户身份</string>
-   <string name="account_enter_your_passowrd_again">请再次输入您的密码</string>
-   <string name="account_phone_has_bind">该电话号码已经绑定。</string>
-   <string name="account_mobile_login_tips">未注册的手机号码将自动注册</string>
-   <string name="account_change_mobile_phone">更换手机</string>
-   <string name="account_mobile_bind_tips">为了保证您的账户安全,请尽快绑定您的手机号码。</string>
-   <string name="account_user_notices">用户须知</string>
-   <string name="account_mobile_login_title">手机登录</string>
-   <string name="account_toast_avatar">请上传头像</string>
-   <string name="account_binding">账户绑定</string>
-   <string name="account_delete_tips">尊敬的 %1$s,您即将开始账户注销流程</string>
-   <string name="account_change">修改</string>
-   <string name="account_user_agreement_tips_new">登录即表示您同意</string>
-   <string name="account_child_policy">儿童安全政策</string>
-   <string name="account_electronic_visa">电子签名协议</string>
-   <string name="account_separator">、</string>
-   <string name="task_bind_phone_tips">完成手机绑定+%1$s</string>
-   <string name="account_nation">出生地</string>
 </resources>

+ 0 - 17
module/account/src/main/res/values/style.xml

@@ -1,20 +1,3 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources xmlns:tools="http://schemas.android.com/tools">
-    <attr name="showKeyBoard" format="boolean" />
-    <attr name="passwordHint" format="string" />
-    <attr name="buttonText" format="string" />
-    <attr name="textSize" format="dimension" />
-    <attr name="hintTextColor" format="integer" />
-    <attr name="fontFamily" format="reference" />
-    <declare-styleable name="PasswordInputLayout" tools:ignore="ResourceName">
-        <attr name="showKeyBoard" />
-        <attr name="passwordHint" />
-        <attr name="background" />
-        <attr name="textSize" />
-        <attr name="hintTextColor" />
-        <attr name="fontFamily"/>
-    </declare-styleable>
-    <declare-styleable name="AccountLoginButton" tools:ignore="ResourceName">
-        <attr name="buttonText" />
-    </declare-styleable>
 </resources>

+ 1 - 0
module/activity/.gitignore

@@ -0,0 +1 @@
+/build

+ 56 - 0
module/activity/build.gradle

@@ -0,0 +1,56 @@
+plugins {
+    id 'com.android.dynamic-feature'
+    id 'org.jetbrains.kotlin.android'
+    id 'org.jetbrains.kotlin.kapt'
+    id 'kotlin-parcelize'
+}
+
+android {
+    namespace 'com.adealink.weparty.activity'
+    compileSdk libs.versions.compileSdk.get().toInteger()
+
+    defaultConfig {
+        minSdk libs.versions.minSdk.get().toInteger()
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+        consumerProguardFiles "consumer-rules.pro"
+        javaCompileOptions {
+            annotationProcessorOptions {
+                arguments += [
+                        "room.schemaLocation"  : "$projectDir/schemas".toString(),
+                        "room.incremental"     : "true",
+                        "room.expandProjection": "true"]
+            }
+        }
+    }
+
+
+
+    buildTypes {
+        release {
+            debuggable false
+        }
+    }
+    viewBinding {
+        enabled = true
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_17
+        targetCompatibility JavaVersion.VERSION_17
+    }
+
+    kotlinOptions {
+        jvmTarget = JavaVersion.VERSION_17.majorVersion
+    }
+}
+
+dependencies {
+    implementation project(":app")
+    //frame
+    kapt libs.frame.router.compiler
+
+    //test
+    testImplementation libs.junit
+    androidTestImplementation libs.androidx.junit
+    androidTestImplementation libs.androidx.espresso.core
+}

+ 0 - 0
module/activity/consumer-rules.pro


+ 21 - 0
module/activity/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 70 - 0
module/activity/src/main/AndroidManifest.xml

@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:dist="http://schemas.android.com/apk/distribution"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="LockedOrientationActivity">
+
+    <dist:module
+        dist:instant="false"
+        dist:title="@string/module_profile">
+        <dist:fusing dist:include="true" />
+        <dist:delivery>
+            <dist:install-time>
+                <dist:removable dist:value="true" />
+            </dist:install-time>
+        </dist:delivery>
+    </dist:module>
+
+    <application>
+        <activity
+            android:name=".userprofile.NewUserProfileActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme" />
+        <activity
+            android:name=".edit.EditProfileActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme"
+            android:windowSoftInputMode="stateVisible|adjustPan" />
+        <activity
+            android:name=".userprofile.ProfileCoverPreviewActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme" />
+        <activity
+            android:name=".photoselect.UserPhotoSelectActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme" />
+        <activity
+            android:name=".edit.EditNickNameActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme" />
+        <activity
+            android:name=".audioauth.VoiceAuthActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme" />
+        <activity
+            android:name=".job.SelectJobActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme" />
+        <activity
+            android:name=".edit.EditPersonProfileActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme" />
+        <activity
+            android:name=".country.CountrySelectActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme" />
+        <activity
+            android:name=".certification.CertificationActivity"
+            android:launchMode="singleTask"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme" />
+        <activity
+            android:name=".privacyalbum.view.PrivacyAlbumEditActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme" />
+        <activity
+            android:name=".privacyalbum.view.PrivacyAlbumActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme" />
+    </application>
+</manifest>

+ 21 - 0
module/activity/src/main/java/com/adealink/weparty/activity/ActivityServiceImpl.kt

@@ -0,0 +1,21 @@
+package com.adealink.weparty.activity
+
+import com.adealink.frame.spi.RegisterService
+import com.adealink.weparty.App
+import com.adealink.weparty.activity.datasource.remote.ActivityHttpService
+import com.adealink.weparty.module.activity.IActivityService
+import com.adealink.weparty.module.playmate.IPlaymateService
+
+@RegisterService(IActivityService::class)
+class ActivityServiceImpl : IActivityService {
+
+    private val activityHttpService by lazy {
+        App.instance.networkService.getHttpService(ActivityHttpService::class.java)
+    }
+
+
+    override fun getService(): IActivityService {
+        return this
+    }
+
+}

+ 17 - 0
module/activity/src/main/java/com/adealink/weparty/activity/datasource/local/ActivityLocalService.kt

@@ -0,0 +1,17 @@
+package com.adealink.weparty.activity.datasource.local
+
+import android.content.Context
+import com.adealink.frame.storage.sp.TypeDelegationPrefs
+import com.adealink.frame.util.AppUtil
+import com.adealink.weparty.module.profile.ProfileModule
+
+object ActivityLocalService : TypeDelegationPrefs(
+    prefs = {
+        AppUtil.appContext.getSharedPreferences("pref_activity", Context.MODE_PRIVATE)
+    },
+    userId = {
+        ProfileModule.getMyUid().toString()
+    }
+) {
+
+}

+ 5 - 0
module/activity/src/main/java/com/adealink/weparty/activity/datasource/remote/ActivityHttpService.kt

@@ -0,0 +1,5 @@
+package com.adealink.weparty.activity.datasource.remote
+
+interface ActivityHttpService {
+
+}

+ 15 - 0
module/activity/src/main/java/com/adealink/weparty/activity/list/ActivityHomeListFragment.kt

@@ -0,0 +1,15 @@
+package com.adealink.weparty.activity.list
+
+import com.adealink.frame.router.annotation.RouterUri
+import com.adealink.weparty.activity.R
+import com.adealink.weparty.commonui.BaseFragment
+import com.adealink.weparty.module.activity.Activity
+
+@RouterUri(path = [Activity.ActivityList.PATH], desc = "首页活动列表")
+class ActivityHomeListFragment : BaseFragment(R.layout.fragment_activity_home_list) {
+
+    override fun initViews() {
+        super.initViews()
+    }
+
+}

+ 9 - 0
module/activity/src/main/java/com/adealink/weparty/activity/viewmodel/ActivityViewModel.kt

@@ -0,0 +1,9 @@
+package com.adealink.weparty.activity.viewmodel
+
+import com.adealink.frame.mvvm.viewmodel.BaseViewModel
+import com.adealink.weparty.module.activity.viewmodel.IActivityViewModel
+import com.adealink.weparty.module.playmate.viewmodel.IPlaymateViewModel
+
+class ActivityViewModel : BaseViewModel(), IActivityViewModel {
+
+}

+ 21 - 0
module/activity/src/main/java/com/adealink/weparty/activity/viewmodel/ActivityViewModelFactory.kt

@@ -0,0 +1,21 @@
+package com.adealink.weparty.activity.viewmodel
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+
+@Suppress("UNCHECKED_CAST")
+class ActivityViewModelFactory : ViewModelProvider.NewInstanceFactory() {
+
+    override fun <T : ViewModel> create(modelClass: Class<T>): T {
+        return with(modelClass) {
+            when {
+                isAssignableFrom(ActivityViewModel::class.java) ->
+                    ActivityViewModel()
+
+                else ->
+                    throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}")
+            } as T
+        }
+    }
+
+}

+ 34 - 0
module/activity/src/main/res/layout/fragment_activity_home_list.xml

@@ -0,0 +1,34 @@
+<?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">
+
+    <include
+        android:id="@+id/v_list_top"
+        layout="@layout/layout_activity_home_list_top"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <include
+        android:id="@+id/v_list_filter"
+        layout="@layout/layout_activity_home_list_filter"
+        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/v_list_top" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/v_list"
+        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/v_list_filter" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 103 - 0
module/activity/src/main/res/layout/layout_activity_home_list_filter.xml

@@ -0,0 +1,103 @@
+<?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="wrap_content">
+
+    <!-- 评分 -->
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_rank_filter"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_score_rank"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:includeFontPadding="false"
+            android:text="@string/common_score_rank_filter_to_low"
+            android:textColor="@color/color_FF4E5969"
+            android:textSize="11sp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:layout_width="22dp"
+            android:layout_height="22dp"
+            app:layout_constraintBottom_toBottomOf="@id/tv_score_rank"
+            app:layout_constraintStart_toEndOf="@id/tv_score_rank"
+            app:layout_constraintTop_toTopOf="@id/tv_score_rank"
+            app:srcCompat="@drawable/common_filter_ic" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+    <!-- 价格 -->
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_price_filter"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="6dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toEndOf="@id/cl_rank_filter"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_price_rank"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:includeFontPadding="false"
+            android:text="@string/common_score_rank_filter_to_low"
+            android:textColor="@color/color_FF4E5969"
+            android:textSize="11sp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:layout_width="22dp"
+            android:layout_height="22dp"
+            app:layout_constraintBottom_toBottomOf="@id/tv_price_rank"
+            app:layout_constraintStart_toEndOf="@id/tv_price_rank"
+            app:layout_constraintTop_toTopOf="@id/tv_price_rank"
+            app:srcCompat="@drawable/common_filter_ic" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+    <!-- Find your partner -->
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_find_partner"
+        android:layout_width="wrap_content"
+        android:layout_height="36dp"
+        android:background="@drawable/common_find_partner_bg"
+        android:paddingHorizontal="12dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_find_partner"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:includeFontPadding="false"
+            android:text="@string/common_find_your_partner"
+            android:textColor="@color/color_FF4E5969"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:layout_width="14dp"
+            android:layout_height="14dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toEndOf="@id/tv_find_partner"
+            app:layout_constraintTop_toTopOf="parent"
+            app:srcCompat="@drawable/common_find_your_partner_ic" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 47 - 0
module/activity/src/main/res/layout/layout_activity_home_list_top.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="wrap_content">
+
+    <include
+        android:id="@+id/v_item1"
+        layout="@layout/layout_activity_home_list_top_item"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/v_item2"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <include
+        android:id="@+id/v_item2"
+        layout="@layout/layout_activity_home_list_top_item"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/v_item3"
+        app:layout_constraintStart_toEndOf="@id/v_item1"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <include
+        android:id="@+id/v_item3"
+        layout="@layout/layout_activity_home_list_top_item"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/v_item4"
+        app:layout_constraintStart_toEndOf="@id/v_item2"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <include
+        android:id="@+id/v_item4"
+        layout="@layout/layout_activity_home_list_top_item"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@id/v_item3"
+        app:layout_constraintTop_toTopOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 31 - 0
module/activity/src/main/res/layout/layout_activity_home_list_top_item.xml

@@ -0,0 +1,31 @@
+<?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="match_parent">
+
+    <com.adealink.frame.image.view.NetworkImageView
+        android:id="@+id/iv_item"
+        android:layout_width="50dp"
+        android:layout_height="50dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_item"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="3dp"
+        android:ellipsize="end"
+        android:singleLine="true"
+        android:textColor="@color/color_FF1B1919"
+        android:textSize="12sp"
+        app:layout_constraintEnd_toEndOf="@id/iv_item"
+        app:layout_constraintStart_toStartOf="@id/iv_item"
+        app:layout_constraintTop_toBottomOf="@id/iv_item"
+        app:layout_constraintWidth_max="70dp"
+        tools:text="Mobile Game Game" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 3 - 0
module/activity/src/main/res/values-in/strings.xml

@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+</resources>

+ 3 - 0
module/activity/src/main/res/values-zh/strings.xml

@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+</resources>

+ 3 - 0
module/activity/src/main/res/values/attrs.xml

@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+</resources>

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů