From 9c3cd6f2d3df061a26a931bdd0fabd2bb22d2878 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Nov 2022 19:26:45 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../java/com/tangem/tap/TapApplication.kt | 4 +++ .../tangem/tap/common/analytics/Analytics.kt | 30 ++++++++++++------- .../analytics/GlobalAnalyticsEventHandler.kt | 9 ++++-- .../common/analytics/api/EventFilterApi.kt | 12 ++++++++ .../common/analytics/api/EventHandlerApi.kt | 6 ---- .../filters/ShopPurchasedEventFilter.kt | 25 ++++++++++++++++ .../appsFlyer/AppsFlyerAnalyticsHandler.kt | 12 +------- .../firebase/FirebaseAnalyticsHandler.kt | 12 +------- .../tap/common/shop/TangemShopService.kt | 8 ++++- 9 files changed, 76 insertions(+), 42 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/common/analytics/api/EventFilterApi.kt create mode 100644 app/src/main/java/com/tangem/tap/common/analytics/filters/ShopPurchasedEventFilter.kt diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 1913ac6e16..5417042486 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -17,6 +17,7 @@ import com.tangem.tap.common.AssetReader 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.filters.ShopPurchasedEventFilter 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 @@ -122,6 +123,9 @@ class TapApplication : Application(), ImageLoaderFactory { factory.build(buildData).forEach { Analytics.addHandler(it.id(), it) } + listOf( + ShopPurchasedEventFilter(), + ).forEach { Analytics.addFilter(it) } } private fun initFeedbackManager(context: Context, preferencesStorage: PreferencesStorage, config: Config) { diff --git a/app/src/main/java/com/tangem/tap/common/analytics/Analytics.kt b/app/src/main/java/com/tangem/tap/common/analytics/Analytics.kt index 386213f341..57617de12b 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/Analytics.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/Analytics.kt @@ -1,23 +1,22 @@ package com.tangem.tap.common.analytics -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.tap.common.analytics.api.AnalyticsEventFilter 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.ErrorEventLogger -import com.tangem.tap.common.analytics.api.ShopifyOrderEventHandler import com.tangem.tap.common.analytics.events.AnalyticsEvent import com.tangem.tap.common.extensions.filterNotNull -import com.tangem.tap.common.shop.data.ProductType /** [REDACTED_AUTHOR] */ object Analytics : GlobalAnalyticsEventHandler { + private val eventFilters = mutableListOf() private val handlers = mutableMapOf() private val analyticsHandlers: List @@ -35,6 +34,14 @@ object Analytics : GlobalAnalyticsEventHandler { return handlers.remove(name) } + override fun addFilter(filter: AnalyticsEventFilter) { + eventFilters.add(filter) + } + + override fun removeFilter(filter: AnalyticsEventFilter) { + eventFilters.remove(filter) + } + override fun attachToAllEvents(key: String, value: String) { attachToAllEventsParams[key] = value } @@ -44,7 +51,16 @@ object Analytics : GlobalAnalyticsEventHandler { } override fun send(event: AnalyticsEvent, card: Card?, blockchain: String?) { - analyticsHandlers.forEach { it.send(event, card, blockchain) } + val eventFilter = eventFilters.firstOrNull { it.canBeAppliedTo(event) } + + when { + eventFilter == null -> analyticsHandlers.forEach { it.send(event, card, blockchain) } + eventFilter.canBeSent(event) -> { + analyticsHandlers + .filter { eventFilter.canBeConsumedBy(it, event) } + .forEach { it.send(event) } + } + } } override fun handleAnalyticsEvent( @@ -86,12 +102,6 @@ object Analytics : GlobalAnalyticsEventHandler { } } - override fun send(order: Storefront.Order, productType: ProductType) { - analyticsHandlers.filterIsInstance().forEach { - it.send(order, productType) - } - } - override fun prepareParams(card: Card?, blockchain: String?, params: Map): Map { return super.prepareParams(card, blockchain, params).toMutableMap().apply { putAll(attachToAllEventsParams) 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 index 139ffa5582..287f991527 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsEventHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsEventHandler.kt @@ -1,18 +1,21 @@ package com.tangem.tap.common.analytics +import com.tangem.tap.common.analytics.api.AnalyticsEventFilter 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 { + SdkErrorEventHandler { fun addHandler(name: String, handler: AnalyticsEventHandler) fun removeHandler(name: String): AnalyticsEventHandler? + fun addFilter(filter: AnalyticsEventFilter) + + fun removeFilter(filter: AnalyticsEventFilter) + fun attachToAllEvents(key: String, value: String) } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/api/EventFilterApi.kt b/app/src/main/java/com/tangem/tap/common/analytics/api/EventFilterApi.kt new file mode 100644 index 0000000000..a4e93fa75b --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/analytics/api/EventFilterApi.kt @@ -0,0 +1,12 @@ +package com.tangem.tap.common.analytics.api + +import com.tangem.tap.common.analytics.events.AnalyticsEvent + +/** +[REDACTED_AUTHOR] + */ +interface AnalyticsEventFilter { + fun canBeAppliedTo(event: AnalyticsEvent): Boolean + fun canBeSent(event: AnalyticsEvent): Boolean + fun canBeConsumedBy(handler: AnalyticsEventHandler, event: AnalyticsEvent): Boolean +} \ 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 5eda855ec2..494747287e 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,7 +1,6 @@ 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 @@ -13,7 +12,6 @@ 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.common.shop.data.ProductType import com.tangem.tap.domain.configurable.config.Config /** @@ -83,10 +81,6 @@ interface BlockchainSdkErrorEventHandler { ) } -interface ShopifyOrderEventHandler { - fun send(order: Storefront.Order, productType: ProductType) -} - interface AnalyticsHandlerBuilder { fun build(data: Data): AnalyticsEventHandler? diff --git a/app/src/main/java/com/tangem/tap/common/analytics/filters/ShopPurchasedEventFilter.kt b/app/src/main/java/com/tangem/tap/common/analytics/filters/ShopPurchasedEventFilter.kt new file mode 100644 index 0000000000..5267782ddc --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/analytics/filters/ShopPurchasedEventFilter.kt @@ -0,0 +1,25 @@ +package com.tangem.tap.common.analytics.filters + +import com.tangem.tap.common.analytics.api.AnalyticsEventFilter +import com.tangem.tap.common.analytics.api.AnalyticsEventHandler +import com.tangem.tap.common.analytics.events.AnalyticsEvent +import com.tangem.tap.common.analytics.events.Shop +import com.tangem.tap.common.analytics.handlers.appsFlyer.AppsFlyerAnalyticsHandler +import com.tangem.tap.common.analytics.handlers.firebase.FirebaseAnalyticsHandler + +/** +[REDACTED_AUTHOR] + */ +class ShopPurchasedEventFilter : AnalyticsEventFilter { + + override fun canBeAppliedTo(event: AnalyticsEvent): Boolean = event is Shop.Purchased + + override fun canBeSent(event: AnalyticsEvent): Boolean = true + + override fun canBeConsumedBy(handler: AnalyticsEventHandler, event: AnalyticsEvent): Boolean { + return when (handler) { + is AppsFlyerAnalyticsHandler, is FirebaseAnalyticsHandler -> true + else -> false + } + } +} \ No newline at end of file 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 fe23cfd753..b91da358d6 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 @@ -1,15 +1,11 @@ package com.tangem.tap.common.analytics.handlers.appsFlyer -import com.shopify.buy3.Storefront import com.tangem.tap.common.analytics.api.AnalyticsEventHandler import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder -import com.tangem.tap.common.analytics.api.ShopifyOrderEventHandler -import com.tangem.tap.common.analytics.converters.ShopOrderToEventConverter -import com.tangem.tap.common.shop.data.ProductType class AppsFlyerAnalyticsHandler( private val client: AppsFlyerAnalyticsClient, -) : AnalyticsEventHandler, ShopifyOrderEventHandler { +) : AnalyticsEventHandler { override fun id(): String = ID @@ -17,12 +13,6 @@ class AppsFlyerAnalyticsHandler( client.logEvent(event, params) } - override fun send(order: Storefront.Order, productType: ProductType) { - //TODO: make sending this event through filters - val event = ShopOrderToEventConverter().convert(order to productType) - send(event) - } - companion object { const val ID = "AppsFlyer" } 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 f2abc8ca76..9a4a8bf839 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 @@ -1,6 +1,5 @@ package com.tangem.tap.common.analytics.handlers.firebase -import com.shopify.buy3.Storefront import com.tangem.blockchain.common.BlockchainError import com.tangem.common.card.Card import com.tangem.common.core.TangemSdkError @@ -10,15 +9,12 @@ 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 import com.tangem.tap.common.analytics.converters.BlockchainSdkErrorConverter import com.tangem.tap.common.analytics.converters.CardSdkErrorConverter -import com.tangem.tap.common.analytics.converters.ShopOrderToEventConverter -import com.tangem.tap.common.shop.data.ProductType class FirebaseAnalyticsHandler( private val client: FirebaseAnalyticsClient, -) : AnalyticsEventHandler, ErrorEventHandler, SdkErrorEventHandler, ShopifyOrderEventHandler { +) : AnalyticsEventHandler, ErrorEventHandler, SdkErrorEventHandler { override fun id(): String = ID @@ -57,12 +53,6 @@ class FirebaseAnalyticsHandler( } } - override fun send(order: Storefront.Order, productType: ProductType) { - //TODO: make sending this event through filters - val event = ShopOrderToEventConverter().convert(order to productType) - send(event) - } - companion object { const val ID = "Firebase" } 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 3d2c060786..271886dea1 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 @@ -5,6 +5,7 @@ import android.content.Intent import com.google.android.gms.wallet.PaymentData import com.shopify.buy3.Storefront import com.tangem.tap.common.analytics.Analytics +import com.tangem.tap.common.analytics.converters.ShopOrderToEventConverter import com.tangem.tap.common.extensions.filterNotNull import com.tangem.tap.common.shop.data.ProductType import com.tangem.tap.common.shop.data.TangemProduct @@ -198,7 +199,12 @@ class TangemShopService(application: Application, shopifyShop: ShopifyShop) { suspend fun waitForCheckout(productType: ProductType) { val result = shopifyService.checkout(true, checkouts[productType]!!.id) - result.onSuccess { checkout -> checkout.order?.let { Analytics.send(it, productType) } } + result.onSuccess { checkout -> + checkout.order?.let { + val event = ShopOrderToEventConverter().convert(it to productType) + Analytics.send(event) + } + } } companion object {