Skip to content

Commit

Permalink
Clean up + Refactor ♻️
Browse files Browse the repository at this point in the history
  • Loading branch information
ndegwamartin committed Jul 12, 2021
1 parent 0557964 commit d9751d7
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<LanguageSwitcherUtils.Language>
private lateinit var languageList: List<LocaleUtils.Language>
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 {
Expand All @@ -47,51 +49,45 @@ 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
}
else -> super.onOptionsItemSelected(item)
}
}

private infix fun Activity.reload(activity: Activity) {
val intent = Intent(activity, activity.javaClass)
activity.startActivity(intent)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,66 +19,93 @@ 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()
}
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<Language> {
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<Language>,
listener: DialogInterface.OnClickListener
) {

val adapter: ArrayAdapter<Language> =
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
}
Expand Down

0 comments on commit d9751d7

Please sign in to comment.