From ae432b0fd1c11dbd06259ec8d129d8a942ad45ec Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 4 Apr 2024 15:11:44 +0500 Subject: [PATCH 1/4] Updated on 2026-08-14 --- .../send/impl/presentation/ui/SendScreen.kt | 1 + .../ui/recipient/SendRecipientContent.kt | 124 ++++++++++++------ 2 files changed, 83 insertions(+), 42 deletions(-) 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 b227fe07fe..fe28791ec9 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 @@ -122,6 +122,7 @@ private fun SendScreenContent(uiState: SendUiState, currentState: SendUiCurrentS SendUiStateType.Recipient -> SendRecipientContent( uiState = uiState.recipientState, clickIntents = uiState.clickIntents, + isBalanceHidden = uiState.isBalanceHidden, ) SendUiStateType.Fee -> SendSpeedAndFeeContent( state = uiState.feeState, diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/SendRecipientContent.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/SendRecipientContent.kt index 93910bc2a6..539d82e49c 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/SendRecipientContent.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/SendRecipientContent.kt @@ -18,6 +18,7 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.res.stringResource +import com.tangem.common.Strings.STARS import com.tangem.core.ui.components.inputrow.InputRowRecipient import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.res.TangemTheme @@ -25,6 +26,7 @@ import com.tangem.features.send.impl.R import com.tangem.features.send.impl.presentation.analytics.EnterAddressSource import com.tangem.features.send.impl.presentation.domain.SendRecipientListContent import com.tangem.features.send.impl.presentation.state.SendStates +import com.tangem.features.send.impl.presentation.state.fields.SendTextField import com.tangem.features.send.impl.presentation.ui.common.FooterContainer import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents import kotlinx.collections.immutable.ImmutableList @@ -33,7 +35,11 @@ private const val ADDRESS_FIELD_KEY = "ADDRESS_FIELD_KEY" private const val MEMO_FIELD_KEY = "MEMO_FIELD_KEY" @Composable -internal fun SendRecipientContent(uiState: SendStates.RecipientState?, clickIntents: SendClickIntents) { +internal fun SendRecipientContent( + uiState: SendStates.RecipientState?, + clickIntents: SendClickIntents, + isBalanceHidden: Boolean, +) { if (uiState == null) return val recipients = uiState.recent val wallets = uiState.wallets @@ -47,56 +53,89 @@ internal fun SendRecipientContent(uiState: SendStates.RecipientState?, clickInte .background(TangemTheme.colors.background.tertiary) .padding(horizontal = TangemTheme.dimens.spacing16), ) { - item(key = ADDRESS_FIELD_KEY) { - FooterContainer( - footer = stringResource(R.string.send_recipient_address_footer, uiState.network), - ) { - InputRowRecipient( - value = address.value, - title = address.label, - placeholder = address.placeholder, - onValueChange = address.onValueChange, - onPasteClick = { clickIntents.onRecipientAddressValueChange(it, EnterAddressSource.PasteButton) }, - isError = isError, - isLoading = isValidating, - error = address.error, - modifier = Modifier - .background( - color = TangemTheme.colors.background.action, - shape = TangemTheme.shapes.roundedCornersXMedium, - ), - ) - } - } - if (memoField != null) { - item(key = MEMO_FIELD_KEY) { - val placeholder = if (memoField.isEnabled) memoField.placeholder else memoField.disabledText - TextFieldWithPaste( - value = memoField.value, - label = memoField.label, - placeholder = placeholder, - footer = stringResource(R.string.send_recipient_memo_footer), - onValueChange = memoField.onValueChange, - onPasteClick = clickIntents::onRecipientMemoValueChange, - modifier = Modifier.padding(top = TangemTheme.dimens.spacing20), - isError = memoField.isError, - error = memoField.error, - isReadOnly = !memoField.isEnabled, - ) - } - } + addressItem( + address = address, + network = uiState.network, + isError = isError, + isValidating = isValidating, + onAddressChange = clickIntents::onRecipientAddressValueChange, + ) + memoField( + memoField = memoField, + onMemoChange = clickIntents::onRecipientMemoValueChange, + ) listHeaderItem( titleRes = R.string.send_recipient_wallets_title, isVisible = wallets.isNotEmpty() && wallets.first().isVisible, isFirst = true, ) - listItem(wallets, clickIntents, isLast = recipients.isEmpty()) + listItem( + list = wallets, + clickIntents = clickIntents, + isLast = recipients.isEmpty(), + isBalanceHidden = isBalanceHidden, + ) listHeaderItem( titleRes = R.string.send_recent_transactions, isVisible = recipients.isNotEmpty() && recipients.first().isVisible, isFirst = wallets.isEmpty(), ) - listItem(recipients, clickIntents, isLast = true) + listItem( + list = recipients, + clickIntents = clickIntents, + isLast = true, + isBalanceHidden = isBalanceHidden, + ) + } +} + +private fun LazyListScope.addressItem( + address: SendTextField.RecipientAddress, + network: String, + isError: Boolean, + isValidating: Boolean, + onAddressChange: (String, EnterAddressSource?) -> Unit, +) { + item(key = ADDRESS_FIELD_KEY) { + FooterContainer( + footer = stringResource(R.string.send_recipient_address_footer, network), + ) { + InputRowRecipient( + value = address.value, + title = address.label, + placeholder = address.placeholder, + onValueChange = address.onValueChange, + onPasteClick = { onAddressChange(it, EnterAddressSource.PasteButton) }, + isError = isError, + isLoading = isValidating, + error = address.error, + modifier = Modifier + .background( + color = TangemTheme.colors.background.action, + shape = TangemTheme.shapes.roundedCornersXMedium, + ), + ) + } + } +} + +private fun LazyListScope.memoField(memoField: SendTextField.RecipientMemo?, onMemoChange: (String) -> Unit) { + if (memoField != null) { + item(key = MEMO_FIELD_KEY) { + val placeholder = if (memoField.isEnabled) memoField.placeholder else memoField.disabledText + TextFieldWithPaste( + value = memoField.value, + label = memoField.label, + placeholder = placeholder, + footer = stringResource(R.string.send_recipient_memo_footer), + onValueChange = memoField.onValueChange, + onPasteClick = onMemoChange, + modifier = Modifier.padding(top = TangemTheme.dimens.spacing20), + isError = memoField.isError, + error = memoField.error, + isReadOnly = !memoField.isEnabled, + ) + } } } @@ -154,6 +193,7 @@ private fun LazyListScope.listItem( list: ImmutableList, clickIntents: SendClickIntents, isLast: Boolean, + isBalanceHidden: Boolean, ) { items( count = list.size, @@ -173,7 +213,7 @@ private fun LazyListScope.listItem( ) { ListItemWithIcon( title = title, - subtitle = item.subtitle.resolveReference(), + subtitle = if (isBalanceHidden) STARS else item.subtitle.resolveReference(), info = item.timestamp?.resolveReference(), subtitleEndOffset = item.subtitleEndOffset, subtitleIconRes = item.subtitleIconRes, From 046b64701a79f741808ecafb29d3789ac8559042 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 4 Apr 2024 15:14:22 +0500 Subject: [PATCH 2/4] Updated on 2026-08-14 --- .../presentation/QrScanningCameraDeniedBottomSheet.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/presentation/QrScanningCameraDeniedBottomSheet.kt b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/presentation/QrScanningCameraDeniedBottomSheet.kt index 6edcbe2ea2..31f79da70e 100644 --- a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/presentation/QrScanningCameraDeniedBottomSheet.kt +++ b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/presentation/QrScanningCameraDeniedBottomSheet.kt @@ -33,7 +33,7 @@ private fun CameraDeniedBottomSheet(content: CameraDeniedBottomSheetConfig) { title = stringResource(id = R.string.qr_scanner_camera_denied_settings_button), icon = R.drawable.ic_settings_24, onItemsClick = { - val intent: Intent = Intent( + val intent = Intent( Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", context.packageName, null), ) @@ -47,7 +47,7 @@ private fun CameraDeniedBottomSheet(content: CameraDeniedBottomSheetConfig) { ) SimpleSettingsRow( title = stringResource(id = R.string.common_close), - icon = R.drawable.ic_close, + icon = R.drawable.ic_close_24, onItemsClick = content.onCancelClick, modifier = Modifier.padding(bottom = TangemTheme.dimens.spacing16), ) From ed3ee24cec3706846288aac1d29090ff02197132 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 4 Apr 2024 15:15:18 +0500 Subject: [PATCH 3/4] Updated on 2026-08-14 --- .../send/impl/presentation/viewmodel/SendViewModel.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) 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 67e152dae9..010b405e81 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 @@ -618,7 +618,9 @@ internal class SendViewModel @Inject constructor( network = cryptoCurrency.network, address = value, ).getOrElse { false } - onEnteredValidAddress(isValidAddress) + val isAddressInWallet = cryptoCurrencyStatus.value.networkAddress?.availableAddresses + ?.any { it.value == value } ?: true + onEnteredValidAddress(isValidAddress, isAddressInWallet) return isValidAddress } @@ -632,12 +634,13 @@ internal class SendViewModel @Inject constructor( } ?: false } - private fun onEnteredValidAddress(isValidAddress: Boolean) { + private fun onEnteredValidAddress(isValidAddress: Boolean, isAddressInWallet: Boolean) { val recipientState = uiState.recipientState ?: return + val isVisible = isAddressInWallet || !isValidAddress uiState = uiState.copy( recipientState = recipientState.copy( - recent = recipientState.recent.map { it.copy(isVisible = !isValidAddress) }.toPersistentList(), - wallets = recipientState.wallets.map { it.copy(isVisible = !isValidAddress) }.toPersistentList(), + recent = recipientState.recent.map { it.copy(isVisible = isVisible) }.toPersistentList(), + wallets = recipientState.wallets.map { it.copy(isVisible = isVisible) }.toPersistentList(), ), ) } From 4bd283457bdbd980c96a54d601b9e110f1cbccd1 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 4 Apr 2024 15:15:39 +0500 Subject: [PATCH 4/4] Updated on 2026-08-14 --- .../ui/recipient/TextFieldWithPaste.kt | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/TextFieldWithPaste.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/TextFieldWithPaste.kt index 6109c5ff50..5c0ca33a84 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/TextFieldWithPaste.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/TextFieldWithPaste.kt @@ -1,5 +1,8 @@ package com.tangem.features.send.impl.presentation.ui.recipient +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.material3.Text @@ -63,17 +66,29 @@ internal fun TextFieldWithPaste( .padding(top = TangemTheme.dimens.spacing6), ) } - CrossIcon( - onClick = onPasteClick, + AnimatedVisibility( + visible = !isReadOnly, + label = "Animate read only status change", + enter = fadeIn(), + exit = fadeOut(), modifier = Modifier .align(CenterVertically), - ) + ) { + CrossIcon( + onClick = onPasteClick, + ) + } } - if (!isReadOnly) { + AnimatedVisibility( + visible = !isReadOnly, + label = "Animate read only status change", + enter = fadeIn(), + exit = fadeOut(), + modifier = Modifier.align(CenterEnd), + ) { PasteButton( isPasteButtonVisible = value.isBlank(), onClick = onPasteClick, - modifier = Modifier.align(CenterEnd), ) } }