diff --git a/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt b/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt index 70912f24a6..97c8a9e41f 100644 --- a/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt +++ b/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt @@ -7,16 +7,19 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token import com.tangem.blockchain.common.Wallet import com.tangem.blockchain.common.WalletManager +import com.tangem.blockchain.common.address.Address +import com.tangem.common.card.CardWallet import com.tangem.domain.common.ScanResponse import com.tangem.tap.common.extensions.stripZeroPlainString class AdditionalFeedbackInfo { class EmailWalletInfo( var blockchain: Blockchain = Blockchain.Unknown, - var address: String = "", - var explorerLink: String = "", - var host: String = "", var derivationPath: String = "", + var outputsCount: String? = null, + var host: String = "", + var addresses: String = "", + var explorerLink: String = "", ) var appVersion: String = "" @@ -48,23 +51,14 @@ class AdditionalFeedbackInfo { cardBlockchain = data.walletData?.blockchain ?: "" cardFirmwareVersion = data.card.firmwareVersion.stringValue cardIssuer = data.card.issuer.name - signedHashesCount = data.card.wallets - .joinToString("; ") { "${it.curve.curve} - ${it.totalSignedHashes}" } + signedHashesCount = formatSignedHashes(data.card.wallets) } fun setWalletsInfo(walletManagers: List) { walletsInfo.clear() tokens.clear() walletManagers.forEach { manager -> - walletsInfo.add( - EmailWalletInfo( - blockchain = manager.wallet.blockchain, - address = getAddress(manager.wallet), - explorerLink = getExploreUri(manager.wallet), - host = manager.currentHost, - derivationPath = manager.wallet.publicKey.derivationPath?.rawPath ?: "" - ) - ) + walletsInfo.add(createEmailWalletInfo(manager)) if (manager.cardTokens.isNotEmpty()) { tokens[manager.wallet.blockchain] = manager.cardTokens } @@ -72,45 +66,55 @@ class AdditionalFeedbackInfo { } fun updateOnSendError( - wallet: Wallet, - host: String, + walletManager: WalletManager, amountToSend: Amount, feeAmount: Amount, destinationAddress: String, ) { - onSendErrorWalletInfo = EmailWalletInfo( - blockchain = wallet.blockchain, - address = getAddress(wallet), - explorerLink = getExploreUri(wallet), - host = host, - derivationPath = wallet.publicKey.derivationPath?.rawPath ?: "" - ) - + onSendErrorWalletInfo = createEmailWalletInfo(walletManager) this.destinationAddress = destinationAddress amount = amountToSend.value?.stripZeroPlainString() ?: "0" fee = feeAmount.value?.stripZeroPlainString() ?: "0" token = if (amountToSend.type is AmountType.Token) amountToSend.currencySymbol else "" } - private fun getAddress(wallet: Wallet): String { - return if (wallet.addresses.size == 1) { - wallet.address - } else { - val addresses = wallet.addresses.joinToString(", ") { - "${it.type.javaClass.simpleName} - ${it.value}" - } - "Multiple address: $addresses" + private fun createEmailWalletInfo(walletManager: WalletManager): EmailWalletInfo { + return EmailWalletInfo( + blockchain = walletManager.wallet.blockchain, + derivationPath = walletManager.wallet.publicKey.derivationPath?.rawPath ?: "", + outputsCount = walletManager.outputsCount?.toString(), + host = walletManager.currentHost, + addresses = formatAddresses(walletManager.wallet), + explorerLink = formatExploreUrls(walletManager.wallet), + ) + } + + private fun formatSignedHashes(wallets: List): String { + return wallets.joinToString("\n") { "Signed hashes: ${it.curve.curve} - ${it.totalSignedHashes}" } + } + + private fun formatAddresses(wallet: Wallet): String { + return wallet.formatAddressWith("Multiple address:") { + "${it.name} - ${it.value}" } } - private fun getExploreUri(wallet: Wallet): String { - return if (wallet.addresses.size == 1) { - wallet.getExploreUrl(wallet.address) - } else { - val links = wallet.addresses.joinToString(", ") { - "${it.type.javaClass.simpleName} - ${wallet.getExploreUrl(it.value)}" - } - "Multiple explorers links: $links" + private fun formatExploreUrls(wallet: Wallet): String { + return wallet.formatAddressWith("Multiple explorers links:") { + "${it.name} - ${wallet.getExploreUrl(it.value)}" } } + + private fun Wallet.formatAddressWith(with: String, mapAddress: (Address) -> String): String { + return if (addresses.size == 1) { + getExploreUrl(address) + } else { + addresses.map { mapAddress(it) }.toMutableList() + .apply { add(0, with) } + .joinToString("\n") + } + } + + private val Address.name: String + get() = type.javaClass.simpleName } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/feedback/FeedbackDataBuilder.kt b/app/src/main/java/com/tangem/tap/common/feedback/FeedbackDataBuilder.kt index a3a9ee5575..46cf302fee 100644 --- a/app/src/main/java/com/tangem/tap/common/feedback/FeedbackDataBuilder.kt +++ b/app/src/main/java/com/tangem/tap/common/feedback/FeedbackDataBuilder.kt @@ -3,7 +3,7 @@ package com.tangem.tap.common.feedback import com.tangem.tap.common.extensions.breakLine class FeedbackDataBuilder( - private val infoHolder: AdditionalFeedbackInfo + private val infoHolder: AdditionalFeedbackInfo, ) { val builder = StringBuilder() @@ -21,7 +21,7 @@ class FeedbackDataBuilder( builder.appendKeyValue("Card ID", infoHolder.cardId) builder.appendKeyValue("Firmware version", infoHolder.cardFirmwareVersion) builder.appendKeyValue("Card Blockchain", infoHolder.cardBlockchain) - builder.appendKeyValue("Signed hashes", infoHolder.signedHashesCount) + builder.appendKeyValue("", infoHolder.signedHashesCount) return this } @@ -29,20 +29,22 @@ class FeedbackDataBuilder( infoHolder.walletsInfo.forEach { builder.appendDelimiter() builder.appendKeyValue("Blockchain", it.blockchain.fullName) - builder.appendKeyValue("Host", it.host) - builder.appendKeyValue("Wallet address", it.address) builder.appendKeyValue("Derivation path", it.derivationPath) - builder.appendKeyValue("Explorer link", it.explorerLink) + builder.appendKeyValue("Outputs count", it.outputsCount) infoHolder.tokens[it.blockchain]?.let { tokens -> builder.append("Tokens:") breakLine() tokens.forEach { token -> - builder.appendKeyValue("Name", token.name) builder.appendKeyValue("ID", token.id ?: "[custom token]") + builder.appendKeyValue("Name", token.name) builder.appendKeyValue("Contract address", token.contractAddress) } } + + builder.appendKeyValue("Host", it.host) + builder.appendKeyValue("Wallet address", it.addresses) + builder.appendKeyValue("Explorer link", it.explorerLink) } return this } @@ -55,7 +57,7 @@ class FeedbackDataBuilder( builder.appendKeyValue("Token", infoHolder.token) builder.appendKeyValue("Error", error) builder.appendDelimiter() - builder.appendKeyValue("Source address", walletInfo.address) + builder.appendKeyValue("Source address", walletInfo.addresses) builder.appendKeyValue("Destination address", infoHolder.destinationAddress) builder.appendKeyValue("Amount", infoHolder.amount) builder.appendKeyValue("Fee", infoHolder.fee) @@ -72,8 +74,10 @@ class FeedbackDataBuilder( fun build(): String = builder.toString() } -private fun StringBuilder.appendKeyValue(key: String, value: String): StringBuilder { - return if (value.isNotBlank()) this.append("$key: $value\n") else this +private fun StringBuilder.appendKeyValue(key: String, value: String?): StringBuilder = when { + value.isNullOrBlank() -> this + key.isBlank() -> this.append("$value\n") + else -> this.append("$key: $value\n") } private fun StringBuilder.appendDelimiter(): StringBuilder = append("----------\n") \ 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 54be369642..defca803e3 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 @@ -246,8 +246,7 @@ private fun sendTransaction( } is SimpleResult.Failure -> { store.state.globalState.feedbackManager?.infoHolder?.updateOnSendError( - wallet = walletManager.wallet, - host = walletManager.currentHost, + walletManager = walletManager, amountToSend = amountToSend, feeAmount = feeAmount, destinationAddress = destinationAddress,