From eeca735cc0a4d5f8cbc47e94c5ef07507365932e Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 3 May 2024 13:07:32 +0100 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/core/analytics/Analytics.kt | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/core/analytics/src/main/java/com/tangem/core/analytics/Analytics.kt b/core/analytics/src/main/java/com/tangem/core/analytics/Analytics.kt index 3c12cf80a8..790de00ea3 100644 --- a/core/analytics/src/main/java/com/tangem/core/analytics/Analytics.kt +++ b/core/analytics/src/main/java/com/tangem/core/analytics/Analytics.kt @@ -4,6 +4,8 @@ import com.tangem.core.analytics.api.* import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.utils.coroutines.FeatureCoroutineExceptionHandler import kotlinx.coroutines.* +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import java.util.concurrent.Executors /** @@ -22,6 +24,7 @@ object Analytics : GlobalAnalyticsEventHandler { private val handlers = mutableMapOf() private val paramsInterceptors = mutableMapOf() private val analyticsFilters = mutableSetOf() + private val analyticsMutex = Mutex() private val analyticsHandlers: List get() = handlers.values.toList() @@ -55,23 +58,26 @@ object Analytics : GlobalAnalyticsEventHandler { event.params = applyParamsInterceptors(event) val eventFilter = analyticsFilters.firstOrNull { it.canBeAppliedTo(event) } - when { - eventFilter == null -> analyticsHandlers.forEach { handler -> handler.send(event) } - eventFilter.canBeSent(event) -> { - analyticsHandlers - .filter { handler -> eventFilter.canBeConsumedByHandler(handler, event) } - .forEach { handler -> handler.send(event) } + analyticsMutex.withLock { + when { + eventFilter == null -> analyticsHandlers.forEach { handler -> handler.send(event) } + eventFilter.canBeSent(event) -> { + analyticsHandlers + .filter { handler -> eventFilter.canBeConsumedByHandler(handler, event) } + .forEach { handler -> handler.send(event) } + } } } } } - private fun applyParamsInterceptors(event: AnalyticsEvent): MutableMap { + private suspend fun applyParamsInterceptors(event: AnalyticsEvent): MutableMap { val interceptedParams = event.params.toMutableMap() - paramsInterceptors.values - .filter { it.canBeAppliedTo(event) } - .forEach { it.intercept(interceptedParams) } - + analyticsMutex.withLock { + paramsInterceptors.values + .filter { it.canBeAppliedTo(event) } + .forEach { it.intercept(interceptedParams) } + } return interceptedParams }