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.
This commit is contained in:
parent
20571d49a3
commit
5d09cfa0c2
5 changed files with 48 additions and 9 deletions
|
@ -121,8 +121,7 @@ abstract class ConnectedActivity : AppCompatActivity() {
|
||||||
// Configure ConnectedActivityViewModel to obtain missing equivalent values
|
// Configure ConnectedActivityViewModel to obtain missing equivalent values
|
||||||
mConnectedActivityViewModel = ViewModelProviders.of(this).get(ConnectedActivityViewModel::class.java)
|
mConnectedActivityViewModel = ViewModelProviders.of(this).get(ConnectedActivityViewModel::class.java)
|
||||||
|
|
||||||
val currency = Currency.getInstance(Locale.getDefault())
|
val currencyCode = Helper.getCoingeckoSupportedCurrency(Locale.getDefault())
|
||||||
val currencyCode = Helper.getCoingeckoSupportedCurrency(currency.currencyCode)
|
|
||||||
Log.d(TAG, "Using currency: ${currencyCode.toUpperCase(Locale.ROOT)}")
|
Log.d(TAG, "Using currency: ${currencyCode.toUpperCase(Locale.ROOT)}")
|
||||||
mConnectedActivityViewModel.observeMissingEquivalentValuesIn(currencyCode)
|
mConnectedActivityViewModel.observeMissingEquivalentValuesIn(currencyCode)
|
||||||
|
|
||||||
|
|
|
@ -159,8 +159,7 @@ class FilterOptionsDialog : DialogFragment(), DatePickerFragment.OnDateSetListen
|
||||||
llEquivalentValue.visibility = if(isChecked) View.GONE else View.VISIBLE }
|
llEquivalentValue.visibility = if(isChecked) View.GONE else View.VISIBLE }
|
||||||
cbEquivalentValue.isChecked = mFilterOptions.equivalentValueAll
|
cbEquivalentValue.isChecked = mFilterOptions.equivalentValueAll
|
||||||
|
|
||||||
val currency = Currency.getInstance(Locale.getDefault())
|
val currencyCode = Helper.getCoingeckoSupportedCurrency(Locale.getDefault())
|
||||||
val currencyCode = Helper.getCoingeckoSupportedCurrency(currency.currencyCode)
|
|
||||||
mCurrency = Currency.getInstance(currencyCode)
|
mCurrency = Currency.getInstance(currencyCode)
|
||||||
|
|
||||||
val fromEquivalentValue = mFilterOptions.fromEquivalentValue /
|
val fromEquivalentValue = mFilterOptions.fromEquivalentValue /
|
||||||
|
|
|
@ -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",
|
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",
|
"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",
|
"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)
|
return if (currencyCode.toLowerCase(Locale.ROOT) in supportedCurrencies)
|
||||||
currencyCode
|
currencyCode
|
||||||
else
|
else
|
||||||
"usd"
|
"USD"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -39,8 +39,7 @@ class TransactionsViewModel(application: Application) : AndroidViewModel(applica
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun getFilteredTransactions(userId: String): LiveData<List<TransferDetail>> {
|
internal fun getFilteredTransactions(userId: String): LiveData<List<TransferDetail>> {
|
||||||
val currency = Currency.getInstance(Locale.getDefault())
|
val currencyCode = Helper.getCoingeckoSupportedCurrency(Locale.getDefault())
|
||||||
val currencyCode = Helper.getCoingeckoSupportedCurrency(currency.currencyCode)
|
|
||||||
transactions = mRepository.getAll(userId, currencyCode)
|
transactions = mRepository.getAll(userId, currencyCode)
|
||||||
|
|
||||||
filteredTransactions.addSource(transactions) { transactions ->
|
filteredTransactions.addSource(transactions) { transactions ->
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue