From bb22f119540c694a6dd6d373f7307ab24a8ef45a Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 16 Oct 2023 15:45:41 +0800 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/common/analytics/events/Settings.kt | 6 +++++ .../AppCurrencySelectorViewModel.kt | 10 +++++++- .../details/ui/details/DetailsViewModel.kt | 1 + .../ui/components/appbar/AppBarWithSearch.kt | 23 ++++--------------- .../feature/referral/ReferralFragment.kt | 3 +-- .../feature/swap/analytics/SwapEvents.kt | 11 ++++++++- .../feature/swap/models/SwapStateHolder.kt | 1 - .../tangem/feature/swap/models/UiActions.kt | 1 - .../feature/swap/presentation/SwapFragment.kt | 8 ++----- .../tangem/feature/swap/ui/StateBuilder.kt | 1 - .../feature/swap/ui/SwapScreenContent.kt | 2 -- .../feature/swap/ui/SwapSelectTokenScreen.kt | 8 +------ .../feature/swap/viewmodels/SwapViewModel.kt | 12 +++++----- 13 files changed, 40 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/Settings.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/Settings.kt index e71eda15ad..7208d9943a 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/Settings.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/Settings.kt @@ -22,6 +22,7 @@ sealed class Settings( class ButtonAppSettings : Settings(event = "Button - App Settings") class ButtonCreateBackup : Settings(event = "Button - Create Backup") class ButtonWalletConnect : Settings(event = "Button - Wallet Connect") + object ScanNewCard : Settings(event = "Button - Scan New Card") class ButtonSocialNetwork(network: SocialNetwork) : Settings( event = "Button - Social Network", @@ -78,5 +79,10 @@ sealed class Settings( ) object ButtonEnableBiometricAuthentication : AppSettings(event = "Button - Enable Biometric Authentication") + + class MainCurrencyChanged(currencyType: String) : MainScreen( + event = "Main Currency Changed", + params = mapOf("Currency Type" to currencyType), + ) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/appcurrency/AppCurrencySelectorViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/appcurrency/AppCurrencySelectorViewModel.kt index 4013947c19..b78e975ae6 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/appcurrency/AppCurrencySelectorViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/appcurrency/AppCurrencySelectorViewModel.kt @@ -2,10 +2,12 @@ package com.tangem.tap.features.details.ui.appcurrency import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.navigation.ReduxNavController import com.tangem.domain.appcurrency.GetAvailableCurrenciesUseCase import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase import com.tangem.domain.appcurrency.SelectAppCurrencyUseCase +import com.tangem.tap.common.analytics.events.Settings import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.StateFlow @@ -20,6 +22,7 @@ internal class AppCurrencySelectorViewModel @Inject constructor( private val selectAppCurrencyUseCase: SelectAppCurrencyUseCase, private val reduxNavController: ReduxNavController, private val dispatchers: CoroutineDispatcherProvider, + private val analyticsEventHandler: AnalyticsEventHandler, ) : ViewModel(), AppCurrencySelectorIntents { private val stateController = AppCurrencySelectorStateHolder( @@ -45,7 +48,12 @@ internal class AppCurrencySelectorViewModel @Inject constructor( override fun onCurrencyClick(currency: AppCurrencySelectorState.Currency) { viewModelScope.launch(dispatchers.io) { selectAppCurrencyUseCase(currency.id) - .onRight { reduxNavController.popBackStack() } + .onRight { + analyticsEventHandler.send( + event = Settings.AppSettings.MainCurrencyChanged(currencyType = currency.name), + ) + reduxNavController.popBackStack() + } } } diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt index b86ab3cec3..8e9fb4ce18 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt @@ -161,6 +161,7 @@ internal class DetailsViewModel( } private fun scanAndSaveUserWallet() { + Analytics.send(Settings.ScanNewCard) store.dispatch(DetailsAction.ScanAndSaveUserWallet) } diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithSearch.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithSearch.kt index b88991e655..867774adfb 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithSearch.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithSearch.kt @@ -4,26 +4,11 @@ import androidx.compose.animation.Crossfade import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.defaultMinSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.* import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material.Icon -import androidx.compose.material.IconButton -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Text -import androidx.compose.material.TextField -import androidx.compose.runtime.Composable -import androidx.compose.runtime.SideEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue +import androidx.compose.material.* +import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester @@ -64,7 +49,7 @@ fun ExpandableSearchView( onBackClick: () -> Unit, onSearchChange: (String) -> Unit, onSearchDisplayClose: () -> Unit, - onFocusChange: (Boolean) -> Unit, + onFocusChange: (Boolean) -> Unit = {}, title: String? = null, placeholderSearchText: String = "", expandedInitially: Boolean = false, diff --git a/features/referral/presentation/src/main/java/com/tangem/feature/referral/ReferralFragment.kt b/features/referral/presentation/src/main/java/com/tangem/feature/referral/ReferralFragment.kt index e45014f407..e7a122fb45 100644 --- a/features/referral/presentation/src/main/java/com/tangem/feature/referral/ReferralFragment.kt +++ b/features/referral/presentation/src/main/java/com/tangem/feature/referral/ReferralFragment.kt @@ -26,13 +26,12 @@ class ReferralFragment : ComposeFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + viewModel.onScreenOpened() viewModel.setRouter(ReferralRouter(fragmentManager = WeakReference(parentFragmentManager))) } @Composable override fun ScreenContent(modifier: Modifier) { - viewModel.onScreenOpened() - val backgroundColor = TangemTheme.colors.background.secondary SystemBarsEffect { setSystemBarsColor(backgroundColor) } diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt index d2395cf29b..fcc9a98dd8 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt @@ -14,7 +14,16 @@ sealed class SwapEvents( object SendTokenBalanceClicked : SwapEvents(event = "Send Token Balance Clicked") object ChooseTokenScreenOpened : SwapEvents(event = "Choose Token Screen Opened") - object SearchTokenClicked : SwapEvents(event = "Searched Token Clicked") + + data class SearchTokenClicked(val currencySymbol: String?) : SwapEvents( + event = "Searched Token Clicked", + params = buildMap { + if (currencySymbol != null) { + put("Token", currencySymbol) + } + }, + ) + data class ButtonSwapClicked(val sendToken: String, val receiveToken: String) : SwapEvents( event = "Button - Swap", params = mapOf("Send Token" to sendToken, "Receive Token" to receiveToken), diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt index 73ec9cd110..1fc4583726 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt @@ -25,7 +25,6 @@ data class SwapStateHolder( val onRefresh: () -> Unit, val onBackClicked: () -> Unit, val onChangeCardsClicked: () -> Unit, - val onSearchFocusChange: (Boolean) -> Unit, val onSelectTokenClick: (() -> Unit)? = null, val onSuccess: (() -> Unit)? = null, val onMaxAmountSelected: (() -> Unit)? = null, diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/UiActions.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/UiActions.kt index 6d901ded7e..d250e06df6 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/UiActions.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/UiActions.kt @@ -5,7 +5,6 @@ import com.tangem.feature.swap.domain.models.ui.TxFee data class UiActions( val onSearchEntered: (String) -> Unit, - val onSearchFocusChange: (Boolean) -> Unit, val onTokenSelected: (String) -> Unit, val onAmountChanged: (String) -> Unit, val onAmountSelected: (Boolean) -> Unit, diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/presentation/SwapFragment.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/presentation/SwapFragment.kt index 5130290638..8562c1e5db 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/presentation/SwapFragment.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/presentation/SwapFragment.kt @@ -52,7 +52,7 @@ class SwapFragment : ComposeFragment() { @Suppress("TopLevelComposableFunctions") @Composable private fun ScreenContent(viewModel: SwapViewModel) { - Crossfade(targetState = viewModel.currentScreen) { screen -> + Crossfade(targetState = viewModel.currentScreen, label = "") { screen -> when (screen) { SwapNavScreen.Main -> SwapScreen(stateHolder = viewModel.uiState) SwapNavScreen.Success -> { @@ -66,11 +66,7 @@ class SwapFragment : ComposeFragment() { SwapNavScreen.SelectToken -> { val tokenState = viewModel.uiState.selectTokenState if (tokenState != null) { - SwapSelectTokenScreen( - state = tokenState, - onSearchFocusChange = viewModel.uiState.onSearchFocusChange, - onBack = viewModel.uiState.onBackClicked, - ) + SwapSelectTokenScreen(state = tokenState, onBack = viewModel.uiState.onBackClicked) } else { SwapScreen(stateHolder = viewModel.uiState) } diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt index 9324dc4d15..abe4083ee3 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt @@ -58,7 +58,6 @@ internal class StateBuilder(val actions: UiActions, val isBalanceHiddenProvider: networkCurrency = networkInfo.blockchainCurrency, swapButton = SwapButton(enabled = false, loading = true, onClick = {}), onRefresh = {}, - onSearchFocusChange = actions.onSearchFocusChange, onBackClicked = actions.onBackClicked, onChangeCardsClicked = actions.onChangeCardsClicked, onMaxAmountSelected = actions.onMaxAmountSelected, diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt index 52deac586f..7473c83f0c 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt @@ -454,8 +454,6 @@ private val state = SwapStateHolder( onChangeCardsClicked = {}, permissionState = SwapPermissionState.InProgress, blockchainId = "POLYGON", - onSearchFocusChange = {}, - // alert = SwapWarning.GenericWarning("There was an error. Please try again.") {}, ) @Preview diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt index ea3a63e8dd..497e3f2335 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt @@ -41,11 +41,7 @@ import com.tangem.feature.swap.presentation.R import kotlinx.coroutines.launch @Composable -fun SwapSelectTokenScreen( - state: SwapSelectTokenStateHolder, - onSearchFocusChange: (Boolean) -> Unit, - onBack: () -> Unit, -) { +fun SwapSelectTokenScreen(state: SwapSelectTokenStateHolder, onBack: () -> Unit) { Scaffold( modifier = Modifier .systemBarsPadding() @@ -60,7 +56,6 @@ fun SwapSelectTokenScreen( placeholderSearchText = stringResource(id = R.string.common_search_tokens), onSearchChange = state.onSearchEntered, onSearchDisplayClose = { state.onSearchEntered("") }, - onFocusChange = onSearchFocusChange, subtitle = state.network.name, icon = painterResource(id = getActiveIconRes(state.network.blockchainId)), ) @@ -283,7 +278,6 @@ private fun TokenScreenPreview() { onTokenSelected = {}, network = Network("Ethereum", "ETH"), ), - onSearchFocusChange = {}, onBack = {}, ) } \ No newline at end of file diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt index 1dc5566832..7860b28db9 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt @@ -87,7 +87,7 @@ internal class SwapViewModel @Inject constructor( private var isOrderReversed = false private val lastAmount = mutableStateOf(INITIAL_AMOUNT) private var swapRouter: SwapRouter by Delegates.notNull() - var currentScreen = SwapNavScreen.Main + val currentScreen: SwapNavScreen get() = swapRouter.currentScreen init { @@ -359,6 +359,11 @@ internal class SwapViewModel @Inject constructor( private fun onTokenSelect(id: String) { val foundToken = swapInteractor.findTokenById(id) + + analyticsEventHandler.send( + event = SwapEvents.SearchTokenClicked(currencySymbol = foundToken?.symbol), + ) + if (foundToken != null) { val fromToken: Currency val toToken: Currency @@ -471,11 +476,6 @@ internal class SwapViewModel @Inject constructor( analyticsEventHandler.send(SwapEvents.ButtonPermissionCancelClicked) }, onAmountSelected = { onAmountSelected(it) }, - onSearchFocusChange = { focused -> - if (focused) { - analyticsEventHandler.send(SwapEvents.SearchTokenClicked) - } - }, onChangeApproveType = { approveType -> uiState = stateBuilder.updateApproveType(uiState, approveType) },