diff --git a/app/build.gradle b/app/build.gradle index 004e7742d2..5f5c366855 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,7 +15,7 @@ android { applicationId "com.tangem.wallet" minSdkVersion 21 targetSdkVersion 27 - versionCode 73 + versionCode 74 versionName "0.88.1." + generateVersionName() testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } @@ -47,7 +47,7 @@ dependencies { implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support:design:27.1.1' implementation 'com.android.support:support-compat:27.1.1' - implementation 'com.android.support.constraint:constraint-layout:1.1.2' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.android.support:cardview-v7:27.1.1' implementation 'com.android.support:support-v4:27.1.1' implementation 'com.google.zxing:core:3.3.2' diff --git a/app/src/main/java/com/tangem/data/network/InfuraApi.java b/app/src/main/java/com/tangem/data/network/InfuraApi.java index 7cba8d3ff4..2ad1802e25 100644 --- a/app/src/main/java/com/tangem/data/network/InfuraApi.java +++ b/app/src/main/java/com/tangem/data/network/InfuraApi.java @@ -1,16 +1,15 @@ package com.tangem.data.network; -import com.tangem.data.network.model.InfuraEthGasPriceBody; -import com.tangem.data.network.model.InfuraEthGasPriceResponse; +import com.tangem.data.network.model.InfuraBody; +import com.tangem.data.network.model.InfuraResponse; import retrofit2.Call; import retrofit2.http.Body; -import retrofit2.http.Header; import retrofit2.http.Headers; import retrofit2.http.POST; public interface InfuraApi { @Headers("Content-Type: application/json") @POST(Server.ApiInfura.Method.MAIN) - Call ethGasPrice(@Body InfuraEthGasPriceBody body); + Call infura(@Body InfuraBody body); } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/data/network/ServerApiHelper.java b/app/src/main/java/com/tangem/data/network/ServerApiHelper.java index 4a85d79894..875333f871 100644 --- a/app/src/main/java/com/tangem/data/network/ServerApiHelper.java +++ b/app/src/main/java/com/tangem/data/network/ServerApiHelper.java @@ -8,8 +8,8 @@ import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import com.tangem.data.network.model.CardVerify; import com.tangem.data.network.model.CardVerifyBody; import com.tangem.data.network.model.CardVerifyResponse; -import com.tangem.data.network.model.InfuraEthGasPriceBody; -import com.tangem.data.network.model.InfuraEthGasPriceResponse; +import com.tangem.data.network.model.InfuraBody; +import com.tangem.data.network.model.InfuraResponse; import com.tangem.data.network.model.RateInfoResponse; import com.tangem.data.network.request.ElectrumRequest; import com.tangem.domain.BitcoinNode; @@ -110,19 +110,24 @@ public class ServerApiHelper { /** * HTTP - * InfuraEthGasPrice + * Infura + *

+ * eth_getBalance + * eth_gasPrice */ - private InfuraEthGasPriceBodyListener infuraEthGasPriceBodyListener; + public static final String INFURA_ETH_GET_BALANCE = "eth_getBalance"; + public static final String INFURA_ETH_GAS_PRICE = "eth_gasPrice"; + private InfuraBodyListener infuraBodyListener; - public interface InfuraEthGasPriceBodyListener { - void onInfuraEthGasPrice(InfuraEthGasPriceResponse cardVerifyResponse); + public interface InfuraBodyListener { + void onInfura(String method, InfuraResponse infuraResponse); } - public void setInfuraEthGasPrice(InfuraEthGasPriceBodyListener listener) { - infuraEthGasPriceBodyListener = listener; + public void setInfura(InfuraBodyListener listener) { + infuraBodyListener = listener; } - public void infuraEthGasPrice(String method, int id) { + public void infura(String method, int id, String wallet) { Retrofit retrofit = new Retrofit.Builder() .baseUrl(Server.ApiInfura.URL_INFURA) .addConverterFactory(GsonConverterFactory.create()) @@ -130,23 +135,35 @@ public class ServerApiHelper { InfuraApi infuraApi = retrofit.create(InfuraApi.class); - InfuraEthGasPriceBody infuraEthGasPriceBody = new InfuraEthGasPriceBody(method, id); + InfuraBody infuraBody; + switch (method) { + case INFURA_ETH_GET_BALANCE: + infuraBody = new InfuraBody(method, new String[]{wallet, "latest"}, id); + break; - Call call = infuraApi.ethGasPrice(infuraEthGasPriceBody); + case INFURA_ETH_GAS_PRICE: + infuraBody = new InfuraBody(method, id); + break; - call.enqueue(new Callback() { + default: + infuraBody = new InfuraBody(); + } + + Call call = infuraApi.infura(infuraBody); + + call.enqueue(new Callback() { @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { + public void onResponse(@NonNull Call call, @NonNull Response response) { if (response.code() == 200) { - infuraEthGasPriceBodyListener.onInfuraEthGasPrice(response.body()); - Log.i(TAG, "infuraEthGasPrice onResponse " + response.code()); + infuraBodyListener.onInfura(method, response.body()); + Log.i(TAG, "infura " + method + " onResponse " + response.code()); } else - Log.e(TAG, "infuraEthGasPrice onResponse " + response.code()); + Log.e(TAG, "infura " + method + " onResponse " + response.code()); } @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - Log.e(TAG, "infuraEthGasPrice onFailure " + t.getMessage()); + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + Log.e(TAG, "infura " + method + " onFailure " + t.getMessage()); } }); } diff --git a/app/src/main/java/com/tangem/data/network/model/InfuraBody.java b/app/src/main/java/com/tangem/data/network/model/InfuraBody.java new file mode 100644 index 0000000000..6fcabf6992 --- /dev/null +++ b/app/src/main/java/com/tangem/data/network/model/InfuraBody.java @@ -0,0 +1,21 @@ +package com.tangem.data.network.model; + +public class InfuraBody { + private String method; + private String[] params; + private int id; + + public InfuraBody() { + } + + public InfuraBody(String method, int id) { + this.method = method; + this.id = id; + } + + public InfuraBody(String method, String[] params, int id) { + this.method = method; + this.params = params; + this.id = id; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/data/network/model/InfuraEthGasPriceBody.java b/app/src/main/java/com/tangem/data/network/model/InfuraEthGasPriceBody.java deleted file mode 100644 index fa60a8ace5..0000000000 --- a/app/src/main/java/com/tangem/data/network/model/InfuraEthGasPriceBody.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.tangem.data.network.model; - -public class InfuraEthGasPriceBody { - private String method; - private String[] params; - private int id; - - public InfuraEthGasPriceBody(String method, int id) { - this.method = method; - this.id = id; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/data/network/model/InfuraEthGasPriceResponse.kt b/app/src/main/java/com/tangem/data/network/model/InfuraResponse.kt similarity index 88% rename from app/src/main/java/com/tangem/data/network/model/InfuraEthGasPriceResponse.kt rename to app/src/main/java/com/tangem/data/network/model/InfuraResponse.kt index ea9d7c11a2..dd6618ab3c 100644 --- a/app/src/main/java/com/tangem/data/network/model/InfuraEthGasPriceResponse.kt +++ b/app/src/main/java/com/tangem/data/network/model/InfuraResponse.kt @@ -2,7 +2,7 @@ package com.tangem.data.network.model import com.google.gson.annotations.SerializedName -data class InfuraEthGasPriceResponse( +data class InfuraResponse( @SerializedName("jsonrpc") var jsonrpc: String = "", diff --git a/app/src/main/java/com/tangem/domain/wallet/TangemCard.java b/app/src/main/java/com/tangem/domain/wallet/TangemCard.java index f331209ef1..20049ecdd8 100644 --- a/app/src/main/java/com/tangem/domain/wallet/TangemCard.java +++ b/app/src/main/java/com/tangem/domain/wallet/TangemCard.java @@ -1514,17 +1514,19 @@ public class TangemCard { case "0004": case "0006": case "0010": - return R.drawable.card_btc001; + return R.drawable.card_btc_001; case "0005": case "0007": case "0011": - return R.drawable.card_btc005; + return R.drawable.card_btc_005; case "0012": return R.drawable.card_seed; case "0013": return R.drawable.card_btc_hk_s; + case "0014": + return R.drawable.card_btc_0014; case "0015": - return R.drawable.card_btc000; + return R.drawable.card_btc_000; case "0016": return R.drawable.card_eth000; case "0017": diff --git a/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt b/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt index 7aee4cb2c4..be954ee7f1 100644 --- a/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt @@ -105,7 +105,7 @@ class ConfirmPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { if (card!!.blockchain == Blockchain.Ethereum || card!!.blockchain == Blockchain.EthereumTestNet || card!!.blockchain == Blockchain.Token) { rgFee!!.isEnabled = false - serverApiHelper!!.infuraEthGasPrice("eth_gasPrice", 67) + serverApiHelper!!.infura(ServerApiHelper.INFURA_ETH_GAS_PRICE, 67, card!!.wallet) } else { rgFee!!.isEnabled = true @@ -223,29 +223,31 @@ class ConfirmPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { } // request eth gas price listener - serverApiHelper!!.setInfuraEthGasPrice { - var gasPrice = it.result - gasPrice = gasPrice.substring(2) - var l = BigInteger(gasPrice, 16) + serverApiHelper!!.setInfura { method, infuraResponse -> + if (method == ServerApiHelper.INFURA_ETH_GAS_PRICE) { + var gasPrice = infuraResponse.result + gasPrice = gasPrice.substring(2) + var l = BigInteger(gasPrice, 16) - val m = if (card!!.blockchain == Blockchain.Token) BigInteger.valueOf(60000) else BigInteger.valueOf(21000) - l = l.multiply(m) - val minFeeInGwei = card!!.getAmountInGwei(l.toString()) - val normalFeeInGwei = card!!.getAmountInGwei(l.multiply(BigInteger.valueOf(12)).divide(BigInteger.valueOf(10)).toString()) - val maxFeeInGwei = card!!.getAmountInGwei(l.multiply(BigInteger.valueOf(15)).divide(BigInteger.valueOf(10)).toString()) + val m = if (card!!.blockchain == Blockchain.Token) BigInteger.valueOf(60000) else BigInteger.valueOf(21000) + l = l.multiply(m) + val minFeeInGwei = card!!.getAmountInGwei(l.toString()) + val normalFeeInGwei = card!!.getAmountInGwei(l.multiply(BigInteger.valueOf(12)).divide(BigInteger.valueOf(10)).toString()) + val maxFeeInGwei = card!!.getAmountInGwei(l.multiply(BigInteger.valueOf(15)).divide(BigInteger.valueOf(10)).toString()) - minFee = minFeeInGwei - normalFee = normalFeeInGwei - maxFee = maxFeeInGwei - etFee!!.setText(normalFeeInGwei) - etFee!!.error = null - btnSend!!.visibility = View.VISIBLE - feeRequestSuccess = true - balanceRequestSuccess = true - dtVerified = Date() - minFeeInInternalUnits = card!!.internalUnitsFromString(normalFeeInGwei) + minFee = minFeeInGwei + normalFee = normalFeeInGwei + maxFee = maxFeeInGwei + etFee!!.setText(normalFeeInGwei) + etFee!!.error = null + btnSend!!.visibility = View.VISIBLE + feeRequestSuccess = true + balanceRequestSuccess = true + dtVerified = Date() + minFeeInInternalUnits = card!!.internalUnitsFromString(normalFeeInGwei) -// Log.i("eth_gas_price", feeInGwei) +// Log.i("eth_gas_price", gasPrice) + } } // request estimate fee listener diff --git a/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt b/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt index abf2c374d6..f39a8395b2 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt +++ b/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt @@ -40,7 +40,9 @@ import com.tangem.util.UtilHelper import com.tangem.wallet.BuildConfig import com.tangem.wallet.R import kotlinx.android.synthetic.main.fr_loaded_wallet.* +import java.math.BigInteger import java.util.* +import kotlin.concurrent.fixedRateTimer class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notifications, SharedPreferences.OnSharedPreferenceChangeListener { companion object { @@ -73,7 +75,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific private val inactiveColor: ColorStateList by lazy { resources.getColorStateList(R.color.primary) } private val activeColor: ColorStateList by lazy { resources.getColorStateList(R.color.colorAccent) } - private val timerRepeatRefresh = Timer() + private var timerRepeatRefresh: Timer? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -237,6 +239,18 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific // Log.i(TAG, "setRateInfoData $rate") } + + // request eth get balance listener + serverApiHelper!!.setInfura { method, infuraResponse -> + if (method == ServerApiHelper.INFURA_ETH_GET_BALANCE) { + +// Log.i("eth_get_balance", gasPrice) + } + } + } + + private fun requestInfura(method: String) { + serverApiHelper!!.infura(method, 67, card!!.wallet) } private fun requestCardVerify() { @@ -253,27 +267,11 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific nfcManager!!.onResume() } - private fun repeatRefresh() { - val getBalance = object : TimerTask() { - override fun run() { - activity!!.runOnUiThread { - refresh() -// Log.i("efgrgegsdfgsd", "repeatRefresh") - } - } - } - timerRepeatRefresh.schedule(getBalance, 0, 5000) - } - override fun onPause() { super.onPause() nfcManager!!.onPause() - - try { - timerRepeatRefresh.cancel() - } catch (e: IllegalStateException) { - e.printStackTrace() - } + if (timerRepeatRefresh != null) + timerRepeatRefresh!!.cancel() } override fun onStop() { @@ -421,8 +419,15 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific if (resultCode == Activity.RESULT_OK) { // srlLoadedWallet!!.postDelayed({ refresh() }, 10000) // srlLoadedWallet!!.isRefreshing = true + + timerRepeatRefresh = fixedRateTimer(name = "refresh", initialDelay = 2000, period = 5000) { + activity!!.runOnUiThread { + refresh() + Log.i("sfsf", "refresh") + } + } card!!.clearInfo() - repeatRefresh() + // updateViews() } @@ -613,9 +618,9 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific val nodeAddress = engine!!.getNextNode(card) val nodePort = engine.getNextNodePort(card) - Log.i(TAG, nodeAddress) - Log.i(TAG, nodePort.toString()) - Log.i(TAG, i.toString()) +// Log.i(TAG, nodeAddress) +// Log.i(TAG, nodePort.toString()) +// Log.i(TAG, i.toString()) // check balance val connectTaskEx = UpdateWalletInfoTask(this@LoadedWallet, nodeAddress, nodePort, data) @@ -655,6 +660,9 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific // Ethereum else if (card!!.blockchain == Blockchain.Ethereum || card!!.blockchain == Blockchain.EthereumTestNet) { + +// requestInfura(ServerApiHelper.INFURA_ETH_GET_BALANCE) + val updateETH = ETHRequestTask(this@LoadedWallet, card!!.blockchain) val reqETH = InfuraRequest.GetBalance(card!!.wallet) reqETH.id = 67 @@ -690,6 +698,10 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific if (needResendTX) sendTransaction(LastSignStorage.getTxForSend(card!!.wallet)) + +// requestInfura(ServerApiHelper.INFURA_ETH_GET_BALANCE) + + } fun prepareResultIntent(): Intent { diff --git a/app/src/main/res/drawable/card_btc000.png b/app/src/main/res/drawable/card_btc_000.png similarity index 100% rename from app/src/main/res/drawable/card_btc000.png rename to app/src/main/res/drawable/card_btc_000.png diff --git a/app/src/main/res/drawable/card_btc001.png b/app/src/main/res/drawable/card_btc_001.png similarity index 100% rename from app/src/main/res/drawable/card_btc001.png rename to app/src/main/res/drawable/card_btc_001.png diff --git a/app/src/main/res/drawable/card_btc_0014.png b/app/src/main/res/drawable/card_btc_0014.png new file mode 100644 index 0000000000..0450aa659e Binary files /dev/null and b/app/src/main/res/drawable/card_btc_0014.png differ diff --git a/app/src/main/res/drawable/card_btc005.png b/app/src/main/res/drawable/card_btc_005.png similarity index 100% rename from app/src/main/res/drawable/card_btc005.png rename to app/src/main/res/drawable/card_btc_005.png