AppContextWrapper.kt 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package io.legato.kazusa.base
  2. import android.annotation.SuppressLint
  3. import android.app.Activity
  4. import android.content.Context
  5. import android.content.res.Configuration
  6. import android.content.res.Resources
  7. import android.os.Build
  8. import android.os.LocaleList
  9. import io.legato.kazusa.constant.PreferKey
  10. import io.legato.kazusa.utils.getPrefInt
  11. import io.legato.kazusa.utils.getPrefString
  12. import io.legato.kazusa.utils.sysConfiguration
  13. import java.util.*
  14. @Suppress("unused")
  15. object AppContextWrapper {
  16. fun wrap(context: Context): Context {
  17. val newConfig = Configuration(context.resources.configuration)
  18. val targetLocale = getSetLocale(context)
  19. newConfig.setLocale(targetLocale)
  20. newConfig.setLocales(LocaleList(targetLocale))
  21. newConfig.fontScale = getFontScale(context)
  22. return context.createConfigurationContext(newConfig)
  23. }
  24. fun applyLocaleAndFont(activity: Activity) {
  25. val config = activity.resources.configuration
  26. val locale = getSetLocale(activity)
  27. val fontScale = getFontScale(activity)
  28. val newConfig = Configuration(config)
  29. newConfig.setLocale(locale)
  30. newConfig.setLocales(LocaleList(locale))
  31. newConfig.fontScale = fontScale
  32. @Suppress("DEPRECATION")
  33. activity.resources.updateConfiguration(newConfig, activity.resources.displayMetrics)
  34. }
  35. fun getFontScale(context: Context): Float {
  36. var fontScale = context.getPrefInt(PreferKey.fontScale) / 10f
  37. if (fontScale !in 0.8f..1.6f) {
  38. fontScale = sysConfiguration.fontScale
  39. }
  40. return fontScale
  41. }
  42. /**
  43. * 当前系统语言
  44. */
  45. @SuppressLint("ObsoleteSdkInt")
  46. private fun getSystemLocale(): Locale {
  47. val locale: Locale
  48. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //7.0有多语言设置获取顶部的语言
  49. locale = sysConfiguration.locales.get(0)
  50. } else {
  51. @Suppress("DEPRECATION")
  52. locale = sysConfiguration.locale
  53. }
  54. return locale
  55. }
  56. /**
  57. * 当前App语言
  58. */
  59. @SuppressLint("ObsoleteSdkInt")
  60. private fun getAppLocale(context: Context): Locale {
  61. val locale: Locale
  62. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
  63. locale = context.resources.configuration.locales[0]
  64. } else {
  65. @Suppress("DEPRECATION")
  66. locale = context.resources.configuration.locale
  67. }
  68. return locale
  69. }
  70. /**
  71. * 当前设置语言
  72. */
  73. private fun getSetLocale(context: Context): Locale {
  74. return when (context.getPrefString(PreferKey.language)) {
  75. "zh" -> Locale.SIMPLIFIED_CHINESE
  76. "tw" -> Locale.TRADITIONAL_CHINESE
  77. "en" -> Locale.ENGLISH
  78. else -> getSystemLocale()
  79. }
  80. }
  81. /**
  82. * 判断App语言和设置语言是否相同
  83. */
  84. fun isSameWithSetting(context: Context): Boolean {
  85. val locale = getAppLocale(context)
  86. val language = locale.language
  87. val country = locale.country
  88. val pfLocale = getSetLocale(context)
  89. val pfLanguage = pfLocale.language
  90. val pfCountry = pfLocale.country
  91. return language == pfLanguage && country == pfCountry
  92. }
  93. }