Updated on 2026-08-14

This commit is contained in:
Tangem 2025-04-25 13:54:11 +03:00
parent e080401183
commit f97a017f3f
22 changed files with 28 additions and 854 deletions

View file

@ -1,5 +0,0 @@
package com.tangem.features.biometry
interface BiometryFeatureToggles {
val isAskForBiometryEnabled: Boolean
}

View file

@ -1,12 +0,0 @@
package com.tangem.features.biometry.impl
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
import com.tangem.features.biometry.BiometryFeatureToggles
import javax.inject.Inject
internal class DefaultBiometryFeatureToggles @Inject constructor(
private val featureTogglesManager: FeatureTogglesManager,
) : BiometryFeatureToggles {
override val isAskForBiometryEnabled: Boolean
get() = featureTogglesManager.isFeatureEnabled("ASK_BIOMETRY_REFACTORING_ENABLED")
}

View file

@ -3,9 +3,7 @@ package com.tangem.features.biometry.impl.di
import com.tangem.core.decompose.di.ModelComponent
import com.tangem.core.decompose.model.Model
import com.tangem.features.biometry.AskBiometryComponent
import com.tangem.features.biometry.BiometryFeatureToggles
import com.tangem.features.biometry.impl.DefaultAskBiometryComponent
import com.tangem.features.biometry.impl.DefaultBiometryFeatureToggles
import com.tangem.features.biometry.impl.model.AskBiometryModel
import dagger.Binds
import dagger.Module
@ -18,9 +16,6 @@ import dagger.multibindings.IntoMap
@InstallIn(SingletonComponent::class)
internal interface FeatureModule {
@Binds
fun bindFeatureToggles(impl: DefaultBiometryFeatureToggles): BiometryFeatureToggles
@Binds
fun bindComponentFactory(impl: DefaultAskBiometryComponent.Factory): AskBiometryComponent.Factory
}

View file

