Updated on 2026-08-14
This commit is contained in:
parent
625277f518
commit
d32b504a80
28 changed files with 400 additions and 155 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
56
app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt
Normal file
56
app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt
Normal 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()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
@ -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()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
98
app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt
Normal file
98
app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt
Normal 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
|
||||||
|
}
|
||||||
|
|
@ -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 }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
package com.tangem.tap
|
||||||
|
|
||||||
|
import dagger.hilt.android.HiltAndroidApp
|
||||||
|
|
||||||
|
@HiltAndroidApp
|
||||||
|
class TangemHiltApplication : TangemApplication()
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue