From a2f57e10befda10e9099ce70add78d54ef1a86d5 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 21 Feb 2024 14:28:14 +0700 Subject: [PATCH] Updated on 2026-08-14 --- app/build.gradle.kts | 2 ++ .../java/com/tangem/tap/TapApplication.kt | 10 ++++++ .../tap/di/domain/OnboardingDomainModule.kt | 31 +++++++++++++++++ .../domain/scanCard/LegacyScanProcessor.kt | 15 +++++---- .../domain/scanCard/UseCaseScanProcessor.kt | 3 +- .../chains/CheckForOnboardingChain.kt | 11 ++++--- .../twins/redux/TwinCardsMiddleware.kt | 32 +++++++++++------- .../tap/proxy/redux/DaggerGraphState.kt | 4 +++ .../local/preferences/PreferencesKeys.kt | 4 +++ data/onboarding/.gitignore | 1 + data/onboarding/build.gradle.kts | 30 +++++++++++++++++ .../onboarding/DefaultOnboardingRepository.kt | 33 +++++++++++++++++++ .../di/OnboardingRepositoryModule.kt | 21 ++++++++++++ .../preferences/PreferencesDataSource.kt | 9 ----- domain/onboarding/.gitignore | 1 + domain/onboarding/build.gradle.kts | 9 +++++ .../SaveTwinsOnboardingShownUseCase.kt | 19 +++++++++++ .../WasTwinsOnboardingShownUseCase.kt | 33 +++++++++++++++++++ .../repository/OnboardingRepository.kt | 18 ++++++++++ .../extension/BaseExtensionConfigurations.kt | 2 +- settings.gradle.kts | 2 ++ 21 files changed, 257 insertions(+), 33 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/di/domain/OnboardingDomainModule.kt create mode 100644 data/onboarding/.gitignore create mode 100644 data/onboarding/build.gradle.kts create mode 100644 data/onboarding/src/main/kotlin/com/tangem/data/onboarding/DefaultOnboardingRepository.kt create mode 100644 data/onboarding/src/main/kotlin/com/tangem/data/onboarding/di/OnboardingRepositoryModule.kt create mode 100644 domain/onboarding/.gitignore create mode 100644 domain/onboarding/build.gradle.kts create mode 100644 domain/onboarding/src/main/kotlin/com/tangem/domain/onboarding/SaveTwinsOnboardingShownUseCase.kt create mode 100644 domain/onboarding/src/main/kotlin/com/tangem/domain/onboarding/WasTwinsOnboardingShownUseCase.kt create mode 100644 domain/onboarding/src/main/kotlin/com/tangem/domain/onboarding/repository/OnboardingRepository.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4d977ecce4..553088615c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -60,6 +60,7 @@ dependencies { implementation(projects.domain.transaction) implementation(projects.domain.analytics) implementation(projects.domain.visa) + implementation(projects.domain.onboarding) implementation(projects.common) implementation(projects.core.analytics) @@ -88,6 +89,7 @@ dependencies { implementation(projects.data.transaction) implementation(projects.data.visa) implementation(projects.data.promo) + implementation(projects.data.onboarding) /** Features */ implementation(projects.features.onboarding) diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 5ca956a2bf..83452572ae 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -31,6 +31,8 @@ import com.tangem.domain.apptheme.repository.AppThemeModeRepository import com.tangem.domain.balancehiding.repositories.BalanceHidingRepository import com.tangem.domain.card.ScanCardProcessor import com.tangem.domain.common.LogConfig +import com.tangem.domain.onboarding.SaveTwinsOnboardingShownUseCase +import com.tangem.domain.onboarding.WasTwinsOnboardingShownUseCase import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.tokens.repository.NetworksRepository import com.tangem.domain.walletmanager.WalletManagersFacade @@ -162,6 +164,12 @@ internal class TapApplication : Application(), ImageLoaderFactory { @Inject lateinit var generalUserWalletsListManager: UserWalletsListManager + + @Inject + lateinit var wasTwinsOnboardingShownUseCase: WasTwinsOnboardingShownUseCase + + @Inject + lateinit var saveTwinsOnboardingShownUseCase: SaveTwinsOnboardingShownUseCase // endregion Injected override fun onCreate() { @@ -246,6 +254,8 @@ internal class TapApplication : Application(), ImageLoaderFactory { accountCreator = accountCreator, userWalletsListManagerFeatureToggles = userWalletsListManagerFeatureToggles, generalUserWalletsListManager = generalUserWalletsListManager, + wasTwinsOnboardingShownUseCase = wasTwinsOnboardingShownUseCase, + saveTwinsOnboardingShownUseCase = saveTwinsOnboardingShownUseCase, ), ), ) diff --git a/app/src/main/java/com/tangem/tap/di/domain/OnboardingDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/OnboardingDomainModule.kt new file mode 100644 index 0000000000..2ec4dabe50 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/di/domain/OnboardingDomainModule.kt @@ -0,0 +1,31 @@ +package com.tangem.tap.di.domain + +import com.tangem.domain.onboarding.SaveTwinsOnboardingShownUseCase +import com.tangem.domain.onboarding.WasTwinsOnboardingShownUseCase +import com.tangem.domain.onboarding.repository.OnboardingRepository +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 OnboardingDomainModule { + + @Provides + @Singleton + fun provideWasTwinsOnboardingShownUseCase( + onboardingRepository: OnboardingRepository, + ): WasTwinsOnboardingShownUseCase { + return WasTwinsOnboardingShownUseCase(onboardingRepository) + } + + @Provides + @Singleton + fun provideSaveTwinsOnboardingShownUseCase( + onboardingRepository: OnboardingRepository, + ): SaveTwinsOnboardingShownUseCase { + return SaveTwinsOnboardingShownUseCase(onboardingRepository) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt index a1e3f77974..757e78cb34 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt @@ -13,12 +13,8 @@ import com.tangem.domain.common.TapWorkarounds.canSkipBackup import com.tangem.domain.common.extensions.withMainContext import com.tangem.domain.common.util.twinsIsTwinned import com.tangem.domain.models.scan.ScanResponse -import com.tangem.tap.* import com.tangem.tap.common.analytics.paramsInterceptor.CardContextInterceptor -import com.tangem.tap.common.extensions.addContext -import com.tangem.tap.common.extensions.dispatchOnMain -import com.tangem.tap.common.extensions.dispatchWithMain -import com.tangem.tap.common.extensions.setContext +import com.tangem.tap.common.extensions.* import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.features.disclaimer.createDisclaimer import com.tangem.tap.features.disclaimer.redux.DisclaimerAction @@ -26,6 +22,10 @@ import com.tangem.tap.features.disclaimer.redux.DisclaimerCallback import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsStep +import com.tangem.tap.proxy.redux.DaggerGraphState +import com.tangem.tap.scope +import com.tangem.tap.store +import com.tangem.tap.tangemSdkManager import com.tangem.utils.extensions.DELAY_SDK_DIALOG_CLOSE import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -165,7 +165,10 @@ internal object LegacyScanProcessor { navigateTo(appScreen) { onProgressStateChange(it) } } else { Analytics.setContext(scanResponse) - if (scanResponse.twinsIsTwinned() && !preferencesStorage.wasTwinsOnboardingShown()) { + + val wasTwinsOnboardingShown = store.inject(DaggerGraphState::wasTwinsOnboardingShownUseCase).invokeSync() + + if (scanResponse.twinsIsTwinned() && !wasTwinsOnboardingShown) { onWalletNotCreated() store.dispatchOnMain(TwinCardsAction.SetStepOfScreen(TwinCardsStep.WelcomeOnly(scanResponse))) navigateTo(AppScreen.OnboardingTwins) { onProgressStateChange(it) } diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt index 562ac25718..b5949c7c5a 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt @@ -11,7 +11,6 @@ import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.domain.scanCard.chains.* import com.tangem.tap.domain.scanCard.utils.ScanCardExceptionConverter -import com.tangem.tap.preferencesStorage import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.store import com.tangem.utils.extensions.DELAY_SDK_DIALOG_CLOSE @@ -52,7 +51,7 @@ internal object UseCaseScanProcessor { add(AnalyticsChain(analyticsEvent)) } add(DisclaimerChain(store, disclaimerWillShow)) - add(CheckForOnboardingChain(store, store.state.globalState.tapWalletManager, preferencesStorage)) + add(CheckForOnboardingChain(store, store.state.globalState.tapWalletManager)) } scanCardUseCase(cardId, afterScanChains = chains) diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/chains/CheckForOnboardingChain.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/chains/CheckForOnboardingChain.kt index cb6471a4ca..3db1f7a79e 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/chains/CheckForOnboardingChain.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/chains/CheckForOnboardingChain.kt @@ -5,7 +5,6 @@ import arrow.core.left import arrow.core.right import com.tangem.core.analytics.Analytics import com.tangem.core.navigation.AppScreen -import com.tangem.data.source.preferences.PreferencesDataSource import com.tangem.domain.card.ScanCardException import com.tangem.domain.common.TapWorkarounds.canSkipBackup import com.tangem.domain.common.util.twinsIsTwinned @@ -13,6 +12,7 @@ import com.tangem.domain.core.chain.Chain import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.extensions.addContext import com.tangem.tap.common.extensions.dispatchOnMain +import com.tangem.tap.common.extensions.inject import com.tangem.tap.common.extensions.setContext import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction @@ -20,6 +20,7 @@ import com.tangem.tap.domain.TapWalletManager import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsStep +import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.utils.extensions.DELAY_SDK_DIALOG_CLOSE import kotlinx.coroutines.delay import org.rekotlin.Store @@ -32,14 +33,12 @@ import org.rekotlin.Store * * @param store the [Store] that holds the state of the app. * @param tapWalletManager manager responsible for handling operations related to the Wallet. - * @param preferencesStore data source for user preferences. * * @see Chain for more information about the Chain interface. */ class CheckForOnboardingChain( private val store: Store, private val tapWalletManager: TapWalletManager, - private val preferencesStore: PreferencesDataSource, ) : Chain { override suspend fun invoke( @@ -63,8 +62,12 @@ class CheckForOnboardingChain( } else -> { Analytics.setContext(previousChainResult) + + val wasTwinsOnboardingShown = store.inject(DaggerGraphState::wasTwinsOnboardingShownUseCase) + .invokeSync() + // If twins was twinned previously but twins welcome not shown - if (previousChainResult.twinsIsTwinned() && !preferencesStore.wasTwinsOnboardingShown()) { + if (previousChainResult.twinsIsTwinned() && !wasTwinsOnboardingShown) { store.dispatchOnMain( TwinCardsAction.SetStepOfScreen(TwinCardsStep.WelcomeOnly(previousChainResult)), ) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt index fafb9a473f..4a7906dfdb 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt @@ -26,7 +26,7 @@ import com.tangem.tap.domain.twins.TwinCardsManager import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.features.onboarding.OnboardingDialog import com.tangem.tap.features.onboarding.OnboardingHelper -import com.tangem.tap.preferencesStorage +import com.tangem.tap.mainScope import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.scope import com.tangem.tap.store @@ -100,15 +100,22 @@ private fun handle(action: Action, dispatch: DispatchFunction) { when (twinCardsState.mode) { CreateTwinWalletMode.CreateWallet -> { - if (preferencesStorage.wasTwinsOnboardingShown()) { - val step = when { - !scanResponse.twinsIsTwinned() -> TwinCardsStep.CreateFirstWallet - twinCardsState.walletBalance.balanceIsToppedUp() -> TwinCardsStep.Done - else -> TwinCardsStep.TopUpWallet + mainScope.launch { + val wasTwinsOnboardingShown = store.inject(DaggerGraphState::wasTwinsOnboardingShownUseCase) + .invokeSync() + + val dispatchAction = if (wasTwinsOnboardingShown) { + val step = when { + !scanResponse.twinsIsTwinned() -> TwinCardsStep.CreateFirstWallet + twinCardsState.walletBalance.balanceIsToppedUp() -> TwinCardsStep.Done + else -> TwinCardsStep.TopUpWallet + } + TwinCardsAction.SetStepOfScreen(step) + } else { + TwinCardsAction.SetStepOfScreen(TwinCardsStep.Welcome) } - store.dispatch(TwinCardsAction.SetStepOfScreen(step)) - } else { - store.dispatch(TwinCardsAction.SetStepOfScreen(TwinCardsStep.Welcome)) + + store.dispatch(dispatchAction) } } CreateTwinWalletMode.RecreateWallet -> { @@ -120,7 +127,10 @@ private fun handle(action: Action, dispatch: DispatchFunction) { when (action.step) { is TwinCardsStep.WelcomeOnly, TwinCardsStep.Welcome -> { Analytics.send(Onboarding.Twins.ScreenOpened()) - preferencesStorage.saveTwinsOnboardingShown() + + scope.launch { + store.inject(DaggerGraphState::saveTwinsOnboardingShownUseCase).invoke() + } } is TwinCardsStep.CreateFirstWallet -> { Analytics.send(Onboarding.CreateWallet.ScreenOpened()) @@ -295,7 +305,7 @@ private fun handle(action: Action, dispatch: DispatchFunction) { } CreateTwinWalletMode.RecreateWallet -> { scope.launch { - val walletsRepository = store.state.daggerGraphState.get(DaggerGraphState::walletsRepository) + val walletsRepository = store.inject(DaggerGraphState::walletsRepository) if (walletsRepository.shouldSaveUserWalletsSync()) { OnboardingHelper.trySaveWalletAndNavigateToWalletScreen(scanResponse) diff --git a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt index 78bec8cd19..e552d90fd6 100644 --- a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt +++ b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt @@ -9,6 +9,8 @@ import com.tangem.domain.balancehiding.repositories.BalanceHidingRepository import com.tangem.domain.card.ScanCardProcessor import com.tangem.domain.card.ScanCardUseCase import com.tangem.domain.card.repository.CardSdkConfigRepository +import com.tangem.domain.onboarding.SaveTwinsOnboardingShownUseCase +import com.tangem.domain.onboarding.WasTwinsOnboardingShownUseCase import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.tokens.repository.NetworksRepository import com.tangem.domain.walletmanager.WalletManagersFacade @@ -59,6 +61,8 @@ data class DaggerGraphState( val accountCreator: AccountCreator? = null, val userWalletsListManagerFeatureToggles: UserWalletsListManagerFeatureToggles? = null, val generalUserWalletsListManager: UserWalletsListManager? = null, + val wasTwinsOnboardingShownUseCase: WasTwinsOnboardingShownUseCase? = null, + val saveTwinsOnboardingShownUseCase: SaveTwinsOnboardingShownUseCase? = null, ) : StateType { inline fun get(getDependency: DaggerGraphState.() -> T?): T { diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt index c5c54133ac..2b74eabdad 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt @@ -7,6 +7,7 @@ import com.tangem.datasource.local.preferences.PreferencesKeys.SAVE_USER_WALLETS import com.tangem.datasource.local.preferences.PreferencesKeys.SHOW_RATING_DIALOG_AT_LAUNCH_COUNT_KEY import com.tangem.datasource.local.preferences.PreferencesKeys.USED_CARDS_INFO_KEY import com.tangem.datasource.local.preferences.PreferencesKeys.USER_WAS_INTERACT_WITH_RATING_KEY +import com.tangem.datasource.local.preferences.PreferencesKeys.WAS_TWINS_ONBOARDING_SHOWN /** * All preferences keys that DataStore is stored. @@ -54,6 +55,8 @@ object PreferencesKeys { } val FEATURE_TOGGLES_KEY by lazy { stringPreferencesKey(name = "featureToggles") } + + val WAS_TWINS_ONBOARDING_SHOWN by lazy { booleanPreferencesKey(name = "twinsOnboardingShown") } } /** Preferences keys set that should be migrated from "PreferencesDataSource" to a new DataStore */ @@ -65,6 +68,7 @@ internal fun getTapPrefKeysToMigrate(): Set { FUNDS_FOUND_DATE_KEY, USER_WAS_INTERACT_WITH_RATING_KEY, USED_CARDS_INFO_KEY, + WAS_TWINS_ONBOARDING_SHOWN, ) .map(Preferences.Key<*>::name) .toSet() diff --git a/data/onboarding/.gitignore b/data/onboarding/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/data/onboarding/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/data/onboarding/build.gradle.kts b/data/onboarding/build.gradle.kts new file mode 100644 index 0000000000..91e15d90c9 --- /dev/null +++ b/data/onboarding/build.gradle.kts @@ -0,0 +1,30 @@ +plugins { + alias(deps.plugins.android.library) + alias(deps.plugins.kotlin.android) + alias(deps.plugins.kotlin.kapt) + id("configuration") +} + +android { + namespace = "com.tangem.data.onboarding" +} + +dependencies { + + // region AndroidX libraries + implementation(deps.androidx.datastore) + // endregion + + // region DI + implementation(deps.hilt.core) + kapt(deps.hilt.kapt) + // endregion + + // region Core modules + implementation(projects.core.datasource) + // endregion + + // region Domain modules + implementation(projects.domain.onboarding) + // endregion +} \ No newline at end of file diff --git a/data/onboarding/src/main/kotlin/com/tangem/data/onboarding/DefaultOnboardingRepository.kt b/data/onboarding/src/main/kotlin/com/tangem/data/onboarding/DefaultOnboardingRepository.kt new file mode 100644 index 0000000000..683ce6d376 --- /dev/null +++ b/data/onboarding/src/main/kotlin/com/tangem/data/onboarding/DefaultOnboardingRepository.kt @@ -0,0 +1,33 @@ +package com.tangem.data.onboarding + +import com.tangem.datasource.local.preferences.AppPreferencesStore +import com.tangem.datasource.local.preferences.PreferencesKeys +import com.tangem.datasource.local.preferences.utils.get +import com.tangem.datasource.local.preferences.utils.getSyncOrDefault +import com.tangem.datasource.local.preferences.utils.store +import com.tangem.domain.onboarding.repository.OnboardingRepository +import kotlinx.coroutines.flow.Flow + +/** + * Default implementation of [OnboardingRepository] + * + * @property appPreferencesStore app preferences store + * +[REDACTED_AUTHOR] + */ +internal class DefaultOnboardingRepository( + private val appPreferencesStore: AppPreferencesStore, +) : OnboardingRepository { + + override fun wasTwinsOnboardingShown(): Flow { + return appPreferencesStore.get(key = PreferencesKeys.WAS_TWINS_ONBOARDING_SHOWN, default = false) + } + + override suspend fun wasTwinsOnboardingShownSync(): Boolean { + return appPreferencesStore.getSyncOrDefault(key = PreferencesKeys.WAS_TWINS_ONBOARDING_SHOWN, default = false) + } + + override suspend fun saveTwinsOnboardingShown() { + appPreferencesStore.store(key = PreferencesKeys.WAS_TWINS_ONBOARDING_SHOWN, value = true) + } +} \ No newline at end of file diff --git a/data/onboarding/src/main/kotlin/com/tangem/data/onboarding/di/OnboardingRepositoryModule.kt b/data/onboarding/src/main/kotlin/com/tangem/data/onboarding/di/OnboardingRepositoryModule.kt new file mode 100644 index 0000000000..391bade42f --- /dev/null +++ b/data/onboarding/src/main/kotlin/com/tangem/data/onboarding/di/OnboardingRepositoryModule.kt @@ -0,0 +1,21 @@ +package com.tangem.data.onboarding.di + +import com.tangem.data.onboarding.DefaultOnboardingRepository +import com.tangem.datasource.local.preferences.AppPreferencesStore +import com.tangem.domain.onboarding.repository.OnboardingRepository +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 OnboardingRepositoryModule { + + @Provides + @Singleton + fun provideOnboardingRepository(appPreferencesStore: AppPreferencesStore): OnboardingRepository { + return DefaultOnboardingRepository(appPreferencesStore = appPreferencesStore) + } +} \ No newline at end of file diff --git a/data/source/preferences/src/main/kotlin/com/tangem/data/source/preferences/PreferencesDataSource.kt b/data/source/preferences/src/main/kotlin/com/tangem/data/source/preferences/PreferencesDataSource.kt index d16da10d47..91f774282a 100644 --- a/data/source/preferences/src/main/kotlin/com/tangem/data/source/preferences/PreferencesDataSource.kt +++ b/data/source/preferences/src/main/kotlin/com/tangem/data/source/preferences/PreferencesDataSource.kt @@ -56,14 +56,6 @@ class PreferencesDataSource @Inject internal constructor(applicationContext: Con putBoolean(OPEN_WELCOME_ON_RESUME_KEY, value) } - fun saveTwinsOnboardingShown() { - preferences.edit { putBoolean(TWINS_ONBOARDING_SHOWN_KEY, true) } - } - - fun wasTwinsOnboardingShown(): Boolean { - return preferences.getBoolean(TWINS_ONBOARDING_SHOWN_KEY, false) - } - private fun incrementLaunchCounter() { var count = preferences.getInt(APP_LAUNCH_COUNT_KEY, 0) preferences.edit { putInt(APP_LAUNCH_COUNT_KEY, ++count) } @@ -71,7 +63,6 @@ class PreferencesDataSource @Inject internal constructor(applicationContext: Con companion object { private const val PREFERENCES_NAME = "tapPrefs" - private const val TWINS_ONBOARDING_SHOWN_KEY = "twinsOnboardingShown" private const val APP_LAUNCH_COUNT_KEY = "launchCount" private const val SAVE_WALLET_DIALOG_SHOWN_KEY = "saveUserWalletShown" private const val SAVE_ACCESS_CODES_KEY = "saveAccessCodes" diff --git a/domain/onboarding/.gitignore b/domain/onboarding/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/domain/onboarding/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/domain/onboarding/build.gradle.kts b/domain/onboarding/build.gradle.kts new file mode 100644 index 0000000000..831b4eb4e4 --- /dev/null +++ b/domain/onboarding/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + alias(deps.plugins.kotlin.jvm) + id("configuration") +} + +dependencies { + implementation(deps.arrow.core) + implementation(deps.kotlin.coroutines) +} \ No newline at end of file diff --git a/domain/onboarding/src/main/kotlin/com/tangem/domain/onboarding/SaveTwinsOnboardingShownUseCase.kt b/domain/onboarding/src/main/kotlin/com/tangem/domain/onboarding/SaveTwinsOnboardingShownUseCase.kt new file mode 100644 index 0000000000..fb6bf89e87 --- /dev/null +++ b/domain/onboarding/src/main/kotlin/com/tangem/domain/onboarding/SaveTwinsOnboardingShownUseCase.kt @@ -0,0 +1,19 @@ +package com.tangem.domain.onboarding + +import com.tangem.domain.onboarding.repository.OnboardingRepository + +/** + * Saves that twins onboarding was shown + * + * @property onboardingRepository onboarding repository + * +[REDACTED_AUTHOR] + */ +class SaveTwinsOnboardingShownUseCase( + private val onboardingRepository: OnboardingRepository, +) { + + suspend operator fun invoke() { + onboardingRepository.saveTwinsOnboardingShown() + } +} \ No newline at end of file diff --git a/domain/onboarding/src/main/kotlin/com/tangem/domain/onboarding/WasTwinsOnboardingShownUseCase.kt b/domain/onboarding/src/main/kotlin/com/tangem/domain/onboarding/WasTwinsOnboardingShownUseCase.kt new file mode 100644 index 0000000000..9666714871 --- /dev/null +++ b/domain/onboarding/src/main/kotlin/com/tangem/domain/onboarding/WasTwinsOnboardingShownUseCase.kt @@ -0,0 +1,33 @@ +package com.tangem.domain.onboarding + +import arrow.core.Either +import arrow.core.left +import arrow.core.right +import com.tangem.domain.onboarding.repository.OnboardingRepository +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.map + +/** + * Use case for checking if twins onboarding was shown + * + * @property onboardingRepository onboarding repository + * +[REDACTED_AUTHOR] + */ +class WasTwinsOnboardingShownUseCase( + private val onboardingRepository: OnboardingRepository, +) { + + /** Get flow with twins onboarding state or error [Throwable] */ + operator fun invoke(): Flow> { + return onboardingRepository.wasTwinsOnboardingShown() + .map(Boolean::right) + .catch { it.left() } + } + + /** Get twins onboarding state synchronously or default value if exception will be thrown */ + suspend fun invokeSync(): Boolean { + return runCatching { onboardingRepository.wasTwinsOnboardingShownSync() }.getOrDefault(defaultValue = false) + } +} \ No newline at end of file diff --git a/domain/onboarding/src/main/kotlin/com/tangem/domain/onboarding/repository/OnboardingRepository.kt b/domain/onboarding/src/main/kotlin/com/tangem/domain/onboarding/repository/OnboardingRepository.kt new file mode 100644 index 0000000000..cda4f3b19a --- /dev/null +++ b/domain/onboarding/src/main/kotlin/com/tangem/domain/onboarding/repository/OnboardingRepository.kt @@ -0,0 +1,18 @@ +package com.tangem.domain.onboarding.repository + +import kotlinx.coroutines.flow.Flow + +/** + * Onboarding repository + * +[REDACTED_AUTHOR] + */ +interface OnboardingRepository { + + fun wasTwinsOnboardingShown(): Flow + + @Throws + suspend fun wasTwinsOnboardingShownSync(): Boolean + + suspend fun saveTwinsOnboardingShown() +} \ No newline at end of file diff --git a/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/extension/BaseExtensionConfigurations.kt b/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/extension/BaseExtensionConfigurations.kt index 142649ae2a..c47360c0fc 100644 --- a/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/extension/BaseExtensionConfigurations.kt +++ b/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/extension/BaseExtensionConfigurations.kt @@ -20,7 +20,7 @@ internal fun BaseExtension.configureCompilerOptions() { internal fun BaseExtension.configureCompose(project: Project) { val useCompose = with(project.path) { contains(":ui") || - contains(Regex(pattern = ":onboarding\$")) || // TODO: divide on api/impl after migrating all onboarding to module + contains(":features:onboarding") || // TODO: divide on api/impl after migrating all onboarding to module contains(Regex(pattern = ":presentation\$")) || contains(Regex(pattern = ":app\$")) || // TODO: [REDACTED_JIRA] contains(Regex(pattern = ":features:manage-tokens:api\$")) || // provides Composable function diff --git a/settings.gradle.kts b/settings.gradle.kts index 19fcb80b60..fb31682f87 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -137,6 +137,7 @@ include(":domain:balance-hiding:models") include(":domain:transaction") include(":domain:analytics") include(":domain:visa") +include(":domain:onboarding") // endregion Domain modules // region Data modules @@ -154,4 +155,5 @@ include(":data:analytics") include(":data:transaction") include(":data:visa") include(":data:promo") +include(":data:onboarding") // endregion Data modules \ No newline at end of file