From 228c37989d1e8986aed0461891832fa26c2726b4 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 24 Mar 2022 20:44:54 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../java/com/tangem/tap/common/Throttling.kt | 64 +++++++++++++++++++ .../com/tangem/tap/domain/TapWalletManager.kt | 51 +++++---------- .../send/redux/middlewares/SendMiddleware.kt | 2 +- 3 files changed, 81 insertions(+), 36 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/common/Throttling.kt diff --git a/app/src/main/java/com/tangem/tap/common/Throttling.kt b/app/src/main/java/com/tangem/tap/common/Throttling.kt new file mode 100644 index 0000000000..e0d3c6ee86 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/Throttling.kt @@ -0,0 +1,64 @@ +package com.tangem.tap.common + +/** +[REDACTED_AUTHOR] + */ +open class Throttler( + private val duration: Long, +) : Throttle { + + private val items: MutableMap = mutableMapOf() + + override fun isStillThrottled(item: T): Boolean { + val inThrottlingUpTo = items[item] ?: return false + val diff = System.currentTimeMillis() - inThrottlingUpTo + return diff < 0 + } + + override fun updateThrottlingTo(item: T): T { + val now = System.currentTimeMillis() + val throttledUpTo = items[item] ?: 0L + if (throttledUpTo == 0L || throttledUpTo < now) { + val newTime = now + duration + items[item] = newTime + } + return item + } + + open fun clear() { + items.clear() + } +} + +class ThrottlerWithValues( + duration: Long +) : Throttler(duration), ValuesHolder { + + private val valuesHolder: MutableMap = mutableMapOf() + + override fun setValue(item: T, value: V) { + valuesHolder[item] = value + } + + override fun geValue(item: T): V? = valuesHolder[item] + + override fun remove(item: T) { + valuesHolder.remove(item) + } + + override fun clear() { + valuesHolder.clear() + super.clear() + } +} + +interface Throttle { + fun isStillThrottled(item: T): Boolean + fun updateThrottlingTo(item: T): T +} + +interface ValuesHolder { + fun setValue(item: K, value: V) + fun geValue(item: K): V? + fun remove(item: K) +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt index fbd6e88bd9..a9461734ee 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -3,6 +3,8 @@ package com.tangem.tap.domain import com.tangem.blockchain.blockchains.solana.RentProvider import com.tangem.blockchain.common.* import com.tangem.common.services.Result +import com.tangem.tap.common.Throttler +import com.tangem.tap.common.ThrottlerWithValues import com.tangem.tap.common.extensions.dispatchDebugErrorNotification import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.safeUpdate @@ -39,32 +41,30 @@ class TapWalletManager { store.state.globalState.configManager?.config?.blockchainSdkConfig ?: BlockchainSdkConfig() } - private val walletManagersThrottler = Throttler(10000) + private val walletManagersThrottler = ThrottlerWithValues>(10000) private val fiatRatesThrottler = Throttler(60000) suspend fun loadWalletData(walletManager: WalletManager) { val blockchain = walletManager.wallet.blockchain val result = if (walletManagersThrottler.isStillThrottled(blockchain)) { delay(500) - Result.Success(walletManager.wallet) + walletManagersThrottler.geValue(blockchain)!! } else { - walletManagersThrottler.updateThrottlingTo(blockchain) - walletManager.safeUpdate() + updateThrottlingForWalletManager(walletManager) } handleUpdateWalletResult(result, walletManager) } suspend fun updateWallet(walletManager: WalletManager, force: Boolean) { val result = if (force) { - walletManager.safeUpdate() + updateThrottlingForWalletManager(walletManager) } else { val blockchain = walletManager.wallet.blockchain if (walletManagersThrottler.isStillThrottled(blockchain)) { delay(500) - Result.Success(walletManager.wallet) + walletManagersThrottler.geValue(blockchain)!! } else { - walletManagersThrottler.updateThrottlingTo(blockchain) - walletManager.safeUpdate() + updateThrottlingForWalletManager(walletManager) } } withContext(Dispatchers.Main) { @@ -75,7 +75,14 @@ class TapWalletManager { store.dispatch(WalletAction.UpdateWallet.Failure(result.error.localizedMessage)) } } + } + private suspend fun updateThrottlingForWalletManager(walletManager: WalletManager): Result { + val newResult = walletManager.safeUpdate() + val blockchain = walletManager.wallet.blockchain + walletManagersThrottler.updateThrottlingTo(blockchain) + walletManagersThrottler.setValue(blockchain, newResult) + return newResult } suspend fun loadFiatRate(fiatCurrency: FiatCurrencyName, wallet: Wallet) { @@ -248,6 +255,7 @@ class TapWalletManager { } private suspend fun handleUpdateWalletResult(result: Result, walletManager: WalletManager) { + walletManagersThrottler.setValue(walletManager.wallet.blockchain, result) withContext(Dispatchers.Main) { when (result) { is Result.Success -> { @@ -327,31 +335,4 @@ class TapWalletManager { fun Wallet.getFirstToken(): Token? { return getTokens().toList().getOrNull(0) -} - -class Throttler( - private val duration: Long, -) { - - private val items: MutableMap = mutableMapOf() - - fun isStillThrottled(item: T): Boolean { - val inThrottlingUpTo = items[item] ?: return false - val diff = System.currentTimeMillis() - inThrottlingUpTo - return diff < 0 - } - - fun updateThrottlingTo(item: T): T { - val now = System.currentTimeMillis() - val throttledUpTo = items[item] ?: 0L - if (throttledUpTo == 0L || throttledUpTo < now) { - val newTime = now + duration - items[item] = newTime - } - return item - } - - fun clear() { - items.clear() - } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt index f103fc3817..d659510cd4 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt @@ -204,7 +204,7 @@ private fun sendTransaction( withContext(Dispatchers.Main) { dispatch(WalletAction.UpdateWallet(walletManager.wallet.blockchain)) } - delay(10000) + delay(11000) // more than 10000 to avoid throttling withContext(Dispatchers.Main) { dispatch(WalletAction.UpdateWallet(walletManager.wallet.blockchain)) }