Updated on 2026-08-14
This commit is contained in:
parent
169bfe1925
commit
5ad45b5e22
4 changed files with 58 additions and 50 deletions
|
|
@ -5,19 +5,23 @@ import androidx.annotation.ColorInt
|
|||
import androidx.core.graphics.luminance
|
||||
import androidx.core.graphics.toColorInt
|
||||
import com.tangem.blockchain.common.Token
|
||||
import com.tangem.wallet.R
|
||||
|
||||
@ColorInt
|
||||
fun Token.getColor(): Int {
|
||||
return try {
|
||||
("#" + this.contractAddress.subSequence(2..7).toString())
|
||||
.toColorInt()
|
||||
fun Token.getColor(isTestnet: Boolean = false): Int {
|
||||
val defaultColor = "#C7C7CC".toColorInt() // equivalent to R.color.lightGray4
|
||||
|
||||
return if (isTestnet)
|
||||
defaultColor
|
||||
else try {
|
||||
("#" + this.contractAddress.subSequence(2..7).toString()).toColorInt()
|
||||
} catch (exception: Exception) {
|
||||
R.color.lightGray4
|
||||
defaultColor
|
||||
}
|
||||
}
|
||||
|
||||
@ColorInt
|
||||
fun Token.getTextColor(): Int {
|
||||
return if (this.getColor().luminance > 0.5) Color.BLACK else Color.WHITE
|
||||
fun Token.getTextColor(isTestnet: Boolean = false): Int = when {
|
||||
isTestnet -> Color.WHITE
|
||||
this.getColor().luminance > 0.5 -> Color.BLACK
|
||||
else -> Color.WHITE
|
||||
}
|
||||
|
|
@ -21,7 +21,7 @@ private const val VOYR = "VOYRME"
|
|||
|
||||
class CurrencyIconRequest(
|
||||
private val currencyImageView: ImageFilterView,
|
||||
private val currencyTextView: TextView,
|
||||
private val currencyTextView: TextView?,
|
||||
private val token: Token?,
|
||||
private val blockchain: Blockchain,
|
||||
) {
|
||||
|
|
@ -38,7 +38,7 @@ class CurrencyIconRequest(
|
|||
loadBlockchainIconBase(
|
||||
onStart = {
|
||||
currencyImageView.colorFilter = null
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
|
|
@ -46,15 +46,22 @@ class CurrencyIconRequest(
|
|||
loadBlockchainIconBase(
|
||||
onStart = {
|
||||
currencyImageView.saturation = 0f
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
private fun loadTokenIcon() {
|
||||
loadTokenIconBase(
|
||||
onStart = {
|
||||
currencyImageView.setColorFilter(it.getColor())
|
||||
},
|
||||
onSuccess = {
|
||||
currencyImageView.colorFilter = null
|
||||
}
|
||||
},
|
||||
onError = {
|
||||
currencyImageView.setColorFilter(it.getColor())
|
||||
currencyTextView?.setTextColor(it.getTextColor())
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
|
|
@ -62,7 +69,12 @@ class CurrencyIconRequest(
|
|||
loadTokenIconBase(
|
||||
onStart = {
|
||||
currencyImageView.saturation = 0f
|
||||
}
|
||||
},
|
||||
onError = {
|
||||
currencyImageView.saturation = 0f
|
||||
currencyImageView.setColorFilter(it.getColor(true))
|
||||
currencyTextView?.setTextColor(it.getTextColor(true))
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
|
|
@ -91,25 +103,21 @@ class CurrencyIconRequest(
|
|||
data = getTokenIcon(token, blockchain),
|
||||
placeholderRes = R.drawable.shape_circle,
|
||||
onStart = {
|
||||
showPlaceholder(token)
|
||||
currencyTextView?.text = token.name.take(1)
|
||||
currencyTextView?.setTextColor(token.getTextColor())
|
||||
onStart(token)
|
||||
},
|
||||
onSuccess = {
|
||||
currencyTextView.text = null
|
||||
currencyTextView?.text = null
|
||||
onSuccess(token)
|
||||
},
|
||||
onError = {
|
||||
showPlaceholder(token)
|
||||
// for some reason the onStart doesn't call if an error occurs
|
||||
currencyTextView?.text = token.name.take(1)
|
||||
onError(token)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
private fun showPlaceholder(token: Token) {
|
||||
currencyTextView.text = token.symbol.take(1)
|
||||
currencyTextView.setTextColor(token.getTextColor())
|
||||
currencyImageView.setColorFilter(token.getColor())
|
||||
}
|
||||
}
|
||||
|
||||
private inline fun ImageView.loadIcon(
|
||||
|
|
@ -127,7 +135,7 @@ private inline fun ImageView.loadIcon(
|
|||
.listener(
|
||||
onStart = { onStart() },
|
||||
onSuccess = { _, _ -> onSuccess() },
|
||||
onError = { _, _ -> onError() }
|
||||
onError = { _, _ -> onError() },
|
||||
)
|
||||
.target(imageView = this)
|
||||
.build()
|
||||
|
|
|
|||
|
|
@ -4,13 +4,11 @@ import android.content.Context
|
|||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.constraintlayout.utils.widget.ImageFilterView
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import androidx.core.view.isVisible
|
||||
import com.tangem.blockchain.common.DerivationStyle
|
||||
import com.tangem.tangem_sdk_new.extensions.dpToPx
|
||||
import com.tangem.tap.common.extensions.getRoundIconRes
|
||||
import com.tangem.tap.features.wallet.models.Currency
|
||||
import com.tangem.wallet.databinding.ViewCurrencyIconBinding
|
||||
import kotlin.math.roundToInt
|
||||
|
|
@ -24,29 +22,16 @@ class CurrencyIconView @JvmOverloads constructor(
|
|||
LayoutInflater.from(context),
|
||||
this,
|
||||
)
|
||||
|
||||
private val currencyImageView: ImageFilterView
|
||||
get() = binding.ivCurrency
|
||||
|
||||
private val currencyTextView: TextView
|
||||
get() = binding.tvTokenLetter
|
||||
|
||||
private var isBlockchainIconVisible: Boolean
|
||||
get() = binding.ivBlockchain.isVisible
|
||||
set(value) = binding.ivBlockchain::isVisible.set(value)
|
||||
|
||||
private var isBadgeVisible: Boolean
|
||||
get() = binding.badge.isVisible
|
||||
set(value) = binding.badge::isVisible.set(value)
|
||||
|
||||
@DrawableRes
|
||||
private var blockchainIconRes: Int? = null
|
||||
set(value) {
|
||||
if (value != null && value != field && isBlockchainIconVisible) {
|
||||
binding.ivBlockchain.setImageResource(value)
|
||||
field = value
|
||||
}
|
||||
}
|
||||
private var isBlockchainBadgeVisible: Boolean
|
||||
get() = binding.ivBlockchainBadge.isVisible
|
||||
set(value) = binding.ivBlockchainBadge::isVisible.set(value)
|
||||
private var isCustomCurrencyBadgeVisible: Boolean
|
||||
get() = binding.customBadge.isVisible
|
||||
set(value) = binding.customBadge::isVisible.set(value)
|
||||
|
||||
init {
|
||||
minWidth = dpToPx(48f).roundToInt()
|
||||
|
|
@ -57,9 +42,7 @@ class CurrencyIconView @JvmOverloads constructor(
|
|||
currency: Currency,
|
||||
derivationStyle: DerivationStyle?,
|
||||
) {
|
||||
isBlockchainIconVisible = currency.isToken()
|
||||
isBadgeVisible = currency.isCustomCurrency(derivationStyle)
|
||||
blockchainIconRes = currency.blockchain.getRoundIconRes()
|
||||
isCustomCurrencyBadgeVisible = currency.isCustomCurrency(derivationStyle)
|
||||
|
||||
CurrencyIconRequest(
|
||||
currencyImageView = currencyImageView,
|
||||
|
|
@ -67,5 +50,17 @@ class CurrencyIconView @JvmOverloads constructor(
|
|||
token = (currency as? Currency.Token)?.token,
|
||||
blockchain = currency.blockchain,
|
||||
).load()
|
||||
|
||||
if (currency.isToken()) {
|
||||
// load a blockchain icon into the blockchain badge
|
||||
isBlockchainBadgeVisible = true
|
||||
|
||||
CurrencyIconRequest(
|
||||
currencyImageView = binding.ivBlockchainBadge,
|
||||
currencyTextView = null,
|
||||
token = null,
|
||||
blockchain = currency.blockchain,
|
||||
).load()
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue