Updated on 2026-08-14

This commit is contained in:
Tangem 2024-03-21 11:48:29 +00:00
commit d2465287b3
7 changed files with 55 additions and 12 deletions

View file

@ -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() {

View file

@ -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
}
}

View file

@ -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()
}
}

View file

@ -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(),
)

View file

@ -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, () -> String>) {
class AuthBearerHeader(authBearerProvider: AuthBearerProvider) : RequestHeader(
"Authorization" to { "Bearer " + authBearerProvider.getApiKey() },
)
class AppVersionPlatformHeaders(appVersionProvider: AppVersionProvider) : RequestHeader(
"version" to { appVersionProvider.getAppVersion() },
"platform" to { "android" },
)
}

View file

@ -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()
}
}

View file

@ -0,0 +1,6 @@
package com.tangem.lib.auth
interface AppVersionProvider {
fun getAppVersion(): String
}