From 32276934bb60dfa479f5b3f68c78a67cd094d23a Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sat, 18 May 2024 13:01:08 +0200 Subject: [PATCH] =?UTF-8?q?Add=20currency=20converter=20symbol=20aliases?= =?UTF-8?q?=20(i.e.=20=E2=82=AC=20for=20EUR)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../currencies/CurrencyRepository.kt | 99 ++++++++++++++++++- .../converters/CurrencyConverter.kt | 9 +- 2 files changed, 102 insertions(+), 6 deletions(-) diff --git a/data/currencies/src/main/java/de/mm20/launcher2/currencies/CurrencyRepository.kt b/data/currencies/src/main/java/de/mm20/launcher2/currencies/CurrencyRepository.kt index c8b85a4f..2dd2b71a 100644 --- a/data/currencies/src/main/java/de/mm20/launcher2/currencies/CurrencyRepository.kt +++ b/data/currencies/src/main/java/de/mm20/launcher2/currencies/CurrencyRepository.kt @@ -2,15 +2,97 @@ package de.mm20.launcher2.currencies import android.content.Context import android.util.Log -import androidx.work.* +import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.PeriodicWorkRequest +import androidx.work.WorkManager import de.mm20.launcher2.database.AppDatabase -import kotlinx.coroutines.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.util.Locale import java.util.concurrent.TimeUnit class CurrencyRepository( private val context: Context, ) { + private val currencySymbolAliases = buildMap { + val ownCurrency = java.util.Currency.getInstance(Locale.getDefault()).symbol ?: "USD" + + put("€", "EUR") + + val dollarSymbolCurrencies = listOf( + // dollar + "AUD", + "BBD", + "BMD", + "BND", + "BSD", + "BZD", + "CAD", + "FJD", + "GYD", + "HKD", + "JMD", + "KID", + "KYD", + "LRD", + "NAD", + "NZD", + "SBD", + "SGD", + "SRD", + "TTD", + "TVD", + "TWD", + "USD", + "XCD", + // peso + "ARS", + "CLP", + "COP", + "DOP", + "MXN", + "UYU", + ) + + if (ownCurrency in dollarSymbolCurrencies) { + put("$", ownCurrency) + } else { + put("$", "USD") + } + + val poundSymbolCurrencies = listOf("EGP", "FKP", "GBP", "GIP", "SHP", "SDG", "SYP") + if (ownCurrency in poundSymbolCurrencies) { + put("£", ownCurrency) + } else { + put("£", "GBP") + } + + put("¥", if (ownCurrency == "CNY") "CNY" else "JPY") + put("₩", if (ownCurrency == "KPW") "KPW" else "KRW") + + put("kr", if (ownCurrency == "NOK") "NOK" else "SEK") + put("kr.", "DKK") + put("Kr", "ISK") + + put("zł", "PLN") + put("Kč", "CZK") + put("₴", "UAH") + put("₽", "RUB") + put("Ft", "HUF") + + put("₪", "ILS") + put("TL", "TRY") + + put("R$", "BRL") + + put("₱", if (ownCurrency == "CUP") "CUP" else "PHP") + put("฿", "THB") + put("₹", "INR") + + return@buildMap + } + fun enableCurrencyUpdateWorker() { val currencyWorker = PeriodicWorkRequest.Builder(ExchangeRateWorker::class.java, 60, TimeUnit.MINUTES) @@ -25,6 +107,16 @@ class CurrencyRepository( WorkManager.getInstance(context).cancelUniqueWork("ExchangeRates") } + /** + * Resolves currency symbol aliases to their full currency symbol. + * (e.g. € -> EUR) + * @param symbol The currency symbol to resolve + * @return The resolved currency symbol or the original symbol if no alias was found + */ + fun resolveAlias(symbol: String): String { + return currencySymbolAliases[symbol] ?: symbol + } + suspend fun convertCurrency( fromCurrency: String, value: Double, @@ -62,8 +154,9 @@ class CurrencyRepository( } suspend fun isValidCurrency(symbol: String): Boolean { + val isoSymbol = currencySymbolAliases[symbol] ?: symbol return withContext(Dispatchers.IO) { - AppDatabase.getInstance(context).currencyDao().exists(symbol) + AppDatabase.getInstance(context).currencyDao().exists(isoSymbol) } } diff --git a/data/unitconverter/src/main/java/de/mm20/launcher2/unitconverter/converters/CurrencyConverter.kt b/data/unitconverter/src/main/java/de/mm20/launcher2/unitconverter/converters/CurrencyConverter.kt index 21d5de35..18457cf4 100644 --- a/data/unitconverter/src/main/java/de/mm20/launcher2/unitconverter/converters/CurrencyConverter.kt +++ b/data/unitconverter/src/main/java/de/mm20/launcher2/unitconverter/converters/CurrencyConverter.kt @@ -59,7 +59,10 @@ class CurrencyConverter( override suspend fun convert(context: Context, fromUnit: String, value: Double, toUnit: String?): UnitConverter { - val values = repository.convertCurrency(fromUnit, value, toUnit).map { + val fromIsoCode = repository.resolveAlias(fromUnit) + val toIsoCode = toUnit?.let { repository.resolveAlias(it) } + + val values = repository.convertCurrency(fromIsoCode, value, toIsoCode).map { UnitValue(it.second, it.first, formatName(it.first, it.second), formatValue(it.first, it.second)) }.toMutableList() @@ -82,8 +85,8 @@ class CurrencyConverter( values.add(0, ownCurrency) } - val inputValue = UnitValue(value, fromUnit, formatName(fromUnit, value), formatValue(fromUnit, value)) - val lastUpdate = repository.getLastUpdate(fromUnit) + val inputValue = UnitValue(value, fromIsoCode, formatName(fromIsoCode, value), formatValue(fromIsoCode, value)) + val lastUpdate = repository.getLastUpdate(fromIsoCode) return CurrencyUnitConverter(dimension, inputValue, values, lastUpdate) } } \ No newline at end of file