From 79c3f3c925665438c5320423cb6450b7ff1b6bc4 Mon Sep 17 00:00:00 2001 From: jhugman Date: Thu, 30 Jul 2020 17:28:26 +0000 Subject: [PATCH] =?UTF-8?q?For=20#11664=20=E2=80=94=20Fixup=20MissingResou?= =?UTF-8?q?rceExceptions=20being=20thrown=20in=20exotic=20Locales=20(#1312?= =?UTF-8?q?4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- .../metrics/LeanplumMetricsService.kt | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/LeanplumMetricsService.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/LeanplumMetricsService.kt index 99a0d4a50..aa8f712c9 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/LeanplumMetricsService.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/LeanplumMetricsService.kt @@ -21,6 +21,7 @@ import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.components.metrics.MozillaProductDetector.MozillaProducts import org.mozilla.fenix.ext.settings import java.util.Locale +import java.util.MissingResourceException import java.util.UUID.randomUUID private val Event.name: String? @@ -83,12 +84,19 @@ class LeanplumMetricsService(private val application: Application) : MetricsServ leanplumJob = scope.launch { val applicationSetLocale = LocaleManager.getCurrentLocale(application) - val currentLocale = when (applicationSetLocale != null) { - true -> applicationSetLocale.isO3Language - false -> Locale.getDefault().isO3Language - } - if (!isLeanplumEnabled(currentLocale)) { - Log.i(LOGTAG, "Leanplum is not available for this locale: $currentLocale") + val currentLocale = applicationSetLocale ?: Locale.getDefault() + val languageCode = + currentLocale.iso3LanguageOrNull + ?: currentLocale.language.let { + if (it.isNotBlank()) { + it + } else { + currentLocale.toString() + } + } + + if (!isLeanplumEnabled(languageCode)) { + Log.i(LOGTAG, "Leanplum is not available for this locale: $languageCode") return@launch } @@ -170,6 +178,12 @@ class LeanplumMetricsService(private val application: Application) : MetricsServ return LEANPLUM_ENABLED_LOCALES.contains(locale) } + private val Locale.iso3LanguageOrNull: String? + get() = + try { + this.isO3Language + } catch (_: MissingResourceException) { null } + companion object { private const val LOGTAG = "LeanplumMetricsService" @@ -181,7 +195,7 @@ class LeanplumMetricsService(private val application: Application) : MetricsServ get() = BuildConfig.LEANPLUM_TOKEN.orEmpty() // Leanplum needs to be enabled for the following locales. // Irrespective of the actual device location. - private val LEANPLUM_ENABLED_LOCALES = listOf( + private val LEANPLUM_ENABLED_LOCALES = setOf( "eng", // English "zho", // Chinese "deu", // German