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

View File

@ -34,23 +34,12 @@ import javax.inject.Singleton
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)
@Module @Module
class UnittoDatabaseModule { class UnittoDatabaseModule {
/**
* Tells Hilt to use this method to get [UnitsDao]
*
* @param unittoDatabase Database for which we need DAO
* @return Singleton of [UnitsDao]
*/
@Provides @Provides
fun provideUnitsDao(unittoDatabase: UnittoDatabase): UnitsDao { fun provideUnitsDao(unittoDatabase: UnittoDatabase): UnitsDao {
return 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 @Provides
fun provideCalculatorHistoryDao(unittoDatabase: UnittoDatabase): CalculatorHistoryDao { fun provideCalculatorHistoryDao(unittoDatabase: UnittoDatabase): CalculatorHistoryDao {
return unittoDatabase.calculatorHistoryDao() return unittoDatabase.calculatorHistoryDao()
@ -68,6 +57,11 @@ class UnittoDatabaseModule {
// return unittoDatabase.timeZoneDao() // return unittoDatabase.timeZoneDao()
// } // }
@Provides
fun provideCurrencyRatesDao(unittoDatabase: UnittoDatabase): CurrencyRatesDao {
return unittoDatabase.currencyRatesDao()
}
/** /**
* Tells Hilt to use this method to get [UnittoDatabase] * 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, override val counter: Int = 0,
) : DefaultUnit { ) : DefaultUnit {
override fun convert(unitTo: DefaultUnit, value: BigDecimal): BigDecimal { override fun convert(unitTo: DefaultUnit, value: BigDecimal): BigDecimal {
// Avoid division by zero
if (unitTo.basicUnit.compareTo(BigDecimal.ZERO) == 0) return BigDecimal.ZERO
return unitTo return unitTo
.basicUnit .basicUnit

View File

@ -19,6 +19,9 @@
package com.sadellie.unitto.data.units package com.sadellie.unitto.data.units
import android.content.Context 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.UnitsDao
import com.sadellie.unitto.data.database.UnitsEntity import com.sadellie.unitto.data.database.UnitsEntity
import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.UnitGroup
@ -65,10 +68,12 @@ import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.math.BigDecimal import java.math.BigDecimal
import java.time.LocalDate
import javax.inject.Inject import javax.inject.Inject
class UnitsRepository @Inject constructor( class UnitsRepository @Inject constructor(
private val unitsDao: UnitsDao, private val unitsDao: UnitsDao,
private val currencyRatesDao: CurrencyRatesDao,
@ApplicationContext private val mContext: Context, @ApplicationContext private val mContext: Context,
) { ) {
private val myUnits = MutableStateFlow( private val myUnits = MutableStateFlow(
@ -114,21 +119,25 @@ class UnitsRepository @Inject constructor(
counter = based.frequency, counter = based.frequency,
pairId = based.pairedUnitId pairId = based.pairedUnitId
) )
is NumberBaseUnit -> foundUnit.copy( is NumberBaseUnit -> foundUnit.copy(
isFavorite = based.isFavorite, isFavorite = based.isFavorite,
counter = based.frequency, counter = based.frequency,
pairId = based.pairedUnitId pairId = based.pairedUnitId
) )
is ReverseUnit -> foundUnit.copy( is ReverseUnit -> foundUnit.copy(
isFavorite = based.isFavorite, isFavorite = based.isFavorite,
counter = based.frequency, counter = based.frequency,
pairId = based.pairedUnitId pairId = based.pairedUnitId
) )
is FuelForward -> foundUnit.copy( is FuelForward -> foundUnit.copy(
isFavorite = based.isFavorite, isFavorite = based.isFavorite,
counter = based.frequency, counter = based.frequency,
pairId = based.pairedUnitId pairId = based.pairedUnitId
) )
is FuelBackward -> foundUnit.copy( is FuelBackward -> foundUnit.copy(
isFavorite = based.isFavorite, isFavorite = based.isFavorite,
counter = based.frequency, counter = based.frequency,
@ -220,23 +229,45 @@ class UnitsRepository @Inject constructor(
} }
} }
suspend fun updateRates(unit: AbstractUnit) = withContext(Dispatchers.IO) { suspend fun updateRates(unit: AbstractUnit): LocalDate? = withContext(Dispatchers.IO) {
val conversions: Map<String, BigDecimal> = CurrencyApi.service.getCurrencyPairs(unit.id).currency 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 -> myUnits.update { units ->
item.map { units.map { localUnit ->
if (it.group != UnitGroup.CURRENCY) return@map it if (localUnit.group != UnitGroup.CURRENCY) return@map localUnit
if (it !is NormalUnit) return@map it 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) { return@map if (rate > BigDecimal.ZERO) {
it.copy(basicUnit = rate) localUnit.copy(basicUnit = rate)
} else { } else {
it.copy(basicUnit = BigDecimal.ZERO) localUnit.copy(basicUnit = BigDecimal.ZERO)
} }
} }
} }
return@withContext basedConversions
.firstOrNull()
?.date
?.let { LocalDate.ofEpochDay(it) }
} }
fun filterUnits( fun filterUnits(

View File

@ -19,221 +19,221 @@
package com.sadellie.unitto.data.units.collections package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.core.base.R 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.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 com.sadellie.unitto.data.units.MyUnitIDS
import java.math.BigDecimal import java.math.BigDecimal
internal val currencyCollection: List<AbstractUnit> by lazy { internal val currencyCollection: List<AbstractUnit> by lazy {
listOf( listOf(
NormalUnit(MyUnitIDS.currency_1inch, BigDecimal.ONE, UnitGroup.CURRENCY, R.string.currency_1inch, R.string.currency_1inch_short), ReverseUnit(MyUnitIDS.currency_1inch, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_ada, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_aed, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_afn, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_algo, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_all, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_amd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_ang, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_aoa, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_ars, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_atom, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_aud, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_avax, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_awg, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_azn, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_bam, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_bbd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_bch, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_bdt, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_bgn, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_bhd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_bif, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_bmd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_bnb, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_bnd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_bob, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_brl, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_bsd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_btc, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_btn, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_busd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_bwp, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_byn, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_byr, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_bzd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_cad, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_cdf, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_chf, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_chz, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_clf, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_clp, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_cny, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_cop, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_crc, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_cro, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_cuc, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_cup, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_cve, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_czk, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_dai, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_djf, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_dkk, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_doge, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_dop, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_dot, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_dzd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_egld, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_egp, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_enj, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_ern, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_etb, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_etc, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_eth, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_eur, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_fil, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_fjd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_fkp, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_ftt, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_gbp, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_gel, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_ggp, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_ghs, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_gip, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_gmd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_gnf, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_grt, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_gtq, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_gyd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_hkd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_hnl, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_hrk, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_htg, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_huf, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_icp, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_idr, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_ils, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_imp, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_inj, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_inr, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_iqd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_irr, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_isk, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_jep, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_jmd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_jod, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_jpy, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_kes, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_kgs, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_khr, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_kmf, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_kpw, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_krw, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_ksm, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_kwd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_kyd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_kzt, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_lak, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_lbp, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_link, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_lkr, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_lrd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_lsl, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_ltc, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_ltl, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_luna, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_lvl, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_lyd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_mad, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_matic, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_mdl, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_mga, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_mkd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_mmk, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_mnt, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_mop, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_mro, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_mur, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_mvr, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_mwk, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_mxn, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_myr, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_mzn, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_nad, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_ngn, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_nio, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_nok, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_npr, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_nzd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_omr, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_one, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_pab, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_pen, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_pgk, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_php, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_pkr, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_pln, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_pyg, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_qar, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_ron, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_rsd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_rub, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_rwf, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_sar, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_sbd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_scr, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_sdg, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_sek, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_sgd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_shib, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_shp, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_sll, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_sol, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_sos, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_srd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_std, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_svc, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_syp, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_szl, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_thb, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_theta, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_tjs, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_tmt, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_tnd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_top, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_trx, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_try, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_ttd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_twd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_tzs, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_uah, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_ugx, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_uni, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_usd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_usdc, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_usdt, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_uyu, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_uzs, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_vef, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_vet, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_vnd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_vuv, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_wbtc, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_wst, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_xaf, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_xag, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_xau, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_xcd, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_xdr, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_xlm, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_xmr, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_xof, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_xpf, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_xrp, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_yer, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_zar, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_zmk, BigDecimal.ZERO, 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), ReverseUnit(MyUnitIDS.currency_zmw, BigDecimal.ZERO, 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_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.FromJson
import com.squareup.moshi.ToJson import com.squareup.moshi.ToJson
import java.math.BigDecimal
/** /**
* Represents a response object from currency-api * Represents a response object from currency-api
@ -30,7 +29,7 @@ import java.math.BigDecimal
*/ */
data class CurrencyUnitResponse( data class CurrencyUnitResponse(
val date: String, val date: String,
val currency: Map<String, BigDecimal> val currency: Map<String, Double>
) )
/** /**
@ -42,12 +41,9 @@ internal class CurrencyAdapter {
@Suppress("UNUSED", "UNCHECKED_CAST") @Suppress("UNUSED", "UNCHECKED_CAST")
@FromJson fun fromJson(response: Map<String, Any>): CurrencyUnitResponse { @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( return CurrencyUnitResponse(
date = response["date"] as String, 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.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember 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.ExpressionTextField
import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols
import com.sadellie.unitto.core.ui.common.textfield.UnformattedTextField 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.common.format
import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.UnitGroup
import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.AbstractUnit
@ -285,8 +287,13 @@ private fun Default(
TextFieldValue(uiState.calculation?.format(uiState.scale, uiState.outputFormat) ?: "") TextFieldValue(uiState.calculation?.format(uiState.scale, uiState.outputFormat) ?: "")
) )
} }
val connection by connectivityState() 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) { LaunchedEffect(connection) {
if ((connection == ConnectionState.Available) and (uiState.result == ConverterResult.Error)) { if ((connection == ConnectionState.Available) and (uiState.result == ConverterResult.Error)) {
@ -301,6 +308,23 @@ private fun Default(
ColumnWithConstraints(modifier = contentModifier) { ColumnWithConstraints(modifier = contentModifier) {
val textFieldModifier = Modifier.weight(2f) 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( ExpressionTextField(
modifier = textFieldModifier, modifier = textFieldModifier,
minRatio = 0.7f, minRatio = 0.7f,

View File

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

View File

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