From 7571527c23e3e0abea86bec0950bef8bf7ff1a1c Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 1 Feb 2022 18:27:50 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/features/wallet/redux/WalletAction.kt | 1 + .../tap/features/wallet/redux/WalletState.kt | 8 ++- .../middlewares/MultiWalletMiddleware.kt | 23 ++++++++ .../wallet/redux/reducers/WalletReducer.kt | 11 ++++ .../wallet/ui/WalletDetailsFragment.kt | 18 +++++- .../res/layout/fragment_details_confirm.xml | 4 +- .../res/layout/fragment_wallet_details.xml | 57 +++++++++++-------- .../res/layout/layout_wallet_details_rent.xml | 47 +++++++++++++++ .../main/res/values/strings_untranslated.xml | 2 + 9 files changed, 143 insertions(+), 28 deletions(-) create mode 100644 app/src/main/res/layout/layout_wallet_details_rent.xml 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 1081a3303c..029b6b88b5 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 @@ -146,4 +146,5 @@ sealed class WalletAction : Action { data class ChangeSelectedAddress(val type: AddressType) : WalletAction() + data class SetWalletRent(val blockchain: Blockchain, val minRent: String, val rentExempt: String): WalletAction() } \ No newline at end of file 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 96044f0e1c..4dd980e98c 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 @@ -246,7 +246,8 @@ data class WalletData( val fiatRateString: String? = null, val fiatRate: BigDecimal? = null, val mainButton: WalletMainButton = WalletMainButton.SendButton(false), - val currency: Currency + val currency: Currency, + val walletRent: WalletRent? = null, ) { fun shouldShowMultipleAddress(): Boolean { val listOfAddresses = walletAddresses?.list ?: return false @@ -254,6 +255,11 @@ data class WalletData( } } +data class WalletRent( + val minRentValue: String, + val rentExemptValue: String +) + sealed interface Currency { val blockchain: com.tangem.blockchain.common.Blockchain 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 b7444dcb16..df4c9120f7 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 @@ -1,10 +1,12 @@ package com.tangem.tap.features.wallet.redux.middlewares +import com.tangem.blockchain.blockchains.solana.RentProvider 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.extensions.stripZeroPlainString import com.tangem.tap.common.redux.global.GlobalState import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction @@ -31,6 +33,7 @@ class MultiWalletMiddleware { when (action) { is WalletAction.MultiWallet.AddWalletManagers -> { globalState.feedbackManager?.infoHolder?.setWalletsInfo(action.walletManagers) + action.walletManagers.forEach { checkForRentWarning(it) } } is WalletAction.MultiWallet.SelectWallet -> { if (action.walletData != null) { @@ -197,6 +200,26 @@ class MultiWalletMiddleware { } } + private fun checkForRentWarning(walletManager: WalletManager) { + val rentProvider = walletManager as? RentProvider ?: return + + scope.launch { + when (val result = rentProvider.minimalBalanceForRentExemption()) { + is Result.Success -> { + val currency = walletManager.wallet.blockchain.currency + val minRent = ("${rentProvider.rentAmount().stripZeroPlainString()} $currency") + val rentExempt = ("${result.data.stripZeroPlainString()} $currency") + store.dispatchOnMain(WalletAction.SetWalletRent( + blockchain = walletManager.wallet.blockchain, + minRent = minRent, + rentExempt = rentExempt + )) + } + is Result.Failure -> {} + } + } + } + private fun addTokens( tokens: List, walletState: WalletState?, 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 097fbf28e3..7005235044 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 @@ -245,6 +245,17 @@ private fun internalReduce(action: Action, state: AppState): WalletState { ) newState = newState.copy(wallets = wallets) } + is WalletAction.SetWalletRent -> { + var walletData = newState.getWalletData(action.blockchain) + if (walletData == null) { + newState + } else { + walletData = walletData.copy(walletRent = WalletRent(action.minRent, action.rentExempt)) + newState = newState.copy( + wallets = newState.replaceSomeWallets(listOf(walletData)) + ) + } + } } return newState } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt index 41a3dc9258..bfd6057d73 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt @@ -10,6 +10,7 @@ import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import androidx.transition.TransitionInflater import com.squareup.picasso.Picasso +import com.tangem.common.extensions.guard import com.tangem.tap.common.SnackbarHandler import com.tangem.tap.common.extensions.* import com.tangem.tap.common.redux.StateDialog @@ -27,6 +28,8 @@ import kotlinx.android.synthetic.main.item_popular_token.view.* import kotlinx.android.synthetic.main.layout_balance_error.* import kotlinx.android.synthetic.main.layout_balance_wallet_details.* import kotlinx.android.synthetic.main.layout_wallet_details.* +import kotlinx.android.synthetic.main.layout_wallet_details.card_balance +import kotlinx.android.synthetic.main.layout_wallet_details_rent.* import org.rekotlin.StoreSubscriber class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), StoreSubscriber { @@ -124,11 +127,12 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), StoreS handleDialogs(state.walletDialog) handleCurrencyIcon(selectedWallet) + handleWalletRent(selectedWallet.walletRent) srl_wallet_details.setOnRefreshListener { if (selectedWallet.currencyData.status != BalanceStatus.Loading) { store.dispatch(WalletAction.LoadWallet( - blockchain = selectedWallet.currency?.blockchain + blockchain = selectedWallet.currency.blockchain )) } } @@ -141,6 +145,18 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), StoreS btn_sell.show(selectedWallet.tradeCryptoState.sellingAllowed) } + private fun handleWalletRent(rent: WalletRent?) { + val rent = rent.guard { + l_rent_warning.hide() + return + } + + val warningMessage = requireContext().getString( + R.string.solana_rent_warning, rent.minRentValue, rent.rentExemptValue) + tv_rent_warning_message.text = warningMessage + l_rent_warning.show() + } + private fun handleCurrencyIcon(wallet: WalletData) { Picasso.get().loadCurrenciesIcon( imageView = iv_currency, diff --git a/app/src/main/res/layout/fragment_details_confirm.xml b/app/src/main/res/layout/fragment_details_confirm.xml index 2a6933b594..5d992196b0 100644 --- a/app/src/main/res/layout/fragment_details_confirm.xml +++ b/app/src/main/res/layout/fragment_details_confirm.xml @@ -42,7 +42,7 @@ app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/fragment_wallet_details.xml b/app/src/main/res/layout/fragment_wallet_details.xml index 27da2ac50f..0f6ef2b42d 100644 --- a/app/src/main/res/layout/fragment_wallet_details.xml +++ b/app/src/main/res/layout/fragment_wallet_details.xml @@ -21,9 +21,9 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" + android:theme="@style/ThemeOverlay.MyTheme.Toolbar" app:menu="@menu/wallet_details" app:navigationIcon="@drawable/ic_baseline_arrow_back_24" - android:theme="@style/ThemeOverlay.MyTheme.Toolbar" app:title=" " /> @@ -46,7 +46,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - - + - - + + diff --git a/app/src/main/res/layout/layout_wallet_details_rent.xml b/app/src/main/res/layout/layout_wallet_details_rent.xml new file mode 100644 index 0000000000..1f44d10ea7 --- /dev/null +++ b/app/src/main/res/layout/layout_wallet_details_rent.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings_untranslated.xml b/app/src/main/res/values/strings_untranslated.xml index 32f666e20c..40634c9ea5 100644 --- a/app/src/main/res/values/strings_untranslated.xml +++ b/app/src/main/res/values/strings_untranslated.xml @@ -311,4 +311,6 @@ Price: %s\n Amount to receive: %s\n Amount to pay: %s + Solana network charges a rent of %s every 2 days. Accounts that can’t afford the rent are purged from the network. Deposit your account with more than %s to use it for free. +