Updated on 2026-08-14

This commit is contained in:
Tangem 2018-05-29 13:28:36 +03:00
parent 0374157cad
commit 8c17a8d4f0
48 changed files with 3490 additions and 3417 deletions

1
.gitignore vendored
View file

@ -10,3 +10,4 @@
.externalNativeBuild .externalNativeBuild
app/libs/ app/libs/
.idea/vcs.xml .idea/vcs.xml
.idea/caches

Binary file not shown.

View file

@ -1,24 +1,22 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tangem.wallet" package="com.tangem.wallet">
android:versionCode="0"
android:versionName="0">
<uses-feature <uses-feature
android:name="android.hardware.nfc" android:name="android.hardware.nfc"
android:required="true" /> android:required="true"/>
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.NFC" /> <uses-permission android:name="android.permission.NFC"/>
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.USE_FINGERPRINT" /> <uses-permission android:name="android.permission.USE_FINGERPRINT"/>
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA"/>
<!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />-->
<uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus" /> <uses-feature android:name="android.hardware.camera.autofocus"/>
<application <application
android:name="com.tangem.AppController"
android:allowBackup="true" android:allowBackup="true"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
@ -31,106 +29,121 @@
android:authorities="com.tangem.wallet.LogFileProvider" android:authorities="com.tangem.wallet.LogFileProvider"
android:enabled="true" android:enabled="true"
android:exported="false" android:exported="false"
android:grantUriPermissions="true" /> android:grantUriPermissions="true"/>
<activity <activity
android:name=".LogoActivity" android:name="com.tangem.presentation.activity.LogoActivity"
android:label="@string/title_activity_main" android:label="@string/title_activity_main"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar"> android:theme="@style/AppTheme.NoActionBar">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".RequestPINActivity" android:name="com.tangem.presentation.activity.MainActivity"
android:label="@string/title_activity_main" android:label="@string/title_activity_main"
android:launchMode="singleTask"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar"> android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity
android:name=".EmptyWalletActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".SelectBlockchainActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".SavePINActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar"
android:launchMode="singleTask">
<intent-filter> <intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" /> <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
<data <data
android:host="www.tangem.com" android:host="www.tangem.com"
android:scheme="http" /> android:scheme="http"/>
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" /> <action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter> </intent-filter>
<meta-data <meta-data
android:name="android.nfc.action.TECH_DISCOVERED" android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" /> android:resource="@xml/nfc_tech_filter"/>
</activity> </activity>
<activity <activity
android:name=".CardInfoActivity" android:name="com.tangem.presentation.activity.RequestPINActivity"
android:label="@string/title_activity_card_info"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".LoadedWalletActivity"
android:label="@string/title_activity_loaded_wallet"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".VerifyCardActivity"
android:label="@string/title_activity_loaded_wallet"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".CreateNewWalletActivity"
android:label="@string/title_activity_main" android:label="@string/title_activity_main"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" /> android:theme="@style/AppTheme.NoActionBar"/>
<activity <activity
android:name=".PreparePaymentActivity" android:name="com.tangem.presentation.activity.EmptyWalletActivity"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" /> android:theme="@style/AppTheme.NoActionBar"/>
<activity <activity
android:name=".ConfirmPaymentActivity" android:name="com.tangem.presentation.activity.SelectBlockchainActivity"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" /> android:theme="@style/AppTheme.NoActionBar"/>
<activity <activity
android:name=".SignPaymentActivity" android:name="com.tangem.presentation.activity.SavePINActivity"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" /> android:theme="@style/AppTheme.NoActionBar"/>
<activity <activity
android:name=".PurgeActivity" android:name="com.tangem.presentation.activity.CardInfoActivity"
android:label="@string/title_activity_card_info"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" /> android:theme="@style/AppTheme.NoActionBar"/>
<activity <activity
android:name=".SwapPINActivity" android:name="com.tangem.presentation.activity.LoadedWalletActivity"
android:label="@string/title_activity_loaded_wallet"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" /> android:theme="@style/AppTheme.NoActionBar"/>
<activity <activity
android:name=".QRScanActivity" android:name="com.tangem.presentation.activity.VerifyCardActivity"
android:label="@string/title_activity_loaded_wallet"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" /> android:theme="@style/AppTheme.NoActionBar"/>
<activity <activity
android:name=".SendTransactionActivity" android:name="com.tangem.presentation.activity.CreateNewWalletActivity"
android:label="@string/title_activity_main"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" /> android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name="com.tangem.presentation.activity.PreparePaymentActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name="com.tangem.presentation.activity.ConfirmPaymentActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name="com.tangem.presentation.activity.SignPaymentActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name="com.tangem.presentation.activity.PurgeActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name="com.tangem.presentation.activity.SwapPINActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name="com.tangem.presentation.activity.QRScanActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name="com.tangem.presentation.activity.SendTransactionActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar"/>
</application> </application>
</manifest> </manifest>

View file

@ -0,0 +1,4 @@
package com.tangem.domain;
public class Logic {
}

View file

@ -0,0 +1,4 @@
package com.tangem.presentation;
public class Screen {
}

View file

