From d9751d78b5f19c7d295ef1dbcba6f7ffaf629d55 Mon Sep 17 00:00:00 2001 From: Martin Ndegwa Date: Thu, 8 Jul 2021 20:38:22 +0300 Subject: [PATCH] =?UTF-8?q?Clean=20up=20+=20Refactor=20=E2=99=BB=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fhir/datacapture/gallery/MainActivity.kt | 60 +++++++-------- ...anguageSwitcherUtils.kt => LocaleUtils.kt} | 73 +++++++++++++------ .../outline_language_24.xml | 0 3 files changed, 78 insertions(+), 55 deletions(-) rename datacapturegallery/src/main/java/com/google/android/fhir/datacapture/gallery/utils/{LanguageSwitcherUtils.kt => LocaleUtils.kt} (52%) rename datacapturegallery/src/main/res/{drawable-v24 => drawable}/outline_language_24.xml (100%) diff --git a/datacapturegallery/src/main/java/com/google/android/fhir/datacapture/gallery/MainActivity.kt b/datacapturegallery/src/main/java/com/google/android/fhir/datacapture/gallery/MainActivity.kt index 4cdb243f96..b37419dfaf 100644 --- a/datacapturegallery/src/main/java/com/google/android/fhir/datacapture/gallery/MainActivity.kt +++ b/datacapturegallery/src/main/java/com/google/android/fhir/datacapture/gallery/MainActivity.kt @@ -18,25 +18,27 @@ package com.google.android.fhir.datacapture.gallery import android.app.Activity import android.content.Context +import android.content.Intent +import android.content.SharedPreferences import android.content.res.Configuration import android.os.Bundle import android.view.Menu import android.view.MenuItem import androidx.appcompat.app.AppCompatActivity import com.google.android.fhir.datacapture.gallery.databinding.ActivityMainBinding -import com.google.android.fhir.datacapture.gallery.utils.LanguageSwitcherUtils -import java.util.Locale +import com.google.android.fhir.datacapture.gallery.utils.LocaleUtils class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding - private lateinit var languageList: List + private lateinit var languageList: List + private lateinit var sharedPreferences: SharedPreferences override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - languageList = LanguageSwitcherUtils.getLanguageList(this) + languageList = LocaleUtils.getLanguageList(this) } override fun onCreateOptionsMenu(menu: Menu): Boolean { @@ -47,46 +49,35 @@ class MainActivity : AppCompatActivity() { return true } - private fun refreshToSelectedLanguage( - language: LanguageSwitcherUtils.Language, - context: Activity - ) { + private fun refreshToSelectedLanguage(language: LocaleUtils.Language, context: Activity) { - val sharedPref = - context?.getSharedPreferences( - BuildConfig.APPLICATION_ID.plus(this.javaClass.canonicalName), - Context.MODE_PRIVATE - ) - ?: return - with(sharedPref.edit()) { - putString(LanguageSwitcherUtils.SHARED_PREF_KEY_LANG, language.tag) - commit() - } + LocaleUtils.saveSelectedLanguage(language, sharedPreferences) - LanguageSwitcherUtils.refreshActivity(context) + this reload context } - override fun attachBaseContext(base: Context) { - val sharedPref = - base?.getSharedPreferences( + override fun attachBaseContext(baseContext: Context) { + sharedPreferences = + baseContext.getSharedPreferences( BuildConfig.APPLICATION_ID.plus(this.javaClass.canonicalName), Context.MODE_PRIVATE ) - ?: return - val languageTag = - sharedPref.getString( - LanguageSwitcherUtils.SHARED_PREF_KEY_LANG, - Locale.getDefault().toLanguageTag() - ) - val newConfiguration: Configuration? = LanguageSwitcherUtils.setAppLocale(base, languageTag) - super.attachBaseContext(base) - applyOverrideConfiguration(newConfiguration) + + var newContextResourceConfiguration: Configuration? + + LocaleUtils.getSelectedLanguage(sharedPreferences).also { + newContextResourceConfiguration = + LocaleUtils.updateContextResourceConfiguration(baseContext, it) + } + + super.attachBaseContext(baseContext) + applyOverrideConfiguration(newContextResourceConfiguration) } override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.action_language -> { - LanguageSwitcherUtils.renderSelectLanguageDialog(this, languageList) { _, i -> + LocaleUtils.renderSelectLanguageDialog(this, languageList) { _, i -> refreshToSelectedLanguage(languageList[i], this) } true @@ -94,4 +85,9 @@ class MainActivity : AppCompatActivity() { else -> super.onOptionsItemSelected(item) } } + + private infix fun Activity.reload(activity: Activity) { + val intent = Intent(activity, activity.javaClass) + activity.startActivity(intent) + } } diff --git a/datacapturegallery/src/main/java/com/google/android/fhir/datacapture/gallery/utils/LanguageSwitcherUtils.kt b/datacapturegallery/src/main/java/com/google/android/fhir/datacapture/gallery/utils/LocaleUtils.kt similarity index 52% rename from datacapturegallery/src/main/java/com/google/android/fhir/datacapture/gallery/utils/LanguageSwitcherUtils.kt rename to datacapturegallery/src/main/java/com/google/android/fhir/datacapture/gallery/utils/LocaleUtils.kt index 64164c96f9..99aca6c9d8 100644 --- a/datacapturegallery/src/main/java/com/google/android/fhir/datacapture/gallery/utils/LanguageSwitcherUtils.kt +++ b/datacapturegallery/src/main/java/com/google/android/fhir/datacapture/gallery/utils/LocaleUtils.kt @@ -19,34 +19,30 @@ package com.google.android.fhir.datacapture.gallery.utils import android.app.Activity import android.content.Context import android.content.DialogInterface -import android.content.Intent +import android.content.SharedPreferences import android.content.res.Configuration import android.content.res.Resources import android.os.Build import android.os.LocaleList import android.widget.ArrayAdapter +import androidx.annotation.RequiresApi import androidx.appcompat.app.AlertDialog import com.google.android.fhir.datacapture.gallery.R import java.util.Locale -object LanguageSwitcherUtils { +object LocaleUtils { - const val SHARED_PREF_KEY_LANG = "shared_pref_key_lang" + private const val SHARED_PREF_KEY_LANG = "shared_pref_key_lang" - fun setAppLocale(context: Context, language: String?): Configuration? { - val res: Resources = context.resources - val configuration: Configuration = res.configuration + fun updateContextResourceConfiguration(context: Context, language: String?): Configuration? { + val resources: Resources = context.resources + val configuration: Configuration = resources.configuration try { val locale = Locale.forLanguageTag(language) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - configuration.setLocale(locale) - val localeList = LocaleList(locale) - LocaleList.setDefault(localeList) - configuration.setLocales(localeList) - context.createConfigurationContext(configuration) + updateResourcesLocaleConfiguration(context, locale) } else { - configuration.locale = locale - res.updateConfiguration(configuration, res.displayMetrics) + updateResourcesLocaleConfigurationLegacy(context, locale) } } catch (e: Exception) { e.printStackTrace() @@ -54,31 +50,62 @@ object LanguageSwitcherUtils { return configuration } + @RequiresApi(Build.VERSION_CODES.N) + private fun updateResourcesLocaleConfiguration(context: Context, locale: Locale) { + context.resources.configuration.also { + it.setLocale(locale) + + val localeList = LocaleList(locale) + LocaleList.setDefault(localeList) + it.setLocales(localeList) + + context.createConfigurationContext(it) + } + } + + @Suppress("DEPRECATION") + private fun updateResourcesLocaleConfigurationLegacy(context: Context, locale: Locale) { + context.resources.configuration.also { + it.locale = locale + context.resources.updateConfiguration(it, context.resources.displayMetrics) + } + } + fun getLanguageList(activity: Activity): List { return activity.resources.getStringArray(R.array.languages).toList().map { Language(it, Locale.forLanguageTag(it).displayName) } } - fun refreshActivity(activity: Activity) { - val intent = Intent(activity, activity.javaClass) - activity.startActivity(intent) - } - fun renderSelectLanguageDialog( context: Activity, languageList: List, listener: DialogInterface.OnClickListener ) { - val adapter: ArrayAdapter = ArrayAdapter(context, android.R.layout.simple_list_item_1, languageList) - val builder: AlertDialog.Builder = AlertDialog.Builder(context) - builder.setTitle(context.getString(R.string.select_language)) - builder.setIcon(R.drawable.outline_language_24) - builder.setAdapter(adapter, listener).create().show() + AlertDialog.Builder(context) + .apply { + setTitle(context.getString(R.string.select_language)) + setIcon(R.drawable.outline_language_24) + setAdapter(adapter, listener) + } + .create() + .show() } + + fun saveSelectedLanguage(language: Language, sharedPreferences: SharedPreferences) { + + with(sharedPreferences.edit()) { + putString(SHARED_PREF_KEY_LANG, language.tag) + commit() + } + } + + fun getSelectedLanguage(sharedPreferences: SharedPreferences): String? = + sharedPreferences.getString(SHARED_PREF_KEY_LANG, null) + data class Language(val tag: String, val displayName: String) { override fun toString() = displayName } diff --git a/datacapturegallery/src/main/res/drawable-v24/outline_language_24.xml b/datacapturegallery/src/main/res/drawable/outline_language_24.xml similarity index 100% rename from datacapturegallery/src/main/res/drawable-v24/outline_language_24.xml rename to datacapturegallery/src/main/res/drawable/outline_language_24.xml