From 447f1fe279ade02be11c84ba11e3bc7ecbae8258 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 2 Jun 2024 16:19:27 +0800 Subject: [PATCH] Updated on 2026-08-14 --- .../tangem/tap/domain/sdk/TangemSdkManager.kt | 12 +++-- .../sdk/impl/DefaultTangemSdkManager.kt | 17 ++++--- .../domain/sdk/impl/MockTangemSdkManager.kt | 14 ++++-- .../tasks/product/ResetBackupCardTask.kt | 46 +++++++++++++++++++ 4 files changed, 77 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/domain/tasks/product/ResetBackupCardTask.kt diff --git a/app/src/main/java/com/tangem/tap/domain/sdk/TangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/sdk/TangemSdkManager.kt index 7a576f77b7..396b363be7 100644 --- a/app/src/main/java/com/tangem/tap/domain/sdk/TangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/sdk/TangemSdkManager.kt @@ -3,16 +3,20 @@ package com.tangem.tap.domain.sdk import androidx.annotation.DrawableRes import androidx.annotation.StringRes import com.tangem.Message -import com.tangem.common.* +import com.tangem.common.CompletionResult +import com.tangem.common.KeyPair +import com.tangem.common.SuccessResponse import com.tangem.common.authentication.keystore.KeystoreManager -import com.tangem.common.core.* +import com.tangem.common.core.CardSessionRunnable +import com.tangem.common.core.UserCodeRequestPolicy import com.tangem.common.extensions.ByteArrayKey import com.tangem.common.services.secure.SecureStorage import com.tangem.crypto.hdWallet.DerivationPath +import com.tangem.crypto.hdWallet.bip32.ExtendedPublicKey import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.wallets.models.UserWalletId import com.tangem.operations.derivation.DerivationTaskResponse -import com.tangem.crypto.hdWallet.bip32.ExtendedPublicKey import com.tangem.operations.wallet.CreateWalletResponse import com.tangem.tap.domain.tasks.product.CreateProductWalletTaskResponse @@ -64,6 +68,8 @@ interface TangemSdkManager { allowsRequestAccessCodeFromRepository: Boolean, ): CompletionResult + suspend fun resetBackupCard(userWalletId: UserWalletId): CompletionResult + suspend fun saveAccessCode(accessCode: String, cardsIds: Set): CompletionResult suspend fun deleteSavedUserCodes(cardsIds: Set): CompletionResult diff --git a/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt index 3955158fd9..d97f63e0c6 100644 --- a/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt @@ -16,25 +16,23 @@ import com.tangem.core.analytics.Analytics import com.tangem.core.analytics.models.Basic import com.tangem.crypto.bip39.DefaultMnemonic import com.tangem.crypto.hdWallet.DerivationPath +import com.tangem.crypto.hdWallet.bip32.ExtendedPublicKey import com.tangem.domain.card.repository.CardSdkConfigRepository import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.wallets.models.UserWalletId import com.tangem.operations.ScanTask import com.tangem.operations.derivation.DerivationTaskResponse import com.tangem.operations.derivation.DeriveMultipleWalletPublicKeysTask +import com.tangem.operations.derivation.DeriveWalletPublicKeyTask import com.tangem.operations.pins.SetUserCodeCommand import com.tangem.operations.usersetttings.SetUserCodeRecoveryAllowedTask -import com.tangem.crypto.hdWallet.bip32.ExtendedPublicKey -import com.tangem.operations.derivation.DeriveWalletPublicKeyTask import com.tangem.operations.wallet.CreateWalletResponse import com.tangem.tap.derivationsFinder import com.tangem.tap.domain.sdk.TangemSdkManager -import com.tangem.tap.domain.tasks.product.CreateProductWalletTask -import com.tangem.tap.domain.tasks.product.CreateProductWalletTaskResponse -import com.tangem.tap.domain.tasks.product.ResetToFactorySettingsTask -import com.tangem.tap.domain.tasks.product.ScanProductTask +import com.tangem.tap.domain.tasks.product.* import com.tangem.tap.domain.twins.CreateFirstTwinWalletTask import com.tangem.tap.domain.twins.CreateSecondTwinWalletTask import com.tangem.tap.domain.twins.FinalizeTwinTask @@ -172,6 +170,13 @@ class DefaultTangemSdkManager( .map { CardDTO(it) } } + override suspend fun resetBackupCard(userWalletId: UserWalletId): CompletionResult { + return runTaskAsyncReturnOnMain( + runnable = ResetBackupCardTask(userWalletId), + initialMessage = Message(resources.getString(R.string.card_settings_reset_card_to_factory)), + ) + } + override suspend fun saveAccessCode(accessCode: String, cardsIds: Set): CompletionResult { return userCodeRepository.save( cardsIds = cardsIds, diff --git a/app/src/main/java/com/tangem/tap/domain/sdk/impl/MockTangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/sdk/impl/MockTangemSdkManager.kt index e690748bd5..54fdfd0fa8 100644 --- a/app/src/main/java/com/tangem/tap/domain/sdk/impl/MockTangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/sdk/impl/MockTangemSdkManager.kt @@ -4,16 +4,20 @@ import android.content.res.Resources import androidx.annotation.DrawableRes import androidx.annotation.StringRes import com.tangem.Message -import com.tangem.common.* +import com.tangem.common.CompletionResult +import com.tangem.common.KeyPair +import com.tangem.common.SuccessResponse import com.tangem.common.authentication.keystore.DummyKeystoreManager -import com.tangem.common.core.* +import com.tangem.common.core.CardSessionRunnable +import com.tangem.common.core.UserCodeRequestPolicy import com.tangem.common.extensions.ByteArrayKey import com.tangem.common.services.InMemoryStorage import com.tangem.crypto.hdWallet.DerivationPath +import com.tangem.crypto.hdWallet.bip32.ExtendedPublicKey import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.wallets.models.UserWalletId import com.tangem.operations.derivation.DerivationTaskResponse -import com.tangem.crypto.hdWallet.bip32.ExtendedPublicKey import com.tangem.operations.wallet.CreateWalletResponse import com.tangem.tap.domain.sdk.TangemSdkManager import com.tangem.tap.domain.sdk.mocks.MockProvider @@ -83,6 +87,10 @@ class MockTangemSdkManager( return MockProvider.getCardDto() } + override suspend fun resetBackupCard(userWalletId: UserWalletId): CompletionResult { + return CompletionResult.Success(Unit) + } + override suspend fun saveAccessCode(accessCode: String, cardsIds: Set): CompletionResult { return CompletionResult.Success(Unit) } diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/ResetBackupCardTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/ResetBackupCardTask.kt new file mode 100644 index 0000000000..7de7ceb374 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/ResetBackupCardTask.kt @@ -0,0 +1,46 @@ +package com.tangem.tap.domain.tasks.product + +import com.tangem.common.CompletionResult +import com.tangem.common.core.CardSession +import com.tangem.common.core.CardSessionRunnable +import com.tangem.common.core.CompletionCallback +import com.tangem.domain.wallets.models.UserWalletId +import com.tangem.operations.PreflightReadMode +import com.tangem.operations.PreflightReadTask +import com.tangem.tap.domain.tasks.UserWalletIdPreflightReadFilter + +/** + * Task for resetting backup card. + * + * 1. Read card and check if card is corresponding to expected user wallet id. + * 2. Reset card. + * +[REDACTED_AUTHOR] + */ +internal class ResetBackupCardTask( + private val userWalletId: UserWalletId, +) : CardSessionRunnable { + + override val allowsRequestAccessCodeFromRepository: Boolean = false + + override fun run(session: CardSession, callback: CompletionCallback) { + PreflightReadTask( + readMode = PreflightReadMode.FullCardRead, + filter = UserWalletIdPreflightReadFilter(expectedUserWalletId = userWalletId), + ).run(session) { result -> + when (result) { + is CompletionResult.Success -> resetCard(session, callback) + is CompletionResult.Failure -> callback(CompletionResult.Failure(result.error)) + } + } + } + + private fun resetCard(session: CardSession, callback: CompletionCallback) { + ResetToFactorySettingsTask(allowsRequestAccessCodeFromRepository).run(session) { result -> + when (result) { + is CompletionResult.Success -> callback(CompletionResult.Success(Unit)) + is CompletionResult.Failure -> callback(CompletionResult.Failure(result.error)) + } + } + } +} \ No newline at end of file