diff --git a/app/build.gradle b/app/build.gradle index 3e16223f89..a875995cbe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -127,8 +127,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' @@ -144,8 +145,8 @@ dependencies { implementation("com.squareup.okhttp3:okhttp") implementation("com.squareup.okhttp3:logging-interceptor") -// -// //Crypto + + //Crypto implementation "com.madgag.spongycastle:core:1.58.0.0" // animation diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4dfca87b23..3a5c5bf394 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/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index b58485ab88..35e0c31944 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -1,7 +1,6 @@ package com.tangem.tap import android.app.Application -import com.appsflyer.AppsFlyerLib import com.google.firebase.ktx.Firebase import com.google.firebase.remoteconfig.ktx.remoteConfig import com.google.firebase.remoteconfig.ktx.remoteConfigSettings @@ -59,20 +58,22 @@ class TapApplication : Application() { }) } - NetworkConnectivity.createInstance(store, this) - preferencesStorage = PreferencesStorage(this) - PicassoHelper.initPicassoWithCaching(this) + val application = this + NetworkConnectivity.createInstance(store, application) + preferencesStorage = PreferencesStorage(application) + PicassoHelper.initPicassoWithCaching(application) currenciesRepository = CurrenciesRepository( this, store.state.domainNetworks.tangemTechService ) - walletConnectRepository = WalletConnectRepository(this) + walletConnectRepository = WalletConnectRepository(application) initFeedbackManager() loadConfigs() BlockchainSdkRetrofitBuilder.enableNetworkLogging = BuildConfig.DEBUG - initAppsFlyer() + val analyticsHandler = GlobalAnalyticsHandler.createDefaultAnalyticHandlers(application) + store.dispatch(GlobalAction.SetAnanlyticHandlers(analyticsHandler)) } private fun loadConfigs() { @@ -97,14 +98,6 @@ class TapApplication : Application() { store.dispatch(GlobalAction.SetFeedbackManager(FeedbackManager(infoHolder, logWriter))) } - - private fun initAppsFlyer() { - val devKey = store.state.globalState.configManager?.config?.appsFlyerDevKey ?: return - AppsFlyerLib.getInstance().init(devKey, null, this) - AppsFlyerLib.getInstance().start(this) - val analyticsHandler = GlobalAnalyticsHandler.createDefaultAnalyticHandlers(this) - store.dispatch(GlobalAction.SetAnanlyticHandlers(analyticsHandler)) - } } data class LogConfig( 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 64beb11b4a..b36ecebbcf 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 @@ -17,7 +17,7 @@ class AppsFlyerAnalyticsHandler(val context: Application): AnalyticsHandler() { params: Map ) { AppsFlyerLib.getInstance().logEvent(context, - event.event, prepareParams(card, blockchain)) + 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 c500f330b2..0c23b37305 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.app.Application +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() { @@ -42,13 +45,34 @@ class GlobalAnalyticsHandler(val analyticsHandlers: List) : } companion object { - fun createDefaultAnalyticHandlers(context: Application): GlobalAnalyticsHandler { + fun createDefaultAnalyticHandlers(application: Application): GlobalAnalyticsHandler { + initAnalytics(application) return GlobalAnalyticsHandler( listOf( FirebaseAnalyticsHandler, - AppsFlyerAnalyticsHandler(context) + AppsFlyerAnalyticsHandler(application), + AmplitudeAnalyticsHandler() ) ) } + + private fun initAnalytics(application: Application) { + initAppsFlyer(application) + initAmplitude(application) + } + + private fun initAppsFlyer(application: Application) { + val devKey = store.state.globalState.configManager?.config?.appsFlyerDevKey ?: return + AppsFlyerLib.getInstance().init(devKey, null, application) + AppsFlyerLib.getInstance().start(application) + + } + + private fun initAmplitude(application: Application) { + val apiKey = store.state.globalState.configManager?.config?.amplitudeApiKey ?: return + Amplitude.getInstance() + .initialize(application.applicationContext, apiKey) + .enableForegroundTracking(application) + } } } \ 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 cb587f277b..3bc8046f84 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 @@ -14,6 +14,7 @@ data class Config( val onramperApiKey: String = "pk_test_Ix2aCF3ej_5tcDKkBR7MChIvf5Nb0oPORPQ3Oal5G8I0", val moonPayApiSecretKey: String = "sk_test_V8w4M19LbDjjYOt170s0tGuvXAgyEb1C", val appsFlyerDevKey: String = "", + val amplitudeApiKey: String = "", val blockchainSdkConfig: BlockchainSdkConfig = BlockchainSdkConfig(), val isSendingToPayIdEnabled: Boolean = true, val isTopUpEnabled: Boolean = false, @@ -91,6 +92,7 @@ class ConfigManager( infuraProjectId = values.infuraProjectId ), appsFlyerDevKey = values.appsFlyerDevKey, + amplitudeApiKey = values.amplitudeApiKey, shopify = values.shopifyShop, ) defaultConfig = defaultConfig.copy( @@ -105,6 +107,7 @@ class ConfigManager( infuraProjectId = values.infuraProjectId ), appsFlyerDevKey = values.appsFlyerDevKey, + amplitudeApiKey = values.amplitudeApiKey, shopify = values.shopifyShop, ) } 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 41d1ea2022..f206d85362 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 @@ -23,6 +23,7 @@ class ConfigValueModel( val blockcypherTokens: Set?, val infuraProjectId: String?, val appsFlyerDevKey: String, + val amplitudeApiKey: String, val shopifyShop: ShopifyShop? )