Updated on 2026-08-14

This commit is contained in:
Tangem 2019-12-06 10:47:45 +03:00
commit d4bd32d138
343 changed files with 4762 additions and 242 deletions

7
.idea/gradle.xml generated
View file

@ -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" />

View file

@ -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'

View file

@ -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" />

View file

@ -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);

View file

@ -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?) {

View file

@ -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

View file

@ -293,9 +293,7 @@ class LoadedWalletFragment : BaseFragment(), NavigationResultListener, NfcAdapte
}
}
serverApiTangem.setArtworkListener(artworkListener)
refresh()
startVerify(lastTag)
}

View 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)

View file

@ -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);

View file

@ -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

View file

@ -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

View file

@ -117,6 +117,7 @@ public class BtcData extends CoinData {
balanceConfirmed = null;
balanceUnconfirmed = null;
unspentTransactions = null;
hasUnconfirmed = false;
}
public CoinEngine.InternalAmount getBalanceInInternalUnits() {

View file

@ -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;

View file

@ -85,7 +85,7 @@ public class CardanoEngine extends CoinEngine {
@Override
public boolean awaitingConfirmation() {
return false;
return App.pendingTransactionsStorage.hasTransactions(ctx.getCard());
}
@Override

View file

@ -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

View file

@ -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());

View file

@ -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

View file

@ -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

View file

@ -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());
}

View file

@ -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

View file

@ -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());

View file

@ -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());
}

View 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>

View file

@ -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"

View file

@ -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"

View file

@ -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" />

View 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>

View file

@ -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" />

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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" />

View file

@ -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>

View file

@ -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" />

View file

@ -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 lutilisateur</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 lutilisateur</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 lutilisateur</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 lutilisateur</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>

View file

@ -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>

View file

@ -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>

View file

@ -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"

View file

@ -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" />

View file

@ -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" />

View file

@ -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>

View file

@ -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>

View file

@ -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
}
}

View file

@ -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'

View file

@ -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

Before After
Before After

View file

@ -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