Bladeren bron

feat: 增加Setting模块,支持切换多语言

DoggyZhang 4 maanden geleden
bovenliggende
commit
be07edf1f8
50 gewijzigde bestanden met toevoegingen van 472 en 206 verwijderingen
  1. 1 0
      app/build.gradle
  2. 9 0
      app/src/main/java/com/adealink/weparty/module/setting/ISettingService.kt
  3. 20 0
      app/src/main/java/com/adealink/weparty/module/setting/Router.kt
  4. 31 0
      app/src/main/java/com/adealink/weparty/module/setting/SettingModule.kt
  5. 4 0
      app/src/main/java/com/adealink/weparty/module/setting/listener/ISettingListener.kt
  6. 4 0
      app/src/main/java/com/adealink/weparty/module/setting/viewmodel/ISettingViewModel.kt
  7. 2 3
      app/src/main/java/com/adealink/weparty/ui/home/HomeFragment.kt
  8. BIN
      app/src/main/res/drawable-xhdpi/common_check_selected_ic.png
  9. BIN
      app/src/main/res/drawable-xhdpi/common_check_unselected_ic.png
  10. 0 0
      app/src/main/res/drawable/common_bottom_dialog_bg.xml
  11. 1 1
      app/src/main/res/layout/dialog_common_bottom_list.xml
  12. 1 0
      app/src/main/res/values/colors.xml
  13. 1 0
      app/src/main/res/values/strings.xml
  14. 1 0
      app/src/main/resources/META-INF/services/com.adealink.frame.router.IRouterInit
  15. 1 1
      frame/tuikit/TIMCommon/timcommon/src/main/res/drawable/chat_checkbox_selector.xml
  16. BIN
      frame/tuikit/TIMCommon/timcommon/src/main/res/drawable/common_check_box_selected.png
  17. BIN
      frame/tuikit/TIMCommon/timcommon/src/main/res/drawable/common_check_box_unselected.png
  18. 3 3
      frame/tuikit/TUICommunity/tuicommunity/src/main/res/drawable/community_checkbox_selector.xml
  19. 1 1
      frame/tuikit/TUIContact/tuicontact/src/main/res-minimalist/layout/contact_minimalist_group_type_item.xml
  20. 3 3
      frame/tuikit/TUIContact/tuicontact/src/main/res/drawable/contact_checkbox_selector.xml
  21. 3 3
      frame/tuikit/TUIContact/tuicontact/src/main/res/drawable/group_checkbox_selector.xml
  22. 3 3
      frame/tuikit/TUIConversation/tuiconversation/src/main/res/drawable/conversation_checkbox_selector.xml
  23. 0 29
      module/account/src/main/AndroidManifest.xml
  24. 2 53
      module/activity/src/main/AndroidManifest.xml
  25. 1 1
      module/im/src/main/AndroidManifest.xml
  26. 2 53
      module/playmate/src/main/AndroidManifest.xml
  27. 1 52
      module/profile/src/main/AndroidManifest.xml
  28. 1 0
      module/setting/.gitignore
  29. 56 0
      module/setting/build.gradle
  30. 0 0
      module/setting/consumer-rules.pro
  31. 21 0
      module/setting/proguard-rules.pro
  32. 19 0
      module/setting/src/main/AndroidManifest.xml
  33. 21 0
      module/setting/src/main/java/com/adealink/weparty/setting/SettingServiceImpl.kt
  34. 17 0
      module/setting/src/main/java/com/adealink/weparty/setting/datasource/local/SettingLocalService.kt
  35. 5 0
      module/setting/src/main/java/com/adealink/weparty/setting/datasource/remote/SettingHttpService.kt
  36. 73 0
      module/setting/src/main/java/com/adealink/weparty/setting/language/LanguageSettingDialog.kt
  37. 47 0
      module/setting/src/main/java/com/adealink/weparty/setting/language/adapter/LanguageItemViewBinder.kt
  38. 9 0
      module/setting/src/main/java/com/adealink/weparty/setting/language/data/LanguageData.kt
  39. 8 0
      module/setting/src/main/java/com/adealink/weparty/setting/viewmodel/SettingViewModel.kt
  40. 21 0
      module/setting/src/main/java/com/adealink/weparty/setting/viewmodel/SettingViewModelFactory.kt
  41. 20 0
      module/setting/src/main/res/layout/dialog_language_setting.xml
  42. 38 0
      module/setting/src/main/res/layout/layout_language_item.xml
  43. 3 0
      module/setting/src/main/res/values-in/strings.xml
  44. 3 0
      module/setting/src/main/res/values-zh/strings.xml
  45. 3 0
      module/setting/src/main/res/values/attrs.xml
  46. 3 0
      module/setting/src/main/res/values/dimens.xml
  47. 4 0
      module/setting/src/main/res/values/ids.xml
  48. 3 0
      module/setting/src/main/res/values/strings.xml
  49. 1 0
      module/setting/src/main/resources/META-INF/services/com.adealink.weparty.module.setting.ISettingService
  50. 1 0
      settings.gradle

