From 4193e5777eead5ff290b1e3c6bff8256cfdb00e1 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 18 Sep 2025 17:04:05 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../producer/SingleAccountListProducer.kt | 2 +- domain/account/status/.gitignore | 1 + domain/account/status/build.gradle.kts | 41 +++++++++++++++ .../AccountStatusListProducerFactoryModule.kt | 28 +++++++++++ .../di/AccountStatusListSupplierModule.kt | 38 ++++++++++++++ .../DefaultMultiAccountStatusListProducer.kt | 48 ++++++++++++++++++ .../DefaultSingleAccountStatusListProducer.kt | 50 +++++++++++++++++++ .../MultiAccountStatusListProducer.kt | 15 ++++++ .../SingleAccountStatusListProducer.kt | 17 +++++++ .../MultiAccountStatusListSupplier.kt | 15 ++++++ .../SingleAccountStatusListSupplier.kt | 15 ++++++ settings.gradle.kts | 5 +- 12 files changed, 272 insertions(+), 3 deletions(-) create mode 100644 domain/account/status/.gitignore create mode 100644 domain/account/status/build.gradle.kts create mode 100644 domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusListProducerFactoryModule.kt create mode 100644 domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusListSupplierModule.kt create mode 100644 domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultMultiAccountStatusListProducer.kt create mode 100644 domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultSingleAccountStatusListProducer.kt create mode 100644 domain/account/status/src/main/java/com/tangem/domain/account/status/producer/MultiAccountStatusListProducer.kt create mode 100644 domain/account/status/src/main/java/com/tangem/domain/account/status/producer/SingleAccountStatusListProducer.kt create mode 100644 domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/MultiAccountStatusListSupplier.kt create mode 100644 domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/SingleAccountStatusListSupplier.kt diff --git a/domain/account/src/main/java/com/tangem/domain/account/producer/SingleAccountListProducer.kt b/domain/account/src/main/java/com/tangem/domain/account/producer/SingleAccountListProducer.kt index 8d85130007..9acea3c434 100644 --- a/domain/account/src/main/java/com/tangem/domain/account/producer/SingleAccountListProducer.kt +++ b/domain/account/src/main/java/com/tangem/domain/account/producer/SingleAccountListProducer.kt @@ -5,7 +5,7 @@ import com.tangem.domain.core.flow.FlowProducer import com.tangem.domain.models.wallet.UserWalletId /** - * Produces a list of [AccountList] for a specific user wallet. + * Produces a [AccountList] for a specific user wallet. * [REDACTED_AUTHOR] */ diff --git a/domain/account/status/.gitignore b/domain/account/status/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/domain/account/status/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/domain/account/status/build.gradle.kts b/domain/account/status/build.gradle.kts new file mode 100644 index 0000000000..592deeab3a --- /dev/null +++ b/domain/account/status/build.gradle.kts @@ -0,0 +1,41 @@ +plugins { + alias(deps.plugins.android.library) + alias(deps.plugins.kotlin.android) + alias(deps.plugins.kotlin.kapt) + alias(deps.plugins.hilt.android) + id("configuration") +} + +android { + namespace = "com.tangem.domain.account.status" +} + +tasks.withType().configureEach { + useJUnitPlatform() +} + +dependencies { + implementation(projects.domain.account) + implementation(projects.domain.core) + implementation(projects.domain.quotes) + implementation(projects.domain.models) + implementation(projects.domain.networks) + implementation(projects.domain.staking) + + implementation(projects.libs.crypto) + + implementation(deps.kotlin.datetime) + + // region DI + implementation(deps.hilt.android) + kapt(deps.hilt.kapt) + // end + + testImplementation(deps.test.coroutine) + testImplementation(deps.test.junit5) + testRuntimeOnly(deps.test.junit5.engine) + testImplementation(deps.test.mockk) + testImplementation(deps.test.truth) + testImplementation(tangemDeps.blockchain) + testImplementation(projects.common.test) +} \ No newline at end of file diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusListProducerFactoryModule.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusListProducerFactoryModule.kt new file mode 100644 index 0000000000..926780dc55 --- /dev/null +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusListProducerFactoryModule.kt @@ -0,0 +1,28 @@ +package com.tangem.domain.account.status.di + +import com.tangem.domain.account.status.producer.DefaultMultiAccountStatusListProducer +import com.tangem.domain.account.status.producer.DefaultSingleAccountStatusListProducer +import com.tangem.domain.account.status.producer.MultiAccountStatusListProducer +import com.tangem.domain.account.status.producer.SingleAccountStatusListProducer +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal interface AccountStatusListProducerFactoryModule { + + @Binds + @Singleton + fun bindSingleAccountStatusListProducerFactory( + factory: DefaultSingleAccountStatusListProducer.Factory, + ): SingleAccountStatusListProducer.Factory + + @Binds + @Singleton + fun bindMultiAccountStatusListProducerFactory( + factory: DefaultMultiAccountStatusListProducer.Factory, + ): MultiAccountStatusListProducer.Factory +} \ No newline at end of file diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusListSupplierModule.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusListSupplierModule.kt new file mode 100644 index 0000000000..51b10dc806 --- /dev/null +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusListSupplierModule.kt @@ -0,0 +1,38 @@ +package com.tangem.domain.account.status.di + +import com.tangem.domain.account.status.producer.MultiAccountStatusListProducer +import com.tangem.domain.account.status.producer.SingleAccountStatusListProducer +import com.tangem.domain.account.status.supplier.MultiAccountStatusListSupplier +import com.tangem.domain.account.status.supplier.SingleAccountStatusListSupplier +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal object AccountStatusListSupplierModule { + + @Provides + @Singleton + fun provideSingleAccountStatusListSupplier( + factory: SingleAccountStatusListProducer.Factory, + ): SingleAccountStatusListSupplier { + return object : SingleAccountStatusListSupplier( + factory = factory, + keyCreator = { "account_status_list_${it.userWalletId}" }, + ) {} + } + + @Provides + @Singleton + fun provideMultiAccountStatusListSupplier( + factory: MultiAccountStatusListProducer.Factory, + ): MultiAccountStatusListSupplier { + return object : MultiAccountStatusListSupplier( + factory = factory, + keyCreator = { "multi_account_status_list" }, + ) {} + } +} \ No newline at end of file diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultMultiAccountStatusListProducer.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultMultiAccountStatusListProducer.kt new file mode 100644 index 0000000000..8f4335ee9d --- /dev/null +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultMultiAccountStatusListProducer.kt @@ -0,0 +1,48 @@ +package com.tangem.domain.account.status.producer + +import arrow.core.Option +import arrow.core.some +import com.tangem.domain.account.models.AccountStatusList +import com.tangem.domain.account.status.supplier.SingleAccountStatusListSupplier +import com.tangem.domain.core.wallets.UserWalletsListRepository +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.filterNotNull +import kotlinx.coroutines.flow.flatMapLatest + +/** +[REDACTED_AUTHOR] + */ +// TODO: Finalize [REDACTED_JIRA] +internal class DefaultMultiAccountStatusListProducer @AssistedInject constructor( + @Assisted val params: Unit, + private val userWalletsListRepository: UserWalletsListRepository, + private val singleAccountStatusListSupplier: SingleAccountStatusListSupplier, +) : MultiAccountStatusListProducer { + + override val fallback: Option> = emptyList().some() + + @OptIn(ExperimentalCoroutinesApi::class) + override fun produce(): Flow> { + return userWalletsListRepository.userWallets + .filterNotNull() + .flatMapLatest { userWallets -> + val flows = userWallets.map { + singleAccountStatusListSupplier( + params = SingleAccountStatusListProducer.Params(it.walletId), + ) + } + + combine(flows) { it.toList() } + } + } + + @AssistedFactory + interface Factory : MultiAccountStatusListProducer.Factory { + override fun create(params: Unit): DefaultMultiAccountStatusListProducer + } +} \ No newline at end of file diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultSingleAccountStatusListProducer.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultSingleAccountStatusListProducer.kt new file mode 100644 index 0000000000..ebb05f18cb --- /dev/null +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultSingleAccountStatusListProducer.kt @@ -0,0 +1,50 @@ +package com.tangem.domain.account.status.producer + +import arrow.core.Option +import arrow.core.none +import com.tangem.domain.account.models.AccountStatusList +import com.tangem.domain.account.supplier.SingleAccountListSupplier +import com.tangem.domain.models.network.NetworkStatus +import com.tangem.domain.models.quote.QuoteStatus +import com.tangem.domain.models.staking.YieldBalance +import com.tangem.domain.networks.single.SingleNetworkStatusSupplier +import com.tangem.domain.quotes.single.SingleQuoteStatusSupplier +import com.tangem.domain.staking.StakingIdFactory +import com.tangem.domain.staking.single.SingleYieldBalanceSupplier +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.emptyFlow + +/** +[REDACTED_AUTHOR] + */ +// TODO: Implement [REDACTED_JIRA] +@Suppress("UnusedPrivateProperty", "UnusedPrivateClass") +@OptIn(ExperimentalCoroutinesApi::class) +internal class DefaultSingleAccountStatusListProducer @AssistedInject constructor( + @Assisted private val params: SingleAccountStatusListProducer.Params, + private val singleAccountListSupplier: SingleAccountListSupplier, + private val singleNetworkStatusSupplier: SingleNetworkStatusSupplier, + private val singleQuoteStatusSupplier: SingleQuoteStatusSupplier, + private val singleYieldBalanceSupplier: SingleYieldBalanceSupplier, + private val stakingIdFactory: StakingIdFactory, +) : SingleAccountStatusListProducer { + + override val fallback: Option = none() + + override fun produce(): Flow = emptyFlow() + + private data class CryptoCurrencyStatusSources( + val networkStatus: NetworkStatus, + val yieldBalance: YieldBalance?, + val quoteStatus: QuoteStatus?, + ) + + @AssistedFactory + interface Factory : SingleAccountStatusListProducer.Factory { + override fun create(params: SingleAccountStatusListProducer.Params): DefaultSingleAccountStatusListProducer + } +} \ No newline at end of file diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/MultiAccountStatusListProducer.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/MultiAccountStatusListProducer.kt new file mode 100644 index 0000000000..5ebd910a58 --- /dev/null +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/MultiAccountStatusListProducer.kt @@ -0,0 +1,15 @@ +package com.tangem.domain.account.status.producer + +import com.tangem.domain.account.models.AccountList +import com.tangem.domain.account.models.AccountStatusList +import com.tangem.domain.core.flow.FlowProducer + +/** + * Produces a list of [AccountList]s for all user wallets. + * +[REDACTED_AUTHOR] + */ +interface MultiAccountStatusListProducer : FlowProducer> { + + interface Factory : FlowProducer.Factory +} \ No newline at end of file diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/SingleAccountStatusListProducer.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/SingleAccountStatusListProducer.kt new file mode 100644 index 0000000000..97935a14f3 --- /dev/null +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/SingleAccountStatusListProducer.kt @@ -0,0 +1,17 @@ +package com.tangem.domain.account.status.producer + +import com.tangem.domain.account.models.AccountStatusList +import com.tangem.domain.core.flow.FlowProducer +import com.tangem.domain.models.wallet.UserWalletId + +/** + * Produces a [AccountStatusList] for a specific user wallet. + * +[REDACTED_AUTHOR] + */ +interface SingleAccountStatusListProducer : FlowProducer { + + data class Params(val userWalletId: UserWalletId) + + interface Factory : FlowProducer.Factory +} \ No newline at end of file diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/MultiAccountStatusListSupplier.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/MultiAccountStatusListSupplier.kt new file mode 100644 index 0000000000..60ed1d5971 --- /dev/null +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/MultiAccountStatusListSupplier.kt @@ -0,0 +1,15 @@ +package com.tangem.domain.account.status.supplier + +import com.tangem.domain.account.models.AccountStatusList +import com.tangem.domain.account.status.producer.MultiAccountStatusListProducer +import com.tangem.domain.core.flow.FlowCachingSupplier + +/** + * Supplier that provides a list of [AccountStatusList]s for all user wallets. + * +[REDACTED_AUTHOR] + */ +abstract class MultiAccountStatusListSupplier( + override val factory: MultiAccountStatusListProducer.Factory, + override val keyCreator: (Unit) -> String, +) : FlowCachingSupplier>() \ No newline at end of file diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/SingleAccountStatusListSupplier.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/SingleAccountStatusListSupplier.kt new file mode 100644 index 0000000000..5e5ef8f506 --- /dev/null +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/SingleAccountStatusListSupplier.kt @@ -0,0 +1,15 @@ +package com.tangem.domain.account.status.supplier + +import com.tangem.domain.account.models.AccountStatusList +import com.tangem.domain.account.status.producer.SingleAccountStatusListProducer +import com.tangem.domain.core.flow.FlowCachingSupplier + +/** + * Supplier that provides a single [AccountStatusList] for a specific user wallet. + * +[REDACTED_AUTHOR] + */ +abstract class SingleAccountStatusListSupplier( + override val factory: SingleAccountStatusListProducer.Factory, + override val keyCreator: (SingleAccountStatusListProducer.Params) -> String, +) : FlowCachingSupplier() \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 365023aad8..fe9ddfd50d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -272,6 +272,7 @@ include(":features:tangempay:main:impl") include(":features:tangempay:details:api") include(":features:tangempay:details:impl") +include(":features:tangempay:onboarding") include(":features:tangempay:onboarding:api") include(":features:tangempay:onboarding:impl") @@ -297,6 +298,7 @@ include(":domain:models") include(":domain:legacy") include(":domain:account") +include(":domain:account:status") include(":domain:card") include(":domain:core") include(":domain:demo") @@ -385,5 +387,4 @@ include(":data:swap") include(":data:express") include(":data:wallet-manager") include(":data:yield-supply") -// endregion Data modules -include(":features:tangempay:onboarding") \ No newline at end of file +// endregion Data modules \ No newline at end of file