Updated on 2026-08-14

This commit is contained in:
Tangem 2024-04-12 08:59:52 +02:00
parent 625277f518
commit d32b504a80
28 changed files with 400 additions and 155 deletions

View file

@ -215,6 +215,8 @@ dependencies {
androidTestImplementation(deps.test.kaspresso.compose) androidTestImplementation(deps.test.kaspresso.compose)
androidTestImplementation(deps.test.compose.junit) androidTestImplementation(deps.test.compose.junit)
androidTestImplementation(deps.test.hamcrest) androidTestImplementation(deps.test.hamcrest)
androidTestImplementation(deps.test.hilt)
kaptAndroidTest(deps.test.hilt.compiler)
/** Chucker */ /** Chucker */
debugImplementation(deps.chucker) debugImplementation(deps.chucker)

View file

@ -0,0 +1,28 @@
package com.tangem.common
import androidx.test.core.app.ApplicationProvider
import com.tangem.tap.ApplicationEntryPoint
import com.tangem.tap.TangemApplication
import dagger.hilt.android.testing.OnComponentReadyRunner
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement
class ApplicationInjectionExecutionRule : TestRule {
private val tangemApplication: TangemApplication
get() = ApplicationProvider.getApplicationContext()
override fun apply(base: Statement, description: Description): Statement {
return object : Statement() {
override fun evaluate() {
OnComponentReadyRunner.addListener(
tangemApplication, ApplicationEntryPoint::class.java
) { _: ApplicationEntryPoint ->
tangemApplication.init()
}
base.evaluate()
}
}
}
}

View file

@ -0,0 +1,56 @@
package com.tangem.common
import android.Manifest
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.test.espresso.intent.Intents
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.GrantPermissionRule
import com.kaspersky.components.composesupport.config.withComposeSupport
import com.kaspersky.kaspresso.kaspresso.Kaspresso
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
import com.tangem.tap.MainActivity
import com.tangem.tap.domain.sdk.TangemSdkManager
import dagger.hilt.android.testing.HiltAndroidRule
import org.junit.Rule
import org.junit.rules.RuleChain
import org.junit.runner.RunWith
import javax.inject.Inject
@RunWith(AndroidJUnit4::class)
abstract class BaseTestCase : TestCase(
kaspressoBuilder = Kaspresso.Builder.withComposeSupport()
) {
@Inject
lateinit var tangemSdkManager: TangemSdkManager
@get:Rule
open val composeTestRule = createAndroidComposeRule<MainActivity>()
@get:Rule
val grantPermissionRule: GrantPermissionRule = GrantPermissionRule.grant(
Manifest.permission.POST_NOTIFICATIONS,
Manifest.permission.CAMERA
)
private val hiltRule = HiltAndroidRule(this)
@Rule
@JvmField
val ruleChain = RuleChain
.outerRule(hiltRule)
.around(ApplicationInjectionExecutionRule())
protected fun setupHooks(
additionalBeforeSection: () -> Unit = {},
additionalAfterSection: () -> Unit = {},
) = before {
hiltRule.inject()
Intents.init()
additionalBeforeSection()
}.after {
additionalAfterSection()
Intents.release()
}
}

View file

@ -0,0 +1,17 @@
package com.tangem.common
import android.app.Application
import android.content.Context
import androidx.test.runner.AndroidJUnitRunner
import com.tangem.common.di.TangemMockedApplication_Application
class HiltTestRunner : AndroidJUnitRunner() {
override fun newApplication(
cl: ClassLoader?,
className: String?,
context: Context?
): Application {
return super.newApplication(cl, TangemMockedApplication_Application::class.java.name, context)
}
}

View file

@ -0,0 +1,11 @@
package com.tangem.common
import com.tangem.tap.TangemApplication
open class TangemEmptyApplication : TangemApplication() {
override fun onCreate() {
// super.onCreate() is not called intentionally
}
}

View file

@ -0,0 +1,7 @@
package com.tangem.common.di
import com.tangem.common.TangemEmptyApplication
import dagger.hilt.android.testing.CustomTestApplication
@CustomTestApplication(TangemEmptyApplication::class)
internal class TangemMockedApplication

View file

@ -0,0 +1,28 @@
package com.tangem.common.di
import android.content.Context
import com.tangem.tap.di.TangemSdkManagerModule
import com.tangem.tap.domain.sdk.impl.MockTangemSdkManager
import com.tangem.tap.domain.sdk.TangemSdkManager
import dagger.Module
import dagger.Provides
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import dagger.hilt.testing.TestInstallIn
import javax.inject.Singleton
@Module
@TestInstallIn(
components = [SingletonComponent::class],
replaces = [TangemSdkManagerModule::class]
)
object TestModule {
@Provides
@Singleton
fun provideTangemSdkManager(
@ApplicationContext context: Context
): TangemSdkManager {
return MockTangemSdkManager(resources = context.resources)
}
}

View file

@ -1,27 +0,0 @@
package com.tangem.helpers.base
import android.Manifest
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.GrantPermissionRule
import com.kaspersky.components.composesupport.config.withComposeSupport
import com.kaspersky.kaspresso.kaspresso.Kaspresso
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
import com.tangem.tap.MainActivity
import org.junit.Rule
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
open class BaseAutoTestCase : TestCase(
kaspressoBuilder = Kaspresso.Builder.withComposeSupport()
) {
@get:Rule
open val composeTestRule = createAndroidComposeRule<MainActivity>()
@get: Rule
val grantPermissionRule: GrantPermissionRule = GrantPermissionRule.grant(
Manifest.permission.POST_NOTIFICATIONS,
Manifest.permission.CAMERA
)
}

View file

@ -1,45 +1,43 @@
package com.tangem.tests package com.tangem.tests
import android.content.Intent.ACTION_VIEW import android.content.Intent.ACTION_VIEW
import androidx.test.espresso.intent.Intents import com.tangem.common.BaseTestCase
import com.tangem.helpers.base.BaseAutoTestCase
import com.tangem.screens.StoriesScreen import com.tangem.screens.StoriesScreen
import com.tangem.tap.features.home.redux.HomeMiddleware.NEW_BUY_WALLET_URL import com.tangem.tap.features.home.redux.HomeMiddleware.NEW_BUY_WALLET_URL
import dagger.hilt.android.testing.HiltAndroidTest
import io.github.kakaocup.compose.node.element.ComposeScreen import io.github.kakaocup.compose.node.element.ComposeScreen
import io.github.kakaocup.kakao.intent.KIntent import io.github.kakaocup.kakao.intent.KIntent
import org.junit.Test import org.junit.Test
class StoriesTest : BaseAutoTestCase() { @HiltAndroidTest
class StoriesTest : BaseTestCase() {
@Test @Test
fun clickOnButtons() = before { fun clickOnButtons() =
Intents.init() setupHooks().run {
}.after { ComposeScreen.onComposeScreen<StoriesScreen>(composeTestRule) {
Intents.release() step("Click on \"Scan\" button") {
}.run { scanButton {
ComposeScreen.onComposeScreen<StoriesScreen>(composeTestRule) { assertIsDisplayed()
step("Click on \"Scan\" button") { performClick()
scanButton { }
assertIsDisplayed()
performClick()
} }
} step("Assert: \"Scan card\" popup opened") {
step("Assert: \"Scan card\" popup opened") { enableNFCAlert.isDisplayed()
enableNFCAlert.isDisplayed() cancelButton.click()
cancelButton.click() device.uiDevice.pressBack()
device.uiDevice.pressBack() }
} step("Click on \"Order\" button") {
step("Click on \"Order\" button") { orderButton.performClick()
orderButton.performClick() }
} step("Assert: browser opened") {
step("Assert: browser opened") { val expectedIntent = KIntent {
val expectedIntent = KIntent { hasAction(ACTION_VIEW)
hasAction(ACTION_VIEW) hasData(NEW_BUY_WALLET_URL)
hasData(NEW_BUY_WALLET_URL) }
expectedIntent.intended()
device.uiDevice.pressBack()
} }
expectedIntent.intended()
device.uiDevice.pressBack()
} }
} }
}
} }

View file

@ -36,7 +36,7 @@
</queries> </queries>
<application <application
android:name="com.tangem.tap.TapApplication" android:name="com.tangem.tap.TangemHiltApplication"
android:allowBackup="false" android:allowBackup="false"
android:fullBackupContent="false" android:fullBackupContent="false"
android:hardwareAccelerated="true" android:hardwareAccelerated="true"

View file

@ -0,0 +1,98 @@
package com.tangem.tap
import com.tangem.TangemSdkLogger
import com.tangem.blockchainsdk.BlockchainSDKFactory
import com.tangem.core.analytics.filter.OneTimeEventFilter
import com.tangem.core.featuretoggle.manager.FeatureTogglesManager
import com.tangem.datasource.asset.AssetReader
import com.tangem.datasource.config.ConfigManager
import com.tangem.datasource.connection.NetworkConnectionManager
import com.tangem.datasource.local.token.UserTokensStore
import com.tangem.domain.appcurrency.repository.AppCurrencyRepository
import com.tangem.domain.apptheme.GetAppThemeModeUseCase
import com.tangem.domain.apptheme.repository.AppThemeModeRepository
import com.tangem.domain.balancehiding.repositories.BalanceHidingRepository
import com.tangem.domain.card.ScanCardProcessor
import com.tangem.domain.card.repository.CardRepository
import com.tangem.domain.feedback.FeedbackManagerFeatureToggles
import com.tangem.domain.onboarding.SaveTwinsOnboardingShownUseCase
import com.tangem.domain.onboarding.WasTwinsOnboardingShownUseCase
import com.tangem.domain.settings.repositories.SettingsRepository
import com.tangem.domain.tokens.repository.CurrenciesRepository
import com.tangem.domain.tokens.repository.NetworksRepository
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.repository.WalletsRepository
import com.tangem.features.managetokens.featuretoggles.ManageTokensFeatureToggles
import com.tangem.features.send.api.featuretoggles.SendFeatureToggles
import com.tangem.tap.domain.walletconnect2.domain.WalletConnectSessionsRepository
import com.tangem.tap.features.customtoken.api.featuretoggles.CustomTokenFeatureToggles
import com.tangem.tap.domain.walletconnect2.domain.WalletConnectRepository as WalletConnect2Repository
import com.tangem.tap.proxy.AppStateHolder
import dagger.hilt.EntryPoint
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
@EntryPoint
@InstallIn(SingletonComponent::class)
@Suppress("TooManyFunctions")
interface ApplicationEntryPoint {
fun getConfigManager(): ConfigManager
fun getAppStateHolder(): AppStateHolder
fun getAssetReader(): AssetReader
fun getFeatureTogglesManager(): FeatureTogglesManager
fun getNetworkConnectionManager(): NetworkConnectionManager
fun getCustomTokenFeatureToggles(): CustomTokenFeatureToggles
fun getWalletConnect2Repository(): WalletConnect2Repository
fun getWalletConnectSessionsRepository(): WalletConnectSessionsRepository
fun getManageTokensFeatureToggles(): ManageTokensFeatureToggles
fun getScanCardProcessor(): ScanCardProcessor
fun getAppCurrencyRepository(): AppCurrencyRepository
fun getWalletManagersFacade(): WalletManagersFacade
fun getNetworksRepository(): NetworksRepository
fun getCurrenciesRepository(): CurrenciesRepository
fun getAppThemeModeRepository(): AppThemeModeRepository
fun getBalanceHidingRepository(): BalanceHidingRepository
fun getUserTokensStore(): UserTokensStore
fun getGetAppThemeModeUseCase(): GetAppThemeModeUseCase
fun getWalletsRepository(): WalletsRepository
fun getSendFeatureToggles(): SendFeatureToggles
fun getOneTimeEventFilter(): OneTimeEventFilter
fun getGeneralUserWalletsListManager(): UserWalletsListManager
fun getWasTwinsOnboardingShownUseCase(): WasTwinsOnboardingShownUseCase
fun getSaveTwinsOnboardingShownUseCase(): SaveTwinsOnboardingShownUseCase
fun getCardRepository(): CardRepository
fun getFeedbackManagerFeatureToggles(): FeedbackManagerFeatureToggles
fun getTangemSdkLogger(): TangemSdkLogger
fun getSettingsRepository(): SettingsRepository
fun getBlockchainSDKFactory(): BlockchainSDKFactory
}

View file

@ -52,7 +52,7 @@ import com.tangem.tap.common.OnActivityResultCallback
import com.tangem.tap.common.SnackbarHandler import com.tangem.tap.common.SnackbarHandler
import com.tangem.tap.common.apptheme.MutableAppThemeModeHolder import com.tangem.tap.common.apptheme.MutableAppThemeModeHolder
import com.tangem.tap.common.redux.NotificationsHandler import com.tangem.tap.common.redux.NotificationsHandler
import com.tangem.tap.domain.TangemSdkManager import com.tangem.tap.domain.sdk.TangemSdkManager
import com.tangem.tap.domain.walletconnect2.domain.WalletConnectInteractor import com.tangem.tap.domain.walletconnect2.domain.WalletConnectInteractor
import com.tangem.tap.features.intentHandler.IntentProcessor import com.tangem.tap.features.intentHandler.IntentProcessor
import com.tangem.tap.features.intentHandler.handlers.BackgroundScanIntentHandler import com.tangem.tap.features.intentHandler.handlers.BackgroundScanIntentHandler
@ -249,9 +249,9 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac
} }
private fun createAppThemeModeFlow(): SharedFlow<AppThemeMode?> { private fun createAppThemeModeFlow(): SharedFlow<AppThemeMode?> {
val tapApplication = application as TapApplication val tangemApplication = application as TangemApplication
return tapApplication.getAppThemeModeUseCase() return tangemApplication.getAppThemeModeUseCase()
.map { maybeMode -> .map { maybeMode ->
maybeMode.getOrElse { AppThemeMode.DEFAULT } maybeMode.getOrElse { AppThemeMode.DEFAULT }
} }

View file

@ -64,11 +64,10 @@ import com.tangem.tap.proxy.AppStateHolder
import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.proxy.redux.DaggerGraphState
import com.tangem.utils.coroutines.AppCoroutineDispatcherProvider import com.tangem.utils.coroutines.AppCoroutineDispatcherProvider
import com.tangem.wallet.BuildConfig import com.tangem.wallet.BuildConfig
import dagger.hilt.android.HiltAndroidApp import dagger.hilt.EntryPoints
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.*
import org.rekotlin.Store import org.rekotlin.Store
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject
import com.tangem.tap.domain.walletconnect2.domain.WalletConnectRepository as WalletConnect2Repository import com.tangem.tap.domain.walletconnect2.domain.WalletConnectRepository as WalletConnect2Repository
lateinit var store: Store<AppState> lateinit var store: Store<AppState>
@ -77,101 +76,105 @@ lateinit var foregroundActivityObserver: ForegroundActivityObserver
lateinit var activityResultCaller: ActivityResultCaller lateinit var activityResultCaller: ActivityResultCaller
internal lateinit var derivationsFinder: DerivationsFinder internal lateinit var derivationsFinder: DerivationsFinder
@HiltAndroidApp abstract class TangemApplication : Application(), ImageLoaderFactory {
internal class TapApplication : Application(), ImageLoaderFactory {
// region Injected private val entryPoint: ApplicationEntryPoint
@Inject get() = EntryPoints.get(this, ApplicationEntryPoint::class.java)
lateinit var appStateHolder: AppStateHolder
@Inject private val appStateHolder: AppStateHolder
lateinit var configManager: ConfigManager get() = entryPoint.getAppStateHolder()
@Inject private val configManager: ConfigManager
lateinit var assetReader: AssetReader get() = entryPoint.getConfigManager()
@Inject private val assetReader: AssetReader
lateinit var featureTogglesManager: FeatureTogglesManager get() = entryPoint.getAssetReader()
@Inject private val featureTogglesManager: FeatureTogglesManager
lateinit var networkConnectionManager: NetworkConnectionManager get() = entryPoint.getFeatureTogglesManager()
@Inject private val networkConnectionManager: NetworkConnectionManager
lateinit var customTokenFeatureToggles: CustomTokenFeatureToggles get() = entryPoint.getNetworkConnectionManager()
@Inject private val customTokenFeatureToggles: CustomTokenFeatureToggles
lateinit var walletConnect2Repository: WalletConnect2Repository get() = entryPoint.getCustomTokenFeatureToggles()
@Inject private val walletConnect2Repository: WalletConnect2Repository
lateinit var walletConnectSessionsRepository: WalletConnectSessionsRepository get() = entryPoint.getWalletConnect2Repository()
@Inject private val walletConnectSessionsRepository: WalletConnectSessionsRepository
lateinit var manageTokensFeatureToggles: ManageTokensFeatureToggles get() = entryPoint.getWalletConnectSessionsRepository()
@Inject private val manageTokensFeatureToggles: ManageTokensFeatureToggles
lateinit var scanCardProcessor: ScanCardProcessor get() = entryPoint.getManageTokensFeatureToggles()
@Inject private val scanCardProcessor: ScanCardProcessor
lateinit var appCurrencyRepository: AppCurrencyRepository get() = entryPoint.getScanCardProcessor()
@Inject private val appCurrencyRepository: AppCurrencyRepository
lateinit var walletManagersFacade: WalletManagersFacade get() = entryPoint.getAppCurrencyRepository()
@Inject private val walletManagersFacade: WalletManagersFacade
lateinit var networksRepository: NetworksRepository get() = entryPoint.getWalletManagersFacade()
@Inject private val networksRepository: NetworksRepository
lateinit var currenciesRepository: CurrenciesRepository get() = entryPoint.getNetworksRepository()
@Inject private val currenciesRepository: CurrenciesRepository
lateinit var appThemeModeRepository: AppThemeModeRepository get() = entryPoint.getCurrenciesRepository()
@Inject private val appThemeModeRepository: AppThemeModeRepository
lateinit var balanceHidingRepository: BalanceHidingRepository get() = entryPoint.getAppThemeModeRepository()
@Inject private val balanceHidingRepository: BalanceHidingRepository
lateinit var userTokensStore: UserTokensStore get() = entryPoint.getBalanceHidingRepository()
@Inject private val userTokensStore: UserTokensStore
lateinit var getAppThemeModeUseCase: GetAppThemeModeUseCase get() = entryPoint.getUserTokensStore()
@Inject val getAppThemeModeUseCase: GetAppThemeModeUseCase
lateinit var walletsRepository: WalletsRepository get() = entryPoint.getGetAppThemeModeUseCase()
@Inject private val walletsRepository: WalletsRepository
lateinit var sendFeatureToggles: SendFeatureToggles get() = entryPoint.getWalletsRepository()
@Inject private val sendFeatureToggles: SendFeatureToggles
lateinit var oneTimeEventFilter: OneTimeEventFilter get() = entryPoint.getSendFeatureToggles()
@Inject private val oneTimeEventFilter: OneTimeEventFilter
lateinit var generalUserWalletsListManager: UserWalletsListManager get() = entryPoint.getOneTimeEventFilter()
@Inject private val generalUserWalletsListManager: UserWalletsListManager
lateinit var wasTwinsOnboardingShownUseCase: WasTwinsOnboardingShownUseCase get() = entryPoint.getGeneralUserWalletsListManager()
@Inject private val wasTwinsOnboardingShownUseCase: WasTwinsOnboardingShownUseCase
lateinit var saveTwinsOnboardingShownUseCase: SaveTwinsOnboardingShownUseCase get() = entryPoint.getWasTwinsOnboardingShownUseCase()
@Inject private val saveTwinsOnboardingShownUseCase: SaveTwinsOnboardingShownUseCase
lateinit var cardRepository: CardRepository get() = entryPoint.getSaveTwinsOnboardingShownUseCase()
@Inject private val cardRepository: CardRepository
lateinit var feedbackManagerFeatureToggles: FeedbackManagerFeatureToggles get() = entryPoint.getCardRepository()
@Inject private val feedbackManagerFeatureToggles: FeedbackManagerFeatureToggles
lateinit var tangemSdkLogger: TangemSdkLogger get() = entryPoint.getFeedbackManagerFeatureToggles()
@Inject private val tangemSdkLogger: TangemSdkLogger
lateinit var settingsRepository: SettingsRepository get() = entryPoint.getTangemSdkLogger()
@Inject private val settingsRepository: SettingsRepository
lateinit var blockchainSDKFactory: BlockchainSDKFactory get() = entryPoint.getSettingsRepository()
// endregion Injected
private val blockchainSDKFactory: BlockchainSDKFactory
get() = entryPoint.getBlockchainSDKFactory()
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
init()
}
fun init() {
store = createReduxStore() store = createReduxStore()
if (BuildConfig.LOG_ENABLED) { if (BuildConfig.LOG_ENABLED) {

View file

@ -0,0 +1,6 @@
package com.tangem.tap
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class TangemHiltApplication : TangemApplication()

View file

@ -1,20 +1,15 @@
package com.tangem.tap.di package com.tangem.tap.di
import android.content.Context
import com.tangem.domain.card.BuildConfig
import com.tangem.domain.card.ScanCardUseCase import com.tangem.domain.card.ScanCardUseCase
import com.tangem.domain.card.repository.CardSdkConfigRepository import com.tangem.domain.card.repository.CardSdkConfigRepository
import com.tangem.domain.exchange.RampStateManager import com.tangem.domain.exchange.RampStateManager
import com.tangem.tap.domain.DefaultTangemSdkManager import com.tangem.tap.domain.sdk.TangemSdkManager
import com.tangem.tap.domain.MockTangemSdkManager
import com.tangem.tap.domain.TangemSdkManager
import com.tangem.tap.domain.scanCard.repository.DefaultScanCardRepository import com.tangem.tap.domain.scanCard.repository.DefaultScanCardRepository
import com.tangem.tap.network.exchangeServices.DefaultRampManager import com.tangem.tap.network.exchangeServices.DefaultRampManager
import com.tangem.tap.proxy.AppStateHolder import com.tangem.tap.proxy.AppStateHolder
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -25,19 +20,6 @@ import javax.inject.Singleton
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)
internal object ActivityModule { internal object ActivityModule {
@Provides
@Singleton
fun provideTangemSdkManager(
@ApplicationContext context: Context,
cardSdkConfigRepository: CardSdkConfigRepository,
): TangemSdkManager {
return if (BuildConfig.MOCK_DATA_SOURCE) {
MockTangemSdkManager(resources = context.resources)
} else {
DefaultTangemSdkManager(cardSdkConfigRepository = cardSdkConfigRepository, resources = context.resources)
}
}
@Provides @Provides
@Singleton @Singleton
fun provideScanCardUseCase( fun provideScanCardUseCase(

View file

@ -0,0 +1,32 @@
package com.tangem.tap.di
import android.content.Context
import com.tangem.domain.card.BuildConfig
import com.tangem.domain.card.repository.CardSdkConfigRepository
import com.tangem.tap.domain.sdk.impl.DefaultTangemSdkManager
import com.tangem.tap.domain.sdk.impl.MockTangemSdkManager
import com.tangem.tap.domain.sdk.TangemSdkManager
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
class TangemSdkManagerModule {
@Provides
@Singleton
fun provideTangemSdkManager(
@ApplicationContext context: Context,
cardSdkConfigRepository: CardSdkConfigRepository,
): TangemSdkManager {
return if (BuildConfig.MOCK_DATA_SOURCE) {
MockTangemSdkManager(resources = context.resources)
} else {
DefaultTangemSdkManager(cardSdkConfigRepository = cardSdkConfigRepository, resources = context.resources)
}
}
}

View file

@ -2,7 +2,7 @@ package com.tangem.tap.di.data
import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.card.repository.DerivationsRepository import com.tangem.domain.card.repository.DerivationsRepository
import com.tangem.tap.domain.TangemSdkManager import com.tangem.tap.domain.sdk.TangemSdkManager
import com.tangem.tap.domain.card.DefaultDerivationsRepository import com.tangem.tap.domain.card.DefaultDerivationsRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Module import dagger.Module

View file

@ -9,7 +9,7 @@ import com.tangem.domain.settings.*
import com.tangem.domain.settings.repositories.AppRatingRepository import com.tangem.domain.settings.repositories.AppRatingRepository
import com.tangem.domain.settings.repositories.SettingsRepository import com.tangem.domain.settings.repositories.SettingsRepository
import com.tangem.domain.settings.repositories.SwapPromoRepository import com.tangem.domain.settings.repositories.SwapPromoRepository
import com.tangem.tap.domain.TangemSdkManager import com.tangem.tap.domain.sdk.TangemSdkManager
import com.tangem.tap.domain.settings.DefaultLegacySettingsRepository import com.tangem.tap.domain.settings.DefaultLegacySettingsRepository
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides

View file

@ -13,7 +13,7 @@ import com.tangem.domain.userwallets.UserWalletIdBuilder
import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.operations.derivation.ExtendedPublicKeysMap import com.tangem.operations.derivation.ExtendedPublicKeysMap
import com.tangem.tap.domain.TangemSdkManager import com.tangem.tap.domain.sdk.TangemSdkManager
import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.runCatching import com.tangem.utils.coroutines.runCatching
import timber.log.Timber import timber.log.Timber

View file

@ -3,7 +3,7 @@ package com.tangem.tap.domain.scanCard.repository
import com.tangem.common.CompletionResult import com.tangem.common.CompletionResult
import com.tangem.domain.card.repository.ScanCardRepository import com.tangem.domain.card.repository.ScanCardRepository
import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.models.scan.ScanResponse
import com.tangem.tap.domain.TangemSdkManager import com.tangem.tap.domain.sdk.TangemSdkManager
import com.tangem.tap.domain.scanCard.utils.ScanCardExceptionConverter import com.tangem.tap.domain.scanCard.utils.ScanCardExceptionConverter
// TODO: Move to the :data:card module // TODO: Move to the :data:card module

View file

@ -1,4 +1,4 @@
package com.tangem.tap.domain package com.tangem.tap.domain.sdk
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import androidx.annotation.StringRes import androidx.annotation.StringRes

View file

@ -1,4 +1,4 @@
package com.tangem.tap.domain package com.tangem.tap.domain.sdk.impl
import android.content.res.Resources import android.content.res.Resources
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
@ -29,6 +29,7 @@ import com.tangem.operations.usersetttings.SetUserCodeRecoveryAllowedTask
import com.tangem.crypto.hdWallet.bip32.ExtendedPublicKey import com.tangem.crypto.hdWallet.bip32.ExtendedPublicKey
import com.tangem.operations.derivation.DeriveWalletPublicKeyTask import com.tangem.operations.derivation.DeriveWalletPublicKeyTask
import com.tangem.tap.derivationsFinder 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.CreateProductWalletTask
import com.tangem.tap.domain.tasks.product.CreateProductWalletTaskResponse import com.tangem.tap.domain.tasks.product.CreateProductWalletTaskResponse
import com.tangem.tap.domain.tasks.product.ResetToFactorySettingsTask import com.tangem.tap.domain.tasks.product.ResetToFactorySettingsTask

View file

@ -1,4 +1,4 @@
package com.tangem.tap.domain package com.tangem.tap.domain.sdk.impl
import android.content.res.Resources import android.content.res.Resources
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
@ -14,6 +14,7 @@ import com.tangem.domain.models.scan.CardDTO
import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.models.scan.ScanResponse
import com.tangem.operations.derivation.DerivationTaskResponse import com.tangem.operations.derivation.DerivationTaskResponse
import com.tangem.crypto.hdWallet.bip32.ExtendedPublicKey import com.tangem.crypto.hdWallet.bip32.ExtendedPublicKey
import com.tangem.tap.domain.sdk.TangemSdkManager
import com.tangem.tap.domain.tasks.product.CreateProductWalletTaskResponse import com.tangem.tap.domain.tasks.product.CreateProductWalletTaskResponse
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext

View file

@ -1,7 +1,7 @@
package com.tangem.tap.domain.settings package com.tangem.tap.domain.settings
import com.tangem.domain.settings.repositories.LegacySettingsRepository import com.tangem.domain.settings.repositories.LegacySettingsRepository
import com.tangem.tap.domain.TangemSdkManager import com.tangem.tap.domain.sdk.TangemSdkManager
internal class DefaultLegacySettingsRepository( internal class DefaultLegacySettingsRepository(
private val tangemSdkManager: TangemSdkManager, private val tangemSdkManager: TangemSdkManager,

View file

@ -13,7 +13,7 @@ import com.tangem.tap.common.extensions.dispatchOnMain
import com.tangem.tap.common.extensions.dispatchWithMain import com.tangem.tap.common.extensions.dispatchWithMain
import com.tangem.tap.common.extensions.onUserWalletSelected import com.tangem.tap.common.extensions.onUserWalletSelected
import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.AppState
import com.tangem.tap.domain.TangemSdkManager import com.tangem.tap.domain.sdk.TangemSdkManager
import com.tangem.tap.network.exchangeServices.ExchangeService import com.tangem.tap.network.exchangeServices.ExchangeService
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow

View file

@ -10,7 +10,7 @@ import com.tangem.domain.common.configs.MultiWalletCardConfig
import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.operations.derivation.DerivationTaskResponse import com.tangem.operations.derivation.DerivationTaskResponse
import com.tangem.tap.domain.DefaultTangemSdkManager import com.tangem.tap.domain.sdk.impl.DefaultTangemSdkManager
import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider
import io.mockk.* import io.mockk.*
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest

View file

@ -197,6 +197,8 @@ test-kaspresso = { module = "com.kaspersky.android-components:kaspresso", versio
test-kaspresso-compose = { module = "com.kaspersky.android-components:kaspresso-compose-support", version.ref = "kaspresso-compose"} test-kaspresso-compose = { module = "com.kaspersky.android-components:kaspresso-compose-support", version.ref = "kaspresso-compose"}
test-compose-junit = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "compose-junit" } test-compose-junit = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "compose-junit" }
test-hamcrest = { module = "org.hamcrest:hamcrest", version.ref = "hamcrest" } test-hamcrest = { module = "org.hamcrest:hamcrest", version.ref = "hamcrest" }
test-hilt = { module = "com.google.dagger:hilt-android-testing", version.ref = "hilt" }
test-hilt-compiler = { module = "com.google.dagger:hilt-android-compiler", version.ref = "hilt" }
# endregion Test # endregion Test
# region Other # region Other

View file

@ -37,7 +37,7 @@ private fun AppExtension.configureDefaultConfig(project: Project) {
buildFeatures.buildConfig = true buildFeatures.buildConfig = true
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "com.tangem.common.HiltTestRunner"
} }
} }