From dca991651ce0b544952e993f67bb8a9fa47deda1 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 20 Nov 2022 15:07:49 +0300 Subject: [PATCH] Updated on 2026-08-14 --- app/build.gradle.kts | 12 +++++- .../com/tangem/tap/proxy/AppStateHolder.kt | 11 +++++ .../tangem/tap/proxy/DerivationManagerImpl.kt | 3 +- .../tangem/tap/proxy/UserWalletManagerImpl.kt | 11 +++-- .../com/tangem/tap/proxy/di/ProxyModule.kt | 41 +++++++++++++++++++ .../di/CoroutineDispatcherProviderModule.kt | 16 ++++++++ domain/build.gradle.kts | 8 +++- .../referral/data/ReferralRepositoryImpl.kt | 3 +- .../referral/di/ReferralRepositoryModule.kt | 29 +++++++++++++ .../domain/converter/TokensConverter.kt | 3 +- .../domain/di/ReferralDomainModule.kt | 31 ++++++++++++++ .../referral/presentation/build.gradle.kts | 9 ++++ .../presentation/ReferralViewModel.kt | 11 +++++ 13 files changed, 173 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt create mode 100644 core/utils/src/main/java/com/tangem/utils/di/CoroutineDispatcherProviderModule.kt create mode 100644 features/referral/data/src/main/java/com/tangem/feature/referral/di/ReferralRepositoryModule.kt create mode 100644 features/referral/domain/src/main/java/com/tangem/feature/referral/domain/di/ReferralDomainModule.kt create mode 100644 features/referral/presentation/src/main/java/com/tangem/feature/referral/presentation/ReferralViewModel.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index dc249a446b..e68e3543e7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -111,7 +111,11 @@ dependencies { implementation(project(":common")) implementation(project(":core:ui")) implementation(project(":libs:crypto")) + + /** Features */ implementation(project(":features:referral:presentation")) + implementation(project(":features:referral:domain")) + implementation(project(":features:referral:data")) /** AndroidX libraries */ implementation(AndroidX.coreKtx) @@ -139,9 +143,13 @@ dependencies { implementation(Firebase.firebaseCrashlytics) /** Tangem libraries */ - implementation(Tangem.blockchain) + implementation(Tangem.blockchain) { + exclude(module = "joda-time") + } implementation(Tangem.cardCore) - implementation(Tangem.cardAndroid) + implementation(Tangem.cardAndroid) { + exclude(module = "joda-time") + } /** DI */ implementation(Library.hilt) diff --git a/app/src/main/java/com/tangem/tap/proxy/AppStateHolder.kt b/app/src/main/java/com/tangem/tap/proxy/AppStateHolder.kt index 130dd64665..eb4bfba228 100644 --- a/app/src/main/java/com/tangem/tap/proxy/AppStateHolder.kt +++ b/app/src/main/java/com/tangem/tap/proxy/AppStateHolder.kt @@ -2,12 +2,23 @@ package com.tangem.tap.proxy import com.tangem.common.card.Card import com.tangem.domain.common.ScanResponse +import com.tangem.tap.common.redux.AppState +import com.tangem.tap.domain.tokens.UserTokensRepository +import com.tangem.tap.features.tokens.redux.TokensMiddleware import com.tangem.tap.features.wallet.redux.WalletState +import org.rekotlin.Store +/** + * Holds objects from old modules, that missing in DI graph + * Object sets manually to use in new modules and [AppStateHolder] proxies its to DI + */ class AppStateHolder { val scanResponse: ScanResponse? = null val walletState: WalletState? = null + val userTokensRepository: UserTokensRepository? = null + val mainStore: Store? = null + val tokesMiddleware: TokensMiddleware? = null fun getActualCard(): Card? { return scanResponse?.card diff --git a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt index dd6d2a6e1c..e27bfd5238 100644 --- a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt @@ -8,15 +8,14 @@ import com.tangem.lib.crypto.DerivationManager import com.tangem.lib.crypto.models.Currency import com.tangem.lib.crypto.models.NonNativeToken import com.tangem.tap.domain.tokens.models.BlockchainNetwork -import com.tangem.tap.features.tokens.redux.TokensMiddleware import kotlin.coroutines.suspendCoroutine class DerivationManagerImpl( - private val tokesMiddleware: TokensMiddleware, private val appStateHolder: AppStateHolder, ) : DerivationManager { override suspend fun deriveMissingBlockchains(currency: Currency) = suspendCoroutine { continuation -> + val tokesMiddleware = requireNotNull(appStateHolder.tokesMiddleware) { "tokesMiddleware is null" } val blockchain = Blockchain.fromNetworkId(currency.networkId) val card = appStateHolder.getActualCard() if (blockchain != null && card != null) { diff --git a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt index cac76b8ab3..1a7f3fbcd5 100644 --- a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt @@ -12,24 +12,21 @@ import com.tangem.lib.crypto.UserWalletManager import com.tangem.lib.crypto.models.Currency import com.tangem.lib.crypto.models.NativeToken import com.tangem.lib.crypto.models.NonNativeToken -import com.tangem.tap.common.redux.AppState import com.tangem.tap.domain.extensions.getUserWalletId import com.tangem.tap.domain.extensions.makeWalletManagerForApp -import com.tangem.tap.domain.tokens.UserTokensRepository import com.tangem.tap.domain.tokens.models.BlockchainNetwork import com.tangem.tap.features.wallet.redux.WalletAction import org.rekotlin.Action -import org.rekotlin.Store class UserWalletManagerImpl( - private val userTokensRepository: UserTokensRepository, private val appStateHolder: AppStateHolder, - private val mainStore: Store, private val walletManagerFactory: WalletManagerFactory, ) : UserWalletManager { override suspend fun getUserTokens(): List { val card = appStateHolder.getActualCard() + val userTokensRepository = + requireNotNull(appStateHolder.userTokensRepository) { "userTokensRepository is null" } if (card != null) { userTokensRepository.getUserTokens(card) .filter { it.isToken() } @@ -62,6 +59,8 @@ class UserWalletManagerImpl( override suspend fun isTokenAdded(currency: Currency): Boolean { val card = appStateHolder.getActualCard() + val userTokensRepository = + requireNotNull(appStateHolder.userTokensRepository) { "userTokensRepository is null" } if (card != null) { return userTokensRepository.getUserTokens(card) .any { it.coinId.equals(currency.id) } //todo ensure that its the same ids @@ -81,7 +80,7 @@ class UserWalletManagerImpl( } else { addNonNativeTokenToWalletAction(currency as NonNativeToken) } - + val mainStore = requireNotNull(appStateHolder.mainStore) { "mainStore is null" } mainStore.dispatch(action) } diff --git a/app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt b/app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt new file mode 100644 index 0000000000..07d3fb1e8d --- /dev/null +++ b/app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt @@ -0,0 +1,41 @@ +package com.tangem.tap.proxy.di + +import com.tangem.blockchain.common.WalletManagerFactory +import com.tangem.lib.crypto.DerivationManager +import com.tangem.lib.crypto.UserWalletManager +import com.tangem.tap.proxy.AppStateHolder +import com.tangem.tap.proxy.DerivationManagerImpl +import com.tangem.tap.proxy.UserWalletManagerImpl +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +class ProxyModule { + + @Provides + @Singleton + fun provideAppStateHolder(): AppStateHolder { + return AppStateHolder() + } + + @Provides + @Singleton + fun provideUserWalletManager(appStateHolder: AppStateHolder): UserWalletManager { + return UserWalletManagerImpl( + appStateHolder = appStateHolder, + walletManagerFactory = WalletManagerFactory(), + ) + } + + @Provides + @Singleton + fun provideDerivationManager(appStateHolder: AppStateHolder): DerivationManager { + return DerivationManagerImpl( + appStateHolder = appStateHolder, + ) + } +} \ No newline at end of file diff --git a/core/utils/src/main/java/com/tangem/utils/di/CoroutineDispatcherProviderModule.kt b/core/utils/src/main/java/com/tangem/utils/di/CoroutineDispatcherProviderModule.kt new file mode 100644 index 0000000000..df85354292 --- /dev/null +++ b/core/utils/src/main/java/com/tangem/utils/di/CoroutineDispatcherProviderModule.kt @@ -0,0 +1,16 @@ +package com.tangem.utils.di + +import com.tangem.utils.coroutines.AppCoroutineDispatcherProvider +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent + +@Module +@InstallIn(SingletonComponent::class) +interface CoroutineDispatcherProviderModule { + + @Binds + fun bindCoroutineDispatcherProvider(coroutineDispatcherProvider: AppCoroutineDispatcherProvider): CoroutineDispatcherProvider +} \ No newline at end of file diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index 6e1c48864e..6909db2791 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -75,9 +75,13 @@ dependencies { implementation(project(":common")) /** Tangem libraries */ - implementation(Tangem.blockchain) + implementation(Tangem.blockchain) { + exclude(module = "joda-time") + } implementation(Tangem.cardCore) - implementation(Tangem.cardAndroid) + implementation(Tangem.cardAndroid) { + exclude(module = "joda-time") + } /** Other libraries */ implementation(Library.reKotlin) diff --git a/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt b/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt index bf2387f070..789d5d3bc8 100644 --- a/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt +++ b/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt @@ -7,9 +7,8 @@ import com.tangem.feature.referral.domain.ReferralRepository import com.tangem.feature.referral.domain.models.ReferralData import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.withContext -import javax.inject.Inject -internal class ReferralRepositoryImpl @Inject constructor( +internal class ReferralRepositoryImpl( private val referralApi: ReferralApi, private val referralConverter: ReferralConverter, private val coroutineDispatcher: CoroutineDispatcherProvider, diff --git a/features/referral/data/src/main/java/com/tangem/feature/referral/di/ReferralRepositoryModule.kt b/features/referral/data/src/main/java/com/tangem/feature/referral/di/ReferralRepositoryModule.kt new file mode 100644 index 0000000000..7a88c423cc --- /dev/null +++ b/features/referral/data/src/main/java/com/tangem/feature/referral/di/ReferralRepositoryModule.kt @@ -0,0 +1,29 @@ +package com.tangem.feature.referral.di + +import com.tangem.datasource.api.referral.ReferralApi +import com.tangem.feature.referral.converters.ReferralConverter +import com.tangem.feature.referral.data.ReferralRepositoryImpl +import com.tangem.feature.referral.domain.ReferralRepository +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +class ReferralRepositoryModule { + + @Provides + @Singleton + fun provideReferralRepository( + referralApi: ReferralApi, + referralConverter: ReferralConverter, + coroutineDispatcherProvider: CoroutineDispatcherProvider, + ): ReferralRepository { + return ReferralRepositoryImpl( + referralApi, referralConverter, coroutineDispatcherProvider, + ) + } +} \ No newline at end of file diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/converter/TokensConverter.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/converter/TokensConverter.kt index 4ee8e69395..2f756567f1 100644 --- a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/converter/TokensConverter.kt +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/converter/TokensConverter.kt @@ -5,8 +5,9 @@ import com.tangem.lib.crypto.models.Currency import com.tangem.lib.crypto.models.NativeToken import com.tangem.lib.crypto.models.NonNativeToken import com.tangem.utils.converter.Converter +import javax.inject.Inject -class TokensConverter : Converter { +class TokensConverter @Inject constructor() : Converter { override fun convert(value: TokenData): Currency { return if (value.decimalCount != null && diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/di/ReferralDomainModule.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/di/ReferralDomainModule.kt new file mode 100644 index 0000000000..0f0c22b0f0 --- /dev/null +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/di/ReferralDomainModule.kt @@ -0,0 +1,31 @@ +package com.tangem.feature.referral.domain.di + +import com.tangem.feature.referral.domain.ReferralInteractor +import com.tangem.feature.referral.domain.ReferralInteractorImpl +import com.tangem.feature.referral.domain.ReferralRepository +import com.tangem.feature.referral.domain.converter.TokensConverter +import com.tangem.lib.crypto.DerivationManager +import com.tangem.lib.crypto.UserWalletManager +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +class ReferralDomainModule { + + @Provides + @Singleton + fun provideReferralInteractor( + referralRepository: ReferralRepository, + derivationManager: DerivationManager, + userWalletManager: UserWalletManager, + tokensConverter: TokensConverter, + ): ReferralInteractor { + return ReferralInteractorImpl( + referralRepository, derivationManager, userWalletManager, tokensConverter, + ) + } +} \ No newline at end of file diff --git a/features/referral/presentation/build.gradle.kts b/features/referral/presentation/build.gradle.kts index 73a9372e4b..b2763c706c 100644 --- a/features/referral/presentation/build.gradle.kts +++ b/features/referral/presentation/build.gradle.kts @@ -1,6 +1,8 @@ plugins { id("com.android.library") kotlin("android") + kotlin("kapt") + id("com.google.dagger.hilt.android") } android { @@ -42,6 +44,13 @@ dependencies { implementation(Compose.material) implementation(Compose.uiTooling) + /** Domain */ + implementation(project(":features:referral:domain")) + /** Other libraries */ implementation(Library.composeShimmer) + + /** DI */ + implementation(Library.hilt) + kapt(Library.hiltKapt) } \ No newline at end of file diff --git a/features/referral/presentation/src/main/java/com/tangem/feature/referral/presentation/ReferralViewModel.kt b/features/referral/presentation/src/main/java/com/tangem/feature/referral/presentation/ReferralViewModel.kt new file mode 100644 index 0000000000..e106965a14 --- /dev/null +++ b/features/referral/presentation/src/main/java/com/tangem/feature/referral/presentation/ReferralViewModel.kt @@ -0,0 +1,11 @@ +package com.tangem.feature.referral.presentation + +import androidx.lifecycle.ViewModel +import com.tangem.feature.referral.domain.ReferralInteractor +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class ReferralViewModel @Inject constructor(referralInteractor: ReferralInteractor) : ViewModel() { + +} \ No newline at end of file