From e31403a39ae856561c8c8bb9808e247c415e35dc Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Mar 2022 14:48:10 +0300 Subject: [PATCH 01/24] Updated on 2026-08-14 --- .../tangem/tap/common/analytics/AnalyticsEvent.kt | 2 ++ .../java/com/tangem/tap/domain/TangemSdkManager.kt | 13 ++++++++++++- .../java/com/tangem/tap/features/demo/Extentions.kt | 4 +--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEvent.kt b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEvent.kt index 5099d3e1cd..90ff7d7f3b 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEvent.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEvent.kt @@ -4,6 +4,7 @@ enum class AnalyticsEvent(val event: String) { CARD_IS_SCANNED("card_is_scanned"), TRANSACTION_IS_SENT("transaction_is_sent"), READY_TO_SCAN("ready_to_scan"), + DEMO_MODE_ACTIVATED("demo_mode_activated"), APP_RATING_DISPLAYED("rate_app_warning_displayed"), APP_RATING_DISMISS("dismiss_rate_app_warning"), @@ -20,6 +21,7 @@ enum class AnalyticsEvent(val event: String) { enum class AnalyticsParam(val param: String) { BLOCKCHAIN("blockchain"), + CARD_ID("cardId"), BATCH_ID("batch_id"), FIRMWARE("firmware"), ACTION("action"), diff --git a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt index bb104a4c80..d4ac60c730 100644 --- a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt @@ -26,11 +26,13 @@ import com.tangem.operations.pins.SetUserCodeCommand import com.tangem.tap.common.analytics.Analytics import com.tangem.tap.common.analytics.AnalyticsEvent import com.tangem.tap.common.analytics.AnalyticsHandler +import com.tangem.tap.common.analytics.AnalyticsParam import com.tangem.tap.domain.tasks.CreateWalletAndRescanTask import com.tangem.tap.domain.tasks.product.ResetToFactorySettingsTask import com.tangem.tap.domain.tasks.product.ScanProductTask import com.tangem.tap.domain.tasks.product.ScanResponse import com.tangem.tap.domain.tokens.CurrenciesRepository +import com.tangem.tap.features.demo.DemoHelper import com.tangem.wallet.R import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.isActive @@ -70,12 +72,21 @@ class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Co result: CompletionResult ) { when (result) { - is CompletionResult.Success -> + is CompletionResult.Success -> { analyticsHandler?.triggerEvent( event = AnalyticsEvent.CARD_IS_SCANNED, card = result.data.card, blockchain = result.data.walletData?.blockchain ) + if (DemoHelper.isDemoCard(result.data)) { + analyticsHandler?.triggerEvent( + event = AnalyticsEvent.DEMO_MODE_ACTIVATED, + card = result.data.card, + blockchain = result.data.walletData?.blockchain, + params = mapOf(AnalyticsParam.CARD_ID.param to result.data.card.cardId) + ) + } + } is CompletionResult.Failure -> (result.error as? TangemSdkError)?.let { error -> analyticsHandler?.logCardSdkError( diff --git a/app/src/main/java/com/tangem/tap/features/demo/Extentions.kt b/app/src/main/java/com/tangem/tap/features/demo/Extentions.kt index f32c079efc..a863282f6d 100644 --- a/app/src/main/java/com/tangem/tap/features/demo/Extentions.kt +++ b/app/src/main/java/com/tangem/tap/features/demo/Extentions.kt @@ -1,6 +1,5 @@ package com.tangem.tap.features.demo -import com.tangem.blockchain.common.Wallet import com.tangem.blockchain.common.WalletManager import com.tangem.tap.domain.tasks.product.ScanResponse @@ -8,5 +7,4 @@ import com.tangem.tap.domain.tasks.product.ScanResponse [REDACTED_AUTHOR] */ fun ScanResponse.isDemoCard(): Boolean = DemoHelper.isDemoCardId(card.cardId) -fun WalletManager.isDemoWallet(): Boolean = DemoHelper.isDemoCardId(wallet.cardId) -fun Wallet.isDemoWallet(): Boolean = DemoHelper.isDemoCardId(cardId) \ No newline at end of file +fun WalletManager.isDemoWallet(): Boolean = DemoHelper.isDemoCardId(wallet.cardId) \ No newline at end of file From 0835b34e971bfb2599e460604d982b74095b9534 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Mar 2022 18:14:45 +0300 Subject: [PATCH 02/24] Updated on 2026-08-14 --- .../tangem/tap/features/home/HomeFragment.kt | 6 +++- .../tap/features/home/redux/HomeAction.kt | 2 +- .../tap/features/home/redux/HomeMiddleware.kt | 11 +++++-- .../wallet/redux/OnboardingWalletAction.kt | 4 +-- .../redux/OnboardingWalletMiddleware.kt | 30 ++----------------- .../wallet/redux/OnboardingWalletReducer.kt | 8 ----- .../wallet/redux/OnboardingWalletState.kt | 1 - .../wallet/ui/OnboardingWalletFragment.kt | 26 ++-------------- .../res/layout/fragment_onboarding_wallet.xml | 1 - app/src/main/res/menu/shop.xml | 8 ----- 10 files changed, 21 insertions(+), 76 deletions(-) delete mode 100644 app/src/main/res/menu/shop.xml diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index b577781a18..e9d11624a9 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -1,6 +1,8 @@ package com.tangem.tap.features.home +import android.content.Context import android.os.Bundle +import android.telephony.TelephonyManager import android.view.View import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf @@ -28,13 +30,15 @@ class HomeFragment : Fragment(R.layout.fragment_home), StoreSubscriber(R.id.cv_stories)?.setContent { AppCompatTheme { StoriesScreen( homeState, onScanButtonClick = { store.dispatch(HomeAction.ReadCard) }, - onShopButtonClick = { store.dispatch(HomeAction.GoToShop) } + onShopButtonClick = { store.dispatch(HomeAction.GoToShop(countryCodeValue)) } ) } } diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt index d14d4cf71b..79055cf993 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt @@ -6,7 +6,7 @@ import org.rekotlin.Action sealed class HomeAction : Action { // from ui object ReadCard : HomeAction() - object GoToShop : HomeAction() + data class GoToShop(val region: String) : HomeAction() // internal data class ShouldScanCardOnResume(val shouldScanCard: Boolean) : HomeAction() diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt index 89c34cbf42..eb0f261f8b 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt @@ -4,6 +4,7 @@ import com.tangem.tap.common.analytics.AnalyticsEvent import com.tangem.tap.common.analytics.AnalyticsParam import com.tangem.tap.common.analytics.GetCardSourceParams import com.tangem.tap.common.entities.IndeterminateProgressButton +import com.tangem.tap.common.extensions.dispatchOpenUrl import com.tangem.tap.common.extensions.onCardScanned import com.tangem.tap.common.extensions.withMainContext import com.tangem.tap.common.post @@ -14,6 +15,7 @@ import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.FragmentShareTransition import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.domain.DELAY_SDK_DIALOG_CLOSE +import com.tangem.tap.features.home.redux.HomeMiddleware.Companion.BUY_WALLET_URL import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsStep @@ -29,6 +31,7 @@ class HomeMiddleware { val handler = homeMiddleware const val CARD_SHOP_URI = "http://cards.tangem.com/" + const val BUY_WALLET_URL = "https://mv.tangem.com/" } } @@ -49,7 +52,11 @@ private val homeMiddleware: Middleware = { dispatch, state -> } is HomeAction.ReadCard -> handleReadCard() is HomeAction.GoToShop -> { - store.dispatch(NavigationAction.NavigateTo(AppScreen.Shop)) + if (action.region == "ru") { + store.dispatchOpenUrl(BUY_WALLET_URL) + } else { + store.dispatch(NavigationAction.NavigateTo(AppScreen.Shop)) + } store.state.globalState.analyticsHandlers?.triggerEvent( event = AnalyticsEvent.GET_CARD, params = mapOf(AnalyticsParam.SOURCE.param to GetCardSourceParams.WELCOME.param) @@ -66,7 +73,7 @@ private fun handleReadCard() { store.dispatch(NavigationAction.NavigateTo(AppScreen.Disclaimer)) } else { changeButtonState(ButtonState.PROGRESS) - store.dispatch(GlobalAction.ScanCard( onSuccess = { scanResponse -> + store.dispatch(GlobalAction.ScanCard(onSuccess = { scanResponse -> store.state.globalState.tapWalletManager.updateConfigManager(scanResponse) store.dispatch(TwinCardsAction.IfTwinsPrepareState(scanResponse)) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt index 57ede6fd8a..4795e9ffa8 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt @@ -21,7 +21,6 @@ sealed class OnboardingWalletAction : Action { sealed class BackupAction : Action { object DetermineBackupStep : BackupAction() - data class IntroduceBackup(val buyCardsUrl: String? = null) : BackupAction() object StartBackup : BackupAction() object DismissBackup : BackupAction() @@ -42,7 +41,6 @@ sealed class BackupAction : Action { data class Success(val cardId: CardId, val artwork: Bitmap) } - object GoToShop : BackupAction() object FinishAddingBackupCards : BackupAction() object ShowAccessCodeInfoScreen : BackupAction() @@ -58,7 +56,7 @@ sealed class BackupAction : Action { data class WriteBackupCard(val cardNumber: Int) : BackupAction() object PrepareToWritePrimaryCard : BackupAction() - object WritePrimaryCard: BackupAction() + object WritePrimaryCard : BackupAction() object FinishBackup : BackupAction() object DiscardBackup : BackupAction() diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index 9abbebd018..4004c0f96b 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -4,9 +4,6 @@ import com.tangem.common.CompletionResult import com.tangem.common.card.Card import com.tangem.operations.backup.BackupService import com.tangem.tap.* -import com.tangem.tap.common.analytics.AnalyticsEvent -import com.tangem.tap.common.analytics.AnalyticsParam -import com.tangem.tap.common.analytics.GetCardSourceParams import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.withMainContext import com.tangem.tap.common.redux.AppState @@ -17,7 +14,6 @@ import com.tangem.tap.domain.extensions.hasWallets import com.tangem.tap.domain.tasks.product.ScanResponse import com.tangem.tap.features.demo.DemoHelper import com.tangem.tap.features.home.redux.HomeAction -import com.tangem.tap.features.onboarding.products.wallet.redux.OnboardingWalletMiddleware.Companion.BUY_WALLET_URL import com.tangem.tap.features.wallet.redux.Artwork import kotlinx.coroutines.launch import org.rekotlin.Action @@ -26,8 +22,6 @@ import org.rekotlin.Middleware class OnboardingWalletMiddleware { companion object { val handler = onboardingWalletMiddleware - - const val BUY_WALLET_URL = "https://wallet.tangem.com/" } } @@ -116,21 +110,8 @@ private fun handleWalletAction(action: Action) { OnboardingWalletAction.ProceedBackup -> { val newAction = when (val backupState = backupService.currentState) { BackupService.State.FinalizingPrimaryCard -> BackupAction.PrepareToWritePrimaryCard - is BackupService.State.FinalizingBackupCard -> - BackupAction.PrepareToWriteBackupCard(backupState.index) - else -> { - val url = if (card?.issuer?.name?.lowercase()?.contains("tangem") == true) { - BUY_WALLET_URL - } else { - null - } - if (walletState.backupState.backupStep == BackupStep.InitBackup || - walletState.backupState.backupStep == BackupStep.Finished) { - BackupAction.IntroduceBackup(url) - } else { - null - } - } + is BackupService.State.FinalizingBackupCard -> BackupAction.PrepareToWriteBackupCard(backupState.index) + else -> null } newAction?.let { store.dispatch(it) } } @@ -221,13 +202,6 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction) } } } - is BackupAction.GoToShop -> { - store.dispatch(NavigationAction.NavigateTo(AppScreen.Shop)) - store.state.globalState.analyticsHandlers?.triggerEvent( - event = AnalyticsEvent.GET_CARD, - params = mapOf(AnalyticsParam.SOURCE.param to GetCardSourceParams.ONBOARDING.param) - ) - } is BackupAction.FinishAddingBackupCards -> { if (backupService.addedBackupCardsCount == 1) { store.dispatchOnMain(GlobalAction.ShowDialog(BackupDialog.AddMoreBackupCards)) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt index f46c1bf0ff..50ce9878e1 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt @@ -39,14 +39,7 @@ class BackupReducer { ): BackupState { return when (action) { - is BackupAction.IntroduceBackup -> BackupState( - backupStep = BackupStep.InitBackup, - canSkipBackup = state.canSkipBackup, - buyAdditionalCardsUrl = action.buyCardsUrl - ) - BackupAction.StartAddingPrimaryCard -> state.copy(backupStep = BackupStep.ScanOriginCard) - BackupAction.StartAddingBackupCards -> { state.copy(backupStep = BackupStep.AddBackupCards) } @@ -122,7 +115,6 @@ class BackupReducer { BackupAction.DismissBackup -> state is BackupAction.LoadBackupCardArtwork -> state is BackupAction.CheckAccessCode -> state - BackupAction.GoToShop -> state BackupAction.DetermineBackupStep -> state BackupAction.CheckForUnfinishedBackup -> state BackupAction.DiscardBackup -> state diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt index 7aaa0fe88f..591573b35b 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt @@ -52,7 +52,6 @@ data class BackupState( val backupStep: BackupStep = BackupStep.InitBackup, val maxBackupCards: Int = 2, val canSkipBackup: Boolean = true, - val buyAdditionalCardsUrl: String? = null ) enum class AccessCodeError { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt index 056eb28b12..b9691488c5 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt @@ -2,7 +2,9 @@ package com.tangem.tap.features.onboarding.products.wallet.ui import android.os.Bundle import android.util.TypedValue -import android.view.* +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment @@ -387,28 +389,6 @@ class OnboardingWalletFragment : Fragment(R.layout.fragment_onboarding_wallet), } } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - R.id.shop_menu -> { - store.dispatch(BackupAction.GoToShop) - true - } - else -> super.onOptionsItemSelected(item) - } - } - - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.shop, menu) - - val backupState = store.state.onboardingWalletState.backupState - val backupStep = backupState.backupStep - - val shopMenuShouldBeVisible = - (backupStep == BackupStep.ScanOriginCard || backupStep == BackupStep.AddBackupCards) && - backupState.buyAdditionalCardsUrl != null - menu.getItem(0).isVisible = shopMenuShouldBeVisible - } - override fun handleOnBackPressed() { store.dispatch(OnboardingWalletAction.OnBackPressed) } diff --git a/app/src/main/res/layout/fragment_onboarding_wallet.xml b/app/src/main/res/layout/fragment_onboarding_wallet.xml index 904ab50059..903a3c218b 100644 --- a/app/src/main/res/layout/fragment_onboarding_wallet.xml +++ b/app/src/main/res/layout/fragment_onboarding_wallet.xml @@ -23,7 +23,6 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" - app:menu="@menu/shop" app:navigationIcon="@drawable/ic_baseline_arrow_back_24" app:title="@string/onboarding_getting_started" /> diff --git a/app/src/main/res/menu/shop.xml b/app/src/main/res/menu/shop.xml deleted file mode 100644 index 092327411a..0000000000 --- a/app/src/main/res/menu/shop.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file From de03cc28b636ef9448a8d88c07c85debcc4c9425 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Mar 2022 20:49:07 +0300 Subject: [PATCH 03/24] Updated on 2026-08-14 --- .../tap/features/wallet/redux/WalletState.kt | 39 ++++++++++------- .../redux/middlewares/WalletMiddleware.kt | 42 +++++++++++++------ .../wallet/redux/reducers/WalletReducer.kt | 25 ++++++++++- 3 files changed, 77 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt index 92491013ad..e8521c17d9 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt @@ -34,6 +34,7 @@ data class WalletState( val mainWarningsList: List = mutableListOf(), val wallets: List = emptyList(), val walletManagers: List = emptyList(), + val walletManagersThrottling: MutableMap = mutableMapOf(), val isMultiwalletAllowed: Boolean = false, val cardCurrency: CryptoCurrencyName? = null, val selectedWallet: Currency? = null, @@ -54,8 +55,8 @@ data class WalletState( val primaryWallet = if (wallets.isNotEmpty()) wallets[0] else null val shouldShowDetails: Boolean = - primaryWallet?.currencyData?.status != BalanceStatus.EmptyCard && - primaryWallet?.currencyData?.status != BalanceStatus.UnknownBlockchain + primaryWallet?.currencyData?.status != BalanceStatus.EmptyCard && + primaryWallet?.currencyData?.status != BalanceStatus.UnknownBlockchain val blockchains: List get() = walletManagers.map { it.wallet.blockchain } @@ -63,6 +64,8 @@ data class WalletState( val currencies: List get() = wallets.mapNotNull { it.currency } + val throttlingDuration = 10000L + fun getWalletManager(token: Token?): WalletManager? { if (token == null) return null return walletManagers.find { it.wallet.blockchain == token.blockchain } @@ -101,10 +104,10 @@ data class WalletState( if (!isPrimaryCurrency(walletData)) { val walletManager = getWalletManager(walletData.currency) - ?: return true + ?: return true if (walletData.currency is Currency.Blockchain && - walletManager.cardTokens.isNotEmpty() + walletManager.cardTokens.isNotEmpty() ) { return false } @@ -113,22 +116,22 @@ data class WalletState( if (walletData.currency is Currency.Blockchain) { return wallet.recentTransactions.toPendingTransactions(wallet.address).isEmpty() && - wallet.amounts.toSendableAmounts().isEmpty() + wallet.amounts.toSendableAmounts().isEmpty() } else if (walletData.currency is Currency.Token) ( - return wallet.recentTransactions.toPendingTransactionsForToken( - walletData.currency.token, wallet.address).isEmpty() - && wallet.amounts[AmountType.Token(token = walletData.currency.token)] - ?.isAboveZero() != true - ) + return wallet.recentTransactions.toPendingTransactionsForToken( + walletData.currency.token, wallet.address).isEmpty() + && wallet.amounts[AmountType.Token(token = walletData.currency.token)] + ?.isAboveZero() != true + ) } return false } private fun isPrimaryCurrency(walletData: WalletData): Boolean { return (walletData.currency is Currency.Blockchain && - walletData.currency.blockchain == store.state.walletState.primaryBlockchain) - || (walletData.currency is Currency.Token && - walletData.currency.token == store.state.walletState.primaryToken) + walletData.currency.blockchain == store.state.walletState.primaryBlockchain) + || (walletData.currency is Currency.Token && + walletData.currency.token == store.state.walletState.primaryToken) } fun replaceWalletInWallets(walletData: WalletData?): List { @@ -149,7 +152,7 @@ data class WalletState( val remainingWallets: MutableList = newWallets.toMutableList() val updatedWallets = wallets.map { wallet -> val newWallet = newWallets - .firstOrNull { wallet.currency == it.currency } + .firstOrNull { wallet.currency == it.currency } if (newWallet == null) { wallet } else { @@ -176,9 +179,15 @@ data class WalletState( fun addWalletManagers(newWalletManagers: List): WalletState { val updatedWalletManagers = this.walletManagers + - newWalletManagers.filterNot { this.blockchains.contains(it.wallet.blockchain) } + newWalletManagers.filterNot { this.blockchains.contains(it.wallet.blockchain) } return copy(walletManagers = updatedWalletManagers) } + + fun isThrottling(walletManager: WalletManager): Boolean { + val inThrottlingUpTo = walletManagersThrottling[walletManager.wallet.blockchain] ?: return false + val diff = System.currentTimeMillis() - inThrottlingUpTo + return diff < 0 + } } sealed class WalletDialog : StateDialog { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index 379008a18b..28abc867e9 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -29,9 +29,7 @@ import com.tangem.tap.network.NetworkStateChanged import com.tangem.tap.scope import com.tangem.tap.store import com.tangem.tap.tangemSdkManager -import kotlinx.coroutines.async -import kotlinx.coroutines.awaitAll -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import org.rekotlin.Action import org.rekotlin.DispatchFunction import org.rekotlin.Middleware @@ -61,14 +59,32 @@ class WalletMiddleware { is WalletAction.Warnings -> warningsMiddleware.handle(action, globalState) is WalletAction.MultiWallet -> multiWalletMiddleware.handle(action, walletState, globalState) is WalletAction.LoadWallet -> { - scope.launch { - if (action.blockchain == null) { - walletState.walletManagers.map { walletManager -> - async { globalState.tapWalletManager.loadWalletData(walletManager) } - }.awaitAll() - } else { - val walletManager = walletState.getWalletManager(action.blockchain) - walletManager?.let { globalState.tapWalletManager.loadWalletData(it) } + if (action.blockchain == null) { + val throttledWalletManagers = walletState.walletManagers.filter { walletState.isThrottling(it) } + val freeWalletManagers = walletState.walletManagers.filter { !walletState.isThrottling(it) } + scope.launch { + freeWalletManagers.map { walletManager -> + async { globalState.tapWalletManager.loadWalletData(walletManager) } + }.awaitAll() + + delay(500) + launch(Dispatchers.Main) { + throttledWalletManagers.forEach { store.dispatch(WalletAction.LoadWallet.Success(it.wallet)) } + } + } + + } else { + val walletManager = walletState.getWalletManager(action.blockchain) ?: return + + scope.launch { + if (walletState.isThrottling(walletManager)) { + delay(500) + launch(Dispatchers.Main) { + store.dispatch(WalletAction.LoadWallet.Success(walletManager.wallet)) + } + } else { + globalState.tapWalletManager.loadWalletData(walletManager) + } } } } @@ -230,12 +246,12 @@ class WalletMiddleware { when (currency) { is Currency.Blockchain -> { val amountToSend = amounts?.find { it.currencySymbol == currency.blockchain.currency } - ?: return WalletAction.Send.ChooseCurrency(amounts) + ?: return WalletAction.Send.ChooseCurrency(amounts) PrepareSendScreen(amountToSend, selectedWalletData.fiatRate, walletManager) } is Currency.Token -> { val amountToSend = amounts?.find { it.currencySymbol == currency.token.symbol } - ?: return WalletAction.Send.ChooseCurrency(amounts) + ?: return WalletAction.Send.ChooseCurrency(amounts) prepareSendActionForToken(amountToSend, state, selectedWalletData, wallet, walletManager) } } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt index af75afcb1b..4077d877ee 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt @@ -94,8 +94,20 @@ private fun internalReduce(action: Action, state: AppState): WalletState { } is WalletAction.LoadWallet -> { if (action.blockchain == null) { - val wallets = newState.wallets.map { wallet -> + // update throttling + val updatedThrottling = newState.walletManagersThrottling + newState.walletManagers.forEach { + val now = System.currentTimeMillis() + val currentThrottling = newState.walletManagersThrottling[it.wallet.blockchain] ?: 0L + if (currentThrottling == 0L || currentThrottling < now) { + val newThrottlingUpTo = now + newState.throttlingDuration + updatedThrottling[it.wallet.blockchain] = newThrottlingUpTo + } + } + newState = newState.copy(walletManagersThrottling = updatedThrottling) + + val wallets = newState.wallets.map { wallet -> wallet.copy( currencyData = wallet.currencyData.copy( status = BalanceStatus.Loading, @@ -113,6 +125,17 @@ private fun internalReduce(action: Action, state: AppState): WalletState { } else { val walletManager = newState.getWalletManager(action.blockchain) ?: return newState val blockchain = walletManager.wallet.blockchain + + // update throttling + val now = System.currentTimeMillis() + val currentThrottling = newState.walletManagersThrottling[blockchain] ?: 0L + if (currentThrottling == 0L || currentThrottling < now) { + val newThrottlingUpTo = now + newState.throttlingDuration + val newMap = newState.walletManagersThrottling.toMutableMap() + newMap[blockchain] = newThrottlingUpTo + newState = newState.copy(walletManagersThrottling = newMap) + } + val currencies = listOf(Currency.Blockchain(blockchain)) + walletManager.cardTokens.map { Currency.Token(it) } val newWallets = newState.wallets.filter { currencies.contains(it.currency) } From bd7218fa794ae4952ad2d956ea507abe3066cd6e Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Mar 2022 21:27:16 +0300 Subject: [PATCH 04/24] Updated on 2026-08-14 --- .../com/tangem/tap/domain/TapWalletManager.kt | 60 ++++++++++++++++--- .../tap/features/wallet/redux/WalletState.kt | 7 --- .../redux/middlewares/WalletMiddleware.kt | 34 +++-------- .../wallet/redux/reducers/WalletReducer.kt | 24 -------- 4 files changed, 62 insertions(+), 63 deletions(-) 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 55fc7f2154..5af87ae3a8 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -27,22 +27,42 @@ import com.tangem.tap.network.coinmarketcap.CoinMarketCapService import com.tangem.tap.scope import com.tangem.tap.store import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.math.BigDecimal class TapWalletManager { - private val coinMarketCapService = CoinMarketCapService() - - private val blockchainSdkConfig by lazy { - store.state.globalState.configManager?.config?.blockchainSdkConfig ?: BlockchainSdkConfig() - } val walletManagerFactory: WalletManagerFactory by lazy { WalletManagerFactory(blockchainSdkConfig) } + private val coinMarketCapService = CoinMarketCapService() + private val blockchainSdkConfig by lazy { + store.state.globalState.configManager?.config?.blockchainSdkConfig ?: BlockchainSdkConfig() + } + + private val throttlingDuration = 10000 + private val throttlingWalletManagers: MutableMap = mutableMapOf() + + private val throttlingFiatRateDuration = 60000 + private val throttlingFiatRate: MutableMap = mutableMapOf() + suspend fun loadWalletData(walletManager: WalletManager) { - handleUpdateWalletResult(walletManager.safeUpdate(), walletManager) + val result = if (managerIsStillThrottled(walletManager)) { + delay(200) + Result.Success(walletManager.wallet) + } else { + val blockchain = walletManager.wallet.blockchain + val now = System.currentTimeMillis() + val throttledUpTo = throttlingWalletManagers[blockchain] ?: 0L + if (throttledUpTo == 0L || throttledUpTo < now) { + val newTime = now + throttlingDuration + throttlingWalletManagers[blockchain] = newTime + } + walletManager.safeUpdate() + } + handleUpdateWalletResult(result, walletManager) } suspend fun updateWallet(walletManager: WalletManager) { @@ -72,7 +92,21 @@ class TapWalletManager { suspend fun loadFiatRate(fiatCurrency: FiatCurrencyName, currencies: List) { val results = mutableListOf?>>() - currencies.forEach { + val toUpdate = currencies.mapNotNull { + if (fiatRateIsStillThrottled(it)) { + null + } else { + val now = System.currentTimeMillis() + val throttledUpTo = throttlingFiatRate[it] ?: 0L + if (throttledUpTo == 0L || throttledUpTo < now) { + val newTime = now + throttlingFiatRateDuration + throttlingFiatRate[it] = newTime + } + it + } + } + + toUpdate.forEach { results.add(it to coinMarketCapService.getRate(it.currencySymbol, fiatCurrency)) } handleFiatRatesResult(results) @@ -301,6 +335,18 @@ class TapWalletManager { } } } + + private fun managerIsStillThrottled(walletManager: WalletManager): Boolean { + val inThrottlingUpTo = throttlingWalletManagers[walletManager.wallet.blockchain] ?: return false + val diff = System.currentTimeMillis() - inThrottlingUpTo + return diff < 0 + } + + private fun fiatRateIsStillThrottled(currency: Currency): Boolean { + val inThrottlingUpTo = throttlingFiatRate[currency] ?: return false + val diff = System.currentTimeMillis() - inThrottlingUpTo + return diff < 0 + } } fun Wallet.getFirstToken(): Token? { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt index e8521c17d9..58dfedb6ce 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt @@ -34,7 +34,6 @@ data class WalletState( val mainWarningsList: List = mutableListOf(), val wallets: List = emptyList(), val walletManagers: List = emptyList(), - val walletManagersThrottling: MutableMap = mutableMapOf(), val isMultiwalletAllowed: Boolean = false, val cardCurrency: CryptoCurrencyName? = null, val selectedWallet: Currency? = null, @@ -182,12 +181,6 @@ data class WalletState( newWalletManagers.filterNot { this.blockchains.contains(it.wallet.blockchain) } return copy(walletManagers = updatedWalletManagers) } - - fun isThrottling(walletManager: WalletManager): Boolean { - val inThrottlingUpTo = walletManagersThrottling[walletManager.wallet.blockchain] ?: return false - val diff = System.currentTimeMillis() - inThrottlingUpTo - return diff < 0 - } } sealed class WalletDialog : StateDialog { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index 28abc867e9..e48b76c1a6 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -29,7 +29,9 @@ import com.tangem.tap.network.NetworkStateChanged import com.tangem.tap.scope import com.tangem.tap.store import com.tangem.tap.tangemSdkManager -import kotlinx.coroutines.* +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.launch import org.rekotlin.Action import org.rekotlin.DispatchFunction import org.rekotlin.Middleware @@ -59,32 +61,14 @@ class WalletMiddleware { is WalletAction.Warnings -> warningsMiddleware.handle(action, globalState) is WalletAction.MultiWallet -> multiWalletMiddleware.handle(action, walletState, globalState) is WalletAction.LoadWallet -> { - if (action.blockchain == null) { - val throttledWalletManagers = walletState.walletManagers.filter { walletState.isThrottling(it) } - val freeWalletManagers = walletState.walletManagers.filter { !walletState.isThrottling(it) } - scope.launch { - freeWalletManagers.map { walletManager -> + scope.launch { + if (action.blockchain == null) { + walletState.walletManagers.map { walletManager -> async { globalState.tapWalletManager.loadWalletData(walletManager) } }.awaitAll() - - delay(500) - launch(Dispatchers.Main) { - throttledWalletManagers.forEach { store.dispatch(WalletAction.LoadWallet.Success(it.wallet)) } - } - } - - } else { - val walletManager = walletState.getWalletManager(action.blockchain) ?: return - - scope.launch { - if (walletState.isThrottling(walletManager)) { - delay(500) - launch(Dispatchers.Main) { - store.dispatch(WalletAction.LoadWallet.Success(walletManager.wallet)) - } - } else { - globalState.tapWalletManager.loadWalletData(walletManager) - } + } else { + val walletManager = walletState.getWalletManager(action.blockchain) + walletManager?.let { globalState.tapWalletManager.loadWalletData(it) } } } } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt index 4077d877ee..960a4e76b7 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt @@ -94,19 +94,6 @@ private fun internalReduce(action: Action, state: AppState): WalletState { } is WalletAction.LoadWallet -> { if (action.blockchain == null) { - // update throttling - val updatedThrottling = newState.walletManagersThrottling - newState.walletManagers.forEach { - val now = System.currentTimeMillis() - val currentThrottling = newState.walletManagersThrottling[it.wallet.blockchain] ?: 0L - if (currentThrottling == 0L || currentThrottling < now) { - val newThrottlingUpTo = now + newState.throttlingDuration - updatedThrottling[it.wallet.blockchain] = newThrottlingUpTo - } - - } - newState = newState.copy(walletManagersThrottling = updatedThrottling) - val wallets = newState.wallets.map { wallet -> wallet.copy( currencyData = wallet.currencyData.copy( @@ -125,17 +112,6 @@ private fun internalReduce(action: Action, state: AppState): WalletState { } else { val walletManager = newState.getWalletManager(action.blockchain) ?: return newState val blockchain = walletManager.wallet.blockchain - - // update throttling - val now = System.currentTimeMillis() - val currentThrottling = newState.walletManagersThrottling[blockchain] ?: 0L - if (currentThrottling == 0L || currentThrottling < now) { - val newThrottlingUpTo = now + newState.throttlingDuration - val newMap = newState.walletManagersThrottling.toMutableMap() - newMap[blockchain] = newThrottlingUpTo - newState = newState.copy(walletManagersThrottling = newMap) - } - val currencies = listOf(Currency.Blockchain(blockchain)) + walletManager.cardTokens.map { Currency.Token(it) } val newWallets = newState.wallets.filter { currencies.contains(it.currency) } From c14fe4b45560e2da5ee1a6e7626814a167519b80 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Mar 2022 21:40:00 +0300 Subject: [PATCH 05/24] Updated on 2026-08-14 --- .../com/tangem/tap/domain/TapWalletManager.kt | 80 +++++++++---------- 1 file changed, 39 insertions(+), 41 deletions(-) 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 5af87ae3a8..d89deeab6c 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -42,24 +42,16 @@ class TapWalletManager { store.state.globalState.configManager?.config?.blockchainSdkConfig ?: BlockchainSdkConfig() } - private val throttlingDuration = 10000 - private val throttlingWalletManagers: MutableMap = mutableMapOf() - - private val throttlingFiatRateDuration = 60000 - private val throttlingFiatRate: MutableMap = mutableMapOf() + private val walletManagersThrottler = Throttler(10000) + private val fiatRatesThrottler = Throttler(60000) suspend fun loadWalletData(walletManager: WalletManager) { - val result = if (managerIsStillThrottled(walletManager)) { + val blockchain = walletManager.wallet.blockchain + val result = if (walletManagersThrottler.isStillThrottled(blockchain)) { delay(200) Result.Success(walletManager.wallet) } else { - val blockchain = walletManager.wallet.blockchain - val now = System.currentTimeMillis() - val throttledUpTo = throttlingWalletManagers[blockchain] ?: 0L - if (throttledUpTo == 0L || throttledUpTo < now) { - val newTime = now + throttlingDuration - throttlingWalletManagers[blockchain] = newTime - } + walletManagersThrottler.updateThrottlingTo(blockchain) walletManager.safeUpdate() } handleUpdateWalletResult(result, walletManager) @@ -92,27 +84,18 @@ class TapWalletManager { suspend fun loadFiatRate(fiatCurrency: FiatCurrencyName, currencies: List) { val results = mutableListOf?>>() - val toUpdate = currencies.mapNotNull { - if (fiatRateIsStillThrottled(it)) { - null - } else { - val now = System.currentTimeMillis() - val throttledUpTo = throttlingFiatRate[it] ?: 0L - if (throttledUpTo == 0L || throttledUpTo < now) { - val newTime = now + throttlingFiatRateDuration - throttlingFiatRate[it] = newTime - } - it + currencies.forEach { + if (!fiatRatesThrottler.isStillThrottled(it)) { + fiatRatesThrottler.updateThrottlingTo(it) + results.add(it to coinMarketCapService.getRate(it.currencySymbol, fiatCurrency)) + handleFiatRatesResult(results) } } - - toUpdate.forEach { - results.add(it to coinMarketCapService.getRate(it.currencySymbol, fiatCurrency)) - } - handleFiatRatesResult(results) } suspend fun onCardScanned(data: ScanResponse) { + walletManagersThrottler.clear() + fiatRatesThrottler.clear() store.state.globalState.feedbackManager?.infoHolder?.setCardInfo(data.card) updateConfigManager(data) @@ -335,20 +318,35 @@ class TapWalletManager { } } } - - private fun managerIsStillThrottled(walletManager: WalletManager): Boolean { - val inThrottlingUpTo = throttlingWalletManagers[walletManager.wallet.blockchain] ?: return false - val diff = System.currentTimeMillis() - inThrottlingUpTo - return diff < 0 - } - - private fun fiatRateIsStillThrottled(currency: Currency): Boolean { - val inThrottlingUpTo = throttlingFiatRate[currency] ?: return false - val diff = System.currentTimeMillis() - inThrottlingUpTo - return diff < 0 - } } 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 From 8d291b40952091c75f0c479fded4b478f522d0fd Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Mar 2022 21:43:12 +0300 Subject: [PATCH 06/24] Updated on 2026-08-14 --- .../java/com/tangem/tap/features/wallet/redux/WalletState.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt index 58dfedb6ce..b4ce090f81 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt @@ -63,8 +63,6 @@ data class WalletState( val currencies: List get() = wallets.mapNotNull { it.currency } - val throttlingDuration = 10000L - fun getWalletManager(token: Token?): WalletManager? { if (token == null) return null return walletManagers.find { it.wallet.blockchain == token.blockchain } From 643c12023b67c95503914f65e64599a5f6d4a90b Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Mar 2022 22:33:19 +0300 Subject: [PATCH 07/24] Updated on 2026-08-14 --- .../com/tangem/tap/domain/TapWalletManager.kt | 15 +++++++++++++-- .../tap/features/wallet/redux/WalletAction.kt | 2 +- .../wallet/redux/middlewares/WalletMiddleware.kt | 7 ++++--- .../tap/features/wallet/ui/WalletFragment.kt | 2 +- 4 files changed, 19 insertions(+), 7 deletions(-) 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 d89deeab6c..15ac94f6ac 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -57,8 +57,19 @@ class TapWalletManager { handleUpdateWalletResult(result, walletManager) } - suspend fun updateWallet(walletManager: WalletManager) { - val result = walletManager.safeUpdate() + suspend fun updateWallet(walletManager: WalletManager, force: Boolean) { + val result = if (force) { + walletManager.safeUpdate() + } else { + val blockchain = walletManager.wallet.blockchain + if (walletManagersThrottler.isStillThrottled(blockchain)) { + delay(200) + Result.Success(walletManager.wallet) + } else { + walletManagersThrottler.updateThrottlingTo(blockchain) + walletManager.safeUpdate() + } + } withContext(Dispatchers.Main) { when (result) { is Result.Success -> diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt index 57a03d4313..f2ec828995 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt @@ -74,7 +74,7 @@ sealed class WalletAction : Action { class CheckRemainingSignatures(val remainingSignatures: Int?) : Warnings() } - data class UpdateWallet(val blockchain: Blockchain? = null) : WalletAction() { + data class UpdateWallet(val blockchain: Blockchain? = null, val force: Boolean = true) : WalletAction() { object ScheduleUpdatingWallet : WalletAction() data class Success(val wallet: Wallet) : WalletAction() data class Failure(val errorMessage: String? = null) : WalletAction() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index e48b76c1a6..dc17653642 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -99,7 +99,7 @@ class WalletMiddleware { else -> { globalState.tapWalletManager.loadFiatRate( fiatCurrency = globalState.appCurrency, - currencies = walletState.wallets.mapNotNull { it.currency } + currencies = walletState.wallets.map { it.currency } ) } } @@ -131,13 +131,13 @@ class WalletMiddleware { if (action.blockchain != null) { scope.launch { val walletManager = walletState.getWalletManager(action.blockchain) - walletManager?.let { globalState.tapWalletManager.updateWallet(it) } + walletManager?.let { globalState.tapWalletManager.updateWallet(it, action.force) } } } else { scope.launch { if (walletState.state == ProgressState.Done) { walletState.walletManagers.map { walletManager -> - globalState.tapWalletManager.updateWallet(walletManager) + globalState.tapWalletManager.updateWallet(walletManager, action.force) } } } @@ -163,6 +163,7 @@ class WalletMiddleware { ) withMainContext { actionList.forEach { store.dispatch(it) } } } + is Result.Failure -> {} } store.dispatchOnMain(WalletAction.Warnings.CheckIfNeeded) } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt index 9f6a876537..ca1b70231e 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt @@ -63,7 +63,7 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber Date: Wed, 23 Mar 2022 22:33:45 +0300 Subject: [PATCH 08/24] Updated on 2026-08-14 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 251ffa5c62..e383b6fdbf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -80,8 +80,8 @@ dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' implementation 'com.tangem:blockchain:develop-65' - implementation 'com.tangem.tangem-sdk-kotlin:core:develop-139' - implementation 'com.tangem.tangem-sdk-kotlin:android:develop-139' + implementation 'com.tangem.tangem-sdk-kotlin:core:develop-140' + implementation 'com.tangem.tangem-sdk-kotlin:android:develop-140' // WebView implementation "androidx.browser:browser:1.3.0" From acb9aa5fd968bb680286796105846d44d6f8f00e Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 24 Mar 2022 14:38:55 +0400 Subject: [PATCH 09/24] Updated on 2026-08-14 --- .../tangem/tap/features/tokens/redux/TokensMiddleware.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt index 123e5c25ff..abff50485f 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt @@ -9,6 +9,7 @@ import com.tangem.common.extensions.toMapKey import com.tangem.common.hdWallet.DerivationPath import com.tangem.operations.derivation.ExtendedPublicKeysMap import com.tangem.tap.common.extensions.dispatchErrorNotification +import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.navigation.NavigationAction @@ -106,11 +107,11 @@ class TokensMiddleware { val updatedScanResponse = scanResponse.copy( derivedKeys = updatedDerivedKeys ) - store.dispatch(GlobalAction.SaveScanNoteResponse(updatedScanResponse)) + store.dispatchOnMain(GlobalAction.SaveScanNoteResponse(updatedScanResponse)) submitAdd(blockchains, tokens) delay(DELAY_SDK_DIALOG_CLOSE) - store.dispatch(NavigationAction.PopBackTo()) + store.dispatchOnMain(NavigationAction.PopBackTo()) } is CompletionResult.Failure -> { store.dispatchErrorNotification(TapError.CustomError("Error adding tokens")) @@ -155,6 +156,6 @@ class TokensMiddleware { WalletAction.MultiWallet.AddBlockchain(it) } + tokens.map { WalletAction.MultiWallet.AddToken(it) - }).forEach { store.dispatch(it) } + }).forEach { store.dispatchOnMain(it) } } } \ No newline at end of file From 709d56c34d52caeb4a727ff6314f062917bb8536 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 24 Mar 2022 19:31:05 +0300 Subject: [PATCH 10/24] Updated on 2026-08-14 --- .../java/com/tangem/tap/domain/TapWalletManager.kt | 10 +--------- .../wallet/redux/middlewares/WalletMiddleware.kt | 10 ++++++---- 2 files changed, 7 insertions(+), 13 deletions(-) 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 15ac94f6ac..c4b3579743 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -26,10 +26,7 @@ import com.tangem.tap.network.NetworkConnectivity import com.tangem.tap.network.coinmarketcap.CoinMarketCapService import com.tangem.tap.scope import com.tangem.tap.store -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext +import kotlinx.coroutines.* import java.math.BigDecimal @@ -88,11 +85,6 @@ class TapWalletManager { loadFiatRate(fiatCurrency, currencies) } - suspend fun loadFiatRate(fiatCurrency: FiatCurrencyName, currency: Currency) { - val currencies = listOf(currency) - loadFiatRate(fiatCurrency, currencies) - } - suspend fun loadFiatRate(fiatCurrency: FiatCurrencyName, currencies: List) { val results = mutableListOf?>>() currencies.forEach { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index dc17653642..8c9a06c2e2 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -88,18 +88,20 @@ class WalletMiddleware { when { action.wallet != null -> { globalState.tapWalletManager.loadFiatRate( - globalState.appCurrency, action.wallet + fiatCurrency = globalState.appCurrency, + wallet = action.wallet, ) } - action.currency != null -> { + action.currencyList != null -> { globalState.tapWalletManager.loadFiatRate( - globalState.appCurrency, action.currency + fiatCurrency = globalState.appCurrency, + currencies = action.currencyList, ) } else -> { globalState.tapWalletManager.loadFiatRate( fiatCurrency = globalState.appCurrency, - currencies = walletState.wallets.map { it.currency } + currencies = walletState.wallets.map { it.currency }, ) } } From 67b0629d980229eff231d9f353a6a024995da586 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 24 Mar 2022 19:49:36 +0300 Subject: [PATCH 11/24] Updated on 2026-08-14 --- .../com/tangem/tap/domain/TapWalletManager.kt | 22 ++-- .../tap/features/wallet/redux/WalletAction.kt | 2 +- .../middlewares/MultiWalletMiddleware.kt | 104 ++++++------------ 3 files changed, 46 insertions(+), 82 deletions(-) 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 c4b3579743..fbd6e88bd9 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -45,7 +45,7 @@ class TapWalletManager { suspend fun loadWalletData(walletManager: WalletManager) { val blockchain = walletManager.wallet.blockchain val result = if (walletManagersThrottler.isStillThrottled(blockchain)) { - delay(200) + delay(500) Result.Success(walletManager.wallet) } else { walletManagersThrottler.updateThrottlingTo(blockchain) @@ -60,7 +60,7 @@ class TapWalletManager { } else { val blockchain = walletManager.wallet.blockchain if (walletManagersThrottler.isStillThrottled(blockchain)) { - delay(200) + delay(500) Result.Success(walletManager.wallet) } else { walletManagersThrottler.updateThrottlingTo(blockchain) @@ -87,13 +87,16 @@ class TapWalletManager { suspend fun loadFiatRate(fiatCurrency: FiatCurrencyName, currencies: List) { val results = mutableListOf?>>() - currencies.forEach { - if (!fiatRatesThrottler.isStillThrottled(it)) { - fiatRatesThrottler.updateThrottlingTo(it) - results.add(it to coinMarketCapService.getRate(it.currencySymbol, fiatCurrency)) - handleFiatRatesResult(results) + val toUpdate = currencies.filter { !fiatRatesThrottler.isStillThrottled(it) } + toUpdate.forEach { fiatRatesThrottler.updateThrottlingTo(it) } + toUpdate.map { + coroutineScope { + async { + results.add(it to coinMarketCapService.getRate(it.currencySymbol, fiatCurrency)) + } } - } + }.awaitAll() + handleFiatRatesResult(results.toList()) } suspend fun onCardScanned(data: ScanResponse) { @@ -315,8 +318,7 @@ class TapWalletManager { store.dispatch(WalletAction.LoadFiatRate.Success(rate)) } is Result.Failure -> store.dispatch(WalletAction.LoadFiatRate.Failure) - null -> { - } + null -> {} } } } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt index f2ec828995..26fae5925a 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt @@ -81,7 +81,7 @@ sealed class WalletAction : Action { } data class LoadFiatRate( - val wallet: Wallet? = null, val currency: Currency? = null, + val wallet: Wallet? = null, val currencyList: List? = null, ) : WalletAction() { data class Success(val fiatRate: Pair) : WalletAction() object Failure : WalletAction() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt index 19197ad893..f0b6c3506e 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt @@ -3,7 +3,6 @@ package com.tangem.tap.features.wallet.redux.middlewares import com.tangem.blockchain.common.* import com.tangem.blockchain.extensions.Result import com.tangem.common.extensions.isZero -import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.safeUpdate import com.tangem.tap.common.redux.global.GlobalState import com.tangem.tap.common.redux.navigation.AppScreen @@ -47,7 +46,7 @@ class MultiWalletMiddleware { globalState.scanResponse?.card?.cardId?.let { currenciesRepository.saveAddedToken(it, action.token) } - addToken(action.token, walletState, globalState) + addTokens(listOf(action.token), walletState, globalState) } is WalletAction.MultiWallet.AddTokens -> { addTokens(action.tokens, walletState, globalState) @@ -62,7 +61,9 @@ class MultiWalletMiddleware { } } } - store.dispatch(WalletAction.LoadFiatRate(currency = Currency.Blockchain(action.blockchain))) + store.dispatch(WalletAction.LoadFiatRate( + currencyList = listOf(Currency.Blockchain(action.blockchain))) + ) store.dispatch(WalletAction.LoadWallet(action.blockchain) ) } @@ -172,80 +173,41 @@ class MultiWalletMiddleware { } } - private fun addToken(token: Token, walletState: WalletState?, globalState: GlobalState?) { + private fun addTokens(tokens: List, walletState: WalletState?, globalState: GlobalState?) { val scanResponse = globalState?.scanResponse ?: return + val wmFactory = globalState.tapWalletManager.walletManagerFactory - val walletManager = walletState?.getWalletManager(token) - ?: globalState.tapWalletManager.walletManagerFactory.makeWalletManagerForApp( - scanResponse, - token.blockchain - )?.also { walletManager -> - store.dispatch(WalletAction.MultiWallet.AddWalletManagers(walletManager)) - store.dispatch(WalletAction.MultiWallet.AddBlockchain(walletManager.wallet.blockchain)) - } - - store.dispatch(WalletAction.LoadFiatRate(currency = Currency.Token(token))) - - scope.launch { - when (val result = walletManager?.addToken(token)) { - is Result.Success -> { - store.dispatchOnMain(WalletAction.MultiWallet.TokenLoaded(result.data, token)) + val groupedTokens = tokens.groupBy { it.blockchain } + val walletManagers = groupedTokens.mapNotNull { entry -> + val blockchain = entry.key + val tokensList = entry.value + val walletManager = walletState?.getWalletManager(blockchain) + ?: wmFactory.makeWalletManagerForApp(scanResponse, blockchain)?.also { + store.dispatch(WalletAction.MultiWallet.AddWalletManagers(it)) + store.dispatch(WalletAction.MultiWallet.AddBlockchain(blockchain)) } - is Result.Failure -> { - when (val result = walletManager.safeUpdate()) { - is com.tangem.common.services.Result.Success -> { - val tokenAmount = result.data.getTokenAmount(token) ?: return@launch - store.dispatchOnMain(WalletAction.MultiWallet.TokenLoaded(tokenAmount, token)) - } - is com.tangem.common.services.Result.Failure -> { - } + store.dispatch(WalletAction.LoadFiatRate(currencyList = tokensList.map { Currency.Token(it) })) + walletManager?.apply { + scope.launch { async { addTokens(tokensList) }.await() } + } + } + scope.launch { + walletManagers.forEach { walletManager -> + when (val result = walletManager.safeUpdate()) { + is com.tangem.common.services.Result.Success -> { + val wallet = result.data + wallet.getTokens() + .filter { tokens.contains(it) } + .mapNotNull { token -> wallet.getTokenAmount(token)?.let { Pair(token, it) } } + .forEach { + withContext(Dispatchers.Main) { + store.dispatch(WalletAction.MultiWallet.TokenLoaded(it.second, it.first)) + } + } } + is com.tangem.common.services.Result.Failure -> {} } } } } - - private fun addTokens( - tokens: List, - walletState: WalletState?, - globalState: GlobalState?, - ) { - val scanResponse = globalState?.scanResponse ?: return - - val tokensWithManagers = tokens.map { token -> - val walletManager = walletState?.getWalletManager(token) - ?: globalState.tapWalletManager.walletManagerFactory.makeWalletManagerForApp( - scanResponse, - token.blockchain - )?.also { walletManager -> - store.dispatch(WalletAction.MultiWallet.AddWalletManagers(walletManager)) - store.dispatch(WalletAction.MultiWallet.AddBlockchain(walletManager.wallet.blockchain)) - } - store.dispatch( - WalletAction.LoadFiatRate(currency = Currency.Token(token)) - ) - TokenWithManager(token, walletManager) - } - scope.launch { - tokensWithManagers.forEach { - when (val result = it.walletManager?.addToken(it.token)) { - is Result.Success -> { - store.dispatchOnMain(WalletAction.MultiWallet.TokenLoaded(result.data, it.token)) - } - is Result.Failure -> { - when (val result = it.walletManager.safeUpdate()) { - is com.tangem.common.services.Result.Success -> { - val tokenAmount = result.data.getTokenAmount(it.token) ?: return@launch - store.dispatchOnMain(WalletAction.MultiWallet.TokenLoaded(tokenAmount, it.token)) - } - is com.tangem.common.services.Result.Failure -> { - } - } - } - } - } - } - } - - private data class TokenWithManager(val token: Token, val walletManager: WalletManager?) } \ No newline at end of file From 228c37989d1e8986aed0461891832fa26c2726b4 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 24 Mar 2022 20:44:54 +0300 Subject: [PATCH 12/24] 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)) } From eedc2869cbd2534b900d7e5fc1f426b8498ed2d3 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 24 Mar 2022 21:28:28 +0300 Subject: [PATCH 13/24] Updated on 2026-08-14 --- .../com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt index b4824b60a3..c500f330b2 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt @@ -13,7 +13,7 @@ class GlobalAnalyticsHandler(val analyticsHandlers: List) : blockchain: String?, params: Map ) { - analyticsHandlers.forEach { it.triggerEvent(event, card, blockchain) } + analyticsHandlers.forEach { it.triggerEvent(event, card, blockchain, params) } } override fun triggerEvent(event: String, params: Map) { From 830f0bad3710aabcdf66aed5afa9fc88b8c6b302 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 24 Mar 2022 22:05:05 +0300 Subject: [PATCH 14/24] Updated on 2026-08-14 --- .../com/tangem/tap/domain/TapWalletManager.kt | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) 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 a9461734ee..0bb9e42be6 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -3,7 +3,6 @@ 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 @@ -28,7 +27,10 @@ import com.tangem.tap.network.NetworkConnectivity import com.tangem.tap.network.coinmarketcap.CoinMarketCapService import com.tangem.tap.scope import com.tangem.tap.store -import kotlinx.coroutines.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.math.BigDecimal @@ -42,7 +44,7 @@ class TapWalletManager { } private val walletManagersThrottler = ThrottlerWithValues>(10000) - private val fiatRatesThrottler = Throttler(60000) + private val fiatRatesThrottler = ThrottlerWithValues?>(60000) suspend fun loadWalletData(walletManager: WalletManager) { val blockchain = walletManager.wallet.blockchain @@ -93,17 +95,19 @@ class TapWalletManager { } suspend fun loadFiatRate(fiatCurrency: FiatCurrencyName, currencies: List) { - val results = mutableListOf?>>() + // get and submit previous result of equivalents. + val throttledResult = currencies.filter { fiatRatesThrottler.isStillThrottled(it) }.map { + Pair(it, fiatRatesThrottler.geValue(it)) + } + if (throttledResult.isNotEmpty()) handleFiatRatesResult(throttledResult) + val toUpdate = currencies.filter { !fiatRatesThrottler.isStillThrottled(it) } - toUpdate.forEach { fiatRatesThrottler.updateThrottlingTo(it) } - toUpdate.map { - coroutineScope { - async { - results.add(it to coinMarketCapService.getRate(it.currencySymbol, fiatCurrency)) - } - } - }.awaitAll() - handleFiatRatesResult(results.toList()) + toUpdate.forEach { + fiatRatesThrottler.updateThrottlingTo(it) + val result = coinMarketCapService.getRate(it.currencySymbol, fiatCurrency) + fiatRatesThrottler.setValue(it, result) + handleFiatRatesResult(listOf(it to result)) + } } suspend fun onCardScanned(data: ScanResponse) { @@ -324,6 +328,7 @@ class TapWalletManager { is Result.Success -> { val rate = it.first to (it.second as Result.Success).data store.dispatch(WalletAction.LoadFiatRate.Success(rate)) + delay(50) // this one is to try to avoid concurrent state modification } is Result.Failure -> store.dispatch(WalletAction.LoadFiatRate.Failure) null -> {} From dd6972292b82541766030c9aafaef6905a109bb6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 24 Mar 2022 22:06:01 +0300 Subject: [PATCH 15/24] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 0bb9e42be6..2861061df8 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -112,7 +112,7 @@ class TapWalletManager { suspend fun onCardScanned(data: ScanResponse) { walletManagersThrottler.clear() - fiatRatesThrottler.clear() +// fiatRatesThrottler.clear() store.state.globalState.feedbackManager?.infoHolder?.setCardInfo(data.card) updateConfigManager(data) From f63e6d322922945b7cd080a3af2f149318f022d9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 25 Mar 2022 07:53:36 +0300 Subject: [PATCH 16/24] Updated on 2026-08-14 --- .../com/tangem/tap/features/home/HomeFragment.kt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index e9d11624a9..482e629344 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -1,12 +1,11 @@ package com.tangem.tap.features.home -import android.content.Context import android.os.Bundle -import android.telephony.TelephonyManager import android.view.View import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.text.intl.Locale import androidx.fragment.app.Fragment import com.google.accompanist.appcompattheme.AppCompatTheme import com.tangem.tap.features.home.compose.StoriesScreen @@ -30,20 +29,25 @@ class HomeFragment : Fragment(R.layout.fragment_home), StoreSubscriber(R.id.cv_stories)?.setContent { AppCompatTheme { StoriesScreen( homeState, onScanButtonClick = { store.dispatch(HomeAction.ReadCard) }, - onShopButtonClick = { store.dispatch(HomeAction.GoToShop(countryCodeValue)) } + onShopButtonClick = { store.dispatch(HomeAction.GoToShop(getLocale())) } ) } } } + private fun getLocale(): String { +// val tm = requireContext().getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager +// val countryCodeValue = tm.networkCountryIso + return Locale.current.language + } + override fun onStart() { super.onStart() store.subscribe(this) { state -> From 9c0b88e5dd1dfe15e2c0ae876b92c13a75ee6cb7 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 25 Mar 2022 09:06:07 +0300 Subject: [PATCH 17/24] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt | 1 - 1 file changed, 1 deletion(-) 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 2861061df8..be9a0c138c 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -328,7 +328,6 @@ class TapWalletManager { is Result.Success -> { val rate = it.first to (it.second as Result.Success).data store.dispatch(WalletAction.LoadFiatRate.Success(rate)) - delay(50) // this one is to try to avoid concurrent state modification } is Result.Failure -> store.dispatch(WalletAction.LoadFiatRate.Failure) null -> {} From b815a9712ecff898494aa0687e74419edceb770f Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 25 Mar 2022 09:10:10 +0300 Subject: [PATCH 18/24] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt | 1 - 1 file changed, 1 deletion(-) 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 be9a0c138c..cb094b7c7a 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -259,7 +259,6 @@ class TapWalletManager { } private suspend fun handleUpdateWalletResult(result: Result, walletManager: WalletManager) { - walletManagersThrottler.setValue(walletManager.wallet.blockchain, result) withContext(Dispatchers.Main) { when (result) { is Result.Success -> { From b1b80cd134863cce45a2041d7795940b0106e591 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 25 Mar 2022 14:02:16 +0300 Subject: [PATCH 19/24] Updated on 2026-08-14 --- .../tangem/tap/features/home/HomeFragment.kt | 14 +++--- .../tap/features/home/RegionProvider.kt | 48 +++++++++++++++++++ .../tap/features/home/redux/HomeAction.kt | 3 +- .../tap/features/home/redux/HomeMiddleware.kt | 7 ++- 4 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/features/home/RegionProvider.kt diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index 482e629344..d4be89a761 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -5,7 +5,6 @@ import android.view.View import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.platform.ComposeView -import androidx.compose.ui.text.intl.Locale import androidx.fragment.app.Fragment import com.google.accompanist.appcompattheme.AppCompatTheme import com.tangem.tap.features.home.compose.StoriesScreen @@ -36,17 +35,18 @@ class HomeFragment : Fragment(R.layout.fragment_home), StoreSubscriber +) : RegionProvider { + override fun getRegion(): String? { + for (provider in providers) { + val region = provider.getRegion() + if (region != null) return region + } + return null + } +} + +class MobileOperatorRegionProvider(context: Context) : RegionProvider { + + private val wContext: WeakReference = WeakReference(context) + + override fun getRegion(): String? { + val tm = wContext.get()?.getSystemService(Context.TELEPHONY_SERVICE) as? TelephonyManager ?: return null + + val region = when (tm.phoneType) { + PHONE_TYPE_CDMA -> { + // Result may be unreliable + tm.networkCountryIso + } + else -> tm.networkCountryIso + } + return region.ifEmpty { return null } + } +} + +class LocaleRegionProvider : RegionProvider { + override fun getRegion(): String? = Locale.current.region +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt index 79055cf993..a37aa49595 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt @@ -1,12 +1,13 @@ package com.tangem.tap.features.home.redux import com.tangem.tap.common.entities.IndeterminateProgressButton +import com.tangem.tap.features.home.RegionProvider import org.rekotlin.Action sealed class HomeAction : Action { // from ui object ReadCard : HomeAction() - data class GoToShop(val region: String) : HomeAction() + data class GoToShop(val regionProvider: RegionProvider) : HomeAction() // internal data class ShouldScanCardOnResume(val shouldScanCard: Boolean) : HomeAction() diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt index eb0f261f8b..aa5f0f8c16 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt @@ -52,10 +52,9 @@ private val homeMiddleware: Middleware = { dispatch, state -> } is HomeAction.ReadCard -> handleReadCard() is HomeAction.GoToShop -> { - if (action.region == "ru") { - store.dispatchOpenUrl(BUY_WALLET_URL) - } else { - store.dispatch(NavigationAction.NavigateTo(AppScreen.Shop)) + when (action.regionProvider.getRegion()?.toLowerCase()) { + "ru" -> store.dispatchOpenUrl(BUY_WALLET_URL) + else -> store.dispatch(NavigationAction.NavigateTo(AppScreen.Shop)) } store.state.globalState.analyticsHandlers?.triggerEvent( event = AnalyticsEvent.GET_CARD, From d149fe6d0341bac0a99e9bdb392cbeb72a67350e Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 25 Mar 2022 14:04:04 +0300 Subject: [PATCH 20/24] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt | 2 +- .../main/java/com/tangem/tap/features/home/RegionProvider.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index d4be89a761..9e98fe16f5 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -43,7 +43,7 @@ class HomeFragment : Fragment(R.layout.fragment_home), StoreSubscriber = WeakReference(context) From d10ca65bba4eea2d066b88837161b68245e47ef0 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 25 Mar 2022 18:55:51 +0300 Subject: [PATCH 21/24] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 cb094b7c7a..acbf6e3650 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -103,9 +103,11 @@ class TapWalletManager { val toUpdate = currencies.filter { !fiatRatesThrottler.isStillThrottled(it) } toUpdate.forEach { - fiatRatesThrottler.updateThrottlingTo(it) val result = coinMarketCapService.getRate(it.currencySymbol, fiatCurrency) - fiatRatesThrottler.setValue(it, result) + if (result is Result.Success) { + fiatRatesThrottler.updateThrottlingTo(it) + fiatRatesThrottler.setValue(it, result) + } handleFiatRatesResult(listOf(it to result)) } } From c0032b70c8873579af92ee8b5baa9f701819b25c Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 25 Mar 2022 20:08:59 +0400 Subject: [PATCH 22/24] Updated on 2026-08-14 --- app/src/main/assets/tangem-app-config | 2 +- .../main/java/com/tangem/tap/common/shop/shopify/ShopifyShop.kt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index b3fb1483a3..64ae04d208 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit b3fb1483a37bf1fb7d9da3f9bd9424f693c0ec5b +Subproject commit 64ae04d2086e5a605dd4da3cba4af32a60d46c79 diff --git a/app/src/main/java/com/tangem/tap/common/shop/shopify/ShopifyShop.kt b/app/src/main/java/com/tangem/tap/common/shop/shopify/ShopifyShop.kt index 5fde9c60ff..776374e240 100644 --- a/app/src/main/java/com/tangem/tap/common/shop/shopify/ShopifyShop.kt +++ b/app/src/main/java/com/tangem/tap/common/shop/shopify/ShopifyShop.kt @@ -1,10 +1,12 @@ package com.tangem.tap.common.shop.shopify +import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) data class ShopifyShop( val domain: String, + @Json(name = "storefrontApiKeyAndroid") val storefrontApiKey: String, val merchantID: String, ) \ No newline at end of file From d620010137b7856bf405dac952b08c071613a0f9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 25 Mar 2022 20:05:36 +0300 Subject: [PATCH 23/24] Updated on 2026-08-14 --- .../java/com/tangem/tap/TapApplication.kt | 14 +++++++- .../com/tangem/tap/common/images/Picasso.kt | 36 +++++++++++-------- .../tangem/tap/common/redux/LogMiddleware.kt | 3 +- .../tangem/tap/features/home/HomeFragment.kt | 2 +- 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 74e957f6c3..956063d3f3 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -35,6 +35,8 @@ val store = Store( middleware = AppState.getMiddleware(), state = AppState() ) +val logConfig = LogConfig() + lateinit var preferencesStorage: PreferencesStorage lateinit var currenciesRepository: CurrenciesRepository lateinit var walletConnectRepository: WalletConnectRepository @@ -99,4 +101,14 @@ class TapApplication : Application() { val analyticsHandler = GlobalAnalyticsHandler.createDefaultAnalyticHandlers(this) store.dispatch(GlobalAction.SetAnanlyticHandlers(analyticsHandler)) } -} \ No newline at end of file +} + +data class LogConfig( + // disables both [internal, http] + val picasso: Boolean = false, + val picassoInternal: Boolean = true, + val picassoHttp: Boolean = true, + + val storeAction: Boolean = false, + +) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/images/Picasso.kt b/app/src/main/java/com/tangem/tap/common/images/Picasso.kt index 9220859e8b..f5d02a19fe 100644 --- a/app/src/main/java/com/tangem/tap/common/images/Picasso.kt +++ b/app/src/main/java/com/tangem/tap/common/images/Picasso.kt @@ -3,6 +3,7 @@ package com.tangem.tap.common.images import android.app.Application import com.squareup.picasso.OkHttp3Downloader import com.squareup.picasso.Picasso +import com.tangem.tap.logConfig import com.tangem.wallet.BuildConfig import okhttp3.Cache import okhttp3.CacheControl @@ -18,35 +19,38 @@ class PicassoHelper { fun initPicassoWithCaching(application: Application) { val picasso = Picasso.Builder(application) - .downloader(OkHttp3Downloader(getOkHttpForPicasso(application))) - .build() - picasso.isLoggingEnabled = BuildConfig.DEBUG + .downloader(OkHttp3Downloader(getOkHttpForPicasso(application))) + .build() + picasso.isLoggingEnabled = logIsEnabled() picasso.setIndicatorsEnabled(BuildConfig.DEBUG) Picasso.setSingletonInstance(picasso) } private fun getOkHttpForPicasso(application: Application): OkHttpClient { - val okHttpBuilder = OkHttpClient.Builder() - okHttpBuilder.cache(Cache(File(application.filesDir, "artworks"), Long.MAX_VALUE)) - okHttpBuilder.callTimeout(15000, TimeUnit.MILLISECONDS) + return OkHttpClient.Builder().apply { + cache(Cache(File(application.filesDir, "artworks"), Long.MAX_VALUE)) + callTimeout(15000, TimeUnit.MILLISECONDS) - okHttpBuilder.addInterceptor { chain -> - val cacheControl = CacheControl.Builder() + if (logIsEnabled()) { + addDebugInterceptors(this) + } + + addInterceptor { chain -> + val cacheControl = CacheControl.Builder() .maxStale(KEEP_CACHE_MAX_DAYS, TimeUnit.DAYS) .build() - val origRequest = chain.request() - val neverExpireRequest = origRequest.newBuilder() + val origRequest = chain.request() + val neverExpireRequest = origRequest.newBuilder() .cacheControl(cacheControl) .build() - chain.proceed(neverExpireRequest) - } - addDebugInterceptors(okHttpBuilder) + chain.proceed(neverExpireRequest) + } + }.build() - return okHttpBuilder.build() } private fun addDebugInterceptors(okHttpBuilder: OkHttpClient.Builder) { - if (!BuildConfig.DEBUG) return + if (!BuildConfig.DEBUG || !logConfig.picasso) return val picassoInterceptor = HttpLoggingInterceptor(PicassoOkHttpLogger()).apply { level = HttpLoggingInterceptor.Level.BODY @@ -54,6 +58,8 @@ class PicassoHelper { okHttpBuilder.addInterceptor(picassoInterceptor) } + private fun logIsEnabled(): Boolean = BuildConfig.DEBUG && logConfig.picasso + } } diff --git a/app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt b/app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt index 15ea778fed..5e5daf10c8 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt @@ -1,5 +1,6 @@ package com.tangem.tap.common.redux +import com.tangem.tap.logConfig import org.rekotlin.Middleware import timber.log.Timber @@ -9,7 +10,7 @@ import timber.log.Timber val logMiddleware: Middleware = { dispatch, appState -> { nextDispatch -> { action -> - Timber.d("Dispatch action: $action") + if (logConfig.storeAction) Timber.d("Dispatch action: $action") nextDispatch(action) } } diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index 9e98fe16f5..19bbd08320 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -43,7 +43,7 @@ class HomeFragment : Fragment(R.layout.fragment_home), StoreSubscriber Date: Fri, 25 Mar 2022 20:08:06 +0300 Subject: [PATCH 24/24] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/TapApplication.kt | 4 ++-- app/src/main/java/com/tangem/tap/common/images/Picasso.kt | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 956063d3f3..7dbd7c7b3d 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -105,10 +105,10 @@ class TapApplication : Application() { data class LogConfig( // disables both [internal, http] - val picasso: Boolean = false, + val picasso: Boolean = BuildConfig.DEBUG, val picassoInternal: Boolean = true, val picassoHttp: Boolean = true, - val storeAction: Boolean = false, + val storeAction: Boolean = BuildConfig.DEBUG, ) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/images/Picasso.kt b/app/src/main/java/com/tangem/tap/common/images/Picasso.kt index f5d02a19fe..81c52ca693 100644 --- a/app/src/main/java/com/tangem/tap/common/images/Picasso.kt +++ b/app/src/main/java/com/tangem/tap/common/images/Picasso.kt @@ -50,8 +50,6 @@ class PicassoHelper { } private fun addDebugInterceptors(okHttpBuilder: OkHttpClient.Builder) { - if (!BuildConfig.DEBUG || !logConfig.picasso) return - val picassoInterceptor = HttpLoggingInterceptor(PicassoOkHttpLogger()).apply { level = HttpLoggingInterceptor.Level.BODY }