Updated on 2026-08-14

This commit is contained in:
Tangem 2020-01-22 12:54:28 +00:00
commit b3ab3f6d53
9 changed files with 56 additions and 103 deletions

View file

@ -7,7 +7,6 @@ import android.net.Uri
import android.nfc.NfcAdapter
import android.nfc.Tag
import android.nfc.tech.IsoDep
import android.nfc.tech.Ndef
import android.nfc.tech.NfcV
import android.os.Bundle
import android.text.Spannable
@ -55,7 +54,7 @@ import com.tangem.wallet.BuildConfig
import com.tangem.wallet.CoinEngineFactory
import com.tangem.wallet.R
import com.tangem.wallet.TangemContext
import com.tangem.wallet.xlmtag.XlmTagEngine
import com.tangem.wallet.xlmTag.XlmTagEngine
import kotlinx.android.synthetic.main.fragment_main.*
import kotlinx.android.synthetic.main.layout_touch_card.*
import kotlinx.coroutines.CoroutineScope

View file

@ -20,7 +20,7 @@ import com.tangem.ui.navigation.NavigationResultListener
import com.tangem.util.LOG
import com.tangem.util.UtilHelper
import com.tangem.wallet.*
import com.tangem.wallet.xlmtag.XlmTagEngine
import com.tangem.wallet.xlmTag.XlmTagEngine
import kotlinx.android.synthetic.main.fr_loaded_wallet.*
import kotlinx.android.synthetic.main.layout_btn_details.*
import kotlinx.android.synthetic.main.layout_tangem_card.*
@ -67,7 +67,7 @@ class TagFragment : BaseFragment(), NavigationResultListener {
btnExtract.backgroundTintList =
ContextCompat.getColorStateList(requireContext(), R.color.btn_dark)
ivTangemCard.setImageResource(R.drawable.card_default_nft)
ivTangemCard.setImageResource(R.drawable.card_tgslix)
tvBalance.setSingleLine(!engine.needMultipleLinesForBalance())
tvWallet.text = ctx.coinData.wallet
@ -78,7 +78,6 @@ class TagFragment : BaseFragment(), NavigationResultListener {
srl?.setOnRefreshListener { refresh(true) }
requestBalanceAndUnspentTransactions()
// update()
}
@ -129,14 +128,13 @@ class TagFragment : BaseFragment(), NavigationResultListener {
else -> tvBalance.text = ""
}
if (ctx.card!!.tokenSymbol.length > 1) {
@Suppress("DEPRECATION") val html = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
Html.fromHtml(ctx.blockchainName, Html.FROM_HTML_MODE_LEGACY)
else
Html.fromHtml(ctx.blockchainName)
tvBlockchain.text = html
} else
tvBlockchain.text = ctx.blockchainName
@Suppress("DEPRECATION") val html = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
Html.fromHtml(ctx.blockchainName, Html.FROM_HTML_MODE_LEGACY)
else
Html.fromHtml(ctx.blockchainName)
tvBlockchain.text = html
}

View file

