From 6a7a869eccc026e4b9398d4633a8e87db14a6a8f Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 28 Apr 2021 23:10:01 +0300 Subject: [PATCH 1/8] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 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 e2beba423d..c8995c0f97 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -199,13 +199,12 @@ class TapWalletManager { store.dispatch(WalletAction.MultiWallet.FindBlockchainsInUse(card, walletManagerFactory)) store.dispatch(WalletAction.MultiWallet.FindTokensInUse) } else { - val blockchains = listOfNotNull(primaryBlockchain) + savedCurrencies.blockchains + val blockchains = savedCurrencies.blockchains val walletManagers = walletManagerFactory.makeWalletManagersForApp(card, blockchains) - val tokens = presetTokens + savedCurrencies.tokens store.dispatch(WalletAction.MultiWallet.AddWalletManagers(walletManagers)) store.dispatch(WalletAction.MultiWallet.AddBlockchains(blockchains)) - store.dispatch(WalletAction.MultiWallet.AddTokens(tokens)) + store.dispatch(WalletAction.MultiWallet.AddTokens(savedCurrencies.tokens)) store.dispatch(WalletAction.MultiWallet.FindTokensInUse) } } From 5e770b26b56313ea10865d30cc3a9d9f4fadf0f5 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 5 May 2021 18:28:22 +0300 Subject: [PATCH 2/8] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/network/NetworkConnectivity.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/tangem/tap/network/NetworkConnectivity.kt b/app/src/main/java/com/tangem/tap/network/NetworkConnectivity.kt index 05c2b6a6bd..00c2f87e19 100644 --- a/app/src/main/java/com/tangem/tap/network/NetworkConnectivity.kt +++ b/app/src/main/java/com/tangem/tap/network/NetworkConnectivity.kt @@ -44,6 +44,7 @@ class NetworkConnectivity( (capabilities != null) && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || + capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) } else { From cf785b1f75dba4da2a1a83784b4e237a1afcd55e Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 6 May 2021 07:23:13 +0300 Subject: [PATCH 3/8] Updated on 2026-08-14 --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 0fde302b00..13b2127afa 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ # Local configuration file (sdk path, etc) local.properties +# Google services + + # Gradle generated files .gradle From 23daa7bed70c77f12786a0ed12bfe3653a1209db Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 12 May 2021 10:50:06 +0300 Subject: [PATCH 4/8] Updated on 2026-08-14 --- .../java/com/tangem/tap/features/details/redux/DetailsReducer.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt index 4ec1681b66..5ec4fe3547 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt @@ -83,6 +83,7 @@ private fun handleEraseWallet(action: DetailsAction.EraseWallet, state: DetailsS return when (action) { DetailsAction.EraseWallet.Check -> { val notAllowedByCard = state.card?.settingsMask?.contains(Settings.ProhibitPurgeWallet) == true + || state.card?.settingsMask?.contains(Settings.IsReusable) == false val notEmpty = state.wallets.any { !it.recentTransactions.isNullOrEmpty() || it.amounts.toSendableAmounts().isNotEmpty() } From 944a01ba42706444e491aeb9cad42057f57d9070 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 12 May 2021 10:53:40 +0300 Subject: [PATCH 5/8] Updated on 2026-08-14 --- .../tap/features/wallet/redux/WalletState.kt | 3 +++ .../redux/middlewares/MultiWalletMiddleware.kt | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 4 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 244f7f026d..0dabc601c8 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 @@ -81,6 +81,9 @@ data class WalletState( && (walletData.token == null || walletData.token != store.state.walletState.primaryToken)) { val walletManager = getWalletManager(walletData.currencyData.currencySymbol) ?: return true + + if (walletData.token == null && walletManager.presetTokens.isNotEmpty()) return false + val wallet = walletManager.wallet if (walletData.blockchain != null) { return wallet.recentTransactions.toPendingTransactions(wallet.address).isEmpty() && 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 d68d7863f2..da28809df6 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 @@ -39,10 +39,10 @@ class MultiWalletMiddleware { globalState?.scanNoteResponse?.card?.cardId?.let { currenciesRepository.saveAddedToken(it, action.token) } - addToken(action.token, walletState) + addToken(action.token, walletState, globalState) } is WalletAction.MultiWallet.AddTokens -> { - action.tokens.map { addToken(it, walletState) } + action.tokens.map { addToken(it, walletState, globalState) } } is WalletAction.MultiWallet.AddBlockchain -> { globalState?.scanNoteResponse?.card?.let { card -> @@ -62,6 +62,8 @@ class MultiWalletMiddleware { is WalletAction.MultiWallet.RemoveWallet -> { val cardId = globalState?.scanNoteResponse?.card?.cardId if (action.walletData.token != null) { + walletState?.getWalletManagerForToken(action.walletData.token.symbol) + ?.removeToken(action.walletData.token) cardId?.let { currenciesRepository.removeToken(it, action.walletData.token) } } else if (action.walletData.blockchain != null) { cardId?.let { currenciesRepository.removeBlockchain(it, action.walletData.blockchain) } @@ -120,8 +122,15 @@ class MultiWalletMiddleware { } } - private fun addToken(token: Token, walletState: WalletState?) { - val walletManager = walletState?.getWalletManager(token.symbol) + private fun addToken(token: Token, walletState: WalletState?, globalState: GlobalState?) { + val card = globalState?.scanNoteResponse?.card ?: return + val walletManager = walletState?.getWalletManager(token.symbol) ?: + globalState.tapWalletManager.walletManagerFactory.makeWalletManagerForApp( + card = card, + blockchain = Blockchain.Ethereum + )?.also { walletManager -> + store.dispatch(WalletAction.MultiWallet.AddWalletManagers(walletManager)) + } scope.launch { val result = walletManager?.addToken(token) withContext(Dispatchers.Main) { From f6e8d7fd73dfd6f7baabc47be21523d12ec2ec5f Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 12 May 2021 10:56:35 +0300 Subject: [PATCH 6/8] Updated on 2026-08-14 --- app/build.gradle | 10 +-- .../tangem/tap/common/extensions/Picasso.kt | 78 +++++++++++++++++++ .../tokens/ui/adapters/CurrenciesAdapter.kt | 26 +++++-- .../wallet/ui/adapters/WalletAdapter.kt | 28 ++++--- dependencies.gradle | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 6 files changed, 120 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/common/extensions/Picasso.kt diff --git a/app/build.gradle b/app/build.gradle index 44a13aa801..6674f33d44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -75,13 +75,9 @@ dependencies { implementation 'com.google.android.play:core-ktx:1.8.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' -// TODO: change to prod dependencies when they are available -// implementation 'com.tangem:blockchain:1.164.0' -// implementation 'com.tangem:core:1.109.0' -// implementation 'com.tangem:sdk:1.109.0' - implementation 'blockchain-sdk-kotlin:blockchain:tangem-20210416.151414-8' - implementation 'com.tangem:tangem-core:tangem-20210414.185224-2' - implementation 'com.tangem:tangem-sdk:tangem-20210414.185231-2' + implementation 'com.tangem:blockchain:develop-5' + implementation 'com.tangem:core:develop-10' + implementation 'com.tangem:sdk:develop-10' // WebView implementation "androidx.browser:browser:1.3.0" diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Picasso.kt b/app/src/main/java/com/tangem/tap/common/extensions/Picasso.kt new file mode 100644 index 0000000000..1ec834aa43 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/extensions/Picasso.kt @@ -0,0 +1,78 @@ +package com.tangem.tap.common.extensions + +import android.widget.ImageView +import android.widget.TextView +import com.squareup.picasso.Callback +import com.squareup.picasso.Picasso +import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.IconsUtil +import com.tangem.blockchain.common.Token +import com.tangem.wallet.R + +fun Picasso.loadCurrenciesIcon( + imageView: ImageView, + textView: TextView, + token: Token? = null, + blockchain: Blockchain?, +) { + val blockchain = blockchain ?: Blockchain.Ethereum + + val url = if (token != null) { + IconsUtil.getTokenIconUri(blockchain, token) + } else { + IconsUtil.getBlockchainIconUri(blockchain) + } + + imageView.setImageDrawable(null) + imageView.colorFilter = null + textView.text = null + + if (url != null) { + this.load(url) + .placeholder(R.drawable.shape_circle) + ?.into(imageView, + object : Callback { + override fun onError(e: Exception?) { + setOfflineCurrencyImage(imageView, textView, token, blockchain) + } + + override fun onSuccess() { + } + }) + } else { + setOfflineCurrencyImage(imageView, textView, token, blockchain) + } +} + +private fun setOfflineCurrencyImage( + imageView: ImageView, + textView: TextView, + token: Token?, + blockchain: Blockchain, +) { + if (token != null) { + setTokenImage(imageView, textView, token) + } else { + setBlockchainImage(imageView, textView, blockchain) + } +} + +private fun setBlockchainImage( + imageView: ImageView, + textView: TextView, + blockchain: Blockchain +) { + imageView.setImageResource(blockchain.getIconRes()) + imageView.colorFilter = null + textView.text = null +} + +private fun setTokenImage( + imageView: ImageView, + textView: TextView, + token: Token +) { + imageView.setImageResource(R.drawable.shape_circle) + imageView.setColorFilter(token.getColor()) + textView.text = token.symbol.take(1) +} 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 9fe1ba05bd..0047481627 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 @@ -7,7 +7,10 @@ import androidx.annotation.StringRes import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import com.squareup.picasso.Callback +import com.squareup.picasso.Picasso import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.IconsUtil import com.tangem.blockchain.common.Token import com.tangem.tap.common.extensions.* import com.tangem.tap.common.redux.global.CryptoCurrencyName @@ -16,6 +19,7 @@ import com.tangem.tap.store import com.tangem.wallet.R import kotlinx.android.synthetic.main.item_currency_subtitle.view.* import kotlinx.android.synthetic.main.item_popular_token.view.* +import java.lang.Exception import java.util.* class CurrenciesAdapter : ListAdapter(DiffUtilCallback) { @@ -104,9 +108,11 @@ class CurrenciesAdapter : ListAdapter view.btn_add_token.show(!isAdded) view.btn_token_added.show(isAdded) - view.iv_currency.setImageResource(currency.blockchain.getIconRes()) - view.iv_currency.colorFilter = null - view.tv_token_letter.text = null + Picasso.get().loadCurrenciesIcon( + imageView = view.iv_currency, + textView = view.tv_token_letter, + blockchain = blockchain, token = null + ) view.btn_add_token.setOnClickListener { store.dispatch(WalletAction.MultiWallet.AddBlockchain(blockchain)) @@ -123,10 +129,11 @@ class CurrenciesAdapter : ListAdapter view.btn_add_token.show(!isAdded) view.btn_token_added.show(isAdded) - view.iv_currency.setImageResource(R.drawable.shape_circle) - view.iv_currency.setColorFilter(token.getColor()) - view.tv_token_letter.text = token.symbol.take(1) - + Picasso.get().loadCurrenciesIcon( + imageView = view.iv_currency, + textView = view.tv_token_letter, + token = token, blockchain = Blockchain.Ethereum + ) view.btn_add_token.setOnClickListener { store.dispatch(WalletAction.MultiWallet.AddToken(token)) view.btn_add_token.hide() @@ -152,7 +159,10 @@ sealed class CurrencyListItem { data class TitleListItem(@StringRes val titleResId: Int) : CurrencyListItem() companion object { - fun createListOfCurrencies(blockchains: List, tokens: List): List { + fun createListOfCurrencies( + blockchains: List, + tokens: List + ): List { val blockchainsTitle = R.string.add_tokens_subtitle_blockchains val tokensTitle = R.string.add_tokens_subtitle_tokens return listOf(TitleListItem(blockchainsTitle)) + diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt index c14d364abf..c82c47f25f 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt @@ -6,10 +6,14 @@ import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import com.squareup.picasso.Callback +import com.squareup.picasso.Picasso import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.IconsUtil import com.tangem.blockchain.common.Token import com.tangem.tap.common.extensions.getColor import com.tangem.tap.common.extensions.getIconRes +import com.tangem.tap.common.extensions.loadCurrenciesIcon import com.tangem.tap.common.extensions.show import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.features.wallet.redux.WalletData @@ -17,6 +21,11 @@ import com.tangem.tap.features.wallet.ui.BalanceStatus import com.tangem.tap.store import com.tangem.wallet.R import kotlinx.android.synthetic.main.item_currency_wallet.view.* +import kotlinx.android.synthetic.main.item_currency_wallet.view.iv_currency +import kotlinx.android.synthetic.main.item_currency_wallet.view.tv_currency_symbol +import kotlinx.android.synthetic.main.item_currency_wallet.view.tv_token_letter +import kotlinx.android.synthetic.main.item_popular_token.view.* +import java.lang.Exception import java.math.BigDecimal class WalletAdapter @@ -89,16 +98,15 @@ class WalletAdapter view.card_wallet.setOnClickListener { store.dispatch(WalletAction.MultiWallet.SelectWallet(wallet)) } - val blockchain = wallet.currencyData.currencySymbol?.let { Blockchain.fromCurrency(it) } - if (blockchain != null && blockchain != Blockchain.Unknown) { - view.tv_token_letter.text = null - view.iv_currency.colorFilter = null - view.iv_currency.setImageResource(blockchain.getIconRes()) - } else { - view.tv_token_letter.text = wallet.currencyData.currencySymbol?.take(1) - wallet.token?.getColor()?.let { view.iv_currency.setColorFilter(it) } - view.iv_currency.setImageResource(R.drawable.shape_circle) - } + val blockchain = wallet.blockchain + val token = wallet.token + + Picasso.get().loadCurrenciesIcon( + imageView = view.iv_currency, + textView = view.tv_token_letter, + token = token, blockchain = blockchain + ) + when (wallet.currencyData.status) { BalanceStatus.VerifiedOnline, BalanceStatus.SameCurrencyTransactionInProgress -> hideWarning() BalanceStatus.Loading -> { diff --git a/dependencies.gradle b/dependencies.gradle index f74991aa26..22dc84c906 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,4 +1,4 @@ ext.versions = [ - kotlin : '1.4.31', - build_gradle: '4.1.3', + kotlin : '1.5.0', + build_gradle: '4.2.0', ] diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 385ee4fcc0..c6dab66ff6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip From d13df4aedc2bee6a74379da82c2a8c18fcc6d87e Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 12 May 2021 11:53:01 +0300 Subject: [PATCH 7/8] Updated on 2026-08-14 --- app/src/main/assets/erc20_tokens.json | 7 ++++ .../tangem/tap/common/extensions/Picasso.kt | 34 +++++++++++------- app/src/main/res/drawable-ldpi/ic_qcx.png | Bin 0 -> 7787 bytes 3 files changed, 28 insertions(+), 13 deletions(-) create mode 100644 app/src/main/res/drawable-ldpi/ic_qcx.png diff --git a/app/src/main/assets/erc20_tokens.json b/app/src/main/assets/erc20_tokens.json index 9b29c198bb..5f2bfeb629 100644 --- a/app/src/main/assets/erc20_tokens.json +++ b/app/src/main/assets/erc20_tokens.json @@ -629,6 +629,13 @@ "name" : "QASH", "contractAddress" : "0x618e75ac90b12c6049ba3b27f5d5f8651b0037f6" }, + { + "decimalCount" : 8, + "symbol" : "QCX", + "name" : "QuickX Protocol", + "contractAddress" : "0xf9e5af7b42d31d51677c75bbbd37c1986ec79aee", + "customIcon": "qcx" + }, { "decimalCount" : 8, "symbol" : "QRL", diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Picasso.kt b/app/src/main/java/com/tangem/tap/common/extensions/Picasso.kt index 1ec834aa43..97a952841e 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Picasso.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Picasso.kt @@ -27,23 +27,31 @@ fun Picasso.loadCurrenciesIcon( imageView.colorFilter = null textView.text = null - if (url != null) { - this.load(url) - .placeholder(R.drawable.shape_circle) - ?.into(imageView, - object : Callback { - override fun onError(e: Exception?) { - setOfflineCurrencyImage(imageView, textView, token, blockchain) - } + when { + url != null -> { + this.load(url) + .placeholder(R.drawable.shape_circle) + ?.into(imageView, + object : Callback { + override fun onError(e: Exception?) { + setOfflineCurrencyImage(imageView, textView, token, blockchain) + } - override fun onSuccess() { - } - }) - } else { - setOfflineCurrencyImage(imageView, textView, token, blockchain) + override fun onSuccess() { + } + }) + } + token?.symbol == QCX -> { + this.load(R.drawable.ic_qcx)?.into(imageView) + } + else -> { + setOfflineCurrencyImage(imageView, textView, token, blockchain) + } } } +private const val QCX = "QCX" + private fun setOfflineCurrencyImage( imageView: ImageView, textView: TextView, diff --git a/app/src/main/res/drawable-ldpi/ic_qcx.png b/app/src/main/res/drawable-ldpi/ic_qcx.png new file mode 100644 index 0000000000000000000000000000000000000000..68f2ded28763116f2f73132925500ce772a0a649 GIT binary patch literal 7787 zcmd^k=T}o(_cdNcP{AO*2tlL>Dph*#O+dPU5EbcF5CTaEiXb4J(5r${rAm<+=~a4@ zUPAAI03ivy=icZ0`w#p+oRKk-y-)UDd#yR=nmhcNz9#ie)|+HxWYpSPYDQ#aSB(FC zDE|SzxyA2yANaW8sb%3!M)pGE-{%T_f~qnZ83((znzD&s#_n98iHXlV#evhz(QF>9 z-r(5FdD%KxDD*+$2{)K+C95FxO;C|mI~T@+SQLh?@wlD4=>GsIGx=m zUDQjyXz=|*MwWr+KrWHpRl#2I3&vbMpzNVoyb}-leV-frUQ#_ZLz?BiM%%L?aEw+XVczgYQic6;Hkph2FW+5OWZ_a_+bXi5uo{Q? zdpa`+ImEw{)!2;qE$XbMqhqA8CbjJI@=83|*A+*--w4m^cxyITMe$OEFPhzLAT>qA z)oDI-Dx-<@1pPfD_Y2~zid`Ewd^<6f1|#Y zz0b+nbR<_3EQZ#2SaHT@5{uBWiSe*RI(1X*zE(R7HB@9) zIPO|@tIhky%|i9*ESvb?_XEq&zJMjvAl3D@aJqa1#KtFpShz(%T>I|0mcXNXO9eOT z{|PhdStad2pA^C^tf9;-jc{z8JLKorc6R%=iaU#L8s~C5%e{nJSb7=x;6$s4KA$iY zZt3G@)vp=`6iuc%R$9hHEG1*Udwj?}p@X?!qjwPxYSe!5k3Wp!=(e3^AU%{ zd)JA_!I-{f+!^nx;1DcHKk|Ws0>8Iei|vyC=tJ=cx3@%`>0(7?8@gJCV}*PoB@k9c0Np{0B!?_;s^#ndywx zVhQJWmoWz}H+#Ubz7-Cxq%M3btCHXZLZm{g@xkJ;E zS|lU>%~6xhgidGg_|LVZja}ng@gC1A%!LBId{?(Z)L6!5$H*j!MM^H0=QgmS_U0dc z60a3wr9=F!ApDXyTgl2OTIR-0jfg5*gP+J7`4)!POqxUT#<&W z4a4hoXL`*|73z57w*pBDAyX8(B?n-ci5*98TD#bg1x&K(1Wh&P!dE|u>${uJJJXo{ zq?Zx{kkyT81s@(|@S+jwC9S^5;eP&&5#!eYfLI*5hIlORZMDvF$jI@c+g9hH7-qxU zDwbZfSyZ{R8Lf>O$0i{jKaqXzWfUNBD%O}DApih)0{SX=je$zYp?cyhA?G5(CxG9m zhr^sF_c?ooDfi+%JX{ScVY3e?eI~}4pBlyac-#Hx`Gz6+?kbKfdC}QX1~*{J7Ji`$ z$iKecH1?xRsL#piNS;g(*x7;{_oUoe35;~XHq&B z6Pbjtv=@xtTs48?mL|tI`CEy^SiN*#I`M;;WDIZ?1wv;U$^|f_h~ae{a7@Oct(Oyr zW|6yn?Yh{+cbn_>`MHV^$%lOr1v5l|G0Mi9loMJ&g7FJWUdGT(Hu6_XIjL$aRkREN zq&V&|kBjpU8adaIo^c4Crsjw>JQF z{NXIHeJaeJW`&2>=)Ew#_}FTm*rwBi<#LGN1{h2sFwch`XsLiCRhD1Lik z7hJ#1nh=@|r?g}v-^eGZK!rD!K=1!z;PMJvHl#zAgh1ynA)9#A#(Xu7+fE1sO3`bM z--o+4(wTjtj`==QuunQU0@l#tiY-L%Gq{uAvP_B9{`v0o^I&L2(+A;n#MVBcBKIu{ z?CZsAKg2#VqgSFvP1Vo4uzhG4vo4<^^Qk~N%uw>|ZLuPa1S)Xnaj#FBhVpMZ(YDco zIK}T$rO^Ws|4q1@mF~^E=w4C{XAKS^?6axAWgc6R?Y9-fM~kh8r9HXb zmLU7(b?$BS)Kes&9n|!a66n>fnm_vH zJX<)gh-$$E;#W;`cq8n_D4Sv!f|Q{`8Ufo~64!z86`)tq=QjPr8g+QlwqI~0l5ArN z6!>nA5O_J0tQG~O;su}jP&IV;(RK9r_+Eq*97eZbj29-Coa&bLC#*d3q&g#*-imC1 zN&>>TQ{EIZPQ=IHrj+XaHobE?WhdeT0onxiKGq`i~riMH@;ULt(z90

3Cdbh?3NaU%K$Nklijc>9_ax&rVFR`0h?Or6%HjzB1^Nwb^ zSjOr1dHnNWJw*nlj@tp+s9tpwGr?m z?tP03(xggDvRqSAH&_Iq4Wp5KfP-3ht1Jz&c$_P#>W+MyV#I07rBR`6wC=PEZ4b@lU%Jf4$qBQ;z;kX+1`&O?-zvw$Q=FD27?=B>)~G%e7I&lUtc|d2&te zZq`y67NLE5@;$Wd1Y|`j@y`7{px~=A*G`8c42PFzS?U5F0x*>ByF(osarqUd$7j*i_D>p9S6rMX;%i{r>HW&CTg(rZ&d| z`;`h@#^#WVg-zpP?EW5!`y1;tW)1yt@sd*HcCO@(sWacVjiTu<9dF?KP}y?XwT1#B z#ge)*5>JALOJ{(i1K-qKEJW(0v7xned7WRrl*W%iPCO(e=){{%%!Sw-pC5l7OqO)f z#(%b4W}s%T&i(>FdX5T*p|7urq!S@)(R|L8zZ&YLAXQ8Zj~Sn4Y9*kn0j>9Ar>?%5 zxFE0kx0hKQoBux?09Fl5ebA>ehw6_6+uN=tp)Ox; zG5JymlpB1$rhl9N$eYRhg#DdXSWLQcO8y*ZygQ14f#D8x zsHNVed)Gt!E*g7^HYP3v9v>q}s?_vZ4Q{HiTf#CCY(AU1 zCiwiC?T9b~$-I>sN&nC|yRMrsOJQ?p?cq#or*9!?ZnXdI*AAXFL@ZZKv@27pCcn0; zDj`8E=DiRK~dIaZbWRI?MPJiIX6p8Enj@pj0RQE^s2y5Cfc9XbXAbeG^Xb z_nMwgo)yQOpsi0X3Q2N@I-b$BO`(a6MrWa2q%)`{gM5BF6t{Ij@`w`UD-d^THCu>P zEZe~{fDS(c%69pj^*Y?U&V5(c#OWxsZRlOfv-ugmIrIH0Gkyq}l@akDbq5=vxpQ`0 zmyZji@)hZ3h?|MF@pd7N!Yc*DBMZwfo?P|y4L>rNgP(u1)m z)oEX|(9r%*KMNcWf#d15GJ3ZJgh&?p_Iqm&t6j&>zepX>-Vr)6Evf84VAve6TzbcE zg^OwemWnr1ae0F2g?!+m9vrjsweNb*Ws(3L;an#yW~LlT-uAeY%!FlrpNEeaEwNsf zWd86nJo3*t8>J;-;qzxksAaLq<}RuVvXLRY>U0~rv+r4F8rhU#k1lC`rSU2io6YPZ zy8G8uFM%c41sOQ=qXww2@JcR5?;Ia*9===f$&!-dV#R{jqlJ@7wyrw7>o`05V9C?w zUTrq&o>SF`10XOjx7q=Q4l|#61sF%r2Y!xBqi21a90l@i-gb)$!Y`qYWVhX)tmJDv=u`IUVO`BxO_)Q&l7^ z69Go_B}J2^kGLqG|Fc_5Dy6+E*r0;FIxI-kQ11St5BcTD>p#iLuM+S7_@Hi@wg(*S zyA(4^6hrxEnOkw$pBCWdTz`)kifp`z1T*>cjSFl75j0;(R)D1 z;`veQIBiSTCH& z@~o!2c@mNLwQfiM3fsH-ot$aWpl=`)M5+&vC@%<|C#j>@vzb+JLuLWtH5U^`8~E z3U!OrSkl}fsbI&40k#yfjEV?+iAVjsYG7&>Q2#~+F`H#Qeg(-@8;cNM8VKa{O5!U* z{)rJ!P5YPCggNnBD6^jhmFiS%w96}uk5iVQ?O%nW($4+1mXu-QnKl{v{2k zQ*h=yfmj4JV5ClX%=Rq(K@qX-EAaCDMg>{B7Yxcgc(;#= zMP!!GT>#ci8;Bc_U!d90$r$%OaD`52FlJk4>(b?nbibz!}e=D z?Do#`9x>6o)jqSQCoHi<&wBynRatU`Jr)OM{cG_OlwX=#PrtVGC2QO~g7A@VCs% zE>?>70BwR!p`h1eKf*hFfxLXo1^jW~x4={DCkDe~Z zsjrItBb_n-5%ZDPgr#j8Y72f37->B#$I^{UnpkDJLMQyqu7eAb;r>xt^JaA}u4TIUgQWEeCmHQ`E(&Yw@ZS7lr=_4T{KXeJ^kdOFu z6Ig>d;AIo<|J;;d7rCj@F_KSI`0(*IPA>a@d`@dO@ueD6#Ge7tXCefj{Q|JI==IKb ze+8hB!m*3D*SA#=?j{H?fKPHy~@)E z?%ZIdS7WOA!tF^?~lFuuL~M95sVWp!|koVB`at`8mym`^@nmC$uNm17r76*L2+B`cSEpIQnPz>C* zJa}>E%j)1$b8tMUMf)z!5o!=~Oe9*6$B0PRi7Q?5h*<|{DO>}{sdb8miT}4NSc0QF z6m#`#9d~AC>dr+${F^c!Dvcn!P*;x-XUm!c+AK5)(eR&Ddq9A2QI_J#J|4gj)!WeH zrXz>N${5Vm?qx^sq_XKL*|>Wnl3QvnU?s-B=iY5`CF)}N%;YUEg^By)WnAapZQ@`~ zDFETB>m@m!veONNmel^elAQQIcLg~s!c28Zapm4Y6Lx(y9=JUw(^l74D^+ Date: Wed, 12 May 2021 16:27:54 +0300 Subject: [PATCH 8/8] Updated on 2026-08-14 --- .../warningMessage/WarningMessage.kt | 22 +-- .../warningMessage/WarningMessagesManager.kt | 15 +++ .../tap/features/wallet/redux/WalletAction.kt | 1 + .../tap/features/wallet/redux/WalletState.kt | 3 +- .../redux/middlewares/WarningsMiddleware.kt | 11 +- .../wallet/redux/reducers/WalletReducer.kt | 3 + .../ui/adapters/WarningMessagesAdapter.kt | 125 +++++++++++------- .../ui/dialogs/SignedHashesWarningDialog.kt | 33 +++++ .../wallet/ui/wallet/MultiWalletView.kt | 20 ++- .../wallet/ui/wallet/SingleWalletView.kt | 6 + .../main/res/values/strings_untranslated.xml | 9 +- 11 files changed, 178 insertions(+), 70 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SignedHashesWarningDialog.kt diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/warningMessage/WarningMessage.kt b/app/src/main/java/com/tangem/tap/domain/configurable/warningMessage/WarningMessage.kt index ab94c0d563..8494a61786 100644 --- a/app/src/main/java/com/tangem/tap/domain/configurable/warningMessage/WarningMessage.kt +++ b/app/src/main/java/com/tangem/tap/domain/configurable/warningMessage/WarningMessage.kt @@ -1,5 +1,7 @@ package com.tangem.tap.domain.configurable.warningMessage +import android.view.View +import androidx.annotation.StringRes import com.squareup.moshi.Json import com.tangem.blockchain.common.Blockchain @@ -7,15 +9,16 @@ import com.tangem.blockchain.common.Blockchain [REDACTED_AUTHOR] */ data class WarningMessage( - val title: String, - val message: String, - val type: Type, - val priority: Priority, - val location: List, - private val blockchains: List?, - val titleResId: Int? = null, - val messageResId: Int? = null, - val origin: Origin = Origin.Remote, + val title: String, + val message: String, + val type: Type, + val priority: Priority, + val location: List, + private val blockchains: List?, + @StringRes val titleResId: Int? = null, + @StringRes val messageResId: Int? = null, + val origin: Origin = Origin.Remote, + @StringRes val buttonTextId: Int? = null, ) { val blockchainList: List? by lazy { blockchains?.map { Blockchain.fromId(it.toUpperCase()) } @@ -43,6 +46,7 @@ data class WarningMessage( Temporary, // можно скрыть (кнопка ОК) AppRating + } enum class Location { diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/warningMessage/WarningMessagesManager.kt b/app/src/main/java/com/tangem/tap/domain/configurable/warningMessage/WarningMessagesManager.kt index 81739ee7b5..8bde4ae283 100644 --- a/app/src/main/java/com/tangem/tap/domain/configurable/warningMessage/WarningMessagesManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/configurable/warningMessage/WarningMessagesManager.kt @@ -3,6 +3,8 @@ package com.tangem.tap.domain.configurable.warningMessage import com.tangem.blockchain.common.Blockchain import com.tangem.tangem_sdk_new.ui.animation.VoidCallback import com.tangem.tap.common.extensions.containsAny +import com.tangem.tap.features.wallet.redux.WalletAction +import com.tangem.tap.store import com.tangem.wallet.R /** @@ -98,6 +100,19 @@ class WarningMessagesManager( WarningMessage.Origin.Local ) + fun signedHashesMultiWalletWarning(): WarningMessage = WarningMessage( + title = "", + message = "", + type = WarningMessage.Type.Temporary, + priority = WarningMessage.Priority.Info, + location = listOf(WarningMessage.Location.MainScreen), + blockchains = null, + titleResId = R.string.warning_important_security_info, + messageResId = R.string.warning_signed_tx_previously, + origin = WarningMessage.Origin.Local, + buttonTextId = R.string.warning_button_learn_more, + ) + fun appRatingWarning(): WarningMessage = WarningMessage( "", "", 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 5b3877338d..18ffaa31b1 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 @@ -111,6 +111,7 @@ sealed class WalletAction : Action { object ShowDialog : WalletAction() { object QrCode : WalletAction() object ScanFails : WalletAction() + object SignedHashesMultiWalletDialog : WalletAction() } object HideDialog : WalletAction() 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 244f7f026d..6d7bc13229 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 @@ -112,7 +112,8 @@ sealed class WalletDialog: StateDialog { ) : WalletDialog() data class SelectAmountToSendDialog(val amounts: List?) : WalletDialog() - object ScanFailsDialog: WalletDialog() + object ScanFailsDialog : WalletDialog() + object SignedHashesMultiWalletDialog : WalletDialog() } enum class ProgressState { Loading, Done, Error } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt index 79ab8e3feb..46a7693492 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt @@ -87,9 +87,18 @@ class WarningsMiddleware { ): WarningMessage? { if (card.isTwinCard()) return null + if (card.isMultiwalletAllowed) { + return if (card.hasSignedHashes()) { + WarningMessagesManager.signedHashesMultiWalletWarning() + } else { + store.dispatch(WalletAction.Warnings.CheckHashesCount.SaveCardId) + null + } + } + val validator = store.state.walletState.walletManagers.firstOrNull() as? SignatureCountValidator - return if (validator == null || card.isMultiwalletAllowed) { + return if (validator == null) { if (card.hasSignedHashes()) { WarningMessagesManager.alreadySignedHashesWarning() } else { 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 957e9a32d3..06f40d4d68 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 @@ -225,6 +225,9 @@ private fun internalReduce(action: Action, state: AppState): WalletState { is WalletAction.ShowDialog.ScanFails -> { newState = newState.copy(walletDialog = WalletDialog.ScanFailsDialog) } + is WalletAction.ShowDialog.SignedHashesMultiWalletDialog -> { + newState = newState.copy(walletDialog = WalletDialog.SignedHashesMultiWalletDialog) + } is WalletAction.HideDialog -> { newState = newState.copy(walletDialog = null) } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WarningMessagesAdapter.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WarningMessagesAdapter.kt index a15a4e3e9a..80b739b21c 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WarningMessagesAdapter.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WarningMessagesAdapter.kt @@ -37,9 +37,11 @@ class WarningMessagesAdapter : ListAdapter(Dif } object DiffUtilCallback : DiffUtil.ItemCallback() { - override fun areContentsTheSame(oldItem: WarningMessage, newItem: WarningMessage) = oldItem == newItem + override fun areContentsTheSame(oldItem: WarningMessage, newItem: WarningMessage) = + oldItem == newItem - override fun areItemsTheSame(oldItem: WarningMessage, newItem: WarningMessage) = oldItem == newItem + override fun areItemsTheSame(oldItem: WarningMessage, newItem: WarningMessage) = + oldItem == newItem } } @@ -52,7 +54,8 @@ class WarningMessageVH(val view: View) : RecyclerView.ViewHolder(view) { } private fun setText(warning: WarningMessage) { - fun getString(resId: Int?, default: String) = if (resId == null) default else view.getString(resId) + fun getString(resId: Int?, default: String) = + if (resId == null) default else view.getString(resId) view.tv_title.text = getString(warning.titleResId, warning.title) view.tv_message.text = getString(warning.messageResId, warning.message) @@ -67,63 +70,83 @@ class WarningMessageVH(val view: View) : RecyclerView.ViewHolder(view) { view.card_view.setCardBackgroundColor(view.context.resources.getColor(color)) } - private fun setupControlButtons(warning: WarningMessage) { - when (warning.type) { - WarningMessage.Type.Permanent -> { - view.group_controls_temporary.hide() - view.group_controls_rating.hide() - } - WarningMessage.Type.Temporary -> { - view.group_controls_rating.hide() - view.group_controls_temporary.show() - view.btn_got_it.setOnClickListener { store.dispatch(GlobalAction.HideWarningMessage(warning)) } - } - WarningMessage.Type.AppRating -> { - view.group_controls_temporary.hide() - view.group_controls_rating.show() - view.btn_close.setOnClickListener { - FirebaseAnalyticsHandler.triggerEvent(AnalyticsEvent.APP_RATING_DISMISS) - store.dispatch(GlobalAction.HideWarningMessage(warning)) - store.dispatch(WalletAction.Warnings.AppRating.RemindLater) - } - view.btn_can_be_better.setOnClickListener { - FirebaseAnalyticsHandler.triggerEvent(AnalyticsEvent.APP_RATING_NEGATIVE) - store.dispatch(WalletAction.Warnings.AppRating.SetNeverToShow) - store.dispatch(GlobalAction.HideWarningMessage(warning)) - store.dispatch(GlobalAction.SendFeedback(RateCanBeBetterEmail())) - } - view.btn_really_cool.setOnClickListener { - val activity = view.context.getActivity() ?: return@setOnClickListener - - FirebaseAnalyticsHandler.triggerEvent(AnalyticsEvent.APP_RATING_POSITIVE) - store.dispatch(WalletAction.Warnings.AppRating.SetNeverToShow) - val reviewManager = ReviewManagerFactory.create(activity) - val task = reviewManager.requestReviewFlow() - task.addOnCompleteListener { - if (it.isSuccessful) { - val reviewFlow = reviewManager.launchReviewFlow(activity, it.result) - reviewFlow.addOnCompleteListener { - if (it.isSuccessful) { - // send review was succeed - } else { - // send fails - } - } - } else { - Timber.e(task.exception) + private fun setupControlButtons(warning: WarningMessage) = when (warning.type) { + WarningMessage.Type.Permanent -> { + view.group_controls_temporary.hide() + view.group_controls_rating.hide() + } + WarningMessage.Type.Temporary -> { + view.group_controls_rating.hide() + view.group_controls_temporary.show() + val buttonAction = + when (warning.titleResId) { + R.string.warning_important_security_info -> { + View.OnClickListener { + store.dispatch(WalletAction.ShowDialog.SignedHashesMultiWalletDialog) + } + } + else -> { + View.OnClickListener { + store.dispatch(GlobalAction.HideWarningMessage(warning)) } - }.addOnFailureListener { - Timber.e(it) } - store.dispatch(GlobalAction.HideWarningMessage(warning)) } + val buttonTitle = view.getString( + warning.buttonTextId ?: R.string.how_to_got_it_button + ) + view.btn_got_it.setOnClickListener (buttonAction) + view.btn_got_it.text = buttonTitle + } + WarningMessage.Type.AppRating -> { + view.group_controls_temporary.hide() + view.group_controls_rating.show() + view.btn_close.setOnClickListener { + FirebaseAnalyticsHandler.triggerEvent(AnalyticsEvent.APP_RATING_DISMISS) + store.dispatch(GlobalAction.HideWarningMessage(warning)) + store.dispatch(WalletAction.Warnings.AppRating.RemindLater) + } + view.btn_can_be_better.setOnClickListener { + FirebaseAnalyticsHandler.triggerEvent(AnalyticsEvent.APP_RATING_NEGATIVE) + store.dispatch(WalletAction.Warnings.AppRating.SetNeverToShow) + store.dispatch(GlobalAction.HideWarningMessage(warning)) + store.dispatch(GlobalAction.SendFeedback(RateCanBeBetterEmail())) + } + view.btn_really_cool.setOnClickListener { + val activity = view.context.getActivity() ?: return@setOnClickListener + + FirebaseAnalyticsHandler.triggerEvent(AnalyticsEvent.APP_RATING_POSITIVE) + store.dispatch(WalletAction.Warnings.AppRating.SetNeverToShow) + val reviewManager = ReviewManagerFactory.create(activity) + val task = reviewManager.requestReviewFlow() + task.addOnCompleteListener { + if (it.isSuccessful) { + val reviewFlow = reviewManager.launchReviewFlow(activity, it.result) + reviewFlow.addOnCompleteListener { + if (it.isSuccessful) { + // send review was succeed + } else { + // send fails + } + } + } else { + Timber.e(task.exception) + } + }.addOnFailureListener { + Timber.e(it) + } + store.dispatch(GlobalAction.HideWarningMessage(warning)) } } } } class SpacesItemDecoration(private val spacePx: Int) : ItemDecoration() { - override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { outRect.left = spacePx outRect.right = spacePx diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SignedHashesWarningDialog.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SignedHashesWarningDialog.kt new file mode 100644 index 0000000000..9aaf4b88d6 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SignedHashesWarningDialog.kt @@ -0,0 +1,33 @@ +package com.tangem.tap.features.wallet.ui.dialogs + +import android.content.Context +import androidx.appcompat.app.AlertDialog +import com.tangem.tap.common.redux.global.GlobalAction +import com.tangem.tap.domain.configurable.warningMessage.WarningMessagesManager +import com.tangem.tap.features.wallet.redux.WalletAction +import com.tangem.tap.store +import com.tangem.wallet.R + +class SignedHashesWarningDialog { + companion object { + fun create(context: Context): AlertDialog { + return AlertDialog.Builder(context).apply { + setTitle(context.getString(R.string.warning_important_security_info)) + setMessage(R.string.alert_signed_hashes_message) + setPositiveButton(R.string.alert_button_i_understand) { _, _ -> + store.dispatch(WalletAction.Warnings.CheckHashesCount.SaveCardId) + store.dispatch( + GlobalAction.HideWarningMessage( + WarningMessagesManager.signedHashesMultiWalletWarning() + ) + ) + } + setNegativeButton(R.string.common_cancel) { _, _ -> } + setOnDismissListener { + store.dispatch(WalletAction.HideDialog) + } + }.create() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt index 6e69a80b7d..5deff50687 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt @@ -15,6 +15,7 @@ import com.tangem.tap.features.wallet.ui.BalanceStatus import com.tangem.tap.features.wallet.ui.WalletFragment import com.tangem.tap.features.wallet.ui.adapters.WalletAdapter import com.tangem.tap.features.wallet.ui.dialogs.ScanFailsDialog +import com.tangem.tap.features.wallet.ui.dialogs.SignedHashesWarningDialog import com.tangem.tap.store import com.tangem.wallet.R import kotlinx.android.synthetic.main.card_balance.* @@ -94,24 +95,24 @@ class MultiWalletView : WalletView { when (state.primaryWallet?.currencyData?.status) { BalanceStatus.EmptyCard -> { showErrorState( - fragment, - fragment.getText(R.string.wallet_error_empty_card), - fragment.getString(R.string.wallet_error_empty_card_subtitle) + fragment, + fragment.getText(R.string.wallet_error_empty_card), + fragment.getString(R.string.wallet_error_empty_card_subtitle) ) configureButtonsForEmptyWalletState(fragment) } BalanceStatus.UnknownBlockchain -> { showErrorState( - fragment, - fragment.getText(R.string.wallet_error_unsupported_blockchain), - fragment.getString(R.string.wallet_error_unsupported_blockchain_subtitle) + fragment, + fragment.getText(R.string.wallet_error_unsupported_blockchain), + fragment.getString(R.string.wallet_error_unsupported_blockchain_subtitle) ) } } } private fun showErrorState( - fragment: WalletFragment, errorTitle: CharSequence, errorDescription: CharSequence, + fragment: WalletFragment, errorTitle: CharSequence, errorDescription: CharSequence, ) = with(fragment) { l_card_balance.show() l_balance.hide() @@ -137,6 +138,11 @@ class MultiWalletView : WalletView { is WalletDialog.ScanFailsDialog -> { if (dialog == null) dialog = ScanFailsDialog.create(context).apply { show() } } + is WalletDialog.SignedHashesMultiWalletDialog -> { + if (dialog == null) { + dialog = SignedHashesWarningDialog.create(context).apply { show() } + } + } else -> { dialog?.dismiss() dialog = null diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt index 97f2618542..56eba3612c 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt @@ -19,6 +19,7 @@ import com.tangem.tap.features.wallet.ui.adapters.PendingTransactionsAdapter import com.tangem.tap.features.wallet.ui.dialogs.AmountToSendDialog import com.tangem.tap.features.wallet.ui.dialogs.QrDialog import com.tangem.tap.features.wallet.ui.dialogs.ScanFailsDialog +import com.tangem.tap.features.wallet.ui.dialogs.SignedHashesWarningDialog import com.tangem.tap.store import com.tangem.wallet.R import kotlinx.android.synthetic.main.card_balance.* @@ -238,6 +239,11 @@ class SingleWalletView : WalletView { is WalletDialog.ScanFailsDialog -> { if (dialog == null) dialog = ScanFailsDialog.create(context).apply { show() } } + is WalletDialog.SignedHashesMultiWalletDialog -> { + if (dialog == null) { + dialog = SignedHashesWarningDialog.create(context).apply { show() } + } + } null -> { dialog?.dismiss() dialog = null diff --git a/app/src/main/res/values/strings_untranslated.xml b/app/src/main/res/values/strings_untranslated.xml index 238bc7a845..762001572e 100644 --- a/app/src/main/res/values/strings_untranslated.xml +++ b/app/src/main/res/values/strings_untranslated.xml @@ -103,5 +103,12 @@ this wallet. This card might be a production sample or counterfeit - + Important security information \u26A0 + This card has signed transactions in the past + Learn more + This card is not a bearer note. We can’t currently match the signature count on the card with the information on the blockchain. This is normal but in rare cases can mean a previous holder is holding back an offline signature, which is a security concern. + \n\nDo not accept this card as physical payment from someone you don’t trust. + \n\nIt’s perfectly safe in all other respects. + \n\nTangem is the only hardware wallet to offer signature count protection. + I understand