From 91323fc0159c1819c67d9ab7e3795fd658160124 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 6 Mar 2024 09:07:36 +0000 Subject: [PATCH 1/9] Updated on 2026-08-14 --- .../wallet/subscribers/MultiWalletTokenListSubscriber.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/MultiWalletTokenListSubscriber.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/MultiWalletTokenListSubscriber.kt index 1c53ebee84..9185370945 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/MultiWalletTokenListSubscriber.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/MultiWalletTokenListSubscriber.kt @@ -36,9 +36,11 @@ internal class MultiWalletTokenListSubscriber( override fun tokenListFlow(): MaybeTokenListFlow = getTokenListUseCase(userWallet.walletId) override suspend fun onTokenListReceived(maybeTokenList: Either) { - updateSortingIfNeeded(maybeTokenList) + // TODO disabled for 5.7.2 because of potential critical + // updateSortingIfNeeded(maybeTokenList) } + @Suppress("UnusedPrivateMember") private suspend fun updateSortingIfNeeded(maybeTokenList: Either) { val tokenList = maybeTokenList.getOrElse { return } if (!checkNeedSorting(tokenList)) return From cfce6c0ef878ca5797bd81d14cdb182590c47460 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 6 Mar 2024 20:46:21 +0400 Subject: [PATCH 2/9] Updated on 2026-08-14 --- gradle/dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 08469f5c44..35111945c2 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -85,7 +85,7 @@ web3j = "4.10.1" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.7-509" +tangemBlockchainSdk = "release-app_5.7-517" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.7-330" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ From fbc8c82590279a80026c4073500c55f013413634 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 7 Mar 2024 21:50:16 +0400 Subject: [PATCH 3/9] Updated on 2026-08-14 --- gradle/dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 35111945c2..ef80c04882 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -85,7 +85,7 @@ web3j = "4.10.1" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.7-517" +tangemBlockchainSdk = "release-app_5.7-519" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.7-330" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ From 528a8c1ed0f7b4625f185c60819dcd4845421e6c Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 9 Mar 2024 20:25:10 +0000 Subject: [PATCH 4/9] Updated on 2026-08-14 --- gradle/dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index ef80c04882..7d506e01f4 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -85,7 +85,7 @@ web3j = "4.10.1" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.7-519" +tangemBlockchainSdk = "release-app_5.7-520" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.7-330" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ From 2c7eedd2263ddb86981459140e15ec8faba00d47 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 9 Mar 2024 21:15:12 +0000 Subject: [PATCH 5/9] Updated on 2026-08-14 --- .../core/analytics/models/AnalyticsParam.kt | 6 +++ .../analytics/WalletScreenAnalyticsEvent.kt | 8 ++++ .../utils/TokenListAnalyticsSender.kt | 48 +++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt index a684154112..434d51d967 100644 --- a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt +++ b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt @@ -11,6 +11,11 @@ sealed class AnalyticsParam { companion object } + sealed class TokenBalanceState(val value: String) { + data object Empty : TokenBalanceState("Empty") + data object Full : TokenBalanceState("Full") + } + sealed class RateApp(val value: String) { object Liked : RateApp("Liked") object Disliked : RateApp("Disliked") @@ -124,6 +129,7 @@ sealed class AnalyticsParam { const val TOKEN = "Token" const val SOURCE = "Source" const val BALANCE = "Balance" + const val STATE = "State" const val BATCH = "Batch" const val TYPE = "Type" const val FEE_TYPE = "Fee Type" diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt index 2717ca2dfa..088622ed27 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt @@ -38,6 +38,14 @@ sealed class WalletScreenAnalyticsEvent { AnalyticsParam.BALANCE to balance.value, ), ) + + class TokenBalance(balance: AnalyticsParam.TokenBalanceState, token: String) : Basic( + event = "Token Balance", + params = mapOf( + AnalyticsParam.STATE to balance.value, + AnalyticsParam.TOKEN to token, + ), + ) } sealed class MainScreen( diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/TokenListAnalyticsSender.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/TokenListAnalyticsSender.kt index 563ab70f1e..901116d2d9 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/TokenListAnalyticsSender.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/TokenListAnalyticsSender.kt @@ -1,10 +1,13 @@ package com.tangem.feature.wallet.presentation.wallet.analytics.utils import arrow.core.getOrElse +import com.tangem.blockchain.common.Blockchain +import com.tangem.common.extensions.isZero import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.domain.analytics.CheckIsWalletToppedUpUseCase import com.tangem.domain.analytics.model.WalletBalanceState +import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.model.NetworkGroup import com.tangem.domain.tokens.model.TokenList @@ -24,6 +27,8 @@ internal class TokenListAnalyticsSender @Inject constructor( private val screenLifecycleProvider: ScreenLifecycleProvider, ) { + private val balanceWasSentMap = mutableMapOf() + suspend fun send(displayedUiState: WalletState?, userWallet: UserWallet, tokenList: TokenList) { if (screenLifecycleProvider.isBackground) return if (displayedUiState == null || displayedUiState.pullToRefreshConfig.isRefreshing) return @@ -34,6 +39,7 @@ internal class TokenListAnalyticsSender @Inject constructor( sendBalanceLoadedEventIfNeeded(tokenList.totalFiatBalance, currenciesStatuses) sendToppedUpEventIfNeeded(userWallet, tokenList.totalFiatBalance, currenciesStatuses) sendUnreachableNetworksEventIfNeeded(currenciesStatuses) + sendTokenBalancesIfNeeded(currenciesStatuses) } private fun getCurrenciesStatuses(tokenList: TokenList): List = when (tokenList) { @@ -72,6 +78,48 @@ internal class TokenListAnalyticsSender @Inject constructor( } } + private fun sendTokenBalancesIfNeeded(currenciesStatuses: List) { + currenciesStatuses.forEach { + val status = it.value + if (status is CryptoCurrencyStatus.Loaded) { + sendTokenBalancesForSpecificBlockchains(it, status) + } + } + } + + // TODO hotfix/5.7.4 send event for log if tokens from polkadot ecosystem have balance + private fun sendTokenBalancesForSpecificBlockchains( + currencyStatus: CryptoCurrencyStatus, + balanceStatus: CryptoCurrencyStatus.Loaded, + ) { + // for now send only for Polkadot ecosystem blockchains + // later dependency on Blockchain will be removed and use token name + when (val blockchain = Blockchain.fromNetworkId(currencyStatus.currency.network.backendId)) { + Blockchain.Polkadot, + Blockchain.AlephZero, + Blockchain.Kusama, + -> { + if (balanceWasSentMap[blockchain.currency] != true) { + val tokenBalance = if (balanceStatus.amount.isZero()) { + AnalyticsParam.TokenBalanceState.Empty + } else { + AnalyticsParam.TokenBalanceState.Full + } + analyticsEventHandler.send( + Basic.TokenBalance( + balance = tokenBalance, + token = blockchain.currency, + ), + ) + balanceWasSentMap[blockchain.currency] = true + } + } + else -> { + /* no-op */ + } + } + } + private fun getCardBalanceState(fiatBalance: TokenList.FiatBalance.Loaded): AnalyticsParam.CardBalanceState { return if (fiatBalance.amount > BigDecimal.ZERO) { AnalyticsParam.CardBalanceState.Full From 9dc9f19da894edfccbcedade732cae4fc8cb03fb Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 9 Mar 2024 21:15:12 +0000 Subject: [PATCH 6/9] Updated on 2026-08-14 --- .../java/com/tangem/core/analytics/models/AnalyticsParam.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt index 434d51d967..5f53ab40d7 100644 --- a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt +++ b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt @@ -12,8 +12,8 @@ sealed class AnalyticsParam { } sealed class TokenBalanceState(val value: String) { - data object Empty : TokenBalanceState("Empty") - data object Full : TokenBalanceState("Full") + object Empty : TokenBalanceState("Empty") + object Full : TokenBalanceState("Full") } sealed class RateApp(val value: String) { From e9c01dd3956c4eba5ab2d315e7abdd76cb184f07 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 10 Mar 2024 08:08:17 +0000 Subject: [PATCH 7/9] Updated on 2026-08-14 --- .../analytics/utils/TokenListAnalyticsSender.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/TokenListAnalyticsSender.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/TokenListAnalyticsSender.kt index 901116d2d9..655a49a92b 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/TokenListAnalyticsSender.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/TokenListAnalyticsSender.kt @@ -17,6 +17,8 @@ import com.tangem.feature.wallet.presentation.wallet.analytics.WalletScreenAnaly import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.utils.ScreenLifecycleProvider import dagger.hilt.android.scopes.ViewModelScoped +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import java.math.BigDecimal import javax.inject.Inject @@ -28,6 +30,7 @@ internal class TokenListAnalyticsSender @Inject constructor( ) { private val balanceWasSentMap = mutableMapOf() + private val mutex = Mutex() suspend fun send(displayedUiState: WalletState?, userWallet: UserWallet, tokenList: TokenList) { if (screenLifecycleProvider.isBackground) return @@ -78,7 +81,7 @@ internal class TokenListAnalyticsSender @Inject constructor( } } - private fun sendTokenBalancesIfNeeded(currenciesStatuses: List) { + private suspend fun sendTokenBalancesIfNeeded(currenciesStatuses: List) { currenciesStatuses.forEach { val status = it.value if (status is CryptoCurrencyStatus.Loaded) { @@ -88,7 +91,7 @@ internal class TokenListAnalyticsSender @Inject constructor( } // TODO hotfix/5.7.4 send event for log if tokens from polkadot ecosystem have balance - private fun sendTokenBalancesForSpecificBlockchains( + private suspend fun sendTokenBalancesForSpecificBlockchains( currencyStatus: CryptoCurrencyStatus, balanceStatus: CryptoCurrencyStatus.Loaded, ) { @@ -111,7 +114,9 @@ internal class TokenListAnalyticsSender @Inject constructor( token = blockchain.currency, ), ) - balanceWasSentMap[blockchain.currency] = true + mutex.withLock { + balanceWasSentMap[blockchain.currency] = true + } } } else -> { From 78ab92dc3ce4f6266cc3334cf0ebd696fa9a811c Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 10 Mar 2024 20:04:14 +0000 Subject: [PATCH 8/9] Updated on 2026-08-14 --- gradle/dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 7d506e01f4..8174779a4e 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -85,7 +85,7 @@ web3j = "4.10.1" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.7-520" +tangemBlockchainSdk = "release-app_5.7-521" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.7-330" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ From c54b0b4781d64d7cf1bb21f0361b6127cbd9c1af Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 10 Mar 2024 20:40:07 +0000 Subject: [PATCH 9/9] Updated on 2026-08-14 --- gradle/dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 8174779a4e..8d3e50ca24 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -85,7 +85,7 @@ web3j = "4.10.1" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.7-521" +tangemBlockchainSdk = "release-app_5.7-522" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.7-330" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^