diff --git a/app/build.gradle b/app/build.gradle index c37a4da509..1ba0960f0b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -126,8 +126,9 @@ dependencies { implementation 'com.google.firebase:firebase-config-ktx' implementation 'com.google.firebase:firebase-analytics-ktx' - // AppsFlyer + // Analytics implementation 'com.appsflyer:af-android-sdk:6.5.1' + implementation 'com.amplitude:android-sdk:2.36.1' // WalletConnect implementation 'com.github.salomonbrys.kotson:kotson:2.5.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b460cf581a..035e162458 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,7 @@ + diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AmplitudeAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/AmplitudeAnalyticsHandler.kt new file mode 100644 index 0000000000..b68a9a3eb5 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/analytics/AmplitudeAnalyticsHandler.kt @@ -0,0 +1,56 @@ +package com.tangem.tap.common.analytics + +import com.amplitude.api.Amplitude +import com.amplitude.api.AmplitudeClient +import com.shopify.buy3.Storefront +import com.tangem.common.card.Card +import com.tangem.common.core.TangemSdkError +import org.json.JSONObject + +class AmplitudeAnalyticsHandler : AnalyticsHandler() { + + private val client: AmplitudeClient = Amplitude.getInstance() + + override fun triggerEvent( + event: AnalyticsEvent, + card: Card?, + blockchain: String?, + params: Map + ) { + client.logEvent(event.event, prepareParams(card, blockchain, params).toJson()) + } + + override fun triggerEvent(event: String, params: Map) { + client.logEvent(event, params.toJson()) + } + + override fun logCardSdkError( + error: TangemSdkError, + actionToLog: Analytics.ActionToLog, + parameters: Map?, + card: Card? + ) { + //TODO + } + + override fun logError(error: Throwable, params: Map) { + //TODO + } + + override fun getOrderEvent(): String { + //TODO + return "" + } + + override fun getOrderParams(order: Storefront.Order): Map { + //TODO + return emptyMap() + } + + private fun Map.toJson(): JSONObject { + val json = JSONObject() + this.map { json.put(it.key, it.value) } + return json + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandler.kt index 424f06d9ce..5386779df4 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandler.kt @@ -31,12 +31,16 @@ abstract class AnalyticsHandler { params: Map = emptyMap() ) - protected fun prepareParams(card: Card?, blockchain: String? = null): Map { + protected fun prepareParams( + card: Card?, + blockchain: String? = null, + params: Map = emptyMap() + ): Map { return mapOf( AnalyticsParam.FIRMWARE.param to card?.firmwareVersion?.stringValue, AnalyticsParam.BATCH_ID.param to card?.batchId, AnalyticsParam.BLOCKCHAIN.param to blockchain, - ).filterNotNull() + ).filterNotNull() + params } fun logWcEvent(event: Analytics.WcAnalyticsEvent) { diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AppsFlyerAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/AppsFlyerAnalyticsHandler.kt index 16fa1644ab..3ca690a971 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/AppsFlyerAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/AppsFlyerAnalyticsHandler.kt @@ -16,7 +16,11 @@ class AppsFlyerAnalyticsHandler(val context: Context): AnalyticsHandler() { blockchain: String?, params: Map ) { - AppsFlyerLib.getInstance().logEvent(context, event.event, prepareParams(card, blockchain)) + AppsFlyerLib.getInstance().logEvent( + context, + event.event, + prepareParams(card, blockchain, params) + ) } override fun logCardSdkError( diff --git a/app/src/main/java/com/tangem/tap/common/analytics/FirebaseAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/FirebaseAnalyticsHandler.kt index 4e0371206a..e691c2239f 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/FirebaseAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/FirebaseAnalyticsHandler.kt @@ -17,7 +17,7 @@ object FirebaseAnalyticsHandler : AnalyticsHandler() { blockchain: String?, params: Map ) { - val fullParams = prepareParams(card, blockchain) + params + val fullParams = prepareParams(card, blockchain, params) Firebase.analytics.logEvent(event.event, fullParams.toBundle()) } @@ -42,7 +42,7 @@ object FirebaseAnalyticsHandler : AnalyticsHandler() { if (error is TangemSdkError.UserCancelled) return val params = parameters?.toMutableMap() ?: mutableMapOf() - if (card != null) params + prepareParams(card) + if (card != null) params + prepareParams(card) params[AnalyticsParam.ACTION] = actionToLog.key params[AnalyticsParam.ERROR_CODE] = error.code.toString() params[AnalyticsParam.ERROR_DESCRIPTION] = error.javaClass.simpleName diff --git a/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt index 197f396621..83b77c56e8 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt @@ -1,9 +1,12 @@ package com.tangem.tap.common.analytics import android.content.Context +import com.amplitude.api.Amplitude +import com.appsflyer.AppsFlyerLib import com.shopify.buy3.Storefront import com.tangem.common.card.Card import com.tangem.common.core.TangemSdkError +import com.tangem.tap.store class GlobalAnalyticsHandler(val analyticsHandlers: List) : AnalyticsHandler() { @@ -46,9 +49,29 @@ class GlobalAnalyticsHandler(val analyticsHandlers: List) : return GlobalAnalyticsHandler( listOf( FirebaseAnalyticsHandler, - AppsFlyerAnalyticsHandler(context) + AppsFlyerAnalyticsHandler(context), + AmplitudeAnalyticsHandler() ) ) } + + private fun initAnalytics(context: Context) { + initAppsFlyer(context) + initAmplitude(context) + } + + private fun initAppsFlyer(context: Context) { + val devKey = store.state.globalState.configManager?.config?.appsFlyerDevKey ?: return + AppsFlyerLib.getInstance().init(devKey, null, context) + AppsFlyerLib.getInstance().start(context) + + } + + private fun initAmplitude(context: Context) { + val apiKey = store.state.globalState.configManager?.config?.amplitudeApiKey ?: return + Amplitude.getInstance() + .initialize(context.applicationContext, apiKey) + .enableForegroundTracking(context) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt b/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt index 62f367cb33..81ce11fd37 100644 --- a/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt @@ -15,6 +15,7 @@ data class Config( val mercuryoWidgetId: String = "", val mercuryoSecret: String = "", val appsFlyerDevKey: String = "", + val amplitudeApiKey: String = "", val blockchainSdkConfig: BlockchainSdkConfig = BlockchainSdkConfig(), val isSendingToPayIdEnabled: Boolean = true, val isTopUpEnabled: Boolean = false, @@ -88,6 +89,7 @@ class ConfigManager { tronGridApiKey = values.tronGridApiKey ), appsFlyerDevKey = values.appsFlyerDevKey, + amplitudeApiKey = values.amplitudeApiKey, shopify = values.shopifyShop, zendesk = values.zendesk, ) @@ -104,6 +106,7 @@ class ConfigManager { infuraProjectId = values.infuraProjectId ), appsFlyerDevKey = values.appsFlyerDevKey, + amplitudeApiKey = values.amplitudeApiKey, shopify = values.shopifyShop, zendesk = values.zendesk, ) diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt b/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt index 6e119fc5e6..16af7f21e1 100644 --- a/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt +++ b/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt @@ -8,29 +8,33 @@ import com.tangem.tap.common.zendesk.ZendeskConfig */ class FeatureModel( - val isWalletPayIdEnabled: Boolean, - val isTopUpEnabled: Boolean, - val isSendingToPayIdEnabled: Boolean, - val isCreatingTwinCardsAllowed: Boolean, + val isWalletPayIdEnabled: Boolean, + val isTopUpEnabled: Boolean, + val isSendingToPayIdEnabled: Boolean, + val isCreatingTwinCardsAllowed: Boolean, ) class ConfigValueModel( - val coinMarketCapKey: String, - val mercuryoWidgetId: String, - val mercuryoSecret: String, - val moonPayApiKey: String, - val moonPayApiSecretKey: String, - val blockchairApiKey: String?, - val blockchairAuthorizationToken: String?, - val blockcypherTokens: Set?, - val infuraProjectId: String?, - val appsFlyerDevKey: String, - val shopifyShop: ShopifyShop?, - val zendesk: ZendeskConfig?, - val tronGridApiKey: String, + val coinMarketCapKey: String, + val mercuryoWidgetId: String, + val mercuryoSecret: String, + val moonPayApiKey: String, + val moonPayApiSecretKey: String, + val blockchairApiKey: String?, + val blockchairAuthorizationToken: String?, + val blockcypherTokens: Set?, + val infuraProjectId: String?, + val appsFlyerDevKey: String, + val shopifyShop: ShopifyShop?, + val zendesk: ZendeskConfig?, + val tronGridApiKey: String, + val amplitudeApiKey: String, ) -class ConfigModel(val features: FeatureModel?, val configValues: ConfigValueModel?) { +class ConfigModel( + val features: FeatureModel?, + val configValues: ConfigValueModel?, +) { companion object { fun empty(): ConfigModel = ConfigModel(null, null) }