From 2585f9e0e862bfb7b4c953cc696b5a9f9944e6db Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 7 Jul 2023 16:31:20 +0300 Subject: [PATCH 01/10] Updated on 2026-08-14 --- app/build.gradle.kts | 1 + .../java/com/tangem/tap/TapApplication.kt | 11 +++++++--- .../java/com/tangem/tap/common/images/Coil.kt | 11 ++-------- .../walletconnect/WalletConnectManager.kt | 5 +++-- core/datasource/build.gradle.kts | 1 + .../tangem/datasource/api/common/Retrofit.kt | 20 ++++++++++--------- .../com/tangem/datasource/di/NetworkModule.kt | 4 +--- .../tangem/datasource/utils/HttpClientExt.kt | 11 ++++++---- gradle/dependencies.toml | 4 ++++ 9 files changed, 38 insertions(+), 30 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index efe2848d8c..14433e7634 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -139,6 +139,7 @@ dependencies { implementation(deps.kotlin.serialization) implementation(deps.walletConnectCore) implementation(deps.walletConnectWeb3) + implementation(deps.prettyLogger) /** Testing libraries */ testImplementation(deps.test.junit) diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 114746ccdb..086d90c904 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -5,6 +5,7 @@ import android.content.Context import android.content.pm.PackageManager import coil.ImageLoader import coil.ImageLoaderFactory +import com.orhanobut.logger.Logger import com.tangem.Log import com.tangem.LogFormat import com.tangem.blockchain.common.BlockchainSdkConfig @@ -14,6 +15,7 @@ import com.tangem.core.analytics.Analytics import com.tangem.core.featuretoggle.manager.FeatureTogglesManager import com.tangem.data.source.preferences.PreferencesDataSource import com.tangem.datasource.api.common.MoshiConverter +import com.tangem.datasource.api.common.createNetworkLoggingInterceptor import com.tangem.datasource.asset.AssetReader import com.tangem.datasource.config.ConfigManager import com.tangem.datasource.config.FeaturesLocalLoader @@ -58,7 +60,6 @@ import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.wallet.BuildConfig import dagger.hilt.android.HiltAndroidApp import kotlinx.coroutines.runBlocking -import okhttp3.logging.HttpLoggingInterceptor import org.rekotlin.Store import timber.log.Timber import javax.inject.Inject @@ -168,7 +169,11 @@ class TapApplication : Application(), ImageLoaderFactory { ) if (BuildConfig.DEBUG) { - Timber.plant(Timber.DebugTree()) + Timber.plant(object : Timber.DebugTree() { + override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { + Logger.log(priority, tag, message, t) + } + }) } foregroundActivityObserver = ForegroundActivityObserver() @@ -187,7 +192,7 @@ class TapApplication : Application(), ImageLoaderFactory { if (LogConfig.network.blockchainSdkNetwork) { BlockchainSdkRetrofitBuilder.interceptors = listOf( - HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY }, + createNetworkLoggingInterceptor() ) } diff --git a/app/src/main/java/com/tangem/tap/common/images/Coil.kt b/app/src/main/java/com/tangem/tap/common/images/Coil.kt index b7305e86dc..0d6d4de675 100644 --- a/app/src/main/java/com/tangem/tap/common/images/Coil.kt +++ b/app/src/main/java/com/tangem/tap/common/images/Coil.kt @@ -4,8 +4,8 @@ import android.content.Context import android.util.Log import coil.ImageLoader import coil.util.Logger +import com.tangem.datasource.api.common.createNetworkLoggingInterceptor import okhttp3.OkHttpClient -import okhttp3.logging.HttpLoggingInterceptor import timber.log.Timber private const val COIL_LOG_TAG = "COIL" @@ -18,14 +18,7 @@ fun createCoilImageLoader(context: Context, logEnabled: Boolean = false): ImageL logger(CoilTimberLogger()) okHttpClient { OkHttpClient.Builder() - .addNetworkInterceptor( - HttpLoggingInterceptor { message -> - Timber.tag(COIL_LOG_TAG).d(message) - } - .apply { - level = HttpLoggingInterceptor.Level.BODY - }, - ) + .addNetworkInterceptor(createNetworkLoggingInterceptor()) .build() } } diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt index 7b80ce1039..99825e2721 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt @@ -4,6 +4,7 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.common.card.EllipticCurve import com.tangem.common.extensions.guard import com.tangem.core.analytics.Analytics +import com.tangem.datasource.api.common.createNetworkLoggingInterceptor import com.tangem.domain.common.extensions.toNetworkId import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.analytics.events.WalletConnect @@ -36,7 +37,6 @@ import okhttp3.Interceptor import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response -import okhttp3.logging.HttpLoggingInterceptor import timber.log.Timber import java.util.* import java.util.concurrent.TimeUnit @@ -56,8 +56,9 @@ class WalletConnectManager { .addInterceptor(RetryInterceptor()) .build() } + private val interceptor by lazy { - HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY } + createNetworkLoggingInterceptor() } private var sessions: MutableMap = mutableMapOf() diff --git a/core/datasource/build.gradle.kts b/core/datasource/build.gradle.kts index de4006b63a..114edb01aa 100644 --- a/core/datasource/build.gradle.kts +++ b/core/datasource/build.gradle.kts @@ -36,6 +36,7 @@ dependencies { implementation(deps.retrofit) implementation(deps.retrofit.moshi) implementation(deps.reactive.network) + implementation(deps.prettyOkHttpLoggingInterceptor) /** Time */ implementation(deps.jodatime) diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/Retrofit.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/Retrofit.kt index 166036783c..72aea8deb2 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/common/Retrofit.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/Retrofit.kt @@ -1,8 +1,10 @@ package com.tangem.datasource.api.common +import android.util.Log +import com.ihsanbal.logging.Level +import com.ihsanbal.logging.LoggingInterceptor import okhttp3.Interceptor import okhttp3.OkHttpClient -import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import java.util.concurrent.TimeUnit @@ -22,15 +24,15 @@ fun createRetrofitInstance( } interceptors.forEach { okHttpBuilder.addInterceptor(it) } - if (logEnabled) okHttpBuilder.addInterceptor(createHttpLoggingInterceptor()) + if (logEnabled) okHttpBuilder.addInterceptor(createNetworkLoggingInterceptor()) - return Retrofit.Builder() - .baseUrl(baseUrl) - .addConverterFactory(MoshiConverter.networkMoshiConverter) - .client(okHttpBuilder.build()) - .build() + return Retrofit.Builder().baseUrl(baseUrl).addConverterFactory(MoshiConverter.networkMoshiConverter) + .client(okHttpBuilder.build()).build() } -private fun createHttpLoggingInterceptor(): HttpLoggingInterceptor = HttpLoggingInterceptor().apply { - level = HttpLoggingInterceptor.Level.BODY +fun createNetworkLoggingInterceptor(): Interceptor { + return LoggingInterceptor.Builder() + .setLevel(Level.BODY) + .log(Log.VERBOSE) + .build() } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt index c8ae82faa9..9c11afc771 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt @@ -63,9 +63,7 @@ class NetworkModule { @PromotionOneInch fun providePromotionOneInchApi(authProvider: AuthProvider, @NetworkMoshi moshi: Moshi): PromotionApi { val okClient = OkHttpClient.Builder() - .addHeaders( - AuthenticationHeader(authProvider), - ) + .addHeaders(AuthenticationHeader(authProvider)) .allowLogging() .callTimeout(API_ONE_INCH_TIMEOUT_MS, TimeUnit.MILLISECONDS) .connectTimeout(API_ONE_INCH_TIMEOUT_MS, TimeUnit.MILLISECONDS) diff --git a/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt b/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt index 4fd16a0d1d..384676621a 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt @@ -1,10 +1,9 @@ package com.tangem.datasource.utils import com.tangem.datasource.BuildConfig +import com.tangem.datasource.api.common.createNetworkLoggingInterceptor import okhttp3.Interceptor import okhttp3.OkHttpClient -import okhttp3.logging.HttpLoggingInterceptor -import okhttp3.logging.HttpLoggingInterceptor.Level /** Extension for adding headers [requestHeaders] to every [OkHttpClient] request */ internal fun OkHttpClient.Builder.addHeaders(vararg requestHeaders: RequestHeader): OkHttpClient.Builder { @@ -26,5 +25,9 @@ internal fun OkHttpClient.Builder.addHeaders(vararg requestHeaders: RequestHeade * * @param level logging level. By default, only the request body. */ -internal fun OkHttpClient.Builder.allowLogging(level: Level = Level.BODY): OkHttpClient.Builder = - if (BuildConfig.DEBUG) addInterceptor(interceptor = HttpLoggingInterceptor().setLevel(level)) else this \ No newline at end of file +internal fun OkHttpClient.Builder.allowLogging(): OkHttpClient.Builder = + if (BuildConfig.DEBUG) { + addInterceptor(interceptor = createNetworkLoggingInterceptor()) + } else { + this + } \ No newline at end of file diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 5fb4bbfb94..9b66d181ca 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -75,6 +75,8 @@ arrow = "1.2.0-RC" reactiveNetwork = "3.0.8" walletConnectCore = "1.15.0" walletConnectWeb3 = "1.8.0" +prettyLogger = "2.2.0" +prettyOkHttpLoggingInterceptor = "3.1.0" # endregion Other libraries # region Tangem @@ -222,4 +224,6 @@ arrow-fx = { module = "io.arrow-kt:arrow-fx-coroutines", version.ref = "arrow" } reactive-network = { module = "com.github.pwittchen:reactivenetwork-rx2", version.ref = "reactiveNetwork" } walletConnectCore = { module = "com.walletconnect:android-core", version.ref = "walletConnectCore" } walletConnectWeb3 = { module = "com.walletconnect:web3wallet", version.ref = "walletConnectWeb3" } +prettyLogger = { module = "com.orhanobut:logger", version.ref = "prettyLogger" } +prettyOkHttpLoggingInterceptor = { module = "com.github.ihsanbal:LoggingInterceptor", version.ref = "prettyOkHttpLoggingInterceptor" } # endregion Other From eafd243752d2b92a105855378b55f87b09e6d9c2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 7 Jul 2023 19:01:21 +0300 Subject: [PATCH 02/10] Updated on 2026-08-14 --- core/datasource/build.gradle.kts | 3 +-- .../main/java/com/tangem/datasource/api/common/Retrofit.kt | 7 +++++-- .../main/java/com/tangem/datasource/utils/HttpClientExt.kt | 7 ++++--- gradle/dependencies.toml | 5 ++--- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/core/datasource/build.gradle.kts b/core/datasource/build.gradle.kts index 114edb01aa..aa45701df5 100644 --- a/core/datasource/build.gradle.kts +++ b/core/datasource/build.gradle.kts @@ -32,11 +32,10 @@ dependencies { implementation(deps.moshi) implementation(deps.moshi.kotlin) implementation(deps.okHttp) - implementation(deps.okHttp.logging) + implementation(deps.okHttp.prettyLogging) implementation(deps.retrofit) implementation(deps.retrofit.moshi) implementation(deps.reactive.network) - implementation(deps.prettyOkHttpLoggingInterceptor) /** Time */ implementation(deps.jodatime) diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/Retrofit.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/Retrofit.kt index 72aea8deb2..3d8b6f3930 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/common/Retrofit.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/Retrofit.kt @@ -26,8 +26,11 @@ fun createRetrofitInstance( if (logEnabled) okHttpBuilder.addInterceptor(createNetworkLoggingInterceptor()) - return Retrofit.Builder().baseUrl(baseUrl).addConverterFactory(MoshiConverter.networkMoshiConverter) - .client(okHttpBuilder.build()).build() + return Retrofit.Builder() + .baseUrl(baseUrl) + .addConverterFactory(MoshiConverter.networkMoshiConverter) + .client(okHttpBuilder.build()) + .build() } fun createNetworkLoggingInterceptor(): Interceptor { diff --git a/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt b/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt index 384676621a..f32626bf66 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt @@ -25,9 +25,10 @@ internal fun OkHttpClient.Builder.addHeaders(vararg requestHeaders: RequestHeade * * @param level logging level. By default, only the request body. */ -internal fun OkHttpClient.Builder.allowLogging(): OkHttpClient.Builder = - if (BuildConfig.DEBUG) { +internal fun OkHttpClient.Builder.allowLogging(): OkHttpClient.Builder { + return if (BuildConfig.DEBUG) { addInterceptor(interceptor = createNetworkLoggingInterceptor()) } else { this - } \ No newline at end of file + } +} diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 9b66d181ca..210582bd45 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -76,7 +76,7 @@ reactiveNetwork = "3.0.8" walletConnectCore = "1.15.0" walletConnectWeb3 = "1.8.0" prettyLogger = "2.2.0" -prettyOkHttpLoggingInterceptor = "3.1.0" +okHttp-prettyLogging = "3.1.0" # endregion Other libraries # region Tangem @@ -203,7 +203,7 @@ material = { module = "com.google.android.material:material", version.ref = "goo moshi = { module = "com.squareup.moshi:moshi", version.ref = "moshi" } moshi-kotlin = { module = "com.squareup.moshi:moshi-kotlin", version.ref = "moshi" } okHttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } -okHttp-logging = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp" } +okHttp-prettyLogging = { module = "com.github.ihsanbal:LoggingInterceptor", version.ref = "okHttp-prettyLogging" } otaliastudiosCameraView = { module = "com.otaliastudios:cameraview", version.ref = "otaliastudiosCameraView" } shopify-buy = { module = "com.shopify.mobilebuysdk:buy3", version.ref = "shopifyBuySdk" } spongecastle-core = { module = "com.madgag.spongycastle:core", version.ref = "spongycastleCryptoCore" } @@ -225,5 +225,4 @@ reactive-network = { module = "com.github.pwittchen:reactivenetwork-rx2", versio walletConnectCore = { module = "com.walletconnect:android-core", version.ref = "walletConnectCore" } walletConnectWeb3 = { module = "com.walletconnect:web3wallet", version.ref = "walletConnectWeb3" } prettyLogger = { module = "com.orhanobut:logger", version.ref = "prettyLogger" } -prettyOkHttpLoggingInterceptor = { module = "com.github.ihsanbal:LoggingInterceptor", version.ref = "prettyOkHttpLoggingInterceptor" } # endregion Other From 5b0d90152ed22f281614c313ff2c09ec5b2c9931 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 7 Jul 2023 19:01:35 +0300 Subject: [PATCH 03/10] Updated on 2026-08-14 --- app/build.gradle.kts | 7 ------- domain/legacy/build.gradle.kts | 6 ------ 2 files changed, 13 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 14433e7634..507d70e3b1 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -114,13 +114,6 @@ dependencies { implementation(deps.appsflyer) implementation(deps.amplitude) implementation(deps.kotsonGson) - //TODO: refactoring: remove it when all network services moved to the datasource module - implementation(deps.retrofit) - implementation(deps.retrofit.moshi) - implementation(deps.moshi) - implementation(deps.moshi.kotlin) - implementation(deps.okHttp) - implementation(deps.okHttp.logging) implementation(deps.zendesk.chat) implementation(deps.zendesk.messaging) implementation(deps.spongecastle.core) diff --git a/domain/legacy/build.gradle.kts b/domain/legacy/build.gradle.kts index f618e11fd9..320f10a255 100644 --- a/domain/legacy/build.gradle.kts +++ b/domain/legacy/build.gradle.kts @@ -22,12 +22,6 @@ dependencies { /** Other libraries */ implementation(deps.reKotlin) - //TODO: refactoring: remove it when all network services moved to the datasource module - implementation(deps.retrofit) - implementation(deps.retrofit.moshi) - implementation(deps.moshi) - implementation(deps.moshi.kotlin) - implementation(deps.okHttp.logging) implementation(deps.timber) implementation(deps.kotlin.coroutines) From 0c638c7c96bae786f1213e8552d4fea2c457ecff Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 10 Jul 2023 12:17:27 +0300 Subject: [PATCH 04/10] Updated on 2026-08-14 --- domain/legacy/build.gradle.kts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/domain/legacy/build.gradle.kts b/domain/legacy/build.gradle.kts index 320f10a255..e9449ad7de 100644 --- a/domain/legacy/build.gradle.kts +++ b/domain/legacy/build.gradle.kts @@ -22,6 +22,8 @@ dependencies { /** Other libraries */ implementation(deps.reKotlin) + implementation(deps.moshi) + implementation(deps.moshi.kotlin) implementation(deps.timber) implementation(deps.kotlin.coroutines) From 86ca9ebbc98b6dfbb3ca7046785901f224295eb1 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 10 Jul 2023 13:02:08 +0300 Subject: [PATCH 05/10] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/TapApplication.kt | 14 ++++++++------ .../com/tangem/datasource/utils/HttpClientExt.kt | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 4d7bc9bd30..9c3d7f67cb 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -174,11 +174,13 @@ class TapApplication : Application(), ImageLoaderFactory { ) if (BuildConfig.DEBUG) { - Timber.plant(object : Timber.DebugTree() { - override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { - Logger.log(priority, tag, message, t) - } - }) + Timber.plant( + object : Timber.DebugTree() { + override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { + Logger.log(priority, tag, message, t) + } + }, + ) } foregroundActivityObserver = ForegroundActivityObserver() @@ -197,7 +199,7 @@ class TapApplication : Application(), ImageLoaderFactory { if (LogConfig.network.blockchainSdkNetwork) { BlockchainSdkRetrofitBuilder.interceptors = listOf( - createNetworkLoggingInterceptor() + createNetworkLoggingInterceptor(), ) } diff --git a/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt b/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt index f32626bf66..4a5a6a1b75 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt @@ -31,4 +31,4 @@ internal fun OkHttpClient.Builder.allowLogging(): OkHttpClient.Builder { } else { this } -} +} \ No newline at end of file From 5624193e7b8879b79fbef1530150813a5e1d6a05 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 10 Jul 2023 15:25:39 +0400 Subject: [PATCH 06/10] Updated on 2026-08-14 --- .../tap/domain/tasks/product/ResetToFactorySettingsTask.kt | 3 +-- .../src/main/kotlin/com/tangem/domain/models/scan/CardDTO.kt | 2 +- gradle/dependencies.toml | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/ResetToFactorySettingsTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/ResetToFactorySettingsTask.kt index 1ab2b50b69..a2622b218d 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/ResetToFactorySettingsTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/ResetToFactorySettingsTask.kt @@ -31,8 +31,7 @@ class ResetToFactorySettingsTask : CardSessionRunnable { } private fun resetBackup(session: CardSession, callback: (result: CompletionResult) -> Unit) { - val backupStatus = session.environment.card?.backupStatus - if (backupStatus == null || backupStatus == Card.BackupStatus.NoBackup) { + if (session.environment.card?.backupStatus?.isActive != true) { callback(CompletionResult.Success(session.environment.card!!)) return } diff --git a/domain/models/src/main/kotlin/com/tangem/domain/models/scan/CardDTO.kt b/domain/models/src/main/kotlin/com/tangem/domain/models/scan/CardDTO.kt index 7578791134..a89909b584 100644 --- a/domain/models/src/main/kotlin/com/tangem/domain/models/scan/CardDTO.kt +++ b/domain/models/src/main/kotlin/com/tangem/domain/models/scan/CardDTO.kt @@ -304,7 +304,7 @@ data class CardDTO( object NoBackup : BackupStatus() val isActive: Boolean - get() = this is Active || this is CardLinked + get() = this is Active companion object { internal fun fromSdkStatus(sdkStatus: Card.BackupStatus?): BackupStatus? { diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 042782007e..23948fc2c6 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -80,7 +80,7 @@ walletConnectWeb3 = "1.10.0" # region Tangem tangemBlockchainSdk = "develop-264" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds -tangemCardSdk = "develop-266" +tangemCardSdk = "develop-273" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds # endregion Tangem From c698ca194cc85932f277c219b854a1b66aced24e Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 11 Jul 2023 20:11:39 +0800 Subject: [PATCH 07/10] Updated on 2026-08-14 --- core/analytics/models/.gitignore | 1 + core/analytics/models/build.gradle.kts | 4 ++++ .../java/com/tangem/core/analytics/models}/AnalyticsEvent.kt | 2 +- settings.gradle.kts | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 core/analytics/models/.gitignore create mode 100644 core/analytics/models/build.gradle.kts rename core/analytics/{src/main/java/com/tangem/core/analytics => models/src/main/java/com/tangem/core/analytics/models}/AnalyticsEvent.kt (81%) diff --git a/core/analytics/models/.gitignore b/core/analytics/models/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/core/analytics/models/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/core/analytics/models/build.gradle.kts b/core/analytics/models/build.gradle.kts new file mode 100644 index 0000000000..7ff7fb7522 --- /dev/null +++ b/core/analytics/models/build.gradle.kts @@ -0,0 +1,4 @@ +plugins { + alias(deps.plugins.kotlin.jvm) + id("configuration") +} \ No newline at end of file diff --git a/core/analytics/src/main/java/com/tangem/core/analytics/AnalyticsEvent.kt b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsEvent.kt similarity index 81% rename from core/analytics/src/main/java/com/tangem/core/analytics/AnalyticsEvent.kt rename to core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsEvent.kt index 1fbc89d977..e60b14d1ee 100644 --- a/core/analytics/src/main/java/com/tangem/core/analytics/AnalyticsEvent.kt +++ b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsEvent.kt @@ -1,4 +1,4 @@ -package com.tangem.core.analytics +package com.tangem.core.analytics.models /** [REDACTED_AUTHOR] diff --git a/settings.gradle.kts b/settings.gradle.kts index 523476db95..9a14394b73 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -35,6 +35,7 @@ include(":common") // region Core modules include(":core:analytics") +include(":core:analytics:models") include(":core:datasource") include(":core:featuretoggles") include(":core:navigation") From b5ad0f297270b749fcef5c745f24d0ebe5bcd715 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 11 Jul 2023 20:19:14 +0800 Subject: [PATCH 08/10] Updated on 2026-08-14 --- app/build.gradle.kts | 1 + .../tap/common/analytics/events/Basic.kt | 2 +- .../tap/common/analytics/events/Chat.kt | 2 +- .../common/analytics/events/DetailsScreen.kt | 2 +- .../analytics/events/IntroductionProcess.kt | 2 +- .../tap/common/analytics/events/MainScreen.kt | 3 +-- .../common/analytics/events/ManageTokens.kt | 2 +- .../tap/common/analytics/events/MyWallets.kt | 2 +- .../tap/common/analytics/events/Onboarding.kt | 20 +------------------ .../tap/common/analytics/events/Portfolio.kt | 2 +- .../tap/common/analytics/events/Settings.kt | 2 +- .../tap/common/analytics/events/Shop.kt | 2 +- .../tap/common/analytics/events/SignIn.kt | 2 +- .../tap/common/analytics/events/Token.kt | 2 +- .../common/analytics/events/WalletConnect.kt | 2 +- .../appsFlyer/AppsFlyerAnalyticsHandler.kt | 2 +- .../firebase/FirebaseAnalyticsHandler.kt | 2 +- .../CardContextInterceptor.kt | 2 +- .../LinkedCardContextInterceptor.kt | 4 ++-- .../domain/scanCard/LegacyScanProcessor.kt | 2 +- .../tap/domain/scanCard/ScanCardProcessor.kt | 2 +- .../domain/scanCard/UseCaseScanProcessor.kt | 2 +- .../domain/scanCard/chains/AnalyticsChain.kt | 2 +- .../tap/features/home/redux/HomeAction.kt | 2 +- .../tap/features/home/redux/HomeMiddleware.kt | 2 +- .../tap/features/wallet/redux/WalletAction.kt | 2 +- core/analytics/build.gradle.kts | 4 +++- .../com/tangem/core/analytics/Analytics.kt | 15 +++----------- .../core/analytics/api/EventFilterApi.kt | 2 +- .../core/analytics/api/EventHandlerApi.kt | 2 +- .../analytics/api/ParamsInterceptorApi.kt | 2 +- domain/card/build.gradle.kts | 6 ++++-- features/learn2earn/impl/build.gradle.kts | 1 + .../learn2earn/analytics/Learn2earnEvents.kt | 2 +- .../domain/api/WebViewResultHandler.kt | 2 +- features/onboarding/build.gradle.kts | 1 + .../wallet2/analytics/SeedPhraseEvents.kt | 2 +- .../referral/presentation/build.gradle.kts | 1 + .../referral/analytics/ReferralEvents.kt | 2 +- features/swap/presentation/build.gradle.kts | 1 + .../feature/swap/analytics/SwapEvents.kt | 4 +--- features/wallet/impl/build.gradle.kts | 3 +++ 42 files changed, 52 insertions(+), 70 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index df6d24b384..ca27f5fd67 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -30,6 +30,7 @@ dependencies { implementation(project(":domain:wallets:models")) implementation(project(":common")) implementation(project(":core:analytics")) + implementation(projects.core.analytics.models) implementation(project(":core:navigation")) implementation(project(":core:featuretoggles")) implementation(project(":core:res")) diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/Basic.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/Basic.kt index e5b89b30e5..2782ceac8f 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/Basic.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/Basic.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.events -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent /** [REDACTED_AUTHOR] diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/Chat.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/Chat.kt index 96fa307105..f4b9dbc61f 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/Chat.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/Chat.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.events -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent /** [REDACTED_AUTHOR] diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/DetailsScreen.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/DetailsScreen.kt index a0d34306c9..775f44a0d8 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/DetailsScreen.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/DetailsScreen.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.events -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent /** [REDACTED_AUTHOR] diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/IntroductionProcess.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/IntroductionProcess.kt index 602365c0c6..b5ce0042ae 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/IntroductionProcess.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/IntroductionProcess.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.events -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent /** [REDACTED_AUTHOR] diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/MainScreen.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/MainScreen.kt index 7a36f35d1e..fbbc88c099 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/MainScreen.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/MainScreen.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.events -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent /** [REDACTED_AUTHOR] @@ -13,7 +13,6 @@ sealed class MainScreen( class ScreenOpened : MainScreen("Screen opened") class ButtonScanCard : MainScreen("Button - Scan Card") class ButtonMyWallets : MainScreen("Button - My Wallets") - class ButtonBuy : MainScreen("Button - Buy") class EnableBiometrics(state: AnalyticsParam.OnOffState) : MainScreen( event = "Enable Biometric", diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/ManageTokens.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/ManageTokens.kt index 8e0b8cc5b9..969d1d47fb 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/ManageTokens.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/ManageTokens.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.events -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.domain.common.extensions.toNetworkId import com.tangem.domain.features.addCustomToken.CustomCurrency import com.tangem.tap.common.extensions.filterNotNull diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/MyWallets.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/MyWallets.kt index 65ab7937c2..87ba002047 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/MyWallets.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/MyWallets.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.events -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent sealed class MyWallets( event: String, diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/Onboarding.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/Onboarding.kt index 98dd408ba8..9612f2b972 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/Onboarding.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/Onboarding.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.events -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent /** [REDACTED_AUTHOR] @@ -72,26 +72,8 @@ sealed class Onboarding( class SetupFinished : Twins("Twin Setup Finished") } - class PinScreenOpened : Onboarding("Onboarding", "PIN screen opened") - class ButtonSetPinCode : Onboarding("Onboarding", "Button - Set PIN Code") - class CardConnectionScreenOpened : Onboarding("Onboarding", "Card Connection Screen Opened") - class ButtonConnect : Onboarding("Onboarding", "Button - Connect") - class PinCodeSet : Onboarding("Onboarding", "PIN Code Set") - - class KYCScreenOpened : Onboarding("Onboarding", "KYC screen opened") - class KYCStarted : Onboarding("Onboarding", "KYC Started") - class KYCInProgress : Onboarding("Onboarding", "KYC In Progress") - class KYCRejected : Onboarding("Onboarding", "KYC Rejected") - - class ClaimScreenOpened : Onboarding("Onboarding", "Claim Screen Opened") - class ButtonClaim : Onboarding("Onboarding", "Button - Claim") - class ClaimWasSuccessfully : Onboarding("Onboarding", "Claim Was Successfully") - class ButtonChat : Onboarding("Onboarding", "Button - Chat") - class NotEnoughGasError : Onboarding("Onboarding", "Not Enough Gas Error") - class CardNotPassedError : Onboarding("Onboarding", "Card Not Passed Error") - class EnableBiometrics(state: AnalyticsParam.OnOffState) : Onboarding( category = "Onboarding / Biometric", event = "Enable Biometric", diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/Portfolio.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/Portfolio.kt index 71383c9f9a..3e961883b7 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/Portfolio.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/Portfolio.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.events -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent /** [REDACTED_AUTHOR] diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/Settings.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/Settings.kt index 5a9226bec4..e71eda15ad 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/Settings.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/Settings.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.events -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.tap.features.details.ui.details.SocialNetwork /** diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/Shop.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/Shop.kt index 0ab4dd9361..4076de8685 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/Shop.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/Shop.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.events -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.tap.common.extensions.filterNotNull /** diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/SignIn.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/SignIn.kt index a5417d775b..de174fd193 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/SignIn.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/SignIn.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.events -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent /** [REDACTED_AUTHOR] diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/Token.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/Token.kt index 837c9bce3c..9b8cecc417 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/Token.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/Token.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.events -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.tap.common.analytics.events.AnalyticsParam.CurrencyType /** diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/WalletConnect.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/WalletConnect.kt index 34047928e4..49c49b912a 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/WalletConnect.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/WalletConnect.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.events -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent /** [REDACTED_AUTHOR] diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerAnalyticsHandler.kt index d1b3189ab1..c4b12fc278 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerAnalyticsHandler.kt @@ -1,8 +1,8 @@ package com.tangem.tap.common.analytics.handlers.appsFlyer import com.appsflyer.AFInAppEventType -import com.tangem.core.analytics.AnalyticsEvent import com.tangem.core.analytics.api.AnalyticsHandler +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder import com.tangem.tap.common.analytics.events.Shop diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAnalyticsHandler.kt index 7430fcc17f..e445597e8f 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAnalyticsHandler.kt @@ -1,9 +1,9 @@ package com.tangem.tap.common.analytics.handlers.firebase import com.google.firebase.analytics.FirebaseAnalytics -import com.tangem.core.analytics.AnalyticsEvent import com.tangem.core.analytics.api.AnalyticsHandler import com.tangem.core.analytics.api.ErrorEventHandler +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder import com.tangem.tap.common.analytics.converters.AnalyticsErrorConverter import com.tangem.tap.common.analytics.events.Shop diff --git a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt index 864c9dadbb..0db51098a3 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt @@ -1,7 +1,7 @@ package com.tangem.tap.common.analytics.paramsInterceptor -import com.tangem.core.analytics.AnalyticsEvent import com.tangem.core.analytics.api.ParamsInterceptor +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.ProductType import com.tangem.domain.models.scan.ScanResponse diff --git a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/LinkedCardContextInterceptor.kt b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/LinkedCardContextInterceptor.kt index 94c006d699..25b67c3ee0 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/LinkedCardContextInterceptor.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/LinkedCardContextInterceptor.kt @@ -1,14 +1,14 @@ package com.tangem.tap.common.analytics.paramsInterceptor -import com.tangem.core.analytics.AnalyticsEvent import com.tangem.core.analytics.api.ParamsInterceptor +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.domain.models.scan.ScanResponse /** [REDACTED_AUTHOR] */ class LinkedCardContextInterceptor( - private val scanResponse: ScanResponse, + scanResponse: ScanResponse, val parent: LinkedCardContextInterceptor? = null, ) : ParamsInterceptor { diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt index e83d2496ff..e891d0dd2c 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt @@ -6,7 +6,7 @@ import com.tangem.common.core.TangemSdkError import com.tangem.common.doOnFailure import com.tangem.common.doOnSuccess import com.tangem.core.analytics.Analytics -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction import com.tangem.domain.common.extensions.withMainContext diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt index 0546a79db5..808f338f85 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt @@ -2,7 +2,7 @@ package com.tangem.tap.domain.scanCard import com.tangem.common.CompletionResult import com.tangem.common.core.TangemError -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.store diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt index ae4e286e5f..002b9bc7ff 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt @@ -3,7 +3,7 @@ package com.tangem.tap.domain.scanCard import arrow.fx.coroutines.resourceScope import com.tangem.common.CompletionResult import com.tangem.common.core.TangemError -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction import com.tangem.domain.card.ScanCardException diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/chains/AnalyticsChain.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/chains/AnalyticsChain.kt index febc6a1525..8f72ce92f8 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/chains/AnalyticsChain.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/chains/AnalyticsChain.kt @@ -3,7 +3,7 @@ package com.tangem.tap.domain.scanCard.chains import arrow.core.Either import arrow.core.right import com.tangem.core.analytics.Analytics -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.domain.card.ScanCardException import com.tangem.domain.core.chain.Chain import com.tangem.domain.models.scan.ScanResponse diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt index 86b139defb..93479d1767 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt @@ -1,6 +1,6 @@ package com.tangem.tap.features.home.redux -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Basic import com.tangem.tap.common.entities.IndeterminateProgressButton diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt index 7a77fcaa60..8a225afa8a 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt @@ -5,7 +5,7 @@ import com.tangem.common.doOnResult import com.tangem.common.doOnSuccess import com.tangem.common.extensions.guard import com.tangem.core.analytics.Analytics -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction import com.tangem.domain.models.scan.ScanResponse diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt index 3f73a94c11..10803cf57f 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt @@ -3,7 +3,7 @@ package com.tangem.tap.features.wallet.redux import android.content.Context import com.tangem.blockchain.common.Amount import com.tangem.blockchain.common.address.AddressType -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.domain.common.BlockchainNetwork import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.wallets.models.UserWallet diff --git a/core/analytics/build.gradle.kts b/core/analytics/build.gradle.kts index e1fb463a41..29b4cfb591 100644 --- a/core/analytics/build.gradle.kts +++ b/core/analytics/build.gradle.kts @@ -13,5 +13,7 @@ dependencies { kapt(deps.hilt.kapt) /** Core shouldn't depends on core, but in case with utils and logging its necessary */ - implementation(project(":core:utils")) + implementation(projects.core.utils) + + implementation(projects.core.analytics.models) } \ No newline at end of file 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 8dda5adedf..3c12cf80a8 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 @@ -1,18 +1,9 @@ package com.tangem.core.analytics -import com.tangem.core.analytics.api.AnalyticsEventFilter -import com.tangem.core.analytics.api.AnalyticsEventHandler -import com.tangem.core.analytics.api.AnalyticsFilterHolder -import com.tangem.core.analytics.api.AnalyticsHandler -import com.tangem.core.analytics.api.AnalyticsHandlerHolder -import com.tangem.core.analytics.api.ParamsInterceptor -import com.tangem.core.analytics.api.ParamsInterceptorHolder +import com.tangem.core.analytics.api.* +import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.utils.coroutines.FeatureCoroutineExceptionHandler -import kotlinx.coroutines.CoroutineName -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.asCoroutineDispatcher -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import java.util.concurrent.Executors /** diff --git a/core/analytics/src/main/java/com/tangem/core/analytics/api/EventFilterApi.kt b/core/analytics/src/main/java/com/tangem/core/analytics/api/EventFilterApi.kt index 8381b2b983..4de7e4aee8 100644 --- a/core/analytics/src/main/java/com/tangem/core/analytics/api/EventFilterApi.kt +++ b/core/analytics/src/main/java/com/tangem/core/analytics/api/EventFilterApi.kt @@ -1,6 +1,6 @@ package com.tangem.core.analytics.api -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent /** [REDACTED_AUTHOR] diff --git a/core/analytics/src/main/java/com/tangem/core/analytics/api/EventHandlerApi.kt b/core/analytics/src/main/java/com/tangem/core/analytics/api/EventHandlerApi.kt index 49aadf88c3..0a5f3179de 100644 --- a/core/analytics/src/main/java/com/tangem/core/analytics/api/EventHandlerApi.kt +++ b/core/analytics/src/main/java/com/tangem/core/analytics/api/EventHandlerApi.kt @@ -1,6 +1,6 @@ package com.tangem.core.analytics.api -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent /** [REDACTED_AUTHOR] diff --git a/core/analytics/src/main/java/com/tangem/core/analytics/api/ParamsInterceptorApi.kt b/core/analytics/src/main/java/com/tangem/core/analytics/api/ParamsInterceptorApi.kt index 683a1c45a0..80b0bf2b14 100644 --- a/core/analytics/src/main/java/com/tangem/core/analytics/api/ParamsInterceptorApi.kt +++ b/core/analytics/src/main/java/com/tangem/core/analytics/api/ParamsInterceptorApi.kt @@ -1,6 +1,6 @@ package com.tangem.core.analytics.api -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent /** [REDACTED_AUTHOR] diff --git a/domain/card/build.gradle.kts b/domain/card/build.gradle.kts index 213bd024b6..a1266a8ba6 100644 --- a/domain/card/build.gradle.kts +++ b/domain/card/build.gradle.kts @@ -4,9 +4,11 @@ plugins { } dependencies { - implementation(project(":domain:core")) + implementation(projects.domain.core) // TODO: Remove after new card scan result was implemented - implementation(project(":domain:models")) + implementation(projects.domain.models) + + implementation(projects.core.analytics.models) implementation(deps.tangem.card.core) } \ No newline at end of file diff --git a/features/learn2earn/impl/build.gradle.kts b/features/learn2earn/impl/build.gradle.kts index 26d0179187..37925318a5 100644 --- a/features/learn2earn/impl/build.gradle.kts +++ b/features/learn2earn/impl/build.gradle.kts @@ -11,6 +11,7 @@ dependencies { /** Core modules */ implementation(project(":common")) implementation(project(":core:analytics")) + implementation(projects.core.analytics.models) implementation(project(":core:featuretoggles")) implementation(project(":core:datasource")) implementation(project(":core:utils")) diff --git a/features/learn2earn/impl/src/main/java/com/tangem/feature/learn2earn/analytics/Learn2earnEvents.kt b/features/learn2earn/impl/src/main/java/com/tangem/feature/learn2earn/analytics/Learn2earnEvents.kt index 164fa4e793..100a19ef0a 100644 --- a/features/learn2earn/impl/src/main/java/com/tangem/feature/learn2earn/analytics/Learn2earnEvents.kt +++ b/features/learn2earn/impl/src/main/java/com/tangem/feature/learn2earn/analytics/Learn2earnEvents.kt @@ -1,6 +1,6 @@ package com.tangem.feature.learn2earn.analytics -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent internal sealed class Learn2earnEvents( category: String, diff --git a/features/learn2earn/impl/src/main/java/com/tangem/feature/learn2earn/domain/api/WebViewResultHandler.kt b/features/learn2earn/impl/src/main/java/com/tangem/feature/learn2earn/domain/api/WebViewResultHandler.kt index 6b7c851a69..e9cc14f222 100644 --- a/features/learn2earn/impl/src/main/java/com/tangem/feature/learn2earn/domain/api/WebViewResultHandler.kt +++ b/features/learn2earn/impl/src/main/java/com/tangem/feature/learn2earn/domain/api/WebViewResultHandler.kt @@ -1,6 +1,6 @@ package com.tangem.feature.learn2earn.domain.api -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent /** * Handler that helps determine a result of the Learn2earnWebViewActivity webView actions. diff --git a/features/onboarding/build.gradle.kts b/features/onboarding/build.gradle.kts index 1940a2073c..cdd735f59c 100644 --- a/features/onboarding/build.gradle.kts +++ b/features/onboarding/build.gradle.kts @@ -14,6 +14,7 @@ dependencies { implementation(project(":core:featuretoggles")) implementation(project(":core:datasource")) implementation(project(":core:analytics")) + implementation(projects.core.analytics.models) implementation(project(":core:utils")) implementation(project(":core:ui")) implementation(project(":core:res")) diff --git a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/analytics/SeedPhraseEvents.kt b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/analytics/SeedPhraseEvents.kt index baf6d039cc..d593c179ed 100644 --- a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/analytics/SeedPhraseEvents.kt +++ b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/analytics/SeedPhraseEvents.kt @@ -1,6 +1,6 @@ package com.tangem.feature.onboarding.presentation.wallet2.analytics -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent sealed class SeedPhraseEvents( event: String, diff --git a/features/referral/presentation/build.gradle.kts b/features/referral/presentation/build.gradle.kts index 1f66fc2708..0649e10587 100644 --- a/features/referral/presentation/build.gradle.kts +++ b/features/referral/presentation/build.gradle.kts @@ -9,6 +9,7 @@ plugins { dependencies { /** Core modules */ implementation(project(":core:analytics")) + implementation(projects.core.analytics.models) implementation(project(":core:res")) implementation(project(":core:utils")) implementation(project(":core:ui")) diff --git a/features/referral/presentation/src/main/java/com/tangem/feature/referral/analytics/ReferralEvents.kt b/features/referral/presentation/src/main/java/com/tangem/feature/referral/analytics/ReferralEvents.kt index e82990adf2..a5d37a1b19 100644 --- a/features/referral/presentation/src/main/java/com/tangem/feature/referral/analytics/ReferralEvents.kt +++ b/features/referral/presentation/src/main/java/com/tangem/feature/referral/analytics/ReferralEvents.kt @@ -1,6 +1,6 @@ package com.tangem.feature.referral.analytics -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent sealed class ReferralEvents(event: String) : AnalyticsEvent(REFERRAL_PROGRAM_CATEGORY, event) { diff --git a/features/swap/presentation/build.gradle.kts b/features/swap/presentation/build.gradle.kts index f4a0857938..8248b21113 100644 --- a/features/swap/presentation/build.gradle.kts +++ b/features/swap/presentation/build.gradle.kts @@ -10,6 +10,7 @@ plugins { dependencies { /** Core modules */ implementation(project(":core:analytics")) + implementation(projects.core.analytics.models) implementation(project(":core:featuretoggles")) implementation(project(":core:utils")) implementation(project(":core:ui")) diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt index e808db167c..d2395cf29b 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt @@ -1,6 +1,6 @@ package com.tangem.feature.swap.analytics -import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsEvent sealed class SwapEvents( event: String, @@ -13,7 +13,6 @@ sealed class SwapEvents( ) object SendTokenBalanceClicked : SwapEvents(event = "Send Token Balance Clicked") - object ReceiveTokenClicked : SwapEvents(event = "Receive Token Clicked") object ChooseTokenScreenOpened : SwapEvents(event = "Choose Token Screen Opened") object SearchTokenClicked : SwapEvents(event = "Searched Token Clicked") data class ButtonSwapClicked(val sendToken: String, val receiveToken: String) : SwapEvents( @@ -24,7 +23,6 @@ sealed class SwapEvents( object ButtonGivePermissionClicked : SwapEvents(event = "Button - Give permission") object ButtonPermissionApproveClicked : SwapEvents(event = "Button - Permission Approve") object ButtonPermissionCancelClicked : SwapEvents(event = "Button - Permission Cancel") - object ButtonPermitAndSwapClicked : SwapEvents(event = "Button - Permit and Swap") object ButtonSwipeClicked : SwapEvents(event = "Button - Swipe") object SwapInProgressScreen : SwapEvents(event = "Swap in Progress Screen Opened") } diff --git a/features/wallet/impl/build.gradle.kts b/features/wallet/impl/build.gradle.kts index 2e5651a89c..64139b1ecb 100644 --- a/features/wallet/impl/build.gradle.kts +++ b/features/wallet/impl/build.gradle.kts @@ -27,6 +27,7 @@ dependencies { /** Other libraries */ implementation(deps.kotlin.immutable.collections) + implementation(deps.tangem.card.core) implementation(deps.tangem.blockchain) /** DI */ @@ -37,12 +38,14 @@ dependencies { implementation(project(":core:featuretoggles")) implementation(project(":core:navigation")) implementation(project(":core:ui")) + implementation(projects.core.utils) /** Feature Apis */ implementation(project(":features:wallet:api")) /** Domain modules */ implementation(project(":common")) + implementation(projects.domain.card) implementation(project(":domain:legacy")) implementation(project(":domain:models")) implementation(project(":domain:wallets")) From 80ac1d02c03e7d39ce01ccf3ddc90a74ec997dbb Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 12 Jul 2023 09:52:20 +0300 Subject: [PATCH 09/10] Updated on 2026-08-14 --- app/build.gradle.kts | 2 + .../tap/di/domain/TokensDomainModule.kt | 26 ++++++++++++ data/tokens/.gitignore | 1 + data/tokens/build.gradle.kts | 17 ++++++++ .../tangem/data/tokens/di/TokensDataModule.kt | 30 +++++++++++++ .../repository/DefaultNetworksRepository.kt | 25 +++++++++++ .../repository/DefaultQuotesRepository.kt | 15 +++++++ .../repository/DefaultTokensRepository.kt | 32 ++++++++++++++ domain/tokens/.gitignore | 1 + domain/tokens/build.gradle.kts | 10 +++++ .../domain/tokens/GetTokenListUseCase.kt | 28 +++++++++++++ .../tangem/domain/tokens/error/TokensError.kt | 6 +++ .../com/tangem/domain/tokens/model/Network.kt | 10 +++++ .../domain/tokens/model/NetworkGroup.kt | 9 ++++ .../domain/tokens/model/NetworkStatus.kt | 23 ++++++++++ .../com/tangem/domain/tokens/model/Quote.kt | 9 ++++ .../com/tangem/domain/tokens/model/Token.kt | 14 +++++++ .../tangem/domain/tokens/model/TokenList.kt | 38 +++++++++++++++++ .../tangem/domain/tokens/model/TokenStatus.kt | 42 +++++++++++++++++++ .../tokens/repository/NetworksRepository.kt | 26 ++++++++++++ .../tokens/repository/QuotesRepository.kt | 18 ++++++++ .../tokens/repository/TokensRepository.kt | 29 +++++++++++++ features/wallet/impl/build.gradle.kts | 1 + .../router/DefaultWalletRouter.kt | 3 +- .../wallet/viewmodels/WalletViewModel.kt | 6 ++- settings.gradle.kts | 2 + 26 files changed, 421 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/di/domain/TokensDomainModule.kt create mode 100644 data/tokens/.gitignore create mode 100644 data/tokens/build.gradle.kts create mode 100644 data/tokens/src/main/kotlin/com/tangem/data/tokens/di/TokensDataModule.kt create mode 100644 data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt create mode 100644 data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultQuotesRepository.kt create mode 100644 data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultTokensRepository.kt create mode 100644 domain/tokens/.gitignore create mode 100644 domain/tokens/build.gradle.kts create mode 100644 domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetTokenListUseCase.kt create mode 100644 domain/tokens/src/main/kotlin/com/tangem/domain/tokens/error/TokensError.kt create mode 100644 domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/Network.kt create mode 100644 domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/NetworkGroup.kt create mode 100644 domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/NetworkStatus.kt create mode 100644 domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/Quote.kt create mode 100644 domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/Token.kt create mode 100644 domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/TokenList.kt create mode 100644 domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/TokenStatus.kt create mode 100644 domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt create mode 100644 domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/QuotesRepository.kt create mode 100644 domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/TokensRepository.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b56b814c08..07f7cd8b81 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -28,6 +28,7 @@ dependencies { implementation(project(":domain:card")) implementation(project(":domain:wallets")) implementation(project(":domain:wallets:models")) + implementation(projects.domain.tokens) implementation(project(":common")) implementation(project(":core:analytics")) implementation(projects.core.analytics.models) @@ -40,6 +41,7 @@ dependencies { implementation(project(":libs:crypto")) implementation(project(":libs:auth")) implementation(project(":data:source:preferences")) + implementation(projects.data.tokens) /** Features */ implementation(project(":features:onboarding")) diff --git a/app/src/main/java/com/tangem/tap/di/domain/TokensDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/TokensDomainModule.kt new file mode 100644 index 0000000000..bda1a7734d --- /dev/null +++ b/app/src/main/java/com/tangem/tap/di/domain/TokensDomainModule.kt @@ -0,0 +1,26 @@ +package com.tangem.tap.di.domain + +import com.tangem.domain.tokens.GetTokenListUseCase +import com.tangem.domain.tokens.repository.NetworksRepository +import com.tangem.domain.tokens.repository.QuotesRepository +import com.tangem.domain.tokens.repository.TokensRepository +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ViewModelComponent +import dagger.hilt.android.scopes.ViewModelScoped + +@Module +@InstallIn(ViewModelComponent::class) +internal object TokensDomainModule { + + @Provides + @ViewModelScoped + fun provideGetTokenListUseCase( + tokensRepository: TokensRepository, + quotesRepository: QuotesRepository, + networksRepository: NetworksRepository, + dispatchers: CoroutineDispatcherProvider, + ) = GetTokenListUseCase(tokensRepository, quotesRepository, networksRepository, dispatchers) +} \ No newline at end of file diff --git a/data/tokens/.gitignore b/data/tokens/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/data/tokens/.gitignore @@ -0,0 +1 @@ +/build diff --git a/data/tokens/build.gradle.kts b/data/tokens/build.gradle.kts new file mode 100644 index 0000000000..95abf3ed40 --- /dev/null +++ b/data/tokens/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + alias(deps.plugins.kotlin.jvm) + alias(deps.plugins.kotlin.kapt) + id("configuration") +} + +dependencies { + implementation(projects.domain.tokens) + implementation(projects.domain.wallets.models) + + implementation(deps.kotlin.coroutines) + + implementation(deps.arrow.core) + + implementation(deps.hilt.core) + kapt(deps.hilt.kapt) +} \ No newline at end of file diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/di/TokensDataModule.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/di/TokensDataModule.kt new file mode 100644 index 0000000000..9f88733061 --- /dev/null +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/di/TokensDataModule.kt @@ -0,0 +1,30 @@ +package com.tangem.data.tokens.di + +import com.tangem.data.tokens.repository.DefaultNetworksRepository +import com.tangem.data.tokens.repository.DefaultQuotesRepository +import com.tangem.data.tokens.repository.DefaultTokensRepository +import com.tangem.domain.tokens.repository.NetworksRepository +import com.tangem.domain.tokens.repository.QuotesRepository +import com.tangem.domain.tokens.repository.TokensRepository +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal object TokensDataModule { + + @Provides + @Singleton + fun provideTokensRepository(): TokensRepository = DefaultTokensRepository() + + @Provides + @Singleton + fun provideQuotesRepository(): QuotesRepository = DefaultQuotesRepository() + + @Provides + @Singleton + fun provideNetworksRepository(): NetworksRepository = DefaultNetworksRepository() +} \ No newline at end of file diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt new file mode 100644 index 0000000000..dbad76f32b --- /dev/null +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt @@ -0,0 +1,25 @@ +package com.tangem.data.tokens.repository + +import arrow.core.Either +import com.tangem.domain.tokens.error.TokensError +import com.tangem.domain.tokens.model.Network +import com.tangem.domain.tokens.model.NetworkStatus +import com.tangem.domain.tokens.model.Token +import com.tangem.domain.tokens.repository.NetworksRepository +import com.tangem.domain.wallets.models.UserWalletId +import kotlinx.coroutines.flow.Flow + +internal class DefaultNetworksRepository : NetworksRepository { + + override fun getNetworks(networksIds: Set): Either> { + TODO("Not yet implemented") + } + + override fun getNetworkStatuses( + userWalletId: UserWalletId, + networks: Map>, + refresh: Boolean, + ): Flow>> { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultQuotesRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultQuotesRepository.kt new file mode 100644 index 0000000000..087f265e96 --- /dev/null +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultQuotesRepository.kt @@ -0,0 +1,15 @@ +package com.tangem.data.tokens.repository + +import arrow.core.Either +import com.tangem.domain.tokens.error.TokensError +import com.tangem.domain.tokens.model.Quote +import com.tangem.domain.tokens.model.Token +import com.tangem.domain.tokens.repository.QuotesRepository +import kotlinx.coroutines.flow.Flow + +internal class DefaultQuotesRepository : QuotesRepository { + + override fun getQuotes(tokensIds: Set, refresh: Boolean): Flow>> { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultTokensRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultTokensRepository.kt new file mode 100644 index 0000000000..cb7575e7fa --- /dev/null +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultTokensRepository.kt @@ -0,0 +1,32 @@ +package com.tangem.data.tokens.repository + +import arrow.core.Either +import com.tangem.domain.tokens.error.TokensError +import com.tangem.domain.tokens.model.Token +import com.tangem.domain.tokens.repository.TokensRepository +import com.tangem.domain.wallets.models.UserWalletId +import kotlinx.coroutines.flow.Flow + +internal class DefaultTokensRepository : TokensRepository { + + override suspend fun sortTokens( + userWalletId: UserWalletId, + sortedTokensIds: Set, + isGrouped: Boolean, + isSortedByBalance: Boolean, + ): Either { + TODO("Not yet implemented") + } + + override fun getTokens(userWalletId: UserWalletId, refresh: Boolean): Flow>> { + TODO("Not yet implemented") + } + + override fun isTokensGrouped(userWalletId: UserWalletId): Flow> { + TODO("Not yet implemented") + } + + override fun isTokensSortedByBalance(userWalletId: UserWalletId): Flow> { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/domain/tokens/.gitignore b/domain/tokens/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/domain/tokens/.gitignore @@ -0,0 +1 @@ +/build diff --git a/domain/tokens/build.gradle.kts b/domain/tokens/build.gradle.kts new file mode 100644 index 0000000000..d4297e1590 --- /dev/null +++ b/domain/tokens/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + alias(deps.plugins.kotlin.jvm) + id("configuration") +} + +dependencies { + implementation(projects.domain.core) + implementation(projects.domain.wallets.models) + implementation(projects.core.utils) +} \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetTokenListUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetTokenListUseCase.kt new file mode 100644 index 0000000000..0f52a195f9 --- /dev/null +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetTokenListUseCase.kt @@ -0,0 +1,28 @@ +// TODO: [REDACTED_JIRA] +@file:Suppress("unused", "unused_parameter") + +package com.tangem.domain.tokens + +import arrow.core.Either +import arrow.core.left +import com.tangem.domain.tokens.error.TokensError +import com.tangem.domain.tokens.model.TokenList +import com.tangem.domain.tokens.repository.NetworksRepository +import com.tangem.domain.tokens.repository.QuotesRepository +import com.tangem.domain.tokens.repository.TokensRepository +import com.tangem.domain.wallets.models.UserWalletId +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf + +class GetTokenListUseCase( + private val tokensRepository: TokensRepository, + private val quotesRepository: QuotesRepository, + private val networksRepository: NetworksRepository, + private val dispatchers: CoroutineDispatcherProvider, +) { + + operator fun invoke(userWalletId: UserWalletId, refresh: Boolean = true): Flow> { + return flowOf(TokensError.EmptyTokens.left()) + } +} \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/error/TokensError.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/error/TokensError.kt new file mode 100644 index 0000000000..4647779219 --- /dev/null +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/error/TokensError.kt @@ -0,0 +1,6 @@ +package com.tangem.domain.tokens.error + +sealed class TokensError { + + object EmptyTokens : TokensError() +} \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/Network.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/Network.kt new file mode 100644 index 0000000000..b4b7628aa4 --- /dev/null +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/Network.kt @@ -0,0 +1,10 @@ +package com.tangem.domain.tokens.model + +data class Network( + val id: ID, + val name: String, +) { + + @JvmInline + value class ID(val value: String) +} \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/NetworkGroup.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/NetworkGroup.kt new file mode 100644 index 0000000000..ea33623175 --- /dev/null +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/NetworkGroup.kt @@ -0,0 +1,9 @@ +package com.tangem.domain.tokens.model + +import arrow.core.NonEmptySet + +data class NetworkGroup( + val networkId: Network.ID, + val name: String, + val tokens: NonEmptySet, +) \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/NetworkStatus.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/NetworkStatus.kt new file mode 100644 index 0000000000..36d1bc30e6 --- /dev/null +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/NetworkStatus.kt @@ -0,0 +1,23 @@ +package com.tangem.domain.tokens.model + +import java.math.BigDecimal + +data class NetworkStatus( + val networkId: Network.ID, + val value: Status, +) { + + sealed class Status { + open val amounts: Map? = null + } + + object Unreachable : Status() + + object MissedDerivation : Status() + + data class TransactionInProgress(override val amounts: Map) : Status() + + data class Verified(override val amounts: Map) : Status() + + data class NoAccount(val amountToCreateAccount: BigDecimal) : Status() +} \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/Quote.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/Quote.kt new file mode 100644 index 0000000000..fad3db3666 --- /dev/null +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/Quote.kt @@ -0,0 +1,9 @@ +package com.tangem.domain.tokens.model + +import java.math.BigDecimal + +data class Quote( + val tokenId: Token.ID, + val fiatRate: BigDecimal, + val priceChange: BigDecimal, +) \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/Token.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/Token.kt new file mode 100644 index 0000000000..cbaa05d20e --- /dev/null +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/Token.kt @@ -0,0 +1,14 @@ +package com.tangem.domain.tokens.model + +data class Token( + val id: ID, + val networkId: Network.ID, + val name: String, + val symbol: String, + val isCustom: Boolean, + val isCoin: Boolean, +) { + + @JvmInline + value class ID(val value: String) +} \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/TokenList.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/TokenList.kt new file mode 100644 index 0000000000..e94a89de44 --- /dev/null +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/TokenList.kt @@ -0,0 +1,38 @@ +package com.tangem.domain.tokens.model + +import arrow.core.NonEmptySet +import java.math.BigDecimal + +sealed class TokenList { + open val totalFiatBalance: FiatBalance = FiatBalance.Loading + open val sortedBy: SortType = SortType.NONE + + data class GroupedByNetwork( + val groups: NonEmptySet, + override val totalFiatBalance: FiatBalance, + override val sortedBy: SortType, + ) : TokenList() + + data class Ungrouped( + val tokens: NonEmptySet, + override val totalFiatBalance: FiatBalance, + override val sortedBy: SortType, + ) : TokenList() + + object NotInitialized : TokenList() + + enum class SortType { + NONE, BALANCE, + } + + sealed class FiatBalance { + object Loading : FiatBalance() + + object Failed : FiatBalance() + + data class Loaded( + val amount: BigDecimal, + val isAllAmountsSummarized: Boolean, + ) : FiatBalance() + } +} \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/TokenStatus.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/TokenStatus.kt new file mode 100644 index 0000000000..153caf20ba --- /dev/null +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/model/TokenStatus.kt @@ -0,0 +1,42 @@ +package com.tangem.domain.tokens.model + +import java.math.BigDecimal + +data class TokenStatus( + val id: Token.ID, + val networkId: Network.ID, + val name: String, + val symbol: String, + val isCoin: Boolean, + val value: Status, +) { + + sealed class Status { + open val amount: BigDecimal? = null + open val fiatAmount: BigDecimal? = null + open val priceChange: BigDecimal? = null + open val hasTransactionsInProgress: Boolean = false + } + + object Loading : Status() + + object Unreachable : Status() + + object MissedDerivation : Status() + + object NoAccount : Status() + + data class Loaded( + override val amount: BigDecimal, + override val fiatAmount: BigDecimal, + override val priceChange: BigDecimal, + override val hasTransactionsInProgress: Boolean, + ) : Status() + + data class Custom( + override val amount: BigDecimal, + override val fiatAmount: BigDecimal?, + override val priceChange: BigDecimal?, + override val hasTransactionsInProgress: Boolean, + ) : Status() +} \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt new file mode 100644 index 0000000000..df231dd283 --- /dev/null +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt @@ -0,0 +1,26 @@ +package com.tangem.domain.tokens.repository + +import arrow.core.Either +import com.tangem.domain.tokens.error.TokensError +import com.tangem.domain.tokens.model.Network +import com.tangem.domain.tokens.model.NetworkStatus +import com.tangem.domain.tokens.model.Token +import com.tangem.domain.wallets.models.UserWalletId +import kotlinx.coroutines.flow.Flow + +// FIXME: Use Raise as context instead of Effect when context receivers become stable +// [REDACTED_JIRA] + +/** + * Repository for everything related to the blockchain networks + * */ +interface NetworksRepository { + + fun getNetworks(networksIds: Set): Either> + + fun getNetworkStatuses( + userWalletId: UserWalletId, + networks: Map>, + refresh: Boolean, + ): Flow>> +} \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/QuotesRepository.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/QuotesRepository.kt new file mode 100644 index 0000000000..314c1d1177 --- /dev/null +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/QuotesRepository.kt @@ -0,0 +1,18 @@ +package com.tangem.domain.tokens.repository + +import arrow.core.Either +import com.tangem.domain.tokens.error.TokensError +import com.tangem.domain.tokens.model.Quote +import com.tangem.domain.tokens.model.Token +import kotlinx.coroutines.flow.Flow + +// FIXME: Use Raise as context instead of Effect when context receivers become stable +// [REDACTED_JIRA] + +/** + * Repository for everything related to the quotes of tokens + * */ +interface QuotesRepository { + + fun getQuotes(tokensIds: Set, refresh: Boolean): Flow>> +} \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/TokensRepository.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/TokensRepository.kt new file mode 100644 index 0000000000..4b1ed804c3 --- /dev/null +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/TokensRepository.kt @@ -0,0 +1,29 @@ +package com.tangem.domain.tokens.repository + +import arrow.core.Either +import com.tangem.domain.tokens.error.TokensError +import com.tangem.domain.tokens.model.Token +import com.tangem.domain.wallets.models.UserWalletId +import kotlinx.coroutines.flow.Flow + +// FIXME: Use Raise as context instead of Effect when context receivers become stable +// [REDACTED_JIRA] + +/** + * Repository for everything related to the tokens of user wallet + * */ +interface TokensRepository { + + suspend fun sortTokens( + userWalletId: UserWalletId, + sortedTokensIds: Set, + isGrouped: Boolean, + isSortedByBalance: Boolean, + ): Either + + fun getTokens(userWalletId: UserWalletId, refresh: Boolean): Flow>> + + fun isTokensGrouped(userWalletId: UserWalletId): Flow> + + fun isTokensSortedByBalance(userWalletId: UserWalletId): Flow> +} \ No newline at end of file diff --git a/features/wallet/impl/build.gradle.kts b/features/wallet/impl/build.gradle.kts index 64139b1ecb..c0f88c2b7e 100644 --- a/features/wallet/impl/build.gradle.kts +++ b/features/wallet/impl/build.gradle.kts @@ -50,4 +50,5 @@ dependencies { implementation(project(":domain:models")) implementation(project(":domain:wallets")) implementation(project(":domain:wallets:models")) + implementation(projects.domain.tokens) } \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt index 12a164c4fa..2406ada436 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt @@ -40,7 +40,8 @@ internal class DefaultWalletRouter(private val navigationStateHolder: Navigation startDestination = WalletScreens.WALLET.name, ) { composable(WalletScreens.WALLET.name) { - val viewModel = hiltViewModel().apply { router = this@DefaultWalletRouter } + val viewModel = hiltViewModel() + .apply { router = this@DefaultWalletRouter } WalletScreen(state = viewModel.uiState) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt index 4cdda4fe30..9c80b75b31 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt @@ -5,6 +5,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel +import com.tangem.domain.tokens.GetTokenListUseCase import com.tangem.feature.wallet.presentation.common.WalletPreviewData import com.tangem.feature.wallet.presentation.router.InnerWalletRouter import com.tangem.feature.wallet.presentation.wallet.state.WalletStateHolder @@ -19,7 +20,10 @@ import kotlin.properties.Delegates [REDACTED_AUTHOR] */ @HiltViewModel -internal class WalletViewModel @Inject constructor() : ViewModel() { +internal class WalletViewModel @Inject constructor( + @Suppress("unused") // TODO: [REDACTED_JIRA] + private val getTokenListUseCase: GetTokenListUseCase, +) : ViewModel() { /** Feature router */ var router: InnerWalletRouter by Delegates.notNull() diff --git a/settings.gradle.kts b/settings.gradle.kts index 9a14394b73..423368f3d8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -81,8 +81,10 @@ include(":domain:core") include(":domain:card") include(":domain:wallets") include(":domain:wallets:models") +include(":domain:tokens") // endregion Domain modules // region Data modules +include(":data:tokens") include(":data:source:preferences") // endregion Data modules \ No newline at end of file From ffc38eb02de4d50f427d4cce9561d9ffd4f2fc58 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 11 Jul 2023 22:21:20 +0800 Subject: [PATCH 10/10] Updated on 2026-08-14 --- .../java/com/tangem/tap/TapApplication.kt | 5 +++ .../tangem/tap/di/domain/CardDomainModule.kt | 18 ++++++++++ ...ocessor.kt => DefaultScanCardProcessor.kt} | 27 ++++++++------- .../details/redux/DetailsMiddleware.kt | 5 +-- .../tap/features/home/redux/HomeMiddleware.kt | 4 +-- .../middlewares/MultiWalletMiddleware.kt | 5 +-- .../redux/WalletSelectorMiddleware.kt | 6 ++-- .../welcome/redux/WelcomeMiddleware.kt | 4 +-- .../tap/proxy/redux/DaggerGraphState.kt | 2 ++ .../tangem/domain/card/ScanCardProcessor.kt | 25 ++++++++++++++ .../wallet/viewmodels/WalletViewModel.kt | 34 ++++++++++++++++--- 11 files changed, 106 insertions(+), 29 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/di/domain/CardDomainModule.kt rename app/src/main/java/com/tangem/tap/domain/scanCard/{ScanCardProcessor.kt => DefaultScanCardProcessor.kt} (76%) create mode 100644 domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 9c3d7f67cb..b1c5862c9b 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -22,6 +22,7 @@ import com.tangem.datasource.config.FeaturesLocalLoader import com.tangem.datasource.config.models.Config import com.tangem.datasource.connection.NetworkConnectionManager import com.tangem.domain.DomainLayer +import com.tangem.domain.card.ScanCardProcessor import com.tangem.domain.common.LogConfig import com.tangem.domain.wallets.legacy.WalletManagersRepository import com.tangem.feature.learn2earn.domain.api.Learn2earnInteractor @@ -152,6 +153,9 @@ class TapApplication : Application(), ImageLoaderFactory { @Inject lateinit var tokenDetailsFeatureToggles: TokenDetailsFeatureToggles + @Inject + lateinit var scanCardProcessor: ScanCardProcessor + override fun onCreate() { super.onCreate() @@ -169,6 +173,7 @@ class TapApplication : Application(), ImageLoaderFactory { walletConnectRepository = walletConnect2Repository, walletConnectSessionsRepository = walletConnectSessionsRepository, tokenDetailsFeatureToggles = tokenDetailsFeatureToggles, + scanCardProcessor = scanCardProcessor, ), ), ) diff --git a/app/src/main/java/com/tangem/tap/di/domain/CardDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/CardDomainModule.kt new file mode 100644 index 0000000000..27d0e3e8df --- /dev/null +++ b/app/src/main/java/com/tangem/tap/di/domain/CardDomainModule.kt @@ -0,0 +1,18 @@ +package com.tangem.tap.di.domain + +import com.tangem.domain.card.ScanCardProcessor +import com.tangem.tap.domain.scanCard.DefaultScanCardProcessor +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal object CardDomainModule { + + @Provides + @Singleton + fun provideScanCardUseCase(): ScanCardProcessor = DefaultScanCardProcessor() +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/DefaultScanCardProcessor.kt similarity index 76% rename from app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt rename to app/src/main/java/com/tangem/tap/domain/scanCard/DefaultScanCardProcessor.kt index 808f338f85..7c21a8a2f2 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/DefaultScanCardProcessor.kt @@ -3,20 +3,21 @@ package com.tangem.tap.domain.scanCard import com.tangem.common.CompletionResult import com.tangem.common.core.TangemError import com.tangem.core.analytics.models.AnalyticsEvent +import com.tangem.domain.card.ScanCardProcessor import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.store // TODO: Remove this object after feature toggle was removed and use ScanCardUseCase instead -internal object ScanCardProcessor { +internal class DefaultScanCardProcessor : ScanCardProcessor { private val isNewCardScanningEnabled: Boolean get() = store.state.daggerGraphState .get(DaggerGraphState::customTokenFeatureToggles) .isNewCardScanningEnabled - suspend fun scan( - cardId: String? = null, - allowsRequestAccessCodeFromRepository: Boolean = false, + override suspend fun scan( + cardId: String?, + allowsRequestAccessCodeFromRepository: Boolean, ): CompletionResult { return if (isNewCardScanningEnabled) { UseCaseScanProcessor.scan(cardId, allowsRequestAccessCodeFromRepository) @@ -26,15 +27,15 @@ internal object ScanCardProcessor { } @Suppress("LongParameterList") - suspend fun scan( - analyticsEvent: AnalyticsEvent? = null, - cardId: String? = null, - onProgressStateChange: suspend (showProgress: Boolean) -> Unit = {}, - onScanStateChange: suspend (scanInProgress: Boolean) -> Unit = {}, - onWalletNotCreated: suspend () -> Unit = {}, - disclaimerWillShow: () -> Unit = {}, - onFailure: suspend (error: TangemError) -> Unit = {}, - onSuccess: suspend (scanResponse: ScanResponse) -> Unit = {}, + override suspend fun scan( + analyticsEvent: AnalyticsEvent?, + cardId: String?, + onProgressStateChange: suspend (showProgress: Boolean) -> Unit, + onScanStateChange: suspend (scanInProgress: Boolean) -> Unit, + onWalletNotCreated: suspend () -> Unit, + disclaimerWillShow: () -> Unit, + onFailure: suspend (error: TangemError) -> Unit, + onSuccess: suspend (scanResponse: ScanResponse) -> Unit, ) { if (isNewCardScanningEnabled) { UseCaseScanProcessor.scan( diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt index a992489911..b93e243322 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt @@ -25,7 +25,6 @@ import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.domain.model.builders.UserWalletBuilder import com.tangem.tap.domain.model.builders.UserWalletIdBuilder -import com.tangem.tap.domain.scanCard.ScanCardProcessor import com.tangem.tap.domain.userWalletList.di.provideBiometricImplementation import com.tangem.tap.domain.userWalletList.di.provideRuntimeImplementation import com.tangem.tap.domain.userWalletList.isLockedSync @@ -33,6 +32,7 @@ import com.tangem.tap.features.demo.DemoHelper import com.tangem.tap.features.onboarding.products.twins.redux.CreateTwinWalletMode import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.wallet.redux.WalletAction +import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.tangemSdkManager import com.tangem.wallet.R import kotlinx.coroutines.Dispatchers @@ -74,7 +74,8 @@ class DetailsMiddleware { is DetailsAction.AccessCodeRecovery -> accessCodeRecoveryMiddleware.handle(state, action) DetailsAction.ScanCard -> { scope.launch { - ScanCardProcessor.scan(allowsRequestAccessCodeFromRepository = true) + store.state.daggerGraphState.get(DaggerGraphState::scanCardProcessor) + .scan(allowsRequestAccessCodeFromRepository = true) .doOnSuccess { scanResponse -> // if we use biometric, scanResponse in GlobalState is null, and crashes NPE on twin cards store.dispatch(GlobalAction.SaveScanResponse(scanResponse)) diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt index 8a225afa8a..01e2d50c0d 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt @@ -21,12 +21,12 @@ import com.tangem.tap.common.extensions.onUserWalletSelected import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.domain.model.builders.UserWalletBuilder -import com.tangem.tap.domain.scanCard.ScanCardProcessor import com.tangem.tap.features.home.BELARUS_COUNTRY_CODE import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.features.home.redux.HomeMiddleware.BUY_WALLET_URL import com.tangem.tap.features.send.redux.states.ButtonState import com.tangem.tap.features.signin.redux.SignInAction +import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.rekotlin.Action @@ -78,7 +78,7 @@ private fun readCard(analyticsEvent: AnalyticsEvent?) = scope.launch { useBiometricsForAccessCode = preferencesStorage.shouldSaveAccessCodes, ) - ScanCardProcessor.scan( + store.state.daggerGraphState.get(DaggerGraphState::scanCardProcessor).scan( analyticsEvent = analyticsEvent, onProgressStateChange = { showProgress -> if (showProgress) { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt index d008d1b2e0..3f080d645a 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt @@ -15,10 +15,10 @@ import com.tangem.tap.common.extensions.dispatchErrorNotification import com.tangem.tap.common.extensions.dispatchWithMain import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.domain.TapError -import com.tangem.tap.domain.scanCard.ScanCardProcessor import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.features.wallet.redux.WalletState import com.tangem.tap.features.wallet.redux.models.WalletDialog +import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.scope import com.tangem.tap.store import com.tangem.tap.userWalletsListManager @@ -102,7 +102,8 @@ class MultiWalletMiddleware { } private fun scanAndUpdateCard(selectedUserWallet: UserWallet) = scope.launch(Dispatchers.Default) { - ScanCardProcessor.scan(selectedUserWallet.cardId, allowsRequestAccessCodeFromRepository = true) + store.state.daggerGraphState.get(DaggerGraphState::scanCardProcessor) + .scan(cardId = selectedUserWallet.cardId, allowsRequestAccessCodeFromRepository = true) .flatMap { scanResponse -> userWalletsListManager.update( userWalletId = selectedUserWallet.walletId, diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt index 00d1e687bb..148e95d323 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt @@ -20,8 +20,8 @@ import com.tangem.tap.domain.model.TotalFiatBalance import com.tangem.tap.domain.model.WalletStoreModel import com.tangem.tap.domain.model.builders.UserWalletBuilder import com.tangem.tap.domain.model.builders.UserWalletIdBuilder -import com.tangem.tap.domain.scanCard.ScanCardProcessor import com.tangem.tap.domain.userWalletList.unlockIfLockable +import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.flow.firstOrNull @@ -133,7 +133,7 @@ internal class WalletSelectorMiddleware { useBiometricsForAccessCode = preferencesStorage.shouldSaveAccessCodes, ) - ScanCardProcessor.scan( + store.state.daggerGraphState.get(DaggerGraphState::scanCardProcessor).scan( analyticsEvent = Basic.CardWasScanned(AnalyticsParam.ScannedFrom.MyWallets), onWalletNotCreated = { // No need to rollback policy, continue with the policy set before the card scan @@ -208,7 +208,7 @@ internal class WalletSelectorMiddleware { private suspend fun unlockUserWalletWithScannedCard(userWallet: UserWallet): CompletionResult { Analytics.send(MyWallets.Button.WalletUnlockTapped()) tangemSdkManager.changeDisplayedCardIdNumbersCount(userWallet.scanResponse) - return ScanCardProcessor.scan() + return store.state.daggerGraphState.get(DaggerGraphState::scanCardProcessor).scan() .map { scanResponse -> val scannedUserWalletId = UserWalletIdBuilder.scanResponse(scanResponse).build() if (scannedUserWalletId == userWallet.walletId) { diff --git a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt index 8a96417455..7fab7c2a4f 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt @@ -16,10 +16,10 @@ import com.tangem.tap.common.extensions.dispatchWithMain import com.tangem.tap.common.extensions.onUserWalletSelected import com.tangem.tap.common.redux.AppState import com.tangem.tap.domain.model.builders.UserWalletBuilder -import com.tangem.tap.domain.scanCard.ScanCardProcessor import com.tangem.tap.domain.userWalletList.unlockIfLockable import com.tangem.tap.features.intentHandler.handlers.WalletConnectLinkIntentHandler import com.tangem.tap.features.signin.redux.SignInAction +import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.launch import org.rekotlin.Middleware import timber.log.Timber @@ -103,7 +103,7 @@ internal class WelcomeMiddleware { tangemSdkManager.setAccessCodeRequestPolicy( useBiometricsForAccessCode = preferencesStorage.shouldSaveAccessCodes, ) - ScanCardProcessor.scan( + store.state.daggerGraphState.get(DaggerGraphState::scanCardProcessor).scan( analyticsEvent = Basic.CardWasScanned(AnalyticsParam.ScannedFrom.SignIn), onSuccess = { scanResponse -> scope.launch { onCardScanned(scanResponse) } diff --git a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt index 84409d4e36..7bdabd80a3 100644 --- a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt +++ b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt @@ -2,6 +2,7 @@ package com.tangem.tap.proxy.redux import com.tangem.datasource.asset.AssetReader import com.tangem.datasource.connection.NetworkConnectionManager +import com.tangem.domain.card.ScanCardProcessor import com.tangem.domain.card.ScanCardUseCase import com.tangem.features.tester.api.TesterRouter import com.tangem.features.tokendetails.featuretoggles.TokenDetailsFeatureToggles @@ -27,6 +28,7 @@ data class DaggerGraphState( val walletConnectInteractor: WalletConnectInteractor? = null, val tokenDetailsFeatureToggles: TokenDetailsFeatureToggles? = null, val tokenDetailsRouter: TokenDetailsRouter? = null, + val scanCardProcessor: ScanCardProcessor? = null, ) : StateType { inline fun get(getDependency: DaggerGraphState.() -> T?): T { diff --git a/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt b/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt new file mode 100644 index 0000000000..961d9acd07 --- /dev/null +++ b/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt @@ -0,0 +1,25 @@ +package com.tangem.domain.card + +import com.tangem.common.CompletionResult +import com.tangem.common.core.TangemError +import com.tangem.core.analytics.models.AnalyticsEvent +import com.tangem.domain.models.scan.ScanResponse + +interface ScanCardProcessor { + + suspend fun scan( + cardId: String? = null, + allowsRequestAccessCodeFromRepository: Boolean = false, + ): CompletionResult + + suspend fun scan( + analyticsEvent: AnalyticsEvent? = null, + cardId: String? = null, + onProgressStateChange: suspend (showProgress: Boolean) -> Unit = {}, + onScanStateChange: suspend (scanInProgress: Boolean) -> Unit = {}, + onWalletNotCreated: suspend () -> Unit = {}, + disclaimerWillShow: () -> Unit = {}, + onFailure: suspend (error: TangemError) -> Unit = {}, + onSuccess: suspend (scanResponse: ScanResponse) -> Unit = {}, + ) +} \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt index 9c80b75b31..2a2f30dcbb 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt @@ -5,12 +5,18 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.tangem.common.doOnFailure +import com.tangem.common.doOnSuccess +import com.tangem.domain.card.ScanCardProcessor import com.tangem.domain.tokens.GetTokenListUseCase import com.tangem.feature.wallet.presentation.common.WalletPreviewData import com.tangem.feature.wallet.presentation.router.InnerWalletRouter import com.tangem.feature.wallet.presentation.wallet.state.WalletStateHolder import com.tangem.feature.wallet.presentation.wallet.state.WalletTopBarConfig +import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.properties.Delegates @@ -23,6 +29,8 @@ import kotlin.properties.Delegates internal class WalletViewModel @Inject constructor( @Suppress("unused") // TODO: [REDACTED_JIRA] private val getTokenListUseCase: GetTokenListUseCase, + private val scanCardProcessor: ScanCardProcessor, + private val dispatchers: CoroutineDispatcherProvider, ) : ViewModel() { /** Feature router */ @@ -34,16 +42,32 @@ internal class WalletViewModel @Inject constructor( // TODO: [REDACTED_TASK_KEY] Use production data instead of WalletPreviewData private fun getInitialState(): WalletStateHolder = WalletPreviewData.multicurrencyWalletScreenState.copy( - onBackClick = { router.popBackStack() }, - topBarConfig = WalletTopBarConfig( - onScanCardClick = { router.openOrganizeTokensScreen() }, - onMoreClick = { router.openDetailsScreen() }, - ), + onBackClick = ::onBackClick, + topBarConfig = createTopBarConfig(), walletsListConfig = WalletPreviewData.multicurrencyWalletScreenState.walletsListConfig.copy( onWalletChange = ::selectWallet, ), ) + private fun onBackClick() { + router.popBackStack() + } + + private fun createTopBarConfig(): WalletTopBarConfig { + return WalletTopBarConfig( + onScanCardClick = ::onScanCardClick, + onMoreClick = { router.openDetailsScreen() }, + ) + } + + private fun onScanCardClick() { + viewModelScope.launch(dispatchers.io) { + scanCardProcessor.scan(allowsRequestAccessCodeFromRepository = true) + .doOnSuccess { /* [REDACTED_TODO_COMMENT] */ } + .doOnFailure { /* [REDACTED_TODO_COMMENT] */ } + } + } + // TODO: [REDACTED_TASK_KEY] Use production data instead of WalletPreviewData private fun selectWallet(index: Int) { if (uiState.walletsListConfig.selectedWalletIndex == index) return