From 523f8975e37670b783126d980cf46858b209ebf0 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 15 Dec 2022 00:16:37 +0400 Subject: [PATCH 01/13] Updated on 2026-08-14 --- .../main/java/com/tangem/tap/common/shop/TangemShopService.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt b/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt index c8bd0a5405..94c37e96d9 100644 --- a/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt +++ b/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt @@ -204,8 +204,8 @@ class TangemShopService(application: Application, shopifyShop: ShopifyShop) { } companion object { - const val TANGEM_WALLET_2_CARDS_SKU = "TG115x2" - const val TANGEM_WALLET_3_CARDS_SKU = "TG115x3" + const val TANGEM_WALLET_2_CARDS_SKU = "TG115X2-S" + const val TANGEM_WALLET_3_CARDS_SKU = "TG115X3-S" val SKUS_TO_DISPLAY = listOf(TANGEM_WALLET_2_CARDS_SKU, TANGEM_WALLET_3_CARDS_SKU) } } From f427c4508f92c774cab80acf9b2691742a0f6d26 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 26 Dec 2022 15:07:51 +0300 Subject: [PATCH 02/13] Updated on 2026-08-14 --- .../tap/domain/tasks/product/ScanProductTask.kt | 16 ++++++++++------ .../tap/features/onboarding/OnboardingHelper.kt | 3 +++ .../com/tangem/domain/common/ScanResponse.kt | 5 ++++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt index 252d3585e6..d028eb9a9e 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt @@ -18,6 +18,7 @@ import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.TapWorkarounds.isExcluded import com.tangem.domain.common.TapWorkarounds.isNotSupportedInThatRelease import com.tangem.domain.common.TapWorkarounds.isSaltPay +import com.tangem.domain.common.TapWorkarounds.isStart2Coin import com.tangem.domain.common.TapWorkarounds.isTangemNote import com.tangem.domain.common.TapWorkarounds.isTangemTwins import com.tangem.domain.common.TapWorkarounds.useOldStyleDerivation @@ -73,7 +74,7 @@ class ScanProductTask( // it need because processorResult.data.card doesn't contains attestation result // and CardWallet.derivedKeys val processorScanResponseWithNewCard = processorResult.data.copy( - card = scanTaskResult.data + card = scanTaskResult.data, ) callback(CompletionResult.Success(processorScanResponseWithNewCard)) } @@ -96,7 +97,7 @@ private class ScanNoteProcessor : ProductCommandProcessor { override fun proceed( card: Card, session: CardSession, - callback: (result: CompletionResult) -> Unit + callback: (result: CompletionResult) -> Unit, ) { callback( CompletionResult.Success( @@ -145,7 +146,7 @@ private class ScanWalletProcessor( is CompletionResult.Success -> { PreflightReadTask( readMode = PreflightReadMode.FullCardRead, - cardId = card.cardId + cardId = card.cardId, ).run(session) { readResult -> when (readResult) { is CompletionResult.Success -> startLinkingForBackupIfNeeded(card, session, callback) @@ -157,6 +158,7 @@ private class ScanWalletProcessor( } } } + private fun startLinkingForBackupIfNeeded( card: Card, session: CardSession, @@ -180,13 +182,15 @@ private class ScanWalletProcessor( deriveKeysIfNeeded(card, session, callback) } } + private fun deriveKeysIfNeeded( card: Card, session: CardSession, callback: (result: CompletionResult) -> Unit, ) { - val productType = when (card.isSaltPay) { - true -> ProductType.SaltPay + val productType = when { + card.isSaltPay -> ProductType.SaltPay + card.isStart2Coin -> ProductType.Start2Coin else -> ProductType.Wallet } scope.launch { @@ -251,7 +255,7 @@ private class ScanWalletProcessor( Blockchain.RSK, Blockchain.Fantom, Blockchain.FantomTestnet, Blockchain.Avalanche, Blockchain.AvalancheTestnet, - ).map { BlockchainNetwork(it, card) } + ).map { BlockchainNetwork(it, card) }, ) } return blockchainsToDerive.distinct() diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt index f2227fcc32..85a26859f5 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt @@ -37,6 +37,9 @@ class OnboardingHelper { } ProductType.Twins -> AppScreen.OnboardingTwins ProductType.SaltPay -> AppScreen.OnboardingWallet + ProductType.Start2Coin -> throw java.lang.UnsupportedOperationException( + "Onboarding for Start2Coin cards is not supported" + ) } } } diff --git a/domain/src/main/java/com/tangem/domain/common/ScanResponse.kt b/domain/src/main/java/com/tangem/domain/common/ScanResponse.kt index 56c6979d5e..ea2c525405 100644 --- a/domain/src/main/java/com/tangem/domain/common/ScanResponse.kt +++ b/domain/src/main/java/com/tangem/domain/common/ScanResponse.kt @@ -12,6 +12,7 @@ import com.tangem.domain.common.TapWorkarounds.getTangemNoteBlockchain import com.tangem.domain.common.TapWorkarounds.isSaltPay import com.tangem.domain.common.TapWorkarounds.isSaltPayVisa import com.tangem.domain.common.TapWorkarounds.isSaltPayWallet +import com.tangem.domain.common.TapWorkarounds.isStart2Coin import com.tangem.domain.common.TapWorkarounds.isTangemNote import com.tangem.domain.common.TapWorkarounds.isTangemTwins import com.tangem.domain.common.TapWorkarounds.isTestCard @@ -32,6 +33,7 @@ data class ScanResponse( ) : CommandResponse { fun getBlockchain(): Blockchain { return when (productType) { + ProductType.Start2Coin -> if (card.isTestCard) Blockchain.BitcoinTestnet else Blockchain.Bitcoin ProductType.SaltPay -> if (card.isTestCard) Blockchain.SaltPayTestnet else Blockchain.SaltPay ProductType.Note -> card.getTangemNoteBlockchain() ?: Blockchain.Unknown else -> { @@ -90,7 +92,7 @@ data class ScanResponse( } enum class ProductType { - Note, Twins, Wallet, SaltPay + Note, Twins, Wallet, SaltPay, Start2Coin } val Card.productType: ProductType @@ -98,6 +100,7 @@ val Card.productType: ProductType isTangemTwins -> ProductType.Twins isTangemNote -> ProductType.Note isSaltPay -> ProductType.SaltPay + isStart2Coin -> ProductType.Start2Coin else -> ProductType.Wallet } From 18ac1924769d00ab2c7e814a618fc31aeaabda0b Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 26 Dec 2022 16:42:58 +0300 Subject: [PATCH 03/13] Updated on 2026-08-14 --- app/src/main/assets/tangem-app-config | 2 +- .../configurable/config/ConfigManager.kt | 30 ++++++++++++++----- .../domain/configurable/config/JsonModels.kt | 4 ++- dependencies.gradle | 2 +- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index a1658496e7..8453faa078 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit a1658496e777b611fc990ef2bc1a1a1fd48bc1e6 +Subproject commit 8453faa078220801858166081947972639f166db diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt b/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt index bd530b0796..7db1d56007 100644 --- a/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt @@ -1,6 +1,8 @@ package com.tangem.tap.domain.configurable.config import com.tangem.blockchain.common.BlockchainSdkConfig +import com.tangem.blockchain.common.BlockchairCredentials +import com.tangem.blockchain.common.QuickNodeBscCredentials import com.tangem.tap.common.shop.shopify.ShopifyShop import com.tangem.tap.common.zendesk.ZendeskConfig import com.tangem.tap.domain.configurable.Loader @@ -66,12 +68,12 @@ class ConfigManager { config = config.copy( isTopUpEnabled = model.isTopUpEnabled, isSendingToPayIdEnabled = model.isSendingToPayIdEnabled, - isCreatingTwinCardsAllowed = model.isCreatingTwinCardsAllowed + isCreatingTwinCardsAllowed = model.isCreatingTwinCardsAllowed, ) defaultConfig = defaultConfig.copy( isTopUpEnabled = model.isTopUpEnabled, isSendingToPayIdEnabled = model.isSendingToPayIdEnabled, - isCreatingTwinCardsAllowed = model.isCreatingTwinCardsAllowed + isCreatingTwinCardsAllowed = model.isCreatingTwinCardsAllowed, ) } @@ -84,11 +86,17 @@ class ConfigManager { mercuryoWidgetId = values.mercuryoWidgetId, mercuryoSecret = values.mercuryoSecret, blockchainSdkConfig = BlockchainSdkConfig( - blockchairApiKey = values.blockchairApiKey, - blockchairAuthorizationToken = values.blockchairAuthorizationToken, + blockchairCredentials = BlockchairCredentials( + apiKey = values.blockchairApiKeys, + authToken = values.blockchairAuthorizationToken, + ), blockcypherTokens = values.blockcypherTokens, + quickNodeBscCredentials = QuickNodeBscCredentials( + apiKey = values.quiknodeApiKey, + subdomain = values.quiknodeSubdomain, + ), infuraProjectId = values.infuraProjectId, - tronGridApiKey = values.tronGridApiKey + tronGridApiKey = values.tronGridApiKey, ), appsFlyerDevKey = values.appsFlyerDevKey, amplitudeApiKey = values.amplitudeApiKey, @@ -103,10 +111,16 @@ class ConfigManager { mercuryoWidgetId = values.mercuryoWidgetId, mercuryoSecret = values.mercuryoSecret, blockchainSdkConfig = BlockchainSdkConfig( - blockchairApiKey = values.blockchairApiKey, - blockchairAuthorizationToken = values.blockchairAuthorizationToken, + blockchairCredentials = BlockchairCredentials( + apiKey = values.blockchairApiKeys, + authToken = values.blockchairAuthorizationToken, + ), blockcypherTokens = values.blockcypherTokens, - infuraProjectId = values.infuraProjectId + quickNodeBscCredentials = QuickNodeBscCredentials( + apiKey = values.quiknodeApiKey, + subdomain = values.quiknodeSubdomain, + ), + infuraProjectId = values.infuraProjectId, ), appsFlyerDevKey = values.appsFlyerDevKey, amplitudeApiKey = values.amplitudeApiKey, diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt b/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt index 1c537e7909..3b036b1498 100644 --- a/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt +++ b/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt @@ -21,8 +21,10 @@ class ConfigValueModel( val mercuryoSecret: String, val moonPayApiKey: String, val moonPayApiSecretKey: String, - val blockchairApiKey: String?, + val blockchairApiKeys: List, val blockchairAuthorizationToken: String?, + val quiknodeSubdomain: String, + val quiknodeApiKey: String, val blockcypherTokens: Set?, val infuraProjectId: String?, val appsFlyerDevKey: String, diff --git a/dependencies.gradle b/dependencies.gradle index 02d685f18f..7a3f678bf1 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -3,7 +3,7 @@ ext.versions = [ build_gradle : '7.1.3', tangem_card_sdk : 'develop-165', // tangem_card_sdk : '0.0.1', - tangem_blockchain_sdk: 'develop-139', + tangem_blockchain_sdk: 'AND-2684-develop-139-hot-fix-for-3.55-release-144', // tangem_blockchain_sdk: '0.0.1', ] From 420686b4d1aa94b8474b1819662aac54b614f484 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 28 Dec 2022 07:54:53 +0300 Subject: [PATCH 04/13] Updated on 2026-08-14 --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 7a3f678bf1..bba5e61adc 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -3,7 +3,7 @@ ext.versions = [ build_gradle : '7.1.3', tangem_card_sdk : 'develop-165', // tangem_card_sdk : '0.0.1', - tangem_blockchain_sdk: 'AND-2684-develop-139-hot-fix-for-3.55-release-144', + tangem_blockchain_sdk: 'AND-2684-develop-139-hot-fix-for-3.55-release-145', // tangem_blockchain_sdk: '0.0.1', ] From d10ad28fd36cdaf97754801e40c9b01869e7faa8 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 28 Dec 2022 12:09:10 +0300 Subject: [PATCH 05/13] Updated on 2026-08-14 --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index bba5e61adc..b0ee825545 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -3,7 +3,7 @@ ext.versions = [ build_gradle : '7.1.3', tangem_card_sdk : 'develop-165', // tangem_card_sdk : '0.0.1', - tangem_blockchain_sdk: 'AND-2684-develop-139-hot-fix-for-3.55-release-145', + tangem_blockchain_sdk: 'AND-2684-develop-139-hot-fix-for-3.55-release-147', // tangem_blockchain_sdk: '0.0.1', ] From 2d00fcb973455616926d6be16e1588b45871c2c5 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 28 Dec 2022 14:49:41 +0300 Subject: [PATCH 06/13] Updated on 2026-08-14 --- .../domain/configurable/config/ConfigManager.kt | 14 +++++++++++--- .../tap/domain/configurable/config/JsonModels.kt | 2 ++ dependencies.gradle | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt b/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt index 7db1d56007..12e3d14a80 100644 --- a/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt @@ -2,7 +2,7 @@ package com.tangem.tap.domain.configurable.config import com.tangem.blockchain.common.BlockchainSdkConfig import com.tangem.blockchain.common.BlockchairCredentials -import com.tangem.blockchain.common.QuickNodeBscCredentials +import com.tangem.blockchain.common.QuickNodeCredentials import com.tangem.tap.common.shop.shopify.ShopifyShop import com.tangem.tap.common.zendesk.ZendeskConfig import com.tangem.tap.domain.configurable.Loader @@ -91,10 +91,14 @@ class ConfigManager { authToken = values.blockchairAuthorizationToken, ), blockcypherTokens = values.blockcypherTokens, - quickNodeBscCredentials = QuickNodeBscCredentials( + quickNodeCredentials = QuickNodeCredentials( apiKey = values.quiknodeApiKey, subdomain = values.quiknodeSubdomain, ), + bscQuickNodeCredentials = QuickNodeCredentials( + apiKey = values.bscQuiknodeApiKey, + subdomain = values.bscQuiknodeSubdomain, + ), infuraProjectId = values.infuraProjectId, tronGridApiKey = values.tronGridApiKey, ), @@ -116,10 +120,14 @@ class ConfigManager { authToken = values.blockchairAuthorizationToken, ), blockcypherTokens = values.blockcypherTokens, - quickNodeBscCredentials = QuickNodeBscCredentials( + quickNodeCredentials = QuickNodeCredentials( apiKey = values.quiknodeApiKey, subdomain = values.quiknodeSubdomain, ), + bscQuickNodeCredentials = QuickNodeCredentials( + apiKey = values.bscQuiknodeApiKey, + subdomain = values.bscQuiknodeSubdomain, + ), infuraProjectId = values.infuraProjectId, ), appsFlyerDevKey = values.appsFlyerDevKey, diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt b/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt index 3b036b1498..1966ac9303 100644 --- a/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt +++ b/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt @@ -25,6 +25,8 @@ class ConfigValueModel( val blockchairAuthorizationToken: String?, val quiknodeSubdomain: String, val quiknodeApiKey: String, + val bscQuiknodeSubdomain: String, + val bscQuiknodeApiKey: String, val blockcypherTokens: Set?, val infuraProjectId: String?, val appsFlyerDevKey: String, diff --git a/dependencies.gradle b/dependencies.gradle index b0ee825545..f31620d64c 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -3,7 +3,7 @@ ext.versions = [ build_gradle : '7.1.3', tangem_card_sdk : 'develop-165', // tangem_card_sdk : '0.0.1', - tangem_blockchain_sdk: 'AND-2684-develop-139-hot-fix-for-3.55-release-147', + tangem_blockchain_sdk: 'AND-2684-develop-139-hot-fix-for-3.55-release-149', // tangem_blockchain_sdk: '0.0.1', ] From b669dc48bebd5583803b5e0fb2fe6936091cdb8b Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 31 Dec 2022 15:34:47 +0300 Subject: [PATCH 07/13] Updated on 2026-08-14 --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index f31620d64c..9233ced603 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -3,7 +3,7 @@ ext.versions = [ build_gradle : '7.1.3', tangem_card_sdk : 'develop-165', // tangem_card_sdk : '0.0.1', - tangem_blockchain_sdk: 'AND-2684-develop-139-hot-fix-for-3.55-release-149', + tangem_blockchain_sdk: 'AND-2752-build-149-hot-fix-for-3.55-150', // tangem_blockchain_sdk: '0.0.1', ] From 8f6200b7d50e61acc37cf9853d3608e79e4b7eee Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 8 Jan 2023 20:34:56 +0300 Subject: [PATCH 08/13] Updated on 2026-08-14 --- .../tap/domain/scanCard/ScanCardProcessor.kt | 32 ++++++++++++------- .../disclaimer/redux/DisclaimerAction.kt | 15 ++++----- .../disclaimer/redux/DisclaimerMiddleware.kt | 14 ++++---- .../disclaimer/redux/DisclaimerReducer.kt | 8 +++-- .../disclaimer/redux/DisclaimerState.kt | 7 ++-- .../redux/WalletSelectorMiddleware.kt | 14 +++++--- .../tap/persistence/DisclaimerPrefStorage.kt | 5 +++ 7 files changed, 57 insertions(+), 38 deletions(-) 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 d940a338ad..42e199481b 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 @@ -22,6 +22,7 @@ import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.disclaimer.redux.DisclaimerAction +import com.tangem.tap.features.disclaimer.redux.DisclaimerCallback import com.tangem.tap.features.disclaimer.redux.DisclaimerType import com.tangem.tap.features.disclaimer.redux.isAccepted import com.tangem.tap.features.onboarding.OnboardingHelper @@ -48,7 +49,8 @@ object ScanCardProcessor { cardId: String? = null, onProgressStateChange: suspend (showProgress: Boolean) -> Unit = {}, onScanStateChange: suspend (scanInProgress: Boolean) -> Unit = {}, - onWalletNotCreated: suspend (() -> Unit) = {}, + onWalletNotCreated: suspend () -> Unit = {}, + disclaimerWillShow: () -> Unit = {}, onFailure: suspend (error: TangemError) -> Unit = {}, onSuccess: suspend (scanResponse: ScanResponse) -> Unit = {}, ) = withMainContext { @@ -83,6 +85,8 @@ object ScanCardProcessor { showDisclaimerIfNeed( scanResponse = scanResponse1, onProgressStateChange = onProgressStateChange, + disclaimerWillShow = disclaimerWillShow, + onFailure = onFailure, nextHandler = { scanResponse2 -> onScanSuccess( scanResponse = scanResponse2, @@ -128,8 +132,10 @@ object ScanCardProcessor { private suspend inline fun showDisclaimerIfNeed( scanResponse: ScanResponse, + crossinline disclaimerWillShow: () -> Unit = {}, crossinline onProgressStateChange: suspend (showProgress: Boolean) -> Unit, crossinline nextHandler: suspend (ScanResponse) -> Unit, + crossinline onFailure: suspend (error: TangemError) -> Unit, ) { val disclaimerType = DisclaimerType.get(scanResponse) store.dispatchOnMain(DisclaimerAction.SetDisclaimerType(disclaimerType)) @@ -138,18 +144,22 @@ object ScanCardProcessor { nextHandler((scanResponse)) } else scope.launch(Dispatchers.Main) { delay(DELAY_SDK_DIALOG_CLOSE) + disclaimerWillShow() store.dispatchOnMain( DisclaimerAction.Show( - onAcceptCallback = { - scope.launch(Dispatchers.Main) { - nextHandler(scanResponse) - } - }, - onDismissCallback = { - scope.launch(Dispatchers.Main) { - onProgressStateChange(false) - } - }, + callback = DisclaimerCallback( + onAccept = { + scope.launch(Dispatchers.Main) { + nextHandler(scanResponse) + } + }, + onDismiss = { + scope.launch(Dispatchers.Main) { + onProgressStateChange(false) + onFailure(TangemSdkError.UserCancelled()) + } + }, + ), ), ) } diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerAction.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerAction.kt index 5461c66441..395137228c 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerAction.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerAction.kt @@ -10,18 +10,17 @@ sealed class DisclaimerAction : Action { ) : DisclaimerAction() data class Show( - val onAcceptCallback: VoidCallback? = null, - val onDismissCallback: VoidCallback? = null, + val callback: DisclaimerCallback? = null, ) : DisclaimerAction() data class AcceptDisclaimer(val type: DisclaimerType) : DisclaimerAction() internal data class UpdateState(val type: DisclaimerType, val accepted: Boolean) : DisclaimerAction() - internal data class SetCallbacks( - val onAcceptCallback: VoidCallback? = null, - val onDismissCallback: VoidCallback? = null, - ) : DisclaimerAction() - object OnBackPressed : DisclaimerAction() -} \ No newline at end of file +} + +data class DisclaimerCallback( + val onAccept: VoidCallback? = null, + val onDismiss: VoidCallback? = null, +) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerMiddleware.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerMiddleware.kt index 01e5de971a..a604d3275f 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerMiddleware.kt @@ -28,33 +28,31 @@ private fun handleDisclaimerMiddleware(action: Action, appState: AppState) { } is DisclaimerAction.Show -> { handleUpdateState = state.type.createUpdateState() - store.dispatch(DisclaimerAction.SetCallbacks(action.onAcceptCallback, action.onDismissCallback)) store.dispatch(NavigationAction.NavigateTo(AppScreen.Disclaimer)) } is DisclaimerAction.AcceptDisclaimer -> { action.type.accept() handleUpdateState = action.type.createUpdateState() store.dispatch(NavigationAction.PopBackTo()) - state.onAcceptCallback?.invoke() - store.dispatch(DisclaimerAction.SetCallbacks(null, null)) + state.callback?.onAccept?.invoke() } is DisclaimerAction.OnBackPressed -> { - state.onDismissCallback?.invoke() - store.dispatch(DisclaimerAction.SetCallbacks(null, null)) store.dispatch(NavigationAction.PopBackTo()) - + state.callback?.onDismiss?.invoke() } } } private fun DisclaimerType.accept() = when (this) { - DisclaimerType.SaltPay -> preferencesStorage.disclaimerPrefStorage.hasSaltPayTosAccepted = true DisclaimerType.Tangem -> preferencesStorage.disclaimerPrefStorage.hasTangemTosAccepted = true + DisclaimerType.Start2Coin -> preferencesStorage.disclaimerPrefStorage.hasStart2CoinTosAccepted = true + DisclaimerType.SaltPay -> preferencesStorage.disclaimerPrefStorage.hasSaltPayTosAccepted = true } fun DisclaimerType.isAccepted(): Boolean = when (this) { - DisclaimerType.SaltPay -> preferencesStorage.disclaimerPrefStorage.hasSaltPayTosAccepted DisclaimerType.Tangem -> preferencesStorage.disclaimerPrefStorage.hasTangemTosAccepted + DisclaimerType.Start2Coin -> preferencesStorage.disclaimerPrefStorage.hasStart2CoinTosAccepted + DisclaimerType.SaltPay -> preferencesStorage.disclaimerPrefStorage.hasSaltPayTosAccepted } private fun DisclaimerType.createUpdateState(): DisclaimerAction.UpdateState { diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt index 766c6a42ca..d44d02e993 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt @@ -15,13 +15,15 @@ private fun internalReduce(action: Action, state: AppState): DisclaimerState { val disclaimerState = state.disclaimerState return when (action) { + is DisclaimerAction.Show -> disclaimerState.copy( + callback = action.callback, + ) is DisclaimerAction.UpdateState -> disclaimerState.copy( type = action.type, accepted = action.accepted, ) - is DisclaimerAction.SetCallbacks -> disclaimerState.copy( - onAcceptCallback = action.onAcceptCallback, - onDismissCallback = action.onDismissCallback, + is DisclaimerAction.AcceptDisclaimer, is DisclaimerAction.OnBackPressed -> disclaimerState.copy( + callback = null, ) else -> disclaimerState } diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt index d7ca859973..d8dcbddd2a 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt @@ -1,23 +1,23 @@ package com.tangem.tap.features.disclaimer.redux import android.net.Uri -import com.tangem.common.extensions.VoidCallback import com.tangem.domain.common.CardDTO import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.TapWorkarounds.isSaltPay +import com.tangem.domain.common.TapWorkarounds.isStart2Coin import org.rekotlin.StateType data class DisclaimerState( val accepted: Boolean = false, val type: DisclaimerType = DisclaimerType.Tangem, - val onAcceptCallback: VoidCallback? = null, - val onDismissCallback: VoidCallback? = null, + val callback: DisclaimerCallback? = null, ) : StateType sealed class DisclaimerType( val uri: Uri, ) { object Tangem : DisclaimerType(Uri.parse("https://tangem.com/tangem_tos.html")) + object Start2Coin : DisclaimerType(Uri.parse("https://tangem.com/tangem_tos.html")) object SaltPay : DisclaimerType(Uri.parse("https://tangem.com/soltpay_tos.html")) companion object { @@ -25,6 +25,7 @@ sealed class DisclaimerType( fun get(card: CardDTO): DisclaimerType = when { card.isSaltPay -> SaltPay + card.isStart2Coin -> Start2Coin else -> Tangem } } 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 cc6642743f..6d284c8b95 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 @@ -138,7 +138,16 @@ internal class WalletSelectorMiddleware { tangemSdkManager.setAccessCodeRequestPolicy( useBiometricsForAccessCode = preferencesStorage.shouldSaveAccessCodes, ) + ScanCardProcessor.scan( + onWalletNotCreated = { + // No need to rollback policy, continue with the policy set before the card scan + store.dispatchOnMain(WalletSelectorAction.AddWallet.Success) + store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Wallet)) + }, + disclaimerWillShow = { + store.dispatchOnMain(NavigationAction.PopBackTo()) + }, onSuccess = { scanResponse -> saveUserWalletAndPopBackToWalletScreen(scanResponse) .doOnFailure { error -> @@ -152,11 +161,6 @@ internal class WalletSelectorMiddleware { tangemSdkManager.setAccessCodeRequestPolicy(prevUseBiometricsForAccessCode) store.dispatchOnMain(WalletSelectorAction.AddWallet.Error(error)) }, - onWalletNotCreated = { - // No need to rollback policy, continue with the policy set before the card scan - store.dispatchOnMain(WalletSelectorAction.AddWallet.Success) - store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Wallet)) - }, ) } diff --git a/app/src/main/java/com/tangem/tap/persistence/DisclaimerPrefStorage.kt b/app/src/main/java/com/tangem/tap/persistence/DisclaimerPrefStorage.kt index 7c016eaa5d..ffffa7ba40 100644 --- a/app/src/main/java/com/tangem/tap/persistence/DisclaimerPrefStorage.kt +++ b/app/src/main/java/com/tangem/tap/persistence/DisclaimerPrefStorage.kt @@ -14,12 +14,17 @@ class DisclaimerPrefStorage( get() = preferences.getBoolean(KEY_TANGEM_TOS, false) set(value) = preferences.edit { putBoolean(KEY_TANGEM_TOS, value) } + var hasStart2CoinTosAccepted: Boolean + get() = preferences.getBoolean(KEY_START_2_COIN_TOS, false) + set(value) = preferences.edit { putBoolean(KEY_START_2_COIN_TOS, value) } + var hasSaltPayTosAccepted: Boolean get() = preferences.getBoolean(KEY_SALT_PAY_TOS, false) set(value) = preferences.edit { putBoolean(KEY_SALT_PAY_TOS, value) } companion object { private const val KEY_TANGEM_TOS = "tangem_tos_accepted" + private const val KEY_START_2_COIN_TOS = "s2c_tos_accepted" private const val KEY_SALT_PAY_TOS = "saltPay_tos_accepted" } } \ No newline at end of file From 6587833faddb55a5e2390d922002ece20f7a3126 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 9 Jan 2023 15:19:25 +0300 Subject: [PATCH 09/13] Updated on 2026-08-14 --- .../tangem/tap/domain/extensions/WalletManagerFactory.kt | 2 +- .../tangem/tap/domain/model/builders/UserWalletBuilder.kt | 3 ++- .../tap/domain/model/builders/UserWalletIdBuilder.kt | 1 + .../products/wallet/saltPay/GnosisRegistrator.kt | 1 - buildSrc/src/main/java/Versions.kt | 2 +- .../java/com/tangem/domain/common/SaltPayWorkaround.kt | 7 ------- .../src/main/java/com/tangem/domain/common/ScanResponse.kt | 4 +--- .../java/com/tangem/domain/common/extensions/Blockchain.kt | 4 +--- 8 files changed, 7 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt b/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt index 874e562a2a..989793e59a 100644 --- a/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt +++ b/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt @@ -143,7 +143,7 @@ fun WalletManagerFactory.makeSaltPayWalletManager( scanResponse: ScanResponse, ): EthereumWalletManager { val blockchain = scanResponse.getBlockchain() - if (blockchain != Blockchain.SaltPay && blockchain != Blockchain.SaltPayTestnet) + if (blockchain != Blockchain.SaltPay) throw IllegalArgumentException() val token = SaltPayWorkaround.tokenFrom(blockchain) diff --git a/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletBuilder.kt b/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletBuilder.kt index 9148486bc6..22cc834b2a 100644 --- a/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletBuilder.kt +++ b/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletBuilder.kt @@ -29,9 +29,9 @@ class UserWalletBuilder( ProductType.Note -> "Note" ProductType.Twins -> "Twin" ProductType.SaltPay -> "SaltPay" + ProductType.Start2Coin -> "Start2Coin" ProductType.Wallet -> when { card.isBackupNotAllowed -> "Tangem card" - card.isStart2Coin -> "Start2Coin" else -> "Wallet" } } @@ -41,6 +41,7 @@ class UserWalletBuilder( ProductType.Note -> false ProductType.Twins -> false ProductType.SaltPay -> false + ProductType.Start2Coin -> false ProductType.Wallet -> when { card.isStart2Coin -> false card.firmwareVersion >= FirmwareVersion.MultiWalletAvailable -> true diff --git a/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletIdBuilder.kt b/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletIdBuilder.kt index 1fdef7c37c..ebe875ad66 100644 --- a/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletIdBuilder.kt +++ b/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletIdBuilder.kt @@ -57,6 +57,7 @@ class UserWalletIdBuilder private constructor( ProductType.Note, ProductType.Wallet, ProductType.SaltPay, + ProductType.Start2Coin, -> null }, ) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/GnosisRegistrator.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/GnosisRegistrator.kt index 771fca7d4b..f0319a11ba 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/GnosisRegistrator.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/GnosisRegistrator.kt @@ -39,7 +39,6 @@ class GnosisRegistrator( private val otpProcessorContractAddress: String = when (walletManager.wallet.blockchain) { Blockchain.SaltPay -> "0x3B4397C817A26521Df8bD01a949AFDE2251d91C2" - Blockchain.SaltPayTestnet -> "0x710BF23486b549836509a08c184cE0188830f197" else -> throw IllegalArgumentException("GnosisRegistrator supports only the SaltPay blockchain") } diff --git a/buildSrc/src/main/java/Versions.kt b/buildSrc/src/main/java/Versions.kt index 89471ec92c..1970c7140f 100644 --- a/buildSrc/src/main/java/Versions.kt +++ b/buildSrc/src/main/java/Versions.kt @@ -59,7 +59,7 @@ object Versions { // endregion Other libraries // region Tangem - const val tangemBlockchainSdk = "develop-141" + const val tangemBlockchainSdk = "develop-151" const val tangemCardSgk = "develop-179" // endregion Tangem diff --git a/domain/src/main/java/com/tangem/domain/common/SaltPayWorkaround.kt b/domain/src/main/java/com/tangem/domain/common/SaltPayWorkaround.kt index c397160c2d..39378b30a9 100644 --- a/domain/src/main/java/com/tangem/domain/common/SaltPayWorkaround.kt +++ b/domain/src/main/java/com/tangem/domain/common/SaltPayWorkaround.kt @@ -15,13 +15,6 @@ object SaltPayWorkaround { decimals = 18, id = "wrapped-xdai", ) - Blockchain.SaltPayTestnet -> Token( - name = "WXDAI Test", - symbol = "MyERC20", - contractAddress = "0x69cca8D8295de046C7c14019D9029Ccc77987A48", - decimals = 0, - id = "wrapped-xdai", - ) else -> throw IllegalArgumentException() } } diff --git a/domain/src/main/java/com/tangem/domain/common/ScanResponse.kt b/domain/src/main/java/com/tangem/domain/common/ScanResponse.kt index cfcd3089ff..c5576f6037 100644 --- a/domain/src/main/java/com/tangem/domain/common/ScanResponse.kt +++ b/domain/src/main/java/com/tangem/domain/common/ScanResponse.kt @@ -11,8 +11,6 @@ import com.tangem.domain.common.TapWorkarounds.getTangemNoteBlockchain import com.tangem.domain.common.TapWorkarounds.isSaltPay import com.tangem.domain.common.TapWorkarounds.isSaltPayVisa import com.tangem.domain.common.TapWorkarounds.isSaltPayWallet -import com.tangem.domain.common.TapWorkarounds.isStart2Coin -import com.tangem.domain.common.TapWorkarounds.isTangemNote import com.tangem.domain.common.TapWorkarounds.isTangemTwins import com.tangem.domain.common.TapWorkarounds.isTestCard import com.tangem.operations.CommandResponse @@ -33,7 +31,7 @@ data class ScanResponse( fun getBlockchain(): Blockchain { return when (productType) { ProductType.Start2Coin -> if (card.isTestCard) Blockchain.BitcoinTestnet else Blockchain.Bitcoin - ProductType.SaltPay -> if (card.isTestCard) Blockchain.SaltPayTestnet else Blockchain.SaltPay + ProductType.SaltPay -> Blockchain.SaltPay ProductType.Note -> card.getTangemNoteBlockchain() ?: Blockchain.Unknown else -> { val blockchainName: String = walletData?.blockchain ?: return Blockchain.Unknown diff --git a/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt b/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt index 0fde777794..c684dbe3f5 100644 --- a/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt +++ b/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt @@ -48,7 +48,6 @@ fun Blockchain.Companion.fromNetworkId(networkId: String): Blockchain? { "optimistic-ethereum/test" -> Blockchain.OptimismTestnet "dash" -> Blockchain.Dash "sxdai" -> Blockchain.SaltPay - "sxdai/test" -> Blockchain.SaltPayTestnet else -> null } } @@ -101,7 +100,6 @@ fun Blockchain.toNetworkId(): String { Blockchain.OptimismTestnet -> "optimistic-ethereum/test" Blockchain.Dash -> "dash" Blockchain.SaltPay -> "sxdai" - Blockchain.SaltPayTestnet -> "sxdai/test" } } @@ -133,7 +131,7 @@ fun Blockchain.toCoinId(): String { Blockchain.Kusama -> "kusama" Blockchain.Optimism, Blockchain.OptimismTestnet -> "ethereum" Blockchain.Dash -> "dash" - Blockchain.SaltPay, Blockchain.SaltPayTestnet -> "xdai" + Blockchain.SaltPay -> "xdai" Blockchain.Unknown -> "unknown" } } From 5d448b9500cb998b4dcd53ed44c641a6997a5b6f Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 10 Jan 2023 11:42:49 +0300 Subject: [PATCH 10/13] Updated on 2026-08-14 --- app/build.gradle.kts | 1 + .../main/java/com/tangem/tap/MainActivity.kt | 2 +- .../java/com/tangem/tap/TapApplication.kt | 2 +- .../common/analytics/AnalyticsEventsLogger.kt | 4 +- .../tap/common/analytics/AnalyticsFactory.kt | 5 +- .../analytics/api/AnalyticsHandlerBuilder.kt | 19 ++++++++ .../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 | 2 + .../common/analytics/events/ManageTokens.kt | 1 + .../tap/common/analytics/events/MyWallets.kt | 2 + .../tap/common/analytics/events/Onboarding.kt | 2 + .../tap/common/analytics/events/Portfolio.kt | 2 + .../tap/common/analytics/events/Settings.kt | 1 + .../tap/common/analytics/events/Shop.kt | 1 + .../tap/common/analytics/events/Token.kt | 1 + .../common/analytics/events/WalletConnect.kt | 2 + .../analytics/filters/BasicSignInFilter.kt | 6 +-- .../analytics/filters/BasicTopUpFilter.kt | 6 +-- .../filters/ShopPurchasedEventFilter.kt | 6 +-- .../amplitude/AmplitudeAnalyticsHandler.kt | 2 +- .../handlers/amplitude/AmplitudeClient.kt | 2 +- .../appsFlyer/AppsFlyerAnalyticsHandler.kt | 2 +- .../handlers/appsFlyer/AppsFlyerClient.kt | 2 +- .../firebase/FirebaseAnalyticsHandler.kt | 28 +++++------ .../handlers/firebase/FirebaseClient.kt | 4 +- .../BatchIdParamsInterceptor.kt | 4 +- .../tap/common/shop/TangemShopService.kt | 2 +- .../com/tangem/tap/domain/TangemSdkManager.kt | 2 +- .../tap/domain/scanCard/ScanCardProcessor.kt | 2 +- .../walletconnect/WalletConnectManager.kt | 2 +- .../walletconnect/WalletConnectSdkHelper.kt | 2 +- .../details/redux/DetailsMiddleware.kt | 2 +- .../ui/cardsettings/CardSettingsViewModel.kt | 2 +- .../details/ui/details/DetailsFragment.kt | 2 +- .../details/ui/details/DetailsViewModel.kt | 3 +- .../ui/walletconnect/WalletConnectScreen.kt | 2 +- .../tangem/tap/features/home/HomeFragment.kt | 2 +- .../AddressInfoBottomSheetDialog.kt | 2 +- .../products/note/OnboardingNoteFragment.kt | 2 +- .../note/redux/OnboardingNoteMiddleware.kt | 2 +- .../OnboardingOtherCardsFragment.kt | 2 +- .../redux/OnboardingOtherCardsMiddleware.kt | 2 +- .../twins/redux/TwinCardsMiddleware.kt | 2 +- .../products/twins/ui/TwinsCardsFragment.kt | 2 +- .../redux/OnboardingWalletMiddleware.kt | 2 +- .../redux/OnboardingSaltPayMiddleware.kt | 2 +- .../saltPay/ui/OnboardingSaltPayView.kt | 2 +- .../wallet/ui/OnboardingWalletFragment.kt | 2 +- .../saveWallet/redux/SaveWalletMiddleware.kt | 2 +- .../send/redux/middlewares/SendMiddleware.kt | 2 +- .../tap/features/send/ui/SendFragment.kt | 2 +- .../tap/features/shop/ui/ShopFragment.kt | 2 +- .../addCustomToken/AddCustomTokenFragment.kt | 2 +- .../features/tokens/redux/TokensMiddleware.kt | 2 +- .../features/tokens/ui/AddTokensFragment.kt | 2 +- .../tokens/ui/compose/CurrenciesScreen.kt | 2 +- .../middlewares/AppCurrencyMiddleware.kt | 2 +- .../middlewares/MultiWalletMiddleware.kt | 2 +- .../middlewares/TradeCryptoMiddleware.kt | 2 +- .../middlewares/WalletDialogsMiddleware.kt | 2 +- .../redux/middlewares/WalletMiddleware.kt | 2 +- .../wallet/ui/WalletDetailsFragment.kt | 2 +- .../tap/features/wallet/ui/WalletFragment.kt | 2 +- .../wallet/ui/adapters/WalletAdapter.kt | 2 +- .../ui/adapters/WarningMessagesAdapter.kt | 2 +- ...sianCardholdersWarningBottomSheetDialog.kt | 2 +- .../wallet/ui/dialogs/ScanFailsDialog.kt | 2 +- .../wallet/ui/wallet/MultiWalletView.kt | 2 +- .../redux/WalletSelectorMiddleware.kt | 2 +- .../ui/WalletSelectorBottomSheetFragment.kt | 2 +- core/analytics/.gitignore | 1 + core/analytics/build.gradle.kts | 48 +++++++++++++++++++ core/analytics/src/main/AndroidManifest.xml | 2 + .../com/tangem/core}/analytics/Analytics.kt | 19 ++++---- .../tangem/core/analytics}/AnalyticsEvent.kt | 4 +- .../tangem/core}/analytics/api/ClientApi.kt | 2 +- .../core}/analytics/api/EventFilterApi.kt | 4 +- .../core}/analytics/api/EventHandlerApi.kt | 20 +------- .../analytics/api/ParamsInterceptorApi.kt | 4 +- .../core/analytics/di/AnalyticsModule.kt | 20 ++++++++ .../FeatureCoroutineExceptionHandler.kt | 10 ++-- domain/build.gradle.kts | 1 + .../com/tangem/domain/redux/ReStoreHub.kt | 2 +- settings.gradle.kts | 1 + 87 files changed, 223 insertions(+), 121 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/common/analytics/api/AnalyticsHandlerBuilder.kt create mode 100644 core/analytics/.gitignore create mode 100644 core/analytics/build.gradle.kts create mode 100644 core/analytics/src/main/AndroidManifest.xml rename {app/src/main/java/com/tangem/tap/common => core/analytics/src/main/java/com/tangem/core}/analytics/Analytics.kt (82%) rename {app/src/main/java/com/tangem/tap/common/analytics/events => core/analytics/src/main/java/com/tangem/core/analytics}/AnalyticsEvent.kt (71%) rename {app/src/main/java/com/tangem/tap/common => core/analytics/src/main/java/com/tangem/core}/analytics/api/ClientApi.kt (86%) rename {app/src/main/java/com/tangem/tap/common => core/analytics/src/main/java/com/tangem/core}/analytics/api/EventFilterApi.kt (89%) rename {app/src/main/java/com/tangem/tap/common => core/analytics/src/main/java/com/tangem/core}/analytics/api/EventHandlerApi.kt (54%) rename {app/src/main/java/com/tangem/tap/common => core/analytics/src/main/java/com/tangem/core}/analytics/api/ParamsInterceptorApi.kt (78%) create mode 100644 core/analytics/src/main/java/com/tangem/core/analytics/di/AnalyticsModule.kt rename {domain/src/main/java/com/tangem/domain/common => core/utils/src/main/java/com/tangem/utils/coroutines}/FeatureCoroutineExceptionHandler.kt (61%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1876b0038c..34d26a35ae 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -109,6 +109,7 @@ dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar")))) implementation(project(":domain")) implementation(project(":common")) + implementation(project(":core:analytics")) implementation(project(":core:res")) implementation(project(":core:ui")) implementation(project(":core:datasource")) diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index da2ecd172f..5efe9e9397 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -10,7 +10,7 @@ import androidx.core.view.WindowInsetsControllerCompat import by.kirich1409.viewbindingdelegate.viewBinding import com.google.android.material.snackbar.Snackbar import com.tangem.TangemSdk -import com.tangem.domain.common.FeatureCoroutineExceptionHandler +import com.tangem.utils.coroutines.FeatureCoroutineExceptionHandler import com.tangem.operations.backup.BackupService import com.tangem.tangem_sdk_new.extensions.init import com.tangem.tap.common.ActivityResultCallbackHolder diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 50ded416e6..4ffc45da6d 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -17,7 +17,7 @@ import com.tangem.domain.common.LogConfig import com.tangem.tap.common.AndroidAssetReader import com.tangem.tap.common.AssetReader import com.tangem.tap.common.IntentHandler -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.AnalyticsFactory import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder import com.tangem.tap.common.analytics.filters.BasicSignInFilter diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEventsLogger.kt b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEventsLogger.kt index 0865d2aa81..6b5a1fc3a2 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEventsLogger.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEventsLogger.kt @@ -1,8 +1,8 @@ package com.tangem.tap.common.analytics import com.tangem.common.json.MoshiJsonConverter -import com.tangem.tap.common.analytics.api.ErrorEventLogger -import com.tangem.tap.common.analytics.api.EventLogger +import com.tangem.analytics.api.ErrorEventLogger +import com.tangem.analytics.api.EventLogger import timber.log.Timber class AnalyticsEventsLogger( diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsFactory.kt b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsFactory.kt index 8936adfc3c..ed2e3868b5 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsFactory.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsFactory.kt @@ -1,8 +1,9 @@ package com.tangem.tap.common.analytics -import com.tangem.tap.common.analytics.api.AnalyticsEventFilter +import com.tangem.core.analytics.Analytics +import com.tangem.core.analytics.api.AnalyticsEventFilter +import com.tangem.core.analytics.api.ParamsInterceptor import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder -import com.tangem.tap.common.analytics.api.ParamsInterceptor /** [REDACTED_AUTHOR] diff --git a/app/src/main/java/com/tangem/tap/common/analytics/api/AnalyticsHandlerBuilder.kt b/app/src/main/java/com/tangem/tap/common/analytics/api/AnalyticsHandlerBuilder.kt new file mode 100644 index 0000000000..6d23925143 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/analytics/api/AnalyticsHandlerBuilder.kt @@ -0,0 +1,19 @@ +package com.tangem.tap.common.analytics.api + +import android.app.Application +import com.tangem.common.json.MoshiJsonConverter +import com.tangem.core.analytics.api.AnalyticsHandler +import com.tangem.domain.common.AnalyticsHandlersLogConfig +import com.tangem.tap.domain.configurable.config.Config + +interface AnalyticsHandlerBuilder { + fun build(data: Data): AnalyticsHandler? + + data class Data( + val application: Application, + val config: Config, + val isDebug: Boolean, + val logConfig: AnalyticsHandlersLogConfig, + val jsonConverter: MoshiJsonConverter, + ) +} \ No newline at end of file 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 80afe6d3f8..ecdedd9761 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,5 +1,7 @@ package com.tangem.tap.common.analytics.events +import com.tangem.core.analytics.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 a26109ae2a..96fa307105 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,5 +1,7 @@ package com.tangem.tap.common.analytics.events +import com.tangem.core.analytics.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 1ec8d81533..a0d34306c9 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,5 +1,7 @@ package com.tangem.tap.common.analytics.events +import com.tangem.core.analytics.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 4b3eb7f431..0d799d379f 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,5 +1,7 @@ package com.tangem.tap.common.analytics.events +import com.tangem.core.analytics.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 a42cc3568e..6f718755f0 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,5 +1,7 @@ package com.tangem.tap.common.analytics.events +import com.tangem.core.analytics.AnalyticsEvent + /** [REDACTED_AUTHOR] */ 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 f944f58d24..55ed5f97b9 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,5 +1,6 @@ package com.tangem.tap.common.analytics.events +import com.tangem.core.analytics.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 0fd08ddd88..2b660fa11d 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,5 +1,7 @@ package com.tangem.tap.common.analytics.events +import com.tangem.core.analytics.AnalyticsEvent + sealed class MyWallets( event: String, params: Map = mapOf(), 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 92f55074e9..91a3ae0741 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,5 +1,7 @@ package com.tangem.tap.common.analytics.events +import com.tangem.core.analytics.AnalyticsEvent + /** [REDACTED_AUTHOR] */ 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 6747c2172d..71383c9f9a 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,5 +1,7 @@ package com.tangem.tap.common.analytics.events +import com.tangem.core.analytics.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 728662bdb9..c9b0419a49 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,5 +1,6 @@ package com.tangem.tap.common.analytics.events +import com.tangem.core.analytics.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 9634f2929b..788f557537 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,5 +1,6 @@ package com.tangem.tap.common.analytics.events +import com.tangem.core.analytics.AnalyticsEvent import com.tangem.tap.common.extensions.filterNotNull /** 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 7445e31f33..99badb9998 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,5 +1,6 @@ package com.tangem.tap.common.analytics.events +import com.tangem.core.analytics.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 1ff587b2aa..b3e4b835be 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,5 +1,7 @@ package com.tangem.tap.common.analytics.events +import com.tangem.core.analytics.AnalyticsEvent + /** [REDACTED_AUTHOR] */ diff --git a/app/src/main/java/com/tangem/tap/common/analytics/filters/BasicSignInFilter.kt b/app/src/main/java/com/tangem/tap/common/analytics/filters/BasicSignInFilter.kt index a582ea34f1..09c26d8d7d 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/filters/BasicSignInFilter.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/filters/BasicSignInFilter.kt @@ -1,8 +1,8 @@ package com.tangem.tap.common.analytics.filters -import com.tangem.tap.common.analytics.api.AnalyticsEventFilter -import com.tangem.tap.common.analytics.api.AnalyticsHandler -import com.tangem.tap.common.analytics.events.AnalyticsEvent +import com.tangem.core.analytics.api.AnalyticsEventFilter +import com.tangem.core.analytics.api.AnalyticsHandler +import com.tangem.core.analytics.AnalyticsEvent import com.tangem.tap.common.analytics.events.Basic /** diff --git a/app/src/main/java/com/tangem/tap/common/analytics/filters/BasicTopUpFilter.kt b/app/src/main/java/com/tangem/tap/common/analytics/filters/BasicTopUpFilter.kt index be780ccd2d..de89bf9e7e 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/filters/BasicTopUpFilter.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/filters/BasicTopUpFilter.kt @@ -1,9 +1,9 @@ package com.tangem.tap.common.analytics.filters import com.tangem.common.extensions.guard -import com.tangem.tap.common.analytics.api.AnalyticsEventFilter -import com.tangem.tap.common.analytics.api.AnalyticsHandler -import com.tangem.tap.common.analytics.events.AnalyticsEvent +import com.tangem.core.analytics.api.AnalyticsEventFilter +import com.tangem.core.analytics.api.AnalyticsHandler +import com.tangem.core.analytics.AnalyticsEvent import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Basic import com.tangem.tap.persistence.ToppedUpWalletStorage diff --git a/app/src/main/java/com/tangem/tap/common/analytics/filters/ShopPurchasedEventFilter.kt b/app/src/main/java/com/tangem/tap/common/analytics/filters/ShopPurchasedEventFilter.kt index dffa123240..738d3fed8f 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/filters/ShopPurchasedEventFilter.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/filters/ShopPurchasedEventFilter.kt @@ -1,8 +1,8 @@ package com.tangem.tap.common.analytics.filters -import com.tangem.tap.common.analytics.api.AnalyticsEventFilter -import com.tangem.tap.common.analytics.api.AnalyticsHandler -import com.tangem.tap.common.analytics.events.AnalyticsEvent +import com.tangem.core.analytics.api.AnalyticsEventFilter +import com.tangem.core.analytics.api.AnalyticsHandler +import com.tangem.core.analytics.AnalyticsEvent import com.tangem.tap.common.analytics.events.Shop import com.tangem.tap.common.analytics.handlers.appsFlyer.AppsFlyerAnalyticsHandler import com.tangem.tap.common.analytics.handlers.firebase.FirebaseAnalyticsHandler diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeAnalyticsHandler.kt index c76fe21d38..a1daeb7ccf 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeAnalyticsHandler.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.handlers.amplitude -import com.tangem.tap.common.analytics.api.AnalyticsHandler +import com.tangem.core.analytics.api.AnalyticsHandler import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder class AmplitudeAnalyticsHandler( diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeClient.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeClient.kt index d90ed084b5..80f8359025 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeClient.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeClient.kt @@ -4,7 +4,7 @@ import android.app.Application import com.amplitude.api.Amplitude import com.amplitude.api.AmplitudeClient import com.tangem.common.Converter -import com.tangem.tap.common.analytics.api.EventLogger +import com.tangem.analytics.api.EventLogger import org.json.JSONObject /** 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 c3968d9d72..a0b6cb378f 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,6 +1,6 @@ package com.tangem.tap.common.analytics.handlers.appsFlyer -import com.tangem.tap.common.analytics.api.AnalyticsHandler +import com.tangem.core.analytics.api.AnalyticsHandler import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder class AppsFlyerAnalyticsHandler( diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerClient.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerClient.kt index 6a7aa7cfed..b8271cc6af 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerClient.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerClient.kt @@ -2,7 +2,7 @@ package com.tangem.tap.common.analytics.handlers.appsFlyer import android.content.Context import com.appsflyer.AppsFlyerLib -import com.tangem.tap.common.analytics.api.EventLogger +import com.tangem.analytics.api.EventLogger /** [REDACTED_AUTHOR] 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 109e61d0a5..2172fe9aee 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,10 +1,10 @@ package com.tangem.tap.common.analytics.handlers.firebase -import com.tangem.tap.common.analytics.api.AnalyticsHandler +import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.core.analytics.api.AnalyticsHandler +import com.tangem.core.analytics.api.ErrorEventHandler import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder -import com.tangem.tap.common.analytics.api.ErrorEventHandler import com.tangem.tap.common.analytics.converters.AnalyticsErrorConverter -import com.tangem.tap.common.analytics.events.AnalyticsEvent class FirebaseAnalyticsHandler( private val client: FirebaseAnalyticsClient, @@ -17,18 +17,18 @@ class FirebaseAnalyticsHandler( } override fun send(event: AnalyticsEvent) { - when (event.error) { - null -> super.send(event) - else -> { - val errorConverter = AnalyticsErrorConverter() - if (!errorConverter.canBeHandled(event.error)) return + val error = event.error + if (error == null) { + super.send(event) + } else { + val errorConverter = AnalyticsErrorConverter() + if (!errorConverter.canBeHandled(error)) return - val errorParams = errorConverter.convert(event.error).toMutableMap() - errorParams["Category"] = event.category - errorParams["Event"] = event.event - errorParams.putAll(event.params) - send(event.error, errorParams) - } + val errorParams = errorConverter.convert(error).toMutableMap() + errorParams["Category"] = event.category + errorParams["Event"] = event.event + errorParams.putAll(event.params) + send(error, errorParams) } } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseClient.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseClient.kt index 07ed4c4551..3db2ed90bc 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseClient.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseClient.kt @@ -6,8 +6,8 @@ import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.ktx.analytics import com.google.firebase.crashlytics.ktx.crashlytics import com.google.firebase.ktx.Firebase -import com.tangem.tap.common.analytics.api.ErrorEventLogger -import com.tangem.tap.common.analytics.api.EventLogger +import com.tangem.analytics.api.ErrorEventLogger +import com.tangem.analytics.api.EventLogger /** [REDACTED_AUTHOR] diff --git a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/BatchIdParamsInterceptor.kt b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/BatchIdParamsInterceptor.kt index ffe48cf198..b7e7ec6fbf 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/BatchIdParamsInterceptor.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/BatchIdParamsInterceptor.kt @@ -1,7 +1,7 @@ package com.tangem.tap.common.analytics.paramsInterceptor -import com.tangem.tap.common.analytics.api.ParamsInterceptor -import com.tangem.tap.common.analytics.events.AnalyticsEvent +import com.tangem.core.analytics.api.ParamsInterceptor +import com.tangem.core.analytics.AnalyticsEvent import com.tangem.tap.common.analytics.events.AnalyticsParam /** diff --git a/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt b/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt index 808cb5bbbc..47951bfb84 100644 --- a/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt +++ b/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt @@ -4,7 +4,7 @@ import android.app.Application import android.content.Intent import com.google.android.gms.wallet.PaymentData import com.shopify.buy3.Storefront -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.converters.ShopOrderToEventConverter import com.tangem.tap.common.extensions.filterNotNull import com.tangem.tap.common.shop.data.ProductType diff --git a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt index be8e4f65b2..cf8a13681c 100644 --- a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt @@ -30,7 +30,7 @@ import com.tangem.operations.derivation.DeriveMultipleWalletPublicKeysTask import com.tangem.operations.pins.CheckUserCodesCommand import com.tangem.operations.pins.CheckUserCodesResponse import com.tangem.operations.pins.SetUserCodeCommand -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Basic import com.tangem.tap.domain.tasks.CreateWalletAndRescanTask import com.tangem.tap.domain.tasks.product.CreateProductWalletTask 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 d940a338ad..0f0c84e44e 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 @@ -11,7 +11,7 @@ import com.tangem.domain.common.extensions.withMainContext import com.tangem.operations.backup.BackupService import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE import com.tangem.tap.backupService -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.IntroductionProcess import com.tangem.tap.common.analytics.paramsInterceptor.BatchIdParamsInterceptor import com.tangem.tap.common.extensions.dispatchDialogShow 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 37e488ccf8..d2b77a628c 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,7 +4,7 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.common.card.EllipticCurve import com.tangem.common.extensions.guard import com.tangem.domain.common.ScanResponse -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.WalletConnect import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.redux.global.GlobalAction diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt index def1cb4a92..2ad236bd6c 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt @@ -24,7 +24,7 @@ import com.tangem.common.extensions.toDecompressedPublicKey import com.tangem.common.extensions.toHexString import com.tangem.crypto.CryptoUtils import com.tangem.operations.sign.SignHashCommand -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.WalletConnect import com.tangem.tap.common.extensions.safeUpdate import com.tangem.tap.common.extensions.toFormattedString 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 9fe984d9c9..fda0a60ea4 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 @@ -6,7 +6,7 @@ import com.tangem.common.doOnFailure import com.tangem.common.doOnSuccess import com.tangem.common.flatMap import com.tangem.domain.common.TapWorkarounds.isTangemTwins -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Settings import com.tangem.tap.common.extensions.dispatchDialogShow diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt index ce9da7f8b0..6920e51129 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt @@ -2,7 +2,7 @@ package com.tangem.tap.features.details.ui.cardsettings import com.tangem.domain.common.TapWorkarounds.isTangemTwins import com.tangem.domain.common.getTwinCardIdForUser -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Settings import com.tangem.tap.common.redux.AppState diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsFragment.kt b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsFragment.kt index 4cecec1a8f..56023ab1f8 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsFragment.kt @@ -10,7 +10,7 @@ import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.Fragment import androidx.transition.TransitionInflater import com.tangem.core.ui.res.TangemTheme -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Settings import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.details.redux.DetailsState diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt index f6b932c755..42fbc5b252 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt @@ -2,7 +2,7 @@ package com.tangem.tap.features.details.ui.details import com.tangem.domain.common.TapWorkarounds.isSaltPay import com.tangem.domain.common.TapWorkarounds.isStart2Coin -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Settings import com.tangem.tap.common.feedback.FeedbackEmail import com.tangem.tap.common.feedback.SupportInfo @@ -11,7 +11,6 @@ import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.domain.extensions.isMultiwalletAllowed -import com.tangem.tap.domain.extensions.isTangemWallet import com.tangem.tap.features.details.redux.DetailsAction import com.tangem.tap.features.details.redux.DetailsState import com.tangem.tap.features.disclaimer.redux.DisclaimerAction diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectScreen.kt b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectScreen.kt index 499f31ddcf..a08153c345 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectScreen.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectScreen.kt @@ -30,7 +30,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Settings import com.tangem.tap.common.compose.TangemTypography import com.tangem.tap.common.extensions.getFromClipboard diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index 450d428367..aef9f11d9d 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -12,7 +12,7 @@ import androidx.compose.ui.platform.ComposeView import androidx.core.view.WindowInsetsControllerCompat import androidx.fragment.app.Fragment import com.google.accompanist.appcompattheme.AppCompatTheme -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.IntroductionProcess import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/AddressInfoBottomSheetDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/AddressInfoBottomSheetDialog.kt index b56ddaf6cd..0372ae6ee4 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/AddressInfoBottomSheetDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/AddressInfoBottomSheetDialog.kt @@ -5,7 +5,7 @@ import android.os.Bundle import android.view.LayoutInflater import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.extensions.copyToClipboard import com.tangem.tap.common.extensions.dispatchDialogHide diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/OnboardingNoteFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/OnboardingNoteFragment.kt index 558c71a9f6..c4b34eba62 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/OnboardingNoteFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/OnboardingNoteFragment.kt @@ -9,7 +9,7 @@ import androidx.core.view.isVisible import androidx.transition.TransitionManager import coil.load import com.tangem.blockchain.common.Blockchain -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.getDrawableCompat import com.tangem.tap.common.extensions.stripZeroPlainString diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt index 7119dfaf0d..e63a4a9b7c 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt @@ -4,7 +4,7 @@ import com.tangem.common.CompletionResult import com.tangem.common.extensions.guard import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.dispatchDebugErrorNotification diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/OnboardingOtherCardsFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/OnboardingOtherCardsFragment.kt index b0b8ae343d..5439b76612 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/OnboardingOtherCardsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/OnboardingOtherCardsFragment.kt @@ -8,7 +8,7 @@ import androidx.constraintlayout.widget.ConstraintSet import androidx.core.view.isVisible import androidx.transition.TransitionManager import coil.load -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.getDrawableCompat import com.tangem.tap.common.redux.navigation.ShareElement diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt index 91536792a9..d554befc5f 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt @@ -4,7 +4,7 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.common.CompletionResult import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.postUi import com.tangem.tap.common.redux.AppState diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt index b5bd3c7504..4492881a57 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt @@ -7,7 +7,7 @@ import com.tangem.common.extensions.guard import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.dispatchDialogShow diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt index 36e386325e..9d7b99a2a6 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt @@ -18,7 +18,7 @@ import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.TwinCardNumber import com.tangem.tangem_sdk_new.ui.widget.leapfrogWidget.LeapfrogWidget import com.tangem.tap.common.AndroidAssetReader -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.beginDelayedTransition import com.tangem.tap.common.extensions.getDrawableCompat diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index 37e629800a..6c35be3ead 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -9,7 +9,7 @@ import com.tangem.domain.common.TapWorkarounds.isSaltPay import com.tangem.domain.common.extensions.withMainContext import com.tangem.operations.backup.BackupService import com.tangem.tap.backupService -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.extensions.dispatchOnMain diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt index 4d6c4a3c00..ce3390eba1 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt @@ -10,7 +10,7 @@ import com.tangem.domain.common.extensions.successOr import com.tangem.domain.common.extensions.withMainContext import com.tangem.datasource.api.paymentology.KYCStatus import com.tangem.datasource.api.paymentology.RegistrationResponse -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.dispatchDebugErrorNotification import com.tangem.tap.common.extensions.dispatchOnMain diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt index fcbcfb74ff..569e87ee0f 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt @@ -14,7 +14,7 @@ import coil.size.Scale import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.button.MaterialButton import com.tangem.common.extensions.guard -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.compose.PinCodeWidget import com.tangem.tap.common.extensions.configureSettings diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt index 2ca75121a9..04fc588577 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt @@ -19,7 +19,7 @@ import com.tangem.common.CardIdFormatter import com.tangem.common.core.CardIdDisplayFormat import com.tangem.tangem_sdk_new.ui.widget.leapfrogWidget.LeapfrogWidget import com.tangem.tangem_sdk_new.ui.widget.leapfrogWidget.PropertyCalculator -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.hide import com.tangem.tap.common.extensions.inflate diff --git a/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt index 60bc2e076e..2dfa79cb24 100644 --- a/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt @@ -4,7 +4,7 @@ import com.tangem.common.CompletionResult import com.tangem.common.doOnFailure import com.tangem.common.doOnSuccess import com.tangem.common.flatMap -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.MainScreen import com.tangem.tap.common.analytics.events.Onboarding diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt index 5bf0618fbb..c72e9f9a67 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt @@ -17,7 +17,7 @@ import com.tangem.domain.common.CardDTO import com.tangem.domain.common.TapWorkarounds.isStart2Coin import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.extensions.dispatchDialogShow diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt b/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt index a4f93f7949..5c5a0b924d 100644 --- a/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt @@ -16,7 +16,7 @@ import com.google.android.material.textfield.TextInputEditText import com.tangem.Message import com.tangem.tangem_sdk_new.extensions.hideSoftKeyboard import com.tangem.tap.common.KeyboardObserver -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.entities.FiatCurrency import com.tangem.tap.common.extensions.getFromClipboard diff --git a/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt b/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt index 338561267b..1f32a5305e 100644 --- a/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt @@ -12,7 +12,7 @@ import androidx.activity.OnBackPressedCallback import by.kirich1409.viewbindingdelegate.viewBinding import com.tangem.tap.common.GlobalLayoutStateHandler import com.tangem.tap.common.KeyboardObserver -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Shop import com.tangem.tap.common.extensions.show import com.tangem.tap.common.redux.navigation.NavigationAction diff --git a/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/AddCustomTokenFragment.kt b/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/AddCustomTokenFragment.kt index 3954882be5..0c03a6869d 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/AddCustomTokenFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/AddCustomTokenFragment.kt @@ -13,7 +13,7 @@ import androidx.compose.ui.platform.ComposeView import com.google.accompanist.appcompattheme.AppCompatTheme import com.tangem.domain.features.addCustomToken.redux.AddCustomTokenState import com.tangem.domain.redux.domainStore -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.ManageTokens import com.tangem.tap.common.compose.ClosePopupTrigger import com.tangem.tap.features.BaseStoreFragment diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt index af6ab1607f..7a4a1a1b2a 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt @@ -21,7 +21,7 @@ import com.tangem.domain.redux.domainStore import com.tangem.operations.derivation.ExtendedPublicKeysMap import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE import com.tangem.tap.assetReader -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.ManageTokens import com.tangem.tap.common.extensions.dispatchDebugErrorNotification import com.tangem.tap.common.extensions.dispatchOnMain diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt index 2fa1ab2971..499ed8e2f5 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt @@ -13,7 +13,7 @@ import androidx.transition.TransitionInflater import by.kirich1409.viewbindingdelegate.viewBinding import com.google.accompanist.appcompattheme.AppCompatTheme import com.tangem.blockchain.common.Blockchain -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.ManageTokens import com.tangem.tap.common.extensions.copyToClipboard import com.tangem.tap.common.extensions.dispatchNotification diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt index 149fd2b517..09ddf515fc 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt @@ -29,7 +29,7 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.core.ui.components.SystemBarsEffect import com.tangem.domain.common.TapWorkarounds.useOldStyleDerivation import com.tangem.domain.common.extensions.fromNetworkId -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.ManageTokens import com.tangem.tap.common.compose.Keyboard diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/AppCurrencyMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/AppCurrencyMiddleware.kt index c60632f60e..5b05b971d0 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/AppCurrencyMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/AppCurrencyMiddleware.kt @@ -3,7 +3,7 @@ package com.tangem.tap.features.wallet.redux.middlewares import com.tangem.common.services.Result import com.tangem.datasource.api.tangemTech.CurrenciesResponse import com.tangem.datasource.api.tangemTech.TangemTechService -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.MainScreen import com.tangem.tap.common.entities.FiatCurrency 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 ba82d17ccd..87341ef9c0 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 @@ -6,7 +6,7 @@ import com.tangem.blockchain.common.WalletManager import com.tangem.common.doOnSuccess import com.tangem.common.extensions.guard import com.tangem.domain.common.extensions.withMainContext -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.MainScreen import com.tangem.tap.common.analytics.events.Token.ButtonRemoveToken diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt index df69426a2c..0bb74bbf6b 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt @@ -2,7 +2,7 @@ package com.tangem.tap.features.wallet.redux.middlewares import com.tangem.blockchain.blockchains.ethereum.EthereumWalletManager import com.tangem.blockchain.common.AmountType -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.extensions.dispatchDebugErrorNotification diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt index fb6ff1dd3f..262f1780fc 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt @@ -1,6 +1,6 @@ package com.tangem.tap.features.wallet.redux.middlewares -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.extensions.dispatchDialogHide diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index 243ab5eab6..548d0ccf4f 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -11,7 +11,7 @@ import com.tangem.common.services.Result import com.tangem.domain.common.extensions.withMainContext import com.tangem.operations.attestation.Attestation import com.tangem.operations.attestation.OnlineCardVerifier -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.MainScreen import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.extensions.copyToClipboard diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt index bd1608e7de..50f53888b7 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt @@ -22,7 +22,7 @@ import com.tangem.domain.common.TapWorkarounds.derivationStyle import com.tangem.tangem_sdk_new.extensions.dpToPx import com.tangem.tap.common.SnackbarHandler import com.tangem.tap.common.TestActions -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.DetailsScreen import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.extensions.appendIfNotNull diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt index f01805dd39..860939d53c 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt @@ -21,7 +21,7 @@ import com.tangem.core.ui.fragments.setStatusBarColor import com.tangem.core.ui.utils.OneTouchClickListener import com.tangem.domain.common.TapWorkarounds.isSaltPay import com.tangem.tap.MainActivity -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.converters.BasicSignInEventConverter import com.tangem.tap.common.analytics.converters.BasicTopUpEventConverter import com.tangem.tap.common.analytics.events.MainScreen diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt index b07db256f5..fb19f281bc 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt @@ -7,7 +7,7 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.tangem.domain.common.TapWorkarounds.derivationStyle -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Portfolio import com.tangem.tap.common.extensions.getString import com.tangem.tap.common.extensions.hide diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WarningMessagesAdapter.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WarningMessagesAdapter.kt index dd3bcee91c..774bfc2aee 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WarningMessagesAdapter.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WarningMessagesAdapter.kt @@ -7,7 +7,7 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.google.android.play.core.review.ReviewManagerFactory -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.MainScreen import com.tangem.tap.common.extensions.getActivity diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/RussianCardholdersWarningBottomSheetDialog.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/RussianCardholdersWarningBottomSheetDialog.kt index b8022e2724..ca665749bb 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/RussianCardholdersWarningBottomSheetDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/RussianCardholdersWarningBottomSheetDialog.kt @@ -4,7 +4,7 @@ import android.content.Context import android.os.Bundle import android.view.LayoutInflater import com.google.android.material.bottomsheet.BottomSheetDialog -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.analytics.events.Token diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/ScanFailsDialog.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/ScanFailsDialog.kt index cef955c28e..3251bce185 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/ScanFailsDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/ScanFailsDialog.kt @@ -2,7 +2,7 @@ package com.tangem.tap.features.wallet.ui.dialogs import android.content.Context import androidx.appcompat.app.AlertDialog -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.IntroductionProcess import com.tangem.tap.common.extensions.dispatchDialogHide import com.tangem.tap.common.feedback.ScanFailsEmail diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt index f7c8dc8a66..108ad69cdd 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt @@ -7,7 +7,7 @@ import com.badoo.mvicore.DiffStrategy import com.badoo.mvicore.modelWatcher import com.tangem.domain.common.TapWorkarounds.derivationStyle import com.tangem.domain.common.TapWorkarounds.isTestCard -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.MainScreen import com.tangem.tap.common.analytics.events.Portfolio import com.tangem.tap.common.extensions.animateVisibility 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 4772b501d7..5565d38455 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 @@ -8,7 +8,7 @@ import com.tangem.common.flatMap import com.tangem.common.map import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.util.UserWalletId -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.MyWallets import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.onUserWalletSelected diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/ui/WalletSelectorBottomSheetFragment.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/ui/WalletSelectorBottomSheetFragment.kt index 4db33980de..96bba1df0e 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/ui/WalletSelectorBottomSheetFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/ui/WalletSelectorBottomSheetFragment.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.platform.rememberNestedScrollInteropConnection import androidx.fragment.app.viewModels import com.tangem.core.ui.fragments.ComposeBottomSheetFragment import com.tangem.core.ui.res.TangemTheme -import com.tangem.tap.common.analytics.Analytics +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.MyWallets import com.tangem.tap.features.details.ui.cardsettings.resolveReference import com.tangem.tap.features.walletSelector.ui.components.RenameWalletDialogContent diff --git a/core/analytics/.gitignore b/core/analytics/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/core/analytics/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/core/analytics/build.gradle.kts b/core/analytics/build.gradle.kts new file mode 100644 index 0000000000..639fbbc622 --- /dev/null +++ b/core/analytics/build.gradle.kts @@ -0,0 +1,48 @@ +plugins { + id("com.android.library") + kotlin("android") + kotlin("kapt") + id("com.google.dagger.hilt.android") +} + +android { + defaultConfig { + compileSdk = AppConfig.compileSdkVersion + minSdk = AppConfig.minSdkVersion + targetSdk = AppConfig.targetSdkVersion + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + isCoreLibraryDesugaringEnabled = false + } + + buildTypes { + create("debug_beta") { + initWith(getByName("release")) + BuildConfigFieldFactory( + fields = listOf( + Field.Environment("release"), + Field.TestActionEnabled(true), + Field.LogEnabled(true), + ), + builder = ::buildConfigField, + ).create() + } + } +} + +dependencies { + + /** DI */ + implementation(Library.hilt) + kapt(Library.hiltKapt) + + /** Core shouldn't depends on core, but in case with utils and logging its necessary */ + implementation(project(":core:utils")) +} \ No newline at end of file diff --git a/core/analytics/src/main/AndroidManifest.xml b/core/analytics/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..9270c6ee97 --- /dev/null +++ b/core/analytics/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/Analytics.kt b/core/analytics/src/main/java/com/tangem/core/analytics/Analytics.kt similarity index 82% rename from app/src/main/java/com/tangem/tap/common/analytics/Analytics.kt rename to core/analytics/src/main/java/com/tangem/core/analytics/Analytics.kt index 8a6ee52f27..20fcb92c92 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/Analytics.kt +++ b/core/analytics/src/main/java/com/tangem/core/analytics/Analytics.kt @@ -1,14 +1,13 @@ -package com.tangem.tap.common.analytics +package com.tangem.core.analytics -import com.tangem.domain.common.FeatureCoroutineExceptionHandler -import com.tangem.tap.common.analytics.api.AnalyticsEventFilter -import com.tangem.tap.common.analytics.api.AnalyticsEventHandler -import com.tangem.tap.common.analytics.api.AnalyticsFilterHolder -import com.tangem.tap.common.analytics.api.AnalyticsHandler -import com.tangem.tap.common.analytics.api.AnalyticsHandlerHolder -import com.tangem.tap.common.analytics.api.ParamsInterceptor -import com.tangem.tap.common.analytics.api.ParamsInterceptorHolder -import com.tangem.tap.common.analytics.events.AnalyticsEvent +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.utils.coroutines.FeatureCoroutineExceptionHandler import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/AnalyticsEvent.kt b/core/analytics/src/main/java/com/tangem/core/analytics/AnalyticsEvent.kt similarity index 71% rename from app/src/main/java/com/tangem/tap/common/analytics/events/AnalyticsEvent.kt rename to core/analytics/src/main/java/com/tangem/core/analytics/AnalyticsEvent.kt index b2db44fe52..e23a503460 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/AnalyticsEvent.kt +++ b/core/analytics/src/main/java/com/tangem/core/analytics/AnalyticsEvent.kt @@ -1,9 +1,9 @@ -package com.tangem.tap.common.analytics.events +package com.tangem.core.analytics /** [REDACTED_AUTHOR] */ -sealed class AnalyticsEvent( +open class AnalyticsEvent( val category: String, val event: String, var params: Map = mapOf(), diff --git a/app/src/main/java/com/tangem/tap/common/analytics/api/ClientApi.kt b/core/analytics/src/main/java/com/tangem/core/analytics/api/ClientApi.kt similarity index 86% rename from app/src/main/java/com/tangem/tap/common/analytics/api/ClientApi.kt rename to core/analytics/src/main/java/com/tangem/core/analytics/api/ClientApi.kt index 3b5b0720f2..d4a9b22842 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/api/ClientApi.kt +++ b/core/analytics/src/main/java/com/tangem/core/analytics/api/ClientApi.kt @@ -1,4 +1,4 @@ -package com.tangem.tap.common.analytics.api +package com.tangem.analytics.api /** [REDACTED_AUTHOR] diff --git a/app/src/main/java/com/tangem/tap/common/analytics/api/EventFilterApi.kt b/core/analytics/src/main/java/com/tangem/core/analytics/api/EventFilterApi.kt similarity index 89% rename from app/src/main/java/com/tangem/tap/common/analytics/api/EventFilterApi.kt rename to core/analytics/src/main/java/com/tangem/core/analytics/api/EventFilterApi.kt index 04d6dbbb01..8381b2b983 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/api/EventFilterApi.kt +++ b/core/analytics/src/main/java/com/tangem/core/analytics/api/EventFilterApi.kt @@ -1,6 +1,6 @@ -package com.tangem.tap.common.analytics.api +package com.tangem.core.analytics.api -import com.tangem.tap.common.analytics.events.AnalyticsEvent +import com.tangem.core.analytics.AnalyticsEvent /** [REDACTED_AUTHOR] diff --git a/app/src/main/java/com/tangem/tap/common/analytics/api/EventHandlerApi.kt b/core/analytics/src/main/java/com/tangem/core/analytics/api/EventHandlerApi.kt similarity index 54% rename from app/src/main/java/com/tangem/tap/common/analytics/api/EventHandlerApi.kt rename to core/analytics/src/main/java/com/tangem/core/analytics/api/EventHandlerApi.kt index 344402f7f1..ca6721037c 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/api/EventHandlerApi.kt +++ b/core/analytics/src/main/java/com/tangem/core/analytics/api/EventHandlerApi.kt @@ -1,10 +1,6 @@ -package com.tangem.tap.common.analytics.api +package com.tangem.core.analytics.api -import android.app.Application -import com.tangem.common.json.MoshiJsonConverter -import com.tangem.domain.common.AnalyticsHandlersLogConfig -import com.tangem.tap.common.analytics.events.AnalyticsEvent -import com.tangem.tap.domain.configurable.config.Config +import com.tangem.core.analytics.AnalyticsEvent /** [REDACTED_AUTHOR] @@ -35,16 +31,4 @@ interface ErrorEventHandler { interface AnalyticsHandlerHolder { fun addHandler(name: String, handler: AnalyticsHandler) fun removeHandler(name: String): AnalyticsHandler? -} - -interface AnalyticsHandlerBuilder { - fun build(data: Data): AnalyticsHandler? - - data class Data( - val application: Application, - val config: Config, - val isDebug: Boolean, - val logConfig: AnalyticsHandlersLogConfig, - val jsonConverter: MoshiJsonConverter, - ) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/api/ParamsInterceptorApi.kt b/core/analytics/src/main/java/com/tangem/core/analytics/api/ParamsInterceptorApi.kt similarity index 78% rename from app/src/main/java/com/tangem/tap/common/analytics/api/ParamsInterceptorApi.kt rename to core/analytics/src/main/java/com/tangem/core/analytics/api/ParamsInterceptorApi.kt index 245ef32da5..e2f9dd5860 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/api/ParamsInterceptorApi.kt +++ b/core/analytics/src/main/java/com/tangem/core/analytics/api/ParamsInterceptorApi.kt @@ -1,6 +1,6 @@ -package com.tangem.tap.common.analytics.api +package com.tangem.core.analytics.api -import com.tangem.tap.common.analytics.events.AnalyticsEvent +import com.tangem.core.analytics.AnalyticsEvent /** [REDACTED_AUTHOR] diff --git a/core/analytics/src/main/java/com/tangem/core/analytics/di/AnalyticsModule.kt b/core/analytics/src/main/java/com/tangem/core/analytics/di/AnalyticsModule.kt new file mode 100644 index 0000000000..512686e026 --- /dev/null +++ b/core/analytics/src/main/java/com/tangem/core/analytics/di/AnalyticsModule.kt @@ -0,0 +1,20 @@ +package com.tangem.core.analytics.di + +import com.tangem.core.analytics.Analytics +import com.tangem.core.analytics.api.AnalyticsEventHandler +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +class AnalyticsModule { + + @Singleton + @Provides + fun provideAnalyticsHandler(): AnalyticsEventHandler { + return Analytics //todo replace after refactoring calling Analytics in whole project + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/tangem/domain/common/FeatureCoroutineExceptionHandler.kt b/core/utils/src/main/java/com/tangem/utils/coroutines/FeatureCoroutineExceptionHandler.kt similarity index 61% rename from domain/src/main/java/com/tangem/domain/common/FeatureCoroutineExceptionHandler.kt rename to core/utils/src/main/java/com/tangem/utils/coroutines/FeatureCoroutineExceptionHandler.kt index e6dde98009..71cea0fb21 100644 --- a/domain/src/main/java/com/tangem/domain/common/FeatureCoroutineExceptionHandler.kt +++ b/core/utils/src/main/java/com/tangem/utils/coroutines/FeatureCoroutineExceptionHandler.kt @@ -1,9 +1,10 @@ -package com.tangem.domain.common +package com.tangem.utils.coroutines import kotlinx.coroutines.CoroutineExceptionHandler -import timber.log.Timber import java.io.PrintWriter import java.io.StringWriter +import java.util.logging.Level +import java.util.logging.Logger /** [REDACTED_AUTHOR] @@ -16,7 +17,10 @@ class FeatureCoroutineExceptionHandler { val sw = StringWriter() throwable.printStackTrace(PrintWriter(sw)) val exceptionAsString: String = sw.toString() - Timber.e("CoroutineException: from: %s, exception: %s", from, exceptionAsString) + //it delegates logging to android Logger, cause cant use timber in java module + Logger.getLogger("CoroutineExceptHandler").log( + Level.INFO, "CoroutineException: from: $from, exception: $exceptionAsString", + ) throw throwable } } diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index e365d69c25..93519446be 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -72,6 +72,7 @@ android { dependencies { implementation(project(":core:datasource")) + implementation(project(":core:utils")) implementation(project(":common")) /** Tangem libraries */ diff --git a/domain/src/main/java/com/tangem/domain/redux/ReStoreHub.kt b/domain/src/main/java/com/tangem/domain/redux/ReStoreHub.kt index a869c18177..fc2f0df299 100644 --- a/domain/src/main/java/com/tangem/domain/redux/ReStoreHub.kt +++ b/domain/src/main/java/com/tangem/domain/redux/ReStoreHub.kt @@ -1,8 +1,8 @@ package com.tangem.domain.redux import android.webkit.ValueCallback -import com.tangem.domain.common.FeatureCoroutineExceptionHandler import com.tangem.domain.redux.global.DomainGlobalState +import com.tangem.utils.coroutines.FeatureCoroutineExceptionHandler import kotlinx.coroutines.* import org.rekotlin.Action import org.rekotlin.DispatchFunction diff --git a/settings.gradle.kts b/settings.gradle.kts index 028fd3f613..b7dc831ec1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,6 +3,7 @@ include(":domain") include(":common") // region Core modules +include(":core:analytics") include(":core:datasource") include(":core:res") include(":core:utils") From 905792c77e655fa595c2c63a6d5cc241cb7351a7 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 9 Jan 2023 00:35:28 +0300 Subject: [PATCH 11/13] Updated on 2026-08-14 --- .../tap/domain/scanCard/ScanCardProcessor.kt | 15 ++-- .../tangem/tap/domain/termsOfUse/CardTou.kt | 47 ---------- .../features/details/redux/DetailsAction.kt | 3 - .../details/redux/DetailsMiddleware.kt | 6 -- .../features/details/redux/DetailsReducer.kt | 1 - .../features/details/redux/DetailsState.kt | 2 - .../details/ui/details/DetailsScreenState.kt | 1 - .../details/ui/details/DetailsViewModel.kt | 6 +- .../tap/features/disclaimer/Disclaimer.kt | 80 +++++++++++++++++ .../disclaimer/DisclaimerDataProvider.kt | 12 +++ .../tap/features/disclaimer/DisclaimerType.kt | 44 +++++++++ .../disclaimer/redux/DisclaimerAction.kt | 21 ++--- .../disclaimer/redux/DisclaimerMiddleware.kt | 35 +------- .../disclaimer/redux/DisclaimerReducer.kt | 14 +-- .../disclaimer/redux/DisclaimerState.kt | 39 +++----- .../disclaimer/ui/DisclaimerFragment.kt | 90 +++++++++++++++---- .../disclaimer/ui/DisclaimerWebViewClient.kt | 68 ++++++++++++++ .../tap/features/wallet/ui/WalletFragment.kt | 2 - .../tap/persistence/DisclaimerPrefStorage.kt | 20 ++--- .../main/res/layout/fragment_disclaimer.xml | 75 +++++++++++++--- 20 files changed, 384 insertions(+), 197 deletions(-) delete mode 100644 app/src/main/java/com/tangem/tap/domain/termsOfUse/CardTou.kt create mode 100644 app/src/main/java/com/tangem/tap/features/disclaimer/Disclaimer.kt create mode 100644 app/src/main/java/com/tangem/tap/features/disclaimer/DisclaimerDataProvider.kt create mode 100644 app/src/main/java/com/tangem/tap/features/disclaimer/DisclaimerType.kt create mode 100644 app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerWebViewClient.kt 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 e9b7d1a7e3..7b33c2f9fc 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 @@ -21,10 +21,10 @@ import com.tangem.tap.common.redux.AppDialog import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction +import com.tangem.tap.features.disclaimer.DisclaimerType +import com.tangem.tap.features.disclaimer.createDisclaimer import com.tangem.tap.features.disclaimer.redux.DisclaimerAction import com.tangem.tap.features.disclaimer.redux.DisclaimerCallback -import com.tangem.tap.features.disclaimer.redux.DisclaimerType -import com.tangem.tap.features.disclaimer.redux.isAccepted import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.features.onboarding.OnboardingSaltPayHelper import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction @@ -137,16 +137,17 @@ object ScanCardProcessor { crossinline nextHandler: suspend (ScanResponse) -> Unit, crossinline onFailure: suspend (error: TangemError) -> Unit, ) { - val disclaimerType = DisclaimerType.get(scanResponse) - store.dispatchOnMain(DisclaimerAction.SetDisclaimerType(disclaimerType)) + val disclaimer = DisclaimerType.get(scanResponse.card).createDisclaimer(scanResponse.card) + store.dispatchOnMain(DisclaimerAction.SetDisclaimer(disclaimer)) - if (disclaimerType.isAccepted()) { + if (disclaimer.isAccepted()) { nextHandler((scanResponse)) - } else scope.launch(Dispatchers.Main) { + } else scope.launch { delay(DELAY_SDK_DIALOG_CLOSE) disclaimerWillShow() - store.dispatchOnMain( + dispatchOnMain( DisclaimerAction.Show( + fromScreen = AppScreen.Home, callback = DisclaimerCallback( onAccept = { scope.launch(Dispatchers.Main) { diff --git a/app/src/main/java/com/tangem/tap/domain/termsOfUse/CardTou.kt b/app/src/main/java/com/tangem/tap/domain/termsOfUse/CardTou.kt deleted file mode 100644 index 6644362bf5..0000000000 --- a/app/src/main/java/com/tangem/tap/domain/termsOfUse/CardTou.kt +++ /dev/null @@ -1,47 +0,0 @@ -package com.tangem.tap.domain.termsOfUse - -import android.content.res.Resources -import android.net.Uri -import androidx.core.os.ConfigurationCompat -import com.tangem.domain.common.CardDTO -import java.util.* - -/** -[REDACTED_AUTHOR] - */ -class CardTou { - private val locale: Locale = - ConfigurationCompat.getLocales(Resources.getSystem().configuration).get(0)!! - - fun getUrl(card: CardDTO): Uri? { - val issuerName = card.issuer.name - if (issuerName.lowercase(Locale.getDefault()) != "start2coin") return null - - val baseUrl = "https://app.tangem.com/tou/" - val regionCode = regionCode(card.cardId) ?: "fr" - val filename = filename(locale.language, regionCode) - return Uri.parse(baseUrl + filename) - } - - private fun filename(languageCode: String, regionCode: String): String { - return when { - languageCode == "fr" && regionCode == "ch" -> "Start2Coin-fr-ch-tangem.pdf" - languageCode == "de" && regionCode == "ch" -> "Start2Coin-de-ch-tangem.pdf" - languageCode == "en" && regionCode == "ch" -> "Start2Coin-en-ch-tangem.pdf" - languageCode == "it" && regionCode == "ch" -> "Start2Coin-it-ch-tangem.pdf" - languageCode == "fr" && regionCode == "fr" -> "Start2Coin-fr-fr-atangem.pdf" - languageCode == "de" && regionCode == "at" -> "Start2Coin-de-at-tangem.pdf" - regionCode == "fr" -> "Start2Coin-fr-fr-atangem.pdf" - regionCode == "ch" -> "Start2Coin-en-ch-tangem.pdf" - regionCode == "at" -> "Start2Coin-de-at-tangem.pdf" - else -> "Start2Coin-fr-fr-atangem.pdf" - } - } - - private fun regionCode(cardId: String): String? = when (cardId[1]) { - '0' -> "fr" - '1' -> "ch" - '2' -> "at" - else -> null - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt index d08fd627f5..5447faf5b0 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt @@ -4,7 +4,6 @@ import com.tangem.blockchain.common.Wallet import com.tangem.domain.common.CardDTO import com.tangem.domain.common.ScanResponse import com.tangem.tap.common.entities.FiatCurrency -import com.tangem.tap.domain.termsOfUse.CardTou import org.rekotlin.Action sealed class DetailsAction : Action { @@ -12,10 +11,8 @@ sealed class DetailsAction : Action { data class PrepareScreen( val scanResponse: ScanResponse, val wallets: List, - val cardTou: CardTou, ) : DetailsAction() - object ShowDisclaimer : DetailsAction() object ReCreateTwinsWallet : DetailsAction() sealed class ResetToFactory : DetailsAction() { 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 fda0a60ea4..f6e2c4b7c4 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 @@ -61,12 +61,6 @@ class DetailsMiddleware { is DetailsAction.ResetToFactory -> eraseWalletMiddleware.handle(action) is DetailsAction.ManageSecurity -> manageSecurityMiddleware.handle(action) is DetailsAction.AppSettings -> managePrivacyMiddleware.handle(state, action) - is DetailsAction.ShowDisclaimer -> { - val uri = state.cardTermsOfUseUrl - if (uri != null) { - store.dispatch(NavigationAction.OpenDocument(uri)) - } - } is DetailsAction.ReCreateTwinsWallet -> { store.dispatch(TwinCardsAction.SetMode(CreateTwinWalletMode.RecreateWallet)) store.dispatch(NavigationAction.NavigateTo(AppScreen.OnboardingTwins)) diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt index 11b737097a..142d59fbf3 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt @@ -52,7 +52,6 @@ private fun handlePrepareScreen( return DetailsState( scanResponse = action.scanResponse, wallets = action.wallets, - cardTermsOfUseUrl = action.cardTou.getUrl(action.scanResponse.card), createBackupAllowed = action.scanResponse.card.backupStatus == CardDTO.BackupStatus.NoBackup, appCurrency = store.state.globalState.appCurrency, isBiometricsAvailable = tangemSdkManager.canUseBiometry, diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsState.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsState.kt index 3cb211b7c5..a22b810f7c 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsState.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsState.kt @@ -1,6 +1,5 @@ package com.tangem.tap.features.details.redux -import android.net.Uri import com.tangem.blockchain.common.Wallet import com.tangem.domain.common.CardDTO import com.tangem.domain.common.ScanResponse @@ -16,7 +15,6 @@ data class DetailsState( val scanResponse: ScanResponse? = null, val wallets: List = emptyList(), val cardSettingsState: CardSettingsState? = null, - val cardTermsOfUseUrl: Uri? = null, val privacyPolicyUrl: String? = null, val createBackupAllowed: Boolean = false, val appCurrency: FiatCurrency = FiatCurrency.Default, diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsScreenState.kt b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsScreenState.kt index e55525ae1d..ac69fe0ad8 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsScreenState.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsScreenState.kt @@ -29,7 +29,6 @@ enum class SettingsElement( AppSettings(R.drawable.ic_settings, R.string.app_settings_title), LinkMoreCards(R.drawable.ic_more_cards, R.string.details_row_title_create_backup), TermsOfService(R.drawable.ic_text, R.string.disclaimer_title), // General Terms of Service of the App - TermsOfUse(R.drawable.ic_text, R.string.details_row_title_card_tou), // Terms of Use for S2C cards only PrivacyPolicy(R.drawable.ic_lock_24, R.string.details_row_privacy_policy); } diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt index 42fbc5b252..6165dc5c39 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt @@ -38,7 +38,6 @@ class DetailsViewModel(private val store: Store) { } SettingsElement.AppSettings -> if (state.isBiometricsAvailable) it else null SettingsElement.AppCurrency -> if (state.scanResponse?.card?.isMultiwalletAllowed != true) it else null - SettingsElement.TermsOfUse -> if (state.scanResponse?.card?.isStart2Coin == true) it else null // SettingsElement.ReferralProgram -> if (state.scanResponse?.card?.isTangemWallet == true) it else null else -> it } @@ -88,10 +87,7 @@ class DetailsViewModel(private val store: Store) { store.dispatch(DetailsAction.CreateBackup) } SettingsElement.TermsOfService -> { - store.dispatch(DisclaimerAction.Show()) - } - SettingsElement.TermsOfUse -> { - store.dispatch(DetailsAction.ShowDisclaimer) + store.dispatch(DisclaimerAction.Show(AppScreen.Details)) } SettingsElement.PrivacyPolicy -> { // TODO: To be available later diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/Disclaimer.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/Disclaimer.kt new file mode 100644 index 0000000000..a3f28bfb73 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/Disclaimer.kt @@ -0,0 +1,80 @@ +package com.tangem.tap.features.disclaimer + +import android.net.Uri + +/** +[REDACTED_AUTHOR] + */ +interface Disclaimer { + fun type(): DisclaimerType + fun getUri(): Uri + fun accept() + fun isAccepted(): Boolean +} + +abstract class BaseDisclaimer( + protected val dataProvider: DisclaimerDataProvider, +) : Disclaimer { + + val baseUrl = "https://tangem.com" + + override fun accept() { + dataProvider.storage().accept(getPreferenceKey()) + } + + override fun isAccepted(): Boolean = dataProvider.storage().isAccepted(getPreferenceKey()) + + protected open fun getPreferenceKey(): String = type().name +} + +class DummyDisclaimer : Disclaimer { + override fun type(): DisclaimerType = DisclaimerType.Tangem + override fun getUri(): Uri = Uri.parse("https://tangem.com/tangem_tos.html") + override fun accept() {} + override fun isAccepted(): Boolean = false +} + +class TangemDisclaimer(dataProvider: DisclaimerDataProvider) : BaseDisclaimer(dataProvider) { + override fun type(): DisclaimerType = DisclaimerType.Tangem + override fun getUri(): Uri = Uri.parse("$baseUrl/tangem_tos.html") + override fun getPreferenceKey(): String = "tangem_tos_accepted" +} + +class SaltPayDisclaimer(dataProvider: DisclaimerDataProvider) : BaseDisclaimer(dataProvider) { + override fun type(): DisclaimerType = DisclaimerType.SaltPay + override fun getUri(): Uri = Uri.parse("$baseUrl/soltpay_tos.html") + override fun getPreferenceKey(): String = "saltPay_tos_accepted" +} + +class Start2CoinDisclaimer(dataProvider: DisclaimerDataProvider) : BaseDisclaimer(dataProvider) { + override fun type(): DisclaimerType = DisclaimerType.Start2Coin + override fun getUri(): Uri = Uri.parse("$baseUrl/" + filename(dataProvider.getLanguage(), getRegion())) + override fun getPreferenceKey(): String = "start2Coin_tos_accepted_${getRegion()}" + + private fun filename(languageCode: String, regionCode: String?): String { + return when { + languageCode == "fr" && regionCode == "ch" -> "Start2Coin-fr-ch-tangem.html" + languageCode == "de" && regionCode == "ch" -> "Start2Coin-de-ch-tangem.html" + languageCode == "en" && regionCode == "ch" -> "Start2Coin-en-ch-tangem.html" + languageCode == "it" && regionCode == "ch" -> "Start2Coin-it-ch-tangem.html" + languageCode == "fr" && regionCode == "fr" -> "Start2Coin-fr-fr-atangem.html" + languageCode == "de" && regionCode == "at" -> "Start2Coin-de-at-tangem.html" + regionCode == "fr" -> "Start2Coin-fr-fr-atangem.html" + regionCode == "ch" -> "Start2Coin-en-ch-tangem.html" + regionCode == "at" -> "Start2Coin-de-at-tangem.html" + else -> "Start2Coin-fr-fr-atangem.html" + } + } + + private fun getRegion(): String? { + val cardId = dataProvider.getCardId() + if (cardId.isEmpty()) return null + + return when (cardId[1]) { + '0' -> "fr" + '1' -> "ch" + '2' -> "at" + else -> null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/DisclaimerDataProvider.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/DisclaimerDataProvider.kt new file mode 100644 index 0000000000..0097f34142 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/DisclaimerDataProvider.kt @@ -0,0 +1,12 @@ +package com.tangem.tap.features.disclaimer + +import com.tangem.tap.persistence.DisclaimerPrefStorage + +/** +[REDACTED_AUTHOR] + */ +interface DisclaimerDataProvider { + fun getLanguage(): String + fun getCardId(): String + fun storage(): DisclaimerPrefStorage +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/DisclaimerType.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/DisclaimerType.kt new file mode 100644 index 0000000000..d6af0e0596 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/DisclaimerType.kt @@ -0,0 +1,44 @@ +package com.tangem.tap.features.disclaimer + +import com.tangem.domain.common.CardDTO +import com.tangem.domain.common.TapWorkarounds.isSaltPay +import com.tangem.domain.common.TapWorkarounds.isStart2Coin +import com.tangem.tap.persistence.DisclaimerPrefStorage +import com.tangem.tap.preferencesStorage +import java.util.* + +/** +[REDACTED_AUTHOR] + */ +enum class DisclaimerType { + Tangem, + SaltPay, + Start2Coin; + + companion object { + fun get(cardDTO: CardDTO): DisclaimerType { + return when { + cardDTO.isSaltPay -> SaltPay + cardDTO.isStart2Coin -> Start2Coin + else -> Tangem + } + } + } +} + +fun DisclaimerType.createDisclaimer(cardDTO: CardDTO): Disclaimer { + val dataProvider = provideDisclaimerDataProvider(cardDTO.cardId) + return when (this) { + DisclaimerType.Tangem -> TangemDisclaimer(dataProvider) + DisclaimerType.SaltPay -> SaltPayDisclaimer(dataProvider) + DisclaimerType.Start2Coin -> Start2CoinDisclaimer(dataProvider) + } +} + +private fun provideDisclaimerDataProvider(cardId: String): DisclaimerDataProvider { + return object : DisclaimerDataProvider { + override fun getLanguage(): String = Locale.getDefault().language + override fun getCardId(): String = cardId + override fun storage(): DisclaimerPrefStorage = preferencesStorage.disclaimerPrefStorage + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerAction.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerAction.kt index 395137228c..1a712e1c49 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerAction.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerAction.kt @@ -1,26 +1,21 @@ package com.tangem.tap.features.disclaimer.redux -import com.tangem.common.extensions.VoidCallback +import com.tangem.tap.common.redux.navigation.AppScreen +import com.tangem.tap.features.disclaimer.Disclaimer +import com.tangem.tap.features.wallet.redux.ProgressState import org.rekotlin.Action sealed class DisclaimerAction : Action { - data class SetDisclaimerType( - val type: DisclaimerType, - ) : DisclaimerAction() + data class SetDisclaimer(val disclaimer: Disclaimer) : DisclaimerAction() data class Show( + val fromScreen: AppScreen, val callback: DisclaimerCallback? = null, ) : DisclaimerAction() - data class AcceptDisclaimer(val type: DisclaimerType) : DisclaimerAction() - - internal data class UpdateState(val type: DisclaimerType, val accepted: Boolean) : DisclaimerAction() - + object AcceptDisclaimer : DisclaimerAction() object OnBackPressed : DisclaimerAction() -} -data class DisclaimerCallback( - val onAccept: VoidCallback? = null, - val onDismiss: VoidCallback? = null, -) \ No newline at end of file + data class OnProgressStateChanged(val state: ProgressState?) : DisclaimerAction() +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerMiddleware.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerMiddleware.kt index a604d3275f..ca71193f2a 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerMiddleware.kt @@ -3,7 +3,6 @@ package com.tangem.tap.features.disclaimer.redux import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction -import com.tangem.tap.preferencesStorage import com.tangem.tap.store import org.rekotlin.Action import org.rekotlin.Middleware @@ -23,16 +22,11 @@ private fun handleDisclaimerMiddleware(action: Action, appState: AppState) { val state = appState.disclaimerState when (action) { - is DisclaimerAction.SetDisclaimerType -> { - handleUpdateState = action.type.createUpdateState() - } is DisclaimerAction.Show -> { - handleUpdateState = state.type.createUpdateState() store.dispatch(NavigationAction.NavigateTo(AppScreen.Disclaimer)) } is DisclaimerAction.AcceptDisclaimer -> { - action.type.accept() - handleUpdateState = action.type.createUpdateState() + state.disclaimer.accept() store.dispatch(NavigationAction.PopBackTo()) state.callback?.onAccept?.invoke() } @@ -41,29 +35,4 @@ private fun handleDisclaimerMiddleware(action: Action, appState: AppState) { state.callback?.onDismiss?.invoke() } } -} - -private fun DisclaimerType.accept() = when (this) { - DisclaimerType.Tangem -> preferencesStorage.disclaimerPrefStorage.hasTangemTosAccepted = true - DisclaimerType.Start2Coin -> preferencesStorage.disclaimerPrefStorage.hasStart2CoinTosAccepted = true - DisclaimerType.SaltPay -> preferencesStorage.disclaimerPrefStorage.hasSaltPayTosAccepted = true -} - -fun DisclaimerType.isAccepted(): Boolean = when (this) { - DisclaimerType.Tangem -> preferencesStorage.disclaimerPrefStorage.hasTangemTosAccepted - DisclaimerType.Start2Coin -> preferencesStorage.disclaimerPrefStorage.hasStart2CoinTosAccepted - DisclaimerType.SaltPay -> preferencesStorage.disclaimerPrefStorage.hasSaltPayTosAccepted -} - -private fun DisclaimerType.createUpdateState(): DisclaimerAction.UpdateState { - return DisclaimerAction.UpdateState(this, this.isAccepted()) -} - -private var handleUpdateState: DisclaimerAction.UpdateState = DisclaimerAction.UpdateState( - type = DisclaimerType.Tangem, - accepted = false, -) - set(value) { - field = value - store.dispatch(value) - } \ No newline at end of file +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt index d44d02e993..456818fe70 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt @@ -15,15 +15,19 @@ private fun internalReduce(action: Action, state: AppState): DisclaimerState { val disclaimerState = state.disclaimerState return when (action) { - is DisclaimerAction.Show -> disclaimerState.copy( - callback = action.callback, + is DisclaimerAction.SetDisclaimer -> disclaimerState.copy( + disclaimer = action.disclaimer, ) - is DisclaimerAction.UpdateState -> disclaimerState.copy( - type = action.type, - accepted = action.accepted, + is DisclaimerAction.Show -> disclaimerState.copy( + showedFromScreen = action.fromScreen, + callback = action.callback, ) is DisclaimerAction.AcceptDisclaimer, is DisclaimerAction.OnBackPressed -> disclaimerState.copy( callback = null, + progressState = null, + ) + is DisclaimerAction.OnProgressStateChanged -> disclaimerState.copy( + progressState = action.state, ) else -> disclaimerState } diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt index d8dcbddd2a..99db90b3d8 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt @@ -1,32 +1,21 @@ package com.tangem.tap.features.disclaimer.redux -import android.net.Uri -import com.tangem.domain.common.CardDTO -import com.tangem.domain.common.ScanResponse -import com.tangem.domain.common.TapWorkarounds.isSaltPay -import com.tangem.domain.common.TapWorkarounds.isStart2Coin +import com.tangem.common.extensions.VoidCallback +import com.tangem.tap.common.redux.navigation.AppScreen +import com.tangem.tap.features.disclaimer.Disclaimer +import com.tangem.tap.features.disclaimer.DummyDisclaimer +import com.tangem.tap.features.wallet.redux.ProgressState import org.rekotlin.StateType data class DisclaimerState( - val accepted: Boolean = false, - val type: DisclaimerType = DisclaimerType.Tangem, + val disclaimer: Disclaimer = DummyDisclaimer(), + val showedFromScreen: AppScreen = AppScreen.Home, val callback: DisclaimerCallback? = null, -) : StateType + val progressState: ProgressState? = null, +) : StateType { +} -sealed class DisclaimerType( - val uri: Uri, -) { - object Tangem : DisclaimerType(Uri.parse("https://tangem.com/tangem_tos.html")) - object Start2Coin : DisclaimerType(Uri.parse("https://tangem.com/tangem_tos.html")) - object SaltPay : DisclaimerType(Uri.parse("https://tangem.com/soltpay_tos.html")) - - companion object { - fun get(scanResponse: ScanResponse): DisclaimerType = get(scanResponse.card) - - fun get(card: CardDTO): DisclaimerType = when { - card.isSaltPay -> SaltPay - card.isStart2Coin -> Start2Coin - else -> Tangem - } - } -} \ No newline at end of file +data class DisclaimerCallback( + val onAccept: VoidCallback? = null, + val onDismiss: VoidCallback? = null, +) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerFragment.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerFragment.kt index 7761de53b6..3c177a29e7 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerFragment.kt @@ -5,13 +5,17 @@ import android.view.View import androidx.transition.TransitionInflater import by.kirich1409.viewbindingdelegate.viewBinding import com.tangem.core.ui.fragments.setStatusBarColor -import com.tangem.tap.common.extensions.configureSettings +import com.tangem.tap.common.extensions.beginDelayedTransition import com.tangem.tap.common.extensions.hide +import com.tangem.tap.common.extensions.show import com.tangem.tap.common.redux.AppState +import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.features.BaseFragment import com.tangem.tap.features.addBackPressHandler +import com.tangem.tap.features.disclaimer.Disclaimer import com.tangem.tap.features.disclaimer.redux.DisclaimerAction import com.tangem.tap.features.disclaimer.redux.DisclaimerState +import com.tangem.tap.features.wallet.redux.ProgressState import com.tangem.tap.store import com.tangem.wallet.R import com.tangem.wallet.databinding.FragmentDisclaimerBinding @@ -20,17 +24,52 @@ import org.rekotlin.StoreSubscriber class DisclaimerFragment : BaseFragment(R.layout.fragment_disclaimer), StoreSubscriber { private val binding: FragmentDisclaimerBinding by viewBinding(FragmentDisclaimerBinding::bind) + private val webViewClient = DisclaimerWebViewClient() + + override fun configureTransitions() { + val inflater = TransitionInflater.from(requireContext()) + when (store.state.disclaimerState.showedFromScreen) { + AppScreen.Home -> { + enterTransition = inflater.inflateTransition(android.R.transition.slide_bottom) + exitTransition = inflater.inflateTransition(android.R.transition.slide_top) + } + AppScreen.Details -> { + enterTransition = inflater.inflateTransition(android.R.transition.fade) + exitTransition = inflater.inflateTransition(android.R.transition.fade) + } + } + } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) addBackPressHandler(handler = this) - binding.toolbar.setNavigationOnClickListener { handleOnBackPressed() } - binding.webView.configureSettings() + + binding.apply { + toolbar.setNavigationOnClickListener { handleOnBackPressed() } + webView.apply { + settings.allowFileAccess = false + settings.javaScriptEnabled = false + webViewClient = this@DisclaimerFragment.webViewClient + } + webView.hide() + groupError.hide() + groupAccept.hide() + groupLoading.hide() + + btnAccept.setOnClickListener { + store.dispatch(DisclaimerAction.AcceptDisclaimer) + } + btnRepeat.setOnClickListener { + webViewClient.reset() + } + } } override fun onStart() { super.onStart() setStatusBarColor(R.color.backgroundLightGray) + + webViewClient.onProgressStateChanged = { store.dispatch(DisclaimerAction.OnProgressStateChanged(it)) } store.subscribe(subscriber = this) { state -> state .skipRepeats { oldState, newState -> oldState.disclaimerState == newState.disclaimerState } @@ -39,30 +78,43 @@ class DisclaimerFragment : BaseFragment(R.layout.fragment_disclaimer), StoreSubs } override fun onStop() { - super.onStop() + webViewClient.onProgressStateChanged = null store.unsubscribe(this) - } - - override fun configureTransitions() { - super.configureTransitions() - val inflater = TransitionInflater.from(requireContext()) - enterTransition = inflater.inflateTransition(android.R.transition.fade) - exitTransition = inflater.inflateTransition(android.R.transition.fade) + super.onStop() } override fun newState(state: DisclaimerState) = with(binding) { if (activity == null || view == null) return - if (state.accepted) { - halfTransparentOverlay.hide() - btnAccept.hide() - } + updateUiVisibility(state.disclaimer, state.progressState) + binding.webView.loadUrl(state.disclaimer.getUri().toString()) + } - btnAccept.setOnClickListener { - store.dispatch(DisclaimerAction.AcceptDisclaimer(state.type)) + private fun updateUiVisibility(disclaimer: Disclaimer, progressState: ProgressState?) = with(binding) { + when (progressState) { + ProgressState.Loading -> { + root.beginDelayedTransition() + webView.hide() + groupError.hide() + groupAccept.hide() + groupLoading.show() + } + ProgressState.Done -> { + root.beginDelayedTransition() + groupError.hide() + groupLoading.hide() + webView.show() + groupAccept.show(!disclaimer.isAccepted()) + } + ProgressState.Error -> { + root.beginDelayedTransition() + webView.hide() + groupAccept.hide() + groupLoading.hide() + groupError.show() + } + else -> {} } - - webView.loadUrl(state.type.uri.toString()) } override fun handleOnBackPressed() { diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerWebViewClient.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerWebViewClient.kt new file mode 100644 index 0000000000..c1a024fc0c --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerWebViewClient.kt @@ -0,0 +1,68 @@ +package com.tangem.tap.features.disclaimer.ui + +import android.graphics.Bitmap +import android.webkit.WebResourceError +import android.webkit.WebResourceRequest +import android.webkit.WebResourceResponse +import android.webkit.WebView +import android.webkit.WebViewClient +import com.tangem.common.extensions.ifNotNull +import com.tangem.tap.features.wallet.redux.ProgressState + +class DisclaimerWebViewClient : WebViewClient() { + + var onProgressStateChanged: ((ProgressState) -> Unit)? = null + + private var loadingUrl: String? = null + private var loadedUrl: String? = null + + private var progressState: ProgressState = ProgressState.Loading + set(value) { + field = value + onProgressStateChanged?.invoke(value) + } + + fun reset() { + loadingUrl = null + loadedUrl = null + progressState = ProgressState.Loading + } + + override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { + super.onPageStarted(view, url, favicon) + + if (loadingUrl != url) progressState = ProgressState.Loading + loadingUrl = url + } + + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + + if (loadedUrl != url) progressState = ProgressState.Done + loadedUrl = url + } + + override fun onReceivedError( + view: WebView?, + resourceRequest: WebResourceRequest?, + error: WebResourceError?, + ) { + super.onReceivedError(view, resourceRequest, error) + error?.let { progressState = ProgressState.Error } + } + + override fun onReceivedHttpError( + view: WebView?, + resourceRequest: WebResourceRequest?, + errorResponse: WebResourceResponse?, + ) { + super.onReceivedHttpError(view, resourceRequest, errorResponse) + + ifNotNull(resourceRequest, errorResponse) { request, response -> + if (request.url?.toString() != loadingUrl || response.statusCode < 400) return + if (progressState != ProgressState.Done) return + + progressState = ProgressState.Error + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt index 860939d53c..7c622df177 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt @@ -34,7 +34,6 @@ import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.domain.configurable.warningMessage.WarningMessage import com.tangem.tap.domain.statePrinter.printScanResponseState import com.tangem.tap.domain.statePrinter.printWalletState -import com.tangem.tap.domain.termsOfUse.CardTou import com.tangem.tap.features.details.redux.DetailsAction import com.tangem.tap.features.wallet.redux.ErrorType import com.tangem.tap.features.wallet.redux.ProgressState @@ -245,7 +244,6 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber - - + + + + +