From 431852f30c12e5f97ae3ea7539bf3e3cc5c7dc97 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 8 Nov 2022 14:53:46 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../tangem/tap/common/analytics/Analytics.kt | 60 ++++++++++++++----- 1 file changed, 44 insertions(+), 16 deletions(-) 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 57617de12b..6e773bceab 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 @@ -3,6 +3,7 @@ package com.tangem.tap.common.analytics import com.tangem.blockchain.common.BlockchainError import com.tangem.common.card.Card import com.tangem.common.core.TangemSdkError +import com.tangem.domain.common.FeatureCoroutineExceptionHandler import com.tangem.tap.common.analytics.api.AnalyticsEventFilter import com.tangem.tap.common.analytics.api.AnalyticsEventHandler import com.tangem.tap.common.analytics.api.BlockchainSdkErrorEventHandler @@ -10,12 +11,20 @@ import com.tangem.tap.common.analytics.api.CardSdkErrorEventHandler import com.tangem.tap.common.analytics.api.ErrorEventLogger import com.tangem.tap.common.analytics.events.AnalyticsEvent import com.tangem.tap.common.extensions.filterNotNull +import kotlinx.coroutines.CoroutineName +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.asCoroutineDispatcher +import kotlinx.coroutines.launch +import java.util.concurrent.Executors /** [REDACTED_AUTHOR] */ object Analytics : GlobalAnalyticsEventHandler { + internal val analyticsScope: CoroutineScope by lazy { createScope() } + private val eventFilters = mutableListOf() private val handlers = mutableMapOf() @@ -47,18 +56,22 @@ object Analytics : GlobalAnalyticsEventHandler { } override fun send(event: String, params: Map) { - analyticsHandlers.forEach { it.send(event, params) } + analyticsScope.launch { + analyticsHandlers.forEach { it.send(event, params) } + } } override fun send(event: AnalyticsEvent, card: Card?, blockchain: String?) { - val eventFilter = eventFilters.firstOrNull { it.canBeAppliedTo(event) } + analyticsScope.launch { + 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) } + when { + eventFilter == null -> analyticsHandlers.forEach { it.send(event, card, blockchain) } + eventFilter.canBeSent(event) -> { + analyticsHandlers + .filter { eventFilter.canBeConsumedBy(it, event) } + .forEach { it.send(event) } + } } } } @@ -69,14 +82,18 @@ object Analytics : GlobalAnalyticsEventHandler { card: Card?, blockchain: String?, ) { - analyticsHandlers.forEach { - it.handleAnalyticsEvent(event, params, card, blockchain) + analyticsScope.launch { + analyticsHandlers.forEach { + it.handleAnalyticsEvent(event, params, card, blockchain) + } } } override fun send(error: Throwable, params: Map) { - analyticsHandlers.filterIsInstance().forEach { - it.logErrorEvent(error, params) + analyticsScope.launch { + analyticsHandlers.filterIsInstance().forEach { + it.logErrorEvent(error, params) + } } } @@ -86,8 +103,10 @@ object Analytics : GlobalAnalyticsEventHandler { params: Map, card: Card?, ) { - analyticsHandlers.filterIsInstance().forEach { - it.send(error, action, params, card) + analyticsScope.launch { + analyticsHandlers.filterIsInstance().forEach { + it.send(error, action, params, card) + } } } @@ -97,8 +116,10 @@ object Analytics : GlobalAnalyticsEventHandler { params: Map, card: Card?, ) { - analyticsHandlers.filterIsInstance().forEach { - it.send(error, action, params, card) + analyticsScope.launch { + analyticsHandlers.filterIsInstance().forEach { + it.send(error, action, params, card) + } } } @@ -107,6 +128,13 @@ object Analytics : GlobalAnalyticsEventHandler { putAll(attachToAllEventsParams) } } + + private fun createScope(): CoroutineScope { + val name = "Analytics" + val dispatcher = Executors.newFixedThreadPool(1).asCoroutineDispatcher() + val exceptionHandler = FeatureCoroutineExceptionHandler.create(name) + return CoroutineScope(Job() + dispatcher + CoroutineName(name) + exceptionHandler) + } } fun GlobalAnalyticsEventHandler.logWcEvent(event: AnalyticsAnOld.WcAnalyticsEvent) {