Procházet zdrojové kódy

feat: 我的页面,设置,帮助中心

DoggyZhang před 3 měsíci
rodič
revize
2eac52a2ae
32 změnil soubory, kde provedl 1284 přidání a 49 odebrání
  1. 70 0
      app/src/main/java/com/adealink/weparty/commonui/text/ScrollableEditText.kt
  2. 19 0
      app/src/main/java/com/adealink/weparty/module/setting/Router.kt
  3. binární
      app/src/main/res/drawable-xhdpi/common_app_splash_logo_ic.png
  4. 1 1
      app/src/main/res/drawable/bg_splash.xml
  5. 1 0
      app/src/main/res/values/strings.xml
  6. 0 7
      module/profile/src/main/java/com/adealink/weparty/profile/me/MeFragment.kt
  7. 24 19
      module/profile/src/main/java/com/adealink/weparty/profile/me/comp/MeFunctionCenterComp.kt
  8. 1 19
      module/profile/src/main/res/layout/fragment_me.xml
  9. 1 1
      module/profile/src/main/res/layout/layout_me_function.xml
  10. 0 1
      module/profile/src/main/res/values/strings.xml
  11. 15 1
      module/setting/src/main/AndroidManifest.xml
  12. 76 0
      module/setting/src/main/java/com/adealink/weparty/setting/SettingActivity.kt
  13. 75 0
      module/setting/src/main/java/com/adealink/weparty/setting/about/AboutActivity.kt
  14. 188 0
      module/setting/src/main/java/com/adealink/weparty/setting/helpcenter/HelpCenterActivity.kt
  15. 38 0
      module/setting/src/main/java/com/adealink/weparty/setting/helpcenter/adapter/AddPictureItemViewBinder.kt
  16. 43 0
      module/setting/src/main/java/com/adealink/weparty/setting/helpcenter/adapter/PictureItemViewBinder.kt
  17. 16 0
      module/setting/src/main/java/com/adealink/weparty/setting/helpcenter/data/HelpCenterData.kt
  18. 49 0
      module/setting/src/main/java/com/adealink/weparty/setting/helpcenter/viewmodel/HelpCenterViewModel.kt
  19. binární
      module/setting/src/main/res/drawable-xhdpi/setting_about_ic.png
  20. binární
      module/setting/src/main/res/drawable-xhdpi/setting_add_picture_ic.png
  21. binární
      module/setting/src/main/res/drawable-xhdpi/setting_clear_cache_ic.png
  22. binární
      module/setting/src/main/res/drawable-xhdpi/setting_help_remove_picture_ic.png
  23. binární
      module/setting/src/main/res/drawable-xhdpi/setting_language_ic.png
  24. binární
      module/setting/src/main/res/drawable-xhdpi/setting_logout_ic.png
  25. 6 0
      module/setting/src/main/res/drawable/setting_add_picture_bg.xml
  26. 6 0
      module/setting/src/main/res/drawable/setting_input_edit_bg.xml
  27. 189 0
      module/setting/src/main/res/layout/activity_about.xml
  28. 175 0
      module/setting/src/main/res/layout/activity_help_center.xml
  29. 217 0
      module/setting/src/main/res/layout/activity_setting.xml
  30. 29 0
      module/setting/src/main/res/layout/item_setting_help_add_picture.xml
  31. 31 0
      module/setting/src/main/res/layout/item_setting_help_picture.xml
  32. 14 0
      module/setting/src/main/res/values/strings.xml

+ 70 - 0
app/src/main/java/com/adealink/weparty/commonui/text/ScrollableEditText.kt

@@ -0,0 +1,70 @@
+package com.adealink.weparty.commonui.text
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.util.AttributeSet
+import android.view.MotionEvent
+import androidx.appcompat.widget.AppCompatEditText
+
+
+class ScrollableEditText @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0,
+) : AppCompatEditText(context, attrs, defStyleAttr) {
+
+    private var lastY = 0f
+
+    init {
+        isVerticalScrollBarEnabled = true
+        overScrollMode = OVER_SCROLL_ALWAYS
+    }
+
+    @SuppressLint("ClickableViewAccessibility")
+    override fun onTouchEvent(event: MotionEvent?): Boolean {
+        // 先让EditText处理自己的事件(包括输入、光标移动等)
+        val handled = super.onTouchEvent(event)
+
+        when (event?.actionMasked) {
+            MotionEvent.ACTION_DOWN -> {
+                lastY = event.getY()
+                // 告诉父View不要拦截触摸事件
+                parent.requestDisallowInterceptTouchEvent(true)
+            }
+
+            MotionEvent.ACTION_MOVE -> {
+                val currentY = event.y
+                val deltaY: Float = currentY - lastY
+                lastY = currentY
+
+
+                // 检查EditText是否还能继续滚动
+                val atTop = !canScrollVertically(-1) // 是否在顶部
+                val atBottom = !canScrollVertically(1) // 是否在底部
+
+
+                // 如果在边界且滑动方向是想要离开EditText,就让父View处理
+                if ((atTop && deltaY > 0) || (atBottom && deltaY < 0)) {
+                    // 让父View可以拦截事件
+                    parent.requestDisallowInterceptTouchEvent(false)
+                } else {
+                    // 否则不让父View拦截
+                    parent.requestDisallowInterceptTouchEvent(true)
+                }
+            }
+
+            MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL ->                 // 恢复默认行为
+                parent.requestDisallowInterceptTouchEvent(false)
+        }
+
+        return handled
+    }
+
+    /**
+     * 判断是否可以垂直滚动
+     */
+    override fun canScrollVertically(direction: Int): Boolean {
+        // 使用系统的判断方法
+        return computeVerticalScrollRange() > computeVerticalScrollExtent()
+    }
+}

