diff --git a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt index 6db15ac882..cf97ded034 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt @@ -46,6 +46,7 @@ class CardContextInterceptor( ProductType.Twins -> "Twin" ProductType.Wallet -> "Wallet" ProductType.Wallet2 -> "Wallet 2.0" + ProductType.Ring -> "Ring" ProductType.Start2Coin -> "Start2Coin" else -> if (DemoHelper.isDemoCard(scanResponse)) { if (DemoHelper.isTestDemoCard(scanResponse)) { diff --git a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt index 6796da1e72..a16c860685 100644 --- a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt @@ -1,6 +1,7 @@ package com.tangem.tap.domain import android.content.res.Resources +import androidx.annotation.DrawableRes import androidx.annotation.StringRes import com.tangem.Message import com.tangem.TangemSdk @@ -81,12 +82,13 @@ class TangemSdkManager(private val cardSdkConfigRepository: CardSdkConfigReposit suspend fun createProductWallet(scanResponse: ScanResponse): CompletionResult { return runTaskAsync( - CreateProductWalletTask( + runnable = CreateProductWalletTask( cardTypesResolver = scanResponse.cardTypesResolver, derivationStyleProvider = scanResponse.derivationStyleProvider, ), - scanResponse.card.cardId, - Message(resources.getString(R.string.initial_message_create_wallet_body)), + cardId = scanResponse.card.cardId, + initialMessage = Message(resources.getString(R.string.initial_message_create_wallet_body)), + iconScanRes = if (scanResponse.cardTypesResolver.isRing()) R.drawable.img_hand_scan_ring else null, ) } @@ -94,7 +96,7 @@ class TangemSdkManager(private val cardSdkConfigRepository: CardSdkConfigReposit scanResponse: ScanResponse, mnemonic: String, ): CompletionResult { - val mnemonic = try { + val defaultMnemonic = try { DefaultMnemonic(mnemonic, tangemSdk.wordlist) } catch (e: TangemSdkError.MnemonicException) { return CompletionResult.Failure(e) @@ -103,7 +105,7 @@ class TangemSdkManager(private val cardSdkConfigRepository: CardSdkConfigReposit CreateProductWalletTask( scanResponse.cardTypesResolver, derivationStyleProvider = scanResponse.derivationStyleProvider, - mnemonic, + defaultMnemonic, ), scanResponse.card.cardId, Message(resources.getString(R.string.initial_message_create_wallet_body)), @@ -213,9 +215,10 @@ class TangemSdkManager(private val cardSdkConfigRepository: CardSdkConfigReposit cardId: String? = null, initialMessage: Message? = null, accessCode: String? = null, + @DrawableRes iconScanRes: Int? = null, ): CompletionResult = withContext(Dispatchers.Main) { suspendCancellableCoroutine { continuation -> - tangemSdk.startSessionWithRunnable(runnable, cardId, initialMessage, accessCode) { result -> + tangemSdk.startSessionWithRunnable(runnable, cardId, initialMessage, accessCode, iconScanRes) { result -> if (continuation.isActive) continuation.resume(result) } } diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt index b587dee326..ba72ddb543 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt @@ -281,6 +281,9 @@ private class ScanWalletProcessor( } private fun getWalletProductType(card: CardDTO): ProductType { + if (card.batchId == CardDTO.RING_BATCH_ID) { + return ProductType.Ring + } return if (card.firmwareVersion >= FirmwareVersion.Ed25519Slip0010Available) { ProductType.Wallet2 } else { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt index 68a4bb6df8..b27217cca3 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt @@ -54,6 +54,7 @@ object OnboardingHelper { ProductType.Note -> AppScreen.OnboardingNote ProductType.Wallet, ProductType.Wallet2, + ProductType.Ring, -> if (scanResponse.card.settings.isBackupAllowed) { AppScreen.OnboardingWallet } else { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index b255ab3536..ad3f9d9ff2 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -33,6 +33,7 @@ import com.tangem.tap.features.onboarding.OnboardingDialog import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.features.wallet.models.toCurrencies import com.tangem.tap.proxy.redux.DaggerGraphState +import com.tangem.wallet.R import kotlinx.coroutines.launch import org.rekotlin.Action import org.rekotlin.Middleware @@ -325,7 +326,12 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction) } } is BackupAction.ScanPrimaryCard -> { - backupService.readPrimaryCard(cardId = card?.cardId) { result -> + val iconScanRes = if (scanResponse?.cardTypesResolver?.isRing() == true) { + R.drawable.img_hand_scan_ring + } else { + null + } + backupService.readPrimaryCard(iconScanRes = iconScanRes, cardId = card?.cardId) { result -> when (result) { is CompletionResult.Success -> { store.dispatchOnMain(BackupAction.StartAddingBackupCards) @@ -392,7 +398,12 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction) } } is BackupAction.WritePrimaryCard -> { - backupService.proceedBackup { result -> + val iconScanRes = if (scanResponse?.cardTypesResolver?.isRing() == true) { + R.drawable.img_hand_scan_ring + } else { + null + } + backupService.proceedBackup(iconScanRes = iconScanRes) { result -> when (result) { is CompletionResult.Success -> { store.dispatchOnMain(BackupAction.PrepareToWriteBackupCard(1)) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt index 077e4b82aa..1e6dc646b8 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt @@ -1,5 +1,6 @@ package com.tangem.tap.features.onboarding.products.wallet.redux +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.tap.backupService import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction @@ -40,6 +41,7 @@ private object ReducerForGlobalAction { maxBackupCards = MAX_BACKUP_CARDS, canSkipBackup = action.canSkipBackup, ), + isRingOnboarding = action.scanResponse.cardTypesResolver.isRing(), ) } is GlobalAction.Onboarding.StartForUnfinishedBackup -> { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt index cc59a4fb61..e55ecdc885 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt @@ -14,6 +14,7 @@ data class OnboardingWalletState( val backupState: BackupState = BackupState(), val cardArtworkUri: Uri? = null, val showConfetti: Boolean = false, + val isRingOnboarding: Boolean = false, ) : StateType { @Suppress("MagicNumber") diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt index ff40ab5ad6..75d9b4dc87 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt @@ -179,13 +179,21 @@ class OnboardingWalletFragment : seedPhraseStateHandler.newState(this, state, seedPhraseViewModel) state.cardArtworkUri?.let { seedPhraseViewModel.setCardArtworkUri(it.toString()) - loadImageIntoImageView(it, binding.imvFrontCard) + if (state.isRingOnboarding) { + binding.imvFrontCard.load(R.drawable.img_ring_placeholder) + } else { + loadImageIntoImageView(state.cardArtworkUri, binding.imvFrontCard) + } loadImageIntoImageView(it, binding.imvFirstBackupCard) loadImageIntoImageView(it, binding.imvSecondBackupCard) } } else -> { - loadImageIntoImageView(state.cardArtworkUri, binding.imvFrontCard) + if (state.isRingOnboarding) { + binding.imvFrontCard.load(R.drawable.img_ring_placeholder) + } else { + loadImageIntoImageView(state.cardArtworkUri, binding.imvFrontCard) + } loadImageIntoImageView(state.cardArtworkUri, binding.imvFirstBackupCard) loadImageIntoImageView(state.cardArtworkUri, binding.imvSecondBackupCard) handleOnboardingStep(state) diff --git a/app/src/main/res/drawable/img_hand_scan_ring.xml b/app/src/main/res/drawable/img_hand_scan_ring.xml new file mode 100644 index 0000000000..d9fd7d42f1 --- /dev/null +++ b/app/src/main/res/drawable/img_hand_scan_ring.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/img_ring_placeholder.png b/app/src/main/res/drawable/img_ring_placeholder.png new file mode 100644 index 0000000000..b39d9f9f76 Binary files /dev/null and b/app/src/main/res/drawable/img_ring_placeholder.png differ diff --git a/data/card/src/main/java/com/tangem/data/card/DefaultCardSdkConfigRepository.kt b/data/card/src/main/java/com/tangem/data/card/DefaultCardSdkConfigRepository.kt index 4e3b7acdef..a093b24ba0 100644 --- a/data/card/src/main/java/com/tangem/data/card/DefaultCardSdkConfigRepository.kt +++ b/data/card/src/main/java/com/tangem/data/card/DefaultCardSdkConfigRepository.kt @@ -51,6 +51,7 @@ internal class DefaultCardSdkConfigRepository( ProductType.Wallet, ProductType.Wallet2, ProductType.Start2Coin, + ProductType.Ring, -> CardIdDisplayFormat.Full } } diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/CardTypesResolver.kt b/domain/legacy/src/main/java/com/tangem/domain/common/CardTypesResolver.kt index 10d2f401bd..660a5c13dd 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/CardTypesResolver.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/CardTypesResolver.kt @@ -3,6 +3,7 @@ package com.tangem.domain.common import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token +@Suppress("TooManyFunctions") interface CardTypesResolver { fun isTangemNote(): Boolean @@ -13,6 +14,8 @@ interface CardTypesResolver { fun isWallet2(): Boolean + fun isRing(): Boolean + fun isTangemTwins(): Boolean fun isStart2Coin(): Boolean diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/TangemCardTypesResolver.kt b/domain/legacy/src/main/java/com/tangem/domain/common/TangemCardTypesResolver.kt index c3053f87b6..b40ad29612 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/TangemCardTypesResolver.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/TangemCardTypesResolver.kt @@ -12,6 +12,7 @@ import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ProductType import com.tangem.operations.attestation.Attestation +@Suppress("TooManyFunctions") internal class TangemCardTypesResolver( private val card: CardDTO, private val productType: ProductType, @@ -33,6 +34,10 @@ internal class TangemCardTypesResolver( return card.firmwareVersion >= FirmwareVersion.Ed25519Slip0010Available && card.settings.isKeysImportAllowed } + override fun isRing(): Boolean { + return productType == ProductType.Ring + } + override fun isTangemTwins(): Boolean = productType == ProductType.Twins override fun isStart2Coin(): Boolean = card.isStart2Coin diff --git a/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletBuilder.kt b/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletBuilder.kt index b843a98ee2..c3ee686578 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletBuilder.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletBuilder.kt @@ -22,6 +22,7 @@ class UserWalletBuilder( ProductType.Start2Coin -> "Start2Coin" ProductType.Wallet, ProductType.Wallet2, + ProductType.Ring, -> when { card.isBackupNotAllowed -> "Tangem card" cardTypesResolver.isStart2Coin() -> "Start2Coin" diff --git a/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletIdBuilder.kt b/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletIdBuilder.kt index 40ac39de3c..a9fab74fb9 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletIdBuilder.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletIdBuilder.kt @@ -61,6 +61,7 @@ class UserWalletIdBuilder private constructor( ProductType.Note, ProductType.Wallet, ProductType.Wallet2, + ProductType.Ring, ProductType.Start2Coin, -> null }, diff --git a/domain/models/src/main/kotlin/com/tangem/domain/models/scan/CardDTO.kt b/domain/models/src/main/kotlin/com/tangem/domain/models/scan/CardDTO.kt index 1777aa498a..70d822c8cc 100644 --- a/domain/models/src/main/kotlin/com/tangem/domain/models/scan/CardDTO.kt +++ b/domain/models/src/main/kotlin/com/tangem/domain/models/scan/CardDTO.kt @@ -318,4 +318,8 @@ data class CardDTO( } } } + + companion object { + const val RING_BATCH_ID = "AC17" + } } \ No newline at end of file diff --git a/domain/models/src/main/kotlin/com/tangem/domain/models/scan/ScanResponse.kt b/domain/models/src/main/kotlin/com/tangem/domain/models/scan/ScanResponse.kt index 74a552e520..ece295860b 100644 --- a/domain/models/src/main/kotlin/com/tangem/domain/models/scan/ScanResponse.kt +++ b/domain/models/src/main/kotlin/com/tangem/domain/models/scan/ScanResponse.kt @@ -21,5 +21,5 @@ data class ScanResponse( typealias KeyWalletPublicKey = ByteArrayKey enum class ProductType { - Note, Twins, Wallet, Start2Coin, Wallet2 + Note, Twins, Wallet, Start2Coin, Wallet2, Ring } \ No newline at end of file diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 843863953e..c99a8f89b6 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -84,7 +84,7 @@ spr-client = "3.6.2" # region Tangem tangemBlockchainSdk = "release-app_4.11-360" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds -tangemCardSdk = "release-app_4.11-295" +tangemCardSdk = "release-app_4.11-305" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds # endregion Tangem