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