+ 19 - 0
app/src/main/java/com/adealink/weparty/module/setting/Router.kt

@@ -11,10 +11,29 @@ interface Setting {
 
     }
 
+    interface Setting {
+        companion object {
+            const val PATH = Common.PATH
+        }
+    }
+
     interface Language {
         companion object {
             const val PATH = "${Common.PATH}/language"
         }
     }
 
+
+    interface About {
+        companion object {
+            const val PATH = "/about"
+        }
+    }
+
+    interface HelpCenter {
+        companion object {
+            const val PATH = "/help"
+        }
+    }
+
 }

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


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

@@ -8,6 +8,6 @@
     <item android:top="218dp">
         <bitmap
             android:gravity="top"
-            android:src="@drawable/common_app_logo_ic" />
+            android:src="@drawable/common_app_splash_logo_ic" />
     </item>
 </layer-list>

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

@@ -264,4 +264,5 @@
     <string name="common_hi">Hi</string>
     <string name="common_choose_date">Choose Date</string>
     <string name="common_just_now">刚刚</string>
+    <string name="common_help_center">Help Center</string>
 </resources>

+ 0 - 7
module/profile/src/main/java/com/adealink/weparty/profile/me/MeFragment.kt

@@ -6,11 +6,9 @@ import androidx.fragment.app.viewModels
 import com.adealink.frame.aab.util.getCompatDimension
 import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.frame.router.annotation.RouterUri
-import com.adealink.frame.util.onClick
 import com.adealink.frame.util.statusBarHeight
 import com.adealink.weparty.commonui.BaseFragment
 import com.adealink.weparty.commonui.ext.dp
-import com.adealink.weparty.module.account.AccountModule
 import com.adealink.weparty.module.profile.Profile
 import com.adealink.weparty.module.profile.ProfileModule
 import com.adealink.weparty.profile.R
@@ -42,11 +40,6 @@ class MeFragment : BaseFragment(R.layout.fragment_me) {
             16.dp(),
             getCompatDimension(APP_R.dimen.main_content_padding_bottom).toInt()
         )
