diff --git a/app/src/main/java/com/tangem/tap/di/domain/WalletManagersFacadeModule.kt b/app/src/main/java/com/tangem/tap/di/domain/WalletManagersFacadeModule.kt index ac937e5a47..a54c6ecc0c 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/WalletManagersFacadeModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/WalletManagersFacadeModule.kt @@ -6,6 +6,7 @@ import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.datasource.local.walletmanager.WalletManagersStore import com.tangem.domain.walletmanager.DefaultWalletManagersFacade import com.tangem.domain.walletmanager.WalletManagersFacade +import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -23,11 +24,13 @@ internal object WalletManagersFacadeModule { userWalletsStore: UserWalletsStore, assetLoader: AssetLoader, blockchainSDKFactory: BlockchainSDKFactory, + dispatchers: CoroutineDispatcherProvider, ): WalletManagersFacade { return DefaultWalletManagersFacade( walletManagersStore = walletManagersStore, userWalletsStore = userWalletsStore, assetLoader = assetLoader, + dispatchers = dispatchers, blockchainSDKFactory = blockchainSDKFactory, ) } diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt index cf29c3b4a3..f74f7c873d 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt @@ -266,7 +266,7 @@ internal class DefaultCurrenciesRepository( override suspend fun getMultiCurrencyWalletCurrenciesSync( userWalletId: UserWalletId, refresh: Boolean, - ): List { + ): List = withContext(dispatchers.io) { val userWallet = getUserWallet(userWalletId) ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true) @@ -276,7 +276,7 @@ internal class DefaultCurrenciesRepository( "Unable to find tokens response for user wallet with provided ID: $userWalletId" } - return responseCurrenciesFactory.createCurrencies(storedTokens, userWallet.scanResponse) + responseCurrenciesFactory.createCurrencies(storedTokens, userWallet.scanResponse) } override suspend fun getMultiCurrencyWalletCurrency( diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt index 23a2015bf4..c4a12be730 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt @@ -106,15 +106,15 @@ internal class DefaultNetworksRepository( override suspend fun getNetworkAddresses( userWalletId: UserWalletId, network: Network, - ): List { + ): List = withContext(dispatchers.io) { // Get list of currencies matching [network] val currencies = getCurrencies(userWalletId) .filter { currency -> network.id == currency.network.id } // There is no currencies matching given [networks] in [userWalletId] - if (currencies.toList().isEmpty()) return emptyList() + if (currencies.toList().isEmpty()) return@withContext emptyList() - return currencies.toList().map { currency -> + currencies.toList().map { currency -> CryptoCurrencyAddress( cryptoCurrency = currency, address = walletManagersFacade.getAddresses(userWalletId, currency.network) diff --git a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt index c148e295dd..d36cb4f74b 100644 --- a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt +++ b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt @@ -67,7 +67,7 @@ internal class DefaultTransactionRepository( isSwap: Boolean, txExtras: TransactionExtras?, hash: String?, - ): Result { + ): Result = withContext(coroutineDispatcherProvider.io) { val blockchain = Blockchain.fromId(network.id.value) val walletManager = walletManagersStore.getSyncOrNull( userWalletId = userWalletId, @@ -77,7 +77,7 @@ internal class DefaultTransactionRepository( val validator = walletManager as? TransactionValidator - return if (validator != null) { + if (validator != null) { val transaction = walletManager.createTransactionInternal( amount = amount, fee = fee ?: Fee.Common(amount = amount), diff --git a/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/di/TxHistoryDataModule.kt b/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/di/TxHistoryDataModule.kt index 27f3b8e7bb..ebc92a5036 100644 --- a/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/di/TxHistoryDataModule.kt +++ b/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/di/TxHistoryDataModule.kt @@ -6,6 +6,7 @@ import com.tangem.datasource.local.txhistory.TxHistoryItemsStore import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.txhistory.repository.TxHistoryRepository import com.tangem.domain.walletmanager.WalletManagersFacade +import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -23,10 +24,12 @@ internal object TxHistoryDataModule { walletManagersFacade: WalletManagersFacade, userWalletsStore: UserWalletsStore, txHistoryItemsStore: TxHistoryItemsStore, + dispatchers: CoroutineDispatcherProvider, ): TxHistoryRepository = DefaultTxHistoryRepository( cacheRegistry, walletManagersFacade, userWalletsStore, txHistoryItemsStore, + dispatchers, ) } \ No newline at end of file diff --git a/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/DefaultTxHistoryRepository.kt b/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/DefaultTxHistoryRepository.kt index 46d2cbef79..fb35baa42f 100644 --- a/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/DefaultTxHistoryRepository.kt +++ b/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/DefaultTxHistoryRepository.kt @@ -20,7 +20,9 @@ import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.walletmanager.utils.SdkPageConverter import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId +import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.withContext import timber.log.Timber class DefaultTxHistoryRepository( @@ -28,6 +30,7 @@ class DefaultTxHistoryRepository( private val walletManagersFacade: WalletManagersFacade, private val userWalletsStore: UserWalletsStore, private val txHistoryItemsStore: TxHistoryItemsStore, + private val dispatchers: CoroutineDispatcherProvider, ) : TxHistoryRepository { private val sdkPageConverter by lazy { SdkPageConverter() } @@ -96,8 +99,8 @@ class DefaultTxHistoryRepository( currency: CryptoCurrency, pageSize: Int, refresh: Boolean, - ): List { - return try { + ): List = withContext(dispatchers.io) { + try { cacheRegistry.invokeOnExpire( key = getTxHistoryPageKey(currency, userWalletId, Page.Initial), skipCache = refresh, diff --git a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt index edd43db1ed..5592329e84 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt @@ -36,9 +36,11 @@ import com.tangem.domain.walletmanager.utils.* import com.tangem.domain.walletmanager.utils.WalletManagerFactory import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId +import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.withContext import timber.log.Timber import java.math.BigDecimal import java.util.EnumSet @@ -50,6 +52,7 @@ class DefaultWalletManagersFacade( private val walletManagersStore: WalletManagersStore, private val userWalletsStore: UserWalletsStore, private val assetLoader: AssetLoader, + private val dispatchers: CoroutineDispatcherProvider, blockchainSDKFactory: BlockchainSDKFactory, ) : WalletManagersFacade { @@ -452,12 +455,12 @@ class DefaultWalletManagersFacade( destination: String, userWalletId: UserWalletId, network: Network, - ): Result? { + ): Result? = withContext(dispatchers.io) { val walletManager = getOrCreateWalletManager( userWalletId = userWalletId, network = network, ) - return (walletManager as? TransactionSender)?.getFee( + (walletManager as? TransactionSender)?.getFee( amount = amount, destination = destination, ) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt index f580eaa140..d003acc8d5 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt @@ -30,16 +30,14 @@ import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.repository.CurrencyChecksRepository import com.tangem.domain.tokens.utils.convertToAmount import com.tangem.domain.transaction.error.GetFeeError +import com.tangem.domain.transaction.error.ValidateAddressError import com.tangem.domain.transaction.usecase.* import com.tangem.domain.txhistory.usecase.GetExplorerTransactionUrlUseCase import com.tangem.domain.txhistory.usecase.GetFixedTxHistoryItemsUseCase import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId -import com.tangem.domain.transaction.error.ValidateAddressError import com.tangem.domain.wallets.usecase.GetUserWalletUseCase import com.tangem.domain.wallets.usecase.GetWalletsUseCase -import com.tangem.domain.transaction.usecase.ValidateWalletAddressUseCase -import com.tangem.domain.transaction.usecase.ValidateWalletMemoUseCase import com.tangem.features.send.api.navigation.SendRouter import com.tangem.features.send.impl.navigation.InnerSendRouter import com.tangem.features.send.impl.presentation.analytics.EnterAddressSource @@ -247,7 +245,7 @@ internal class SendViewModel @Inject constructor( } private fun subscribeOnCurrencyStatusUpdates() { - viewModelScope.launch(dispatchers.main) { + viewModelScope.launch { getUserWalletUseCase(userWalletId).fold( ifRight = { wallet -> userWallet = wallet @@ -311,7 +309,7 @@ internal class SendViewModel @Inject constructor( } private fun getTapHelpPreviewAvailability() { - viewModelScope.launch(dispatchers.main) { + viewModelScope.launch { isTapHelpPreviewEnabled = isSendTapHelpEnabledUseCase().getOrElse { false } } } @@ -393,18 +391,17 @@ internal class SendViewModel @Inject constructor( private fun getWalletsAndRecent() { getUserWallets() - viewModelScope.launch(dispatchers.main) { + viewModelScope.launch { getTxHistory() } } private fun getUserWallets() { - viewModelScope.launch(dispatchers.main) { + viewModelScope.launch { runCatching { waitForDelay(delay = RECENT_LOAD_DELAY) { getWalletsUseCase.invokeSync() .toAvailableWallets() - .orEmpty() } }.onSuccess { result -> userWallets = result @@ -560,7 +557,7 @@ internal class SendViewModel @Inject constructor( } private fun cancelFeeRequest() { - viewModelScope.launch(dispatchers.main) { + viewModelScope.launch { feeJobHolder.cancel() } } @@ -695,7 +692,7 @@ internal class SendViewModel @Inject constructor( } private fun loadFee() { - viewModelScope.launch(dispatchers.main) { + viewModelScope.launch { val isShowStatus = uiState.feeState?.fee == null if (isShowStatus) { uiState = feeStateFactory.onFeeOnLoadingState() @@ -840,7 +837,7 @@ internal class SendViewModel @Inject constructor( reduceAmountBy = uiState.sendState?.reduceAmountBy ?: BigDecimal.ZERO, ) - viewModelScope.launch(dispatchers.main) { + viewModelScope.launch { createTransactionUseCase( amount = receivingAmount.convertToAmount(cryptoCurrency), fee = fee, @@ -896,7 +893,7 @@ internal class SendViewModel @Inject constructor( val receivingUserWallet = userWallets.firstOrNull { it.address == destinationAddress } ?: return - viewModelScope.launch(dispatchers.io) { + viewModelScope.launch { addCryptoCurrenciesUseCase( userWalletId = receivingUserWallet.userWalletId, cryptoCurrency = cryptoCurrency, @@ -933,7 +930,7 @@ internal class SendViewModel @Inject constructor( val noErrorNotifications = sendState.notifications.none { it is SendNotification.Error } if (!isSuccess && noErrorNotifications) { - viewModelScope.launch(dispatchers.main) { + viewModelScope.launch { val feeUpdatedState = callFeeUseCase()?.fold( ifRight = { uiState = stateFactory.getSendingStateUpdate(isSending = false) @@ -967,7 +964,7 @@ internal class SendViewModel @Inject constructor( } private fun setNeverToShowTapHelp() { - viewModelScope.launch(dispatchers.main) { + viewModelScope.launch { neverShowTapHelpUseCase() } uiState = stateFactory.getHiddenTapHelpState()