diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/Token.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/Token.kt index afe5da529a..b0c9a0db1d 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/Token.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/Token.kt @@ -1,5 +1,7 @@ package com.tangem.tap.common.analytics.events +import com.tangem.tap.common.analytics.events.AnalyticsParam.CurrencyType + /** [REDACTED_AUTHOR] */ @@ -12,10 +14,30 @@ sealed class Token( class Refreshed : Token("Token", "Refreshed") class ButtonRemoveToken : Token("Token", "Button - Remove Token") class ButtonExplore : Token("Token", "Button - Explore") - class ButtonBuy(token: String) : Token("Token", "Button - Buy", mapOf("Token" to token)) - class ButtonSell(token: String) : Token("Token", "Button - Sell", mapOf("Token" to token)) - class ButtonExchange(token: String) : Token("Token", "Button - Exchange", mapOf("Token" to token)) - class ButtonSend(token: String) : Token("Token", "Button - Send", mapOf("Token" to token)) + + class ButtonBuy(type: CurrencyType) : Token( + category = "Token", + event = "Button - Buy", + params = mapOf("Token" to type.value), + ) + + class ButtonSell(type: CurrencyType) : Token( + category = "Token", + event = "Button - Sell", + params = mapOf("Token" to type.value), + ) + + class ButtonExchange(type: CurrencyType) : Token( + category = "Token", + event = "Button - Exchange", + params = mapOf("Token" to type.value), + ) + + class ButtonSend(type: CurrencyType) : Token( + category = "Token", + event = "Button - Send", + params = mapOf("Token" to type.value), + ) sealed class Recieve( event: String, @@ -37,7 +59,7 @@ sealed class Token( class ButtonQRCode : Send("Button - QR Code") class ButtonSwapCurrency : Send("Button - Swap Currency") - class TransactionSent(token: AnalyticsParam.CurrencyType) : Send( + class TransactionSent(token: CurrencyType) : Send( event = "Transaction Sent", params = mapOf("Token" to token.value), ) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt index ba68023190..3433d447d5 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt @@ -5,6 +5,7 @@ import com.tangem.blockchain.common.Token import com.tangem.blockchain.common.WalletManager import com.tangem.common.extensions.guard import com.tangem.domain.common.extensions.withMainContext +import com.tangem.tap.common.analytics.Analytics import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.extensions.dispatchErrorNotification import com.tangem.tap.common.extensions.safeUpdate @@ -109,6 +110,7 @@ class MultiWalletMiddleware { WalletDialog.RemoveWalletDialog( currencyTitle = currency.currencyName, onOk = { + Analytics.send(com.tangem.tap.common.analytics.events.Token.ButtonRemoveToken()) store.dispatch( WalletAction.MultiWallet.RemoveWallet( currency = currency, diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt index 319c940a52..182c75c9bd 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt @@ -2,6 +2,9 @@ package com.tangem.tap.features.wallet.redux.middlewares import com.tangem.blockchain.blockchains.ethereum.EthereumWalletManager import com.tangem.blockchain.common.AmountType +import com.tangem.tap.common.analytics.Analytics +import com.tangem.tap.common.analytics.events.AnalyticsParam +import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.extensions.dispatchDebugErrorNotification import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.redux.AppState @@ -19,7 +22,6 @@ import com.tangem.tap.scope import com.tangem.tap.store import kotlinx.coroutines.launch - class TradeCryptoMiddleware { fun handle(state: () -> AppState?, action: WalletAction.TradeCryptoAction) { if (DemoHelper.tryHandle(state, action)) return @@ -50,6 +52,7 @@ class TradeCryptoMiddleware { val exchangeManager = store.state.globalState.exchangeManager val appCurrency = store.state.globalState.appCurrency val currency = selectedWalletData.currency + Analytics.send(Token.ButtonBuy(AnalyticsParam.CurrencyType.Currency(currency))) if (currency is Currency.Token && currency.blockchain.isTestnet()) { val walletManager = store.state.walletState.getWalletManager(currency) @@ -62,7 +65,7 @@ class TradeCryptoMiddleware { exchangeManager.buyErc20TestnetTokens( card = card, walletManager = walletManager, - token = currency.token + token = currency.token, ) } return @@ -73,7 +76,7 @@ class TradeCryptoMiddleware { blockchain = currency.blockchain, cryptoCurrencyName = currency.currencySymbol, fiatCurrencyName = appCurrency.code, - walletAddress = addresses[0].address + walletAddress = addresses[0].address, )?.let { store.dispatchOnMain(NavigationAction.OpenUrl(it)) } } @@ -85,29 +88,37 @@ class TradeCryptoMiddleware { if (addresses.isEmpty()) return val currency = selectedWalletData.currency + Analytics.send(Token.ButtonSell(AnalyticsParam.CurrencyType.Currency(currency))) + store.state.globalState.exchangeManager.getUrl( action = CurrencyExchangeManager.Action.Sell, blockchain = currency.blockchain, cryptoCurrencyName = currency.currencySymbol, fiatCurrencyName = appCurrency.code, - walletAddress = addresses[0].address + walletAddress = addresses[0].address, )?.let { store.dispatchOnMain(NavigationAction.OpenUrl(it)) } } private fun preconfigureAndOpenSendScreen(action: WalletAction.TradeCryptoAction.SendCrypto) { val selectedWalletData = store.state.walletState.getSelectedWalletData() ?: return + Analytics.send(Token.ButtonSend(AnalyticsParam.CurrencyType.Currency(selectedWalletData.currency))) + val walletManager = store.state.walletState.getWalletManager(selectedWalletData.currency) - store.dispatchOnMain(PrepareSendScreen( - coinAmount = walletManager?.wallet?.amounts?.get(AmountType.Coin), - coinRate = selectedWalletData.fiatRate, - walletManager = walletManager - )) - store.dispatchOnMain(SendAction.SendSpecificTransaction( - sendAmount = action.amount, - destinationAddress = action.destinationAddress, - transactionId = action.transactionId - )) + store.dispatchOnMain( + PrepareSendScreen( + coinAmount = walletManager?.wallet?.amounts?.get(AmountType.Coin), + coinRate = selectedWalletData.fiatRate, + walletManager = walletManager, + ), + ) + store.dispatchOnMain( + SendAction.SendSpecificTransaction( + sendAmount = action.amount, + destinationAddress = action.destinationAddress, + transactionId = action.transactionId, + ), + ) store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Send)) } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt index d53809be9c..64d2122fa2 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt @@ -1,5 +1,8 @@ package com.tangem.tap.features.wallet.redux.middlewares +import com.tangem.tap.common.analytics.Analytics +import com.tangem.tap.common.analytics.events.AnalyticsParam +import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.extensions.dispatchDialogHide import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.redux.AppDialog @@ -14,6 +17,9 @@ class WalletDialogsMiddleware { store.dispatchDialogShow(WalletDialog.SignedHashesMultiWalletDialog) } is WalletAction.DialogAction.ChooseTradeActionDialog -> { + store.state.walletState.getSelectedWalletData()?.let { + Analytics.send(Token.ButtonExchange(AnalyticsParam.CurrencyType.Currency(it.currency))) + } store.dispatchDialogShow(WalletDialog.ChooseTradeActionDialog) } is WalletAction.DialogAction.QrCode -> { @@ -21,14 +27,14 @@ class WalletDialogsMiddleware { AppDialog.AddressInfoDialog( currency = action.currency, addressData = action.selectedAddress, - ) + ), ) } is WalletAction.DialogAction.ChooseCurrency -> { store.dispatchDialogShow( WalletDialog.SelectAmountToSendDialog( - amounts = action.amounts - ) + amounts = action.amounts, + ), ) } is WalletAction.DialogAction.RussianCardholdersWarningDialog -> { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index 157c8786b4..a4f353a6f7 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -13,6 +13,7 @@ import com.tangem.operations.attestation.Attestation import com.tangem.operations.attestation.OnlineCardVerifier import com.tangem.tap.common.analytics.Analytics import com.tangem.tap.common.analytics.AnalyticsAnOld +import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.extensions.copyToClipboard import com.tangem.tap.common.extensions.dispatchDebugErrorNotification import com.tangem.tap.common.extensions.dispatchOnMain @@ -247,6 +248,7 @@ class WalletMiddleware { action.context.shareText(action.address) } is WalletAction.ExploreAddress -> { + Analytics.send(Token.ButtonExplore()) store.dispatchOpenUrl(action.exploreUrl) } is WalletAction.Send -> { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt index 281d4b3938..9d3dfca291 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt @@ -19,6 +19,9 @@ import com.tangem.domain.common.TapWorkarounds.derivationStyle import com.tangem.tangem_sdk_new.extensions.dpToPx import com.tangem.tap.common.SnackbarHandler import com.tangem.tap.common.TestActions +import com.tangem.tap.common.analytics.Analytics +import com.tangem.tap.common.analytics.events.DetailsScreen +import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.extensions.appendIfNotNull import com.tangem.tap.common.extensions.beginDelayedTransition import com.tangem.tap.common.extensions.fitChipsByGroupWidth @@ -59,12 +62,17 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setHasOptionsMenu(true) - activity?.onBackPressedDispatcher?.addCallback(this, object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - store.dispatch(WalletAction.MultiWallet.SelectWallet(null)) - store.dispatch(NavigationAction.PopBackTo()) - } - }) + + Analytics.send(DetailsScreen.ScreenOpened()) + activity?.onBackPressedDispatcher?.addCallback( + this, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + store.dispatch(WalletAction.MultiWallet.SelectWallet(null)) + store.dispatch(NavigationAction.PopBackTo()) + } + }, + ) val inflater = TransitionInflater.from(requireContext()) enterTransition = inflater.inflateTransition(R.transition.slide_right) exitTransition = inflater.inflateTransition(R.transition.fade) @@ -125,7 +133,7 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), view?.findViewById(R.id.l_balance)?.let { view -> TestActions.initFor( view = view, - actions = TestWallet.solanaRentExemptWarning() + actions = TestWallet.solanaRentExemptWarning(), ) } } @@ -149,13 +157,15 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), binding.srlWalletDetails.setOnRefreshListener { if (selectedWallet.currencyData.status != BalanceStatus.Loading) { - store.dispatch(WalletAction.LoadWallet( - blockchain = BlockchainNetwork( - selectedWallet.currency.blockchain, - selectedWallet.currency.derivationPath, - emptyList() - ) - ) + Analytics.send(Token.Refreshed()) + store.dispatch( + WalletAction.LoadWallet( + blockchain = BlockchainNetwork( + selectedWallet.currency.blockchain, + selectedWallet.currency.derivationPath, + emptyList(), + ), + ), ) } } @@ -183,7 +193,7 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), tvCurrencyTitle.text = currencyData.currency tvCurrencySubtitle.text = tvCurrencySubtitle.getString( R.string.wallet_currency_subtitle, - currency.blockchain.fullName + currency.blockchain.fullName, ) } @@ -225,7 +235,6 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), ) } - private fun showPendingTransactionsIfPresent(pendingTransactions: List) { pendingTransactionAdapter.submitList(pendingTransactions) binding.rvPendingTransaction.show(pendingTransactions.isNotEmpty()) @@ -256,8 +265,8 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), store.dispatch( WalletAction.ExploreAddress( state.walletAddresses.selectedAddress.exploreUrl, - requireContext() - ) + requireContext(), + ), ) } ivQrCode.setImageBitmap(state.walletAddresses.selectedAddress.shareUrl.toQrCode()) @@ -272,7 +281,7 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), binding.srlWalletDetails.isRefreshing = false (activity as? SnackbarHandler)?.showSnackbar( text = R.string.wallet_notification_no_internet, - buttonTitle = R.string.common_retry + buttonTitle = R.string.common_retry, ) { store.dispatch(WalletAction.LoadData) } } } else { @@ -292,7 +301,8 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), lBalance.tvStatus.setLoadingStatus(R.string.wallet_balance_loading) } BalanceStatus.VerifiedOnline, BalanceStatus.SameCurrencyTransactionInProgress, - BalanceStatus.TransactionInProgress -> { + BalanceStatus.TransactionInProgress, + -> { lBalanceError.root.hide() lBalance.root.show() lBalance.groupBalance.show() @@ -315,7 +325,7 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), lBalance.tvError.show() lBalance.tvError.setWarningStatus( R.string.wallet_balance_blockchain_unreachable, - data.errorMessage + data.errorMessage, ) } BalanceStatus.NoAccount -> { @@ -325,7 +335,7 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), lBalanceError.tvErrorDescriptions.text = getString( R.string.wallet_error_no_account_subtitle_format, - data.amountToCreateAccount, data.currencySymbol + data.amountToCreateAccount, data.currencySymbol, ) } } @@ -364,7 +374,7 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), private fun TextView.setStatus( text: String, @ColorRes color: Int, - @DrawableRes drawable: Int? + @DrawableRes drawable: Int?, ) { this.text = text setTextColor(getColor(color))