diff --git a/app/src/androidTest/kotlin/com/tangem/scenarios/BaseScenarios.kt b/app/src/androidTest/kotlin/com/tangem/scenarios/BaseScenarios.kt index 85e746d709..2d11046a5c 100644 --- a/app/src/androidTest/kotlin/com/tangem/scenarios/BaseScenarios.kt +++ b/app/src/androidTest/kotlin/com/tangem/scenarios/BaseScenarios.kt @@ -15,11 +15,10 @@ fun BaseTestCase.scanCard( mockContent: MockContent? = null, isTwinsCard: Boolean = false, ) { - if (productType != null) { - MockProvider.setMocks(productType) - } - if (mockContent != null) { - MockProvider.setMocks(mockContent) + when { + mockContent != null -> MockProvider.setMocks(mockContent) + productType != null -> MockProvider.setMocks(productType) + else -> MockProvider.setMocks(ProductType.Wallet) } step("Click on 'Accept' button") { onDisclaimerScreen { acceptButton.clickWithAssertion() } 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 c70dc421f4..bc15466208 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 @@ -10,6 +10,7 @@ import com.tangem.common.KeyPair import com.tangem.common.SuccessResponse import com.tangem.common.authentication.keystore.DummyKeystoreManager import com.tangem.common.core.CardSessionRunnable +import com.tangem.common.core.TangemSdkError import com.tangem.common.core.UserCodeRequestPolicy import com.tangem.common.extensions.ByteArrayKey import com.tangem.common.services.InMemoryStorage @@ -32,6 +33,8 @@ import com.tangem.sdk.api.TangemSdkManager import com.tangem.sdk.api.visa.VisaCardActivationResponse import com.tangem.sdk.api.visa.VisaCardActivationTaskMode import com.tangem.tap.domain.sdk.mocks.MockProvider +import com.tangem.tap.domain.sdk.mocks.showMockCardPicker +import com.tangem.tap.foregroundActivityObserver @Suppress("TooManyFunctions") class MockTangemSdkManager( @@ -61,6 +64,17 @@ class MockTangemSdkManager( allowsRequestAccessCodeFromRepository: Boolean, shouldCheckIsAlreadyActivated: Boolean, ): CompletionResult { + if (!MockProvider.isPreset) { + val activity = foregroundActivityObserver.foregroundActivity + if (activity != null) { + val selectedMock = showMockCardPicker(activity) + if (selectedMock != null) { + MockProvider.setMocksWithoutPresetFlag(selectedMock) + } else { + return CompletionResult.Failure(TangemSdkError.UserCancelled()) + } + } + } return MockProvider.getScanResponse() } diff --git a/app/src/main/java/com/tangem/tap/domain/sdk/mocks/MockCardPickerDialog.kt b/app/src/main/java/com/tangem/tap/domain/sdk/mocks/MockCardPickerDialog.kt new file mode 100644 index 0000000000..301a9214d2 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/domain/sdk/mocks/MockCardPickerDialog.kt @@ -0,0 +1,33 @@ +package com.tangem.tap.domain.sdk.mocks + +import androidx.appcompat.app.AlertDialog +import com.tangem.wallet.R +import androidx.appcompat.app.AppCompatActivity +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.suspendCancellableCoroutine +import kotlinx.coroutines.withContext +import kotlin.coroutines.resume + +internal suspend fun showMockCardPicker(activity: AppCompatActivity): MockContent? = withContext(Dispatchers.Main) { + suspendCancellableCoroutine { continuation -> + val mocks = MockProvider.availableMocks + val names = mocks.map { it.first }.toTypedArray() + + val dialog = AlertDialog.Builder(activity) + .setTitle(R.string.mock_card_picker_title) + .setItems(names) { _, which -> + if (continuation.isActive) { + continuation.resume(mocks[which].second) + } + } + .setOnCancelListener { + if (continuation.isActive) { + continuation.resume(null) + } + } + .create() + + continuation.invokeOnCancellation { activity.runOnUiThread { dialog.dismiss() } } + dialog.show() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/sdk/mocks/MockProvider.kt b/app/src/main/java/com/tangem/tap/domain/sdk/mocks/MockProvider.kt index 704c10dd50..cc16fe4302 100644 --- a/app/src/main/java/com/tangem/tap/domain/sdk/mocks/MockProvider.kt +++ b/app/src/main/java/com/tangem/tap/domain/sdk/mocks/MockProvider.kt @@ -11,10 +11,32 @@ object MockProvider { private var content: MockContent = getMockContent(ProductType.Wallet) + var isPreset: Boolean = false + private set + private var isEmulatingError: Boolean = false private var emulatedError: TangemError = TangemSdkError.TagLost() + val availableMocks: List> = listOf( + "Wallet" to WalletMockContent, + "Note" to NoteMockContent, + "Twins" to TwinsMockContent, + "Ring" to RingMockContent, + "Wallet 2" to Wallet2MockContent, + "Wallet 2 (No Backup)" to Wallet2NoBackupMockContent, + "Wallet 2 (No Backup, No Wallets)" to Wallet2NoBackupNoWalletsMockContent, + "Wallet 2 (Seed Phrase)" to Wallet2WithSeedPhraseMockContent, + "Shiba" to ShibaMockContent, + "Shiba (No Backup)" to ShibaNoBackupMockContent, + "Shiba (No Backup, No Wallets)" to ShibaNoBackupNoWalletsMockContent, + "Ed25519 Curve" to EdCurveMockContent, + "Secp256k1 Curve" to Secpk1CurveMockContent, + "Backup Wallet" to BackupWalletMockContent, + "Dev Wallet" to DevWalletMockContent, + "Firmware 4.12" to Firmware412MockContent, + ) + fun setEmulateError(error: TangemError? = null) { isEmulatingError = true error?.let { @@ -28,10 +50,16 @@ object MockProvider { fun setMocks(productType: ProductType) { content = getMockContent(productType) + isPreset = true } fun setMocks(mockContent: MockContent) { content = mockContent + isPreset = true + } + + fun setMocksWithoutPresetFlag(mockContent: MockContent) { + content = mockContent } fun getSuccessResponse() = CompletionResult.Success(content.successResponse).orFailure() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 250461aa6b..e1c13baa62 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,5 +2,6 @@ Tangem + Select Mock Card