From 2e2ec1d7536748034d8948a112719839f43afacd Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Thu, 14 Sep 2023 22:56:10 +0300 Subject: [PATCH] Cache currency rates closes #79 --- .../5.json | 166 +++++++ .../unitto/data/database/CurrencyRatesDao.kt | 34 ++ .../data/database/CurrencyRatesEntity.kt | 33 ++ .../unitto/data/database/UnittoDatabase.kt | 10 +- .../data/database/UnittoDatabaseModule.kt | 18 +- .../data/database/converters/Converters.kt | 40 ++ .../unitto/data/model/unit/ReverseUnit.kt | 2 - .../unitto/data/units/UnitsRepository.kt | 97 ++-- .../unitto/data/units/collections/Currency.kt | 420 +++++++++--------- .../data/units/remote/CurrencyUnitResponse.kt | 8 +- .../feature/converter/ConverterScreen.kt | 26 +- .../feature/converter/ConverterUIState.kt | 1 + .../feature/converter/ConverterViewModel.kt | 42 +- .../converter/CurrencyRateUpdateState.kt | 28 ++ .../feature/converter/RightSideScreen.kt | 11 +- .../feature/converter/RightSideUIState.kt | 3 +- 16 files changed, 650 insertions(+), 289 deletions(-) create mode 100644 data/database/schemas/com.sadellie.unitto.data.database.UnittoDatabase/5.json create mode 100644 data/database/src/main/java/com/sadellie/unitto/data/database/CurrencyRatesDao.kt create mode 100644 data/database/src/main/java/com/sadellie/unitto/data/database/CurrencyRatesEntity.kt create mode 100644 data/database/src/main/java/com/sadellie/unitto/data/database/converters/Converters.kt create mode 100644 feature/converter/src/main/java/com/sadellie/unitto/feature/converter/CurrencyRateUpdateState.kt diff --git a/data/database/schemas/com.sadellie.unitto.data.database.UnittoDatabase/5.json b/data/database/schemas/com.sadellie.unitto.data.database.UnittoDatabase/5.json new file mode 100644 index 00000000..4cb602e9 --- /dev/null +++ b/data/database/schemas/com.sadellie.unitto.data.database.UnittoDatabase/5.json @@ -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')" + ] + } +} \ No newline at end of file diff --git a/data/database/src/main/java/com/sadellie/unitto/data/database/CurrencyRatesDao.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/CurrencyRatesDao.kt new file mode 100644 index 00000000..75a40bda --- /dev/null +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/CurrencyRatesDao.kt @@ -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 . + */ + +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) + + @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 +} diff --git a/data/database/src/main/java/com/sadellie/unitto/data/database/CurrencyRatesEntity.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/CurrencyRatesEntity.kt new file mode 100644 index 00000000..74ac9a45 --- /dev/null +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/CurrencyRatesEntity.kt @@ -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 . + */ + +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? +) diff --git a/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabase.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabase.kt index b1528a88..7cbb4bc8 100644 --- a/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabase.kt +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabase.kt @@ -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 } diff --git a/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabaseModule.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabaseModule.kt index b88545c5..d47cc6f6 100644 --- a/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabaseModule.kt +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabaseModule.kt @@ -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] * diff --git a/data/database/src/main/java/com/sadellie/unitto/data/database/converters/Converters.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/converters/Converters.kt new file mode 100644 index 00000000..a44db909 --- /dev/null +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/converters/Converters.kt @@ -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 . + */ + +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 + } + +} diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/ReverseUnit.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/ReverseUnit.kt index 6d14c4e8..ffd2c693 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/ReverseUnit.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/ReverseUnit.kt @@ -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 diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/UnitsRepository.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/UnitsRepository.kt index 0d67ea77..b79063c3 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/UnitsRepository.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/UnitsRepository.kt @@ -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 = 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( diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Currency.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Currency.kt index f6c6c6e0..7a586471 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Currency.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Currency.kt @@ -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 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), ) } diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/remote/CurrencyUnitResponse.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/remote/CurrencyUnitResponse.kt index a664961e..b8f55413 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/remote/CurrencyUnitResponse.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/remote/CurrencyUnitResponse.kt @@ -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 + val currency: Map ) /** @@ -42,12 +41,9 @@ internal class CurrencyAdapter { @Suppress("UNUSED", "UNCHECKED_CAST") @FromJson fun fromJson(response: Map): CurrencyUnitResponse { - val pairsBD: Map = (response[response.keys.elementAt(1)] as Map) - .mapValues { it.value.toBigDecimal() } - return CurrencyUnitResponse( date = response["date"] as String, - currency = pairsBD + currency = (response[response.keys.elementAt(1)]) as Map ) } } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt index 697461ab..a31e0c78 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt @@ -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, diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterUIState.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterUIState.kt index 0976a50d..fcae671e 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterUIState.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterUIState.kt @@ -45,6 +45,7 @@ internal sealed class UnitConverterUIState { val scale: Int, val outputFormat: Int, val formatTime: Boolean, + val currencyRateUpdateState: CurrencyRateUpdateState, ) : UnitConverterUIState() data class NumberBase( diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterViewModel.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterViewModel.kt index 037c79ab..be2f1579 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterViewModel.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterViewModel.kt @@ -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(null) private val _result = MutableStateFlow(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.Loading) private var _loadCurrenciesJob: Job? = null val converterUiState: StateFlow = 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 { diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/CurrencyRateUpdateState.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/CurrencyRateUpdateState.kt new file mode 100644 index 00000000..cba8e6ac --- /dev/null +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/CurrencyRateUpdateState.kt @@ -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 . + */ + +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() +} diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideScreen.kt index 675a1f71..7a18d090 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideScreen.kt @@ -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 diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideUIState.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideUIState.kt index fa1adbc1..86483c40 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideUIState.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideUIState.kt @@ -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 )