diff --git a/app/src/main/java/dev/arkbuilders/rate/presentation/splash/SplashScreen.kt b/app/src/main/java/dev/arkbuilders/rate/presentation/splash/SplashScreen.kt index 8497368c2..54c0a7c2c 100644 --- a/app/src/main/java/dev/arkbuilders/rate/presentation/splash/SplashScreen.kt +++ b/app/src/main/java/dev/arkbuilders/rate/presentation/splash/SplashScreen.kt @@ -41,6 +41,7 @@ fun SplashScreen(navigator: DestinationsNavigator) { portfolioComponent.assetsRepo(), coreComponent.prefs(), coreComponent.buildConfigFieldsProvider().provide(), + coreComponent.currencyRepo(), ), ) diff --git a/app/src/main/java/dev/arkbuilders/rate/presentation/splash/SplashViewModel.kt b/app/src/main/java/dev/arkbuilders/rate/presentation/splash/SplashViewModel.kt index 43b85a68a..5ed23ce79 100644 --- a/app/src/main/java/dev/arkbuilders/rate/presentation/splash/SplashViewModel.kt +++ b/app/src/main/java/dev/arkbuilders/rate/presentation/splash/SplashViewModel.kt @@ -3,6 +3,7 @@ package dev.arkbuilders.rate.presentation.splash import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import dev.arkbuilders.rate.core.domain.BuildConfigFields +import dev.arkbuilders.rate.core.domain.repo.CurrencyRepo import dev.arkbuilders.rate.core.domain.repo.PreferenceKey import dev.arkbuilders.rate.core.domain.repo.Prefs import dev.arkbuilders.rate.feature.portfolio.domain.repo.PortfolioRepo @@ -22,11 +23,14 @@ class SplashViewModel( private val portfolioRepo: PortfolioRepo, private val prefs: Prefs, private val buildConfigFields: BuildConfigFields, + private val currencyRepo: CurrencyRepo, ) : ViewModel(), ContainerHost { override val container: Container = container(Unit) init { intent { + currencyRepo.initialize() + val currentVersionCode = buildConfigFields.versionCode val previousVersionCode = prefs.get(PreferenceKey.CurrentVersionCode) @@ -70,6 +74,7 @@ class SplashViewModelFactory( private val portfolioRepo: PortfolioRepo, private val prefs: Prefs, private val buildConfigFields: BuildConfigFields, + private val currencyRepo: CurrencyRepo, ) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { return SplashViewModel( @@ -77,6 +82,7 @@ class SplashViewModelFactory( portfolioRepo, prefs, buildConfigFields, + currencyRepo, ) as T } } diff --git a/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/CryptoCurrencyDataSource.kt b/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/CryptoCurrencyDataSource.kt index 8fd40cd1e..ceb9856a9 100644 --- a/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/CryptoCurrencyDataSource.kt +++ b/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/CryptoCurrencyDataSource.kt @@ -5,8 +5,6 @@ import arrow.core.left import arrow.core.right import dev.arkbuilders.rate.core.data.mapper.CryptoRateResponseMapper import dev.arkbuilders.rate.core.data.network.api.CryptoAPI -import dev.arkbuilders.rate.core.domain.model.CurrencyCode -import dev.arkbuilders.rate.core.domain.model.CurrencyName import dev.arkbuilders.rate.core.domain.model.CurrencyRate import dev.arkbuilders.rate.core.domain.model.CurrencyType import javax.inject.Inject @@ -27,6 +25,4 @@ class CryptoCurrencyDataSource @Inject constructor( e.left() } } - - override suspend fun getCurrencyName(): Map = emptyMap() } diff --git a/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/CurrencyDataSource.kt b/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/CurrencyDataSource.kt index 081d3ac5b..cb4aeee6d 100644 --- a/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/CurrencyDataSource.kt +++ b/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/CurrencyDataSource.kt @@ -1,8 +1,6 @@ package dev.arkbuilders.rate.core.data.repo.currency import arrow.core.Either -import dev.arkbuilders.rate.core.domain.model.CurrencyCode -import dev.arkbuilders.rate.core.domain.model.CurrencyName import dev.arkbuilders.rate.core.domain.model.CurrencyRate import dev.arkbuilders.rate.core.domain.model.CurrencyType @@ -10,6 +8,4 @@ interface CurrencyDataSource { val currencyType: CurrencyType suspend fun fetchRemote(): Either> - - suspend fun getCurrencyName(): Map } diff --git a/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/CurrencyInfoDataSource.kt b/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/CurrencyInfoDataSource.kt new file mode 100644 index 000000000..ca8ef3948 --- /dev/null +++ b/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/CurrencyInfoDataSource.kt @@ -0,0 +1,49 @@ +package dev.arkbuilders.rate.core.data.repo.currency + +import android.content.Context +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import dev.arkbuilders.rate.core.data.R +import dev.arkbuilders.rate.core.domain.model.CurrencyCode +import dev.arkbuilders.rate.core.domain.model.CurrencyInfo +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.withContext +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class CurrencyInfoDataSource @Inject constructor( + private val ctx: Context, +) { + suspend fun provide(): Map = + withContext(Dispatchers.IO) { + val nameDef: Deferred> = + async { + val codeNameText = + ctx.resources.openRawResource(R.raw.code_name).bufferedReader().use { + it.readText() + } + val codeNameType = object : TypeToken>() {}.type + Gson().fromJson(codeNameText, codeNameType) + } + + val countryDef: Deferred>> = + async { + val codeCountryText = + ctx.resources.openRawResource(R.raw.code_country).bufferedReader().use { + it.readText() + } + val codeCountryType = object : TypeToken>>() {}.type + Gson().fromJson(codeCountryText, codeCountryType) + } + + val codeToName = nameDef.await() + val codeToCountry = countryDef.await() + + return@withContext codeToName.mapValues { (code, name) -> + CurrencyInfo(code, name, codeToCountry[code] ?: emptyList()) + } + } +} diff --git a/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/CurrencyRepoImpl.kt b/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/CurrencyRepoImpl.kt index 0e5c4c900..2f79c7e89 100644 --- a/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/CurrencyRepoImpl.kt +++ b/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/CurrencyRepoImpl.kt @@ -4,9 +4,9 @@ import arrow.core.Either import arrow.core.left import arrow.core.right import dev.arkbuilders.rate.core.domain.AppConfig -import dev.arkbuilders.rate.core.domain.model.CurrencyName +import dev.arkbuilders.rate.core.domain.model.CurrencyCode +import dev.arkbuilders.rate.core.domain.model.CurrencyInfo import dev.arkbuilders.rate.core.domain.model.CurrencyRate -import dev.arkbuilders.rate.core.domain.model.CurrencyType import dev.arkbuilders.rate.core.domain.model.TimestampType import dev.arkbuilders.rate.core.domain.repo.CurrencyRepo import dev.arkbuilders.rate.core.domain.repo.NetworkStatus @@ -28,10 +28,17 @@ class CurrencyRepoImpl @Inject constructor( private val cryptoDataSource: CryptoCurrencyDataSource, private val localCurrencyDataSource: LocalCurrencyDataSource, private val fallbackRatesProvider: FallbackRatesProvider, + private val currencyInfoDataSource: CurrencyInfoDataSource, private val timestampRepo: TimestampRepo, private val networkStatus: NetworkStatus, ) : CurrencyRepo { - private val mutex = Mutex() + private val updateRatesMutex = Mutex() + private val loadInfoMutex = Mutex() + private var infoMap: Map = emptyMap() + + override suspend fun initialize() { + loadInfo() + } override suspend fun getCurrencyRates(): List = withContext(Dispatchers.IO) { @@ -49,30 +56,27 @@ class CurrencyRepoImpl @Inject constructor( } } - override suspend fun getCurrencyNames(): List { + override suspend fun getCurrencyInfo(): List { val rates = getCurrencyRates() - val fiatNames = fiatDataSource.getCurrencyName() - val cryptoNames = cryptoDataSource.getCurrencyName() + infoMap.ifEmpty { loadInfo() } - val names = + val ratesInfo = rates.map { rate -> - var name = - when (rate.type) { - CurrencyType.FIAT -> fiatNames[rate.code] - CurrencyType.CRYPTO -> cryptoNames[rate.code] - } - if (name == null) - name = CurrencyName(rate.code, "") - - name + infoMap[rate.code] ?: CurrencyInfo.emptyWithCode(rate.code) } - return names.sortedBy { it.code } + return ratesInfo.sortedBy { it.code } + } + + override suspend fun infoByCode(code: CurrencyCode): CurrencyInfo { + infoMap.ifEmpty { loadInfo() } + + return infoMap[code] ?: CurrencyInfo.emptyWithCode(code) } private suspend fun updateRates(): Either> = - mutex.withLock { + updateRatesMutex.withLock { val updatedDate = timestampRepo .getTimestamp(TimestampType.FetchRates) @@ -96,6 +100,13 @@ class CurrencyRepoImpl @Inject constructor( return rates } + private suspend fun loadInfo() = + loadInfoMutex.withLock { + if (infoMap.isNotEmpty()) return@withLock + + infoMap = currencyInfoDataSource.provide() + } + private fun hasUpdateIntervalPassed(updatedDate: OffsetDateTime?) = updatedDate == null || Duration.between(updatedDate, OffsetDateTime.now()) diff --git a/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/FiatCurrencyDataSource.kt b/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/FiatCurrencyDataSource.kt index 46181bc99..742e1f464 100644 --- a/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/FiatCurrencyDataSource.kt +++ b/core/data/src/main/java/dev/arkbuilders/rate/core/data/repo/currency/FiatCurrencyDataSource.kt @@ -5,8 +5,6 @@ import arrow.core.left import arrow.core.right import dev.arkbuilders.rate.core.data.mapper.FiatRateResponseMapper import dev.arkbuilders.rate.core.data.network.api.FiatAPI -import dev.arkbuilders.rate.core.domain.model.CurrencyCode -import dev.arkbuilders.rate.core.domain.model.CurrencyName import dev.arkbuilders.rate.core.domain.model.CurrencyRate import dev.arkbuilders.rate.core.domain.model.CurrencyType import javax.inject.Inject @@ -27,183 +25,4 @@ class FiatCurrencyDataSource @Inject constructor( e.left() } } - - override suspend fun getCurrencyName(): Map = - fiatCodeToCurrency - .map { (code, desc) -> code to CurrencyName(code, desc) } - .toMap() } - -private val fiatCodeToCurrency = - mapOf( - "AED" to "United Arab Emirates Dirham", - "AFN" to "Afghan Afghani", - "ALL" to "Albanian Lek", - "AMD" to "Armenian Dram", - "ANG" to "Netherlands Antillean Guilder", - "AOA" to "Angolan Kwanza", - "ARS" to "Argentine Peso", - "AUD" to "Australian Dollar", - "AWG" to "Aruban Florin", - "AZN" to "Azerbaijani Manat", - "BAM" to "Bosnia-Herzegovina Convertible Mark", - "BBD" to "Barbadian Dollar", - "BDT" to "Bangladeshi Taka", - "BGN" to "Bulgarian Lev", - "BHD" to "Bahraini Dinar", - "BIF" to "Burundian Franc", - "BMD" to "Bermudan Dollar", - "BND" to "Brunei Dollar", - "BOB" to "Bolivian Boliviano", - "BRL" to "Brazilian Real", - "BSD" to "Bahamian Dollar", - "BTC" to "Bitcoin", - "BTN" to "Bhutanese Ngultrum", - "BWP" to "Botswanan Pula", - "BYN" to "Belarusian Ruble", - "BZD" to "Belize Dollar", - "CAD" to "Canadian Dollar", - "CDF" to "Congolese Franc", - "CHF" to "Swiss Franc", - "CLF" to "Chilean Unit of Account (UF)", - "CLP" to "Chilean Peso", - "CNH" to "Chinese Yuan (Offshore)", - "CNY" to "Chinese Yuan", - "COP" to "Colombian Peso", - "CRC" to "Costa Rican Colón", - "CUC" to "Cuban Convertible Peso", - "CUP" to "Cuban Peso", - "CVE" to "Cape Verdean Escudo", - "CZK" to "Czech Republic Koruna", - "DJF" to "Djiboutian Franc", - "DKK" to "Danish Krone", - "DOP" to "Dominican Peso", - "DZD" to "Algerian Dinar", - "EGP" to "Egyptian Pound", - "ERN" to "Eritrean Nakfa", - "ETB" to "Ethiopian Birr", - "EUR" to "Euro", - "FJD" to "Fijian Dollar", - "FKP" to "Falkland Islands Pound", - "GBP" to "British Pound Sterling", - "GEL" to "Georgian Lari", - "GGP" to "Guernsey Pound", - "GHS" to "Ghanaian Cedi", - "GIP" to "Gibraltar Pound", - "GMD" to "Gambian Dalasi", - "GNF" to "Guinean Franc", - "GTQ" to "Guatemalan Quetzal", - "GYD" to "Guyanaese Dollar", - "HKD" to "Hong Kong Dollar", - "HNL" to "Honduran Lempira", - "HRK" to "Croatian Kuna", - "HTG" to "Haitian Gourde", - "HUF" to "Hungarian Forint", - "IDR" to "Indonesian Rupiah", - "ILS" to "Israeli New Sheqel", - "IMP" to "Manx pound", - "INR" to "Indian Rupee", - "IQD" to "Iraqi Dinar", - "IRR" to "Iranian Rial", - "ISK" to "Icelandic Króna", - "JEP" to "Jersey Pound", - "JMD" to "Jamaican Dollar", - "JOD" to "Jordanian Dinar", - "JPY" to "Japanese Yen", - "KES" to "Kenyan Shilling", - "KGS" to "Kyrgystani Som", - "KHR" to "Cambodian Riel", - "KMF" to "Comorian Franc", - "KPW" to "North Korean Won", - "KRW" to "South Korean Won", - "KWD" to "Kuwaiti Dinar", - "KYD" to "Cayman Islands Dollar", - "KZT" to "Kazakhstani Tenge", - "LAK" to "Laotian Kip", - "LBP" to "Lebanese Pound", - "LKR" to "Sri Lankan Rupee", - "LRD" to "Liberian Dollar", - "LSL" to "Lesotho Loti", - "LYD" to "Libyan Dinar", - "MAD" to "Moroccan Dirham", - "MDL" to "Moldovan Leu", - "MGA" to "Malagasy Ariary", - "MKD" to "Macedonian Denar", - "MMK" to "Myanma Kyat", - "MNT" to "Mongolian Tugrik", - "MOP" to "Macanese Pataca", - "MRU" to "Mauritanian Ouguiya", - "MUR" to "Mauritian Rupee", - "MVR" to "Maldivian Rufiyaa", - "MWK" to "Malawian Kwacha", - "MXN" to "Mexican Peso", - "MYR" to "Malaysian Ringgit", - "MZN" to "Mozambican Metical", - "NAD" to "Namibian Dollar", - "NGN" to "Nigerian Naira", - "NIO" to "Nicaraguan Córdoba", - "NOK" to "Norwegian Krone", - "NPR" to "Nepalese Rupee", - "NZD" to "New Zealand Dollar", - "OMR" to "Omani Rial", - "PAB" to "Panamanian Balboa", - "PEN" to "Peruvian Nuevo Sol", - "PGK" to "Papua New Guinean Kina", - "PHP" to "Philippine Peso", - "PKR" to "Pakistani Rupee", - "PLN" to "Polish Zloty", - "PYG" to "Paraguayan Guarani", - "QAR" to "Qatari Rial", - "RON" to "Romanian Leu", - "RSD" to "Serbian Dinar", - "RUB" to "Russian Ruble", - "RWF" to "Rwandan Franc", - "SAR" to "Saudi Riyal", - "SBD" to "Solomon Islands Dollar", - "SCR" to "Seychellois Rupee", - "SDG" to "Sudanese Pound", - "SEK" to "Swedish Krona", - "SGD" to "Singapore Dollar", - "SHP" to "Saint Helena Pound", - "SLL" to "Sierra Leonean Leone", - "SOS" to "Somali Shilling", - "SRD" to "Surinamese Dollar", - "SSP" to "South Sudanese Pound", - "STD" to "São Tomé and Príncipe Dobra (pre-2018)", - "STN" to "São Tomé and Príncipe Dobra", - "SVC" to "Salvadoran Colón", - "SYP" to "Syrian Pound", - "SZL" to "Swazi Lilangeni", - "THB" to "Thai Baht", - "TJS" to "Tajikistani Somoni", - "TMT" to "Turkmenistani Manat", - "TND" to "Tunisian Dinar", - "TOP" to "Tongan Pa'anga", - "TRY" to "Turkish Lira", - "TTD" to "Trinidad and Tobago Dollar", - "TWD" to "New Taiwan Dollar", - "TZS" to "Tanzanian Shilling", - "UAH" to "Ukrainian Hryvnia", - "UGX" to "Ugandan Shilling", - "USD" to "United States Dollar", - "UYU" to "Uruguayan Peso", - "UZS" to "Uzbekistan Som", - "VEF" to "Venezuelan Bolívar Fuerte (Old)", - "VES" to "Venezuelan Bolívar Soberano", - "VND" to "Vietnamese Dong", - "VUV" to "Vanuatu Vatu", - "WST" to "Samoan Tala", - "XAF" to "CFA Franc BEAC", - "XAG" to "Silver Ounce", - "XAU" to "Gold Ounce", - "XCD" to "East Caribbean Dollar", - "XDR" to "Special Drawing Rights", - "XOF" to "CFA Franc BCEAO", - "XPD" to "Palladium Ounce", - "XPF" to "CFP Franc", - "XPT" to "Platinum Ounce", - "YER" to "Yemeni Rial", - "ZAR" to "South African Rand", - "ZMW" to "Zambian Kwacha", - "ZWL" to "Zimbabwean Dollar", - ) diff --git a/core/data/src/main/res/raw/code_country.json b/core/data/src/main/res/raw/code_country.json new file mode 100644 index 000000000..f5f2fb049 --- /dev/null +++ b/core/data/src/main/res/raw/code_country.json @@ -0,0 +1,531 @@ +{ + "AFN": [ + "Afghanistan" + ], + "ALL": [ + "Albania" + ], + "DZD": [ + "Algeria" + ], + "USD": [ + "American Samoa", + "Bonaire, Sint Eustatius And Saba", + "British Indian Ocean Territory", + "Ecuador", + "El Salvador", + "Guam", + "Haiti", + "Marshall Islands", + "Micronesia", + "Northern Mariana Islands", + "Palau", + "Panama", + "Puerto Rico", + "Timor-Leste", + "Turks And Caicos Islands", + "United States Of America", + "Virgin Islands" + ], + "EUR": [ + "Andorra", + "Austria", + "Belgium", + "Croatia", + "Cyprus", + "Estonia", + "European Union", + "Finland", + "France", + "French Guiana", + "French Southern Territories", + "Germany", + "Greece", + "Guadeloupe", + "Holy See", + "Ireland", + "Italy", + "Latvia", + "Lithuania", + "Luxembourg", + "Malta", + "Martinique", + "Mayotte", + "Monaco", + "Montenegro", + "Netherlands", + "Portugal", + "Réunion", + "Saint Barthélemy", + "Saint Martin", + "Saint Pierre And Miquelon", + "San Marino", + "Slovakia", + "Slovenia", + "Spain", + "Åland Islands" + ], + "AOA": [ + "Angola" + ], + "XCD": [ + "Anguilla", + "Antigua And Barbuda", + "Dominica", + "Grenada", + "Montserrat", + "Saint Kitts And Nevis", + "Saint Lucia", + "Saint Vincent And The Grenadines" + ], + "ARS": [ + "Argentina" + ], + "AMD": [ + "Armenia" + ], + "AWG": [ + "Aruba" + ], + "AUD": [ + "Australia", + "Christmas Island", + "Cocos Islands", + "Heard Island And Mcdonald Islands", + "Kiribati", + "Nauru", + "Norfolk Island", + "Tuvalu" + ], + "AZN": [ + "Azerbaijan" + ], + "BSD": [ + "Bahamas" + ], + "BHD": [ + "Bahrain" + ], + "BDT": [ + "Bangladesh" + ], + "BBD": [ + "Barbados" + ], + "BYN": [ + "Belarus" + ], + "eryn": [ + "Belize" + ], + "XOF": [ + "Benin", + "Burkina Faso", + "Côte D\u0027Ivoire", + "Guinea-Bissau", + "Mali", + "Niger", + "Senegal", + "Togo" + ], + "BMD": [ + "Bermuda" + ], + "BTN": [ + "Bhutan" + ], + "BAM": [ + "Bosnia And Herzegovina" + ], + "BWP": [ + "Botswana" + ], + "NOK": [ + "Bouvet Island", + "Norway", + "Svalbard And Jan Mayen" + ], + "BRL": [ + "Brazil" + ], + "BND": [ + "Brunei Darussalam" + ], + "BGN": [ + "Bulgaria" + ], + "BIF": [ + "Burundi" + ], + "CVE": [ + "Cabo Verde" + ], + "KHR": [ + "Cambodia" + ], + "XAF": [ + "Cameroon", + "Central African Republic", + "Chad", + "Congo", + "Equatorial Guinea", + "Gabon" + ], + "CAD": [ + "Canada" + ], + "KYD": [ + "Cayman Islands" + ], + "CLF": [ + "Chile" + ], + "CNY": [ + "China" + ], + "KMF": [ + "Comoros" + ], + "CDF": [ + "Congo (The Democratic Republic Of The)" + ], + "NZD": [ + "Cook Islands", + "New Zealand", + "Niue", + "Pitcairn", + "Tokelau" + ], + "CRC": [ + "Costa Rica" + ], + "CUP": [ + "Cuba" + ], + "ANG": [ + "Curaçao", + "Sint Maarten" + ], + "CZK": [ + "Czechia" + ], + "DKK": [ + "Denmark", + "Faroe Islands", + "Greenland" + ], + "DJF": [ + "Djibouti" + ], + "DOP": [ + "Dominican Republic" + ], + "EGP": [ + "Egypt" + ], + "ERN": [ + "Eritrea" + ], + "SZL": [ + "Eswatini" + ], + "ETB": [ + "Ethiopia" + ], + "FKP": [ + "Falkland Islands " + ], + "FJD": [ + "Fiji" + ], + "XPF": [ + "French Polynesia", + "New Caledonia", + "Wallis And Futuna" + ], + "GMD": [ + "Gambia" + ], + "GEL": [ + "Georgia" + ], + "GHS": [ + "Ghana" + ], + "GIP": [ + "Gibraltar" + ], + "GTQ": [ + "Guatemala" + ], + "GBP": [ + "Guernsey", + "Isle Of Man", + "Jersey", + "United Kingdom Of Great Britain And Northern Ireland" + ], + "GNF": [ + "Guinea" + ], + "GYD": [ + "Guyana" + ], + "HNL": [ + "Honduras" + ], + "HKD": [ + "Hong Kong" + ], + "HUF": [ + "Hungary" + ], + "ISK": [ + "Iceland" + ], + "INR": [ + "India" + ], + "IDR": [ + "Indonesia" + ], + "XDR": [ + "International Monetary Fund" + ], + "IQD": [ + "Iraq" + ], + "ILS": [ + "Israel" + ], + "JMD": [ + "Jamaica" + ], + "JPY": [ + "Japan" + ], + "JOD": [ + "Jordan" + ], + "KZT": [ + "Kazakhstan" + ], + "KES": [ + "Kenya" + ], + "KPW": [ + "North Korea" + ], + "KRW": [ + "South Korea" + ], + "KWD": [ + "Kuwait" + ], + "KGS": [ + "Kyrgyzstan" + ], + "LAK": [ + "Laos" + ], + "LBP": [ + "Lebanon" + ], + "ZAR": [ + "Lesotho", + "Namibia", + "South Africa" + ], + "LRD": [ + "Liberia" + ], + "LYD": [ + "Libya" + ], + "MOP": [ + "Macao" + ], + "MGA": [ + "Madagascar" + ], + "MWK": [ + "Malawi" + ], + "MYR": [ + "Malaysia" + ], + "MVR": [ + "Maldives" + ], + "MRU": [ + "Mauritania" + ], + "MUR": [ + "Mauritius" + ], + "MDL": [ + "Moldova " + ], + "MNT": [ + "Mongolia" + ], + "MAD": [ + "Morocco", + "Western Sahara" + ], + "MZN": [ + "Mozambique" + ], + "MMK": [ + "Myanmar" + ], + "NPR": [ + "Nepal" + ], + "NIO": [ + "Nicaragua" + ], + "NGN": [ + "Nigeria" + ], + "MKD": [ + "North Macedonia" + ], + "OMR": [ + "Oman" + ], + "PKR": [ + "Pakistan" + ], + "PGK": [ + "Papua New Guinea" + ], + "PYG": [ + "Paraguay" + ], + "PEN": [ + "Peru" + ], + "PHP": [ + "Philippines" + ], + "PLN": [ + "Poland" + ], + "QAR": [ + "Qatar" + ], + "RON": [ + "Romania" + ], + "RUB": [ + "Russian Federation" + ], + "RWF": [ + "Rwanda" + ], + "SHP": [ + "Saint Helena, Ascension And Tristan Da Cunha" + ], + "WST": [ + "Samoa" + ], + "STN": [ + "Sao Tome And Principe" + ], + "SAR": [ + "Saudi Arabia" + ], + "RSD": [ + "Serbia" + ], + "SCR": [ + "Seychelles" + ], + "SLE": [ + "Sierra Leone" + ], + "SGD": [ + "Singapore" + ], + "SBD": [ + "Solomon Islands" + ], + "SOS": [ + "Somalia" + ], + "SSP": [ + "South Sudan" + ], + "LKR": [ + "Sri Lanka" + ], + "SDG": [ + "Sudan" + ], + "SRD": [ + "Suriname" + ], + "SEK": [ + "Sweden" + ], + "SYP": [ + "Syrian Arab Republic" + ], + "TWD": [ + "Taiwan" + ], + "TJS": [ + "Tajikistan" + ], + "TZS": [ + "Tanzania" + ], + "THB": [ + "Thailand" + ], + "TOP": [ + "Tonga" + ], + "TTD": [ + "Trinidad And Tobago" + ], + "TND": [ + "Tunisia" + ], + "TMT": [ + "Turkmenistan" + ], + "TRY": [ + "Türki̇ye" + ], + "UGX": [ + "Uganda" + ], + "UAH": [ + "Ukraine" + ], + "AED": [ + "United Arab Emirates" + ], + "UZS": [ + "Uzbekistan" + ], + "VUV": [ + "Vanuatu" + ], + "VED": [ + "Venezuela" + ], + "VND": [ + "Viet Nam" + ], + "YER": [ + "Yemen" + ], + "ZMW": [ + "Zambia" + ], + "ZWG": [ + "Zimbabwe" + ] +} \ No newline at end of file diff --git a/core/data/src/main/res/raw/code_name.json b/core/data/src/main/res/raw/code_name.json new file mode 100644 index 000000000..bed141715 --- /dev/null +++ b/core/data/src/main/res/raw/code_name.json @@ -0,0 +1,1144 @@ +{ + "AFN": "Afghani", + "ALL": "Lek", + "DZD": "Algerian Dinar", + "USD": "US Dollar", + "EUR": "Euro", + "AOA": "Kwanza", + "XCD": "East Caribbean Dollar", + "ARS": "Argentine Peso", + "AMD": "Armenian Dram", + "AWG": "Aruban Florin", + "AUD": "Australian Dollar", + "AZN": "Azerbaijan Manat", + "BSD": "Bahamian Dollar", + "BHD": "Bahraini Dinar", + "BDT": "Taka", + "BBD": "Barbados Dollar", + "BYN": "Belarusian Ruble", + "BZD": "Belize Dollar", + "XOF": "CFA Franc BCEAO", + "BMD": "Bermudian Dollar", + "INR": "Indian Rupee", + "BTN": "Ngultrum", + "BOB": "Boliviano", + "BAM": "Convertible Mark", + "BWP": "Pula", + "NOK": "Norwegian Krone", + "BRL": "Brazilian Real", + "BND": "Brunei Dollar", + "BGN": "Bulgarian Lev", + "BIF": "Burundi Franc", + "CVE": "Cabo Verde Escudo", + "KHR": "Riel", + "XAF": "CFA Franc BEAC", + "CAD": "Canadian Dollar", + "KYD": "Cayman Islands Dollar", + "CLF": "Unidad de Fomento", + "CNY": "Yuan Renminbi", + "COP": "Colombian Peso", + "KMF": "Comorian Franc", + "CDF": "Congolese Franc", + "NZD": "New Zealand Dollar", + "CRC": "Costa Rican Colon", + "CUP": "Cuban Peso", + "ANG": "Netherlands Antillean Guilder", + "CZK": "Czech Koruna", + "DKK": "Danish Krone", + "DJF": "Djibouti Franc", + "DOP": "Dominican Peso", + "EGP": "Egyptian Pound", + "SVC": "El Salvador Colon", + "ERN": "Nakfa", + "SZL": "Lilangeni", + "ETB": "Ethiopian Birr", + "FKP": "Falkland Islands Pound", + "FJD": "Fiji Dollar", + "XPF": "CFP Franc", + "GMD": "Dalasi", + "GEL": "Lari", + "GHS": "Ghana Cedi", + "GIP": "Gibraltar Pound", + "GTQ": "Quetzal", + "GBP": "Pound Sterling", + "GNF": "Guinean Franc", + "GYD": "Guyana Dollar", + "HTG": "Gourde", + "HNL": "Lempira", + "HKD": "Hong Kong Dollar", + "HUF": "Forint", + "ISK": "Iceland Krona", + "IDR": "Rupiah", + "XDR": "SDR,Special Drawing Right", + "IQD": "Iraqi Dinar", + "ILS": "New Israeli Sheqel", + "JMD": "Jamaican Dollar", + "JPY": "Yen", + "JOD": "Jordanian Dinar", + "KZT": "Tenge", + "KES": "Kenyan Shilling", + "KPW": "North Korean Won", + "KRW": "Won", + "KWD": "Kuwaiti Dinar", + "KGS": "Som", + "LAK": "Lao Kip", + "LBP": "Lebanese Pound", + "LSL": "Loti", + "ZAR": "Rand", + "LRD": "Liberian Dollar", + "LYD": "Libyan Dinar", + "MOP": "Pataca", + "MGA": "Malagasy Ariary", + "MWK": "Malawi Kwacha", + "MYR": "Malaysian Ringgit", + "MVR": "Rufiyaa", + "MRU": "Ouguiya", + "MUR": "Mauritius Rupee", + "MXN": "Mexican Peso", + "MDL": "Moldovan Leu", + "MNT": "Tugrik", + "MAD": "Moroccan Dirham", + "MZN": "Mozambique Metical", + "MMK": "Kyat", + "NAD": "Namibia Dollar", + "NPR": "Nepalese Rupee", + "NIO": "Cordoba Oro", + "NGN": "Naira", + "MKD": "Denar", + "OMR": "Rial Omani", + "PKR": "Pakistan Rupee", + "PAB": "Balboa", + "PGK": "Kina", + "PYG": "Guarani", + "PEN": "Sol", + "PHP": "Philippine Peso", + "PLN": "Zloty", + "QAR": "Qatari Rial", + "RON": "Romanian Leu", + "RUB": "Russian Ruble", + "RWF": "Rwanda Franc", + "SHP": "Saint Helena Pound", + "WST": "Tala", + "STN": "Dobra", + "SAR": "Saudi Riyal", + "RSD": "Serbian Dinar", + "SCR": "Seychelles Rupee", + "SLE": "Leone", + "SGD": "Singapore Dollar", + "SBD": "Solomon Islands Dollar", + "SOS": "Somali Shilling", + "SSP": "South Sudanese Pound", + "LKR": "Sri Lanka Rupee", + "SDG": "Sudanese Pound", + "SRD": "Surinam Dollar", + "SEK": "Swedish Krona", + "SYP": "Syrian Pound", + "TWD": "New Taiwan Dollar", + "TJS": "Somoni", + "TZS": "Tanzanian Shilling", + "THB": "Baht", + "TOP": "Pa’anga", + "TTD": "Trinidad and Tobago Dollar", + "TND": "Tunisian Dinar", + "TMT": "Turkmenistan New Manat", + "TRY": "Turkish Lira", + "UGX": "Uganda Shilling", + "UAH": "Hryvnia", + "AED": "UAE Dirham", + "UYI": "Uruguay Peso en Unidades Indexadas", + "UZS": "Uzbekistan Sum", + "VUV": "Vatu", + "VED": "Bolívar Soberano", + "VND": "Vietnamese Dong", + "YER": "Yemeni Rial", + "ZMW": "Zambian Kwacha", + "ZWG": "Zimbabwe Gold", + "$BASED": "Based", + "$READ": "Reach DAO", + "$SNOW": "Snowflake", + "0XBTC": "0xBitcoin", + "10SET": "Tenset", + "1FLR": "Flare", + "1INCH": "1 Inch", + "1ST": "FirstBlood", + "AAVE": "Aave", + "ABAT": "Aave BAT", + "ABBC": "Abbc", + "ABT": "Arcblock", + "ABUSD": "Aave BUSD", + "AC3": "AC3", + "ACA": "Acala", + "ACT": "Achain", + "ADA": "Cardano", + "ADAI": "Aave DAI", + "ADB": "Adbank", + "ADX": "AdEx", + "AE": "Aeternity", + "AENJ": "Aave ENJ", + "AEON": "Aeon", + "AERGO": "Aergo", + "AETH": "Aave ETH", + "AGI": "SingularityNET", + "AIDOGE": "ArbDoge AI", + "AION": "Aion", + "AIT": "AICHAIN", + "AKNC": "Aave KNC", + "AKRO": "Akropolis", + "AKT": "Akash Network", + "ALCX": "Alchemix", + "ALEND": "Aave LEND", + "ALEPH": "Aleph.im", + "ALETH": "Alchemix ETH", + "ALGO": "Algorand", + "ALI": "Artificial Liquid Intelligence", + "ALINK": "Aave LINK", + "ALPHA": "Alpha Finance", + "ALUSD": "Alchemix USD", + "ALX": "ALAX", + "AMANA": "Aave MANA", + "AMB": "Ambrosus", + "AMKR": "Aave MKR", + "AMKT": "Alongside Crypto Market Index", + "AMLT": "AMLT", + "AMP": "Amp", + "AMPL": "Ampleforth", + "ANC": "Anchor Protocol", + "ANJ": "Aragon Court", + "ANKR": "Ankr", + "ANT": "Aragon", + "APE": "ApeCoin", + "APH": "Aphelion", + "APL": "Apollo Currency", + "APPC": "AppCoins", + "APT": "Aptos", + "APW": "APWine Finance", + "APY": "APY.Finance", + "AR": "Arweave", + "ARB": "Arbitrum", + "ARBS": "Arbswap", + "ARCHIVE": "Chainback", + "ARDR": "Ardor", + "AREN": "Aave REN", + "ARK": "Ark", + "ARKM": "Arkham", + "ARMOR": "Armor", + "ARN": "Aeron", + "ARO": "Arionum", + "ARRR": "Pirate Chain", + "ASM": "Assemble Protocol", + "ASNX": "Aave SNX", + "AST": "AirSwap", + "ASTRO": "Astroport.fi", + "ASUSD": "Aave SUSD", + "ATMI": "Atonomi", + "ATOM": "Cosmos", + "ATUSD": "Aave TUSD", + "AUC": "Auctus", + "AUDIO": "Audius", + "AURA": "Aura Protocol", + "AUSDC": "Aave USDC", + "AUSDT": "Aave USDT", + "AUTO": "Auto", + "AVAX": "Avalanche", + "AVINOC": "AVINOC", + "AWBTC": "Aave WBTC", + "AWC": "Atomic Wallet Coin", + "AWETH": "Aave WETH", + "AXP": "Axprire", + "AYFI": "Aave YFI", + "AZERO": "Aleph Zero", + "AZRX": "Aave ZRX", + "BABYDOGE": "Baby Doge Coin", + "BAC": "Basis Cash", + "BADGER": "Badger DAO", + "BAL": "Balancer", + "BAND": "Band Protocol", + "BAO": "Bao Finance", + "BAT": "Basic Attention Token", + "BAY": "BitBay", + "BBR": "BoolBerry", + "BCD": "Bitcoin Diamond", + "BCH": "Bitcoin Cash", + "BCHA": "Bitcoin Cash ABC", + "BCN": "Bytecoin", + "BCO": "BridgeCoin", + "BEL": "Bella Protocol", + "BETA": "Beta Finance", + "BF": "BitForex Token", + "BFC": "Bifrost", + "BGB": "Bitget Token", + "BICO": "Biconomy", + "BIFI": "Beefy.Finance", + "BIRB": "Birb", + "BIT": "BitDAO", + "BITCOIN": "HarryPotterObamaSonic10Inu", + "BIX": "Bibox Token", + "BLANK": "BlockWallet", + "BLD": "Agoric", + "BLK": "BlackCoin", + "BLOCK": "Blocknet", + "BLT": "Bloom", + "BLUE": "Blue Protocol", + "BLUR": "Blur", + "BLZ": "Bluzelle", + "BMDA": "Bermuda", + "BNB": "Binance Coin", + "BNC": "Bifrost Native Coin", + "BNT": "Bancor", + "BNX": "BynaryX", + "BOND": "Bondly", + "BONDLY": "Bondly", + "BORA": "BORA", + "BOTTO": "Botto", + "BOX": "ContentBox", + "BPT": "Blockport", + "BRD": "Bread", + "BRISE": "Bitgert", + "BROCK": "Bitrock", + "BSW": "Biswap", + "BTC": "Bitcoin", + "BTC++": "PieDAO BTC++", + "BTCD": "Bitcoin Dark", + "BTCP": "Bitcoin Private", + "BTG": "Bitcoin Gold", + "BTMX": "Bitmax Token", + "BTO": "Bottos", + "BTR": "Bitrue Coin", + "BTS": "BitShares", + "BTT": "BitTorrent", + "BTU": "BTU Protocol", + "BU": "BUMO", + "BUNNY": "Pancake Bunny", + "BUSD": "Binance USD", + "BWAJNA": "Bwajna", + "BWT": "Bittwatt", + "BZ": "BitZ Token", + "BZNT": "Bezant", + "BZRX": "bZx Protocol", + "C20": "CRYPTO20", + "C98": "Coin98", + "CAKE": "PancakeSwap", + "CANTO": "Canto", + "CAP": "Cap", + "CAPP": "Cappasity", + "CAR": "CarBlock", + "CARD": "Cardstack", + "CBAT": "Compound Basic Attention Token", + "CBETH": "Coinbase Wrapped Staked ETH", + "CBT": "CommerceBlock", + "CDAI": "cDAI", + "CDT": "Blox", + "CEEK": "CEEK VR", + "CEL": "Celsius Network", + "CELO": "Celo", + "CELR": "Celer Network", + "CENNZ": "CENNZnet", + "CET": "CoinEx", + "CETH": "cETH", + "CFG": "Centrifuge", + "CFX": "Conflux", + "CHAI": "Chai", + "CHAIN": "Chain Games", + "CHAT": "BeeChat", + "CHIA": "Chia", + "CHO": "Choise.com", + "CHR": "Chromia", + "CHSB": "SwissBorg", + "CHZ": "Chiliz", + "CIRUS": "Cirus", + "CKB": "Nervos Network", + "CLO": "Callisto Network", + "CLOAK": "Cloakcoin", + "CLOUT": "BitClout", + "CMT": "CyberMiles", + "CNC": "Conic", + "CND": "Cindicator", + "CNX": "Cryptonex", + "COC": "Coc", + "COCN": "Coca Network", + "COMAI": "Commune AI", + "COMP": "Compound Finance", + "CONI": "Coinbene Token", + "CORE": "Core", + "COSM": "Cosmo Coin", + "COTI": "COTI", + "COV": "Covesting", + "COVA": "Cova Unity", + "COVER": "Cover Protocol", + "CPC": "CPChain", + "CRD": "Crolend", + "CRE": "Crescent Network", + "CREAM": "Cream", + "CRED": "Verify", + "CREP": "cREP", + "CRO": "Crypto.com Coin", + "CRPT": "Crypterium", + "CRV": "Curve DAO Token", + "CRVUSD": "crvUSD", + "CS": "Credits", + "CSAI": "cSAI", + "CSC": "Casinocoin", + "CSPR": "Casper Network", + "CTC": "Creditcoin", + "CTSI": "Cartesi", + "CTXC": "Cortex", + "CUSDC": "cUSDC", + "CV": "carVertical", + "CVC": "Civic", + "CVP": "PowerPool", + "CVT": "CyberVeinToken", + "CVX": "Convex Finance", + "CWBTC": "cWBTC", + "CYBER": "CyberConnect", + "CZRX": "Compound 0x", + "D2": "D2 Finance", + "DADI": "Edge", + "DAFI": "DAFI Protocol", + "DAG": "Constellation", + "DAI": "Dai", + "DAO": "DAO Maker", + "DASH": "Dash", + "DAT": "Datum", + "DATA": "Streamr", + "DATX": "DATx", + "DBC": "DeepBrain Chain", + "DCK": "DexCheck AI", + "DCN": "Dentacoin", + "DCR": "Decred", + "DCT": "Decent", + "DDD": "Scry.info", + "DEL": "Decimal", + "DENT": "Dent", + "DEP": "Depth", + "DERI": "Deri Protocol", + "DESO": "Decentralized Social", + "DEXE": "DeXe", + "DF": "dForce", + "DFI": "DeFiChain", + "DFT": "DigiFinex Token", + "DFYN": "Dfyn Network", + "DGB": "DigiByte", + "DGD": "DigixDAO", + "DGTX": "Digitex Token", + "DHT": "dHEDGE DAO", + "DIA": "DIA", + "DINERO": "Dinerobet", + "DIVI": "Divi", + "DLT": "Agrello", + "DMT": "DMarket", + "DMTR": "Dimitra", + "DNT": "district0x", + "DOCK": "Dock", + "DODO": "DODO", + "DOGE": "Dogecoin", + "DOJO": "Dojo", + "DOME": "Everdome", + "DOR": "Dor", + "DOT": "Polkadot", + "DRGN": "Dragonchain", + "DROP": "Dropil", + "DTA": "DATA", + "DTR": "Dynamic Trading Rights", + "DTX": "Databroker", + "DVF": "DeversiFi", + "DXD": "DXdao", + "DXT": "Datawallet", + "DYDX": "dYdX", + "EDG": "Edgeless", + "EDO": "Eidoo", + "EDU": "Open Campus", + "EFI": "Efinity Token", + "EFX": "Effect.AI", + "EGLD": "Elrond", + "EGT": "Egretia", + "EKG": "Ekon Gold", + "EKT": "EDUCare", + "ELA": "Elastos", + "ELAN": "Elan", + "ELEC": "Electrify.Asia", + "ELF": "aelf", + "ELG": "Escoin", + "EMC": "Emercoin", + "EMC2": "Einsteinium", + "ENG": "Enigma", + "ENIX": "ASENIX", + "ENJ": "Enjin Coin", + "ENS": "Ethereum Name Service", + "ENTS": "Ents", + "EOS": "Binance-Peg EOS", + "EOSDAC": "eosDAC", + "EQB": "Equilibria Finance", + "ERG": "Ergo", + "ESD": "Empty Set Dollar", + "ESS": "Essentia", + "ETC": "Ethereum Classic", + "ETH": "Ethereum", + "ETHW": "EthereumPoW", + "ETN": "Electroneum", + "ETP": "Metaverse ETP", + "ETZ": "Ether Zero", + "EUROC": "Euro Coin", + "EVER": "Everscale", + "EVMOS": "Evmos", + "EVX": "Everex", + "EWT": "Energy Web Token", + "EXRN": "EXRNchain", + "EXY": "Experty", + "EZY": "EZZY Game", + "FAB": "Fabric", + "FAME": "Fame", + "FARM": "Farm", + "FCT": "Factom", + "FEED": "Feeder.finance", + "FEI": "Fei USD", + "FET": "Fetch.ai", + "FIDA": "Bonfida", + "FIDU": "Fidu", + "FIL": "Filecoin", + "FILDA": "Filda", + "FIS": "Stafi", + "FLASH": "Flashstake", + "FLEX": "FLEX Coin", + "FLOKI": "FLOKI", + "FLOW": "Flow", + "FLUX": "Flux", + "FNSA": "Finschia", + "FOAM": "Foam", + "FOLD": "Manifold Finance", + "FOTA": "Fortuna", + "FOX": "Shapeshift Token", + "FPI": "Frax Price Index", + "FPIS": "Frax Price Index Share", + "FRAX": "Frax", + "FRM": "Ferrum Network", + "FRONT": "Frontier", + "FRXETH": "Frax Ether", + "FSN": "Fusion", + "FST": "Futureswap", + "FT": "FToken", + "FTC": "Feathercoin", + "FTM": "Fantom", + "FTT": "FTX Token", + "FUEL": "Etherparty", + "FUN": "FUNToken", + "FX": "Function X", + "FXC": "Flexacoin", + "FXS": "Frax Share", + "FXT": "FuzeX", + "GAL": "Galxe", + "GALA": "Gala", + "GAMMA": "Gamma Strategies", + "GB": "Goldbank", + "GDC": "Global Digital Token", + "GEM": "Gems", + "GEN": "DAOstack", + "GIV": "Giveth", + "GLMR": "Moonbeam", + "GMEE": "GAMEE", + "GMT": "Gomining Token", + "GMX": "GMX", + "GNO": "Gnosis", + "GNS": "Gains Network", + "GNT": "Golem", + "GNX": "Genaro Network", + "GO": "GoChain", + "GOC": "GoCrypto", + "GOT": "GoNetwork", + "GOVI": "CVI", + "GRAIL": "Camelot Token", + "GRIN": "Grin", + "GROW": "Grow", + "GRP": "Grape", + "GRS": "Groestlcoin", + "GRT": "The Graph", + "GSC": "Global Social Chain", + "GSWAP": "Gameswap", + "GT": "GateToken", + "GTAI": "GT Protocol", + "GTC": "Gitcoin", + "GTO": "Gifto", + "GUSD": "Gemini Dollar", + "GVT": "Genesis Vision", + "GXS": "GXShares", + "GYEN": "GYEN", + "HAIR": "Hair DAO", + "HAKKA": "Hakka Finance", + "HAN": "HanChain", + "HANEP": "HANeP", + "HBAR": "Hedera Hashgraph", + "HC": "HyperCash", + "HEDG": "HedgeTrade", + "HEGIC": "Hegic", + "HER": "HeroNode", + "HEX": "HEX", + "HFT": "Hashflow", + "HIGH": "Highstreet", + "HIVE": "Hive", + "HNT": "Helium", + "HOT": "Holo", + "HPB": "High Performance Blockchain", + "HT": "Huobi Token", + "HUM": "Humanscape", + "HUSD": "HUSD", + "HVN": "Hiveterminal token", + "HXRO": "Hxro", + "HYDRO": "Hydro", + "HYN": "Hyperion", + "HZN": "Horizon Protocol", + "ICE": "Popsicle Finance", + "ICN": "Iconomi", + "ICP": "Internet Computer", + "ICX": "ICON", + "ID": "SPACE ID", + "IDAI": "Instadapp DAI", + "IDEX": "IDEX", + "IETH": "Indigo Protocol", + "IFARM": "iFARM", + "IGNIS": "Ignis", + "IKNC": "Kyber Network Crystal Legacy", + "ILINK": "iLINK", + "ILV": "Illuvium", + "IMX": "ImmutableX", + "INB": "Insight Chain", + "INJ": "Injective", + "INSTAR": "Insights Network", + "IOST": "IOST", + "IOTA": "IOTA", + "IOTX": "IoTeX", + "IQ": "IQ", + "IREP": "Fulcrum REP iToken", + "IRIS": "IRISnet", + "ISAI": "Fulcrum SAI", + "IST": "Inter Stable Token", + "ISUSD": "lisUSD", + "IUSDC": "Instadapp USDC", + "IWBTC": "Instadapp WBTC", + "IXT": "IX", + "IZRX": "Fulcrum ZRX iToken", + "JNT": "Jibrel Network", + "JST": "Jarvis Network", + "JTO": "Jito", + "JUNO": "Juno", + "KAS": "Kaspa", + "KAVA": "Kava.io", + "KCS": "KuCoin Token", + "KDA": "Kadena", + "KEEP": "Keep Network", + "KEY": "Selfkey", + "KICK": "KickToken", + "KIN": "Kin", + "KIRA": "KIRA", + "KIRO": "Kiro", + "KIWI": "KIWI TOKEN", + "KLAY": "Klaytn", + "KLV": "Klever", + "KMD": "Komodo", + "KNC": "Kyber Network", + "KSM": "Kusama", + "KTN": "Kostren Finance", + "KUB": "Bitkub Coin", + "KUJI": "Kujira", + "LAMB": "Lambda", + "LAND": "Landbox", + "LBA": "Libra Token", + "LCX": "LCX", + "LDO": "Lido DAO", + "LEND": "Aave", + "LEO": "LEO Token", + "LIEN": "Lien", + "LINK": "Chainlink", + "LIT": "Litentry", + "LKY": "Valkyrie Network", + "LN": "Link", + "LODE": "Lodestar", + "LON": "Tokenlon", + "LOOKS": "LooksRare", + "LOOM": "Loom Network", + "LPF": "Loopfi", + "LPT": "Livepeer", + "LQD": "Liquid Network", + "LQTY": "Liquity", + "LRC": "Loopring", + "LSK": "Lisk", + "LTC": "Litecoin", + "LTO": "LTO Network", + "LUCA": "LUCA", + "LUN": "Lunyr", + "LUNA": "Terra", + "LUSD": "Liquity USD", + "LXT": "LITEX", + "LYM": "Lympo", + "MAGIC": "Magic", + "MAHA": "MahaDAO", + "MAID": "MaidSafeCoin", + "MAN": "Matrix AI Network", + "MANA": "Decentraland", + "MANTA": "Manta Network", + "MASK": "Mask Network", + "MATH": "MATH", + "MATIC": "Polygon", + "MATTER": "AntiMatter", + "MAV": "Maverick Protocol", + "MBC": "Marblecoin", + "MBOX": "Mobox", + "MC": "Merit Circle", + "MCO": "MCO", + "MCX": "Machi X", + "MDA": "Moeda Loyalty Points", + "MDAO": "MarsDAO", + "MDS": "MediShares", + "MED": "MediBloc", + "MEDX": "MediBlocX", + "MEME": "Memecoin", + "MET": "Metronome", + "METANO": "Metano", + "METIS": "Metis", + "MEX": "Maiar DEX", + "MFG": "SyncFab", + "MFT": "Hifi Finance", + "MIM": "Magic Internet Money", + "MIMATIC": "MAI", + "MIR": "Mirror Protocol", + "MITH": "Mithril", + "MKR": "Maker", + "MLN": "Melon", + "MNGO": "Mango", + "MNTL": "AssetMantle", + "MNW": "Morpheus Network", + "MOCHI": "Mochi", + "MOD": "Modum", + "MOM": "Mom", + "MOONS": "r/CryptoCurrency Moons", + "MOT": "Olympus Labs", + "MPL": "Maple", + "MTA": "Meta", + "MTH": "Monetha", + "MTL": "Metal", + "MTN": "Medicalchain", + "MURA": "Murasaki", + "MVC": "Maverick Chain", + "MVL": "MVL", + "MVP": "Merculet", + "MWAT": "Restart Energy", + "MWC": "MimbleWimbleCoin", + "MXM": "Maximine Coin", + "MYB": "MyBit", + "NANO": "Nano", + "NAS": "Nebulas", + "NAV": "Navcoin", + "NCASH": "Nucleus Vision", + "NCT": "PolySwarm", + "NEAR": "NEAR Protocol", + "NEBL": "Neblio", + "NEC": "Nectar", + "NEO": "Neo", + "NEOX": "Neoxa", + "NEST": "Nest Protocol", + "NEW": "Newton", + "NEX": "Nexo", + "NEXUS": "Nexus Pro", + "NEXXO": "Nexxo", + "NFT": "APENFT", + "NFTB": "NFTb", + "NGC": "NAGA", + "NIOX": "Autonio", + "NKN": "NKN", + "NLG": "Gulden", + "NMR": "Numeraire", + "NOIA": "Syntropy", + "NOS": "Nosana", + "NPER": "Perpetuals", + "NPXS": "Pundi X", + "NRG": "Energi", + "NRV": "Nerve Finance", + "NRVE": "Narrative", + "NTIC": "Entice", + "NTL": "Nautilus Network", + "NTRN": "Neutron", + "NU": "NuCypher", + "NULS": "Nuls", + "NXM": "Nexus Mutual", + "NXRA": "AllianceBlock Nexera", + "NXS": "Nexus", + "NXT": "Nxt", + "OAX": "OAX", + "OCEAN": "Ocean Protocol", + "OCN": "Odyssey", + "ODE": "ODEM", + "OGN": "Origin Protocol", + "OHM": "Olympus", + "OIL": "Oiler", + "OKB": "OKB", + "OKS": "Oikos", + "OLT": "OneLedger", + "OMG": "OMG Network", + "ONDO": "Ondo", + "ONE": "Harmony", + "ONION": "DeepOnion", + "ONT": "Ontology", + "OP": "Optimism", + "OPEN": "Open Platform", + "OPIUM": "Opium", + "OPUL": "Opulous", + "OPX": "OPX Finance", + "ORAI": "Oraichain", + "ORBS": "Orbs", + "ORC": "Orbit Chain", + "ORN": "Orion Protocol", + "OSMO": "Osmosis", + "OST": "OST", + "OVC": "OVCODE", + "OX": "Open Exchange Token", + "OXT": "Orchid Protocol", + "PAI": "Project Pai", + "PAINT": "MurAll", + "PAL": "PAL Network", + "PALM": "PalmSwap", + "PAPER": "Dope Wars Paper", + "PAR": "Parallel", + "PART": "Particl", + "PASG": "Passage", + "PAX": "Paxos", + "PAXG": "PAX Gold", + "PAY": "TenX", + "PBIRB": "Parrotly", + "PBR": "PolkaBridge", + "PENDLE": "Pendle", + "PEPE": "Pepe", + "PERL": "PERL.eco", + "PERP": "Perpetual Protocol", + "PHA": "Phala Network", + "PHTK": "Phun Token", + "PHX": "Phoenix Finance", + "PICKLE": "Pickle Finance", + "PIKA": "Pika Protocol", + "PIP": "Pip", + "PIVX": "PIVX", + "PLUSDC": "plUSDC", + "PLA": "PlayDapp", + "PLAY": "HEROcoin", + "PLDAI": "Pool Dai", + "PLR": "Pillar", + "PLTC": "PlatonCoin", + "PNB": "Pink BNB", + "PNG": "Pangolin", + "PNK": "Kleros", + "PNT": "pNetwork", + "POA": "POA Network", + "POE": "Po.et", + "POKT": "Pocket Network", + "POLS": "Polkastarter", + "POLY": "POLY Maximus", + "POLYX": "Polymesh", + "POM": "Proof of Memes", + "POND": "Marlin", + "POOL": "PoolTogether", + "POP": "Popcorn", + "POWR": "Power Ledger", + "PPAY": "Plasma Finance", + "PPC": "Peercoin", + "PPP": "PayPie", + "PPT": "Populous", + "PRE": "Presearch", + "PREMIA": "Premia", + "PRIME": "Echelon Prime", + "PRL": "Oyster", + "PRO": "Propy", + "PROM": "Prom", + "PROS": "Prosper", + "PRQ": "Parsiq", + "PSP": "ParaSwap", + "PST": "Primas", + "PXP": "PointPay", + "PYR": "Vulcan Forged", + "PYTH": "Pyth Network", + "QASH": "QASH", + "QBIT": "Qubitica", + "QI": "QiSwap", + "QKC": "QuarkChain", + "QLC": "QLC Chain", + "QNT": "Quant", + "QRDO": "Qredo", + "QSP": "Quantstamp", + "QTCON": "Quiztok", + "QTUM": "Qtum", + "QUICK": "Quickswap", + "RACA": "Radio Caca", + "RAE": "Receive Access Ecosystem", + "RAI": "Rai Reflex Index", + "RARI": "Rarible", + "RAY": "Raydium", + "RBN": "Ribbon Finance", + "RBX": "RabbitX", + "RCN": "Ripio Credit Network", + "RDAI": "Rari DAI", + "RDD": "Reddcoin", + "RDN": "Raiden Network Token", + "RDNT": "Radiant Capital", + "REN": "Ren", + "REP": "Augur", + "REQ": "Request", + "RETH": "StaFi Staked ETH", + "REV": "Revain", + "RFOX": "RedFox Labs", + "RGT": "Rari Governance Token", + "RIF": "RSK Infrastructure Framework", + "RLC": "iExec RLC", + "RLY": "Rally", + "RNDR": "Render", + "ROOK": "KeeperDAO", + "ROSE": "Oasis Network", + "RPL": "Rocket Pool", + "RSR": "Reserve Rights Token", + "RSV": "Reserve", + "RUNE": "THORChain", + "RVN": "Ravencoin", + "S": "Sharpay", + "SAI": "Sai", + "SALT": "Salt", + "SAN": "Santiment Network Token", + "SAND": "The Sandbox", + "SAPP": "Sapphire", + "SCRT": "Secret", + "SCS": "Solcasino Token", + "SDEX": "SmarDex", + "SDL": "Saddle", + "SDT": "Stake DAO", + "SEELE": "Seele", + "SEFI": "Secret Finance", + "SEI": "Sei", + "SEM": "Semux", + "SETH": "sETH", + "SETH2": "sETH2", + "SFI": "Saffron Finance", + "SFM": "SafeMoon", + "SFP": "Safe Pal", + "SHA": "Safe Haven", + "SHIB": "Shiba Inu", + "SHR": "ShareToken", + "SHUF": "Shuffle Monster", + "SI": "Siren", + "SIA": "Siacoin", + "SIDUS": "Sidus", + "SILO": "Silo Finance", + "SKL": "Skale", + "SKY": "Skycoin", + "SLD": "Shield", + "SLEX": "SLEX Token", + "SLP": "Smooth Love Potion", + "SLT": "Smartlands Token", + "SMART": "SmartCash", + "SNAIL": "SnailBrook", + "SNC": "SunContract", + "SNGLS": "SingularDTV", + "SNM": "SONM", + "SNT": "Status", + "SNX": "Synthetix Network Token", + "SOAPS": "Soaps Tech", + "SOCKS": "Unisocks", + "SOFI": "Sofi", + "SOL": "Solana", + "SOUL": "Phantasma", + "SOV": "Sovryn", + "SPANK": "SpankChain", + "SPIKE": "Spiking", + "SPN": "Sapien", + "SQR": "Magic Square", + "SRM": "Serum", + "SSV": "SSV Network", + "STAKE": "xDAI Stake", + "STEEM": "Steem", + "STEP": "Step Finance", + "STETH": "Lido Staked Ether", + "STG": "Startgate Finance", + "STMX": "StormX", + "STORJ": "StorJ", + "STORM": "Storm Token", + "STPT": "Standard Tokenization Protocol", + "STRAT": "Stratis", + "STRDY": "Sturdy", + "STRK": "Strike", + "STRX": "StrikeX", + "STX": "Stacks", + "STZ": "Starz", + "SUB": "Substratum", + "SUI": "Sui", + "SUN": "Sun Token", + "SUPER": "SuperFarm", + "SUSD": "sUSD", + "SUSHI": "Sushi", + "SUTER": "Suterusu", + "SWAP": "Trustswap", + "SWEAT": "Sweatcoin", + "SWETH": "Swell Ethereum", + "SWTH": "Switcheo", + "SXDT": "Spectre.ai", + "SXP": "Swipe", + "SYN": "Synapse", + "SYS": "Syscoin", + "T": "Threshold Network", + "TBTC": "tBTC", + "TCT": "TokenClub", + "TEL": "Telcoin", + "TET": "Tectum", + "TFUEL": "Theta Fuel", + "THALES": "Thales", + "THC": "Hempcoin", + "THEDAO": "TheDAO", + "THETA": "Theta Network", + "THR": "Thorecoin", + "TIA": "Celestia", + "TIO": "Trade Token", + "TITAN": "TitanSwap", + "TKN": "Monolith", + "TKO": "Tokocrypto", + "TKY": "TheKey", + "TNB": "Time New Bank", + "TNC": "Trinity Network Credit", + "TNT": "Tierion", + "TOKEN": "TokenFi", + "TOMI": "tomiNet", + "TOMO": "TomoChain", + "TON": "Ton Network", + "TORN": "Tornado Cash", + "TOWER": "Tower", + "TPAY": "TokenPay", + "TRAC": "OriginTrail", + "TRB": "Tellor", + "TRIBE": "Tribe", + "TRIG": "Trigger", + "TRTL": "TurtleCoin", + "TRU": "TrueFi", + "TRX": "TRON", + "TRYB": "BiLira", + "TUBE": "BitTube", + "TUSD": "TrueUSD", + "TWT": "Trust Wallet Token", + "TYZEN": "Tyzen", + "UBI": "Universal Basic Income", + "UBQ": "Ubiq", + "UBT": "Unibright", + "UFT": "UniLend Finance", + "ULT": "Shardus", + "UMA": "UMA", + "UNCX": "UniCrypt", + "UNFI": "Unifi Protocol DAO", + "UNI": "Uniswap", + "UNIBOT": "Unibot", + "UNIQO": "Uniqo", + "UNN": "UNION Protocol Governance Token", + "UOS": "Ultra", + "UPP": "Sentinel Protocol", + "USDC": "USD Coin", + "USDD": "USDD", + "USDN": "Neutrino USD", + "USDP": "Pax Dollar", + "USDS": "Stably USD", + "USDT": "Tether", + "USX": "dForce USD", + "UTK": "Utrust", + "UUU": "U Network", + "UXP": "UXD Protocol", + "VAI": "Vaiot", + "VALUE": "Value DeFi", + "VELO": "Velodrome", + "VERI": "Veritaseum", + "VEST": "VestChain", + "VET": "VeChain", + "VGX": "Voyager Token", + "VIA": "Viacoin", + "VIB": "Viberate", + "VIBE": "VIBE", + "VIDT": "VIDT DAO", + "VIKKY": "VikkyToken", + "VIN": "VINchain", + "VINA": "Vicuna", + "VITA": "VitaDAO", + "VITE": "Vite", + "VIU": "Viuly", + "VLX": "Velax", + "VRS": "Veros", + "VS": "veSync", + "VSP": "Vesper Finance", + "VSYS": "V.System", + "VTC": "Vertcoin", + "VVS": "VVS Finance", + "WABI": "Wabi", + "WAGMIGAMES": "WAGMI Games", + "WAN": "Wanchain", + "WARP": "Warp Finance", + "WASSIE": "Wassie", + "WAVES": "Waves", + "WBTC": "Wrapped Bitcoin", + "WCK": "Wrapped basic CryptoKitties", + "WCT": "Waves Community Token", + "WECO": "WECOIN", + "WEMIX": "WEMIX", + "WETH": "Wrapped Ether", + "WEXPOLY": "WaultSwap Polygon", + "WHALE": "Whale", + "WIB": "Wibson", + "WILD": "Widler World", + "WIN": "WINkLink", + "WING": "Wing Finance", + "WINGS": "Wings", + "WLD": "Worldcoin", + "WMT": "World Mobile Token", + "WOO": "WOO Network", + "WOPENX": "wOpenX", + "WPR": "WePower", + "WRX": "WazirX", + "WSTETH": "Wrapped stETH", + "WTC": "Waltonchain", + "WXT": "Wirex", + "X2Y2": "X2Y2", + "XAI": "XAI Stablecoin", + "XAS": "Asch", + "XAUT": "Tether Gold", + "XCH": "Chia", + "XCHF": "CryptoFranc", + "XCM": "Coinmetro", + "XCN": "Chain", + "XDC": "XDC Network", + "XEC": "eCash", + "XEM": "NEM", + "XHV": "Haven", + "XIDO": "Xido Finance", + "XIN": "Mixin", + "XLM": "Stellar", + "XLN": "LunaOne", + "XMARK": "xMARK", + "XMR": "Monero", + "XMT": "MetalSwap", + "XMX": "XMax", + "XNK": "Ink Protocol", + "XNO": "Nano", + "XOR": "Sora", + "XPR": "Proton", + "XPRT": "Persistence", + "XRD": "Radix", + "XRGB": "XRGB", + "XRP": "Ripple", + "XSN": "Stakenet", + "XSR": "Xensor", + "XTZ": "Tezos", + "XVG": "Verge", + "XYM": "Symbol", + "XYO": "XYO Network", + "YFI": "yearn.finance", + "YFII": "DFI.money", + "YLD": "Yield App", + "YOYO": "YOYOW", + "ZAI": "Zero Collateral Dai", + "ZB": "ZB Token", + "ZCO": "Zebi", + "ZEC": "Zcash", + "ZEN": "Horizen", + "ZEPH": "Zephyr Protocol", + "ZIL": "Zilliqa", + "ZKS": "ZKSwap", + "ZKSP": "zkSwap", + "ZPAY": "ZoidPay", + "ZRX": "0x Protocol", + "ZUSD": "ZUSD" +} \ No newline at end of file diff --git a/core/di/src/main/java/dev/arkbuilders/rate/core/di/modules/RepoModule.kt b/core/di/src/main/java/dev/arkbuilders/rate/core/di/modules/RepoModule.kt index 6df3d2117..428574e88 100644 --- a/core/di/src/main/java/dev/arkbuilders/rate/core/di/modules/RepoModule.kt +++ b/core/di/src/main/java/dev/arkbuilders/rate/core/di/modules/RepoModule.kt @@ -11,6 +11,7 @@ import dev.arkbuilders.rate.core.data.repo.CodeUseStatRepoImpl import dev.arkbuilders.rate.core.data.repo.GroupRepoImpl import dev.arkbuilders.rate.core.data.repo.TimestampRepoImpl import dev.arkbuilders.rate.core.data.repo.currency.CryptoCurrencyDataSource +import dev.arkbuilders.rate.core.data.repo.currency.CurrencyInfoDataSource import dev.arkbuilders.rate.core.data.repo.currency.CurrencyRepoImpl import dev.arkbuilders.rate.core.data.repo.currency.FallbackRatesProvider import dev.arkbuilders.rate.core.data.repo.currency.FiatCurrencyDataSource @@ -38,6 +39,7 @@ class RepoModule { fiatCurrencyDataSource: FiatCurrencyDataSource, cryptoCurrencyDataSource: CryptoCurrencyDataSource, localCurrencyDataSource: LocalCurrencyDataSource, + currencyInfoDataSource: CurrencyInfoDataSource, timestampRepo: TimestampRepo, networkStatus: NetworkStatus, fallbackRatesProvider: FallbackRatesProvider, @@ -47,6 +49,7 @@ class RepoModule { cryptoCurrencyDataSource, localCurrencyDataSource, fallbackRatesProvider, + currencyInfoDataSource, timestampRepo, networkStatus, ) diff --git a/core/domain/src/main/java/dev/arkbuilders/rate/core/domain/model/CurrencyInfo.kt b/core/domain/src/main/java/dev/arkbuilders/rate/core/domain/model/CurrencyInfo.kt new file mode 100644 index 000000000..f41e957e9 --- /dev/null +++ b/core/domain/src/main/java/dev/arkbuilders/rate/core/domain/model/CurrencyInfo.kt @@ -0,0 +1,13 @@ +package dev.arkbuilders.rate.core.domain.model + +data class CurrencyInfo( + val code: CurrencyCode, + val name: String, + val country: List, +) { + companion object { + val EMPTY = CurrencyInfo("", "", emptyList()) + + fun emptyWithCode(code: CurrencyCode) = EMPTY.copy(code = code) + } +} diff --git a/core/domain/src/main/java/dev/arkbuilders/rate/core/domain/model/CurrencyName.kt b/core/domain/src/main/java/dev/arkbuilders/rate/core/domain/model/CurrencyName.kt deleted file mode 100644 index 9a6549a25..000000000 --- a/core/domain/src/main/java/dev/arkbuilders/rate/core/domain/model/CurrencyName.kt +++ /dev/null @@ -1,10 +0,0 @@ -package dev.arkbuilders.rate.core.domain.model - -data class CurrencyName( - val code: CurrencyCode, - val name: String, -) { - companion object { - val EMPTY = CurrencyName("", "") - } -} diff --git a/core/domain/src/main/java/dev/arkbuilders/rate/core/domain/repo/CurrencyRepo.kt b/core/domain/src/main/java/dev/arkbuilders/rate/core/domain/repo/CurrencyRepo.kt index 57d02246f..eb1bf82a0 100644 --- a/core/domain/src/main/java/dev/arkbuilders/rate/core/domain/repo/CurrencyRepo.kt +++ b/core/domain/src/main/java/dev/arkbuilders/rate/core/domain/repo/CurrencyRepo.kt @@ -1,17 +1,17 @@ package dev.arkbuilders.rate.core.domain.repo import dev.arkbuilders.rate.core.domain.model.CurrencyCode -import dev.arkbuilders.rate.core.domain.model.CurrencyName +import dev.arkbuilders.rate.core.domain.model.CurrencyInfo import dev.arkbuilders.rate.core.domain.model.CurrencyRate interface CurrencyRepo { + suspend fun initialize() + suspend fun getCurrencyRates(): List - suspend fun getCurrencyNames(): List + suspend fun getCurrencyInfo(): List - suspend fun nameByCode(code: CurrencyCode): CurrencyName = - getCurrencyNames().find { name -> name.code == code } - ?: error("Currency code not found in names!") + suspend fun infoByCode(code: CurrencyCode): CurrencyInfo suspend fun getCodeToCurrencyRate(): Map = getCurrencyRates().associateBy { it.code } diff --git a/core/domain/src/main/java/dev/arkbuilders/rate/core/domain/usecase/SearchUseCase.kt b/core/domain/src/main/java/dev/arkbuilders/rate/core/domain/usecase/SearchUseCase.kt index f30d6ca29..63a96f4bf 100644 --- a/core/domain/src/main/java/dev/arkbuilders/rate/core/domain/usecase/SearchUseCase.kt +++ b/core/domain/src/main/java/dev/arkbuilders/rate/core/domain/usecase/SearchUseCase.kt @@ -2,21 +2,22 @@ package dev.arkbuilders.rate.core.domain.usecase import dev.arkbuilders.rate.core.domain.BuildConfigFields import dev.arkbuilders.rate.core.domain.model.CurrencyCode -import dev.arkbuilders.rate.core.domain.model.CurrencyName +import dev.arkbuilders.rate.core.domain.model.CurrencyInfo class SearchUseCase( private val buildConfigFields: BuildConfigFields, ) { operator fun invoke( - all: List, + all: List, frequent: List, query: String, - ): List { + ): List { val filtered = all - .filter { - it.name.contains(query, ignoreCase = true) || - it.code.contains(query, ignoreCase = true) + .filter { info -> + info.name.contains(query, ignoreCase = true) || + info.code.contains(query, ignoreCase = true) || + info.country.any { county -> county.contains(query, ignoreCase = true) } }.sortedBy { it.code } val prefixAndIcons = diff --git a/core/presentation/src/main/java/dev/arkbuilders/rate/core/presentation/ui/CurrencyInfoItem.kt b/core/presentation/src/main/java/dev/arkbuilders/rate/core/presentation/ui/CurrencyInfoItem.kt index c5b122e38..79fff6fd8 100644 --- a/core/presentation/src/main/java/dev/arkbuilders/rate/core/presentation/ui/CurrencyInfoItem.kt +++ b/core/presentation/src/main/java/dev/arkbuilders/rate/core/presentation/ui/CurrencyInfoItem.kt @@ -14,35 +14,35 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import dev.arkbuilders.rate.core.domain.model.CurrencyName +import dev.arkbuilders.rate.core.domain.model.CurrencyInfo import dev.arkbuilders.rate.core.presentation.theme.ArkColor @Composable fun CurrencyInfoItem( - name: CurrencyName, - onClick: (CurrencyName) -> Unit, + info: CurrencyInfo, + onClick: (CurrencyInfo) -> Unit, ) { Column { Row( modifier = Modifier .fillMaxWidth() - .clickable { onClick(name) } + .clickable { onClick(info) } .padding(horizontal = 24.dp, vertical = 16.dp), verticalAlignment = Alignment.CenterVertically, ) { - CurrIcon(modifier = Modifier.size(40.dp), code = name.code) + CurrIcon(modifier = Modifier.size(40.dp), code = info.code) Column( modifier = Modifier.padding(start = 12.dp), verticalArrangement = Arrangement.Center, ) { Text( - text = name.code, + text = info.code, fontWeight = FontWeight.Medium, color = ArkColor.TextPrimary, ) - if (name.name.isNotEmpty()) { - Text(text = name.name, color = ArkColor.TextTertiary) + if (info.name.isNotEmpty()) { + Text(text = info.name, color = ArkColor.TextTertiary) } } } diff --git a/feature/onboarding/src/main/java/dev/arkbuilders/rate/feature/onboarding/quickpair/OnboardingQuickPairViewModel.kt b/feature/onboarding/src/main/java/dev/arkbuilders/rate/feature/onboarding/quickpair/OnboardingQuickPairViewModel.kt index 9b948459f..d046f4688 100644 --- a/feature/onboarding/src/main/java/dev/arkbuilders/rate/feature/onboarding/quickpair/OnboardingQuickPairViewModel.kt +++ b/feature/onboarding/src/main/java/dev/arkbuilders/rate/feature/onboarding/quickpair/OnboardingQuickPairViewModel.kt @@ -5,7 +5,7 @@ import androidx.lifecycle.ViewModelProvider import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import dev.arkbuilders.rate.core.domain.model.CurrencyName +import dev.arkbuilders.rate.core.domain.model.CurrencyInfo import dev.arkbuilders.rate.core.domain.repo.CurrencyRepo import dev.arkbuilders.rate.core.domain.repo.PreferenceKey import dev.arkbuilders.rate.core.domain.repo.Prefs @@ -25,7 +25,7 @@ enum class OnboardingQuickPairStep { data class OnboardingQuickPairState( val pair: QuickPair = QuickPair.empty(), val stepIndex: Int = 0, - val currencies: List = emptyList(), + val currencies: List = emptyList(), val initialized: Boolean = false, ) @@ -46,7 +46,7 @@ class OnboardingQuickPairViewModel( init { intent { val pair = quickRepo.getAll().first() - val currencies = currencyRepo.getCurrencyNames() + val currencies = currencyRepo.getCurrencyInfo() reduce { state.copy( pair = pair, diff --git a/feature/pairalert/src/main/java/dev/arkbuilders/rate/feature/pairalert/presentation/main/PairAlertItem.kt b/feature/pairalert/src/main/java/dev/arkbuilders/rate/feature/pairalert/presentation/main/PairAlertItem.kt index 6571ba327..1a7cee930 100644 --- a/feature/pairalert/src/main/java/dev/arkbuilders/rate/feature/pairalert/presentation/main/PairAlertItem.kt +++ b/feature/pairalert/src/main/java/dev/arkbuilders/rate/feature/pairalert/presentation/main/PairAlertItem.kt @@ -47,7 +47,7 @@ fun PairAlertItem( } val currencyRepo = component.currencyRepo() LaunchedEffect(Unit) { - currencyName = currencyRepo.nameByCode(pairAlert.targetCode).name + currencyName = currencyRepo.infoByCode(pairAlert.targetCode).name } Row( modifier = diff --git a/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetScreen.kt b/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetScreen.kt index c4eb62dfe..505a0db85 100644 --- a/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetScreen.kt +++ b/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetScreen.kt @@ -33,7 +33,7 @@ import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.ExternalModuleGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import dev.arkbuilders.rate.core.domain.CurrUtils -import dev.arkbuilders.rate.core.domain.model.CurrencyName +import dev.arkbuilders.rate.core.domain.model.CurrencyInfo import dev.arkbuilders.rate.core.presentation.CoreRString import dev.arkbuilders.rate.core.presentation.theme.ArkColor import dev.arkbuilders.rate.core.presentation.ui.AppHorDiv @@ -75,7 +75,7 @@ fun EditAssetScreen( if (state.initialized) { Content( navigator = navigator, - name = state.name, + info = state.info, value = state.value, onValueChange = viewModel::onValueChange, ) @@ -89,7 +89,7 @@ fun EditAssetScreen( @Composable private fun Content( navigator: DestinationsNavigator, - name: CurrencyName, + info: CurrencyInfo, value: String, onValueChange: (String) -> Unit, ) { @@ -126,10 +126,10 @@ private fun Content( .verticalScroll(rememberScrollState()), ) { val title = - if (name.name.isNotEmpty()) { - "${name.name} (${name.code})" + if (info.name.isNotEmpty()) { + "${info.name} (${info.code})" } else { - name.code + info.code } Text( modifier = Modifier.padding(top = 32.dp), @@ -162,7 +162,7 @@ private fun Content( Modifier .padding(start = 2.dp, top = 2.dp) .align(Alignment.Top), - text = CurrUtils.getSymbolOrCode(name.code), + text = CurrUtils.getSymbolOrCode(info.code), fontSize = 20.sp, fontWeight = FontWeight.Medium, color = ArkColor.TextPrimary, diff --git a/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetViewModel.kt b/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetViewModel.kt index 8a3cd37a7..926eb8abd 100644 --- a/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetViewModel.kt +++ b/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetViewModel.kt @@ -7,7 +7,7 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import dev.arkbuilders.rate.core.domain.CurrUtils -import dev.arkbuilders.rate.core.domain.model.CurrencyName +import dev.arkbuilders.rate.core.domain.model.CurrencyInfo import dev.arkbuilders.rate.core.domain.repo.AnalyticsManager import dev.arkbuilders.rate.core.domain.repo.CurrencyRepo import dev.arkbuilders.rate.core.domain.repo.Prefs @@ -24,7 +24,7 @@ import org.orbitmvi.orbit.viewmodel.container data class EditAssetScreenState( val asset: Asset = Asset.EMPTY, - val name: CurrencyName = CurrencyName.EMPTY, + val info: CurrencyInfo = CurrencyInfo.EMPTY, val value: String = "", val initialized: Boolean = false, ) @@ -50,7 +50,7 @@ class EditAssetViewModel( intent { val asset = assetsRepo.getById(assetId) - val name = currencyRepo.nameByCode(asset!!.code) + val name = currencyRepo.infoByCode(asset!!.code) inputFlow.debounce(PERSIST_AMOUNT_DEBOUNCE).onEach { assetsRepo.setAsset(asset.copy(value = it.toBigDecimalArk())) diff --git a/feature/quick/src/main/java/dev/arkbuilders/rate/feature/quick/presentation/main/QuickScreen.kt b/feature/quick/src/main/java/dev/arkbuilders/rate/feature/quick/presentation/main/QuickScreen.kt index f6e4ff282..40885f806 100644 --- a/feature/quick/src/main/java/dev/arkbuilders/rate/feature/quick/presentation/main/QuickScreen.kt +++ b/feature/quick/src/main/java/dev/arkbuilders/rate/feature/quick/presentation/main/QuickScreen.kt @@ -37,7 +37,7 @@ import com.ramcosta.composedestinations.result.ResultRecipient import com.ramcosta.composedestinations.result.onResult import dev.arkbuilders.rate.core.domain.model.Amount import dev.arkbuilders.rate.core.domain.model.CurrencyCode -import dev.arkbuilders.rate.core.domain.model.CurrencyName +import dev.arkbuilders.rate.core.domain.model.CurrencyInfo import dev.arkbuilders.rate.core.presentation.CoreRString import dev.arkbuilders.rate.core.presentation.theme.ArkColor import dev.arkbuilders.rate.core.presentation.ui.AppHorDiv16 @@ -318,8 +318,8 @@ private fun Content( @Composable private fun GroupPage( - frequent: List, - currencies: List, + frequent: List, + currencies: List, pinned: List, notPinned: List, onDelete: (QuickPair) -> Unit, diff --git a/feature/quick/src/main/java/dev/arkbuilders/rate/feature/quick/presentation/main/QuickSearchPage.kt b/feature/quick/src/main/java/dev/arkbuilders/rate/feature/quick/presentation/main/QuickSearchPage.kt index 091303bfb..c1a59f8b7 100644 --- a/feature/quick/src/main/java/dev/arkbuilders/rate/feature/quick/presentation/main/QuickSearchPage.kt +++ b/feature/quick/src/main/java/dev/arkbuilders/rate/feature/quick/presentation/main/QuickSearchPage.kt @@ -7,7 +7,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import dev.arkbuilders.rate.core.domain.model.CurrencyCode -import dev.arkbuilders.rate.core.domain.model.CurrencyName +import dev.arkbuilders.rate.core.domain.model.CurrencyInfo import dev.arkbuilders.rate.core.presentation.CoreRString import dev.arkbuilders.rate.core.presentation.ui.CurrencyInfoItem import dev.arkbuilders.rate.core.presentation.ui.ListHeader @@ -15,7 +15,7 @@ import dev.arkbuilders.rate.core.presentation.ui.NoResult @Composable fun QuickSearchPage( - topResultsFiltered: List, + topResultsFiltered: List, onNewCode: (CurrencyCode) -> Unit, ) { if (topResultsFiltered.isNotEmpty()) { diff --git a/feature/quick/src/main/java/dev/arkbuilders/rate/feature/quick/presentation/main/QuickViewModel.kt b/feature/quick/src/main/java/dev/arkbuilders/rate/feature/quick/presentation/main/QuickViewModel.kt index 985740e8d..cff2e653b 100644 --- a/feature/quick/src/main/java/dev/arkbuilders/rate/feature/quick/presentation/main/QuickViewModel.kt +++ b/feature/quick/src/main/java/dev/arkbuilders/rate/feature/quick/presentation/main/QuickViewModel.kt @@ -5,7 +5,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import dev.arkbuilders.rate.core.domain.model.CurrencyName +import dev.arkbuilders.rate.core.domain.model.CurrencyInfo import dev.arkbuilders.rate.core.domain.model.Group import dev.arkbuilders.rate.core.domain.model.GroupFeatureType import dev.arkbuilders.rate.core.domain.model.TimestampType @@ -43,9 +43,9 @@ data class PairOptionsData(val pair: QuickPair) data class QuickScreenState( val filter: String = "", - val currencies: List = emptyList(), - val frequent: List = emptyList(), - val topResultsFiltered: List = emptyList(), + val currencies: List = emptyList(), + val frequent: List = emptyList(), + val topResultsFiltered: List = emptyList(), val pages: List = emptyList(), val pairOptionsData: PairOptionsData? = null, val editGroupReorderSheetState: EditGroupReorderSheetState? = null, @@ -113,11 +113,11 @@ class QuickViewModel( } }.launchIn(viewModelScope) - val allCurrencies = currencyRepo.getCurrencyNames() + val allCurrencies = currencyRepo.getCurrencyInfo() calcFrequentCurrUseCase.flow().drop(1).onEach { val frequent = calcFrequentCurrUseCase.invoke() - .map { currencyRepo.nameByCode(it) } + .map { currencyRepo.infoByCode(it) } reduce { state.copy( frequent = frequent, @@ -127,7 +127,7 @@ class QuickViewModel( val frequent = calcFrequentCurrUseCase() - .map { currencyRepo.nameByCode(it) } + .map { currencyRepo.infoByCode(it) } val pages = mapPairsToPages(quickRepo.getAll()) reduce { state.copy( diff --git a/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchCurrencyInfoItem.kt b/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchCurrencyInfoItem.kt index aed7dec5b..b6d84d251 100644 --- a/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchCurrencyInfoItem.kt +++ b/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchCurrencyInfoItem.kt @@ -15,15 +15,15 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import dev.arkbuilders.rate.core.domain.model.CurrencyName +import dev.arkbuilders.rate.core.domain.model.CurrencyInfo import dev.arkbuilders.rate.core.presentation.theme.ArkColor import dev.arkbuilders.rate.core.presentation.ui.CurrIcon @Composable fun SearchCurrencyInfoItem( - model: CurrencyName, + model: CurrencyInfo, isProhibited: Boolean, - onClick: (CurrencyName) -> Unit, + onClick: (CurrencyInfo) -> Unit, ) { val contentAlpha = if (isProhibited) 0.4f else 1f Column { diff --git a/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchCurrencyScreen.kt b/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchCurrencyScreen.kt index 68b2a9a3d..78e15c4bc 100644 --- a/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchCurrencyScreen.kt +++ b/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchCurrencyScreen.kt @@ -21,7 +21,7 @@ import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.ExternalModuleGraph import com.ramcosta.composedestinations.result.ResultBackNavigator import dev.arkbuilders.rate.core.domain.model.CurrencyCode -import dev.arkbuilders.rate.core.domain.model.CurrencyName +import dev.arkbuilders.rate.core.domain.model.CurrencyInfo import dev.arkbuilders.rate.core.presentation.CoreRString import dev.arkbuilders.rate.core.presentation.ui.AppHorDiv import dev.arkbuilders.rate.core.presentation.ui.AppTopBarBack @@ -117,10 +117,10 @@ private fun Input( private fun Results( filter: String, prohibitedCodes: List, - frequent: List, - all: List, - topResultsFiltered: List, - onClick: (CurrencyName) -> Unit, + frequent: List, + all: List, + topResultsFiltered: List, + onClick: (CurrencyInfo) -> Unit, ) { when { filter.isNotEmpty() -> { diff --git a/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchViewModel.kt b/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchViewModel.kt index 8444409fe..d73cdf92a 100644 --- a/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchViewModel.kt +++ b/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchViewModel.kt @@ -6,7 +6,7 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import dev.arkbuilders.rate.core.domain.model.CurrencyCode -import dev.arkbuilders.rate.core.domain.model.CurrencyName +import dev.arkbuilders.rate.core.domain.model.CurrencyInfo import dev.arkbuilders.rate.core.domain.repo.AnalyticsManager import dev.arkbuilders.rate.core.domain.repo.CurrencyRepo import dev.arkbuilders.rate.core.domain.usecase.CalcFrequentCurrUseCase @@ -18,10 +18,10 @@ import org.orbitmvi.orbit.viewmodel.container data class SearchScreenState( val prohibitedCodes: List = emptyList(), - val frequent: List = emptyList(), - val all: List = emptyList(), + val frequent: List = emptyList(), + val all: List = emptyList(), val filter: String = "", - val topResultsFiltered: List = emptyList(), + val topResultsFiltered: List = emptyList(), val initialized: Boolean = false, val showCodeProhibitedDialog: Boolean = false, ) @@ -47,8 +47,8 @@ class SearchViewModel( analyticsManager.trackScreen("SearchScreen") intent { - val all = currencyRepo.getCurrencyNames() - val frequent = calcFrequentCurrUseCase.invoke().map { currencyRepo.nameByCode(it) } + val all = currencyRepo.getCurrencyInfo() + val frequent = calcFrequentCurrUseCase.invoke().map { currencyRepo.infoByCode(it) } reduce { state.copy( @@ -75,7 +75,7 @@ class SearchViewModel( } } - fun onClick(model: CurrencyName) = + fun onClick(model: CurrencyInfo) = intent { prohibitedCodes?.let { if (model.code in prohibitedCodes) {