Updated on 2026-08-14

This commit is contained in:
Tangem 2022-11-02 19:26:45 +05:00
parent c2b57b28b0
commit 9c3cd6f2d3
9 changed files with 76 additions and 42 deletions

View file

@ -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) {

View file

@ -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<AnalyticsEventFilter>()
private val handlers = mutableMapOf<String, AnalyticsEventHandler>()
private val analyticsHandlers: List<AnalyticsEventHandler>
@ -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<ShopifyOrderEventHandler>().forEach {
it.send(order, productType)
}
}
override fun prepareParams(card: Card?, blockchain: String?, params: Map<String, String>): Map<String, String> {
return super.prepareParams(card, blockchain, params).toMutableMap().apply {
putAll(attachToAllEventsParams)

View file

@ -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)
}

View file

@ -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
}

View file

@ -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?

View file

@ -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
}
}
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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 {