From fb53c32a6a5abdc92a6d4dc46d1a47907cc2a7fd Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 28 Aug 2025 20:56:12 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../converters/AmountStateConverter.kt | 9 +++++++-- .../field/AmountBoundaryUpdateTransformer.kt | 6 ++++-- .../v2/send/confirm/SendConfirmComponent.kt | 1 + .../v2/send/confirm/model/SendConfirmModel.kt | 16 +++++++++++++++ .../amount/SendAmountComponentParams.kt | 4 +++- .../amount/model/SendAmountModel.kt | 17 ++++++++++++++++ .../v2/impl/amount/model/SwapAmountModel.kt | 20 +++++++++++++++++++ .../converter/SwapAmountFieldConverter.kt | 1 + 8 files changed, 69 insertions(+), 5 deletions(-) diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt index 23a9482b9e..8212806067 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt @@ -13,6 +13,7 @@ import com.tangem.core.ui.extensions.combinedReference import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.extensions.wrappedList +import com.tangem.core.ui.extensions.orMaskWithStars import com.tangem.core.ui.format.bigdecimal.crypto import com.tangem.core.ui.format.bigdecimal.fiat import com.tangem.core.ui.format.bigdecimal.format @@ -97,7 +98,9 @@ class AmountStateConverter( * @property maxEnterAmount max enter amount data * @property cryptoCurrencyStatus current cryptocurrency status * @property iconStateConverter currency icon converter + * @property isBalanceHidden is balance hidden status */ +@Suppress("LongParameterList") class AmountStateConverterV2( private val clickIntents: AmountScreenClickIntents, private val appCurrency: AppCurrency, @@ -105,6 +108,7 @@ class AmountStateConverterV2( private val maxEnterAmount: EnterAmountBoundary, private val iconStateConverter: CryptoCurrencyToIconStateConverter, private val isRedesignEnabled: Boolean, + private val isBalanceHidden: Boolean, ) : Converter { private val amountFieldConverter by lazy(LazyThreadSafetyMode.NONE) { @@ -133,11 +137,12 @@ class AmountStateConverterV2( stringReference(crypto), stringReference(" $DOT "), stringReference(fiat), - ) + ).orMaskWithStars(isBalanceHidden) } else { resourceReference(R.string.common_crypto_fiat_format, wrappedList(crypto, fiat)) + .orMaskWithStars(isBalanceHidden) }, - availableBalanceShort = stringReference(crypto), + availableBalanceShort = stringReference(crypto).orMaskWithStars(isBalanceHidden), tokenName = stringReference(cryptoCurrencyStatus.currency.name), tokenIconState = iconStateConverter.convert(cryptoCurrencyStatus.currency), amountTextField = amountFieldConverter.convert(value.value), diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountBoundaryUpdateTransformer.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountBoundaryUpdateTransformer.kt index 7385fa9542..9639c7f781 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountBoundaryUpdateTransformer.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountBoundaryUpdateTransformer.kt @@ -7,6 +7,7 @@ import com.tangem.core.ui.extensions.combinedReference import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.extensions.wrappedList +import com.tangem.core.ui.extensions.orMaskWithStars import com.tangem.core.ui.format.bigdecimal.crypto import com.tangem.core.ui.format.bigdecimal.fiat import com.tangem.core.ui.format.bigdecimal.format @@ -28,6 +29,7 @@ class AmountBoundaryUpdateTransformer( private val maxEnterAmount: EnterAmountBoundary, private val appCurrency: AppCurrency, private val isRedesignEnabled: Boolean, + private val isBalanceHidden: Boolean, ) : Transformer { override fun transform(prevState: AmountState): AmountState { @@ -47,8 +49,8 @@ class AmountBoundaryUpdateTransformer( } return prevState.copy( - availableBalance = availableBalance, - availableBalanceShort = stringReference(crypto), + availableBalance = availableBalance.orMaskWithStars(isBalanceHidden), + availableBalanceShort = stringReference(crypto).orMaskWithStars(isBalanceHidden), ) } } \ No newline at end of file diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/SendConfirmComponent.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/SendConfirmComponent.kt index a59c2345b7..cd417bc2f5 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/SendConfirmComponent.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/SendConfirmComponent.kt @@ -72,6 +72,7 @@ internal class SendConfirmComponent( userWalletId = params.userWallet.walletId, cryptoCurrency = params.cryptoCurrencyStatus.currency, cryptoCurrencyStatusFlow = params.cryptoCurrencyStatusFlow, + isBalanceHidingFlow = params.isBalanceHidingFlow, ), onResult = model::onAmountResult, onClick = model::showEditAmount, diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt index 284f09ebbf..5fcc8c9505 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt @@ -28,6 +28,7 @@ import com.tangem.domain.feedback.models.FeedbackEmailType import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.requireColdWallet +import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase import com.tangem.domain.settings.IsSendTapHelpEnabledUseCase import com.tangem.domain.settings.NeverShowTapHelpUseCase import com.tangem.domain.tokens.AddCryptoCurrenciesUseCase @@ -105,6 +106,7 @@ internal class SendConfirmModel @Inject constructor( private val feeSelectorReloadTrigger: FeeSelectorReloadTrigger, private val feeReloadTrigger: SendFeeReloadTrigger, private val sendAmountReduceTrigger: SendAmountReduceTrigger, + private val getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase, sendBalanceUpdaterFactory: SendBalanceUpdater.Factory, ) : Model(), SendConfirmClickIntents, FeeSelectorModelCallback, SendNotificationsComponent.ModelCallback { @@ -121,6 +123,9 @@ internal class SendConfirmModel @Inject constructor( private val _uiState = MutableStateFlow(params.state) val uiState = _uiState.asStateFlow() + val isBalanceHiddenFlow: StateFlow + field = MutableStateFlow(false) + private val amountState get() = uiState.value.amountUM as? AmountState.Data private val destinationUM @@ -164,6 +169,7 @@ internal class SendConfirmModel @Inject constructor( subscribeOnNotificationsUpdateTrigger() subscribeOnCheckFeeResultUpdates() initialState() + subscribeOnBalanceHidden() } fun updateState(state: SendUM) { @@ -519,6 +525,16 @@ internal class SendConfirmModel @Inject constructor( }.launchIn(modelScope) } + private fun subscribeOnBalanceHidden() { + getBalanceHidingSettingsUseCase() + .conflate() + .distinctUntilChanged() + .onEach { balanceHidingSettings -> + isBalanceHiddenFlow.update { balanceHidingSettings.isBalanceHidden } + } + .launchIn(modelScope) + } + private fun updateConfirmNotifications() { modelScope.launch { notificationsUpdateTrigger.triggerUpdate( diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountComponentParams.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountComponentParams.kt index 925d3780df..14a25b17b7 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountComponentParams.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountComponentParams.kt @@ -21,6 +21,7 @@ internal sealed class SendAmountComponentParams { abstract val isRedesignEnabled: Boolean abstract val cryptoCurrency: CryptoCurrency abstract val cryptoCurrencyStatusFlow: StateFlow + abstract val isBalanceHidingFlow: StateFlow data class AmountParams( override val state: AmountState, @@ -31,9 +32,9 @@ internal sealed class SendAmountComponentParams { override val isRedesignEnabled: Boolean, override val cryptoCurrency: CryptoCurrency, override val cryptoCurrencyStatusFlow: StateFlow, + override val isBalanceHidingFlow: StateFlow, val callback: ModelCallback, val currentRoute: StateFlow, - val isBalanceHidingFlow: StateFlow, ) : SendAmountComponentParams() data class AmountBlockParams( @@ -45,6 +46,7 @@ internal sealed class SendAmountComponentParams { override val isRedesignEnabled: Boolean, override val cryptoCurrency: CryptoCurrency, override val cryptoCurrencyStatusFlow: StateFlow, + override val isBalanceHidingFlow: StateFlow, val userWallet: UserWallet, val blockClickEnableFlow: StateFlow, ) : SendAmountComponentParams() diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt index f1079ab4ee..5d8475ae50 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt @@ -102,6 +102,7 @@ internal class SendAmountModel @Inject constructor( subscribeOnAmountReduceToTriggerUpdates() subscribeOnAmountIgnoreReduceTriggerUpdates() subscribeOnAmountUpdateTriggerUpdates() + subscribeOnBalanceHiddenUpdates() } private fun initAppCurrency() { @@ -119,6 +120,20 @@ internal class SendAmountModel @Inject constructor( }.launchIn(modelScope) } + private fun subscribeOnBalanceHiddenUpdates() { + params.isBalanceHidingFlow.onEach { isBalanceHidden -> + _uiState.update( + AmountBoundaryUpdateTransformer( + cryptoCurrencyStatus = cryptoCurrencyStatus, + maxEnterAmount = maxAmountBoundary, + appCurrency = appCurrency, + isRedesignEnabled = sendFeatureToggles.isSendRedesignEnabled, + isBalanceHidden = params.isBalanceHidingFlow.value, + ), + ) + }.launchIn(modelScope) + } + private fun subscribeOnCryptoCurrencyStatusFlow() { params.cryptoCurrencyStatusFlow .onEach { newCryptoCurrencyStatus -> @@ -150,6 +165,7 @@ internal class SendAmountModel @Inject constructor( maxEnterAmount = maxAmountBoundary, appCurrency = appCurrency, isRedesignEnabled = sendFeatureToggles.isSendRedesignEnabled, + isBalanceHidden = params.isBalanceHidingFlow.value, ), ) } else { @@ -168,6 +184,7 @@ internal class SendAmountModel @Inject constructor( maxEnterAmount = maxAmountBoundary, iconStateConverter = CryptoCurrencyToIconStateConverter(), isRedesignEnabled = sendFeatureToggles.isSendRedesignEnabled, + isBalanceHidden = params.isBalanceHidingFlow.value, ).convert( AmountParameters( title = resourceReference( diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt index 616b5a1166..da04d1cf95 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt @@ -131,6 +131,7 @@ internal class SwapAmountModel @Inject constructor( subscribeOnAmountReduceByTriggerUpdates() subscribeOnAmountIgnoreReduceTriggerUpdates() subscribeOnReloadQuotesTriggerUpdates() + subscribeOnBalanceHiddenUpdates() } fun onStart() { @@ -322,6 +323,25 @@ internal class SwapAmountModel @Inject constructor( ) } + private fun subscribeOnBalanceHiddenUpdates() { + params.isBalanceHidingFlow.onEach { + val primaryCryptoCurrencyStatus = (uiState.value as? SwapAmountUM.Content)?.primaryCryptoCurrencyStatus + if (primaryCryptoCurrencyStatus != null) { + uiState.transformerUpdate( + SwapAmountPrimaryReadyStateTransformer( + userWallet = userWallet, + primaryCryptoCurrencyStatus = primaryCryptoCurrencyStatus, + appCurrency = appCurrency, + swapDirection = swapDirection, + clickIntents = this, + isBalanceHidden = params.isBalanceHidingFlow.value, + showBestRateAnimation = showBestRateAnimation, + ), + ) + } + }.launchIn(modelScope) + } + private fun confirmSendWithSwapClose() { val amountParams = params as? SwapAmountComponentParams.AmountParams ?: return val amountFieldData = uiState.value.primaryAmount.amountField as? AmountState.Data diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/converter/SwapAmountFieldConverter.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/converter/SwapAmountFieldConverter.kt index fd83068f8f..f1d7e06cb3 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/converter/SwapAmountFieldConverter.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/converter/SwapAmountFieldConverter.kt @@ -48,6 +48,7 @@ internal class SwapAmountFieldConverter( maxEnterAmount = maxEnterAmountConverter.convert(cryptoCurrencyStatus), iconStateConverter = iconStateConverter, isRedesignEnabled = true, + isBalanceHidden = isBalanceHidden, ).convert( AmountParameters( title = combinedReference(