Updated on 2026-08-14
This commit is contained in:
commit
d4bd32d138
343 changed files with 4762 additions and 242 deletions
7
.idea/gradle.xml
generated
7
.idea/gradle.xml
generated
|
|
@ -1,8 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="GradleMigrationSettings" migrationVersion="1" />
|
||||
<component name="GradleSettings">
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
<option name="delegatedBuild" value="false" />
|
||||
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="modules">
|
||||
|
|
@ -10,8 +12,11 @@
|
|||
<option value="$PROJECT_DIR$" />
|
||||
<option value="$PROJECT_DIR$/app" />
|
||||
<option value="$PROJECT_DIR$/server-android" />
|
||||
<option value="$PROJECT_DIR$/tangem-card" />
|
||||
<option value="$PROJECT_DIR$/tangem-card-old" />
|
||||
<option value="$PROJECT_DIR$/tangem-core" />
|
||||
<option value="$PROJECT_DIR$/tangem-demo" />
|
||||
<option value="$PROJECT_DIR$/tangem-sdk" />
|
||||
<option value="$PROJECT_DIR$/tangem-sdk-old" />
|
||||
</set>
|
||||
</option>
|
||||
<option name="resolveModulePerSourceSet" value="false" />
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ android {
|
|||
debug {
|
||||
debuggable true
|
||||
minifyEnabled false
|
||||
applicationIdSuffix ".debug"
|
||||
applicationIdSuffix ".dev"
|
||||
signingConfig signingConfigs.debug
|
||||
buildConfigField 'boolean', 'CRASHLYTICS', 'Boolean.parseBoolean("false")'
|
||||
ext.enableCrashlytics = false
|
||||
|
|
@ -43,7 +43,7 @@ android {
|
|||
debug_beta {
|
||||
initWith debug
|
||||
versionNameSuffix "-beta"
|
||||
applicationIdSuffix ".debug_beta"
|
||||
applicationIdSuffix ".debug"
|
||||
buildConfigField 'boolean', 'CRASHLYTICS', 'Boolean.parseBoolean("true")'
|
||||
manifestPlaceholders = [fabric_api_key: properties.hasProperty('fabric_api_key')
|
||||
? project.property('fabric_api_key') : '000']
|
||||
|
|
@ -88,8 +88,8 @@ configurations {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(':tangem-card')
|
||||
implementation project(':tangem-sdk')
|
||||
implementation project(':tangem-card-old')
|
||||
implementation project(':tangem-sdk-old')
|
||||
implementation project(':server-android')
|
||||
|
||||
implementation 'androidx.navigation:navigation-fragment:2.1.0'
|
||||
|
|
@ -105,7 +105,7 @@ dependencies {
|
|||
implementation "androidx.preference:preference:1.1.0"
|
||||
implementation 'androidx.biometric:biometric:1.0.0-beta01'
|
||||
implementation 'androidx.core:core-ktx:1.1.0'
|
||||
implementation 'com.google.android.material:material:1.1.0-alpha10'
|
||||
implementation 'com.google.android.material:material:1.1.0-beta01'
|
||||
|
||||
implementation 'com.google.dagger:dagger:2.21'
|
||||
kapt 'com.google.dagger:dagger-compiler:2.21'
|
||||
|
|
|
|||
|
|
@ -62,6 +62,9 @@
|
|||
<data
|
||||
android:host="tangem.com"
|
||||
android:scheme="https" />
|
||||
<data
|
||||
android:host="app.tangem.com"
|
||||
android:scheme="https" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.nfc.action.TECH_DISCOVERED" />
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ public class ServerApiStellar {
|
|||
LOG.e(TAG, "requestData " + stellarRequest.getClass().getSimpleName() + " onError " + e.getMessage());
|
||||
LOG.e(TAG, String.format("%d requests left in processing", requestsCount));
|
||||
|
||||
if (isRetry || stellarRequest.errorResponse.getCode() == 404) {
|
||||
if (isRetry || (stellarRequest.errorResponse != null && stellarRequest.errorResponse.getCode() == 404)) {
|
||||
stellarRequest.setError(e.getMessage());
|
||||
//setErrorOccurred(e.getMessage());//;
|
||||
listener.onFail(stellarRequest);
|
||||
|
|
@ -155,7 +155,7 @@ public class ServerApiStellar {
|
|||
if (stellarRequest.getError() != null) {
|
||||
LOG.i(TAG, "requestData " + stellarRequest.getClass().getSimpleName() + " onComplete, error!=null");
|
||||
|
||||
if (isRetry || stellarRequest.errorResponse.getCode() == 404) {
|
||||
if (isRetry || (stellarRequest.errorResponse != null && stellarRequest.errorResponse.getCode() == 404)) {
|
||||
listener.onFail(stellarRequest);
|
||||
} else {
|
||||
retryRequest(ctx, stellarRequest);
|
||||
|
|
|
|||
|
|
@ -2,12 +2,18 @@ package com.tangem.ui.fragment
|
|||
|
||||
import android.app.Activity
|
||||
import android.app.AlertDialog
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.nfc.NfcAdapter
|
||||
import android.nfc.Tag
|
||||
import android.nfc.tech.IsoDep
|
||||
import android.os.Bundle
|
||||
import android.text.Spannable
|
||||
import android.text.SpannableString
|
||||
import android.text.style.ForegroundColorSpan
|
||||
import android.view.*
|
||||
import android.widget.PopupMenu
|
||||
import android.widget.TextView
|
||||
import android.widget.Toast
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.os.bundleOf
|
||||
|
|
@ -34,12 +40,13 @@ import com.tangem.ui.navigation.NavigationResultListener
|
|||
import com.tangem.util.CommonUtil
|
||||
import com.tangem.util.LOG
|
||||
import com.tangem.util.UtilHelper
|
||||
import com.tangem.util.extensions.colorFrom
|
||||
import com.tangem.wallet.BuildConfig
|
||||
import com.tangem.wallet.CoinEngineFactory
|
||||
import com.tangem.wallet.R
|
||||
import com.tangem.wallet.TangemContext
|
||||
import kotlinx.android.synthetic.main.fragment_main.*
|
||||
import kotlinx.android.synthetic.main.layout_touch_card.*
|
||||
import kotlinx.android.synthetic.main.main_fragment.*
|
||||
import java.io.File
|
||||
import java.util.*
|
||||
|
||||
|
|
@ -52,7 +59,7 @@ class MainFragment : BaseFragment(), NavigationResultListener, NfcAdapter.Reader
|
|||
val TAG: String = MainFragment::class.java.simpleName
|
||||
}
|
||||
|
||||
override val layoutId = R.layout.main_fragment
|
||||
override val layoutId = R.layout.fragment_main
|
||||
private lateinit var viewModel: MainViewModel
|
||||
private lateinit var nfcDeviceAntenna: NfcDeviceAntennaLocation
|
||||
private var unsuccessReadCount = 0
|
||||
|
|
@ -76,12 +83,36 @@ class MainFragment : BaseFragment(), NavigationResultListener, NfcAdapter.Reader
|
|||
|
||||
// set phone name
|
||||
if (nfcDeviceAntenna.fullName != "")
|
||||
tvNFCHint.text = String.format(getString(R.string.main_screen_scan_banknote), nfcDeviceAntenna.fullName)
|
||||
tvNFCHint.text = String.format(getString(R.string.main_screen_scan_card), nfcDeviceAntenna.fullName)
|
||||
else
|
||||
tvNFCHint.text = String.format(getString(R.string.main_screen_scan_banknote), getString(R.string.main_screen_phone))
|
||||
tvNFCHint.text = String.format(getString(R.string.main_screen_scan_card), getString(R.string.main_screen_phone))
|
||||
|
||||
// set listeners
|
||||
fab.setOnClickListener { showMenu(it) }
|
||||
// ivMenu.setOnClickListener { showMenu(it) }
|
||||
|
||||
val toolbar = tb_main
|
||||
(activity as? AppCompatActivity)?.setSupportActionBar(toolbar)
|
||||
(activity as? AppCompatActivity)?.supportActionBar?.setDisplayShowTitleEnabled(false)
|
||||
|
||||
|
||||
setCardStoreLink()
|
||||
}
|
||||
|
||||
private fun setCardStoreLink() {
|
||||
val text = getString(R.string.main_screen_visit_store, getString(R.string.main_screen_store_address))
|
||||
val spannable = SpannableString(text)
|
||||
spannable.setSpan(
|
||||
ForegroundColorSpan(requireContext().colorFrom(R.color.colorAccent)),
|
||||
text.indexOf(getString(R.string.main_screen_store_address)),
|
||||
text.length,
|
||||
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
|
||||
tvBuyCards?.setText(spannable, TextView.BufferType.SPANNABLE)
|
||||
llShoppingView?.setOnClickListener {
|
||||
val uri = Uri.parse ("https://www.tangemcards.com")
|
||||
val intent = Intent(Intent.ACTION_VIEW, uri)
|
||||
startActivity(intent)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||
|
|
|
|||
|
|
@ -69,8 +69,6 @@ class VerifyCardFragment : BaseFragment(), NavigationResultListener, NfcAdapter.
|
|||
super.onViewCreated(view, savedInstanceState)
|
||||
updateViews()
|
||||
|
||||
srlVerifyCard.setOnRefreshListener { srlVerifyCard.isRefreshing = false }
|
||||
|
||||
// set listeners
|
||||
fabMenu.setOnClickListener { showMenu(fabMenu) }
|
||||
|
||||
|
|
@ -283,7 +281,7 @@ class VerifyCardFragment : BaseFragment(), NavigationResultListener, NfcAdapter.
|
|||
if (ctx.card!!.isReusable!!)
|
||||
tvReusable.setText(R.string.details_reusable)
|
||||
else
|
||||
tvReusable.setText(R.string.details_one_off_banknote)
|
||||
tvReusable.setText(R.string.details_one_off_card)
|
||||
|
||||
var s = ""
|
||||
for (signingM in ctx.card!!.allowedSigningMethod) {
|
||||
|
|
@ -397,7 +395,7 @@ class VerifyCardFragment : BaseFragment(), NavigationResultListener, NfcAdapter.
|
|||
if (ctx.card!!.useDevelopersFirmware()!!) {
|
||||
imgDeveloperVersion.setImageResource(R.drawable.ic_developer_version)
|
||||
imgDeveloperVersion.visibility = View.VISIBLE
|
||||
imgDeveloperVersion.setOnClickListener { Toast.makeText(context, R.string.details_unlocked_banknote, Toast.LENGTH_LONG).show() }
|
||||
imgDeveloperVersion.setOnClickListener { Toast.makeText(context, R.string.details_unlocked_card, Toast.LENGTH_LONG).show() }
|
||||
} else
|
||||
imgDeveloperVersion.visibility = View.INVISIBLE
|
||||
|
||||
|
|
|
|||
|
|
@ -293,9 +293,7 @@ class LoadedWalletFragment : BaseFragment(), NavigationResultListener, NfcAdapte
|
|||
}
|
||||
}
|
||||
serverApiTangem.setArtworkListener(artworkListener)
|
||||
|
||||
refresh()
|
||||
|
||||
startVerify(lastTag)
|
||||
}
|
||||
|
||||
|
|
|
|||
7
app/src/main/java/com/tangem/util/extensions/Context.kt
Normal file
7
app/src/main/java/com/tangem/util/extensions/Context.kt
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
package com.tangem.util.extensions
|
||||
|
||||
import android.content.Context
|
||||
import androidx.annotation.ColorRes
|
||||
import androidx.core.content.ContextCompat
|
||||
|
||||
fun Context.colorFrom(@ColorRes colorId: Int) = ContextCompat.getColor(this, colorId)
|
||||
|
|
@ -13,6 +13,10 @@ import com.tangem.wallet.btc.BitcoinException;
|
|||
import com.tangem.wallet.btc.BitcoinOutputStream;
|
||||
import com.tangem.wallet.btc.BtcData;
|
||||
|
||||
import org.bitcoinj.core.Address;
|
||||
import org.bitcoinj.core.SegwitAddress;
|
||||
import org.bitcoinj.script.ScriptBuilder;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.math.BigInteger;
|
||||
|
|
@ -103,7 +107,15 @@ public final class BTCUtils {
|
|||
//8 bytes
|
||||
|
||||
forSign.writeInt64(amount); //amount
|
||||
byte[] sendScript = Transaction.Script.buildOutput(outputAddress).bytes; // build out
|
||||
|
||||
byte[] sendScript;
|
||||
if (outputAddress.startsWith("bc1") || outputAddress.startsWith("tb1")) {
|
||||
Address address = SegwitAddress.fromBech32(null, outputAddress);
|
||||
sendScript = ScriptBuilder.createOutputScript(address).getProgram();
|
||||
} else {
|
||||
sendScript = Transaction.Script.buildOutput(outputAddress).bytes; // build out
|
||||
}
|
||||
|
||||
//hex str 1976a914....88ac
|
||||
forSign.write((byte) sendScript.length);
|
||||
forSign.write(sendScript);
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import android.net.Uri;
|
|||
import android.text.InputFilter;
|
||||
import android.util.Log;
|
||||
|
||||
import com.tangem.App;
|
||||
import com.tangem.data.network.ElectrumRequest;
|
||||
import com.tangem.data.network.ServerApiElectrum;
|
||||
import com.tangem.tangem_card.data.TangemCard;
|
||||
|
|
@ -71,7 +72,7 @@ public class BtcCashEngine extends CoinEngine {
|
|||
@Override
|
||||
public boolean awaitingConfirmation() {
|
||||
if (coinData == null) return false;
|
||||
return coinData.getBalanceUnconfirmed() != 0;
|
||||
return coinData.getBalanceUnconfirmed() != 0 || App.pendingTransactionsStorage.hasTransactions(ctx.getCard());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import android.util.Log;
|
|||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.tangem.App;
|
||||
import com.tangem.data.Blockchain;
|
||||
import com.tangem.data.network.BinanceApi;
|
||||
import com.tangem.data.network.Server;
|
||||
|
|
@ -91,7 +92,7 @@ public class BinanceEngine extends CoinEngine {
|
|||
|
||||
@Override
|
||||
public boolean awaitingConfirmation() {
|
||||
return false;
|
||||
return App.pendingTransactionsStorage.hasTransactions(ctx.getCard());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -117,6 +117,7 @@ public class BtcData extends CoinData {
|
|||
balanceConfirmed = null;
|
||||
balanceUnconfirmed = null;
|
||||
unspentTransactions = null;
|
||||
hasUnconfirmed = false;
|
||||
}
|
||||
|
||||
public CoinEngine.InternalAmount getBalanceInInternalUnits() {
|
||||
|
|
|
|||
|
|
@ -37,6 +37,10 @@ import com.tangem.wallet.TangemContext;
|
|||
import com.tangem.wallet.Transaction;
|
||||
import com.tangem.wallet.UnspentOutputInfo;
|
||||
|
||||
import org.bitcoinj.core.SegwitAddress;
|
||||
import org.bitcoinj.params.MainNetParams;
|
||||
import org.bitcoinj.params.TestNet3Params;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.math.BigDecimal;
|
||||
|
|
@ -89,7 +93,7 @@ public class BtcEngine extends CoinEngine {
|
|||
@Override
|
||||
public boolean awaitingConfirmation() {
|
||||
if (coinData == null) return false;
|
||||
return coinData.getBalanceUnconfirmed() != 0;
|
||||
return coinData.getBalanceUnconfirmed() != 0 || coinData.isHasUnconfirmed() || App.pendingTransactionsStorage.hasTransactions(ctx.getCard());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -148,42 +152,52 @@ public class BtcEngine extends CoinEngine {
|
|||
return false;
|
||||
}
|
||||
|
||||
if (address.length() < 25) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (address.length() > 35) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!address.startsWith("1") && !address.startsWith("2") && !address.startsWith("3") && !address.startsWith("n") && !address.startsWith("m")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
byte[] decAddress = Base58.decodeBase58(address);
|
||||
|
||||
if (decAddress == null || decAddress.length == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
byte[] rip = new byte[21];
|
||||
for (int i = 0; i < 21; ++i) {
|
||||
rip[i] = decAddress[i];
|
||||
}
|
||||
|
||||
byte[] kcv = CryptoUtil.doubleSha256(rip);
|
||||
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
if (kcv[i] != decAddress[21 + i])
|
||||
if (address.startsWith("1") || address.startsWith("2") || address.startsWith("3") || address.startsWith("n") || address.startsWith("m")) {
|
||||
if (address.length() < 25) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (ctx.getBlockchain() != Blockchain.BitcoinTestNet && ctx.getBlockchain() != Blockchain.Bitcoin) {
|
||||
return false;
|
||||
}
|
||||
if (address.length() > 35) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ctx.getBlockchain() == Blockchain.BitcoinTestNet && (address.startsWith("1") || address.startsWith("3"))) {
|
||||
return false;
|
||||
byte[] decAddress = Base58.decodeBase58(address);
|
||||
|
||||
if (decAddress == null || decAddress.length == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
byte[] rip = new byte[21];
|
||||
for (int i = 0; i < 21; ++i) {
|
||||
rip[i] = decAddress[i];
|
||||
}
|
||||
|
||||
byte[] kcv = CryptoUtil.doubleSha256(rip);
|
||||
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
if (kcv[i] != decAddress[21 + i])
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ctx.getBlockchain() != Blockchain.BitcoinTestNet && ctx.getBlockchain() != Blockchain.Bitcoin) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ctx.getBlockchain() == Blockchain.BitcoinTestNet && (address.startsWith("1") || address.startsWith("3"))) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
if (ctx.getBlockchain() == Blockchain.Bitcoin) {
|
||||
SegwitAddress.fromBech32(new MainNetParams(), address);
|
||||
} else if (ctx.getBlockchain() == Blockchain.BitcoinTestNet) {
|
||||
SegwitAddress.fromBech32(new TestNet3Params(), address);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ public class CardanoEngine extends CoinEngine {
|
|||
|
||||
@Override
|
||||
public boolean awaitingConfirmation() {
|
||||
return false;
|
||||
return App.pendingTransactionsStorage.hasTransactions(ctx.getCard());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import android.net.Uri;
|
|||
import android.text.InputFilter;
|
||||
import android.util.Log;
|
||||
|
||||
import com.tangem.App;
|
||||
import com.tangem.data.network.ServerApiInsight;
|
||||
import com.tangem.data.network.model.InsightResponse;
|
||||
import com.tangem.tangem_card.data.TangemCard;
|
||||
|
|
@ -67,7 +68,7 @@ public class DucatusEngine extends BtcEngine {
|
|||
@Override
|
||||
public boolean awaitingConfirmation() {
|
||||
if (coinData == null) return false;
|
||||
return coinData.getBalanceUnconfirmed() != 0;
|
||||
return coinData.getBalanceUnconfirmed() != 0 || App.pendingTransactionsStorage.hasTransactions(ctx.getCard());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import android.util.Log;
|
|||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.google.gson.Gson;
|
||||
import com.tangem.App;
|
||||
import com.tangem.Constant;
|
||||
import com.tangem.data.Blockchain;
|
||||
import com.tangem.data.network.ServerApiEos;
|
||||
|
|
@ -86,7 +87,7 @@ public class EosEngine extends CoinEngine {
|
|||
|
||||
@Override
|
||||
public boolean awaitingConfirmation() {
|
||||
return false;
|
||||
return App.pendingTransactionsStorage.hasTransactions(ctx.getCard());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -317,7 +318,7 @@ public class EosEngine extends CoinEngine {
|
|||
public String calculateAddress(byte[] pkCompressed) {
|
||||
String cid = Util.bytesToHex(ctx.getCard().getCID()).toLowerCase();
|
||||
String address = cid.substring(0, 4) + cid.substring(8, 16);
|
||||
address = address.replace("0", "o").replace("6", "b").replace("7,", "t").replace("8", "s").replace("9", "g");
|
||||
address = address.replace("0", "o").replace("6", "b").replace("7", "t").replace("8", "s").replace("9", "g");
|
||||
return address;
|
||||
|
||||
// String cid = Util.bytesToHex(ctx.getCard().getCID());
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import android.net.Uri;
|
|||
import android.text.InputFilter;
|
||||
import android.util.Log;
|
||||
|
||||
import com.tangem.App;
|
||||
import com.tangem.Constant;
|
||||
import com.tangem.data.Blockchain;
|
||||
import com.tangem.data.network.ServerApiInfura;
|
||||
|
|
@ -65,7 +66,7 @@ public class EthEngine extends CoinEngine {
|
|||
|
||||
@Override
|
||||
public boolean awaitingConfirmation() {
|
||||
return false;
|
||||
return !coinData.getUnconfirmedTXCount().equals(coinData.getConfirmedTXCount()) || App.pendingTransactionsStorage.hasTransactions(ctx.getCard());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ public class LtcEngine extends BtcEngine {
|
|||
@Override
|
||||
public boolean awaitingConfirmation() {
|
||||
if (coinData == null) return false;
|
||||
return coinData.getBalanceUnconfirmed() != 0;
|
||||
return coinData.getBalanceUnconfirmed() != 0 || App.pendingTransactionsStorage.hasTransactions(ctx.getCard());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import android.text.InputFilter;
|
|||
import android.util.Log;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import com.tangem.App;
|
||||
import com.tangem.data.Blockchain;
|
||||
import com.tangem.data.network.ServerApiInfura;
|
||||
import com.tangem.data.network.model.InfuraResponse;
|
||||
|
|
@ -73,7 +74,7 @@ public class TokenEngine extends CoinEngine {
|
|||
|
||||
@Override
|
||||
public boolean awaitingConfirmation() {
|
||||
return false;
|
||||
return !coinData.getUnconfirmedTXCount().equals(coinData.getConfirmedTXCount()) || App.pendingTransactionsStorage.hasTransactions(ctx.getCard());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -182,7 +183,8 @@ public class TokenEngine extends CoinEngine {
|
|||
if (coinData == null) return false;
|
||||
if (coinData.getBalanceInInternalUnits() == null && coinData.getBalanceAlterInInternalUnits() == null)
|
||||
return false;
|
||||
return coinData.getBalanceInInternalUnits().notZero() || coinData.getBalanceAlterInInternalUnits().notZero();
|
||||
return (coinData.getBalanceInInternalUnits() != null && coinData.getBalanceInInternalUnits().notZero() ) ||
|
||||
(coinData.getBalanceAlterInInternalUnits() != null && coinData.getBalanceAlterInInternalUnits().notZero());
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import android.os.StrictMode;
|
|||
import android.text.InputFilter;
|
||||
import android.util.Log;
|
||||
|
||||
import com.tangem.App;
|
||||
import com.tangem.data.Blockchain;
|
||||
import com.tangem.data.network.ServerApiStellar;
|
||||
import com.tangem.data.network.StellarRequest;
|
||||
|
|
@ -70,9 +71,7 @@ public class XlmAssetEngine extends CoinEngine {
|
|||
|
||||
@Override
|
||||
public boolean awaitingConfirmation() {
|
||||
if (coinData == null) return false;
|
||||
//TODO
|
||||
return false;//coinData.getBalanceUnconfirmed() != 0;
|
||||
return App.pendingTransactionsStorage.hasTransactions(ctx.getCard());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -163,7 +162,7 @@ public class XlmAssetEngine extends CoinEngine {
|
|||
|
||||
@Override
|
||||
public Uri getWalletExplorerUri() {
|
||||
return Uri.parse("http://stellarchain.io/address/" + ctx.getCoinData().getWallet());
|
||||
return Uri.parse("https://stellar.expert/explorer/public/account/" + ctx.getCoinData().getWallet());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import android.os.StrictMode;
|
|||
import android.text.InputFilter;
|
||||
import android.util.Log;
|
||||
|
||||
import com.tangem.App;
|
||||
import com.tangem.data.Blockchain;
|
||||
import com.tangem.data.network.ServerApiStellar;
|
||||
import com.tangem.data.network.StellarRequest;
|
||||
|
|
@ -68,9 +69,7 @@ public class XlmEngine extends CoinEngine {
|
|||
|
||||
@Override
|
||||
public boolean awaitingConfirmation() {
|
||||
if (coinData == null) return false;
|
||||
//TODO
|
||||
return false;//coinData.getBalanceUnconfirmed() != 0;
|
||||
return App.pendingTransactionsStorage.hasTransactions(ctx.getCard());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -98,7 +97,7 @@ public class XlmEngine extends CoinEngine {
|
|||
@Override
|
||||
public boolean hasBalanceInfo() {
|
||||
if (coinData == null) return false;
|
||||
return coinData.getBalance() != null;
|
||||
return (coinData.getBalance() != null) || (coinData.isError404()) ;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -143,7 +142,7 @@ public class XlmEngine extends CoinEngine {
|
|||
|
||||
@Override
|
||||
public Uri getWalletExplorerUri() {
|
||||
return Uri.parse((ctx.getBlockchain() == Blockchain.Stellar ? "http://stellarchain.io/address/" : "http://testnet.stellarchain.io/address/") + ctx.getCoinData().getWallet());
|
||||
return Uri.parse((ctx.getBlockchain() == Blockchain.Stellar ? "https://stellar.expert/explorer/public/account/" : "https://stellar.expert/explorer/testnet/account/") + ctx.getCoinData().getWallet());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -429,7 +428,7 @@ public class XlmEngine extends CoinEngine {
|
|||
public void onFail(StellarRequest.Base request) {
|
||||
Log.i(TAG, "onFail: " + request.getClass().getSimpleName() + " " + request.getError());
|
||||
|
||||
if (request.errorResponse.getCode() == 404) {
|
||||
if (request.errorResponse != null && request.errorResponse.getCode() == 404) {
|
||||
coinData.setTargetAccountCreated(false);
|
||||
|
||||
if (amount.compareTo(coinData.getReserve()) >= 0) { //TODO: take fee inclusion in account, now 1 XLM with fee included will fail after transaction is sent
|
||||
|
|
@ -492,7 +491,7 @@ public class XlmEngine extends CoinEngine {
|
|||
public void onFail(StellarRequest.Base request) {
|
||||
Log.i(TAG, "onFail: " + request.getClass().getSimpleName() + " " + request.getError());
|
||||
|
||||
if (request.errorResponse.getCode() == 404) {
|
||||
if (request.errorResponse != null && request.errorResponse.getCode() == 404) {
|
||||
coinData.setError404(true);
|
||||
} else {
|
||||
ctx.setError(request.getError());
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import com.ripple.core.coretypes.uint.UInt32;
|
|||
import com.ripple.crypto.ecdsa.ECDSASignature;
|
||||
import com.ripple.encodings.addresses.Addresses;
|
||||
import com.ripple.utils.HashUtils;
|
||||
import com.tangem.App;
|
||||
import com.tangem.data.network.ServerApiRipple;
|
||||
import com.tangem.data.network.model.RippleResponse;
|
||||
import com.tangem.tangem_card.data.TangemCard;
|
||||
|
|
@ -61,7 +62,7 @@ public class XrpEngine extends CoinEngine {
|
|||
@Override
|
||||
public boolean awaitingConfirmation() {
|
||||
if (coinData == null) return false;
|
||||
return coinData.hasUnconfirmed();
|
||||
return coinData.hasUnconfirmed() || App.pendingTransactionsStorage.hasTransactions(ctx.getCard());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -89,11 +90,11 @@ public class XrpEngine extends CoinEngine {
|
|||
@Override
|
||||
public boolean hasBalanceInfo() {
|
||||
if (coinData == null) return false;
|
||||
return coinData.hasBalanceInfo();
|
||||
return coinData.hasBalanceInfo() || coinData.isAccountNotFound();
|
||||
}
|
||||
|
||||
public boolean isExtractPossible() {
|
||||
if (!hasBalanceInfo()) {
|
||||
if (coinData == null || !coinData.hasBalanceInfo()) {
|
||||
ctx.setMessage(R.string.loaded_wallet_error_obtaining_blockchain_data);
|
||||
} else if (!isBalanceNotZero()) {
|
||||
ctx.setMessage(R.string.general_wallet_empty);
|
||||
|
|
@ -242,7 +243,7 @@ public class XrpEngine extends CoinEngine {
|
|||
|
||||
@Override
|
||||
public Amount getBalance() {
|
||||
if (!hasBalanceInfo()) return null;
|
||||
if (coinData == null || !coinData.hasBalanceInfo()) return null;
|
||||
return convertToAmount(coinData.getBalanceInInternalUnits());
|
||||
}
|
||||
|
||||
|
|
|
|||
9
app/src/main/res/drawable/ic_shopping_cart_black.xml
Normal file
9
app/src/main/res/drawable/ic_shopping_cart_black.xml
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M7,18c-1.1,0 -1.99,0.9 -1.99,2S5.9,22 7,22s2,-0.9 2,-2 -0.9,-2 -2,-2zM1,2v2h2l3.6,7.59 -1.35,2.45c-0.16,0.28 -0.25,0.61 -0.25,0.96 0,1.1 0.9,2 2,2h12v-2L7.42,15c-0.14,0 -0.25,-0.11 -0.25,-0.25l0.03,-0.12 0.9,-1.63h7.45c0.75,0 1.41,-0.41 1.75,-1.03l3.58,-6.49c0.08,-0.14 0.12,-0.31 0.12,-0.48 0,-0.55 -0.45,-1 -1,-1L5.21,4l-0.94,-2L1,2zM17,18c-1.1,0 -1.99,0.9 -1.99,2s0.89,2 1.99,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
|
||||
</vector>
|
||||
|
|
@ -13,7 +13,7 @@
|
|||
android:layout_marginStart="8dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:fontFamily="@font/maax"
|
||||
android:text="@string/dialog_this_banknote_has_enforced_security_delay"
|
||||
android:text="@string/dialog_this_card_has_enforced_security_delay"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/primary"
|
||||
android:textSize="@dimen/text_size_1_small"
|
||||
|
|
@ -29,7 +29,7 @@
|
|||
android:layout_marginStart="8dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:fontFamily="@font/maax"
|
||||
android:text="@string/dialog_hold_banknote"
|
||||
android:text="@string/dialog_hold_card"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="@dimen/text_size_medium"
|
||||
|
|
|
|||
|
|
@ -9,21 +9,16 @@
|
|||
tools:context="com.tangem.ui.fragment.VerifyCardFragment"
|
||||
tools:ignore="contentDescription">
|
||||
|
||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||
android:id="@+id/srlVerifyCard"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/rlToolButtons1"
|
||||
app:layout_constraintHorizontal_bias="0.0"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintRight_toRightOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_bias="0.0">
|
||||
|
||||
<ScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/rlToolButtons1"
|
||||
app:layout_constraintHorizontal_bias="0.0"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintRight_toRightOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_bias="0.0">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
|
|
@ -580,8 +575,6 @@
|
|||
|
||||
</ScrollView>
|
||||
|
||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/rlToolButtons1"
|
||||
android:layout_width="match_parent"
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="@font/maax"
|
||||
android:text="@string/now_touch_the_banknote_with_id"
|
||||
android:text="@string/now_touch_the_card_with_id"
|
||||
android:textAlignment="center"
|
||||
android:textSize="@dimen/text_size_medium" />
|
||||
|
||||
|
|
|
|||
94
app/src/main/res/layout/fragment_main.xml
Normal file
94
app/src/main/res/layout/fragment_main.xml
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/cl"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/white"
|
||||
tools:context="com.tangem.ui.activity.MainActivity"
|
||||
tools:ignore="contentDescription">
|
||||
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
android:id="@+id/tb_main"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="@color/white"
|
||||
android:minHeight="?attr/actionBarSize"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/llTapPrompt"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@color/actionbar_text"
|
||||
android:gravity="center_vertical|center_horizontal"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintBottom_toTopOf="@id/llShoppingView"
|
||||
app:layout_constraintTop_toBottomOf="@id/tb_main">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/ivTangemLogo"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="48dp"
|
||||
app:layout_constraintTop_toBottomOf="@+id/tb_main"
|
||||
app:srcCompat="@drawable/tangem_logo_full_new" />
|
||||
|
||||
<include layout="@layout/layout_touch_card" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvNFCHint"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="150dp"
|
||||
android:fontFamily="@font/maax"
|
||||
android:gravity="center"
|
||||
android:lineSpacingExtra="8dp"
|
||||
android:minHeight="200dp"
|
||||
android:paddingLeft="20dp"
|
||||
android:paddingTop="20dp"
|
||||
android:paddingRight="20dp"
|
||||
android:paddingBottom="20dp"
|
||||
android:text="@string/main_screen_tap_card"
|
||||
android:textAlignment="center"
|
||||
android:textAllCaps="false"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
|
||||
android:textColor="@color/primary_dark"
|
||||
android:textSize="@dimen/text_size_medium" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/llShoppingView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="80dp"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginBottom="12dp"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintBottom_toBottomOf="parent">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="32dp"
|
||||
android:layout_height="32dp"
|
||||
android:layout_gravity="center_vertical|end"
|
||||
android:src="@drawable/ic_shopping_cart_black" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvBuyCards"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:fontFamily="@font/maax"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lineSpacingExtra="8dp"
|
||||
android:minHeight="200dp"
|
||||
android:paddingStart="8dp"
|
||||
android:paddingTop="20dp"
|
||||
android:paddingEnd="8dp"
|
||||
android:paddingBottom="20dp"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
||||
android:textColor="@color/primary_dark"
|
||||
android:textSize="14sp"
|
||||
tools:text="Don't have a card?\nVisit our store at tangemcards.com" />
|
||||
</LinearLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="@font/maax"
|
||||
android:text="@string/now_touch_the_banknote_with_id"
|
||||
android:text="@string/now_touch_the_card_with_id"
|
||||
android:textAlignment="center"
|
||||
android:textSize="@dimen/text_size_medium" />
|
||||
|
||||
|
|
|
|||
|
|
@ -269,7 +269,7 @@
|
|||
android:layout_marginStart="8dp"
|
||||
android:layout_marginTop="4dp"
|
||||
android:fontFamily="@font/maax"
|
||||
android:text="@string/general_on_banknote"
|
||||
android:text="@string/general_on_card"
|
||||
android:textColor="@color/primary"
|
||||
android:textSize="@dimen/text_size_medium"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
|
|
|||
|
|
@ -262,7 +262,7 @@
|
|||
android:layout_marginStart="8dp"
|
||||
android:layout_marginTop="4dp"
|
||||
android:fontFamily="@font/maax"
|
||||
android:text="@string/general_on_banknote"
|
||||
android:text="@string/general_on_card"
|
||||
android:textColor="@color/primary"
|
||||
android:textSize="@dimen/text_size_medium"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
|
|
|||
|
|
@ -227,7 +227,7 @@
|
|||
android:layout_marginStart="8dp"
|
||||
android:layout_marginTop="4dp"
|
||||
android:fontFamily="@font/maax"
|
||||
android:text="@string/general_on_banknote"
|
||||
android:text="@string/general_on_card"
|
||||
android:textColor="@color/primary"
|
||||
android:textSize="@dimen/text_size_medium"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="@font/maax"
|
||||
android:text="@string/now_touch_the_banknote_with_id"
|
||||
android:text="@string/now_touch_the_card_with_id"
|
||||
android:textAlignment="center"
|
||||
android:textSize="@dimen/text_size_medium" />
|
||||
|
||||
|
|
|
|||
|
|
@ -1,58 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/cl"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context="com.tangem.ui.activity.MainActivity"
|
||||
tools:ignore="contentDescription">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/llTapPrompt"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/actionbar_text"
|
||||
android:gravity="center_vertical|center_horizontal"
|
||||
android:orientation="vertical">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="30dp"
|
||||
app:srcCompat="@drawable/tangem_logo_full_new" />
|
||||
|
||||
<include layout="@layout/layout_touch_card" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvNFCHint"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="200dp"
|
||||
android:layout_marginTop="12dp"
|
||||
android:fontFamily="@font/maax"
|
||||
android:gravity="center"
|
||||
android:lineSpacingExtra="8dp"
|
||||
android:minHeight="200dp"
|
||||
android:paddingLeft="20dp"
|
||||
android:paddingTop="20dp"
|
||||
android:paddingRight="20dp"
|
||||
android:paddingBottom="20dp"
|
||||
android:text="@string/main_screen_tap_card"
|
||||
android:textAlignment="center"
|
||||
android:textAllCaps="false"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
|
||||
android:textColor="@color/primary_dark"
|
||||
android:textSize="@dimen/text_size_medium" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|start"
|
||||
android:layout_margin="10dp"
|
||||
android:src="@drawable/ic_show_menu"
|
||||
app:backgroundTint="@color/colorPrimary"
|
||||
app:fabSize="normal" />
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
|
@ -9,7 +9,7 @@
|
|||
android:id="@+id/main"
|
||||
android:name="com.tangem.ui.fragment.MainFragment"
|
||||
android:label="fragment_main"
|
||||
tools:layout="@layout/main_fragment">
|
||||
tools:layout="@layout/fragment_main">
|
||||
<action
|
||||
android:id="@+id/action_main_to_loadedWalletFragment"
|
||||
app:destination="@id/loadedWalletFragment" />
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@
|
|||
<string name="general_notification_scan_again">Réessayez de numériser</string>
|
||||
<string name="general_error_cannot_erase_wallet_with_non_zero_balance">Impossible d\'effacer le porte-monnaie avec un solde différent de zéro</string>
|
||||
<string name="general_send_transaction">Envoyer le paiement</string>
|
||||
<string name="general_from_banknote">Depuis la carte</string>
|
||||
<string name="general_on_banknote">sur la carte</string>
|
||||
<string name="general_from_card">Depuis la carte</string>
|
||||
<string name="general_on_card">sur la carte</string>
|
||||
<string name="general_balance">avec solde</string>
|
||||
<string name="general_send_to_wallet">Envoyer au porte-monnaie</string>
|
||||
<string name="general_amount">Montant</string>
|
||||
|
|
@ -49,10 +49,9 @@
|
|||
<string name="dialog_the_nfc_adapter_length_apdu">Oups .. Il semble que votre smartphone ne supporte pas de tels paquets NFC.</string>
|
||||
<string name="dialog_the_nfc_adapter_length_apdu_advice">Essayez d\'envoyer une quantité inférieure ou utilisez un smartphone avec prise en charge complète de NFC.</string>
|
||||
<string name="dialog_title_money_is_at_risk">Votre argent est en jeu!</string>
|
||||
<string name="dialog_this_banknote_has_enforced_security_delay">Cette carte a imposé un délai de sécurité</string>
|
||||
<string name="dialog_hold_banknote">Veuillez tenir la carte fermement \ n jusqu\'à ce que l\'opération soit terminéev…</string>
|
||||
<string name="dialog_you_may_be_required_to_repeat">Vous devrez peut-être répéter cette opération plusieurs fois en fonction des performances NFC de votre smartphone. \ n Ceci est fait pour la sécurité de vos fonds.</string>
|
||||
<string name="alert_unknown_blockchain">Cette carte n\'est pas supportée</string>
|
||||
<string name="dialog_this_card_has_enforced_security_delay">Cette carte a imposé un délai de sécurité</string>
|
||||
<string name="dialog_hold_card">Veuillez tenir la carte fermement \ n jusqu\'à ce que l\'opération soit terminée…</string>
|
||||
<string name="dialog_you_may_be_required_to_repeat">Vous devrez peut-être répéter cette opération plusieurs fois en fonction des performances NFC de votre smartphone. \ n Ceci est fait pour sécuriser vos fonds.</string>
|
||||
|
||||
<!-- menu main -->
|
||||
<string name="main_menu_manage_pin_1">Gérer le code PIN de l\'utilisateur…</string>
|
||||
|
|
@ -74,8 +73,8 @@
|
|||
<string name="splash_cardano">Cardano</string>
|
||||
|
||||
<!-- Main -->
|
||||
<string name="main_screen_tap_card">Appuyez sur la carte Tangem avec votre smartphone</string>
|
||||
<string name="main_screen_scan_banknote">Scanner une carte avec votre \n %1$s \n comme indiqué ci-dessus</string>
|
||||
<string name="main_screen_tap_card">Mettez en contact la carte avec votre smartphone</string>
|
||||
<string name="main_screen_scan_card">Scanner une carte avec votre \n %1$s \n comme indiqué ci-dessus</string>
|
||||
<string name="main_screen_phone">phone</string>
|
||||
<string name="main_screen_erased_wallet">Le porte-monnaie a été effacé</string>
|
||||
<string name="main_screen_not_personalized">Non personnalisé</string>
|
||||
|
|
@ -95,7 +94,7 @@
|
|||
<string name="loaded_wallet_error_blockchain_communication_error">Impossible d\'obtenir les données de la blockchain (erreur de communication)</string>
|
||||
<string name="loaded_wallet_chooser_share">Partager l\'adresse du porte-monnaie avec:</string>
|
||||
<string name="loaded_wallet_toast_copied">copié dans le presse-papiers</string>
|
||||
<string name="loaded_wallet_btn_extract">Retirer</string>
|
||||
<string name="loaded_wallet_btn_extract">Transférer</string>
|
||||
<string name="loaded_wallet_btn_load">Charger</string>
|
||||
<string name="loaded_wallet_btn_explore">Explorer</string>
|
||||
<string name="loaded_wallet_btn_copy">Copier</string>
|
||||
|
|
@ -147,12 +146,12 @@
|
|||
<string name="balance_validator_second_line_authenticity_not_verified">L\'authenticité ne peut pas être vérifiée. Balayez vers le bas pour actualiser.</string>
|
||||
|
||||
<!-- CreateNewWallet, Purge, SignTransaction -->
|
||||
<string name="now_touch_the_banknote_with_id"> Maintenant, touchez la carte avec l\'ID </string>
|
||||
<string name="now_touch_the_card_with_id"> Maintenant, touchez la carte avec l\'ID </string>
|
||||
<string name="to_create_the_wallet">pour créer le porte-monnaie </string>
|
||||
<string name="to_erase_the_wallet">pour effacer le porte-monnaie</string>
|
||||
<string name="to_sign_the_transaction">pour signer le paiement</string>
|
||||
<string name="to_change_pin_codes">pour changer les codes PIN / PIN2</string>
|
||||
<string name="nfc_purge_warning">En tapotant sur la carte, vous retirerez définitivement le porte-monnaie de la blockchain. Assurez-vous qu\'il n\'y aura pas d\autres transactions entrantes</string>
|
||||
<string name="nfc_purge_warning">En mettant la carte en contact avec votre smartphone, vous retirerez définitivement le porte-monnaie de la blockchain. Assurez-vous qu\'il n\'y aura pas d\'autres transactions entrantes</string>
|
||||
<string name="nfc_error_cannot_erase_wallet">Impossible d\'effacer le porte-monnaie. Veillez à entrer le code PIN2 correct!</string>
|
||||
<string name="nfc_error_cannot_create_wallet">Impossible de créer un porte-monnaie. Veillez à entrer le code PIN2 correct!</string>
|
||||
|
||||
|
|
@ -230,7 +229,7 @@
|
|||
<string name="details_none">None</string>
|
||||
<string name="details_last_one">Le dernier!</string>
|
||||
<string name="details_unlimited">Unlimited</string>
|
||||
<string name="details_one_off_banknote">Carte ponctuelle</string>
|
||||
<string name="details_one_off_card">Carte ponctuelle</string>
|
||||
<string name="details_firmware">Micrologiciel</string>
|
||||
<string name="details_registration_date">Date d\'enregistrement</string>
|
||||
<string name="details_possession_proved">Possession prouvée</string>
|
||||
|
|
@ -240,12 +239,12 @@
|
|||
<string name="details_private_key">Clé privée</string>
|
||||
<string name="details_validation_node">Noeud de validation</string>
|
||||
<string name="details_unspents">Unspents</string>
|
||||
<string name="details_protected_by_default_pin_1">Cette carte est protégé par le code PIN1 par défaut</string>
|
||||
<string name="details_protected_by_user_pin_1">Cette carte est protégé par le code PIN1 de l’utilisateur</string>
|
||||
<string name="details_protected_by_default_pin_2">Cette carte est protégé par le code PIN2 par défaut</string>
|
||||
<string name="details_protected_by_user_pin_2">Cette carte est protégé par le code PIN2 de l’utilisateur</string>
|
||||
<string name="details_unlocked_banknote">Carte débloqué, uniquement à des fins de développement</string>
|
||||
<string name="details_security_delay">Cette carte appliquera un délai de sécurité de %.0f secondes pour toutes lesopérations nécessitant un code PIN2</string>
|
||||
<string name="details_protected_by_default_pin_1">Cette carte est protégée par le code PIN1 par défaut</string>
|
||||
<string name="details_protected_by_user_pin_1">Cette carte est protégée par le code PIN1 de l’utilisateur</string>
|
||||
<string name="details_protected_by_default_pin_2">Cette carte est protégée par le code PIN2 par défaut</string>
|
||||
<string name="details_protected_by_user_pin_2">Cette carte est protégée par le code PIN2 de l’utilisateur</string>
|
||||
<string name="details_unlocked_card">Carte débloquée, uniquement à des fins de développement</string>
|
||||
<string name="details_security_delay">Cette carte appliquera un délai de sécurité de %.0f secondes pour toutes les opérations nécessitant un code PIN2</string>
|
||||
<string name="details_both_pins_can_be_changed">Permet de changer les codes PIN1 et PIN2\n</string>
|
||||
<string name="details_pin1_can_be_changed">Permet de changer PIN1\n</string>
|
||||
<string name="details_pin2_can_be_changed">Permet de changer le code PIN2\n</string>
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
<color name="card_state_loaded_with_zero">#bbd9e6</color>
|
||||
<color name="card_state_purged">#bbbbcc</color>
|
||||
<color name="fab">#4f98c0</color>
|
||||
<color name="type_banknote">#ffffff</color>
|
||||
<color name="type_card">#ffffff</color>
|
||||
<color name="type_wallet">#ffffff</color>
|
||||
<color name="black_overlay">#66000000</color>
|
||||
<color name="confirmed">#00A818</color>
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@
|
|||
<string name="general_notification_scan_again">Try to scan again</string>
|
||||
<string name="general_error_cannot_erase_wallet_with_non_zero_balance">Cannot erase wallet with non-zero balance</string>
|
||||
<string name="general_send_transaction">Send payment</string>
|
||||
<string name="general_from_banknote">From banknote</string>
|
||||
<string name="general_on_banknote">on banknote</string>
|
||||
<string name="general_from_card">From card</string>
|
||||
<string name="general_on_card">on card</string>
|
||||
<string name="general_balance">with balance</string>
|
||||
<string name="general_send_to_wallet">Send to wallet</string>
|
||||
<string name="general_amount">Amount</string>
|
||||
|
|
@ -49,9 +49,10 @@
|
|||
<string name="dialog_the_nfc_adapter_length_apdu">Oops.. It seems your smartphone does not support such long NFC packets.</string>
|
||||
<string name="dialog_the_nfc_adapter_length_apdu_advice">Try sending smaller amount or use a smartphone with full NFC support.</string>
|
||||
<string name="dialog_title_money_is_at_risk">Your money is at risk!</string>
|
||||
<string name="dialog_this_banknote_has_enforced_security_delay">This banknote has enforced security delay</string>
|
||||
<string name="dialog_hold_banknote">Please hold the banknote firmly\n until the operation is completed…</string>
|
||||
<string name="dialog_this_card_has_enforced_security_delay">This card has enforced security delay</string>
|
||||
<string name="dialog_hold_card">Please hold the card firmly\n until the operation is completed…</string>
|
||||
<string name="dialog_you_may_be_required_to_repeat">You may be required to repeat this operation a few times depending on the NFC performance of your smartphone.\n This is made for safety of your funds.</string>
|
||||
<string name="alert_unknown_blockchain">This is a genuine Tangem card. Please follow instructions written on the card to install the official app.</string>
|
||||
|
||||
<!-- menu main -->
|
||||
<string name="main_menu_manage_pin_1">Manage user PIN1…</string>
|
||||
|
|
@ -71,16 +72,17 @@
|
|||
<string name="splash_version_name_debug">ALPHA v.%1$s \n dev \n build %2$s</string>
|
||||
<string name="splash_version_name_release">v.%1$s</string>
|
||||
<string name="splash_cardano">Cardano</string>
|
||||
<string name="alert_unknown_blockchain">This card is not supported</string>
|
||||
|
||||
<!-- Main -->
|
||||
<string name="main_screen_tap_card">Tap Tangem card with your smartphone</string>
|
||||
<string name="main_screen_scan_banknote">Scan a banknote with your \n %1$s \n as shown above</string>
|
||||
<string name="main_screen_scan_card">Scan a card with your \n %1$s \n as shown above</string>
|
||||
<string name="main_screen_phone">phone</string>
|
||||
<string name="main_screen_erased_wallet">Wallet was erased</string>
|
||||
<string name="main_screen_not_personalized">Not personalized</string>
|
||||
<string name="main_screen_new_version_toast">There is a new application version: %1$s</string>
|
||||
<string name="main_screen_btn_update">Update</string>
|
||||
<string name="main_screen_visit_store">Don\'t have a card?\n Visit our store at %1$s</string>
|
||||
<string name="main_screen_store_address">tangemcards.com</string>
|
||||
|
||||
<!-- LoadedWallet -->
|
||||
<string name="loaded_wallet_no_compatible_wallet">No compatible wallets installed</string>
|
||||
|
|
@ -121,7 +123,7 @@
|
|||
<string name="balance_validator_first_line_empty_wallet">Empty wallet</string>
|
||||
<string name="balance_validator_first_line_verification_failed">Verification failed</string>
|
||||
<string name="balance_validator_first_line_pending_transaction">Pending transaction…</string>
|
||||
<string name="balance_validator_first_line_not_genuine">Not genuine banknote</string>
|
||||
<string name="balance_validator_first_line_not_genuine">Not genuine card</string>
|
||||
<string name="balance_validator_first_line_locked_pin2">Locked with PIN2</string>
|
||||
<string name="balance_validator_first_line_verify_identity">Verified note identity.</string>
|
||||
<string name="balance_validator_first_line_no_account">No account or network error</string>
|
||||
|
|
@ -137,7 +139,7 @@
|
|||
<string name="balance_validator_second_line_internet_to_get_balance">Can\'t obtain balance from blockchain. Restore internet connection to be more confident.</string>
|
||||
<string name="balance_validator_second_line_swipe_to_refresh">Swipe down to refresh</string>
|
||||
<string name="balance_validator_second_line_verification_failed">Wallet verification failed. Tap again.</string>
|
||||
<string name="balance_validator_second_line_failed_attestation">Tangem Attestation service says the banknote is not genuine.</string>
|
||||
<string name="balance_validator_second_line_failed_attestation">Tangem Attestation service says the card is not genuine.</string>
|
||||
<string name="balance_validator_second_line_failed_binary_code_verification">Firmware binary code verification failed</string>
|
||||
<string name="balance_validator_second_line_disable_pin_2">Ask the holder to disable PIN2 before accepting</string>
|
||||
<string name="balance_validator_second_line_identity_not_verified">Card identity was not verified. Cannot reach Tangem attestation service.</string>
|
||||
|
|
@ -147,7 +149,7 @@
|
|||
<string name="balance_validator_second_line_authenticity_not_verified">Authenticity cannot be verified. Swipe down to refresh.</string>
|
||||
|
||||
<!-- CreateNewWallet, Purge, SignTransaction -->
|
||||
<string name="now_touch_the_banknote_with_id">Now touch the banknote with ID</string>
|
||||
<string name="now_touch_the_card_with_id">Now touch the card with ID</string>
|
||||
<string name="to_create_the_wallet">to create the wallet</string>
|
||||
<string name="to_erase_the_wallet">to erase the wallet</string>
|
||||
<string name="to_sign_the_transaction">to sign the payment</string>
|
||||
|
|
@ -232,7 +234,7 @@
|
|||
<string name="details_none">None</string>
|
||||
<string name="details_last_one">Last one!</string>
|
||||
<string name="details_unlimited">Unlimited</string>
|
||||
<string name="details_one_off_banknote">One-off banknote</string>
|
||||
<string name="details_one_off_card">One-off card</string>
|
||||
<string name="details_firmware">Firmware</string>
|
||||
<string name="details_registration_date">Registration date</string>
|
||||
<string name="details_possession_proved">Possession proved</string>
|
||||
|
|
@ -242,12 +244,12 @@
|
|||
<string name="details_private_key">Private key</string>
|
||||
<string name="details_validation_node">Validation node</string>
|
||||
<string name="details_unspents">Unspents</string>
|
||||
<string name="details_protected_by_default_pin_1">This banknote is protected by default PIN1 code</string>
|
||||
<string name="details_protected_by_user_pin_1">This banknote is protected by user\'s PIN1 code</string>
|
||||
<string name="details_protected_by_default_pin_2">This banknote is protected by default PIN2 code</string>
|
||||
<string name="details_protected_by_user_pin_2">This banknote is protected by user\'s PIN2 code</string>
|
||||
<string name="details_unlocked_banknote">Unlocked banknote, only for development use</string>
|
||||
<string name="details_security_delay">This banknote will enforce %.0f seconds security delay for all operations requiring PIN2 code</string>
|
||||
<string name="details_protected_by_default_pin_1">This card is protected by default PIN1 code</string>
|
||||
<string name="details_protected_by_user_pin_1">This card is protected by user\'s PIN1 code</string>
|
||||
<string name="details_protected_by_default_pin_2">This card is protected by default PIN2 code</string>
|
||||
<string name="details_protected_by_user_pin_2">This card is protected by user\'s PIN2 code</string>
|
||||
<string name="details_unlocked_card">Unlocked card, only for development use</string>
|
||||
<string name="details_security_delay">This card will enforce %.0f seconds security delay for all operations requiring PIN2 code</string>
|
||||
<string name="details_both_pins_can_be_changed">Allows to change PIN1 and PIN2\n</string>
|
||||
<string name="details_pin1_can_be_changed">Allows to change PIN1\n</string>
|
||||
<string name="details_pin2_can_be_changed">Allows to change PIN2\n</string>
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="@font/maax"
|
||||
android:text="@string/general_from_banknote"
|
||||
android:text="@string/general_from_card"
|
||||
android:textColor="@color/primary"
|
||||
android:textSize="@dimen/text_size_medium" />
|
||||
|
||||
|
|
@ -168,7 +168,9 @@
|
|||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintWidth_min="150dp"
|
||||
tools:text="1.34343434343443434343434" />
|
||||
android:enabled="false"
|
||||
android:textColor="@color/black"
|
||||
tools:text="1.34343434343443434343434"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvCurrency"
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
android:layout_marginStart="7dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:fontFamily="@font/maax"
|
||||
android:text="@string/general_from_banknote"
|
||||
android:text="@string/general_from_card"
|
||||
android:textColor="@color/primary"
|
||||
android:textSize="@dimen/text_size_medium" />
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="@font/maax"
|
||||
android:text="@string/now_touch_the_banknote_with_id"
|
||||
android:text="@string/now_touch_the_card_with_id"
|
||||
android:textAlignment="center"
|
||||
android:textSize="@dimen/text_size_medium" />
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<string name="app_name" translatable="false">Tangem Access</string>
|
||||
<string name="app_name" translatable="false">Tangem</string>
|
||||
|
||||
</resources>
|
||||
|
|
@ -5,6 +5,6 @@
|
|||
|
||||
<string name="verify">Confirm</string>
|
||||
<string name="send_1">Checkout</string>
|
||||
<string name="now_touch_the_banknote_with_id">Now touch the banknote</string>
|
||||
<string name="now_touch_the_banknote_with_id">Now touch the card</string>
|
||||
|
||||
</resources>
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
buildscript {
|
||||
ext.kotlin_version = '1.3.50'
|
||||
ext.kotlin_version = '1.3.60'
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
maven { url 'https://maven.fabric.io/public' }
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.5.1'
|
||||
classpath 'com.android.tools.build:gradle:3.5.2'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
|
||||
classpath 'io.fabric.tools:gradle:1.31.0'
|
||||
|
|
@ -23,4 +23,4 @@ allprojects {
|
|||
|
||||
task clean(type: Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ android {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(':tangem-card')
|
||||
implementation project(':tangem-card-old')
|
||||
// implementation 'com.github.TangemCash.card_android-common:card_android-android:0.1.0'
|
||||
|
||||
implementation 'androidx.appcompat:appcompat:1.1.0'
|
||||
|
|
|
|||
|
|
@ -158,13 +158,13 @@ class LocalStorage
|
|||
|
||||
@SuppressLint("ResourceType")
|
||||
private fun putResourceArtworkToCatalog(resourceId: Int, forceSave: Boolean) {
|
||||
context.resources.openRawResource(R.drawable.card_default).use { putArtworkToCatalog(context.resources.getResourceEntryName(resourceId), true, it.readBytes(), null, forceSave) }
|
||||
context.resources.openRawResource(resourceId).use {
|
||||
putArtworkToCatalog(context.resources.getResourceEntryName(resourceId), true, it.readBytes(), null, forceSave)
|
||||
}
|
||||
}
|
||||
|
||||
private fun putArtworkToCatalog(artworkId: String, isResource: Boolean, data: ByteArray, updateDate: Date?, forceSave: Boolean = true) {
|
||||
val artworkInfo = ArtworkInfo(
|
||||
isResource, Util.bytesToHex(Util.calculateSHA256(data)), updateDate
|
||||
)
|
||||
val artworkInfo = ArtworkInfo(isResource, calculateImageHash(data), updateDate)
|
||||
artworks[artworkId.toLowerCase()] = artworkInfo
|
||||
if (forceSave) {
|
||||
val sArtworks = Gson().toJson(artworks)
|
||||
|
|
@ -172,6 +172,12 @@ class LocalStorage
|
|||
}
|
||||
}
|
||||
|
||||
private fun calculateImageHash(data: ByteArray): String {
|
||||
val encodedData = Util.bytesToHex(data).toUpperCase(Locale.US).toByteArray()
|
||||
val hash = Util.calculateSHA256(encodedData)
|
||||
return Util.bytesToHex(hash).toUpperCase(Locale.US)
|
||||
}
|
||||
|
||||
private fun getArtworkBitmap(artworkId: String): Bitmap? {
|
||||
if (artworkId.isBlank()) return null
|
||||
val info = artworks[artworkId.toLowerCase()] ?: return null
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 237 KiB After Width: | Height: | Size: 77 KiB |
|
|
@ -1 +1 @@
|
|||
include ':app', ':tangem-sdk', ':server-android', ':tangem-card'
|
||||
include ':app', ':tangem-sdk-old', ':server-android', ':tangem-card-old', ':tangem-core', ':tangem-sdk', ':tangem-demo'
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue