1
0
Fork 0

For #11664 — Fixup MissingResourceExceptions being thrown in exotic Locales (#13124)

Our kotlin code is not catching the `MissingResourceException` in the `LeanplumMetricsService` which results in the app crashing when the locale isn't known by the device.

Catches the exception, and falls back to the ISO 639 language code. This isn't a great solution, because ISO 639 isn't especially stable.

In practice however this is almost certainly never going to be a problem because Leanplum isn't going to be supported in such exotic locales.

In this case, using the ISO 639 language code allows the error message to be more informative.
master
jhugman 2020-07-30 17:28:26 +00:00 committed by GitHub
parent 0356bea50e
commit 79c3f3c925
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 21 additions and 7 deletions

View File

@ -21,6 +21,7 @@ import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.components.metrics.MozillaProductDetector.MozillaProducts import org.mozilla.fenix.components.metrics.MozillaProductDetector.MozillaProducts
import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.settings
import java.util.Locale import java.util.Locale
import java.util.MissingResourceException
import java.util.UUID.randomUUID import java.util.UUID.randomUUID
private val Event.name: String? private val Event.name: String?
@ -83,12 +84,19 @@ class LeanplumMetricsService(private val application: Application) : MetricsServ
leanplumJob = scope.launch { leanplumJob = scope.launch {
val applicationSetLocale = LocaleManager.getCurrentLocale(application) val applicationSetLocale = LocaleManager.getCurrentLocale(application)
val currentLocale = when (applicationSetLocale != null) { val currentLocale = applicationSetLocale ?: Locale.getDefault()
true -> applicationSetLocale.isO3Language val languageCode =
false -> Locale.getDefault().isO3Language currentLocale.iso3LanguageOrNull
} ?: currentLocale.language.let {
if (!isLeanplumEnabled(currentLocale)) { if (it.isNotBlank()) {
Log.i(LOGTAG, "Leanplum is not available for this locale: $currentLocale") it
} else {
currentLocale.toString()
}
}
if (!isLeanplumEnabled(languageCode)) {
Log.i(LOGTAG, "Leanplum is not available for this locale: $languageCode")
return@launch return@launch
} }
@ -170,6 +178,12 @@ class LeanplumMetricsService(private val application: Application) : MetricsServ
return LEANPLUM_ENABLED_LOCALES.contains(locale) return LEANPLUM_ENABLED_LOCALES.contains(locale)
} }
private val Locale.iso3LanguageOrNull: String?
get() =
try {
this.isO3Language
} catch (_: MissingResourceException) { null }
companion object { companion object {
private const val LOGTAG = "LeanplumMetricsService" private const val LOGTAG = "LeanplumMetricsService"
@ -181,7 +195,7 @@ class LeanplumMetricsService(private val application: Application) : MetricsServ
get() = BuildConfig.LEANPLUM_TOKEN.orEmpty() get() = BuildConfig.LEANPLUM_TOKEN.orEmpty()
// Leanplum needs to be enabled for the following locales. // Leanplum needs to be enabled for the following locales.
// Irrespective of the actual device location. // Irrespective of the actual device location.
private val LEANPLUM_ENABLED_LOCALES = listOf( private val LEANPLUM_ENABLED_LOCALES = setOf(
"eng", // English "eng", // English
"zho", // Chinese "zho", // Chinese
"deu", // German "deu", // German