Updated on 2026-08-14

This commit is contained in:
Tangem 2018-07-02 11:33:37 +03:00
parent 22697fd237
commit 7b3e4dcc7b
9 changed files with 98 additions and 65 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

@ -416,7 +416,7 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre
updateTasks.add(updateWalletInfoTask);
updateWalletInfoTask.execute(ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
ElectrumRequest.GetTransaction(mWalletAddress, hash));
}
}
@ -456,7 +456,7 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre
UpdateWalletInfoTask updateWalletInfoTask = new UpdateWalletInfoTask(nodeAddress, nodePort);
updateTasks.add(updateWalletInfoTask);
updateWalletInfoTask.execute(ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
ElectrumRequest.GetTransaction(mWalletAddress, hash));
}
@ -903,15 +903,11 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre
int nodePort = engine.GetNextNodePort(mCard);
UpdateWalletInfoTask connectTaskEx = new UpdateWalletInfoTask(nodeAddress, nodePort, data);
connectTaskEx.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.CheckBalance(mCard.getWallet()));
}
String nodeAddress = Objects.requireNonNull(engine).GetNode(mCard);
int nodePort = engine.GetNodePort(mCard);
UpdateWalletInfoTask updateWalletInfoTask = new UpdateWalletInfoTask(nodeAddress, nodePort, data);
updateTasks.add(updateWalletInfoTask);
updateWalletInfoTask.execute(ElectrumRequest.ListUnspent(mCard.getWallet())
,ElectrumRequest.ListHistory(mCard.getWallet())
);
UpdateWalletInfoTask updateWalletInfoTask = new UpdateWalletInfoTask(nodeAddress, nodePort, data);
updateTasks.add(updateWalletInfoTask);
updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(mCard.getWallet()));
}
RateInfoTask taskRate = new RateInfoTask();
ExchangeRequest rate = ExchangeRequest.GetRate(mCard.getWallet(), "bitcoin", "bitcoin");
@ -932,8 +928,8 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre
UpdateWalletInfoTask updateWalletInfoTask = new UpdateWalletInfoTask(nodeAddress, nodePort, data);
updateTasks.add(updateWalletInfoTask);
updateWalletInfoTask.execute(ElectrumRequest.ListUnspent(mCard.getWallet())
,ElectrumRequest.ListHistory(mCard.getWallet())
updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(mCard.getWallet())
// ElectrumRequest.ListHistory(mCard.getWallet())
);
RateInfoTask taskRate = new RateInfoTask();
@ -1023,8 +1019,9 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre
}
public void ErrorOnUpdate(String message) {
mCard.setError(getString(R.string.cannot_obtain_data_from_blockchain));
updateViews();
// mCard.setError(getString(R.string.cannot_obtain_data_from_blockchain));
// mCard.setError(message);
// updateViews();
}
@ -1450,13 +1447,13 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre
int nodePort = engine.GetNodePort(mCard);
UpdateWalletInfoTask connectTask = new UpdateWalletInfoTask(nodeAddress, nodePort);
connectTask.execute(ElectrumRequest.Broadcast(mCard.getWallet(), tx));
connectTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.Broadcast(mCard.getWallet(), tx));
} else if (mCard.getBlockchain() == Blockchain.BitcoinCash || mCard.getBlockchain() == Blockchain.BitcoinCashTestNet) {
String nodeAddress = engine.GetNode(mCard);
int nodePort = engine.GetNodePort(mCard);
UpdateWalletInfoTask connectTask = new UpdateWalletInfoTask(nodeAddress, nodePort);
connectTask.execute(ElectrumRequest.Broadcast(mCard.getWallet(), tx));
connectTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.Broadcast(mCard.getWallet(), tx));
}
}

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));
}
}
@ -754,9 +754,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);
@ -778,7 +778,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);
@ -838,18 +838,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) {
@ -865,7 +859,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"