From 21a63d246b85b81ce14e3bd2028bfd74d4a58481 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 7 Mar 2024 17:52:11 +0800 Subject: [PATCH] Updated on 2026-08-14 --- app/build.gradle.kts | 1 + .../tap/common/feedback/FeedbackData.kt | 10 +-- domain/feedback/.gitignore | 1 + domain/feedback/build.gradle.kts | 13 ++++ .../domain/feedback/FeedbackDataBuilder.kt | 78 +++++++++++++++++++ .../domain/feedback/models/BlockchainInfo.kt | 18 +++++ .../tangem/domain/feedback/models/CardInfo.kt | 13 ++++ .../domain/feedback/models/PhoneInfo.kt | 7 ++ .../domain/feedback/utils/StringBuilderExt.kt | 5 ++ settings.gradle.kts | 1 + 10 files changed, 139 insertions(+), 8 deletions(-) create mode 100644 domain/feedback/.gitignore create mode 100644 domain/feedback/build.gradle.kts create mode 100644 domain/feedback/src/main/java/com/tangem/domain/feedback/FeedbackDataBuilder.kt create mode 100644 domain/feedback/src/main/java/com/tangem/domain/feedback/models/BlockchainInfo.kt create mode 100644 domain/feedback/src/main/java/com/tangem/domain/feedback/models/CardInfo.kt create mode 100644 domain/feedback/src/main/java/com/tangem/domain/feedback/models/PhoneInfo.kt create mode 100644 domain/feedback/src/main/java/com/tangem/domain/feedback/utils/StringBuilderExt.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0ca24d28ab..654eaa2a15 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -64,6 +64,7 @@ dependencies { implementation(projects.domain.analytics) implementation(projects.domain.visa) implementation(projects.domain.onboarding) + implementation(projects.domain.feedback) implementation(projects.common) implementation(projects.core.analytics) diff --git a/app/src/main/java/com/tangem/tap/common/feedback/FeedbackData.kt b/app/src/main/java/com/tangem/tap/common/feedback/FeedbackData.kt index 452eb173aa..7e878f6e69 100644 --- a/app/src/main/java/com/tangem/tap/common/feedback/FeedbackData.kt +++ b/app/src/main/java/com/tangem/tap/common/feedback/FeedbackData.kt @@ -73,15 +73,9 @@ class SendTransactionFailedEmail( class FeedbackEmail : FeedbackData { override val subjectResId: Int - get() = if (isS2CCard) s2cSubject else tangemSubject - override val mainMessageResId: Int - get() = if (isS2CCard) s2cMainMessage else tangemMainMessage + get() = if (isS2CCard) R.string.feedback_subject_support else R.string.feedback_subject_support_tangem - private val tangemSubject: Int = R.string.feedback_subject_support_tangem - private val tangemMainMessage: Int = R.string.feedback_preface_support - - private val s2cSubject: Int = R.string.feedback_subject_support - private val s2cMainMessage: Int = R.string.feedback_preface_support + override val mainMessageResId: Int = R.string.feedback_preface_support private var isS2CCard = false diff --git a/domain/feedback/.gitignore b/domain/feedback/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/domain/feedback/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/domain/feedback/build.gradle.kts b/domain/feedback/build.gradle.kts new file mode 100644 index 0000000000..83a35acde4 --- /dev/null +++ b/domain/feedback/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + alias(deps.plugins.android.library) + alias(deps.plugins.kotlin.android) + id("configuration") +} + +android { + namespace = "com.tangem.domain.feedback" +} + +dependencies { + implementation(projects.core.res) +} \ No newline at end of file diff --git a/domain/feedback/src/main/java/com/tangem/domain/feedback/FeedbackDataBuilder.kt b/domain/feedback/src/main/java/com/tangem/domain/feedback/FeedbackDataBuilder.kt new file mode 100644 index 0000000000..5023782e64 --- /dev/null +++ b/domain/feedback/src/main/java/com/tangem/domain/feedback/FeedbackDataBuilder.kt @@ -0,0 +1,78 @@ +package com.tangem.domain.feedback + +import com.tangem.domain.feedback.models.BlockchainInfo +import com.tangem.domain.feedback.models.CardInfo +import com.tangem.domain.feedback.models.PhoneInfo +import com.tangem.domain.feedback.utils.breakLine + +internal class FeedbackDataBuilder { + + private val builder = StringBuilder() + + fun addCardInfo(cardInfo: CardInfo) { + builder.appendKeyValue("Card ID", cardInfo.cardId) + builder.appendKeyValue("Firmware version", cardInfo.firmwareVersion) + builder.appendKeyValue("Card Blockchain", cardInfo.cardBlockchain) + builder.appendSignedHashes(cardInfo.signedHashesList) + builder.appendKeyValue("User Wallet ID", cardInfo.userWalletId) + } + + fun addBlockchainInfoList(blockchainInfoList: List) { + blockchainInfoList.forEachBlockchain { isLastIndex -> + builder.appendKeyValue("Blockchain", blockchain) + builder.appendKeyValue("Derivation path", derivationPath) + + // enable later + // if (walletInfo.blockchain == Blockchain.Bitcoin) { + // builder.appendKeyValue("XPUB", infoHolder.extendedPublicKey) + // } + + builder.appendKeyValue("Outputs count", outputsCount) + + if (tokens.isNotEmpty()) { + builder.append("Tokens:") + builder.breakLine() + tokens.forEach { token -> + builder.appendKeyValue("ID", token.id ?: "[custom token]") + builder.appendKeyValue("Name", token.name) + builder.appendKeyValue("Contract address", token.contractAddress) + } + } + + builder.appendKeyValue("Host", host) + builder.appendKeyValue("Wallet address", addresses) + builder.appendKeyValue("Explorer link", explorerLink) + + if (!isLastIndex) builder.appendDelimiter() + } + } + + fun addPhoneInfo(phoneInfo: PhoneInfo) { + builder.appendKeyValue("Phone model", phoneInfo.phoneModel) + builder.appendKeyValue("OS version", phoneInfo.osVersion) + builder.appendKeyValue("App version", phoneInfo.appVersion) + } + + fun addDelimiter(): StringBuilder = builder.appendDelimiter() + + fun build(): String = builder.toString() + + private fun StringBuilder.appendKeyValue(key: String, value: String?) { + if (value.isNullOrBlank()) return + + val keyValuePrefix = if (key.isBlank()) "" else "$key: " + append("$keyValuePrefix$value\n") + } + + private fun StringBuilder.appendSignedHashes(signedHashesList: List) { + signedHashesList.forEach { + appendKeyValue("Signed hashes [${it.curve}]", it.total) + } + } + + private fun StringBuilder.appendDelimiter(): StringBuilder = append("----------\n") + + private inline fun List.forEachBlockchain(action: BlockchainInfo.(Boolean) -> Unit) { + return forEachIndexed { index, info -> info.action(index == lastIndex) } + } +} \ No newline at end of file diff --git a/domain/feedback/src/main/java/com/tangem/domain/feedback/models/BlockchainInfo.kt b/domain/feedback/src/main/java/com/tangem/domain/feedback/models/BlockchainInfo.kt new file mode 100644 index 0000000000..3daa9d9927 --- /dev/null +++ b/domain/feedback/src/main/java/com/tangem/domain/feedback/models/BlockchainInfo.kt @@ -0,0 +1,18 @@ +package com.tangem.domain.feedback.models + +data class BlockchainInfo( + val blockchain: String, + val derivationPath: String, + val outputsCount: String?, + val host: String, + val addresses: String, + val explorerLink: String, + val tokens: List, +) { + + data class TokenInfo( + val id: String?, + val name: String, + val contractAddress: String, + ) +} \ No newline at end of file diff --git a/domain/feedback/src/main/java/com/tangem/domain/feedback/models/CardInfo.kt b/domain/feedback/src/main/java/com/tangem/domain/feedback/models/CardInfo.kt new file mode 100644 index 0000000000..79eb5285c6 --- /dev/null +++ b/domain/feedback/src/main/java/com/tangem/domain/feedback/models/CardInfo.kt @@ -0,0 +1,13 @@ +package com.tangem.domain.feedback.models + +data class CardInfo( + val userWalletId: String, + val cardId: String, + val firmwareVersion: String, + val cardBlockchain: String?, + val signedHashesList: List, + val isStart2Coin: Boolean, +) { + + data class SignedHashes(val curve: String, val total: String?) +} \ No newline at end of file diff --git a/domain/feedback/src/main/java/com/tangem/domain/feedback/models/PhoneInfo.kt b/domain/feedback/src/main/java/com/tangem/domain/feedback/models/PhoneInfo.kt new file mode 100644 index 0000000000..578d9e2e00 --- /dev/null +++ b/domain/feedback/src/main/java/com/tangem/domain/feedback/models/PhoneInfo.kt @@ -0,0 +1,7 @@ +package com.tangem.domain.feedback.models + +data class PhoneInfo( + val phoneModel: String, + val osVersion: String, + val appVersion: String, +) \ No newline at end of file diff --git a/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/StringBuilderExt.kt b/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/StringBuilderExt.kt new file mode 100644 index 0000000000..a2e3cb68ee --- /dev/null +++ b/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/StringBuilderExt.kt @@ -0,0 +1,5 @@ +package com.tangem.domain.feedback.utils + +fun StringBuilder.breakLine(count: Int = 1): StringBuilder = append("\n".repeat(count)) + +fun StringBuilder.skipLine(): StringBuilder = breakLine(count = 2) \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index fb31682f87..bb2e6c46ba 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -138,6 +138,7 @@ include(":domain:transaction") include(":domain:analytics") include(":domain:visa") include(":domain:onboarding") +include(":domain:feedback") // endregion Domain modules // region Data modules