From 173c414e50d6ffbe4833522709866b443e2afb32 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 1 Jul 2026 11:46:25 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../kotlin/com/tangem/common/BaseTestCase.kt | 4 -- .../configs/feature_toggles_config.json | 16 ----- .../FeatureTogglesNamingConventionTest.kt | 1 - .../swap/v2/api/SwapFeatureToggles.kt | 1 - .../swap/v2/impl/DefaultSwapFeatureToggles.kt | 3 - .../model/SwapChooseProviderModel.kt | 4 +- .../features/swap/SwapFeatureToggles.kt | 4 -- .../swap/domain/GetSwapUiModeUseCase.kt | 3 - .../swap/domain/di/SwapDomainModule.kt | 3 - .../swap/domain/GetSwapUiModeUseCaseTest.kt | 36 ++--------- .../feature/swap/DefaultSwapFeatureToggles.kt | 19 ------ .../tangem/feature/swap/model/SwapModel.kt | 1 - .../feature/swap/models/SwapStateHolder.kt | 1 - .../tangem/feature/swap/ui/StateBuilder.kt | 12 ++-- .../com/tangem/feature/swap/ui/SwapScreen.kt | 64 +++++++++---------- .../swap/StateBuilderInitialStateTest.kt | 3 - .../feature/swap/StateBuilderPairsTest.kt | 27 +------- .../swap/StateBuilderSwapButtonTest.kt | 3 - .../swap/StateBuilderUpdateSwapAmountTest.kt | 3 - .../tokendetails/model/TokenDetailsModel.kt | 3 - 20 files changed, 43 insertions(+), 168 deletions(-) diff --git a/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt b/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt index 6b62173e97..53c2988bc6 100644 --- a/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt +++ b/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt @@ -196,13 +196,9 @@ abstract class BaseTestCase : TestCase( "DYNAMIC_ADDRESSES_ENABLED" to true, "SOLANA_TX_HISTORY_ENABLED" to true, "SOLANA_SCALED_UI_AMOUNT_ENABLED" to true, - "SWAP_AB_ENABLED" to true, "AND_15310_ADD_FUNDS_STAGE1" to true, - "AND_15009_SWAP_PROVIDER_FILTER_ENABLED" to true, "AND_15101_TANGEM_PAY_HOT_WALLET_ONBOARDING" to true, "AND_15402_ADI_MAIN_SCREEN_DEFAULT_ENABLED" to true, - "AND_15103_SWAP_RATE_EXPERIENCE_ENABLED" to true, - "AND_15122_SWAP_PREDEFINED_BUTTONS_ENABLED" to true, "TWI_1512_HIDE_STORIES_FOR_REFERRAL_ENABLED" to true, // 5.40 "TWI_1377_MANAGE_FUNDS" to true, 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 f84c6e5813..51f10c5b8c 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 @@ -63,10 +63,6 @@ "name": "AND_15120_SWAP_INTEGRATED_APPROVE", "version": "6.0" }, - { - "name": "SWAP_AB_ENABLED", - "version": "5.39" - }, { "name": "TWI_1403_PUSH_NOTIFICATION_SETTINGS_ENABLED", "version": "undefined" @@ -83,10 +79,6 @@ "name": "TWI_1377_MANAGE_FUNDS", "version": "6.0" }, - { - "name": "AND_15009_SWAP_PROVIDER_FILTER_ENABLED", - "version": "5.39" - }, { "name": "AND_15101_TANGEM_PAY_HOT_WALLET_ONBOARDING", "version": "5.39" @@ -95,14 +87,6 @@ "name": "AND_15402_ADI_MAIN_SCREEN_DEFAULT_ENABLED", "version": "5.39" }, - { - "name": "AND_15103_SWAP_RATE_EXPERIENCE_ENABLED", - "version": "5.39" - }, - { - "name": "AND_15122_SWAP_PREDEFINED_BUTTONS_ENABLED", - "version": "5.39" - }, { "name": "TWI_1512_HIDE_STORIES_FOR_REFERRAL_ENABLED", "version": "5.39" diff --git a/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/feature/FeatureTogglesNamingConventionTest.kt b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/feature/FeatureTogglesNamingConventionTest.kt index 6447ddacc1..cf06016949 100644 --- a/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/feature/FeatureTogglesNamingConventionTest.kt +++ b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/feature/FeatureTogglesNamingConventionTest.kt @@ -46,7 +46,6 @@ internal class FeatureTogglesNamingConventionTest { "NEW_CARD_SCANNING_ENABLED", "SOLANA_SCALED_UI_AMOUNT_ENABLED", "SOLANA_TX_HISTORY_ENABLED", - "SWAP_AB_ENABLED", "VIRTUAL_ACCOUNTS_ENABLED", "VISA_ONBOARDING_ENABLED", "WALLET_CONNECT_BITCOIN_ENABLED", diff --git a/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/SwapFeatureToggles.kt b/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/SwapFeatureToggles.kt index 7c26a78310..56935abf0c 100644 --- a/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/SwapFeatureToggles.kt +++ b/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/SwapFeatureToggles.kt @@ -1,6 +1,5 @@ package com.tangem.features.swap.v2.api interface SwapFeatureToggles { - val isSwapProviderFilterEnabled: Boolean val isHighFeeWarningEnabled: Boolean } \ No newline at end of file diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/DefaultSwapFeatureToggles.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/DefaultSwapFeatureToggles.kt index 4104bbaab3..8d6e0a05ac 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/DefaultSwapFeatureToggles.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/DefaultSwapFeatureToggles.kt @@ -8,9 +8,6 @@ import javax.inject.Inject internal class DefaultSwapFeatureToggles @Inject constructor( private val featureToggles: FeatureTogglesManager, ) : SwapFeatureToggles { - override val isSwapProviderFilterEnabled: Boolean = - featureToggles.isFeatureEnabled(FeatureToggles.AND_15009_SWAP_PROVIDER_FILTER_ENABLED) - override val isHighFeeWarningEnabled: Boolean = featureToggles.isFeatureEnabled(FeatureToggles.TWI_1367_HIGH_FEE_WARNING_ENABLED) } \ No newline at end of file diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/chooseprovider/model/SwapChooseProviderModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/chooseprovider/model/SwapChooseProviderModel.kt index c0b3b40f29..e5c4970eab 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/chooseprovider/model/SwapChooseProviderModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/chooseprovider/model/SwapChooseProviderModel.kt @@ -9,7 +9,6 @@ import com.tangem.domain.express.models.ExpressError import com.tangem.domain.express.models.ProviderFilterType import com.tangem.domain.express.models.ExpressProviderType import com.tangem.domain.settings.usercountry.models.needApplyFCARestrictions -import com.tangem.features.swap.v2.api.SwapFeatureToggles import com.tangem.features.swap.v2.impl.chooseprovider.SwapChooseProviderComponent import com.tangem.features.swap.v2.impl.chooseprovider.entity.SwapChooseProviderBottomSheetContent import com.tangem.features.swap.v2.impl.chooseprovider.model.converter.SwapProviderListItemConverter @@ -27,7 +26,6 @@ import javax.inject.Inject internal class SwapChooseProviderModel @Inject constructor( paramsContainer: ParamsContainer, override val dispatchers: CoroutineDispatcherProvider, - private val swapFeatureToggles: SwapFeatureToggles, private val analyticsEventHandler: AnalyticsEventHandler, ) : Model() { @@ -80,7 +78,7 @@ internal class SwapChooseProviderModel @Inject constructor( val hasDex = displayableProviders.any { it.provider?.type == ExpressProviderType.DEX || it.provider?.type == ExpressProviderType.DEX_BRIDGE } - val availableFilters = if (swapFeatureToggles.isSwapProviderFilterEnabled && hasCex && hasDex) { + val availableFilters = if (hasCex && hasDex) { persistentListOf(ProviderFilterType.ALL, ProviderFilterType.CEX, ProviderFilterType.DEX) } else { persistentListOf() 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 033fbb8f15..0b58b199fe 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 @@ -4,10 +4,6 @@ interface SwapFeatureToggles { val isYieldSwapEnabled: Boolean val isSwapSwitchToTransferEnabled: Boolean val isSwapIntegratedApproveEnabled: Boolean - val isSwapAbEnabled: Boolean - val isSwapProviderFilterEnabled: Boolean - val isSwapRateExperienceEnabled: Boolean - val isSwapPredefinedButtonsEnabled: Boolean val isExpressShareButtonEnabled: Boolean val isSwapBestDexRateEnabled: Boolean val isHighFeeWarningEnabled: Boolean diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/GetSwapUiModeUseCase.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/GetSwapUiModeUseCase.kt index 61f2bbcb37..316bb872a2 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/GetSwapUiModeUseCase.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/GetSwapUiModeUseCase.kt @@ -3,17 +3,14 @@ package com.tangem.feature.swap.domain import com.tangem.core.abtests.manager.ABTestsManager import com.tangem.feature.swap.domain.api.SwapRepository import com.tangem.feature.swap.domain.models.domain.SwapUIMode -import com.tangem.features.swap.SwapFeatureToggles import com.tangem.utils.logging.TangemLogger class GetSwapUiModeUseCase( - private val swapFeatureToggles: SwapFeatureToggles, private val swapRepository: SwapRepository, private val abTestsManager: ABTestsManager, ) { suspend operator fun invoke(): SwapUIMode { - if (!swapFeatureToggles.isSwapAbEnabled) return SwapUIMode.Detailed swapRepository.getStoredSwapUiMode()?.let { return it } val variant = abTestsManager.getValue(KEY_SWAP_FORM_VARIANT, SwapUIMode.Detailed.key) TangemLogger.d("Get $variant Swap AB variant from Amplitude as default value") diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/di/SwapDomainModule.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/di/SwapDomainModule.kt index 3bcd2fdcb4..454592535e 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/di/SwapDomainModule.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/di/SwapDomainModule.kt @@ -18,7 +18,6 @@ import com.tangem.feature.swap.domain.fee.DexSwapFeeCalculator import com.tangem.feature.swap.domain.fee.PatchEthGasLimitForSwap import com.tangem.feature.swap.domain.transfer.SwapTransferInteractor import com.tangem.feature.swap.domain.transfer.SwapTransferInteractorImpl -import com.tangem.features.swap.SwapFeatureToggles import dagger.Binds import dagger.Module import dagger.Provides @@ -39,11 +38,9 @@ internal class SwapDomainModule { @Provides @Singleton fun provideGetSwapUiModeUseCase( - swapFeatureToggles: SwapFeatureToggles, swapRepository: SwapRepository, abTestsManager: ABTestsManager, ): GetSwapUiModeUseCase = GetSwapUiModeUseCase( - swapFeatureToggles = swapFeatureToggles, swapRepository = swapRepository, abTestsManager = abTestsManager, ) diff --git a/features/swap/domain/src/test/kotlin/com/tangem/feature/swap/domain/GetSwapUiModeUseCaseTest.kt b/features/swap/domain/src/test/kotlin/com/tangem/feature/swap/domain/GetSwapUiModeUseCaseTest.kt index 1e3d6a6c1c..391f775b41 100644 --- a/features/swap/domain/src/test/kotlin/com/tangem/feature/swap/domain/GetSwapUiModeUseCaseTest.kt +++ b/features/swap/domain/src/test/kotlin/com/tangem/feature/swap/domain/GetSwapUiModeUseCaseTest.kt @@ -4,7 +4,6 @@ import com.google.common.truth.Truth.assertThat import com.tangem.core.abtests.manager.ABTestsManager import com.tangem.feature.swap.domain.api.SwapRepository import com.tangem.feature.swap.domain.models.domain.SwapUIMode -import com.tangem.features.swap.SwapFeatureToggles import io.mockk.coEvery import io.mockk.coVerify import io.mockk.mockk @@ -13,32 +12,17 @@ import org.junit.jupiter.api.Test internal class GetSwapUiModeUseCaseTest { - private val swapFeatureToggles: SwapFeatureToggles = mockk() private val swapRepository: SwapRepository = mockk() private val abTestsManager: ABTestsManager = mockk() private val sut = GetSwapUiModeUseCase( - swapFeatureToggles = swapFeatureToggles, swapRepository = swapRepository, abTestsManager = abTestsManager, ) @Test - fun `GIVEN feature toggle is disabled WHEN invoke THEN returns Detailed without reading repository or AB tests`() = + fun `GIVEN repository has Detailed WHEN invoke THEN returns Detailed without reading AB tests`() = runTest { - coEvery { swapFeatureToggles.isSwapAbEnabled } returns false - - val actual = sut.invoke() - - assertThat(actual).isEqualTo(SwapUIMode.Detailed) - coVerify(exactly = 0) { swapRepository.getStoredSwapUiMode() } - coVerify(exactly = 0) { abTestsManager.getValue(any(), any()) } - } - - @Test - fun `GIVEN toggle enabled and repository has Detailed WHEN invoke THEN returns Detailed without reading AB tests`() = - runTest { - coEvery { swapFeatureToggles.isSwapAbEnabled } returns true coEvery { swapRepository.getStoredSwapUiMode() } returns SwapUIMode.Detailed val actual = sut.invoke() @@ -48,9 +32,8 @@ internal class GetSwapUiModeUseCaseTest { } @Test - fun `GIVEN toggle enabled and repository has Simple WHEN invoke THEN returns Simple without reading AB tests`() = + fun `GIVEN repository has Simple WHEN invoke THEN returns Simple without reading AB tests`() = runTest { - coEvery { swapFeatureToggles.isSwapAbEnabled } returns true coEvery { swapRepository.getStoredSwapUiMode() } returns SwapUIMode.Simple val actual = sut.invoke() @@ -60,9 +43,8 @@ internal class GetSwapUiModeUseCaseTest { } @Test - fun `GIVEN toggle enabled and repository empty and AB returns detailed WHEN invoke THEN returns Detailed`() = + fun `GIVEN repository empty and AB returns detailed WHEN invoke THEN returns Detailed`() = runTest { - coEvery { swapFeatureToggles.isSwapAbEnabled } returns true coEvery { swapRepository.getStoredSwapUiMode() } returns null coEvery { abTestsManager.getValue("swap_form_variant", "detailed") } returns "detailed" @@ -73,8 +55,7 @@ internal class GetSwapUiModeUseCaseTest { } @Test - fun `GIVEN toggle enabled and repository empty and AB returns simple WHEN invoke THEN returns Simple`() = runTest { - coEvery { swapFeatureToggles.isSwapAbEnabled } returns true + fun `GIVEN repository empty and AB returns simple WHEN invoke THEN returns Simple`() = runTest { coEvery { swapRepository.getStoredSwapUiMode() } returns null coEvery { abTestsManager.getValue("swap_form_variant", "detailed") } returns "simple" @@ -85,9 +66,8 @@ internal class GetSwapUiModeUseCaseTest { } @Test - fun `GIVEN toggle enabled and repository empty and AB returns SIMPLE uppercase WHEN invoke THEN returns Simple`() = + fun `GIVEN repository empty and AB returns SIMPLE uppercase WHEN invoke THEN returns Simple`() = runTest { - coEvery { swapFeatureToggles.isSwapAbEnabled } returns true coEvery { swapRepository.getStoredSwapUiMode() } returns null coEvery { abTestsManager.getValue("swap_form_variant", "detailed") } returns "SIMPLE" @@ -97,9 +77,8 @@ internal class GetSwapUiModeUseCaseTest { } @Test - fun `GIVEN toggle enabled and repository empty and AB returns unknown variant WHEN invoke THEN returns Detailed`() = + fun `GIVEN repository empty and AB returns unknown variant WHEN invoke THEN returns Detailed`() = runTest { - coEvery { swapFeatureToggles.isSwapAbEnabled } returns true coEvery { swapRepository.getStoredSwapUiMode() } returns null coEvery { abTestsManager.getValue("swap_form_variant", "detailed") } returns "something_else" @@ -109,9 +88,8 @@ internal class GetSwapUiModeUseCaseTest { } @Test - fun `GIVEN toggle enabled and repository empty and AB returns empty string WHEN invoke THEN returns Detailed`() = + fun `GIVEN repository empty and AB returns empty string WHEN invoke THEN returns Detailed`() = runTest { - coEvery { swapFeatureToggles.isSwapAbEnabled } returns true coEvery { swapRepository.getStoredSwapUiMode() } returns null coEvery { abTestsManager.getValue("swap_form_variant", "detailed") } returns "" 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 41d5567f61..636db910e3 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 @@ -24,25 +24,6 @@ internal class DefaultSwapFeatureToggles @Inject constructor( toggle = FeatureToggles.AND_15120_SWAP_INTEGRATED_APPROVE, ) - override val isSwapAbEnabled: Boolean - get() = featureTogglesManager.isFeatureEnabled( - toggle = FeatureToggles.SWAP_AB_ENABLED, - ) - - override val isSwapProviderFilterEnabled: Boolean - get() = featureTogglesManager.isFeatureEnabled( - toggle = FeatureToggles.AND_15009_SWAP_PROVIDER_FILTER_ENABLED, - ) - - override val isSwapRateExperienceEnabled: Boolean - get() = featureTogglesManager.isFeatureEnabled( - toggle = FeatureToggles.AND_15103_SWAP_RATE_EXPERIENCE_ENABLED, - ) - - override val isSwapPredefinedButtonsEnabled: Boolean - get() = featureTogglesManager.isFeatureEnabled( - toggle = FeatureToggles.AND_15122_SWAP_PREDEFINED_BUTTONS_ENABLED, - ) override val isExpressShareButtonEnabled: Boolean get() = featureTogglesManager.isFeatureEnabled( toggle = FeatureToggles.AND_15489_EXPRESS_SHARE_BUTTON_ENABLED, 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 b4f49fcafb..1411b01dcf 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 @@ -210,7 +210,6 @@ internal class SwapModel @Inject constructor( appCurrencyProvider = Provider(selectedAppCurrencyFlow::value), isAccountsModeProvider = Provider { isAccountsMode }, isGaslessFeeSupportedForNetwork = isGaslessFeeSupportedForNetwork, - swapFeatureToggles = swapFeatureToggles, appRouter = appRouter, ) diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt index ad200c6f48..399818cd42 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt @@ -36,7 +36,6 @@ internal data class SwapStateHolder( val predefinedButtons: ImmutableList = persistentListOf(), val tosState: TosState? = null, val swapUIMode: SwapUIMode = SwapUIMode.Detailed, - val shouldShowAbMenu: Boolean = false, val transferFooter: TextReference? = null, 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 fc355d82e7..7eac37851c 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 @@ -52,7 +52,6 @@ import com.tangem.feature.swap.models.states.* import com.tangem.feature.swap.presentation.R import com.tangem.feature.swap.utils.formatToUIRepresentation import com.tangem.features.send.api.subcomponents.feeSelector.entity.FeeSelectorUM -import com.tangem.features.swap.SwapFeatureToggles import com.tangem.utils.Provider import com.tangem.utils.StringsSigns import com.tangem.utils.StringsSigns.DASH_SIGN @@ -73,7 +72,6 @@ internal class StateBuilder( private val appCurrencyProvider: Provider, private val isAccountsModeProvider: Provider, private val isGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork, - private val swapFeatureToggles: SwapFeatureToggles, private val appRouter: AppRouter, ) { private val iconStateConverter by lazy(::CryptoCurrencyToIconStateConverter) @@ -124,7 +122,6 @@ internal class StateBuilder( onSwapUIModeChange = actions.onSwapUIModeChange, onSwapTypeMenuOpened = actions.onSwapTypeMenuOpened, onTronBannerShown = actions.onTronBannerShown, - shouldShowAbMenu = swapFeatureToggles.isSwapAbEnabled, ) } @@ -737,16 +734,15 @@ internal class StateBuilder( /** * Builds the predefined percent buttons once per state update (off the composition path). - * The row is gated by the feature toggle; the MAX button is included only when - * [shouldShowMaxAmount] is `true` (e.g. it is dropped for a native coin swapped within the same - * network, where spending the full balance would leave nothing for the network fee). + * The MAX button is included only when [shouldShowMaxAmount] is `true` (e.g. it is dropped for a + * native coin swapped within the same network, where spending the full balance would leave nothing + * for the network fee). */ private fun createPredefinedButtons( fromToken: CryptoCurrency?, toCurrency: CryptoCurrency?, isTransferMode: Boolean = false, ): ImmutableList { - if (!swapFeatureToggles.isSwapPredefinedButtonsEnabled) return persistentListOf() val shouldShowMaxAmount = shouldShowMaxAmount(fromToken, toCurrency, isTransferMode) return PredefinedPercentAmount.entries .filter { it != PredefinedPercentAmount.MAX || shouldShowMaxAmount } @@ -1259,7 +1255,7 @@ internal class StateBuilder( providerType == ExchangeProviderType.DEX.providerName || providerType == ExchangeProviderType.DEX_BRIDGE.providerName } - val availableFilters = if (swapFeatureToggles.isSwapProviderFilterEnabled && hasCex && hasDex) { + val availableFilters = if (hasCex && hasDex) { persistentListOf(ProviderFilterType.ALL, ProviderFilterType.CEX, ProviderFilterType.DEX) } else { persistentListOf() diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt index bef9ff8cf6..866456ee72 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt @@ -85,44 +85,38 @@ private fun SwapTopBar(stateHolder: SwapStateHolder) { AppBarWithBackButtonAndIcon( text = stringResourceSafe(stateHolder.titleId), backIconRes = R.drawable.ic_close_24, - iconRes = if (stateHolder.shouldShowAbMenu) R.drawable.ic_more_vertical_24 else null, - onIconClick = if (stateHolder.shouldShowAbMenu) { - { - stateHolder.onSwapTypeMenuOpened() - shouldShowModeMenu = true - } - } else { - null + iconRes = R.drawable.ic_more_vertical_24, + onIconClick = { + stateHolder.onSwapTypeMenuOpened() + shouldShowModeMenu = true }, onBackClick = stateHolder.onBackClicked, ) - if (stateHolder.shouldShowAbMenu) { - Box(modifier = Modifier.align(Alignment.TopEnd)) { - TangemDropdownMenu( - expanded = shouldShowModeMenu, - modifier = Modifier.background(TangemTheme.colors.background.primary), - offset = DpOffset(x = TangemTheme.dimens.spacing20, y = 44.dp), - onDismissRequest = { shouldShowModeMenu = false }, - content = { - SwapUiModeMenuItem( - title = stringResourceSafe(R.string.swap_simple_mode), - isSelected = stateHolder.swapUIMode == SwapUIMode.Simple, - onClick = { - shouldShowModeMenu = false - stateHolder.onSwapUIModeChange(SwapUIMode.Simple) - }, - ) - SwapUiModeMenuItem( - title = stringResourceSafe(R.string.swap_detailed_mode), - isSelected = stateHolder.swapUIMode == SwapUIMode.Detailed, - onClick = { - shouldShowModeMenu = false - stateHolder.onSwapUIModeChange(SwapUIMode.Detailed) - }, - ) - }, - ) - } + Box(modifier = Modifier.align(Alignment.TopEnd)) { + TangemDropdownMenu( + expanded = shouldShowModeMenu, + modifier = Modifier.background(TangemTheme.colors.background.primary), + offset = DpOffset(x = TangemTheme.dimens.spacing20, y = 44.dp), + onDismissRequest = { shouldShowModeMenu = false }, + content = { + SwapUiModeMenuItem( + title = stringResourceSafe(R.string.swap_simple_mode), + isSelected = stateHolder.swapUIMode == SwapUIMode.Simple, + onClick = { + shouldShowModeMenu = false + stateHolder.onSwapUIModeChange(SwapUIMode.Simple) + }, + ) + SwapUiModeMenuItem( + title = stringResourceSafe(R.string.swap_detailed_mode), + isSelected = stateHolder.swapUIMode == SwapUIMode.Detailed, + onClick = { + shouldShowModeMenu = false + stateHolder.onSwapUIModeChange(SwapUIMode.Detailed) + }, + ) + }, + ) } } } 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 daee7b3ac7..cd32585167 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 @@ -18,7 +18,6 @@ import com.tangem.feature.swap.models.* 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.features.swap.SwapFeatureToggles import com.tangem.utils.Provider import io.mockk.every import io.mockk.mockk @@ -33,7 +32,6 @@ internal class StateBuilderInitialStateTest { private val appCurrencyProvider: Provider = mockk() private val isAccountsModeProvider: Provider = mockk() private val isGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork = mockk() - private val swapFeatureToggles: SwapFeatureToggles = mockk(relaxed = true) private val appRouter: AppRouter = mockk() private lateinit var sut: StateBuilder @@ -52,7 +50,6 @@ internal class StateBuilderInitialStateTest { appCurrencyProvider = appCurrencyProvider, isAccountsModeProvider = isAccountsModeProvider, isGaslessFeeSupportedForNetwork = isGaslessFeeSupportedForNetwork, - swapFeatureToggles = swapFeatureToggles, appRouter = appRouter, ) } 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 ca87599216..3412219456 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 @@ -18,7 +18,6 @@ import com.tangem.feature.swap.models.* 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.features.swap.SwapFeatureToggles import com.tangem.utils.Provider import io.mockk.every import io.mockk.mockk @@ -33,7 +32,6 @@ internal class StateBuilderPairsTest { private val appCurrencyProvider: Provider = mockk() private val isAccountsModeProvider: Provider = mockk() private val isGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork = mockk() - private val swapFeatureToggles: SwapFeatureToggles = mockk(relaxed = true) private val appRouter: AppRouter = mockk() private lateinit var sut: StateBuilder @@ -62,7 +60,6 @@ internal class StateBuilderPairsTest { appCurrencyProvider = appCurrencyProvider, isAccountsModeProvider = isAccountsModeProvider, isGaslessFeeSupportedForNetwork = isGaslessFeeSupportedForNetwork, - swapFeatureToggles = swapFeatureToggles, appRouter = appRouter, ) } @@ -394,8 +391,7 @@ internal class StateBuilderPairsTest { inner class PredefinedButtonsVisibility { @Test - fun `GIVEN toggle on and native coin within same network WHEN updateCurrenciesState THEN MAX button is dropped but percents stay`() { - every { swapFeatureToggles.isSwapPredefinedButtonsEnabled } returns true + fun `GIVEN native coin within same network WHEN updateCurrenciesState THEN MAX button is dropped but percents stay`() { val baseState = buildReadyState(coldWallet) val networkId: Network.ID = mockk(relaxed = true) val fromStatus = buildCoinSwapCurrencyStatus(coldWallet, networkId) @@ -420,8 +416,7 @@ internal class StateBuilderPairsTest { } @Test - fun `GIVEN toggle on and non-coin WHEN updateCurrenciesState THEN all percents including MAX are built`() { - every { swapFeatureToggles.isSwapPredefinedButtonsEnabled } returns true + fun `GIVEN non-coin WHEN updateCurrenciesState THEN all percents including MAX are built`() { val baseState = buildReadyState(coldWallet) val fromStatus = buildSwapCurrencyStatus(coldWallet) val toStatus = buildSwapCurrencyStatus(coldWallet) @@ -440,24 +435,6 @@ internal class StateBuilderPairsTest { .inOrder() } - @Test - fun `GIVEN toggle off WHEN updateCurrenciesState THEN no predefined buttons are built`() { - every { swapFeatureToggles.isSwapPredefinedButtonsEnabled } returns false - val baseState = buildReadyState(coldWallet) - val fromStatus = buildSwapCurrencyStatus(coldWallet) - val toStatus = buildSwapCurrencyStatus(coldWallet) - - val result = sut.updateCurrenciesState( - uiStateHolder = baseState, - emptyAmountState = emptyAmountState, - fromSwapCurrencyStatus = fromStatus, - toSwapCurrencyStatus = toStatus, - shouldResetAmount = false, - ) - - assertThat(result.predefinedButtons).isEmpty() - } - @Test fun `WHEN createInitialLoadingState THEN no predefined buttons are built`() { val result = sut.createInitialLoadingState() diff --git a/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderSwapButtonTest.kt b/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderSwapButtonTest.kt index 86ac7453d5..1a424dfe43 100644 --- a/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderSwapButtonTest.kt +++ b/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderSwapButtonTest.kt @@ -25,7 +25,6 @@ import com.tangem.feature.swap.domain.models.ui.* import com.tangem.feature.swap.models.* import com.tangem.feature.swap.models.states.ProviderState import com.tangem.feature.swap.ui.StateBuilder -import com.tangem.features.swap.SwapFeatureToggles import com.tangem.utils.Provider import io.mockk.every import io.mockk.mockk @@ -59,7 +58,6 @@ internal class StateBuilderSwapButtonTest { private val appCurrencyProvider: Provider = mockk() private val isAccountsModeProvider: Provider = mockk() private val isGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork = mockk() - private val swapFeatureToggles: SwapFeatureToggles = mockk(relaxed = true) private val appRouter: AppRouter = mockk() private lateinit var sut: StateBuilder @@ -81,7 +79,6 @@ internal class StateBuilderSwapButtonTest { appCurrencyProvider = appCurrencyProvider, isAccountsModeProvider = isAccountsModeProvider, isGaslessFeeSupportedForNetwork = isGaslessFeeSupportedForNetwork, - swapFeatureToggles = swapFeatureToggles, appRouter = appRouter, ) } diff --git a/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderUpdateSwapAmountTest.kt b/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderUpdateSwapAmountTest.kt index 23d7079e8a..0a74423734 100644 --- a/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderUpdateSwapAmountTest.kt +++ b/features/swap/impl/src/test/java/com/tangem/feature/swap/StateBuilderUpdateSwapAmountTest.kt @@ -17,7 +17,6 @@ import com.tangem.feature.swap.models.SwapStateHolder import com.tangem.feature.swap.models.TransactionCardType import com.tangem.feature.swap.models.UiActions import com.tangem.feature.swap.ui.StateBuilder -import com.tangem.features.swap.SwapFeatureToggles import com.tangem.utils.Provider import io.mockk.every import io.mockk.mockk @@ -34,7 +33,6 @@ internal class StateBuilderUpdateSwapAmountTest { private val appCurrencyProvider: Provider = mockk() private val isAccountsModeProvider: Provider = mockk() private val isGaslessFeeSupportedForNetwork: IsGaslessFeeSupportedForNetwork = mockk() - private val swapFeatureToggles: SwapFeatureToggles = mockk(relaxed = true) private val appRouter: AppRouter = mockk() private val appCurrency = AppCurrency.Default @@ -58,7 +56,6 @@ internal class StateBuilderUpdateSwapAmountTest { appCurrencyProvider = appCurrencyProvider, isAccountsModeProvider = isAccountsModeProvider, isGaslessFeeSupportedForNetwork = isGaslessFeeSupportedForNetwork, - swapFeatureToggles = swapFeatureToggles, appRouter = appRouter, ) } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt index a63ccf6da6..a4d57d472b 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt @@ -21,7 +21,6 @@ import com.tangem.common.ui.bottomsheet.receive.mapToAddressModels import com.tangem.features.rating.RatingComponent import com.tangem.feature.swap.domain.SwapFeedbackUseCase import com.tangem.feature.swap.domain.models.domain.SwapFeedbackParams -import com.tangem.features.swap.SwapFeatureToggles import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.event.OfframpAnalyticsEvent @@ -202,7 +201,6 @@ internal class TokenDetailsModel @Inject constructor( private val designFeatureToggles: DesignFeatureToggles, private val redesignStateController: TokenDetailsStateController, private val swapFeedbackUseCase: SwapFeedbackUseCase, - private val swapFeatureToggles: SwapFeatureToggles, private val quickTopUpBlockFactory: QuickTopUpBlockFactory, private val getFixedTxHistoryItemsUseCase: GetFixedTxHistoryItemsUseCase, private val checkOnrampAvailabilityUseCase: CheckOnrampAvailabilityUseCase, @@ -1182,7 +1180,6 @@ internal class TokenDetailsModel @Inject constructor( txExternalUrl: String, userWalletIdStringValue: String, ) { - if (!swapFeatureToggles.isSwapRateExperienceEnabled) return ratingSlotNavigation.activate( RatingComponent.Params( onLoadRating = {