+ 1 - 0
app/build.gradle

@@ -214,6 +214,7 @@ android {
             ':module:im',
             ':module:playmate',
             ':module:activity',
+            ':module:setting',
     ]
     buildFeatures {
         viewBinding true

+ 9 - 0
app/src/main/java/com/adealink/weparty/module/setting/ISettingService.kt

@@ -0,0 +1,9 @@
+package com.adealink.weparty.module.setting
+
+import androidx.fragment.app.FragmentManager
+import com.adealink.frame.aab.IService
+
+interface ISettingService : IService<ISettingService> {
+    fun showLanguageSettingDialog(fragmentManager: FragmentManager)
+
+}

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

@@ -0,0 +1,20 @@
+package com.adealink.weparty.module.setting
+
+
+interface Setting {
+
+    interface Common {
+
+        companion object {
+            const val PATH = "/setting"
+        }
+
+    }
+
+    interface Language {
+        companion object {
+            const val PATH = "${Common.PATH}/language"
+        }
+    }
+
+}

+ 31 - 0
app/src/main/java/com/adealink/weparty/module/setting/SettingModule.kt

@@ -0,0 +1,31 @@
+package com.adealink.weparty.module.setting
+
+import androidx.fragment.app.FragmentManager
+import com.adealink.frame.aab.BaseDynamicModule
+import com.adealink.weparty.R
+
+object SettingModule : BaseDynamicModule<ISettingService>(ISettingService::class),
+    ISettingService {
+
+    override val featureName: String
+        get() = "setting"
+
+    override val moduleNameResId: Int
+        get() = R.string.module_setting
+
+    override fun emptyService(): ISettingService {
+        return object : ISettingService {
+
+            override fun getService(): ISettingService? {
+                return null
+            }
+
+            override fun showLanguageSettingDialog(fragmentManager: FragmentManager) {
+            }
+        }
+    }
+
+    override fun showLanguageSettingDialog(fragmentManager: FragmentManager) {
+        getService().showLanguageSettingDialog(fragmentManager)
+    }
+}

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

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

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

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

+ 2 - 3
app/src/main/java/com/adealink/weparty/ui/home/HomeFragment.kt

@@ -25,6 +25,7 @@ import com.adealink.weparty.constant.logTime
 import com.adealink.weparty.databinding.FragmentHomeBinding
 import com.adealink.weparty.databinding.LayoutMainTabBinding
 import com.adealink.weparty.debug.Debug
+import com.adealink.weparty.module.setting.SettingModule
 import com.adealink.weparty.ui.home.tab.ACTIVITY
 import com.adealink.weparty.ui.home.tab.HOME_TABS
 import com.adealink.weparty.ui.home.tab.ITabManager
@@ -149,9 +150,7 @@ class HomeFragment : BaseFragment(R.layout.fragment_home), ITabManager by TabMan
     }
 
     private fun goLanguageSetting() {
-        activity?.let { act ->
-            Router.build(act, Debug.Debug.PATH).start()
-        }
+        SettingModule.showLanguageSettingDialog(childFragmentManager)
     }
 
     private fun goProfile() {

BIN
app/src/main/res/drawable-xhdpi/common_check_selected_ic.png


BIN
app/src/main/res/drawable-xhdpi/common_check_unselected_ic.png


+ 0 - 0
app/src/main/res/drawable/commonui_bottom_list_dialog_bg.xml → app/src/main/res/drawable/common_bottom_dialog_bg.xml


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

@@ -4,7 +4,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:background="@drawable/commonui_bottom_list_dialog_bg">
+    android:background="@drawable/common_bottom_dialog_bg">
 
     <TextView
         android:id="@+id/tv_title"

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

@@ -1214,4 +1214,5 @@
     <color name="color_FF3FBFBD">#FF3FBFBD</color>
     <color name="color_FF8E8E8E">#FF8E8E8E</color>
     <color name="color_FFF1F2F5">#FFF1F2F5</color>
+    <color name="color_FFF2F3F5">#FFF2F3F5</color>
 </resources>

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

@@ -6,6 +6,7 @@
     <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="module_setting" translatable="false">setting</string>
     <string name="common_create">Create</string>
     <string name="common_send">Send</string>
     <string name="common_sending">Sending</string>

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

@@ -4,3 +4,4 @@ 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
+com.adealink.frame.router.RouterInit_module_setting

+ 1 - 1
frame/tuikit/TIMCommon/timcommon/src/main/res/drawable/chat_checkbox_selector.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <item android:drawable="@drawable/common_check_box_selected" android:state_checked="true" />
+    <item android:drawable="@drawable/common_check_selected_ic" android:state_checked="true" />
     <item android:drawable="@drawable/chat_unselected_icon" android:state_checked="false" />
     <item android:drawable="@drawable/chat_unselected_icon" />
 

BIN
frame/tuikit/TIMCommon/timcommon/src/main/res/drawable/common_check_box_selected.png


BIN
frame/tuikit/TIMCommon/timcommon/src/main/res/drawable/common_check_box_unselected.png


+ 3 - 3
frame/tuikit/TUICommunity/tuicommunity/src/main/res/drawable/community_checkbox_selector.xml

@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <item android:drawable="@drawable/common_check_box_selected" android:state_checked="true" />
-    <item android:drawable="@drawable/common_check_box_unselected" android:state_checked="false" />
-    <item android:drawable="@drawable/common_check_box_unselected" />
+    <item android:drawable="@drawable/common_check_selected_ic" android:state_checked="true" />
+    <item android:drawable="@drawable/common_check_unselected_ic" android:state_checked="false" />
+    <item android:drawable="@drawable/common_check_unselected_ic" />
 
 </selector>

+ 1 - 1
frame/tuikit/TUIContact/tuicontact/src/main/res-minimalist/layout/contact_minimalist_group_type_item.xml

@@ -27,7 +27,7 @@
                 android:layout_width="16dp"
                 android:layout_height="16dp"
                 android:layout_marginEnd="8dp"
-                android:background="@drawable/common_check_box_selected" />
+                android:background="@drawable/common_check_selected_ic" />
 
             <TextView
                 android:id="@+id/group_type_text"

+ 3 - 3
frame/tuikit/TUIContact/tuicontact/src/main/res/drawable/contact_checkbox_selector.xml

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <item android:drawable="@drawable/common_check_box_selected" android:state_checked="true" android:state_enabled="true"/>
+    <item android:drawable="@drawable/common_check_selected_ic" android:state_checked="true" android:state_enabled="true"/>
     <item android:drawable="@drawable/contact_select_disable" android:state_checked="true" android:state_enabled="false"/>
-    <item android:drawable="@drawable/common_check_box_unselected" android:state_checked="false" />
-    <item android:drawable="@drawable/common_check_box_unselected" />
+    <item android:drawable="@drawable/common_check_unselected_ic" android:state_checked="false" />
+    <item android:drawable="@drawable/common_check_unselected_ic" />
 
 </selector>

+ 3 - 3
frame/tuikit/TUIContact/tuicontact/src/main/res/drawable/group_checkbox_selector.xml

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <item android:drawable="@drawable/common_check_box_selected" android:state_checked="true" android:state_enabled="true"/>
+    <item android:drawable="@drawable/common_check_selected_ic" android:state_checked="true" android:state_enabled="true"/>
     <item android:drawable="@drawable/group_select_disable" android:state_checked="true" android:state_enabled="false"/>
-    <item android:drawable="@drawable/common_check_box_unselected" android:state_checked="false" />
-    <item android:drawable="@drawable/common_check_box_unselected" />
+    <item android:drawable="@drawable/common_check_unselected_ic" android:state_checked="false" />
+    <item android:drawable="@drawable/common_check_unselected_ic" />
 
 </selector>

+ 3 - 3
frame/tuikit/TUIConversation/tuiconversation/src/main/res/drawable/conversation_checkbox_selector.xml

@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <item android:drawable="@drawable/common_check_box_selected" android:state_checked="true" />
-    <item android:drawable="@drawable/common_check_box_unselected" android:state_checked="false" />
-    <item android:drawable="@drawable/common_check_box_unselected" />
+    <item android:drawable="@drawable/common_check_selected_ic" android:state_checked="true" />
+    <item android:drawable="@drawable/common_check_unselected_ic" android:state_checked="false" />
+    <item android:drawable="@drawable/common_check_unselected_ic" />
 
 </selector>

+ 0 - 29
module/account/src/main/AndroidManifest.xml

@@ -52,35 +52,6 @@
 
         </activity>
 
-        <activity
-            android:name="net.openid.appauth.RedirectUriReceiverActivity"
-            android:exported="true"
-            tools:node="replace">
-            <intent-filter android:autoVerify="true">
-                <action android:name="android.intent.action.VIEW" />
-
-                <category android:name="android.intent.category.DEFAULT" />
-                <category android:name="android.intent.category.BROWSABLE" />
-
-                <data android:scheme="yoki" />
-                <data android:host="auth" />
-                <data android:path="/apple" />
-            </intent-filter>
-
-            <intent-filter android:autoVerify="true">
-                <action android:name="android.intent.action.VIEW" />
-
-                <category android:name="android.intent.category.DEFAULT" />
-                <category android:name="android.intent.category.BROWSABLE" />
-
-                <data android:scheme="http" />
-                <data android:scheme="https" />
-                <data android:host="yoki.wenext.chat" />
-                <data android:path="/web/yoki-auth/apple" />
-            </intent-filter>
-
-        </activity>
-
     </application>
 
     <queries>

+ 2 - 53
module/activity/src/main/AndroidManifest.xml

@@ -1,12 +1,11 @@
 <?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"
+<manifest 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:title="@string/module_activity">
         <dist:fusing dist:include="true" />
         <dist:delivery>
             <dist:install-time>
@@ -16,55 +15,5 @@
     </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>

+ 1 - 1
module/im/src/main/AndroidManifest.xml

@@ -9,7 +9,7 @@
 
     <dist:module
         dist:instant="false"
-        dist:title="@string/module_account">
+        dist:title="@string/module_im">
         <dist:fusing dist:include="true" />
         <dist:delivery>
             <dist:install-time>

+ 2 - 53
module/playmate/src/main/AndroidManifest.xml

@@ -1,12 +1,11 @@
 <?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"
+<manifest 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:title="@string/module_playmate">
         <dist:fusing dist:include="true" />
         <dist:delivery>
             <dist:install-time>
@@ -16,55 +15,5 @@
     </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>

+ 1 - 52
module/profile/src/main/AndroidManifest.xml

@@ -1,6 +1,5 @@
 <?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"
+<manifest xmlns:dist="http://schemas.android.com/apk/distribution"
     xmlns:tools="http://schemas.android.com/tools"
     tools:ignore="LockedOrientationActivity">
 
@@ -16,55 +15,5 @@
     </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>

+ 1 - 0
module/setting/.gitignore

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

+ 56 - 0
module/setting/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.setting'
+    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/setting/consumer-rules.pro


+ 21 - 0
module/setting/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

+ 19 - 0
module/setting/src/main/AndroidManifest.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest 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_setting">
+        <dist:fusing dist:include="true" />
+        <dist:delivery>
+            <dist:install-time>
+                <dist:removable dist:value="true" />
+            </dist:install-time>
+        </dist:delivery>
+    </dist:module>
+
+    <application>
+    </application>
+</manifest>

+ 21 - 0
module/setting/src/main/java/com/adealink/weparty/setting/SettingServiceImpl.kt

@@ -0,0 +1,21 @@
+package com.adealink.weparty.setting
+
+import androidx.fragment.app.FragmentManager
+import com.adealink.frame.spi.RegisterService
+import com.adealink.weparty.module.setting.ISettingService
+import com.adealink.weparty.module.setting.Setting
+import com.adealink.weparty.setting.language.LanguageSettingDialog
+
+@RegisterService(ISettingService::class)
+class SettingServiceImpl : ISettingService {
+
+    override fun showLanguageSettingDialog(fragmentManager: FragmentManager) {
+        LanguageSettingDialog().show(fragmentManager, Setting.Language.PATH)
+    }
+
+    override fun getService(): ISettingService {
+        return this
+    }
+
+
+}

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

@@ -0,0 +1,17 @@
+package com.adealink.weparty.setting.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 SettingLocalService : TypeDelegationPrefs(
+    prefs = {
+        AppUtil.appContext.getSharedPreferences("pref_setting", Context.MODE_PRIVATE)
+    },
+    userId = {
+        ProfileModule.getMyUid().toString()
+    }
+) {
+
+}

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

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

+ 73 - 0
module/setting/src/main/java/com/adealink/weparty/setting/language/LanguageSettingDialog.kt

@@ -0,0 +1,73 @@
+package com.adealink.weparty.setting.language
+
+import android.content.Intent
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.adealink.frame.base.fastLazy
+import com.adealink.frame.locale.language.data.Language
+import com.adealink.frame.locale.language.languageManager
+import com.adealink.frame.mvvm.view.viewBinding
+import com.adealink.frame.router.Router
+import com.adealink.frame.router.annotation.RouterUri
+import com.adealink.weparty.App
+import com.adealink.weparty.AppModule
+import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
+import com.adealink.weparty.commonui.widget.BottomDialogFragment
+import com.adealink.weparty.module.setting.Setting
+import com.adealink.weparty.setting.R
+import com.adealink.weparty.setting.databinding.DialogLanguageSettingBinding
+import com.adealink.weparty.setting.language.adapter.LanguageItemViewBinder
+import com.adealink.weparty.setting.language.data.LanguageItemData
+
+@RouterUri(path = [Setting.Language.PATH], desc = "语言设置弹窗")
+class LanguageSettingDialog : BottomDialogFragment(R.layout.dialog_language_setting),
+    LanguageItemViewBinder.OnLanguageChooseListener {
+
+    private val binding by viewBinding(DialogLanguageSettingBinding::bind)
+    private val listAdapter by fastLazy { MultiTypeListAdapter<LanguageItemData>() }
+
+    private var currentLanguage: Language? = null
+
+    override fun initViews() {
+        super.initViews()
+        binding.rvLanguages.adapter = listAdapter
+        listAdapter.register(LanguageItemViewBinder(this))
+        binding.rvLanguages.layoutManager =
+            LinearLayoutManager(context, RecyclerView.VERTICAL, false)
+        initChoiceList()
+    }
+
+    private fun initChoiceList() {
+        currentLanguage = App.instance.languageManager.getLanguage()
+        val languageList = mutableListOf<LanguageItemData>()
+        val supportLanguageList = App.instance.languageManager.getSupportLanguageList()
+        supportLanguageList.forEachIndexed { index, language ->
+            languageList.add(
+                LanguageItemData(
+                    language,
+                    index < supportLanguageList.size - 1,
+                    currentLanguage == language
+                )
+            )
+        }
+        listAdapter.submitList(languageList)
+    }
+
+    override fun onChoose(language: Language) {
+        if (currentLanguage == language) {
+            //当前语言没有发生变化
+            dismiss()
+            return
+        }
+        currentLanguage = language
+        languageManager?.updateLanguage(language)
+        startNewMain()
+    }
+
+    private fun startNewMain() {
+        val act = activity ?: return
+        Router.build(act, AppModule.Main.PATH)
+            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
+            .start()
+    }
+}

+ 47 - 0
module/setting/src/main/java/com/adealink/weparty/setting/language/adapter/LanguageItemViewBinder.kt

@@ -0,0 +1,47 @@
+package com.adealink.weparty.setting.language.adapter
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import com.adealink.frame.locale.language.data.Language
+import com.adealink.weparty.commonui.ext.gone
+import com.adealink.weparty.commonui.ext.show
+import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
+import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
+import com.adealink.weparty.setting.databinding.LayoutLanguageItemBinding
+import com.adealink.weparty.setting.language.data.LanguageItemData
+import com.adealink.weparty.R as APP_R
+
+class LanguageItemViewBinder(val listener: OnLanguageChooseListener) :
+    ItemViewBinder<LanguageItemData, BindingViewHolder<LayoutLanguageItemBinding>>() {
+
+    override fun onBindViewHolder(
+        holder: BindingViewHolder<LayoutLanguageItemBinding>,
+        item: LanguageItemData,
+    ) {
+        if (item.showDivider) {
+            holder.binding.vDivider.show()
+        } else {
+            holder.binding.vDivider.gone()
+        }
+        holder.binding.tvLanguage.text = item.language.desc
+        if (item.selected) {
+            holder.binding.ivSelected.setImageResource(APP_R.drawable.common_check_selected_ic)
+        } else {
+            holder.binding.ivSelected.setImageResource(APP_R.drawable.common_check_unselected_ic)
+        }
+        holder.binding.root.setOnClickListener {
+            listener.onChoose(item.language)
+        }
+    }
+
+    override fun onCreateViewHolder(
+        inflater: LayoutInflater,
+        parent: ViewGroup,
+    ): BindingViewHolder<LayoutLanguageItemBinding> {
+        return BindingViewHolder(LayoutLanguageItemBinding.inflate(inflater, parent, false))
+    }
+
+    interface OnLanguageChooseListener {
+        fun onChoose(language: Language)
+    }
+}

+ 9 - 0
module/setting/src/main/java/com/adealink/weparty/setting/language/data/LanguageData.kt

@@ -0,0 +1,9 @@
+package com.adealink.weparty.setting.language.data
+
+import com.adealink.frame.locale.language.data.Language
+
+data class LanguageItemData(
+    val language: Language,
+    val showDivider: Boolean,
+    var selected: Boolean,
+)

+ 8 - 0
module/setting/src/main/java/com/adealink/weparty/setting/viewmodel/SettingViewModel.kt

@@ -0,0 +1,8 @@
+package com.adealink.weparty.setting.viewmodel
+
+import com.adealink.frame.mvvm.viewmodel.BaseViewModel
+import com.adealink.weparty.module.activity.viewmodel.IActivityViewModel
+
+class SettingViewModel : BaseViewModel(), IActivityViewModel {
+
+}

+ 21 - 0
module/setting/src/main/java/com/adealink/weparty/setting/viewmodel/SettingViewModelFactory.kt

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

+ 20 - 0
module/setting/src/main/res/layout/dialog_language_setting.xml

@@ -0,0 +1,20 @@
+<?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"
+    android:background="@drawable/common_bottom_dialog_bg">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_languages"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginHorizontal="12dp"
+        android:layout_marginTop="4dp"
+        android:paddingBottom="8dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 38 - 0
module/setting/src/main/res/layout/layout_language_item.xml

@@ -0,0 +1,38 @@
+<?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="42dp">
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_language"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:fontFamily="@font/poppins_semibold"
+        android:includeFontPadding="false"
+        android:textColor="@color/color_FF1D2129"
+        android:textSize="16sp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="中文" />
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_selected"
+        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_check_selected_ic" />
+
+    <View
+        android:id="@+id/v_divider"
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_marginHorizontal="2dp"
+        android:background="@color/color_FFF2F3F5"
+        app:layout_constraintBottom_toBottomOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

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

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

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

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

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

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

+ 3 - 0
module/setting/src/main/res/values/dimens.xml

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

+ 4 - 0
module/setting/src/main/res/values/ids.xml

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

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

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

+ 1 - 0
module/setting/src/main/resources/META-INF/services/com.adealink.weparty.module.setting.ISettingService

@@ -0,0 +1 @@
+com.adealink.weparty.setting.SettingServiceImpl

+ 1 - 0
settings.gradle

@@ -96,6 +96,7 @@ include ':module:account'
 include ':module:im'
 include ':module:playmate'
 include ':module:activity'
+include ':module:setting'
 
 //调试frame框架
 include ':frame:network'