From 5d09cfa0c2e4028b1d4fa91dbf11a83425cd2e27 Mon Sep 17 00:00:00 2001 From: Severiano Jaramillo Date: Mon, 6 Jan 2020 10:08:46 -0600 Subject: [PATCH] Avoid crash due to unsupported currency locale. - Avoided a crash in ConnectedActivity when trying to obtain the Locale's associated currency, when a Locale does not have a currency. This can happen when the locale is configured for a region like Latin America and not for a specific country. - Standardized the process to obtain the coingecko supported currency, which will first try to use the current locale's currency and fallback to the default in case the first is not supported. --- .../activities/ConnectedActivity.kt | 3 +- .../fragments/FilterOptionsDialog.kt | 3 +- .../bitsybitshareswallet/utils/Helper.kt | 15 +++++++-- .../viewmodels/TransactionsViewModel.kt | 3 +- .../bitsybitshareswallet/utils/HelperTest.kt | 33 +++++++++++++++++++ 5 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 app/src/test/java/cy/agorise/bitsybitshareswallet/utils/HelperTest.kt diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/ConnectedActivity.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/ConnectedActivity.kt index ec19bdf..8170607 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/ConnectedActivity.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/ConnectedActivity.kt @@ -121,8 +121,7 @@ abstract class ConnectedActivity : AppCompatActivity() { // Configure ConnectedActivityViewModel to obtain missing equivalent values mConnectedActivityViewModel = ViewModelProviders.of(this).get(ConnectedActivityViewModel::class.java) - val currency = Currency.getInstance(Locale.getDefault()) - val currencyCode = Helper.getCoingeckoSupportedCurrency(currency.currencyCode) + val currencyCode = Helper.getCoingeckoSupportedCurrency(Locale.getDefault()) Log.d(TAG, "Using currency: ${currencyCode.toUpperCase(Locale.ROOT)}") mConnectedActivityViewModel.observeMissingEquivalentValuesIn(currencyCode) diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/FilterOptionsDialog.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/FilterOptionsDialog.kt index 9272a51..4712f6f 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/FilterOptionsDialog.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/FilterOptionsDialog.kt @@ -159,8 +159,7 @@ class FilterOptionsDialog : DialogFragment(), DatePickerFragment.OnDateSetListen llEquivalentValue.visibility = if(isChecked) View.GONE else View.VISIBLE } cbEquivalentValue.isChecked = mFilterOptions.equivalentValueAll - val currency = Currency.getInstance(Locale.getDefault()) - val currencyCode = Helper.getCoingeckoSupportedCurrency(currency.currencyCode) + val currencyCode = Helper.getCoingeckoSupportedCurrency(Locale.getDefault()) mCurrency = Currency.getInstance(currencyCode) val fromEquivalentValue = mFilterOptions.fromEquivalentValue / diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/Helper.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/Helper.kt index e32b1eb..9526e9f 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/Helper.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/Helper.kt @@ -57,9 +57,18 @@ object Helper { } /** - * If the given currency code is supported, returns it, else returns the default one. + * Verifies that the locale has a valid currency, else uses the default one. Then if + * the given currency code is supported, returns it, else returns the default one. */ - fun getCoingeckoSupportedCurrency(currencyCode: String): String { + fun getCoingeckoSupportedCurrency(locale: Locale): String { + val currency = try { + Currency.getInstance(locale) + } catch (e: IllegalArgumentException) { + Currency.getInstance(Locale.US) + } + + val currencyCode = currency.currencyCode + val supportedCurrencies = setOf("usd", "aed", "ars", "aud", "bdt", "bhd", "bmd", "brl", "cad", "chf", "clp", "cny", "czk", "dkk", "eur", "gbp", "hkd", "huf", "idr", "ils", "inr", "jpy", "krw", "kwd", "lkr", "mmk", "mxn", "myr", "nok", "nzd", "php", "pkr", "pln", "rub", "sar", @@ -68,6 +77,6 @@ object Helper { return if (currencyCode.toLowerCase(Locale.ROOT) in supportedCurrencies) currencyCode else - "usd" + "USD" } } \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/viewmodels/TransactionsViewModel.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/viewmodels/TransactionsViewModel.kt index ef81ad5..5b0966c 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/viewmodels/TransactionsViewModel.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/viewmodels/TransactionsViewModel.kt @@ -39,8 +39,7 @@ class TransactionsViewModel(application: Application) : AndroidViewModel(applica } internal fun getFilteredTransactions(userId: String): LiveData> { - val currency = Currency.getInstance(Locale.getDefault()) - val currencyCode = Helper.getCoingeckoSupportedCurrency(currency.currencyCode) + val currencyCode = Helper.getCoingeckoSupportedCurrency(Locale.getDefault()) transactions = mRepository.getAll(userId, currencyCode) filteredTransactions.addSource(transactions) { transactions -> diff --git a/app/src/test/java/cy/agorise/bitsybitshareswallet/utils/HelperTest.kt b/app/src/test/java/cy/agorise/bitsybitshareswallet/utils/HelperTest.kt new file mode 100644 index 0000000..cd31504 --- /dev/null +++ b/app/src/test/java/cy/agorise/bitsybitshareswallet/utils/HelperTest.kt @@ -0,0 +1,33 @@ +package cy.agorise.bitsybitshareswallet.utils + +import org.junit.Test +import org.junit.Assert.* +import java.util.* + + +class HelperTest { + + @Test + fun getCoingeckoSupportedCurrency_InvalidInput_ReturnsUSD() { + val locale = Locale("es") + + val currencyCode = Helper.getCoingeckoSupportedCurrency(locale) + assertEquals("USD", currencyCode) + } + + @Test + fun getCoingeckoSupportedCurrency_UnsupportedInput_ReturnsUSD() { + val locale = Locale("es", "PE") + + val currencyCode = Helper.getCoingeckoSupportedCurrency(locale) + assertEquals("USD", currencyCode) + } + + @Test + fun getCoingeckoSupportedCurrency_SupportedInput_ReturnsItself() { + val locale = Locale("es", "MX") + + val currencyCode = Helper.getCoingeckoSupportedCurrency(locale) + assertEquals("MXN", currencyCode) + } +} \ No newline at end of file