diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/AssetListMixin.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/AssetListMixin.kt index 84e7d724bf..bf235f7a33 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/AssetListMixin.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/AssetListMixin.kt @@ -2,6 +2,7 @@ package io.novafoundation.nova.feature_assets.presentation.balance.common import io.novafoundation.nova.common.data.model.AssetViewMode import io.novafoundation.nova.common.data.model.switch +import io.novafoundation.nova.common.utils.shareInBackground import io.novafoundation.nova.common.utils.toggle import io.novafoundation.nova.common.utils.updateValue import io.novafoundation.nova.feature_assets.domain.WalletInteractor @@ -14,6 +15,7 @@ import io.novafoundation.nova.feature_assets.presentation.balance.list.model.ite import io.novafoundation.nova.feature_assets.presentation.balance.list.model.items.TokenGroupUi import io.novafoundation.nova.feature_currency_api.domain.CurrencyInteractor import io.novafoundation.nova.feature_wallet_api.domain.model.Asset +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine @@ -27,11 +29,12 @@ class AssetListMixinFactory( private val externalBalancesInteractor: ExternalBalancesInteractor ) { - fun create(): AssetListMixin = RealAssetListMixin( + fun create(coroutineScope: CoroutineScope): AssetListMixin = RealAssetListMixin( walletInteractor, assetsListInteractor, currencyInteractor, - externalBalancesInteractor + externalBalancesInteractor, + coroutineScope ) } @@ -52,20 +55,26 @@ class RealAssetListMixin( private val walletInteractor: WalletInteractor, private val assetsListInteractor: AssetsListInteractor, private val currencyInteractor: CurrencyInteractor, - private val externalBalancesInteractor: ExternalBalancesInteractor -) : AssetListMixin { + private val externalBalancesInteractor: ExternalBalancesInteractor, + private val coroutineScope: CoroutineScope +) : AssetListMixin, CoroutineScope by coroutineScope { override val assetsFlow = walletInteractor.assetsFlow() + .shareInBackground() override val filteredAssetsFlow = walletInteractor.filterAssets(assetsFlow) + .shareInBackground() private val selectedCurrency = currencyInteractor.observeSelectCurrency() + .shareInBackground() private val externalBalancesFlow = externalBalancesInteractor.observeExternalBalances() + .shareInBackground() private val expandedTokenIdsFlow = MutableStateFlow(setOf()) override val assetsViewModeFlow = assetsListInteractor.assetsViewModeFlow() + .shareInBackground() override val assetModelsFlow = combine( filteredAssetsFlow, @@ -81,6 +90,7 @@ class RealAssetListMixin( .mapGroupedAssetsToUi() } }.distinctUntilChanged() + .shareInBackground() override suspend fun switchViewMode() { val assetViewMode = assetsViewModeFlow.first() diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/BalanceListAdapter.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/BalanceListAdapter.kt index 880ea7956f..b17ae1c29a 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/BalanceListAdapter.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/BalanceListAdapter.kt @@ -79,7 +79,7 @@ class BalanceListAdapter( } is TokenAssetViewHolder -> { - val item = getItem(position) as NetworkAssetUi + val item = getItem(position) as TokenAssetUi resolvePayload(holder, position, payloads) { when (it) { AssetModel::amount -> holder.bindTotal(item.asset) diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/mappers/AssetMappersCommon.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/mappers/AssetMappersCommon.kt index ef514c3235..524a814cdc 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/mappers/AssetMappersCommon.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/mappers/AssetMappersCommon.kt @@ -1,13 +1,21 @@ package io.novafoundation.nova.feature_assets.presentation.balance.common.mappers +import androidx.annotation.ColorRes +import io.novafoundation.nova.common.utils.formatting.formatAsChange +import io.novafoundation.nova.common.utils.isNonNegative +import io.novafoundation.nova.common.utils.isZero import io.novafoundation.nova.common.utils.orZero +import io.novafoundation.nova.feature_assets.R import io.novafoundation.nova.feature_assets.domain.common.Amount import io.novafoundation.nova.feature_assets.presentation.model.AssetModel +import io.novafoundation.nova.feature_assets.presentation.model.TokenModel import io.novafoundation.nova.feature_currency_api.domain.model.Currency import io.novafoundation.nova.feature_currency_api.presentation.formatters.formatAsCurrency import io.novafoundation.nova.feature_wallet_api.domain.model.Asset import io.novafoundation.nova.feature_wallet_api.domain.model.CoinRateChange +import io.novafoundation.nova.feature_wallet_api.domain.model.Token import io.novafoundation.nova.feature_wallet_api.presentation.model.mapAmountToAmountModel +import java.math.BigDecimal fun mapCoinRateChange(coinRateChange: CoinRateChange?, currency: Currency): String { val rateChange = coinRateChange?.rate @@ -27,3 +35,25 @@ fun mapAssetToAssetModel( ) ) } + +@ColorRes +fun mapCoinRateChangeColorRes(coinRateChange: CoinRateChange?): Int { + val rateChange = coinRateChange?.recentRateChange + + return when { + rateChange == null || rateChange.isZero -> R.color.text_secondary + rateChange.isNonNegative -> R.color.text_positive + else -> R.color.text_negative + } +} + +fun mapTokenToTokenModel(token: Token): TokenModel { + return with(token) { + TokenModel( + configuration = configuration, + rate = mapCoinRateChange(token.coinRate, token.currency), + recentRateChange = (coinRate?.recentRateChange ?: BigDecimal.ZERO).formatAsChange(), + rateChangeColorRes = mapCoinRateChangeColorRes(coinRate) + ) + } +} diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/mappers/NetworkAssetMappers.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/mappers/NetworkAssetMappers.kt index e3a2e5327a..c352bb6d15 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/mappers/NetworkAssetMappers.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/mappers/NetworkAssetMappers.kt @@ -1,13 +1,8 @@ package io.novafoundation.nova.feature_assets.presentation.balance.common.mappers -import androidx.annotation.ColorRes import io.novafoundation.nova.common.list.GroupedList import io.novafoundation.nova.common.list.toListWithHeaders -import io.novafoundation.nova.common.utils.formatting.formatAsChange -import io.novafoundation.nova.common.utils.isNonNegative -import io.novafoundation.nova.common.utils.isZero import io.novafoundation.nova.feature_account_api.data.mappers.mapChainToUi -import io.novafoundation.nova.feature_assets.R import io.novafoundation.nova.feature_assets.domain.common.Amount import io.novafoundation.nova.feature_assets.domain.common.NetworkAssetGroup import io.novafoundation.nova.feature_assets.domain.common.AssetWithOffChainBalance @@ -15,11 +10,8 @@ import io.novafoundation.nova.feature_assets.domain.common.TotalAndTransferableB import io.novafoundation.nova.feature_assets.presentation.balance.list.model.items.BalanceListRvItem import io.novafoundation.nova.feature_assets.presentation.balance.list.model.items.NetworkAssetUi import io.novafoundation.nova.feature_assets.presentation.balance.list.model.items.NetworkGroupUi -import io.novafoundation.nova.feature_assets.presentation.model.TokenModel import io.novafoundation.nova.feature_currency_api.domain.model.Currency import io.novafoundation.nova.feature_currency_api.presentation.formatters.formatAsCurrency -import io.novafoundation.nova.feature_wallet_api.domain.model.CoinRateChange -import io.novafoundation.nova.feature_wallet_api.domain.model.Token import java.math.BigDecimal fun GroupedList.mapGroupedAssetsToUi( @@ -33,28 +25,6 @@ fun GroupedList.mapGroupedAssetsToU .filterIsInstance() } -fun mapTokenToTokenModel(token: Token): TokenModel { - return with(token) { - TokenModel( - configuration = configuration, - rate = mapCoinRateChange(token.coinRate, token.currency), - recentRateChange = (coinRate?.recentRateChange ?: BigDecimal.ZERO).formatAsChange(), - rateChangeColorRes = mapCoinRateChangeColorRes(coinRate) - ) - } -} - -@ColorRes -fun mapCoinRateChangeColorRes(coinRateChange: CoinRateChange?): Int { - val rateChange = coinRateChange?.recentRateChange - - return when { - rateChange == null || rateChange.isZero -> R.color.text_secondary - rateChange.isNonNegative -> R.color.text_positive - else -> R.color.text_negative - } -} - private fun mapAssetsToAssetModels( assets: List, balance: (TotalAndTransferableBalance) -> Amount diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListFragment.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListFragment.kt index 6277b1b41f..40ff44eefb 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListFragment.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListFragment.kt @@ -139,7 +139,7 @@ class BalanceListFragment : } override fun tokenGroupClicked(tokenGroup: TokenGroupUi) { - showMessage("Not implemented yet") + viewModel.assetListMixin.expandToken(tokenGroup) } override fun totalBalanceClicked() { diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListViewModel.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListViewModel.kt index a85fb30ace..8407170880 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListViewModel.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListViewModel.kt @@ -93,7 +93,7 @@ class BalanceListViewModel( private val externalBalancesFlow = externalBalancesInteractor.observeExternalBalances() - val assetListMixin = assetListMixinFactory.create() + val assetListMixin = assetListMixinFactory.create(viewModelScope) private val isFiltersEnabledFlow = walletInteractor.isFiltersEnabledFlow()