Updated on 2026-08-14

This commit is contained in:
Tangem 2018-07-02 12:41:17 +03:00
commit efe3e31432
9 changed files with 94 additions and 55 deletions

View file

@ -7,14 +7,19 @@ import com.tangem.data.network.request.ElectrumRequest;
import com.tangem.domain.wallet.SharedData;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
/**
* Created by dvol on 16.07.2017.
@ -56,8 +61,11 @@ public class ElectrumTask extends AsyncTask<ElectrumRequest, Integer, List<Elect
InetAddress serverAddress = InetAddress.getByName(Host);
Log.v(logTag, "Connecting..."+Host);
Socket socket = new Socket(serverAddress, Port);
// Socket socket = new Socket(serverAddress, Port);
Socket socket = new Socket();
socket.setSoTimeout(5000);
socket.bind(new InetSocketAddress(0));
socket.connect(new InetSocketAddress(serverAddress, Port));
try {
OutputStream os = socket.getOutputStream();
out = new OutputStreamWriter(os, "UTF-8");

View file

@ -18,13 +18,16 @@ import java.nio.ByteBuffer;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import static com.tangem.util.FormatUtil.GetDecimalFormat;
import static com.tangem.util.FormatUtil.stringToBigDecimal;
/**
* Created by Ilia on 15.02.2018.
@ -232,21 +235,13 @@ public class BtcEngine extends CoinEngine {
}
public boolean CheckAmount(TangemCard card, String amount) throws Exception {
DecimalFormat decimalFormat = GetDecimalFormat();
BigDecimal amountValue = (BigDecimal) decimalFormat.parse(amount);
// Convert Balance to BigDecimal
BigDecimal maxValue = new BigDecimal(GetBalanceValue(card));
maxValue = maxValue.divide(new BigDecimal(1000));
//if (use_mCurrency) {
amountValue = amountValue.divide(new BigDecimal(1000));
//}
// DecimalFormat decimalFormat = GetDecimalFormat();
// BigDecimal amountValue = (BigDecimal) decimalFormat.parse(amount);
BigDecimal amountValue = stringToBigDecimal(amount,Locale.US);
BigDecimal maxValue = stringToBigDecimal(GetBalanceValue(card),Locale.US);
if (amountValue.compareTo(maxValue) > 0) {
return false;
}
return true;
}

View file

@ -298,12 +298,12 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
finalFee = Math.round(finalFee) / (float) 10000;
if (request.getBlockCount() == FeeRequest.MINIMAL) {
if ((request.getBlockCount() == FeeRequest.MINIMAL) && (minFee == null)) {
minFee = String.valueOf(finalFee);
minFeeInInternalUnits = mCard.InternalUnitsFromString(String.valueOf(finalFee));
} else if (request.getBlockCount() == FeeRequest.NORMAL) {
} else if ((request.getBlockCount() == FeeRequest.NORMAL) && (normalFee == null)) {
normalFee = String.valueOf(finalFee);
} else if (request.getBlockCount() == FeeRequest.PRIORITY) {
} else if ((request.getBlockCount() == FeeRequest.PRIORITY) && (maxFee == null)) {
maxFee = String.valueOf(finalFee);
}
@ -514,20 +514,16 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
String nodeAddress = engineCoin.GetNextNode(mCard);
int nodePort = engineCoin.GetNextNodePort(mCard);
//ConnectTask connectTaskEx = new ConnectTask(Blockchain.getNextServiceHost(mCard), Blockchain.getNextServicePort(mCard), data);
ConnectTask connectTaskEx = new ConnectTask(nodeAddress, nodePort, data);
//connectTaskEx.execute(ElectrumRequest.CheckBalance(mCard.getWallet()));
connectTaskEx.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.CheckBalance(mCard.getWallet()));
}
String nodeAddress = engineCoin.GetNode(mCard);
int nodePort = engineCoin.GetNodePort(mCard);
ConnectTask connectTask = new ConnectTask(nodeAddress, nodePort, data);
//ConnectTask connectTask = new ConnectTask(Blockchain.getServiceHost(mCard), Blockchain.getServicePort(mCard));
connectTask.execute(/*ElectrumRequest.CheckBalance(mCard.getWallet()), */ElectrumRequest.GetFee(mCard.getWallet()));
// String nodeAddress = engineCoin.GetNode(mCard);
// int nodePort = engineCoin.GetNodePort(mCard);
// ConnectTask connectTask = new ConnectTask(nodeAddress, nodePort, data);
//
//
// connectTask.execute(ElectrumRequest.GetFee(mCard.getWallet()));
int calcSize = 256;
try {
@ -543,7 +539,8 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
ConnectFeeTask feeTask = new ConnectFeeTask(sharedFee);
feeTask.execute(FeeRequest.GetFee(mCard.getWallet(), calcSize, FeeRequest.NORMAL),
feeTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
FeeRequest.GetFee(mCard.getWallet(), calcSize, FeeRequest.NORMAL),
FeeRequest.GetFee(mCard.getWallet(), calcSize, FeeRequest.MINIMAL),
FeeRequest.GetFee(mCard.getWallet(), calcSize, FeeRequest.PRIORITY));
}
@ -608,7 +605,7 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
Intent intent = new Intent();
intent.putExtra("message", "Operation canceled");
// intent.putExtra("message", "Operation canceled");
setResult(Activity.RESULT_CANCELED, intent);
finish();
return true;

