From 29b63f2e1a5e70a84275b408a7b799850cfd2b02 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 5 Sep 2024 13:52:31 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/tap/common/DialogManager.kt | 5 +++ .../tangem/tap/data/DefaultCardSdkProvider.kt | 3 ++ .../tangem/tap/features/home/HomeViewModel.kt | 4 +- .../home/TangemTangemErrorsHandler.kt | 44 +++++++++++++++++++ .../home/errors/TangemSdkErrorHandler.kt | 8 ++++ .../com/tangem/domain/redux/StateDialog.kt | 2 + gradle/dependencies.toml | 2 +- 7 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/features/home/TangemTangemErrorsHandler.kt create mode 100644 app/src/main/java/com/tangem/tap/features/home/errors/TangemSdkErrorHandler.kt 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 a13d000c44..8bc1f8e7ae 100644 --- a/app/src/main/java/com/tangem/tap/common/DialogManager.kt +++ b/app/src/main/java/com/tangem/tap/common/DialogManager.kt @@ -51,6 +51,11 @@ class DialogManager : StoreSubscriber { source = state.dialog.source, onTryAgain = state.dialog.onTryAgain, ) + is StateDialog.NfcFeatureIsUnavailable -> SimpleAlertDialog.create( + titleRes = R.string.common_error, + messageRes = R.string.nfc_error_unavailable, + context = context, + ) is AppDialog.AddressInfoDialog -> AddressInfoBottomSheetDialog(state.dialog, context) is AppDialog.TestActionsDialog -> TestActionsBottomSheetDialog(state.dialog, context) is AppDialog.RussianCardholdersWarningDialog -> RussianCardholdersWarningBottomSheetDialog( diff --git a/app/src/main/java/com/tangem/tap/data/DefaultCardSdkProvider.kt b/app/src/main/java/com/tangem/tap/data/DefaultCardSdkProvider.kt index 395f26e868..a1751aff85 100644 --- a/app/src/main/java/com/tangem/tap/data/DefaultCardSdkProvider.kt +++ b/app/src/main/java/com/tangem/tap/data/DefaultCardSdkProvider.kt @@ -16,6 +16,7 @@ import com.tangem.data.card.sdk.CardSdkOwner import com.tangem.data.card.sdk.CardSdkProvider import com.tangem.sdk.DefaultSessionViewDelegate import com.tangem.sdk.extensions.* +import com.tangem.sdk.nfc.AndroidNfcAvailabilityProvider import com.tangem.sdk.nfc.NfcManager import com.tangem.sdk.storage.create import com.tangem.tap.foregroundActivityObserver @@ -98,9 +99,11 @@ internal class DefaultCardSdkProvider @Inject constructor( val viewDelegate = DefaultSessionViewDelegate(nfcManager, activity) viewDelegate.sdkConfig = config + val androidNfcAvailabilityProvider = AndroidNfcAvailabilityProvider(activity) val sdk = TangemSdk( reader = nfcManager.reader, viewDelegate = viewDelegate, + nfcAvailabilityProvider = androidNfcAvailabilityProvider, secureStorage = secureStorage, authenticationManager = authenticationManager, keystoreManager = keystoreManager, diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeViewModel.kt b/app/src/main/java/com/tangem/tap/features/home/HomeViewModel.kt index ce18962585..dd335deba7 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeViewModel.kt @@ -47,6 +47,8 @@ internal class HomeViewModel @Inject constructor( private val analyticsEventHandler: AnalyticsEventHandler, ) : ViewModel() { + private val tangemErrorHandler = TangemTangemErrorsHandler(store) + fun onScanClick() { analyticsEventHandler.send(IntroductionProcess.ButtonScanCard()) scanCard() @@ -83,7 +85,7 @@ internal class HomeViewModel @Inject constructor( } }, onFailure = { - Timber.e(it, "Unable to scan card") + tangemErrorHandler.onErrorReceived(error = it) delay(HIDE_PROGRESS_DELAY) store.dispatch(HomeAction.ScanInProgress(scanInProgress = false)) }, diff --git a/app/src/main/java/com/tangem/tap/features/home/TangemTangemErrorsHandler.kt b/app/src/main/java/com/tangem/tap/features/home/TangemTangemErrorsHandler.kt new file mode 100644 index 0000000000..40e51a8de8 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/home/TangemTangemErrorsHandler.kt @@ -0,0 +1,44 @@ +package com.tangem.tap.features.home + +import com.tangem.blockchain.common.BlockchainError +import com.tangem.common.core.TangemError +import com.tangem.common.core.TangemSdkError +import com.tangem.domain.redux.StateDialog +import com.tangem.tap.common.extensions.dispatchOnMain +import com.tangem.tap.common.redux.AppState +import com.tangem.tap.common.redux.global.GlobalAction +import com.tangem.tap.features.home.errors.TangemSdkErrorHandler +import org.rekotlin.Store +import timber.log.Timber + +class TangemTangemErrorsHandler(val store: Store) : TangemSdkErrorHandler { + + override fun onErrorReceived(error: TangemError) { + when (error) { + is TangemSdkError -> { + handleCardSdkError(error) + } + is BlockchainError -> { + handleBlockchainSdkError(error) + } + else -> { + Timber.e("Error happened", error) + } + } + } + + private fun handleCardSdkError(error: TangemSdkError) { + when (error) { + is TangemSdkError.NfcFeatureIsUnavailable -> { + store.dispatchOnMain(GlobalAction.ShowDialog(StateDialog.NfcFeatureIsUnavailable)) + } + else -> { + Timber.e(error, "Unable to scan card") + } + } + } + + private fun handleBlockchainSdkError(error: TangemError) { + Timber.e("Sdk error happened", error) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/home/errors/TangemSdkErrorHandler.kt b/app/src/main/java/com/tangem/tap/features/home/errors/TangemSdkErrorHandler.kt new file mode 100644 index 0000000000..7946b7ec5e --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/home/errors/TangemSdkErrorHandler.kt @@ -0,0 +1,8 @@ +package com.tangem.tap.features.home.errors + +import com.tangem.common.core.TangemError + +interface TangemSdkErrorHandler { + + fun onErrorReceived(error: TangemError) +} \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/redux/StateDialog.kt b/domain/legacy/src/main/java/com/tangem/domain/redux/StateDialog.kt index e4beb677bd..120604ae39 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/redux/StateDialog.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/redux/StateDialog.kt @@ -2,6 +2,8 @@ package com.tangem.domain.redux interface StateDialog { + data object NfcFeatureIsUnavailable : StateDialog + data class ScanFailsDialog(val source: ScanFailsSource, val onTryAgain: (() -> Unit)? = null) : StateDialog enum class ScanFailsSource { diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index f6d9a1fde9..7872a1cb27 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -91,7 +91,7 @@ markdownComposeView = "0.5.4" # region Tangem tangemBlockchainSdk = "develop-762" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds -tangemCardSdk = "develop-380" +tangemCardSdk = "develop-381" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ tangemVico = "2.0.0-alpha.25-tangem16" #tangemVico = "0.0.1" # Keep it! - used for local builds ^