diff --git a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt index 4f64bc1d20..2ea48fb328 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -138,36 +138,7 @@ class TapWalletManager { private suspend fun loadMultiWalletData( scanResponse: ScanResponse, ) { - when (val tokensResult = userTokensRepository.getUserTokens(scanResponse.card)) { - is Result.Success -> { - withMainContext { - val blockchainNetworks = tokensResult.data.toBlockchainNetworks() - val walletManagers = walletManagerFactory.makeWalletManagersForApp(scanResponse, tokensResult.data) - store.dispatch( - WalletAction.MultiWallet.AddBlockchains( - blockchains = blockchainNetworks, - walletManagers = walletManagers, - save = false, - ), - ) - - blockchainNetworks.filter { it.tokens.isNotEmpty() } - .map { - store.dispatch( - WalletAction.MultiWallet.AddTokens( - tokens = it.tokens, - blockchain = it, - save = false, - ), - ) - } - checkIfDerivationsAreMissing(blockchainNetworks, scanResponse) - } - } - is Result.Failure -> { - return - } - } + loadUserCurrencies(scanResponse, walletManagerFactory) } private fun checkIfDerivationsAreMissing(blockchainNetworks: List, scanResponse: ScanResponse) { @@ -207,7 +178,35 @@ class TapWalletManager { } } + private suspend fun loadUserCurrencies(scanResponse: ScanResponse, walletManagerFactory: WalletManagerFactory) { + val userTokens = userTokensRepository.getUserTokens(scanResponse.card) + withMainContext { + val blockchainNetworks = userTokens.toBlockchainNetworks() + val walletManagers = walletManagerFactory.makeWalletManagersForApp(scanResponse, userTokens) + store.dispatch( + WalletAction.MultiWallet.AddBlockchains( + blockchains = blockchainNetworks, + walletManagers = walletManagers, + save = false, + ), + ) + + blockchainNetworks.filter { it.tokens.isNotEmpty() } + .map { + store.dispatch( + WalletAction.MultiWallet.AddTokens( + tokens = it.tokens, + blockchain = it, + save = false, + ), + ) + } + checkIfDerivationsAreMissing(blockchainNetworks, scanResponse) + } + } + suspend fun reloadData(data: ScanResponse) { + loadUserCurrencies(data, walletManagerFactory) withContext(Dispatchers.Main) { getActionIfUnknownBlockchainOrEmptyWallet(data)?.let { store.dispatch(it) diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt b/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt index 58c3fb08a4..e418215ed7 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt @@ -24,20 +24,20 @@ class UserTokensRepository( private val storageService: UserTokensStorageService, private val networkService: UserTokensNetworkService, ) { - suspend fun getUserTokens(card: Card): Result> { + suspend fun getUserTokens(card: Card): List { if (DemoHelper.isDemoCardId(card.cardId)) { - return Result.Success(loadDemoCurrencies()) + return loadDemoCurrencies() } val userId = card.getUserId() if (!NetworkConnectivity.getInstance().isOnlineOrConnecting()) { - return Result.Success(loadTokensOffline(card, userId)) + return loadTokensOffline(card, userId) } return when (val networkResult = networkService.getUserTokens(userId)) { is Result.Success -> { val tokens = networkResult.data.tokens.map { Currency.fromTokenResponse(it) } storageService.saveUserTokens(card.getUserId(), tokens) - Result.Success(tokens) + tokens } is Result.Failure -> { handleGetUserTokensFailure(card = card, userId = userId, error = networkResult.error) @@ -73,16 +73,16 @@ class UserTokensRepository( card: Card, userId: String, error: Throwable, - ): Result> { + ): List { return when (error) { is NoDataError -> { val tokens = storageService.getUserTokens(card) coroutineScope { launch { networkService.saveUserTokens(userId = userId, tokens = tokens) } } - Result.Success(tokens) + tokens } else -> { val tokens = storageService.getUserTokens(userId) ?: storageService.getUserTokens(card) - Result.Success(tokens) + tokens } } } @@ -103,7 +103,7 @@ class UserTokensRepository( } companion object { - const val MESSAGE = "AccountID" + const val MESSAGE = "UserWalletID" fun init(context: Context, tangemTechService: TangemTechService): UserTokensRepository { val fileReader = AndroidFileReader(context) val oldUserTokensRepository = OldUserTokensRepository( diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt index e470680dbc..02950c3b3a 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt @@ -79,17 +79,21 @@ private fun handleOtherCardsAction(action: Action, dispatch: DispatchFunction) { val primaryBlockchain = updatedResponse.getBlockchain() val blockchainNetworks = if (primaryBlockchain != Blockchain.Unknown) { val primaryToken = updatedResponse.getPrimaryToken() - val blockchainNetwork = BlockchainNetwork(primaryBlockchain, updatedResponse.card).updateTokens( - listOfNotNull(primaryToken)) + val blockchainNetwork = + BlockchainNetwork(primaryBlockchain, updatedResponse.card).updateTokens( + listOfNotNull(primaryToken), + ) listOf(blockchainNetwork) } else { listOf( BlockchainNetwork(Blockchain.Bitcoin, updatedResponse.card), - BlockchainNetwork(Blockchain.Ethereum, updatedResponse.card) + BlockchainNetwork(Blockchain.Ethereum, updatedResponse.card), ) } - store.dispatch(WalletAction.MultiWallet.SaveCurrencies(blockchainNetworks)) + store.dispatch( + WalletAction.MultiWallet.SaveCurrencies(blockchainNetworks, updatedResponse.card), + ) delay(DELAY_SDK_DIALOG_CLOSE) store.dispatch(OnboardingOtherCardsAction.SetStepOfScreen(OnboardingOtherCardsStep.Done)) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt index ed617762f4..836d287739 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt @@ -39,7 +39,7 @@ sealed class WalletAction : Action { data class NoAccount( val wallet: Wallet, val blockchain: BlockchainNetwork, - val amountToCreateAccount: String + val amountToCreateAccount: String, ) : WalletAction() data class Failure(val wallet: Wallet, val errorMessage: String? = null) : WalletAction() @@ -47,6 +47,10 @@ sealed class WalletAction : Action { data class SetArtworkId(val artworkId: String?) : WalletAction() + sealed class UserTokens : WalletAction() { + object Loading : UserTokens() + object Loaded : UserTokens() + } sealed class MultiWallet : WalletAction() { data class SetIsMultiwalletAllowed(val isMultiwalletAllowed: Boolean) : MultiWallet() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt index 75109fec5a..8e9f4db219 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt @@ -45,6 +45,7 @@ data class WalletState( val totalBalance: TotalBalance? = null, val showBackupWarning: Boolean = false, val missingDerivations: List = emptyList(), + val loadingUserTokens: Boolean = false, ) : StateType { // if you do not delegate - the application crashes on startup, diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt index 79aa56c3df..fbac7c7daa 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt @@ -314,6 +314,8 @@ private fun internalReduce(action: Action, state: AppState): WalletState { is WalletAction.AppCurrencyAction -> { newState = appCurrencyReducer.reduce(action, newState) } + is WalletAction.UserTokens.Loading -> newState = newState.copy(loadingUserTokens = true) + is WalletAction.UserTokens.Loaded -> newState = newState.copy(loadingUserTokens = false) else -> { /* no-op */ } } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt index 9015ba4fc4..9d4fe68894 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt @@ -81,6 +81,8 @@ class MultiWalletView : WalletView() { handleRescanWarning(binding, state.missingDerivations.isNotEmpty()) walletsAdapter.submitList(state.walletsData, state.primaryBlockchain, state.primaryToken) + binding.pbLoadingUserTokens.show(state.loadingUserTokens) + binding.btnAddToken.setOnClickListener { val card = store.state.globalState.scanResponse!!.card store.dispatch( diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SaltPaySingleWalletView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SaltPaySingleWalletView.kt index 09d00b294e..0139a7493c 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SaltPaySingleWalletView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SaltPaySingleWalletView.kt @@ -20,6 +20,7 @@ class SaltPaySingleWalletView : WalletView() { btnAddToken.hide() rvPendingTransaction.hide() tvTwinCardNumber.hide() + pbLoadingUserTokens.hide() lCardBalance.root.hide() lAddress.root.hide() lSingleWalletBalance.root.show() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt index a5529a450d..a0126391a3 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt @@ -37,6 +37,7 @@ class SingleWalletView : WalletView() { rvMultiwallet.hide() btnAddToken.hide() rvPendingTransaction.hide() + pbLoadingUserTokens.hide() lCardBalance.root.show() lAddress.root.show() lSingleWalletBalance.root.hide() diff --git a/app/src/main/res/drawable/ic_tangem_warning.xml b/app/src/main/res/drawable/ic_tangem_warning.xml new file mode 100644 index 0000000000..aa1e0c73ee --- /dev/null +++ b/app/src/main/res/drawable/ic_tangem_warning.xml @@ -0,0 +1,24 @@ + + + + + + + diff --git a/app/src/main/res/layout/fragment_wallet.xml b/app/src/main/res/layout/fragment_wallet.xml index 274f8303fd..60b1a2b33e 100644 --- a/app/src/main/res/layout/fragment_wallet.xml +++ b/app/src/main/res/layout/fragment_wallet.xml @@ -191,11 +191,31 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" + android:layout_marginBottom="16dp" android:nestedScrollingEnabled="false" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/rv_pending_transaction" /> + + + + diff --git a/app/src/main/res/layout/layout_wallet_rescan_warning.xml b/app/src/main/res/layout/layout_wallet_rescan_warning.xml index 8d8e2f1233..c795c2c22a 100644 --- a/app/src/main/res/layout/layout_wallet_rescan_warning.xml +++ b/app/src/main/res/layout/layout_wallet_rescan_warning.xml @@ -8,9 +8,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingStart="16dp" - android:paddingTop="14dp" + android:paddingTop="12dp" android:paddingEnd="16dp" - android:paddingBottom="14dp"> + android:paddingBottom="12dp"> @@ -33,8 +33,8 @@ android:layout_marginStart="8dp" android:layout_marginEnd="16dp" android:text="@string/main_scan_card_warning_view_title" - android:textColor="@color/textBlack" - android:textSize="14sp" + android:textColor="@color/text_primary_1" + android:textSize="16sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@id/tv_rescan_warning_subtitle" app:layout_constraintEnd_toStartOf="@id/iv_rescan_warning_end_icon" @@ -47,8 +47,8 @@ android:layout_height="wrap_content" android:layout_marginTop="4dp" android:text="@string/main_scan_card_warning_view_subtitle" - android:textColor="@color/iconGray" - android:textSize="12sp" + android:textColor="@color/text_secondary" + android:textSize="14sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="@id/tv_rescan_warning_title" app:layout_constraintStart_toStartOf="@id/tv_rescan_warning_title"