View file

@ -136,7 +136,7 @@ public class PreparePaymentActivity extends AppCompatActivity implements NfcAdap
btnVerify.setOnClickListener(v -> {
String strAmount;
strAmount = etAmount.getText().toString();
strAmount = etAmount.getText().toString().replace(",",".");
CoinEngine engine1 = CoinEngineFactory.Create(mCard.getBlockchain());
Log.i(TAG, mCard.getBlockchain().getOfficialName());

File diff suppressed because one or more lines are too long

View file

@ -201,7 +201,7 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis
if (height != -1) {
RequestWalletInfoTask task = new RequestWalletInfoTask(request.Host, request.Port);
requestTasks.add(task);
task.execute(ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
ElectrumRequest.GetTransaction(mWalletAddress, hash));
}
}
@ -225,7 +225,7 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis
RequestWalletInfoTask task = new RequestWalletInfoTask(request.Host, request.Port);
requestTasks.add(task);
task.execute(ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
ElectrumRequest.GetTransaction(mWalletAddress, hash));
}
}
@ -755,9 +755,9 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis
RequestWalletInfoTask task = new RequestWalletInfoTask(nodeAddress, nodePort);
requestTasks.add(task);
task.execute(ElectrumRequest.ListUnspent(card.getWallet()), ElectrumRequest.ListHistory(card.getWallet()));
// task.execute(ElectrumRequest.ListUnspent(card.getWallet()));//, ElectrumRequest.ListHistory(card.getWallet()));
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(card.getWallet()));//, ElectrumRequest.ListHistory(card.getWallet()));
RateInfoTask taskRate = new RateInfoTask();
ExchangeRequest rate = ExchangeRequest.GetRate(card.getWallet(), "bitcoin", "bitcoin");
taskRate.execute(rate);
@ -779,7 +779,7 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis
RequestWalletInfoTask task = new RequestWalletInfoTask(nodeAddress, nodePort);
requestTasks.add(task);
task.execute(ElectrumRequest.ListUnspent(card.getWallet()), ElectrumRequest.ListHistory(card.getWallet()));
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(card.getWallet()));//, ElectrumRequest.ListHistory(card.getWallet()));
RateInfoTask taskRate = new RateInfoTask();
ExchangeRequest rate = ExchangeRequest.GetRate(card.getWallet(), "bitcoin-cash", "bitcoin-cash");
taskRate.execute(rate);
@ -839,18 +839,12 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis
int nodePort = engine.GetNextNodePort(card);
RequestWalletInfoTask connectTaskEx = new RequestWalletInfoTask(nodeAddress, nodePort, data);
connectTaskEx.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.CheckBalance(card.getWallet()));
RequestWalletInfoTask task = new RequestWalletInfoTask(nodeAddress, nodePort);
requestTasks.add(task);
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(card.getWallet()));//, ElectrumRequest.ListHistory(card.getWallet()));
}
String nodeAddress = engine.GetNode(card);
int nodePort = engine.GetNodePort(card);
RequestWalletInfoTask task = new RequestWalletInfoTask(nodeAddress, nodePort);
requestTasks.add(task);
task.execute(ElectrumRequest.ListUnspent(card.getWallet()), ElectrumRequest.ListHistory(card.getWallet()));
RateInfoTask taskRate = new RateInfoTask();
ExchangeRequest rate = ExchangeRequest.GetRate(card.getWallet(), "bitcoin", "bitcoin");
taskRate.execute(rate);
} else if (card.getBlockchain() == Blockchain.BitcoinCashTestNet || card.getBlockchain() == Blockchain.BitcoinCash) {
SharedData data = new SharedData(SharedData.COUNT_REQUEST);
for (int i = 0; i < data.allRequest; ++i) {
@ -866,7 +860,7 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis
RequestWalletInfoTask task = new RequestWalletInfoTask(nodeAddress, nodePort);
requestTasks.add(task);
task.execute(ElectrumRequest.ListUnspent(card.getWallet()), ElectrumRequest.ListHistory(card.getWallet()));
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(card.getWallet()));//, ElectrumRequest.ListHistory(card.getWallet()));
RateInfoTask taskRate = new RateInfoTask();
ExchangeRequest rate = ExchangeRequest.GetRate(card.getWallet(), "bitcoin-cash", "bitcoin-cash");
taskRate.execute(rate);

View file

@ -4,6 +4,7 @@ import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
/**
* Created by Ilia on 15.02.2018.
@ -33,8 +34,49 @@ public class FormatUtil {
return myFormatter;
}
public static BigDecimal stringToBigDecimal(final String formattedString,
final Locale locale)
{
final DecimalFormatSymbols symbols;
final char groupSeparatorChar;
final String groupSeparator;
final char decimalSeparatorChar;
final String decimalSeparator;
String fixedString;
final BigDecimal number;
symbols = new DecimalFormatSymbols(locale);
groupSeparatorChar = symbols.getGroupingSeparator();
decimalSeparatorChar = symbols.getDecimalSeparator();
if(groupSeparatorChar == '.')
{
groupSeparator = "\\" + groupSeparatorChar;
}
else
{
groupSeparator = Character.toString(groupSeparatorChar);
}
if(decimalSeparatorChar == '.')
{
decimalSeparator = "\\" + decimalSeparatorChar;
}
else
{
decimalSeparator = Character.toString(decimalSeparatorChar);
}
fixedString = formattedString.replaceAll(groupSeparator , "");
fixedString = fixedString.replaceAll(decimalSeparator , ".");
number = new BigDecimal(fixedString);
return (number);
}
public static long ConvertStringToLong(String caption) throws Exception {
BigDecimal d = new BigDecimal(caption);
// BigDecimal d = new BigDecimal(caption);
BigDecimal d = stringToBigDecimal(caption,Locale.US);
d = d.multiply(new BigDecimal(100000));
d = d.setScale(5);
BigInteger b = d.toBigInteger();

View file

@ -203,10 +203,10 @@
android:id="@+id/etAmount"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:fontFamily="@font/montserrat_light"
android:hint="@string/enter_amount"
android:inputType="numberDecimal"
android:digits="0123456789.,"
android:padding="12dp"
android:textColor="@color/colorPrimaryDark"
android:textSize="@dimen/text_size_large"
@ -214,7 +214,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_min="150dp"/>
app:layout_constraintWidth_min="150dp" />
<TextView
android:id="@+id/tvCurrency"

View file

@ -64,28 +64,31 @@
android:orientation="vertical">
<TextView
android:id="@+id/textView15"
android:id="@+id/tvBalanceLine1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/montserrat_light"
android:text="Verified balance"
android:textColor="@color/black"
android:textSize="@dimen/text_size_large"
tools:text="Verified balance"/>
tools:text="Verified balance" />
<TextView
android:id="@+id/tvBalance"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/montserrat_light"
android:textColor="@color/black"
android:textSize="@dimen/text_size_large"
tools:text="0.05 BTC (Bitcoin)"/>
tools:text="0.05 BTC (Bitcoin)" />
<TextView
android:id="@+id/textView10"
android:id="@+id/tvBalanceLine2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="99.99% safe. Authorized merchant loading in progress. Complete in 4:57"/>
android:fontFamily="@font/montserrat_light"
android:text="100% safe. Confirmed balance and banknote identity" />
</LinearLayout>
@ -408,7 +411,7 @@
android:text="@string/message"
android:textAlignment="center"
android:textColor="@color/black"
android:textStyle="normal|bold"/>
android:textStyle="normal|bold" />
<TextView
android:id="@+id/tvError"