diff --git a/features/send/impl/build.gradle.kts b/features/send/impl/build.gradle.kts index 95074550ff..b35e632634 100644 --- a/features/send/impl/build.gradle.kts +++ b/features/send/impl/build.gradle.kts @@ -46,6 +46,9 @@ dependencies { implementation(projects.core.utils) implementation(projects.core.navigation) + /** Common */ + implementation(projects.common) + /** Libs */ implementation(projects.libs.crypto) @@ -62,6 +65,8 @@ dependencies { implementation(projects.domain.txhistory.models) implementation(projects.domain.transaction) implementation(projects.domain.card) + implementation(projects.domain.balanceHiding) + implementation(projects.domain.balanceHiding.models) /** Feature modules */ implementation(projects.features.send.api) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt index 7f8e97b93e..31cfb3ef91 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt @@ -95,6 +95,7 @@ internal class SendStateFactory( currentState = MutableStateFlow(SendUiStateType.None), event = consumedEvent(), isEditingDisabled = false, + isBalanceHidden = false, ) fun getReadyState(): SendUiState { @@ -115,6 +116,10 @@ internal class SendStateFactory( isEditingDisabled = true, ) } + + fun getOnHideBalanceState(isBalanceHidden: Boolean): SendUiState { + return currentStateProvider().copy(isBalanceHidden = isBalanceHidden) + } //endregion //region amount state clicks diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt index 2d624f11d8..1828a6b3ed 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt @@ -34,6 +34,7 @@ internal data class SendUiState( val sendState: SendStates.SendState = SendStates.SendState(), val recipientList: MutableStateFlow> = MutableStateFlow(PagingData.empty()), val currentState: StateFlow, + val isBalanceHidden: Boolean, val event: StateEvent, ) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt index 04220b3f11..88c36f0d4c 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt @@ -90,17 +90,18 @@ private fun SendScreenContent( ) { state -> when (state) { SendUiStateType.Amount -> SendAmountContent( - uiState.amountState, - uiState.clickIntents, + amountState = uiState.amountState, + isBalanceHiding = uiState.isBalanceHidden, + clickIntents = uiState.clickIntents, ) SendUiStateType.Recipient -> SendRecipientContent( - uiState.recipientState, - uiState.clickIntents, - recipientList, + uiState = uiState.recipientState, + clickIntents = uiState.clickIntents, + recipientList = recipientList, ) SendUiStateType.Fee -> SendSpeedAndFeeContent( - uiState.feeState, - uiState.clickIntents, + state = uiState.feeState, + clickIntents = uiState.clickIntents, ) SendUiStateType.Send -> SendContent(uiState) else -> Unit diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountFieldContainer.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountFieldContainer.kt index afd7b30b6e..ce7ba474c6 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountFieldContainer.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountFieldContainer.kt @@ -1,5 +1,6 @@ package com.tangem.features.send.impl.presentation.ui.amount +import androidx.compose.animation.AnimatedContent import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth @@ -11,13 +12,18 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.text.style.TextAlign +import com.tangem.common.Strings.STARS import com.tangem.core.ui.components.currency.tokenicon.TokenIcon import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.res.TangemTheme import com.tangem.features.send.impl.presentation.state.SendStates @Composable -internal fun AmountFieldContainer(amountState: SendStates.AmountState, modifier: Modifier = Modifier) { +internal fun AmountFieldContainer( + amountState: SendStates.AmountState, + isBalanceHiding: Boolean, + modifier: Modifier = Modifier, +) { Column( horizontalAlignment = Alignment.CenterHorizontally, modifier = modifier @@ -37,14 +43,21 @@ internal fun AmountFieldContainer(amountState: SendStates.AmountState, modifier: modifier = Modifier .padding(top = TangemTheme.dimens.spacing14), ) - Text( - text = amountState.walletBalance.resolveReference(), - style = TangemTheme.typography.caption2, - color = TangemTheme.colors.text.tertiary, - textAlign = TextAlign.Center, - modifier = Modifier - .padding(top = TangemTheme.dimens.spacing2), - ) + + val balance = if (isBalanceHiding) STARS else amountState.walletBalance.resolveReference() + AnimatedContent( + targetState = balance, + label = "Hide Balance Animation", + ) { + Text( + text = it, + style = TangemTheme.typography.caption2, + color = TangemTheme.colors.text.tertiary, + textAlign = TextAlign.Center, + modifier = Modifier + .padding(top = TangemTheme.dimens.spacing2), + ) + } TokenIcon( state = amountState.tokenIconState, modifier = Modifier diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt index ba14154d01..39e83215dc 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt @@ -22,13 +22,17 @@ import com.tangem.features.send.impl.presentation.state.amount.SendAmountSegment import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents @Composable -internal fun SendAmountContent(amountState: SendStates.AmountState?, clickIntents: SendClickIntents) { +internal fun SendAmountContent( + amountState: SendStates.AmountState?, + isBalanceHiding: Boolean, + clickIntents: SendClickIntents, +) { if (amountState == null) return Column( modifier = Modifier .background(TangemTheme.colors.background.tertiary), ) { - AmountFieldContainer(amountState = amountState) + AmountFieldContainer(amountState = amountState, isBalanceHiding = isBalanceHiding) Row( modifier = Modifier .padding( diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/SendContent.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/SendContent.kt index 6430b56837..6d335ee554 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/SendContent.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/SendContent.kt @@ -1,5 +1,6 @@ package com.tangem.features.send.impl.presentation.ui.send +import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background @@ -17,6 +18,7 @@ import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.withStyle +import com.tangem.common.Strings import com.tangem.core.ui.components.inputrow.InputRowDefault import com.tangem.core.ui.components.inputrow.InputRowImage import com.tangem.core.ui.components.inputrow.InputRowRecipientDefault @@ -65,6 +67,7 @@ internal fun SendContent(uiState: SendUiState) { FromWallet( walletName = amountState.walletName, walletBalance = amountState.walletBalance.resolveReference(), + isBalanceHidden = uiState.isBalanceHidden, ) } RecipientBlock( @@ -91,7 +94,7 @@ internal fun SendContent(uiState: SendUiState) { } @Composable -private fun FromWallet(walletName: String, walletBalance: String) { +private fun FromWallet(walletName: String, walletBalance: String, isBalanceHidden: Boolean) { Column( modifier = Modifier .fillMaxWidth() @@ -110,15 +113,21 @@ private fun FromWallet(walletName: String, walletBalance: String) { style = TangemTheme.typography.caption2, color = TangemTheme.colors.text.secondary, ) - Text( - text = walletBalance, - style = TangemTheme.typography.body2, - color = TangemTheme.colors.text.primary1, - modifier = Modifier - .padding( - top = TangemTheme.dimens.spacing8, - ), - ) + val balance = if (isBalanceHidden) Strings.STARS else walletBalance + AnimatedContent( + targetState = balance, + label = "Hide Balance Animation", + ) { + Text( + text = it, + style = TangemTheme.typography.body2, + color = TangemTheme.colors.text.primary1, + modifier = Modifier + .padding( + top = TangemTheme.dimens.spacing8, + ), + ) + } } } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt index b7bc549c8e..cb977c38f3 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt @@ -13,6 +13,7 @@ import com.tangem.common.extensions.isZero import com.tangem.core.ui.utils.parseBigDecimal import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase import com.tangem.domain.appcurrency.model.AppCurrency +import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase import com.tangem.domain.redux.LegacyAction import com.tangem.domain.redux.ReduxStateHolder import com.tangem.domain.tokens.* @@ -74,6 +75,7 @@ internal class SendViewModel @Inject constructor( private val walletManagersFacade: WalletManagersFacade, private val reduxStateHolder: ReduxStateHolder, private val isAmountSubtractAvailableUseCase: IsAmountSubtractAvailableUseCase, + private val getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase, currencyChecksRepository: CurrencyChecksRepository, isFeeApproximateUseCase: IsFeeApproximateUseCase, getExplorerTransactionUrlUseCase: GetExplorerTransactionUrlUseCase, @@ -163,6 +165,7 @@ internal class SendViewModel @Inject constructor( override fun onCreate(owner: LifecycleOwner) { subscribeOnCurrencyStatusUpdates(owner) onStateActive() + subscribeOnBalanceHidden(owner) } fun setRouter(router: InnerSendRouter, stateRouter: StateRouter) { @@ -189,6 +192,17 @@ internal class SendViewModel @Inject constructor( } } + private fun subscribeOnBalanceHidden(owner: LifecycleOwner) { + getBalanceHidingSettingsUseCase() + .flowWithLifecycle(owner.lifecycle) + .conflate() + .distinctUntilChanged() + .onEach { + uiState = stateFactory.getOnHideBalanceState(isBalanceHidden = it.isBalanceHidden) + } + .launchIn(viewModelScope) + } + private fun getCurrenciesStatusUpdates(owner: LifecycleOwner, wallet: UserWallet) { val isSingleWallet = wallet.scanResponse.walletData?.token != null && !wallet.isMultiCurrency