Updated on 2026-08-14

This commit is contained in:
Tangem 2018-07-10 14:19:34 +03:00
parent 0500d454fb
commit 5c482bf194
4 changed files with 345 additions and 285 deletions

View file

@ -0,0 +1,128 @@
package com.tangem.data.network.task.confirm_payment;
import android.app.Activity;
import android.view.View;
import com.tangem.data.network.request.FeeRequest;
import com.tangem.data.network.task.FeeTask;
import com.tangem.domain.wallet.SharedData;
import com.tangem.presentation.activity.ConfirmPaymentActivity;
import java.lang.ref.WeakReference;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.List;
public class ConnectFeeTask extends FeeTask {
private WeakReference<ConfirmPaymentActivity> reference;
public ConnectFeeTask(ConfirmPaymentActivity context, SharedData sharedData) {
super(sharedData);
reference = new WeakReference<>(context);
}
@Override
protected void onPostExecute(List<FeeRequest> requests) {
super.onPostExecute(requests);
ConfirmPaymentActivity confirmPaymentActivity = reference.get();
for (FeeRequest request : requests) {
if (request.error == null) {
long minFeeRate = 0;
try {
try {
String tmpAnswer = request.getAsString();
BigDecimal minFeeBD = new BigDecimal(tmpAnswer);
BigDecimal multiplicator = new BigDecimal("100000000");
minFeeBD = minFeeBD.multiply(multiplicator);
BigInteger minFeeBI = minFeeBD.toBigInteger();
minFeeRate = minFeeBI.longValue();
} catch (Exception e) {
if (sharedCounter != null) {
int errCounter = sharedCounter.errorRequest.incrementAndGet();
if (errCounter >= sharedCounter.allRequest) {
confirmPaymentActivity.progressBar.setVisibility(View.INVISIBLE);
confirmPaymentActivity.finishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
}
} else {
confirmPaymentActivity.progressBar.setVisibility(View.INVISIBLE);
confirmPaymentActivity.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;
}
if (minFeeRate == 0) {
confirmPaymentActivity.progressBar.setVisibility(View.INVISIBLE);
confirmPaymentActivity.finishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! Wrong data received from the node");
return;
}
long inputCount = request.txSize;
if (inputCount != 0) {
minFeeRate = minFeeRate * inputCount;
} else {
minFeeRate = minFeeRate * 256;
}
} catch (Exception e) {
e.printStackTrace();
if (sharedCounter != null) {
int errCounter = sharedCounter.errorRequest.incrementAndGet();
if (errCounter >= sharedCounter.allRequest) {
confirmPaymentActivity.progressBar.setVisibility(View.INVISIBLE);
confirmPaymentActivity.finishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
}
} else {
confirmPaymentActivity.progressBar.setVisibility(View.INVISIBLE);
confirmPaymentActivity.finishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
}
return;
}
confirmPaymentActivity.progressBar.setVisibility(View.INVISIBLE);
float finalFee = (float) minFeeRate / (float) 10000;
finalFee = Math.round(finalFee) / (float) 10000;
if ((request.getBlockCount() == FeeRequest.MINIMAL) && (confirmPaymentActivity.minFee == null)) {
confirmPaymentActivity.minFee = String.valueOf(finalFee);
confirmPaymentActivity.minFeeInInternalUnits = confirmPaymentActivity.mCard.InternalUnitsFromString(String.valueOf(finalFee));
} else if ((request.getBlockCount() == FeeRequest.NORMAL) && (confirmPaymentActivity.normalFee == null)) {
confirmPaymentActivity.normalFee = String.valueOf(finalFee);
} else if ((request.getBlockCount() == FeeRequest.PRIORITY) && (confirmPaymentActivity.maxFee == null)) {
confirmPaymentActivity.maxFee = String.valueOf(finalFee);
}
confirmPaymentActivity.doSetFee(confirmPaymentActivity.rgFee.getCheckedRadioButtonId());
confirmPaymentActivity.etFee.setError(null);
confirmPaymentActivity.feeRequestSuccess = true;
if (confirmPaymentActivity.feeRequestSuccess && confirmPaymentActivity.balanceRequestSuccess) {
confirmPaymentActivity.btnSend.setVisibility(View.VISIBLE);
}
confirmPaymentActivity.dtVerifyed = new Date();
} else {
if (sharedCounter != null) {
int errCounter = sharedCounter.errorRequest.incrementAndGet();
if (errCounter >= sharedCounter.allRequest) {
confirmPaymentActivity.progressBar.setVisibility(View.INVISIBLE);
confirmPaymentActivity.finishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
}
} else {
confirmPaymentActivity.progressBar.setVisibility(View.INVISIBLE);
confirmPaymentActivity.finishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
}
}
}
}
}

View file

@ -0,0 +1,120 @@
package com.tangem.data.network.task.confirm_payment;
import android.app.Activity;
import android.view.View;
import com.tangem.data.network.request.ElectrumRequest;
import com.tangem.data.network.task.ElectrumTask;
import com.tangem.domain.wallet.SharedData;
import com.tangem.presentation.activity.ConfirmPaymentActivity;
import org.json.JSONException;
import java.lang.ref.WeakReference;
import java.util.Date;
import java.util.List;
public class ConnectTask extends ElectrumTask {
private WeakReference<ConfirmPaymentActivity> reference;
public ConnectTask(ConfirmPaymentActivity context, String host, int port) {
super(host, port);
reference = new WeakReference<>(context);
}
public ConnectTask(ConfirmPaymentActivity context, String host, int port, SharedData sharedData) {
super(host, port, sharedData);
reference = new WeakReference<>(context);
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(List<ElectrumRequest> requests) {
super.onPostExecute(requests);
ConfirmPaymentActivity confirmPaymentActivity = reference.get();
for (ElectrumRequest request : requests) {
try {
if (request.error == null) {
if (request.isMethod(ElectrumRequest.METHOD_GetBalance)) {
try {
confirmPaymentActivity.etFee.setText("--");
//String mWalletAddress = request.getParams().getString(0);
if ((request.getResult().getInt("confirmed") + request.getResult().getInt("unconfirmed")) / confirmPaymentActivity.mCard.getBlockchain().getMultiplier() * 1000000.0 < Float.parseFloat(confirmPaymentActivity.etAmount.getText().toString())) {
confirmPaymentActivity.etFee.setError("Not enough funds");
if (sharedCounter == null) {
confirmPaymentActivity.balanceRequestSuccess = false;
confirmPaymentActivity.btnSend.setVisibility(View.INVISIBLE);
confirmPaymentActivity.dtVerifyed = null;
confirmPaymentActivity.nodeCheck = false;
} else {
int errCounter = sharedCounter.errorRequest.incrementAndGet();
if (errCounter >= sharedCounter.allRequest) {
confirmPaymentActivity.balanceRequestSuccess = false;
confirmPaymentActivity.btnSend.setVisibility(View.INVISIBLE);
confirmPaymentActivity.dtVerifyed = null;
confirmPaymentActivity.nodeCheck = false;
}
}
} else {
confirmPaymentActivity.etFee.setError(null);
confirmPaymentActivity.balanceRequestSuccess = true;
if (confirmPaymentActivity.feeRequestSuccess && confirmPaymentActivity.balanceRequestSuccess) {
confirmPaymentActivity.btnSend.setVisibility(View.VISIBLE);
}
confirmPaymentActivity.dtVerifyed = new Date();
confirmPaymentActivity.nodeCheck = true;
}
} catch (JSONException e) {
if (sharedCounter != null) {
int errCounter = sharedCounter.errorRequest.incrementAndGet();
if (errCounter >= sharedCounter.allRequest) {
e.printStackTrace();
confirmPaymentActivity.finishActivityWithError(Activity.RESULT_CANCELED, "Cannot check balance! No connection with blockchain nodes");
}
} else {
e.printStackTrace();
confirmPaymentActivity.finishActivityWithError(Activity.RESULT_CANCELED, "Cannot check balance! No connection with blockchain nodes");
}
}
} else if (request.isMethod(ElectrumRequest.METHOD_GetFee)) {
if (request.getResultString() == "-1") {
confirmPaymentActivity.etFee.setText("3");
}
}
} else {
// etFee.setError(request.error);
// btnSend.setVisibility(View.INVISIBLE);
if (sharedCounter != null) {
int errCounter = sharedCounter.errorRequest.incrementAndGet();
if (errCounter >= sharedCounter.allRequest) {
confirmPaymentActivity.finishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
}
} else {
confirmPaymentActivity.finishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
}
return;
}
} catch (JSONException e) {
if (sharedCounter != null) {
int errCounter = sharedCounter.errorRequest.incrementAndGet();
if (errCounter >= sharedCounter.allRequest) {
e.printStackTrace();
confirmPaymentActivity.finishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
}
} else {
e.printStackTrace();
confirmPaymentActivity.finishActivityWithError(Activity.RESULT_CANCELED, "Cannot calculate fee! No connection with blockchain nodes");
}
}
}
}
}

View file

@ -0,0 +1,72 @@
package com.tangem.data.network.task.confirm_payment;
import android.app.Activity;
import android.view.View;
import com.tangem.data.network.request.InfuraRequest;
import com.tangem.data.network.task.InfuraTask;
import com.tangem.domain.wallet.Blockchain;
import com.tangem.presentation.activity.ConfirmPaymentActivity;
import org.json.JSONException;
import java.lang.ref.WeakReference;
import java.math.BigInteger;
import java.util.Date;
import java.util.List;
public class ETHRequestTask extends InfuraTask {
private WeakReference<ConfirmPaymentActivity> reference;
public ETHRequestTask(ConfirmPaymentActivity context, Blockchain blockchain) {
super(blockchain);
reference = new WeakReference<>(context);
}
@Override
protected void onPostExecute(List<InfuraRequest> requests) {
super.onPostExecute(requests);
ConfirmPaymentActivity confirmPaymentActivity = reference.get();
for (InfuraRequest request : requests) {
try {
Long price = 0L;
if (request.error == null) {
if (request.isMethod(InfuraRequest.METHOD_ETH_GetGasPrice)) {
try {
String gasPrice = request.getResultString();
gasPrice = gasPrice.substring(2);
BigInteger l = new BigInteger(gasPrice, 16);
BigInteger m = confirmPaymentActivity.mCard.getBlockchain() == Blockchain.Token ? BigInteger.valueOf(55000) : BigInteger.valueOf(21000);
l = l.multiply(m);
String feeInGwei = confirmPaymentActivity.mCard.getAmountInGwei(String.valueOf(l));
confirmPaymentActivity.minFee = feeInGwei;
confirmPaymentActivity.maxFee = feeInGwei;
confirmPaymentActivity.normalFee = feeInGwei;
confirmPaymentActivity.etFee.setText(feeInGwei);
confirmPaymentActivity.etFee.setError(null);
confirmPaymentActivity.btnSend.setVisibility(View.VISIBLE);
confirmPaymentActivity.feeRequestSuccess = true;
confirmPaymentActivity.balanceRequestSuccess = true;
confirmPaymentActivity.dtVerifyed = new Date();
confirmPaymentActivity.minFeeInInternalUnits = confirmPaymentActivity.mCard.InternalUnitsFromString(feeInGwei);
} catch (JSONException e) {
e.printStackTrace();
confirmPaymentActivity.finishActivityWithError(Activity.RESULT_CANCELED, "Can't calculate fee! No connection with blockchain nodes");
}
}
} else {
confirmPaymentActivity.finishActivityWithError(Activity.RESULT_CANCELED, "Can't calculate fee! No connection with blockchain nodes");
}
} catch (JSONException e) {
e.printStackTrace();
confirmPaymentActivity.finishActivityWithError(Activity.RESULT_CANCELED, "Can't calculate fee! No connection with blockchain nodes");
}
}
}
}