From abd10fa54ca2132eec410c646d5331ebec178e4a Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 12 Sep 2023 20:20:50 +0500 Subject: [PATCH 01/12] Updated on 2026-08-14 --- gradle/dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index eacf2e16fc..2838f5ac8a 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -80,7 +80,7 @@ okHttp-prettyLogging = "3.1.0" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_4.11-344" +tangemBlockchainSdk = "release-app_4.11-346" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_4.11-294" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds From b2dea9b80d33eb3678acac07a4175550b0a9ee02 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 12 Sep 2023 20:44:19 +0500 Subject: [PATCH 02/12] Updated on 2026-08-14 --- gradle/dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index eacf2e16fc..2838f5ac8a 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -80,7 +80,7 @@ okHttp-prettyLogging = "3.1.0" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_4.11-344" +tangemBlockchainSdk = "release-app_4.11-346" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_4.11-294" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds From 40f1a44f989f4f822c629394997063cda9ae32c2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 13 Sep 2023 11:13:23 +0300 Subject: [PATCH 03/12] Updated on 2026-08-14 --- .../src/main/assets/configs/feature_toggles_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json index 8cd92e9d2f..b7f8daf04c 100644 --- a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json +++ b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json @@ -9,7 +9,7 @@ }, { "name": "NEW_CARD_SCANNING_ENABLED", - "version": "4.11.0" + "version": "undefined" }, { "name": "REDESIGNED_WALLET_SCREEN_ENABLED", From 063f6ea5aded57161c2c04a46e509a76f922cc8e Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 12 Sep 2023 16:01:10 +0400 Subject: [PATCH 04/12] Updated on 2026-08-14 --- .../features/details/redux/DetailsAction.kt | 4 +++- .../details/redux/DetailsMiddleware.kt | 15 +++++++++++--- .../ui/appsettings/AppSettingsFragment.kt | 5 +++-- .../ui/appsettings/AppSettingsViewModel.kt | 19 ++++++++++++++---- .../data/card/sdk/DefaultCardSdkProvider.kt | 20 ++++++------------- 5 files changed, 39 insertions(+), 24 deletions(-) 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 5782c7b0e2..1248e2537c 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 @@ -1,8 +1,9 @@ package com.tangem.tap.features.details.redux +import androidx.lifecycle.LifecycleCoroutineScope import com.tangem.blockchain.common.Wallet -import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.common.CardTypesResolver +import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.entities.FiatCurrency import org.rekotlin.Action @@ -64,6 +65,7 @@ sealed class DetailsAction : Action { data class CheckBiometricsStatus( val awaitStatusChange: Boolean, + val lifecycleCoroutineScope: LifecycleCoroutineScope, ) : AppSettings() object EnrollBiometrics : AppSettings() 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 88614a197f..a672117ab2 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 @@ -1,5 +1,6 @@ package com.tangem.tap.features.details.redux +import androidx.lifecycle.LifecycleCoroutineScope import com.tangem.common.CompletionResult import com.tangem.common.core.TangemSdkError import com.tangem.common.doOnFailure @@ -216,7 +217,11 @@ class DetailsMiddleware { } } is DetailsAction.AppSettings.CheckBiometricsStatus -> { - checkBiometricsStatus(action.awaitStatusChange, state) + checkBiometricsStatus( + awaitStatusChange = action.awaitStatusChange, + state = state, + lifecycleScope = action.lifecycleCoroutineScope, + ) } is DetailsAction.AppSettings.EnrollBiometrics -> { enrollBiometrics() @@ -232,8 +237,12 @@ class DetailsMiddleware { * @param awaitStatusChange If true then start a new coroutine and check the biometric status every 100 * milliseconds until it changes * */ - private fun checkBiometricsStatus(awaitStatusChange: Boolean, state: DetailsState) { - scope.launch { + private fun checkBiometricsStatus( + awaitStatusChange: Boolean, + state: DetailsState, + lifecycleScope: LifecycleCoroutineScope, + ) { + lifecycleScope.launch { if (awaitStatusChange) { while (state.appSettingsState.needEnrollBiometrics == tangemSdkManager.needEnrollBiometrics) { delay(timeMillis = 100) diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsFragment.kt b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsFragment.kt index 0f0e3de308..2be6f7b037 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsFragment.kt @@ -8,6 +8,7 @@ import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope import androidx.transition.TransitionInflater import com.tangem.core.navigation.NavigationAction import com.tangem.core.ui.res.TangemTheme @@ -27,7 +28,7 @@ class AppSettingsFragment : Fragment(), StoreSubscriber { val inflater = TransitionInflater.from(requireContext()) enterTransition = inflater.inflateTransition(R.transition.fade) exitTransition = inflater.inflateTransition(R.transition.fade) - viewModel.checkBiometricsStatus() + viewModel.checkBiometricsStatus(lifecycleScope) } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { @@ -58,7 +59,7 @@ class AppSettingsFragment : Fragment(), StoreSubscriber { override fun onResume() { super.onResume() - viewModel.refreshBiometricsStatus() + viewModel.refreshBiometricsStatus(lifecycleScope) } override fun onStop() { diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsViewModel.kt index 38323dcc3e..857ce03b4d 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsViewModel.kt @@ -1,5 +1,6 @@ package com.tangem.tap.features.details.ui.appsettings +import androidx.lifecycle.LifecycleCoroutineScope import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.redux.AppState import com.tangem.tap.features.details.redux.AppSetting @@ -32,11 +33,21 @@ class AppSettingsViewModel(private val store: Store) { store.dispatch(DetailsAction.AppSettings.SwitchPrivacySetting(enable = enable, setting = setting)) } - fun checkBiometricsStatus() { - store.dispatch(DetailsAction.AppSettings.CheckBiometricsStatus(awaitStatusChange = false)) + fun checkBiometricsStatus(lifecycleScope: LifecycleCoroutineScope) { + store.dispatch( + DetailsAction.AppSettings.CheckBiometricsStatus( + awaitStatusChange = false, + lifecycleCoroutineScope = lifecycleScope, + ), + ) } - fun refreshBiometricsStatus() { - store.dispatch(DetailsAction.AppSettings.CheckBiometricsStatus(awaitStatusChange = true)) + fun refreshBiometricsStatus(lifecycleScope: LifecycleCoroutineScope) { + store.dispatch( + DetailsAction.AppSettings.CheckBiometricsStatus( + awaitStatusChange = true, + lifecycleCoroutineScope = lifecycleScope, + ), + ) } } \ No newline at end of file diff --git a/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt b/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt index b536029bcb..c2c2a2dd19 100644 --- a/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt +++ b/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt @@ -20,26 +20,18 @@ import javax.inject.Singleton internal class DefaultCardSdkProvider @Inject constructor() : CardSdkProvider, CardSdkLifecycleObserver { override val sdk: TangemSdk - get() = requireNotNull(value = _sdk) { "Impossible to get the TangemSdk when activity is destroyed" } + get() = requireNotNull(value = _sdk?.get()) { "Impossible to get the TangemSdk when activity is destroyed" } - private var _sdk: TangemSdk? = null - - /** Weak reference of context that uses to create [TangemSdk] */ - private var contextRef: WeakReference = WeakReference(null) + private var _sdk: WeakReference? = null override fun onCreate(context: Context) { - contextRef = WeakReference(context) - _sdk = TangemSdk.initWithBiometrics(activity = context as FragmentActivity, config = config) + _sdk = WeakReference(TangemSdk.initWithBiometrics(activity = context as FragmentActivity, config = config)) } override fun onDestroy(context: Context) { - /* - - - */ - if (contextRef.get() == context) { - _sdk = null - } + // Commented out to prevent crash on getting sdk when it's null. + // FIXME: We still should find the real cause and fix it properly. + // _sdk = null } private companion object { From 2d765913c19800956208ff77b2574723e83d4ab9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 13 Sep 2023 19:35:51 +0300 Subject: [PATCH 05/12] Updated on 2026-08-14 --- gradle/dependencies.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 2838f5ac8a..657e767378 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -80,9 +80,9 @@ okHttp-prettyLogging = "3.1.0" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_4.11-346" +tangemBlockchainSdk = "release-app_4.11-348" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds -tangemCardSdk = "release-app_4.11-294" +tangemCardSdk = "release-app_4.11-295" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds # endregion Tangem From 45a4887fb235fe87f387daa6984e9e767bca0d81 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 14 Sep 2023 12:01:52 +0300 Subject: [PATCH 06/12] Updated on 2026-08-14 --- .../com/tangem/tap/features/wallet/redux/WalletState.kt | 3 --- .../com/tangem/tap/features/wallet/ui/WalletFragment.kt | 6 ++---- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt index 0048c80636..f0bdd8f3f1 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt @@ -82,9 +82,6 @@ data class WalletState( get() = primaryWalletStore?.walletsData ?.firstOrNull { it.currency !is Currency.Blockchain } - val shouldShowDetails: Boolean = - primaryWalletData?.status !is WalletDataModel.Unreachable - fun getWalletManager(currency: Currency?): WalletManager? { if (currency?.blockchain == null) return null return getWalletStore(currency)?.walletManager 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 d049f046a3..cbb33a7dcd 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 @@ -190,9 +190,7 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), SafeStoreSubscriber Date: Thu, 14 Sep 2023 11:47:20 +0300 Subject: [PATCH 07/12] Updated on 2026-08-14 --- .../domain/DefaultCustomTokenInteractor.kt | 29 +++++------ .../domain/DefaultTokensListInteractor.kt | 35 ++++++------- .../tokens/legacy/redux/TokensMiddleware.kt | 33 ++++++------- .../tangem/tap/proxy/DerivationManagerImpl.kt | 49 ++++++++++--------- 4 files changed, 73 insertions(+), 73 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt b/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt index fe1bb63d2a..7071f8c24d 100644 --- a/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt +++ b/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt @@ -71,9 +71,9 @@ class DefaultCustomTokenInteractor( onSuccess: suspend (ScanResponse) -> Unit, ) { val config = CardConfig.createConfig(scanResponse.card) - val derivationDataList = currencyList.mapNotNull { - val curve = config.primaryCurve(it.blockchain) - curve?.let { getDerivations(curve, scanResponse, currencyList) } + val derivationDataList = currencyList.mapNotNull { currency -> + val curve = config.primaryCurve(currency.blockchain) + curve?.let { getDerivations(curve, scanResponse, currency) } } val derivations = derivationDataList.associate(TokensMiddleware.DerivationData::derivations) @@ -110,24 +110,25 @@ class DefaultCustomTokenInteractor( private fun getDerivations( curve: EllipticCurve, scanResponse: ScanResponse, - currencyList: List, + currency: Currency, ): TokensMiddleware.DerivationData? { val wallet = scanResponse.card.wallets.firstOrNull { it.curve == curve } ?: return null - val manageTokensCandidates = currencyList.map { it.blockchain }.distinct().filter { - it.getSupportedCurves().contains(curve) - }.mapNotNull { - it.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) - } + val supportedCurves = currency.blockchain.getSupportedCurves() + val path = currency.derivationPath + ?.let { + currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) + } + .takeIf { supportedCurves.contains(curve) } - val customTokensCandidates = currencyList.filter { - it.blockchain.getSupportedCurves().contains(curve) - }.mapNotNull { it.derivationPath }.map { DerivationPath(it) } + val customPath = currency.derivationPath?.let { + DerivationPath(it) + }.takeIf { supportedCurves.contains(curve) } - val bothCandidates = (manageTokensCandidates + customTokensCandidates).distinct().toMutableList() + val bothCandidates = listOfNotNull(path, customPath).distinct().toMutableList() if (bothCandidates.isEmpty()) return null - currencyList.find { it is Currency.Blockchain && it.blockchain == Blockchain.Cardano }?.let { currency -> + if (currency is Currency.Blockchain && currency.blockchain == Blockchain.Cardano) { currency.derivationPath?.let { bothCandidates.add(CardanoUtils.extendedDerivationPath(DerivationPath(it))) } diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt index 9610727483..a70d6379c1 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt @@ -136,9 +136,9 @@ internal class DefaultTokensListInteractor( private suspend fun deriveMissingBlockchains(scanResponse: ScanResponse, currencies: List) { val config = CardConfig.createConfig(scanResponse.card) - val derivations = currencies.mapNotNull { - val curve = config.primaryCurve(it.blockchain) - curve?.let { getDerivations(curve, scanResponse, currencies) } + val derivations = currencies.mapNotNull { currency -> + val curve = config.primaryCurve(currency.blockchain) + curve?.let { getDerivations(curve, scanResponse, currency) } }.associate(transform = TokensMiddleware.DerivationData::derivations) if (derivations.isEmpty()) { @@ -176,35 +176,36 @@ internal class DefaultTokensListInteractor( private fun getDerivations( curve: EllipticCurve, scanResponse: ScanResponse, - currencyList: List, + currency: Currency, ): TokensMiddleware.DerivationData? { val wallet = scanResponse.card.wallets.firstOrNull { it.curve == curve } ?: return null - val manageTokensCandidates = currencyList - .map(Currency::blockchain) - .distinct() - .filter { it.getSupportedCurves().contains(curve) } - .mapNotNull { it.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) } + val supportedCurves = currency.blockchain.getSupportedCurves() + val path = currency.derivationPath + ?.let { + currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) + } + .takeIf { supportedCurves.contains(curve) } - val customTokensCandidates = currencyList - .filter { it.blockchain.getSupportedCurves().contains(curve) } - .mapNotNull(Currency::derivationPath) - .map(::DerivationPath) + val customPath = currency.derivationPath?.let { + DerivationPath(it) + }.takeIf { supportedCurves.contains(curve) } - val bothCandidates = (manageTokensCandidates + customTokensCandidates).distinct().toMutableList() + val bothCandidates = listOfNotNull(path, customPath).distinct().toMutableList() if (bothCandidates.isEmpty()) return null - currencyList.find { it is Currency.Blockchain && it.blockchain == Blockchain.Cardano }?.let { currency -> + if (currency is Currency.Blockchain && currency.blockchain == Blockchain.Cardano) { currency.derivationPath?.let { bothCandidates.add(CardanoUtils.extendedDerivationPath(DerivationPath(it))) } } val mapKeyOfWalletPublicKey = wallet.publicKey.toMapKey() - val alreadyDerivedKeys = scanResponse.derivedKeys[mapKeyOfWalletPublicKey] ?: ExtendedPublicKeysMap(emptyMap()) + val alreadyDerivedKeys: ExtendedPublicKeysMap = + scanResponse.derivedKeys[mapKeyOfWalletPublicKey] ?: ExtendedPublicKeysMap(emptyMap()) val alreadyDerivedPaths = alreadyDerivedKeys.keys.toList() - val toDerive = bothCandidates.filterNot(alreadyDerivedPaths::contains) + val toDerive = bothCandidates.filterNot { alreadyDerivedPaths.contains(it) } if (toDerive.isEmpty()) return null return TokensMiddleware.DerivationData(derivations = mapKeyOfWalletPublicKey to toDerive) diff --git a/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt b/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt index 1a5eb1fd45..70ac55b12f 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt @@ -121,9 +121,9 @@ object TokensMiddleware { onSuccess: (ScanResponse) -> Unit, ) { val config = CardConfig.createConfig(scanResponse.card) - val derivationDataList = currencyList.mapNotNull { - val curve = config.primaryCurve(it.blockchain) - curve?.let { getDerivations(curve, scanResponse, currencyList) } + val derivationDataList = currencyList.mapNotNull { currency -> + val curve = config.primaryCurve(currency.blockchain) + curve?.let { getDerivations(curve, scanResponse, currency) } } val derivations = derivationDataList.associate { it.derivations } if (derivations.isEmpty()) { @@ -163,27 +163,24 @@ object TokensMiddleware { } } - private fun getDerivations( - curve: EllipticCurve, - scanResponse: ScanResponse, - currencyList: List, - ): DerivationData? { + private fun getDerivations(curve: EllipticCurve, scanResponse: ScanResponse, currency: Currency): DerivationData? { val wallet = scanResponse.card.wallets.firstOrNull { it.curve == curve } ?: return null - val manageTokensCandidates = currencyList.map { it.blockchain }.distinct().filter { - it.getSupportedCurves().contains(curve) - }.mapNotNull { - it.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) - } + val supportedCurves = currency.blockchain.getSupportedCurves() + val path = currency.derivationPath + ?.let { + currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) + } + .takeIf { supportedCurves.contains(curve) } - val customTokensCandidates = currencyList.filter { - it.blockchain.getSupportedCurves().contains(curve) - }.mapNotNull { it.derivationPath }.map { DerivationPath(it) } + val customPath = currency.derivationPath?.let { + DerivationPath(it) + }.takeIf { supportedCurves.contains(curve) } - val bothCandidates = (manageTokensCandidates + customTokensCandidates).distinct().toMutableList() + val bothCandidates = listOfNotNull(path, customPath).distinct().toMutableList() if (bothCandidates.isEmpty()) return null - currencyList.find { it is Currency.Blockchain && it.blockchain == Blockchain.Cardano }?.let { currency -> + if (currency is Currency.Blockchain && currency.blockchain == Blockchain.Cardano) { currency.derivationPath?.let { bothCandidates.add(CardanoUtils.extendedDerivationPath(DerivationPath(it))) } diff --git a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt index 174dd3762d..34a6d471b2 100644 --- a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt @@ -26,6 +26,7 @@ import com.tangem.tap.common.extensions.dispatchDebugErrorNotification import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.domain.TapError +import com.tangem.tap.features.tokens.legacy.redux.TokensMiddleware import com.tangem.tap.scope import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -97,9 +98,9 @@ class DerivationManagerImpl( onFailure: (Exception) -> Unit, ) { val config = CardConfig.createConfig(scanResponse.card) - val derivationDataList = currencyList.mapNotNull { - val curve = config.primaryCurve(it.blockchain) - curve?.let { getDerivations(curve, scanResponse, currencyList) } + val derivationDataList = currencyList.mapNotNull { currency -> + val curve = config.primaryCurve(currency.blockchain) + curve?.let { getDerivations(curve, scanResponse, currency) } } val derivations = derivationDataList.associate { it.derivations } if (derivations.isEmpty()) { @@ -159,23 +160,32 @@ class DerivationManagerImpl( private fun getDerivations( curve: EllipticCurve, scanResponse: ScanResponse, - currencyList: List, - ): DerivationData? { + currency: com.tangem.tap.features.wallet.models.Currency, + ): TokensMiddleware.DerivationData? { val wallet = scanResponse.card.wallets.firstOrNull { it.curve == curve } ?: return null - val manageTokensCandidates = currencyList.map { it.blockchain }.distinct().filter { - it.getSupportedCurves().contains(curve) - }.mapNotNull { - it.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) - } + val supportedCurves = currency.blockchain.getSupportedCurves() + val path = currency.derivationPath + ?.let { + currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) + } + .takeIf { supportedCurves.contains(curve) } - val customTokensCandidates = currencyList.filter { - it.blockchain.getSupportedCurves().contains(curve) - }.mapNotNull { it.derivationPath }.map { DerivationPath(it) } + val customPath = currency.derivationPath?.let { + DerivationPath(it) + }.takeIf { supportedCurves.contains(curve) } - val bothCandidates = (manageTokensCandidates + customTokensCandidates).distinct().toMutableList() + val bothCandidates = listOfNotNull(path, customPath).distinct().toMutableList() if (bothCandidates.isEmpty()) return null + if (currency is WalletModelCurrency.Blockchain && + currency.blockchain == Blockchain.Cardano + ) { + currency.derivationPath?.let { + bothCandidates.add(CardanoUtils.extendedDerivationPath(DerivationPath(it))) + } + } + val mapKeyOfWalletPublicKey = wallet.publicKey.toMapKey() val alreadyDerivedKeys: ExtendedPublicKeysMap = scanResponse.derivedKeys[mapKeyOfWalletPublicKey] ?: ExtendedPublicKeysMap(emptyMap()) @@ -184,16 +194,7 @@ class DerivationManagerImpl( val toDerive = bothCandidates.filterNot { alreadyDerivedPaths.contains(it) } if (toDerive.isEmpty()) return null - currencyList.find { it is WalletModelCurrency.Blockchain && it.blockchain == Blockchain.Cardano } - ?.let { currency -> - currency.derivationPath?.let { - bothCandidates.add(CardanoUtils.extendedDerivationPath(DerivationPath(it))) - } - } - - return DerivationData( - derivations = mapKeyOfWalletPublicKey to toDerive, - ) + return TokensMiddleware.DerivationData(derivations = mapKeyOfWalletPublicKey to toDerive) } /** From cd152b1af3d6f555501c52a3a99312b9f4bc2e38 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 14 Sep 2023 14:25:21 +0300 Subject: [PATCH 08/12] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/MainActivity.kt | 4 ++-- .../com/tangem/data/card/sdk/DefaultCardSdkProvider.kt | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index 52e9ff1262..efa00b067f 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -129,6 +129,8 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac super.onCreate(savedInstanceState) + cardSdkLifecycleObserver.onCreate(context = this) + bootstrapMainStateUpdates() splashScreen.setKeepOnScreenCondition { isInitializing } @@ -138,8 +140,6 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac store.dispatch(NavigationAction.ActivityCreated(WeakReference(this))) - cardSdkLifecycleObserver.onCreate(context = this) - tangemSdkManager = injectedTangemSdkManager appStateHolder.tangemSdkManager = tangemSdkManager backupService = BackupService.init(cardSdkConfigRepository.sdk, this) diff --git a/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt b/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt index c2c2a2dd19..c58a3014e6 100644 --- a/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt +++ b/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt @@ -20,17 +20,18 @@ import javax.inject.Singleton internal class DefaultCardSdkProvider @Inject constructor() : CardSdkProvider, CardSdkLifecycleObserver { override val sdk: TangemSdk - get() = requireNotNull(value = _sdk?.get()) { "Impossible to get the TangemSdk when activity is destroyed" } + get() = requireNotNull(value = _sdk) { "Impossible to get the TangemSdk when activity is destroyed" } - private var _sdk: WeakReference? = null + private var _sdk: TangemSdk? = null override fun onCreate(context: Context) { - _sdk = WeakReference(TangemSdk.initWithBiometrics(activity = context as FragmentActivity, config = config)) + _sdk = TangemSdk.initWithBiometrics(activity = context as FragmentActivity, config = config) } override fun onDestroy(context: Context) { // Commented out to prevent crash on getting sdk when it's null. // FIXME: We still should find the real cause and fix it properly. + // idea: pass everywhere DefaultCardSdkProvider instead sdk to reach lazy access to sdk property // _sdk = null } From 05cf991ddee8369988f3b9a1a4734432dbd1e218 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 14 Sep 2023 18:39:18 +0500 Subject: [PATCH 09/12] Updated on 2026-08-14 --- gradle/dependencies.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 657e767378..d4c76f2594 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -32,6 +32,7 @@ compose-navigation = "2.5.3" compose-accompanist = "0.30.1" compose-paging = "3.2.0" compose-reorderable = "0.9.6" +compoese-lifecycle-runtime = "2.6.1" # endregion Compose # region Other libraries @@ -80,7 +81,7 @@ okHttp-prettyLogging = "3.1.0" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_4.11-348" +tangemBlockchainSdk = "release-app_4.11-349" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_4.11-295" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds @@ -132,7 +133,7 @@ androidx-paging-runtime = { module = "androidx.paging:paging-runtime", version.r lifecycle-common-java8 = { module = "androidx.lifecycle:lifecycle-common-java8", version.ref = "androidxLifecycle" } lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "androidxLifecycle" } lifecycle-viewModel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "androidxLifecycle" } -lifecycle-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidxLifecycle" } +lifecycle-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "compoese-lifecycle-runtime" } # region AndroidX # region Compose From 949f83cd345c45ff7878fa71b11acecf3b5ab8f7 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 14 Sep 2023 18:08:29 +0300 Subject: [PATCH 10/12] Updated on 2026-08-14 --- core/res/src/main/res/values-ru/strings.xml | 2 +- .../java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index 2eb19248a6..1ed0453bfb 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -490,7 +490,7 @@ Разблокировать все с %s История транзакций Сеть недоступна - Блокчейн недоступен. Попробуй позже. + Блокчейн недоступен. Попробуйте позже. Баланс загружается… Отсканируйте карту Транзакция подтверждается… diff --git a/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt b/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt index c58a3014e6..1249de10d7 100644 --- a/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt +++ b/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt @@ -7,7 +7,6 @@ import com.tangem.common.CardFilter import com.tangem.common.card.FirmwareVersion import com.tangem.common.core.Config import com.tangem.sdk.extensions.initWithBiometrics -import java.lang.ref.WeakReference import javax.inject.Inject import javax.inject.Singleton From 8fa01760a99201a9223366b84f0a6946069b91cc Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 18 Sep 2023 10:51:35 +0300 Subject: [PATCH 11/12] Updated on 2026-08-14 --- .../domain/DefaultCustomTokenInteractor.kt | 18 +++++++++++----- .../domain/DefaultTokensListInteractor.kt | 21 +++++++++++++------ .../tokens/legacy/redux/TokensMiddleware.kt | 18 +++++++++++----- .../tangem/tap/proxy/DerivationManagerImpl.kt | 17 ++++++++++----- 4 files changed, 53 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt b/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt index 7071f8c24d..f104a8ca09 100644 --- a/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt +++ b/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt @@ -4,6 +4,7 @@ import com.tangem.blockchain.blockchains.cardano.CardanoUtils import com.tangem.blockchain.common.Blockchain import com.tangem.common.CompletionResult import com.tangem.common.card.EllipticCurve +import com.tangem.common.extensions.ByteArrayKey import com.tangem.common.extensions.guard import com.tangem.common.extensions.toMapKey import com.tangem.common.flatMap @@ -76,7 +77,17 @@ class DefaultCustomTokenInteractor( curve?.let { getDerivations(curve, scanResponse, currency) } } - val derivations = derivationDataList.associate(TokensMiddleware.DerivationData::derivations) + val derivations = buildMap> { + derivationDataList.forEach { + val current = this[it.derivations.first] + if (current != null) { + current.addAll(it.derivations.second) + current.distinct() + } else { + this[it.derivations.first] = it.derivations.second.toMutableList() + } + } + } if (derivations.isEmpty()) { onSuccess(scanResponse) return @@ -115,10 +126,7 @@ class DefaultCustomTokenInteractor( val wallet = scanResponse.card.wallets.firstOrNull { it.curve == curve } ?: return null val supportedCurves = currency.blockchain.getSupportedCurves() - val path = currency.derivationPath - ?.let { - currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) - } + val path = currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) .takeIf { supportedCurves.contains(curve) } val customPath = currency.derivationPath?.let { diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt index a70d6379c1..64bd577f52 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt @@ -6,6 +6,7 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.derivation.DerivationStyle import com.tangem.common.CompletionResult import com.tangem.common.card.EllipticCurve +import com.tangem.common.extensions.ByteArrayKey import com.tangem.common.extensions.guard import com.tangem.common.extensions.toMapKey import com.tangem.common.flatMap @@ -136,11 +137,22 @@ internal class DefaultTokensListInteractor( private suspend fun deriveMissingBlockchains(scanResponse: ScanResponse, currencies: List) { val config = CardConfig.createConfig(scanResponse.card) - val derivations = currencies.mapNotNull { currency -> + val derivationDataList = currencies.mapNotNull { currency -> val curve = config.primaryCurve(currency.blockchain) curve?.let { getDerivations(curve, scanResponse, currency) } - }.associate(transform = TokensMiddleware.DerivationData::derivations) + } + val derivations = buildMap> { + derivationDataList.forEach { + val current = this[it.derivations.first] + if (current != null) { + current.addAll(it.derivations.second) + current.distinct() + } else { + this[it.derivations.first] = it.derivations.second.toMutableList() + } + } + } if (derivations.isEmpty()) { submitAdd(scanResponse, currencies) return @@ -181,10 +193,7 @@ internal class DefaultTokensListInteractor( val wallet = scanResponse.card.wallets.firstOrNull { it.curve == curve } ?: return null val supportedCurves = currency.blockchain.getSupportedCurves() - val path = currency.derivationPath - ?.let { - currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) - } + val path = currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) .takeIf { supportedCurves.contains(curve) } val customPath = currency.derivationPath?.let { diff --git a/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt b/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt index 70ac55b12f..2785c63857 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt @@ -125,7 +125,18 @@ object TokensMiddleware { val curve = config.primaryCurve(currency.blockchain) curve?.let { getDerivations(curve, scanResponse, currency) } } - val derivations = derivationDataList.associate { it.derivations } + val derivations = buildMap> { + derivationDataList.forEach { + val current = this[it.derivations.first] + if (current != null) { + current.addAll(it.derivations.second) + current.distinct() + } else { + this[it.derivations.first] = it.derivations.second.toMutableList() + } + } + } + if (derivations.isEmpty()) { onSuccess(scanResponse) return @@ -167,10 +178,7 @@ object TokensMiddleware { val wallet = scanResponse.card.wallets.firstOrNull { it.curve == curve } ?: return null val supportedCurves = currency.blockchain.getSupportedCurves() - val path = currency.derivationPath - ?.let { - currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) - } + val path = currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) .takeIf { supportedCurves.contains(curve) } val customPath = currency.derivationPath?.let { diff --git a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt index 34a6d471b2..d03a7956e9 100644 --- a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt @@ -102,7 +102,17 @@ class DerivationManagerImpl( val curve = config.primaryCurve(currency.blockchain) curve?.let { getDerivations(curve, scanResponse, currency) } } - val derivations = derivationDataList.associate { it.derivations } + val derivations = buildMap> { + derivationDataList.forEach { + val current = this[it.derivations.first] + if (current != null) { + current.addAll(it.derivations.second) + current.distinct() + } else { + this[it.derivations.first] = it.derivations.second.toMutableList() + } + } + } if (derivations.isEmpty()) { onSuccess(scanResponse) return @@ -165,10 +175,7 @@ class DerivationManagerImpl( val wallet = scanResponse.card.wallets.firstOrNull { it.curve == curve } ?: return null val supportedCurves = currency.blockchain.getSupportedCurves() - val path = currency.derivationPath - ?.let { - currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) - } + val path = currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) .takeIf { supportedCurves.contains(curve) } val customPath = currency.derivationPath?.let { From 5ca8a65d28bf7d369fe278e6c2b568dae3aa1820 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 21 Sep 2023 12:36:40 +0300 Subject: [PATCH 12/12] Updated on 2026-08-14 --- .../ui/appsettings/AppSettingsFragment.kt | 95 ++++++++++--------- .../ui/appsettings/AppSettingsViewModel.kt | 4 - .../tokens/legacy/redux/TokensMiddleware.kt | 41 ++++---- .../data/card/sdk/DefaultCardSdkProvider.kt | 2 +- gradle/dependencies.toml | 4 +- 5 files changed, 72 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsFragment.kt b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsFragment.kt index 0e0911e303..349a795f23 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsFragment.kt @@ -32,55 +32,56 @@ internal class AppSettingsFragment : ComposeFragment(), StoreSubscriber + state.skipRepeats { oldState, newState -> + oldState.detailsState == newState.detailsState + }.select { it.detailsState } } + } - @Composable - override fun ScreenContent(modifier: Modifier) { - AppSettingsScreen( - modifier = modifier, - state = viewModel.uiState, - onBackClick = { - store.dispatch(DetailsAction.ResetCardSettingsData) - store.dispatch(NavigationAction.PopBackTo()) - }, - ) - } + override fun onResume() { + super.onResume() + viewModel.refreshBiometricsStatus(lifecycleScope) + } - override fun TransitionInflater.inflateTransitions(): Boolean { - enterTransition = inflateTransition(R.transition.fade) - exitTransition = inflateTransition(R.transition.fade) + override fun onStop() { + super.onStop() + store.unsubscribe(this) + } - return true - } - - override fun onStart() { - super.onStart() - store.subscribe(this) { state -> - state.skipRepeats { oldState, newState -> - oldState.detailsState == newState.detailsState - }.select { it.detailsState } - } - } - - override fun onResume() { - super.onResume() - viewModel.refreshBiometricsStatus(lifecycleScope) - } - - override fun onStop() { - super.onStop() - store.unsubscribe(this) - } - - override fun newState(state: DetailsState) { - if (activity == null || view == null) return - viewModel.updateState(state) - } - } \ No newline at end of file + override fun newState(state: DetailsState) { + if (activity == null || view == null) return + viewModel.updateState(state) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsViewModel.kt index c76eaafa65..aaaae0a8d1 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsViewModel.kt @@ -105,10 +105,6 @@ internal class AppSettingsViewModel( onCheckedChange = ::onFlipToHideBalanceToggled, ).let(::add) - itemsFactory.createSelectThemeModeButton(state.selectedThemeMode) { - showThemeModeSelector(state.selectedThemeMode) - }.let(::add) - if (state.darkThemeSwitchEnabled) { itemsFactory.createSelectThemeModeButton(state.selectedThemeMode) { showThemeModeSelector(state.selectedThemeMode) diff --git a/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt b/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt index 791e0f1547..79abcbe9f6 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt @@ -215,9 +215,9 @@ object TokensMiddleware { onSuccess: (ScanResponse) -> Unit, ) { val config = CardConfig.createConfig(scanResponse.card) - val derivationDataList = currencyList.mapNotNull { - config.primaryCurve(blockchain = Blockchain.fromId(it.network.id.value)) - ?.let { curve -> getNewDerivations(curve, scanResponse, currencyList) } + val derivationDataList = currencyList.mapNotNull { currency -> + config.primaryCurve(blockchain = Blockchain.fromId(currency.network.id.value)) + ?.let { curve -> getNewDerivations(curve, scanResponse, currency) } } val derivations = derivationDataList.associate(DerivationData::derivations) if (derivations.isEmpty()) { @@ -257,7 +257,11 @@ object TokensMiddleware { } } - private fun getLegacyDerivations(curve: EllipticCurve, scanResponse: ScanResponse, currency: Currency): DerivationData? { + private fun getLegacyDerivations( + curve: EllipticCurve, + scanResponse: ScanResponse, + currency: Currency, + ): DerivationData? { val wallet = scanResponse.card.wallets.firstOrNull { it.curve == curve } ?: return null val supportedCurves = currency.blockchain.getSupportedCurves() @@ -291,30 +295,27 @@ object TokensMiddleware { private fun getNewDerivations( curve: EllipticCurve, scanResponse: ScanResponse, - currencyList: List, + currency: CryptoCurrency, ): DerivationData? { val wallet = scanResponse.card.wallets.firstOrNull { it.curve == curve } ?: return null - val manageTokensCandidates = currencyList - .map { Blockchain.fromId(it.network.id.value) } - .distinct() - .filter { it.getSupportedCurves().contains(curve) } - .mapNotNull { it.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) } + val blockchain = Blockchain.fromId(currency.network.id.value) + val supportedCurves = blockchain.getSupportedCurves() + val path = blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) + .takeIf { supportedCurves.contains(curve) } - val customTokensCandidates = currencyList - .filter { Blockchain.fromId(it.network.id.value).getSupportedCurves().contains(curve) } - .mapNotNull { it.network.derivationPath.value } - .map(::DerivationPath) + val customPath = currency.network.derivationPath.value?.let { + DerivationPath(it) + }.takeIf { supportedCurves.contains(curve) } - val bothCandidates = (manageTokensCandidates + customTokensCandidates).distinct().toMutableList() + val bothCandidates = listOfNotNull(path, customPath).distinct().toMutableList() if (bothCandidates.isEmpty()) return null - currencyList.find { it is CryptoCurrency.Coin && Blockchain.fromId(it.network.id.value) == Blockchain.Cardano } - ?.let { currency -> - currency.network.derivationPath.value?.let { - bothCandidates.add(CardanoUtils.extendedDerivationPath(DerivationPath(it))) - } + if (currency is CryptoCurrency.Coin && blockchain == Blockchain.Cardano) { + currency.network.derivationPath.value?.let { + bothCandidates.add(CardanoUtils.extendedDerivationPath(DerivationPath(it))) } + } val mapKeyOfWalletPublicKey = wallet.publicKey.toMapKey() val alreadyDerivedKeys: ExtendedPublicKeysMap = diff --git a/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt b/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt index 9c17c4c127..1249de10d7 100644 --- a/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt +++ b/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt @@ -19,7 +19,7 @@ import javax.inject.Singleton internal class DefaultCardSdkProvider @Inject constructor() : CardSdkProvider, CardSdkLifecycleObserver { override val sdk: TangemSdk - get() = requireNotNull(value = _sdk?.get()) { "Impossible to get the TangemSdk when activity is destroyed" } + get() = requireNotNull(value = _sdk) { "Impossible to get the TangemSdk when activity is destroyed" } private var _sdk: TangemSdk? = null diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 7b54e17033..4c97997ed7 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -81,9 +81,9 @@ okHttp-prettyLogging = "3.1.0" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_4.11-349" +tangemBlockchainSdk = "develop-350" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds -tangemCardSdk = "release-app_4.11-295" +tangemCardSdk = "develop-297" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds # endregion Tangem