Updated on 2026-08-14
This commit is contained in:
commit
a2479b9fe3
9 changed files with 43 additions and 28 deletions
|
|
@ -6,7 +6,11 @@ import androidx.lifecycle.lifecycleScope
|
|||
import com.tangem.tap.common.extensions.dispatchOnMain
|
||||
import com.tangem.tap.common.redux.navigation.AppScreen
|
||||
import com.tangem.tap.common.redux.navigation.NavigationAction
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.isActive
|
||||
import kotlinx.coroutines.launch
|
||||
import timber.log.Timber
|
||||
import kotlin.time.Duration
|
||||
|
||||
|
|
|
|||
|
|
@ -61,10 +61,7 @@ class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Co
|
|||
cardId: String? = null,
|
||||
additionalBlockchainsToDerive: Collection<Blockchain>? = null,
|
||||
messageRes: Int? = null,
|
||||
useBiometricsForAccessCode: Boolean = false,
|
||||
): CompletionResult<ScanResponse> {
|
||||
setAccessCodeRequestPolicy(useBiometricsForAccessCode)
|
||||
|
||||
val message = Message(context.getString(messageRes ?: R.string.initial_message_scan_header))
|
||||
return runTaskAsyncReturnOnMain(
|
||||
runnable = ScanProductTask(
|
||||
|
|
@ -109,9 +106,7 @@ class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Co
|
|||
suspend fun derivePublicKeys(
|
||||
cardId: String,
|
||||
derivations: Map<ByteArrayKey, List<DerivationPath>>,
|
||||
useBiometricsForAccessCode: Boolean = false,
|
||||
): CompletionResult<DerivationTaskResponse> {
|
||||
setAccessCodeRequestPolicy(useBiometricsForAccessCode)
|
||||
return runTaskAsyncReturnOnMain(DeriveMultipleWalletPublicKeysTask(derivations), cardId)
|
||||
}
|
||||
|
||||
|
|
@ -192,9 +187,7 @@ class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Co
|
|||
|
||||
suspend fun scanCard(
|
||||
cardId: String? = null,
|
||||
useBiometricsForAccessCode: Boolean = false,
|
||||
): CompletionResult<CardDTO> {
|
||||
setAccessCodeRequestPolicy(useBiometricsForAccessCode)
|
||||
return runTaskAsyncReturnOnMain(
|
||||
runnable = ScanTask(),
|
||||
cardId = cardId,
|
||||
|
|
|
|||
|
|
@ -44,7 +44,6 @@ import kotlinx.coroutines.launch
|
|||
// TODO: Create repository for that
|
||||
object ScanCardProcessor {
|
||||
suspend fun scan(
|
||||
useBiometricsForAccessCode: Boolean = false,
|
||||
additionalBlockchainsToDerive: Collection<Blockchain>? = null,
|
||||
cardId: String? = null,
|
||||
onProgressStateChange: suspend (showProgress: Boolean) -> Unit = {},
|
||||
|
|
@ -62,7 +61,6 @@ object ScanCardProcessor {
|
|||
userTokensRepository = userTokensRepository,
|
||||
cardId = cardId,
|
||||
additionalBlockchainsToDerive = additionalBlockchainsToDerive,
|
||||
useBiometricsForAccessCode = useBiometricsForAccessCode,
|
||||
)
|
||||
|
||||
store.dispatchOnMain(GlobalAction.ScanFailsCounter.ChooseBehavior(result))
|
||||
|
|
|
|||
|
|
@ -77,11 +77,7 @@ class DetailsMiddleware {
|
|||
}
|
||||
DetailsAction.ScanCard -> {
|
||||
scope.launch {
|
||||
tangemSdkManager.scanCard(
|
||||
cardId = state.scanResponse?.card?.cardId,
|
||||
useBiometricsForAccessCode = preferencesStorage.shouldSaveAccessCodes &&
|
||||
state.scanResponse?.card?.isAccessCodeSet == true,
|
||||
)
|
||||
tangemSdkManager.scanCard(cardId = state.scanResponse?.card?.cardId)
|
||||
.doOnSuccess { card ->
|
||||
val currentCardId = store.state.globalState.scanResponse?.card
|
||||
?.userWalletId
|
||||
|
|
@ -220,7 +216,7 @@ class DetailsMiddleware {
|
|||
private fun toggleSaveWallets(state: DetailsState, enable: Boolean) = scope.launch {
|
||||
if (state.saveWallets == enable) return@launch
|
||||
if (enable) {
|
||||
saveCurrentWallet()
|
||||
saveCurrentWallet(state)
|
||||
} else {
|
||||
deleteSavedWallets()
|
||||
if (state.saveAccessCodes) {
|
||||
|
|
@ -233,16 +229,16 @@ class DetailsMiddleware {
|
|||
if (state.saveAccessCodes == enable) return@launch
|
||||
if (enable) {
|
||||
if (!state.saveWallets) {
|
||||
saveCurrentWallet()
|
||||
saveCurrentWallet(state)
|
||||
}
|
||||
saveAccessCodes()
|
||||
saveAccessCodes(state)
|
||||
} else {
|
||||
deleteSavedAccessCodes()
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun saveCurrentWallet() {
|
||||
val scanResponse = store.state.detailsState.scanResponse ?: return
|
||||
private suspend fun saveCurrentWallet(state: DetailsState) {
|
||||
val scanResponse = state.scanResponse ?: return
|
||||
val userWallet = UserWalletBuilder(scanResponse).build()
|
||||
|
||||
userWalletsListManager.save(userWallet)
|
||||
|
|
@ -277,8 +273,11 @@ class DetailsMiddleware {
|
|||
}
|
||||
}
|
||||
|
||||
private fun saveAccessCodes() {
|
||||
private fun saveAccessCodes(state: DetailsState) {
|
||||
preferencesStorage.shouldSaveAccessCodes = true
|
||||
tangemSdkManager.setAccessCodeRequestPolicy(
|
||||
useBiometricsForAccessCode = state.scanResponse?.card?.isAccessCodeSet == true,
|
||||
)
|
||||
store.dispatchOnMain(
|
||||
DetailsAction.AppSettings.SwitchPrivacySetting.Success(
|
||||
setting = PrivacySetting.SaveAccessCode,
|
||||
|
|
@ -291,6 +290,9 @@ class DetailsMiddleware {
|
|||
tangemSdkManager.clearSavedUserCodes()
|
||||
.doOnSuccess {
|
||||
preferencesStorage.shouldSaveAccessCodes = false
|
||||
tangemSdkManager.setAccessCodeRequestPolicy(
|
||||
useBiometricsForAccessCode = false,
|
||||
)
|
||||
store.dispatchOnMain(
|
||||
DetailsAction.AppSettings.SwitchPrivacySetting.Success(
|
||||
setting = PrivacySetting.SaveAccessCode,
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ import com.tangem.tap.features.send.redux.states.ButtonState
|
|||
import com.tangem.tap.preferencesStorage
|
||||
import com.tangem.tap.scope
|
||||
import com.tangem.tap.store
|
||||
import com.tangem.tap.tangemSdkManager
|
||||
import com.tangem.tap.userWalletsListManager
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
|
|
@ -71,8 +72,10 @@ private fun handleHomeAction(action: Action) {
|
|||
|
||||
private fun readCard() = scope.launch {
|
||||
delay(timeMillis = 200)
|
||||
ScanCardProcessor.scan(
|
||||
tangemSdkManager.setAccessCodeRequestPolicy(
|
||||
useBiometricsForAccessCode = preferencesStorage.shouldSaveAccessCodes,
|
||||
)
|
||||
ScanCardProcessor.scan(
|
||||
onProgressStateChange = { showProgress ->
|
||||
if (showProgress) {
|
||||
changeButtonState(ButtonState.PROGRESS)
|
||||
|
|
|
|||
|
|
@ -35,7 +35,6 @@ import com.tangem.tap.domain.tokens.LoadAvailableCoinsService
|
|||
import com.tangem.tap.domain.tokens.models.BlockchainNetwork
|
||||
import com.tangem.tap.features.wallet.models.Currency
|
||||
import com.tangem.tap.features.wallet.redux.WalletAction
|
||||
import com.tangem.tap.preferencesStorage
|
||||
import com.tangem.tap.scope
|
||||
import com.tangem.tap.store
|
||||
import com.tangem.tap.tangemSdkManager
|
||||
|
|
@ -206,7 +205,6 @@ class TokensMiddleware {
|
|||
val result = tangemSdkManager.derivePublicKeys(
|
||||
cardId = card.cardId,
|
||||
derivations = derivations,
|
||||
useBiometricsForAccessCode = preferencesStorage.shouldSaveAccessCodes && card.isAccessCodeSet,
|
||||
)
|
||||
when (result) {
|
||||
is CompletionResult.Success -> {
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@ import com.tangem.tap.features.wallet.redux.WalletAction
|
|||
import com.tangem.tap.features.wallet.redux.WalletState
|
||||
import com.tangem.tap.features.wallet.redux.models.WalletDialog
|
||||
import com.tangem.tap.features.wallet.redux.reducers.toWallet
|
||||
import com.tangem.tap.preferencesStorage
|
||||
import com.tangem.tap.scope
|
||||
import com.tangem.tap.store
|
||||
import com.tangem.tap.userTokensRepository
|
||||
|
|
@ -183,8 +182,6 @@ class MultiWalletMiddleware {
|
|||
state: WalletState?,
|
||||
) = scope.launch {
|
||||
ScanCardProcessor.scan(
|
||||
useBiometricsForAccessCode = preferencesStorage.shouldSaveAccessCodes &&
|
||||
selectedWallet.scanResponse.card.isAccessCodeSet,
|
||||
cardId = selectedWallet.cardId,
|
||||
additionalBlockchainsToDerive = state?.missingDerivations?.map { it.blockchain },
|
||||
) { scanResponse ->
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ import com.tangem.tap.domain.scanCard.ScanCardProcessor
|
|||
import com.tangem.tap.preferencesStorage
|
||||
import com.tangem.tap.scope
|
||||
import com.tangem.tap.store
|
||||
import com.tangem.tap.tangemSdkManager
|
||||
import com.tangem.tap.totalFiatBalanceCalculator
|
||||
import com.tangem.tap.userWalletsListManager
|
||||
import com.tangem.tap.walletStoresManager
|
||||
|
|
@ -129,6 +130,7 @@ internal class WalletSelectorMiddleware {
|
|||
store.dispatchOnMain(WalletSelectorAction.AddWallet.Success)
|
||||
|
||||
if (isSavedWalletSelected) {
|
||||
updateAccessCodeRequestPolicy(selectedWallet)
|
||||
store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Wallet))
|
||||
store.onUserWalletSelected(selectedWallet)
|
||||
}
|
||||
|
|
@ -143,6 +145,7 @@ internal class WalletSelectorMiddleware {
|
|||
store.dispatchOnMain(WalletSelectorAction.HandleError(error))
|
||||
}
|
||||
.doOnSuccess { selectedWallet ->
|
||||
updateAccessCodeRequestPolicy(selectedWallet)
|
||||
store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Wallet))
|
||||
store.onUserWalletSelected(selectedWallet)
|
||||
}
|
||||
|
|
@ -176,7 +179,6 @@ internal class WalletSelectorMiddleware {
|
|||
crossinline onCardScanned: suspend (ScanResponse) -> Unit,
|
||||
) {
|
||||
ScanCardProcessor.scan(
|
||||
useBiometricsForAccessCode = preferencesStorage.shouldSaveAccessCodes,
|
||||
onSuccess = {
|
||||
onCardScanned(it)
|
||||
},
|
||||
|
|
@ -210,11 +212,19 @@ internal class WalletSelectorMiddleware {
|
|||
val isSelectedWalletRemoved = prevSelectedWalletId != selectedWallet.walletId.stringValue
|
||||
|
||||
if (isSelectedWalletRemoved) {
|
||||
updateAccessCodeRequestPolicy(selectedWallet)
|
||||
store.onUserWalletSelected(selectedWallet)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateAccessCodeRequestPolicy(userWallet: UserWallet) {
|
||||
tangemSdkManager.setAccessCodeRequestPolicy(
|
||||
useBiometricsForAccessCode = preferencesStorage.shouldSaveAccessCodes &&
|
||||
userWallet.scanResponse.card.isAccessCodeSet,
|
||||
)
|
||||
}
|
||||
|
||||
private suspend fun UserWalletModel.updateWalletStoresAndCalculateFiatBalance(
|
||||
walletStores: List<WalletStoreModel>,
|
||||
): UserWalletModel {
|
||||
|
|
|
|||
|
|
@ -10,8 +10,10 @@ import com.tangem.tap.common.redux.navigation.AppScreen
|
|||
import com.tangem.tap.common.redux.navigation.NavigationAction
|
||||
import com.tangem.tap.domain.model.builders.UserWalletBuilder
|
||||
import com.tangem.tap.domain.scanCard.ScanCardProcessor
|
||||
import com.tangem.tap.preferencesStorage
|
||||
import com.tangem.tap.scope
|
||||
import com.tangem.tap.store
|
||||
import com.tangem.tap.tangemSdkManager
|
||||
import com.tangem.tap.userWalletsListManager
|
||||
import kotlinx.coroutines.launch
|
||||
import org.rekotlin.Middleware
|
||||
|
|
@ -48,6 +50,11 @@ internal class WelcomeMiddleware {
|
|||
}
|
||||
.doOnSuccess { selectedUserWallet ->
|
||||
if (selectedUserWallet != null) {
|
||||
tangemSdkManager.setAccessCodeRequestPolicy(
|
||||
useBiometricsForAccessCode = preferencesStorage.shouldSaveAccessCodes &&
|
||||
selectedUserWallet.scanResponse.card.isAccessCodeSet,
|
||||
)
|
||||
|
||||
store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Wallet))
|
||||
store.dispatchOnMain(WelcomeAction.ProceedWithBiometrics.Success)
|
||||
store.onUserWalletSelected(selectedUserWallet)
|
||||
|
|
@ -65,6 +72,9 @@ internal class WelcomeMiddleware {
|
|||
store.dispatchOnMain(WelcomeAction.ProceedWithCard.Error(error))
|
||||
}
|
||||
.doOnSuccess {
|
||||
tangemSdkManager.setAccessCodeRequestPolicy(
|
||||
useBiometricsForAccessCode = false,
|
||||
)
|
||||
store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Wallet))
|
||||
store.dispatchOnMain(WelcomeAction.ProceedWithCard.Success)
|
||||
store.onUserWalletSelected(userWallet)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue