Cache currency rates

closes #79
This commit is contained in:
Sad Ellie 2023-09-14 22:56:10 +03:00
parent 8ffaf4b08b
commit 2e2ec1d753
16 changed files with 650 additions and 289 deletions

View File

@ -0,0 +1,166 @@
{
"formatVersion": 1,
"database": {
"version": 5,
"identityHash": "920913c194487fd80e7020d3606cf8da",
"entities": [
{
"tableName": "units",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`unitId` TEXT NOT NULL, `is_favorite` INTEGER NOT NULL, `paired_unit_id` TEXT, `frequency` INTEGER NOT NULL, PRIMARY KEY(`unitId`))",
"fields": [
{
"fieldPath": "unitId",
"columnName": "unitId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isFavorite",
"columnName": "is_favorite",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "pairedUnitId",
"columnName": "paired_unit_id",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "frequency",
"columnName": "frequency",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"unitId"
]
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "calculator_history",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`entityId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `timestamp` INTEGER NOT NULL, `expression` TEXT NOT NULL, `result` TEXT NOT NULL)",
"fields": [
{
"fieldPath": "entityId",
"columnName": "entityId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "expression",
"columnName": "expression",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "result",
"columnName": "result",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"entityId"
]
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "time_zones",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `position` INTEGER NOT NULL, `label` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "position",
"columnName": "position",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "label",
"columnName": "label",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "currency_rates",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`entityId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `base_unit_id` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, `pair_unit_id` TEXT NOT NULL, `pair_unit_value` TEXT)",
"fields": [
{
"fieldPath": "entityId",
"columnName": "entityId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "baseUnitId",
"columnName": "base_unit_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "date",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "pairUnitId",
"columnName": "pair_unit_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pairUnitValue",
"columnName": "pair_unit_value",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"entityId"
]
},
"indices": [],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '920913c194487fd80e7020d3606cf8da')"
]
}
}

View File

