Fix locale not applied outside activities

This commit is contained in:
len 2016-12-26 16:56:19 +01:00
parent 1a3a1db4ff
commit 006d17aac7
5 changed files with 39 additions and 20 deletions

View file

@ -34,7 +34,7 @@ open class App : Application() {
setupAcra() setupAcra()
setupJobManager() setupJobManager()
LocaleHelper.updateCfg(this, baseContext.resources.configuration) LocaleHelper.updateConfiguration(this, resources.configuration)
} }
override fun attachBaseContext(base: Context) { override fun attachBaseContext(base: Context) {
@ -46,7 +46,7 @@ open class App : Application() {
override fun onConfigurationChanged(newConfig: Configuration) { override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig) super.onConfigurationChanged(newConfig)
LocaleHelper.updateCfg(this, newConfig) LocaleHelper.updateConfiguration(this, newConfig, true)
} }
protected open fun setupAcra() { protected open fun setupAcra() {

View file

@ -6,7 +6,7 @@ import eu.kanade.tachiyomi.util.LocaleHelper
abstract class BaseActivity : AppCompatActivity(), ActivityMixin { abstract class BaseActivity : AppCompatActivity(), ActivityMixin {
init { init {
LocaleHelper.updateCfg(this) LocaleHelper.updateConfiguration(this)
} }
override fun getActivity() = this override fun getActivity() = this

View file

@ -9,7 +9,7 @@ import nucleus.view.NucleusAppCompatActivity
abstract class BaseRxActivity<P : BasePresenter<*>> : NucleusAppCompatActivity<P>(), ActivityMixin { abstract class BaseRxActivity<P : BasePresenter<*>> : NucleusAppCompatActivity<P>(), ActivityMixin {
init { init {
LocaleHelper.updateCfg(this) LocaleHelper.updateConfiguration(this)
} }
override fun onCreate(savedState: Bundle?) { override fun onCreate(savedState: Bundle?) {

View file

@ -115,7 +115,8 @@ class SettingsGeneralFragment : SettingsFragment(),
langPreference.setOnPreferenceChangeListener { preference, newValue -> langPreference.setOnPreferenceChangeListener { preference, newValue ->
(activity as SettingsActivity).parentFlags = SettingsActivity.FLAG_LANG_CHANGED (activity as SettingsActivity).parentFlags = SettingsActivity.FLAG_LANG_CHANGED
LocaleHelper.changeLocale(newValue.toString()) LocaleHelper.changeLocale(newValue.toString())
LocaleHelper.updateCfg(activity.application, activity.baseContext.resources.configuration) val app = activity.application
LocaleHelper.updateConfiguration(app, app.resources.configuration)
activity.recreate() activity.recreate()
true true
} }

View file

@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.util
import android.app.Application import android.app.Application
import android.content.res.Configuration import android.content.res.Configuration
import android.os.Build import android.os.Build
import android.os.LocaleList
import android.view.ContextThemeWrapper import android.view.ContextThemeWrapper
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
@ -20,12 +21,9 @@ object LocaleHelper {
private val preferences: PreferencesHelper by injectLazy() private val preferences: PreferencesHelper by injectLazy()
/** /**
* In API 16 and below the application's configuration has to be changed, so we need a copy of * The system's locale.
* the initial locale. The only problem is that if the system locale changes while the app is
* running, it won't change until an application restart.
*/ */
private var v16SystemLocale = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) private var systemLocale: Locale? = null
preferences.context.resources.configuration.locale else null
/** /**
* The application's locale. When it's null, the system locale is used. * The application's locale. When it's null, the system locale is used.
@ -57,9 +55,9 @@ object LocaleHelper {
} }
/** /**
* Updates the app's language from API 17. * Updates the app's language to an activity.
*/ */
fun updateCfg(wrapper: ContextThemeWrapper) { fun updateConfiguration(wrapper: ContextThemeWrapper) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && appLocale != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && appLocale != null) {
val config = Configuration(preferences.context.resources.configuration) val config = Configuration(preferences.context.resources.configuration)
config.setLocale(appLocale) config.setLocale(appLocale)
@ -68,16 +66,36 @@ object LocaleHelper {
} }
/** /**
* Updates the app's language for API 16 and lower. * Updates the app's language to the application.
*/ */
fun updateCfg(app: Application, config: Configuration) { fun updateConfiguration(app: Application, config: Configuration, configChange: Boolean = false) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { if (systemLocale == null) {
val configCopy = Configuration(config) systemLocale = getConfigLocale(config)
val displayMetrics = app.baseContext.resources.displayMetrics
configCopy.locale = appLocale ?: v16SystemLocale
app.baseContext.resources.updateConfiguration(configCopy, displayMetrics)
} }
// In API 16 and lower the system locale can't be changed.
if (configChange && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
val newLocale = getConfigLocale(config)
if (systemLocale == newLocale) {
return
}
systemLocale = newLocale
}
val newConfig = Configuration(config)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
newConfig.locale = appLocale ?: systemLocale
} else {
newConfig.locales = LocaleList(appLocale ?: systemLocale)
}
val resources = app.resources
resources.updateConfiguration(newConfig, resources.displayMetrics)
} }
private fun getConfigLocale(config: Configuration): Locale {
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
config.locale
} else {
config.locales[0]
}
}
} }