From 5899667c14e5310a7445d5394d54de6d1059c2ab Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 27 Oct 2022 18:36:42 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../java/com/tangem/tap/TapApplication.kt | 20 ++++- ...GlobalAnalyticsHandler.kt => Analytics.kt} | 87 +++++++------------ .../analytics/AnalyticsHandlersFactory.kt | 23 +++++ .../common/analytics/AnalyticsInterfaces.kt | 3 - .../analytics/GlobalAnalyticsEventHandler.kt | 18 ++++ .../GlobalAnalyticsEventHandlerBuilder.kt | 79 ----------------- .../common/analytics/api/EventHandlerApi.kt | 41 +++++---- .../amplitude/AmplitudeAnalyticsHandler.kt | 17 +++- .../handlers/amplitude/AmplitudeLogClient.kt | 5 +- .../appsFlyer/AppsFlyerAnalyticsHandler.kt | 18 +++- .../handlers/appsFlyer/AppsFlyerLogClient.kt | 5 +- .../firebase/FirebaseAnalyticsHandler.kt | 31 +++++-- .../handlers/firebase/FirebaseLogClient.kt | 5 +- .../tap/common/redux/global/GlobalState.kt | 4 +- .../tap/common/shop/TangemShopService.kt | 2 +- .../com/tangem/tap/domain/TangemSdkManager.kt | 2 +- .../tap/domain/twins/TwinCardsManager.kt | 6 +- .../walletconnect/WalletConnectSdkHelper.kt | 8 +- .../details/redux/DetailsMiddleware.kt | 4 +- .../redux/OnboardingSaltPayMiddleware.kt | 16 ++-- .../send/redux/middlewares/SendMiddleware.kt | 2 +- .../redux/middlewares/WalletMiddleware.kt | 2 +- 22 files changed, 204 insertions(+), 194 deletions(-) rename app/src/main/java/com/tangem/tap/common/analytics/{GlobalAnalyticsHandler.kt => Analytics.kt} (60%) create mode 100644 app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandlersFactory.kt delete mode 100644 app/src/main/java/com/tangem/tap/common/analytics/AnalyticsInterfaces.kt create mode 100644 app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsEventHandler.kt delete mode 100644 app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsEventHandlerBuilder.kt diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index c0d6e566b4..1913ac6e16 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -14,7 +14,12 @@ import com.tangem.domain.common.LogConfig import com.tangem.network.common.MoshiConverter import com.tangem.tap.common.AndroidAssetReader import com.tangem.tap.common.AssetReader -import com.tangem.tap.common.analytics.GlobalAnalyticsEventHandlerBuilder +import com.tangem.tap.common.analytics.Analytics +import com.tangem.tap.common.analytics.AnalyticsHandlersFactory +import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder +import com.tangem.tap.common.analytics.handlers.amplitude.AmplitudeAnalyticsHandler +import com.tangem.tap.common.analytics.handlers.appsFlyer.AppsFlyerAnalyticsHandler +import com.tangem.tap.common.analytics.handlers.firebase.FirebaseAnalyticsHandler import com.tangem.tap.common.feedback.AdditionalFeedbackInfo import com.tangem.tap.common.feedback.FeedbackManager import com.tangem.tap.common.images.createCoilImageLoader @@ -102,14 +107,21 @@ class TapApplication : Application(), ImageLoaderFactory { } private fun initAnalytics(application: Application, config: Config) { - val globalAnalyticsHandler = GlobalAnalyticsEventHandlerBuilder( + val factory = AnalyticsHandlersFactory() + factory.addBuilder(AmplitudeAnalyticsHandler.Builder()) + factory.addBuilder(AppsFlyerAnalyticsHandler.Builder()) + factory.addBuilder(FirebaseAnalyticsHandler.Builder()) + + val buildData = AnalyticsHandlerBuilder.Data( application = application, config = config, isDebug = BuildConfig.DEBUG, logConfig = LogConfig.analyticsHandlers, jsonConverter = MoshiJsonConverter.INSTANCE, - ).default() - store.dispatch(GlobalAction.SetGlobalAnalyticsHandler(globalAnalyticsHandler)) + ) + factory.build(buildData).forEach { + Analytics.addHandler(it.id(), it) + } } private fun initFeedbackManager(context: Context, preferencesStorage: PreferencesStorage, config: Config) { diff --git a/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/Analytics.kt similarity index 60% rename from app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt rename to app/src/main/java/com/tangem/tap/common/analytics/Analytics.kt index d1bef7d01b..9eaee82a3a 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/Analytics.kt @@ -7,68 +7,43 @@ import com.tangem.common.core.TangemSdkError import com.tangem.tap.common.analytics.api.AnalyticsEventHandler import com.tangem.tap.common.analytics.api.BlockchainSdkErrorEventHandler import com.tangem.tap.common.analytics.api.CardSdkErrorEventHandler -import com.tangem.tap.common.analytics.api.ErrorEventHandler import com.tangem.tap.common.analytics.api.ErrorEventLogger -import com.tangem.tap.common.analytics.api.SdkErrorEventHandler import com.tangem.tap.common.analytics.api.ShopifyOrderEventHandler import com.tangem.tap.common.analytics.events.AnalyticsEvent import com.tangem.tap.common.extensions.filterNotNull -interface GlobalAnalyticsEventHandler : AnalyticsEventHandler, - ErrorEventHandler, - SdkErrorEventHandler, - ShopifyOrderEventHandler { +/** +[REDACTED_AUTHOR] + */ +object Analytics : GlobalAnalyticsEventHandler { - fun attachToAllEvents(key: String, value: String) + private val handlers = mutableMapOf() - companion object { - fun stub(): GlobalAnalyticsEventHandler { - return object : GlobalAnalyticsEventHandler { - override fun attachToAllEvents(key: String, value: String) {} - override fun handleEvent(event: String, params: Map) {} - override fun handleErrorEvent(error: Throwable, params: Map) {} - override fun handleCardSdkErrorEvent( - error: TangemSdkError, - action: AnalyticsAnOld.ActionToLog, - params: Map, - card: Card?, - ) { - } - - override fun handleBlockchainSdkErrorEvent( - error: BlockchainError, - action: AnalyticsAnOld.ActionToLog, - params: Map, - card: Card?, - ) { - } - - override fun handleShopifyOrderEvent(order: Storefront.Order) {} - } - } - } -} - -class GlobalAnalyticsHandler( - private val analyticsHandlers: List, -) : GlobalAnalyticsEventHandler { + private val analyticsHandlers: List + get() = handlers.values.toList() private val attachToAllEventsParams: MutableMap = mutableMapOf() + override fun id(): String = analyticsHandlers.joinToString(", ") { it.id() } + + override fun addHandler(name: String, handler: AnalyticsEventHandler) { + handlers[name] = handler + } + + override fun removeHandler(name: String): AnalyticsEventHandler? { + return handlers.remove(name) + } + override fun attachToAllEvents(key: String, value: String) { attachToAllEventsParams[key] = value } - override fun handleEvent(event: String, params: Map) { - analyticsHandlers.forEach { it.handleEvent(event, params) } + override fun send(event: String, params: Map) { + analyticsHandlers.forEach { it.send(event, params) } } - override fun handleAnalyticsEvent( - event: AnalyticsEvent, - card: Card?, - blockchain: String?, - ) { - analyticsHandlers.forEach { it.handleAnalyticsEvent(event, card, blockchain) } + override fun send(event: AnalyticsEvent, card: Card?, blockchain: String?) { + analyticsHandlers.forEach { it.send(event, card, blockchain) } } override fun handleAnalyticsEvent( @@ -77,40 +52,42 @@ class GlobalAnalyticsHandler( card: Card?, blockchain: String?, ) { - analyticsHandlers.forEach { it.handleAnalyticsEvent(event, params, card, blockchain) } + analyticsHandlers.forEach { + it.handleAnalyticsEvent(event, params, card, blockchain) + } } - override fun handleErrorEvent(error: Throwable, params: Map) { + override fun send(error: Throwable, params: Map) { analyticsHandlers.filterIsInstance().forEach { it.logErrorEvent(error, params) } } - override fun handleCardSdkErrorEvent( + override fun send( error: TangemSdkError, action: AnalyticsAnOld.ActionToLog, params: Map, card: Card?, ) { analyticsHandlers.filterIsInstance().forEach { - it.handleCardSdkErrorEvent(error, action, params, card) + it.send(error, action, params, card) } } - override fun handleBlockchainSdkErrorEvent( + override fun send( error: BlockchainError, action: AnalyticsAnOld.ActionToLog, params: Map, card: Card?, ) { analyticsHandlers.filterIsInstance().forEach { - it.handleBlockchainSdkErrorEvent(error, action, params, card) + it.send(error, action, params, card) } } - override fun handleShopifyOrderEvent(order: Storefront.Order) { + override fun send(order: Storefront.Order) { analyticsHandlers.filterIsInstance().forEach { - it.handleShopifyOrderEvent(order) + it.send(order) } } @@ -136,7 +113,7 @@ fun GlobalAnalyticsEventHandler.logWcEvent(event: AnalyticsAnOld.WcAnalyticsEven AnalyticsParamAnOld.WALLET_CONNECT_ACTION.param to event.action?.name, AnalyticsParamAnOld.ERROR_DESCRIPTION.param to event.error.message, ).filterNotNull() - handleErrorEvent(event.error, params) + send(event.error, params) } is AnalyticsAnOld.WcAnalyticsEvent.InvalidRequest -> handleAnalyticsEvent( diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandlersFactory.kt b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandlersFactory.kt new file mode 100644 index 0000000000..a287f6fac2 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandlersFactory.kt @@ -0,0 +1,23 @@ +package com.tangem.tap.common.analytics + +import com.tangem.tap.common.analytics.api.AnalyticsEventHandler +import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder + +/** +[REDACTED_AUTHOR] + */ +class AnalyticsHandlersFactory { + + private val builders = mutableListOf() + + fun addBuilder(builder: AnalyticsHandlerBuilder) { + builders.add(builder) + } + + fun build(data: AnalyticsHandlerBuilder.Data): List { + val handlers = builders.mapNotNull { it.build(data) } + builders.clear() + + return handlers + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsInterfaces.kt b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsInterfaces.kt deleted file mode 100644 index 6fd6fc7dc8..0000000000 --- a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsInterfaces.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.tangem.tap.common.analytics - - diff --git a/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsEventHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsEventHandler.kt new file mode 100644 index 0000000000..139ffa5582 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsEventHandler.kt @@ -0,0 +1,18 @@ +package com.tangem.tap.common.analytics + +import com.tangem.tap.common.analytics.api.AnalyticsEventHandler +import com.tangem.tap.common.analytics.api.ErrorEventHandler +import com.tangem.tap.common.analytics.api.SdkErrorEventHandler +import com.tangem.tap.common.analytics.api.ShopifyOrderEventHandler + +interface GlobalAnalyticsEventHandler : AnalyticsEventHandler, + ErrorEventHandler, + SdkErrorEventHandler, + ShopifyOrderEventHandler { + + fun addHandler(name: String, handler: AnalyticsEventHandler) + + fun removeHandler(name: String): AnalyticsEventHandler? + + fun attachToAllEvents(key: String, value: String) +} diff --git a/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsEventHandlerBuilder.kt b/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsEventHandlerBuilder.kt deleted file mode 100644 index 8e2b439e08..0000000000 --- a/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsEventHandlerBuilder.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.tangem.tap.common.analytics - -import android.app.Application -import com.tangem.common.json.MoshiJsonConverter -import com.tangem.domain.common.AnalyticsHandlersLogConfig -import com.tangem.tap.common.analytics.api.AnalyticsEventHandler -import com.tangem.tap.common.analytics.handlers.amplitude.AmplitudeAnalyticsHandler -import com.tangem.tap.common.analytics.handlers.amplitude.AmplitudeClient -import com.tangem.tap.common.analytics.handlers.amplitude.AmplitudeLogClient -import com.tangem.tap.common.analytics.handlers.appsFlyer.AppsFlyerAnalyticsHandler -import com.tangem.tap.common.analytics.handlers.appsFlyer.AppsFlyerClient -import com.tangem.tap.common.analytics.handlers.appsFlyer.AppsFlyerLogClient -import com.tangem.tap.common.analytics.handlers.firebase.FirebaseAnalyticsHandler -import com.tangem.tap.common.analytics.handlers.firebase.FirebaseClient -import com.tangem.tap.common.analytics.handlers.firebase.FirebaseLogClient -import com.tangem.tap.domain.configurable.config.Config - -/** -[REDACTED_AUTHOR] - */ -class GlobalAnalyticsEventHandlerBuilder( - val application: Application, - val config: Config, - val isDebug: Boolean, - val logConfig: AnalyticsHandlersLogConfig, - val jsonConverter: MoshiJsonConverter, -) { - - private val analyticHandlers = mutableListOf() - - fun build(): GlobalAnalyticsEventHandler { - return GlobalAnalyticsHandler(analyticHandlers.toList()) - } - - fun default(): GlobalAnalyticsEventHandler { - addFirebaseAnalytics() - addAppsFlyer() - addAmplitude() - - return GlobalAnalyticsHandler(analyticHandlers.toList()) - } - - fun addFirebaseAnalytics(): GlobalAnalyticsEventHandlerBuilder { - if (isDebug) { - if (logConfig.firebase) FirebaseLogClient(createLogger("FirebaseAnalyticsHandler")) else null - } else { - FirebaseClient() - }?.let { - analyticHandlers.add(FirebaseAnalyticsHandler(it)) - } - return this - } - - fun addAppsFlyer(): GlobalAnalyticsEventHandlerBuilder { - if (isDebug) { - if (logConfig.appsFlyer) AppsFlyerLogClient(createLogger("AppsFlyerAnalyticsHandler")) else null - } else { - AppsFlyerClient(application, config.appsFlyerDevKey) - }?.let { - analyticHandlers.add(AppsFlyerAnalyticsHandler(it)) - } - return this - } - - fun addAmplitude(): GlobalAnalyticsEventHandlerBuilder { - if (isDebug) { - if (logConfig.firebase) AmplitudeLogClient(createLogger("AmplitudeAnalyticsHandler")) else null - } else { - AmplitudeClient(application, config.amplitudeApiKey) - }?.let { - analyticHandlers.add(AmplitudeAnalyticsHandler(it)) - } - return this - } - - private fun createLogger(name: String): AnalyticsEventsLogger { - return AnalyticsEventsLogger(name, jsonConverter) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/api/EventHandlerApi.kt b/app/src/main/java/com/tangem/tap/common/analytics/api/EventHandlerApi.kt index 08e1609e3c..ea77e75dfd 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/api/EventHandlerApi.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/api/EventHandlerApi.kt @@ -1,31 +1,30 @@ package com.tangem.tap.common.analytics.api +import android.app.Application import com.shopify.buy3.Storefront import com.tangem.blockchain.common.BlockchainError import com.tangem.common.card.Card import com.tangem.common.core.TangemSdkError +import com.tangem.common.json.MoshiJsonConverter +import com.tangem.domain.common.AnalyticsHandlersLogConfig import com.tangem.tap.common.analytics.AnalyticsAnOld import com.tangem.tap.common.analytics.AnalyticsEventAnOld import com.tangem.tap.common.analytics.AnalyticsParamAnOld import com.tangem.tap.common.analytics.events.AnalyticsEvent import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.extensions.filterNotNull +import com.tangem.tap.domain.configurable.config.Config /** [REDACTED_AUTHOR] */ interface AnalyticsEventHandler { - fun handleEvent( - event: String, - params: Map = emptyMap(), - ) + fun id(): String - fun handleAnalyticsEvent( - event: AnalyticsEvent, - card: Card? = null, - blockchain: String? = null, - ) { - handleEvent( + fun send(event: String, params: Map = emptyMap()) + + fun send(event: AnalyticsEvent, card: Card? = null, blockchain: String? = null) { + send( event = prepareEventString(event.category, event.event), params = prepareParams(card, blockchain, event.params), ) @@ -38,7 +37,7 @@ interface AnalyticsEventHandler { card: Card? = null, blockchain: String? = null, ) { - handleEvent(event.event, prepareParams(card, blockchain, params)) + send(event.event, prepareParams(card, blockchain, params)) } fun prepareParams( @@ -57,7 +56,7 @@ interface AnalyticsEventHandler { } interface ErrorEventHandler { - fun handleErrorEvent( + fun send( error: Throwable, params: Map = emptyMap(), ) @@ -66,7 +65,7 @@ interface ErrorEventHandler { interface SdkErrorEventHandler : CardSdkErrorEventHandler, BlockchainSdkErrorEventHandler interface CardSdkErrorEventHandler { - fun handleCardSdkErrorEvent( + fun send( error: TangemSdkError, action: AnalyticsAnOld.ActionToLog, params: Map = emptyMap(), @@ -75,7 +74,7 @@ interface CardSdkErrorEventHandler { } interface BlockchainSdkErrorEventHandler { - fun handleBlockchainSdkErrorEvent( + fun send( error: BlockchainError, action: AnalyticsAnOld.ActionToLog, params: Map = mapOf(), @@ -84,5 +83,17 @@ interface BlockchainSdkErrorEventHandler { } interface ShopifyOrderEventHandler { - fun handleShopifyOrderEvent(order: Storefront.Order) + fun send(order: Storefront.Order) } + +interface AnalyticsHandlerBuilder { + fun build(data: Data): AnalyticsEventHandler? + + data class Data( + val application: Application, + val config: Config, + val isDebug: Boolean, + val logConfig: AnalyticsHandlersLogConfig, + val jsonConverter: MoshiJsonConverter, + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeAnalyticsHandler.kt index 27132a1f61..5a03cc2f36 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeAnalyticsHandler.kt @@ -1,12 +1,27 @@ package com.tangem.tap.common.analytics.handlers.amplitude import com.tangem.tap.common.analytics.api.AnalyticsEventHandler +import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder class AmplitudeAnalyticsHandler( private val client: AmplitudeAnalyticsClient, ) : AnalyticsEventHandler { - override fun handleEvent(event: String, params: Map) { + override fun id(): String = ID + + override fun send(event: String, params: Map) { client.logEvent(event, params) } + + companion object { + const val ID = "Amplitude" + } + + class Builder : AnalyticsHandlerBuilder { + override fun build(data: AnalyticsHandlerBuilder.Data): AnalyticsEventHandler? = when { + !data.isDebug -> AmplitudeClient(data.application, data.config.amplitudeApiKey) + data.isDebug && data.logConfig.appsFlyer -> AmplitudeLogClient(data.jsonConverter) + else -> null + }?.let { AmplitudeAnalyticsHandler(it) } + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeLogClient.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeLogClient.kt index b800259b5f..f60d2edfcf 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeLogClient.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeLogClient.kt @@ -1,14 +1,17 @@ package com.tangem.tap.common.analytics.handlers.amplitude +import com.tangem.common.json.MoshiJsonConverter import com.tangem.tap.common.analytics.AnalyticsEventsLogger /** [REDACTED_AUTHOR] */ internal class AmplitudeLogClient( - private val logger: AnalyticsEventsLogger, + jsonConverter: MoshiJsonConverter, ) : AmplitudeAnalyticsClient { + private val logger: AnalyticsEventsLogger = AnalyticsEventsLogger(AmplitudeAnalyticsHandler.ID, jsonConverter) + override fun logEvent(event: String, params: Map) { logger.logEvent(event, params) } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerAnalyticsHandler.kt index 0acfb1dc2f..008b6189b9 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerAnalyticsHandler.kt @@ -5,22 +5,34 @@ import com.appsflyer.AFInAppEventType import com.shopify.buy3.Storefront import com.tangem.common.Converter import com.tangem.tap.common.analytics.api.AnalyticsEventHandler +import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder import com.tangem.tap.common.analytics.api.ShopifyOrderEventHandler class AppsFlyerAnalyticsHandler( private val client: AppsFlyerAnalyticsClient, ) : AnalyticsEventHandler, ShopifyOrderEventHandler { - override fun handleEvent(event: String, params: Map) { + override fun id(): String = ID + + override fun send(event: String, params: Map) { client.logEvent(event, params) } - override fun handleShopifyOrderEvent(order: Storefront.Order) { - handleEvent(ORDER_EVENT, OrderToParamsConverter().convert(order)) + override fun send(order: Storefront.Order) { + send(ORDER_EVENT, OrderToParamsConverter().convert(order)) } companion object { const val ORDER_EVENT = AFInAppEventType.PURCHASE + const val ID = "AppsFlyer" + } + + class Builder : AnalyticsHandlerBuilder { + override fun build(data: AnalyticsHandlerBuilder.Data): AnalyticsEventHandler? = when { + !data.isDebug -> AppsFlyerClient(data.application, data.config.appsFlyerDevKey) + data.isDebug && data.logConfig.appsFlyer -> AppsFlyerLogClient(data.jsonConverter) + else -> null + }?.let { AppsFlyerAnalyticsHandler(it) } } } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerLogClient.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerLogClient.kt index 0d3737a161..8e87061b2c 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerLogClient.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerLogClient.kt @@ -1,14 +1,17 @@ package com.tangem.tap.common.analytics.handlers.appsFlyer +import com.tangem.common.json.MoshiJsonConverter import com.tangem.tap.common.analytics.AnalyticsEventsLogger /** [REDACTED_AUTHOR] */ internal class AppsFlyerLogClient( - private val logger: AnalyticsEventsLogger, + jsonConverter: MoshiJsonConverter, ) : AppsFlyerAnalyticsClient { + private val logger = AnalyticsEventsLogger(AppsFlyerAnalyticsHandler.ID, jsonConverter) + override fun logEvent(event: String, params: Map) { logger.logEvent(event, params) } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAnalyticsHandler.kt index 3ab6326670..65ef31ac8e 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAnalyticsHandler.kt @@ -9,6 +9,7 @@ import com.tangem.common.core.TangemSdkError import com.tangem.tap.common.analytics.AnalyticsAnOld import com.tangem.tap.common.analytics.AnalyticsParamAnOld import com.tangem.tap.common.analytics.api.AnalyticsEventHandler +import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder import com.tangem.tap.common.analytics.api.ErrorEventHandler import com.tangem.tap.common.analytics.api.SdkErrorEventHandler import com.tangem.tap.common.analytics.api.ShopifyOrderEventHandler @@ -19,15 +20,17 @@ class FirebaseAnalyticsHandler( private val client: FirebaseAnalyticsClient, ) : AnalyticsEventHandler, ErrorEventHandler, SdkErrorEventHandler, ShopifyOrderEventHandler { - override fun handleEvent(event: String, params: Map) { + override fun id(): String = ID + + override fun send(event: String, params: Map) { client.logEvent(event, params) } - override fun handleErrorEvent(error: Throwable, params: Map) { + override fun send(error: Throwable, params: Map) { client.logErrorEvent(error, params) } - override fun handleCardSdkErrorEvent( + override fun send( error: TangemSdkError, action: AnalyticsAnOld.ActionToLog, params: Map, @@ -36,11 +39,11 @@ class FirebaseAnalyticsHandler( val model = CardSdkErrorConverter.Model(error, action, params, prepareParams(card)) val converter = CardSdkErrorConverter() converter.convert(model)?.let { - handleErrorEvent(it.throwable, it.params) + send(it.throwable, it.params) } } - override fun handleBlockchainSdkErrorEvent( + override fun send( error: BlockchainError, action: AnalyticsAnOld.ActionToLog, params: Map, @@ -50,12 +53,24 @@ class FirebaseAnalyticsHandler( val model = BlockchainSdkErrorConverter.Model(error, action, params, prepareParams(card)) val converter = BlockchainSdkErrorConverter(CardSdkErrorConverter()) converter.convert(model)?.let { - handleErrorEvent(it.throwable, it.params) + send(it.throwable, it.params) } } - override fun handleShopifyOrderEvent(order: Storefront.Order) { - handleEvent(FirebaseClient.ORDER_EVENT, OrderToParamsConverter().convert(order)) + override fun send(order: Storefront.Order) { + send(FirebaseClient.ORDER_EVENT, OrderToParamsConverter().convert(order)) + } + + companion object { + const val ID = "Firebase" + } + + class Builder : AnalyticsHandlerBuilder { + override fun build(data: AnalyticsHandlerBuilder.Data): AnalyticsEventHandler? = when { + !data.isDebug -> FirebaseClient() + data.isDebug && data.logConfig.firebase -> FirebaseLogClient(data.jsonConverter) + else -> null + }?.let { FirebaseAnalyticsHandler(it) } } } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseLogClient.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseLogClient.kt index ccacc09f9e..e460f9dbf9 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseLogClient.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseLogClient.kt @@ -1,14 +1,17 @@ package com.tangem.tap.common.analytics.handlers.firebase +import com.tangem.common.json.MoshiJsonConverter import com.tangem.tap.common.analytics.AnalyticsEventsLogger /** [REDACTED_AUTHOR] */ internal class FirebaseLogClient( - private val logger: AnalyticsEventsLogger, + jsonConverter: MoshiJsonConverter, ) : FirebaseAnalyticsClient { + private val logger: AnalyticsEventsLogger = AnalyticsEventsLogger(FirebaseAnalyticsHandler.ID, jsonConverter) + override fun logEvent(event: String, params: Map) { logger.logEvent(event, params) } diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt index a02172db23..b31226d6da 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt @@ -1,6 +1,7 @@ package com.tangem.tap.common.redux.global import com.tangem.domain.common.ScanResponse +import com.tangem.tap.common.analytics.Analytics import com.tangem.tap.common.analytics.GlobalAnalyticsEventHandler import com.tangem.tap.common.entities.FiatCurrency import com.tangem.tap.common.feedback.FeedbackManager @@ -27,11 +28,10 @@ data class GlobalState( val dialog: StateDialog? = null, val exchangeManager: CurrencyExchangeManager = CurrencyExchangeManager.dummy(), val resources: AndroidResources = AndroidResources(), - val analyticsHandler: GlobalAnalyticsEventHandler = GlobalAnalyticsEventHandler.stub(), + val analyticsHandler: GlobalAnalyticsEventHandler = Analytics, val userCountryCode: String? = null, ) : StateType - data class AndroidResources( val strings: RString = RString(), ) { diff --git a/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt b/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt index c8bd0a5405..d26f38e508 100644 --- a/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt +++ b/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt @@ -199,7 +199,7 @@ class TangemShopService(application: Application, shopifyShop: ShopifyShop) { suspend fun waitForCheckout(productType: ProductType, analyticsHandler: GlobalAnalyticsEventHandler?) { val result = shopifyService.checkout(true, checkouts[productType]!!.id) result.onSuccess { - ifNotNull(analyticsHandler, it.order) { handler, order -> handler.handleShopifyOrderEvent(order) } + ifNotNull(analyticsHandler, it.order) { handler, order -> handler.send(order) } } } diff --git a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt index 296b47185b..94bf9fcaec 100644 --- a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt @@ -91,7 +91,7 @@ class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Co } is CompletionResult.Failure -> (result.error as? TangemSdkError)?.let { error -> - analyticsHandler?.handleCardSdkErrorEvent( + analyticsHandler?.send( error = error, action = AnalyticsAnOld.ActionToLog.Scan, ) diff --git a/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt b/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt index feb58ca6f0..7a39dc917d 100644 --- a/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt @@ -37,7 +37,7 @@ class TwinCardsManager( is CompletionResult.Success -> currentCardPublicKey = response.data.wallet.publicKey.toHexString() is CompletionResult.Failure -> { (response.error as? TangemSdkError)?.let { error -> - analyticsHandler?.handleCardSdkErrorEvent( + analyticsHandler?.send( error, AnalyticsAnOld.ActionToLog.CreateWallet, card = card @@ -67,7 +67,7 @@ class TwinCardsManager( } is CompletionResult.Failure -> { (response.error as? TangemSdkError)?.let { error -> - analyticsHandler?.handleCardSdkErrorEvent( + analyticsHandler?.send( error, AnalyticsAnOld.ActionToLog.CreateWallet, card = card @@ -87,7 +87,7 @@ class TwinCardsManager( is CompletionResult.Success -> Result.Success(response.data) is CompletionResult.Failure -> { (response.error as? TangemSdkError)?.let { error -> - analyticsHandler?.handleCardSdkErrorEvent( + analyticsHandler?.send( error, AnalyticsAnOld.ActionToLog.WriteIssuerData, card = card diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt index f90eb7cbb9..c09bfcbfe9 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt @@ -143,7 +143,7 @@ class WalletConnectSdkHelper { HEX_PREFIX + data.walletManager.wallet.recentTransactions.last().hash } is SimpleResult.Failure -> { - store.state.globalState.analyticsHandler?.handleBlockchainSdkErrorEvent( + store.state.globalState.analyticsHandler?.send( result.error, AnalyticsAnOld.ActionToLog.WalletConnectTransaction, ) @@ -173,7 +173,7 @@ class WalletConnectSdkHelper { } is CompletionResult.Failure -> { (result.error as? TangemSdkError)?.let { error -> - store.state.globalState.analyticsHandler?.handleCardSdkErrorEvent( + store.state.globalState.analyticsHandler?.send( error, AnalyticsAnOld.ActionToLog.WalletConnectSign, ) @@ -202,7 +202,7 @@ class WalletConnectSdkHelper { } is CompletionResult.Failure -> { (result.error as? TangemSdkError)?.let { error -> - store.state.globalState.analyticsHandler?.handleCardSdkErrorEvent( + store.state.globalState.analyticsHandler?.send( error, AnalyticsAnOld.ActionToLog.WalletConnectTransaction, ) @@ -278,7 +278,7 @@ class WalletConnectSdkHelper { } is CompletionResult.Failure -> { (result.error as? TangemSdkError)?.let { error -> - store.state.globalState.analyticsHandler?.handleCardSdkErrorEvent( + store.state.globalState.analyticsHandler?.send( error, AnalyticsAnOld.ActionToLog.WalletConnectSign, ) diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt index 309c2900d3..719e666a32 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt @@ -110,7 +110,7 @@ class DetailsMiddleware { } is CompletionResult.Failure -> { (result.error as? TangemSdkError)?.let { error -> - store.state.globalState.analyticsHandler?.handleCardSdkErrorEvent( + store.state.globalState.analyticsHandler?.send( error, AnalyticsAnOld.ActionToLog.PurgeWallet, card = store.state.detailsState.scanResponse?.card, @@ -154,7 +154,7 @@ class DetailsMiddleware { } is CompletionResult.Failure -> { (result.error as? TangemSdkError)?.let { error -> - store.state.globalState.analyticsHandler?.handleCardSdkErrorEvent( + store.state.globalState.analyticsHandler?.send( error = error, action = AnalyticsAnOld.ActionToLog.ChangeSecOptions, params = mapOf( diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt index b969f87719..fdd09a7dd8 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt @@ -77,7 +77,7 @@ private fun handleOnboardingSaltPayAction(anyAction: Action, appState: () -> App } } is OnboardingSaltPayAction.RegisterCard -> { - analyticsHandler.handleAnalyticsEvent(Onboarding.ButtonConnect()) + analyticsHandler.send(Onboarding.ButtonConnect()) handleInProgress = true val state = getState() @@ -151,7 +151,7 @@ private fun handleOnboardingSaltPayAction(anyAction: Action, appState: () -> App is OnboardingSaltPayAction.TrySetPin -> { try { assertPinValid(action.pin, getState().pinLength) - analyticsHandler.handleAnalyticsEvent(Onboarding.PinCodeSet()) + analyticsHandler.send(Onboarding.PinCodeSet()) store.dispatch(OnboardingSaltPayAction.SetPin(action.pin)) store.dispatch(OnboardingSaltPayAction.SetStep(SaltPayActivationStep.CardRegistration)) } catch (error: SaltPayActivationError) { @@ -159,7 +159,7 @@ private fun handleOnboardingSaltPayAction(anyAction: Action, appState: () -> App } } is OnboardingSaltPayAction.Claim -> { - analyticsHandler.handleAnalyticsEvent(Onboarding.ButtonClaim()) + analyticsHandler.send(Onboarding.ButtonClaim()) val state = getState() handleInProgress = true @@ -192,7 +192,7 @@ private fun handleOnboardingSaltPayAction(anyAction: Action, appState: () -> App } handleInProgress = false - analyticsHandler.handleAnalyticsEvent(Onboarding.ClaimWasSuccessfully()) + analyticsHandler.send(Onboarding.ClaimWasSuccessfully()) dispatchOnMain(OnboardingSaltPayAction.SetStep(SaltPayActivationStep.ClaimInProgress)) dispatchOnMain(OnboardingSaltPayAction.RefreshClaim) } @@ -242,10 +242,10 @@ private fun handleOnboardingSaltPayAction(anyAction: Action, appState: () -> App private fun handleAnalytics(analyticsHandler: GlobalAnalyticsEventHandler, step: SaltPayActivationStep) { when (step) { - SaltPayActivationStep.KycStart -> analyticsHandler.handleAnalyticsEvent(Onboarding.KYCStarted()) - SaltPayActivationStep.KycWaiting -> analyticsHandler.handleAnalyticsEvent(Onboarding.KYCInProgress()) - SaltPayActivationStep.KycReject -> analyticsHandler.handleAnalyticsEvent(Onboarding.KYCRejected()) - SaltPayActivationStep.Claim -> analyticsHandler.handleAnalyticsEvent(Onboarding.ClaimScreenOpened()) + SaltPayActivationStep.KycStart -> analyticsHandler.send(Onboarding.KYCStarted()) + SaltPayActivationStep.KycWaiting -> analyticsHandler.send(Onboarding.KYCInProgress()) + SaltPayActivationStep.KycReject -> analyticsHandler.send(Onboarding.KYCRejected()) + SaltPayActivationStep.Claim -> analyticsHandler.send(Onboarding.ClaimScreenOpened()) else -> {} } } diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt index 22cd5ad13a..49bbefe866 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt @@ -250,7 +250,7 @@ private fun sendTransaction( feeAmount = feeAmount, destinationAddress = destinationAddress, ) - store.state.globalState.analyticsHandler?.handleBlockchainSdkErrorEvent( + store.state.globalState.analyticsHandler?.send( error = sendResult.error, action = AnalyticsAnOld.ActionToLog.SendTransaction, params = mapOf(AnalyticsParamAnOld.BLOCKCHAIN to walletManager.wallet.blockchain.currency), 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 ca2323f38e..5e34717f5d 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 @@ -186,7 +186,7 @@ class WalletMiddleware { } is CompletionResult.Failure -> { (result.error as? TangemSdkError)?.let { error -> - store.state.globalState.analyticsHandler?.handleCardSdkErrorEvent( + store.state.globalState.analyticsHandler?.send( error, AnalyticsAnOld.ActionToLog.CreateWallet, card = store.state.detailsState.scanResponse?.card