Add currency converter symbol aliases (i.e. € for EUR)

This commit is contained in:
MM20 2024-05-18 13:01:08 +02:00
parent 8054f6e5c4
commit 32276934bb
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
2 changed files with 102 additions and 6 deletions

View File

@ -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("", "PLN")
put("", "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)
}
}

View File

@ -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)
}
}