From 8e96433f447d6856780bddb33be2901f233b6f39 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 20 Mar 2024 19:24:52 +0400 Subject: [PATCH 1/3] Updated on 2026-08-14 --- .../details/redux/DetailsMiddleware.kt | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt index f429e3423f..685a09edee 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt @@ -39,6 +39,7 @@ import com.tangem.utils.coroutines.saveIn import com.tangem.wallet.R import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.rekotlin.Action @@ -217,7 +218,7 @@ class DetailsMiddleware { } } is DetailsAction.AppSettings.CheckBiometricsStatus -> { - observeBiometricsStatusChanges(state, action.lifecycleScope) + observeBiometricsStatusChanges(action.lifecycleScope) } is DetailsAction.AppSettings.EnrollBiometrics -> { enrollBiometrics() @@ -239,20 +240,27 @@ class DetailsMiddleware { } } - private fun observeBiometricsStatusChanges(state: DetailsState, lifecycleScope: LifecycleCoroutineScope) { - lifecycleScope.launch(Dispatchers.IO) { + private fun observeBiometricsStatusChanges(lifecycleScope: LifecycleCoroutineScope) { + val needEnrollBiometricsFlow = flow { do { val needEnrollBiometrics = runCatching(tangemSdkManager::needEnrollBiometrics).getOrNull() - if (needEnrollBiometrics != null && - needEnrollBiometrics != state.appSettingsState.needEnrollBiometrics - ) { - store.dispatchWithMain(DetailsAction.AppSettings.BiometricsStatusChanged(needEnrollBiometrics)) + if (needEnrollBiometrics != null) { + emit(needEnrollBiometrics) } - delay(timeMillis = 500) + delay(timeMillis = 200) } while (true) - }.saveIn(checkBiometricsStatusJobHolder) + } + + needEnrollBiometricsFlow + .distinctUntilChanged() + .onEach { needEnrollBiometrics -> + store.dispatchWithMain(DetailsAction.AppSettings.BiometricsStatusChanged(needEnrollBiometrics)) + } + .flowOn(Dispatchers.IO) + .launchIn(lifecycleScope) + .saveIn(checkBiometricsStatusJobHolder) } private fun enrollBiometrics() { From aa77c81f2da30ac16c1c48dcfa8dbf2946c9f58e Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 20 Mar 2024 16:21:41 +0000 Subject: [PATCH 2/3] Updated on 2026-08-14 --- .../viewmodels/intents/WalletWarningsClickIntents.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletWarningsClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletWarningsClickIntents.kt index f16f13dda2..1ff5dc6191 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletWarningsClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletWarningsClickIntents.kt @@ -80,11 +80,10 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( override fun onAddBackupCardClick() { analyticsEventHandler.send(MainScreen.NoticeBackupYourWalletTapped) - prepareOnboardingProcess() - router.openOnboardingScreen() + prepareAndStartOnboardingProcess() } - private fun prepareOnboardingProcess() { + private fun prepareAndStartOnboardingProcess() { viewModelScope.launch(dispatchers.main) { getSelectedUserWallet()?.let { reduxStateHolder.dispatch( @@ -94,6 +93,8 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( ), ) } + // navigation action shouldn't be out of coroutine to avoid race + router.openOnboardingScreen() } } From 69234e50efd7f2ee9d29ba5e164dab23124cd17e Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 21 Mar 2024 09:37:32 +0000 Subject: [PATCH 3/3] Updated on 2026-08-14 --- .../tap/network/auth/DefaultAppVersionProvider.kt | 11 +++++++++++ .../java/com/tangem/tap/network/auth/di/AuthModule.kt | 8 ++++++++ .../java/com/tangem/datasource/di/NetworkModule.kt | 3 +++ .../java/com/tangem/datasource/utils/RequestHeader.kt | 6 ++++++ .../java/com/tangem/lib/auth/AppVersionProvider.kt | 6 ++++++ 5 files changed, 34 insertions(+) create mode 100644 app/src/main/java/com/tangem/tap/network/auth/DefaultAppVersionProvider.kt create mode 100644 libs/auth/src/main/java/com/tangem/lib/auth/AppVersionProvider.kt diff --git a/app/src/main/java/com/tangem/tap/network/auth/DefaultAppVersionProvider.kt b/app/src/main/java/com/tangem/tap/network/auth/DefaultAppVersionProvider.kt new file mode 100644 index 0000000000..7987d7ce6e --- /dev/null +++ b/app/src/main/java/com/tangem/tap/network/auth/DefaultAppVersionProvider.kt @@ -0,0 +1,11 @@ +package com.tangem.tap.network.auth + +import com.tangem.lib.auth.AppVersionProvider +import com.tangem.wallet.BuildConfig + +internal class DefaultAppVersionProvider : AppVersionProvider { + + override fun getAppVersion(): String { + return BuildConfig.VERSION_NAME + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/network/auth/di/AuthModule.kt b/app/src/main/java/com/tangem/tap/network/auth/di/AuthModule.kt index fa9aa920a1..0185472a6e 100644 --- a/app/src/main/java/com/tangem/tap/network/auth/di/AuthModule.kt +++ b/app/src/main/java/com/tangem/tap/network/auth/di/AuthModule.kt @@ -2,8 +2,10 @@ package com.tangem.tap.network.auth.di import com.tangem.datasource.config.ConfigManager import com.tangem.datasource.local.userwallet.UserWalletsStore +import com.tangem.lib.auth.AppVersionProvider import com.tangem.lib.auth.AuthProvider import com.tangem.lib.auth.ExpressAuthProvider +import com.tangem.tap.network.auth.DefaultAppVersionProvider import com.tangem.tap.network.auth.DefaultAuthProvider import com.tangem.tap.network.auth.DefaultExpressAuthProvider import com.tangem.tap.proxy.AppStateHolder @@ -34,4 +36,10 @@ class AuthModule { configManager = configManager, ) } + + @Provides + @Singleton + fun provideAppVersionProvider(): AppVersionProvider { + return DefaultAppVersionProvider() + } } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt index eb61db86b2..e52008bbc5 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt @@ -9,6 +9,7 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.utils.RequestHeader.* import com.tangem.datasource.utils.addHeaders import com.tangem.datasource.utils.addLoggers +import com.tangem.lib.auth.AppVersionProvider import com.tangem.lib.auth.ExpressAuthProvider import dagger.Module import dagger.Provides @@ -30,6 +31,7 @@ class NetworkModule { @NetworkMoshi moshi: Moshi, @ApplicationContext context: Context, expressAuthProvider: ExpressAuthProvider, + appVersionProvider: AppVersionProvider, ): TangemExpressApi { val url = if (BuildConfig.ENVIRONMENT == "dev") { DEV_EXPRESS_BASE_URL @@ -43,6 +45,7 @@ class NetworkModule { .client( OkHttpClient.Builder() .addHeaders(Express(expressAuthProvider)) + .addHeaders(AppVersionPlatformHeaders(appVersionProvider)) .addLoggers(context) .build(), ) diff --git a/core/datasource/src/main/java/com/tangem/datasource/utils/RequestHeader.kt b/core/datasource/src/main/java/com/tangem/datasource/utils/RequestHeader.kt index d84b00ac2e..bd725ea0b6 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/utils/RequestHeader.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/utils/RequestHeader.kt @@ -1,5 +1,6 @@ package com.tangem.datasource.utils +import com.tangem.lib.auth.AppVersionProvider import com.tangem.lib.auth.AuthBearerProvider import com.tangem.lib.auth.AuthProvider import com.tangem.lib.auth.ExpressAuthProvider @@ -30,4 +31,9 @@ sealed class RequestHeader(vararg pairs: Pair String>) { class AuthBearerHeader(authBearerProvider: AuthBearerProvider) : RequestHeader( "Authorization" to { "Bearer " + authBearerProvider.getApiKey() }, ) + + class AppVersionPlatformHeaders(appVersionProvider: AppVersionProvider) : RequestHeader( + "version" to { appVersionProvider.getAppVersion() }, + "platform" to { "android" }, + ) } \ No newline at end of file diff --git a/libs/auth/src/main/java/com/tangem/lib/auth/AppVersionProvider.kt b/libs/auth/src/main/java/com/tangem/lib/auth/AppVersionProvider.kt new file mode 100644 index 0000000000..3b8e606e9c --- /dev/null +++ b/libs/auth/src/main/java/com/tangem/lib/auth/AppVersionProvider.kt @@ -0,0 +1,6 @@ +package com.tangem.lib.auth + +interface AppVersionProvider { + + fun getAppVersion(): String +} \ No newline at end of file