-
-
-        binding.btnLogout.onClick {
-            AccountModule.logout(true)
-        }
     }
 
     override fun onResume() {

+ 24 - 19
module/profile/src/main/java/com/adealink/weparty/profile/me/comp/MeFunctionCenterComp.kt

@@ -2,44 +2,49 @@ package com.adealink.weparty.profile.me.comp
 
 import androidx.lifecycle.LifecycleOwner
 import com.adealink.frame.mvvm.view.ViewComponent
-import com.adealink.frame.mvvm.viewmodel.viewModels
-import com.adealink.weparty.module.profile.ProfileModule
-import com.adealink.weparty.module.profile.data.UserInfo
+import com.adealink.frame.router.Router
+import com.adealink.frame.util.onClick
+import com.adealink.weparty.module.order.Order
+import com.adealink.weparty.module.setting.Setting
 import com.adealink.weparty.profile.databinding.LayoutMeFunctionBinding
-import com.adealink.weparty.profile.viewmodel.ProfileViewModel
-import com.adealink.weparty.profile.viewmodel.ProfileViewModelFactory
 
 class MeFunctionCenterComp(
     lifecycleOwner: LifecycleOwner,
     val binding: LayoutMeFunctionBinding
 ) : ViewComponent(lifecycleOwner) {
 
-    private val profileViewModel by viewModels<ProfileViewModel>(
-        ownerProducer = { viewModelStoreOwner },
-        factoryProducer = { ProfileViewModelFactory() }
-    )
-
     override fun onCreate() {
         super.onCreate()
         initView()
-        observeViewModel()
-        loadData()
     }
 
     private fun initView() {
+        binding.clOrder.onClick {
+            goOrderList()
+        }
+        binding.clHelpCenter.onClick {
+            goHelpCenter()
+        }
+        binding.clSetting.onClick {
+            goSetting()
+        }
     }
 
-    private fun observeViewModel() {
-        profileViewModel.userInfoLD.observe(viewLifecycleOwner) { user ->
-            updateHeader(user)
+    private fun goOrderList() {
+        activity?.let { act ->
+            Router.build(act, Order.List.PATH).start()
         }
     }
 
-    private fun loadData() {
-        updateHeader(ProfileModule.getMyUserInfo())
+    private fun goHelpCenter() {
+        activity?.let { act ->
+            Router.build(act, Setting.HelpCenter.PATH).start()
+        }
     }
 
-    private fun updateHeader(userInfo: UserInfo?) {
+    private fun goSetting() {
+        activity?.let { act ->
+            Router.build(act, Setting.Setting.PATH).start()
+        }
     }
-
 }

+ 1 - 19
module/profile/src/main/res/layout/fragment_me.xml

@@ -62,7 +62,7 @@
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toBottomOf="@id/v_playmate_share" />
 
-            <!-- 钱包 -->
+            <!-- 功能中心 -->
             <include
                 android:id="@+id/v_function_center"
                 layout="@layout/layout_me_function"
@@ -77,22 +77,4 @@
 
     </androidx.core.widget.NestedScrollView>
 
-    <androidx.appcompat.widget.AppCompatTextView
-        android:id="@+id/btn_logout"
-        android:layout_width="wrap_content"
-        android:layout_height="28dp"
-        android:layout_marginBottom="200dp"
-        android:background="@drawable/profile_logout_button"
-        android:gravity="center"
-        android:includeFontPadding="false"
-        android:minWidth="100dp"
-        android:paddingHorizontal="12dp"
-        android:paddingVertical="6dp"
-        android:text="@string/common_logout"
-        android:textColor="@color/color_FF4E5969"
-        android:textSize="12sp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent" />
-
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 1
module/profile/src/main/res/layout/layout_me_function.xml

@@ -85,7 +85,7 @@
             android:gravity="center"
             android:includeFontPadding="false"
             android:singleLine="true"
-            android:text="@string/profile_me_help_center"
+            android:text="@string/common_help_center"
             android:textColor="@color/color_FF4E5969"
             android:textSize="12sp"
             app:layout_constrainedWidth="true"

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

@@ -33,6 +33,5 @@
     <string name="profile_me_follower">Follower</string>
     <string name="profile_me_fans">Fans</string>
     <string name="profile_me_function_center">Function Center</string>
-    <string name="profile_me_help_center">Help Center</string>
     <string name="profile_me_setting">Settings</string>
 </resources>

+ 15 - 1
module/setting/src/main/AndroidManifest.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:dist="http://schemas.android.com/apk/distribution"
+<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">
 
@@ -15,5 +16,18 @@
     </dist:module>
 
     <application>
+        <activity
+            android:name=".SettingActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme" />
+        <activity
+            android:name=".about.AboutActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme" />
+        <activity
+            android:name=".helpcenter.HelpCenterActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme"
+            android:windowSoftInputMode="adjustResize|adjustPan" />
     </application>
 </manifest>

+ 76 - 0
module/setting/src/main/java/com/adealink/weparty/setting/SettingActivity.kt

@@ -0,0 +1,76 @@
+package com.adealink.weparty.setting
+
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.view.updateLayoutParams
+import com.adealink.frame.aab.util.getCompatDimension
+import com.adealink.frame.aab.util.getCompatString
+import com.adealink.frame.base.AppBase
+import com.adealink.frame.mvvm.view.viewBinding
+import com.adealink.frame.router.Router
+import com.adealink.frame.router.annotation.RouterUri
+import com.adealink.frame.util.onClick
+import com.adealink.frame.util.statusBarHeight
+import com.adealink.weparty.commonui.BaseActivity
+import com.adealink.weparty.commonui.widget.CommonDialog
+import com.adealink.weparty.module.account.AccountModule
+import com.adealink.weparty.module.setting.Setting
+import com.adealink.weparty.setting.databinding.ActivitySettingBinding
+import com.adealink.weparty.setting.language.LanguageSettingDialog
+import com.adealink.weparty.R as APP_R
+
+@RouterUri(
+    path = [Setting.Setting.PATH],
+    desc = "设置"
+)
+class SettingActivity : BaseActivity() {
+
+    private val binding by viewBinding(ActivitySettingBinding::inflate)
+
+    override fun onBeforeCreate() {
+        super.onBeforeCreate()
+        Router.bind(this)
+    }
+
+    override fun initViews() {
+        super.initViews()
+        setContentView(binding.root)
+        val statusBarHeight = statusBarHeight()
+        binding.topBar.setPadding(0, statusBarHeight, 0, 0)
+        binding.topBar.updateLayoutParams<ConstraintLayout.LayoutParams> {
+            height = statusBarHeight + getCompatDimension(APP_R.dimen.common_top_bar_height).toInt()
+        }
+
+        binding.vLanguage.onClick {
+            clickLanguage()
+        }
+        binding.vClearCache.onClick {
+            clearCache()
+        }
+        binding.tvAbout.text = getCompatString(R.string.setting_about, AppBase.appName)
+        binding.vAbout.onClick {
+            clickAbout()
+        }
+
+        binding.vLogout.onClick {
+            clickLogout()
+        }
+    }
+
+    private fun clickLanguage() {
+        LanguageSettingDialog().show(supportFragmentManager, Setting.Language.PATH)
+    }
+
+    private fun clearCache() {
+
+    }
+
+    private fun clickAbout() {
+        Router.build(this, Setting.About.PATH).start()
+    }
+
+    private fun clickLogout() {
+        CommonDialog
+        AccountModule.logout(true)
+    }
+
+}

+ 75 - 0
module/setting/src/main/java/com/adealink/weparty/setting/about/AboutActivity.kt

@@ -0,0 +1,75 @@
+package com.adealink.weparty.setting.about
+
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.view.updateLayoutParams
+import com.adealink.frame.aab.util.getCompatDimension
+import com.adealink.frame.aab.util.getCompatString
+import com.adealink.frame.base.AppBase
+import com.adealink.frame.mvvm.view.viewBinding
+import com.adealink.frame.router.Router
+import com.adealink.frame.router.annotation.RouterUri
+import com.adealink.frame.util.PackageUtil
+import com.adealink.frame.util.onClick
+import com.adealink.frame.util.statusBarHeight
+import com.adealink.weparty.commonui.BaseActivity
+import com.adealink.weparty.module.setting.Setting
+import com.adealink.weparty.setting.R
+import com.adealink.weparty.setting.databinding.ActivityAboutBinding
+import com.adealink.weparty.R as APP_R
+
+@RouterUri(
+    path = [Setting.About.PATH],
+    desc = "关于"
+)
+class AboutActivity : BaseActivity() {
+
+    private val binding by viewBinding(ActivityAboutBinding::inflate)
+
+    override fun onBeforeCreate() {
+        super.onBeforeCreate()
+        Router.bind(this)
+    }
+
+    override fun initViews() {
+        super.initViews()
+        setContentView(binding.root)
+        val statusBarHeight = statusBarHeight()
+        binding.topBar.setTitle(getCompatString(R.string.setting_about, AppBase.appName))
+        binding.topBar.setPadding(0, statusBarHeight, 0, 0)
+        binding.topBar.updateLayoutParams<ConstraintLayout.LayoutParams> {
+            height = statusBarHeight + getCompatDimension(APP_R.dimen.common_top_bar_height).toInt()
+        }
+        binding.tvVersion.text = PackageUtil.getVersionName()
+
+        binding.vPrivacyPolicy.onClick {
+            goPrivacyPolicy()
+        }
+        binding.vTermsService.onClick {
+            goTermsService()
+        }
+        binding.vCommunityCovenant.onClick {
+            goCommunityCovenant()
+        }
+        binding.vVersionUpdate.onClick {
+            checkVersionUpdate()
+        }
+
+    }
+
+    private fun goPrivacyPolicy() {
+
+    }
+
+    private fun goTermsService() {
+
+    }
+
+    private fun goCommunityCovenant() {
+
+    }
+
+    private fun checkVersionUpdate() {
+
+    }
+
+}

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

@@ -0,0 +1,188 @@
+package com.adealink.weparty.setting.helpcenter
+
+import android.annotation.SuppressLint
+import android.text.Editable
+import android.text.TextWatcher
+import androidx.activity.viewModels
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.view.setPadding
+import androidx.core.view.updateLayoutParams
+import androidx.recyclerview.widget.GridLayoutManager
+import com.adealink.frame.aab.util.getCompatDimension
+import com.adealink.frame.aab.util.getCompatString
+import com.adealink.frame.base.AppBase
+import com.adealink.frame.base.fastLazy
+import com.adealink.frame.mvvm.view.viewBinding
+import com.adealink.frame.router.Router
+import com.adealink.frame.router.annotation.RouterUri
+import com.adealink.frame.util.naviBarHeight
+import com.adealink.frame.util.onClick
+import com.adealink.frame.util.statusBarHeight
+import com.adealink.weparty.commonui.BaseActivity
+import com.adealink.weparty.commonui.ext.dp
+import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
+import com.adealink.weparty.commonui.recycleview.itemdecoration.GridSpacingItemDecoration
+import com.adealink.weparty.imageselect.clip.avatarClipParam
+import com.adealink.weparty.imageselect.comp.TakeFromAlbumComp
+import com.adealink.weparty.module.setting.Setting
+import com.adealink.weparty.setting.R
+import com.adealink.weparty.setting.databinding.ActivityHelpCenterBinding
+import com.adealink.weparty.setting.helpcenter.adapter.AddPictureItemViewBinder
+import com.adealink.weparty.setting.helpcenter.adapter.PictureItemViewBinder
+import com.adealink.weparty.setting.helpcenter.data.AddPictureItemData
+import com.adealink.weparty.setting.helpcenter.data.BasePictureItemData
+import com.adealink.weparty.setting.helpcenter.data.PictureData
+import com.adealink.weparty.setting.helpcenter.viewmodel.HelpCenterViewModel
+import com.adealink.weparty.util.goImagePreviewActivity
+import com.qmuiteam.qmui.widget.util.QMUIKeyboardHelper
+import com.adealink.weparty.R as APP_R
+
+@RouterUri(
+    path = [Setting.HelpCenter.PATH],
+    desc = "帮助中心"
+)
+class HelpCenterActivity : BaseActivity() {
+
+    companion object {
+        private const val MAX_INPUT_COUNT = 800
+        private const val PICTURE_SPAN = 3
+    }
+
+    private val binding by viewBinding(ActivityHelpCenterBinding::inflate)
+
+    private val pictureAdapter by fastLazy { MultiTypeListAdapter<BasePictureItemData>() }
+
+    private val viewModel by viewModels<HelpCenterViewModel>()
+
+    private lateinit var takeFromAlbumComp: TakeFromAlbumComp
+
+    override fun onBeforeCreate() {
+        super.onBeforeCreate()
+        Router.bind(this)
+    }
+
+    override fun initViews() {
+        super.initViews()
+        setContentView(binding.root)
+        val statusBarHeight = statusBarHeight()
+        val naviBarHeight = naviBarHeight()
+        binding.topBar.setPadding(0, statusBarHeight, 0, 0)
+        binding.topBar.updateLayoutParams<ConstraintLayout.LayoutParams> {
+            height = statusBarHeight + getCompatDimension(APP_R.dimen.common_top_bar_height).toInt()
+        }
+        binding.btnSubmit.updateLayoutParams<ConstraintLayout.LayoutParams> {
+            bottomMargin = naviBarHeight + 24.dp()
+        }
+        binding.clContent.setPadding(
+            0, 0, 0,
+            getCompatDimension(APP_R.dimen.common_button_height).toInt() + naviBarHeight + 48.dp()
+        )
+
+        binding.etInput.addTextChangedListener(object : TextWatcher {
+            override fun beforeTextChanged(
+                s: CharSequence?,
+                start: Int,
+                count: Int,
+                after: Int
+            ) {
+            }
+
+            override fun onTextChanged(
+                s: CharSequence?,
+                start: Int,
+                before: Int,
+                count: Int
+            ) {
+            }
+
+            @SuppressLint("SetTextI18n")
+            override fun afterTextChanged(s: Editable?) {
+                val input = s?.trim()?.toString()
+                if (input.isNullOrEmpty()) {
+                    binding.btnSubmit.isEnabled = false
+                    binding.tvInputCount.text = "0/${MAX_INPUT_COUNT}"
+                } else {
+                    binding.btnSubmit.isEnabled = true
+                    binding.tvInputCount.text = "${input.length}/${MAX_INPUT_COUNT}"
+                }
+            }
+        })
+
+
+        pictureAdapter.register(
+            AddPictureItemViewBinder {
+                addPicture()
+            }
+        )
+        pictureAdapter.register(
+            PictureItemViewBinder(
+                onItemClick = {
+                    previewPicture(it.data)
+                },
+                onDeleteClick = {
+                    deletePicture(it.data)
+                }
+            ))
+        binding.rvPicture.adapter = pictureAdapter
+        binding.rvPicture.layoutManager = GridLayoutManager(this, PICTURE_SPAN)
+        binding.rvPicture.addItemDecoration(
+            GridSpacingItemDecoration(PICTURE_SPAN, 4.dp(), 4.dp(), false)
+        )
+
+        binding.btnSubmit.onClick {
+            submit()
+        }
+    }
+
+    override fun observeViewModel() {
+        super.observeViewModel()
+        viewModel.pictureItemListLD.observe(this) {
+            pictureAdapter.submitList(it)
+        }
+    }
+
+    override fun loadData() {
+        super.loadData()
+        pictureAdapter.submitList(
+            listOf(AddPictureItemData)
+        )
+    }
+
+    override fun initComponents() {
+        super.initComponents()
+        TakeFromAlbumComp(this, null) { path, uri ->
+            viewModel.addPicture(path, uri)
+        }.also {
+            takeFromAlbumComp = it
+        }.attach()
+    }
+
+    private fun addPicture() {
+        takeFromAlbumComp.takeFromAlbum()
+    }
+
+    private fun previewPicture(data: PictureData) {
+        if (data.uri.isNullOrEmpty()) {
+            return
+        }
+        goImagePreviewActivity(
+            this,
+            arrayListOf(data.uri)
+        )
+    }
+
+    private fun deletePicture(data: PictureData) {
+        viewModel.removePicture(data)
+    }
+
+    private fun submit() {
+        viewModel.submit()
+    }
+
+    override fun onDestroy() {
+        binding.etInput.clearFocus()
+        QMUIKeyboardHelper.hideKeyboard(binding.etInput)
+        super.onDestroy()
+    }
+
+}

+ 38 - 0
module/setting/src/main/java/com/adealink/weparty/setting/helpcenter/adapter/AddPictureItemViewBinder.kt

@@ -0,0 +1,38 @@
+package com.adealink.weparty.setting.helpcenter.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.setting.databinding.ItemSettingHelpAddPictureBinding
+import com.adealink.weparty.setting.helpcenter.data.AddPictureItemData
+
+
+class AddPictureItemViewBinder(
+    val onItemClick: () -> Unit,
+) :
+    ItemViewBinder<AddPictureItemData, BindingViewHolder<ItemSettingHelpAddPictureBinding>>() {
+
+    override fun onBindViewHolder(
+        holder: BindingViewHolder<ItemSettingHelpAddPictureBinding>,
+        item: AddPictureItemData,
+    ) {
+        holder.binding.root.onClick {
+            onItemClick.invoke()
+        }
+    }
+
+    override fun onCreateViewHolder(
+        inflater: LayoutInflater,
+        parent: ViewGroup,
+    ): BindingViewHolder<ItemSettingHelpAddPictureBinding> {
+        return BindingViewHolder(
+            ItemSettingHelpAddPictureBinding.inflate(
+                inflater,
+                parent,
+                false
+            )
+        )
+    }
+}

+ 43 - 0
module/setting/src/main/java/com/adealink/weparty/setting/helpcenter/adapter/PictureItemViewBinder.kt

@@ -0,0 +1,43 @@
+package com.adealink.weparty.setting.helpcenter.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.setting.databinding.ItemSettingHelpPictureBinding
+import com.adealink.weparty.setting.helpcenter.data.PictureItemData
+
+
+class PictureItemViewBinder(
+    val onItemClick: (item: PictureItemData) -> Unit,
+    val onDeleteClick: (item: PictureItemData) -> Unit
+) :
+    ItemViewBinder<PictureItemData, BindingViewHolder<ItemSettingHelpPictureBinding>>() {
+
+    override fun onBindViewHolder(
+        holder: BindingViewHolder<ItemSettingHelpPictureBinding>,
+        item: PictureItemData,
+    ) {
+        holder.binding.root.onClick {
+            onItemClick.invoke(item)
+        }
+        holder.binding.ivDelete.onClick {
+            onDeleteClick.invoke(item)
+        }
+        holder.binding.ivPicture.setImageURI(item.data.uri)
+    }
+
+    override fun onCreateViewHolder(
+        inflater: LayoutInflater,
+        parent: ViewGroup,
+    ): BindingViewHolder<ItemSettingHelpPictureBinding> {
+        return BindingViewHolder(
+            ItemSettingHelpPictureBinding.inflate(
+                inflater,
+                parent,
+                false
+            )
+        )
+    }
+}

+ 16 - 0
module/setting/src/main/java/com/adealink/weparty/setting/helpcenter/data/HelpCenterData.kt

@@ -0,0 +1,16 @@
+package com.adealink.weparty.setting.helpcenter.data
+
+import com.adealink.weparty.commonui.recycleview.diffutil.BaseListItemData
+
+data class PictureData(
+    val path: String?,
+    val uri: String?
+)
+
+sealed class BasePictureItemData : BaseListItemData
+
+object AddPictureItemData : BasePictureItemData()
+
+data class PictureItemData(
+    val data: PictureData
+) : BasePictureItemData()

+ 49 - 0
module/setting/src/main/java/com/adealink/weparty/setting/helpcenter/viewmodel/HelpCenterViewModel.kt

@@ -0,0 +1,49 @@
+package com.adealink.weparty.setting.helpcenter.viewmodel
+
+import androidx.lifecycle.MutableLiveData
+import com.adealink.frame.mvvm.viewmodel.BaseViewModel
+import com.adealink.weparty.setting.helpcenter.data.AddPictureItemData
+import com.adealink.weparty.setting.helpcenter.data.BasePictureItemData
+import com.adealink.weparty.setting.helpcenter.data.PictureData
+import com.adealink.weparty.setting.helpcenter.data.PictureItemData
+import kotlinx.coroutines.launch
+
+class HelpCenterViewModel : BaseViewModel() {
+
+    val pictureList = mutableListOf<PictureData>()
+
+    val pictureItemListLD = MutableLiveData<List<BasePictureItemData>>()
+
+    fun addPicture(path: String?, uri: String?) {
+        viewModelScope.launch {
+            pictureList.add(PictureData(path, uri))
+            onPictureListChanged()
+        }
+    }
+
+    fun removePicture(data: PictureData) {
+        viewModelScope.launch {
+            pictureList.remove(data)
+            onPictureListChanged()
+        }
+    }
+
+    private fun onPictureListChanged() {
+        val itemList = mutableListOf<BasePictureItemData>()
+        itemList.addAll(
+            pictureList.map {
+                PictureItemData(it)
+            }
+        )
+        //小于9张图片,可以继续添加图片
+        if (pictureList.size < 9) {
+            itemList.add(AddPictureItemData)
+        }
+        pictureItemListLD.send(itemList)
+    }
+
+    fun submit() {
+
+    }
+
+}

binární
module/setting/src/main/res/drawable-xhdpi/setting_about_ic.png


binární
module/setting/src/main/res/drawable-xhdpi/setting_add_picture_ic.png


binární
module/setting/src/main/res/drawable-xhdpi/setting_clear_cache_ic.png


binární
module/setting/src/main/res/drawable-xhdpi/setting_help_remove_picture_ic.png


binární
module/setting/src/main/res/drawable-xhdpi/setting_language_ic.png


binární
module/setting/src/main/res/drawable-xhdpi/setting_logout_ic.png


+ 6 - 0
module/setting/src/main/res/drawable/setting_add_picture_bg.xml

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

+ 6 - 0
module/setting/src/main/res/drawable/setting_input_edit_bg.xml

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

+ 189 - 0
module/setting/src/main/res/layout/activity_about.xml

@@ -0,0 +1,189 @@
+<?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.weparty.commonui.widget.CommonTopBar
+        android:id="@+id/top_bar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/common_top_bar_height"
+        app:layout_constraintTop_toTopOf="parent"
+        app:top_bar_title="@string/common_help_center" />
+
+    <androidx.core.widget.NestedScrollView
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:background="@color/color_FFF1F2F5"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/top_bar">
+
+        <androidx.appcompat.widget.LinearLayoutCompat
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginHorizontal="16dp"
+            android:layout_marginTop="16dp"
+            android:orientation="vertical">
+
+            <androidx.appcompat.widget.AppCompatImageView
+                android:layout_width="100dp"
+                android:layout_height="111dp"
+                android:layout_gravity="center"
+                android:layout_marginTop="24dp"
+                app:srcCompat="@drawable/common_app_splash_logo_ic" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_version"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:layout_marginTop="12dp"
+                android:includeFontPadding="false"
+                android:textColor="@color/color_FF1D2129"
+                android:textSize="12sp"
+                tools:text="版本 1.0" />
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="40dp"
+                android:background="@drawable/common_white_radius_16_bg"
+                android:paddingHorizontal="16dp"
+                android:paddingVertical="4dp">
+
+                <!-- 隐私协议 -->
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/v_privacy_policy"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:paddingVertical="12dp"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent">
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:includeFontPadding="false"
+                        android:text="@string/setting_privacy_policy"
+                        android:textColor="@color/color_FF1D2129"
+                        android:textSize="12sp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <androidx.appcompat.widget.AppCompatImageView
+                        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/v_terms_service"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:paddingVertical="12dp"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/v_privacy_policy">
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:includeFontPadding="false"
+                        android:text="@string/setting_terms_service"
+                        android:textColor="@color/color_FF1D2129"
+                        android:textSize="12sp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <androidx.appcompat.widget.AppCompatImageView
+                        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/v_community_covenant"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:paddingVertical="12dp"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/v_terms_service">
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:includeFontPadding="false"
+                        android:text="@string/setting_community_covenant"
+                        android:textColor="@color/color_FF1D2129"
+                        android:textSize="12sp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <androidx.appcompat.widget.AppCompatImageView
+                        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/v_version_update"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:paddingVertical="12dp"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/v_community_covenant">
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:includeFontPadding="false"
+                        android:text="@string/setting_version_update"
+                        android:textColor="@color/color_FF1D2129"
+                        android:textSize="12sp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <androidx.appcompat.widget.AppCompatImageView
+                        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>
+
+
+        </androidx.appcompat.widget.LinearLayoutCompat>
+    </androidx.core.widget.NestedScrollView>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 175 - 0
module/setting/src/main/res/layout/activity_help_center.xml

@@ -0,0 +1,175 @@
+<?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.weparty.commonui.widget.CommonTopBar
+        android:id="@+id/top_bar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/common_top_bar_height"
+        app:layout_constraintTop_toTopOf="parent"
+        app:top_bar_title="@string/common_help_center" />
+
+    <androidx.core.widget.NestedScrollView
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:background="@color/color_FFF1F2F5"
+        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
+            android:id="@+id/cl_content"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginHorizontal="16dp"
+                android:layout_marginTop="16dp"
+                android:background="@drawable/common_white_radius_16_bg"
+                android:padding="16dp"
+                app:layout_constraintTop_toTopOf="parent">
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_input_title"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:ellipsize="end"
+                    android:gravity="start|center"
+                    android:includeFontPadding="false"
+                    android:singleLine="true"
+                    android:text="@string/setting_help_input_title"
+                    android:textColor="@color/color_FF1D2129"
+                    android:textSize="14sp"
+                    android:textStyle="bold"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/v_input"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dp"
+                    android:background="@drawable/setting_input_edit_bg"
+                    android:paddingHorizontal="12dp"
+                    android:paddingVertical="8dp"
+                    app:layout_constrainedHeight="true"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_input_title">
+
+                    <androidx.core.widget.NestedScrollView
+                        android:id="@+id/sv_et_input"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        app:layout_constrainedHeight="true"
+                        app:layout_constraintBottom_toTopOf="@id/tv_input_count"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintHeight_max="250dp"
+                        app:layout_constraintHeight_min="150dp"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:layout_constraintVertical_chainStyle="spread_inside">
+
+                        <androidx.appcompat.widget.AppCompatEditText
+                            android:id="@+id/et_input"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:background="@null"
+                            android:gravity="start|top"
+                            android:hint="@string/setting_help_input_desc"
+                            android:includeFontPadding="false"
+                            android:maxLength="800"
+                            android:textColor="@color/color_FF1D2129"
+                            android:textColorHint="@color/color_FFCDCFD9"
+                            tools:text="asdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfkasdf;asdjfka;lsjdfk" />
+
+                    </androidx.core.widget.NestedScrollView>
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:id="@+id/tv_input_count"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:gravity="center|end"
+                        android:includeFontPadding="false"
+                        android:singleLine="true"
+                        android:text="0/800"
+                        android:textColor="@color/color_FFCDCFD9"
+                        android:textSize="14sp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toBottomOf="@id/sv_et_input"
+                        tools:ignore="HardcodedText" />
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_picture_title"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="16dp"
+                    android:ellipsize="end"
+                    android:includeFontPadding="false"
+                    android:singleLine="true"
+                    android:text="@string/setting_help_picture_title"
+                    android:textColor="@color/color_FF1D2129"
+                    android:textSize="14sp"
+                    android:textStyle="bold"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/v_input" />
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_picture_desc"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:ellipsize="end"
+                    android:includeFontPadding="false"
+                    android:singleLine="true"
+                    android:text="@string/setting_help_picture_title"
+                    android:textColor="@color/color_FF1D2129"
+                    android:textSize="12sp"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_picture_title" />
+
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/rv_picture"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dp"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_picture_desc" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+    </androidx.core.widget.NestedScrollView>
+
+
+    <com.adealink.weparty.commonui.widget.CommonButton
+        android:id="@+id/btn_submit"
+        android:layout_width="0dp"
+        android:layout_height="@dimen/common_button_height"
+        android:layout_marginHorizontal="20dp"
+        android:layout_marginBottom="@dimen/common_button_margin_bottom"
+        android:fontFamily="@font/poppins_semibold"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:text="@string/common_submit"
+        android:textColor="@color/white"
+        android:textSize="16sp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 217 - 0
module/setting/src/main/res/layout/activity_setting.xml

@@ -0,0 +1,217 @@
+<?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.adealink.weparty.commonui.widget.CommonTopBar
+        android:id="@+id/top_bar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/common_top_bar_height"
+        app:layout_constraintTop_toTopOf="parent"
+        app:top_bar_title="@string/common_help_center" />
+
+    <androidx.core.widget.NestedScrollView
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:background="@color/color_FFF1F2F5"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/top_bar">
+
+        <androidx.appcompat.widget.LinearLayoutCompat
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginHorizontal="16dp"
+            android:layout_marginTop="16dp"
+            android:orientation="vertical">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@drawable/common_white_radius_16_bg"
+                android:paddingHorizontal="16dp"
+                android:paddingVertical="4dp">
+
+                <!-- 语言 -->
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/v_language"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:paddingVertical="12dp"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent">
+
+                    <androidx.appcompat.widget.AppCompatImageView
+                        android:layout_width="18dp"
+                        android:layout_height="18dp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:srcCompat="@drawable/setting_language_ic" />
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginStart="20dp"
+                        android:includeFontPadding="false"
+                        android:text="@string/setting_language"
+                        android:textColor="@color/color_FF1D2129"
+                        android:textSize="12sp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <androidx.appcompat.widget.AppCompatImageView
+                        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/v_clear_cache"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:paddingVertical="12dp"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/v_language">
+
+                    <androidx.appcompat.widget.AppCompatImageView
+                        android:layout_width="18dp"
+                        android:layout_height="18dp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:srcCompat="@drawable/setting_clear_cache_ic" />
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginStart="20dp"
+                        android:includeFontPadding="false"
+                        android:text="@string/setting_clear_cache"
+                        android:textColor="@color/color_FF1D2129"
+                        android:textSize="12sp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <androidx.appcompat.widget.AppCompatImageView
+                        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/v_about"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:paddingVertical="12dp"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/v_clear_cache">
+
+                    <androidx.appcompat.widget.AppCompatImageView
+                        android:layout_width="18dp"
+                        android:layout_height="18dp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:srcCompat="@drawable/setting_about_ic" />
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:id="@+id/tv_about"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginStart="20dp"
+                        android:includeFontPadding="false"
+                        android:text="@string/setting_about"
+                        android:textColor="@color/color_FF1D2129"
+                        android:textSize="12sp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <androidx.appcompat.widget.AppCompatImageView
+                        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>
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:background="@drawable/common_white_radius_16_bg"
+                android:paddingHorizontal="16dp"
+                android:paddingVertical="4dp">
+
+                <!-- 登出 -->
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/v_logout"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:paddingVertical="12dp"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent">
+
+                    <androidx.appcompat.widget.AppCompatImageView
+                        android:layout_width="18dp"
+                        android:layout_height="18dp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:srcCompat="@drawable/setting_logout_ic" />
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginStart="20dp"
+                        android:includeFontPadding="false"
+                        android:text="@string/setting_logout"
+                        android:textColor="@color/color_FF1D2129"
+                        android:textSize="12sp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <androidx.appcompat.widget.AppCompatImageView
+                        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>
+
+
+        </androidx.appcompat.widget.LinearLayoutCompat>
+    </androidx.core.widget.NestedScrollView>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 29 - 0
module/setting/src/main/res/layout/item_setting_help_add_picture.xml

@@ -0,0 +1,29 @@
+<?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"
+    tools:layout_height="100dp"
+    tools:layout_width="100dp">
+
+    <View
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:background="@drawable/setting_add_picture_bg"
+        app:layout_constraintDimensionRatio="1:1"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/btn_add_picture"
+        android:layout_width="24dp"
+        android:layout_height="24dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:srcCompat="@drawable/setting_add_picture_ic" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 31 - 0
module/setting/src/main/res/layout/item_setting_help_picture.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="wrap_content"
+    tools:layout_height="100dp"
+    tools:layout_width="100dp">
+
+    <com.adealink.frame.image.view.NetworkImageView
+        android:id="@+id/iv_picture"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        app:layout_constraintDimensionRatio="1:1"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:roundedCornerRadius="10dp" />
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_delete"
+        android:layout_width="20dp"
+        android:layout_height="20dp"
+        android:paddingStart="0dp"
+        android:paddingTop="6dp"
+        android:paddingEnd="6dp"
+        app:layout_constraintEnd_toEndOf="@id/iv_picture"
+        app:layout_constraintTop_toTopOf="@id/iv_picture"
+        app:srcCompat="@drawable/setting_help_remove_picture_ic" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 14 - 0
module/setting/src/main/res/values/strings.xml

@@ -1,3 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
+    <string name="setting_language">Language</string>
+    <string name="setting_clear_cache">Clear cache</string>
+    <string name="setting_about">About %s</string>
+    <string name="setting_logout">Logout</string>
+
+    <string name="setting_privacy_policy">Privacy policy</string>
+    <string name="setting_terms_service">Terms of Service</string>
+    <string name="setting_community_covenant">Community Covenant</string>
+    <string name="setting_version_update">Version update</string>
+
+    <string name="setting_help_input_title">Please leave a description of the issue you need feedback on,we will handle it as soon as possible!</string>
+    <string name="setting_help_input_desc">Please enter</string>
+    <string name="setting_help_picture_title">Picture proof (up to 9 images)</string>
+    <string name="setting_help_picture_desc">Upload a picture to display your evidence</string>
 </resources>