From 02c12c524b38c77fa4d1540eb0a8557cd36b3d2a Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 5 May 2026 14:52:28 +0100 Subject: [PATCH] Updated on 2026-08-14 --- .../main/assets/configs/feature_toggles_config.json | 4 ++++ .../com/tangem/features/swap/SwapFeatureToggles.kt | 4 +++- .../tangem/feature/swap/DefaultSwapFeatureToggles.kt | 12 +++++++++++- .../com/tangem/feature/swap/di/SwapFeatureModule.kt | 5 +++-- .../java/com/tangem/feature/swap/model/SwapModel.kt | 7 +++++-- .../feature/swap/model/SwapNotificationsFactory.kt | 4 ++-- .../java/com/tangem/feature/swap/ui/StateBuilder.kt | 4 ++-- .../feature/swap/StateBuilderInitialStateTest.kt | 4 ++-- .../com/tangem/feature/swap/StateBuilderPairsTest.kt | 4 ++-- .../tangem/feature/swap/StateBuilderQuotesTest.kt | 9 +++------ .../tangem/feature/swap/StateBuilderSwapDataTest.kt | 8 +++----- 11 files changed, 40 insertions(+), 25 deletions(-) diff --git a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json index c161b3d49d..d813aed232 100644 --- a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json +++ b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json @@ -66,5 +66,9 @@ { "name": "ADDRESS_SYNC_ENABLED", "version": "undefined" + }, + { + "name": "SWAP_SWITCH_TO_TRANSFER_ENABLED", + "version": "undefined" } ] diff --git a/features/swap/api/src/main/kotlin/com/tangem/features/swap/SwapFeatureToggles.kt b/features/swap/api/src/main/kotlin/com/tangem/features/swap/SwapFeatureToggles.kt index e0fe076fab..45b24ac9b2 100644 --- a/features/swap/api/src/main/kotlin/com/tangem/features/swap/SwapFeatureToggles.kt +++ b/features/swap/api/src/main/kotlin/com/tangem/features/swap/SwapFeatureToggles.kt @@ -1,3 +1,5 @@ package com.tangem.features.swap -interface SwapFeatureToggles \ No newline at end of file +interface SwapFeatureToggles { + val isSwapSwitchToTransferEnabled: Boolean +} \ No newline at end of file diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/DefaultSwapFeatureToggles.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/DefaultSwapFeatureToggles.kt index c202111fb6..f6ac98d33d 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/DefaultSwapFeatureToggles.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/DefaultSwapFeatureToggles.kt @@ -1,5 +1,15 @@ package com.tangem.feature.swap +import com.tangem.core.configtoggle.FeatureToggles +import com.tangem.core.configtoggle.feature.FeatureTogglesManager import com.tangem.features.swap.SwapFeatureToggles +import javax.inject.Inject -internal class DefaultSwapFeatureToggles : SwapFeatureToggles \ No newline at end of file +internal class DefaultSwapFeatureToggles @Inject constructor( + featureTogglesManager: FeatureTogglesManager, +) : SwapFeatureToggles { + + override val isSwapSwitchToTransferEnabled: Boolean = featureTogglesManager.isFeatureEnabled( + toggle = FeatureToggles.SWAP_SWITCH_TO_TRANSFER_ENABLED, + ) +} \ No newline at end of file diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/di/SwapFeatureModule.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/di/SwapFeatureModule.kt index 990f8c8ec9..5cf4ea502f 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/di/SwapFeatureModule.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/di/SwapFeatureModule.kt @@ -1,5 +1,6 @@ package com.tangem.feature.swap.di +import com.tangem.core.configtoggle.feature.FeatureTogglesManager import com.tangem.feature.swap.DefaultSwapComponent import com.tangem.feature.swap.DefaultSwapFeatureToggles import com.tangem.features.swap.SwapComponent @@ -17,8 +18,8 @@ internal object SwapFeatureModule { @Provides @Singleton - fun provideSwapFeatureToggles(): SwapFeatureToggles { - return DefaultSwapFeatureToggles() + fun provideSwapFeatureToggles(featureTogglesManager: FeatureTogglesManager): SwapFeatureToggles { + return DefaultSwapFeatureToggles(featureTogglesManager) } } diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt index 6755e4209a..5bad26508b 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt @@ -98,6 +98,7 @@ import com.tangem.features.commonfeatures.api.choosetoken.ChooseTokenResult import com.tangem.features.send.v2.api.entity.FeeSelectorUM import com.tangem.features.send.v2.api.subcomponents.feeSelector.FeeSelectorReloadTrigger import com.tangem.features.swap.SwapComponent +import com.tangem.features.swap.SwapFeatureToggles import com.tangem.utils.Provider import com.tangem.utils.coroutines.* import com.tangem.utils.isNullOrZero @@ -144,13 +145,14 @@ internal class SwapModel @Inject constructor( private val getAccountCurrencyStatusUseCase: GetAccountCurrencyStatusUseCase, private val getPaymentAccountCryptoCurrencyStatusUseCase: GetPaymentAccountCryptoCurrencyStatusUseCase, private val tangemPayWithdrawUseCase: TangemPayWithdrawUseCase, - private val iGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork, + private val isGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork, private val feeSelectorReloadTrigger: FeeSelectorReloadTrigger, private val getTangemPayCustomerIdUseCase: GetTangemPayCustomerIdUseCase, private val appsFlyerStore: AppsFlyerStore, private val messageSender: UiMessageSender, private val initialCurrenciesResolver: InitialCurrenciesResolver, private val allowPermissionsHandler: AllowPermissionsHandler, + private val swapFeatureToggles: SwapFeatureToggles, ) : Model() { private val params = paramsContainer.require() @@ -184,7 +186,7 @@ internal class SwapModel @Inject constructor( isBalanceHiddenProvider = Provider { isBalanceHidden }, appCurrencyProvider = Provider(selectedAppCurrencyFlow::value), isAccountsModeProvider = Provider { isAccountsMode }, - iGaslessFeeSupportedForNetwork = iGaslessFeeSupportedForNetwork, + isGaslessFeeSupportedForNetwork = isGaslessFeeSupportedForNetwork, ) private val inputNumberFormatter = InputNumberFormatter( @@ -1548,6 +1550,7 @@ internal class SwapModel @Inject constructor( } private fun filterTokensFromSelector() { + if (swapFeatureToggles.isSwapSwitchToTransferEnabled) return val tokenFilter = { accountStatus: AccountStatus, currencyStatus: CryptoCurrencyStatus -> if (currencyStatus.currency.isCustom) { false diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapNotificationsFactory.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapNotificationsFactory.kt index 2bff6bb705..ddc42b9e81 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapNotificationsFactory.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapNotificationsFactory.kt @@ -35,7 +35,7 @@ import java.math.BigDecimal @Suppress("LargeClass") internal class SwapNotificationsFactory( private val actions: UiActions, - private val iGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork, + private val isGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork, ) { fun getGeneralErrorStateNotifications( @@ -314,7 +314,7 @@ internal class SwapNotificationsFactory( val isNotEnoughFee = quoteModel.preparedSwapConfigState.includeFeeInAmount is IncludeFeeInAmount.BalanceNotEnough - val isGaslessAvailable = iGaslessFeeSupportedForNetwork(fromCurrency.network) && + val isGaslessAvailable = isGaslessFeeSupportedForNetwork(fromCurrency.network) && quoteModel.swapProvider.type == ExchangeProviderType.CEX if (shouldShowCoverWarning && !isGaslessAvailable || isNotEnoughFee) { add( diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt index deb2acdde2..814623edd8 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt @@ -57,12 +57,12 @@ internal class StateBuilder( private val isBalanceHiddenProvider: Provider, private val appCurrencyProvider: Provider, private val isAccountsModeProvider: Provider, - private val iGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork, + private val isGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork, ) { private val iconStateConverter by lazy(::CryptoCurrencyToIconStateConverter) private val notificationsFactory by lazy(LazyThreadSafetyMode.NONE) { - SwapNotificationsFactory(actions, iGaslessFeeSupportedForNetwork) + SwapNotificationsFactory(actions, isGaslessFeeSupportedForNetwork) } fun createInitialLoadingState(): SwapStateHolder { diff --git a/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderInitialStateTest.kt b/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderInitialStateTest.kt index e8724ad601..74d5f2bf6b 100644 --- a/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderInitialStateTest.kt +++ b/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderInitialStateTest.kt @@ -30,7 +30,7 @@ internal class StateBuilderInitialStateTest { private val isBalanceHiddenProvider: Provider = mockk() private val appCurrencyProvider: Provider = mockk() private val isAccountsModeProvider: Provider = mockk() - private val iGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork = mockk() + private val isGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork = mockk() private lateinit var sut: StateBuilder @@ -47,7 +47,7 @@ internal class StateBuilderInitialStateTest { isBalanceHiddenProvider = isBalanceHiddenProvider, appCurrencyProvider = appCurrencyProvider, isAccountsModeProvider = isAccountsModeProvider, - iGaslessFeeSupportedForNetwork = iGaslessFeeSupportedForNetwork, + isGaslessFeeSupportedForNetwork = isGaslessFeeSupportedForNetwork, ) } diff --git a/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderPairsTest.kt b/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderPairsTest.kt index c1f52f0e5d..ef0ac3d90e 100644 --- a/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderPairsTest.kt +++ b/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderPairsTest.kt @@ -25,7 +25,7 @@ internal class StateBuilderPairsTest { private val isBalanceHiddenProvider: Provider = mockk() private val appCurrencyProvider: Provider = mockk() private val isAccountsModeProvider: Provider = mockk() - private val iGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork = mockk() + private val isGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork = mockk() private lateinit var sut: StateBuilder @@ -52,7 +52,7 @@ internal class StateBuilderPairsTest { isBalanceHiddenProvider = isBalanceHiddenProvider, appCurrencyProvider = appCurrencyProvider, isAccountsModeProvider = isAccountsModeProvider, - iGaslessFeeSupportedForNetwork = iGaslessFeeSupportedForNetwork, + isGaslessFeeSupportedForNetwork = isGaslessFeeSupportedForNetwork, ) } diff --git a/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderQuotesTest.kt b/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderQuotesTest.kt index e335298820..0302eebdfc 100644 --- a/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderQuotesTest.kt +++ b/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderQuotesTest.kt @@ -2,7 +2,6 @@ package com.tangem.feature.swap import com.google.common.truth.Truth.assertThat import com.tangem.domain.appcurrency.model.AppCurrency -import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.swap.models.SwapCurrencyStatus @@ -14,12 +13,10 @@ import com.tangem.feature.swap.domain.models.ui.* import com.tangem.feature.swap.models.* import com.tangem.feature.swap.models.states.FeeItemState import com.tangem.feature.swap.models.states.ProviderState -import com.tangem.feature.swap.models.states.SwapNotificationUM import com.tangem.feature.swap.ui.StateBuilder import com.tangem.utils.Provider import io.mockk.every import io.mockk.mockk -import kotlinx.collections.immutable.persistentListOf import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test @@ -31,7 +28,7 @@ internal class StateBuilderQuotesTest { private val isBalanceHiddenProvider: Provider = mockk() private val appCurrencyProvider: Provider = mockk() private val isAccountsModeProvider: Provider = mockk() - private val iGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork = mockk() + private val isGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork = mockk() private lateinit var sut: StateBuilder @@ -52,14 +49,14 @@ internal class StateBuilderQuotesTest { every { isBalanceHiddenProvider() } returns false every { appCurrencyProvider() } returns AppCurrency.Default every { isAccountsModeProvider() } returns false - every { iGaslessFeeSupportedForNetwork(any()) } returns false + every { isGaslessFeeSupportedForNetwork(any()) } returns false sut = StateBuilder( actions = actions, isBalanceHiddenProvider = isBalanceHiddenProvider, appCurrencyProvider = appCurrencyProvider, isAccountsModeProvider = isAccountsModeProvider, - iGaslessFeeSupportedForNetwork = iGaslessFeeSupportedForNetwork, + isGaslessFeeSupportedForNetwork = isGaslessFeeSupportedForNetwork, ) } diff --git a/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderSwapDataTest.kt b/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderSwapDataTest.kt index ed55977ec8..a37096e697 100644 --- a/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderSwapDataTest.kt +++ b/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderSwapDataTest.kt @@ -4,13 +4,11 @@ import com.google.common.truth.Truth.assertThat import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId -import com.tangem.domain.swap.models.SwapCurrencyStatus import com.tangem.domain.transaction.usecase.gasless.IsGaslessFeeSupportedForNetwork import com.tangem.feature.swap.domain.models.domain.* import com.tangem.feature.swap.domain.models.ui.* import com.tangem.feature.swap.model.SwapProcessDataState import com.tangem.feature.swap.models.* -import com.tangem.feature.swap.models.states.FeeItemState import com.tangem.feature.swap.models.states.ProviderState import com.tangem.feature.swap.models.states.SwapNotificationUM import com.tangem.feature.swap.ui.StateBuilder @@ -30,7 +28,7 @@ internal class StateBuilderSwapDataTest { private val isBalanceHiddenProvider: Provider = mockk() private val appCurrencyProvider: Provider = mockk() private val isAccountsModeProvider: Provider = mockk() - private val iGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork = mockk() + private val isGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork = mockk() private lateinit var sut: StateBuilder @@ -51,14 +49,14 @@ internal class StateBuilderSwapDataTest { every { isBalanceHiddenProvider() } returns false every { appCurrencyProvider() } returns AppCurrency.Default every { isAccountsModeProvider() } returns false - every { iGaslessFeeSupportedForNetwork(any()) } returns false + every { isGaslessFeeSupportedForNetwork(any()) } returns false sut = StateBuilder( actions = actions, isBalanceHiddenProvider = isBalanceHiddenProvider, appCurrencyProvider = appCurrencyProvider, isAccountsModeProvider = isAccountsModeProvider, - iGaslessFeeSupportedForNetwork = iGaslessFeeSupportedForNetwork, + isGaslessFeeSupportedForNetwork = isGaslessFeeSupportedForNetwork, ) }