@ -0,0 +1,34 @@
/*
* Unitto is a unit converter for Android
* Copyright (c) 2023 Elshan Agaev
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.sadellie.unitto.data.database
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
@Dao
interface CurrencyRatesDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertRates(currencyRates: List<CurrencyRatesEntity>)
@Query("SELECT DISTINCT * FROM currency_rates WHERE timestamp = (SELECT MAX(timestamp) FROM currency_rates) AND base_unit_id = :baseId")
suspend fun getLatestRates(baseId: String): List<CurrencyRatesEntity>
}

View File

@ -0,0 +1,33 @@
/*
* Unitto is a unit converter for Android
* Copyright (c) 2023 Elshan Agaev
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.sadellie.unitto.data.database
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import java.math.BigDecimal
@Entity(tableName = "currency_rates")
class CurrencyRatesEntity(
@PrimaryKey(autoGenerate = true) val entityId: Int = 0,
@ColumnInfo(name = "base_unit_id") val baseUnitId: String,
@ColumnInfo(name = "timestamp") val date: Long,
@ColumnInfo(name = "pair_unit_id") val pairUnitId: String,
@ColumnInfo(name = "pair_unit_value") val pairUnitValue: BigDecimal?
)

View File

@ -21,23 +21,29 @@ package com.sadellie.unitto.data.database
import androidx.room.AutoMigration
import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import com.sadellie.unitto.data.database.converters.Converters
@Database(
version = 4,
version = 5,
exportSchema = true,
entities = [
UnitsEntity::class,
CalculatorHistoryEntity::class,
TimeZoneEntity::class
TimeZoneEntity::class,
CurrencyRatesEntity::class,
],
autoMigrations = [
AutoMigration (from = 1, to = 2),
AutoMigration (from = 2, to = 3),
AutoMigration (from = 3, to = 4),
AutoMigration (from = 4, to = 5),
]
)
@TypeConverters(Converters::class)
abstract class UnittoDatabase : RoomDatabase() {
abstract fun unitsDao(): UnitsDao
abstract fun calculatorHistoryDao(): CalculatorHistoryDao
abstract fun timeZoneDao(): TimeZoneDao
abstract fun currencyRatesDao(): CurrencyRatesDao
}

View File

@ -34,23 +34,12 @@ import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
@Module
class UnittoDatabaseModule {
/**
* Tells Hilt to use this method to get [UnitsDao]
*
* @param unittoDatabase Database for which we need DAO
* @return Singleton of [UnitsDao]
*/
@Provides
fun provideUnitsDao(unittoDatabase: UnittoDatabase): UnitsDao {
return unittoDatabase.unitsDao()
}
/**
* Tells Hilt to use this method to get [CalculatorHistoryDao]
*
* @param unittoDatabase Database for which we need DAO
* @return Singleton of [CalculatorHistoryDao]
*/
@Provides
fun provideCalculatorHistoryDao(unittoDatabase: UnittoDatabase): CalculatorHistoryDao {
return unittoDatabase.calculatorHistoryDao()
@ -68,6 +57,11 @@ class UnittoDatabaseModule {
// return unittoDatabase.timeZoneDao()
// }
@Provides
fun provideCurrencyRatesDao(unittoDatabase: UnittoDatabase): CurrencyRatesDao {
return unittoDatabase.currencyRatesDao()
}
/**
* Tells Hilt to use this method to get [UnittoDatabase]
*

View File

@ -0,0 +1,40 @@
/*
* Unitto is a unit converter for Android
* Copyright (c) 2023 Elshan Agaev
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.sadellie.unitto.data.database.converters
import androidx.room.TypeConverter
import java.math.BigDecimal
class Converters {
@TypeConverter
fun stringToBigDecimal(value: String): BigDecimal = try {
BigDecimal(value)
} catch (e: Exception) {
BigDecimal.ZERO
}
@TypeConverter
fun bigDecimalToString(value: BigDecimal?): String? = try {
value?.toPlainString()
} catch (e: Exception) {
null
}
}

View File

@ -34,8 +34,6 @@ data class ReverseUnit(
override val counter: Int = 0,
) : DefaultUnit {
override fun convert(unitTo: DefaultUnit, value: BigDecimal): BigDecimal {
// Avoid division by zero
if (unitTo.basicUnit.compareTo(BigDecimal.ZERO) == 0) return BigDecimal.ZERO
return unitTo
.basicUnit

View File

@ -19,6 +19,9 @@
package com.sadellie.unitto.data.units
import android.content.Context
import android.util.Log
import com.sadellie.unitto.data.database.CurrencyRatesDao
import com.sadellie.unitto.data.database.CurrencyRatesEntity
import com.sadellie.unitto.data.database.UnitsDao
import com.sadellie.unitto.data.database.UnitsEntity
import com.sadellie.unitto.data.model.UnitGroup
@ -65,37 +68,39 @@ import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.withContext
import java.math.BigDecimal
import java.time.LocalDate
import javax.inject.Inject
class UnitsRepository @Inject constructor(
private val unitsDao: UnitsDao,
private val currencyRatesDao: CurrencyRatesDao,
@ApplicationContext private val mContext: Context,
) {
private val myUnits = MutableStateFlow(
lengthCollection +
currencyCollection +
massCollection +
speedCollection +
temperatureCollection +
areaCollection +
timeCollection +
volumeCollection +
dataCollection +
pressureCollection +
accelerationCollection +
energyCollection +
powerCollection +
angleCollection +
dataTransferCollection +
fluxCollection +
numberBaseCollection +
electrostaticCapacitance +
prefixCollection +
forceCollection +
torqueCollection +
flowRateCollection +
luminanceCollection +
fuelConsumptionCollection
currencyCollection +
massCollection +
speedCollection +
temperatureCollection +
areaCollection +
timeCollection +
volumeCollection +
dataCollection +
pressureCollection +
accelerationCollection +
energyCollection +
powerCollection +
angleCollection +
dataTransferCollection +
fluxCollection +
numberBaseCollection +
electrostaticCapacitance +
prefixCollection +
forceCollection +
torqueCollection +
flowRateCollection +
luminanceCollection +
fuelConsumptionCollection
)
@OptIn(ExperimentalCoroutinesApi::class)
@ -108,27 +113,31 @@ class UnitsRepository @Inject constructor(
.mapLatest { basedList ->
basedList.forEach { based ->
// Have to use a copy so that composable can detect changes
val updatedUnit = when(val foundUnit = getById(based.unitId)) {
val updatedUnit = when (val foundUnit = getById(based.unitId)) {
is NormalUnit -> foundUnit.copy(
isFavorite = based.isFavorite,
counter = based.frequency,
pairId = based.pairedUnitId
)
is NumberBaseUnit -> foundUnit.copy(
isFavorite = based.isFavorite,
counter = based.frequency,
pairId = based.pairedUnitId
)
is ReverseUnit -> foundUnit.copy(
isFavorite = based.isFavorite,
counter = based.frequency,
pairId = based.pairedUnitId
)
is FuelForward -> foundUnit.copy(
isFavorite = based.isFavorite,
counter = based.frequency,
pairId = based.pairedUnitId
)
is FuelBackward -> foundUnit.copy(
isFavorite = based.isFavorite,
counter = based.frequency,
@ -220,23 +229,45 @@ class UnitsRepository @Inject constructor(
}
}
suspend fun updateRates(unit: AbstractUnit) = withContext(Dispatchers.IO) {
val conversions: Map<String, BigDecimal> = CurrencyApi.service.getCurrencyPairs(unit.id).currency
suspend fun updateRates(unit: AbstractUnit): LocalDate? = withContext(Dispatchers.IO) {
try {
val conversions = CurrencyApi.service.getCurrencyPairs(unit.id)
val rates = conversions.currency
.map { (pairId, pairValue) ->
CurrencyRatesEntity(
baseUnitId = unit.id,
date = LocalDate.parse(conversions.date).toEpochDay(),
pairUnitId = pairId,
pairUnitValue = BigDecimal.valueOf(pairValue)
)
}
currencyRatesDao.insertRates(rates)
} catch (e: Exception) {
Log.d("UnitsRepository", "Skipped update: $e")
}
val basedConversions = currencyRatesDao.getLatestRates(baseId = unit.id)
myUnits.update { item ->
item.map {
if (it.group != UnitGroup.CURRENCY) return@map it
if (it !is NormalUnit) return@map it
myUnits.update { units ->
units.map { localUnit ->
if (localUnit.group != UnitGroup.CURRENCY) return@map localUnit
if (localUnit !is ReverseUnit) return@map localUnit
val rate = conversions.getOrElse(it.id) { BigDecimal.ZERO }
val rate = basedConversions
.firstOrNull { localUnit.id == it.pairUnitId }
?.pairUnitValue ?: BigDecimal.ZERO
return@map if (rate > BigDecimal.ZERO) {
it.copy(basicUnit = rate)
localUnit.copy(basicUnit = rate)
} else {
it.copy(basicUnit = BigDecimal.ZERO)
localUnit.copy(basicUnit = BigDecimal.ZERO)
}
}
}
return@withContext basedConversions
.firstOrNull()
?.date
?.let { LocalDate.ofEpochDay(it) }
}
fun filterUnits(

View File

@ -19,221 +19,221 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.core.base.R
import com.sadellie.unitto.data.model.unit.AbstractUnit
import com.sadellie.unitto.data.model.unit.NormalUnit
import com.sadellie.unitto.data.model.UnitGroup
import com.sadellie.unitto.data.model.unit.AbstractUnit
import com.sadellie.unitto.data.model.unit.ReverseUnit
import com.sadellie.unitto.data.units.MyUnitIDS
import java.math.BigDecimal
internal val currencyCollection: List<AbstractUnit> by lazy {
listOf(
NormalUnit(MyUnitIDS.currency_1inch, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_1inch, R.string.currency_1inch_short),
NormalUnit(MyUnitIDS.currency_ada, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_ada, R.string.currency_ada_short),
NormalUnit(MyUnitIDS.currency_aed, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_aed, R.string.currency_aed_short),
NormalUnit(MyUnitIDS.currency_afn, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_afn, R.string.currency_afn_short),
NormalUnit(MyUnitIDS.currency_algo, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_algo, R.string.currency_algo_short),
NormalUnit(MyUnitIDS.currency_all, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_all, R.string.currency_all_short),
NormalUnit(MyUnitIDS.currency_amd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_amd, R.string.currency_amd_short),
NormalUnit(MyUnitIDS.currency_ang, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_ang, R.string.currency_ang_short),
NormalUnit(MyUnitIDS.currency_aoa, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_aoa, R.string.currency_aoa_short),
NormalUnit(MyUnitIDS.currency_ars, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_ars, R.string.currency_ars_short),
NormalUnit(MyUnitIDS.currency_atom, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_atom, R.string.currency_atom_short),
NormalUnit(MyUnitIDS.currency_aud, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_aud, R.string.currency_aud_short),
NormalUnit(MyUnitIDS.currency_avax, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_avax, R.string.currency_avax_short),
NormalUnit(MyUnitIDS.currency_awg, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_awg, R.string.currency_awg_short),
NormalUnit(MyUnitIDS.currency_azn, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_azn, R.string.currency_azn_short),
NormalUnit(MyUnitIDS.currency_bam, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_bam, R.string.currency_bam_short),
NormalUnit(MyUnitIDS.currency_bbd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_bbd, R.string.currency_bbd_short),
NormalUnit(MyUnitIDS.currency_bch, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_bch, R.string.currency_bch_short),
NormalUnit(MyUnitIDS.currency_bdt, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_bdt, R.string.currency_bdt_short),
NormalUnit(MyUnitIDS.currency_bgn, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_bgn, R.string.currency_bgn_short),
NormalUnit(MyUnitIDS.currency_bhd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_bhd, R.string.currency_bhd_short),
NormalUnit(MyUnitIDS.currency_bif, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_bif, R.string.currency_bif_short),
NormalUnit(MyUnitIDS.currency_bmd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_bmd, R.string.currency_bmd_short),
NormalUnit(MyUnitIDS.currency_bnb, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_bnb, R.string.currency_bnb_short),
NormalUnit(MyUnitIDS.currency_bnd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_bnd, R.string.currency_bnd_short),
NormalUnit(MyUnitIDS.currency_bob, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_bob, R.string.currency_bob_short),
NormalUnit(MyUnitIDS.currency_brl, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_brl, R.string.currency_brl_short),
NormalUnit(MyUnitIDS.currency_bsd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_bsd, R.string.currency_bsd_short),
NormalUnit(MyUnitIDS.currency_btc, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_btc, R.string.currency_btc_short),
NormalUnit(MyUnitIDS.currency_btn, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_btn, R.string.currency_btn_short),
NormalUnit(MyUnitIDS.currency_busd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_busd, R.string.currency_busd_short),
NormalUnit(MyUnitIDS.currency_bwp, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_bwp, R.string.currency_bwp_short),
NormalUnit(MyUnitIDS.currency_byn, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_byn, R.string.currency_byn_short),
NormalUnit(MyUnitIDS.currency_byr, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_byr, R.string.currency_byr_short),
NormalUnit(MyUnitIDS.currency_bzd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_bzd, R.string.currency_bzd_short),
NormalUnit(MyUnitIDS.currency_cad, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_cad, R.string.currency_cad_short),
NormalUnit(MyUnitIDS.currency_cdf, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_cdf, R.string.currency_cdf_short),
NormalUnit(MyUnitIDS.currency_chf, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_chf, R.string.currency_chf_short),
NormalUnit(MyUnitIDS.currency_chz, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_chz, R.string.currency_chz_short),
NormalUnit(MyUnitIDS.currency_clf, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_clf, R.string.currency_clf_short),
NormalUnit(MyUnitIDS.currency_clp, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_clp, R.string.currency_clp_short),
NormalUnit(MyUnitIDS.currency_cny, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_cny, R.string.currency_cny_short),
NormalUnit(MyUnitIDS.currency_cop, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_cop, R.string.currency_cop_short),
NormalUnit(MyUnitIDS.currency_crc, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_crc, R.string.currency_crc_short),
NormalUnit(MyUnitIDS.currency_cro, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_cro, R.string.currency_cro_short),
NormalUnit(MyUnitIDS.currency_cuc, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_cuc, R.string.currency_cuc_short),
NormalUnit(MyUnitIDS.currency_cup, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_cup, R.string.currency_cup_short),
NormalUnit(MyUnitIDS.currency_cve, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_cve, R.string.currency_cve_short),
NormalUnit(MyUnitIDS.currency_czk, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_czk, R.string.currency_czk_short),
NormalUnit(MyUnitIDS.currency_dai, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_dai, R.string.currency_dai_short),
NormalUnit(MyUnitIDS.currency_djf, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_djf, R.string.currency_djf_short),
NormalUnit(MyUnitIDS.currency_dkk, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_dkk, R.string.currency_dkk_short),
NormalUnit(MyUnitIDS.currency_doge, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_doge, R.string.currency_doge_short),
NormalUnit(MyUnitIDS.currency_dop, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_dop, R.string.currency_dop_short),
NormalUnit(MyUnitIDS.currency_dot, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_dot, R.string.currency_dot_short),
NormalUnit(MyUnitIDS.currency_dzd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_dzd, R.string.currency_dzd_short),
NormalUnit(MyUnitIDS.currency_egld, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_egld, R.string.currency_egld_short),
NormalUnit(MyUnitIDS.currency_egp, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_egp, R.string.currency_egp_short),
NormalUnit(MyUnitIDS.currency_enj, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_enj, R.string.currency_enj_short),
NormalUnit(MyUnitIDS.currency_ern, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_ern, R.string.currency_ern_short),
NormalUnit(MyUnitIDS.currency_etb, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_etb, R.string.currency_etb_short),
NormalUnit(MyUnitIDS.currency_etc, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_etc, R.string.currency_etc_short),
NormalUnit(MyUnitIDS.currency_eth, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_eth, R.string.currency_eth_short),
NormalUnit(MyUnitIDS.currency_eur, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_eur, R.string.currency_eur_short),
NormalUnit(MyUnitIDS.currency_fil, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_fil, R.string.currency_fil_short),
NormalUnit(MyUnitIDS.currency_fjd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_fjd, R.string.currency_fjd_short),
NormalUnit(MyUnitIDS.currency_fkp, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_fkp, R.string.currency_fkp_short),
NormalUnit(MyUnitIDS.currency_ftt, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_ftt, R.string.currency_ftt_short),
NormalUnit(MyUnitIDS.currency_gbp, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_gbp, R.string.currency_gbp_short),
NormalUnit(MyUnitIDS.currency_gel, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_gel, R.string.currency_gel_short),
NormalUnit(MyUnitIDS.currency_ggp, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_ggp, R.string.currency_ggp_short),
NormalUnit(MyUnitIDS.currency_ghs, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_ghs, R.string.currency_ghs_short),
NormalUnit(MyUnitIDS.currency_gip, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_gip, R.string.currency_gip_short),
NormalUnit(MyUnitIDS.currency_gmd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_gmd, R.string.currency_gmd_short),
NormalUnit(MyUnitIDS.currency_gnf, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_gnf, R.string.currency_gnf_short),
NormalUnit(MyUnitIDS.currency_grt, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_grt, R.string.currency_grt_short),
NormalUnit(MyUnitIDS.currency_gtq, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_gtq, R.string.currency_gtq_short),
NormalUnit(MyUnitIDS.currency_gyd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_gyd, R.string.currency_gyd_short),
NormalUnit(MyUnitIDS.currency_hkd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_hkd, R.string.currency_hkd_short),
NormalUnit(MyUnitIDS.currency_hnl, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_hnl, R.string.currency_hnl_short),
NormalUnit(MyUnitIDS.currency_hrk, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_hrk, R.string.currency_hrk_short),
NormalUnit(MyUnitIDS.currency_htg, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_htg, R.string.currency_htg_short),
NormalUnit(MyUnitIDS.currency_huf, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_huf, R.string.currency_huf_short),
NormalUnit(MyUnitIDS.currency_icp, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_icp, R.string.currency_icp_short),
NormalUnit(MyUnitIDS.currency_idr, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_idr, R.string.currency_idr_short),
NormalUnit(MyUnitIDS.currency_ils, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_ils, R.string.currency_ils_short),
NormalUnit(MyUnitIDS.currency_imp, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_imp, R.string.currency_imp_short),
NormalUnit(MyUnitIDS.currency_inj, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_inj, R.string.currency_inj_short),
NormalUnit(MyUnitIDS.currency_inr, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_inr, R.string.currency_inr_short),
NormalUnit(MyUnitIDS.currency_iqd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_iqd, R.string.currency_iqd_short),
NormalUnit(MyUnitIDS.currency_irr, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_irr, R.string.currency_irr_short),
NormalUnit(MyUnitIDS.currency_isk, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_isk, R.string.currency_isk_short),
NormalUnit(MyUnitIDS.currency_jep, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_jep, R.string.currency_jep_short),
NormalUnit(MyUnitIDS.currency_jmd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_jmd, R.string.currency_jmd_short),
NormalUnit(MyUnitIDS.currency_jod, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_jod, R.string.currency_jod_short),
NormalUnit(MyUnitIDS.currency_jpy, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_jpy, R.string.currency_jpy_short),
NormalUnit(MyUnitIDS.currency_kes, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_kes, R.string.currency_kes_short),
NormalUnit(MyUnitIDS.currency_kgs, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_kgs, R.string.currency_kgs_short),
NormalUnit(MyUnitIDS.currency_khr, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_khr, R.string.currency_khr_short),
NormalUnit(MyUnitIDS.currency_kmf, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_kmf, R.string.currency_kmf_short),
NormalUnit(MyUnitIDS.currency_kpw, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_kpw, R.string.currency_kpw_short),
NormalUnit(MyUnitIDS.currency_krw, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_krw, R.string.currency_krw_short),
NormalUnit(MyUnitIDS.currency_ksm, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_ksm, R.string.currency_ksm_short),
NormalUnit(MyUnitIDS.currency_kwd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_kwd, R.string.currency_kwd_short),
NormalUnit(MyUnitIDS.currency_kyd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_kyd, R.string.currency_kyd_short),
NormalUnit(MyUnitIDS.currency_kzt, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_kzt, R.string.currency_kzt_short),
NormalUnit(MyUnitIDS.currency_lak, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_lak, R.string.currency_lak_short),
NormalUnit(MyUnitIDS.currency_lbp, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_lbp, R.string.currency_lbp_short),
NormalUnit(MyUnitIDS.currency_link, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_link, R.string.currency_link_short),
NormalUnit(MyUnitIDS.currency_lkr, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_lkr, R.string.currency_lkr_short),
NormalUnit(MyUnitIDS.currency_lrd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_lrd, R.string.currency_lrd_short),
NormalUnit(MyUnitIDS.currency_lsl, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_lsl, R.string.currency_lsl_short),
NormalUnit(MyUnitIDS.currency_ltc, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_ltc, R.string.currency_ltc_short),
NormalUnit(MyUnitIDS.currency_ltl, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_ltl, R.string.currency_ltl_short),
NormalUnit(MyUnitIDS.currency_luna, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_luna, R.string.currency_luna_short),
NormalUnit(MyUnitIDS.currency_lvl, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_lvl, R.string.currency_lvl_short),
NormalUnit(MyUnitIDS.currency_lyd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_lyd, R.string.currency_lyd_short),
NormalUnit(MyUnitIDS.currency_mad, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_mad, R.string.currency_mad_short),
NormalUnit(MyUnitIDS.currency_matic, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_matic, R.string.currency_matic_short),
NormalUnit(MyUnitIDS.currency_mdl, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_mdl, R.string.currency_mdl_short),
NormalUnit(MyUnitIDS.currency_mga, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_mga, R.string.currency_mga_short),
NormalUnit(MyUnitIDS.currency_mkd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_mkd, R.string.currency_mkd_short),
NormalUnit(MyUnitIDS.currency_mmk, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_mmk, R.string.currency_mmk_short),
NormalUnit(MyUnitIDS.currency_mnt, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_mnt, R.string.currency_mnt_short),
NormalUnit(MyUnitIDS.currency_mop, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_mop, R.string.currency_mop_short),
NormalUnit(MyUnitIDS.currency_mro, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_mro, R.string.currency_mro_short),
NormalUnit(MyUnitIDS.currency_mur, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_mur, R.string.currency_mur_short),
NormalUnit(MyUnitIDS.currency_mvr, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_mvr, R.string.currency_mvr_short),
NormalUnit(MyUnitIDS.currency_mwk, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_mwk, R.string.currency_mwk_short),
NormalUnit(MyUnitIDS.currency_mxn, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_mxn, R.string.currency_mxn_short),
NormalUnit(MyUnitIDS.currency_myr, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_myr, R.string.currency_myr_short),
NormalUnit(MyUnitIDS.currency_mzn, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_mzn, R.string.currency_mzn_short),
NormalUnit(MyUnitIDS.currency_nad, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_nad, R.string.currency_nad_short),
NormalUnit(MyUnitIDS.currency_ngn, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_ngn, R.string.currency_ngn_short),
NormalUnit(MyUnitIDS.currency_nio, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_nio, R.string.currency_nio_short),
NormalUnit(MyUnitIDS.currency_nok, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_nok, R.string.currency_nok_short),
NormalUnit(MyUnitIDS.currency_npr, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_npr, R.string.currency_npr_short),
NormalUnit(MyUnitIDS.currency_nzd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_nzd, R.string.currency_nzd_short),
NormalUnit(MyUnitIDS.currency_omr, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_omr, R.string.currency_omr_short),
NormalUnit(MyUnitIDS.currency_one, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_one, R.string.currency_one_short),
NormalUnit(MyUnitIDS.currency_pab, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_pab, R.string.currency_pab_short),
NormalUnit(MyUnitIDS.currency_pen, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_pen, R.string.currency_pen_short),
NormalUnit(MyUnitIDS.currency_pgk, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_pgk, R.string.currency_pgk_short),
NormalUnit(MyUnitIDS.currency_php, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_php, R.string.currency_php_short),
NormalUnit(MyUnitIDS.currency_pkr, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_pkr, R.string.currency_pkr_short),
NormalUnit(MyUnitIDS.currency_pln, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_pln, R.string.currency_pln_short),
NormalUnit(MyUnitIDS.currency_pyg, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_pyg, R.string.currency_pyg_short),
NormalUnit(MyUnitIDS.currency_qar, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_qar, R.string.currency_qar_short),
NormalUnit(MyUnitIDS.currency_ron, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_ron, R.string.currency_ron_short),
NormalUnit(MyUnitIDS.currency_rsd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_rsd, R.string.currency_rsd_short),
NormalUnit(MyUnitIDS.currency_rub, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_rub, R.string.currency_rub_short),
NormalUnit(MyUnitIDS.currency_rwf, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_rwf, R.string.currency_rwf_short),
NormalUnit(MyUnitIDS.currency_sar, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_sar, R.string.currency_sar_short),
NormalUnit(MyUnitIDS.currency_sbd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_sbd, R.string.currency_sbd_short),
NormalUnit(MyUnitIDS.currency_scr, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_scr, R.string.currency_scr_short),
NormalUnit(MyUnitIDS.currency_sdg, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_sdg, R.string.currency_sdg_short),
NormalUnit(MyUnitIDS.currency_sek, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_sek, R.string.currency_sek_short),
NormalUnit(MyUnitIDS.currency_sgd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_sgd, R.string.currency_sgd_short),
NormalUnit(MyUnitIDS.currency_shib, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_shib, R.string.currency_shib_short),
NormalUnit(MyUnitIDS.currency_shp, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_shp, R.string.currency_shp_short),
NormalUnit(MyUnitIDS.currency_sll, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_sll, R.string.currency_sll_short),
NormalUnit(MyUnitIDS.currency_sol, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_sol, R.string.currency_sol_short),
NormalUnit(MyUnitIDS.currency_sos, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_sos, R.string.currency_sos_short),
NormalUnit(MyUnitIDS.currency_srd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_srd, R.string.currency_srd_short),
NormalUnit(MyUnitIDS.currency_std, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_std, R.string.currency_std_short),
NormalUnit(MyUnitIDS.currency_svc, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_svc, R.string.currency_svc_short),
NormalUnit(MyUnitIDS.currency_syp, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_syp, R.string.currency_syp_short),
NormalUnit(MyUnitIDS.currency_szl, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_szl, R.string.currency_szl_short),
NormalUnit(MyUnitIDS.currency_thb, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_thb, R.string.currency_thb_short),
NormalUnit(MyUnitIDS.currency_theta, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_theta, R.string.currency_theta_short),
NormalUnit(MyUnitIDS.currency_tjs, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_tjs, R.string.currency_tjs_short),
NormalUnit(MyUnitIDS.currency_tmt, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_tmt, R.string.currency_tmt_short),
NormalUnit(MyUnitIDS.currency_tnd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_tnd, R.string.currency_tnd_short),
NormalUnit(MyUnitIDS.currency_top, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_top, R.string.currency_top_short),
NormalUnit(MyUnitIDS.currency_trx, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_trx, R.string.currency_trx_short),
NormalUnit(MyUnitIDS.currency_try, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_try, R.string.currency_try_short),
NormalUnit(MyUnitIDS.currency_ttd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_ttd, R.string.currency_ttd_short),
NormalUnit(MyUnitIDS.currency_twd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_twd, R.string.currency_twd_short),
NormalUnit(MyUnitIDS.currency_tzs, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_tzs, R.string.currency_tzs_short),
NormalUnit(MyUnitIDS.currency_uah, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_uah, R.string.currency_uah_short),
NormalUnit(MyUnitIDS.currency_ugx, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_ugx, R.string.currency_ugx_short),
NormalUnit(MyUnitIDS.currency_uni, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_uni, R.string.currency_uni_short),
NormalUnit(MyUnitIDS.currency_usd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_usd, R.string.currency_usd_short),
NormalUnit(MyUnitIDS.currency_usdc, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_usdc, R.string.currency_usdc_short),
NormalUnit(MyUnitIDS.currency_usdt, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_usdt, R.string.currency_usdt_short),
NormalUnit(MyUnitIDS.currency_uyu, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_uyu, R.string.currency_uyu_short),
NormalUnit(MyUnitIDS.currency_uzs, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_uzs, R.string.currency_uzs_short),
NormalUnit(MyUnitIDS.currency_vef, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_vef, R.string.currency_vef_short),
NormalUnit(MyUnitIDS.currency_vet, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_vet, R.string.currency_vet_short),
NormalUnit(MyUnitIDS.currency_vnd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_vnd, R.string.currency_vnd_short),
NormalUnit(MyUnitIDS.currency_vuv, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_vuv, R.string.currency_vuv_short),
NormalUnit(MyUnitIDS.currency_wbtc, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_wbtc, R.string.currency_wbtc_short),
NormalUnit(MyUnitIDS.currency_wst, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_wst, R.string.currency_wst_short),
NormalUnit(MyUnitIDS.currency_xaf, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_xaf, R.string.currency_xaf_short),
NormalUnit(MyUnitIDS.currency_xag, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_xag, R.string.currency_xag_short),
NormalUnit(MyUnitIDS.currency_xau, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_xau, R.string.currency_xau_short),
NormalUnit(MyUnitIDS.currency_xcd, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_xcd, R.string.currency_xcd_short),
NormalUnit(MyUnitIDS.currency_xdr, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_xdr, R.string.currency_xdr_short),
NormalUnit(MyUnitIDS.currency_xlm, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_xlm, R.string.currency_xlm_short),
NormalUnit(MyUnitIDS.currency_xmr, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_xmr, R.string.currency_xmr_short),
NormalUnit(MyUnitIDS.currency_xof, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_xof, R.string.currency_xof_short),
NormalUnit(MyUnitIDS.currency_xpf, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_xpf, R.string.currency_xpf_short),
NormalUnit(MyUnitIDS.currency_xrp, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_xrp, R.string.currency_xrp_short),
NormalUnit(MyUnitIDS.currency_yer, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_yer, R.string.currency_yer_short),
NormalUnit(MyUnitIDS.currency_zar, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_zar, R.string.currency_zar_short),
NormalUnit(MyUnitIDS.currency_zmk, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_zmk, R.string.currency_zmk_short),
NormalUnit(MyUnitIDS.currency_zmw, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_zmw, R.string.currency_zmw_short),
NormalUnit(MyUnitIDS.currency_zwl, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_zwl, R.string.currency_zwl_short),
ReverseUnit(MyUnitIDS.currency_1inch, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_1inch, R.string.currency_1inch_short),
ReverseUnit(MyUnitIDS.currency_ada, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_ada, R.string.currency_ada_short),
ReverseUnit(MyUnitIDS.currency_aed, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_aed, R.string.currency_aed_short),
ReverseUnit(MyUnitIDS.currency_afn, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_afn, R.string.currency_afn_short),
ReverseUnit(MyUnitIDS.currency_algo, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_algo, R.string.currency_algo_short),
ReverseUnit(MyUnitIDS.currency_all, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_all, R.string.currency_all_short),
ReverseUnit(MyUnitIDS.currency_amd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_amd, R.string.currency_amd_short),
ReverseUnit(MyUnitIDS.currency_ang, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_ang, R.string.currency_ang_short),
ReverseUnit(MyUnitIDS.currency_aoa, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_aoa, R.string.currency_aoa_short),
ReverseUnit(MyUnitIDS.currency_ars, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_ars, R.string.currency_ars_short),
ReverseUnit(MyUnitIDS.currency_atom, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_atom, R.string.currency_atom_short),
ReverseUnit(MyUnitIDS.currency_aud, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_aud, R.string.currency_aud_short),
ReverseUnit(MyUnitIDS.currency_avax, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_avax, R.string.currency_avax_short),
ReverseUnit(MyUnitIDS.currency_awg, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_awg, R.string.currency_awg_short),
ReverseUnit(MyUnitIDS.currency_azn, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_azn, R.string.currency_azn_short),
ReverseUnit(MyUnitIDS.currency_bam, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_bam, R.string.currency_bam_short),
ReverseUnit(MyUnitIDS.currency_bbd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_bbd, R.string.currency_bbd_short),
ReverseUnit(MyUnitIDS.currency_bch, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_bch, R.string.currency_bch_short),
ReverseUnit(MyUnitIDS.currency_bdt, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_bdt, R.string.currency_bdt_short),
ReverseUnit(MyUnitIDS.currency_bgn, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_bgn, R.string.currency_bgn_short),
ReverseUnit(MyUnitIDS.currency_bhd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_bhd, R.string.currency_bhd_short),
ReverseUnit(MyUnitIDS.currency_bif, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_bif, R.string.currency_bif_short),
ReverseUnit(MyUnitIDS.currency_bmd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_bmd, R.string.currency_bmd_short),
ReverseUnit(MyUnitIDS.currency_bnb, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_bnb, R.string.currency_bnb_short),
ReverseUnit(MyUnitIDS.currency_bnd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_bnd, R.string.currency_bnd_short),
ReverseUnit(MyUnitIDS.currency_bob, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_bob, R.string.currency_bob_short),
ReverseUnit(MyUnitIDS.currency_brl, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_brl, R.string.currency_brl_short),
ReverseUnit(MyUnitIDS.currency_bsd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_bsd, R.string.currency_bsd_short),
ReverseUnit(MyUnitIDS.currency_btc, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_btc, R.string.currency_btc_short),
ReverseUnit(MyUnitIDS.currency_btn, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_btn, R.string.currency_btn_short),
ReverseUnit(MyUnitIDS.currency_busd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_busd, R.string.currency_busd_short),
ReverseUnit(MyUnitIDS.currency_bwp, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_bwp, R.string.currency_bwp_short),
ReverseUnit(MyUnitIDS.currency_byn, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_byn, R.string.currency_byn_short),
ReverseUnit(MyUnitIDS.currency_byr, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_byr, R.string.currency_byr_short),
ReverseUnit(MyUnitIDS.currency_bzd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_bzd, R.string.currency_bzd_short),
ReverseUnit(MyUnitIDS.currency_cad, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_cad, R.string.currency_cad_short),
ReverseUnit(MyUnitIDS.currency_cdf, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_cdf, R.string.currency_cdf_short),
ReverseUnit(MyUnitIDS.currency_chf, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_chf, R.string.currency_chf_short),
ReverseUnit(MyUnitIDS.currency_chz, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_chz, R.string.currency_chz_short),
ReverseUnit(MyUnitIDS.currency_clf, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_clf, R.string.currency_clf_short),
ReverseUnit(MyUnitIDS.currency_clp, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_clp, R.string.currency_clp_short),
ReverseUnit(MyUnitIDS.currency_cny, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_cny, R.string.currency_cny_short),
ReverseUnit(MyUnitIDS.currency_cop, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_cop, R.string.currency_cop_short),
ReverseUnit(MyUnitIDS.currency_crc, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_crc, R.string.currency_crc_short),
ReverseUnit(MyUnitIDS.currency_cro, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_cro, R.string.currency_cro_short),
ReverseUnit(MyUnitIDS.currency_cuc, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_cuc, R.string.currency_cuc_short),
ReverseUnit(MyUnitIDS.currency_cup, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_cup, R.string.currency_cup_short),
ReverseUnit(MyUnitIDS.currency_cve, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_cve, R.string.currency_cve_short),
ReverseUnit(MyUnitIDS.currency_czk, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_czk, R.string.currency_czk_short),
ReverseUnit(MyUnitIDS.currency_dai, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_dai, R.string.currency_dai_short),
ReverseUnit(MyUnitIDS.currency_djf, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_djf, R.string.currency_djf_short),
ReverseUnit(MyUnitIDS.currency_dkk, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_dkk, R.string.currency_dkk_short),
ReverseUnit(MyUnitIDS.currency_doge, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_doge, R.string.currency_doge_short),
ReverseUnit(MyUnitIDS.currency_dop, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_dop, R.string.currency_dop_short),
ReverseUnit(MyUnitIDS.currency_dot, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_dot, R.string.currency_dot_short),
ReverseUnit(MyUnitIDS.currency_dzd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_dzd, R.string.currency_dzd_short),
ReverseUnit(MyUnitIDS.currency_egld, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_egld, R.string.currency_egld_short),
ReverseUnit(MyUnitIDS.currency_egp, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_egp, R.string.currency_egp_short),
ReverseUnit(MyUnitIDS.currency_enj, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_enj, R.string.currency_enj_short),
ReverseUnit(MyUnitIDS.currency_ern, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_ern, R.string.currency_ern_short),
ReverseUnit(MyUnitIDS.currency_etb, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_etb, R.string.currency_etb_short),
ReverseUnit(MyUnitIDS.currency_etc, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_etc, R.string.currency_etc_short),
ReverseUnit(MyUnitIDS.currency_eth, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_eth, R.string.currency_eth_short),
ReverseUnit(MyUnitIDS.currency_eur, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_eur, R.string.currency_eur_short),
ReverseUnit(MyUnitIDS.currency_fil, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_fil, R.string.currency_fil_short),
ReverseUnit(MyUnitIDS.currency_fjd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_fjd, R.string.currency_fjd_short),
ReverseUnit(MyUnitIDS.currency_fkp, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_fkp, R.string.currency_fkp_short),
ReverseUnit(MyUnitIDS.currency_ftt, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_ftt, R.string.currency_ftt_short),
ReverseUnit(MyUnitIDS.currency_gbp, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_gbp, R.string.currency_gbp_short),
ReverseUnit(MyUnitIDS.currency_gel, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_gel, R.string.currency_gel_short),
ReverseUnit(MyUnitIDS.currency_ggp, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_ggp, R.string.currency_ggp_short),
ReverseUnit(MyUnitIDS.currency_ghs, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_ghs, R.string.currency_ghs_short),
ReverseUnit(MyUnitIDS.currency_gip, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_gip, R.string.currency_gip_short),
ReverseUnit(MyUnitIDS.currency_gmd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_gmd, R.string.currency_gmd_short),
ReverseUnit(MyUnitIDS.currency_gnf, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_gnf, R.string.currency_gnf_short),
ReverseUnit(MyUnitIDS.currency_grt, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_grt, R.string.currency_grt_short),
ReverseUnit(MyUnitIDS.currency_gtq, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_gtq, R.string.currency_gtq_short),
ReverseUnit(MyUnitIDS.currency_gyd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_gyd, R.string.currency_gyd_short),
ReverseUnit(MyUnitIDS.currency_hkd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_hkd, R.string.currency_hkd_short),
ReverseUnit(MyUnitIDS.currency_hnl, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_hnl, R.string.currency_hnl_short),
ReverseUnit(MyUnitIDS.currency_hrk, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_hrk, R.string.currency_hrk_short),
ReverseUnit(MyUnitIDS.currency_htg, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_htg, R.string.currency_htg_short),
ReverseUnit(MyUnitIDS.currency_huf, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_huf, R.string.currency_huf_short),
ReverseUnit(MyUnitIDS.currency_icp, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_icp, R.string.currency_icp_short),
ReverseUnit(MyUnitIDS.currency_idr, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_idr, R.string.currency_idr_short),
ReverseUnit(MyUnitIDS.currency_ils, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_ils, R.string.currency_ils_short),
ReverseUnit(MyUnitIDS.currency_imp, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_imp, R.string.currency_imp_short),
ReverseUnit(MyUnitIDS.currency_inj, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_inj, R.string.currency_inj_short),
ReverseUnit(MyUnitIDS.currency_inr, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_inr, R.string.currency_inr_short),
ReverseUnit(MyUnitIDS.currency_iqd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_iqd, R.string.currency_iqd_short),
ReverseUnit(MyUnitIDS.currency_irr, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_irr, R.string.currency_irr_short),
ReverseUnit(MyUnitIDS.currency_isk, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_isk, R.string.currency_isk_short),
ReverseUnit(MyUnitIDS.currency_jep, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_jep, R.string.currency_jep_short),
ReverseUnit(MyUnitIDS.currency_jmd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_jmd, R.string.currency_jmd_short),
ReverseUnit(MyUnitIDS.currency_jod, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_jod, R.string.currency_jod_short),
ReverseUnit(MyUnitIDS.currency_jpy, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_jpy, R.string.currency_jpy_short),
ReverseUnit(MyUnitIDS.currency_kes, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_kes, R.string.currency_kes_short),
ReverseUnit(MyUnitIDS.currency_kgs, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_kgs, R.string.currency_kgs_short),
ReverseUnit(MyUnitIDS.currency_khr, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_khr, R.string.currency_khr_short),
ReverseUnit(MyUnitIDS.currency_kmf, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_kmf, R.string.currency_kmf_short),
ReverseUnit(MyUnitIDS.currency_kpw, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_kpw, R.string.currency_kpw_short),
ReverseUnit(MyUnitIDS.currency_krw, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_krw, R.string.currency_krw_short),
ReverseUnit(MyUnitIDS.currency_ksm, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_ksm, R.string.currency_ksm_short),
ReverseUnit(MyUnitIDS.currency_kwd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_kwd, R.string.currency_kwd_short),
ReverseUnit(MyUnitIDS.currency_kyd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_kyd, R.string.currency_kyd_short),
ReverseUnit(MyUnitIDS.currency_kzt, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_kzt, R.string.currency_kzt_short),
ReverseUnit(MyUnitIDS.currency_lak, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_lak, R.string.currency_lak_short),
ReverseUnit(MyUnitIDS.currency_lbp, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_lbp, R.string.currency_lbp_short),
ReverseUnit(MyUnitIDS.currency_link, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_link, R.string.currency_link_short),
ReverseUnit(MyUnitIDS.currency_lkr, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_lkr, R.string.currency_lkr_short),
ReverseUnit(MyUnitIDS.currency_lrd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_lrd, R.string.currency_lrd_short),
ReverseUnit(MyUnitIDS.currency_lsl, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_lsl, R.string.currency_lsl_short),
ReverseUnit(MyUnitIDS.currency_ltc, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_ltc, R.string.currency_ltc_short),
ReverseUnit(MyUnitIDS.currency_ltl, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_ltl, R.string.currency_ltl_short),
ReverseUnit(MyUnitIDS.currency_luna, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_luna, R.string.currency_luna_short),
ReverseUnit(MyUnitIDS.currency_lvl, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_lvl, R.string.currency_lvl_short),
ReverseUnit(MyUnitIDS.currency_lyd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_lyd, R.string.currency_lyd_short),
ReverseUnit(MyUnitIDS.currency_mad, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_mad, R.string.currency_mad_short),
ReverseUnit(MyUnitIDS.currency_matic, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_matic, R.string.currency_matic_short),
ReverseUnit(MyUnitIDS.currency_mdl, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_mdl, R.string.currency_mdl_short),
ReverseUnit(MyUnitIDS.currency_mga, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_mga, R.string.currency_mga_short),
ReverseUnit(MyUnitIDS.currency_mkd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_mkd, R.string.currency_mkd_short),
ReverseUnit(MyUnitIDS.currency_mmk, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_mmk, R.string.currency_mmk_short),
ReverseUnit(MyUnitIDS.currency_mnt, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_mnt, R.string.currency_mnt_short),
ReverseUnit(MyUnitIDS.currency_mop, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_mop, R.string.currency_mop_short),
ReverseUnit(MyUnitIDS.currency_mro, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_mro, R.string.currency_mro_short),
ReverseUnit(MyUnitIDS.currency_mur, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_mur, R.string.currency_mur_short),
ReverseUnit(MyUnitIDS.currency_mvr, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_mvr, R.string.currency_mvr_short),
ReverseUnit(MyUnitIDS.currency_mwk, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_mwk, R.string.currency_mwk_short),
ReverseUnit(MyUnitIDS.currency_mxn, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_mxn, R.string.currency_mxn_short),
ReverseUnit(MyUnitIDS.currency_myr, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_myr, R.string.currency_myr_short),
ReverseUnit(MyUnitIDS.currency_mzn, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_mzn, R.string.currency_mzn_short),
ReverseUnit(MyUnitIDS.currency_nad, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_nad, R.string.currency_nad_short),
ReverseUnit(MyUnitIDS.currency_ngn, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_ngn, R.string.currency_ngn_short),
ReverseUnit(MyUnitIDS.currency_nio, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_nio, R.string.currency_nio_short),
ReverseUnit(MyUnitIDS.currency_nok, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_nok, R.string.currency_nok_short),
ReverseUnit(MyUnitIDS.currency_npr, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_npr, R.string.currency_npr_short),
ReverseUnit(MyUnitIDS.currency_nzd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_nzd, R.string.currency_nzd_short),
ReverseUnit(MyUnitIDS.currency_omr, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_omr, R.string.currency_omr_short),
ReverseUnit(MyUnitIDS.currency_one, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_one, R.string.currency_one_short),
ReverseUnit(MyUnitIDS.currency_pab, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_pab, R.string.currency_pab_short),
ReverseUnit(MyUnitIDS.currency_pen, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_pen, R.string.currency_pen_short),
ReverseUnit(MyUnitIDS.currency_pgk, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_pgk, R.string.currency_pgk_short),
ReverseUnit(MyUnitIDS.currency_php, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_php, R.string.currency_php_short),
ReverseUnit(MyUnitIDS.currency_pkr, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_pkr, R.string.currency_pkr_short),
ReverseUnit(MyUnitIDS.currency_pln, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_pln, R.string.currency_pln_short),
ReverseUnit(MyUnitIDS.currency_pyg, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_pyg, R.string.currency_pyg_short),
ReverseUnit(MyUnitIDS.currency_qar, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_qar, R.string.currency_qar_short),
ReverseUnit(MyUnitIDS.currency_ron, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_ron, R.string.currency_ron_short),
ReverseUnit(MyUnitIDS.currency_rsd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_rsd, R.string.currency_rsd_short),
ReverseUnit(MyUnitIDS.currency_rub, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_rub, R.string.currency_rub_short),
ReverseUnit(MyUnitIDS.currency_rwf, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_rwf, R.string.currency_rwf_short),
ReverseUnit(MyUnitIDS.currency_sar, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_sar, R.string.currency_sar_short),
ReverseUnit(MyUnitIDS.currency_sbd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_sbd, R.string.currency_sbd_short),
ReverseUnit(MyUnitIDS.currency_scr, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_scr, R.string.currency_scr_short),
ReverseUnit(MyUnitIDS.currency_sdg, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_sdg, R.string.currency_sdg_short),
ReverseUnit(MyUnitIDS.currency_sek, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_sek, R.string.currency_sek_short),
ReverseUnit(MyUnitIDS.currency_sgd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_sgd, R.string.currency_sgd_short),
ReverseUnit(MyUnitIDS.currency_shib, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_shib, R.string.currency_shib_short),
ReverseUnit(MyUnitIDS.currency_shp, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_shp, R.string.currency_shp_short),
ReverseUnit(MyUnitIDS.currency_sll, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_sll, R.string.currency_sll_short),
ReverseUnit(MyUnitIDS.currency_sol, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_sol, R.string.currency_sol_short),
ReverseUnit(MyUnitIDS.currency_sos, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_sos, R.string.currency_sos_short),
ReverseUnit(MyUnitIDS.currency_srd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_srd, R.string.currency_srd_short),
ReverseUnit(MyUnitIDS.currency_std, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_std, R.string.currency_std_short),
ReverseUnit(MyUnitIDS.currency_svc, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_svc, R.string.currency_svc_short),
ReverseUnit(MyUnitIDS.currency_syp, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_syp, R.string.currency_syp_short),
ReverseUnit(MyUnitIDS.currency_szl, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_szl, R.string.currency_szl_short),
ReverseUnit(MyUnitIDS.currency_thb, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_thb, R.string.currency_thb_short),
ReverseUnit(MyUnitIDS.currency_theta, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_theta, R.string.currency_theta_short),
ReverseUnit(MyUnitIDS.currency_tjs, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_tjs, R.string.currency_tjs_short),
ReverseUnit(MyUnitIDS.currency_tmt, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_tmt, R.string.currency_tmt_short),
ReverseUnit(MyUnitIDS.currency_tnd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_tnd, R.string.currency_tnd_short),
ReverseUnit(MyUnitIDS.currency_top, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_top, R.string.currency_top_short),
ReverseUnit(MyUnitIDS.currency_trx, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_trx, R.string.currency_trx_short),
ReverseUnit(MyUnitIDS.currency_try, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_try, R.string.currency_try_short),
ReverseUnit(MyUnitIDS.currency_ttd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_ttd, R.string.currency_ttd_short),
ReverseUnit(MyUnitIDS.currency_twd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_twd, R.string.currency_twd_short),
ReverseUnit(MyUnitIDS.currency_tzs, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_tzs, R.string.currency_tzs_short),
ReverseUnit(MyUnitIDS.currency_uah, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_uah, R.string.currency_uah_short),
ReverseUnit(MyUnitIDS.currency_ugx, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_ugx, R.string.currency_ugx_short),
ReverseUnit(MyUnitIDS.currency_uni, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_uni, R.string.currency_uni_short),
ReverseUnit(MyUnitIDS.currency_usd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_usd, R.string.currency_usd_short),
ReverseUnit(MyUnitIDS.currency_usdc, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_usdc, R.string.currency_usdc_short),
ReverseUnit(MyUnitIDS.currency_usdt, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_usdt, R.string.currency_usdt_short),
ReverseUnit(MyUnitIDS.currency_uyu, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_uyu, R.string.currency_uyu_short),
ReverseUnit(MyUnitIDS.currency_uzs, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_uzs, R.string.currency_uzs_short),
ReverseUnit(MyUnitIDS.currency_vef, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_vef, R.string.currency_vef_short),
ReverseUnit(MyUnitIDS.currency_vet, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_vet, R.string.currency_vet_short),
ReverseUnit(MyUnitIDS.currency_vnd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_vnd, R.string.currency_vnd_short),
ReverseUnit(MyUnitIDS.currency_vuv, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_vuv, R.string.currency_vuv_short),
ReverseUnit(MyUnitIDS.currency_wbtc, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_wbtc, R.string.currency_wbtc_short),
ReverseUnit(MyUnitIDS.currency_wst, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_wst, R.string.currency_wst_short),
ReverseUnit(MyUnitIDS.currency_xaf, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_xaf, R.string.currency_xaf_short),
ReverseUnit(MyUnitIDS.currency_xag, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_xag, R.string.currency_xag_short),
ReverseUnit(MyUnitIDS.currency_xau, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_xau, R.string.currency_xau_short),
ReverseUnit(MyUnitIDS.currency_xcd, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_xcd, R.string.currency_xcd_short),
ReverseUnit(MyUnitIDS.currency_xdr, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_xdr, R.string.currency_xdr_short),
ReverseUnit(MyUnitIDS.currency_xlm, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_xlm, R.string.currency_xlm_short),
ReverseUnit(MyUnitIDS.currency_xmr, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_xmr, R.string.currency_xmr_short),
ReverseUnit(MyUnitIDS.currency_xof, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_xof, R.string.currency_xof_short),
ReverseUnit(MyUnitIDS.currency_xpf, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_xpf, R.string.currency_xpf_short),
ReverseUnit(MyUnitIDS.currency_xrp, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_xrp, R.string.currency_xrp_short),
ReverseUnit(MyUnitIDS.currency_yer, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_yer, R.string.currency_yer_short),
ReverseUnit(MyUnitIDS.currency_zar, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_zar, R.string.currency_zar_short),
ReverseUnit(MyUnitIDS.currency_zmk, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_zmk, R.string.currency_zmk_short),
ReverseUnit(MyUnitIDS.currency_zmw, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_zmw, R.string.currency_zmw_short),
ReverseUnit(MyUnitIDS.currency_zwl, BigDecimal.ZERO, UnitGroup.CURRENCY, R.string.currency_zwl, R.string.currency_zwl_short),
)
}

View File

@ -20,7 +20,6 @@ package com.sadellie.unitto.data.units.remote
import com.squareup.moshi.FromJson
import com.squareup.moshi.ToJson
import java.math.BigDecimal
/**
* Represents a response object from currency-api
@ -30,7 +29,7 @@ import java.math.BigDecimal
*/
data class CurrencyUnitResponse(
val date: String,
val currency: Map<String, BigDecimal>
val currency: Map<String, Double>
)
/**
@ -42,12 +41,9 @@ internal class CurrencyAdapter {
@Suppress("UNUSED", "UNCHECKED_CAST")
@FromJson fun fromJson(response: Map<String, Any>): CurrencyUnitResponse {
val pairsBD: Map<String, BigDecimal> = (response[response.keys.elementAt(1)] as Map<String, Double>)
.mapValues { it.value.toBigDecimal() }
return CurrencyUnitResponse(
date = response["date"] as String,
currency = pairsBD
currency = (response[response.keys.elementAt(1)]) as Map<String, Double>
)
}
}

View File

@ -48,6 +48,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@ -77,6 +78,7 @@ import com.sadellie.unitto.core.ui.common.UnittoScreenWithTopBar
import com.sadellie.unitto.core.ui.common.textfield.ExpressionTextField
import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols
import com.sadellie.unitto.core.ui.common.textfield.UnformattedTextField
import com.sadellie.unitto.core.ui.datetime.UnittoDateTimeFormatter
import com.sadellie.unitto.data.common.format
import com.sadellie.unitto.data.model.UnitGroup
import com.sadellie.unitto.data.model.unit.AbstractUnit
@ -285,8 +287,13 @@ private fun Default(
TextFieldValue(uiState.calculation?.format(uiState.scale, uiState.outputFormat) ?: "")
)
}
val connection by connectivityState()
val lastUpdate by remember(uiState) {
derivedStateOf {
if (uiState.currencyRateUpdateState !is CurrencyRateUpdateState.Ready) return@derivedStateOf null
uiState.currencyRateUpdateState.date.format(UnittoDateTimeFormatter.weekDayMonthYear)
}
}
LaunchedEffect(connection) {
if ((connection == ConnectionState.Available) and (uiState.result == ConverterResult.Error)) {
@ -301,6 +308,23 @@ private fun Default(
ColumnWithConstraints(modifier = contentModifier) {
val textFieldModifier = Modifier.weight(2f)
AnimatedVisibility(
visible = lastUpdate != null,
enter = expandVertically() + fadeIn(),
exit = shrinkVertically() + fadeOut(),
) {
Text(
modifier = Modifier
.align(Alignment.CenterHorizontally)
.clip(RoundedCornerShape(50))
.background(MaterialTheme.colorScheme.surfaceVariant)
.fillMaxWidth(),
text = lastUpdate.orEmpty(),
color = MaterialTheme.colorScheme.onSurfaceVariant,
textAlign = TextAlign.Center
)
}
ExpressionTextField(
modifier = textFieldModifier,
minRatio = 0.7f,

View File

@ -45,6 +45,7 @@ internal sealed class UnitConverterUIState {
val scale: Int,
val outputFormat: Int,
val formatTime: Boolean,
val currencyRateUpdateState: CurrencyRateUpdateState,
) : UnitConverterUIState()
data class NumberBase(

View File

@ -26,15 +26,15 @@ import com.sadellie.unitto.core.base.Token
import com.sadellie.unitto.core.ui.common.textfield.AllFormatterSymbols
import com.sadellie.unitto.core.ui.common.textfield.addTokens
import com.sadellie.unitto.core.ui.common.textfield.deleteTokens
import com.sadellie.unitto.data.common.combine
import com.sadellie.unitto.data.common.isExpression
import com.sadellie.unitto.data.common.stateIn
import com.sadellie.unitto.data.model.UnitGroup
import com.sadellie.unitto.data.model.UnitsListSorting
import com.sadellie.unitto.data.model.unit.AbstractUnit
import com.sadellie.unitto.data.model.unit.DefaultUnit
import com.sadellie.unitto.data.model.unit.NumberBaseUnit
import com.sadellie.unitto.data.units.UnitsRepository
import com.sadellie.unitto.data.common.combine
import com.sadellie.unitto.data.common.stateIn
import com.sadellie.unitto.data.userprefs.UserPreferencesRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import io.github.sadellie.evaluatto.Expression
@ -60,8 +60,6 @@ internal class ConverterViewModel @Inject constructor(
private val unitsRepo: UnitsRepository,
) : ViewModel() {
enum class CurrencyRateUpdateState { READY, LOADING, ERROR }
private val _input = MutableStateFlow(TextFieldValue())
private val _calculation = MutableStateFlow<BigDecimal?>(null)
private val _result = MutableStateFlow<ConverterResult>(ConverterResult.Loading)
@ -70,7 +68,7 @@ internal class ConverterViewModel @Inject constructor(
private val _leftSideUIState = MutableStateFlow(LeftSideUIState())
private val _rightSideUIState = MutableStateFlow(RightSideUIState())
private val _loadingCurrencies = MutableStateFlow(CurrencyRateUpdateState.READY)
private val _currenciesState = MutableStateFlow<CurrencyRateUpdateState>(CurrencyRateUpdateState.Loading)
private var _loadCurrenciesJob: Job? = null
val converterUiState: StateFlow<UnitConverterUIState> = combine(
@ -80,8 +78,8 @@ internal class ConverterViewModel @Inject constructor(
_unitFrom,
_unitTo,
userPrefsRepository.converterPrefs,
_loadingCurrencies
) { input, calculation, result, unitFrom, unitTo, prefs, _ ->
_currenciesState
) { input, calculation, result, unitFrom, unitTo, prefs, currenciesState ->
return@combine when {
(unitFrom is DefaultUnit) and (unitTo is DefaultUnit) -> {
UnitConverterUIState.Default(
@ -96,6 +94,7 @@ internal class ConverterViewModel @Inject constructor(
scale = prefs.precision,
outputFormat = prefs.outputFormat,
formatTime = prefs.unitConverterFormatTime,
currencyRateUpdateState = currenciesState
)
}
(unitFrom is NumberBaseUnit) and (unitTo is NumberBaseUnit) -> {
@ -111,16 +110,16 @@ internal class ConverterViewModel @Inject constructor(
}
}
.onEach { ui ->
when (_loadingCurrencies.value) {
CurrencyRateUpdateState.LOADING -> {
when (_currenciesState.value) {
is CurrencyRateUpdateState.Loading -> {
_result.update { ConverterResult.Loading }
return@onEach
}
CurrencyRateUpdateState.ERROR -> {
is CurrencyRateUpdateState.Error -> {
_result.update { ConverterResult.Error }
return@onEach
}
CurrencyRateUpdateState.READY -> {}
is CurrencyRateUpdateState.Ready, is CurrencyRateUpdateState.Nothing -> {}
}
when (ui) {
@ -176,8 +175,9 @@ internal class ConverterViewModel @Inject constructor(
_calculation,
_rightSideUIState,
userPrefsRepository.converterPrefs,
unitsRepo.allUnits
) { unitFrom, unitTo, input, calculation, ui, prefs, _ ->
_currenciesState,
unitsRepo.allUnits,
) { unitFrom, unitTo, input, calculation, ui, prefs, currenciesState, _ ->
return@combine ui.copy(
unitFrom = unitFrom,
unitTo = unitTo,
@ -186,7 +186,8 @@ internal class ConverterViewModel @Inject constructor(
input = calculation?.toPlainString() ?: input.text,
scale = prefs.precision,
outputFormat = prefs.outputFormat,
formatterSymbols = AllFormatterSymbols.getById(prefs.separator)
formatterSymbols = AllFormatterSymbols.getById(prefs.separator),
currencyRateUpdateState = currenciesState
)
}
.onEach {
@ -206,7 +207,7 @@ internal class ConverterViewModel @Inject constructor(
.also { oldUnitFrom -> _unitTo.update { oldUnitFrom } }
_loadCurrenciesJob?.cancel()
_loadingCurrencies.update { CurrencyRateUpdateState.READY }
_currenciesState.update { CurrencyRateUpdateState.Nothing }
_unitFrom.value?.let {
if (it.group == UnitGroup.CURRENCY) updateCurrencyRates(it)
}
@ -230,14 +231,15 @@ internal class ConverterViewModel @Inject constructor(
fun updateCurrencyRates(unit: AbstractUnit) {
_loadCurrenciesJob = viewModelScope.launch(Dispatchers.IO) {
try {
_loadingCurrencies.update { CurrencyRateUpdateState.LOADING }
unitsRepo.updateRates(unit)
_currenciesState.update { CurrencyRateUpdateState.Loading }
val updateDate = unitsRepo.updateRates(unit) ?: throw Exception("Empty cache")
// Set to fresh objects with updated basic unit values
_unitFrom.update { unitsRepo.getById(it!!.id) }
_unitTo.update { unitsRepo.getById(it!!.id) }
_loadingCurrencies.update { CurrencyRateUpdateState.READY }
_currenciesState.update { CurrencyRateUpdateState.Ready(updateDate) }
} catch (e: Exception) {
_loadingCurrencies.update { CurrencyRateUpdateState.ERROR }
_currenciesState.update { CurrencyRateUpdateState.Error }
}
}
}
@ -253,7 +255,7 @@ internal class ConverterViewModel @Inject constructor(
}
_loadCurrenciesJob?.cancel()
_loadingCurrencies.update { CurrencyRateUpdateState.READY }
_currenciesState.update { CurrencyRateUpdateState.Nothing }
if (unit.group == UnitGroup.CURRENCY) updateCurrencyRates(unit)
_unitFrom.update {

View File

@ -0,0 +1,28 @@
/*
* Unitto is a unit converter for Android
* Copyright (c) 2023 Elshan Agaev
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.sadellie.unitto.feature.converter
import java.time.LocalDate
internal sealed class CurrencyRateUpdateState {
data object Loading : CurrencyRateUpdateState()
data object Error : CurrencyRateUpdateState()
data class Ready(val date: LocalDate) : CurrencyRateUpdateState()
data object Nothing : CurrencyRateUpdateState()
}

View File

@ -38,6 +38,7 @@ import com.sadellie.unitto.core.ui.common.UnittoSearchBar
import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols
import com.sadellie.unitto.core.ui.common.textfield.formatExpression
import com.sadellie.unitto.data.common.format
import com.sadellie.unitto.data.model.UnitGroup
import com.sadellie.unitto.data.model.unit.AbstractUnit
import com.sadellie.unitto.data.model.unit.DefaultUnit
import com.sadellie.unitto.data.model.unit.NumberBaseUnit
@ -120,7 +121,8 @@ private fun RightSideScreen(
shortName = stringResource(it.shortName),
scale = uiState.scale,
outputFormat = uiState.outputFormat,
formatterSymbols = uiState.formatterSymbols
formatterSymbols = uiState.formatterSymbols,
readyCurrencies = uiState.currencyRateUpdateState is CurrencyRateUpdateState.Ready,
),
isFavorite = it.isFavorite,
isSelected = it.id == uiState.unitTo?.id,
@ -144,9 +146,14 @@ private fun formatUnitToSupportLabel(
shortName: String,
scale: Int,
outputFormat: Int,
formatterSymbols: FormatterSymbols
formatterSymbols: FormatterSymbols,
readyCurrencies: Boolean,
): String {
try {
if ((unitFrom?.group == UnitGroup.CURRENCY) and !readyCurrencies) {
return shortName
}
if ((unitFrom is DefaultUnit) and (unitTo is DefaultUnit)) {
unitFrom as DefaultUnit
unitTo as DefaultUnit

View File

@ -36,5 +36,6 @@ internal data class RightSideUIState(
val input: String = "",
val scale: Int = 3,
val outputFormat: Int = OutputFormat.PLAIN,
val formatterSymbols: FormatterSymbols = FormatterSymbols.Spaces
val formatterSymbols: FormatterSymbols = FormatterSymbols.Spaces,
val currencyRateUpdateState: CurrencyRateUpdateState = CurrencyRateUpdateState.Nothing
)