Updated on 2026-08-14
This commit is contained in:
commit
e4583131c2
328 changed files with 4656 additions and 139 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" />
|
||||
|
|
|
|||
|
|
@ -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,31 @@ 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) }
|
||||
|
||||
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?) {
|
||||
|
|
|
|||
|
|
@ -283,7 +283,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 +397,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
|
||||
|
||||
|
|
|
|||
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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
@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;
|
||||
|
|
|
|||
|
|
@ -317,7 +317,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());
|
||||
|
|
|
|||
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"
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
<ImageView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="30dp"
|
||||
android:layout_height="60dp"
|
||||
app:srcCompat="@drawable/tangem_logo_full_new" />
|
||||
|
||||
<include layout="@layout/layout_touch_card" />
|
||||
|
|
@ -26,7 +26,7 @@
|
|||
<TextView
|
||||
android:id="@+id/tvNFCHint"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="200dp"
|
||||
android:layout_height="150dp"
|
||||
android:layout_marginTop="12dp"
|
||||
android:fontFamily="@font/maax"
|
||||
android:gravity="center"
|
||||
|
|
@ -43,6 +43,40 @@
|
|||
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_marginBottom="80dp"
|
||||
android:gravity="center"
|
||||
android:layout_gravity="bottom"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<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>
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
|
|
@ -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" />
|
||||
|
||||
|
|
|
|||
|
|
@ -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,5 +1,5 @@
|
|||
buildscript {
|
||||
ext.kotlin_version = '1.3.50'
|
||||
ext.kotlin_version = '1.3.60'
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
|
|
@ -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