@ -1,4 +1,4 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.os.Bundle; import android.os.Bundle;
import android.support.design.widget.TabLayout; import android.support.design.widget.TabLayout;
@ -10,6 +10,10 @@ import android.support.v7.app.AppCompatActivity;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import com.tangem.wallet.R;
import com.tangem.wallet.Tangem_Card;
import com.tangem.wallet.WalletInfoFragment;
public class CardInfoActivity extends AppCompatActivity implements WalletInfoFragment.OnFragmentInteractionListener { public class CardInfoActivity extends AppCompatActivity implements WalletInfoFragment.OnFragmentInteractionListener {
/** /**

View file

@ -1,14 +1,11 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.nfc.NfcAdapter; import android.nfc.NfcAdapter;
import android.nfc.Tag; import android.nfc.Tag;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.text.Editable; import android.text.Editable;
import android.text.Html; import android.text.Html;
@ -27,6 +24,23 @@ import android.widget.Toast;
import com.tangem.cardReader.NfcManager; import com.tangem.cardReader.NfcManager;
import com.tangem.cardReader.Util; import com.tangem.cardReader.Util;
import com.tangem.wallet.BTCUtils;
import com.tangem.wallet.Blockchain;
import com.tangem.wallet.CoinEngine;
import com.tangem.wallet.CoinEngineFactory;
import com.tangem.wallet.DerEncodingUtil;
import com.tangem.wallet.Electrum_Request;
import com.tangem.wallet.Electrum_Task;
import com.tangem.wallet.Fee_Request;
import com.tangem.wallet.Fee_Task;
import com.tangem.wallet.FormatUtil;
import com.tangem.wallet.Infura_Request;
import com.tangem.wallet.Infura_Task;
import com.tangem.wallet.R;
import com.tangem.wallet.SharedData;
import com.tangem.wallet.Tangem_Card;
import com.tangem.wallet.Transaction;
import com.tangem.wallet.UnspentOutputInfo;
import org.json.JSONException; import org.json.JSONException;
@ -59,7 +73,7 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
int requestPIN2Count = 0; int requestPIN2Count = 0;
ProgressBar progressBar; ProgressBar progressBar;
boolean nodeCheck = false; boolean nodeCheck = false;
Date dtVerifyed=null; Date dtVerifyed = null;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -189,10 +203,10 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
@Override @Override
public void onClick(View v) { public void onClick(View v) {
Calendar calendar=Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE,-1); calendar.add(Calendar.MINUTE, -1);
if( dtVerifyed==null || dtVerifyed.before(calendar.getTime()) ) { if (dtVerifyed == null || dtVerifyed.before(calendar.getTime())) {
FinishActivityWithError(Activity.RESULT_CANCELED, "The obtained data is outdated! Try again"); FinishActivityWithError(Activity.RESULT_CANCELED, "The obtained data is outdated! Try again");
return; return;
} }
@ -213,14 +227,13 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
} else if (!engineCoin.IsBalanceNotZero(mCard)) { } else if (!engineCoin.IsBalanceNotZero(mCard)) {
FinishActivityWithError(Activity.RESULT_CANCELED, "The wallet is empty"); FinishActivityWithError(Activity.RESULT_CANCELED, "The wallet is empty");
return; return;
} else if(!engineCoin.CheckUnspentTransaction(mCard)) { } else if (!engineCoin.CheckUnspentTransaction(mCard)) {
//else if (mCard.getUnspentTransactions().size() == 0 && mCard.getBlockchain() != Blockchain.Ethereum) { //else if (mCard.getUnspentTransactions().size() == 0 && mCard.getBlockchain() != Blockchain.Ethereum) {
FinishActivityWithError(Activity.RESULT_CANCELED, "Please wait for confirmation of incoming transaction"); FinishActivityWithError(Activity.RESULT_CANCELED, "Please wait for confirmation of incoming transaction");
return; return;
} }
if(!engineCoin.CheckAmountValie(mCard, txAmount, txFee, minFeeInInternalUnits)) if (!engineCoin.CheckAmountValie(mCard, txAmount, txFee, minFeeInInternalUnits)) {
{
FinishActivityWithError(Activity.RESULT_CANCELED, "Fee exceeds payment amount. Enter correct value and repeat sending."); FinishActivityWithError(Activity.RESULT_CANCELED, "Fee exceeds payment amount. Enter correct value and repeat sending.");
return; return;
} }
@ -249,7 +262,7 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
CoinEngine engineCoin = CoinEngineFactory.Create(mCard.getBlockchain()); CoinEngine engineCoin = CoinEngineFactory.Create(mCard.getBlockchain());
for(int i =0 ; i < data.allRequest; ++i) { for (int i = 0; i < data.allRequest; ++i) {
String nodeAddress = engineCoin.GetNextNode(mCard); String nodeAddress = engineCoin.GetNextNode(mCard);
int nodePort = engineCoin.GetNextNodePort(mCard); int nodePort = engineCoin.GetNextNodePort(mCard);
@ -257,7 +270,7 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
ConnectTask connectTaskEx = new ConnectTask(nodeAddress, nodePort, data); ConnectTask connectTaskEx = new ConnectTask(nodeAddress, nodePort, data);
//connectTaskEx.execute(Electrum_Request.CheckBalance(mCard.getWallet())); //connectTaskEx.execute(Electrum_Request.CheckBalance(mCard.getWallet()));
connectTaskEx.executeOnExecutor( AsyncTask.THREAD_POOL_EXECUTOR,Electrum_Request.CheckBalance(mCard.getWallet())); connectTaskEx.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, Electrum_Request.CheckBalance(mCard.getWallet()));
} }
String nodeAddress = engineCoin.GetNode(mCard); String nodeAddress = engineCoin.GetNode(mCard);
@ -278,8 +291,7 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
SharedData sharedFee = new SharedData(SharedData.COUNT_REQUEST); SharedData sharedFee = new SharedData(SharedData.COUNT_REQUEST);
progressBar.setVisibility(View.VISIBLE); progressBar.setVisibility(View.VISIBLE);
for(int i = 0; i < SharedData.COUNT_REQUEST; ++i) for (int i = 0; i < SharedData.COUNT_REQUEST; ++i) {
{
ConnectFeeTask feeTask = new ConnectFeeTask(sharedFee); ConnectFeeTask feeTask = new ConnectFeeTask(sharedFee);
@ -310,9 +322,9 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_SIGN_PAYMENT) { if (requestCode == REQUEST_CODE_SIGN_PAYMENT) {
if (data != null && data.getExtras().containsKey("UID") && data.getExtras().containsKey("Card")) { if (data != null && data.getExtras().containsKey("UID") && data.getExtras().containsKey("Card")) {
Tangem_Card updatedCard=new Tangem_Card(data.getStringExtra("UID")); Tangem_Card updatedCard = new Tangem_Card(data.getStringExtra("UID"));
updatedCard.LoadFromBundle(data.getBundleExtra("Card")); updatedCard.LoadFromBundle(data.getBundleExtra("Card"));
mCard=updatedCard; mCard = updatedCard;
} }
if (resultCode == SignPaymentActivity.RESULT_INVALID_PIN && requestPIN2Count < 2) { if (resultCode == SignPaymentActivity.RESULT_INVALID_PIN && requestPIN2Count < 2) {
requestPIN2Count++; requestPIN2Count++;
@ -433,6 +445,7 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
public ConnectTask(String host, int port, SharedData sharedData) { public ConnectTask(String host, int port, SharedData sharedData) {
super(host, port, sharedData); super(host, port, sharedData);
} }
@Override @Override
protected void onProgressUpdate(Integer... values) { protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values); super.onProgressUpdate(values);
@ -453,30 +466,26 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
etFee.setError("Not enough funds"); etFee.setError("Not enough funds");
balanceRequestSuccess = false; balanceRequestSuccess = false;
btnSend.setVisibility(View.INVISIBLE); btnSend.setVisibility(View.INVISIBLE);
dtVerifyed=null; dtVerifyed = null;
nodeCheck = false; nodeCheck = false;
} else { } else {
etFee.setError(null); etFee.setError(null);
balanceRequestSuccess = true; balanceRequestSuccess = true;
if(feeRequestSuccess && balanceRequestSuccess) { if (feeRequestSuccess && balanceRequestSuccess) {
btnSend.setVisibility(View.VISIBLE); btnSend.setVisibility(View.VISIBLE);
} }
dtVerifyed=new Date(); dtVerifyed = new Date();
nodeCheck = true; nodeCheck = true;
} }
} catch (JSONException e) { } catch (JSONException e) {
if(sharedCounter != null) if (sharedCounter != null) {
{
int errCounter = sharedCounter.errorRequest.incrementAndGet(); int errCounter = sharedCounter.errorRequest.incrementAndGet();
if(errCounter >= sharedCounter.allRequest) if (errCounter >= sharedCounter.allRequest) {
{
e.printStackTrace(); e.printStackTrace();
FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot check balance! No connection with blockchain nodes"); FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot check balance! No connection with blockchain nodes");
} }
} } else {
else
{
e.printStackTrace(); e.printStackTrace();
FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot check balance! No connection with blockchain nodes"); FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot check balance! No connection with blockchain nodes");
} }
@ -489,33 +498,25 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
} else { } else {
// etFee.setError(request.error); // etFee.setError(request.error);
// btnSend.setVisibility(View.INVISIBLE); // btnSend.setVisibility(View.INVISIBLE);
if(sharedCounter != null) if (sharedCounter != null) {
{
int errCounter = sharedCounter.errorRequest.incrementAndGet(); int errCounter = sharedCounter.errorRequest.incrementAndGet();
if(errCounter >= sharedCounter.allRequest) if (errCounter >= sharedCounter.allRequest) {
{
FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes"); FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
} }
} } else {
else
{
FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes"); FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
} }
return; return;
} }
} catch (JSONException e) { } catch (JSONException e) {
if(sharedCounter != null) if (sharedCounter != null) {
{
int errCounter = sharedCounter.errorRequest.incrementAndGet(); int errCounter = sharedCounter.errorRequest.incrementAndGet();
if(errCounter >= sharedCounter.allRequest) if (errCounter >= sharedCounter.allRequest) {
{
e.printStackTrace(); e.printStackTrace();
FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes"); FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
} }
} } else {
else
{
e.printStackTrace(); e.printStackTrace();
FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes"); FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
} }
@ -526,9 +527,10 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
} }
private class ETHRequestTask extends Infura_Task { private class ETHRequestTask extends Infura_Task {
ETHRequestTask(Blockchain blockchain){ ETHRequestTask(Blockchain blockchain) {
super(blockchain); super(blockchain);
} }
@Override @Override
protected void onPostExecute(List<Infura_Request> requests) { protected void onPostExecute(List<Infura_Request> requests) {
super.onPostExecute(requests); super.onPostExecute(requests);
@ -547,16 +549,16 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
l = l.multiply(m); l = l.multiply(m);
String feeInGwei = mCard.getAmountInGwei(String.valueOf(l)); String feeInGwei = mCard.getAmountInGwei(String.valueOf(l));
minFee=feeInGwei; minFee = feeInGwei;
maxFee=feeInGwei; maxFee = feeInGwei;
normalFee=feeInGwei; normalFee = feeInGwei;
etFee.setText(feeInGwei); etFee.setText(feeInGwei);
etFee.setError(null); etFee.setError(null);
btnSend.setVisibility(View.VISIBLE); btnSend.setVisibility(View.VISIBLE);
feeRequestSuccess = true; feeRequestSuccess = true;
balanceRequestSuccess = true; balanceRequestSuccess = true;
dtVerifyed=new Date(); dtVerifyed = new Date();
minFeeInInternalUnits = mCard.InternalUnitsFromString(feeInGwei); minFeeInInternalUnits = mCard.InternalUnitsFromString(feeInGwei);
} catch (JSONException e) { } catch (JSONException e) {
@ -579,6 +581,7 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
public ConnectFeeTask(SharedData sharedData) { public ConnectFeeTask(SharedData sharedData) {
super(sharedData); super(sharedData);
} }
@Override @Override
protected void onPostExecute(List<Fee_Request> requests) { protected void onPostExecute(List<Fee_Request> requests) {
super.onPostExecute(requests); super.onPostExecute(requests);
@ -597,19 +600,15 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
minFeeRate = minFeeBI.longValue(); minFeeRate = minFeeBI.longValue();
} catch (Exception e) { } catch (Exception e) {
if(sharedCounter != null) if (sharedCounter != null) {
{
int errCounter = sharedCounter.errorRequest.incrementAndGet(); int errCounter = sharedCounter.errorRequest.incrementAndGet();
if(errCounter >= sharedCounter.allRequest) if (errCounter >= sharedCounter.allRequest) {
{
progressBar.setVisibility(View.INVISIBLE); progressBar.setVisibility(View.INVISIBLE);
FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes"); FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
} }
} } else {
else
{
progressBar.setVisibility(View.INVISIBLE); progressBar.setVisibility(View.INVISIBLE);
FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes"); FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
} }
@ -633,17 +632,13 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
if(sharedCounter != null) if (sharedCounter != null) {
{
int errCounter = sharedCounter.errorRequest.incrementAndGet(); int errCounter = sharedCounter.errorRequest.incrementAndGet();
if(errCounter >= sharedCounter.allRequest) if (errCounter >= sharedCounter.allRequest) {
{
progressBar.setVisibility(View.INVISIBLE); progressBar.setVisibility(View.INVISIBLE);
FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes"); FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
} }
} } else {
else
{
progressBar.setVisibility(View.INVISIBLE); progressBar.setVisibility(View.INVISIBLE);
FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes"); FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
} }
@ -669,24 +664,20 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
etFee.setError(null); etFee.setError(null);
feeRequestSuccess = true; feeRequestSuccess = true;
if(feeRequestSuccess && balanceRequestSuccess) { if (feeRequestSuccess && balanceRequestSuccess) {
btnSend.setVisibility(View.VISIBLE); btnSend.setVisibility(View.VISIBLE);
} }
dtVerifyed=new Date(); dtVerifyed = new Date();
} else { } else {
if(sharedCounter != null) if (sharedCounter != null) {
{
int errCounter = sharedCounter.errorRequest.incrementAndGet(); int errCounter = sharedCounter.errorRequest.incrementAndGet();
if(errCounter >= sharedCounter.allRequest) if (errCounter >= sharedCounter.allRequest) {
{
progressBar.setVisibility(View.INVISIBLE); progressBar.setVisibility(View.INVISIBLE);
FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes"); FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
} }
} } else {
else
{
progressBar.setVisibility(View.INVISIBLE); progressBar.setVisibility(View.INVISIBLE);
FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes"); FinishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
} }

View file

@ -1,4 +1,4 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
@ -18,6 +18,11 @@ import android.widget.Toast;
import com.tangem.cardReader.CardProtocol; import com.tangem.cardReader.CardProtocol;
import com.tangem.cardReader.NfcManager; import com.tangem.cardReader.NfcManager;
import com.tangem.cardReader.Util; import com.tangem.cardReader.Util;
import com.tangem.wallet.NoExtendedLengthSupportDialog;
import com.tangem.wallet.PINStorage;
import com.tangem.wallet.R;
import com.tangem.wallet.Tangem_Card;
import com.tangem.wallet.WaitSecurityDelayDialog;
public class CreateNewWalletActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback, CardProtocol.Notifications { public class CreateNewWalletActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback, CardProtocol.Notifications {
@ -78,7 +83,6 @@ public class CreateNewWalletActivity extends AppCompatActivity implements NfcAda
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@Override @Override

View file

@ -1,4 +1,4 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
@ -20,6 +20,11 @@ import android.widget.Toast;
import com.tangem.cardReader.CardProtocol; import com.tangem.cardReader.CardProtocol;
import com.tangem.cardReader.NfcManager; import com.tangem.cardReader.NfcManager;
import com.tangem.cardReader.Util; import com.tangem.cardReader.Util;
import com.tangem.wallet.NoExtendedLengthSupportDialog;
import com.tangem.wallet.R;
import com.tangem.wallet.Tangem_Card;
import com.tangem.wallet.VerifyCardTask;
import com.tangem.wallet.WaitSecurityDelayDialog;
public class EmptyWalletActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback, CardProtocol.Notifications { public class EmptyWalletActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback, CardProtocol.Notifications {

View file

@ -1,4 +1,4 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
@ -7,6 +7,9 @@ import android.nfc.Tag;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import com.tangem.wallet.LoadedWalletActivityFragment;
import com.tangem.wallet.R;
public class LoadedWalletActivity extends AppCompatActivity { public class LoadedWalletActivity extends AppCompatActivity {

View file

@ -1,4 +1,4 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
@ -7,6 +7,9 @@ import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.tangem.wallet.BuildConfig;
import com.tangem.wallet.R;
/** /**
* An example full-screen activity that shows and hides the system UI (i.e. * An example full-screen activity that shows and hides the system UI (i.e.
* status bar and navigation/system bar) with user interaction. * status bar and navigation/system bar) with user interaction.

View file

@ -1,4 +1,4 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
@ -30,6 +30,15 @@ import android.widget.TextView;
import com.scottyab.rootbeer.RootBeer; import com.scottyab.rootbeer.RootBeer;
import com.skyfishjy.library.RippleBackground; import com.skyfishjy.library.RippleBackground;
import com.tangem.wallet.BuildConfig;
import com.tangem.wallet.DeviceNFCAntennaLocation;
import com.tangem.wallet.LastSignStorage;
import com.tangem.wallet.LogFileProvider;
import com.tangem.wallet.Logger;
import com.tangem.wallet.MainActivityFragment;
import com.tangem.wallet.PINStorage;
import com.tangem.wallet.PhoneUtility;
import com.tangem.wallet.R;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.BufferedOutputStream; import java.io.BufferedOutputStream;

View file

@ -1,4 +1,4 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
@ -18,10 +18,15 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.tangem.cardReader.NfcManager; import com.tangem.cardReader.NfcManager;
import com.tangem.wallet.Blockchain;
import com.tangem.wallet.CoinEngine;
import com.tangem.wallet.CoinEngineFactory;
import com.tangem.wallet.FormatUtil;
import com.tangem.wallet.R;
import com.tangem.wallet.Tangem_Card;
import java.io.IOException; import java.io.IOException;
public class PreparePaymentActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback { public class PreparePaymentActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback {
private static final int REQUEST_CODE_SCAN_QR = 1; private static final int REQUEST_CODE_SCAN_QR = 1;
@ -70,15 +75,13 @@ public class PreparePaymentActivity extends AppCompatActivity implements NfcAdap
tvBalanceEquivalent.setText(engine.GetBalanceEquivalent(mCard)); tvBalanceEquivalent.setText(engine.GetBalanceEquivalent(mCard));
if(etAmount != null && mCard.getRemainingSignatures()<2) if (etAmount != null && mCard.getRemainingSignatures() < 2) {
{
etAmount.setEnabled(false); etAmount.setEnabled(false);
} }
if( !mCard.getAmountEquivalentDescriptionAvailable()) if (!mCard.getAmountEquivalentDescriptionAvailable()) {
{
tvBalanceEquivalent.setError("Service unavailable"); tvBalanceEquivalent.setError("Service unavailable");
}else{ } else {
tvBalanceEquivalent.setError(null); tvBalanceEquivalent.setError(null);
} }
@ -95,7 +98,7 @@ public class PreparePaymentActivity extends AppCompatActivity implements NfcAdap
tvAmountEquivalent.setText(engine.GetAmountEqualentDescriptor(mCard, etAmount.getText().toString())); tvAmountEquivalent.setText(engine.GetAmountEqualentDescriptor(mCard, etAmount.getText().toString()));
if (!mCard.getAmountEquivalentDescriptionAvailable()) { if (!mCard.getAmountEquivalentDescriptionAvailable()) {
tvAmountEquivalent.setError("Service unavailable"); tvAmountEquivalent.setError("Service unavailable");
}else{ } else {
tvAmountEquivalent.setError(null); tvAmountEquivalent.setError(null);
} }
} catch (Exception e) { } catch (Exception e) {
@ -110,32 +113,25 @@ public class PreparePaymentActivity extends AppCompatActivity implements NfcAdap
} }
}); });
if(mCard.getBlockchain() == Blockchain.Ethereum || mCard.getBlockchain() == Blockchain.EthereumTestNet) if (mCard.getBlockchain() == Blockchain.Ethereum || mCard.getBlockchain() == Blockchain.EthereumTestNet) {
{
tvCurrency.setText(engine.GetBalanceCurrency(mCard)); tvCurrency.setText(engine.GetBalanceCurrency(mCard));
use_mCurrency=false; use_mCurrency = false;
etAmount.setText(engine.GetBalanceValue(mCard)); etAmount.setText(engine.GetBalanceValue(mCard));
} } else if (mCard.getBlockchain() == Blockchain.Bitcoin || mCard.getBlockchain() == Blockchain.BitcoinTestNet) {
else if(mCard.getBlockchain() == Blockchain.Bitcoin || mCard.getBlockchain() == Blockchain.BitcoinTestNet)
{
Double balance = engine.GetBalanceLong(mCard) / (mCard.getBlockchain().getMultiplier() / 1000.0); Double balance = engine.GetBalanceLong(mCard) / (mCard.getBlockchain().getMultiplier() / 1000.0);
tvCurrency.setText("m" + mCard.getBlockchain().getCurrency()); tvCurrency.setText("m" + mCard.getBlockchain().getCurrency());
use_mCurrency=true; use_mCurrency = true;
String output = FormatUtil.DoubleToString(balance); String output = FormatUtil.DoubleToString(balance);
etAmount.setText(output); etAmount.setText(output);
} } else if (mCard.getBlockchain() == Blockchain.BitcoinCash || mCard.getBlockchain() == Blockchain.BitcoinCashTestNet) {
else if(mCard.getBlockchain() == Blockchain.BitcoinCash || mCard.getBlockchain() == Blockchain.BitcoinCashTestNet)
{
Double balance = engine.GetBalanceLong(mCard) / (mCard.getBlockchain().getMultiplier() / 1000.0); Double balance = engine.GetBalanceLong(mCard) / (mCard.getBlockchain().getMultiplier() / 1000.0);
tvCurrency.setText("m" + mCard.getBlockchain().getCurrency()); tvCurrency.setText("m" + mCard.getBlockchain().getCurrency());
use_mCurrency=true; use_mCurrency = true;
String output = FormatUtil.DoubleToString(balance); String output = FormatUtil.DoubleToString(balance);
etAmount.setText(output); etAmount.setText(output);
} } else {
else
{
tvCurrency.setText(engine.GetBalanceCurrency(mCard)); tvCurrency.setText(engine.GetBalanceCurrency(mCard));
use_mCurrency=false; use_mCurrency = false;
etAmount.setText(engine.GetBalanceValue(mCard)); etAmount.setText(engine.GetBalanceValue(mCard));
} }
@ -143,29 +139,24 @@ public class PreparePaymentActivity extends AppCompatActivity implements NfcAdap
@Override @Override
public void onClick(View v) { public void onClick(View v) {
String strAmount; String strAmount;
strAmount=etAmount.getText().toString(); strAmount = etAmount.getText().toString();
CoinEngine engine = CoinEngineFactory.Create(mCard.getBlockchain()); CoinEngine engine = CoinEngineFactory.Create(mCard.getBlockchain());
try { try {
if(!engine.CheckAmount(mCard, etAmount.getText().toString())) if (!engine.CheckAmount(mCard, etAmount.getText().toString())) {
{
etAmount.setError("Not enough funds on your card"); etAmount.setError("Not enough funds on your card");
} }
} } catch (Exception e) {
catch(Exception e)
{
etAmount.setError("Unknown amount format"); etAmount.setError("Unknown amount format");
return; return;
} }
boolean checkAddress = engine.ValdateAddress(etWallet.getText().toString(), mCard); boolean checkAddress = engine.ValdateAddress(etWallet.getText().toString(), mCard);
if(!checkAddress) if (!checkAddress) {
{
etWallet.setError("Incorrect destination wallet address"); etWallet.setError("Incorrect destination wallet address");
return; return;
} }
if(etWallet.getText().toString().equals(mCard.getWallet())) if (etWallet.getText().toString().equals(mCard.getWallet())) {
{
etWallet.setError("Destination wallet address equal source address"); etWallet.setError("Destination wallet address equal source address");
return; return;
} }
@ -194,15 +185,14 @@ public class PreparePaymentActivity extends AppCompatActivity implements NfcAdap
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_SCAN_QR && resultCode == Activity.RESULT_OK && data != null && data.getExtras().containsKey("QRCode")) { if (requestCode == REQUEST_CODE_SCAN_QR && resultCode == Activity.RESULT_OK && data != null && data.getExtras().containsKey("QRCode")) {
String code = data.getStringExtra("QRCode"); String code = data.getStringExtra("QRCode");
if(code.contains("bitcoin:")) if (code.contains("bitcoin:")) {
{
String tmp[] = code.split("bitcoin:"); String tmp[] = code.split("bitcoin:");
code = tmp[1]; code = tmp[1];
} }
etWallet.setText(code); etWallet.setText(code);
}else if (requestCode == REQUEST_CODE_SEND_PAYMENT ) { } else if (requestCode == REQUEST_CODE_SEND_PAYMENT) {
setResult(resultCode,data); setResult(resultCode, data);
finish(); finish();
} }
} }
@ -210,7 +200,7 @@ public class PreparePaymentActivity extends AppCompatActivity implements NfcAdap
@Override @Override
public void onTagDiscovered(Tag tag) { public void onTagDiscovered(Tag tag) {
try { try {
Log.w(getClass().getName(),"Ignore discovered tag!"); Log.w(getClass().getName(), "Ignore discovered tag!");
mNfcManager.IgnoreTag(tag); mNfcManager.IgnoreTag(tag);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();

View file

@ -1,4 +1,4 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
@ -18,6 +18,11 @@ import android.widget.Toast;
import com.tangem.cardReader.CardProtocol; import com.tangem.cardReader.CardProtocol;
import com.tangem.cardReader.NfcManager; import com.tangem.cardReader.NfcManager;
import com.tangem.cardReader.Util; import com.tangem.cardReader.Util;
import com.tangem.wallet.NoExtendedLengthSupportDialog;
import com.tangem.wallet.PINStorage;
import com.tangem.wallet.R;
import com.tangem.wallet.Tangem_Card;
import com.tangem.wallet.WaitSecurityDelayDialog;
public class PurgeActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback, CardProtocol.Notifications { public class PurgeActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback, CardProtocol.Notifications {

View file

@ -1,4 +1,4 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.Manifest; import android.Manifest;
import android.app.Activity; import android.app.Activity;

View file

@ -1,4 +1,4 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.Manifest; import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
@ -27,6 +27,10 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.tangem.cardReader.NfcManager; import com.tangem.cardReader.NfcManager;
import com.tangem.wallet.FingerprintHelper;
import com.tangem.wallet.PINStorage;
import com.tangem.wallet.R;
import com.tangem.wallet.Tangem_Card;
import java.io.IOException; import java.io.IOException;
import java.security.KeyStore; import java.security.KeyStore;

View file

@ -1,4 +1,4 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.Manifest; import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
@ -23,6 +23,10 @@ import android.widget.CheckBox;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.tangem.wallet.FingerprintHelper;
import com.tangem.wallet.PINStorage;
import com.tangem.wallet.R;
import java.io.IOException; import java.io.IOException;
import java.security.KeyStore; import java.security.KeyStore;
import java.security.KeyStoreException; import java.security.KeyStoreException;

View file

@ -1,8 +1,10 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import com.tangem.wallet.R;
public class SelectBlockchainActivity extends AppCompatActivity { public class SelectBlockchainActivity extends AppCompatActivity {
@Override @Override

View file

@ -1,14 +1,25 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.content.Intent; import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log; import android.util.Log;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.Toast; import android.widget.Toast;
import com.tangem.wallet.Blockchain;
import com.tangem.wallet.CoinEngine;
import com.tangem.wallet.CoinEngineFactory;
import com.tangem.wallet.Electrum_Request;
import com.tangem.wallet.Electrum_Task;
import com.tangem.wallet.Infura_Request;
import com.tangem.wallet.Infura_Task;
import com.tangem.wallet.LastSignStorage;
import com.tangem.wallet.R;
import com.tangem.wallet.SharedData;
import com.tangem.wallet.Tangem_Card;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
@ -18,6 +18,11 @@ import android.widget.Toast;
import com.tangem.cardReader.CardProtocol; import com.tangem.cardReader.CardProtocol;
import com.tangem.cardReader.NfcManager; import com.tangem.cardReader.NfcManager;
import com.tangem.cardReader.Util; import com.tangem.cardReader.Util;
import com.tangem.wallet.NoExtendedLengthSupportDialog;
import com.tangem.wallet.PINStorage;
import com.tangem.wallet.R;
import com.tangem.wallet.Tangem_Card;
import com.tangem.wallet.WaitSecurityDelayDialog;
public class SwapPINActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback, CardProtocol.Notifications { public class SwapPINActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback, CardProtocol.Notifications {

View file

@ -1,10 +1,12 @@
package com.tangem.wallet; package com.tangem.presentation.activity;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import com.tangem.wallet.R;
import com.tangem.wallet.VerifyCardActivityFragment;
public class VerifyCardActivity extends AppCompatActivity { public class VerifyCardActivity extends AppCompatActivity {
@ -19,8 +21,8 @@ public class VerifyCardActivity extends AppCompatActivity {
@Override @Override
public void onBackPressed() { public void onBackPressed() {
//super.onBackPressed(); //super.onBackPressed();
VerifyCardActivityFragment verifyCardActivityFragment= (VerifyCardActivityFragment) getSupportFragmentManager().findFragmentById(R.id.verify_card_fragment); VerifyCardActivityFragment verifyCardActivityFragment = (VerifyCardActivityFragment) getSupportFragmentManager().findFragmentById(R.id.verify_card_fragment);
Intent data= verifyCardActivityFragment.prepareResultIntent(); Intent data = verifyCardActivityFragment.prepareResultIntent();
data.putExtra("modification", "update"); data.putExtra("modification", "update");
setResult(Activity.RESULT_OK, data); setResult(Activity.RESULT_OK, data);
finish(); finish();

View file

@ -27,7 +27,7 @@ public class Electrum_Task extends AsyncTask<Electrum_Request, Integer, List<Ele
OutputStreamWriter out; OutputStreamWriter out;
BufferedReader in; BufferedReader in;
SharedData sharedCounter = null; public SharedData sharedCounter = null;
public Electrum_Task(String host, int port) { public Electrum_Task(String host, int port) {

View file

@ -15,7 +15,7 @@ import java.util.List;
public class Fee_Task extends AsyncTask<Fee_Request, Void, List<Fee_Request>> { public class Fee_Task extends AsyncTask<Fee_Request, Void, List<Fee_Request>> {
SharedData sharedCounter = null; public SharedData sharedCounter = null;
public Fee_Task(SharedData sharedData) public Fee_Task(SharedData sharedData)
{ {

View file

@ -35,7 +35,7 @@ public class FingerprintHelper extends FingerprintManager.AuthenticationCallback
cancellationSignal.cancel(); cancellationSignal.cancel();
} }
interface FingerprintHelperListener { public interface FingerprintHelperListener {
public void authenticationFailed(String error); public void authenticationFailed(String error);
public void authenticationSucceeded(FingerprintManager.AuthenticationResult result); public void authenticationSucceeded(FingerprintManager.AuthenticationResult result);
} }

View file

@ -6,7 +6,6 @@ import android.preference.PreferenceManager;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.ArraySet; import android.util.ArraySet;
import java.lang.reflect.Array;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -24,7 +23,7 @@ public class LastSignStorage {
private static Map<String, String> txCol = new ArrayMap<>(); private static Map<String, String> txCol = new ArrayMap<>();
private static Map<String, String> txCompleteCol = new ArrayMap<>(); private static Map<String, String> txCompleteCol = new ArrayMap<>();
static void Init(Context context) { public static void Init(Context context) {
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
cards=sharedPreferences.getStringSet("LastSign_Cards", cards); cards=sharedPreferences.getStringSet("LastSign_Cards", cards);
for (int i = 0; i < cards.size(); i++) { for (int i = 0; i < cards.size(); i++) {

View file

@ -42,6 +42,12 @@ import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.tangem.cardReader.CardProtocol; import com.tangem.cardReader.CardProtocol;
import com.tangem.cardReader.NfcManager; import com.tangem.cardReader.NfcManager;
import com.tangem.cardReader.Util; import com.tangem.cardReader.Util;
import com.tangem.presentation.activity.CreateNewWalletActivity;
import com.tangem.presentation.activity.PreparePaymentActivity;
import com.tangem.presentation.activity.PurgeActivity;
import com.tangem.presentation.activity.RequestPINActivity;
import com.tangem.presentation.activity.SwapPINActivity;
import com.tangem.presentation.activity.VerifyCardActivity;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;

View file

@ -27,6 +27,10 @@ import android.widget.Toast;
import com.tangem.cardReader.CardProtocol; import com.tangem.cardReader.CardProtocol;
import com.tangem.cardReader.NfcManager; import com.tangem.cardReader.NfcManager;
import com.tangem.cardReader.Util; import com.tangem.cardReader.Util;
import com.tangem.presentation.activity.EmptyWalletActivity;
import com.tangem.presentation.activity.LoadedWalletActivity;
import com.tangem.presentation.activity.MainActivity;
import com.tangem.presentation.activity.RequestPINActivity;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;

View file

@ -4,7 +4,6 @@ import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.util.Base64; import android.util.Base64;
import android.util.Log;
import com.tangem.cardReader.CardProtocol; import com.tangem.cardReader.CardProtocol;
@ -18,11 +17,11 @@ import javax.crypto.Cipher;
* Global PIN Storage * Global PIN Storage
*/ */
class PINStorage { public class PINStorage {
private static String mSavedPIN, mUserPIN, mLastUsedPIN, mEncryptedPIN, mPIN2; private static String mSavedPIN, mUserPIN, mLastUsedPIN, mEncryptedPIN, mPIN2;
private static SharedPreferences sharedPreferences=null; private static SharedPreferences sharedPreferences=null;
static void Init(Context context) { public static void Init(Context context) {
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
mSavedPIN = sharedPreferences.getString("SavedPIN", null); mSavedPIN = sharedPreferences.getString("SavedPIN", null);
mUserPIN = null; mUserPIN = null;
@ -46,15 +45,15 @@ class PINStorage {
mLastUsedPIN = PIN; mLastUsedPIN = PIN;
} }
static void setUserPIN(String PIN) { public static void setUserPIN(String PIN) {
mUserPIN = PIN; mUserPIN = PIN;
} }
static void setPIN2(String PIN) { public static void setPIN2(String PIN) {
mPIN2 = PIN; mPIN2 = PIN;
} }
static void savePIN(String PIN) { public static void savePIN(String PIN) {
mSavedPIN = PIN; mSavedPIN = PIN;
if (mSavedPIN != null && !mSavedPIN.isEmpty()) { if (mSavedPIN != null && !mSavedPIN.isEmpty()) {
SharedPreferences.Editor editor = sharedPreferences.edit(); SharedPreferences.Editor editor = sharedPreferences.edit();
@ -65,7 +64,7 @@ class PINStorage {
} }
} }
static void deletePIN() { public static void deletePIN() {
SharedPreferences.Editor editor = sharedPreferences.edit(); SharedPreferences.Editor editor = sharedPreferences.edit();
if (mSavedPIN != null && mLastUsedPIN != null && mSavedPIN.equals(mLastUsedPIN)) { if (mSavedPIN != null && mLastUsedPIN != null && mSavedPIN.equals(mLastUsedPIN)) {
mLastUsedPIN = null; mLastUsedPIN = null;
@ -75,7 +74,7 @@ class PINStorage {
editor.apply(); editor.apply();
} }
static void saveEncryptedPIN(Cipher cipher, String PIN) { public static void saveEncryptedPIN(Cipher cipher, String PIN) {
try { try {
byte[] iv = cipher.getIV(); byte[] iv = cipher.getIV();
byte[] bytes = cipher.doFinal(PIN.getBytes()); byte[] bytes = cipher.doFinal(PIN.getBytes());
@ -93,14 +92,14 @@ class PINStorage {
} }
} }
static byte[] loadEncryptedIV() { public static byte[] loadEncryptedIV() {
String sIV = sharedPreferences.getString("EncryptedIV", ""); String sIV = sharedPreferences.getString("EncryptedIV", "");
// Log.d("PINStorage", String.format("loadEncryptedIV: %s",sIV)); // Log.d("PINStorage", String.format("loadEncryptedIV: %s",sIV));
return Base64.decode(sIV, Base64.NO_WRAP); return Base64.decode(sIV, Base64.NO_WRAP);
} }
static String loadEncryptedPIN(Cipher cipher) { public static String loadEncryptedPIN(Cipher cipher) {
String encryptedPIN = sharedPreferences.getString("EncryptedPIN", null); String encryptedPIN = sharedPreferences.getString("EncryptedPIN", null);
try { try {
@ -114,11 +113,11 @@ class PINStorage {
return mEncryptedPIN; return mEncryptedPIN;
} }
static boolean haveEncryptedPIN() { public static boolean haveEncryptedPIN() {
return sharedPreferences.getString("EncryptedPIN", null) != null; return sharedPreferences.getString("EncryptedPIN", null) != null;
} }
static void deleteEncryptedPIN() { public static void deleteEncryptedPIN() {
if (mEncryptedPIN != null && mLastUsedPIN != null && mEncryptedPIN.equals(mLastUsedPIN)) { if (mEncryptedPIN != null && mLastUsedPIN != null && mEncryptedPIN.equals(mLastUsedPIN)) {
mLastUsedPIN = null; mLastUsedPIN = null;
} }
@ -129,7 +128,7 @@ class PINStorage {
editor.apply(); editor.apply();
} }
static void saveEncryptedPIN2(Cipher cipher, String PIN) { public static void saveEncryptedPIN2(Cipher cipher, String PIN) {
try { try {
byte[] iv = cipher.getIV(); byte[] iv = cipher.getIV();
byte[] bytes = cipher.doFinal(PIN.getBytes()); byte[] bytes = cipher.doFinal(PIN.getBytes());
@ -147,14 +146,14 @@ class PINStorage {
} }
} }
static byte[] loadEncryptedIV2() { public static byte[] loadEncryptedIV2() {
String sIV = sharedPreferences.getString("EncryptedIV2", ""); String sIV = sharedPreferences.getString("EncryptedIV2", "");
// Log.d("PINStorage", String.format("loadEncryptedIV: %s",sIV)); // Log.d("PINStorage", String.format("loadEncryptedIV: %s",sIV));
return Base64.decode(sIV, Base64.NO_WRAP); return Base64.decode(sIV, Base64.NO_WRAP);
} }
static String loadEncryptedPIN2(Cipher cipher) { public static String loadEncryptedPIN2(Cipher cipher) {
String encryptedPIN = sharedPreferences.getString("EncryptedPIN2", null); String encryptedPIN = sharedPreferences.getString("EncryptedPIN2", null);
try { try {
@ -168,11 +167,11 @@ class PINStorage {
return mPIN2; return mPIN2;
} }
static boolean haveEncryptedPIN2() { public static boolean haveEncryptedPIN2() {
return sharedPreferences.getString("EncryptedPIN2", null) != null; return sharedPreferences.getString("EncryptedPIN2", null) != null;
} }
static void deleteEncryptedPIN2() { public static void deleteEncryptedPIN2() {
mPIN2 = null; mPIN2 = null;
SharedPreferences.Editor editor = sharedPreferences.edit(); SharedPreferences.Editor editor = sharedPreferences.edit();
editor.remove("EncryptedPIN2"); editor.remove("EncryptedPIN2");

View file

@ -13,6 +13,7 @@ public class SharedData
public AtomicInteger requestCounter; public AtomicInteger requestCounter;
public int allRequest; public int allRequest;
public AtomicInteger errorRequest; public AtomicInteger errorRequest;
public SharedData(int requstCount) public SharedData(int requstCount)
{ {
allRequest = requstCount; allRequest = requstCount;

File diff suppressed because one or more lines are too long

View file

@ -21,7 +21,7 @@ public class VerifyCardTask extends Thread {
private Tangem_Card mCard; private Tangem_Card mCard;
private NfcManager mNfcManager; private NfcManager mNfcManager;
VerifyCardTask(Context context, Tangem_Card card, NfcManager nfcManager, IsoDep isoDep, CardProtocol.Notifications notifications) { public VerifyCardTask(Context context, Tangem_Card card, NfcManager nfcManager, IsoDep isoDep, CardProtocol.Notifications notifications) {
mCard = card; mCard = card;
mContext = context; mContext = context;
mIsoDep = isoDep; mIsoDep = isoDep;

View file

@ -6,7 +6,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
tools:context="com.tangem.wallet.CardInfoActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.CardInfoActivity">
<android.support.design.widget.AppBarLayout <android.support.design.widget.AppBarLayout
android:id="@+id/appbar" android:id="@+id/appbar"

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.tangem.wallet.ConfirmPaymentActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.ConfirmPaymentActivity">
<TextView <TextView
android:id="@+id/textView" android:id="@+id/textView"

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.tangem.wallet.CreateNewWalletActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.CreateNewWalletActivity">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View file

@ -7,7 +7,7 @@
android:background="@color/white" android:background="@color/white"
android:orientation="vertical" android:orientation="vertical"
android:padding="0dp" android:padding="0dp"
tools:context="com.tangem.wallet.EmptyWalletActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.EmptyWalletActivity">
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -3,7 +3,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.tangem.wallet.LoadedWalletActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.LoadedWalletActivity">
<!--<android.support.design.widget.AppBarLayout--> <!--<android.support.design.widget.AppBarLayout-->
<!--android:layout_width="match_parent"--> <!--android:layout_width="match_parent"-->

View file

@ -5,7 +5,7 @@
android:background="#FFFFFF" android:background="#FFFFFF"
android:gravity="bottom" android:gravity="bottom"
android:orientation="vertical" android:orientation="vertical"
tools:context="com.tangem.wallet.LogoActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.LogoActivity">
<ImageView <ImageView
android:id="@+id/imgLogo" android:id="@+id/imgLogo"

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.tangem.wallet.MainActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.MainActivity">
<!--<ImageView--> <!--<ImageView-->
<!--android:id="@+id/ivTap"--> <!--android:id="@+id/ivTap"-->

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.tangem.wallet.PreparePaymentActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.PreparePaymentActivity">
<TextView <TextView
android:id="@+id/textView" android:id="@+id/textView"

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.tangem.wallet.PurgeActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.PurgeActivity">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View file

@ -3,6 +3,6 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.tangem.wallet.QRScanActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.QRScanActivity">
</android.support.constraint.ConstraintLayout> </android.support.constraint.ConstraintLayout>

View file

@ -4,7 +4,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:orientation="vertical" android:orientation="vertical"
tools:context="com.tangem.wallet.RequestPINActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.RequestPINActivity">
<!--android:paddingBottom="@dimen/activity_vertical_margin"--> <!--android:paddingBottom="@dimen/activity_vertical_margin"-->
<!--android:paddingLeft="@dimen/activity_horizontal_margin"--> <!--android:paddingLeft="@dimen/activity_horizontal_margin"-->
<!--android:paddingRight="@dimen/activity_horizontal_margin"--> <!--android:paddingRight="@dimen/activity_horizontal_margin"-->

View file

@ -4,7 +4,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:orientation="vertical" android:orientation="vertical"
tools:context="com.tangem.wallet.SavePINActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.SavePINActivity">
<!--android:paddingBottom="@dimen/activity_vertical_margin"--> <!--android:paddingBottom="@dimen/activity_vertical_margin"-->
<!--android:paddingLeft="@dimen/activity_horizontal_margin"--> <!--android:paddingLeft="@dimen/activity_horizontal_margin"-->
<!--android:paddingRight="@dimen/activity_horizontal_margin"--> <!--android:paddingRight="@dimen/activity_horizontal_margin"-->

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.tangem.wallet.SendTransactionActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.SendTransactionActivity">
<ProgressBar <ProgressBar
android:id="@+id/progressBar" android:id="@+id/progressBar"

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.tangem.wallet.SignPaymentActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.SignPaymentActivity">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.tangem.wallet.PurgeActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.PurgeActivity">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View file

@ -3,7 +3,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.tangem.wallet.VerifyCardActivity"> tools:context="com.tangem.wallet.com.tangem.presentation.activity.VerifyCardActivity">
<include <include