From a2d8d157bcbe94fb14f4e030803ff4c2256deca4 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 4 Mar 2024 19:40:21 +0000 Subject: [PATCH] Updated on 2026-08-14 --- .../tokens/impl/data/DefaultTokensListRepository.kt | 3 ++- .../tokens/impl/data/TangemApiTokensPagingSource.kt | 6 ++++-- .../impl/data/converters/CoinsResponseConverter.kt | 13 ++++++++++--- .../data/converters/TestnetTokensConfigConverter.kt | 5 +++-- .../impl/domain/DefaultTokensListInteractor.kt | 7 +++++-- .../tokens/impl/domain/TokensListInteractor.kt | 2 +- .../tokens/impl/domain/TokensListRepository.kt | 3 ++- .../presentation/viewmodels/TokensListViewModel.kt | 2 +- 8 files changed, 28 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/data/DefaultTokensListRepository.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/data/DefaultTokensListRepository.kt index 114990f05b..ca1cf6190f 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/data/DefaultTokensListRepository.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/data/DefaultTokensListRepository.kt @@ -29,7 +29,7 @@ internal class DefaultTokensListRepository( private val testnetTokensStorage: TestnetTokensStorage, ) : TokensListRepository { - override fun getAvailableTokens(searchText: String?): Flow> { + override fun getAvailableTokens(searchText: String?, needFilterExcluded: Boolean): Flow> { return Pager( config = PagingConfig( pageSize = 100, @@ -42,6 +42,7 @@ internal class DefaultTokensListRepository( dispatchers = dispatchers, getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase, searchText = searchText, + needFilterExcluded = needFilterExcluded, ) getSelectedWalletSyncUseCase().fold( diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/data/TangemApiTokensPagingSource.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/data/TangemApiTokensPagingSource.kt index 4fc0e646b3..acf336dac3 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/data/TangemApiTokensPagingSource.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/data/TangemApiTokensPagingSource.kt @@ -27,8 +27,10 @@ internal class TangemApiTokensPagingSource( private val dispatchers: CoroutineDispatcherProvider, private val getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase, private val searchText: String?, + needFilterExcluded: Boolean = false, ) : PagingSource() { + private val coinsResponseConverter = CoinsResponseConverter(needFilterExcluded) override fun getRefreshKey(state: PagingState): Int? { return state.anchorPosition?.let { anchorPosition -> state.closestPageToPosition(anchorPosition)?.prevKey?.plus(other = 1) @@ -41,7 +43,7 @@ internal class TangemApiTokensPagingSource( return runCatching(dispatchers.io) { val supportedBlockchains = getSelectedWalletSyncUseCase().fold( - ifLeft = { Blockchain.values().toList() }, + ifLeft = { Blockchain.entries }, ifRight = { it.scanResponse.card.supportedBlockchains(it.scanResponse.cardTypesResolver) }, ) @@ -55,7 +57,7 @@ internal class TangemApiTokensPagingSource( }.fold( onSuccess = { response -> LoadResult.Page( - data = CoinsResponseConverter.convert(response), + data = coinsResponseConverter.convert(response), prevKey = if (page == 0) null else page.minus(other = 1), nextKey = if (response.coins.isEmpty()) null else page.plus(other = 1), ) diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/data/converters/CoinsResponseConverter.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/data/converters/CoinsResponseConverter.kt index d8c3de965b..2bffd45d01 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/data/converters/CoinsResponseConverter.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/data/converters/CoinsResponseConverter.kt @@ -3,6 +3,7 @@ package com.tangem.tap.features.tokens.impl.data.converters import com.tangem.blockchain.common.Blockchain import com.tangem.datasource.api.tangemTech.models.CoinsResponse import com.tangem.domain.common.extensions.fromNetworkId +import com.tangem.domain.common.extensions.isSupportedInApp import com.tangem.tap.features.tokens.impl.domain.models.Token import com.tangem.utils.converter.Converter @@ -11,9 +12,7 @@ import com.tangem.utils.converter.Converter * [REDACTED_AUTHOR] */ -internal object CoinsResponseConverter : Converter> { - - private const val DEFAULT_IMAGE_HOST = "https://s3.eu-central-1.amazonaws.com/tangem.api/coins/" +internal class CoinsResponseConverter(val needFilterExcluded: Boolean) : Converter> { override fun convert(value: CoinsResponse): List { return value.coins.map { token -> @@ -25,6 +24,10 @@ internal object CoinsResponseConverter : Converter> { networks = token.networks.mapNotNull { network -> val blockchain = Blockchain.fromNetworkId(network.networkId) ?: return@mapNotNull null + if (needFilterExcluded && !blockchain.isSupportedInApp()) { + return@mapNotNull null + } + // filter tokens, if contractAddress != null, assume that it is a token if (network.contractAddress != null && !blockchain.canHandleTokens() @@ -47,4 +50,8 @@ internal object CoinsResponseConverter : Converter> { fun getIconUrl(id: String, imageHost: String? = null): String { return "${imageHost ?: DEFAULT_IMAGE_HOST}large/$id.png" } + + private companion object { + const val DEFAULT_IMAGE_HOST = "https://s3.eu-central-1.amazonaws.com/tangem.api/coins/" + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/data/converters/TestnetTokensConfigConverter.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/data/converters/TestnetTokensConfigConverter.kt index 5a532d7012..d1babd19b7 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/data/converters/TestnetTokensConfigConverter.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/data/converters/TestnetTokensConfigConverter.kt @@ -13,13 +13,14 @@ import com.tangem.utils.converter.Converter */ internal object TestnetTokensConfigConverter : Converter> { + private val coinsResponseConverter = CoinsResponseConverter(needFilterExcluded = false) override fun convert(value: TestnetTokensConfig): List { return value.tokens.map { token -> Token( id = token.id, name = token.name, symbol = token.symbol, - iconUrl = CoinsResponseConverter.getIconUrl(token.id), + iconUrl = coinsResponseConverter.getIconUrl(token.id), networks = token.networks?.mapNotNull { network -> val blockchain = Blockchain.fromNetworkId(network.id) ?: return@mapNotNull null @@ -27,7 +28,7 @@ internal object TestnetTokensConfigConverter : Converter> { - return repository.getAvailableTokens(searchText = searchText.ifBlank(defaultValue = { null })) + override fun getTokensList(searchText: String, needFilterExcluded: Boolean): Flow> { + return repository.getAvailableTokens( + searchText = searchText.ifBlank(defaultValue = { null }), + needFilterExcluded = needFilterExcluded, + ) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/TokensListInteractor.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/TokensListInteractor.kt index c363dfc3c2..4b8edb914d 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/TokensListInteractor.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/TokensListInteractor.kt @@ -12,5 +12,5 @@ import kotlinx.coroutines.flow.Flow internal interface TokensListInteractor { /** Get tokens list using filter by text [searchText] */ - fun getTokensList(searchText: String): Flow> + fun getTokensList(searchText: String, needFilterExcluded: Boolean): Flow> } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/TokensListRepository.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/TokensListRepository.kt index 8b2f16a644..67a9626b6b 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/TokensListRepository.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/TokensListRepository.kt @@ -15,8 +15,9 @@ internal interface TokensListRepository { * Get available tokens list * * @param searchText search text + * @param needFilterExcluded flag that determines if excluded tokens should be filtered * * @throws com.tangem.datasource.api.common.response.ApiResponseError */ - fun getAvailableTokens(searchText: String?): Flow> + fun getAvailableTokens(searchText: String?, needFilterExcluded: Boolean): Flow> } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt index 337e8f24ec..0853b72b8f 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt @@ -250,7 +250,7 @@ internal class TokensListViewModel @Inject constructor( } private fun getTokensListBySearchText(text: String): Flow> { - return interactor.getTokensList(searchText = text) + return interactor.getTokensList(searchText = text, needFilterExcluded = !isManageAccess) .mapToTokenItemState() .cachedIn(viewModelScope) }