From 7851f5e885676e32f7bee46b951a1b0b0ef27706 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 19 Aug 2022 00:26:53 +0300 Subject: [PATCH 1/6] Updated on 2026-08-14 --- .../tap/common/extensions/WalletManager.kt | 3 +- .../tap/common/redux/global/GlobalState.kt | 2 +- .../note/redux/OnboardingNoteState.kt | 2 +- .../products/twins/redux/TwinCardsState.kt | 2 +- .../tap/features/wallet/redux/WalletState.kt | 66 ++++--------------- .../middlewares/TradeCryptoMiddleware.kt | 27 ++++---- .../redux/reducers/OnWalletLoadedReducer.kt | 11 +--- .../wallet/redux/reducers/WalletReducer.kt | 40 +++++------ .../wallet/ui/WalletDetailsFragment.kt | 4 +- .../wallet/ui/wallet/SingleWalletView.kt | 6 +- .../CurrencyExchangeManager.kt | 8 +++ .../exchangeServices/ExchangeService.kt | 19 ++++++ 12 files changed, 81 insertions(+), 109 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt b/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt index 58284b0cc0..311932f7c1 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt @@ -51,11 +51,10 @@ suspend fun WalletManager.safeUpdate(): Result = try { fun WalletManager?.getToUpUrl(): String? { val globalState = store.state.globalState - val exchangeManager = globalState.exchangeManager ?: return null val wallet = this?.wallet ?: return null val defaultAddress = wallet.address - return exchangeManager.getUrl( + return globalState.exchangeManager.getUrl( action = CurrencyExchangeManager.Action.Buy, blockchain = wallet.blockchain, cryptoCurrencyName = wallet.blockchain.currency, diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt index 62e5217866..1fed436b47 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt @@ -25,7 +25,7 @@ data class GlobalState( val appCurrency: FiatCurrency = FiatCurrency.Default, val scanCardFailsCounter: Int = 0, val dialog: StateDialog? = null, - val exchangeManager: CurrencyExchangeManager? = null, + val exchangeManager: CurrencyExchangeManager = CurrencyExchangeManager.dummy(), val resources: AndroidResources = AndroidResources(), val analyticsHandlers: AnalyticsHandler? = null, val userCountryCode: String? = null, diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteState.kt index a9ebb0e757..ae7a2db594 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteState.kt @@ -26,7 +26,7 @@ data class OnboardingNoteState( get() = steps.indexOf(currentStep) val isBuyAllowed: Boolean by ReadOnlyProperty { _, _ -> - store.state.globalState.exchangeManager?.availableForBuy(walletBalance.currency) ?: false + store.state.globalState.exchangeManager.availableForBuy(walletBalance.currency) } } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt index 19cc8ad307..0b2e4b4d1a 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt @@ -56,7 +56,7 @@ data class TwinCardsState( get() = currentStep == TwinCardsStep.CreateSecondWallet || currentStep == TwinCardsStep.CreateThirdWallet val isBuyAllowed: Boolean by ReadOnlyProperty { _, _ -> - store.state.globalState.exchangeManager?.availableForBuy(walletBalance.currency) ?: false + store.state.globalState.exchangeManager.availableForBuy(walletBalance.currency) } } 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 ec3107b151..891b07a3fd 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 @@ -7,9 +7,6 @@ import com.tangem.blockchain.common.Wallet import com.tangem.blockchain.common.WalletManager import com.tangem.blockchain.common.address.AddressType import com.tangem.common.extensions.isZero -import com.tangem.domain.common.extensions.canHandleToken -import com.tangem.domain.common.extensions.toCoinId -import com.tangem.domain.features.addCustomToken.CustomCurrency import com.tangem.tap.common.entities.Button import com.tangem.tap.common.extensions.toQrCode import com.tangem.tap.common.redux.global.CryptoCurrencyName @@ -17,12 +14,18 @@ import com.tangem.tap.common.toggleWidget.WidgetState import com.tangem.tap.domain.configurable.warningMessage.WarningMessage import com.tangem.tap.domain.tokens.models.BlockchainNetwork import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsState -import com.tangem.tap.features.wallet.models.* +import com.tangem.tap.features.wallet.models.Currency +import com.tangem.tap.features.wallet.models.PendingTransaction +import com.tangem.tap.features.wallet.models.TotalBalance +import com.tangem.tap.features.wallet.models.WalletRent +import com.tangem.tap.features.wallet.models.WalletWarning +import com.tangem.tap.features.wallet.models.hasPendingTransactions +import com.tangem.tap.features.wallet.models.hasSendableAmounts +import com.tangem.tap.features.wallet.models.isSendableAmount import com.tangem.tap.features.wallet.redux.reducers.calculateTotalFiatAmount import com.tangem.tap.features.wallet.redux.reducers.findProgressState import com.tangem.tap.features.wallet.ui.BalanceStatus import com.tangem.tap.features.wallet.ui.BalanceWidgetData -import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager import com.tangem.tap.store import org.rekotlin.StateType import java.math.BigDecimal @@ -248,32 +251,6 @@ data class WalletState( return updatedWallets + remainingWallets } - fun updateTradeCryptoState( - exchangeManager: CurrencyExchangeManager?, - walletData: WalletData - ): WalletData { - return walletData.copy( - tradeCryptoState = TradeCryptoState.from( - exchangeManager, - walletData - ) - ) - } - - fun updateTradeCryptoState( - exchangeManager: CurrencyExchangeManager?, - walletDataList: List - ): List { - return walletDataList.map { - it.copy( - tradeCryptoState = TradeCryptoState.from( - exchangeManager, - it - ) - ) - } - } - private fun updateTotalBalance(): WalletState { val walletsData = this.wallets .flatMap(WalletStore::walletsData) @@ -352,39 +329,24 @@ data class Artwork( } } -data class TradeCryptoState( - val isAvailableToSell: () -> Boolean = { false }, - val isAvailableToBuy: () -> Boolean = { false }, -) { - companion object { - fun from( - exchangeManager: CurrencyExchangeManager?, - walletData: WalletData - ): TradeCryptoState { - val exchanger = exchangeManager ?: return walletData.tradeCryptoState - val currency = walletData.currency - - return TradeCryptoState( - isAvailableToSell = { exchanger.availableForSell(currency) }, - isAvailableToBuy = { exchanger.availableForBuy(currency) }, - ) - } - } -} - data class WalletData( val pendingTransactions: List = emptyList(), val hashesCountVerified: Boolean? = null, val walletAddresses: WalletAddresses? = null, val currencyData: BalanceWidgetData = BalanceWidgetData(), val updatingWallet: Boolean = false, - val tradeCryptoState: TradeCryptoState = TradeCryptoState(), val fiatRateString: String? = null, val fiatRate: BigDecimal? = null, val mainButton: WalletMainButton = WalletMainButton.SendButton(false), val currency: Currency, val walletRent: WalletRent? = null, ) { + val isAvailableToBuy: Boolean + get() = store.state.globalState.exchangeManager.availableForBuy(currency) + + val isAvailableToSell: Boolean + get() = store.state.globalState.exchangeManager.availableForSell(currency) + fun shouldShowMultipleAddress(): Boolean { val listOfAddresses = walletAddresses?.list ?: return false return listOfAddresses.size > 1 diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt index 064647d863..319c940a52 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt @@ -37,20 +37,18 @@ class TradeCryptoMiddleware { action: WalletAction.TradeCryptoAction.Buy, ) { if (action.checkUserLocation && state()?.globalState?.userCountryCode == RUSSIA_COUNTRY_CODE) { - store.dispatchOnMain( - WalletAction.DialogAction.RussianCardholdersWarningDialog - ) + store.dispatchOnMain(WalletAction.DialogAction.RussianCardholdersWarningDialog) return } val selectedWalletData = store.state.walletState.getSelectedWalletData() ?: return - val exchangeManager = store.state.globalState.exchangeManager ?: return val card = store.state.globalState.scanResponse?.card ?: return - val appCurrency = store.state.globalState.appCurrency val addresses = selectedWalletData.walletAddresses?.list.orEmpty() if (addresses.isEmpty()) return + val exchangeManager = store.state.globalState.exchangeManager + val appCurrency = store.state.globalState.appCurrency val currency = selectedWalletData.currency if (currency is Currency.Token && currency.blockchain.isTestnet()) { @@ -81,15 +79,13 @@ class TradeCryptoMiddleware { private fun proceedSellAction() { val selectedWalletData = store.state.walletState.getSelectedWalletData() ?: return - val exchangeManager = store.state.globalState.exchangeManager ?: return - val appCurrency = store.state.globalState.appCurrency + val appCurrency = store.state.globalState.appCurrency val addresses = selectedWalletData.walletAddresses?.list.orEmpty() if (addresses.isEmpty()) return val currency = selectedWalletData.currency - - exchangeManager.getUrl( + store.state.globalState.exchangeManager.getUrl( action = CurrencyExchangeManager.Action.Sell, blockchain = currency.blockchain, cryptoCurrencyName = currency.currencySymbol, @@ -100,8 +96,8 @@ class TradeCryptoMiddleware { private fun preconfigureAndOpenSendScreen(action: WalletAction.TradeCryptoAction.SendCrypto) { val selectedWalletData = store.state.walletState.getSelectedWalletData() ?: return - val walletManager = - store.state.walletState.getWalletManager(selectedWalletData.currency) + + val walletManager = store.state.walletState.getWalletManager(selectedWalletData.currency) store.dispatchOnMain(PrepareSendScreen( coinAmount = walletManager?.wallet?.amounts?.get(AmountType.Coin), coinRate = selectedWalletData.fiatRate, @@ -116,11 +112,10 @@ class TradeCryptoMiddleware { } private fun openReceiptUrl(transactionId: String) { - val exchangeManager = store.state.globalState.exchangeManager ?: return - store.dispatchOnMain(NavigationAction.PopBackTo()) - exchangeManager.getSellCryptoReceiptUrl(CurrencyExchangeManager.Action.Sell, transactionId)?.let { - store.dispatchOnMain(NavigationAction.OpenUrl(it)) - } + store.state.globalState.exchangeManager.getSellCryptoReceiptUrl( + action = CurrencyExchangeManager.Action.Sell, + transactionId = transactionId, + )?.let { store.dispatchOnMain(NavigationAction.OpenUrl(it)) } } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt index 482285de76..63d378718f 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt @@ -13,7 +13,9 @@ import com.tangem.tap.features.wallet.models.Currency import com.tangem.tap.features.wallet.models.filterByToken import com.tangem.tap.features.wallet.models.getPendingTransactions import com.tangem.tap.features.wallet.models.removeUnknownTransactions -import com.tangem.tap.features.wallet.redux.* +import com.tangem.tap.features.wallet.redux.ProgressState +import com.tangem.tap.features.wallet.redux.WalletMainButton +import com.tangem.tap.features.wallet.redux.WalletState import com.tangem.tap.features.wallet.redux.WalletState.Companion.UNKNOWN_AMOUNT_SIGN import com.tangem.tap.features.wallet.ui.BalanceStatus import com.tangem.tap.features.wallet.ui.BalanceWidgetData @@ -38,8 +40,6 @@ class OnWalletLoadedReducer { val walletData = walletState.getWalletData(blockchainNetwork) ?: return walletState val fiatCurrency = store.state.globalState.appCurrency - val exchangeManager = store.state.globalState.exchangeManager - val coinAmountValue = wallet.amounts[AmountType.Coin]?.value val formattedAmount = coinAmountValue?.toFormattedCurrencyString( wallet.blockchain.decimals(), @@ -71,7 +71,6 @@ class OnWalletLoadedReducer { pendingTransactions = pendingTransactions.removeUnknownTransactions(), mainButton = WalletMainButton.SendButton(isCoinSendButtonEnabled), currency = Currency.fromBlockchainNetwork(blockchainNetwork), - tradeCryptoState = TradeCryptoState.from(exchangeManager, walletData), ) val tokens = wallet.getTokens().mapNotNull { token -> @@ -104,7 +103,6 @@ class OnWalletLoadedReducer { ), pendingTransactions = tokenPendingTransactions.removeUnknownTransactions(), mainButton = WalletMainButton.SendButton(isTokenSendButtonEnabled), - tradeCryptoState = TradeCryptoState.from(exchangeManager, tokenWalletData), ) } val newWallets = tokens + newWalletData @@ -118,8 +116,6 @@ class OnWalletLoadedReducer { if (wallet.blockchain != walletState.primaryBlockchain) return walletState val fiatCurrencyName = store.state.globalState.appCurrency.code - val exchangeManager = store.state.globalState.exchangeManager - val token = wallet.getFirstToken() val tokenData = if (token != null) { val tokenAmount = wallet.getTokenAmount(token) @@ -167,7 +163,6 @@ class OnWalletLoadedReducer { ), pendingTransactions = pendingTransactions.removeUnknownTransactions(), mainButton = WalletMainButton.SendButton(sendButtonEnabled), - tradeCryptoState = TradeCryptoState.from(exchangeManager, walletState.primaryWallet), ) val wallets = listOfNotNull(walletData) val updatedStore = walletState.getWalletStore(walletData?.currency)?.updateWallets(wallets) 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 fba952b703..bf3d1552a9 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 @@ -6,7 +6,11 @@ import com.tangem.blockchain.common.Wallet import com.tangem.common.extensions.mapNotNullValues import com.tangem.domain.common.TwinCardNumber import com.tangem.tap.common.entities.FiatCurrency -import com.tangem.tap.common.extensions.* +import com.tangem.tap.common.extensions.toFiatRateString +import com.tangem.tap.common.extensions.toFiatString +import com.tangem.tap.common.extensions.toFiatValue +import com.tangem.tap.common.extensions.toFormattedCurrencyString +import com.tangem.tap.common.extensions.toFormattedFiatValue import com.tangem.tap.common.redux.AppState import com.tangem.tap.domain.TapError import com.tangem.tap.domain.extensions.getArtworkUrl @@ -14,7 +18,16 @@ import com.tangem.tap.domain.getFirstToken import com.tangem.tap.domain.tokens.models.BlockchainNetwork import com.tangem.tap.features.wallet.models.Currency import com.tangem.tap.features.wallet.models.WalletRent -import com.tangem.tap.features.wallet.redux.* +import com.tangem.tap.features.wallet.redux.AddressData +import com.tangem.tap.features.wallet.redux.Artwork +import com.tangem.tap.features.wallet.redux.ErrorType +import com.tangem.tap.features.wallet.redux.ProgressState +import com.tangem.tap.features.wallet.redux.WalletAction +import com.tangem.tap.features.wallet.redux.WalletAddresses +import com.tangem.tap.features.wallet.redux.WalletData +import com.tangem.tap.features.wallet.redux.WalletMainButton +import com.tangem.tap.features.wallet.redux.WalletState +import com.tangem.tap.features.wallet.redux.WalletStore import com.tangem.tap.features.wallet.ui.BalanceStatus import com.tangem.tap.features.wallet.ui.BalanceWidgetData import com.tangem.tap.store @@ -144,10 +157,6 @@ private fun internalReduce(action: Action, state: AppState): WalletState { currencySymbol = walletData.currencyData.currencySymbol, ), mainButton = WalletMainButton.SendButton(false), - tradeCryptoState = TradeCryptoState.from( - exchangeManager, - walletData - ) ) } ) @@ -171,13 +180,9 @@ private fun internalReduce(action: Action, state: AppState): WalletState { currencySymbol = wallet.currencyData.currencySymbol, ), mainButton = WalletMainButton.SendButton(false), - tradeCryptoState = TradeCryptoState.from(exchangeManager, wallet) ) } - val wallets = newState.updateTradeCryptoState( - exchangeManager, - newState.replaceSomeWallets(newWallets) - ) + val wallets = newState.replaceSomeWallets(newWallets) val walletStore = newState.getWalletStore(action.blockchain)?.updateWallets(wallets) newState = newState.updateWalletStore(walletStore) } @@ -210,14 +215,9 @@ private fun internalReduce(action: Action, state: AppState): WalletState { ) ) } - var updatedWalletStore = newState.getWalletStore(action.blockchain) + val updatedWalletStore = newState.getWalletStore(action.blockchain) ?.updateWallets(listOfNotNull(walletData)) - updatedWalletStore = - updatedWalletStore?.updateWallets( - newState.updateTradeCryptoState(exchangeManager, updatedWalletStore.walletsData) - ) - newState = newState.updateWalletStore(updatedWalletStore) } @@ -248,11 +248,7 @@ private fun internalReduce(action: Action, state: AppState): WalletState { ) ) } - val updatedWallets = - newState.updateTradeCryptoState( - exchangeManager, - walletStore!!.updateWallets(listOfNotNull(newWalletData) + tokenWallets).walletsData - ) + val updatedWallets = walletStore!!.updateWallets(listOfNotNull(newWalletData) + tokenWallets).walletsData newState = newState.updateWalletsData(updatedWallets) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt index 0f54d5b13a..a84d052625 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt @@ -199,8 +199,8 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), } rowButtons.updateButtonsVisibility( - buyAllowed = selectedWallet.tradeCryptoState.isAvailableToBuy(), - sellAllowed = selectedWallet.tradeCryptoState.isAvailableToSell(), + buyAllowed = selectedWallet.isAvailableToBuy, + sellAllowed = selectedWallet.isAvailableToSell, sendAllowed = selectedWallet.mainButton.enabled, ) } 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 fa046cc3f0..7f473f4b4d 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 @@ -117,11 +117,9 @@ class SingleWalletView : WalletView() { } private fun setupRowButtons(state: WalletData, rowButtons: WalletDetailsButtonsRow) { - val allowedToBuy = state.tradeCryptoState.isAvailableToBuy() - val allowedToSell = state.tradeCryptoState.isAvailableToSell() rowButtons.updateButtonsVisibility( - buyAllowed = allowedToBuy, - sellAllowed = allowedToSell, + buyAllowed = state.isAvailableToBuy, + sellAllowed = state.isAvailableToSell, sendAllowed = state.mainButton.enabled, ) diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt index 39f201a9b1..85720c4306 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt @@ -74,6 +74,14 @@ class CurrencyExchangeManager( } enum class Action { Buy, Sell } + + companion object { + fun dummy(): CurrencyExchangeManager = CurrencyExchangeManager( + buyService = ExchangeService.dummy(), + sellService = ExchangeService.dummy(), + primaryRules = ExchangeRules.dummy(), + ) + } } suspend fun CurrencyExchangeManager.buyErc20TestnetTokens( diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt index 34f37dddf9..f7db8b210f 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt @@ -5,6 +5,16 @@ import com.tangem.tap.features.wallet.models.Currency interface ExchangeService: ExchangeRules { suspend fun update() + + companion object { + fun dummy(): ExchangeService = object : ExchangeService { + override suspend fun update() {} + override fun isBuyAllowed(): Boolean = false + override fun isSellAllowed(): Boolean = false + override fun availableForBuy(currency: Currency): Boolean = false + override fun availableForSell(currency: Currency): Boolean = false + } + } } interface ExchangeRules { @@ -12,6 +22,15 @@ interface ExchangeRules { fun isSellAllowed(): Boolean fun availableForBuy(currency: Currency):Boolean fun availableForSell(currency: Currency):Boolean + + companion object { + fun dummy(): ExchangeRules = object : ExchangeRules { + override fun isBuyAllowed(): Boolean = false + override fun isSellAllowed(): Boolean = false + override fun availableForBuy(currency: Currency): Boolean = false + override fun availableForSell(currency: Currency): Boolean = false + } + } } interface ExchangeUrlBuilder { From cf692a7cd64faff7cdbb22c54e5388d6b07c7f12 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 19 Aug 2022 00:32:29 +0300 Subject: [PATCH 2/6] Updated on 2026-08-14 --- .../tangem/tap/network/exchangeServices/CardExchangeRules.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/CardExchangeRules.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/CardExchangeRules.kt index d6c0cfe6c5..ecf9d850b3 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/CardExchangeRules.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/CardExchangeRules.kt @@ -16,7 +16,7 @@ class CardExchangeRules( val card = cardProvider() ?: return false return when { - card.isDemoCard() -> false + card.isDemoCard() -> true card.isStart2Coin -> false else -> true } @@ -36,7 +36,7 @@ class CardExchangeRules( val card = cardProvider() ?: return false return when { - card.isDemoCard() -> false + card.isDemoCard() -> true card.isStart2Coin -> false else -> true } From 3caf4762ab1ce46466f0cc2711d6df90fc8518db Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 19 Aug 2022 00:54:17 +0300 Subject: [PATCH 3/6] Updated on 2026-08-14 --- .../tap/network/exchangeServices/mercuryo/MercuryoApi.kt | 9 --------- .../network/exchangeServices/mercuryo/MercuryoService.kt | 1 + 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoApi.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoApi.kt index 45494e0114..87565c3640 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoApi.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoApi.kt @@ -4,15 +4,6 @@ import com.squareup.moshi.Json import retrofit2.http.GET import retrofit2.http.Path -/** -[REDACTED_AUTHOR] - */ - - - -private val CurrenciesUrl = "https://api.mercuryo.io/v1.6/lib/currencies" - - interface MercuryoApi { diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt index 97190aa9fd..112e3660c8 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt @@ -130,6 +130,7 @@ class MercuryoService( private fun blockchainFromCurrencyName(currencyName: String): Blockchain? = when (currencyName) { "BNB" -> Blockchain.BSC "ETH" -> Blockchain.Ethereum + "ADA" -> Blockchain.CardanoShelley else -> Blockchain.values().find { it.currency.lowercase() == currencyName.lowercase() } } } From 6bcd70c9782b9641635fbf2302860de9ecb0215d Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 19 Aug 2022 01:38:31 +0300 Subject: [PATCH 4/6] Updated on 2026-08-14 --- .../com/tangem/tap/common/feature/Feature.kt | 8 +++++ .../tap/features/wallet/redux/WalletState.kt | 20 ++++++------ .../wallet/redux/reducers/WalletReducer.kt | 2 -- .../wallet/ui/WalletDetailsFragment.kt | 5 +-- .../wallet/ui/view/WalletDetailsButtonsRow.kt | 15 ++++++--- .../wallet/ui/wallet/SingleWalletView.kt | 32 ++++++++++++------- .../exchangeServices/CardExchangeRules.kt | 6 ++++ .../CurrencyExchangeManager.kt | 2 ++ .../exchangeServices/ExchangeService.kt | 18 +++++++---- .../mercuryo/MercuryoService.kt | 2 ++ .../moonpay/MoonPayService.kt | 2 ++ 11 files changed, 78 insertions(+), 34 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/common/feature/Feature.kt diff --git a/app/src/main/java/com/tangem/tap/common/feature/Feature.kt b/app/src/main/java/com/tangem/tap/common/feature/Feature.kt new file mode 100644 index 0000000000..ce1313c772 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/feature/Feature.kt @@ -0,0 +1,8 @@ +package com.tangem.tap.common.feature + +/** +[REDACTED_AUTHOR] + */ +interface Feature { + fun featureIsSwitchedOn():Boolean +} \ No newline at end of file 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 891b07a3fd..48c886d939 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 @@ -51,21 +51,15 @@ data class WalletState( // if you do not delegate - the application crashes on startup, // because twinCardsState has not been created yet - val twinCardsState: TwinCardsState by ReadOnlyProperty { thisRef, property -> + val twinCardsState: TwinCardsState by ReadOnlyProperty { _, _ -> store.state.twinCardsState } val isTangemTwins: Boolean get() = store.state.globalState.scanResponse?.isTangemTwins() == true - val primaryWallet: WalletData? = wallets.firstOrNull() - ?.walletsData?.firstOrNull() - val primaryWalletManager: WalletManager? = - if (wallets.isNotEmpty()) wallets[0].walletManager else null - - val shouldShowDetails: Boolean = - primaryWallet?.currencyData?.status != BalanceStatus.EmptyCard && - primaryWallet?.currencyData?.status != BalanceStatus.UnknownBlockchain + val isExchangeServiceFeatureOn: Boolean + get() = store.state.globalState.exchangeManager.featureIsSwitchedOn() val blockchains: List get() = wallets.mapNotNull { it.walletManager?.wallet?.blockchain } @@ -79,6 +73,14 @@ data class WalletState( val walletManagers: List get() = wallets.mapNotNull { it.walletManager } + val primaryWallet: WalletData? = wallets.firstOrNull()?.walletsData?.firstOrNull() + + val primaryWalletManager: WalletManager? = if (wallets.isNotEmpty()) wallets[0].walletManager else null + + val shouldShowDetails: Boolean = + primaryWallet?.currencyData?.status != BalanceStatus.EmptyCard && + primaryWallet?.currencyData?.status != BalanceStatus.UnknownBlockchain + fun getWalletManager(currency: Currency?): WalletManager? { if (currency?.blockchain == null) return null return getWalletStore(currency)?.walletManager 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 bf3d1552a9..a4b679512e 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 @@ -30,7 +30,6 @@ import com.tangem.tap.features.wallet.redux.WalletState import com.tangem.tap.features.wallet.redux.WalletStore import com.tangem.tap.features.wallet.ui.BalanceStatus import com.tangem.tap.features.wallet.ui.BalanceWidgetData -import com.tangem.tap.store import org.rekotlin.Action import java.math.BigDecimal @@ -48,7 +47,6 @@ private fun internalReduce(action: Action, state: AppState): WalletState { if (action !is WalletAction) return state.walletState - val exchangeManager = store.state.globalState.exchangeManager var newState = state.walletState when (action) { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt index a84d052625..ab07dd33d5 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt @@ -140,7 +140,7 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), setupAddressCard(selectedWallet) setupNoInternetHandling(state) setupBalanceData(selectedWallet.currencyData) - setupButtons(selectedWallet) + setupButtons(selectedWallet, state.isExchangeServiceFeatureOn) handleCurrencyIcon(selectedWallet) handleWarnings(selectedWallet) @@ -186,7 +186,7 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), ) } - private fun setupButtons(selectedWallet: WalletData) = with(binding) { + private fun setupButtons(selectedWallet: WalletData, isExchangeServiceFeatureOn: Boolean) = with(binding) { lWalletDetails.btnCopy.setOnClickListener { selectedWallet.walletAddresses?.selectedAddress?.address?.let { addressString -> store.dispatch(WalletAction.CopyAddress(addressString, requireContext())) @@ -199,6 +199,7 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), } rowButtons.updateButtonsVisibility( + exchangeServiceFeatureOn = isExchangeServiceFeatureOn, buyAllowed = selectedWallet.isAvailableToBuy, sellAllowed = selectedWallet.isAvailableToSell, sendAllowed = selectedWallet.mainButton.enabled, diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/view/WalletDetailsButtonsRow.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/view/WalletDetailsButtonsRow.kt index 1b7eff8f23..af6ec9280b 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/view/WalletDetailsButtonsRow.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/view/WalletDetailsButtonsRow.kt @@ -35,14 +35,21 @@ internal class WalletDetailsButtonsRow @JvmOverloads constructor( } fun updateButtonsVisibility( + exchangeServiceFeatureOn: Boolean, buyAllowed: Boolean, sellAllowed: Boolean, sendAllowed: Boolean, ) = with(binding) { - btnBuy.isVisible = (buyAllowed && !sellAllowed) || (!buyAllowed && !sellAllowed) - btnBuy.isEnabled = buyAllowed - btnSell.isVisible = !buyAllowed && sellAllowed - btnTrade.isVisible = buyAllowed && sellAllowed + if (exchangeServiceFeatureOn) { + btnBuy.isVisible = (buyAllowed && !sellAllowed) || (!buyAllowed && !sellAllowed) + btnBuy.isEnabled = buyAllowed + btnSell.isVisible = !buyAllowed && sellAllowed + btnTrade.isVisible = buyAllowed && sellAllowed + } else { + btnBuy.isVisible = false + btnSell.isVisible = false + btnTrade.isVisible = false + } btnSend.isEnabled = sendAllowed } } \ No newline at end of file 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 7f473f4b4d..ab271db8fb 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 @@ -58,7 +58,7 @@ class SingleWalletView : WalletView() { state.primaryWallet ?: return setupTwinCards(state.twinCardsState, binding) - setupButtons(state.primaryWallet, binding) + setupButtons(state.primaryWallet, binding, state.isExchangeServiceFeatureOn) setupAddressCard(state.primaryWallet, binding) showPendingTransactionsIfPresent(state.primaryWallet.pendingTransactions) setupBalance(state, state.primaryWallet) @@ -97,18 +97,23 @@ class SingleWalletView : WalletView() { } } - private fun setupButtons(state: WalletData, binding: FragmentWalletBinding) = with(binding) { - setupRowButtons(state, rowButtons) + private fun setupButtons( + walletData: WalletData, + binding: FragmentWalletBinding, + isExchangeServiceFeatureEnabled: Boolean, + ) = with(binding) { + setupRowButtons(walletData, rowButtons, isExchangeServiceFeatureEnabled) + lAddress.btnCopy.setOnClickListener { - state.walletAddresses?.selectedAddress?.address?.let { addressString -> + walletData.walletAddresses?.selectedAddress?.address?.let { addressString -> store.dispatch(WalletAction.CopyAddress(addressString, fragment!!.requireContext())) } } lAddress.btnShowQr.setOnClickListener { - state.walletAddresses?.selectedAddress?.let { selectedAddress -> + walletData.walletAddresses?.selectedAddress?.let { selectedAddress -> store.dispatch( WalletAction.DialogAction.QrCode( - currency = state.currency, + currency = walletData.currency, selectedAddress = selectedAddress, ), ) @@ -116,11 +121,16 @@ class SingleWalletView : WalletView() { } } - private fun setupRowButtons(state: WalletData, rowButtons: WalletDetailsButtonsRow) { + private fun setupRowButtons( + walletData: WalletData, + rowButtons: WalletDetailsButtonsRow, + isExchangeServiceFeatureEnabled: Boolean, + ) { rowButtons.updateButtonsVisibility( - buyAllowed = state.isAvailableToBuy, - sellAllowed = state.isAvailableToSell, - sendAllowed = state.mainButton.enabled, + exchangeServiceFeatureOn = isExchangeServiceFeatureEnabled, + buyAllowed = walletData.isAvailableToBuy, + sellAllowed = walletData.isAvailableToSell, + sendAllowed = walletData.mainButton.enabled, ) rowButtons.onBuyClick = { store.dispatch(WalletAction.TradeCryptoAction.Buy()) } @@ -128,7 +138,7 @@ class SingleWalletView : WalletView() { rowButtons.onTradeClick = { store.dispatch(WalletAction.DialogAction.ChooseTradeActionDialog) } rowButtons.onSendClick = { - when (state.mainButton) { + when (walletData.mainButton) { is WalletMainButton.SendButton -> store.dispatch(WalletAction.Send()) is WalletMainButton.CreateWalletButton -> store.dispatch(WalletAction.CreateWallet) } diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/CardExchangeRules.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/CardExchangeRules.kt index ecf9d850b3..a7f7b9aec2 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/CardExchangeRules.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/CardExchangeRules.kt @@ -12,6 +12,12 @@ class CardExchangeRules( val cardProvider: () -> Card?, ) : ExchangeRules { + override fun featureIsSwitchedOn(): Boolean { + val card = cardProvider() ?: return false + + return !card.isStart2Coin + } + override fun isBuyAllowed(): Boolean { val card = cardProvider() ?: return false diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt index 85720c4306..04c92fc542 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt @@ -26,6 +26,8 @@ class CurrencyExchangeManager( private val primaryRules: ExchangeRules, ) : ExchangeService, ExchangeUrlBuilder { + override fun featureIsSwitchedOn(): Boolean = primaryRules.featureIsSwitchedOn() + override suspend fun update() { buyService.update() sellService.update() diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt index f7db8b210f..8d6e8e2187 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt @@ -1,13 +1,22 @@ package com.tangem.tap.network.exchangeServices import com.tangem.blockchain.common.Blockchain +import com.tangem.tap.common.feature.Feature import com.tangem.tap.features.wallet.models.Currency -interface ExchangeService: ExchangeRules { +interface Exchanger { + fun isBuyAllowed(): Boolean + fun isSellAllowed(): Boolean + fun availableForBuy(currency: Currency):Boolean + fun availableForSell(currency: Currency):Boolean +} + +interface ExchangeService: Feature, Exchanger { suspend fun update() companion object { fun dummy(): ExchangeService = object : ExchangeService { + override fun featureIsSwitchedOn(): Boolean = false override suspend fun update() {} override fun isBuyAllowed(): Boolean = false override fun isSellAllowed(): Boolean = false @@ -17,14 +26,11 @@ interface ExchangeService: ExchangeRules { } } -interface ExchangeRules { - fun isBuyAllowed(): Boolean - fun isSellAllowed(): Boolean - fun availableForBuy(currency: Currency):Boolean - fun availableForSell(currency: Currency):Boolean +interface ExchangeRules: Feature, Exchanger { companion object { fun dummy(): ExchangeRules = object : ExchangeRules { + override fun featureIsSwitchedOn(): Boolean = false override fun isBuyAllowed(): Boolean = false override fun isSellAllowed(): Boolean = false override fun availableForBuy(currency: Currency): Boolean = false diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt index 97190aa9fd..4d00d9a42c 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt @@ -28,6 +28,8 @@ class MercuryoService( private val blockchainsAvailableToBuy = mutableListOf() private val tokensAvailableToBy = mutableMapOf>() + override fun featureIsSwitchedOn(): Boolean = true + override suspend fun update() { when (val result = performRequest { api.currencies(apiVersion) }) { is Result.Success -> { diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt index fa96286e84..00db516c5b 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt @@ -29,6 +29,8 @@ class MoonPayService( private var status: MoonPayStatus? = null + override fun featureIsSwitchedOn(): Boolean = true + override suspend fun update() { withIOContext { performRequest { From 21aef70b4f5fa3db2de67d3a04c067a7f40a3183 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 19 Aug 2022 02:01:55 +0300 Subject: [PATCH 5/6] Updated on 2026-08-14 --- app/src/main/res/layout/fragment_wallet.xml | 22 ++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/layout/fragment_wallet.xml b/app/src/main/res/layout/fragment_wallet.xml index fa0eaf1398..f53b6f7f6d 100644 --- a/app/src/main/res/layout/fragment_wallet.xml +++ b/app/src/main/res/layout/fragment_wallet.xml @@ -47,7 +47,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:clipToPadding="false" - android:paddingBottom="32dp"> + android:paddingBottom="92dp"> - - + + + From e7cf31c1a20b0ea3d23d4e5789e07fb847085cd6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 19 Aug 2022 02:03:58 +0300 Subject: [PATCH 6/6] Updated on 2026-08-14 --- app/src/main/res/layout/fragment_wallet.xml | 22 ++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/layout/fragment_wallet.xml b/app/src/main/res/layout/fragment_wallet.xml index f53b6f7f6d..d5daad21ea 100644 --- a/app/src/main/res/layout/fragment_wallet.xml +++ b/app/src/main/res/layout/fragment_wallet.xml @@ -93,6 +93,17 @@ app:barrierDirection="bottom" app:constraint_referenced_ids="iv_card,tv_twin_card_number" /> + + - -