Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Language switcher for the Data Capture Gallery #558

Closed
wants to merge 7 commits into from
Closed
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,71 @@

package com.google.android.fhir.datacapture.gallery

import android.content.Context
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.LocaleUtils

class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
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)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove new line

languageList = LocaleUtils.getLanguageList(this)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can this line be on line 31?

}

override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.top_bar_menu, menu)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove new line

menu.findItem(R.id.action_submit).isVisible = false
menu.findItem(R.id.action_language).isVisible = true
return true
}

private fun refreshToSelectedLanguage(language: LocaleUtils.Language) {

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove new line

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this isn't done

LocaleUtils.saveSelectedLanguage(language, sharedPreferences)

this.recreate()
}

override fun attachBaseContext(baseContext: Context) {
sharedPreferences =
baseContext.getSharedPreferences(
BuildConfig.APPLICATION_ID.plus(this.javaClass.canonicalName),
Context.MODE_PRIVATE
)

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 -> {
LocaleUtils.renderSelectLanguageDialog(this, languageList) { _, i ->
refreshToSelectedLanguage(languageList[i])
}
true
}
else -> super.onOptionsItemSelected(item)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ class QuestionnaireContainerFragment : Fragment() {
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.top_bar_menu, menu)
menu.findItem(R.id.action_submit).isVisible = true
menu.findItem(R.id.action_language).isVisible = false
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
/*
* Copyright 2020 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.google.android.fhir.datacapture.gallery.utils

import android.app.Activity
import android.content.Context
import android.content.DialogInterface
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 LocaleUtils {

private const val SHARED_PREF_KEY_LANG = "shared_pref_key_lang"

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) {
updateResourcesLocaleConfiguration(context, locale)
} else {
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 {
val localeList = LocaleList(locale)
it.setLocales(localeList)
LocaleList.setDefault(it.locales)

context.createConfigurationContext(it)
}
}

@Suppress("DEPRECATION")
ndegwamartin marked this conversation as resolved.
Show resolved Hide resolved
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 renderSelectLanguageDialog(
context: Activity,
languageList: List<Language>,
listener: DialogInterface.OnClickListener
) {
val adapter: ArrayAdapter<Language> =
ArrayAdapter(context, android.R.layout.simple_list_item_1, languageList)

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
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal"
>
<path
android:fillColor="@android:color/white"
android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM18.92,8h-2.95c-0.32,-1.25 -0.78,-2.45 -1.38,-3.56 1.84,0.63 3.37,1.91 4.33,3.56zM12,4.04c0.83,1.2 1.48,2.53 1.91,3.96h-3.82c0.43,-1.43 1.08,-2.76 1.91,-3.96zM4.26,14C4.1,13.36 4,12.69 4,12s0.1,-1.36 0.26,-2h3.38c-0.08,0.66 -0.14,1.32 -0.14,2s0.06,1.34 0.14,2L4.26,14zM5.08,16h2.95c0.32,1.25 0.78,2.45 1.38,3.56 -1.84,-0.63 -3.37,-1.9 -4.33,-3.56zM8.03,8L5.08,8c0.96,-1.66 2.49,-2.93 4.33,-3.56C8.81,5.55 8.35,6.75 8.03,8zM12,19.96c-0.83,-1.2 -1.48,-2.53 -1.91,-3.96h3.82c-0.43,1.43 -1.08,2.76 -1.91,3.96zM14.34,14L9.66,14c-0.09,-0.66 -0.16,-1.32 -0.16,-2s0.07,-1.35 0.16,-2h4.68c0.09,0.65 0.16,1.32 0.16,2s-0.07,1.34 -0.16,2zM14.59,19.56c0.6,-1.11 1.06,-2.31 1.38,-3.56h2.95c-0.96,1.65 -2.49,2.93 -4.33,3.56zM16.36,14c0.08,-0.66 0.14,-1.32 0.14,-2s-0.06,-1.34 -0.14,-2h3.38c0.16,0.64 0.26,1.31 0.26,2s-0.1,1.36 -0.26,2h-3.38z"
/>
</vector>
7 changes: 7 additions & 0 deletions datacapturegallery/src/main/res/menu/top_bar_menu.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@
android:layout_height="match_parent"
tools:context=".MainActivity"
>
<item
android:id="@+id/action_language"
android:orderInCategory="300"
android:title="@string/select_language"
android:icon="@drawable/outline_language_24"
app:showAsAction="always"
/>

<item
android:id="@+id/action_submit"
Expand Down
20 changes: 20 additions & 0 deletions datacapturegallery/src/main/res/values-vi/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<!--
Copyright 2020 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources>
<string name="app_name">Thư viện thu thập dữ liệu</string>
<string name="submit_button_text">Gửi</string>
<string name="select_language">Chọn ngôn ngữ</string>
</resources>
7 changes: 7 additions & 0 deletions datacapturegallery/src/main/res/values/languages.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<string-array name="languages">
<item>en</item>
<item>vi-VN</item>
</string-array>
</resources>
1 change: 1 addition & 0 deletions datacapturegallery/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,5 @@
<resources>
<string name="app_name">Data Capture Gallery</string>
<string name="submit_button_text">Submit</string>
<string name="select_language">Select Language</string>
</resources>