From 6e7693bc49c4ec24ab8feb436abe516d755dd817 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 29 Oct 2022 21:12:08 +0400 Subject: [PATCH 1/7] Updated on 2026-08-14 --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index a7b0e1623d..d76197931d 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-130', + tangem_blockchain_sdk: 'develop-131', // tangem_blockchain_sdk: '0.0.1', ] From 9953ed362c49e9af8fe73e1d89c9284d529ad5bd Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 8 Nov 2022 14:35:19 +0400 Subject: [PATCH 2/7] Updated on 2026-08-14 --- .../main/java/com/tangem/tap/common/DialogManager.kt | 2 +- .../products/note/redux/OnboardingNoteMiddleware.kt | 7 +++++++ .../tangem/tap/features/wallet/redux/WalletAction.kt | 2 +- .../redux/middlewares/TradeCryptoMiddleware.kt | 2 +- .../redux/middlewares/WalletDialogsMiddleware.kt | 2 +- .../tap/features/wallet/redux/models/WalletDialog.kt | 2 +- .../RussianCardholdersWarningBottomSheetDialog.kt | 12 ++++++++++-- 7 files changed, 22 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/DialogManager.kt b/app/src/main/java/com/tangem/tap/common/DialogManager.kt index 5ae8d9ce04..a1739329b5 100644 --- a/app/src/main/java/com/tangem/tap/common/DialogManager.kt +++ b/app/src/main/java/com/tangem/tap/common/DialogManager.kt @@ -153,7 +153,7 @@ class DialogManager : StoreSubscriber { primaryButtonAction = state.dialog.onOk, ) is WalletDialog.RussianCardholdersWarningDialog -> - RussianCardholdersWarningBottomSheetDialog(context) + RussianCardholdersWarningBottomSheetDialog(context, state.dialog.topUpUrl) else -> null } dialog?.show() 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 d990941bd5..abe0536c76 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 @@ -6,6 +6,7 @@ import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.extensions.dispatchErrorNotification +import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.dispatchOpenUrl import com.tangem.tap.common.extensions.getAddressData import com.tangem.tap.common.extensions.getToUpUrl @@ -20,8 +21,10 @@ import com.tangem.tap.domain.TapError import com.tangem.tap.domain.extensions.hasWallets import com.tangem.tap.domain.extensions.makePrimaryWalletManager import com.tangem.tap.features.demo.DemoHelper +import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.features.wallet.models.Currency import com.tangem.tap.features.wallet.redux.ProgressState +import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.scope import com.tangem.tap.store import com.tangem.tap.tangemSdkManager @@ -152,6 +155,10 @@ private fun handleNoteAction(appState: () -> AppState?, action: Action, dispatch } is OnboardingNoteAction.TopUp -> { val topUpUrl = noteState.walletManager?.getToUpUrl() ?: return + if (globalState.userCountryCode == RUSSIA_COUNTRY_CODE) { + store.dispatchOnMain(WalletAction.DialogAction.RussianCardholdersWarningDialog(topUpUrl)) + return + } store.dispatchOpenUrl(topUpUrl) } OnboardingNoteAction.Done -> { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt index 8843a8eb40..b9451b117a 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt @@ -154,7 +154,7 @@ sealed class WalletAction : Action { object SignedHashesMultiWalletDialog : DialogAction() object ChooseTradeActionDialog : DialogAction() data class ChooseCurrency(val amounts: List?) : DialogAction() - object RussianCardholdersWarningDialog : DialogAction() + data class RussianCardholdersWarningDialog(val topUpUrl: String? = null) : DialogAction() object Hide : DialogAction() } 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 319c940a52..f5040c42f4 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 @@ -37,7 +37,7 @@ class TradeCryptoMiddleware { action: WalletAction.TradeCryptoAction.Buy, ) { if (action.checkUserLocation && state()?.globalState?.userCountryCode == RUSSIA_COUNTRY_CODE) { - store.dispatchOnMain(WalletAction.DialogAction.RussianCardholdersWarningDialog) + store.dispatchOnMain(WalletAction.DialogAction.RussianCardholdersWarningDialog()) return } 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 d53809be9c..5191319318 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 @@ -32,7 +32,7 @@ class WalletDialogsMiddleware { ) } is WalletAction.DialogAction.RussianCardholdersWarningDialog -> { - store.dispatchDialogShow(WalletDialog.RussianCardholdersWarningDialog) + store.dispatchDialogShow(WalletDialog.RussianCardholdersWarningDialog(action.topUpUrl)) } is WalletAction.DialogAction.Hide -> { store.dispatchDialogHide() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/models/WalletDialog.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/models/WalletDialog.kt index 68718acd45..b4188f8dd8 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/models/WalletDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/models/WalletDialog.kt @@ -31,5 +31,5 @@ sealed interface WalletDialog : StateDialog { val titleRes: Int = R.string.token_details_unable_hide_alert_title } - object RussianCardholdersWarningDialog : WalletDialog + data class RussianCardholdersWarningDialog(val topUpUrl: String?) : WalletDialog } \ No newline at end of file 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 a41dce9228..b634f76c68 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 @@ -5,12 +5,16 @@ import android.os.Bundle import android.view.LayoutInflater import com.google.android.material.bottomsheet.BottomSheetDialog import com.tangem.tap.common.extensions.dispatchDialogHide +import com.tangem.tap.common.extensions.dispatchOpenUrl import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.store import com.tangem.wallet.databinding.DialogRussiansCardholdersWarningBinding -class RussianCardholdersWarningBottomSheetDialog(context: Context) : BottomSheetDialog(context) { +class RussianCardholdersWarningBottomSheetDialog( + context: Context, private val topUpUrl: String?, +) : BottomSheetDialog + (context) { private var binding: DialogRussiansCardholdersWarningBinding? = null @@ -29,7 +33,11 @@ class RussianCardholdersWarningBottomSheetDialog(context: Context) : BottomSheet } binding?.btnYes?.setOnClickListener { - store.dispatch(WalletAction.TradeCryptoAction.Buy(checkUserLocation = false)) + if (topUpUrl != null) { + store.dispatchOpenUrl(topUpUrl) + } else { + store.dispatch(WalletAction.TradeCryptoAction.Buy(checkUserLocation = false)) + } dismiss() } binding?.btnNo?.setOnClickListener { From 74101247529fd1b0e96e51340ccfe19ec8d2962b Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 8 Nov 2022 14:36:02 +0400 Subject: [PATCH 3/7] Updated on 2026-08-14 --- .../tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt index 9f2f76e6fd..79e84eec36 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt @@ -88,7 +88,7 @@ class OnWalletLoadedReducer { val tokenFiatAmountFormatted = tokenFiatAmount?.toFormattedFiatValue(fiatCurrency.symbol) ?: UNKNOWN_AMOUNT_SIGN - val isTokenSendButtonEnabled = newWalletData.shouldEnableTokenSendButton() + val isTokenSendButtonEnabled = tokenWalletData?.shouldEnableTokenSendButton() == true && pendingTransactions.isEmpty() tokenWalletData?.copy( currencyData = tokenWalletData.currencyData.copy( From 8b4a8b48c301912c0dd38da61cc944873f7c8a7d Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 8 Nov 2022 14:38:05 +0400 Subject: [PATCH 4/7] Updated on 2026-08-14 --- .../walletconnect/WalletConnectManager.kt | 53 ++++++++++--------- .../walletconnect/WalletConnectSdkHelper.kt | 36 ++++++------- 2 files changed, 46 insertions(+), 43 deletions(-) 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 6bd6cddada..f95b187f09 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 @@ -44,6 +44,8 @@ import kotlin.collections.set class WalletConnectManager { + private var cardId: String? = null + private val okHttpClient: OkHttpClient by lazy { OkHttpClient.Builder() .connectTimeout(20, TimeUnit.SECONDS) @@ -138,6 +140,7 @@ class WalletConnectManager { fun restoreSessions(scanResponse: ScanResponse) { val walletPublicKey = scanResponse.card.wallets.firstOrNull { it.curve == EllipticCurve.Secp256k1 }?.publicKey ?: return + if (scanResponse.card.backupStatus?.isActive != true) cardId = scanResponse.card.cardId val sessions = walletConnectRepository.loadSavedSessions() // filter sessions for this particular card .filter { it.wallet.walletPublicKey.contentEquals(walletPublicKey) } @@ -223,10 +226,10 @@ class WalletConnectManager { } private fun onSessionClosed(session: WCSession) { - store.state.globalState.analyticsHandler?.logWcEvent( + store.state.globalState.analyticsHandler.logWcEvent( AnalyticsAnOld.WcAnalyticsEvent.Session( - AnalyticsAnOld.WcSessionEvent.Disconnect, sessions[session]?.peerMeta?.url - ) + AnalyticsAnOld.WcSessionEvent.Disconnect, sessions[session]?.peerMeta?.url, + ), ) sessions.remove(session) walletConnectRepository.removeSession(session) @@ -272,13 +275,13 @@ class WalletConnectManager { val activeData = sessions[session] val data = activeData?.transactionData ?: return scope.launch { - val hash = WalletConnectSdkHelper().completeTransaction(data).guard { + val hash = WalletConnectSdkHelper().completeTransaction(data, cardId).guard { sessions[data.session.session] = activeData.copy(transactionData = null) store.dispatchOnMain( WalletConnectAction.RejectRequest( data.session.session, - data.id - ) + data.id, + ), ) return@launch } @@ -292,12 +295,12 @@ class WalletConnectManager { ) { val activeData = sessions[sessionData] ?: return scope.launch { - val hash = WalletConnectSdkHelper().signBnbTransaction(data, activeData).guard { + val hash = WalletConnectSdkHelper().signBnbTransaction(data, activeData, cardId).guard { store.dispatchOnMain( WalletConnectAction.RejectRequest( sessionData, - id - ) + id, + ), ) return@launch } @@ -330,14 +333,14 @@ class WalletConnectManager { val activeData = sessions[session] val data = activeData?.personalSignData ?: return scope.launch { - val hash = WalletConnectSdkHelper().signPersonalMessage(data.hash, activeData.wallet) + val hash = WalletConnectSdkHelper().signPersonalMessage(data.hash, activeData.wallet, cardId) .guard { sessions[data.session.session] = activeData.copy(transactionData = null) store.dispatchOnMain( WalletConnectAction.RejectRequest( data.session.session, - data.id - ) + data.id, + ), ) return@launch } @@ -372,7 +375,7 @@ class WalletConnectManager { ), ) } - store.state.globalState.analyticsHandler?.logWcEvent( + store.state.globalState.analyticsHandler.logWcEvent( AnalyticsAnOld.WcAnalyticsEvent.Session( AnalyticsAnOld.WcSessionEvent.Connect, peer.url, ), @@ -387,10 +390,10 @@ class WalletConnectManager { } client.onEthSendTransaction = { id: Long, transaction: WCEthereumTransaction -> Timber.d("onEthSendTransaction: $transaction") - store.state.globalState.analyticsHandler?.logWcEvent( + store.state.globalState.analyticsHandler.logWcEvent( AnalyticsAnOld.WcAnalyticsEvent.Action( - AnalyticsAnOld.WcAction.SendTransaction - ) + AnalyticsAnOld.WcAction.SendTransaction, + ), ) sessions[client.session]?.toWalletConnectSession()?.let { sessionData -> store.dispatchOnMain( @@ -405,10 +408,10 @@ class WalletConnectManager { } client.onEthSignTransaction = { id: Long, transaction: WCEthereumTransaction -> Timber.d("onEthSignTransaction: $transaction") - store.state.globalState.analyticsHandler?.logWcEvent( + store.state.globalState.analyticsHandler.logWcEvent( AnalyticsAnOld.WcAnalyticsEvent.Action( - AnalyticsAnOld.WcAction.SignTransaction - ) + AnalyticsAnOld.WcAction.SignTransaction, + ), ) sessions[client.session]?.toWalletConnectSession()?.let { sessionData -> store.dispatchOnMain( @@ -423,10 +426,10 @@ class WalletConnectManager { } client.onEthSign = { id: Long, message: WCEthereumSignMessage -> Timber.d("onEthSign: $message") - store.state.globalState.analyticsHandler?.logWcEvent( + store.state.globalState.analyticsHandler.logWcEvent( AnalyticsAnOld.WcAnalyticsEvent.Action( - AnalyticsAnOld.WcAction.PersonalSign - ) + AnalyticsAnOld.WcAction.PersonalSign, + ), ) sessions[client.session]?.toWalletConnectSession()?.let { sessionData -> store.dispatchOnMain( @@ -499,10 +502,10 @@ class WalletConnectManager { val message = EthSignHelper.tryToParseEthTypedMessage(request) if (message != null) { Timber.d("onEthSign_v4: $message") - store.state.globalState.analyticsHandler?.logWcEvent( + store.state.globalState.analyticsHandler.logWcEvent( AnalyticsAnOld.WcAnalyticsEvent.Action( - AnalyticsAnOld.WcAction.PersonalSign - ) + AnalyticsAnOld.WcAction.PersonalSign, + ), ) sessions[client.session]?.toWalletConnectSession()?.let { sessionData -> store.dispatchOnMain( 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 f90eb7cbb9..eccfbaefdf 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 @@ -126,24 +126,24 @@ class WalletConnectSdkHelper { ) } - suspend fun completeTransaction(data: WcTransactionData): String? { + suspend fun completeTransaction(data: WcTransactionData, cardId: String?): String? { return when (data.type) { - WcTransactionType.EthSendTransaction -> sendTransaction(data) - WcTransactionType.EthSignTransaction -> signTransaction(data) + WcTransactionType.EthSendTransaction -> sendTransaction(data, cardId) + WcTransactionType.EthSignTransaction -> signTransaction(data, cardId) } } - private suspend fun sendTransaction(data: WcTransactionData): String? { + private suspend fun sendTransaction(data: WcTransactionData, cardId: String?): String? { val result = (data.walletManager as TransactionSender).send( transactionData = data.transaction, - signer = CommonSigner(tangemSdk) + signer = CommonSigner(tangemSdk, cardId), ) return when (result) { SimpleResult.Success -> { HEX_PREFIX + data.walletManager.wallet.recentTransactions.last().hash } is SimpleResult.Failure -> { - store.state.globalState.analyticsHandler?.handleBlockchainSdkErrorEvent( + store.state.globalState.analyticsHandler.handleBlockchainSdkErrorEvent( result.error, AnalyticsAnOld.ActionToLog.WalletConnectTransaction, ) @@ -153,27 +153,27 @@ class WalletConnectSdkHelper { } } - private suspend fun signTransaction(data: WcTransactionData): String? { + private suspend fun signTransaction(data: WcTransactionData, cardId: String?): String? { val dataToSign = EthereumUtils.buildTransactionToSign( transactionData = data.transaction, nonce = null, blockchain = data.walletManager.wallet.blockchain, - gasLimit = null + gasLimit = null, ) ?: return null val command = SignHashCommand( hash = dataToSign.hash, walletPublicKey = data.walletManager.wallet.publicKey.seedKey, - derivationPath = data.walletManager.wallet.publicKey.derivationPath + derivationPath = data.walletManager.wallet.publicKey.derivationPath, ) - val result = tangemSdkManager.runTaskAsync(command, initialMessage = Message()) + val result = tangemSdkManager.runTaskAsync(command, initialMessage = Message(), cardId = cardId) return when (result) { is CompletionResult.Success -> { HEX_PREFIX + result.data } is CompletionResult.Failure -> { (result.error as? TangemSdkError)?.let { error -> - store.state.globalState.analyticsHandler?.handleCardSdkErrorEvent( + store.state.globalState.analyticsHandler.handleCardSdkErrorEvent( error, AnalyticsAnOld.ActionToLog.WalletConnectSign, ) @@ -184,13 +184,13 @@ class WalletConnectSdkHelper { } } - suspend fun signBnbTransaction(data: ByteArray, session: WalletConnectActiveData): String? { + suspend fun signBnbTransaction(data: ByteArray, session: WalletConnectActiveData, cardId: String?): String? { val command = SignHashCommand( hash = data, walletPublicKey = session.wallet.walletPublicKey ?: return null, - derivationPath = session.wallet.derivationPath + derivationPath = session.wallet.derivationPath, ) - val result = tangemSdkManager.runTaskAsync(command, initialMessage = Message()) + val result = tangemSdkManager.runTaskAsync(command, initialMessage = Message(), cardId = cardId) return when (result) { is CompletionResult.Success -> { val key = session.wallet.derivedPublicKey?.toDecompressedPublicKey() @@ -202,7 +202,7 @@ class WalletConnectSdkHelper { } is CompletionResult.Failure -> { (result.error as? TangemSdkError)?.let { error -> - store.state.globalState.analyticsHandler?.handleCardSdkErrorEvent( + store.state.globalState.analyticsHandler.handleCardSdkErrorEvent( error, AnalyticsAnOld.ActionToLog.WalletConnectTransaction, ) @@ -266,10 +266,10 @@ class WalletConnectSdkHelper { }.joinToString("") } - suspend fun signPersonalMessage(hashToSign: ByteArray, wallet: WalletForSession): String? { + suspend fun signPersonalMessage(hashToSign: ByteArray, wallet: WalletForSession, cardId: String?): String? { val key = wallet.derivedPublicKey ?: wallet.walletPublicKey val command = SignHashCommand(hashToSign, wallet.walletPublicKey!!, wallet.derivationPath) - return when (val result = tangemSdkManager.runTaskAsync(command)) { + return when (val result = tangemSdkManager.runTaskAsync(command, cardId)) { is CompletionResult.Success -> { val hash = result.data.signature return EthereumUtils.prepareSignedMessageData( @@ -278,7 +278,7 @@ class WalletConnectSdkHelper { } is CompletionResult.Failure -> { (result.error as? TangemSdkError)?.let { error -> - store.state.globalState.analyticsHandler?.handleCardSdkErrorEvent( + store.state.globalState.analyticsHandler.handleCardSdkErrorEvent( error, AnalyticsAnOld.ActionToLog.WalletConnectSign, ) From 47aef5b1ceb81d4fa46999e290b52cbe1492b875 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 8 Nov 2022 17:49:16 +0400 Subject: [PATCH 5/7] Updated on 2026-08-14 --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 30e111bd27..ba7e3c39b6 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-132', + tangem_blockchain_sdk: 'develop-133', // tangem_blockchain_sdk: '0.0.1', ] From 14a2156262096ec5160cbadad25df1161ec373ae Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 9 Nov 2022 22:17:30 +0500 Subject: [PATCH 6/7] Updated on 2026-08-14 --- app/src/main/assets/tangem-app-config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index cf6ea50867..a1658496e7 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit cf6ea50867477f97655da9da47ff94987e8f3354 +Subproject commit a1658496e777b611fc990ef2bc1a1a1fd48bc1e6 From a6e04a43443f402f4aafea96ee9824164be28665 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 11 Nov 2022 13:54:04 +0300 Subject: [PATCH 7/7] Updated on 2026-08-14 --- .gitignore | 1 + app/build.gradle | 187 ------------------ app/build.gradle.kts | 182 +++++++++++++++++ app/proguard-rules.pro | 2 +- build.gradle | 31 --- build.gradle.kts | 30 +++ buildSrc/build.gradle.kts | 7 + buildSrc/src/main/java/AppConfig.kt | 8 + buildSrc/src/main/java/ClasspathDependency.kt | 9 + buildSrc/src/main/java/ConfigFieldBuilder.kt | 26 +++ buildSrc/src/main/java/Dependency.kt | 77 ++++++++ buildSrc/src/main/java/Versions.kt | 68 +++++++ common/{build.gradle => build.gradle.kts} | 4 +- dependencies.gradle | 14 -- domain/build.gradle | 88 --------- domain/build.gradle.kts | 98 +++++++++ domain/proguard-rules.pro | 2 +- network/build.gradle | 31 --- network/build.gradle.kts | 26 +++ settings.gradle | 4 - settings.gradle.kts | 4 + 21 files changed, 540 insertions(+), 359 deletions(-) delete mode 100644 app/build.gradle create mode 100644 app/build.gradle.kts delete mode 100644 build.gradle create mode 100644 build.gradle.kts create mode 100644 buildSrc/build.gradle.kts create mode 100644 buildSrc/src/main/java/AppConfig.kt create mode 100644 buildSrc/src/main/java/ClasspathDependency.kt create mode 100644 buildSrc/src/main/java/ConfigFieldBuilder.kt create mode 100644 buildSrc/src/main/java/Dependency.kt create mode 100644 buildSrc/src/main/java/Versions.kt rename common/{build.gradle => build.gradle.kts} (67%) delete mode 100644 dependencies.gradle delete mode 100644 domain/build.gradle create mode 100644 domain/build.gradle.kts delete mode 100644 network/build.gradle create mode 100644 network/build.gradle.kts delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore index dd64e70b22..dd33a7dab3 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,4 @@ local.properties **/fastlane/Preview.html **/fastlane/screenshots **/fastlane/test_output +/buildSrc/build/ diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 70b6edcebd..0000000000 --- a/app/build.gradle +++ /dev/null @@ -1,187 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-kapt' -apply plugin: 'com.google.gms.google-services' -apply plugin: 'com.google.firebase.crashlytics' -apply from: '../dependencies.gradle' - -android { - compileSdkVersion 33 - defaultConfig { - applicationId "com.tangem.wallet" - versionCode project.hasProperty('versionCode') ? project.property('versionCode') as int : 1 - versionName project.hasProperty('versionName') ? project.property('versionName') : "1.0.0.-SNAPSHOT" - minSdkVersion 21 - targetSdkVersion 33 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - - buildConfigField 'Boolean', environmentConfig.testActionEnabled, 'false' - buildConfigField 'Boolean', environmentConfig.logEnabled, 'false' - } - buildFeatures { - compose true - viewBinding true - } - buildTypes { - release { - debuggable false - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - signingConfig signingConfigs.debug - buildConfigField 'String', environmentConfig.environment, '\"prod\"' - buildConfigField 'Boolean', environmentConfig.testActionEnabled, 'false' - buildConfigField 'Boolean', environmentConfig.logEnabled, 'false' - } - debug { - debuggable true - minifyEnabled false - applicationIdSuffix ".dev" - signingConfig signingConfigs.debug - firebaseCrashlytics { - mappingFileUploadEnabled false - } - buildConfigField 'String', environmentConfig.environment, '\"dev\"' - buildConfigField 'Boolean', environmentConfig.testActionEnabled, 'true' - buildConfigField 'Boolean', environmentConfig.logEnabled, 'true' - } - debug_beta { - initWith release - debuggable false - versionNameSuffix "-beta" - applicationIdSuffix ".debug" - buildConfigField 'String', environmentConfig.environment, '\"prod\"' - buildConfigField 'Boolean', environmentConfig.testActionEnabled, 'false' - buildConfigField 'Boolean', environmentConfig.logEnabled, 'false' - } - - } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8.toString() - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - coreLibraryDesugaringEnabled false - } - composeOptions { - kotlinCompilerExtensionVersion '1.1.0' - } - packagingOptions { - exclude 'lib/x86_64/darwin/libscrypt.dylib' - exclude 'lib/x86_64/freebsd/libscrypt.so' - exclude 'lib/x86_64/linux/libscrypt.so' - } -} - -repositories { - maven { url "https://jitpack.io" } -} - -dependencies { - implementation fileTree(include: ['*.aar'], dir: 'libs') - implementation implementation(project(path: ':domain')) - implementation implementation(project(path: ':network')) - implementation implementation(project(path: ':common')) - - implementation 'androidx.core:core-ktx:1.9.0' - implementation 'androidx.appcompat:appcompat:1.5.1' - implementation 'androidx.fragment:fragment-ktx:1.5.3' - implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'com.google.android.material:material:1.6.1' - implementation 'com.google.android.play:core:1.10.3' - implementation 'com.google.android.play:core-ktx:1.8.1' - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' - - implementation "com.tangem:blockchain:${versions.tangem_blockchain_sdk}" - implementation "com.tangem.tangem-sdk-kotlin:core:${versions.tangem_card_sdk}" - implementation "com.tangem.tangem-sdk-kotlin:android:${versions.tangem_card_sdk}" - - // WebView - implementation "androidx.browser:browser:1.4.0" - - implementation 'com.jakewharton.timber:timber:4.7.1' - - //lifecycle - implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.1" - implementation "androidx.lifecycle:lifecycle-common-java8:2.5.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" - - implementation "org.rekotlin:rekotlin:1.0.4" - - // QR - implementation 'com.google.zxing:core:3.3.3' - implementation 'me.dm7.barcodescanner:zxing:1.9.8' - - // Camera - implementation 'com.otaliastudios:cameraview:2.6.3' - - // Image Loading - implementation 'io.coil-kt:coil:2.1.0' - implementation 'io.coil-kt:coil-compose:2.1.0' - - // Firebase - implementation platform('com.google.firebase:firebase-bom:26.0.0') - implementation 'com.google.firebase:firebase-analytics-ktx' - implementation 'com.google.firebase:firebase-crashlytics-ktx' - - // Analytics - implementation 'com.appsflyer:af-android-sdk:6.5.1' - implementation 'com.amplitude:android-sdk:2.36.1' - - // WalletConnect - implementation 'com.github.salomonbrys.kotson:kotson:2.5.0' - - // Network and Json - //TODO: refactoring: remove it when all network services moved to the network module - implementation 'com.squareup.retrofit2:retrofit:2.8.1' - implementation 'com.squareup.retrofit2:converter-moshi:2.6.0' - implementation 'com.squareup.moshi:moshi:1.12.0' - implementation "com.squareup.moshi:moshi-kotlin:1.12.0" - - implementation(platform("com.squareup.okhttp3:okhttp-bom:4.9.3")) - implementation("com.squareup.okhttp3:okhttp") - implementation("com.squareup.okhttp3:logging-interceptor") - - // Support - implementation("com.zendesk:chat:3.3.5") - implementation("com.zendesk:messaging:5.2.4") - - //Crypto - implementation "com.madgag.spongycastle:core:1.58.0.0" - - // animation - implementation "com.airbnb.android:lottie:3.4.0" - - // Shopify - implementation('com.shopify.mobilebuysdk:buy3:12.0.0') { - exclude group: "com.shopify.graphql.support" - exclude module: 'joda-time' - } - - // Google Pay - implementation 'com.google.android.gms:play-services-wallet:19.1.0' - - //Compose - implementation 'androidx.activity:activity-compose:1.5.0' - implementation 'androidx.compose.material:material:1.1.1' - implementation 'androidx.compose.animation:animation:1.1.1' - implementation 'androidx.compose.foundation:foundation:1.2.0-rc03' - implementation 'androidx.compose.ui:ui:1.1.1' - implementation 'androidx.compose.ui:ui-tooling:1.1.1' - implementation "com.google.accompanist:accompanist-appcompat-theme:0.23.0" - implementation "com.google.accompanist:accompanist-systemuicontroller:0.23.0" - - implementation "com.github.skydoves:androidveil:1.1.2" - - implementation 'com.github.kirich1409:viewbindingpropertydelegate-noreflection:1.5.6' - - // Shared preferences (encrypted) - implementation 'at.favre.lib:armadillo:0.9.0' - - testImplementation 'junit:junit:4.13.2' - testImplementation "com.google.truth:truth:1.1.3" - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' - -} diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000000..218986fc34 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,182 @@ +plugins { + id("com.android.application") + kotlin("android") + kotlin("kapt") + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") +} + +android { + compileSdk = AppConfig.compileSdkVersion + + defaultConfig { + applicationId = AppConfig.packageName + minSdk = AppConfig.minSdkVersion + targetSdk = AppConfig.targetSdkVersion + + versionCode = if (project.hasProperty("versionCode")) { + project.property("versionCode") as Int + } else { + AppConfig.versionCode + } + + versionName = if (project.hasProperty("versionName")) { + project.property("versionName") as String + } else { + AppConfig.versionName + } + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildFeatures { + compose = true + viewBinding = true + } + + buildTypes { + release { + isDebuggable = false + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + + BuildConfigFieldFactory( + fields = listOf( + Field.Environment("prod"), + Field.TestActionEnabled(false), + Field.LogEnabled(false), + ), + builder = ::buildConfigField, + ).create() + } + + debug { + isDebuggable = true + isMinifyEnabled = false + applicationIdSuffix = ".dev" + + configure { + // disable mapping file uploads (default=true if minifying) + mappingFileUploadEnabled = false + } + + BuildConfigFieldFactory( + fields = listOf( + Field.Environment("dev"), + Field.TestActionEnabled(true), + Field.LogEnabled(true), + ), + builder = ::buildConfigField, + ).create() + } + + create("debug_beta") { + initWith(getByName("release")) + versionNameSuffix = "-beta" + applicationIdSuffix = ".debug" + } + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + isCoreLibraryDesugaringEnabled = false + } + + composeOptions { + kotlinCompilerExtensionVersion = Versions.compose + } + + packagingOptions { + resources.excludes += "lib/x86_64/darwin/libscrypt.dylib" + resources.excludes += "lib/x86_64/freebsd/libscrypt.so" + resources.excludes += "lib/x86_64/linux/libscrypt.so" + } +} + +repositories { + maven(url = "https://jitpack.io") +} + +dependencies { + implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar")))) + implementation(project(":domain")) + implementation(project(":network")) + implementation(project(":common")) + + /** AndroidX libraries */ + implementation(AndroidX.coreKtx) + implementation(AndroidX.appCompat) + implementation(AndroidX.fragmentKtx) + implementation(AndroidX.constraintLayout) + implementation(AndroidX.browser) + implementation(AndroidX.lifecycleRuntimeKtx) + implementation(AndroidX.lifecycleCommonJava8) + implementation(AndroidX.lifecycleViewModelKtx) + implementation(AndroidX.lifecycleLiveDataKtx) + implementation(AndroidX.activityCompose) + + /** Compose libraries */ + implementation(Compose.material) + implementation(Compose.animation) + implementation(Compose.foundation) + implementation(Compose.ui) + implementation(Compose.uiTooling) + implementation(Compose.coil) + + /** Firebase libraries */ + implementation(platform(Firebase.bom)) + implementation(Firebase.firebaseAnalytics) + implementation(Firebase.firebaseCrashlytics) + + /** Tangem libraries */ + implementation(Tangem.blockchain) + implementation(Tangem.cardCore) + implementation(Tangem.cardAndroid) + + /** Other libraries */ + implementation(Library.materialComponent) + implementation(Library.googlePlayCore) + implementation(Library.googlePlayCoreKtx) + coreLibraryDesugaring(Library.desugarJdkLibs) + implementation(Library.timber) + implementation(Library.reKotlin) + implementation(Library.zxingQrCore) + implementation(Library.zxingQrBarcodeScanner) + implementation(Library.otaliastudiosCameraView) + implementation(Library.coil) + implementation(Library.appsflyer) + implementation(Library.amplitude) + implementation(Library.kotsonGsonExt) + //TODO: refactoring: remove it when all network services moved to the datasource module + implementation(Library.retrofit) + implementation(Library.retrofitMoshiConverter) + implementation(Library.moshi) + implementation(Library.moshiKotlin) + implementation(Library.okHttp) + implementation(Library.okHttpLogging) + implementation(Library.zendeskChat) + implementation(Library.zendeskMessaging) + implementation(Library.spongecastleCryptoCore) + implementation(Library.lottie) + implementation(Library.shopifyBuySdk) { + exclude(group = "com.shopify.graphql.support") + exclude(module = "joda-time") + } + implementation(Library.accompanistAppCompatTheme) + implementation(Library.accompanistSystemUiController) + implementation(Library.skydovesVeil) + implementation(Library.viewBindingDelegate) + implementation(Library.armadillo) + implementation(Library.googlePlayServicesWallet) + + /** Testing libraries */ + testImplementation(Test.junit) + testImplementation(Test.truth) + androidTestImplementation(Test.junitAndroidExt) + androidTestImplementation(Test.espresso) +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index f1b424510d..2f9dc5a47e 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,6 +1,6 @@ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. +# proguardFiles setting in build.gradle.kts. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 64f57c2248..0000000000 --- a/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -buildscript { - apply from: 'dependencies.gradle' - - repositories { - google() - jcenter() - maven { url 'https://maven.fabric.io/public' } - } - dependencies { - classpath "com.android.tools.build:gradle:${versions.build_gradle}" - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin" - classpath "com.github.dcendents:android-maven-gradle-plugin:2.1" - classpath 'com.google.gms:google-services:4.3.10' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' - } -} - -allprojects { - repositories { - google() - jcenter() - mavenLocal() - maven { url "https://nexus.tangem-tech.com/repository/maven-releases/" } - maven { url 'https://jitpack.io' } - maven { url 'https://zendesk.jfrog.io/zendesk/repo' } - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000000..0cc8e9c419 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,30 @@ +buildscript { + repositories { + google() + mavenCentral() + maven(url = "https://maven.fabric.io/public") + } + + dependencies { + classpath(ClasspathDependency.AndroidGradlePlugin) + classpath(ClasspathDependency.KotlinGradlePlugin) + classpath(ClasspathDependency.AndroidMavenGradlePlugin) + classpath(ClasspathDependency.GoogleServices) + classpath(ClasspathDependency.GoogleFirebaseCrashlytics) + } +} + +allprojects { + repositories { + google() + jcenter() // unable to replace with mavenCentral() due to rekotlin and com.otaliastudios:cameraview + mavenLocal() + maven("https://nexus.tangem-tech.com/repository/maven-releases/") + maven("https://jitpack.io") + maven("https://zendesk.jfrog.io/zendesk/repo") + } +} + +tasks.register("clean", Delete::class) { + delete(rootProject.buildDir) +} \ No newline at end of file diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000000..b22ed732fd --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + `kotlin-dsl` +} + +repositories { + mavenCentral() +} \ No newline at end of file diff --git a/buildSrc/src/main/java/AppConfig.kt b/buildSrc/src/main/java/AppConfig.kt new file mode 100644 index 0000000000..9a7e91768d --- /dev/null +++ b/buildSrc/src/main/java/AppConfig.kt @@ -0,0 +1,8 @@ +object AppConfig { + const val packageName = "com.tangem.wallet" + const val versionCode = 1 + const val versionName = "1.0.0.-SNAPSHOT" + const val minSdkVersion = 21 + const val targetSdkVersion = 33 + const val compileSdkVersion = 33 +} \ No newline at end of file diff --git a/buildSrc/src/main/java/ClasspathDependency.kt b/buildSrc/src/main/java/ClasspathDependency.kt new file mode 100644 index 0000000000..23fcf71450 --- /dev/null +++ b/buildSrc/src/main/java/ClasspathDependency.kt @@ -0,0 +1,9 @@ +object ClasspathDependency { + const val AndroidGradlePlugin = "com.android.tools.build:gradle:" + Versions.androidGradlePlugin + const val AndroidMavenGradlePlugin = "com.github.dcendents:android-maven-gradle-plugin:" + + Versions.androidMavenGradlePlugin + const val GoogleFirebaseCrashlytics = "com.google.firebase:firebase-crashlytics-gradle:" + + Versions.googleFirebaseCrashlytics + const val GoogleServices = "com.google.gms:google-services:" + Versions.googleServices + const val KotlinGradlePlugin = "org.jetbrains.kotlin:kotlin-gradle-plugin:" + Versions.kotlin +} \ No newline at end of file diff --git a/buildSrc/src/main/java/ConfigFieldBuilder.kt b/buildSrc/src/main/java/ConfigFieldBuilder.kt new file mode 100644 index 0000000000..42c1f16c56 --- /dev/null +++ b/buildSrc/src/main/java/ConfigFieldBuilder.kt @@ -0,0 +1,26 @@ +typealias ConfigFieldBuilder = (String, String, String) -> Unit + +class BuildConfigFieldFactory( + private val fields: List, + private val builder: ConfigFieldBuilder, +) { + fun create() { + fields.forEach { field -> builder(field.type, field.name, field.value) } + } +} + +/** + * Build config field + * + * @property type field type + * @property name field name + * @property value field value + */ +sealed class Field(val type: String, val name: String, val value: String) { + + class Environment(value: String) : Field("String", "ENVIRONMENT", "\"$value\"") + + class TestActionEnabled(isEnabled: Boolean) : Field("Boolean","TEST_ACTION_ENABLED", isEnabled.toString()) + + class LogEnabled(isEnabled: Boolean) : Field("Boolean","LOG_ENABLED", isEnabled.toString()) +} \ No newline at end of file diff --git a/buildSrc/src/main/java/Dependency.kt b/buildSrc/src/main/java/Dependency.kt new file mode 100644 index 0000000000..25c0e3787a --- /dev/null +++ b/buildSrc/src/main/java/Dependency.kt @@ -0,0 +1,77 @@ +object AndroidX { + const val activityCompose = "androidx.activity:activity-compose:" + Versions.androidxActivityCompose + const val appCompat = "androidx.appcompat:appcompat:" + Versions.androidxAppCompat + const val browser = "androidx.browser:browser:" + Versions.androidxBrowser + const val constraintLayout = "androidx.constraintlayout:constraintlayout:" + Versions.androidxConstraintLayout + const val coreKtx = "androidx.core:core-ktx:" + Versions.androidxCore + const val fragmentKtx = "androidx.fragment:fragment-ktx:" + Versions.androidxFragment + const val lifecycleCommonJava8 = "androidx.lifecycle:lifecycle-common-java8:" + Versions.androidxLifecycle + const val lifecycleLiveDataKtx = "androidx.lifecycle:lifecycle-livedata-ktx:" + Versions.androidxLifecycle + const val lifecycleRuntimeKtx = "androidx.lifecycle:lifecycle-runtime-ktx:" + Versions.androidxLifecycle + const val lifecycleViewModelKtx = "androidx.lifecycle:lifecycle-viewmodel-ktx:" + Versions.androidxLifecycle +} + +object Compose { + const val animation = "androidx.compose.animation:animation:" + Versions.compose + const val coil = "io.coil-kt:coil-compose:" + Versions.coil + const val foundation = "androidx.compose.foundation:foundation:" + Versions.composeFoundation + const val material = "androidx.compose.material:material:" + Versions.compose + const val ui = "androidx.compose.ui:ui:" + Versions.compose + const val uiTooling = "androidx.compose.ui:ui-tooling:" + Versions.compose +} + +object Firebase { + const val bom = "com.google.firebase:firebase-bom:" + Versions.firebase + const val firebaseAnalytics = "com.google.firebase:firebase-analytics-ktx" + const val firebaseCrashlytics = "com.google.firebase:firebase-crashlytics-ktx" +} + +object Library { + const val accompanistAppCompatTheme = "com.google.accompanist:accompanist-appcompat-theme:" + Versions.accompanist + const val accompanistSystemUiController = + "com.google.accompanist:accompanist-systemuicontroller:" + Versions.accompanist + const val amplitude = "com.amplitude:android-sdk:" + Versions.amplitude + const val appsflyer = "com.appsflyer:af-android-sdk:" + Versions.appsflyer + const val armadillo = "at.favre.lib:armadillo:" + Versions.armadillo + const val coil = "io.coil-kt:coil:" + Versions.coil + const val coroutine = "org.jetbrains.kotlinx:kotlinx-coroutines-core:" + Versions.coroutine + const val desugarJdkLibs = "com.android.tools:desugar_jdk_libs:" + Versions.desugarJdkLibs + const val googlePlayCore = "com.google.android.play:core:" + Versions.googlePlayCore + const val googlePlayCoreKtx = "com.google.android.play:core-ktx:" + Versions.googlePlayCoreKtx + const val googlePlayServicesWallet = + "com.google.android.gms:play-services-wallet:" + Versions.googlePlayServicesWallet + const val kotsonGsonExt = "com.github.salomonbrys.kotson:kotson:" + Versions.kotsonGsonExt + const val lottie = "com.airbnb.android:lottie:" + Versions.lottie + const val materialComponent = "com.google.android.material:material:" + Versions.googleMaterialComponent + const val moshi = "com.squareup.moshi:moshi:" + Versions.moshi + const val moshiKotlin = "com.squareup.moshi:moshi-kotlin:" + Versions.moshi + const val okHttp = "com.squareup.okhttp3:okhttp:" + Versions.okhttp + const val okHttpLogging = "com.squareup.okhttp3:logging-interceptor:" + Versions.okhttp + const val otaliastudiosCameraView = "com.otaliastudios:cameraview:" + Versions.otaliastudiosCameraView + const val shopifyBuySdk = "com.shopify.mobilebuysdk:buy3:" + Versions.shopifyBuySdk + const val skydovesVeil = "com.github.skydoves:androidveil:" + Versions.skydovesAndroidVeil + const val spongecastleCryptoCore = "com.madgag.spongycastle:core:" + Versions.spongycastleCryptoCore + const val reKotlin = "org.rekotlin:rekotlin:" + Versions.rekotlin + const val retrofit = "com.squareup.retrofit2:retrofit:" + Versions.retrofit + const val retrofitMoshiConverter = "com.squareup.retrofit2:converter-moshi:" + Versions.retrofitMoshiConverter + const val timber = "com.jakewharton.timber:timber:" + Versions.timber + const val viewBindingDelegate = + "com.github.kirich1409:viewbindingpropertydelegate-noreflection:" + Versions.viewBindingDelegate + const val zendeskChat = "com.zendesk:chat:" + Versions.zendeskChat + const val zendeskMessaging = "com.zendesk:messaging:" + Versions.zendeskMessaging + const val zxingQrBarcodeScanner = "me.dm7.barcodescanner:zxing:" + Versions.zxingQrBarcodeScanner + const val zxingQrCore = "com.google.zxing:core:" + Versions.zxingQrCode +} + +object Tangem { + const val blockchain = "com.tangem:blockchain:" + Versions.tangemBlockchainSdk + const val cardAndroid = "com.tangem.tangem-sdk-kotlin:android:" + Versions.tangemCardSgk + const val cardCore = "com.tangem.tangem-sdk-kotlin:core:" + Versions.tangemCardSgk +} + +object Test { + const val espresso = "androidx.test.espresso:espresso-core:" + Versions.espresso + const val junit = "junit:junit:" + Versions.junit + const val junitAndroidExt = "androidx.test.ext:junit:" + Versions.junitAndroidExt + const val truth = "com.google.truth:truth:" + Versions.truth +} \ No newline at end of file diff --git a/buildSrc/src/main/java/Versions.kt b/buildSrc/src/main/java/Versions.kt new file mode 100644 index 0000000000..d7d89a1fcd --- /dev/null +++ b/buildSrc/src/main/java/Versions.kt @@ -0,0 +1,68 @@ +object Versions { + // region Classpath + const val androidGradlePlugin = "7.1.3" + const val androidMavenGradlePlugin = "2.1" + const val googleFirebaseCrashlytics = "2.7.1" + const val googleServices = "4.3.10" + const val kotlin = "1.6.10" + // endregion Classpath + + // region AndroidX + const val androidxActivityCompose = "1.5.0" + const val androidxAppCompat = "1.5.1" + const val androidxBrowser = "1.4.0" + const val androidxConstraintLayout = "2.1.4" + const val androidxCore = "1.9.0" + const val androidxFragment = "1.5.3" + const val androidxLifecycle = "2.5.1" + // endregion AndroidX + + // region Compose + const val compose = "1.1.0" + const val composeFoundation = "1.2.0-rc03" + // endregion Compose + + // region Other libraries + const val accompanist = "0.23.0" + const val amplitude = "2.36.1" + const val appsflyer = "6.5.1" + const val armadillo = "0.9.0" + const val coil = "2.1.0" + const val coroutine = "1.5.2" + const val desugarJdkLibs = "1.1.5" + const val firebase = "26.0.0" + const val googleMaterialComponent = "1.6.1" + const val googlePlayCore = "1.10.3" + const val googlePlayCoreKtx = "1.8.1" + const val googlePlayServicesWallet = "19.1.0" + const val kotsonGsonExt = "2.5.0" + const val lottie = "3.4.0" + const val moshi = "1.12.0" + const val okhttp = "4.9.3" + const val otaliastudiosCameraView = "2.6.3" + const val rekotlin = "1.0.4" + const val retrofit = "2.8.1" + const val retrofitMoshiConverter = "2.6.0" + const val shopifyBuySdk = "12.0.0" + const val skydovesAndroidVeil = "1.1.2" + const val spongycastleCryptoCore = "1.58.0.0" + const val timber = "4.7.1" + const val viewBindingDelegate = "1.5.6" + const val zendeskChat = "3.3.5" + const val zendeskMessaging = "5.2.4" + const val zxingQrBarcodeScanner = "1.9.8" + const val zxingQrCode = "3.3.3" + // endregion Other libraries + + // region Tangem + const val tangemBlockchainSdk = "develop-133" + const val tangemCardSgk = "develop-165" + // endregion Tangem + + // region Testing + const val espresso = "3.4.0" + const val junit = "4.13.2" + const val truth = "1.1.3" + const val junitAndroidExt = "1.1.3" + // endregion Testing +} \ No newline at end of file diff --git a/common/build.gradle b/common/build.gradle.kts similarity index 67% rename from common/build.gradle rename to common/build.gradle.kts index 0412225730..e8259cee84 100644 --- a/common/build.gradle +++ b/common/build.gradle.kts @@ -1,6 +1,6 @@ plugins { - id 'java-library' - id 'org.jetbrains.kotlin.jvm' + id("java-library") + id("org.jetbrains.kotlin.jvm") } java { diff --git a/dependencies.gradle b/dependencies.gradle deleted file mode 100644 index ba7e3c39b6..0000000000 --- a/dependencies.gradle +++ /dev/null @@ -1,14 +0,0 @@ -ext.versions = [ - kotlin : '1.6.10', - build_gradle : '7.1.3', - tangem_card_sdk : 'develop-165', - // tangem_card_sdk : '0.0.1', - tangem_blockchain_sdk: 'develop-133', - // tangem_blockchain_sdk: '0.0.1', -] - -ext.environmentConfig = [ - environment : "ENVIRONMENT", - testActionEnabled: "TEST_ACTION_ENABLED", - logEnabled : "LOG_ENABLED", -] diff --git a/domain/build.gradle b/domain/build.gradle deleted file mode 100644 index 83c9fe6ff1..0000000000 --- a/domain/build.gradle +++ /dev/null @@ -1,88 +0,0 @@ -plugins { - id 'com.android.library' - id 'org.jetbrains.kotlin.android' -} - -apply from: '../dependencies.gradle' - -android { - compileSdk 31 - - defaultConfig { - minSdk 21 - targetSdk 31 - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles "consumer-rules.pro" - buildConfigField 'Boolean', environmentConfig.testActionEnabled, 'false' - buildConfigField 'Boolean', environmentConfig.logEnabled, 'false' - } - - buildTypes { - release { - debuggable false - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - buildConfigField 'Boolean', environmentConfig.testActionEnabled, 'false' - buildConfigField 'Boolean', environmentConfig.logEnabled, 'false' - } - debug { - debuggable true - minifyEnabled false - buildConfigField 'Boolean', environmentConfig.testActionEnabled, 'true' - buildConfigField 'Boolean', environmentConfig.logEnabled, 'true' - } - debug_beta { - initWith release - buildConfigField 'Boolean', environmentConfig.testActionEnabled, 'true' - buildConfigField 'Boolean', environmentConfig.logEnabled, 'true' - } - } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8.toString() - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } -// composeOptions { -// kotlinCompilerExtensionVersion '1.1.0' -// } - packagingOptions { - exclude 'lib/x86_64/darwin/libscrypt.dylib' - exclude 'lib/x86_64/freebsd/libscrypt.so' - exclude 'lib/x86_64/linux/libscrypt.so' - } -} - -dependencies { - implementation implementation(project(path: ':network')) - implementation implementation(project(path: ':common')) - - implementation "com.tangem:blockchain:${versions.tangem_blockchain_sdk}" - implementation "com.tangem.tangem-sdk-kotlin:core:${versions.tangem_card_sdk}" - implementation "com.tangem.tangem-sdk-kotlin:android:${versions.tangem_card_sdk}" - - // Kotlin coroutines - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2' - - // State management - implementation "org.rekotlin:rekotlin:1.0.4" - - // Network - //TODO: it must depends from network module - implementation 'com.squareup.retrofit2:retrofit:2.8.1' - implementation 'com.squareup.retrofit2:converter-moshi:2.6.0' - implementation 'com.squareup.moshi:moshi:1.12.0' - implementation "com.squareup.moshi:moshi-kotlin:1.12.0" - implementation 'com.squareup.okhttp3:logging-interceptor:4.2.2' - - // Logs - implementation 'com.jakewharton.timber:timber:4.7.1' - - // Tests - testImplementation 'junit:junit:4.13.2' - testImplementation "com.google.truth:truth:1.1.3" - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' -} \ No newline at end of file diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts new file mode 100644 index 0000000000..6e1c48864e --- /dev/null +++ b/domain/build.gradle.kts @@ -0,0 +1,98 @@ +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") +} + +android { + compileSdk = AppConfig.compileSdkVersion + + defaultConfig { + minSdk = AppConfig.minSdkVersion + targetSdk = AppConfig.targetSdkVersion + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + + BuildConfigFieldFactory( + fields = listOf( + Field.Environment("prod"), + Field.TestActionEnabled(false), + Field.LogEnabled(false), + ), + builder = ::buildConfigField, + ).create() + } + + debug { + isMinifyEnabled = false + + BuildConfigFieldFactory( + fields = listOf( + Field.Environment("prod"), + Field.TestActionEnabled(true), + Field.LogEnabled(true), + ), + builder = ::buildConfigField, + ).create() + } + + create("debug_beta") { + initWith(getByName("release")) + BuildConfigFieldFactory( + fields = listOf( + Field.Environment("release"), + Field.TestActionEnabled(true), + Field.LogEnabled(true), + ), + builder = ::buildConfigField, + ).create() + } + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + packagingOptions { + resources.excludes += "lib/x86_64/darwin/libscrypt.dylib" + resources.excludes += "lib/x86_64/freebsd/libscrypt.so" + resources.excludes += "lib/x86_64/linux/libscrypt.so" + } +} + +dependencies { + implementation(project(":network")) + implementation(project(":common")) + + /** Tangem libraries */ + implementation(Tangem.blockchain) + implementation(Tangem.cardCore) + implementation(Tangem.cardAndroid) + + /** Other libraries */ + implementation(Library.reKotlin) + //TODO: refactoring: remove it when all network services moved to the datasource module + implementation(Library.retrofit) + implementation(Library.retrofitMoshiConverter) + implementation(Library.moshi) + implementation(Library.moshiKotlin) + implementation(Library.okHttpLogging) + implementation(Library.timber) + implementation(Library.coroutine) + + /** Testing libraries */ + testImplementation(Test.junit) + testImplementation(Test.truth) + androidTestImplementation(Test.junitAndroidExt) + androidTestImplementation(Test.espresso) +} \ No newline at end of file diff --git a/domain/proguard-rules.pro b/domain/proguard-rules.pro index 481bb43481..ff59496d81 100644 --- a/domain/proguard-rules.pro +++ b/domain/proguard-rules.pro @@ -1,6 +1,6 @@ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. +# proguardFiles setting in build.gradle.kts. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html diff --git a/network/build.gradle b/network/build.gradle deleted file mode 100644 index e7fccceda6..0000000000 --- a/network/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -plugins { - id 'java-library' - id 'org.jetbrains.kotlin.jvm' -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - -dependencies { - implementation implementation(project(path: ':common')) - - // Tangem sdk's - implementation "com.tangem.tangem-sdk-kotlin:core:${versions.tangem_card_sdk}" - - // Kotlin coroutines - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2' - - // Logs - implementation 'com.jakewharton.timber:timber:4.7.1' - - // Network - implementation(platform("com.squareup.okhttp3:okhttp-bom:4.9.3")) - implementation("com.squareup.okhttp3:okhttp") - implementation("com.squareup.okhttp3:logging-interceptor") - implementation 'com.squareup.retrofit2:retrofit:2.8.1' - implementation 'com.squareup.retrofit2:converter-moshi:2.6.0' - implementation 'com.squareup.moshi:moshi:1.13.0' - implementation "com.squareup.moshi:moshi-kotlin:1.13.0" -} \ No newline at end of file diff --git a/network/build.gradle.kts b/network/build.gradle.kts new file mode 100644 index 0000000000..0c82757e05 --- /dev/null +++ b/network/build.gradle.kts @@ -0,0 +1,26 @@ +plugins { + id("java-library") + id("org.jetbrains.kotlin.jvm") +} + +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +dependencies { + implementation(project(":common")) + + /** Tangem libraries */ + implementation(Tangem.cardCore) + + /** Other libraries */ + implementation(Library.retrofit) + implementation(Library.retrofitMoshiConverter) + implementation(Library.moshi) + implementation(Library.moshiKotlin) + implementation(Library.okHttp) + implementation(Library.okHttpLogging) + implementation(Library.timber) + implementation(Library.coroutine) +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 9b33b9462c..0000000000 --- a/settings.gradle +++ /dev/null @@ -1,4 +0,0 @@ -include ':app' -include ':domain' -include ':network' -include ':common' diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000000..5e820bbbfc --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,4 @@ +include(":app") +include(":domain") +include(":network") +include(":common") \ No newline at end of file