@ -19,7 +19,6 @@ import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.legacy.asLockable
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.features.biometry.AskBiometryComponent
import com.tangem.features.biometry.BiometryFeatureToggles
import com.tangem.features.onboarding.v2.TitleProvider
import com.tangem.features.onboarding.v2.common.ui.CantLeaveBackupDialog
import com.tangem.features.onboarding.v2.done.api.OnboardingDoneComponent
@ -32,8 +31,6 @@ import com.tangem.features.onboarding.v2.twin.api.OnboardingTwinComponent
import com.tangem.features.onboarding.v2.visa.impl.child.welcome.model.analytics.OnboardingVisaAnalyticsEvent
import com.tangem.sdk.api.TangemSdkManager
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
import javax.inject.Inject
@ -46,7 +43,6 @@ internal class OnboardingEntryModel @Inject constructor(
private val router: Router,
private val tangemSdkManager: TangemSdkManager,
private val settingsRepository: SettingsRepository,
private val askBiometryFeatureToggles: BiometryFeatureToggles,
private val analyticsEventHandler: AnalyticsEventHandler,
private val uiMessageSender: UiMessageSender,
private val userWalletsListManager: UserWalletsListManager,
@ -148,37 +144,25 @@ internal class OnboardingEntryModel @Inject constructor(
private fun navigateToFinalScreenFlow(
doneMode: OnboardingDoneComponent.Mode = OnboardingDoneComponent.Mode.WalletCreated,
) {
if (askBiometryFeatureToggles.isAskForBiometryEnabled) {
modelScope.launch {
if (tangemSdkManager.checkCanUseBiometry() && settingsRepository.shouldShowSaveUserWalletScreen()) {
doIfVisa {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.BiometricScreenOpened)
}
stackNavigation.replaceAll(
OnboardingRoute.AskBiometry(modelCallbacks = AskBiometryModelCallbacks(doneMode)),
)
} else {
doIfVisa {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.SuccessScreenOpened)
}
stackNavigation.replaceAll(
OnboardingRoute.Done(
mode = doneMode,
onDone = ::exitComponentScreen,
),
)
modelScope.launch {
if (tangemSdkManager.checkCanUseBiometry() && settingsRepository.shouldShowSaveUserWalletScreen()) {
doIfVisa {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.BiometricScreenOpened)
}
stackNavigation.replaceAll(
OnboardingRoute.AskBiometry(modelCallbacks = AskBiometryModelCallbacks(doneMode)),
)
} else {
doIfVisa {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.SuccessScreenOpened)
}
stackNavigation.replaceAll(
OnboardingRoute.Done(
mode = doneMode,
onDone = ::exitComponentScreen,
),
)
}
} else {
doIfVisa {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.SuccessScreenOpened)
}
stackNavigation.replaceAll(
OnboardingRoute.Done(
mode = doneMode,
onDone = ::exitComponentScreen,
),
)
}
}
@ -213,38 +197,16 @@ internal class OnboardingEntryModel @Inject constructor(
}
private fun exitComponentScreen() {
if (askBiometryFeatureToggles.isAskForBiometryEnabled) {
if (userWalletsListManager.hasUserWallets) {
val isLocked = runCatching { userWalletsListManager.asLockable()?.isLockedSync!! }.getOrElse { false }
if (userWalletsListManager.hasUserWallets) {
val isLocked = runCatching { userWalletsListManager.asLockable()?.isLockedSync!! }.getOrElse { false }
if (isLocked) {
router.replaceAll(AppRoute.Welcome())
} else {
router.replaceAll(AppRoute.Wallet)
}
if (isLocked) {
router.replaceAll(AppRoute.Welcome())
} else {
router.replaceAll(AppRoute.Home)
router.replaceAll(AppRoute.Wallet)
}
} else {
if (userWalletsListManager.hasUserWallets) {
val isLocked = runCatching { userWalletsListManager.asLockable()?.isLockedSync!! }.getOrElse { false }
if (isLocked) {
router.replaceAll(AppRoute.Welcome())
} else {
modelScope.launch(NonCancellable) {
router.replaceAll(AppRoute.Wallet)
if (tangemSdkManager.checkCanUseBiometry() &&
settingsRepository.shouldShowSaveUserWalletScreen()
) {
delay(timeMillis = 1_800)
router.push(AppRoute.SaveWallet)
}
}
}
} else {
router.replaceAll(AppRoute.Home)
}
router.replaceAll(AppRoute.Home)
}
}

View file

@ -38,7 +38,6 @@ import com.tangem.feature.wallet.presentation.wallet.state.transformers.*
import com.tangem.feature.wallet.presentation.wallet.state.utils.WalletEventSender
import com.tangem.feature.wallet.presentation.wallet.utils.ScreenLifecycleProvider
import com.tangem.features.biometry.AskBiometryComponent
import com.tangem.features.biometry.BiometryFeatureToggles
import com.tangem.features.pushnotifications.api.utils.PUSH_PERMISSION
import com.tangem.features.pushnotifications.api.utils.getPushPermissionOrNull
import com.tangem.utils.Provider
@ -75,7 +74,6 @@ internal class WalletModel @Inject constructor(
private val walletImageResolver: WalletImageResolver,
private val tokenListStore: MultiWalletTokenListStore,
private val onrampStatusFactory: OnrampStatusFactory,
private val biometryFeatureToggles: BiometryFeatureToggles,
private val analyticsEventsHandler: AnalyticsEventHandler,
private val fetchCurrencyStatusUseCase: FetchCurrencyStatusUseCase,
val screenLifecycleProvider: ScreenLifecycleProvider,
@ -126,13 +124,9 @@ internal class WalletModel @Inject constructor(
withContext(dispatchers.io) { delay(timeMillis = 1_800) }
if (isShowSaveWalletScreenEnabled()) {
if (biometryFeatureToggles.isAskForBiometryEnabled) {
innerWalletRouter.dialogNavigation.activate(
configuration = WalletDialogConfig.AskForBiometry,
)
} else {
innerWalletRouter.openSaveUserWalletScreen()
}
innerWalletRouter.dialogNavigation.activate(
configuration = WalletDialogConfig.AskForBiometry,
)
}
}
}

View file

@ -14,7 +14,6 @@ import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.feature.wallet.navigation.WalletRoute
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletDialogConfig
import com.tangem.features.biometry.BiometryFeatureToggles
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.MutableSharedFlow
import javax.inject.Inject
@ -25,7 +24,6 @@ internal class DefaultWalletRouter @Inject constructor(
private val router: AppRouter,
private val urlOpener: UrlOpener,
private val reduxStateHolder: ReduxStateHolder,
private val biometryFeatureToggles: BiometryFeatureToggles,
) : InnerWalletRouter {
override val dialogNavigation: SlotNavigation<WalletDialogConfig> = SlotNavigation()
@ -91,12 +89,6 @@ internal class DefaultWalletRouter @Inject constructor(
router.push(AppRoute.Home)
}
override fun openSaveUserWalletScreen() {
if (biometryFeatureToggles.isAskForBiometryEnabled.not()) {
router.push(AppRoute.SaveWallet)
}
}
override fun isWalletLastScreen(): Boolean {
return router.stack.lastOrNull() is AppRoute.Wallet
}

View file

@ -46,9 +46,6 @@ internal interface InnerWalletRouter {
/** Open stories screen */
fun openStoriesScreen()
/** Open save user wallet screen */
fun openSaveUserWalletScreen()
/** Is wallet last screen */
fun isWalletLastScreen(): Boolean