diff --git a/app/src/androidTest/kotlin/com/tangem/scenarios/BaseScenarios.kt b/app/src/androidTest/kotlin/com/tangem/scenarios/BaseScenarios.kt index e84ee3a24c..bc4f4593d7 100644 --- a/app/src/androidTest/kotlin/com/tangem/scenarios/BaseScenarios.kt +++ b/app/src/androidTest/kotlin/com/tangem/scenarios/BaseScenarios.kt @@ -65,8 +65,8 @@ fun BaseTestCase.openMainScreen( step("Assert 'Main' screen is displayed") { onMainScreen { screenContainer.assertIsDisplayed() } } - step("Click on 'Market Tooltip' screen") { - onMarketsTooltipScreen { contentContainer.clickWithAssertion() } + step("Dismiss Market Tooltip by clicking close button") { + onMarketsTooltipScreen { closeButton.clickWithAssertion() } } } diff --git a/app/src/androidTest/kotlin/com/tangem/screens/MarketsTooltipPageObject.kt b/app/src/androidTest/kotlin/com/tangem/screens/MarketsTooltipPageObject.kt index 08ae1af7d8..d66f0f80a8 100644 --- a/app/src/androidTest/kotlin/com/tangem/screens/MarketsTooltipPageObject.kt +++ b/app/src/androidTest/kotlin/com/tangem/screens/MarketsTooltipPageObject.kt @@ -13,6 +13,10 @@ class MarketsTooltipPageObject(semanticsProvider: SemanticsNodeInteractionsProvi val contentContainer: KNode = child { hasTestTag(MarketTooltipTestTags.CONTAINER) } + + val closeButton: KNode = child { + hasTestTag(MarketTooltipTestTags.CLOSE_BUTTON) + } } internal fun BaseTestCase.onMarketsTooltipScreen(function: MarketsTooltipPageObject.() -> Unit) = diff --git a/core/ui/src/main/java/com/tangem/core/ui/test/MarketTooltipTestTags.kt b/core/ui/src/main/java/com/tangem/core/ui/test/MarketTooltipTestTags.kt index 383bc099fd..77ff36a35d 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/test/MarketTooltipTestTags.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/test/MarketTooltipTestTags.kt @@ -2,4 +2,5 @@ package com.tangem.core.ui.test object MarketTooltipTestTags { const val CONTAINER = "MARKETS_TOOLTIP_CONTAINER" + const val CLOSE_BUTTON = "MARKETS_TOOLTIP_CLOSE_BUTTON" } \ No newline at end of file diff --git a/core/ui/src/main/res/drawable/ic_plus_18.xml b/core/ui/src/main/res/drawable/ic_plus_18.xml new file mode 100644 index 0000000000..cc0ffddd36 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_plus_18.xml @@ -0,0 +1,10 @@ + + + diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt index b75d8ebaea..d1bd0b0529 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt @@ -146,6 +146,17 @@ internal class WalletModel @Inject constructor( fun onResume() { suggestToEnableBiometrics() + suggestToOpenMarketsOnResume() + } + + private fun suggestToOpenMarketsOnResume() { + modelScope.launch { + if (shouldShowMarketsTooltipUseCase()) { + stateHolder.update { + it.copy(showMarketsOnboarding = true) + } + } + } } private fun updateMarketToggle() { @@ -203,8 +214,6 @@ internal class WalletModel @Inject constructor( it.copy(showMarketsOnboarding = true) } } - - shouldShowMarketsTooltipUseCase(isShown = true) } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletContentClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletContentClickIntents.kt index 59c28e1d6d..f4769cd5bf 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletContentClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletContentClickIntents.kt @@ -46,7 +46,7 @@ internal interface WalletContentClickIntents { fun onOrganizeTokensClick() - fun onDismissMarketsOnboarding() + fun onDismissMarketsTooltip() fun onTokenItemClick(userWalletId: UserWalletId, currencyStatus: CryptoCurrencyStatus) @@ -112,7 +112,7 @@ internal class WalletContentClickIntentsImplementor @Inject constructor( router.openOrganizeTokensScreen(userWalletId = stateHolder.getSelectedWalletId()) } - override fun onDismissMarketsOnboarding() { + override fun onDismissMarketsTooltip() { stateHolder.update { it.copy(showMarketsOnboarding = false) } modelScope.launch { shouldShowMarketsTooltipUseCase(isShown = true) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/preview/WalletScreenPreviewData.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/preview/WalletScreenPreviewData.kt index e617d2d783..59f9ca6314 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/preview/WalletScreenPreviewData.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/preview/WalletScreenPreviewData.kt @@ -222,7 +222,7 @@ internal object WalletScreenPreviewData { event = consumedEvent(), isHidingMode = false, showMarketsOnboarding = false, - onDismissMarketsOnboarding = {}, + onDismissMarketsTooltip = {}, isNewMarketEnabled = false, ) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt index 572e187d6b..a39274838f 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt @@ -109,7 +109,7 @@ internal class WalletStateController @Inject constructor() { event = consumedEvent(), isHidingMode = false, showMarketsOnboarding = false, - onDismissMarketsOnboarding = {}, + onDismissMarketsTooltip = {}, isNewMarketEnabled = false, ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletScreenState.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletScreenState.kt index 1fb6a6d24c..9c6f2658ae 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletScreenState.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletScreenState.kt @@ -14,5 +14,5 @@ internal data class WalletScreenState( val isHidingMode: Boolean, val showMarketsOnboarding: Boolean, val isNewMarketEnabled: Boolean, - val onDismissMarketsOnboarding: () -> Unit, + val onDismissMarketsTooltip: () -> Unit, ) \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/InitializeWalletsTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/InitializeWalletsTransformer.kt index 200f8be43d..559a45db9d 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/InitializeWalletsTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/InitializeWalletsTransformer.kt @@ -44,7 +44,7 @@ internal class InitializeWalletsTransformer( } .toImmutableList(), onWalletChange = clickIntents::onWalletChange, - onDismissMarketsOnboarding = clickIntents::onDismissMarketsOnboarding, + onDismissMarketsTooltip = clickIntents::onDismissMarketsTooltip, ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt index a9f5d27170..ec373aea09 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt @@ -409,19 +409,22 @@ private inline fun BaseScaffoldWithMarkets( visible = bottomSheetState.targetValue == TangemSheetValue.Expanded || state.showMarketsOnboarding, onDismissRequest = { - coroutineScope.launch { bottomSheetState.partialExpand() } - state.onDismissMarketsOnboarding() + if (!state.showMarketsOnboarding) { + coroutineScope.launch { bottomSheetState.partialExpand() } + } }, ) MarketsTooltip( modifier = Modifier .align(Alignment.BottomCenter) - .padding(bottom = 24.dp) - .fillMaxWidth(fraction = 0.7f), + .padding(bottom = 8.dp) + .padding(horizontal = 16.dp) + .fillMaxWidth(), isVisible = state.showMarketsOnboarding, availableHeight = maxHeight, bottomSheetState = bottomSheetState, + onCloseClick = state.onDismissMarketsTooltip, ) } }, @@ -443,7 +446,7 @@ private inline fun BaseScaffoldWithMarkets( LaunchedEffect(state.showMarketsOnboarding, bottomSheetState.targetValue) { if (state.showMarketsOnboarding && bottomSheetState.targetValue == TangemSheetValue.Expanded) { - state.onDismissMarketsOnboarding() + state.onDismissMarketsTooltip() } } } @@ -454,6 +457,7 @@ private fun MarketsTooltip( availableHeight: Dp, bottomSheetState: TangemSheetState, isVisible: Boolean, + onCloseClick: () -> Unit, modifier: Modifier = Modifier, ) { val density = LocalDensity.current @@ -494,7 +498,7 @@ private fun MarketsTooltip( ) + fadeIn(), exit = fadeOut(), ) { - MarketsTooltipContent() + MarketsTooltipContent(onCloseClick = onCloseClick) } } @@ -527,12 +531,12 @@ internal fun MarketsHint(isVisible: Boolean, modifier: Modifier = Modifier) { } @Composable -private fun MarketsTooltipContent(modifier: Modifier = Modifier) { - val backgroundColor = TangemTheme.colors.background.action - val cornerRadius = CornerRadius(x = 14.dp.toPx()) +private fun MarketsTooltipContent(onCloseClick: () -> Unit, modifier: Modifier = Modifier) { + val backgroundColor = TangemTheme.colors.background.primary + val cornerRadius = CornerRadius(x = 16.dp.toPx()) val tipDpSize = DpSize(width = 20.dp, height = 8.dp) - Column( + Row( modifier = modifier .padding(bottom = tipDpSize.height) .drawBehind { @@ -555,18 +559,42 @@ private fun MarketsTooltipContent(modifier: Modifier = Modifier) { drawPath(color = backgroundColor, path = tipPath) } .padding(all = 12.dp), - verticalArrangement = Arrangement.spacedBy(space = 4.dp), - horizontalAlignment = Alignment.Start, + horizontalArrangement = Arrangement.spacedBy(space = 12.dp), + verticalAlignment = Alignment.Top, ) { - Text( - text = stringResourceSafe(id = R.string.markets_tooltip_title), - style = TangemTheme.typography.subtitle2, - color = TangemTheme.colors.text.primary1, + Icon( + modifier = Modifier.size(size = 18.dp), + painter = painterResource(id = R.drawable.ic_plus_18), + tint = Color.Unspecified, + contentDescription = null, ) - Text( - text = stringResourceSafe(id = R.string.markets_tooltip_message), - style = TangemTheme.typography.caption2, - color = TangemTheme.colors.text.secondary, + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(space = 2.dp), + ) { + Text( + text = stringResourceSafe(id = R.string.markets_tooltip_v2_title), + style = TangemTheme.typography.subtitle2, + color = TangemTheme.colors.text.primary1, + ) + Text( + text = stringResourceSafe(id = R.string.markets_tooltip_message), + style = TangemTheme.typography.caption2, + color = TangemTheme.colors.text.secondary, + ) + } + Icon( + modifier = Modifier + .size(size = 16.dp) + .clickable( + interactionSource = null, + indication = null, + onClick = onCloseClick, + ) + .testTag(MarketTooltipTestTags.CLOSE_BUTTON), + painter = painterResource(id = R.drawable.ic_close_24), + tint = TangemTheme.colors.icon.informative, + contentDescription = null, ) } }