diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAppInstanceIdProvider.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAppInstanceIdProvider.kt new file mode 100644 index 0000000000..8d33e1522e --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAppInstanceIdProvider.kt @@ -0,0 +1,24 @@ +package com.tangem.tap.common.analytics.handlers.firebase + +import com.google.firebase.analytics.ktx.analytics +import com.google.firebase.ktx.Firebase +import com.tangem.core.analytics.AppInstanceIdProvider +import kotlinx.coroutines.suspendCancellableCoroutine +import timber.log.Timber +import kotlin.coroutines.resume + +internal class FirebaseAppInstanceIdProvider : AppInstanceIdProvider { + + override suspend fun getAppInstanceId(): String? = suspendCancellableCoroutine { continuation -> + Firebase.analytics.appInstanceId + .addOnSuccessListener { continuation.resume(it) } + .addOnFailureListener { + Timber.w("Fail to get appInstanceId") + continuation.resume(null) + } + } + + override fun getAppInstanceIdSync(): String? { + return Firebase.analytics.appInstanceId.result + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/di/analytics/AnalyticsModule.kt b/app/src/main/java/com/tangem/tap/di/analytics/AnalyticsModule.kt index c687d63c10..60fea2b718 100644 --- a/app/src/main/java/com/tangem/tap/di/analytics/AnalyticsModule.kt +++ b/app/src/main/java/com/tangem/tap/di/analytics/AnalyticsModule.kt @@ -1,9 +1,11 @@ package com.tangem.tap.di.analytics +import com.tangem.core.analytics.AppInstanceIdProvider import com.tangem.core.analytics.utils.AnalyticsContextProxy import com.tangem.domain.analytics.ChangeCardAnalyticsContextUseCase import com.tangem.tap.common.analytics.DefaultAnalyticsContextProxy import com.tangem.tap.common.analytics.DefaultChangeCardAnalyticsContextUseCase +import com.tangem.tap.common.analytics.handlers.firebase.FirebaseAppInstanceIdProvider import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -23,4 +25,8 @@ internal object AnalyticsModule { @Provides @Singleton fun provideAnalyticsContextProxy(): AnalyticsContextProxy = DefaultAnalyticsContextProxy() + + @Provides + @Singleton + fun provideAppInstanceIdProvider(): AppInstanceIdProvider = FirebaseAppInstanceIdProvider() } \ No newline at end of file diff --git a/core/analytics/src/main/java/com/tangem/core/analytics/AppInstanceIdProvider.kt b/core/analytics/src/main/java/com/tangem/core/analytics/AppInstanceIdProvider.kt new file mode 100644 index 0000000000..0d1e973283 --- /dev/null +++ b/core/analytics/src/main/java/com/tangem/core/analytics/AppInstanceIdProvider.kt @@ -0,0 +1,8 @@ +package com.tangem.core.analytics + +interface AppInstanceIdProvider { + + suspend fun getAppInstanceId(): String? + + fun getAppInstanceIdSync(): String? +} \ No newline at end of file diff --git a/core/analytics/src/main/java/com/tangem/core/analytics/DummyAppInstanceIdProvider.kt b/core/analytics/src/main/java/com/tangem/core/analytics/DummyAppInstanceIdProvider.kt new file mode 100644 index 0000000000..94f92f0b3c --- /dev/null +++ b/core/analytics/src/main/java/com/tangem/core/analytics/DummyAppInstanceIdProvider.kt @@ -0,0 +1,12 @@ +package com.tangem.core.analytics + +class DummyAppInstanceIdProvider : AppInstanceIdProvider { + + override suspend fun getAppInstanceId(): String? { + return null + } + + override fun getAppInstanceIdSync(): String? { + return null + } +} \ No newline at end of file diff --git a/features/details/impl/build.gradle.kts b/features/details/impl/build.gradle.kts index b8d9e6465d..9a16bc4892 100644 --- a/features/details/impl/build.gradle.kts +++ b/features/details/impl/build.gradle.kts @@ -23,6 +23,7 @@ dependencies { implementation(projects.core.ui) implementation(projects.core.featuretoggles) implementation(projects.core.navigation) + implementation(projects.core.analytics) implementation(projects.core.analytics.models) implementation(projects.common.routing) implementation(projects.common.ui) diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt index 209cad1288..1a15b85fc5 100644 --- a/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt @@ -2,6 +2,7 @@ package com.tangem.features.details.component.preview import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import com.tangem.core.analytics.DummyAppInstanceIdProvider import com.tangem.core.decompose.navigation.DummyRouter import com.tangem.core.navigation.url.DummyUrlOpener import com.tangem.features.details.component.DetailsComponent @@ -18,6 +19,7 @@ internal class PreviewDetailsComponent : DetailsComponent { ItemsBuilder( router = DummyRouter(), urlOpener = DummyUrlOpener(), + appInstanceIdProvider = DummyAppInstanceIdProvider(), ).buildAll(isWalletConnectAvailable = true, onSupportClick = {}) } diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/ItemsBuilder.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/ItemsBuilder.kt index f14c204327..2f1093804f 100644 --- a/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/ItemsBuilder.kt +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/ItemsBuilder.kt @@ -1,6 +1,7 @@ package com.tangem.features.details.utils import com.tangem.common.routing.AppRoute +import com.tangem.core.analytics.AppInstanceIdProvider import com.tangem.core.decompose.di.ComponentScoped import com.tangem.core.decompose.navigation.Router import com.tangem.core.navigation.url.UrlOpener @@ -19,6 +20,7 @@ import javax.inject.Inject internal class ItemsBuilder @Inject constructor( private val router: Router, private val urlOpener: UrlOpener, + private val appInstanceIdProvider: AppInstanceIdProvider, ) { fun buildAll(isWalletConnectAvailable: Boolean, onSupportClick: () -> Unit): ImmutableList = @@ -50,7 +52,7 @@ internal class ItemsBuilder @Inject constructor( block = BlockUM( text = resourceReference(R.string.details_buy_wallet), iconRes = R.drawable.ic_tangem_24, - onClick = { urlOpener.openUrl(BUY_TANGEM_URL) }, + onClick = { urlOpener.openUrl(buildBuyLink()) }, ), ), ), @@ -103,6 +105,12 @@ internal class ItemsBuilder @Inject constructor( ), ) + private fun buildBuyLink(): String { + return appInstanceIdProvider.getAppInstanceIdSync()?.let { + "$BUY_TANGEM_URL&app_instance_id=$it" + } ?: BUY_TANGEM_URL + } + private companion object { const val BUY_TANGEM_URL = "https://buy.tangem.com/?utm_source=tangem&utm_medium=app" }