@ -19,7 +19,7 @@ import com.tangem.wallet.token.TokenEngine
import com.tangem.wallet.tezos.TezosEngine
import com.tangem.wallet.xlm.XlmAssetEngine
import com.tangem.wallet.xlm.XlmEngine
import com.tangem.wallet.xlmtag.XlmTagEngine
import com.tangem.wallet.xlmTag.XlmTagEngine
import com.tangem.wallet.xrp.XrpEngine
/**

View file

@ -55,14 +55,16 @@ public class TangemContext {
public String getBlockchainName() {
Blockchain blockchain = getBlockchain();
if (blockchain == Blockchain.Token || blockchain == Blockchain.RootstockToken) {
String token = card.getTokenSymbol();
return token + " <br><small><small> " + getBlockchain().getOfficialName() + " smart contract token</small></small>";
return card.getTokenSymbol()+ "<br><small><small> " + getBlockchain().getOfficialName() + " smart contract token</small></small>";
}
if (blockchain == Blockchain.NftToken) {
return card.getTokenSymbol().substring(4) + " <br><small><small> " + getBlockchain().getOfficialName() + " NFT token</small></small>";
return card.getTokenSymbol().substring(4) + "<br><small><small> " + getBlockchain().getOfficialName() + " non-fungible token</small></small>";
}
if (blockchain == Blockchain.StellarAsset) {
return card.getTokenSymbol() + " <br><small><small> " + getBlockchain().getOfficialName() + " asset</small></small>";
return card.getTokenSymbol() + "<br><small><small> " + getBlockchain().getOfficialName() + " asset</small></small>";
}
if (blockchain == Blockchain.StellarTag) {
return "TANGEM TAG<br><small><small> "+ getBlockchain().getOfficialName() + " non-fungible token </small></small>";
}
return blockchain.getOfficialName();
}

View file

@ -76,7 +76,7 @@ public class XlmEngine extends CoinEngine {
public String getBalanceHTML() {
Amount balance = getBalance();
if (balance != null) {
return " " + balance.toDescriptionString(getDecimals()) + "<br><small><small>+ " + coinData.getReserve().toDescriptionString(getDecimals()) + " reserve</small></small>";
return " " + balance.toDescriptionString(getDecimals()) + "<br><small><small>+ " + coinData.getReserve().toDescriptionString(getDecimals()) + " reserve</small></small>1";
} else {
return "";
}
@ -243,7 +243,7 @@ public class XlmEngine extends CoinEngine {
// return;
// }
if ((ctx.getCard().getOfflineBalance() != null) && !coinData.isBalanceReceived() && (ctx.getCard().getRemainingSignatures() == ctx.getCard().getMaxSignatures()) && coinData.getBalance().notZero()) {
if ((ctx.getCard().getOfflineBalance() != null) && !coinData.isBalanceReceived() && (ctx.getCard().getRemainingSignatures() == ctx.getCard().getMaxSignatures())) {
balanceValidator.setScore(80);
balanceValidator.setFirstLine(R.string.balance_validator_first_line_verified_offline);
balanceValidator.setSecondLine(R.string.balance_validator_second_line_internet_to_get_balance);

View file

@ -1,4 +1,4 @@
package com.tangem.wallet.xlmtag
package com.tangem.wallet.xlmTag
import android.os.Bundle
import android.util.Log

View file

@ -1,4 +1,4 @@
package com.tangem.wallet.xlmtag
package com.tangem.wallet.xlmTag
import android.net.Uri
import android.os.StrictMode
@ -53,12 +53,18 @@ class XlmTagEngine : CoinEngine {
}
override fun getBalanceHTML(): String {
return if (hasBalanceInfo() && isBalanceNotZero && coinData!!.fundsFromTrustedSource) {
ctx.getString(R.string.tag_genuine)
} else if (coinData!!.fundsSentToTrustedSource) {
ctx.getString(R.string.tag_claimed)
return if (hasBalanceInfo()) {
if (coinData!!.fundsFromTrustedSource) {
// if (coinData!!.fundsSentToTrustedSource) { //TODO: shut down for example tags to appear genuine, turn on for production
// ctx.getString(R.string.tag_claimed)
// } else {
ctx.getString(R.string.tag_genuine)
// }
} else {
ctx.getString(R.string.tag_not_genuine)
}
} else {
ctx.getString(R.string.tag_not_genuine)
""
}
}
@ -72,7 +78,7 @@ class XlmTagEngine : CoinEngine {
}
override fun hasBalanceInfo(): Boolean {
return if (coinData == null) false else coinData!!.getBalance() != null || coinData!!.isError404
return if (coinData == null) false else coinData!!.isBalanceReceived
}
override fun isExtractPossible(): Boolean {
@ -130,43 +136,30 @@ class XlmTagEngine : CoinEngine {
}
override fun validateBalance(balanceValidator: BalanceValidator): Boolean {
return try {
if (ctx.card.offlineBalance == null && !ctx.coinData.isBalanceReceived || !ctx.coinData.isBalanceReceived && ctx.card.remainingSignatures != ctx.card.maxSignatures) {
if (coinData!!.isError404) {
balanceValidator.setScore(0)
balanceValidator.firstLine = R.string.balance_validator_first_line_no_account
balanceValidator.setSecondLine(R.string.balance_validator_second_line_create_account_instruction)
} else {
balanceValidator.setScore(0)
balanceValidator.firstLine = R.string.balance_validator_first_line_unknown_balance
balanceValidator.setSecondLine(R.string.balance_validator_second_line_unverified_balance)
return false
}
try {
if (!hasBalanceInfo()) {
balanceValidator.setScore(0)
balanceValidator.firstLine = R.string.balance_validator_first_line_no_connection
balanceValidator.setSecondLine(R.string.balance_validator_second_line_authenticity_not_verified)
return false
}
if (coinData!!.isBalanceReceived && coinData!!.isBalanceEqual) {
if (coinData!!.fundsFromTrustedSource) {
balanceValidator.setScore(100)
balanceValidator.firstLine = R.string.balance_validator_first_line_verified_balance
balanceValidator.setSecondLine(R.string.balance_validator_second_line_confirmed_in_blockchain)
if (coinData!!.getBalance()!!.isZero) {
balanceValidator.firstLine = R.string.balance_validator_first_line_empty_wallet
balanceValidator.setSecondLine(R.string.empty_string)
}
balanceValidator.firstLine = R.string.balance_validator_first_line_verified_in_blockchain
balanceValidator.setSecondLine(R.string.empty_string)
} else {
balanceValidator.setScore(0)
balanceValidator.firstLine = R.string.balance_validator_first_line_authenticity
balanceValidator.setSecondLine(R.string.empty_string)
}
if (ctx.card.offlineBalance != null && !coinData!!.isBalanceReceived && ctx.card.remainingSignatures == ctx.card.maxSignatures && coinData!!.getBalance()!!.notZero()) {
balanceValidator.setScore(80)
balanceValidator.firstLine = R.string.balance_validator_first_line_verified_offline
balanceValidator.setSecondLine(R.string.balance_validator_second_line_internet_to_get_balance)
}
true
return true
} catch (e: Exception) {
e.printStackTrace()
false
return false
}
}
override fun getBalance(): Amount? {
return if (!hasBalanceInfo()) null else coinData!!.getBalance()!!
}
@ -310,7 +303,7 @@ class XlmTagEngine : CoinEngine {
val accountKeyPair = KeyPair.fromAccountId(coinData!!.wallet)
try {
var operationsPage = server.payments().forAccount(accountKeyPair).order(RequestBuilder.Order.DESC).execute()
var operationsPage = server.payments().forAccount(accountKeyPair).limit(200).order(RequestBuilder.Order.DESC).execute()
Log.e("Stellar", operationsPage.records.toString())
operations.addAll(operationsPage.records)
@ -324,6 +317,8 @@ class XlmTagEngine : CoinEngine {
}
parsePayments(blockchainRequestsCallbacks)
CoroutineScope(Dispatchers.Main).launch { blockchainRequestsCallbacks.onComplete(!ctx.hasError()) }
} catch (e: Exception) {
if (e.message != null) {
ctx.error = e.message
@ -342,53 +337,11 @@ class XlmTagEngine : CoinEngine {
Log.e("Stellar",
"fundsFromTrustedSource $coinData!!.fundsFromTrustedSource, " +
"fundsSentToTrustedSource $coinData!!.fundsSentToTrustedSource")
blockchainRequestsCallbacks.onComplete(!ctx.hasError())
coinData!!.isBalanceReceived = true
}
override fun requestBalanceAndUnspentTransactions(blockchainRequestsCallbacks: BlockchainRequestsCallbacks) {
CoroutineScope(Dispatchers.IO).launch { requestPayments(blockchainRequestsCallbacks) }
val serverApi = ServerApiStellar(Blockchain.Stellar)
val listener: ServerApiStellar.Listener = object : ServerApiStellar.Listener {
override fun onSuccess(request: StellarRequest.Base) {
Log.i(TAG, "onSuccess: " + request.javaClass.simpleName)
if (request is StellarRequest.Balance) {
coinData!!.accountResponse = request.accountResponse
coinData!!.validationNodeDescription = serverApi.currentURL
blockchainRequestsCallbacks.onProgress()
} else if (request is Ledgers) {
coinData!!.setLedgerResponse(request.ledgerResponse)
if (serverApi.isRequestsSequenceCompleted) {
} else {
blockchainRequestsCallbacks.onProgress()
}
} else {
ctx.error = "Invalid request logic"
blockchainRequestsCallbacks.onComplete(false)
}
}
override fun onFail(request: StellarRequest.Base) {
Log.i(TAG, "onFail: " + request.javaClass.simpleName + " " + request.error)
if (request.errorResponse != null && request.errorResponse.code == 404) {
coinData!!.isError404 = true
} else {
ctx.error = request.error
}
if (serverApi.isRequestsSequenceCompleted) {
if (ctx.hasError()) {
blockchainRequestsCallbacks.onComplete(false)
} else {
blockchainRequestsCallbacks.onComplete(true)
}
} else {
blockchainRequestsCallbacks.onProgress()
}
}
}
serverApi.setListener(listener)
serverApi.requestData(ctx, StellarRequest.Balance(coinData!!.wallet))
serverApi.requestData(ctx, Ledgers())
}
@Throws(Exception::class)
@ -463,7 +416,7 @@ class XlmTagEngine : CoinEngine {
private val multiplier = BigDecimal("10000000")
const val OPERATIONS_LIMIT = 50
const val OPERATIONS_LIMIT = 200
private val TRUSTED_DESTINATION = "GAYPZMHFZERB42ONEJ4CY6ADDVTINEXMY6OZ5G6CLR4HHVKOSNJSZGMM"
private val TRUSTED_SOURCE = "GAZY7H4BWWEVB6QGB4RV3LW7DH5NO5CD5O6JCEQXA7N2UCGZSAPJFYW2"
}

View file

@ -47,7 +47,7 @@ class LocalStorage
artworks = HashMap()
}
if (artworks.count() < 31) {
if (artworks.count() < 32) {
// forceSave=true only on the last one
putResourceArtworkToCatalog(R.drawable.card_default, false)
putResourceArtworkToCatalog(R.drawable.card_default_nft, false)
@ -78,6 +78,7 @@ class LocalStorage
putResourceArtworkToCatalog(R.drawable.card_ru043, false)
putResourceArtworkToCatalog(R.drawable.card_tg044, false)
putResourceArtworkToCatalog(R.drawable.card_tg046, false)
putResourceArtworkToCatalog(R.drawable.card_tgslix, false)
putResourceArtworkToCatalog(R.drawable.card_bc00, false)
putResourceArtworkToCatalog(R.drawable.card_ff32, true)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB