From 1b0f395ea98b159639ddfd61ca97e8effceaed09 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 12 Nov 2021 13:52:31 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../features/tokens/redux/CurrencyListItem.kt | 69 +++++++++++++++++++ .../tap/features/tokens/redux/TokensAction.kt | 3 +- .../features/tokens/redux/TokensMiddleware.kt | 1 - .../features/tokens/redux/TokensReducer.kt | 16 ++++- .../tap/features/tokens/redux/TokensState.kt | 3 +- .../features/tokens/ui/AddTokensFragment.kt | 2 +- .../tokens/ui/adapters/CurrenciesAdapter.kt | 59 ++++++---------- .../main/res/drawable/ic_arrow_angle_down.xml | 5 ++ .../res/drawable/ic_arrow_angle_right.xml | 11 +++ .../res/layout/item_currency_subtitle.xml | 16 +++++ 10 files changed, 142 insertions(+), 43 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/features/tokens/redux/CurrencyListItem.kt create mode 100644 app/src/main/res/drawable/ic_arrow_angle_down.xml create mode 100644 app/src/main/res/drawable/ic_arrow_angle_right.xml diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/CurrencyListItem.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/CurrencyListItem.kt new file mode 100644 index 0000000000..7c99262aa7 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/CurrencyListItem.kt @@ -0,0 +1,69 @@ +package com.tangem.tap.features.tokens.redux + +import androidx.annotation.StringRes +import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.Token +import com.tangem.wallet.R + +sealed class CurrencyListItem { + data class TokenListItem(val token: Token) : CurrencyListItem() + data class BlockchainListItem(val blockchain: Blockchain) : CurrencyListItem() + data class TitleListItem( + @StringRes val titleResId: Int, + val isContentShown: Boolean = true, + val blockchain: Blockchain? = null, + ) : CurrencyListItem() + + companion object { + fun createListOfCurrencies( + blockchains: List, + tokens: List, + ): List { + val blockchainsTitle = R.string.add_tokens_subtitle_blockchains + val ethereumTokensTitle = R.string.add_tokens_subtitle_ethereum_tokens + val bscTokensTitle = R.string.add_tokens_subtitle_bsc_tokens + val binanceTokensTitle = R.string.add_tokens_subtitle_binance_tokens + + val ethereumTokens = tokens.filter { it.blockchain == Blockchain.Ethereum } + val bscTokens = tokens.filter { it.blockchain == Blockchain.BSC } + val binanceTokens = tokens.filter { it.blockchain == Blockchain.Binance } + return listOf(TitleListItem(blockchainsTitle)) + + blockchains.map { BlockchainListItem(it) } + + listOf(TitleListItem(ethereumTokensTitle, blockchain = Blockchain.Ethereum)) + + ethereumTokens.map { TokenListItem(it) } + + listOf(TitleListItem(bscTokensTitle, blockchain = Blockchain.BSC)) + + bscTokens.map { TokenListItem(it) } + + listOf(TitleListItem(binanceTokensTitle, blockchain = Blockchain.Binance)) + + binanceTokens.map { TokenListItem(it) } + } + } +} + +fun List.removeTokensForBlockchain(blockchain: Blockchain): List { + return filterNot { + it is CurrencyListItem.TokenListItem && it.token.blockchain == blockchain + } +} + +fun List.addTokensForBlockchain( + blockchain: Blockchain, fullCurrenciesList: List, +): List { + val tokensToAdd = fullCurrenciesList.filter { + it is CurrencyListItem.TokenListItem && it.token.blockchain == blockchain + } + val indexToInsert = indexOfFirst { + it is CurrencyListItem.TitleListItem && it.blockchain == blockchain + } + 1 + return this.toMutableList().apply { addAll(indexToInsert, tokensToAdd) } +} + +fun List.toggleHeaderContentShownValue( + blockchain: Blockchain +): List { + val indexOfTitle = indexOfFirst { + it is CurrencyListItem.TitleListItem && it.blockchain == blockchain + } + val title = this[indexOfTitle] as CurrencyListItem.TitleListItem + val updatedTitle = title.copy(isContentShown = !title.isContentShown) + return this.toMutableList().apply { set(indexOfTitle, updatedTitle) } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensAction.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensAction.kt index e0c9abe119..1be9e7c701 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensAction.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensAction.kt @@ -1,7 +1,7 @@ package com.tangem.tap.features.tokens.redux +import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token -import com.tangem.tap.features.tokens.ui.adapters.CurrencyListItem import com.tangem.tap.features.wallet.redux.WalletData import org.rekotlin.Action @@ -17,5 +17,6 @@ sealed class TokensAction : Action { data class SetAddedCurrencies(val wallets: List) : TokensAction() + data class ToggleShowTokensForBlockchain(val isShown: Boolean, val blockchain: Blockchain) : TokensAction() } \ No newline at end of file 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 e8afbe2d62..6ecff3f595 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 @@ -3,7 +3,6 @@ package com.tangem.tap.features.tokens.redux import com.tangem.tap.common.redux.AppState import com.tangem.tap.currenciesRepository import com.tangem.tap.domain.TapWorkarounds.isTestCard -import com.tangem.tap.features.tokens.ui.adapters.CurrencyListItem import com.tangem.tap.store import org.rekotlin.Middleware diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt index 878eed1113..402d19d741 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt @@ -18,7 +18,7 @@ private fun internalReduce(action: Action, state: AppState): TokensState { val tokensState = state.tokensState return when (action) { is TokensAction.LoadCurrencies.Success -> { - tokensState.copy(currencies = action.currencies) + tokensState.copy(currencies = action.currencies, shownCurrencies = action.currencies) } is TokensAction.SetAddedCurrencies -> { tokensState.copy(addedCurrencies = action.wallets.toCardCurrencies()) @@ -28,6 +28,20 @@ private fun internalReduce(action: Action, state: AppState): TokensState { action.tokens.map { TokenWithAmount(it, null) } )) } + + is TokensAction.ToggleShowTokensForBlockchain -> { + if (action.isShown) { + val shownCurrencies = tokensState.shownCurrencies + .removeTokensForBlockchain(action.blockchain) + .toggleHeaderContentShownValue(action.blockchain) + tokensState.copy(shownCurrencies = shownCurrencies) + } else { + val shownCurrencies = tokensState.shownCurrencies + .addTokensForBlockchain(action.blockchain, tokensState.currencies) + .toggleHeaderContentShownValue(action.blockchain) + tokensState.copy(shownCurrencies = shownCurrencies) + } + } else -> tokensState } } diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt index b3d528fe5f..ef30a92229 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt @@ -2,15 +2,14 @@ package com.tangem.tap.features.tokens.redux import com.tangem.blockchain.common.Amount import com.tangem.blockchain.common.Token -import com.tangem.tap.common.redux.global.CryptoCurrencyName import com.tangem.tap.domain.tokens.CardCurrencies -import com.tangem.tap.features.tokens.ui.adapters.CurrencyListItem import org.rekotlin.StateType data class TokensState( val addedTokens: LinkedHashSet = LinkedHashSet(), val addedCurrencies: CardCurrencies? = null, val currencies: List = emptyList(), + val shownCurrencies: List = emptyList(), ) : StateType data class TokenWithAmount( diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt index 4b88b06ca5..b5d09b7074 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt @@ -73,7 +73,7 @@ class AddTokensFragment : Fragment(R.layout.fragment_add_tokens), override fun newState(state: TokensState) { if (activity == null) return viewAdapter.addedCurrencies = state.addedCurrencies - viewAdapter.submitUnfilteredList(state.currencies) + viewAdapter.submitUnfilteredList(state.shownCurrencies) } override fun onOptionsItemSelected(item: MenuItem): Boolean { diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/adapters/CurrenciesAdapter.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/adapters/CurrenciesAdapter.kt index 918dd2916a..8a58171b0c 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/adapters/CurrenciesAdapter.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/adapters/CurrenciesAdapter.kt @@ -3,18 +3,17 @@ package com.tangem.tap.features.tokens.ui.adapters import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.annotation.StringRes import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.squareup.picasso.Picasso -import com.tangem.blockchain.common.Blockchain -import com.tangem.blockchain.common.Token import com.tangem.tap.common.extensions.getString import com.tangem.tap.common.extensions.hide import com.tangem.tap.common.extensions.loadCurrenciesIcon import com.tangem.tap.common.extensions.show import com.tangem.tap.domain.tokens.CardCurrencies +import com.tangem.tap.features.tokens.redux.CurrencyListItem +import com.tangem.tap.features.tokens.redux.TokensAction import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.store import com.tangem.wallet.R @@ -68,11 +67,11 @@ class CurrenciesAdapter : ListAdapter object DiffUtilCallback : DiffUtil.ItemCallback() { override fun areContentsTheSame( - oldItem: CurrencyListItem, newItem: CurrencyListItem + oldItem: CurrencyListItem, newItem: CurrencyListItem, ) = oldItem == newItem override fun areItemsTheSame( - oldItem: CurrencyListItem, newItem: CurrencyListItem + oldItem: CurrencyListItem, newItem: CurrencyListItem, ) = oldItem == newItem } @@ -161,38 +160,24 @@ class CurrenciesAdapter : ListAdapter class TitleViewHolder(val view: View) : RecyclerView.ViewHolder(view) { fun bind(title: CurrencyListItem.TitleListItem) { - view.tv_subtitle.text = view.getString(title.titleResId).toUpperCase(Locale.US) - } - } -} - - -sealed class CurrencyListItem { - data class TokenListItem(val token: Token) : CurrencyListItem() - data class BlockchainListItem(val blockchain: Blockchain) : CurrencyListItem() - data class TitleListItem(@StringRes val titleResId: Int) : CurrencyListItem() - - companion object { - fun createListOfCurrencies( - blockchains: List, - tokens: List - ): List { - val blockchainsTitle = R.string.add_tokens_subtitle_blockchains - val ethereumTokensTitle = R.string.add_tokens_subtitle_ethereum_tokens - val bscTokensTitle = R.string.add_tokens_subtitle_bsc_tokens - val binanceTokensTitle = R.string.add_tokens_subtitle_binance_tokens - - val ethereumTokens = tokens.filter { it.blockchain == Blockchain.Ethereum } - val bscTokens = tokens.filter { it.blockchain == Blockchain.BSC } - val binanceTokens = tokens.filter { it.blockchain == Blockchain.Binance } - return listOf(TitleListItem(blockchainsTitle)) + - blockchains.map { BlockchainListItem(it) } + - listOf(TitleListItem(ethereumTokensTitle)) + - ethereumTokens.map { TokenListItem(it) } + - listOf(TitleListItem(bscTokensTitle)) + - bscTokens.map { TokenListItem(it) } + - listOf(TitleListItem(binanceTokensTitle)) + - binanceTokens.map { TokenListItem(it) } + view.tv_subtitle.text = view.getString(title.titleResId).uppercase() + + if (title.blockchain != null) { + view.cl_subtitle_container.setOnClickListener { + store.dispatch(TokensAction.ToggleShowTokensForBlockchain( + title.isContentShown, title.blockchain + )) + } + view.iv_toggle_sublist_visibility.show() + val imageRes = if (title.isContentShown) { + R.drawable.ic_arrow_angle_down + } else { + R.drawable.ic_arrow_angle_right + } + view.iv_toggle_sublist_visibility.setImageResource(imageRes) + } else { + view.iv_toggle_sublist_visibility.hide() + } } } } diff --git a/app/src/main/res/drawable/ic_arrow_angle_down.xml b/app/src/main/res/drawable/ic_arrow_angle_down.xml new file mode 100644 index 0000000000..e773e9862f --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_angle_down.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_arrow_angle_right.xml b/app/src/main/res/drawable/ic_arrow_angle_right.xml new file mode 100644 index 0000000000..c009fd11a9 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_angle_right.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/layout/item_currency_subtitle.xml b/app/src/main/res/layout/item_currency_subtitle.xml index c4ae27800d..677c928c32 100644 --- a/app/src/main/res/layout/item_currency_subtitle.xml +++ b/app/src/main/res/layout/item_currency_subtitle.xml @@ -2,6 +2,7 @@ + + + \ No newline at end of file