From d729a7050ef835364288004f0da30dd6b3fd1428 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Fri, 27 Jul 2018 09:30:29 +0800 Subject: [PATCH 001/121] fix mnemonic password bug --- .../neuron/activity/CreateWalletActivity.java | 3 +- .../activity/TransactionDetailActivity.java | 3 +- .../neuron/activity/TransferActivity.java | 1 - .../nervos/neuron/crypto/WalletEntity.java | 41 ++++--------------- .../org/nervos/neuron/util/ConstUtil.java | 3 +- .../org/nervos/neuron/util/NumberUtil.java | 1 - 6 files changed, 11 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java b/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java index 588f1377..ff4b5371 100644 --- a/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java @@ -120,8 +120,7 @@ public void onClick(View view) { * save wallet information to database and add default eth token */ private void saveWalletInfo(String password){ - walletEntity = WalletEntity.createWithMnemonic( - passwordEdit.getText().toString().trim(), MnemonicPath); + walletEntity = WalletEntity.createWithMnemonic(MnemonicPath); new Thread(){ @Override public void run() { diff --git a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java index b40a8720..17531681 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java @@ -17,6 +17,7 @@ import org.nervos.neuron.util.Blockies; import org.nervos.neuron.util.NumberUtil; import org.nervos.neuron.util.db.DBWalletUtil; +import org.web3j.utils.Convert; import org.web3j.utils.Numeric; import java.math.BigInteger; @@ -70,7 +71,7 @@ private void initView() { BigInteger gasPriceBig = new BigInteger(transactionItem.gasPrice); BigInteger gasUsedBig = new BigInteger(transactionItem.gasUsed); transactionGas.setText(NumberUtil.getEthFromWeiForStringDecimal6(gasPriceBig.multiply(gasUsedBig)) + "eth"); - transactionGasPrice.setText(gasPriceBig.divide(BigInteger.valueOf(1000000000)).intValue() + " Gwei"); + transactionGasPrice.setText(Convert.fromWei(gasPriceBig.toString(), Convert.Unit.GWEI) + " Gwei"); } int blockNumber = Integer.parseInt( Numeric.cleanHexPrefix(transactionItem.blockNumber), 16 ); diff --git a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java index f3818bad..64b3b541 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java @@ -60,7 +60,6 @@ public class TransferActivity extends BaseActivity { private AppCompatSeekBar feeSeekBar; private CircleImageView photoImage; - private WalletItem walletItem; private TokenItem tokenItem; private BottomSheetDialog sheetDialog; diff --git a/app/src/main/java/org/nervos/neuron/crypto/WalletEntity.java b/app/src/main/java/org/nervos/neuron/crypto/WalletEntity.java index 2cbcfb1b..c5578825 100644 --- a/app/src/main/java/org/nervos/neuron/crypto/WalletEntity.java +++ b/app/src/main/java/org/nervos/neuron/crypto/WalletEntity.java @@ -39,10 +39,6 @@ public class WalletEntity { * Credentials */ private Credentials credentials; - /** - * wallet password - */ - private String walletPass; /** * KeyStore file */ @@ -74,30 +70,26 @@ public void run() { /** * create a wallet with mnemonic * - * @param password mnemonic password and imToken password is null * @param path * @return * @throws CipherException */ - public static WalletEntity createWithMnemonic(String password, String path) { + public static WalletEntity createWithMnemonic(String path) { WalletEntity wa = new WalletEntity(); byte[] initialEntropy = new byte[16]; secureRandom.nextBytes(initialEntropy); String mnemonic = MnemonicUtils.generateMnemonic(initialEntropy); - byte[] seed = MnemonicUtils.generateSeed(mnemonic, password); + byte[] seed = MnemonicUtils.generateSeed(mnemonic, PASSWORD); ECKeyPair ecKeyPair = createBip44NodeFromSeed(seed, path); - if (password != null) { - try { - wa.walletFile = Wallet.create(password, ecKeyPair, 1024, 1); - } catch (CipherException e) { - e.printStackTrace(); - } + try { + wa.walletFile = Wallet.create(PASSWORD, ecKeyPair, 1024, 1); + } catch (CipherException e) { + e.printStackTrace(); } wa.credentials = Credentials.create(ecKeyPair); - wa.walletPass = password; wa.mnemonic = mnemonic; - wa.passphrase = password; + wa.passphrase = PASSWORD; wa.path = path; return wa; } @@ -117,7 +109,6 @@ public static WalletEntity fromMnemonic(String mnemonic, String path) throws Cip ECKeyPair ecKeyPair = createBip44NodeFromSeed(seed, path); wa.walletFile = Wallet.create(PASSWORD, ecKeyPair, 1024, 1); wa.credentials = Credentials.create(ecKeyPair); - wa.walletPass = PASSWORD; wa.mnemonic = mnemonic; wa.passphrase = PASSWORD; wa.path = path; @@ -204,20 +195,6 @@ public static String walletFileJson(WalletFile wf) { } } - /** - * check wallet file valid - * - * @return - */ - public boolean valid() { - try { - Wallet.decrypt(walletPass, walletFile); - } catch (CipherException e) { - return false; - } - return true; - } - /** * get a wallet file from byte content * @@ -305,10 +282,6 @@ public String getPassphrase() { return passphrase; } - public String getWalletPass() { - return walletPass; - } - public Credentials getCredentials() { return credentials; } diff --git a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java index a0e946cb..107cf64f 100644 --- a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java @@ -33,14 +33,13 @@ public class ConstUtil { public static final String INNER_URL = "http://47.97.171.140:8866/"; public static final String NERVOS_CHAIN_NAME = "Nervos Chain"; - public static final long DEFAULT_NERVOS_DEFAULT_CHAIN_ID = 1; public static final long DEFAULT_QUATO = LONG_6; public static final String NERVOS_NODE_IP = "http://121.196.200.225:1337"; public static final String ETH_NODE_IP = "https://mainnet.infura.io/h3iIzGIN6msu3KeUrdlt"; // public static final String ETH_NODE_IP = "https://rinkeby.infura.io/llyrtzQ3YhkdESt2Fzrk"; public static final BigInteger GAS_LIMIT = Numeric.toBigInt("0x5208"); // default eth gas limit is 21000 - public static final BigInteger GAS_ERC20_LIMIT = Numeric.toBigInt("0x23280"); // default eth gas limit is 21000 + public static final BigInteger GAS_ERC20_LIMIT = Numeric.toBigInt("0x23280"); // default eth gas limit is 144000 public static final BigInteger GAS_PRICE = Numeric.toBigInt("0x4E3B29200"); public static final String RPC_RESULT_ZERO = "0x"; diff --git a/app/src/main/java/org/nervos/neuron/util/NumberUtil.java b/app/src/main/java/org/nervos/neuron/util/NumberUtil.java index c37ed98f..cc05ad5c 100644 --- a/app/src/main/java/org/nervos/neuron/util/NumberUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/NumberUtil.java @@ -14,7 +14,6 @@ import java.nio.charset.Charset; import java.text.DecimalFormat; -import static org.nervos.neuron.util.ConstUtil.ETHDecimal; public class NumberUtil { From 86d977977b5f57a0b8745a70af1c1c9eaf85618e Mon Sep 17 00:00:00 2001 From: duanyytop Date: Fri, 27 Jul 2018 13:20:44 +0800 Subject: [PATCH 002/121] update transfer fee --- .../neuron/activity/AppWebActivity.java | 10 +++++++ .../activity/TransactionDetailActivity.java | 18 ++++++++----- .../neuron/activity/TransferActivity.java | 27 ++++++++++++------- .../neuron/fragment/WalletFragment.java | 1 + .../org/nervos/neuron/util/ConstUtil.java | 3 ++- .../org/nervos/neuron/util/NumberUtil.java | 7 ++++- 6 files changed, 49 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java index 16b3d155..cab0ad96 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java @@ -7,6 +7,7 @@ import android.text.TextUtils; import android.view.KeyEvent; import android.view.View; +import android.webkit.JavascriptInterface; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; @@ -140,6 +141,8 @@ private void initInjectWebView() { webView.setRpcUrl(ConstUtil.ETH_NODE_IP); webView.setWalletAddress(new Address(walletItem.address)); + webView.addJavascriptInterface(new Neuron(), "neuron"); + webView.setOnSignTransactionListener(transaction -> { signTxAction(transaction); }); @@ -161,6 +164,13 @@ public void onSignPersonalMessage(Message message) { }); } + private class Neuron { + + @JavascriptInterface + public String getAccount() { + return walletItem.address; + } + } private void signTxAction(Transaction transaction) { this.signTransaction = transaction; diff --git a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java index 17531681..66e3eedd 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java @@ -61,9 +61,6 @@ private void initView() { walletNameText.setText(walletItem.name); walletAddressText.setText(walletItem.address); transactionHashText.setText(transactionItem.hash); - String value = (transactionItem.from.equalsIgnoreCase(walletItem.address)? - "-" : "+") + transactionItem.value; - transactionValueText.setText(value); transactionFromText.setText(transactionItem.from); transactionToText.setText(transactionItem.to); if (!TextUtils.isEmpty(transactionItem.gasPrice)) { @@ -72,10 +69,19 @@ private void initView() { BigInteger gasUsedBig = new BigInteger(transactionItem.gasUsed); transactionGas.setText(NumberUtil.getEthFromWeiForStringDecimal6(gasPriceBig.multiply(gasUsedBig)) + "eth"); transactionGasPrice.setText(Convert.fromWei(gasPriceBig.toString(), Convert.Unit.GWEI) + " Gwei"); + String value = (transactionItem.from.equalsIgnoreCase(walletItem.address)? + "-" : "+") + Integer.parseInt(transactionItem.value, 16); + transactionValueText.setText(value); + transactionBlockNumberText.setText(transactionItem.blockNumber); + } else { + String value = (transactionItem.from.equalsIgnoreCase(walletItem.address)? + "-" : "+") + transactionItem.value; + transactionValueText.setText(value); + int blockNumber = Integer.parseInt( + Numeric.cleanHexPrefix(transactionItem.blockNumber), 16 ); + transactionBlockNumberText.setText(String.valueOf(blockNumber)); } - int blockNumber = Integer.parseInt( - Numeric.cleanHexPrefix(transactionItem.blockNumber), 16 ); - transactionBlockNumberText.setText(String.valueOf(blockNumber)); + transactionBlockTimeText.setText(transactionItem.getDate()); transactionToText.setOnClickListener(v -> copyText(transactionItem.to)); diff --git a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java index 64b3b541..edae0ec0 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java @@ -66,7 +66,7 @@ public class TransferActivity extends BaseActivity { private String tokenUnit = "eth"; private BigInteger mGasPrice; - private double mGas; + private BigInteger mGasUnit; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -96,7 +96,6 @@ private void initView() { findViewById(R.id.fee_layout).setVisibility(tokenItem.chainId < 0? View.VISIBLE:View.GONE); feeSeekBar.setMax(MAX_FEE); - feeSeekBar.setProgress(DEFAULT_FEE); walletAddressText.setText(walletItem.address); walletNameText.setText(walletItem.name); @@ -119,12 +118,18 @@ public void onError(Throwable e) { @Override public void onNext(BigInteger gasPrice) { mGasPrice = gasPrice; - if (ConstUtil.ETH.equalsIgnoreCase(tokenItem.name)) { - mGas = NumberUtil.getEthFromWei(gasPrice.multiply(ConstUtil.GAS_LIMIT)); + mGasUnit = gasPrice.multiply(ConstUtil.GAS_MIN_LIMIT); + if (ConstUtil.ETH.equalsIgnoreCase(tokenItem.symbol)) { + int progress = ConstUtil.GAS_LIMIT.divide(ConstUtil.GAS_MIN_LIMIT).intValue(); + feeSeekBar.setProgress(progress); + double gas = NumberUtil.getEthFromWei(gasPrice.multiply(ConstUtil.GAS_LIMIT)); + feeText.setText(NumberUtil.getDecimal_8(gas) + tokenUnit); } else { - mGas = NumberUtil.getEthFromWei(gasPrice.multiply(ConstUtil.GAS_ERC20_LIMIT)); + int progress = ConstUtil.GAS_ERC20_LIMIT.divide(ConstUtil.GAS_MIN_LIMIT).intValue(); + feeSeekBar.setProgress(progress); + double gas = NumberUtil.getEthFromWei(gasPrice.multiply(ConstUtil.GAS_ERC20_LIMIT)); + feeText.setText(NumberUtil.getDecimal_8(gas) + tokenUnit); } - feeText.setText(NumberUtil.getDecimal_6(mGas) + tokenUnit); dismissProgressCircle(); } }); @@ -160,9 +165,13 @@ private void initListener() { feeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - feeText.setText(NumberUtil.getDecimal_6(progress*mGas/DEFAULT_FEE) + tokenUnit); - mGasPrice = mGasPrice.multiply(BigInteger.valueOf(progress)) - .divide(BigInteger.valueOf(DEFAULT_FEE)); + if (progress <= 1) { + feeText.setText(NumberUtil.getDecimal_8(NumberUtil.getEthFromWei(mGasUnit)) + tokenUnit); + } else { + mGasPrice = mGasPrice.multiply(BigInteger.valueOf(progress)); + BigInteger gas = mGasUnit.multiply(BigInteger.valueOf(progress)); + feeText.setText(NumberUtil.getDecimal_8(NumberUtil.getEthFromWei(gas)) + tokenUnit); + } } @Override public void onStartTrackingTouch(SeekBar seekBar) { diff --git a/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java b/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java index de54b4cb..5e626d46 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java @@ -38,6 +38,7 @@ import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.service.WalletService; import org.nervos.neuron.util.Blockies; +import org.nervos.neuron.util.LogUtil; import org.nervos.neuron.util.NumberUtil; import org.nervos.neuron.util.db.DBWalletUtil; import org.nervos.neuron.util.db.SharePrefUtil; diff --git a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java index 107cf64f..0bd7dccf 100644 --- a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java @@ -40,7 +40,8 @@ public class ConstUtil { public static final BigInteger GAS_LIMIT = Numeric.toBigInt("0x5208"); // default eth gas limit is 21000 public static final BigInteger GAS_ERC20_LIMIT = Numeric.toBigInt("0x23280"); // default eth gas limit is 144000 - public static final BigInteger GAS_PRICE = Numeric.toBigInt("0x4E3B29200"); + public static final BigInteger GAS_MIN_LIMIT = Numeric.toBigInt("0x9D8"); // default eth gas min limit is 2520 + public static final BigInteger GAS_PRICE = Numeric.toBigInt("0x2540BE400"); public static final String RPC_RESULT_ZERO = "0x"; public static final String ZERO_16 = "000000000000000000000000"; diff --git a/app/src/main/java/org/nervos/neuron/util/NumberUtil.java b/app/src/main/java/org/nervos/neuron/util/NumberUtil.java index cc05ad5c..d5bab0af 100644 --- a/app/src/main/java/org/nervos/neuron/util/NumberUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/NumberUtil.java @@ -17,11 +17,16 @@ public class NumberUtil { - public static String getDecimal_6(Double value) { + public static String getDecimal_6(double value) { DecimalFormat fmt = new DecimalFormat("0.######"); return fmt.format(value); } + public static String getDecimal_8(double value) { + DecimalFormat fmt = new DecimalFormat("0.########"); + return fmt.format(value); + } + public static String hexToUtf8(String hex) { hex = Numeric.cleanHexPrefix(hex); ByteBuffer buff = ByteBuffer.allocate(hex.length()/2); From f86e114e6c2f628675e688c24b0176baa04023ad Mon Sep 17 00:00:00 2001 From: duanyytop Date: Fri, 27 Jul 2018 17:11:17 +0800 Subject: [PATCH 003/121] update const util --- .../org/nervos/neuron/util/ConstUtil.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java index 0bd7dccf..f849f64f 100644 --- a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java @@ -1,56 +1,55 @@ package org.nervos.neuron.util; import org.web3j.utils.Numeric; - import java.math.BigInteger; public class ConstUtil { public static final String ETH = "ETH"; - public static final String NOS = "NOS"; - - public static final BigInteger DECIMAL_POW_18 = BigInteger.TEN.pow(18); - public static final BigInteger ETHDecimal = DECIMAL_POW_18; - public static final BigInteger NervosDecimal = DECIMAL_POW_18; public static final long LONG_6 = 1000000; - public static final double DOUBLE_6 = 1000000.0; + public static final long VALID_BLOCK_NUMBER_DIFF = 80L; - public static final String ETH_MAIN_NET = "Ethereum Mainnet"; - public static final int ETH_CHAIN_ID = -1; + + // setting module url list public static final String SOURCE_CODE_GITHUB_URL = "https://github.com/cryptape/Neuron-Android"; public static final String PRODUCT_AGREEMENT_URL = "https://cryptape.github.io/Neuron-Android/#/zh-CN/product-agreement"; public static final String CONTACT_US_RUL = "http://appchain.nervos.org//#/contact-us"; + // transaction list page config information + public static final String ETH_MAIN_NET = "Ethereum Mainnet"; + public static final long DEFAULT_QUATO = LONG_6; public static final String ETHER_SCAN_API_KEY = "T9GV1IF4V7YDXQ8F53U1FK2KHCE2KUUD8Z"; public static final String NERVOS_SERVER_URL = "http://47.97.171.140:4000"; public static final String NERVOS_TRANSACTION_URL = NERVOS_SERVER_URL + "/api/transactions?account="; public static final String ETH_TRANSACTION_URL = "http://api.etherscan.io/api?apikey=" + ETHER_SCAN_API_KEY + "&module=account&action=txlist&sort=asc&address="; + // discover page config information public static final String DISCOVER_URL = "http://47.97.171.140:8866/dapps"; public static final String INNER_URL = "http://47.97.171.140:8866/"; - public static final String NERVOS_CHAIN_NAME = "Nervos Chain"; - public static final long DEFAULT_QUATO = LONG_6; + + // node host public static final String NERVOS_NODE_IP = "http://121.196.200.225:1337"; public static final String ETH_NODE_IP = "https://mainnet.infura.io/h3iIzGIN6msu3KeUrdlt"; // public static final String ETH_NODE_IP = "https://rinkeby.infura.io/llyrtzQ3YhkdESt2Fzrk"; + + // gas constant data public static final BigInteger GAS_LIMIT = Numeric.toBigInt("0x5208"); // default eth gas limit is 21000 public static final BigInteger GAS_ERC20_LIMIT = Numeric.toBigInt("0x23280"); // default eth gas limit is 144000 public static final BigInteger GAS_MIN_LIMIT = Numeric.toBigInt("0x9D8"); // default eth gas min limit is 2520 public static final BigInteger GAS_PRICE = Numeric.toBigInt("0x2540BE400"); public static final String RPC_RESULT_ZERO = "0x"; + + // ERC20 method hashes public static final String ZERO_16 = "000000000000000000000000"; public static final String NAME_HASH = "06fdde03"; public static final String SYMBOL_HASH = "95d89b41"; public static final String DECIMALS_HASH = "313ce567"; public static final String BALANCEOF_HASH = "70a08231"; - public static final long VALID_BLOCK_NUMBER_DIFF = 80L; - - } From 8006a96f9b107cb586502fe7d3bcd679f4b649a6 Mon Sep 17 00:00:00 2001 From: baojun Date: Mon, 30 Jul 2018 19:21:57 +0800 Subject: [PATCH 004/121] update about activity update setting fragment --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 148 ++++++++++-------- .../neuron/activity/AboutUsActivity.java | 63 ++++++++ .../nervos/neuron/activity/NBaseActivity.java | 44 ++++++ .../neuron/custom/SettingButtonView.java | 77 +++++++++ .../org/nervos/neuron/custom/TitleBar.java | 3 + .../nervos/neuron/fragment/NBaseFragment.java | 74 +++++++++ .../neuron/fragment/SettingsFragment.java | 76 ++++----- .../main/res/drawable-xxhdpi/arrow_right.png | Bin 0 -> 336 bytes .../res/drawable-xxhdpi/ic_about_us_infua.png | Bin 0 -> 1585 bytes .../ic_about_us_nervos_network.png | Bin 0 -> 2221 bytes .../drawable-xxhdpi/ic_about_us_open_sea.png | Bin 0 -> 2895 bytes .../ic_about_us_origin_code.png | Bin 0 -> 869 bytes .../ic_about_us_server_pri.png | Bin 0 -> 1094 bytes .../drawable-xxhdpi/ic_setting_contact_us.png | Bin 0 -> 1104 bytes .../drawable-xxhdpi/ic_setting_localcoin.png | Bin 0 -> 797 bytes .../ic_toptitle_back_white.png | Bin 0 -> 415 bytes .../main/res/drawable-xxxhdpi/arrow_right.png | Bin 0 -> 437 bytes .../drawable-xxxhdpi/ic_about_us_infua.png | Bin 0 -> 2487 bytes .../ic_about_us_nervos_network.png | Bin 0 -> 3517 bytes .../drawable-xxxhdpi/ic_about_us_open_sea.png | Bin 0 -> 4993 bytes .../ic_about_us_origin_code.png | Bin 0 -> 1277 bytes .../ic_about_us_server_pri.png | Bin 0 -> 1662 bytes .../ic_setting_contact_us.png | Bin 0 -> 1737 bytes .../drawable-xxxhdpi/ic_setting_localcoin.png | Bin 0 -> 1291 bytes .../ic_toptitle_back_white.png | Bin 0 -> 573 bytes .../main/res/layout/activity_abount_us.xml | 90 ----------- app/src/main/res/layout/activity_about_us.xml | 95 +++++++++++ app/src/main/res/layout/custom_titlebar.xml | 24 +-- app/src/main/res/layout/fragment_settings.xml | 121 +++----------- .../main/res/layout/view_setting_button.xml | 64 ++++++++ app/src/main/res/values/attrs.xml | 6 + app/src/main/res/values/colors.xml | 8 +- app/src/main/res/values/strings.xml | 1 + 34 files changed, 581 insertions(+), 315 deletions(-) create mode 100644 app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java create mode 100644 app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java create mode 100644 app/src/main/java/org/nervos/neuron/custom/SettingButtonView.java create mode 100644 app/src/main/java/org/nervos/neuron/fragment/NBaseFragment.java create mode 100644 app/src/main/res/drawable-xxhdpi/arrow_right.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_about_us_infua.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_about_us_nervos_network.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_about_us_open_sea.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_about_us_origin_code.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_about_us_server_pri.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_setting_contact_us.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_setting_localcoin.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_toptitle_back_white.png create mode 100644 app/src/main/res/drawable-xxxhdpi/arrow_right.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_about_us_infua.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_about_us_nervos_network.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_about_us_open_sea.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_about_us_origin_code.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_about_us_server_pri.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_setting_contact_us.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_setting_localcoin.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_toptitle_back_white.png delete mode 100644 app/src/main/res/layout/activity_abount_us.xml create mode 100644 app/src/main/res/layout/activity_about_us.xml create mode 100644 app/src/main/res/layout/view_setting_button.xml diff --git a/app/build.gradle b/app/build.gradle index ce50ec59..1467efe2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,7 +70,7 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:27.1.1' - implementation 'com.android.support.constraint:constraint-layout:1.0.2' + implementation 'com.android.support.constraint:constraint-layout:1.1.0' implementation 'com.android.support:design:27.1.0' implementation 'io.reactivex:rxandroid:1.2.0' implementation 'org.slf4j:slf4j-api:1.7.25' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5be4f5c5..d7730b40 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,18 +17,19 @@ - + android:screenOrientation="portrait" + android:theme="@style/Theme.SPLASH"> @@ -40,83 +41,102 @@ android:label="@string/app_name" android:launchMode="singleTop" android:screenOrientation="portrait" - android:theme="@style/AppTheme.NoActionBar"> - - - + android:theme="@style/AppTheme.NoActionBar"> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - \ No newline at end of file diff --git a/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java b/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java new file mode 100644 index 00000000..5f173e8a --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java @@ -0,0 +1,63 @@ +package org.nervos.neuron.activity; + +import android.content.pm.PackageManager; +import android.widget.TextView; +import android.widget.Toast; + +import org.nervos.neuron.R; +import org.nervos.neuron.custom.SettingButtonView; +import org.nervos.neuron.custom.TitleBar; +import org.nervos.neuron.util.ConstUtil; + +/** + * Created by 包俊 on 2018/7/30. + */ +public class AboutUsActivity extends NBaseActivity { + + private TextView versionText; + private TitleBar title; + private SettingButtonView sourceCodeSBV, serverPrivateSBV, NervosSBV, InfuaSBV, openSeaSBV; + + @Override + protected int getContentLayout() { + return R.layout.activity_about_us; + } + + @Override + protected void initView() { + versionText = findViewById(R.id.app_version); + sourceCodeSBV = findViewById(R.id.sbv_source_code); + serverPrivateSBV = findViewById(R.id.sbv_server_private); + NervosSBV = findViewById(R.id.sbv_nervos_network); + InfuaSBV = findViewById(R.id.sbv_infua); + openSeaSBV = findViewById(R.id.sbv_open_sea); + title = findViewById(R.id.title); + } + + @Override + protected void initAction() { + initListener(); + } + + @Override + protected void initData() { + try { + String versionName = getPackageManager() + .getPackageInfo(getPackageName(), 0).versionName; + versionText.setText(String.format("V %s", versionName)); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + title.setLeftImage(R.drawable.ic_toptitle_back_white); + } + + private void initListener() { + sourceCodeSBV.setOpenListener(() -> { + SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, ConstUtil.SOURCE_CODE_GITHUB_URL); + }); + serverPrivateSBV.setOpenListener(() -> { + SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, ConstUtil.PRODUCT_AGREEMENT_URL); + }); + + } +} diff --git a/app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java b/app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java new file mode 100644 index 00000000..91adc11a --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java @@ -0,0 +1,44 @@ +package org.nervos.neuron.activity; + +import android.os.Bundle; +import android.support.v4.app.FragmentManager; +import android.view.Window; + +import org.greenrobot.eventbus.EventBus; + +/** + * Created by 包俊 on 2018/7/30. + */ +public abstract class NBaseActivity extends BaseActivity { + + @Override + protected void onCreate(Bundle savedactivityState) { + super.onCreate(savedactivityState); + if (getContentLayout() != 0) { + setContentView(getContentLayout()); + } + initView(); + initData(); + initAction(); + } + + /** + * 设置布局文件 + */ + protected abstract int getContentLayout(); + + /** + * 初始化UI + */ + protected abstract void initView(); + + /** + * 初始化事件 + */ + protected abstract void initAction(); + + /** + * 初始化数据 + */ + protected abstract void initData(); +} diff --git a/app/src/main/java/org/nervos/neuron/custom/SettingButtonView.java b/app/src/main/java/org/nervos/neuron/custom/SettingButtonView.java new file mode 100644 index 00000000..d66ec2aa --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/custom/SettingButtonView.java @@ -0,0 +1,77 @@ +package org.nervos.neuron.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import android.support.constraint.ConstraintLayout; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.widget.ImageView; +import android.widget.TextView; + +import org.nervos.neuron.R; + +/** + * Created by 包俊 on 2018/7/30. + */ +public class SettingButtonView extends ConstraintLayout { + + private ImageView iconImage, openImage; + private TextView nameText, otherText; + private TypedArray ta; + private openListener openListener = null; + private ConstraintLayout root; + + public SettingButtonView(Context context, AttributeSet attrs) { + super(context, attrs); + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.SettingButtonView); + this.ta = ta; + LayoutInflater.from(context).inflate(R.layout.view_setting_button, this); + initView(); + initData(); + initAction(); + } + + private void initView() { + iconImage = findViewById(R.id.iv_setting_icon); + nameText = findViewById(R.id.tv_setting); + otherText = findViewById(R.id.tv_other); + openImage = findViewById(R.id.iv_setting_open); + root = findViewById(R.id.root); + } + + private void initData() { + String text = ta.getString(R.styleable.SettingButtonView_name); + nameText.setText(text); + int icon = ta.getResourceId(R.styleable.SettingButtonView_icon, -1); + iconImage.setBackgroundResource(icon); + boolean other1 = ta.getBoolean(R.styleable.SettingButtonView_other1, false); + if (other1) + otherText.setVisibility(VISIBLE); + else + otherText.setVisibility(GONE); + ta.recycle(); + } + + //set other1 text + public void setOther1Text(String text) { + otherText.setText(text); + } + + public void setOpenListener(openListener openListener) { + if (openListener != null) { + this.openListener = openListener; + openImage.setVisibility(VISIBLE); + } + } + + private void initAction() { + root.setOnClickListener((view) -> { + if (openListener != null) + openListener.open(); + }); + } + + public interface openListener { + void open(); + } +} diff --git a/app/src/main/java/org/nervos/neuron/custom/TitleBar.java b/app/src/main/java/org/nervos/neuron/custom/TitleBar.java index ad2977fc..5cf96858 100644 --- a/app/src/main/java/org/nervos/neuron/custom/TitleBar.java +++ b/app/src/main/java/org/nervos/neuron/custom/TitleBar.java @@ -79,6 +79,9 @@ private void initFromAttributes(AttributeSet attrs) { mTitle = a.getString(R.styleable.TitleBar_title); mTitleBarCenterDefaultView.setText(mTitle); + int mTitleColor = a.getResourceId(R.styleable.TitleBar_title_color, 0); + if (mTitleColor != 0) + mTitleBarCenterDefaultView.setTextColor(getResources().getColor(mTitleColor)); mLeftText = a.getString(R.styleable.TitleBar_left_text); mTitleBarLeftDefaultView.setText(mLeftText); mRightText = a.getString(R.styleable.TitleBar_right_text); diff --git a/app/src/main/java/org/nervos/neuron/fragment/NBaseFragment.java b/app/src/main/java/org/nervos/neuron/fragment/NBaseFragment.java new file mode 100644 index 00000000..8091974f --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/fragment/NBaseFragment.java @@ -0,0 +1,74 @@ +package org.nervos.neuron.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +/** + * Created by 包俊 on 2018/7/30. + */ +public abstract class NBaseFragment extends BaseFragment { + + protected View contentView = null; + protected boolean isFirstLoad = true; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + if (contentView == null) { + contentView = inflater.inflate(getContentLayout(), container, false); + isFirstLoad = true; + } else { + isFirstLoad = false; + ViewGroup vp = (ViewGroup) contentView.getParent(); + if(null != vp) { + vp.removeView(contentView); + } + } + return contentView; + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + if (isFirstLoad) { + initView(); + initAction(); + initData(); + } + } + + /** + * 设置布局文件 + * + */ + protected abstract int getContentLayout(); + + /** + * 控件初始化 + * + */ + protected void initView() {}; + + /** + * 事件监听 + */ + protected void initAction() {}; + + /** + * 数据处理 + */ + protected void initData() {}; + + /** + * 查找控件 + */ + public View findViewById(int id) { + View v = null; + if (contentView != null) { + v = contentView.findViewById(id); + } + return v; + } +} diff --git a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java index d269f5ab..f3fbe964 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java @@ -1,5 +1,6 @@ package org.nervos.neuron.fragment; +import android.content.Intent; import android.content.pm.PackageManager; import android.support.v4.app.Fragment; import android.os.Bundle; @@ -8,74 +9,51 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import android.widget.Toast; import org.nervos.neuron.R; +import org.nervos.neuron.activity.AboutUsActivity; import org.nervos.neuron.activity.SimpleWebActivity; +import org.nervos.neuron.custom.SettingButtonView; import org.nervos.neuron.util.ConstUtil; +import java.util.zip.Inflater; + import de.hdodenhof.circleimageview.CircleImageView; -public class SettingsFragment extends Fragment { +public class SettingsFragment extends NBaseFragment { public static final String TAG = SettingsFragment.class.getName(); + private SettingButtonView localCoinSBV, aboutUsSBV, contactUsSBV; - private TextView contactText; - private CircleImageView appImage; - private TextView versionText; - private TextView sourceCodeText; - private TextView protocolText; - - @Nullable @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_settings, container, false); - contactText = view.findViewById(R.id.setting_contact); - appImage = view.findViewById(R.id.app_photo); - versionText = view.findViewById(R.id.app_version); - sourceCodeText = view.findViewById(R.id.setting_source_code); - protocolText = view.findViewById(R.id.service_protocol); - return view; + protected int getContentLayout() { + return R.layout.fragment_settings; } @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - initListener(); + public void initView() { + localCoinSBV = (SettingButtonView) findViewById(R.id.sbv_local_coin); + aboutUsSBV = (SettingButtonView) findViewById(R.id.sbv_about_us); + contactUsSBV = (SettingButtonView) findViewById(R.id.sbv_contact_us); } - private void initListener() { - - appImage.setImageResource(R.mipmap.ic_launcher); - - try { - String versionName = getContext().getPackageManager() - .getPackageInfo(getContext().getPackageName(), 0).versionName; - versionText.setText(String.format("V %s", versionName)); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - } + @Override + public void initData() { + localCoinSBV.setOther1Text("CNY"); + } - sourceCodeText.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - SimpleWebActivity.gotoSimpleWeb(getContext(), ConstUtil.SOURCE_CODE_GITHUB_URL); - } + @Override + public void initAction() { + localCoinSBV.setOpenListener(() -> { + Toast.makeText(getActivity(), "open", Toast.LENGTH_LONG).show(); }); - - protocolText.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - SimpleWebActivity.gotoSimpleWeb(getContext(), ConstUtil.PRODUCT_AGREEMENT_URL); - } + aboutUsSBV.setOpenListener(() -> { + Intent intent = new Intent(getActivity(), AboutUsActivity.class); + startActivity(intent); }); - - contactText.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - SimpleWebActivity.gotoSimpleWeb(getContext(), ConstUtil.CONTACT_US_RUL); - } + contactUsSBV.setOpenListener(() -> { + SimpleWebActivity.gotoSimpleWeb(getContext(), ConstUtil.CONTACT_US_RUL); }); - } } diff --git a/app/src/main/res/drawable-xxhdpi/arrow_right.png b/app/src/main/res/drawable-xxhdpi/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..05b521cf0041c1aa56c695d3fa8482b48a48b01f GIT binary patch literal 336 zcmV-W0k8gvP)aY^3Fm{eQ-nGFHfL$=tPm*ObUue-B8zfFgx~XEfJB);Q zuCS*$?m7>{-h}d%HI^YIRH0I+Lxs=;{XkQcgElCGwkU;F5J6W6vBWX=ap{3BTt~TM`9^mzNp()FC8#qBLnCMkaxwQ>`mkcoEv<;8BPPX8A&^pa`!^Q9`+iv`;engCp8l||CT5ju%Q!(I>iy-oyN zPT1%gD_O2)3z$r2l!$G8er(y~LzUL4GQKi}5>ojB68S}xYmL41y}54(FPQ=i*zGvB zGlJnBH->y}^m$zvV66CTR=9cg9c*?YQ!4Q1qsb(W|BxlXI-c1+gcnB#Q70C$iMUaW zRH$jlRmw;%6p$w1SZ)zla|;MM&69~SKx!TFIPuQIduSm|SxFNu+1H6;n@^rrgWu^; zhLB;u(}qExi-uq3U$&B{L!uRHWULT)g?$&5R+{LuEx*P9$s&i!V_!Ah;-02`2#T^+ zNcH8pX-rqBF(3*%=mCedNr{ym8lBFw4ZaQQtq(w2TVhg3oTze|dR}s=nz^~3n+GWI z$PlR0RX-;4_%@bSCsg9<^o?0e+?YpI;?~aiT8Z8N4sunHb=qJlek7;x3col#gKwrX z_ve1>M7*p27aDI9ge>3kTiY4TV#nr1?o_!7{20S(lGezx-1h9W7hzCLe zM0~tCYRo+%y*VSatfqJ)fTCckSi{fp1kT1Y_>z{oGGD-axq?OBFnY2jlV*e6Qp5IM z4_pp6eodq)tB&2_Uew5YF_TBh!ceGI1cgdj9=hCPvtfh)ACCrcfS~V+gb;Qz6b#7F z#f4G@<0sG4Qgf)%owXVTENN+>RRb;u?&xvhiJ?9`y(@~*fCukgO5nBBjAA>wV+gP8 zjuPM^PW*liUtCW!1PYidmXTd*H}XYHr1G%-bPc-$UYtI14?K=`IPD|U!bYX<9UjE@ zF?oTKds33GlU0Wu_eDcE${XfUYQN$hTG1kwBB^+x5)N)M*58A%(49EW=kH>(_+&DU z)7KKXzEHwkp+FBaVROyC&0$EcHX=iScB>VKhkNn%1Q6-*V1K_Kj|~U$)V4u{{a#`w z=qfKY2~j~LacV>>@m0scfgT);_9C6zf)jtn@zwPd&Lwl0;^BId%9NRVS#1oEjQy-s-g=oW5H{ zw5TX9sip(zk==n|qo+(QD9RNom9>>yG)D6)h3ZR~N?RsL`pW|b<(4YvmU)~08Uy5J zaTb)v&tAYVi`58Qh%M}qf>qNCR>riQNR(KfmTalC664uo1=GC#L`nW@Em*51B)NB* zc~BLsd@+0Dz^F>xdX8#B$F4CzPGrhuyniXqo&AKCPwXe_`(~0+ij`$rPaO9T6w3K@}dJ*nD2K#%ODAGBpQj|4vJL zs}n2|TV=_56M%Jid1v0gdEmCZcKRH0jkJR^2T0zi+l7xG8r8#EH>dEgJ4x_Fy$&;c zW){>Bz{nOn69a>>GHw4 j+ek3+OTVSt{~O{T!9qp_er?~z00000NkvXXu0mjfJ1z3& literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_about_us_nervos_network.png b/app/src/main/res/drawable-xxhdpi/ic_about_us_nervos_network.png new file mode 100644 index 0000000000000000000000000000000000000000..ba856b5b0330021ba84ac6fc49dae07ba75ee554 GIT binary patch literal 2221 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_about_us_origin_code.png b/app/src/main/res/drawable-xxhdpi/ic_about_us_origin_code.png new file mode 100644 index 0000000000000000000000000000000000000000..d213bc3997389cefd4dea6ee8da71ec24ea4b6a3 GIT binary patch literal 869 zcmV-r1DgDaP)E7{~uRy{x)yFBoOI1!`Ao5CnG73&CEcbyX2WWnZ9+ zK1!cJ=t}7I!d^fs(o%@Z(j+QMC@?coS=%h~Wjp_d!_1Cz&Yan0+PUz#@ywa?oaZ-rFj2z+5}f zxD7~d@P;;fjufzIJCJPwre=ZBk7hvLR*?c8-4Co25e9~V#U*cOv**YFsa{)!>hTjo z1GZ;@=EmT!_o}xg4IJJF)Fy*{-7P`^b{qsw<$wci?k-lBGg7@7C-?YKCyoH;I{+R8 zOwAaOa8%{%G|=}<-@R0?|CN(_W1oN*Z-LefaPF8nq!FMS?&@7&Ze9&Y_5RIVq23$U z%;hAx{Wv^iAfOj6Ur@vGjh}kbV|gV!q!utNoK)|dM?DG1zY_AfYq(RIoKymy&e>{w z7mI9nFA$_0gG==WT)D@3uMzUrBVhQwos%a;ER`t%Cxr@2%l5KRzggw()XSNxQ_pD) zr0RgJX}e}N?|xHSRss%=05=|r*;Wf&JZ@iPN?l8zs2)!(Cc8#jz;$)n>*>%aaDS+@ zFZYuYkd0n{0Ioj(YBt*I7jIjBR-&F*PIN}N3j%I;13^+ycr#rFmj@umJ?wO(9xp2lEpnTu0}RX vb%croG}$cvnjYq!`oF-*M7BiS{|)gM^n??7Wd2CU00000NkvXXu0mjfxwMW& literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_about_us_server_pri.png b/app/src/main/res/drawable-xxhdpi/ic_about_us_server_pri.png new file mode 100644 index 0000000000000000000000000000000000000000..77f1b010a16c8c8e3e7246c3d88afd8f5353750f GIT binary patch literal 1094 zcmV-M1iAZ(P)B8I6vsa^wN@8<5D`=@wN&gCYDuk)2ni7pA(0SI-o&fF zz$;I-2SkF{LI}0YEAuhL%SLM!_#4y%vg1-Hst`=@x zg_ahWQv{>O!h&Krf6AF3qZOZEj|?bY0i#4|Jg8NkJT$Icz21;}{R$56gP%Xl>NnEg zumz^gH12-?)~eM`u(Mce<5uX^8yXwoZ51>%xhrg_hpI|5Re{js>?a3Y z5yuT?k~|9vp?4n$xv}K0IAl%jJ$(#!@0gkFUX$^za-9G zJR7;K#?MiCMpoG-PDaj(*-H*Vb*)~I(tGe#LQ7i|uQZl@`AovjCo>WVNWkyfc2>-G z;spO%?-yLVtNdsPbBS^#8DZ$RWSRH^`r<;>*>WB zC&j_sg^(@rPXqXo15oqD(a}eugT}iNo_V$^?l2aA>&a#|!PURT1& zqwuNP^nE-NBRFZAQ#@$$4?|Pp?dv8Ohh;wh`X{KaoGJ-lp;d~KDt``Tk3g-NB={$o zHvzJ;;iIIpJ-Z?UbCSrZ8vnOgiwMPy%k4%^)%&;L^%8g{Y0GP#*4=!-zXdgGv@<#V zJ^l&$u!f%{c7owA4jS*0iFEm_p{SQ29tU=UTGuHwGb9VcMt}zL+8R$qu>F$go7nJN z^9H6LbF`LgvZtn)zavey(o%o!0y9N*dqALd=XR;TEzmlza6Sa=#}yjy67m@r9Rz~#NTv$rxSYOj`NlVQrFpw-gfBjOWOMO78iRkFto5}lSr zza>h=ef@txP`?SMDui1w^uan+2@cH>g8DUGV_d31ISIEws{b3}H~PdN0BQz1p8x;= M07*qoM6N<$f+LXz^Z)<= literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_setting_contact_us.png b/app/src/main/res/drawable-xxhdpi/ic_setting_contact_us.png new file mode 100644 index 0000000000000000000000000000000000000000..9790c984b215b4538a9521b7505f955c5985025e GIT binary patch literal 1104 zcmV-W1h4yvP)n;(^p9T4|biDi6H% z&6C7?Uz#)x5t8ykB3ez2h=@zwf)KQ7s$+(Bj9`=*gK?QT)<56b5jkhy%whIFIs5GM zUDo&CYprj6YweTD7@8l${*zF93v}O^=+_%Ym%`#%p!-x)OD6OEPI%JVnY41(?$ran z{TkBJT++yit~iNXT4qfu#4X*~J{P1MaZ3jcNJ3xY33lm-mWunpxH2fSu+ZN^LXYmy z`V5-PG&dTc`Ud>p+>sUFtqAt%1&e0FICU4~N34 z#n9JCW-@TO#%ZeYAv}Kp1Nyx_?-IEyx|YZU6< z9@^U7ebj5aJZgi#jWgJ8%ST@{={i`mH_}62-BUOGG2ayOC_l54=+^$_}p~Ek< z_${m*zha)7FIin<#EwV=XHRxZr);Ol)Sr&`qmsXU!6z=q(|nPeUYUPfzSdBJ<#tL; z$~tz>5b0)Pn6d%Un>FptzgEZ*e`~x-VbL^&6-5 zK!P%j{7rFe!)CblZ;+_)zSDoe#w~EA*5ax8^k-AT=L8ZQIm8J#Vxi^5OXuX_BK=3S zTX<@H4!>V;V?6o(GeR`z?bbFsrV0ridqR<&E@24N;O#~?ed@R{G4c96d7k{B*?|%1 zn3w`pv_f4}0UAe$Ehvkkk_i^*>Fa&B)o8spq@YIsf{+672;ijo2 zOzfNe+7N=W8j(}2p(Ns-B@KlcJ*`eD9c(^l0%{w)-ssaB1(;o9O}3!=g1CvMrX zqg)j?W~BQq-#u{36;^SHdE*O0@XVi}3`G^3K7vZIJ%>9UI}2iBm7H6CamD&GJ8N&< zgB?{JC#MIERd#B^`$j=D_%2B&pP=3YCl%tB)(h*TLfq1No30nuNrO0vTPo>)L%ag{ WYZ+ha2R3B@00009v&{G5@7(_;dT98qcQ52Mf(ZvD_Gq0rOOnb2#RC3lFXCL)E^m~}uXRo#Q{$}m_ znNZZIZx9+=p`#P}hnQ7mXF}l;IItaZvLMtu5RG2C3PV36l6Vp_ZeE+;OlqY z->X&a;%#f8x-v1GG!_b3zYV2uwie0?ydvm+Y6L6GZQ<)p(DqudNUZa-Vc%9*UjoPW z!o@4@JChp0{9Ft5ygf0Tc=YtcwY%{4BV?q*u1(&`X;7 z*oYaQlj&QJ{ZW(IVtFcH%<1&uSZZqDDW>*QHSxjUeonrbCok-v5DT%-4iilpfWyPcOhp$iBii` zkbA5gY(*$EPe2oC>(JC7__46xyzefHziIfCOMMkC{&{7L%?c-yRfe#=+D2QU1_ z0~K(@j4xSySFM2GW()IEavl^(8=6!=St81dpzfeng_|wWGNc05H<>#_A1qqv1`)4x zS2r}7MO~8$C`(A=L#_Dq+no2}=|&7bpu7_fs)Q{()l2zI{up5k%iDC>=z}I<61Gs# b|AzPj>y);;G4<<$00000NkvXXu0mjf#Grn# literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_toptitle_back_white.png b/app/src/main/res/drawable-xxhdpi/ic_toptitle_back_white.png new file mode 100644 index 0000000000000000000000000000000000000000..d508e6768235f347bd6e02dfce2f3ce6aa8b35a4 GIT binary patch literal 415 zcmV;Q0bu@#P)6c z7!>pY;XrLq3b>6UcpqUn--{ekR(!LXf6>RYfxI{yD2lTHowzli8@B>X;>Lh!+z7CV zYXi1%Er1g*1i0~BKqCGSkcwvllJPr0I(`MXh^K(7I02`LcABBdn4?K_9u~BLyONO^ zbt!~^%XRqq&5d5Zp8#HuhID*X9U9tnWS5&b*J-F)Z@npqX7L|EImRZNa4|$g#fj6q zDL^+akSo9iatBBwnSdnn5RgK00STlK;38T82hj#>5hK6`F$PQ#E5HP?26Pb?po6f1 zB18npL&ShAWV>1pM1fnx5B#Q24<*002ov JPDHLkV1g2}rHcRn literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/arrow_right.png b/app/src/main/res/drawable-xxxhdpi/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..19753443629b88ee1989bcb7785259a830e7ebdd GIT binary patch literal 437 zcmV;m0ZRUfP)iL?Xky>J-&=@se^GLYVD>`P(mpXkXq4J@KRL> z9uSwOqVUk7@+S}o@e2?Sh$18;f>0|Zs+1BT(Mv)EZDHjDJU9;g;O9W%2m%J!K?W;;Qlv1l1Ryg$sG2npoeyCoRs!al zJuHP-1I9re7QoXJ1iat9@lKRQthUqI$)J7S_dei#u0UV*Lw-FJhFRvr;sdWeS*p;V z;nRmdU%&<;KPn z{n|sYDrKN5=C%j!4_M=^0In{q;h)n>+X?QT)&~OtSo~AqC|mR@4SVS@iK^Iyy-0rc zZ7y$(%-k^GMu;`mr@kKQPmPWA@3p-tyJLM#T1!HV6^dLREb@jjp;#b@XfT8r7j;`W zfX;XngNXzNTAI)skD#k5g!U-OJ3ItQXmO*0pIv+#D;pbzRxBLCZ_bWmAQnZ*a!ips z!P-U{bGZ^`(>Y9MbC_7mU?x*Qx>QEKSVg{EMxjzdNeh@IU*aUjMehP&L#JHD)5m&n zyo-REVn{Yc(9;}7H}AczaU`2#XqH$kISmO$&yMj(S}MFRXUlkz4$v(j_IawW1O168 zs~l!sp0y>IZBRN17?6wk0%p?dn9XfqHe19(u87H84yl$HcaRFF5N(%$JIk$iUk%&i zD|q3N5kSm}rWg_33O^)eN78mr!LzeA^xE=%Y+?ykOF3n(-&dF>^ z>`+zvU1bT4JFPoVl)*+YR*2h9kRCa^QBOcfPwhE5vM}2jpjXS>pLyTv*6v{HZHL?) zz`?qf^2G`+P0irq!~!nQt}y7RZyy;3Ge5d;6{mX=I6IicH&Y#Giio96UYYXP&0yct?N@FpF!CAoZpuw^724be7pv8W%sF z!JAAY-(OpI*l`WC5#}T{d$S*Ijp1ZZ2fi`bi_?8=7)>;xDI9^xVN4q61T0$s`F-^P z>_|~s43Qauq_meA&fQqsz?<`{xHvh7t8-~gW^%|VFer;*jpJp8+W_i}m`dmC=4Vw| zMwXSD_9!GqcX7t;sdxS=1@uY6&Cv)(+Y=aWiD0}ljx&8pJW647MuJAhpBz!I@diuiYv^CzF;4OoN8 z%^5n6Fo749l?b*rP$NVOVXo^F+*Y3Zd<+IF^iYqox~fntH?7Cwt;G-F2bjedAv8l{hr!2Bn)$g z*47Unz#K@eJlxe{*35qvX=Y-O5`KVb+OyQ;cZQQ}Z$n#z4y0Tn&T>7tpkPe!v2|9D z@5Wjbgir{A(?_d0H#UqPez70d7ScFRjlcZvM`l-WwLU~%#=7E^gS@=_gYLI4K7cuh zn(AhgE7o(+LoIHjfKQx3>$pnH?0xi;Z zjJ5iERgw7AMP_f7R23b~7M?#bjOULJ;a^M3XtBr-t;^N8*IbPO=42y`d`1-9>j9<10f zfQ*nGNgF4|db70D!@GRiCFf0j54PS1ya$!Ct1LCXh8e(nAJb}0YhCd&j>GjH&RS!o z9FEht34}AIR}exSj^@zo5^Bs-9Ct)=Ry1w-%O;KO1^aBm_4l#jwZZ)@dd0*&0=Ezx0|y}1s4sK z`m2^8U$q2~;H#D-)3?Dy90T!YzKw|Stps1SgzMQ$fWY*srMO8GilzTPwTyu!y=pO= zy0HSCip=v>%N$eAsr4KKo(w_eu*&gDsPcT}viViZ=~Nfvgpr1{>)zMOrB{ z`dZhe=!$Xulp0ntfDwqJQPugB9J8mNy!wVuFaKt}-_nVQxU+41`!Teq-7JlR)vP9N z-p%O^U~hsA19o%a-DlF9!A4qL-WuuaYtqIGa;=RshR!gi-i!a`;SusCMOY@s^fqhn z6OTx2)Yxu=T$Q;Tu!zFhfgSY+h5lw_L|HeZtWqJ#9?Snll$*eKI{5Vg-9 zcQ2s2b2e&p4LdED@P5DF2fW`k=*NEm`t`?QDa0BuKXo}QfKx*Rtl#wD By;%SN literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_about_us_nervos_network.png b/app/src/main/res/drawable-xxxhdpi/ic_about_us_nervos_network.png new file mode 100644 index 0000000000000000000000000000000000000000..9b46559e36dbc1c647b38169e880c65f9b79591c GIT binary patch literal 3517 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_about_us_open_sea.png b/app/src/main/res/drawable-xxxhdpi/ic_about_us_open_sea.png new file mode 100644 index 0000000000000000000000000000000000000000..f960c3210b9209f5ddac3c396801f1281397124c GIT binary patch literal 4993 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_about_us_server_pri.png b/app/src/main/res/drawable-xxxhdpi/ic_about_us_server_pri.png new file mode 100644 index 0000000000000000000000000000000000000000..4b6ec939f1504a7620bd7ec491881dbf1ca8c669 GIT binary patch literal 1662 zcmV-^27&pBP)LUu6%K?gJ#bPA>kohH+ntfujy zsi&rg-uoMR=z)itp{7!&aj+su0xwj^fQ2`_E1C*kK@0_@?|0T&u6;O=d+)_j!!o+379n-$jz5u!F>#Ie!w?-f$zTo zPM^4+FrhqI3xKujfvJzc=La^C!4e=DNsK~1a2iik&iWw+{)kbq3Se2Yu|k5?=ii`W z1+Z+!zHz@BJ7JcbJZjT&QfQp#jXA)RqLyKg%>foI22y7L|J(vP4gsB~!|rbM0Zy3; zRICMZo(TrGe5HUs2yEL7-0lxfa}bKIDgAgR@cu`kU^Sp@8HDxk0P*hm6g_|`{%za@ zOi5AjhVB7}+JPP0fxlV-E%IkR3B0~R4}oLX{ZOT60Qt*-jCp<;6+RndM-WFiEx!xy z=1q21K3gxobNRG=r6BSVRAZmsYp)yOu9{bphj--p z7lDQyz>VuFW%3l6rtbntqTP_LT?M}U9O&&)Vg29o8!$apwad6w6~MtiMXS4`bJ%ii zuw__1Z)^mLO5A~ERmVF7tZ-1%nm2(*r>W4bKH#gWP_R00{m;PVZWT(N49uIaQ*67= zIQ)X>mQUrF%DKk&H33~0fx!V2Kbnv0@a|oc$|bQdTZK8@w|=cSY;qW1TpTcSmK;$s zC=iz<>Yh`w4|tMfUHz)5fA>zAnsp}Z)W`F+tlX5^(-5q+ zaqv3N=#XvKKH#i{KytFG`05p)Q2>WS^2|v&CS(e_rKg2^3l^!;_oSZfTSM!!PJQNNdmL!)*3EkX4w4J94>&2n zT{gmF!!1#0ur3XD{^H-Ewe^YF2_jySHdh13j>!5SRN*lGo$u0NH0Cc_SPV>?u4?JK z3G5nWX;?YTSuh4**=S?|Q;I4sQDFK1s~j_<$;CW#HT49}Y#k26jV$1z64`YFOM|B1 z{VgMRohH`QG?PYQWQ-_sfO%%-FEicdF018Z6RUib#&`^pE?pRX7N{JK{v!vtxKuzS zsLpYxJ$iWLj&cT2Y}M4-tbJqRMg}msYq9>L@jnEX%5_R+COnFo?QOw8DSK1da7p%$ zC6^8Oi!EDWrs%n|z=@-wwIvAmD@Cr(UTo58wggXSg8krQr9$rf3216Gd2RZ<=P)~& zXIZ;@>O;Fm74y9h0SY9Ve%~EB?a5iKFH?VZLEdwi3W63PDPT~5&@?9ZE%x^VwcA41tu8+XuD5`f$nip> zoTjo0BW3A0x|EZ7H@bvnN_gh;2Jj5gowdHp^+_w` z^=qDia8j{1=Ws@*IYKBxMhRFBj5i$S`lJFtp`*6O2?IRO>kVMqimR(U@4TA^yqVH& zdJ>^B4*^GLp#QgK>~nZ<&~#GUr%g;`eAafY{c+H`eZW>j+T08WO^jjI^e0SZz3xoK z_5t%@m$pG=W|=!7(*q=gAzVce&_RzA%U36r`B2@CzL;=y)smw%!JVjNC ztS-nI-~kaRzWqX8rfx9GJAv~VLL`Vc6*Y1X6^1J53@|};cL7zOiD{-(J$cYJCNBXG z3;>7Qfw~{UHW0)Oefo)9w7Mk!loQP;Ma-~nogsY|Q?md|>8{_lEX1+aX> zB!CM5mlspxYMh8su&P~}ioiq$O>D#{q`pkktZHkX@So!S3!u24(0g*uvH$=807*qo IM6N<$f+i9bEdT%j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_setting_contact_us.png b/app/src/main/res/drawable-xxxhdpi/ic_setting_contact_us.png new file mode 100644 index 0000000000000000000000000000000000000000..0f3b999be74f3d057a29218de296920e67385835 GIT binary patch literal 1737 zcmV;)1~&PLP)5Q{uWrAk_j6wm^q0;P~rEL172^g;{e*6RAsbet(|+C69Qb4X8F z$v!h@_RN~~?U`A#)|$N&{uROq9clu2UF-&~-_WH~GfhbbG8O=W zKufzWj<0k{4zPJWFlQDJBD8o0OMDziVkCt)h2wQ(6-4z*jKmrSY~P6Id>Akl)N~@rxy8dh2^ji!3tyMU+q2u>z{(qt8ax}Q7)n4Kz@Z2pNdudZGLuJ970=YLZ# zsLm$f6IH;4V&N3$155LinKzys*F=%DT>#F=KKa{e;PRF6Y6Vx8@X^P{mJW(->0)5* zDj@q_H;zL?z_Avf{xHzlcDi{B=o^qJJP6zpV6$eb=}r4q zQ(_`ez8qMw1gJd#H2kjb1eXQ|IDH=Q?u)>Jxkfndd$ewv&Z=oUG;Hqa-2B-K}U(A*Zec$^*I>;oE47#`0(22ei)LB0TUt!)rtG}Sc% zr_bqs{!)VOxvY3_@2*(kkDqSs3-I#$RTP2Ddi#N&j%v34Q)>0SzZgC%3r*fn&KKZP zO9*OXZZ|>F@m9k#M-Uv0WQoo0-O-xf+i}!^A`L*^P7aL-6B6|AzcxA?s)dX+Z8)gR}pOS(|xtVs>^D~8B zavL5UU5g{J@k!+ojlL7vzp6FL{IpxI6hmbG9J|Cl9}!^gi8=SF&N!7X^{M;}vDZ}XuXJmxNi6X0jXs?uQl#ZfZNP z0t=!)=ubab1RVIoji2W=%;~JD`A-8@m&GEbbMo_X(~~WeDV;dy8L(~TXstXk>*(CI z`?h8B+M8#~d9fJ8HGY7}>reY=w9DNV-I&ee4QpRT5R#J07=vOxsW=@x45D>VgR zpuwgiCnaXK&o1$v_dLRyq) z1Ym$IS-7~YCpz|7Vl6S|Ovm8%hm>SV#lyC(JA*THEY=!|TS^<(D-q~RPXY96HPK9E z!2ZW0=7b@8#5H7{KH+a08@gSjsc*nuJEo7jWs?cm>vrK#uLKj)<%p)bUQJ~l#A#}6 z*STQQm;qj2VZc%Yx15*#T$Y1AVSKnmDZH|!Cal9L&m)^4DQ19+3yj!b)EedU${OI2 zQg!cT$=g)3UxM+X`Gcg0w6v=LbnCRC&oygrD{UQPxlxJLG>krO8Cxr|l9-Gz-8!BP zGXTdm%d;pQ7FsxR2uJbxFq&G`i9=U!WPm1X6%)V|f@_xRl*FUeUz^pIW*?#K*sI~GZ&ZoP8_Rg`8Xs+_4KNb|T z5hj?Kp{Q6_M5V3~%smpXBVh!;{$00000NkvXXu0mjf>uo+@ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_setting_localcoin.png b/app/src/main/res/drawable-xxxhdpi/ic_setting_localcoin.png new file mode 100644 index 0000000000000000000000000000000000000000..6a219ee8b0e414c52c382f42cc1e7519993db803 GIT binary patch literal 1291 zcmV+m1@!ufP)ugW9L;U++P8O~JG5VN?%DU8J*@Anz1LoQ?Q;tL z3ebY58kdjVX%1-$?4UPpUM zI1wJwAK11Q=-DInCX2cO}EfC?-g+CHxq5&(BUbJf)5C)yv zZsCX65srKI5|;%~N`$*gDIPw+uB}0Fcc5QyfVO4-2~7!;$8!hL3zBNi5oJKdaD8dD zo}$i1RSj^iQs0P=oXh5h!>UZQ{P3x+6*XaoJT3Z`0vtn`#P^1z z(U;5uNW6RiKv&Y@e5DW;SJOAVcWDy1EQ|cH!+>$(Akc-}v<&$ABlMd&hgLuEP1V$| z)^POcN7EWHyGSe4^0$_`lRh)YG||`yR7$9adE$Ut!!O?%Em0_@U9e*VzyLxb6p92} z*8tC60sD?8%8}k{>gU=Z!8eO&+FonxOiRoNM=~&vuLVi8ZMBA@gQCz#2-U%0W0k*6L z5;^$n#&THgwphZ(P$I8u&LM%0=oKuw(? z`cT3(ad=wZ36mPfDuV_Dqo0;A$2H%(h!g5*DNdn$wiP>JhGs3IX?xB0Id;N#AB&4A zel!oJ<3=oFI7*81?ViKtN*qQi+BVa%6K12CAj)BR~cP5=K5)ntwMxX-s`Euym7Yi*s?gzwdvR~7pAk+rL6xHt>6Oj3M(g0g9$@6s}z zFaTHk9LU6U(wY!upe&ThMIN<=+2DsSz`;`{I+18G&{`;;|GBa5Le$FQMA#N$Lz&)c zv9h?H)m_@P;%v>|NjO_IlP)^Ns}8n63t(xnWTv?<@=|2{{YDgHOD|>-CY0x002ovPDHLkV1j3% BbBzE1 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_toptitle_back_white.png b/app/src/main/res/drawable-xxxhdpi/ic_toptitle_back_white.png new file mode 100644 index 0000000000000000000000000000000000000000..905bcfd0749ae7c6ca80c323bad753cc29bfc4c9 GIT binary patch literal 573 zcmV-D0>b@?P)NklXUy%6`1zqZIF$jKo}Tr z5EjM@go$wmVPl*?6c}p|6~+ogiP;IF#%u*~U@Aden2jJ#%o>OrQv&@5OaU^Hh)E%e zjsNdnyV%~E2dTy~Y%uvuR6$ zAV?G#2nq!Xf5dc z?1xEKN?Ag7{$sAwdxK>GnZkcjQi=~&P>yQU_fKn)yo$xqwORWCnO})-#gU}y00000 LNkvXXu0mjfw@>J= literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_abount_us.xml b/app/src/main/res/layout/activity_abount_us.xml deleted file mode 100644 index 5b1b28ff..00000000 --- a/app/src/main/res/layout/activity_abount_us.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml new file mode 100644 index 00000000..8b5f76bd --- /dev/null +++ b/app/src/main/res/layout/activity_about_us.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/custom_titlebar.xml b/app/src/main/res/layout/custom_titlebar.xml index dcd76f79..098eafec 100644 --- a/app/src/main/res/layout/custom_titlebar.xml +++ b/app/src/main/res/layout/custom_titlebar.xml @@ -16,11 +16,11 @@ android:id="@+id/title_bar_left_default" android:layout_width="match_parent" android:layout_height="match_parent" - android:textSize="15sp" + android:layout_centerVertical="true" android:drawableLeft="@drawable/back" - android:textColor="@color/default_gray_6" android:paddingLeft="@dimen/default_margin" - android:layout_centerVertical="true" /> + android:textColor="@color/default_gray_6" + android:textSize="15sp" /> @@ -28,19 +28,19 @@ android:id="@+id/title_bar_center" android:layout_width="match_parent" android:layout_height="match_parent" + android:layout_centerInParent="true" android:layout_marginLeft="50dp" - android:layout_marginRight="50dp" - android:layout_centerInParent="true"> + android:layout_marginRight="50dp"> + android:textColor="@color/default_title_text_color" + android:textSize="16sp" /> @@ -48,17 +48,17 @@ android:id="@+id/title_bar_right" android:layout_width="wrap_content" android:layout_height="match_parent" + android:layout_alignParentRight="true" android:paddingLeft="@dimen/default_margin" - android:paddingRight="@dimen/default_margin" - android:layout_alignParentRight="true"> + android:paddingRight="@dimen/default_margin"> + android:textSize="14sp" /> diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 61cbe8ef..bb9534aa 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -1,116 +1,41 @@ - + android:layout_height="match_parent" + android:background="@color/default_white_f9" + android:orientation="vertical"> + app:isShowLeft="false" + app:title="@string/settings_title" /> - - - - - - - - - - - - - - - - - + app:icon="@drawable/ic_setting_localcoin" + app:name="本地货币" + app:other1="true" /> - - - + android:layout_height="wrap_content" + app:icon="@drawable/ic_setting_contact_us" + app:name="关于我们" + app:other1="false" /> - - + android:layout_height="wrap_content" + app:icon="@drawable/ic_setting_contact_us" + app:name="联系我们" + app:other1="false" /> \ No newline at end of file diff --git a/app/src/main/res/layout/view_setting_button.xml b/app/src/main/res/layout/view_setting_button.xml new file mode 100644 index 00000000..9e32134a --- /dev/null +++ b/app/src/main/res/layout/view_setting_button.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 27877ca4..7e3afed1 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -14,8 +14,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 80fa55e7..55f9428b 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -9,10 +9,16 @@ #2E4AF2 #2959CC + #262a44 + #8a8d9f + #c5c5d0 + #1646ff + + #f7f7f7 #fff5f5f5 #FFFEED - #FE8227 + #ff8f27 #333333 #E5E5E5 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b9a64e50..3a77f3b1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -102,6 +102,7 @@ 收款 资产管理 设置 + 关于 钱包密码错误 密码 确认删除钱包吗? From bb6b54ef4f0d8b4e0897d2adfeefc8e4b2cae7b4 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Mon, 30 Jul 2018 21:26:25 +0800 Subject: [PATCH 005/121] fix addJavascriptInterface bug --- .../main/java/org/nervos/neuron/activity/AppWebActivity.java | 4 ++-- app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java index cab0ad96..5b2a3126 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java @@ -141,7 +141,7 @@ private void initInjectWebView() { webView.setRpcUrl(ConstUtil.ETH_NODE_IP); webView.setWalletAddress(new Address(walletItem.address)); - webView.addJavascriptInterface(new Neuron(), "neuron"); + webView.addJavascriptInterface(new NeuronAccount(), "neuronAccount"); webView.setOnSignTransactionListener(transaction -> { signTxAction(transaction); @@ -164,7 +164,7 @@ public void onSignPersonalMessage(Message message) { }); } - private class Neuron { + private class NeuronAccount { @JavascriptInterface public String getAccount() { diff --git a/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java b/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java index c75b5840..f8eed496 100644 --- a/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java @@ -24,6 +24,7 @@ import org.nervos.neuron.service.NervosHttpService; import org.nervos.neuron.service.NervosRpcService; import org.nervos.neuron.util.ConstUtil; +import org.nervos.neuron.util.LogUtil; import org.nervos.neuron.util.db.DBAppUtil; import org.nervos.neuron.util.db.DBChainUtil; import org.nervos.neuron.util.db.DBWalletUtil; @@ -81,6 +82,7 @@ public Boolean call(String path) { @Override public Observable call(String path) { URI uri = URI.create(url); + path = path.indexOf(".") == 0? path.substring(1) : path; String manifestUrl = uri.getScheme() + "://" + uri.getAuthority() + path; Request request = new Request.Builder().url(manifestUrl).build(); Call call = NervosHttpService.getHttpClient().newCall(request); @@ -137,6 +139,7 @@ public void onCompleted() { } @Override public void onError(Throwable e) { e.printStackTrace(); + LogUtil.e("manifest error: " + e.getMessage()); } @Override public void onNext(ChainItem chainItem) { From a4352a9463ef575feef2bcf46e2d2c6ba6b78c35 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Tue, 31 Jul 2018 09:59:27 +0800 Subject: [PATCH 006/121] update mainnet --- .../main/java/org/nervos/neuron/service/NervosHttpService.java | 2 +- app/src/main/java/org/nervos/neuron/util/ConstUtil.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java b/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java index 5eab0833..4c559190 100644 --- a/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java +++ b/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java @@ -80,7 +80,7 @@ public Observable> call(List list) { EthTransactionResponse response = new Gson().fromJson(ethCall.execute() .body().string(), EthTransactionResponse.class); for(TransactionItem item : response.result) { - item.chainName = ConstUtil.ETH_MAIN_NET; + item.chainName = ConstUtil.ETH_MAINNET; item.value = (NumberUtil.getEthFromWeiForStringDecimal6(item.value) + ConstUtil.ETH); } if (list != null && list.size() != 0) { diff --git a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java index f849f64f..6ca90d07 100644 --- a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java @@ -17,7 +17,7 @@ public class ConstUtil { // transaction list page config information - public static final String ETH_MAIN_NET = "Ethereum Mainnet"; + public static final String ETH_MAINNET = "Ethereum Mainnet"; public static final long DEFAULT_QUATO = LONG_6; public static final String ETHER_SCAN_API_KEY = "T9GV1IF4V7YDXQ8F53U1FK2KHCE2KUUD8Z"; public static final String NERVOS_SERVER_URL = "http://47.97.171.140:4000"; From d087b6e45b52f8a5c8d144ba649eb84d22a48ae5 Mon Sep 17 00:00:00 2001 From: baojun Date: Tue, 31 Jul 2018 12:12:05 +0800 Subject: [PATCH 007/121] select currency page --- app/src/main/AndroidManifest.xml | 4 + .../neuron/activity/CurrencyActivity.java | 107 ++++++++++++++++++ .../nervos/neuron/activity/MainActivity.java | 4 + .../neuron/fragment/SettingsFragment.java | 27 ++++- .../nervos/neuron/util/db/SharePrefUtil.java | 8 +- .../drawable-xhdpi/ic_setting_about_us.png | Bin 0 -> 570 bytes .../res/drawable-xxhdpi/ic_about_us_logo.png | Bin 0 -> 4073 bytes .../drawable-xxhdpi/ic_currency_selected.png | Bin 0 -> 1112 bytes .../drawable-xxhdpi/ic_setting_about_us.png | Bin 0 -> 615 bytes .../res/drawable-xxxhdpi/ic_about_us_logo.png | Bin 0 -> 6407 bytes .../drawable-xxxhdpi/ic_currency_selected.png | Bin 0 -> 1739 bytes .../drawable-xxxhdpi/ic_setting_about_us.png | Bin 0 -> 919 bytes app/src/main/res/layout/activity_about_us.xml | 10 +- app/src/main/res/layout/activity_currency.xml | 25 ++++ app/src/main/res/layout/custom_titlebar.xml | 4 +- app/src/main/res/layout/fragment_settings.xml | 47 ++++---- app/src/main/res/layout/item_currency.xml | 41 +++++++ .../main/res/layout/view_setting_button.xml | 10 +- app/src/main/res/values/colors.xml | 7 +- 19 files changed, 253 insertions(+), 41 deletions(-) create mode 100644 app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java create mode 100644 app/src/main/res/drawable-xhdpi/ic_setting_about_us.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_about_us_logo.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_currency_selected.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_setting_about_us.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_about_us_logo.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_currency_selected.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_setting_about_us.png create mode 100644 app/src/main/res/layout/activity_currency.xml create mode 100644 app/src/main/res/layout/item_currency.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d7730b40..133730a6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -136,6 +136,10 @@ android:name=".activity.AboutUsActivity" android:screenOrientation="portrait" android:theme="@style/AppTheme.NoActionBar" /> + diff --git a/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java b/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java new file mode 100644 index 00000000..fa86972c --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java @@ -0,0 +1,107 @@ +package org.nervos.neuron.activity; + +import android.support.annotation.NonNull; +import android.support.constraint.ConstraintLayout; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import org.nervos.neuron.R; +import org.nervos.neuron.custom.TitleBar; +import org.nervos.neuron.util.db.SharePrefUtil; + +/** + * Created by 包俊 on 2018/7/31. + */ +public class CurrencyActivity extends NBaseActivity { + + private RecyclerView currencyRecycler; + private SparseArray currencyArray = new SparseArray<>(); + private TitleBar title; + + @Override + protected int getContentLayout() { + return R.layout.activity_currency; + } + + @Override + protected void initView() { + currencyRecycler = findViewById(R.id.rv_currency); + title = findViewById(R.id.title); + } + + @Override + protected void initData() { + title.setLeftImage(R.drawable.ic_toptitle_back_white); + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); + linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); + currencyRecycler.setLayoutManager(linearLayoutManager); + setArray(); + Adapter adapter = new Adapter(); + currencyRecycler.setAdapter(adapter); + title.setOnLeftClickListener(() -> { + setResult(RESULT_OK); + finish(); + }); + } + + @Override + protected void initAction() { + + } + + private void setArray() { + currencyArray.put(0, "CNY"); + currencyArray.put(1, "USD"); + } + + class Adapter extends RecyclerView.Adapter { + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_currency, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + String currency = currencyArray.get(position); + if (SharePrefUtil.getString("Currency", "CNY").equals(currency)) { + holder.chosenImage.setVisibility(View.VISIBLE); + } else { + holder.chosenImage.setVisibility(View.GONE); + } + holder.currencyText.setText(currency); + holder.root.setOnClickListener((view) -> { + SharePrefUtil.putString("Currency", currency); + notifyDataSetChanged(); + }); + } + + @Override + public int getItemCount() { + return currencyArray.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + + TextView currencyText; + ImageView chosenImage; + ConstraintLayout root; + + public ViewHolder(View view) { + super(view); + currencyText = view.findViewById(R.id.tv_currency); + chosenImage = view.findViewById(R.id.iv_chosen); + root = view.findViewById(R.id.root); + } + } + } + +} diff --git a/app/src/main/java/org/nervos/neuron/activity/MainActivity.java b/app/src/main/java/org/nervos/neuron/activity/MainActivity.java index 2a66ad06..82a56fb7 100644 --- a/app/src/main/java/org/nervos/neuron/activity/MainActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/MainActivity.java @@ -194,4 +194,8 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { return super.onKeyDown(keyCode, event); } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + } } diff --git a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java index f3fbe964..ff3459fc 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java @@ -1,5 +1,6 @@ package org.nervos.neuron.fragment; +import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.support.v4.app.Fragment; @@ -13,9 +14,11 @@ import org.nervos.neuron.R; import org.nervos.neuron.activity.AboutUsActivity; +import org.nervos.neuron.activity.CurrencyActivity; import org.nervos.neuron.activity.SimpleWebActivity; import org.nervos.neuron.custom.SettingButtonView; import org.nervos.neuron.util.ConstUtil; +import org.nervos.neuron.util.db.SharePrefUtil; import java.util.zip.Inflater; @@ -24,7 +27,8 @@ public class SettingsFragment extends NBaseFragment { public static final String TAG = SettingsFragment.class.getName(); - private SettingButtonView localCoinSBV, aboutUsSBV, contactUsSBV; + private SettingButtonView currencySBV, aboutUsSBV, contactUsSBV; + private static final int Currency_Code = 10001; @Override protected int getContentLayout() { @@ -33,20 +37,21 @@ protected int getContentLayout() { @Override public void initView() { - localCoinSBV = (SettingButtonView) findViewById(R.id.sbv_local_coin); + currencySBV = (SettingButtonView) findViewById(R.id.sbv_local_coin); aboutUsSBV = (SettingButtonView) findViewById(R.id.sbv_about_us); contactUsSBV = (SettingButtonView) findViewById(R.id.sbv_contact_us); } @Override public void initData() { - localCoinSBV.setOther1Text("CNY"); + currencySBV.setOther1Text(SharePrefUtil.getString("Currency", "CNY")); } @Override public void initAction() { - localCoinSBV.setOpenListener(() -> { - Toast.makeText(getActivity(), "open", Toast.LENGTH_LONG).show(); + currencySBV.setOpenListener(() -> { + Intent intent = new Intent(getActivity(), CurrencyActivity.class); + startActivityForResult(intent, Currency_Code); }); aboutUsSBV.setOpenListener(() -> { Intent intent = new Intent(getActivity(), AboutUsActivity.class); @@ -56,4 +61,16 @@ public void initAction() { SimpleWebActivity.gotoSimpleWeb(getContext(), ConstUtil.CONTACT_US_RUL); }); } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == Activity.RESULT_OK) { + switch (requestCode) { + case Currency_Code: + currencySBV.setOther1Text(SharePrefUtil.getString("Currency", "CNY")); + break; + } + } + } } diff --git a/app/src/main/java/org/nervos/neuron/util/db/SharePrefUtil.java b/app/src/main/java/org/nervos/neuron/util/db/SharePrefUtil.java index 1d88a4cf..0460f866 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/SharePrefUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/SharePrefUtil.java @@ -34,7 +34,7 @@ public static void putFirstIn(boolean value) { sharedPreferences.edit().putBoolean(KEY_FIRST, value).apply(); } - public static void putString(String key, String value){ + public static void putString(String key, String value) { sharedPreferences.edit().putString(key, value).apply(); } @@ -42,7 +42,11 @@ public static String getString(String key) { return sharedPreferences.getString(key, null); } - public static void putCurrentWalletName(String name){ + public static String getString(String key, String defaultStr) { + return sharedPreferences.getString(key, defaultStr); + } + + public static void putCurrentWalletName(String name) { putString(WALLET_NAME, name); } diff --git a/app/src/main/res/drawable-xhdpi/ic_setting_about_us.png b/app/src/main/res/drawable-xhdpi/ic_setting_about_us.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8f01194568a60b0b2782eaa6d0b090f3dc723f GIT binary patch literal 570 zcmV-A0>%A_P)xN#00001b5ch_0olnc ze*gdg)lf`SMF0Q*|3^9hMK}LNH~&RA|3)|ejDi2GrT>e8|Cf&c-P-@h!vDOs|H#Du zl#Ty^c>lw`|4>2yQbhm6zyE-B|C^HkrJn!8!2gts|E8b+!o2^otpC)||5Qi++}Zzu zcK^`K|E;F~$;AJPfB$)I|I*L@wXpxFq5r+O|Er|`+1LNp(*M1=|Hi@ppqc++RsY}I z|Lf}i=H&n3-v4Z0|8;8rb7=qJ-~V1u|4Kdo+1CG&i2qkg|Jv98#KHgT>HkSQ|MKzw z=jQ)@bpPh$|C^KlM>f!0P-6f907rCEPE!CjjIEcL#nQyd>fhSm$-&*QvEIPT&)vw- z+|}l>>cQmG;KaV=*U;M1>F3(t&9&_F@a?(0yX~~E=*P0@-tw;Z@WAiOjR(>eivR!s zz)3_wRCt_i&}kEaP!tB>@@kQ?WT#MBvJ@g~*6{y-l9(iy`{A6KXYR~7=cVWbh?k@( zhBP2S{TdJ<%W*t`DIqP2l8}jGHkW@kxlsIIDi@SeIVhECghKGIR&OYP+I%CM23l=E z(*WHFkrRPV7wGi?a}YzY!_hcsmK`E50h8&>nJ)mxjRwif)f(7rciujlo;e&(uLaK+ z|Fe8wQJ>Ab-r{Fgo4RQ^d!Goz7})MlN?+0a3HeUZchVU80r^uAFG3SjT>t<807*qo IM6N<$f|nCSssI20 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_about_us_logo.png b/app/src/main/res/drawable-xxhdpi/ic_about_us_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..64f2c4cda2b60ae2ec773c0f2193a290476a8952 GIT binary patch literal 4073 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 bA6@o;M^SJGv86^x00000NkvXXu0mjf-`BL) literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_currency_selected.png b/app/src/main/res/drawable-xxhdpi/ic_currency_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..5b61765693bdc446f74506d4c623736b7f2167c2 GIT binary patch literal 1112 zcmV-e1gHCnP)iU>ed{mN;LP-S`716{Z%}}Hw)IT&cQ*u!Z zNt00VRcUG=nxYsgyH=7Gp^+%0)ndATXre|g8k9u7(o$IQiMngQ?>%$9Guw`H?>IPf z{y6vEbIyHmUUzUs1;ohBTky^*I8X`KZosy3 z*niX!)-NQ`MWs%YVv5BaSy4ij1p~U_8~EXX157Z|zX$Z|=70+Vbk}|;+b%VN6ey?Z z*cLvR;vm)M9aK)UbfWk2u+?N zxVdXVuy;M&K;Iq%y}KmOy!XB5OsD^Glaw89-L^AR2Ag)?dtsQj$}~$%)``;&QfmY| zdI-GmbQlT291nElbAceQYOxJI-C-HxGnX}j>Cx`iTcM#c%{!9@sOvMmpk#P7IhyT( zDu&IojL@jq25iJHt#(_nFl#kjz7}2Z&I;K2qpcI5mRr~5aZ8yK9I%F>v{-V5UwH!F zwdz`F&DX3pXr~ZjmCR!ghZBAHH|IRni5#v~t(wE?nO1N#3n!!YtQ1haJo~TPl^}-GCtCe7aRMUpV z4PeGt7}Up&)$U~pL7ua!$TPXEk@L(ifv39Ho*nJEPEd(Z>9ul8P<8u10c~H#Sx$a+ zSn5WaKikgpu|J(9{Mxc)1dJGzIyalAw4lDQExX`z3snO2I@7SUJJ_n6X%-9XTi{k( zwh8tevYR9e=vU;_QQqtO?lOXEho26^$5!zu#wNEOPuh8Y1Gevl&EExY^ijRK!uxin z{Rk4g&F(G~s6-z(lP)fGY1Y@S%-gyJT(qpC=8fA`X>pl3Pm@O8a8A0=pxW)+MbpxH zIAfVi7WRRI2a665IS+rNWls3+3W)@&RSG+*f+`geL@HuyI=3p-7FoRQ`h+)>(=IZo zc9(~*{Tj*-rn1a<4W8|tI+m-atU&$Ex0b_~78Po0>}SMF@bWqdPH~&R9|3@|db!z{#uK(TI|L^Vp|NsAkdH>1A|M&O* zzqdQv|K#HT)X@K) zmH&%@|N8p>{rvy4t^a{`|B#3OMmM4mB}xDQ04H=(PE!Cjf}*V}yw>XV|H9z<+sC)y zvhddB(d+ur^~}NV=FG+X{no(7qn-K%2LJ#8ZAnByRCt`lmF;?iAPj}ArHDtZ7U`gN zTeoiQ{a@lT1V7MP|Lj@*@E|XoBqSI`n|RBfS-gv)%~Q(SE{fNIakP$O+qEG3dypq0 z1yYglMKBZSOk|J294Pi>#aLD51#ox(${K}|-Aok_auy_RpTx?N}oJ9V(>GaTS0XrQ6W1 z6p-yc9e@q05ePVs>Hu^L6ufAMdi;F?k`Lnini!v#3FxJne6#5}`DBFBJ{a!mCq1+I zU{sry6V=bVQhDQQXPO=kL;1J>`}V>w_MWAgB-~zM30(Y~?pcwJR~{CH;Y}xGHSl3( zih|tvM8gJ_S+^>!0S;k3Ic9?$6KLML!EUCN-!aBj^AC002ovPDHLkV1ke9 BL3scG literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_about_us_logo.png b/app/src/main/res/drawable-xxxhdpi/ic_about_us_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ce6055c56e702819391e8f667a1508578746b8cd GIT binary patch literal 6407 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 V9V@#qWT*fD002ovPDHLkV1h!<(B%LC literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_currency_selected.png b/app/src/main/res/drawable-xxxhdpi/ic_currency_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..ca4d3d3efca33bfd3346847af58a65f51d9c1e90 GIT binary patch literal 1739 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 t;WxBh`kj4Oef-+S{{Az5({277{0lS+J~ literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index 8b5f76bd..c25fddf4 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -27,7 +27,7 @@ android:layout_width="60dp" android:layout_height="60dp" android:layout_gravity="center_horizontal" - android:src="@mipmap/ic_launcher" + android:src="@drawable/ic_about_us_logo" app:civ_border_color="@color/default_gray_d5" app:civ_border_width="1dp" /> @@ -35,7 +35,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" - android:layout_marginTop="10dip" + android:layout_marginTop="5dip" android:text="@string/app_name" android:textColor="@color/default_black" android:textSize="16sp" /> @@ -45,7 +45,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" - android:layout_marginTop="@dimen/default_margin" + android:layout_marginTop="5dip" android:textColor="@color/default_black" android:textSize="14sp" /> @@ -55,7 +55,7 @@ android:id="@+id/sbv_source_code" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="15dip" + android:layout_marginTop="12dip" app:icon="@drawable/ic_about_us_origin_code" app:name="源代码" app:other1="false" /> @@ -72,7 +72,7 @@ android:id="@+id/sbv_nervos_network" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="15dip" + android:layout_marginTop="12dip" app:icon="@drawable/ic_about_us_nervos_network" app:name="Nervos Network" app:other1="false" /> diff --git a/app/src/main/res/layout/activity_currency.xml b/app/src/main/res/layout/activity_currency.xml new file mode 100644 index 00000000..3687008c --- /dev/null +++ b/app/src/main/res/layout/activity_currency.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/custom_titlebar.xml b/app/src/main/res/layout/custom_titlebar.xml index 098eafec..3edff494 100644 --- a/app/src/main/res/layout/custom_titlebar.xml +++ b/app/src/main/res/layout/custom_titlebar.xml @@ -20,7 +20,7 @@ android:drawableLeft="@drawable/back" android:paddingLeft="@dimen/default_margin" android:textColor="@color/default_gray_6" - android:textSize="15sp" /> + android:textSize="18sp" /> @@ -40,7 +40,7 @@ android:gravity="center" android:singleLine="true" android:textColor="@color/default_title_text_color" - android:textSize="16sp" /> + android:textSize="18sp" /> diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index bb9534aa..4fd93342 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -14,28 +14,35 @@ app:isShowLeft="false" app:title="@string/settings_title" /> - + android:layout_height="match_parent" + android:layout_marginTop="12dip" + android:background="@color/white" + android:orientation="vertical"> - + - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_currency.xml b/app/src/main/res/layout/item_currency.xml new file mode 100644 index 00000000..1db24a0f --- /dev/null +++ b/app/src/main/res/layout/item_currency.xml @@ -0,0 +1,41 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_setting_button.xml b/app/src/main/res/layout/view_setting_button.xml index 9e32134a..3bdf06de 100644 --- a/app/src/main/res/layout/view_setting_button.xml +++ b/app/src/main/res/layout/view_setting_button.xml @@ -1,6 +1,7 @@ - #2E46F0 - #2E46F0 - #2E46F0 + #4f72ff + #4f72ff + #4f72ff #FF4081 #55FF4081 #333333 @@ -10,6 +10,7 @@ #2959CC #262a44 + #525461 #8a8d9f #c5c5d0 #1646ff From fdced0bb1d1de091a16ca24cfa5a351a0d1735a5 Mon Sep 17 00:00:00 2001 From: baojun Date: Tue, 31 Jul 2018 12:39:42 +0800 Subject: [PATCH 008/121] list division width --- app/src/main/res/layout/view_setting_button.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/view_setting_button.xml b/app/src/main/res/layout/view_setting_button.xml index 3bdf06de..576f7651 100644 --- a/app/src/main/res/layout/view_setting_button.xml +++ b/app/src/main/res/layout/view_setting_button.xml @@ -56,7 +56,7 @@ Date: Tue, 31 Jul 2018 12:51:59 +0800 Subject: [PATCH 009/121] add about-activity website --- .../nervos/neuron/activity/AboutUsActivity.java | 14 +++++++++++--- .../java/org/nervos/neuron/util/ConstUtil.java | 5 ++++- app/src/main/res/layout/activity_about_us.xml | 4 ++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java b/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java index 5f173e8a..bd576f85 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java @@ -16,7 +16,7 @@ public class AboutUsActivity extends NBaseActivity { private TextView versionText; private TitleBar title; - private SettingButtonView sourceCodeSBV, serverPrivateSBV, NervosSBV, InfuaSBV, openSeaSBV; + private SettingButtonView sourceCodeSBV, serverPrivateSBV, NervosSBV, InfuraSBV, openSeaSBV; @Override protected int getContentLayout() { @@ -29,7 +29,7 @@ protected void initView() { sourceCodeSBV = findViewById(R.id.sbv_source_code); serverPrivateSBV = findViewById(R.id.sbv_server_private); NervosSBV = findViewById(R.id.sbv_nervos_network); - InfuaSBV = findViewById(R.id.sbv_infua); + InfuraSBV = findViewById(R.id.sbv_infura); openSeaSBV = findViewById(R.id.sbv_open_sea); title = findViewById(R.id.title); } @@ -58,6 +58,14 @@ private void initListener() { serverPrivateSBV.setOpenListener(() -> { SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, ConstUtil.PRODUCT_AGREEMENT_URL); }); - + NervosSBV.setOpenListener(() -> { + SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, ConstUtil.NERVOS_NETWORK); + }); + InfuraSBV.setOpenListener(() -> { + SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, ConstUtil.INFURA); + }); + openSeaSBV.setOpenListener(() -> { + SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, ConstUtil.OPEN_SEA); + }); } } diff --git a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java index 6ca90d07..15fb2bb7 100644 --- a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java @@ -1,6 +1,7 @@ package org.nervos.neuron.util; import org.web3j.utils.Numeric; + import java.math.BigInteger; public class ConstUtil { @@ -14,7 +15,9 @@ public class ConstUtil { public static final String SOURCE_CODE_GITHUB_URL = "https://github.com/cryptape/Neuron-Android"; public static final String PRODUCT_AGREEMENT_URL = "https://cryptape.github.io/Neuron-Android/#/zh-CN/product-agreement"; public static final String CONTACT_US_RUL = "http://appchain.nervos.org//#/contact-us"; - + public static final String NERVOS_NETWORK = "https://www.nervos.org/"; + public static final String OPEN_SEA = "https://opensea.io/"; + public static final String INFURA = "https://infura.io/"; // transaction list page config information public static final String ETH_MAINNET = "Ethereum Mainnet"; diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index c25fddf4..cf67b673 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -78,11 +78,11 @@ app:other1="false" /> Date: Tue, 31 Jul 2018 13:51:42 +0800 Subject: [PATCH 010/121] add fingerprint_controler --- app/src/main/AndroidManifest.xml | 4 +- .../AuthenticateResultCallback.java | 12 ++ .../FingerPrint/FingerPrintController.java | 184 ++++++++++++++++++ .../neuron/util/FingerPrint/Fingerprint.java | 58 ++++++ .../NotSupportFingerprintException.java | 25 +++ .../drawable-xxhdpi/ic_setting_onoff_off.png | Bin 0 -> 1812 bytes .../drawable-xxhdpi/ic_setting_onoff_on.png | Bin 0 -> 2033 bytes .../drawable-xxxhdpi/ic_setting_onoff_off.png | Bin 0 -> 2904 bytes .../drawable-xxxhdpi/ic_setting_onoff_on.png | Bin 0 -> 3808 bytes 9 files changed, 281 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/org/nervos/neuron/util/FingerPrint/AuthenticateResultCallback.java create mode 100644 app/src/main/java/org/nervos/neuron/util/FingerPrint/FingerPrintController.java create mode 100644 app/src/main/java/org/nervos/neuron/util/FingerPrint/Fingerprint.java create mode 100644 app/src/main/java/org/nervos/neuron/util/FingerPrint/NotSupportFingerprintException.java create mode 100644 app/src/main/res/drawable-xxhdpi/ic_setting_onoff_off.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_setting_onoff_on.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_setting_onoff_off.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_setting_onoff_on.png diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5be4f5c5..9c9d5e1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,8 @@ + + - - \ No newline at end of file diff --git a/app/src/main/java/org/nervos/neuron/util/FingerPrint/AuthenticateResultCallback.java b/app/src/main/java/org/nervos/neuron/util/FingerPrint/AuthenticateResultCallback.java new file mode 100644 index 00000000..20da0c0b --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/util/FingerPrint/AuthenticateResultCallback.java @@ -0,0 +1,12 @@ +package org.nervos.neuron.util.FingerPrint; + +/** + * 指纹认证回调 + * Created by 包俊 on 2018/7/30. + */ + +public interface AuthenticateResultCallback { + void onAuthenticationError(String errorMsg); + void onAuthenticationSucceeded(); + void onAuthenticationFailed(); +} diff --git a/app/src/main/java/org/nervos/neuron/util/FingerPrint/FingerPrintController.java b/app/src/main/java/org/nervos/neuron/util/FingerPrint/FingerPrintController.java new file mode 100644 index 00000000..244c0fd4 --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/util/FingerPrint/FingerPrintController.java @@ -0,0 +1,184 @@ +package org.nervos.neuron.util.FingerPrint; + +import android.annotation.TargetApi; +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.hardware.fingerprint.FingerprintManager; +import android.os.Build; +import android.os.CancellationSignal; +import android.widget.Toast; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +/** + * 指纹控制器 + * Created by 包俊 on 2018/7/30. + */ + +public class FingerPrintController { + private FingerprintManager fpManager; + private Activity activity; + private CancellationSignal cancellationSignal; + + private volatile static FingerPrintController instance = null; + + public static FingerPrintController getInstance(Activity activity) { + if (instance == null) { + synchronized (FingerPrintController.class) { + if (instance == null) { + instance = new FingerPrintController(activity); + } + } + } + return instance; + } + + private FingerPrintController() { + + } + + @TargetApi(Build.VERSION_CODES.M) + @SuppressWarnings("ResourceType") + public FingerPrintController(Activity activity) { + this.activity = activity; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {//默认6.0以下不支持指纹。包括厂商定制的5.x系统 + try { + Class.forName("android.hardware.fingerprint.FingerprintManager"); + //低于6.0版本,有这个类,不正常。在兼容性测试中,可以抛出异常,筛选出设备。 +// throw new RuntimeException("低于6.0系统支持指纹模块"); + } catch (ClassNotFoundException e) { + // 低于6.0版本,没有这个类正常 + e.printStackTrace(); + + } + return; + } + this.fpManager = (FingerprintManager) activity.getSystemService(Context.FINGERPRINT_SERVICE); + } + + /** + * 判断是否支持指纹 + * + * @return + */ + public boolean isSupportFingerprint() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)//默认6.0以下不支持指纹。包括厂商定制的5.x系统 + return false; + return fpManager == null ? false : fpManager.isHardwareDetected(); + } + + /** + * 是否录入指纹 + * + * @return + */ + public boolean hasEnrolledFingerprints() { + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) + return false; + + if (fpManager == null) + throw new NotSupportFingerprintException("Your device is not support fingerprint"); + + + return fpManager.hasEnrolledFingerprints(); + } + + /** + * 发起指纹认证识别 + * + * @param callback + */ + public void authenticate(final AuthenticateResultCallback callback) { + if (fpManager == null) + throw new NotSupportFingerprintException("Your device is not support fingerprint"); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) + return; + cancellationSignal = new CancellationSignal(); + //版本26才支持指纹 + fpManager.authenticate(null, cancellationSignal, 0, new FingerprintManager.AuthenticationCallback() { + @Override + public void onAuthenticationError(int errorCode, CharSequence errString) { + super.onAuthenticationError(errorCode, errString); + if (callback != null) + callback.onAuthenticationError(errString.toString()); + } + + @Override + public void onAuthenticationHelp(int helpCode, CharSequence helpString) { + super.onAuthenticationHelp(helpCode, helpString); + Toast.makeText(FingerPrintController.this.activity, helpString.toString(), Toast.LENGTH_SHORT).show(); + } + + @Override + public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) { + super.onAuthenticationSucceeded(result); + if (callback != null) + callback.onAuthenticationSucceeded(); + } + + @Override + public void onAuthenticationFailed() { + super.onAuthenticationFailed(); + if (callback != null) + callback.onAuthenticationFailed(); + } + }, null); + } + + public void cancelAuth() { + + if (fpManager == null) + throw new NotSupportFingerprintException("Your device is not support fingerprint"); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) + return; + if (cancellationSignal != null && !cancellationSignal.isCanceled()) + cancellationSignal.cancel(); + } + + /** + * 获取已经录入的指纹 + * + * @return + */ + public List getEnrolledFingerprints() { + if (fpManager == null) + throw new NotSupportFingerprintException("Your device is not support fingerprint"); + List fingerprints = new ArrayList(); + Class fpManagerClass = fpManager.getClass(); + try { + Method getEnrolledFingerprints = fpManagerClass.getMethod("getEnrolledFingerprints"); + Object fingerPrints = getEnrolledFingerprints.invoke(fpManager); + if (fingerPrints != null) { + ArrayList> fingerPrintList = (ArrayList>) fingerPrints; + for (int i = 0; fingerPrintList != null && i < fingerPrintList.size(); i++) { + Fingerprint fingerprint = new Fingerprint(fingerPrintList.get(i)); + fingerprints.add(fingerprint); + } + } + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return fingerprints; + } + + private static final String ACTION_SETTING = "android.settings.SETTINGS"; + + //跳转设置页面 + public static void openFingerPrintSettingPage(Context context) { + Intent intent = new Intent(ACTION_SETTING); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + try { + context.startActivity(intent); + } catch (Exception e) { + } + } +} diff --git a/app/src/main/java/org/nervos/neuron/util/FingerPrint/Fingerprint.java b/app/src/main/java/org/nervos/neuron/util/FingerPrint/Fingerprint.java new file mode 100644 index 00000000..6e82bb90 --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/util/FingerPrint/Fingerprint.java @@ -0,0 +1,58 @@ +package org.nervos.neuron.util.FingerPrint; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * 指纹信息类,系统的被隐藏 + * Created by 包俊 on 2018/7/30. + */ + +public class Fingerprint { + + private String mName; + private int mGroupId; + private int mFingerId; + private long mDeviceId; + + public Fingerprint(Object fingerprint) { + if(fingerprint==null) + return ; + Class fingerPrintClass = fingerprint.getClass(); + try { + Method getNameMethod = fingerPrintClass.getMethod("getName"); + Method getFingerIdMethod = fingerPrintClass.getMethod("getFingerId"); + Method getGroupIdMethod = fingerPrintClass.getMethod("getGroupId"); + Method getDeviceIdMethod = fingerPrintClass.getMethod("getDeviceId"); + + mName = (String) getNameMethod.invoke(fingerprint); + mGroupId = (int) getGroupIdMethod.invoke(fingerprint); + mFingerId = (int) getFingerIdMethod.invoke(fingerprint); + mDeviceId = (long) getDeviceIdMethod.invoke(fingerprint); + + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + + @Override + public String toString() { + JSONObject json = new JSONObject(); + try { + json.put("name", mName); + json.put("groupId", mGroupId); + json.put("fingerd", mFingerId); + json.put("deviceId", mDeviceId); + } catch (JSONException e) { + e.printStackTrace(); + } + return json.toString(); + } +} diff --git a/app/src/main/java/org/nervos/neuron/util/FingerPrint/NotSupportFingerprintException.java b/app/src/main/java/org/nervos/neuron/util/FingerPrint/NotSupportFingerprintException.java new file mode 100644 index 00000000..8ef55e3e --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/util/FingerPrint/NotSupportFingerprintException.java @@ -0,0 +1,25 @@ +package org.nervos.neuron.util.FingerPrint; + +/** + * 不支持指纹异常 + * Created by 包俊 on 2018/7/30. + */ + +public class NotSupportFingerprintException extends RuntimeException { + + public NotSupportFingerprintException() { + super(); + } + + public NotSupportFingerprintException(String message) { + super(message); + } + + public NotSupportFingerprintException(String message, Throwable cause) { + super(message, cause); + } + + public NotSupportFingerprintException(Throwable cause) { + super(cause); + } +} diff --git a/app/src/main/res/drawable-xxhdpi/ic_setting_onoff_off.png b/app/src/main/res/drawable-xxhdpi/ic_setting_onoff_off.png new file mode 100644 index 0000000000000000000000000000000000000000..0eb7b3a2838ea23c72f455dcf4280bd03583d6aa GIT binary patch literal 1812 zcmV+v2kZEWP)wAK<~TOUG@QcBx*^IS@y zgr-p1LLOt@5@<`IEqy8d1I%Nfg;*5ChcpX@%2vS#FRiwu#(3LxFLUen9cRL*3yGjJ z^U$NiIdf+A{J!(e?{a2-N1d3M(AU=1M0GN|_rQ8#ZKHknNy$P`k6Uv+j)>H(ZSCa@;r-NfrQUJOEfPm&*p)30>C{B+Re- z`ug5FefsnjoWF*N@cu&u{aqlV%PZH zQlB@m=dMUBemBt3(J=tB3#+TE-_Fg=lGsp$%5a$E%uX7v93`(J{zGGtXCtBSF!iA16XvMgY+ znwy*Lg@pxYczBp587tFN$HvAoc*2q_m`aLdWipxeix)56#w2pbMO1JcJe>T)hYzoB zZEdZQG?;#cq(K{{Zv&ZDLqh{iGy?ggA9d;5LCAErV<#M^7K;F6FB#*ldl9uxM z{0AhB+J-}t1{}54)>d<6Wre}O85$aLAUif%rsJs^(5eIg(;OQI1_o}QG+88{GAL_& zeEb?t9cZ%y`6S1wR;!Gd?)>~beVU4>8JhqgV2%c(A%G??UApu+_&X6Z#Q28_Wl<(B zB#D7o@bGj*R;^ep3M_FLMO6fVL%)rxL%;+KE**M$dUD6@;Gbtwlu6mdKrAE-+ODP3 zX}LCpmZ^8{+)~`6?Er?_sTU zD{SFGc`JWER!X}j7OH~&P1dR)M=BSu@(A94Qf-JTBE%rn8W?&Jfj)I@XJ+ZIt?wY8K3*2VcSFAJ_#IKz zjSa~?Eh0HMNRm$!HOy~^i4QUbP<*_+y7dd%k~GoX-F+E=>b@I>367+sn^K-g=#?Z6 z75~_dut5Bq%PZSo6M{fAdLu$C`$RW2^7YkK9Jw6ZcS)W^N}Q@(UH)h16-LRkhoME& zV;Gv$CTW5o&i7-{pxG~#=Be1uha^mX%i4cAnloJ|VUX>aAT^4I=l`Pt6_5%jZwoxl z*brubFlv`y*bbii{gKtG`!c^tMe9)mvyTms0H%XY0hM1r*csKiW!cgMefhpg`sb0? zSkQ9e`Z#hR9sm+1Ez&bf-z4Lrd4P3~gguH2VWvsK_7hqiUl6Tvz6rPZn`AyKOSb%Df>y86P?KSa0%2 z?Zc<(!favsef+M3Z(+N@R6$)u2Hr$s*+Rd~Z1~8?2*3G9S{NlwfU7ad8Wj@CCI(`G z`B^;h$;rlt0S8+NhJYDL4a1$)si~>2U>^Br{_2=+pe)LyY-$*>9Mmo*bGgqVE=31uZU&+A z=Zmg9YZcZ$lj&JEI|M7MdY;>ClIA2O?k3iA*MtKv`EE+$MhzM zcq!lR@xG(R0Dz~8Vo{>P^hN)Xg->}uU&t?|ITbSY2Hhk zrg?klz`U9H&;Rqc|C!ylvsxvv1VNzBpFgj=ySsHuON*YGnsU%OXuZb9Mt5apCFMAd z=lg!zb=?#z#;Iblm}+WjYHV+BAE>Xde+l$f)O}j(eGC(N?}3N)-}(9ZUnVCfM`mVb zX2Fw(t~}^cp(}@Rp}M*{KRY{HgzW-s`)GZgG`uzf3qHDV)c>9+jhz4^J91J-1&Tbe0&s2 zvbGX5%;htgi~yH7z~HDJ9v;?*4jpn978YDCLu8kS3obwb)GB09H3F$QcI?>u2;|hZ zQQANd7v|#4n>Rngg;|EJ71$E+kkC2!QrJ@JZlHI^NjAISlh+l2rt&x3~9e>@&~oG+1$c0O{}1(b2bX;ii~vs4JMyCL+TK7VnD8F6<*t zTU(n82YDCd9grJ)6?m$VU77y={tFl%jtBQ7`mnXPwY9bT_U+qOVB5zY8Q>x%Bg58b z7nYibTY3tBRblU{20%67sT~*?IJ?t()@ERHPa7E-`49j;z_MI+HWS#bd2aL*6BFFO zoVvO?2N~wVNe>y80$^$04R;$X#!j2GO&{n>B9T*EHHR=Bh!f z!E@FJaCrZ2UBI{hNC# zwuvic0V7z8)9O0}ej-E!?qVP@#sOe}f=(E41YpQ6GMuKIVOs@P2mlL65g=_VI0@RG zTBV+AFY6|>KKX(@>?r@ImfiH3S#afqxD$)k#297+Ck+a0q)Pxr$h2l`*kmSJs+7S5 zfnt_XgTo5X9LT-c;+Kkc)G`OH{M@Pp%Nx-;g!Tr+=LEJSRSu%9k#1M^b5Mj(R zighifRxIQeoy;Tx7FL-M-9C5&b>!K~XO|64xpgN>0wxzW%%x)}3fce>e}*IC+|K%HbH614G$V5|WM z^feh~fLbF*1q3CgYrUSx2AE`7flt@ZJVyvqSq3?kp_%g>ry>&nQexp|1?g5^Rf^I8Dd~fQSVh0e%&WP{xc`<-;W@ zPZwfYtGW5)0G7)Kvn2t;V*LtOgx;FK*u)Yb>{~Dh9OqGOVP9zIM4;Hob*<8y?cROtX3o{(pg|aXFJ?kPM5(1|E*^ zi;0IqBLUUQkT(vLjPWQDEhGRAbu!8kjhGi%jhG4TdZru17 z%Y#SxyHaS2HeoEw45KfJ*uxk-mLGjd{6TIa_Amm*VzUeteCbIx_ zg(uNGk;ZxD6U#K}wx`~-N!#>+z9c5Y2$;>XB!7&OIKcSHz|+s2m_A!9%rb%&|N0Q3 zPd}(Dhu=n^@e=~vMYr_HW(Q7p@I2RteP=)FMxSi{hewy6ahm!v66%X?Kbl~h;Nt$J1ebN=_7bMLKN$3K7md~Rf9#DDzwajmIBRtJUgsrBeC#lP6C;nwpyWm!1>qy1H9+ZH;}lx`&msujkZRS5{U+w%fLC z3+LwM!o|hKNV0^ICE{6U&YX$Pojd29J$p9NeXNY~EH3$W5@%;;b0Rc=FbSM1m&^Hq zfdTgO>`Nhe_T#OQdg#!hW4m_kI<4!zB8Bf*Pf_~au$0gGIT3wyXlTe&zAUncC1Q1|;la+GJ5icho=9C8eM$&O4}X1(3bej3R1uV24D*oj2Qgg`0CNQA(BS`-6+rug^eZjsmNzKWwa z6+_>h)&ilBDLh7~Ba&@9nS1u^2^H@nVrG)eELvrrh7B&~4!x8xm&kAwqTWuf+X9ecVaf;_obE1Q{_2@f1N z;3-~moY{D31WGB*)+l6Rg{*R&MG0RzapJ@ok@%}#kZ5e^56=bzSil4}hZD@KP7W&N z@bGY;u;43P(BQE}tyfR2*ygb-&%)NfeEBl1Oj@Lcge4YHl$0}Y^5n^%N+I9sCt(#I zKe&4J>M!I@SLH1#ve1giGgqsYZBS*GO6Oqawga(Q{#YBUWS zSIecOVn32dg`#4C4U7&i*s)4v!6MZ?3224O#RiWaJqqsMzu&aPELx=z>H3MTbt)HC zJbwK6nSQfGNOTL>zz9}a)L_>+>+?b+E3rT6V(Bx-eM`HIDngT7ci*&b18Ok}V2eVe zfC3F0#g;ewT_`Yu70h5y%0j#p*?}5LzTB-ZQhjHYS&Wr|YNd_dxXwOZjJS0Q!F|0z z99Y53J~GhvMJ5p#XpkVMvK%dQk!lT}cB|}b0Y3pa8;U~-tki7!iQ0edU5rnFx#d!@ zf*I^i4%d2B$OuGiz>r=itK>#maj)iDodOuKdEK4;7FJ&I0L)-_a!P%jkL=#Am`88F@vm_Z@5e$kXzYK9B*#|aKOpb& zwJ3~!Q}e1He>^ky{`BLeH#(s=A`c!scudXrO??&B>0#Y2D-{dg(4e}L(n4%^MyWlw z!x)Z~q)R)T=r+(-xIf`SNPkc-S0|_cyYTh)TNshN6mCC}*5mElhhjsFyf6w|h%(|D zqjN3gsggDFwuMpjr~k~%|2T;|&=6O^oBd>An)kPD88rAfR2GYaSYCW=Wv-lq6fUZe zfySiXOIoJQv5{L{cX~#eWXsZPBHoFVVZ^LguPnh^AIg+1tiIW+~jfNq73}iYpy`E&!#gVN{a}UN`puv zEhf{A4`7|nTKQ4hi531j?cTCTSB7b!W4qTlnvIp8DH zltA7v%$1dL)6$GkXO8qPvou8Kd(VS`!dVm(@TIV3oy~1nOMQM}tycHSm3m`102Z}6 zYfSFDvb0*K@axm@;5++9wmdK*)z}I7Qn=6g*)Y84ODlG*i-SfKWX7#nPGX>GB@q0O zsIOMu-1qtIf8m&gk)1l9dp8c#|94?w8N)Lx3~UnCi(rWrIzrh`<$^o){cnC@@9?ja z_>D-u*_V5rNuEgKez{WhmRIyKmPl%Z#Y79W18+ubN(jZ^B*O1Fejlx zjc@kTJ{|J$lZA#gn%zlkNYd)85TTpx9;bmm-3s>0(;@e+JspzoBrJOdi5E_tI`!>t z=LP7N-t>*fm^AWc{Uiq3TCj!mCt0sB3*3kWQ|#JtLTc!SGXYSf{;-Pg-8jNTeogqkRm?Vh(ddD z4cNd4RxpEIIBLj(OssOH;r#r3OKeP9V^-WM`Zpq#0mEvslvC4?on@7hkd@++-}rtVvUr6 zl2)!@D*w16P#cz7HfB`IE(*7zK!3t(#BQhWhGSR?+L>f3`!b+wwLx3zHrB6sxP{>SR}RP5H)+8yD25_=(Q-tToHC!2lL8fz9D`xSbqWWYVP~C<`ssELtP7 z1@y0oB?#{nLJg<36MtCM7b|NNXf@|MOYm-PBXq5P+nDdAXiuK6AyPW-9D0TejrL?WTr9ODb%+Cd;0o zTUa@tu5UCI_F8&VL*=DZ*t*ubMb357pi!B1F=(CAuputuPL(+6rG&dY%MFaPpGB97 zTr80261p?%9EEta^6aeM`bc?^8WtptC;PngZF$5ko?7obCU& zX4bxQPHx(BZaJ9zM5&Tuzu z*pQz+d$w4)a%H}D?b_nfrAtMx*J~_Ww#;JEd7d|=+vxZERoZ39xfF`++qZve{rdF} zw%hG(tyb&qq9``$TCTdwX-oC4$_Cfz>FMcrI-Snj=gysb?fCKI|57`B)$94Cx?R%5 zvSD)4YNy9_?b@|I@v2p;`WG%-=wH5kxzt$t8cS&dqro}`fnei<$elZP&Pw9RlP4P@ zw1BV`D^@hFUcK5JA0KZBkLJ|WR8zp(MP8T5W$VE^@4R!b>g^WbYv+TV+Pg40Ir-Q3 z-h1!R(W6ISlZ~#f9x>!`jg5^V>#AOF`SRu6D_5@cAXo(Uw`|$cOUbM)ktvDpjj1Q% zb-Kfgb?eqONJFGRsz`&tZnxV?iM;>*`@bOX`?l(B6~H$wsO=N-(qF#u#v3omXhmeR z*_?(@m#Ln4Dqea1{P~_{5c5zxvzA1D5Q$8uc%qZ&WZ{7Vr>QBhC9;e}k=(lX-g|d# z+O+9A0`{Jp#@;N3bmL5%K7INZZ@u-_-$a&?DDtK?Wl!s-GY^GWE+^AHv$jO0>mr`0 zbtOM@=1g%T5+M@;1(1;lfp;rt4g8VTzt7Er`z;e`9eq`6=+o~gKqzFYKSrn%IZP&V zeyxHAXgB98ue`#BCWpjh$ByOlrb1ItA;JpX;kMSfCqke=XbY^iWNmrI7+$z-+qR!e z?~}J1Ad$C4Q}`oVBmepCyYK#o_C=<;mgnkQrgH0&WSPcNs{dJWyE}P1+H-I8wlsz2 znlke>Yu4DVQ~*@FQDM`>3%NvETRLM8J@n8%OnHv-7#&`2l_&v=$rSGK6Cjv zbOSbOHMP1oYT!AK8tIhEU>W%8)vL`LwH~&7DwVtqPy%Os&z?O$5b0mN-Ne0Lds-h~ zIDGi<&osVCd1OcHcgLq%dF`}xyS4L3ywO2nN@ZPSN@a(tExdUoj~Lw1Y;6247f9{J zNFrn5#-eZZ(fdo^83SYCCaujH>E4*Gjq
6A6m*G1K9YV*Rh)Di#yV{78BUAw*} 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 WkCTmV9QdjL0000 Date: Tue, 31 Jul 2018 15:18:53 +0800 Subject: [PATCH 011/121] update title bar --- app/src/main/res/drawable-xhdpi/black_back.png | Bin 0 -> 1075 bytes app/src/main/res/drawable-xxhdpi/black_back.png | Bin 0 -> 1584 bytes app/src/main/res/layout/custom_titlebar.xml | 13 +++++++------ app/src/main/res/values/colors.xml | 6 ++++-- 4 files changed, 11 insertions(+), 8 deletions(-) create mode 100644 app/src/main/res/drawable-xhdpi/black_back.png create mode 100644 app/src/main/res/drawable-xxhdpi/black_back.png diff --git a/app/src/main/res/drawable-xhdpi/black_back.png b/app/src/main/res/drawable-xhdpi/black_back.png new file mode 100644 index 0000000000000000000000000000000000000000..7d84898a7090136d9f1cc645128316763483ca24 GIT binary patch literal 1075 zcmV-31kC%1P)Px&?MXyIR9FeMm)~7?Npf%R%h|ho z&iUkf?*0nE20g>0m6r?UgYS2y=bas1yyr%zvOWXPGGHH>iTrG{Uj13+^&FUgWpYb^ z^K*!}6A(Bc9x;>oYO}Tm6`lfz%aybbjPnE;SBenO2gqLJ@yu5b7Vi9Gr~$XOSlp8W z;6IS6b(qX4gt&zuj@57exGdj20j5inN$~r>M}P^LR6Rn#?CQ$u(c81ve^Gs|ftk@t zV!&W$N!dP?R9dO56DIpz0dwVvcmVhr%Clc4Q;(H0HO5q8Fjy&fbr6J6#e1v z0Prvy#v$yoXUdpJ)IRZ189RndVc8bb)R1fM$nTods=5iCEU^Mh4O^|n#v$Xvx zQ#mYww9bNjfPF!`{=3RigE_7<-QTMHe_*K;;68Se&a?OQfL>>#9;>(8fdni0^CxJ6 z9Mhe=g2|lEfaS8k2-7bzY4MXChd*0dcT|Y`e`BPShh-p zj9KP5P`Ae;O zwdEnu9!h)a5My{SmKY)E++sga3xz6;jZ(lg13X|xw_a>EZ!anDZmk1Qrm%q`YypGq z51S(wmKNsLF1Q{6?V)sq&v1^Dk$8rnce;i?N1^)N)=KG{W)0-~qN)5$t5&_Qyq#>9 zKzpThgyl%>p3RZMg;s0sFDIBB>j7vFCE!*xV0R#vo4MbZf8Ye|5$FI#c)`!vcxW&= zyl+V%^S?WE1XJCFV+6Ag!T!vhf;Y*xG;8Z3T3Ak7v~>!Ds=&LfFc%n zfR9DPG<#dsHmFOWJ(M>5BKp{?7)wn*Y~1}@DfIwo52f?86g2$X2s)#n9swPo0HZv_7WG%E^vAzx`=GT9thsDpUxy4F+?XmLM5G(&G6w6beQ1Z4a{tFFmz7Hp}Pa^;T002ovPDHLkV1mXw0|x*A literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/black_back.png b/app/src/main/res/drawable-xxhdpi/black_back.png new file mode 100644 index 0000000000000000000000000000000000000000..e7274d0ee2515a8f13e86fcaffbe50f749c2fc00 GIT binary patch literal 1584 zcmV-02G9A4P)Px)>PbXFRA>dwn)`DTRTRhXy_*69wRzA4YfF>els0LQR|TOhH4o4-j-!l!0r)>S zgf1jbesVsDb@$3CUtm}zH&XM_J(x3uOz!0FF)Mu-FwdY z%y-Yd_v})M{7;(Fn?B)dm0M)-D!^tFD@Dv1<>!5Nxa}+4f zz@zjE2zAd1KfC;}bRw7gIX7{RAREZ6CQ`R&F3ulL(bIeIp(k@7hQxzyw=3SJqOJLV+ z1gTX|>dm)0ZW(lYS2_wC;TV)^F+JyYtZqHumO#TjL$XIA@VIG0&yiiLThG5KXe5@5 zND>>PgznUHvZAC(J*j7Fb=(kCNep%}E{%e-U3w0kR#L>(-JTGV@(rVKcI^?9)x8@^ zikO;;ws$2vD3PF^B>Tifb?=svBJR4gzN0(czOjjp!j1i6lDc;r663E?bbHUhQyV1; zMXv!QzIQvkaMZ%A0S(6ww|UqG+{~ZRnz%B?`RQL4?wlmkx8`-{ICP`Dm?+e0l=G59 zaq4ypuQ&g-*?jK4w^@0YHt|ESXKEL~ls+Ahyh_0}>XdHx!-# zP(xV1$Jbf(N|)V)T?4uT3(ESMm2o3wVMo{v%C;9mn=g}m-W6rnfmWgHUO(B=R?G+9 zBjgXqb6XSCy0UbiKe%aIF&_rloTIS1ph8*GG@zs}5Mr%`eD-~?;b`YXGX%wexWLR{ zVcLFwP!1Fwgf#_S1M49N_1@i~Rz2VkDt>_d0Bmem))Ht1>;yH0CC~bT$`b(lA==p4 zEQ4ZDOoKp6+c@!f`t=S4Q2Y?2!4`o1s9~TOxLEwvG-n|V`U9=`_%BO8kO+!bM0PhS%#2DAbT${zNIWDlgl)p{V&wq{T?wggM)kS{0`fc+G0YHf9a zVo*!4lqUVH@^Wz|d#z!hRlueLL1ht6u+M6Nty@tM)QYn3Mw{`4s8Bq2_lQ3fxd&UFJ*p=5B&NK@d&=vmC=eLHGzhQxWZ3gRzq9Q21FhYqqq4!z?Il!RIdI4&KzaVG7 z5q4U=qo5ejGz|b2)E$Ns>`#FGRtplx90$c9Wmw%3k-{HFkYnCf<#+f4t?$rA-CP01 zpsTP3^(i i#{Y1O#xt+$LHr9r)W5Sxi8W;a0000 + android:textSize="16sp" /> @@ -54,11 +54,12 @@ + android:textColor="@color/default_title_right_color" + android:textSize="16sp" /> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 4983b6a1..3b4e9738 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,13 +2,16 @@ #4f72ff #4f72ff - #4f72ff #FF4081 #55FF4081 #333333 #2E4AF2 #2959CC + #FFFFFF + #FF333333 + #62678A + #262a44 #525461 #8a8d9f @@ -34,7 +37,6 @@ #fff4f4f4 #cccccc #ffaaaaaa - #ffffffff #ffffffff #ffff4d55 #ff9d45 From 37ba561d353fb9147c759bc8e41eb5d18e8a30cb Mon Sep 17 00:00:00 2001 From: baojun Date: Tue, 31 Jul 2018 15:31:57 +0800 Subject: [PATCH 012/121] reconstruct qr_receive_page --- .../activity/ReceiveQrCodeActivity.java | 103 +++++++++--- app/src/main/res/drawable-xxhdpi/ic_share.png | Bin 0 -> 474 bytes .../main/res/drawable-xxxhdpi/ic_share.png | Bin 0 -> 675 bytes .../res/drawable/qrcode_receipt_bottom.xml | 7 + .../main/res/drawable/qrcode_receipt_top.xml | 7 + .../res/layout/activity_receive_qrcode.xml | 148 +++++++++++------- app/src/main/res/layout/custom_titlebar.xml | 2 +- app/src/main/res/values/strings.xml | 1 + 8 files changed, 189 insertions(+), 79 deletions(-) create mode 100644 app/src/main/res/drawable-xxhdpi/ic_share.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_share.png create mode 100644 app/src/main/res/drawable/qrcode_receipt_bottom.xml create mode 100644 app/src/main/res/drawable/qrcode_receipt_top.xml diff --git a/app/src/main/java/org/nervos/neuron/activity/ReceiveQrCodeActivity.java b/app/src/main/java/org/nervos/neuron/activity/ReceiveQrCodeActivity.java index ec56e960..43bb7214 100644 --- a/app/src/main/java/org/nervos/neuron/activity/ReceiveQrCodeActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/ReceiveQrCodeActivity.java @@ -3,52 +3,94 @@ import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; +import android.content.Intent; import android.graphics.Bitmap; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; +import android.net.Uri; +import android.os.Environment; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.uuzuche.lib_zxing.activity.CodeUtils; +import com.yanzhenjie.permission.AndPermission; +import com.yanzhenjie.permission.Permission; import org.nervos.neuron.R; +import org.nervos.neuron.custom.TitleBar; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.util.Blockies; import org.nervos.neuron.util.db.DBWalletUtil; +import org.nervos.neuron.util.permission.PermissionUtil; +import org.nervos.neuron.util.permission.RuntimeRationale; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import de.hdodenhof.circleimageview.CircleImageView; -public class ReceiveQrCodeActivity extends BaseActivity { +public class ReceiveQrCodeActivity extends NBaseActivity { private ImageView qrCodeImage; private TextView walletNameText; private TextView walletAddressText; private CircleImageView walletPhotoImage; + private TitleBar title; + private static final String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/NQrCode.png"; @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_receive_qrcode); - - WalletItem walletItem = DBWalletUtil.getCurrentWallet(mActivity); + protected int getContentLayout() { + return R.layout.activity_receive_qrcode; + } + @Override + protected void initView() { qrCodeImage = findViewById(R.id.receive_qrcode_image); walletNameText = findViewById(R.id.qrcode_wallet_name); walletAddressText = findViewById(R.id.qrcode_wallet_address); walletPhotoImage = findViewById(R.id.wallet_photo); + title = findViewById(R.id.title); + title.setOnRightClickListener(() -> { + showProgressBar(); + AndPermission.with(mActivity) + .runtime().permission(Permission.Group.STORAGE) + .rationale(new RuntimeRationale()) + .onGranted(permissions -> { + try { + savePic(); + String imagePath = savePath; + Uri imageUri = Uri.fromFile(new File(imagePath)); + Intent shareIntent = new Intent(); + shareIntent.setAction(Intent.ACTION_SEND); + shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri); + shareIntent.setType("image/*"); + startActivity(Intent.createChooser(shareIntent, "分享到")); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + }) + .onDenied(permissions -> PermissionUtil.showSettingDialog(mActivity, permissions)) + .start(); + }); + } + + @Override + protected void initAction() { + + } + + @Override + protected void initData() { + WalletItem walletItem = DBWalletUtil.getCurrentWallet(mActivity); walletPhotoImage.setImageBitmap(Blockies.createIcon(walletItem.address)); - findViewById(R.id.button_copy_receive_qrcode).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - ClipboardManager cm = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE); - ClipData mClipData = ClipData.newPlainText("qrCode", walletItem.address); - if (cm != null) { - cm.setPrimaryClip(mClipData); - Toast.makeText(mActivity, R.string.copy_success, Toast.LENGTH_SHORT).show(); - } + findViewById(R.id.button_copy_receive_qrcode).setOnClickListener((view) -> { + ClipboardManager cm = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE); + ClipData mClipData = ClipData.newPlainText("qrCode", walletItem.address); + if (cm != null) { + cm.setPrimaryClip(mClipData); + Toast.makeText(mActivity, R.string.copy_success, Toast.LENGTH_SHORT).show(); } }); @@ -57,6 +99,31 @@ public void onClick(View v) { Bitmap bitmap = CodeUtils.createImage(walletItem.address, 400, 400, null); qrCodeImage.setImageBitmap(bitmap); + } + + //save qrcode + private void savePic() throws FileNotFoundException { + Bitmap bitmap = getCacheBitmapFromView(findViewById(R.id.ll_qrcode)); + File file = new File(savePath); + if (file.exists()) + file.delete(); + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos); + } + //get screenShoot + private Bitmap getCacheBitmapFromView(View view) { + final boolean drawingCacheEnabled = true; + view.setDrawingCacheEnabled(drawingCacheEnabled); + view.buildDrawingCache(drawingCacheEnabled); + final Bitmap drawingCache = view.getDrawingCache(); + Bitmap bitmap; + if (drawingCache != null) { + bitmap = Bitmap.createBitmap(drawingCache); + view.setDrawingCacheEnabled(false); + } else { + bitmap = null; + } + return bitmap; } } diff --git a/app/src/main/res/drawable-xxhdpi/ic_share.png b/app/src/main/res/drawable-xxhdpi/ic_share.png new file mode 100644 index 0000000000000000000000000000000000000000..b9f5769cf789f606a28617f4926dc25b0fe28820 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^x@L|G(`wa^A{!jKT*#LBlh^LEV zNX4ADR}Yr8DDbde2w+YsT(E%o?f?H72fH3=9DKLy#qFmRMXj>}v_U~EiUFR(Rr|;fR-Mt^HrEdH_bUUiIzfQ9L3GdqDrK``fFIu$K zx0@@kG-s*1hv(tM|6#6kQOqSoK!yNGI z!f|iEsHwHUlqQznl3vcuJ=GI`_BIGnWePzopr07Gc{ A8vp8^PF zx5KN2YA60!bSZB>J|Ru7%cFlI&$==h=eG2=d+vfQH}9)|KWMtlhh?X&+LX*0k7eD| zG}1N{Z8mc>=+H{rHu)FJL4^RHgKwU^Fym0%m$XOFVb9SeO81hs+&`dT62W7esXkwM zuXX5FiLYh;f>)Ir<8%X0NYu?Zthm;C`6R&z#;%4&=UFF&8Xd3f6PclGk;2iZFO;}> zXK!S+<{U6^N+4^+4zu|JMnd)<5R?*W9UQ+46IP$-?_lKjM?t9PE}^ iR8V$Y(XuD+4{IokZuzN`=QaQ%pTX1B&t;ucLK6T1e_7E0 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/qrcode_receipt_bottom.xml b/app/src/main/res/drawable/qrcode_receipt_bottom.xml new file mode 100644 index 00000000..b9a88fcd --- /dev/null +++ b/app/src/main/res/drawable/qrcode_receipt_bottom.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/qrcode_receipt_top.xml b/app/src/main/res/drawable/qrcode_receipt_top.xml new file mode 100644 index 00000000..9b58ed80 --- /dev/null +++ b/app/src/main/res/drawable/qrcode_receipt_top.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_receive_qrcode.xml b/app/src/main/res/layout/activity_receive_qrcode.xml index 26b36fa1..7c59d582 100644 --- a/app/src/main/res/layout/activity_receive_qrcode.xml +++ b/app/src/main/res/layout/activity_receive_qrcode.xml @@ -1,93 +1,121 @@ - + android:background="#252A3E" + android:orientation="vertical"> - + app:title_bg="@color/transparent" + app:title_color="@color/white" /> + - - + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_marginLeft="30dip" + android:layout_marginRight="30dip" + android:orientation="vertical"> - - - + android:layout_height="wrap_content" + android:background="@drawable/qrcode_receipt_top"> + android:layout_width="50dip" + android:layout_height="50dip" + android:layout_marginTop="10dip" + android:background="@mipmap/ic_launcher" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + android:layout_marginTop="3dip" + android:text="wallert" + android:textColor="@color/white" + android:textSize="20sp" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toBottomOf="@id/wallet_photo" /> + android:text="0x12345454645342422334343534343" + android:textColor="@color/white" + android:textSize="14sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toBottomOf="@id/qrcode_wallet_name" /> + + + - + - + - + + + + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/custom_titlebar.xml b/app/src/main/res/layout/custom_titlebar.xml index 3edff494..ab1a4674 100644 --- a/app/src/main/res/layout/custom_titlebar.xml +++ b/app/src/main/res/layout/custom_titlebar.xml @@ -58,7 +58,7 @@ android:layout_height="wrap_content" android:layout_centerInParent="true" android:textColor="@color/default_gray_6" - android:textSize="14sp" /> + android:textSize="18sp" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3a77f3b1..a0433184 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -52,6 +52,7 @@ 交易 添加自定义资产 扫一扫向我付款 + 收款地址 复制地址 助记词将被用来恢复钱包或重置钱包密码 - 如您的助记词被他人获取,您的财产可能受到损失 From 7f77a557a3e82f90b98729c69abd7236d44022c5 Mon Sep 17 00:00:00 2001 From: baojun Date: Tue, 31 Jul 2018 17:44:18 +0800 Subject: [PATCH 013/121] reconstruct qr_receive_page add screenshot,share pic change status bar color add file provider --- app/src/main/AndroidManifest.xml | 11 +++ .../neuron/activity/AboutUsActivity.java | 5 + .../nervos/neuron/activity/BaseActivity.java | 24 ++++- .../neuron/activity/CurrencyActivity.java | 5 + .../nervos/neuron/activity/MainActivity.java | 32 +++---- .../nervos/neuron/activity/NBaseActivity.java | 13 ++- .../activity/ReceiveQrCodeActivity.java | 92 +++++++++++++------ .../neuron/fragment/SettingsFragment.java | 3 + .../res/layout/activity_receive_qrcode.xml | 32 +++---- app/src/main/res/values/colors.xml | 2 + app/src/main/res/xml/file_paths.xml | 6 ++ 11 files changed, 150 insertions(+), 75 deletions(-) create mode 100644 app/src/main/res/xml/file_paths.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 133730a6..0e9ccaeb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -140,6 +140,17 @@ android:name=".activity.CurrencyActivity" android:screenOrientation="portrait" android:theme="@style/AppTheme.NoActionBar" /> + + + + + diff --git a/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java b/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java index bd576f85..bca1fe99 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java @@ -23,6 +23,11 @@ protected int getContentLayout() { return R.layout.activity_about_us; } + @Override + protected int getStatusBarColor() { + return getResources().getColor(R.color.white); + } + @Override protected void initView() { versionText = findViewById(R.id.app_version); diff --git a/app/src/main/java/org/nervos/neuron/activity/BaseActivity.java b/app/src/main/java/org/nervos/neuron/activity/BaseActivity.java index 2e03f3ce..9775c51c 100644 --- a/app/src/main/java/org/nervos/neuron/activity/BaseActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/BaseActivity.java @@ -1,6 +1,7 @@ package org.nervos.neuron.activity; import android.app.Activity; +import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.annotation.StringRes; @@ -9,6 +10,8 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.TextView; @@ -26,7 +29,20 @@ public class BaseActivity extends AppCompatActivity { protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivity = this; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS + | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(getStatusBarColor()); + } + } + /** + * set statusBarColor + */ + protected int getStatusBarColor() { + return getResources().getColor(R.color.colorPrimary); } public void onDestroy() { @@ -56,7 +72,7 @@ protected void showProgressBar(String message) { FrameLayout.LayoutParams fl = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); fl.gravity = Gravity.CENTER; - ((ViewGroup)rootView).addView(mProgressView, 1, fl); + ((ViewGroup) rootView).addView(mProgressView, 1, fl); } } @@ -65,7 +81,7 @@ protected void showProgressBar(String message) { */ protected void dismissProgressBar() { if (rootView != null && mProgressView != null) { - ((ViewGroup)rootView).removeView(mProgressView); + ((ViewGroup) rootView).removeView(mProgressView); } mProgressView = null; rootView = null; @@ -83,7 +99,7 @@ protected void showProgressCircle() { FrameLayout.LayoutParams fl = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); fl.gravity = Gravity.CENTER; - ((ViewGroup)rootView).addView(mProgressCircleView, 1, fl); + ((ViewGroup) rootView).addView(mProgressCircleView, 1, fl); } } @@ -92,7 +108,7 @@ protected void showProgressCircle() { */ protected void dismissProgressCircle() { if (rootView != null && mProgressCircleView != null) { - ((ViewGroup)rootView).removeView(mProgressCircleView); + ((ViewGroup) rootView).removeView(mProgressCircleView); } mProgressCircleView = null; rootView = null; diff --git a/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java b/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java index fa86972c..1f96ff83 100644 --- a/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java @@ -35,6 +35,11 @@ protected void initView() { title = findViewById(R.id.title); } + @Override + protected int getStatusBarColor() { + return getResources().getColor(R.color.white); + } + @Override protected void initData() { title.setLeftImage(R.drawable.ic_toptitle_back_white); diff --git a/app/src/main/java/org/nervos/neuron/activity/MainActivity.java b/app/src/main/java/org/nervos/neuron/activity/MainActivity.java index 82a56fb7..8d0596ce 100644 --- a/app/src/main/java/org/nervos/neuron/activity/MainActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/MainActivity.java @@ -42,8 +42,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { } - - private void initView(){ + private void initView() { navigation = findViewById(R.id.navigation); navigation.check(RadioGroup.NO_ID); fMgr = getSupportFragmentManager(); @@ -51,21 +50,21 @@ private void initView(){ if (SharePrefUtil.getFirstIn()) { SharePrefUtil.putFirstIn(false); new AlertDialog.Builder(mActivity) - .setTitle(R.string.dialog_title_tip) - .setMessage(R.string.dialog_tip_message) - .setPositiveButton(R.string.have_known, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }).show(); + .setTitle(R.string.dialog_title_tip) + .setMessage(R.string.dialog_tip_message) + .setPositiveButton(R.string.have_known, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }).show(); } } @Override protected void onResume() { super.onResume(); - if(getIntent() != null) { + if (getIntent() != null) { setNavigationItem(getIntent().getStringExtra(EXTRA_TAG)); } } @@ -82,7 +81,7 @@ private void initListener() { hideFragments(transaction); switch (checkedId) { case R.id.navigation_application: - if(appFragment == null){ + if (appFragment == null) { appFragment = new AppFragment(); transaction.add(R.id.fragment, appFragment); } else { @@ -93,7 +92,7 @@ private void initListener() { if (DBWalletUtil.getCurrentWallet(mActivity) == null) { startActivity(new Intent(mActivity, AddWalletActivity.class)); } else { - if(walletFragment == null){ + if (walletFragment == null) { walletFragment = new WalletFragment(); transaction.add(R.id.fragment, walletFragment); } else { @@ -102,7 +101,7 @@ private void initListener() { } break; case R.id.navigation_settings: - if(settingsFragment == null){ + if (settingsFragment == null) { settingsFragment = new SettingsFragment(); transaction.add(R.id.fragment, settingsFragment); } else { @@ -110,7 +109,7 @@ private void initListener() { } break; case R.id.navigation_transaction: - if(transactionFragment == null){ + if (transactionFragment == null) { transactionFragment = new TransactionFragment(); transaction.add(R.id.fragment, transactionFragment); } else { @@ -118,7 +117,7 @@ private void initListener() { } break; default: - if(appFragment == null){ + if (appFragment == null) { appFragment = new AppFragment(); transaction.add(R.id.fragment, appFragment); } else { @@ -171,7 +170,6 @@ private void hideFragments(FragmentTransaction transaction) { } - private long exitTime = 0; @Override diff --git a/app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java b/app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java index 91adc11a..a8f10a77 100644 --- a/app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java @@ -1,10 +1,13 @@ package org.nervos.neuron.activity; +import android.os.Build; import android.os.Bundle; import android.support.v4.app.FragmentManager; import android.view.Window; +import android.view.WindowManager; import org.greenrobot.eventbus.EventBus; +import org.nervos.neuron.R; /** * Created by 包俊 on 2018/7/30. @@ -28,17 +31,17 @@ protected void onCreate(Bundle savedactivityState) { protected abstract int getContentLayout(); /** - * 初始化UI + * init ui */ protected abstract void initView(); /** - * 初始化事件 + * init data */ - protected abstract void initAction(); + protected abstract void initData(); /** - * 初始化数据 + * init action */ - protected abstract void initData(); + protected abstract void initAction(); } diff --git a/app/src/main/java/org/nervos/neuron/activity/ReceiveQrCodeActivity.java b/app/src/main/java/org/nervos/neuron/activity/ReceiveQrCodeActivity.java index 43bb7214..92e8b7fe 100644 --- a/app/src/main/java/org/nervos/neuron/activity/ReceiveQrCodeActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/ReceiveQrCodeActivity.java @@ -6,8 +6,12 @@ import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; +import android.os.Build; import android.os.Environment; +import android.support.v4.content.FileProvider; import android.view.View; +import android.view.Window; +import android.view.WindowManager; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; @@ -28,6 +32,7 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.IOException; import de.hdodenhof.circleimageview.CircleImageView; @@ -38,13 +43,20 @@ public class ReceiveQrCodeActivity extends NBaseActivity { private TextView walletAddressText; private CircleImageView walletPhotoImage; private TitleBar title; - private static final String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/NQrCode.png"; + private TextView copyAddressText; + + private static final String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Download/NQrCode.png"; @Override protected int getContentLayout() { return R.layout.activity_receive_qrcode; } + @Override + protected int getStatusBarColor() { + return getResources().getColor(R.color.qr_receive_bg); + } + @Override protected void initView() { qrCodeImage = findViewById(R.id.receive_qrcode_image); @@ -52,32 +64,7 @@ protected void initView() { walletAddressText = findViewById(R.id.qrcode_wallet_address); walletPhotoImage = findViewById(R.id.wallet_photo); title = findViewById(R.id.title); - title.setOnRightClickListener(() -> { - showProgressBar(); - AndPermission.with(mActivity) - .runtime().permission(Permission.Group.STORAGE) - .rationale(new RuntimeRationale()) - .onGranted(permissions -> { - try { - savePic(); - String imagePath = savePath; - Uri imageUri = Uri.fromFile(new File(imagePath)); - Intent shareIntent = new Intent(); - shareIntent.setAction(Intent.ACTION_SEND); - shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri); - shareIntent.setType("image/*"); - startActivity(Intent.createChooser(shareIntent, "分享到")); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - }) - .onDenied(permissions -> PermissionUtil.showSettingDialog(mActivity, permissions)) - .start(); - }); - } - - @Override - protected void initAction() { + copyAddressText = findViewById(R.id.button_copy_receive_qrcode); } @@ -85,7 +72,7 @@ protected void initAction() { protected void initData() { WalletItem walletItem = DBWalletUtil.getCurrentWallet(mActivity); walletPhotoImage.setImageBitmap(Blockies.createIcon(walletItem.address)); - findViewById(R.id.button_copy_receive_qrcode).setOnClickListener((view) -> { + copyAddressText.setOnClickListener((view) -> { ClipboardManager cm = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE); ClipData mClipData = ClipData.newPlainText("qrCode", walletItem.address); if (cm != null) { @@ -101,14 +88,59 @@ protected void initData() { qrCodeImage.setImageBitmap(bitmap); } + @Override + protected void initAction() { + title.setOnRightClickListener(() -> { + showProgressBar(); + AndPermission.with(mActivity) + .runtime().permission(Permission.Group.STORAGE) + .rationale(new RuntimeRationale()) + .onGranted(permissions -> { + try { + savePic(); + Uri imageUri; + if (Build.VERSION.SDK_INT >= 24) { + File file = new File(savePath); + imageUri = FileProvider.getUriForFile(this, "org.nervos.neuron.fileprovider", file); + } else { + imageUri = Uri.fromFile(new File(savePath)); + } + Intent shareIntent = new Intent(); + shareIntent.setAction(Intent.ACTION_SEND); + shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri); + shareIntent.setType("image/*"); + startActivity(Intent.createChooser(shareIntent, "分享到")); + dismissProgressBar(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + dismissProgressBar(); + } catch (IOException e) { + e.printStackTrace(); + dismissProgressBar(); + } + }) + .onDenied(permissions -> { + dismissProgressBar(); + PermissionUtil.showSettingDialog(mActivity, permissions); + }) + .start(); + }); + } + //save qrcode - private void savePic() throws FileNotFoundException { + private void savePic() throws IOException { + copyAddressText.setVisibility(View.GONE); Bitmap bitmap = getCacheBitmapFromView(findViewById(R.id.ll_qrcode)); File file = new File(savePath); if (file.exists()) file.delete(); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); - bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos); + //if we use CompressFormat.JPEG,bitmap will have black background + bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos); + bos.flush(); + bos.close(); + bitmap.recycle(); + copyAddressText.setVisibility(View.VISIBLE); } //get screenShoot diff --git a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java index ff3459fc..e4090651 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java @@ -3,12 +3,15 @@ import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; +import android.os.Build; import android.support.v4.app.Fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; import android.widget.TextView; import android.widget.Toast; diff --git a/app/src/main/res/layout/activity_receive_qrcode.xml b/app/src/main/res/layout/activity_receive_qrcode.xml index 7c59d582..09df7f8e 100644 --- a/app/src/main/res/layout/activity_receive_qrcode.xml +++ b/app/src/main/res/layout/activity_receive_qrcode.xml @@ -1,9 +1,10 @@ - @@ -81,40 +82,33 @@ android:id="@+id/tv_address" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_centerHorizontal="true" android:layout_marginTop="20dip" android:text="@string/qrcode_address" android:textColor="@color/font_title" - android:textSize="20sp" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + android:textSize="20sp" /> + android:layout_below="@id/tv_address" + android:layout_centerHorizontal="true" + android:layout_marginBottom="10dp" + android:layout_marginTop="@dimen/default_margin" /> + android:textSize="16sp" /> - + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 4983b6a1..eaca7664 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -17,6 +17,8 @@ #f7f7f7 + #252A3E + #fff5f5f5 #FFFEED #ff8f27 diff --git a/app/src/main/res/xml/file_paths.xml b/app/src/main/res/xml/file_paths.xml new file mode 100644 index 00000000..99d3e6de --- /dev/null +++ b/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file From f966b579162ee2058ae64100c323af6fd1c29220 Mon Sep 17 00:00:00 2001 From: baojun Date: Tue, 31 Jul 2018 18:04:07 +0800 Subject: [PATCH 014/121] currency bug --- .../neuron/activity/CurrencyActivity.java | 6 +- app/src/main/res/layout/activity_about_us.xml | 1 - app/src/main/res/layout/activity_currency.xml | 1 - .../main/res/layout/activity_simple_web.xml | 11 +-- app/src/main/res/layout/fragment_settings.xml | 4 +- .../main/res/layout/fragment_transaction.xml | 17 ++-- app/src/main/res/layout/fragment_wallet.xml | 83 ++++++++++--------- 7 files changed, 67 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java b/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java index 1f96ff83..70590f68 100644 --- a/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java @@ -50,7 +50,6 @@ protected void initData() { Adapter adapter = new Adapter(); currencyRecycler.setAdapter(adapter); title.setOnLeftClickListener(() -> { - setResult(RESULT_OK); finish(); }); } @@ -109,4 +108,9 @@ public ViewHolder(View view) { } } + @Override + public void finish() { + setResult(RESULT_OK); + super.finish(); + } } diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index cf67b673..d5d6f165 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -12,7 +12,6 @@ android:layout_height="48dp" app:isShowLeft="true" app:title="@string/about_us_title" - app:title_bg="@color/white" app:title_color="@color/font_title" /> + android:layout_height="match_parent" + android:orientation="vertical"> + app:isShowLeft="true" + app:title_bg="@color/colorPrimary" + app:title_color="@color/white" /> + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 4fd93342..ff77941f 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -12,7 +12,9 @@ android:layout_height="48dp" android:background="@color/colorPrimary" app:isShowLeft="false" - app:title="@string/settings_title" /> + app:title="@string/settings_title" + app:title_bg="@color/colorPrimary" + app:title_color="@color/white" /> + android:layout_height="match_parent" + android:background="@color/white" + android:orientation="vertical"> + app:title_bg="@color/colorPrimary" + app:title_color="@color/white" /> + android:layout_height="match_parent" + android:paddingEnd="@dimen/default_margin" + android:paddingStart="@dimen/default_margin" /> - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_wallet.xml b/app/src/main/res/layout/fragment_wallet.xml index a70723c0..a7ee5765 100644 --- a/app/src/main/res/layout/fragment_wallet.xml +++ b/app/src/main/res/layout/fragment_wallet.xml @@ -1,36 +1,38 @@ - - + android:layout_height="match_parent" + android:background="@color/default_background" + android:orientation="vertical"> + + + app:left_img="@drawable/list" + app:right_img="@drawable/add" + app:title="@string/wallet_title" + app:title_bg="@color/colorPrimary" + app:title_color="@color/white" /> + android:translationZ="5dp"> + app:civ_border_color="@color/default_gray_d5" + app:civ_border_width="1dp" /> + android:layout_marginTop="5dp" + android:text="Watson" + android:textColor="@color/default_black" + android:textSize="14sp" /> - + android:ellipsize="middle" + android:singleLine="true" + android:textColor="@color/default_black" + android:textSize="14sp" /> + + android:orientation="horizontal"> + + android:textSize="14sp" /> + android:layout_weight="1" + android:background="@color/default_gray_c" /> + + android:textSize="14sp" /> @@ -119,8 +123,8 @@ + android:layout_above="@id/wallet_layout" + android:background="@color/default_gray_c" /> @@ -130,6 +134,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="@dimen/default_margin"> + Date: Tue, 31 Jul 2018 19:44:33 +0800 Subject: [PATCH 015/121] fingerprint setting without ui --- app/src/main/AndroidManifest.xml | 2 + .../neuron/activity/CurrencyActivity.java | 5 +- .../neuron/custom/SettingButtonView.java | 37 +++++++++++-- .../neuron/fragment/SettingsFragment.java | 50 ++++++++++++++++-- .../AuthenticateResultCallback.java | 1 - .../FingerPrint/FingerPrintController.java | 21 +++----- .../neuron/util/FingerPrint/Fingerprint.java | 1 - .../NotSupportFingerprintException.java | 1 - .../org/nervos/neuron/util/SharePreConst.java | 9 ++++ .../nervos/neuron/util/db/SharePrefUtil.java | 4 ++ .../drawable-xhdpi/ic_setting_fingerprint.png | Bin 0 -> 581 bytes .../ic_setting_fingerprint.png | Bin 0 -> 705 bytes .../ic_setting_fingerprint.png | Bin 0 -> 1062 bytes app/src/main/res/layout/fragment_settings.xml | 15 ++++-- .../main/res/layout/view_setting_button.xml | 21 ++++++-- app/src/main/res/values/attrs.xml | 1 + app/src/main/res/values/strings.xml | 4 ++ 17 files changed, 139 insertions(+), 33 deletions(-) create mode 100644 app/src/main/java/org/nervos/neuron/util/SharePreConst.java create mode 100644 app/src/main/res/drawable-xhdpi/ic_setting_fingerprint.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_setting_fingerprint.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_setting_fingerprint.png diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 133730a6..817302c4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,8 @@ + + { - SharePrefUtil.putString("Currency", currency); + SharePrefUtil.putString(SharePreConst.Currency, currency); notifyDataSetChanged(); }); } diff --git a/app/src/main/java/org/nervos/neuron/custom/SettingButtonView.java b/app/src/main/java/org/nervos/neuron/custom/SettingButtonView.java index d66ec2aa..63670afe 100644 --- a/app/src/main/java/org/nervos/neuron/custom/SettingButtonView.java +++ b/app/src/main/java/org/nervos/neuron/custom/SettingButtonView.java @@ -15,11 +15,13 @@ */ public class SettingButtonView extends ConstraintLayout { - private ImageView iconImage, openImage; + private ImageView iconImage, openImage, switchImage; private TextView nameText, otherText; private TypedArray ta; private openListener openListener = null; + private switchListener switchListener = null; private ConstraintLayout root; + private boolean switchStatus = false; public SettingButtonView(Context context, AttributeSet attrs) { super(context, attrs); @@ -37,6 +39,7 @@ private void initView() { otherText = findViewById(R.id.tv_other); openImage = findViewById(R.id.iv_setting_open); root = findViewById(R.id.root); + switchImage = findViewById(R.id.iv_setting_switch); } private void initData() { @@ -49,6 +52,11 @@ private void initData() { otherText.setVisibility(VISIBLE); else otherText.setVisibility(GONE); + boolean switchButton = ta.getBoolean(R.styleable.SettingButtonView_switch_button, false); + if (switchButton) + switchImage.setVisibility(VISIBLE); + else + switchImage.setVisibility(GONE); ta.recycle(); } @@ -58,9 +66,21 @@ public void setOther1Text(String text) { } public void setOpenListener(openListener openListener) { - if (openListener != null) { - this.openListener = openListener; - openImage.setVisibility(VISIBLE); + this.openListener = openListener; + openImage.setVisibility(VISIBLE); + } + + public void setSwitchListener(switchListener switchListener) { + this.switchListener = switchListener; + } + + public void setSwitch(boolean is) { + if (is) { + switchStatus = true; + switchImage.setImageResource(R.drawable.ic_setting_onoff_on); + } else { + switchStatus = false; + switchImage.setImageResource(R.drawable.ic_setting_onoff_off); } } @@ -69,9 +89,18 @@ private void initAction() { if (openListener != null) openListener.open(); }); + switchImage.setOnClickListener((view) -> { + if (switchListener != null) { + switchListener.click(!switchStatus); + } + }); } public interface openListener { void open(); } + + public interface switchListener { + void click(boolean is); + } } diff --git a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java index ff3459fc..edab6b79 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java @@ -1,8 +1,10 @@ package org.nervos.neuron.fragment; import android.app.Activity; +import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; +import android.os.UserManager; import android.support.v4.app.Fragment; import android.os.Bundle; import android.support.annotation.Nullable; @@ -18,6 +20,9 @@ import org.nervos.neuron.activity.SimpleWebActivity; import org.nervos.neuron.custom.SettingButtonView; import org.nervos.neuron.util.ConstUtil; +import org.nervos.neuron.util.FingerPrint.AuthenticateResultCallback; +import org.nervos.neuron.util.FingerPrint.FingerPrintController; +import org.nervos.neuron.util.SharePreConst; import org.nervos.neuron.util.db.SharePrefUtil; import java.util.zip.Inflater; @@ -27,7 +32,7 @@ public class SettingsFragment extends NBaseFragment { public static final String TAG = SettingsFragment.class.getName(); - private SettingButtonView currencySBV, aboutUsSBV, contactUsSBV; + private SettingButtonView currencySBV, aboutUsSBV, contactUsSBV, fingerPrintSBV; private static final int Currency_Code = 10001; @Override @@ -40,11 +45,17 @@ public void initView() { currencySBV = (SettingButtonView) findViewById(R.id.sbv_local_coin); aboutUsSBV = (SettingButtonView) findViewById(R.id.sbv_about_us); contactUsSBV = (SettingButtonView) findViewById(R.id.sbv_contact_us); + fingerPrintSBV = (SettingButtonView) findViewById(R.id.sbv_fingerprint); } @Override public void initData() { - currencySBV.setOther1Text(SharePrefUtil.getString("Currency", "CNY")); + currencySBV.setOther1Text(SharePrefUtil.getString(SharePreConst.Currency, "CNY")); + if (SharePrefUtil.getBoolean(SharePreConst.FingerPrint, false)) { + fingerPrintSBV.setSwitch(true); + } else { + fingerPrintSBV.setSwitch(false); + } } @Override @@ -53,6 +64,21 @@ public void initAction() { Intent intent = new Intent(getActivity(), CurrencyActivity.class); startActivityForResult(intent, Currency_Code); }); + fingerPrintSBV.setSwitchListener((is) -> { + if (is) { + //setting fingerprint + if (FingerPrintController.getInstance(getActivity()).hasEnrolledFingerprints() && FingerPrintController.getInstance(getActivity()).getEnrolledFingerprints().size() > 0) { + FingerPrintController.getInstance(getActivity()).authenticate(authenticateResultCallback); + } else { + Toast.makeText(getActivity(), "您尚未设置Touch ID,请在手机系统“设置>Touch ID与密码”中添加指纹", Toast.LENGTH_SHORT).show(); + } + } else { + //close fingerprint + SharePrefUtil.putBoolean(SharePreConst.FingerPrint, false); + fingerPrintSBV.setSwitch(false); + } + + }); aboutUsSBV.setOpenListener(() -> { Intent intent = new Intent(getActivity(), AboutUsActivity.class); startActivity(intent); @@ -62,13 +88,31 @@ public void initAction() { }); } + AuthenticateResultCallback authenticateResultCallback = new AuthenticateResultCallback() { + @Override + public void onAuthenticationError(String errorMsg) { + Toast.makeText(getContext(), errorMsg, Toast.LENGTH_SHORT).show(); + } + + @Override + public void onAuthenticationSucceeded() { + fingerPrintSBV.setSwitch(true); + SharePrefUtil.putBoolean(SharePreConst.FingerPrint, true); + } + + @Override + public void onAuthenticationFailed() { + Toast.makeText(getContext(), "指纹认证失败!", Toast.LENGTH_SHORT).show(); + } + }; + @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case Currency_Code: - currencySBV.setOther1Text(SharePrefUtil.getString("Currency", "CNY")); + currencySBV.setOther1Text(SharePrefUtil.getString(SharePreConst.Currency, "CNY")); break; } } diff --git a/app/src/main/java/org/nervos/neuron/util/FingerPrint/AuthenticateResultCallback.java b/app/src/main/java/org/nervos/neuron/util/FingerPrint/AuthenticateResultCallback.java index 20da0c0b..a47b903d 100644 --- a/app/src/main/java/org/nervos/neuron/util/FingerPrint/AuthenticateResultCallback.java +++ b/app/src/main/java/org/nervos/neuron/util/FingerPrint/AuthenticateResultCallback.java @@ -1,7 +1,6 @@ package org.nervos.neuron.util.FingerPrint; /** - * 指纹认证回调 * Created by 包俊 on 2018/7/30. */ diff --git a/app/src/main/java/org/nervos/neuron/util/FingerPrint/FingerPrintController.java b/app/src/main/java/org/nervos/neuron/util/FingerPrint/FingerPrintController.java index 244c0fd4..975490b4 100644 --- a/app/src/main/java/org/nervos/neuron/util/FingerPrint/FingerPrintController.java +++ b/app/src/main/java/org/nervos/neuron/util/FingerPrint/FingerPrintController.java @@ -15,7 +15,6 @@ import java.util.List; /** - * 指纹控制器 * Created by 包俊 on 2018/7/30. */ @@ -45,13 +44,10 @@ private FingerPrintController() { @SuppressWarnings("ResourceType") public FingerPrintController(Activity activity) { this.activity = activity; - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {//默认6.0以下不支持指纹。包括厂商定制的5.x系统 + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { try { Class.forName("android.hardware.fingerprint.FingerprintManager"); - //低于6.0版本,有这个类,不正常。在兼容性测试中,可以抛出异常,筛选出设备。 -// throw new RuntimeException("低于6.0系统支持指纹模块"); } catch (ClassNotFoundException e) { - // 低于6.0版本,没有这个类正常 e.printStackTrace(); } @@ -61,18 +57,18 @@ public FingerPrintController(Activity activity) { } /** - * 判断是否支持指纹 + * check fingerprint support * * @return */ public boolean isSupportFingerprint() { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)//默认6.0以下不支持指纹。包括厂商定制的5.x系统 + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return false; return fpManager == null ? false : fpManager.isHardwareDetected(); } /** - * 是否录入指纹 + *check has fingerprints * * @return */ @@ -89,8 +85,7 @@ public boolean hasEnrolledFingerprints() { } /** - * 发起指纹认证识别 - * + * authen * @param callback */ public void authenticate(final AuthenticateResultCallback callback) { @@ -99,7 +94,6 @@ public void authenticate(final AuthenticateResultCallback callback) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return; cancellationSignal = new CancellationSignal(); - //版本26才支持指纹 fpManager.authenticate(null, cancellationSignal, 0, new FingerprintManager.AuthenticationCallback() { @Override public void onAuthenticationError(int errorCode, CharSequence errString) { @@ -141,8 +135,7 @@ public void cancelAuth() { } /** - * 获取已经录入的指纹 - * + *get fingerprints * @return */ public List getEnrolledFingerprints() { @@ -172,7 +165,7 @@ public List getEnrolledFingerprints() { private static final String ACTION_SETTING = "android.settings.SETTINGS"; - //跳转设置页面 + //goto setting public static void openFingerPrintSettingPage(Context context) { Intent intent = new Intent(ACTION_SETTING); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); diff --git a/app/src/main/java/org/nervos/neuron/util/FingerPrint/Fingerprint.java b/app/src/main/java/org/nervos/neuron/util/FingerPrint/Fingerprint.java index 6e82bb90..2fc37abe 100644 --- a/app/src/main/java/org/nervos/neuron/util/FingerPrint/Fingerprint.java +++ b/app/src/main/java/org/nervos/neuron/util/FingerPrint/Fingerprint.java @@ -7,7 +7,6 @@ import java.lang.reflect.Method; /** - * 指纹信息类,系统的被隐藏 * Created by 包俊 on 2018/7/30. */ diff --git a/app/src/main/java/org/nervos/neuron/util/FingerPrint/NotSupportFingerprintException.java b/app/src/main/java/org/nervos/neuron/util/FingerPrint/NotSupportFingerprintException.java index 8ef55e3e..fb4548cf 100644 --- a/app/src/main/java/org/nervos/neuron/util/FingerPrint/NotSupportFingerprintException.java +++ b/app/src/main/java/org/nervos/neuron/util/FingerPrint/NotSupportFingerprintException.java @@ -1,7 +1,6 @@ package org.nervos.neuron.util.FingerPrint; /** - * 不支持指纹异常 * Created by 包俊 on 2018/7/30. */ diff --git a/app/src/main/java/org/nervos/neuron/util/SharePreConst.java b/app/src/main/java/org/nervos/neuron/util/SharePreConst.java new file mode 100644 index 00000000..c1a0a7b5 --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/util/SharePreConst.java @@ -0,0 +1,9 @@ +package org.nervos.neuron.util; + +/** + * Created by BaojunCZ on 2018/7/31. + */ +public class SharePreConst { + public static final String FingerPrint = "FingerPrint"; + public static final String Currency = "Currency"; +} diff --git a/app/src/main/java/org/nervos/neuron/util/db/SharePrefUtil.java b/app/src/main/java/org/nervos/neuron/util/db/SharePrefUtil.java index 0460f866..950f3471 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/SharePrefUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/SharePrefUtil.java @@ -22,6 +22,10 @@ public static boolean getBoolean(String key) { return sharedPreferences.getBoolean(key, true); } + public static boolean getBoolean(String key,boolean def) { + return sharedPreferences.getBoolean(key, def); + } + public static void putBoolean(String key, boolean value) { sharedPreferences.edit().putBoolean(key, value).apply(); } diff --git a/app/src/main/res/drawable-xhdpi/ic_setting_fingerprint.png b/app/src/main/res/drawable-xhdpi/ic_setting_fingerprint.png new file mode 100644 index 0000000000000000000000000000000000000000..2607f570acd890c5e0f13f16cc9033e1b9d0a24b GIT binary patch literal 581 zcmWlUT}V>_9K|O&EkD8}2=qZE@*y+nMYFWIu{CGg(zy%_q8O_@%_rG^Ei z)JQ1BzBDs!t}*ZIPBvDlQ`uMEZE1?b&4n;(V5d9ypY!9up980(RLoC|ONnDJ7>R;n zu7u|Ph<5LyU3=coq7ijl!skRe%txB(K$QxmJev9WIFW~w^c|0Qn*u`vXjP!68!jiv zX=o;3B=MjN4RR2AoMwa1g<%TvJ7{V|ML7rp-S;v478C`qC-N`g!{LC{irMe*xUskp zX=rVRs08gw?Ce0R!Qe|=ya4J4%0vi-KpOD04{{lt4sZ%lbro(3tE;HK2JIvktQa4I z-G(N(rqmZBtPX;4)>9v_OaH!vG)Kt=|eFy8AG zh%@`tXXf`M<&=~sR23=XQazVDudGDh(xt1Cb7GJ62=lYm=CJ9I|DnajD=S>}PjW`3 zF^89OW}^EmVpBx@1Cu7zoO;iTM49$fC|sA8pqRHCHOda<#&td8aaK)PeRgVUZKllP zI-2*%{>q+KTk!WeE9*eK?RArmIV;_&SpWS|%uTPfHMU8@9f7l^8dcMynYlD}L2^QO Rqi~C!!VvJp++oh8mjBqIOrQV& literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_setting_fingerprint.png b/app/src/main/res/drawable-xxhdpi/ic_setting_fingerprint.png new file mode 100644 index 0000000000000000000000000000000000000000..ef36d130ccdd4ef164a9c9ca5cd9d8e5e532948f GIT binary patch literal 705 zcmV;y0zUnTP)|HsDv_xJz1 zy8nuZ|6N=E#>M|lN&n>J|FEzB=H&m0hyRw8|J&RD=H~yAj{kXf|MvF(($N2|tN(a) z|Nj2}zP<|KQ;NwzdE1>Hj-7|23N?SpWb4ICN4@Qvf!CqOB{u*6Q{D!r=Pb$G70J z@Ye9g%(vOrt zBpbmg#7<(|kWF9$A=!>eQBwC{?BmJf6YgWiH86*AlM^cWbY=&t5Z{7)BYdVI=E)Q| z--z=Hs4ymXu|Pup5{oOBxT=6TQa5q!#y7Ynmm;r#OJwAPbBx{L-eokYfB-!+OgG~d z9!lS9VCUsuY-qx;7_4aURNqU(<=G)jz z>RQ8Xu!J(2V{LQhR>v1t+7$W`W>x~yt|-aqhD|}+o8+AG6QyW`6IKV!syuVjbjm5k z%UKh+dVvmKv9vWWWoWqOqhQq+cr#(&@u5-Dt%5B6ERJj5a$JqgzH+l`#kXp|09x$- nz@P3{bLY$6{62mT#~TK}B0MTB1YmC>00000NkvXXu0mjf2ML46 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_setting_fingerprint.png b/app/src/main/res/drawable-xxxhdpi/ic_setting_fingerprint.png new file mode 100644 index 0000000000000000000000000000000000000000..c1064d9cb88ef4b8920fee9f2f016e751cf8fd6b GIT binary patch literal 1062 zcmV+>1ljwEP)M~c?f=Kd|LEuc)6)O%?*Guw|If|;y}bYG>i^*1|Nj2}e0l%+`v3g=|D~h< z_xJywod4F<|E{e6hlBt0^#9`G|M~g<^z{F)uK$IC|GvEc+uHx>>HoI0|JBt0o0-1k49&{e>NKJ4D<0M5Y&RnnC}2{Uz5c9y?7r?=ro)~(JY)w{Cq2z zPtZ6{QZ+D7VjP*Qim$-w0!6d#V21LG)V8(Z6kX0&Jz%x|S@7qqgO_1>=0@ zeJo5J=e-V&T)Ij-al<_5%(w9Grh7%zw2Mk_Q8l(U`Rt`Q9 z;wklExq^OpX~G3@eP$+iA;fd)!X%b1IHYbZ#0&EPq+e1ubioj>nfBT&8Dp=6sHqEK zF)P=GBfW}+@d4XwA>ORmIN_)Z!+hRuf-}7iU6Xb&oNgN%1uwY`I|BwbrR-HQkt+J% zf=d^S3zW9s5C4@TwAbb)?l!E`vu-MaPMS)m?V9w2h%M+Bsay%h+Si49WAIu&3#C#_ zk>!Hi$G6t5Es2vW8{cs5sbb7dE!Px-MmnDd(j-yYszZ@m!d3x9(RU=IH@=`n*iZl) z6?i=sU%e^?y$nll#n!?6J(zsJUZqS!8T3ro7AMR;3VGaMxSI7zrPp}e)EkZ)FvcUX z99JqO8xO`< g`rUlf4gMVb12yz<9bRHkBLDyZ07*qoM6N<$g6u*$uK)l5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 4fd93342..9014287c 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -26,15 +26,24 @@ android:layout_width="match_parent" android:layout_height="wrap_content" app:icon="@drawable/ic_setting_localcoin" - app:name="本地货币" + app:name="@string/setting_currency" app:other1="true" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_setting_button.xml b/app/src/main/res/layout/view_setting_button.xml index 576f7651..76f60f65 100644 --- a/app/src/main/res/layout/view_setting_button.xml +++ b/app/src/main/res/layout/view_setting_button.xml @@ -11,19 +11,19 @@ android:id="@+id/iv_setting_icon" android:layout_width="25dip" android:layout_height="25dip" + android:layout_marginLeft="12dip" android:background="@mipmap/ic_launcher" android:contentDescription="@null" - android:layout_marginLeft="12dip" - app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3a77f3b1..cfb243f8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -102,6 +102,10 @@ 收款 资产管理 设置 + 本地货币 + 指纹设置 + 关于我们 + 联系我们 关于 钱包密码错误 密码 From 714bbbc75c034af156c39d85f93960052f443f14 Mon Sep 17 00:00:00 2001 From: baojun Date: Tue, 31 Jul 2018 19:47:37 +0800 Subject: [PATCH 016/121] replace dip to dp --- .../res/layout/activity_receive_qrcode.xml | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/layout/activity_receive_qrcode.xml b/app/src/main/res/layout/activity_receive_qrcode.xml index 09df7f8e..b70edd56 100644 --- a/app/src/main/res/layout/activity_receive_qrcode.xml +++ b/app/src/main/res/layout/activity_receive_qrcode.xml @@ -1,7 +1,6 @@ @@ -103,7 +102,7 @@ android:layout_height="wrap_content" android:layout_below="@id/receive_qrcode_image" android:layout_centerHorizontal="true" - android:layout_marginBottom="20dip" + android:layout_marginBottom="20dp" android:text="@string/copy_address" android:textColor="@color/font_title_second" android:textSize="16sp" /> From e03418e9151df7529dfb9a064615fcd08c512b3c Mon Sep 17 00:00:00 2001 From: baojun Date: Tue, 31 Jul 2018 19:56:28 +0800 Subject: [PATCH 017/121] Merge branch 'develop' of https://github.com/cryptape/Neuron-Android into setting_fingerprint # Conflicts: # app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java --- .../nervos/neuron/fragment/SettingsFragment.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java index edab6b79..3833407d 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java @@ -1,17 +1,7 @@ package org.nervos.neuron.fragment; import android.app.Activity; -import android.content.DialogInterface; import android.content.Intent; -import android.content.pm.PackageManager; -import android.os.UserManager; -import android.support.v4.app.Fragment; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; import android.widget.Toast; import org.nervos.neuron.R; @@ -25,10 +15,6 @@ import org.nervos.neuron.util.SharePreConst; import org.nervos.neuron.util.db.SharePrefUtil; -import java.util.zip.Inflater; - -import de.hdodenhof.circleimageview.CircleImageView; - public class SettingsFragment extends NBaseFragment { public static final String TAG = SettingsFragment.class.getName(); From 302773421e41c2f416732f59e15dad8ea402d5b6 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Wed, 1 Aug 2018 13:51:07 +0800 Subject: [PATCH 018/121] update transfer page --- app/src/main/AndroidManifest.xml | 6 +- .../activity/AdvancedSetupActivity.java | 42 +++ .../neuron/activity/TransferActivity.java | 76 ++--- .../org/nervos/neuron/custom/TitleBar.java | 2 +- .../main/res/drawable-xhdpi/right_arrow.png | Bin 0 -> 613 bytes app/src/main/res/drawable-xhdpi/scan.png | Bin 867 -> 722 bytes .../main/res/drawable-xhdpi/title_close.png | Bin 494 -> 1099 bytes .../main/res/drawable-xxhdpi/right_arrow.png | Bin 0 -> 907 bytes app/src/main/res/drawable-xxhdpi/scan.png | Bin 1240 -> 1109 bytes .../main/res/drawable-xxhdpi/title_close.png | Bin 872 -> 1829 bytes .../drawable/rectangle_border_gray_corner.xml | 2 +- .../res/layout/activity_advanced_setup.xml | 216 +++++++++++++ app/src/main/res/layout/activity_transfer.xml | 306 +++++++++++------- .../res/layout/dialog_confirm_transfer.xml | 95 +++--- app/src/main/res/values/colors.xml | 5 +- app/src/main/res/values/strings.xml | 18 +- app/src/main/res/values/styles.xml | 2 +- 17 files changed, 573 insertions(+), 197 deletions(-) create mode 100644 app/src/main/java/org/nervos/neuron/activity/AdvancedSetupActivity.java create mode 100644 app/src/main/res/drawable-xhdpi/right_arrow.png create mode 100644 app/src/main/res/drawable-xxhdpi/right_arrow.png create mode 100644 app/src/main/res/layout/activity_advanced_setup.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 133730a6..d6ae225a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ android:label="@string/app_name" android:launchMode="singleTop" android:screenOrientation="portrait" - android:theme="@style/AppTheme.NoActionBar"> + android:theme="@style/AppTheme.NoActionBar"/> + + { +// setResult(); + finish(); + }); + } + + +} diff --git a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java index edae0ec0..c096f3a7 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java @@ -11,6 +11,7 @@ import android.view.View; import android.widget.ImageView; import android.widget.ProgressBar; +import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; @@ -43,47 +44,35 @@ import de.hdodenhof.circleimageview.CircleImageView; import rx.Subscriber; -public class TransferActivity extends BaseActivity { +public class TransferActivity extends NBaseActivity { private static final int REQUEST_CODE = 0x01; public static final String EXTRA_TOKEN = "extra_token"; private static final int MAX_FEE = 100; - private static final int DEFAULT_FEE = 20; // default seek progress is 20 - private TextView walletAddressText; - private TextView walletNameText; + private TextView walletAddressText, walletNameText, feeText; private ImageView scanImage; - private TextView feeText; - private AppCompatEditText receiveAddressEdit; - private AppCompatEditText transferValueEdit; + private AppCompatEditText receiveAddressEdit, transferValueEdit; private AppCompatButton nextActionButton; - private AppCompatSeekBar feeSeekBar; private CircleImageView photoImage; + private AppCompatSeekBar feeSeekBar; + private RelativeLayout feeLayout, feeSeekBarLayout; private WalletItem walletItem; private TokenItem tokenItem; private BottomSheetDialog sheetDialog; private String tokenUnit = "eth"; - private BigInteger mGasPrice; - private BigInteger mGasUnit; + private BigInteger mGasPrice, mGasUnit; + private boolean isShowSeekBar = false; @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_transfer); - - walletItem = DBWalletUtil.getCurrentWallet(this); - tokenItem = getIntent().getParcelableExtra(EXTRA_TOKEN); - EthRpcService.init(mActivity); - NervosRpcService.init(mActivity, ConstUtil.NERVOS_NODE_IP); - initView(); - initListener(); - initGasInfo(); - + protected int getContentLayout() { + return R.layout.activity_transfer; } - private void initView() { + @Override + protected void initView() { scanImage = findViewById(R.id.transfer_address_scan); nextActionButton = findViewById(R.id.next_action_button); walletAddressText = findViewById(R.id.wallet_address); @@ -93,13 +82,24 @@ private void initView() { transferValueEdit = findViewById(R.id.transfer_value); feeSeekBar = findViewById(R.id.fee_seek_bar); photoImage = findViewById(R.id.wallet_photo); - - findViewById(R.id.fee_layout).setVisibility(tokenItem.chainId < 0? View.VISIBLE:View.GONE); + feeLayout = findViewById(R.id.fee_layout); + feeSeekBarLayout = findViewById(R.id.fee_seek_bar_layout); feeSeekBar.setMax(MAX_FEE); + } + + @Override + protected void initData() { + tokenItem = getIntent().getParcelableExtra(EXTRA_TOKEN); + EthRpcService.init(mActivity); + NervosRpcService.init(mActivity, ConstUtil.NERVOS_NODE_IP); + walletItem = DBWalletUtil.getCurrentWallet(this); walletAddressText.setText(walletItem.address); walletNameText.setText(walletItem.name); photoImage.setImageBitmap(Blockies.createIcon(walletItem.address)); + if (tokenItem.chainId < 0) { + initGasInfo(); + } } private void initGasInfo() { @@ -117,6 +117,7 @@ public void onError(Throwable e) { } @Override public void onNext(BigInteger gasPrice) { + dismissProgressCircle(); mGasPrice = gasPrice; mGasUnit = gasPrice.multiply(ConstUtil.GAS_MIN_LIMIT); if (ConstUtil.ETH.equalsIgnoreCase(tokenItem.symbol)) { @@ -130,12 +131,12 @@ public void onNext(BigInteger gasPrice) { double gas = NumberUtil.getEthFromWei(gasPrice.multiply(ConstUtil.GAS_ERC20_LIMIT)); feeText.setText(NumberUtil.getDecimal_8(gas) + tokenUnit); } - dismissProgressCircle(); } }); } - private void initListener() { + @Override + protected void initAction() { scanImage.setOnClickListener((view) -> { AndPermission.with(mActivity) .runtime().permission(Permission.Group.CAMERA) @@ -182,6 +183,13 @@ public void onStopTrackingTouch(SeekBar seekBar) { } }); + feeLayout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + isShowSeekBar = !isShowSeekBar; + feeSeekBarLayout.setVisibility(isShowSeekBar? View.VISIBLE : View.GONE); + } + }); } @@ -192,17 +200,13 @@ public void onStopTrackingTouch(SeekBar seekBar) { */ private View getConfirmTransferView(BottomSheetDialog sheetDialog) { View view = getLayoutInflater().inflate(R.layout.dialog_confirm_transfer, null); - TextView toAddress = view.findViewById(R.id.to_address); - TextView fromAddress = view.findViewById(R.id.from_address); - TextView valueText = view.findViewById(R.id.transfer_value); - TextView feeConfirmText = view.findViewById(R.id.transfer_fee); ProgressBar progressBar = view.findViewById(R.id.transfer_progress); - fromAddress.setText(walletItem.address); - toAddress.setText(receiveAddressEdit.getText().toString()); - valueText.setText(transferValueEdit.getText().toString()); - feeConfirmText.setText(feeText.getText().toString()); - view.findViewById(R.id.confirm_fee_layout).setVisibility(tokenItem.chainId < 0? View.VISIBLE:View.GONE); + ((TextView)view.findViewById(R.id.from_address)).setText(walletItem.address); + ((TextView)view.findViewById(R.id.to_address)).setText(receiveAddressEdit.getText().toString()); + ((TextView)view.findViewById(R.id.transfer_value)).setText(transferValueEdit.getText().toString()); + ((TextView)view.findViewById(R.id.transfer_fee)).setText(feeText.getText().toString()); + ((TextView)view.findViewById(R.id.transfer_sum)).setText(feeText.getText().toString()); view.findViewById(R.id.close_layout).setOnClickListener(new View.OnClickListener() { @Override diff --git a/app/src/main/java/org/nervos/neuron/custom/TitleBar.java b/app/src/main/java/org/nervos/neuron/custom/TitleBar.java index 5cf96858..7560121c 100644 --- a/app/src/main/java/org/nervos/neuron/custom/TitleBar.java +++ b/app/src/main/java/org/nervos/neuron/custom/TitleBar.java @@ -97,7 +97,7 @@ private void initFromAttributes(AttributeSet attrs) { drawable = mContext.getResources().getDrawable(mTitleImg); mTitleBarCenterDefaultView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null); } - mLeftImg = a.getResourceId(R.styleable.TitleBar_left_img, R.drawable.back); + mLeftImg = a.getResourceId(R.styleable.TitleBar_left_img, R.drawable.black_back); drawable = mContext.getResources().getDrawable(mLeftImg); mTitleBarLeftDefaultView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null); mRightImg = a.getResourceId(R.styleable.TitleBar_right_img, 0); diff --git a/app/src/main/res/drawable-xhdpi/right_arrow.png b/app/src/main/res/drawable-xhdpi/right_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..8ba639a922b354dbd2a423bf2276fd14b5d4b576 GIT binary patch literal 613 zcmV-r0-F7aP)Px%A4x<(R5%fhl;2BJVHn51&vwqHBcy^#Npcr?Qx^pW5rvAYscT>mLYG|y{TJPL z-@g!1psbv(=wc8=5K%-}SmJ8BHlkvJl52bVKGP%n;f_6Uc;ELt&*%Mq-FHmCzy53(U;JHS`}GU3^17uhLKo%EE~;LJ60QC z7SfV~L)(Hpl}D;uNJVcdPtqK1ie9=use@Y;WO-qI+$7Tzz|`k?`Qznx&*;7I#{3gm z3Oa~!=Mv%Z^%@=x-BQ=fcLc4VFei&}2@8Jk%*p%;9*o{m$8sI5TGET-2|fF_isyt6 zbCZX+FW|<1fwsZ1ah)PKYjY=vOTJdE$Re81UP5@1!2tq)jq|q~3H# zFk!dr3!b>DhiWxEquMDdy>}ysuguEt9c3HZ!+LeyE(ADN{{SKwDb7gAtK3u3dbC`_ zyg{`0B@{-i5i+>#R{N*5yHZA)_C~3c3x+VvUj6DRd1DhudtrVRDJJ85R>j3|aZZ-K z;>K~;sQ*TKb?xW`7e-^VX@ z#g*?F`OsR}y56>`xXf!R)8fQxTHdx6?X~^~5p}f(bt}=?00000NkvXXu0mjf3QiPx%j7da6R9Fe^n9FNZK@`S&ACS}#q$tf3H-bB*k{2ZevXjJxU5FdOty>o=f(20# zgB0|S5Ok|x)~OQB3#{VKmBchHL=-d-HM#M3f)|pKrdXQXi`;?3%$zeb-#2Gw?wvWx z+)#?g zn{9L{q|<4=-EQA94C4k>(HV65ME)BYNeuFFL@~MY0dsgv6F0i!$i;5Adm$2uNVr}GX%3pgXC`ThP!G(1V=a;a2$J+9LsK zkWDKa*pOu+w2XJ?Ek|9 ziab@A$_5wgn^sPVC)hF%jgZQJEQ_46l8j(OW(^*XZFB4)PcI91hn5fxzcxv-xwH#JGnY z25SW}&%u%Be6CupJ{bh8Aafg~hFpi#Q}R9?nl$QBKJWydU_U<{&JWb1guO% z{wFCKUB$SJ?kF;1H`^URE|HEF6MjP&XsuGIyfVl91NJ!bfm}@JHvj+t07*qoM6N<$ Eg5mW-Gynhq literal 867 zcmV-p1DyPcP)Px&9Z5t%R9Fe^nZZj`K^(_>>$bH;i(a}|haf?+zzo6;QHzJ}6$Vm z^bZ89yL%7{61vo-K(dHJq5=uRu#?fL!)j66wz}KryUbhUv6u;O8|e+q&YSuDW`3Xf zy|**(&Cl87Nn>MUhl<5wuj4o!rBZ1Z;%y!kx4MMRaDRXQ4Yy$}Wipu@LhmX$Tuq-b zztKKVp2U7Skx0B-saNSVF)jd%9VQ6uGP1-n&1y@Eyyc&y}H=lL7Q}x z2bf?c5{V4-^z{6cuA?6V`vm27)k(ADhoMmD4doX#coUvjip65not>S(yt38m*s5Dx zT+~E2SJQ)`k=%ytB)M5S*qWxT18@H*&(wIf9l$tg-UjGv8s+T~W-&-!vfIsl-G0^zyP2BMUp1ouG$3tA~Rt4ayV>x?? zjYqJ~_-!i~Kkz`{0gngt0-xmHcY=Rn`E$u5x26gsh^5CHZl|-xg8@k3f&aw=TGn*d z)yx^$SuGv5PCS#z>?;%sSuJZinCnWVQU`2>9UmXx3G56GeIa1?V6N&}mkpE1=kq#> z2(xkQ*>D?20POc86nNNo53^J#rl6#FhONnE`>ID`UX*+_AGDR$Wy86j1UzX#PqFJ+ zw-$>D(9?!-QYY{kvbN;?l$VUannFx$7%gHXrOTg1#1T?d6q{4Pr7u?-}9Are*;!nDWzLU5?BBL002ovPDHLkV1gUdpi}?= diff --git a/app/src/main/res/drawable-xhdpi/title_close.png b/app/src/main/res/drawable-xhdpi/title_close.png index b5cef49e994f39b65e909add2da186e0ae7b0588..8b3bc3ff9efcc620ebfc24e66bbb13bf8dfabd44 100644 GIT binary patch literal 1099 zcmV-R1ho5!P)Px(1xZ9fR9FesS<6loK@_E@NzCYq5&ePr0$_zKL^oR_hMsXV-NP)3xM7Sh_2^(cLsyO`pL=3 z8-H$Y?j0Il8+12e7pAAD4|~1dkLyHCu)wuLu*3m7+iJCLG%hbM_ksSW1#XfZ*Vfh^ zSZ!BYU0GR~Ck8m3v>czIe&DgerrzlgT(vw1w$W&Gfx`wHNi`Jm=H})BIt2LfhLqc= zbgzgX;|;e|4aBqnE3%trYS;y?Eh+k`fv5!-WWa2&@A^o)&dsn4Qgj>V1QXs3!tJ&w zSYpVfVF4>PEfA@7YMy<|tcLi|Y+*^*18GZ*KF=>ME(X5u@1ky}!^}KukDpYp1egOR zv4|b=7w;h(v}jG~m(i>|EVeRW4wM9192i@fSsAYuz#MF8X=!$Re4G-vD}x)`hddUy zx3|AK?WHaYX9>*<^y)zhwGp8CsRgi+#ICc0iO)#}UtRChrP7)pp-s}S3A*2yK-2UM z-#zS2)4R< zfaOI_roreT`p3TIG3DXi;|TY^+hfHvtbnZ)V79Zgx}xbJ-x1)v52QJ*dM^)#P{R^n za9CUFDg&N*nwrM5j29`))6w^74`81_FCWopgUw7YGTJDtCQVG{B^l;_VKK0rWs%QE zb%R#22brGt+wJyVv)SaA_Ivn+%wlQwQNPyWW)G0Ketv%bRzOi2|HWUoe*lKkN|4(T RoI(Hq002ovPDHLkV1g9q{Zaq` literal 494 zcmVPx$s7XXYR9Fekm|H_a3@axl~!RaPGgGeuGX4woz;5-6htba9$n6whVs5`I%YW`K)=bG)?r#RQ1&jg8_6e)Z$`(LKqF#xqufA%>NWApZ9UBhZfmhW`2}bUl zp#n_$jZ?oOgdo!|YGD8m8=7V&<$_*mOBi_iafQW=aC)(&3KiGTAXJ)&={RQZ11l+& k{{t&d4y5m}r#RC41CjSY*X5Cr8~^|S07*qoM6N<$f{i}g&j0`b diff --git a/app/src/main/res/drawable-xxhdpi/right_arrow.png b/app/src/main/res/drawable-xxhdpi/right_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8de5a3ef1edc7a98bc48f3aeb97573294d73da GIT binary patch literal 907 zcmV;619bd}P)Px&MM*?KR7ee-R$WMwQ5b&StzUzTkS)!Apdf=HN=SsDEO2TnMHxZ`kq}};K^GB) zcR>Udby3t+5k(;VV3cl|X%Gb6bsa@zuI(boLfzVSdd_j@(``-nc`o+8&)NGt-*bMy zPr$aUPBo-bc&_twyAch^aSPl=k0ykB&;!ApDdY}+KwX`JU8P1;L{vvL+QftVmaP;{ z`D)cAi`_(-THMm2yl+PEfPx2XzX&cwf^y#CLZWeM3%j}`xxN|)`J^Ydj}JKK3#d+u z3yB#{Eur$5nmhCbk15z_`&f835|WD+PZ$3ystIfB)%=kZo z{HZk`dn8s=ioKlES5AKlm;JTsgoE=Wd7aw&vL;oOjNyd>w%a~<&`!s<9GsQpb!zK| zpUG%Rv6r4bM$Ip>EWz4Fis>gY;T6UqZ>X&mV1uGpk8Tf!@7rQ=5va2BGP$i*w+;=QKh z4QZjjJmUN5xLae_PSYarH7mcwFu(&+VT1&6kDxi+E5R98--=|%XtzWb06XdGv;L3b z^O6eJbUtfQP3GLL_+Zr1KLtBoQLok{fLB(K{9hi0+H66sThN@AHmFsJBnDVtu1Rcv#EZa>puC@e znZGkSEpJrIQwj9b;Yv;A3XgIQcSm~UU8d9|ns!e0sX+{bJm>3-ATZ8VXyS{oZ&D&R z%j;C1Zy86QBgkXO^Sy5-LH&sTis~ya5jS_Iy)Y77<<=j)@*>w)ZcmP=zKqAl5TwJ+ zrd;2d9vtQ>JFo3rnarLHQU77Jh;LAR^tPtU6mOok>`ORPA{RNLdo8qx1xv4;-pERjP#!y#X{*ljeTbQN)k hf=-^4S$*wUjelkT0=mP=gU0{>002ovPDHLkV1mLdur&Yx literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/scan.png b/app/src/main/res/drawable-xxhdpi/scan.png index e647f18a77299ef471d68471816c6fa004f09293..6671e0b297e8182a7b020c2d20645ac7a217f9c8 100644 GIT binary patch literal 1109 zcmV-b1giUqP)Px(4@pEpRA>e5T3<+0Q5fI7yUkUL@(*Y!VIhJKVc;KJTi{D7Wg6MY{=D_%OD_pg z5f~&G_)^eQNKaX^qCaXApGF`kDr7>vXb7t{VJu?HxwXxH-|e1xC&P^pcF(v6zMXTv z@9f^+?|k3Rxp(Ii3~7qhYAuSzV%>>Eq66j{NEyVGW~f@VAW2f|%*@QHTA6LTp`oE{ zV`IYwIlkR@1VISH{sXdzv14Yld1Pv8D!BDKqFRB0LS0?mjc7Ew3{sC_YlR$!WFkeE zsg1|uC#ms21^2dPB1PB5nB9=0kWO@;tgo+s1?KDM3+nqOJ1s3Odjo;MFb0s9k_9v5 zgYG-(Xi}M`fiWMU?wy~XUrS@osA_I*Hitr?d$`WF9>az9Kxnc_)a6Zaaq-p3$;scO zl!@VD0z%<6YMKQDNW@SL8I8tA2(8bg(^_e4Y^+99^#k(-h7Gt!+uPgE_4V~7WMUM4 zFb>iH7z3!f=H}+y)Yp1}L(YTX5O5w)u--z{3`6%K*a-avdT* zXrCe%`lhF+zc3?jHGWr%;6UpGm1^3@4$4h~;hR!(Tfs>_0uO?vM2u~|+wN1Gu%&H^ zerHn3lLsf@vx2D;%W9f5G)VWDhMbWV6y0N4O_PQOk;fJY57vHqpW?b;V_s4SEK8y& zwttAB2@7n3B=kj{k&tB#2BURppVlE>_zqdXE`V4S919W^urDG!WWNCvPx(l1W5CRCodHoJ~lSK^Vt<*WHysiVi`a6tvzVk}g5t1<|3xiVj7zSh_-&2)Yy{ z7JVE#1VMoxC1!RI>aYcMs66x~ePD+QNrf=YZfS>7+g7nfp(W6yWRlVbtbuwk}qal9uB6<5VV4y_f3o+GFxAKs ztl`no(NADJ;BAL1B4GV2KUnQ?O7LV~Nkfp|xPE!^Gv4CYUr|xLB@&4yl_3%^&4ECmI#Vd=eluOCt1kuHIS4tV zx0Nxhf-&rd*pfsLD$CJ7autb@Gy(}n=-(~>Zq4|c>Jm3Wqj3H~UrA(isxjh%mMM{7 z90~F$0W5Ew!=k5B0IZiqcjOI0*nB2zlF=dEfk<$LkSb-0Br=-8a!}y`^9mm%$UH%f z6$u#=l!K{~SLhkQk12fM-{a%Yc4a`m%=Lj$!!oWa7{T4HIc$?LVwp0)(p2Bos;U_; z!TMS?5`Bpfu}~Rc>6_B?Kn^I3;9e+1q`w_tCacMksvwso;77Ig2ZRWlV89ZQ3Ij`o zCBi)-*od$ZVI#uLfQ<+@A9jq;BBEd8M%Oj7c`B<@Uo});3(LyN-eQ=?^ty$02wAzq`A89ZOepr?=|dsEzs4 zk5DM|+~3vJ)eZ@(bEDbQ-%79-z`;BFt&!r^Us6)C#&(U+^XZQ@Tcc&bGGH073|Iz? zXTV`g;YLuNV21USJw{iIM?4Ndhy6r-)fW{T~>I^g4jqesyq zA0SFMU3#!~%Xtks9GXm!vZ<-5N&g5_Sw>00C|DIJ#*2s2HKG{fVuY07@bIwlCwK&- zU=_@Qo$=znkHwf??)B4r5sp6Y5hoK93sJkl716M@2nP}o!b%O|x9E~!=(dSu2qq#y zf9Stc*#DjT6!6{yusFz$v&N#LqUvxsoYUJ5WlR_u894`@a)?OJ9~c|L9Duzg_|rzY zA#5(HC3gLp2^mMx zuTr>B*-VlU5a&8ZBwW*Rxmc16Sh`Ngtit)R?r4H8n0UaYUJ?YGt7~|{a!OdjYA@GT z@)jfKBfY2Yy~SqAeGK5=X-psT3D;fzdx3QCjOj1qgq?D)AqD~f0000 diff --git a/app/src/main/res/drawable-xxhdpi/title_close.png b/app/src/main/res/drawable-xxhdpi/title_close.png index e24cf60dd3484a8de4a2e28b2ad2793907c19160..4473a02fd26a703736963b4eef58b642a692bc25 100644 GIT binary patch literal 1829 zcmV+=2io|FP)Px*-$_J4RCod1T+342MikA=fPo}M3briy0v-#e>;du-`~mO*E>|9o9UHKT%`RKu zJ6Q3UDKD~u4}cAyz%s5RGdV};JMPi+OHxZCqbggi?yK&5k8a;Sx~-w{l{z*zH(PUa zb9?=M|I_jD@jj~i()Pg4jqUC2SB*wv>gML=b*Iz$hxWDj-^Rwq#KOYDAsTdbw&dx4ud=0zW^YioH&CbrA-QC^wT4SrxrDk7JMBU?=nVA+a zXnsmJ$~A9<$Lz`VmwKiRCJ;1x{%XPfKjO(luCcB)=*4xk&%iUz^vW-#3{N%a9>wXXf=;#FD=;(+sqfc7~K=1-!bUf39U`#=-&R{gQwzl2|Oozl1Xg7}`AXtHE z(uJ{;D7JZRIGzHmX~@-anvf?rK>%U=aB_0On2~sb*f#K76@k>1UmII7Bk**Q4L>p4ad&C6Bj3G}D87mMJAQ*V^ zlQu9Q(&jXx2T6zHINQjQri&8<$~l3c0KmAYGZ>02G4L4=#so}L7Nc&zXT>2Z$M6 zfbj^^!AH8tKr<uaQ#3kde2Rud=bQUNpu10_#zzCfwfAr}a= zCpQoZ3?Bo15`lqAdd)Q*$QW~jP#6dWhLdNIj3L10C0#T*6_DiGe!A^EZ_Zgck$`MyTIq-oj!=C18{Z1VPw^ajukll35B^ zT1($+Eei+%!J1S7Kth%hM^Io`Nf$k)K&H#$Y@e&k03!E>EP2MbwilxVf$1>x3EyYT z|1TjXIQJq62A;e#)1^EkDASc5-*z1p2w!H2uhJoVk<4`A-K2@>V9a#E81A)x4baYP zhGngf281F@*4J$)CLeAE=?Ejed#xd9zo5Y&6a|P3dy$!vDn-+Np&(GMC=lMg$fB7g zfDxMMDikw{0FjU-%wubM4T15{^x;;PCq-FIlh6;`2u3Ea6J7EGQTkq_C@5!66Yh)H z7%1xbwI4rLNphfaU+6gx5D8gwc>)G6yccOQ07m-2;KwStwih!4fhCe(xrZ>uTrO$? zK(7NBrI4;nK={ZKJ)w&98o`K7x`Kg#C+xx#e$$_hUS?p7xfiMTZ7M6$H3gm8rgqeE zuXU23S=xuHgMd(E$@LaVvg9IDLxaY;fRX3$4BB91pa3aoua)|EfglKwa~WCMHXIf7 z9kEE43ka?bwFW^zBI$x>FcEF^4Ags*J2oH^vV;z-o=}uAiV?BS1Oq$*v%&hJCSY7* z%#jt%1Vj*7ioqCTfgt@LW^`So3v$+?Y#M_$zs0+Ql~&vCt6M#7pe+u)rdzA4s~;is4c6c9 zQ-YatjH!ETcL~ohk}lZ($Nl~NOa3Ifhd&)~fnUvkD`3=(EX6`qNEiBBBl98%x3{;? zPft((PF4;6{RI5!fOGt6egchWAWLr`Ji@+WDKyT0;2B-af*y4E6Ck{hKcw*=WmAu_ Tp|nQc00000NkvXXu0mjf#Y#bC literal 872 zcmV-u1DE`XP)Px&B1uF+RA>d=T5WFIFboa)d+WO8F3qrE7aMx3eY7X)c8lyWqgt63MM|bpB?8!3 zvP`~5Qk0B(x8rs^9`7OFAs^D%rTh|R#(r2}#^6`T9|*N4$j8Nmi95i02l)-5_80Q) z1Q!LgJ*lP|hygm^N~Z%^xYbehhLH zxw2QJqQE}cgrt&=%SF>8B{ASJirjWZQgKJ0v1rw=-O+}^^&;&6Z9T#mwDj{wN*aP< zN`ZLA(omuAaO}3z5e(cyv{V=pIVPn!G|r~sz0j=ywqgoJAq$E_2DuO~8jQ$@S8!>=1dH2mDmGL@VG9c}2N#x9Oj5+5m6q1D2 zXL4Oz!Ioz=JfY(Tz~cItHd4|vOwM(-*khrEMmq?(FOH2$hS zfUXq-BDAU4RE>|m3GlU-Roq^+c_SsA1?XOKn@%gz?pgXEM{7z;JqjD8=ItmjH=`6^ zrCvmWiioyxNoKys4T3=d8e_@ne%wIeJ_WH^_NYx^hZ_rwb&KEf&Qj2xO4$#QW zbEI+rUA?{-(Oo#=O{%K_u$o$iL#odXB@1A+l1{)@k&=K|hgLz)A36562B^u~tV>&S zO}eDxn)(ccyjf~pUWTID*|PYu+63B~YyjvYm24Wi$3>0}hooO3BYzEYn;a)?o%%3X zD-@xrVmL64oMC84iohoQBV=55KzZ%#7w5e~p0Go;_c?N?xt$c$?&vcK>+CoDU$%@v z+X~tp%L?hiQfpUObe(Sy0IaRR=io3!KHRQZj7eK_wxbONLkfk9876gOb403dv3ij^ z<^dxWGk@f|z2N{8J;eyXYgS?69- - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_advanced_setup.xml b/app/src/main/res/layout/activity_advanced_setup.xml new file mode 100644 index 00000000..d94e6e94 --- /dev/null +++ b/app/src/main/res/layout/activity_advanced_setup.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_transfer.xml b/app/src/main/res/layout/activity_transfer.xml index 8994d171..2432bc37 100644 --- a/app/src/main/res/layout/activity_transfer.xml +++ b/app/src/main/res/layout/activity_transfer.xml @@ -2,7 +2,7 @@ @@ -13,173 +13,253 @@ android:background="@color/colorPrimary" app:title="@string/title_transfer" app:isShowLeft="true"/> + + - + - - - + + + + + + android:background="@android:color/white"> + android:textSize="15sp"/> + android:src="@drawable/triangle"/> - + android:layout_width="wrap_content" + android:layout_height="48dp"/> - + + + android:layout_height="40dp" + android:paddingStart="@dimen/default_margin" + android:paddingEnd="@dimen/default_margin" + android:background="@color/white"> + + + + + + - + + + android:textSize="15sp"/> - + - + - + android:layout_height="40dp" + android:paddingStart="@dimen/default_margin" + android:paddingEnd="@dimen/default_margin" + android:background="@color/white" + android:hint="@string/input_receive_address_hint" + android:textSize="12sp" + android:gravity="start|center_vertical"/> - + android:layout_marginTop="@dimen/default_margin" + android:layout_height="48dp" + android:background="@color/white"> + android:textSize="15sp"/> + + + + + + + + + android:layout_marginTop="6dp" + android:layout_marginBottom="5dp"/> - + + + + - - - - - + android:layout_below="@id/fee_text" + android:layout_alignParentEnd="true"/> + + + - - - + android:gravity="center" + android:scaleType="centerInside" + android:layout_centerVertical="true" + android:layout_alignParentRight="true" + android:src="@drawable/delete"/> + android:background="@color/default_gray_e"/> - + + android:textSize="15sp" + android:textColor="@color/default_gray_6"/> - + + android:textSize="15sp" + android:textColor="@color/default_gray_6"/> - + + + android:layout_height="48dp" + android:paddingLeft="@dimen/default_margin" + android:paddingRight="@dimen/default_margin"> + + + + + + + + android:text="@string/confirm_send_action"/> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 3b4e9738..61653b3d 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -5,7 +5,7 @@ #FF4081 #55FF4081 #333333 - #2E4AF2 + #1646FF #2959CC #FFFFFF @@ -27,9 +27,10 @@ #333333 #E5E5E5 #ffe1e1e1 + #ffeeeeee #ff999999 #ff666666 - #fffcfcfc + #FFF8F8FA #ffc9c9c9 #ffd5d5d5 #f9f9f9 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3a77f3b1..74997b81 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,6 +9,7 @@ 余额: 账号: 转账金额: + 转账金额 发送 取消 设置 @@ -60,6 +61,7 @@ 请按顺序点击助记词,以确认你的备份助记词正确 输入密码 确认 + 确认发送 请输入应用网址 @@ -82,8 +84,8 @@ 转账金额 请求费用总和(含手续费) 支付详情 - 转入地址 - 付款钱包 + 收款地址 + 付款地址 交易费用 修改密码 钱包名称 @@ -163,4 +165,16 @@ Can not get MetaData from host: 合约地址错误 password + 转账币种 + 请输入收款地址 + 矿工费用 + 费用总计(含矿工费) + 高级设置 + Gas Price + Gas限制 + Quota + HEX + UTF8 + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index e4b48777..627297ef 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -66,7 +66,7 @@ + + + + From 455eb3ff36ac3557a37416ff4a274ecf31346ca4 Mon Sep 17 00:00:00 2001 From: baojun Date: Fri, 3 Aug 2018 18:34:10 +0800 Subject: [PATCH 028/121] add currency --- .../neuron/activity/CurrencyActivity.java | 33 ++-- .../neuron/activity/SplashActivity.java | 5 +- .../nervos/neuron/fragment/NBaseFragment.java | 2 +- .../TokenListFragment/model/TokenAdapter.java | 29 ++-- .../presenter/TokenListFragmentPresenter.java | 31 ++-- .../view/TokenListFragment.java | 123 ++++++++++++++- .../neuron/fragment/WalletFragment.java | 2 +- .../nervos/neuron/item/CurrencyIDItem.java | 41 +++++ .../nervos/neuron/item/CurrencyIDList.java | 18 +++ .../org/nervos/neuron/item/CurrencyItem.java | 32 ++++ .../nervos/neuron/item/CurrencyListItem.java | 20 +++ .../org/nervos/neuron/item/TokenItem.java | 6 + .../nervos/neuron/service/EthRpcService.java | 62 ++++---- .../org/nervos/neuron/util/ConstUtil.java | 4 + .../org/nervos/neuron/util/StreamUtils.java | 44 ++++++ .../util/currency/TokenCurrencyManager.java | 89 +++++++++++ .../res/drawable-xhdpi/ic_about_us_infua.png | Bin 0 -> 1585 bytes .../res/drawable-xhdpi/ic_about_us_logo.png | Bin 0 -> 4073 bytes .../ic_about_us_nervos_network.png | Bin 0 -> 2221 bytes .../drawable-xhdpi/ic_about_us_open_sea.png | Bin 0 -> 2895 bytes .../ic_about_us_origin_code.png | Bin 0 -> 869 bytes .../drawable-xhdpi/ic_about_us_server_pri.png | Bin 0 -> 1094 bytes .../drawable-xhdpi/ic_currency_selected.png | Bin 0 -> 1112 bytes .../drawable-xhdpi/ic_setting_about_us.png | Bin 570 -> 615 bytes .../drawable-xhdpi/ic_setting_contact_us.png | Bin 0 -> 1104 bytes .../drawable-xhdpi/ic_setting_fingerprint.png | Bin 581 -> 705 bytes .../drawable-xhdpi/ic_setting_localcoin.png | Bin 0 -> 797 bytes .../drawable-xhdpi/ic_setting_onoff_off.png | Bin 0 -> 1812 bytes .../drawable-xhdpi/ic_setting_onoff_on.png | Bin 0 -> 2033 bytes app/src/main/res/drawable-xhdpi/ic_share.png | Bin 0 -> 474 bytes .../drawable-xhdpi/ic_toptitle_back_white.png | Bin 0 -> 415 bytes .../res/drawable-xhdpi/ic_wallet_exchange.png | Bin 761 -> 644 bytes .../res/drawable-xhdpi/ic_wallet_right.png | Bin 273 -> 382 bytes .../drawable-xhdpi/ic_wallet_token_add.png | Bin 0 -> 622 bytes .../res/drawable-xhdpi/ic_wallet_top_copy.png | Bin 227 -> 332 bytes .../res/drawable-xhdpi/ic_wallet_top_left.png | Bin 0 -> 1197 bytes .../drawable-xhdpi/ic_wallet_top_title.png | Bin 1922 -> 4702 bytes .../res/drawable-xxhdpi/ic_about_us_infua.png | Bin 1585 -> 2487 bytes .../res/drawable-xxhdpi/ic_about_us_logo.png | Bin 4073 -> 6407 bytes .../ic_about_us_nervos_network.png | Bin 2221 -> 3517 bytes .../drawable-xxhdpi/ic_about_us_open_sea.png | Bin 2895 -> 4993 bytes .../ic_about_us_origin_code.png | Bin 869 -> 1277 bytes .../ic_about_us_server_pri.png | Bin 1094 -> 1662 bytes .../drawable-xxhdpi/ic_currency_selected.png | Bin 1112 -> 1739 bytes .../ic_finger_set.png | Bin .../drawable-xxhdpi/ic_setting_about_us.png | Bin 615 -> 919 bytes .../drawable-xxhdpi/ic_setting_contact_us.png | Bin 1104 -> 1737 bytes .../ic_setting_fingerprint.png | Bin 705 -> 1062 bytes .../drawable-xxhdpi/ic_setting_localcoin.png | Bin 797 -> 1291 bytes .../drawable-xxhdpi/ic_setting_onoff_off.png | Bin 1812 -> 2904 bytes .../drawable-xxhdpi/ic_setting_onoff_on.png | Bin 2033 -> 3808 bytes app/src/main/res/drawable-xxhdpi/ic_share.png | Bin 474 -> 675 bytes .../ic_toptitle_back_white.png | Bin 415 -> 573 bytes .../drawable-xxhdpi/ic_wallet_exchange.png | Bin 644 -> 899 bytes .../res/drawable-xxhdpi/ic_wallet_right.png | Bin 382 -> 516 bytes .../drawable-xxhdpi/ic_wallet_token_add.png | Bin 622 -> 869 bytes .../drawable-xxhdpi/ic_wallet_top_copy.png | Bin 332 -> 402 bytes .../drawable-xxhdpi/ic_wallet_top_left.png | Bin 1197 -> 1766 bytes .../drawable-xxhdpi/ic_wallet_top_title.png | Bin 4702 -> 8050 bytes .../drawable-xxxhdpi/ic_about_us_infua.png | Bin 2487 -> 0 bytes .../res/drawable-xxxhdpi/ic_about_us_logo.png | Bin 6407 -> 0 bytes .../ic_about_us_nervos_network.png | Bin 3517 -> 0 bytes .../drawable-xxxhdpi/ic_about_us_open_sea.png | Bin 4993 -> 0 bytes .../ic_about_us_origin_code.png | Bin 1277 -> 0 bytes .../ic_about_us_server_pri.png | Bin 1662 -> 0 bytes .../drawable-xxxhdpi/ic_currency_selected.png | Bin 1739 -> 0 bytes .../drawable-xxxhdpi/ic_setting_about_us.png | Bin 919 -> 0 bytes .../ic_setting_contact_us.png | Bin 1737 -> 0 bytes .../ic_setting_fingerprint.png | Bin 1062 -> 0 bytes .../drawable-xxxhdpi/ic_setting_localcoin.png | Bin 1291 -> 0 bytes .../drawable-xxxhdpi/ic_setting_onoff_off.png | Bin 2904 -> 0 bytes .../drawable-xxxhdpi/ic_setting_onoff_on.png | Bin 3808 -> 0 bytes .../main/res/drawable-xxxhdpi/ic_share.png | Bin 675 -> 0 bytes .../ic_toptitle_back_white.png | Bin 573 -> 0 bytes .../drawable-xxxhdpi/ic_wallet_exchange.png | Bin 899 -> 0 bytes .../res/drawable-xxxhdpi/ic_wallet_right.png | Bin 516 -> 0 bytes .../drawable-xxxhdpi/ic_wallet_token_add.png | Bin 869 -> 0 bytes .../drawable-xxxhdpi/ic_wallet_top_copy.png | Bin 402 -> 0 bytes .../drawable-xxxhdpi/ic_wallet_top_left.png | Bin 1766 -> 0 bytes .../drawable-xxxhdpi/ic_wallet_top_title.png | Bin 8050 -> 0 bytes .../main/res/layout/fragment_token_list.xml | 148 +++++++++--------- app/src/main/res/layout/item_token_list.xml | 7 +- app/src/main/res/raw/currency.json | 34 ++++ 83 files changed, 582 insertions(+), 148 deletions(-) create mode 100644 app/src/main/java/org/nervos/neuron/item/CurrencyIDItem.java create mode 100644 app/src/main/java/org/nervos/neuron/item/CurrencyIDList.java create mode 100644 app/src/main/java/org/nervos/neuron/item/CurrencyItem.java create mode 100644 app/src/main/java/org/nervos/neuron/item/CurrencyListItem.java create mode 100644 app/src/main/java/org/nervos/neuron/util/StreamUtils.java create mode 100644 app/src/main/java/org/nervos/neuron/util/currency/TokenCurrencyManager.java create mode 100644 app/src/main/res/drawable-xhdpi/ic_about_us_infua.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_about_us_logo.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_about_us_nervos_network.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_about_us_open_sea.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_about_us_origin_code.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_about_us_server_pri.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_currency_selected.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_setting_contact_us.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_setting_localcoin.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_setting_onoff_off.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_setting_onoff_on.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_share.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_toptitle_back_white.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_wallet_token_add.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_wallet_top_left.png rename app/src/main/res/{drawable-xxxhdpi => drawable-xxhdpi}/ic_finger_set.png (100%) delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_about_us_infua.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_about_us_logo.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_about_us_nervos_network.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_about_us_open_sea.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_about_us_origin_code.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_about_us_server_pri.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_currency_selected.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_setting_about_us.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_setting_contact_us.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_setting_fingerprint.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_setting_localcoin.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_setting_onoff_off.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_setting_onoff_on.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_share.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_toptitle_back_white.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_wallet_exchange.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_wallet_right.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_wallet_token_add.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_wallet_top_copy.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_wallet_top_left.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_wallet_top_title.png create mode 100644 app/src/main/res/raw/currency.json diff --git a/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java b/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java index 4d33344e..80cd79d7 100644 --- a/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java @@ -1,28 +1,35 @@ package org.nervos.neuron.activity; +import android.content.Context; import android.support.annotation.NonNull; import android.support.constraint.ConstraintLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import com.google.gson.Gson; + import org.nervos.neuron.R; import org.nervos.neuron.custom.TitleBar; +import org.nervos.neuron.item.CurrencyItem; +import org.nervos.neuron.item.CurrencyListItem; import org.nervos.neuron.util.SharePreConst; +import org.nervos.neuron.util.StreamUtils; import org.nervos.neuron.util.db.SharePrefUtil; +import java.util.ArrayList; + /** * Created by 包俊 on 2018/7/31. */ public class CurrencyActivity extends NBaseActivity { private RecyclerView currencyRecycler; - private SparseArray currencyArray = new SparseArray<>(); + private ArrayList currencyArray; private TitleBar title; @Override @@ -47,7 +54,7 @@ protected void initData() { LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); currencyRecycler.setLayoutManager(linearLayoutManager); - setArray(); + currencyArray = setArray(this); Adapter adapter = new Adapter(); currencyRecycler.setAdapter(adapter); title.setOnLeftClickListener(() -> { @@ -60,11 +67,6 @@ protected void initAction() { } - private void setArray() { - currencyArray.put(0, "CNY"); - currencyArray.put(1, "USD"); - } - class Adapter extends RecyclerView.Adapter { @NonNull @@ -76,15 +78,15 @@ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - String currency = currencyArray.get(position); - if (SharePrefUtil.getString(SharePreConst.Currency, "CNY").equals(currency)) { + CurrencyItem currency = currencyArray.get(position); + if (SharePrefUtil.getString(SharePreConst.Currency, "CNY").equals(currency.getName())) { holder.chosenImage.setVisibility(View.VISIBLE); } else { holder.chosenImage.setVisibility(View.GONE); } - holder.currencyText.setText(currency); + holder.currencyText.setText(currency.getName()); holder.root.setOnClickListener((view) -> { - SharePrefUtil.putString(SharePreConst.Currency, currency); + SharePrefUtil.putString(SharePreConst.Currency, currency.getName()); notifyDataSetChanged(); }); } @@ -114,4 +116,11 @@ public void finish() { setResult(RESULT_OK); super.finish(); } + + public static ArrayList setArray(Context context) { + String data = StreamUtils.get(context, R.raw.currency); + Gson gson = new Gson(); + return gson.fromJson(data, CurrencyListItem.class).getCurrency(); + } + } diff --git a/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java b/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java index 151de8dc..6d9ab4d5 100644 --- a/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java @@ -16,7 +16,7 @@ public class SplashActivity extends BaseActivity { protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); - new Thread(){ + new Thread() { @Override public void run() { super.run(); @@ -25,8 +25,7 @@ public void run() { if (!TextUtils.isEmpty(SharePrefUtil.getCurrentWalletName())) { startActivity(new Intent(mActivity, MainActivity.class)); } else { - Intent intent = new Intent(mActivity, CreateWalletActivity.class); - intent.putExtra(EXTRA_FIRST, true); + Intent intent = new Intent(mActivity, AddWalletActivity.class); startActivity(intent); } finish(); diff --git a/app/src/main/java/org/nervos/neuron/fragment/NBaseFragment.java b/app/src/main/java/org/nervos/neuron/fragment/NBaseFragment.java index 909a17c8..2f5fb1d7 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/NBaseFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/NBaseFragment.java @@ -34,8 +34,8 @@ public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (isFirstLoad) { initView(); - initAction(); initData(); + initAction(); } } diff --git a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java index cb0a0125..9ea79c01 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java +++ b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java @@ -13,14 +13,17 @@ import com.bumptech.glide.Glide; import org.nervos.neuron.R; +import org.nervos.neuron.activity.CurrencyActivity; +import org.nervos.neuron.item.CurrencyItem; import org.nervos.neuron.item.TokenItem; import org.nervos.neuron.util.NumberUtil; +import org.nervos.neuron.util.db.SharePrefUtil; import java.util.List; public class TokenAdapter extends RecyclerView.Adapter { - public OnItemClickListener onItemClickListener; + public TokenAdapterListener listener; private Activity activity; private List tokenItemList; @@ -34,8 +37,8 @@ public void refresh(List tokenItemList) { notifyDataSetChanged(); } - public void setOnItemClickListener(OnItemClickListener onItemClickListener) { - this.onItemClickListener = onItemClickListener; + public void setTokenAdapterListener(TokenAdapterListener listener) { + this.listener = listener; } @Override @@ -65,16 +68,20 @@ public void onBindViewHolder(@NonNull TokenViewHolder holder, int position) { } if (tokenItem != null) { holder.tokenName.setText(tokenItem.symbol); - holder.tokenAmount.setText(NumberUtil.getDecimal_6(tokenItem.balance)); + holder.tokenBalance.setText(NumberUtil.getDecimal_6(tokenItem.balance)); } if (!TextUtils.isEmpty(tokenItem.chainName)) { holder.tokenNetworkText.setText(tokenItem.chainName); } else { if (tokenItem.chainId < 0) { holder.tokenNetworkText.setText(activity.getString(R.string.ethereum_mainnet)); - } else { } } + if (tokenItem.currencyPrice == 0.00) { + holder.tokenCurrencyText.setText(""); + } else { + holder.tokenCurrencyText.setText(listener.getCurrency().getSymbol() + tokenItem.currencyPrice); + } } @Override @@ -85,27 +92,29 @@ public int getItemCount() { class TokenViewHolder extends RecyclerView.ViewHolder { ImageView tokenImage; TextView tokenName; - TextView tokenAmount; + TextView tokenBalance; TextView tokenNetworkText; TextView tokenCurrencyText; public TokenViewHolder(View view) { super(view); view.setOnClickListener((v) -> { - if (onItemClickListener != null) { - onItemClickListener.onItemClick(v, (int) v.getTag()); + if (listener != null) { + listener.onItemClick(v, (int) v.getTag()); } }); tokenImage = view.findViewById(R.id.token_image); tokenName = view.findViewById(R.id.token_name); - tokenAmount = view.findViewById(R.id.token_amount); + tokenBalance = view.findViewById(R.id.token_balance); tokenNetworkText = view.findViewById(R.id.token_network); tokenCurrencyText = view.findViewById(R.id.token_currency); } } - private interface OnItemClickListener { + public interface TokenAdapterListener { void onItemClick(View view, int position); + + CurrencyItem getCurrency(); } } \ No newline at end of file diff --git a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/presenter/TokenListFragmentPresenter.java b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/presenter/TokenListFragmentPresenter.java index c9c071f7..e4c49dad 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/presenter/TokenListFragmentPresenter.java +++ b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/presenter/TokenListFragmentPresenter.java @@ -3,10 +3,14 @@ import android.app.Activity; import org.nervos.neuron.R; +import org.nervos.neuron.activity.CurrencyActivity; +import org.nervos.neuron.item.CurrencyItem; import org.nervos.neuron.item.TokenItem; import org.nervos.neuron.util.SharePreConst; import org.nervos.neuron.util.db.SharePrefUtil; +import java.text.DecimalFormat; +import java.util.ArrayList; import java.util.List; /** @@ -24,25 +28,28 @@ public String getTotalMoney(List tokenItemList) { if (tokenItemList.size() == 0) { return "0"; } else { - int money = 0; + double money = 0; for (TokenItem tokenItem : tokenItemList) { - money += tokenItem.balance; + money += tokenItem.currencyPrice; } - return money + ""; + DecimalFormat df = new DecimalFormat("######0.00"); + return df.format(money); } } - public String getTotalMoneyTitle() { - String str = activity.getResources().getString(R.string.wallet_token_unit_CNY); - switch (SharePrefUtil.getString(SharePreConst.Currency, "CNY")) { - case "CNY": - str = activity.getResources().getString(R.string.wallet_token_unit_CNY); - break; - case "USD": - str = activity.getResources().getString(R.string.wallet_token_unit_USD); + public CurrencyItem getCurrencyItem() { + CurrencyItem currencyItem = null; + ArrayList list = CurrencyActivity.setArray(activity); + String currencyName = SharePrefUtil.getString(SharePreConst.Currency, "CNY"); + for (CurrencyItem item : list) { + if (item.getName().equals(currencyName)) { + currencyItem = item; break; + } } - return "(" + str + ")"; + if (currencyItem == null) + currencyItem = list.get(0); + return currencyItem; } } diff --git a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java index bb6e40f5..2d0a3214 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java @@ -1,8 +1,10 @@ package org.nervos.neuron.fragment.TokenListFragment.view; import android.content.Intent; +import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; @@ -12,20 +14,31 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import org.nervos.neuron.R; +import org.nervos.neuron.activity.CurrencyActivity; +import org.nervos.neuron.activity.ReceiveQrCodeActivity; import org.nervos.neuron.activity.TokenManageActivity; +import org.nervos.neuron.activity.TransferActivity; +import org.nervos.neuron.dialog.TokenTransferDialog; import org.nervos.neuron.event.TokenRefreshEvent; import org.nervos.neuron.fragment.NBaseFragment; import org.nervos.neuron.fragment.TokenListFragment.model.TokenAdapter; import org.nervos.neuron.fragment.TokenListFragment.presenter.TokenListFragmentPresenter; +import org.nervos.neuron.item.CurrencyItem; import org.nervos.neuron.item.TokenItem; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.service.WalletService; import org.nervos.neuron.util.LogUtil; +import org.nervos.neuron.util.SharePreConst; +import org.nervos.neuron.util.currency.TokenCurrencyManager; import org.nervos.neuron.util.db.DBWalletUtil; +import org.nervos.neuron.util.db.SharePrefUtil; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; +import rx.Subscriber; + /** * Created by BaojunCZ on 2018/8/2. */ @@ -39,6 +52,9 @@ public class TokenListFragment extends NBaseFragment { private RelativeLayout totalMoneyRoot; private TextView totalText, moneyText; private ImageView addImage; + private CurrencyItem currencyItem; + private WalletItem walletItem = null; + private SwipeRefreshLayout swipeRefreshLayout; @Override protected int getContentLayout() { @@ -53,6 +69,7 @@ protected void initView() { totalText = (TextView) findViewById(R.id.tv_total_money_title); moneyText = (TextView) findViewById(R.id.tv_total_money); addImage = (ImageView) findViewById(R.id.iv_add); + swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout); } @Override @@ -61,9 +78,9 @@ protected void initData() { recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); adapter = new TokenAdapter(getActivity(), this.tokenItemList); recyclerView.setAdapter(adapter); - LogUtil.e("Token", "initData"); initWalletData(true); - totalText.setText(getResources().getString(R.string.wallet_total_money) + presenter.getTotalMoneyTitle()); + setCurrency(); + initRefresh(); } @Override @@ -71,6 +88,43 @@ protected void initAction() { addImage.setOnClickListener((view) -> { startActivity(new Intent(getActivity(), TokenManageActivity.class)); }); + adapter.setTokenAdapterListener(new TokenAdapter.TokenAdapterListener() { + @Override + public void onItemClick(View view, int position) { + TokenTransferDialog dialog = new TokenTransferDialog(getContext(), tokenItemList.get(position)); + dialog.setOnReceiveClickListener(v -> { + startActivity(new Intent(getActivity(), ReceiveQrCodeActivity.class)); + dialog.dismiss(); + }); + dialog.setOnTransferClickListener(v -> { + Intent intent = new Intent(getActivity(), TransferActivity.class); + intent.putExtra(TransferActivity.EXTRA_TOKEN, tokenItemList.get(position)); + startActivity(intent); + dialog.dismiss(); + }); + dialog.show(); + } + + @Override + public CurrencyItem getCurrency() { + return currencyItem; + } + }); + + } + + @Override + public void onResume() { + super.onResume(); + setCurrency(); + } + + private void setCurrency() { + if (currencyItem == null || !currencyItem.getName().equals(presenter.getCurrencyItem().getName())) { + currencyItem = presenter.getCurrencyItem(); + totalText.setText(getResources().getString(R.string.wallet_total_money) + "(" + currencyItem.getUnit() + ")"); + getPrice(); + } } @Subscribe(threadMode = ThreadMode.MAIN) @@ -78,21 +132,32 @@ public void onWalletSaveEvent(TokenRefreshEvent event) { initWalletData(true); } + private void initRefresh() { + swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + initWalletData(false); + } + }); + } + private void initWalletData(boolean showProgress) { WalletItem walletItem1 = DBWalletUtil.getCurrentWallet(getContext()); if (showProgress) showProgressBar(); WalletService.getWalletTokenBalance(getContext(), walletItem1, walletItem -> recyclerView.post(() -> { if (showProgress) dismissProgressBar(); + swipeRefreshLayout.setRefreshing(false); if (walletItem.tokenItems != null) { - setData(walletItem.tokenItems); + this.walletItem = walletItem; + this.tokenItemList = walletItem.tokenItems; + setData(); } }) ); } - public void setData(List tokenItemList) { - this.tokenItemList = tokenItemList; + public void setData() { if (tokenItemList.size() == 0) { recyclerView.setVisibility(View.GONE); noTokenRoot.setVisibility(View.VISIBLE); @@ -100,7 +165,53 @@ public void setData(List tokenItemList) { recyclerView.setVisibility(View.VISIBLE); noTokenRoot.setVisibility(View.GONE); adapter.refresh(this.tokenItemList); - moneyText.setText(presenter.getTotalMoney(this.tokenItemList)); + getPrice(); + } + } + + private void getPrice() { + for (TokenItem item : this.tokenItemList) { + if (item.balance != 0.0 && item.chainId < 0) + TokenCurrencyManager.getTokenID(item.symbol).subscribe(new Subscriber() { + @Override + public void onCompleted() { + if (!TextUtils.isEmpty(item.currencyID)) + TokenCurrencyManager.getTokenCurrency(item.currencyID, currencyItem.getName()).subscribe(new Subscriber() { + @Override + public void onCompleted() { + LogUtil.e("Token", item.symbol + ">>" + item.currencyPrice); + adapter.notifyDataSetChanged(); + moneyText.setText(presenter.getTotalMoney(tokenItemList)); + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onNext(String s) { + if (!TextUtils.isEmpty(s)) { + double price = Double.parseDouble(s.trim()); + DecimalFormat df = new DecimalFormat("######0.00"); +// item.currencyPrice = Double.parseDouble(df.format(price * 0.155)); + item.currencyPrice = Double.parseDouble(df.format(price * item.balance)); + } else + item.currencyPrice = 0.00; + } + }); + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onNext(String s) { + item.currencyID = s; + } + }); } } diff --git a/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java b/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java index fb11250a..a789409f 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java @@ -265,7 +265,7 @@ public void onClick(View v) { }); tokenImage = view.findViewById(R.id.token_image); tokenName = view.findViewById(R.id.token_name); - tokenAmount = view.findViewById(R.id.token_amount); + tokenAmount = view.findViewById(R.id.token_balance); } } } diff --git a/app/src/main/java/org/nervos/neuron/item/CurrencyIDItem.java b/app/src/main/java/org/nervos/neuron/item/CurrencyIDItem.java new file mode 100644 index 00000000..21bcf520 --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/item/CurrencyIDItem.java @@ -0,0 +1,41 @@ +package org.nervos.neuron.item; + +/** + * Created by BaojunCZ on 2018/8/3. + */ +public class CurrencyIDItem { + + private String id, name, symbol, website_slug; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getWebsite_slug() { + return website_slug; + } + + public void setWebsite_slug(String website_slug) { + this.website_slug = website_slug; + } +} diff --git a/app/src/main/java/org/nervos/neuron/item/CurrencyIDList.java b/app/src/main/java/org/nervos/neuron/item/CurrencyIDList.java new file mode 100644 index 00000000..f220a6d4 --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/item/CurrencyIDList.java @@ -0,0 +1,18 @@ +package org.nervos.neuron.item; + +import java.util.ArrayList; + +/** + * Created by BaojunCZ on 2018/8/3. + */ +public class CurrencyIDList { + private ArrayList data = new ArrayList<>(); + + public ArrayList getList() { + return data; + } + + public void setList(ArrayList data) { + this.data = data; + } +} diff --git a/app/src/main/java/org/nervos/neuron/item/CurrencyItem.java b/app/src/main/java/org/nervos/neuron/item/CurrencyItem.java new file mode 100644 index 00000000..37b84d2f --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/item/CurrencyItem.java @@ -0,0 +1,32 @@ +package org.nervos.neuron.item; + +/** + * Created by BaojunCZ on 2018/8/3. + */ +public class CurrencyItem { + private String name, unit, symbol; + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } +} diff --git a/app/src/main/java/org/nervos/neuron/item/CurrencyListItem.java b/app/src/main/java/org/nervos/neuron/item/CurrencyListItem.java new file mode 100644 index 00000000..dd004467 --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/item/CurrencyListItem.java @@ -0,0 +1,20 @@ +package org.nervos.neuron.item; + +import android.util.SparseArray; + +import java.util.ArrayList; + +/** + * Created by BaojunCZ on 2018/8/3. + */ +public class CurrencyListItem { + private ArrayList currency = new ArrayList<>(); + + public ArrayList getCurrency() { + return currency; + } + + public void setCurrency(ArrayList currency) { + this.currency = currency; + } +} diff --git a/app/src/main/java/org/nervos/neuron/item/TokenItem.java b/app/src/main/java/org/nervos/neuron/item/TokenItem.java index 3d2a8505..1a99e82d 100644 --- a/app/src/main/java/org/nervos/neuron/item/TokenItem.java +++ b/app/src/main/java/org/nervos/neuron/item/TokenItem.java @@ -19,6 +19,8 @@ public class TokenItem implements Parcelable { public int chainId; public String chainName; public double balance; + public String currencyID; + public double currencyPrice; public TokenItem() { } @@ -83,6 +85,8 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.chainId); dest.writeString(this.chainName); dest.writeDouble(this.balance); + dest.writeString(this.currencyID); + dest.writeDouble(this.currencyPrice); } protected TokenItem(Parcel in) { @@ -96,6 +100,8 @@ protected TokenItem(Parcel in) { this.chainId = in.readInt(); this.chainName = in.readString(); this.balance = in.readDouble(); + this.currencyID = in.readString(); + this.currencyPrice = in.readDouble(); } public static final Creator CREATOR = new Creator() { diff --git a/app/src/main/java/org/nervos/neuron/service/EthRpcService.java b/app/src/main/java/org/nervos/neuron/service/EthRpcService.java index abf65943..de151de5 100644 --- a/app/src/main/java/org/nervos/neuron/service/EthRpcService.java +++ b/app/src/main/java/org/nervos/neuron/service/EthRpcService.java @@ -62,7 +62,7 @@ public static void init(Context context) { public static double getEthBalance(String address) { try { EthGetBalance ethGetBalance = service.ethGetBalance(address, - DefaultBlockParameterName.LATEST).send(); + DefaultBlockParameterName.EARLIEST).send(); if (ethGetBalance != null) { return NumberUtil.getEthFromWei(ethGetBalance.getBalance()); } @@ -85,7 +85,7 @@ public BigInteger call() { return gasPrice; } }).subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()); + .observeOn(AndroidSchedulers.mainThread()); } public static Observable transferEth(String address, double value, @@ -114,7 +114,7 @@ public Observable call(BigInteger nonce) { } }).flatMap(new Func1>() { @Override - public Observable call(String hexValue){ + public Observable call(String hexValue) { try { EthSendTransaction ethSendTransaction = service.ethSendRawTransaction(hexValue).sendAsync().get(); @@ -125,8 +125,8 @@ public Observable call(String hexValue){ return Observable.just(null); } }) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()); + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); } @@ -142,21 +142,23 @@ public EthGetTransactionReceipt call() { return null; } }).subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Subscriber() { - @Override - public void onCompleted() { - - } - @Override - public void onError(Throwable e) { - e.printStackTrace(); - } - @Override - public void onNext(EthGetTransactionReceipt ethGetTransactionReceipt) { - LogUtil.d("transaction receipt: " + ethGetTransactionReceipt.getTransactionReceipt()); - } - }); + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Subscriber() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + e.printStackTrace(); + } + + @Override + public void onNext(EthGetTransactionReceipt ethGetTransactionReceipt) { + LogUtil.d("transaction receipt: " + ethGetTransactionReceipt.getTransactionReceipt()); + } + }); } @@ -180,12 +182,12 @@ public static double getERC20Balance(String contractAddress, String address) { Transaction balanceCall = Transaction.createEthCallTransaction(address, contractAddress, ConstUtil.BALANCEOF_HASH + ConstUtil.ZERO_16 + Numeric.cleanHexPrefix(address)); String balanceOf = service.ethCall(balanceCall, DefaultBlockParameterName.LATEST).send().getValue(); - if (!TextUtils.isEmpty(balanceOf) && ! ConstUtil.RPC_RESULT_ZERO.equals(balanceOf)) { + if (!TextUtils.isEmpty(balanceOf) && !ConstUtil.RPC_RESULT_ZERO.equals(balanceOf)) { initIntTypes(); Int64 balance = (Int64) FunctionReturnDecoder.decode(balanceOf, intTypes).get(0); double balances = balance.getValue().doubleValue(); if (decimal == 0) return balances; - else return balances/(Math.pow(10, decimal)); + else return balances / (Math.pow(10, decimal)); } } catch (Exception e) { e.printStackTrace(); @@ -195,7 +197,7 @@ public static double getERC20Balance(String contractAddress, String address) { public static Observable transferErc20(TokenItem tokenItem, String address, - double value, BigInteger gasPrice, String password) { + double value, BigInteger gasPrice, String password) { BigInteger transferValue = getTransferValue(tokenItem, value); String data = createTokenTransferData(address, transferValue); return Observable.fromCallable(new Callable() { @@ -222,7 +224,7 @@ public Observable call(BigInteger nonce) { } }).flatMap(new Func1>() { @Override - public Observable call(String hexValue){ + public Observable call(String hexValue) { try { EthSendTransaction ethSendTransaction = service.ethSendRawTransaction(hexValue).sendAsync().get(); @@ -233,24 +235,25 @@ public Observable call(String hexValue){ return Observable.just(null); } }).subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()); + .observeOn(AndroidSchedulers.mainThread()); } private static BigInteger getTransferValue(TokenItem tokenItem, double value) { StringBuilder sb = new StringBuilder("1"); - for(int i = 0; i < tokenItem.decimals; i++) { + for (int i = 0; i < tokenItem.decimals; i++) { sb.append("0"); } BigInteger ERC20Decimal = new BigInteger(sb.toString()); - return ERC20Decimal.multiply(BigInteger.valueOf((long)(ConstUtil.LONG_6*value))) + return ERC20Decimal.multiply(BigInteger.valueOf((long) (ConstUtil.LONG_6 * value))) .divide(BigInteger.valueOf(ConstUtil.LONG_6)); } private static String createTokenTransferData(String to, BigInteger tokenAmount) { List params = Arrays.asList(new Address(to), new Uint256(tokenAmount)); - List> returnTypes = Arrays.>asList(new TypeReference() {}); + List> returnTypes = Arrays.>asList(new TypeReference() { + }); Function function = new Function("transfer", params, returnTypes); return FunctionEncoder.encode(function); } @@ -284,6 +287,7 @@ private static int getErc20Decimal(String address, String contractAddress) throw private static List> intTypes = new ArrayList<>(); + private static void initIntTypes() { intTypes.clear(); intTypes.add(new TypeReference() { @@ -295,6 +299,7 @@ public java.lang.reflect.Type getType() { } private static List> stringTypes = new ArrayList<>(); + private static void initStringTypes() { stringTypes.clear(); stringTypes.add(new TypeReference() { @@ -306,5 +311,4 @@ public java.lang.reflect.Type getType() { } - } diff --git a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java index 15fb2bb7..6180a13f 100644 --- a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java @@ -55,4 +55,8 @@ public class ConstUtil { public static final String DECIMALS_HASH = "313ce567"; public static final String BALANCEOF_HASH = "70a08231"; + + //Token Currency ID Price + public static final String TOKEN_ID = "https://api.coinmarketcap.com/v2/listings/"; + public static final String Token_CURRENCY = "https://api.coinmarketcap.com/v2/ticker/@ID/?convert=@Currency"; } diff --git a/app/src/main/java/org/nervos/neuron/util/StreamUtils.java b/app/src/main/java/org/nervos/neuron/util/StreamUtils.java new file mode 100644 index 00000000..6b79c56c --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/util/StreamUtils.java @@ -0,0 +1,44 @@ +package org.nervos.neuron.util; + +import android.content.Context; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; + +/** + * Created by BaojunCZ on 2018/8/3. + */ +public class StreamUtils { + public static String get(Context context, int id) { + InputStream stream = context.getResources().openRawResource(id); + return read(stream); + } + + public static String read(InputStream stream) { + return read(stream, "utf-8"); + } + + public static String read(InputStream is, String encode) { + if (is != null) { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(is, encode)); + StringBuilder sb = new StringBuilder(); + String line = null; + while ((line = reader.readLine()) != null) { + sb.append(line + "\n"); + } + is.close(); + return sb.toString(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return ""; + } + +} diff --git a/app/src/main/java/org/nervos/neuron/util/currency/TokenCurrencyManager.java b/app/src/main/java/org/nervos/neuron/util/currency/TokenCurrencyManager.java new file mode 100644 index 00000000..448c54b7 --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/util/currency/TokenCurrencyManager.java @@ -0,0 +1,89 @@ +package org.nervos.neuron.util.currency; + +import com.google.gson.Gson; + +import org.json.JSONObject; +import org.nervos.neuron.item.CurrencyIDItem; +import org.nervos.neuron.item.CurrencyIDList; +import org.nervos.neuron.service.NervosHttpService; +import org.nervos.neuron.util.ConstUtil; + +import java.io.IOException; +import java.util.ArrayList; + +import okhttp3.Call; +import okhttp3.Request; +import rx.Observable; +import rx.Scheduler; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Func1; +import rx.schedulers.Schedulers; + +/** + * Created by BaojunCZ on 2018/8/3. + */ +public class TokenCurrencyManager { + + private static ArrayList list = null; + + public static Observable getTokenCurrency(String ID, String currency) { + return Observable.fromCallable(() -> { + String url = ConstUtil.Token_CURRENCY.replace("@ID", ID).replace("@Currency", currency); + Request request = new Request.Builder().url(url).build(); + Call call = NervosHttpService.getHttpClient().newCall(request); + String response = ""; + try { + response = call.execute().body().string(); + } catch (IOException e) { + e.printStackTrace(); + } + JSONObject object = new JSONObject(response); + JSONObject data = object.optJSONObject("data"); + JSONObject quotes = data.optJSONObject("quotes"); + JSONObject quote = quotes.optJSONObject(currency); + if (quote != null) { + return quote.optString("price"); + } else { + return null; + } + }) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public static Observable getTokenID(String symbol) { + return Observable.fromCallable(() -> { + if (list == null) { + Request request = new Request.Builder().url(ConstUtil.TOKEN_ID).build(); + Call call = NervosHttpService.getHttpClient().newCall(request); + String response = ""; + try { + response = call.execute().body().string(); + } catch (IOException e) { + e.printStackTrace(); + } + Gson gson = new Gson(); + list = gson.fromJson(response, CurrencyIDList.class).getList(); + } + return list; + }).subscribeOn(Schedulers.newThread()) + .flatMap(new Func1, Observable>() { + @Override + public Observable call(ArrayList currencyIDItems) { + CurrencyIDItem res = null; + for (CurrencyIDItem item : list) { + if (item.getSymbol().equals(symbol)) { + res = item; + break; + } + } + if (res == null) { + return Observable.just(null); + } else { + return Observable.just(res.getId()); + } + } + }); + } + +} diff --git a/app/src/main/res/drawable-xhdpi/ic_about_us_infua.png b/app/src/main/res/drawable-xhdpi/ic_about_us_infua.png new file mode 100644 index 0000000000000000000000000000000000000000..2214b00cd72ff73d058b77d1e0028cbefd78d572 GIT binary patch literal 1585 zcmV-12G043P)t~TM`9^mzNp()FC8#qBLnCMkaxwQ>`mkcoEv<;8BPPX8A&^pa`!^Q9`+iv`;engCp8l||CT5ju%Q!(I>iy-oyN zPT1%gD_O2)3z$r2l!$G8er(y~LzUL4GQKi}5>ojB68S}xYmL41y}54(FPQ=i*zGvB zGlJnBH->y}^m$zvV66CTR=9cg9c*?YQ!4Q1qsb(W|BxlXI-c1+gcnB#Q70C$iMUaW zRH$jlRmw;%6p$w1SZ)zla|;MM&69~SKx!TFIPuQIduSm|SxFNu+1H6;n@^rrgWu^; zhLB;u(}qExi-uq3U$&B{L!uRHWULT)g?$&5R+{LuEx*P9$s&i!V_!Ah;-02`2#T^+ zNcH8pX-rqBF(3*%=mCedNr{ym8lBFw4ZaQQtq(w2TVhg3oTze|dR}s=nz^~3n+GWI z$PlR0RX-;4_%@bSCsg9<^o?0e+?YpI;?~aiT8Z8N4sunHb=qJlek7;x3col#gKwrX z_ve1>M7*p27aDI9ge>3kTiY4TV#nr1?o_!7{20S(lGezx-1h9W7hzCLe zM0~tCYRo+%y*VSatfqJ)fTCckSi{fp1kT1Y_>z{oGGD-axq?OBFnY2jlV*e6Qp5IM z4_pp6eodq)tB&2_Uew5YF_TBh!ceGI1cgdj9=hCPvtfh)ACCrcfS~V+gb;Qz6b#7F z#f4G@<0sG4Qgf)%owXVTENN+>RRb;u?&xvhiJ?9`y(@~*fCukgO5nBBjAA>wV+gP8 zjuPM^PW*liUtCW!1PYidmXTd*H}XYHr1G%-bPc-$UYtI14?K=`IPD|U!bYX<9UjE@ zF?oTKds33GlU0Wu_eDcE${XfUYQN$hTG1kwBB^+x5)N)M*58A%(49EW=kH>(_+&DU z)7KKXzEHwkp+FBaVROyC&0$EcHX=iScB>VKhkNn%1Q6-*V1K_Kj|~U$)V4u{{a#`w z=qfKY2~j~LacV>>@m0scfgT);_9C6zf)jtn@zwPd&Lwl0;^BId%9NRVS#1oEjQy-s-g=oW5H{ zw5TX9sip(zk==n|qo+(QD9RNom9>>yG)D6)h3ZR~N?RsL`pW|b<(4YvmU)~08Uy5J zaTb)v&tAYVi`58Qh%M}qf>qNCR>riQNR(KfmTalC664uo1=GC#L`nW@Em*51B)NB* zc~BLsd@+0Dz^F>xdX8#B$F4CzPGrhuyniXqo&AKCPwXe_`(~0+ij`$rPaO9T6w3K@}dJ*nD2K#%ODAGBpQj|4vJL zs}n2|TV=_56M%Jid1v0gdEmCZcKRH0jkJR^2T0zi+l7xG8r8#EH>dEgJ4x_Fy$&;c zW){>Bz{nOn69a>>GHw4 j+ek3+OTVSt{~O{T!9qp_er?~z00000NkvXXu0mjfJ1z3& literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_about_us_logo.png b/app/src/main/res/drawable-xhdpi/ic_about_us_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..64f2c4cda2b60ae2ec773c0f2193a290476a8952 GIT binary patch literal 4073 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 bA6@o;M^SJGv86^x00000NkvXXu0mjf-`BL) literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_about_us_nervos_network.png b/app/src/main/res/drawable-xhdpi/ic_about_us_nervos_network.png new file mode 100644 index 0000000000000000000000000000000000000000..ba856b5b0330021ba84ac6fc49dae07ba75ee554 GIT binary patch literal 2221 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_about_us_origin_code.png b/app/src/main/res/drawable-xhdpi/ic_about_us_origin_code.png new file mode 100644 index 0000000000000000000000000000000000000000..d213bc3997389cefd4dea6ee8da71ec24ea4b6a3 GIT binary patch literal 869 zcmV-r1DgDaP)E7{~uRy{x)yFBoOI1!`Ao5CnG73&CEcbyX2WWnZ9+ zK1!cJ=t}7I!d^fs(o%@Z(j+QMC@?coS=%h~Wjp_d!_1Cz&Yan0+PUz#@ywa?oaZ-rFj2z+5}f zxD7~d@P;;fjufzIJCJPwre=ZBk7hvLR*?c8-4Co25e9~V#U*cOv**YFsa{)!>hTjo z1GZ;@=EmT!_o}xg4IJJF)Fy*{-7P`^b{qsw<$wci?k-lBGg7@7C-?YKCyoH;I{+R8 zOwAaOa8%{%G|=}<-@R0?|CN(_W1oN*Z-LefaPF8nq!FMS?&@7&Ze9&Y_5RIVq23$U z%;hAx{Wv^iAfOj6Ur@vGjh}kbV|gV!q!utNoK)|dM?DG1zY_AfYq(RIoKymy&e>{w z7mI9nFA$_0gG==WT)D@3uMzUrBVhQwos%a;ER`t%Cxr@2%l5KRzggw()XSNxQ_pD) zr0RgJX}e}N?|xHSRss%=05=|r*;Wf&JZ@iPN?l8zs2)!(Cc8#jz;$)n>*>%aaDS+@ zFZYuYkd0n{0Ioj(YBt*I7jIjBR-&F*PIN}N3j%I;13^+ycr#rFmj@umJ?wO(9xp2lEpnTu0}RX vb%croG}$cvnjYq!`oF-*M7BiS{|)gM^n??7Wd2CU00000NkvXXu0mjfxwMW& literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_about_us_server_pri.png b/app/src/main/res/drawable-xhdpi/ic_about_us_server_pri.png new file mode 100644 index 0000000000000000000000000000000000000000..77f1b010a16c8c8e3e7246c3d88afd8f5353750f GIT binary patch literal 1094 zcmV-M1iAZ(P)B8I6vsa^wN@8<5D`=@wN&gCYDuk)2ni7pA(0SI-o&fF zz$;I-2SkF{LI}0YEAuhL%SLM!_#4y%vg1-Hst`=@x zg_ahWQv{>O!h&Krf6AF3qZOZEj|?bY0i#4|Jg8NkJT$Icz21;}{R$56gP%Xl>NnEg zumz^gH12-?)~eM`u(Mce<5uX^8yXwoZ51>%xhrg_hpI|5Re{js>?a3Y z5yuT?k~|9vp?4n$xv}K0IAl%jJ$(#!@0gkFUX$^za-9G zJR7;K#?MiCMpoG-PDaj(*-H*Vb*)~I(tGe#LQ7i|uQZl@`AovjCo>WVNWkyfc2>-G z;spO%?-yLVtNdsPbBS^#8DZ$RWSRH^`r<;>*>WB zC&j_sg^(@rPXqXo15oqD(a}eugT}iNo_V$^?l2aA>&a#|!PURT1& zqwuNP^nE-NBRFZAQ#@$$4?|Pp?dv8Ohh;wh`X{KaoGJ-lp;d~KDt``Tk3g-NB={$o zHvzJ;;iIIpJ-Z?UbCSrZ8vnOgiwMPy%k4%^)%&;L^%8g{Y0GP#*4=!-zXdgGv@<#V zJ^l&$u!f%{c7owA4jS*0iFEm_p{SQ29tU=UTGuHwGb9VcMt}zL+8R$qu>F$go7nJN z^9H6LbF`LgvZtn)zavey(o%o!0y9N*dqALd=XR;TEzmlza6Sa=#}yjy67m@r9Rz~#NTv$rxSYOj`NlVQrFpw-gfBjOWOMO78iRkFto5}lSr zza>h=ef@txP`?SMDui1w^uan+2@cH>g8DUGV_d31ISIEws{b3}H~PdN0BQz1p8x;= M07*qoM6N<$f+LXz^Z)<= literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_currency_selected.png b/app/src/main/res/drawable-xhdpi/ic_currency_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..5b61765693bdc446f74506d4c623736b7f2167c2 GIT binary patch literal 1112 zcmV-e1gHCnP)iU>ed{mN;LP-S`716{Z%}}Hw)IT&cQ*u!Z zNt00VRcUG=nxYsgyH=7Gp^+%0)ndATXre|g8k9u7(o$IQiMngQ?>%$9Guw`H?>IPf z{y6vEbIyHmUUzUs1;ohBTky^*I8X`KZosy3 z*niX!)-NQ`MWs%YVv5BaSy4ij1p~U_8~EXX157Z|zX$Z|=70+Vbk}|;+b%VN6ey?Z z*cLvR;vm)M9aK)UbfWk2u+?N zxVdXVuy;M&K;Iq%y}KmOy!XB5OsD^Glaw89-L^AR2Ag)?dtsQj$}~$%)``;&QfmY| zdI-GmbQlT291nElbAceQYOxJI-C-HxGnX}j>Cx`iTcM#c%{!9@sOvMmpk#P7IhyT( zDu&IojL@jq25iJHt#(_nFl#kjz7}2Z&I;K2qpcI5mRr~5aZ8yK9I%F>v{-V5UwH!F zwdz`F&DX3pXr~ZjmCR!ghZBAHH|IRni5#v~t(wE?nO1N#3n!!YtQ1haJo~TPl^}-GCtCe7aRMUpV z4PeGt7}Up&)$U~pL7ua!$TPXEk@L(ifv39Ho*nJEPEd(Z>9ul8P<8u10c~H#Sx$a+ zSn5WaKikgpu|J(9{Mxc)1dJGzIyalAw4lDQExX`z3snO2I@7SUJJ_n6X%-9XTi{k( zwh8tevYR9e=vU;_QQqtO?lOXEho26^$5!zu#wNEOPuh8Y1Gevl&EExY^ijRK!uxin z{Rk4g&F(G~s6-z(lP)fGY1Y@S%-gyJT(qpC=8fA`X>pl3Pm@O8a8A0=pxW)+MbpxH zIAfVi7WRRI2a665IS+rNWls3+3W)@&RSG+*f+`geL@HuyI=3p-7FoRQ`h+)>(=IZo zc9(~*{Tj*-rn1a<4W8|tI+m-atU&$Ex0b_~78Po0>}SMF@bWqdPH~&R9|3@|db!z{#uK(TI|L^Vp|NsAkdH>1A|M&O* zzqdQv|K#HT)X@K) zmH&%@|N8p>{rvy4t^a{`|B#3OMmM4mB}xDQ04H=(PE!Cjf}*V}yw>XV|H9z<+sC)y zvhddB(d+ur^~}NV=FG+X{no(7qn-K%2LJ#8ZAnByRCt`lmF;?iAPj}ArHDtZ7U`gN zTeoiQ{a@lT1V7MP|Lj@*@E|XoBqSI`n|RBfS-gv)%~Q(SE{fNIakP$O+qEG3dypq0 z1yYglMKBZSOk|J294Pi>#aLD51#ox(${K}|-Aok_auy_RpTx?N}oJ9V(>GaTS0XrQ6W1 z6p-yc9e@q05ePVs>Hu^L6ufAMdi;F?k`Lnini!v#3FxJne6#5}`DBFBJ{a!mCq1+I zU{sry6V=bVQhDQQXPO=kL;1J>`}V>w_MWAgB-~zM30(Y~?pcwJR~{CH;Y}xGHSl3( zih|tvM8gJ_S+^>!0S;k3Ic9?$6KLML!EUCN-!aBj^AC002ovPDHLkV1ke9 BL3scG literal 570 zcmV-A0>%A_P)xN#00001b5ch_0olnc ze*gdg)lf`SMF0Q*|3^9hMK}LNH~&RA|3)|ejDi2GrT>e8|Cf&c-P-@h!vDOs|H#Du zl#Ty^c>lw`|4>2yQbhm6zyE-B|C^HkrJn!8!2gts|E8b+!o2^otpC)||5Qi++}Zzu zcK^`K|E;F~$;AJPfB$)I|I*L@wXpxFq5r+O|Er|`+1LNp(*M1=|Hi@ppqc++RsY}I z|Lf}i=H&n3-v4Z0|8;8rb7=qJ-~V1u|4Kdo+1CG&i2qkg|Jv98#KHgT>HkSQ|MKzw z=jQ)@bpPh$|C^KlM>f!0P-6f907rCEPE!CjjIEcL#nQyd>fhSm$-&*QvEIPT&)vw- z+|}l>>cQmG;KaV=*U;M1>F3(t&9&_F@a?(0yX~~E=*P0@-tw;Z@WAiOjR(>eivR!s zz)3_wRCt_i&}kEaP!tB>@@kQ?WT#MBvJ@g~*6{y-l9(iy`{A6KXYR~7=cVWbh?k@( zhBP2S{TdJ<%W*t`DIqP2l8}jGHkW@kxlsIIDi@SeIVhECghKGIR&OYP+I%CM23l=E z(*WHFkrRPV7wGi?a}YzY!_hcsmK`E50h8&>nJ)mxjRwif)f(7rciujlo;e&(uLaK+ z|Fe8wQJ>Ab-r{Fgo4RQ^d!Goz7})MlN?+0a3HeUZchVU80r^uAFG3SjT>t<807*qo IM6N<$f|nCSssI20 diff --git a/app/src/main/res/drawable-xhdpi/ic_setting_contact_us.png b/app/src/main/res/drawable-xhdpi/ic_setting_contact_us.png new file mode 100644 index 0000000000000000000000000000000000000000..9790c984b215b4538a9521b7505f955c5985025e GIT binary patch literal 1104 zcmV-W1h4yvP)n;(^p9T4|biDi6H% z&6C7?Uz#)x5t8ykB3ez2h=@zwf)KQ7s$+(Bj9`=*gK?QT)<56b5jkhy%whIFIs5GM zUDo&CYprj6YweTD7@8l${*zF93v}O^=+_%Ym%`#%p!-x)OD6OEPI%JVnY41(?$ran z{TkBJT++yit~iNXT4qfu#4X*~J{P1MaZ3jcNJ3xY33lm-mWunpxH2fSu+ZN^LXYmy z`V5-PG&dTc`Ud>p+>sUFtqAt%1&e0FICU4~N34 z#n9JCW-@TO#%ZeYAv}Kp1Nyx_?-IEyx|YZU6< z9@^U7ebj5aJZgi#jWgJ8%ST@{={i`mH_}62-BUOGG2ayOC_l54=+^$_}p~Ek< z_${m*zha)7FIin<#EwV=XHRxZr);Ol)Sr&`qmsXU!6z=q(|nPeUYUPfzSdBJ<#tL; z$~tz>5b0)Pn6d%Un>FptzgEZ*e`~x-VbL^&6-5 zK!P%j{7rFe!)CblZ;+_)zSDoe#w~EA*5ax8^k-AT=L8ZQIm8J#Vxi^5OXuX_BK=3S zTX<@H4!>V;V?6o(GeR`z?bbFsrV0ridqR<&E@24N;O#~?ed@R{G4c96d7k{B*?|%1 zn3w`pv_f4}0UAe$Ehvkkk_i^*>Fa&B)o8spq@YIsf{+672;ijo2 zOzfNe+7N=W8j(}2p(Ns-B@KlcJ*`eD9c(^l0%{w)-ssaB1(;o9O}3!=g1CvMrX zqg)j?W~BQq-#u{36;^SHdE*O0@XVi}3`G^3K7vZIJ%>9UI}2iBm7H6CamD&GJ8N&< zgB?{JC#MIERd#B^`$j=D_%2B&pP=3YCl%tB)(h*TLfq1No30nuNrO0vTPo>)L%ag{ WYZ+ha2R3B@0000|HsDv_xJz1 zy8nuZ|6N=E#>M|lN&n>J|FEzB=H&m0hyRw8|J&RD=H~yAj{kXf|MvF(($N2|tN(a) z|Nj2}zP<|KQ;NwzdE1>Hj-7|23N?SpWb4ICN4@Qvf!CqOB{u*6Q{D!r=Pb$G70J z@Ye9g%(vOrt zBpbmg#7<(|kWF9$A=!>eQBwC{?BmJf6YgWiH86*AlM^cWbY=&t5Z{7)BYdVI=E)Q| z--z=Hs4ymXu|Pup5{oOBxT=6TQa5q!#y7Ynmm;r#OJwAPbBx{L-eokYfB-!+OgG~d z9!lS9VCUsuY-qx;7_4aURNqU(<=G)jz z>RQ8Xu!J(2V{LQhR>v1t+7$W`W>x~yt|-aqhD|}+o8+AG6QyW`6IKV!syuVjbjm5k z%UKh+dVvmKv9vWWWoWqOqhQq+cr#(&@u5-Dt%5B6ERJj5a$JqgzH+l`#kXp|09x$- nz@P3{bLY$6{62mT#~TK}B0MTB1YmC>00000NkvXXu0mjf2ML46 literal 581 zcmWlUT}V>_9K|O&EkD8}2=qZE@*y+nMYFWIu{CGg(zy%_q8O_@%_rG^Ei z)JQ1BzBDs!t}*ZIPBvDlQ`uMEZE1?b&4n;(V5d9ypY!9up980(RLoC|ONnDJ7>R;n zu7u|Ph<5LyU3=coq7ijl!skRe%txB(K$QxmJev9WIFW~w^c|0Qn*u`vXjP!68!jiv zX=o;3B=MjN4RR2AoMwa1g<%TvJ7{V|ML7rp-S;v478C`qC-N`g!{LC{irMe*xUskp zX=rVRs08gw?Ce0R!Qe|=ya4J4%0vi-KpOD04{{lt4sZ%lbro(3tE;HK2JIvktQa4I z-G(N(rqmZBtPX;4)>9v_OaH!vG)Kt=|eFy8AG zh%@`tXXf`M<&=~sR23=XQazVDudGDh(xt1Cb7GJ62=lYm=CJ9I|DnajD=S>}PjW`3 zF^89OW}^EmVpBx@1Cu7zoO;iTM49$fC|sA8pqRHCHOda<#&td8aaK)PeRgVUZKllP zI-2*%{>q+KTk!WeE9*eK?RArmIV;_&SpWS|%uTPfHMU8@9f7l^8dcMynYlD}L2^QO Rqi~C!!VvJp++oh8mjBqIOrQV& diff --git a/app/src/main/res/drawable-xhdpi/ic_setting_localcoin.png b/app/src/main/res/drawable-xhdpi/ic_setting_localcoin.png new file mode 100644 index 0000000000000000000000000000000000000000..764f62ad9065b70f462ec34a0359edd8ad87dc50 GIT binary patch literal 797 zcmV+&1LFLNP)9v&{G5@7(_;dT98qcQ52Mf(ZvD_Gq0rOOnb2#RC3lFXCL)E^m~}uXRo#Q{$}m_ znNZZIZx9+=p`#P}hnQ7mXF}l;IItaZvLMtu5RG2C3PV36l6Vp_ZeE+;OlqY z->X&a;%#f8x-v1GG!_b3zYV2uwie0?ydvm+Y6L6GZQ<)p(DqudNUZa-Vc%9*UjoPW z!o@4@JChp0{9Ft5ygf0Tc=YtcwY%{4BV?q*u1(&`X;7 z*oYaQlj&QJ{ZW(IVtFcH%<1&uSZZqDDW>*QHSxjUeonrbCok-v5DT%-4iilpfWyPcOhp$iBii` zkbA5gY(*$EPe2oC>(JC7__46xyzefHziIfCOMMkC{&{7L%?c-yRfe#=+D2QU1_ z0~K(@j4xSySFM2GW()IEavl^(8=6!=St81dpzfeng_|wWGNc05H<>#_A1qqv1`)4x zS2r}7MO~8$C`(A=L#_Dq+no2}=|&7bpu7_fs)Q{()l2zI{up5k%iDC>=z}I<61Gs# b|AzPj>y);;G4<<$00000NkvXXu0mjf#Grn# literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_setting_onoff_off.png b/app/src/main/res/drawable-xhdpi/ic_setting_onoff_off.png new file mode 100644 index 0000000000000000000000000000000000000000..0eb7b3a2838ea23c72f455dcf4280bd03583d6aa GIT binary patch literal 1812 zcmV+v2kZEWP)wAK<~TOUG@QcBx*^IS@y zgr-p1LLOt@5@<`IEqy8d1I%Nfg;*5ChcpX@%2vS#FRiwu#(3LxFLUen9cRL*3yGjJ z^U$NiIdf+A{J!(e?{a2-N1d3M(AU=1M0GN|_rQ8#ZKHknNy$P`k6Uv+j)>H(ZSCa@;r-NfrQUJOEfPm&*p)30>C{B+Re- z`ug5FefsnjoWF*N@cu&u{aqlV%PZH zQlB@m=dMUBemBt3(J=tB3#+TE-_Fg=lGsp$%5a$E%uX7v93`(J{zGGtXCtBSF!iA16XvMgY+ znwy*Lg@pxYczBp587tFN$HvAoc*2q_m`aLdWipxeix)56#w2pbMO1JcJe>T)hYzoB zZEdZQG?;#cq(K{{Zv&ZDLqh{iGy?ggA9d;5LCAErV<#M^7K;F6FB#*ldl9uxM z{0AhB+J-}t1{}54)>d<6Wre}O85$aLAUif%rsJs^(5eIg(;OQI1_o}QG+88{GAL_& zeEb?t9cZ%y`6S1wR;!Gd?)>~beVU4>8JhqgV2%c(A%G??UApu+_&X6Z#Q28_Wl<(B zB#D7o@bGj*R;^ep3M_FLMO6fVL%)rxL%;+KE**M$dUD6@;Gbtwlu6mdKrAE-+ODP3 zX}LCpmZ^8{+)~`6?Er?_sTU zD{SFGc`JWER!X}j7OH~&P1dR)M=BSu@(A94Qf-JTBE%rn8W?&Jfj)I@XJ+ZIt?wY8K3*2VcSFAJ_#IKz zjSa~?Eh0HMNRm$!HOy~^i4QUbP<*_+y7dd%k~GoX-F+E=>b@I>367+sn^K-g=#?Z6 z75~_dut5Bq%PZSo6M{fAdLu$C`$RW2^7YkK9Jw6ZcS)W^N}Q@(UH)h16-LRkhoME& zV;Gv$CTW5o&i7-{pxG~#=Be1uha^mX%i4cAnloJ|VUX>aAT^4I=l`Pt6_5%jZwoxl z*brubFlv`y*bbii{gKtG`!c^tMe9)mvyTms0H%XY0hM1r*csKiW!cgMefhpg`sb0? zSkQ9e`Z#hR9sm+1Ez&bf-z4Lrd4P3~gguH2VWvsK_7hqiUl6Tvz6rPZn`AyKOSb%Df>y86P?KSa0%2 z?Zc<(!favsef+M3Z(+N@R6$)u2Hr$s*+Rd~Z1~8?2*3G9S{NlwfU7ad8Wj@CCI(`G z`B^;h$;rlt0S8+NhJYDL4a1$)si~>2U>^Br{_2=+pe)LyY-$*>9Mmo*bGgqVE=31uZU&+A z=Zmg9YZcZ$lj&JEI|M7MdY;>ClIA2O?k3iA*MtKv`EE+$MhzM zcq!lR@xG(R0Dz~8Vo{>P^hN)Xg->}uU&t?|ITbSY2Hhk zrg?klz`U9H&;Rqc|C!ylvsxvv1VNzBpFgj=ySsHuON*YGnsU%OXuZb9Mt5apCFMAd z=lg!zb=?#z#;Iblm}+WjYHV+BAE>Xde+l$f)O}j(eGC(N?}3N)-}(9ZUnVCfM`mVb zX2Fw(t~}^cp(}@Rp}M*{KRY{HgzW-s`)GZgG`uzf3qHDV)c>9+jhz4^J91J-1&Tbe0&s2 zvbGX5%;htgi~yH7z~HDJ9v;?*4jpn978YDCLu8kS3obwb)GB09H3F$QcI?>u2;|hZ zQQANd7v|#4n>Rngg;|EJ71$E+kkC2!QrJ@JZlHI^NjAISlh+l2rt&x3~9e>@&~oG+1$c0O{}1(b2bX;ii~vs4JMyCL+TK7VnD8F6<*t zTU(n82YDCd9grJ)6?m$VU77y={tFl%jtBQ7`mnXPwY9bT_U+qOVB5zY8Q>x%Bg58b z7nYibTY3tBRblU{20%67sT~*?IJ?t()@ERHPa7E-`49j;z_MI+HWS#bd2aL*6BFFO zoVvO?2N~wVNe>y80$^$04R;$X#!j2GO&{n>B9T*EHHR=Bh!f z!E@FJaCrZ2UBI{hNC# zwuvic0V7z8)9O0}ej-E!?qVP@#sOe}f=(E41YpQ6GMuKIVOs@P2mlL65g=_VI0@RG zTBV+AFY6|>KKX(@>?r@ImfiH3S#afqxD$)k#297+Ck+a0q)Pxr$h2l`*kmSJs+7S5 zfnt_XgTo5X9LT-c;+Kkc)G`OH{M@Pp%Nx-;g!Tr+=LEJSRSu%9k#1M^b5Mj(R zighifRxIQeoy;Tx7FL-M-9C5&b>!K~XO|64xpgN>0wxzW%%x)}3fce>e}*IC+|K%HbH614G$V5|WM z^feh~fLbF*1q3CgYrUSx2AE`7flt@ZJVyvqSq3?kp_%g>ry>&nQexp|1?g5^Rf^I8Dd~fQSVh0e%&WP{xc`<-;W@ zPZwfYtGW5)0G7)Kvn2t;V*LtOgx;FK*u)Yb>{~Dh9OqGOVP9zIM4;Hob*<8y?cROtX3o{(pg|aXFJ?kPM5(1|E*^ zi;0IqBLUUQkT(vLjPWQDEhGRAbu!8kjhGi%jhG4TdZru17 z%Y#SxyHaS2HeoEw45KfJ*uxk-mLGjd{6TIa_Amm*VzUeteCbIx_ zg(uNGk;ZxD6U#K}wx`~-N!#>+z9c5Y2$;>XB!7&OIKcSHz|+s2m_A!9%rb%&|N0Q3 zPd}(Dhu=n^@e=~vMYr_HW(Q7p@I2RteP=)FMxSi{hewy6ahm@L|G(`wa^A{!jKT*#LBlh^LEV zNX4ADR}Yr8DDbde2w+YsT(E%o?f?H72fH3=9DKLy#qFmRMXj>}v_U~EiUFR(Rr|;fR-Mt^HrEdH_bUUiIzfQ9L3GdqDrK``fFIu$K zx0@@kG-s*1hv(tM|6#6kQOqSoK!yNGI z!f|iEsHwHUlqQznl3vcuJ=GI`_BIGnWePzopr07Gc{ A8vp6c z7!>pY;XrLq3b>6UcpqUn--{ekR(!LXf6>RYfxI{yD2lTHowzli8@B>X;>Lh!+z7CV zYXi1%Er1g*1i0~BKqCGSkcwvllJPr0I(`MXh^K(7I02`LcABBdn4?K_9u~BLyONO^ zbt!~^%XRqq&5d5Zp8#HuhID*X9U9tnWS5&b*J-F)Z@npqX7L|EImRZNa4|$g#fj6q zDL^+akSo9iatBBwnSdnn5RgK00STlK;38T82hj#>5hK6`F$PQ#E5HP?26Pb?po6f1 zB18npL&ShAWV>1pM1fnx5B#Q24<*002ov JPDHLkV1g2}rHcRn literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_wallet_exchange.png b/app/src/main/res/drawable-xhdpi/ic_wallet_exchange.png index 2b0fbe7f19f2f29b17adbf5a567b0b2b435ba6d2..d76189f0a8236e57eb7d23799bde95c345206319 100644 GIT binary patch literal 644 zcmeAS@N?(olHy`uVBq!ia0vp^dLYcf3?viMZ?gg^#^NA%C&rs6b?SkfkN}?$S0Jsf z<)WtLqN)iZfk;KeRl&ePUDFl9Rnv4<({@(V0wNa;9T!z?S5*+(SzQ~%*3j^PNT~z0 zYrCj{b*;1h+zK>TrX%SS~P~LyD$N98H@`>+X^^ZxL8E0Hu%9Qtc-FLn%{#ikb{-z{clz$}BJAJ*qV=Ciz z>yRber?0zk&Yt%4eq@m^10#e3L*;iC-t!cDw0L zP)|>}ecC%~Y9Sj#T+VM%)%TY|UmjG5t?E7=^k&7U&(G~x3;%n*pRXPqeAf4d)H#dr zXN-FbkLqpqp3bp4!TZ&Urh@zn~_xP%B{87sAKD&dnB`4E+r(>b= zoIHJj*~a~Ut2UNyf^^~-dAdt860 z?Sc4qi%&m&a#o(&X> U-{f;s02tE@p00i_>zopr04o9zSO5S3 literal 761 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAF%}28J2BoosZ$SRn+EuVxB>-L zG@VqnT-3B&RkdB!b)40-fC$KSQ3sLEYML%!Sr>I}H+3ynkhrFcvW}aYu8W$svzj(Y znS+A^P`jF%gC^K0b!}G}8B29-XH`uX6%|jAX_`RoAidh!?%LWwW$r*W&^i?jR}~#6 zAX^2f7;LY)HpptAdZ5Wb5mm5_Dj>%=1MLM#fswkpE6`pgpkk0R5K;uW9LNRP0yG&& zYHNpr*g7D0YUqHRt*Qz10@zbP1)8qvn$8Le4(jUGKyQM@LFTBdyQyn}v;!4@oB>h~ zHWSF!1O<+!rrYw*37)`!OD_rX3uZ8iDvs2ve6)UP&$1nNokD+S$|{+rO=p=SBEQj( z({VrhkB;)ULK2eq66}?)YULd{kTYx1gp8Gjn+gsee=7A*&L;7e__^%ooj=+B2hDca zX_qvAd0;XJ@8YoUxr+Ipyf&}s-C7!6q!X^lZwj>Xzo(01NX4Awga$@8wX`&`Ft(Bd z$Icx*dGzSn!>8Mo&gd&>uq1MJD|B~vbtX$NicNQT>h0xtR?sX49$Dpwk!BrF|tN_l;CH7>AyEG?0oVd2PQTgxnA!1A$o zhQy4W8-5Fy$lC7BA;PfRfwl!ZHVx*(l*sQB3v}|A&v9Pi1x~1lAQE7V2gJ45p@+cHIASN)H3vLh978JR zyq$Vl=#T=BYcmT6zw5L-Zs9qD+ni!qS%GrE`m1Bm(X({G8ADM#71#9l@ z|Fbv8=Ic?;Ps{XW=k_FhIv!B=;qTi1zOzA}Up?`^^6+iA+S87riFG>#xtAY_Rm(od z+5TgKsarU6#*5vDWhRDLY&-T`Px*NK%;o@-w%hv4gKn5RuloL*NqrMnS4Q?4cc5Pw NJYD@<);T3K0RVxw$pZiY literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6jKx9jPK-BC>eK@{mH|E?u0Z-f zS%AyRG#{v0xFpCgm_cFv`~Mg2PjC?Uu;D>LeSSl~{e;6F;y~$iPZ!6KiaAp+ZscoF z;Bmbet|`W~;>Uk^ZL1j?S6hrt%U@hzGOS0LTp zH?O;Qeplc8uAcc_z4QC~p^VPHc|a~usuM_d&+qD=-w9R#6oey?6qwr%)CDvF$OWqD zoA;tJpaf{NY)Oz`FoS>n{`3C@^4G_|ztG@d5ODuM!u$vQ1s@b9Y*=8wPV(^!pu6UH zx;TbZ%-I@xyR2D3U`gXaj(ZAWi@yHfzj?J>5NE=dg`X!hSf@vd%}9JB8*hG&Rl#C^ zt?NO7O*@ni?43|qwz6a4>Rovf*{^n8G6_v>yHnP%(a|iE_rg}qZ_F=*8@I9Vd%Vih zU`e=a26w)7220Fj%}J(wN*rE{f6r``tj_AFt>de`VBod9@c(Sv2YffD+)w=SSnR~L zw-*`q<;Jd4ujYBNtn{URjKx9jPK-BC>ePe80(?STf%Jch zLD1adLqLPXOM?7@83NA#e?MPffkVNA3knSf^6UK*KHRsDKbbb+CQ!*FPZ!6KiaBR5 zISMr^@Hkv-(O~4f%Jued|E;_xj%k_Yf4S8jOCMlm$arzZB>KVxiP*XEJ_iq6Pbh%QtlVwj*R|2z{eSyO{t26F+@w1; z?LG1(&fwSSx$gTHtzj-PIk30JX_A=b6vHQP1HaE%?VfEpH{R2sf^q2qc85LhbWQ?Y O$KdJe=d#Wzp$PzLC#(?w literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~jKx9jPK-BC>eK@{x&b~Ru0Z-f z(O{v+>e)aI{3Stt!3+rp7EEw3P!OO2g`VT#TEpF7t diff --git a/app/src/main/res/drawable-xhdpi/ic_wallet_top_left.png b/app/src/main/res/drawable-xhdpi/ic_wallet_top_left.png new file mode 100644 index 0000000000000000000000000000000000000000..277b3d1244f03e5dd48ec4b96427d9159f6b7ad7 GIT binary patch literal 1197 zcmV;e1XBBnP)dZN>bjCTq4(UzlK3_FN`sM|9#fl*4cB;*?Z5~Gg9ZP|NhqcZtFX1t-bcQ zPKy?X>g(&%;4Jt8;?ffwc7fhDUXY_315SarAS(UB@FG|aTKX~R90EzuJA#b#1Dgi2 zN>Eqi0Q#{lQ#=+DcejaM13v)Xntl}47NhZCvN665ADK#}YSkxxf7mV10ek^F!9!3F z!l)|-bHFfTSfzm42BO!XXIO-MdVIGih@o-Tj{XWG)AEkC@~9l2GH}bpxU7V~n$EVU zL2}s9bf2E1>T^qTh2@q!+TYxn181trrY<`Am2=&iXsBa)%E}C z#8PD@s-PYikZDGL;-egA7>`FPFAvh01%87xW#K-fjLeA92jgQv)tJi0a^gILtGF5h zQ^}bEFToaIe+12fr1CNiCK{^^N_Z5V^Prs(zK6Soj1lK$s)x&g-4gpqcD`%P7;ETn zaAl2XU&AL;wi0j#cn^xDBLrxlD;eao!Cmkh#35a&wgYb;YnePk(4EFipz7W&4?TUz z;|2ON%4z%qp!HNsL1P;a?D9C0p;`fFe@uwS~lY?1x+ePRr4G2NO6gU#qyTP3JGs-H{FTG?~W@S1)@yKWtXyBG z;ihw#Ur}cjaX5aeM@||ao#S!Hej()(+Ll2Z6J38J6+_lvpXwkzKyb$h8>~RkxKO`! zA!SlJR^TVgJA!yUXupaWx5lx1W82M=um&U1T3FO%Wq*YqnZ{=j*akdGGT|uyM%r;B zagweM8oHZ2sEgar`_W*gbbRgwFMw)qm!6o8e(+OQk+V$zON(+EL=+NalL_=Z=z@Hp z9Rz;W)zjCJxD-rwn!% z16k*u`pr%xHl0B~!*7DlP6GXC+ig~E(=U^BPYOf;_5A*05%8o>*#AM+yiGFol4z} zKqtgnUrwM_;50~r_V|IDvO%W0byR_C;5&#zKQPvfCEb)c+Sq>p$E%-H+scz400000 LNkvXXu0mjfnVU2G literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_wallet_top_title.png b/app/src/main/res/drawable-xhdpi/ic_wallet_top_title.png index a73633b2db304a6dd9ecc6792206cef85c97066e..b5a358c14cf526059ab4ff3910cee95f645dd50f 100644 GIT binary patch literal 4702 zcmV-k5~1yhP)Px{7)eAyRCodHoe7u}#TkaXcb8Kaykf*vgD8R+MWX^cUkQJdA_OZ zufMAQ{;ImVrw`l8qg*k?>A0!Z>Q&@eT^-BnWI0v`%(nrhq?_llsnFCG>H*ubzGKs> zz*@_;mXlswYg=!Y6j}4G9%3)e*JfikHyJa<>AJDTIs-$49mm==H)~<-&;!XmVB6M8 zCeZR`#n!#!hS+Z=*Q~!JYvPZ-&FNNCV~wYYp1x+*VQ{X+=wuMQPyRA{Yimu5R#sJH zu&t3CO6Y-<9*C4X%{Q!Lh478FEsA?W_Rbco2ngSgbSq!w%Hm>c#5F_h1-`trqZt$b z@>`rev3@Pfm_cqUwzY<^f(}-+D7NNAF0`xDZaq{CJ&>jcB2%5#8)~fnOsE5?G7$c0 zU|1}NX7D@e`rq2i+;o~hX%jy(&na2|u5~?jhtX&=h+a*jleTGLO&D>mtuJKI~|STks(7md`=;IyJ< zR^-|X?a$I_B-9B#PzVoabqAb19nMxU^Bk*#F z#`r2sG%*k8Y7ci8yh68YK^Om@T=6r${*i44rZqLvJC1Wdcomd2vHcTvw?H0nISiLw zPU~(1pVSdw_uil|h{Hp*{+#mZG?i#uI(i^@7V_`ZR5~5@v#=fzm&Ivu+vT{|TpjVf z8_sm^!=xtqkF2gdy$<#Q&p`eiylo7FAFu~pF2iZLppN6jUE=H3V&Xj^{TkhSBc-M$ zwr#JW&-&Bi-(Vjg@<(rEB9W_Ls~_l=tDR)^u{{<8Tf9D{{KMmR2g%lHs~L za57&2H_+a%f)xCD=o~^?ZLI*aNw>}f)G3%4ZX2$bxQ`2Na-W=9r~By()^YY~qjAQX%7icBlca-&vhUCr;a>(if<6LLiCHGMM=9f5)oDvdvu{&1kZqZ` zy}s63$94T(#rYCFBP(N!gt=SNLnJtGC64UPracdS4rY=5CHZ-~-w0c8WA`jjC$uq@ zgou9$=Fm-GL}l zJ_-T_y`3pI9H=j{>6g0x`7`}-+WQ|idXU$ia39ivcRf<3KB}F?Km#-r>5uX*Afrhk zlLo}?kvBVYX<&djU!n)YT~G43U?zr|f-XDhLw1PB{~XZr=Mn87^7HZ-B(|6@tevs9 zim*N@@)Z0#_crqS#Z_G7rFBwyKIjfKcu%DrcUKXYTnTmq8Vr7$D)Y5}Q z5FclIb|kMEXhmE{8FNGtDYdQlf-^ykpxcRz=|JaLN72qlF$(o0sQ(lyYNNIu)!d53 z@mgzuIA4Ot)M;iA_k=Jv!x`3QgU3?k=nSi6qh8}xI)?CWa7s2ts8dRxPbSp=1;WpO zX5}9NBU^cq_(OIO@$W?U8BbpX)s8pI1uYeHgt#4C44LW%D}DGWd0Kx@CEpAblCgrG z$aDdCF&XL6IhgVrftF0$0VBhR=zQrt@HluE%m*<-eO)$w0_Y-wmXjHg-ZNJ0g{cOx zr;>eOI4;hYaB%71nOc^;$*gONL>;rPon6I4)2YS|ZHb-^-y*k2F5-3pe+QEF;4SbP zx;%<$YXC@g2Gyj$c2nQ~BoH5+a#M_rp~N?lXNa%mjO@Pz&LM7870Q-yA^AEg7@0u* z(I!EtcndHcy(4`2Ci)5yZATec07P<43fll3$<`1i6>Q4(OrRy3PQG=d7)V&3RASrj zpAxTvnV{;cpKW=R<8WRLx@%0m4Ix`=In)!OG}APsq&vWM$TuY4;B{~n;g#Su@D4j~ zlb7!gMEuYE8D8AXYH9CW?7t6@w2$5fvpqYl2{jwP=t0?9hKvAaa4Aosqt6RqH!vN< zOFP<-?e?aC_PP_-_7rP~RZIX_(L<{vDv1@e}fc2t-kxi1=^RrM{2I*OH*Y z5-myoJD+w(s+d0QP9WkxMxJ|gAWwuB@neMYGbz*l74a8?TfjHK=zc{!Ud#lj3Gqwn zHz(X1><7AnN!WEyiV5{c)g|Qp4Ri#Ohrl#9miTiXSwUBk)W*g{_59|DfX3Q-d20j860)$NU9Exp z4z?!}t|9Ni1Vu6^*OEshl-xyHgG@(c&B#WcCE^la8Q7Yv5M2e556PPwjmG|>(>FG! zE~PfjQME3!kP+<+Ic9sk#D{QoAshPv*wzw3vLqVB{2KD4TI#f;#)m*BjAzEw{yw2A zFOn~#L2kd0aR3&EgMGnvK5NGkUkbF0c?-Plg)0d2En8vm+k6|1x94$O*;OL`TA)V_ zwB3-si-n_a+d*+kmsdIrQNkLRYBMpR@*LAw-jIbP-Yr>z+-I<4Ub9;k0Nu zS9Wwr+Y_XF;-|_v3(kBNBfWAql$n7i*@4GqR;7MzwndYO2)q*euLji66%fff{h+Ve zbvdv>HP8}BbzOf@u0CpQt$O>D{sW=J^nCz%KaXa)HWcmd>D`DO+1m?TrUIXcWd1x} z(`QdI<%+YaTFX7{7Bt+?Rt?uwep_OP9f`$10sXP`AHtqMJ8&`xl9pbkPLj1Y)`{co zME?aI0a{A1E9&G_VuGZH2RGsUjP@tIxCV`ID-iK#0TJEE`$X1&Lrex?{1QX`&`EDk zpaI&4U?P|U?gaHoR}|_7O@OlcCA;#K*7d`ICJp(apdyazR79LF(JPo;cSmnsxUrxu zCmPrK@;T56EChWa#9G45QSg_$!$kN9=m|7??+!%#KLW|a(IDa14Dvdnv8_Xl7DO;n z6JAOrp4`33(-o7&KtB5ocnZXedsM-`&L_Sxg|wkYYRIq4Gi4^EY!hm-$=k2p+tnW; zuG#n`&z@0D7LG@6WU@k&kL{0$@8+fDlfRg_@JK(sn6qGw1{lUc zT3>2segF;zg}jpz^VtbINlO?J{~%BajsSN6EfZd*{MW?$gE^$1Ck&G9$lO4=OUfVx ze;#`O1uG0F`xuDmnk6+0&j#Z_t@$dE4H&8P&yx?fgJ%S zfikcf6imczaa;|E^F?~uK8Jvnq+982v;}K9iD4Z2DMh`3W`IM%<2biL2Ow?MC!;(C z9gS`RUFi1(>buB5`UW6E4+Y7j3k9o^6{eA|b@+kcCfb#qbASe8IelnOn6Xf=E6`Cl zUbIgnZ2*s>+DqM(WnD!0B6ZC9ikF>vfXzq2RiGSvjfG>eyA+56c^8k{t;BV4-W|P+ zgmSgSfpB2nTTH_s8~!nBBENR%k)Q$xm^CrUMi(ss&j9)x|5C6-J)(~y+%&Ka7)QQN zRucrhZe(r?f=+r9^!*vs)x$1h$-4wR2i)ZkZHb&3Xx+ix==j(2WF;4Le++cQS_B3g zP4b$7D@o7w^287KoWx5XMp#DMI_l(GcEzAhJ`1wn4Yv)~wPBXNFrg3`s8=vYqYeA( zkw)a#dbuxnn4OT-OqTDS)3*n}eV~p6^i5=c8XN-_fIou-K~MhFY%S3eBAF!2qSVz1 zpz4ePuK~@z?#Ur>ogiz%ngC7)Z=)~&1&U`&ec2r>1?PaSas)vtAGZm(pBI= z%60;~5Et>a#7ZUdOGbii9l1>3-AN@Q1NA6-oOUO5!}Su?(PvdIzuBo|q2JSe?|9VF z^_a_lF*|YzPUwT>O7IKt5b2nmO9_#g2%zt;5~2#b+m-hwrIKbd!Wmqwd9{jTmw%70k+(SC>b>Jxw~~j7I8JNN)j%Th7w5rj z-b~P+iRu`lqf*dJeINO{Yg4xg%mt%C!qJPop}@#TM2=D?33mZs06he9F3^maQqb80 zECTO=qIhNUb^up{-AozrZa`02eFDaSolKbt$vX*7IP zMO+rA#cluVMPeG^O={&*08?WM8Xk`M&}QCv}b0pRnD{ z-vi>TxGN5e%i?r=uM>zL>BZ$TKA@!=d8pXk{lY|ituP&WU^DiBI4kao!{V~b>A3#J ztnvM2;irK7-U#DO!2_DCp6I)%9>3I!!6VUTGM;W z8_o1pe4X>eYlj3s2__dLEOq>TQAK?~%Pe~^yijM#ew{ELdZ4jAAWn*#W_csdrXs!i zn{=t;-)4OFUeljM$v8DSSye~}jGls-+ gE~qD`q>~T%KlefCh!PcM1poj507*qoM6N<$f-naPy#N3J literal 1922 zcmV-|2YvX7P)Px+JV``BRA>e5ntN;&MHI$oZ(o2EiUQFZN(8JCO2SKxL_ zdy=o`%$YN1=bo84Gdo+$1km(_cCNW#hT6vDTeitDmdUnl(>9>lRab3U=B%;J5!*6{ zEMqpBG_z*Tcx!({fxs?4O)Inen_BZGwYeCTTM@I)PBjNIE|??HBI|7YR#&e!T57kg zN;BEkMbq7`HA9%J1w>=NiI}N#3$2~;B6C^rSFW^EemHIxFvEv3n$bQT&5{u#teSX@ zle)waP#kytZN`!%qO6EDeLI_pv2m;y{OA%ptLmKj4C6Cdt<9(x$603*yHD1HiNL(Y zc4kGTS?`*E*c%_=;jBmN1`#mYHim&!k zC*D+En)#e+w7Fi19B{|#zu1+;qA{dtCoRprx zxAvD$H5ft9!DhZ^Bl~#p>cy#F9aAnw_po2*$>`gG#a`Lt=+=Wg@PeoFbM(tVFTbuS zvK!}Iy+2vgOYN!TqMSJstO-qV7Pbu?Psg?#oCKp8l!O~Pwuh{~x(_cfNPl_$$4QV?y0&m;L(~&A^0tN#Gpx$i3mj-4a=zy%5)&tB2 zAA&aE91v-*V&0fPz%rl|BYqRmj2%gPU4c9R4kCAB(3ZmQqAVZFf#@{4S?~uzd(aE) z1ABl*R})0Go4~igPZjt)hD`^Q-Tf6ovTh2PiaDuF|7=|u1T|=&en10t39IOMyl37+ zgML5(QW{h`QIJKc$Vxe)6i`F?1pEX6IFGyyc^mRn_++5=x*kz5Uja+OKcEySmC4t9 z+RcQ|q@4zG4rm2>Q`RKW07`!?C;>--=mww(t5u{Ga}k6l#k-2Qr-p8kz>vaXa<$0S1;;JhO>;tw;51;9;QRl3Qh zoi?aO6CHWA(T!-p4{-t#vh5?-ed)8+tgPnQ55Z>uEq$d24T?@PN?kXDZlIH^%YiG6 zd;)F+HQ0@UYtR(*@4#$u2o$)1N35eeu~&WV4bu^gbbFS1-3DoCdU@O7eLK~%=&7ctEg7?6B@HOb| z%7ft(f!Z&mT{T>@S*t;-K(qRJ5KBE!Xz)B*OPkjy$k%P2G7Q(vXDxA0#oI<*fzs&n zFb(}Sbo?7SkdIF3qL{KayJivo9>sxXvX=GJ;C}EQzIVVCq!d^tPH|c&WbnN^cu%_T8X{sr84`ez?Kad@B@Z|zd&9CW}&O_(-Zs&2B;By4A>5I zP0`cU>5Wu6y`8oOdx3wT)K2dJ8-P-mL&&pK2A#kzFaulzbi~zamQOFg%Ln)JwvLrL zO~qn2x)RTK5LcWPZ`nCHOcy;I=*qKNnOmE4ze6V!s1e|8W`vexvj~5k@pC+p6Y4eF z+F?^68_MmGPsQ51c5SFT8>deCbAG+-(bdN2(kZ9;b*@~Ct@e*Va_;uebK0^@fxd3l zZ6MAouQ6S?`WzOGd2pcDq(NW=qL=RUwHF=su5#+~lsi)Mtwl{KPmaIBmQUv%PsP+ zBe9Rs$Cet~6mT|8{?k-!aC~K6n(F=2l-{3SFSLI3nOr9R4}VRQUAdLN#{d8T07*qo IM6N<$f{?wFCjbBd diff --git a/app/src/main/res/drawable-xxhdpi/ic_about_us_infua.png b/app/src/main/res/drawable-xxhdpi/ic_about_us_infua.png index 2214b00cd72ff73d058b77d1e0028cbefd78d572..8e439f24b9d8d05f6ff69f6cd72f01f25e234cd3 100644 GIT binary patch literal 2487 zcmV;o2}t&dP)iL?Xky>J-&=@se^GLYVD>`P(mpXkXq4J@KRL> z9uSwOqVUk7@+S}o@e2?Sh$18;f>0|Zs+1BT(Mv)EZDHjDJU9;g;O9W%2m%J!K?W;;Qlv1l1Ryg$sG2npoeyCoRs!al zJuHP-1I9re7QoXJ1iat9@lKRQthUqI$)J7S_dei#u0UV*Lw-FJhFRvr;sdWeS*p;V z;nRmdU%&<;KPn z{n|sYDrKN5=C%j!4_M=^0In{q;h)n>+X?QT)&~OtSo~AqC|mR@4SVS@iK^Iyy-0rc zZ7y$(%-k^GMu;`mr@kKQPmPWA@3p-tyJLM#T1!HV6^dLREb@jjp;#b@XfT8r7j;`W zfX;XngNXzNTAI)skD#k5g!U-OJ3ItQXmO*0pIv+#D;pbzRxBLCZ_bWmAQnZ*a!ips z!P-U{bGZ^`(>Y9MbC_7mU?x*Qx>QEKSVg{EMxjzdNeh@IU*aUjMehP&L#JHD)5m&n zyo-REVn{Yc(9;}7H}AczaU`2#XqH$kISmO$&yMj(S}MFRXUlkz4$v(j_IawW1O168 zs~l!sp0y>IZBRN17?6wk0%p?dn9XfqHe19(u87H84yl$HcaRFF5N(%$JIk$iUk%&i zD|q3N5kSm}rWg_33O^)eN78mr!LzeA^xE=%Y+?ykOF3n(-&dF>^ z>`+zvU1bT4JFPoVl)*+YR*2h9kRCa^QBOcfPwhE5vM}2jpjXS>pLyTv*6v{HZHL?) zz`?qf^2G`+P0irq!~!nQt}y7RZyy;3Ge5d;6{mX=I6IicH&Y#Giio96UYYXP&0yct?N@FpF!CAoZpuw^724be7pv8W%sF z!JAAY-(OpI*l`WC5#}T{d$S*Ijp1ZZ2fi`bi_?8=7)>;xDI9^xVN4q61T0$s`F-^P z>_|~s43Qauq_meA&fQqsz?<`{xHvh7t8-~gW^%|VFer;*jpJp8+W_i}m`dmC=4Vw| zMwXSD_9!GqcX7t;sdxS=1@uY6&Cv)(+Y=aWiD0}ljx&8pJW647MuJAhpBz!I@diuiYv^CzF;4OoN8 z%^5n6Fo749l?b*rP$NVOVXo^F+*Y3Zd<+IF^iYqox~fntH?7Cwt;G-F2bjedAv8l{hr!2Bn)$g z*47Unz#K@eJlxe{*35qvX=Y-O5`KVb+OyQ;cZQQ}Z$n#z4y0Tn&T>7tpkPe!v2|9D z@5Wjbgir{A(?_d0H#UqPez70d7ScFRjlcZvM`l-WwLU~%#=7E^gS@=_gYLI4K7cuh zn(AhgE7o(+LoIHjfKQx3>$pnH?0xi;Z zjJ5iERgw7AMP_f7R23b~7M?#bjOULJ;a^M3XtBr-t;^N8*IbPO=42y`d`1-9>j9<10f zfQ*nGNgF4|db70D!@GRiCFf0j54PS1ya$!Ct1LCXh8e(nAJb}0YhCd&j>GjH&RS!o z9FEht34}AIR}exSj^@zo5^Bs-9Ct)=Ry1w-%O;KO1^aBm_4l#jwZZ)@dd0*&0=Ezx0|y}1s4sK z`m2^8U$q2~;H#D-)3?Dy90T!YzKw|Stps1SgzMQ$fWY*srMO8GilzTPwTyu!y=pO= zy0HSCip=v>%N$eAsr4KKo(w_eu*&gDsPcT}viViZ=~Nfvgpr1{>)zMOrB{ z`dZhe=!$Xulp0ntfDwqJQPugB9J8mNy!wVuFaKt}-_nVQxU+41`!Teq-7JlR)vP9N z-p%O^U~hsA19o%a-DlF9!A4qL-WuuaYtqIGa;=RshR!gi-i!a`;SusCMOY@s^fqhn z6OTx2)Yxu=T$Q;Tu!zFhfgSY+h5lw_L|HeZtWqJ#9?Snll$*eKI{5Vg-9 zcQ2s2b2e&p4LdED@P5DF2fW`k=*NEm`t`?QDa0BuKXo}QfKx*Rtl#wD By;%SN literal 1585 zcmV-12G043P)t~TM`9^mzNp()FC8#qBLnCMkaxwQ>`mkcoEv<;8BPPX8A&^pa`!^Q9`+iv`;engCp8l||CT5ju%Q!(I>iy-oyN zPT1%gD_O2)3z$r2l!$G8er(y~LzUL4GQKi}5>ojB68S}xYmL41y}54(FPQ=i*zGvB zGlJnBH->y}^m$zvV66CTR=9cg9c*?YQ!4Q1qsb(W|BxlXI-c1+gcnB#Q70C$iMUaW zRH$jlRmw;%6p$w1SZ)zla|;MM&69~SKx!TFIPuQIduSm|SxFNu+1H6;n@^rrgWu^; zhLB;u(}qExi-uq3U$&B{L!uRHWULT)g?$&5R+{LuEx*P9$s&i!V_!Ah;-02`2#T^+ zNcH8pX-rqBF(3*%=mCedNr{ym8lBFw4ZaQQtq(w2TVhg3oTze|dR}s=nz^~3n+GWI z$PlR0RX-;4_%@bSCsg9<^o?0e+?YpI;?~aiT8Z8N4sunHb=qJlek7;x3col#gKwrX z_ve1>M7*p27aDI9ge>3kTiY4TV#nr1?o_!7{20S(lGezx-1h9W7hzCLe zM0~tCYRo+%y*VSatfqJ)fTCckSi{fp1kT1Y_>z{oGGD-axq?OBFnY2jlV*e6Qp5IM z4_pp6eodq)tB&2_Uew5YF_TBh!ceGI1cgdj9=hCPvtfh)ACCrcfS~V+gb;Qz6b#7F z#f4G@<0sG4Qgf)%owXVTENN+>RRb;u?&xvhiJ?9`y(@~*fCukgO5nBBjAA>wV+gP8 zjuPM^PW*liUtCW!1PYidmXTd*H}XYHr1G%-bPc-$UYtI14?K=`IPD|U!bYX<9UjE@ zF?oTKds33GlU0Wu_eDcE${XfUYQN$hTG1kwBB^+x5)N)M*58A%(49EW=kH>(_+&DU z)7KKXzEHwkp+FBaVROyC&0$EcHX=iScB>VKhkNn%1Q6-*V1K_Kj|~U$)V4u{{a#`w z=qfKY2~j~LacV>>@m0scfgT);_9C6zf)jtn@zwPd&Lwl0;^BId%9NRVS#1oEjQy-s-g=oW5H{ zw5TX9sip(zk==n|qo+(QD9RNom9>>yG)D6)h3ZR~N?RsL`pW|b<(4YvmU)~08Uy5J zaTb)v&tAYVi`58Qh%M}qf>qNCR>riQNR(KfmTalC664uo1=GC#L`nW@Em*51B)NB* zc~BLsd@+0Dz^F>xdX8#B$F4CzPGrhuyniXqo&AKCPwXe_`(~0+ij`$rPaO9T6w3K@}dJ*nD2K#%ODAGBpQj|4vJL zs}n2|TV=_56M%Jid1v0gdEmCZcKRH0jkJR^2T0zi+l7xG8r8#EH>dEgJ4x_Fy$&;c zW){>Bz{nOn69a>>GHw4 j+ek3+OTVSt{~O{T!9qp_er?~z00000NkvXXu0mjfJ1z3& diff --git a/app/src/main/res/drawable-xxhdpi/ic_about_us_logo.png b/app/src/main/res/drawable-xxhdpi/ic_about_us_logo.png index 64f2c4cda2b60ae2ec773c0f2193a290476a8952..ce6055c56e702819391e8f667a1508578746b8cd 100644 GIT binary patch literal 6407 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 V9V@#qWT*fD002ovPDHLkV1h!<(B%LC literal 4073 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 bA6@o;M^SJGv86^x00000NkvXXu0mjf-`BL) diff --git a/app/src/main/res/drawable-xxhdpi/ic_about_us_nervos_network.png b/app/src/main/res/drawable-xxhdpi/ic_about_us_nervos_network.png index ba856b5b0330021ba84ac6fc49dae07ba75ee554..9b46559e36dbc1c647b38169e880c65f9b79591c 100644 GIT binary patch literal 3517 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 literal 2221 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 diff --git a/app/src/main/res/drawable-xxhdpi/ic_about_us_origin_code.png b/app/src/main/res/drawable-xxhdpi/ic_about_us_origin_code.png index d213bc3997389cefd4dea6ee8da71ec24ea4b6a3..8dd7638aea3e34a170beca97fbb024ae3abc2593 100644 GIT binary patch literal 1277 zcmV1)(L7{;GnwN+aYr1h*?t3|A$s0gB<{opNvezD%*Unbfw zD)>pPc!HwUQmt3xBbA6pK9;OTvk>9)20Bcn&d}O6x{_nx(+R@xa1*AeS>k zcH2%J@Ve!|m@yLS&SSv8mvaMErBek=b(hSSq4j?PZaq?A#|bK23L z^X;%^1x%+=q0KuYTXhM0NK|7}SsPf!Zw(v;x=ysrO${t5`(4}IRj|BkqA_P#jcs9B zHWDxk1}Uv3;CNg&m)zxqJe5_j&tHq1l!&m5DKan%o6x&A_*IU_X)fxH6VnrWMB}K# zww?vPSmdmX!vA&xrW+HwX0q>`Yx=0lwq>pmz%y#3KPu}AOHab3yAgUojGC&%VBkTI z@6S_rp4|4v%$9RigWrMU;?F4b!^bY%cC}c58AR8U;h~u7M)|kF(>{QoxXigq7Yl@{ zEOt=0m|xfZi2+kx^^AyP<|yjA!UdI21lY{opz0nJ%>USz2=IELu6jn4CUtp1V+UrR z*`(!en$%4MxL(}Fq%n6@y2REkDTm#nALbJXj)szY0;tXvWf?m#r)@X|lvay9htmqG z;wl5HE0NV@S>dcItGM!f`(v~iS@Zg2cGkhkn&*2xqs7ST0jq~(Sq3Mg2TVx5#FS-d nvXPPIy_qIg<$FC@e--Z!qP~*obgiAl00000NkvXXu0mjfeuR87 literal 869 zcmV-r1DgDaP)E7{~uRy{x)yFBoOI1!`Ao5CnG73&CEcbyX2WWnZ9+ zK1!cJ=t}7I!d^fs(o%@Z(j+QMC@?coS=%h~Wjp_d!_1Cz&Yan0+PUz#@ywa?oaZ-rFj2z+5}f zxD7~d@P;;fjufzIJCJPwre=ZBk7hvLR*?c8-4Co25e9~V#U*cOv**YFsa{)!>hTjo z1GZ;@=EmT!_o}xg4IJJF)Fy*{-7P`^b{qsw<$wci?k-lBGg7@7C-?YKCyoH;I{+R8 zOwAaOa8%{%G|=}<-@R0?|CN(_W1oN*Z-LefaPF8nq!FMS?&@7&Ze9&Y_5RIVq23$U z%;hAx{Wv^iAfOj6Ur@vGjh}kbV|gV!q!utNoK)|dM?DG1zY_AfYq(RIoKymy&e>{w z7mI9nFA$_0gG==WT)D@3uMzUrBVhQwos%a;ER`t%Cxr@2%l5KRzggw()XSNxQ_pD) zr0RgJX}e}N?|xHSRss%=05=|r*;Wf&JZ@iPN?l8zs2)!(Cc8#jz;$)n>*>%aaDS+@ zFZYuYkd0n{0Ioj(YBt*I7jIjBR-&F*PIN}N3j%I;13^+ycr#rFmj@umJ?wO(9xp2lEpnTu0}RX vb%croG}$cvnjYq!`oF-*M7BiS{|)gM^n??7Wd2CU00000NkvXXu0mjfxwMW& diff --git a/app/src/main/res/drawable-xxhdpi/ic_about_us_server_pri.png b/app/src/main/res/drawable-xxhdpi/ic_about_us_server_pri.png index 77f1b010a16c8c8e3e7246c3d88afd8f5353750f..4b6ec939f1504a7620bd7ec491881dbf1ca8c669 100644 GIT binary patch literal 1662 zcmV-^27&pBP)LUu6%K?gJ#bPA>kohH+ntfujy zsi&rg-uoMR=z)itp{7!&aj+su0xwj^fQ2`_E1C*kK@0_@?|0T&u6;O=d+)_j!!o+379n-$jz5u!F>#Ie!w?-f$zTo zPM^4+FrhqI3xKujfvJzc=La^C!4e=DNsK~1a2iik&iWw+{)kbq3Se2Yu|k5?=ii`W z1+Z+!zHz@BJ7JcbJZjT&QfQp#jXA)RqLyKg%>foI22y7L|J(vP4gsB~!|rbM0Zy3; zRICMZo(TrGe5HUs2yEL7-0lxfa}bKIDgAgR@cu`kU^Sp@8HDxk0P*hm6g_|`{%za@ zOi5AjhVB7}+JPP0fxlV-E%IkR3B0~R4}oLX{ZOT60Qt*-jCp<;6+RndM-WFiEx!xy z=1q21K3gxobNRG=r6BSVRAZmsYp)yOu9{bphj--p z7lDQyz>VuFW%3l6rtbntqTP_LT?M}U9O&&)Vg29o8!$apwad6w6~MtiMXS4`bJ%ii zuw__1Z)^mLO5A~ERmVF7tZ-1%nm2(*r>W4bKH#gWP_R00{m;PVZWT(N49uIaQ*67= zIQ)X>mQUrF%DKk&H33~0fx!V2Kbnv0@a|oc$|bQdTZK8@w|=cSY;qW1TpTcSmK;$s zC=iz<>Yh`w4|tMfUHz)5fA>zAnsp}Z)W`F+tlX5^(-5q+ zaqv3N=#XvKKH#i{KytFG`05p)Q2>WS^2|v&CS(e_rKg2^3l^!;_oSZfTSM!!PJQNNdmL!)*3EkX4w4J94>&2n zT{gmF!!1#0ur3XD{^H-Ewe^YF2_jySHdh13j>!5SRN*lGo$u0NH0Cc_SPV>?u4?JK z3G5nWX;?YTSuh4**=S?|Q;I4sQDFK1s~j_<$;CW#HT49}Y#k26jV$1z64`YFOM|B1 z{VgMRohH`QG?PYQWQ-_sfO%%-FEicdF018Z6RUib#&`^pE?pRX7N{JK{v!vtxKuzS zsLpYxJ$iWLj&cT2Y}M4-tbJqRMg}msYq9>L@jnEX%5_R+COnFo?QOw8DSK1da7p%$ zC6^8Oi!EDWrs%n|z=@-wwIvAmD@Cr(UTo58wggXSg8krQr9$rf3216Gd2RZ<=P)~& zXIZ;@>O;Fm74y9h0SY9Ve%~EB?a5iKFH?VZLEdwi3W63PDPT~5&@?9ZE%x^VwcA41tu8+XuD5`f$nip> zoTjo0BW3A0x|EZ7H@bvnN_gh;2Jj5gowdHp^+_w` z^=qDia8j{1=Ws@*IYKBxMhRFBj5i$S`lJFtp`*6O2?IRO>kVMqimR(U@4TA^yqVH& zdJ>^B4*^GLp#QgK>~nZ<&~#GUr%g;`eAafY{c+H`eZW>j+T08WO^jjI^e0SZz3xoK z_5t%@m$pG=W|=!7(*q=gAzVce&_RzA%U36r`B2@CzL;=y)smw%!JVjNC ztS-nI-~kaRzWqX8rfx9GJAv~VLL`Vc6*Y1X6^1J53@|};cL7zOiD{-(J$cYJCNBXG z3;>7Qfw~{UHW0)Oefo)9w7Mk!loQP;Ma-~nogsY|Q?md|>8{_lEX1+aX> zB!CM5mlspxYMh8su&P~}ioiq$O>D#{q`pkktZHkX@So!S3!u24(0g*uvH$=807*qo IM6N<$f+i9bEdT%j literal 1094 zcmV-M1iAZ(P)B8I6vsa^wN@8<5D`=@wN&gCYDuk)2ni7pA(0SI-o&fF zz$;I-2SkF{LI}0YEAuhL%SLM!_#4y%vg1-Hst`=@x zg_ahWQv{>O!h&Krf6AF3qZOZEj|?bY0i#4|Jg8NkJT$Icz21;}{R$56gP%Xl>NnEg zumz^gH12-?)~eM`u(Mce<5uX^8yXwoZ51>%xhrg_hpI|5Re{js>?a3Y z5yuT?k~|9vp?4n$xv}K0IAl%jJ$(#!@0gkFUX$^za-9G zJR7;K#?MiCMpoG-PDaj(*-H*Vb*)~I(tGe#LQ7i|uQZl@`AovjCo>WVNWkyfc2>-G z;spO%?-yLVtNdsPbBS^#8DZ$RWSRH^`r<;>*>WB zC&j_sg^(@rPXqXo15oqD(a}eugT}iNo_V$^?l2aA>&a#|!PURT1& zqwuNP^nE-NBRFZAQ#@$$4?|Pp?dv8Ohh;wh`X{KaoGJ-lp;d~KDt``Tk3g-NB={$o zHvzJ;;iIIpJ-Z?UbCSrZ8vnOgiwMPy%k4%^)%&;L^%8g{Y0GP#*4=!-zXdgGv@<#V zJ^l&$u!f%{c7owA4jS*0iFEm_p{SQ29tU=UTGuHwGb9VcMt}zL+8R$qu>F$go7nJN z^9H6LbF`LgvZtn)zavey(o%o!0y9N*dqALd=XR;TEzmlza6Sa=#}yjy67m@r9Rz~#NTv$rxSYOj`NlVQrFpw-gfBjOWOMO78iRkFto5}lSr zza>h=ef@txP`?SMDui1w^uan+2@cH>g8DUGV_d31ISIEws{b3}H~PdN0BQz1p8x;= M07*qoM6N<$f+LXz^Z)<= diff --git a/app/src/main/res/drawable-xxhdpi/ic_currency_selected.png b/app/src/main/res/drawable-xxhdpi/ic_currency_selected.png index 5b61765693bdc446f74506d4c623736b7f2167c2..ca4d3d3efca33bfd3346847af58a65f51d9c1e90 100644 GIT binary patch literal 1739 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 t;WxBh`kj4Oef-+S{{Az5({277{0lS+J~ literal 615 zcmV-t0+{`YP)qdPH~&R9|3@|db!z{#uK(TI|L^Vp|NsAkdH>1A|M&O* zzqdQv|K#HT)X@K) zmH&%@|N8p>{rvy4t^a{`|B#3OMmM4mB}xDQ04H=(PE!Cjf}*V}yw>XV|H9z<+sC)y zvhddB(d+ur^~}NV=FG+X{no(7qn-K%2LJ#8ZAnByRCt`lmF;?iAPj}ArHDtZ7U`gN zTeoiQ{a@lT1V7MP|Lj@*@E|XoBqSI`n|RBfS-gv)%~Q(SE{fNIakP$O+qEG3dypq0 z1yYglMKBZSOk|J294Pi>#aLD51#ox(${K}|-Aok_auy_RpTx?N}oJ9V(>GaTS0XrQ6W1 z6p-yc9e@q05ePVs>Hu^L6ufAMdi;F?k`Lnini!v#3FxJne6#5}`DBFBJ{a!mCq1+I zU{sry6V=bVQhDQQXPO=kL;1J>`}V>w_MWAgB-~zM30(Y~?pcwJR~{CH;Y}xGHSl3( zih|tvM8gJ_S+^>!0S;k3Ic9?$6KLML!EUCN-!aBj^AC002ovPDHLkV1ke9 BL3scG diff --git a/app/src/main/res/drawable-xxhdpi/ic_setting_contact_us.png b/app/src/main/res/drawable-xxhdpi/ic_setting_contact_us.png index 9790c984b215b4538a9521b7505f955c5985025e..0f3b999be74f3d057a29218de296920e67385835 100644 GIT binary patch literal 1737 zcmV;)1~&PLP)5Q{uWrAk_j6wm^q0;P~rEL172^g;{e*6RAsbet(|+C69Qb4X8F z$v!h@_RN~~?U`A#)|$N&{uROq9clu2UF-&~-_WH~GfhbbG8O=W zKufzWj<0k{4zPJWFlQDJBD8o0OMDziVkCt)h2wQ(6-4z*jKmrSY~P6Id>Akl)N~@rxy8dh2^ji!3tyMU+q2u>z{(qt8ax}Q7)n4Kz@Z2pNdudZGLuJ970=YLZ# zsLm$f6IH;4V&N3$155LinKzys*F=%DT>#F=KKa{e;PRF6Y6Vx8@X^P{mJW(->0)5* zDj@q_H;zL?z_Avf{xHzlcDi{B=o^qJJP6zpV6$eb=}r4q zQ(_`ez8qMw1gJd#H2kjb1eXQ|IDH=Q?u)>Jxkfndd$ewv&Z=oUG;Hqa-2B-K}U(A*Zec$^*I>;oE47#`0(22ei)LB0TUt!)rtG}Sc% zr_bqs{!)VOxvY3_@2*(kkDqSs3-I#$RTP2Ddi#N&j%v34Q)>0SzZgC%3r*fn&KKZP zO9*OXZZ|>F@m9k#M-Uv0WQoo0-O-xf+i}!^A`L*^P7aL-6B6|AzcxA?s)dX+Z8)gR}pOS(|xtVs>^D~8B zavL5UU5g{J@k!+ojlL7vzp6FL{IpxI6hmbG9J|Cl9}!^gi8=SF&N!7X^{M;}vDZ}XuXJmxNi6X0jXs?uQl#ZfZNP z0t=!)=ubab1RVIoji2W=%;~JD`A-8@m&GEbbMo_X(~~WeDV;dy8L(~TXstXk>*(CI z`?h8B+M8#~d9fJ8HGY7}>reY=w9DNV-I&ee4QpRT5R#J07=vOxsW=@x45D>VgR zpuwgiCnaXK&o1$v_dLRyq) z1Ym$IS-7~YCpz|7Vl6S|Ovm8%hm>SV#lyC(JA*THEY=!|TS^<(D-q~RPXY96HPK9E z!2ZW0=7b@8#5H7{KH+a08@gSjsc*nuJEo7jWs?cm>vrK#uLKj)<%p)bUQJ~l#A#}6 z*STQQm;qj2VZc%Yx15*#T$Y1AVSKnmDZH|!Cal9L&m)^4DQ19+3yj!b)EedU${OI2 zQg!cT$=g)3UxM+X`Gcg0w6v=LbnCRC&oygrD{UQPxlxJLG>krO8Cxr|l9-Gz-8!BP zGXTdm%d;pQ7FsxR2uJbxFq&G`i9=U!WPm1X6%)V|f@_xRl*FUeUz^pIW*?#K*sI~GZ&ZoP8_Rg`8Xs+_4KNb|T z5hj?Kp{Q6_M5V3~%smpXBVh!;{$00000NkvXXu0mjf>uo+@ literal 1104 zcmV-W1h4yvP)n;(^p9T4|biDi6H% z&6C7?Uz#)x5t8ykB3ez2h=@zwf)KQ7s$+(Bj9`=*gK?QT)<56b5jkhy%whIFIs5GM zUDo&CYprj6YweTD7@8l${*zF93v}O^=+_%Ym%`#%p!-x)OD6OEPI%JVnY41(?$ran z{TkBJT++yit~iNXT4qfu#4X*~J{P1MaZ3jcNJ3xY33lm-mWunpxH2fSu+ZN^LXYmy z`V5-PG&dTc`Ud>p+>sUFtqAt%1&e0FICU4~N34 z#n9JCW-@TO#%ZeYAv}Kp1Nyx_?-IEyx|YZU6< z9@^U7ebj5aJZgi#jWgJ8%ST@{={i`mH_}62-BUOGG2ayOC_l54=+^$_}p~Ek< z_${m*zha)7FIin<#EwV=XHRxZr);Ol)Sr&`qmsXU!6z=q(|nPeUYUPfzSdBJ<#tL; z$~tz>5b0)Pn6d%Un>FptzgEZ*e`~x-VbL^&6-5 zK!P%j{7rFe!)CblZ;+_)zSDoe#w~EA*5ax8^k-AT=L8ZQIm8J#Vxi^5OXuX_BK=3S zTX<@H4!>V;V?6o(GeR`z?bbFsrV0ridqR<&E@24N;O#~?ed@R{G4c96d7k{B*?|%1 zn3w`pv_f4}0UAe$Ehvkkk_i^*>Fa&B)o8spq@YIsf{+672;ijo2 zOzfNe+7N=W8j(}2p(Ns-B@KlcJ*`eD9c(^l0%{w)-ssaB1(;o9O}3!=g1CvMrX zqg)j?W~BQq-#u{36;^SHdE*O0@XVi}3`G^3K7vZIJ%>9UI}2iBm7H6CamD&GJ8N&< zgB?{JC#MIERd#B^`$j=D_%2B&pP=3YCl%tB)(h*TLfq1No30nuNrO0vTPo>)L%ag{ WYZ+ha2R3B@00001ljwEP)M~c?f=Kd|LEuc)6)O%?*Guw|If|;y}bYG>i^*1|Nj2}e0l%+`v3g=|D~h< z_xJywod4F<|E{e6hlBt0^#9`G|M~g<^z{F)uK$IC|GvEc+uHx>>HoI0|JBt0o0-1k49&{e>NKJ4D<0M5Y&RnnC}2{Uz5c9y?7r?=ro)~(JY)w{Cq2z zPtZ6{QZ+D7VjP*Qim$-w0!6d#V21LG)V8(Z6kX0&Jz%x|S@7qqgO_1>=0@ zeJo5J=e-V&T)Ij-al<_5%(w9Grh7%zw2Mk_Q8l(U`Rt`Q9 z;wklExq^OpX~G3@eP$+iA;fd)!X%b1IHYbZ#0&EPq+e1ubioj>nfBT&8Dp=6sHqEK zF)P=GBfW}+@d4XwA>ORmIN_)Z!+hRuf-}7iU6Xb&oNgN%1uwY`I|BwbrR-HQkt+J% zf=d^S3zW9s5C4@TwAbb)?l!E`vu-MaPMS)m?V9w2h%M+Bsay%h+Si49WAIu&3#C#_ zk>!Hi$G6t5Es2vW8{cs5sbb7dE!Px-MmnDd(j-yYszZ@m!d3x9(RU=IH@=`n*iZl) z6?i=sU%e^?y$nll#n!?6J(zsJUZqS!8T3ro7AMR;3VGaMxSI7zrPp}e)EkZ)FvcUX z99JqO8xO`< g`rUlf4gMVb12yz<9bRHkBLDyZ07*qoM6N<$g6u*$uK)l5 literal 705 zcmV;y0zUnTP)|HsDv_xJz1 zy8nuZ|6N=E#>M|lN&n>J|FEzB=H&m0hyRw8|J&RD=H~yAj{kXf|MvF(($N2|tN(a) z|Nj2}zP<|KQ;NwzdE1>Hj-7|23N?SpWb4ICN4@Qvf!CqOB{u*6Q{D!r=Pb$G70J z@Ye9g%(vOrt zBpbmg#7<(|kWF9$A=!>eQBwC{?BmJf6YgWiH86*AlM^cWbY=&t5Z{7)BYdVI=E)Q| z--z=Hs4ymXu|Pup5{oOBxT=6TQa5q!#y7Ynmm;r#OJwAPbBx{L-eokYfB-!+OgG~d z9!lS9VCUsuY-qx;7_4aURNqU(<=G)jz z>RQ8Xu!J(2V{LQhR>v1t+7$W`W>x~yt|-aqhD|}+o8+AG6QyW`6IKV!syuVjbjm5k z%UKh+dVvmKv9vWWWoWqOqhQq+cr#(&@u5-Dt%5B6ERJj5a$JqgzH+l`#kXp|09x$- nz@P3{bLY$6{62mT#~TK}B0MTB1YmC>00000NkvXXu0mjf2ML46 diff --git a/app/src/main/res/drawable-xxhdpi/ic_setting_localcoin.png b/app/src/main/res/drawable-xxhdpi/ic_setting_localcoin.png index 764f62ad9065b70f462ec34a0359edd8ad87dc50..6a219ee8b0e414c52c382f42cc1e7519993db803 100644 GIT binary patch literal 1291 zcmV+m1@!ufP)ugW9L;U++P8O~JG5VN?%DU8J*@Anz1LoQ?Q;tL z3ebY58kdjVX%1-$?4UPpUM zI1wJwAK11Q=-DInCX2cO}EfC?-g+CHxq5&(BUbJf)5C)yv zZsCX65srKI5|;%~N`$*gDIPw+uB}0Fcc5QyfVO4-2~7!;$8!hL3zBNi5oJKdaD8dD zo}$i1RSj^iQs0P=oXh5h!>UZQ{P3x+6*XaoJT3Z`0vtn`#P^1z z(U;5uNW6RiKv&Y@e5DW;SJOAVcWDy1EQ|cH!+>$(Akc-}v<&$ABlMd&hgLuEP1V$| z)^POcN7EWHyGSe4^0$_`lRh)YG||`yR7$9adE$Ut!!O?%Em0_@U9e*VzyLxb6p92} z*8tC60sD?8%8}k{>gU=Z!8eO&+FonxOiRoNM=~&vuLVi8ZMBA@gQCz#2-U%0W0k*6L z5;^$n#&THgwphZ(P$I8u&LM%0=oKuw(? z`cT3(ad=wZ36mPfDuV_Dqo0;A$2H%(h!g5*DNdn$wiP>JhGs3IX?xB0Id;N#AB&4A zel!oJ<3=oFI7*81?ViKtN*qQi+BVa%6K12CAj)BR~cP5=K5)ntwMxX-s`Euym7Yi*s?gzwdvR~7pAk+rL6xHt>6Oj3M(g0g9$@6s}z zFaTHk9LU6U(wY!upe&ThMIN<=+2DsSz`;`{I+18G&{`;;|GBa5Le$FQMA#N$Lz&)c zv9h?H)m_@P;%v>|NjO_IlP)^Ns}8n63t(xnWTv?<@=|2{{YDgHOD|>-CY0x002ovPDHLkV1j3% BbBzE1 literal 797 zcmV+&1LFLNP)9v&{G5@7(_;dT98qcQ52Mf(ZvD_Gq0rOOnb2#RC3lFXCL)E^m~}uXRo#Q{$}m_ znNZZIZx9+=p`#P}hnQ7mXF}l;IItaZvLMtu5RG2C3PV36l6Vp_ZeE+;OlqY z->X&a;%#f8x-v1GG!_b3zYV2uwie0?ydvm+Y6L6GZQ<)p(DqudNUZa-Vc%9*UjoPW z!o@4@JChp0{9Ft5ygf0Tc=YtcwY%{4BV?q*u1(&`X;7 z*oYaQlj&QJ{ZW(IVtFcH%<1&uSZZqDDW>*QHSxjUeonrbCok-v5DT%-4iilpfWyPcOhp$iBii` zkbA5gY(*$EPe2oC>(JC7__46xyzefHziIfCOMMkC{&{7L%?c-yRfe#=+D2QU1_ z0~K(@j4xSySFM2GW()IEavl^(8=6!=St81dpzfeng_|wWGNc05H<>#_A1qqv1`)4x zS2r}7MO~8$C`(A=L#_Dq+no2}=|&7bpu7_fs)Q{()l2zI{up5k%iDC>=z}I<61Gs# b|AzPj>y);;G4<<$00000NkvXXu0mjf#Grn# diff --git a/app/src/main/res/drawable-xxhdpi/ic_setting_onoff_off.png b/app/src/main/res/drawable-xxhdpi/ic_setting_onoff_off.png index 0eb7b3a2838ea23c72f455dcf4280bd03583d6aa..d33e9c83d95a9957a3ce484679e65d1e72d7f510 100644 GIT binary patch literal 2904 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
6A6m*G1K9YV*Rh)Di#yV{78BUAw*} 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 WkCTmV9QdjL0000iA*MtKv`EE+$MhzM zcq!lR@xG(R0Dz~8Vo{>P^hN)Xg->}uU&t?|ITbSY2Hhk zrg?klz`U9H&;Rqc|C!ylvsxvv1VNzBpFgj=ySsHuON*YGnsU%OXuZb9Mt5apCFMAd z=lg!zb=?#z#;Iblm}+WjYHV+BAE>Xde+l$f)O}j(eGC(N?}3N)-}(9ZUnVCfM`mVb zX2Fw(t~}^cp(}@Rp}M*{KRY{HgzW-s`)GZgG`uzf3qHDV)c>9+jhz4^J91J-1&Tbe0&s2 zvbGX5%;htgi~yH7z~HDJ9v;?*4jpn978YDCLu8kS3obwb)GB09H3F$QcI?>u2;|hZ zQQANd7v|#4n>Rngg;|EJ71$E+kkC2!QrJ@JZlHI^NjAISlh+l2rt&x3~9e>@&~oG+1$c0O{}1(b2bX;ii~vs4JMyCL+TK7VnD8F6<*t zTU(n82YDCd9grJ)6?m$VU77y={tFl%jtBQ7`mnXPwY9bT_U+qOVB5zY8Q>x%Bg58b z7nYibTY3tBRblU{20%67sT~*?IJ?t()@ERHPa7E-`49j;z_MI+HWS#bd2aL*6BFFO zoVvO?2N~wVNe>y80$^$04R;$X#!j2GO&{n>B9T*EHHR=Bh!f z!E@FJaCrZ2UBI{hNC# zwuvic0V7z8)9O0}ej-E!?qVP@#sOe}f=(E41YpQ6GMuKIVOs@P2mlL65g=_VI0@RG zTBV+AFY6|>KKX(@>?r@ImfiH3S#afqxD$)k#297+Ck+a0q)Pxr$h2l`*kmSJs+7S5 zfnt_XgTo5X9LT-c;+Kkc)G`OH{M@Pp%Nx-;g!Tr+=LEJSRSu%9k#1M^b5Mj(R zighifRxIQeoy;Tx7FL-M-9C5&b>!K~XO|64xpgN>0wxzW%%x)}3fce>e}*IC+|K%HbH614G$V5|WM z^feh~fLbF*1q3CgYrUSx2AE`7flt@ZJVyvqSq3?kp_%g>ry>&nQexp|1?g5^Rf^I8Dd~fQSVh0e%&WP{xc`<-;W@ zPZwfYtGW5)0G7)Kvn2t;V*LtOgx;FK*u)Yb>{~Dh9OqGOVP9zIM4;Hob*<8y?cROtX3o{(pg|aXFJ?kPM5(1|E*^ zi;0IqBLUUQkT(vLjPWQDEhGRAbu!8kjhGi%jhG4TdZru17 z%Y#SxyHaS2HeoEw45KfJ*uxk-mLGjd{6TIa_Amm*VzUeteCbIx_ zg(uNGk;ZxD6U#K}wx`~-N!#>+z9c5Y2$;>XB!7&OIKcSHz|+s2m_A!9%rb%&|N0Q3 zPd}(Dhu=n^@e=~vMYr_HW(Q7p@I2RteP=)FMxSi{hewy6ahm8^PF zx5KN2YA60!bSZB>J|Ru7%cFlI&$==h=eG2=d+vfQH}9)|KWMtlhh?X&+LX*0k7eD| zG}1N{Z8mc>=+H{rHu)FJL4^RHgKwU^Fym0%m$XOFVb9SeO81hs+&`dT62W7esXkwM zuXX5FiLYh;f>)Ir<8%X0NYu?Zthm;C`6R&z#;%4&=UFF&8Xd3f6PclGk;2iZFO;}> zXK!S+<{U6^N+4^+4zu|JMnd)<5R?*W9UQ+46IP$-?_lKjM?t9PE}^ iR8V$Y(XuD+4{IokZuzN`=QaQ%pTX1B&t;ucLK6T1e_7E0 literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^x@L|G(`wa^A{!jKT*#LBlh^LEV zNX4ADR}Yr8DDbde2w+YsT(E%o?f?H72fH3=9DKLy#qFmRMXj>}v_U~EiUFR(Rr|;fR-Mt^HrEdH_bUUiIzfQ9L3GdqDrK``fFIu$K zx0@@kG-s*1hv(tM|6#6kQOqSoK!yNGI z!f|iEsHwHUlqQznl3vcuJ=GI`_BIGnWePzopr07Gc{ A8vpgly{IxoroMg zdzdyz(&YEauT7Kt=7jiXLvnjst=`G^V&2=UMNgyAa2j!fnyt>oOsOQ* z;$f!rqp`4o3`QwE6ha@YHYHx2e^A}8VWgbKadczqlYc`MnD*ptkdT9RVMswX7&4G8 zh6Ln-K?k{FP(eNzG>|U_1r&k-2ZdrlK@b=)5EKRk1c?a-L1ThI7#MF57RC#NiE##D zW1K(~7;6v}#tKA<*$JY?Yz1*(DnVSBjUZ0U8i*TH0{sU}0Wy(@Ng;}jfB)}ZyV%~E z2dTy~Y%uvuRfW`in9QnxHX^~w*pM!#(-(u2(XE31GaH3fD5hK6`F$PQ#E5HP?26Pb?po6f1B18npL&ShA zWV>1pM1fnx5B#Q24<*002ovPDHLkV1lZK BrB?s| diff --git a/app/src/main/res/drawable-xxhdpi/ic_wallet_exchange.png b/app/src/main/res/drawable-xxhdpi/ic_wallet_exchange.png index d76189f0a8236e57eb7d23799bde95c345206319..a3f71852905dd52f60dbe538b247bb7b86088b40 100644 GIT binary patch literal 899 zcmV-}1AP36P)vWB>pHu}MThRCt`NSlP0x zAP_Xs>xK#9isAhKcU}gUVi^=-`pKf8VOCm_1vVVC|YN+ZbiREb0 zSBW5hXAvZ{Iu^Dq>pIr9$3P!UGOP<&Z*1Lkqv8!C$#R%H%^Yz=wy=o@vAoqmKGDuJ zKx!bFWBiD*KzQ2b9!b(bp3FB%k_A|nyDV^)iQZ))GUdidw=`}*rFW-DmaeR99*A_T zMNAf%InsaQT`m_HNu7Nc=}%b}x> z6PaJ*!{%1nab)6saF*-f&4(e4OguLo`>^0;$B{d1{t}u3Y&Yd)B@uuJcU?KN+K*-1 z1l2wUHqy;1d3<(*C27}4Fz4=po)KQ{n`;X@J5)!m1}}2clXP{CTw~Jr*tM&pFy|`* z;?VFbn$esuz#QsEHlydTrngWJ2u&mu&2sx{njzvcUfn$!#qcAV`$jRS$sf7+M>NFA z%2=%V>tylQG;ZU5oI_tA`_+_SjY2iVb7)20ul)*XTgh}qqiwvkEv$)hDX4uArO_J6 zzI;Slx*yPBg|_XoHxBfI@xf`Z^IlAiB`;1{Y*9vvLq!Pm@4 z!s`J7KkUP$gVg{2si=dvm-T6#X6sM(`A)0U`txo@{_I}t*-Ra%KwnwNvsQ00LI3-7 zdmgb~S+e)`1k#3P1r^6lB86v~=EHCdh?tVuURi96UG&QXyt3#N6I;H2N1>E=9e32H ZjsMJ5F=g`no`nDa002ovPDHLkV1gfFj*I{R literal 644 zcmeAS@N?(olHy`uVBq!ia0vp^dLYcf3?viMZ?gg^#^NA%C&rs6b?SkfkN}?$S0Jsf z<)WtLqN)iZfk;KeRl&ePUDFl9Rnv4<({@(V0wNa;9T!z?S5*+(SzQ~%*3j^PNT~z0 zYrCj{b*;1h+zK>TrX%SS~P~LyD$N98H@`>+X^^ZxL8E0Hu%9Qtc-FLn%{#ikb{-z{clz$}BJAJ*qV=Ciz z>yRber?0zk&Yt%4eq@m^10#e3L*;iC-t!cDw0L zP)|>}ecC%~Y9Sj#T+VM%)%TY|UmjG5t?E7=^k&7U&(G~x3;%n*pRXPqeAf4d)H#dr zXN-FbkLqpqp3bp4!TZ&Urh@zn~_xP%B{87sAKD&dnB`4E+r(>b= zoIHJj*~a~Ut2UNyf^^~-dAdt860 z?Sc4qi%&m&a#o(&X> U-{f;s02tE@p00i_>zopr04o9zSO5S3 diff --git a/app/src/main/res/drawable-xxhdpi/ic_wallet_right.png b/app/src/main/res/drawable-xxhdpi/ic_wallet_right.png index a0049b71ce5383b2fc58b9ca7592271af94bd268..d6fc6e3c82c8d92883b7ddaa30fe2477d088d52e 100644 GIT binary patch literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^P9V&|3?#2~eYgdr7>k44ofvPP)Tsw@`~rMJT!Hj| z>VXN=I=jq}Y zQZeW4jN3&m3OsFxvyN~rT6Zh<{(slg2k$O2&~1OWW$we>7bQ>3Z;*6iF__>T`dFQp zmHk$P@U89KmOYdB{0+jJ<~}c(#$nH|^lhEXd!MWyg+5=znpZ1?8`(Ux-E8|(!tIgq zFD@f3YgzV*`ojOu9ccfyHm09{tx4}G7Qli9l`R_DHJHo1Qn!~B>pv}`oAO1()H;!Cby1Ghc?JAZ^j)-=j zYxn<&w1zvZj$Y@oIM4fK$fs59k?KD-T%V{Es1m1QxZL}Um(!DbMJ#s&-@g>P^@}}f z)|+EpGu$7wo!eb)bTc=fCq^!O@;#Qjd1W8hu6y^n{Qm5f7q)Ah>3uMhf8I8Gp6tI@ rer^ASN)H3vLh978JR zyq$Vl=#T=BYcmT6zw5L-Zs9qD+ni!qS%GrE`m1Bm(X({G8ADM#71#9l@ z|Fbv8=Ic?;Ps{XW=k_FhIv!B=;qTi1zOzA}Up?`^^6+iA+S87riFG>#xtAY_Rm(od z+5TgKsarU6#*5vDWhRDLY&-T`Px*NK%;o@-w%hv4gKn5RuloL*NqrMnS4Q?4cc5Pw NJYD@<);T3K0RVxw$pZiY diff --git a/app/src/main/res/drawable-xxhdpi/ic_wallet_token_add.png b/app/src/main/res/drawable-xxhdpi/ic_wallet_token_add.png index 406769e343bb24106fcdcf20fc0528c1863d230b..5e1c9149a73607874561fa3780df73d773861cc8 100644 GIT binary patch delta 860 zcmV-i1Ec)z1my-HiBL{Q4GJ0x0000DNk~Le0000+0000+2m=5B07mc(pNfs2ijAL%jh~8+pNoy3ijAL( zjGu{&pO259ij1F%j-QH+pNfs2i;bU(jh~5)pA<){k^lez9duGoQvg3te;{A4@Bc8* zK;OWyfWL6?pimHRke^`C;Ez_=e^Z1200NUqL_t(|oXuFgi z6YBKjW@(Q)6NQ55DV@p4G2n&O;2e3MVS1E5`NBm>mS{hV4U0iLh74oT`=!^szM!= z;V4m5YP+MC_V5ma^--=xf3%@oN_E3^0k@jHF?LN(r7+!@1H^k+6=|3V&W*eJ2M%`D za&^Io?k}u0oopHgqf^U2PzLr~IAMmhBrr;ZPc9g-z7CYG2sIZBQV`3iIuu4IOsmXb z6lpwQASeuez&A?E38MhSH89*&+)kJh6)u8#o;jSxdx7hC)E15jf2okZ^&gox8BCqc zUJjg>2p7SaoZ@={dbQeu(W(EHDWSOh0gU4BH7t(E^V|alO0$bDJ18zXwk|qEqxqvF z9h{lvpNlRSxbE2d*B#rsh~=}(cX=sZ(Fz>8owFv{n7k_T?KX+)jc2v%c0%OPU!{(j z#3Iu%sMj>KsyBV3f4x3sW;Tx!cEM3)KCKEMVG%NVKzFqm$d99hc|b?cvjsW mqN|=%j%ne1sOy2dJoyFqeJgkFf-QFd0000K04NAYASp1n9jFUv0+0(-(>L!$Wk3ng3fYn% zzhDOc`u*qs3*@hle}AFD!64xNfrR-F`U^fNOxUo%ew}3f;};AJjB`9)978JRYz@6# z)~q0~r12ofJ%zAEU;pplyjm`ZGvUj^&l4J~(<8-ZB)*Z2H$TU!V6nf}^`O9}9m)sx zPN*zf*|Bi-t~`nCSGz8mgr>ILDQnp1XqL%)VXNjh<`=?^+t~L#US(;pBwRLwJKs8k zC1$ebBvU>m4ll;PXX-afR%dn8*74O|Fz{Ml_AOs%C$aU+>7R iQxZkxxjv%dAGupCM5i#R++zhsDubu1pUXO@geCwpBpUw! diff --git a/app/src/main/res/drawable-xxhdpi/ic_wallet_top_copy.png b/app/src/main/res/drawable-xxhdpi/ic_wallet_top_copy.png index f4c0c1cd723372212eae3068b64b7d90f06f0cbd..46901b64d1200540a77d678ce02232f1fb193163 100644 GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^S|H593?x6vT4n+%#^NA%C&rs6b?Si}j{u(#S0MeL z8sK?F#Ri~R5+y-?!3+-T|G%HF&|om(fWU?e1@Zgy&wof*VBcS)7up6?bH&reF{EP7 z+bb9OniY6h18$VAXz*FN>;M1DE4|IKx_%jKpMIBJ_~8wa>=3V)+($&h7gu;m>g`Ah zVlG{}B%}M#Qf|4e9M4TSUg|1bpCg=LdG^%GoyIG;*6j2>^_jP7_m(89?ThsC&RHxK z49U`5=$IIEtNF&6%Mm=9Uo|$nU(yK5T4>(?f4TkgFZb>*X1=xfia?Ti-#dm-(X;c{ z-Cyi-`6z34?tXXP-@180^ZWzPek;3w;HSxx1*ovV%t-U?h-d3@E*=RHrq itX_V0!oj*#KN*AsIH%;hEM^7zkHOQ`&t;ucLK6TDZqa}M literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s3?yAI>n{URjKx9jPK-BC>ePe80(?STf%Jch zLD1adLqLPXOM?7@83NA#e?MPffkVNA3knSf^6UK*KHRsDKbbb+CQ!*FPZ!6KiaBR5 zISMr^@Hkv-(O~4f%Jued|E;_xj%k_Yf4S8jOCMlm$arzZB>KVxiP*XEJ_iq6Pbh%QtlVwj*R|2z{eSyO{t26F+@w1; z?LG1(&fwSSx$gTHtzj-PIk30JX_A=b6vHQP1HaE%?VfEpH{R2sf^q2qc85LhbWQ?Y O$KdJe=d#Wzp$PzLC#(?w diff --git a/app/src/main/res/drawable-xxhdpi/ic_wallet_top_left.png b/app/src/main/res/drawable-xxhdpi/ic_wallet_top_left.png index 277b3d1244f03e5dd48ec4b96427d9159f6b7ad7..0bda77b2301091aa5a77f58501427ac3e8aa2660 100644 GIT binary patch literal 1766 zcmVceW{F!@QY&h)(V255<`lVLCVZ9sGI>E8?#SNlckWOrcS^A^`6Vx`<`>>+S3GcG#y+C#ux{K@Uxnln)Vo7ktL_) zFfV%gKIHA-u&0kJDz@^N3nrLO1MpXAHoO2V{fV&97$(Bv^IFht1HpghJ4ZJeXic&7 z6oM_H-z~O`pXuNy>m2@d6+#Q6rNoO6WJ!=Kz!4MdD7^jaD4)AcyV!Sv{z+Z&sbUPu zd5L-y*#0`~PbyfHAL4x;L@!-6UCV?{e|<~0lp7Od2+(DM3~IWaZTxFZNSpi^HojuF zcnR$F$y z(`%M$>iz&O^V?F8pC*Ubihc=vJ@^-#Nm^2EP$V(~>`pPE6Zn3mA_tUu?bnlH;J|f1 z%zYIJgeb5Z2c84UONl2z2XXQRm~BJqz9|!px*wN;`QRGhPiIth(J^}M09(P^OvS%y z^+IlX5u{t?tXlgTd*!i*_|6HoY0ufb0(k}U3WQd`SuCvui_>Ie|2?ENiOXwY>Suw{ z#${v>gV$^OPk=t}Ns_d!-U^Cer)0VsB>4oedwj%H=p(#pH=8{ou}4!Ga1g=76gE9<`V3#``|>tkH&2-%z!h#(wxsK;IBFy7`!j4{gw90ZWgu zZmh8ipC>mx_yrGN?_%E(Vx#AhZ-Kti(viZ$*y%yiA$;jezW0DOjl01->;|}=CJa^s zOJ5_L8?+~J#h(iPybS`c?^^C*4q@<&XVm8ylmu-2PbZ(Xc1q+{qtGMn zgH-CE(KXECZwS1Mqc4rK^We3Ok0Q1E6h{|kBR{_0kyVI`O|)$!e89*_v;J3f{-b|A z@fy8#i!oIQdrjN90`v}3gt)iHN;4+? z80e?DOqre$eBaP2+!*#^F z*~DA`KhwxXmRa%@%o3m%KyQK$5K0tsD$qZd&`fhE%eTfkPNt`YFkOLStfN_oBnE#E zjUNDQ;<}OB=~q5Y&+?3j98_2X1FN=6RhO4QV57(SrBVho;tN3m^b$zxhz^y02R8+S z^RDMtlSh0Z7+eQf1T+@C++77~rqNIcZICSavTcjxM?)d}!NuKjJN^7Z)aAtSSY1fl zfA#29T2%C+1z>;uYO(ai?-+ljZzjfTNS zpF{;D`x{Ji@t;KN%(4eeGz~}Kw}D<@ZyjS2o7Hi?e%q&cJsx3ax7O1+BFU=H<3P92 zD(sy{=fD`d8{zK)I=oqnUB!bJHriG%1G+ssvH6axOBgKzjsBMexQI>b-3&4$F@%SJ zKC4NSRBXLRY01#gD^npsJ)NxpUEpt!6zLl%-J|m=qh>?%KOS$`m8NwA&;S4c07*qo IM6N<$f^~mbP5=M^ literal 1197 zcmV;e1XBBnP)dZN>bjCTq4(UzlK3_FN`sM|9#fl*4cB;*?Z5~Gg9ZP|NhqcZtFX1t-bcQ zPKy?X>g(&%;4Jt8;?ffwc7fhDUXY_315SarAS(UB@FG|aTKX~R90EzuJA#b#1Dgi2 zN>Eqi0Q#{lQ#=+DcejaM13v)Xntl}47NhZCvN665ADK#}YSkxxf7mV10ek^F!9!3F z!l)|-bHFfTSfzm42BO!XXIO-MdVIGih@o-Tj{XWG)AEkC@~9l2GH}bpxU7V~n$EVU zL2}s9bf2E1>T^qTh2@q!+TYxn181trrY<`Am2=&iXsBa)%E}C z#8PD@s-PYikZDGL;-egA7>`FPFAvh01%87xW#K-fjLeA92jgQv)tJi0a^gILtGF5h zQ^}bEFToaIe+12fr1CNiCK{^^N_Z5V^Prs(zK6Soj1lK$s)x&g-4gpqcD`%P7;ETn zaAl2XU&AL;wi0j#cn^xDBLrxlD;eao!Cmkh#35a&wgYb;YnePk(4EFipz7W&4?TUz z;|2ON%4z%qp!HNsL1P;a?D9C0p;`fFe@uwS~lY?1x+ePRr4G2NO6gU#qyTP3JGs-H{FTG?~W@S1)@yKWtXyBG z;ihw#Ur}cjaX5aeM@||ao#S!Hej()(+Ll2Z6J38J6+_lvpXwkzKyb$h8>~RkxKO`! zA!SlJR^TVgJA!yUXupaWx5lx1W82M=um&U1T3FO%Wq*YqnZ{=j*akdGGT|uyM%r;B zagweM8oHZ2sEgar`_W*gbbRgwFMw)qm!6o8e(+OQk+V$zON(+EL=+NalL_=Z=z@Hp z9Rz;W)zjCJxD-rwn!% z16k*u`pr%xHl0B~!*7DlP6GXC+ig~E(=U^BPYOf;_5A*05%8o>*#AM+yiGFol4z} zKqtgnUrwM_;50~r_V|IDvO%W0byR_C;5&#zKQPvfCEb)c+Sq>p$E%-H+scz400000 LNkvXXu0mjfnVU2G diff --git a/app/src/main/res/drawable-xxhdpi/ic_wallet_top_title.png b/app/src/main/res/drawable-xxhdpi/ic_wallet_top_title.png index b5a358c14cf526059ab4ff3910cee95f645dd50f..d97d6da235517c428f82cd5f54db0fe81e983b18 100644 GIT binary patch literal 8050 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 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_about_us_infua.png b/app/src/main/res/drawable-xxxhdpi/ic_about_us_infua.png deleted file mode 100644 index 8e439f24b9d8d05f6ff69f6cd72f01f25e234cd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2487 zcmV;o2}t&dP)iL?Xky>J-&=@se^GLYVD>`P(mpXkXq4J@KRL> z9uSwOqVUk7@+S}o@e2?Sh$18;f>0|Zs+1BT(Mv)EZDHjDJU9;g;O9W%2m%J!K?W;;Qlv1l1Ryg$sG2npoeyCoRs!al zJuHP-1I9re7QoXJ1iat9@lKRQthUqI$)J7S_dei#u0UV*Lw-FJhFRvr;sdWeS*p;V z;nRmdU%&<;KPn z{n|sYDrKN5=C%j!4_M=^0In{q;h)n>+X?QT)&~OtSo~AqC|mR@4SVS@iK^Iyy-0rc zZ7y$(%-k^GMu;`mr@kKQPmPWA@3p-tyJLM#T1!HV6^dLREb@jjp;#b@XfT8r7j;`W zfX;XngNXzNTAI)skD#k5g!U-OJ3ItQXmO*0pIv+#D;pbzRxBLCZ_bWmAQnZ*a!ips z!P-U{bGZ^`(>Y9MbC_7mU?x*Qx>QEKSVg{EMxjzdNeh@IU*aUjMehP&L#JHD)5m&n zyo-REVn{Yc(9;}7H}AczaU`2#XqH$kISmO$&yMj(S}MFRXUlkz4$v(j_IawW1O168 zs~l!sp0y>IZBRN17?6wk0%p?dn9XfqHe19(u87H84yl$HcaRFF5N(%$JIk$iUk%&i zD|q3N5kSm}rWg_33O^)eN78mr!LzeA^xE=%Y+?ykOF3n(-&dF>^ z>`+zvU1bT4JFPoVl)*+YR*2h9kRCa^QBOcfPwhE5vM}2jpjXS>pLyTv*6v{HZHL?) zz`?qf^2G`+P0irq!~!nQt}y7RZyy;3Ge5d;6{mX=I6IicH&Y#Giio96UYYXP&0yct?N@FpF!CAoZpuw^724be7pv8W%sF z!JAAY-(OpI*l`WC5#}T{d$S*Ijp1ZZ2fi`bi_?8=7)>;xDI9^xVN4q61T0$s`F-^P z>_|~s43Qauq_meA&fQqsz?<`{xHvh7t8-~gW^%|VFer;*jpJp8+W_i}m`dmC=4Vw| zMwXSD_9!GqcX7t;sdxS=1@uY6&Cv)(+Y=aWiD0}ljx&8pJW647MuJAhpBz!I@diuiYv^CzF;4OoN8 z%^5n6Fo749l?b*rP$NVOVXo^F+*Y3Zd<+IF^iYqox~fntH?7Cwt;G-F2bjedAv8l{hr!2Bn)$g z*47Unz#K@eJlxe{*35qvX=Y-O5`KVb+OyQ;cZQQ}Z$n#z4y0Tn&T>7tpkPe!v2|9D z@5Wjbgir{A(?_d0H#UqPez70d7ScFRjlcZvM`l-WwLU~%#=7E^gS@=_gYLI4K7cuh zn(AhgE7o(+LoIHjfKQx3>$pnH?0xi;Z zjJ5iERgw7AMP_f7R23b~7M?#bjOULJ;a^M3XtBr-t;^N8*IbPO=42y`d`1-9>j9<10f zfQ*nGNgF4|db70D!@GRiCFf0j54PS1ya$!Ct1LCXh8e(nAJb}0YhCd&j>GjH&RS!o z9FEht34}AIR}exSj^@zo5^Bs-9Ct)=Ry1w-%O;KO1^aBm_4l#jwZZ)@dd0*&0=Ezx0|y}1s4sK z`m2^8U$q2~;H#D-)3?Dy90T!YzKw|Stps1SgzMQ$fWY*srMO8GilzTPwTyu!y=pO= zy0HSCip=v>%N$eAsr4KKo(w_eu*&gDsPcT}viViZ=~Nfvgpr1{>)zMOrB{ z`dZhe=!$Xulp0ntfDwqJQPugB9J8mNy!wVuFaKt}-_nVQxU+41`!Teq-7JlR)vP9N z-p%O^U~hsA19o%a-DlF9!A4qL-WuuaYtqIGa;=RshR!gi-i!a`;SusCMOY@s^fqhn z6OTx2)Yxu=T$Q;Tu!zFhfgSY+h5lw_L|HeZtWqJ#9?Snll$*eKI{5Vg-9 zcQ2s2b2e&p4LdED@P5DF2fW`k=*NEm`t`?QDa0BuKXo}QfKx*Rtl#wD By;%SN diff --git a/app/src/main/res/drawable-xxxhdpi/ic_about_us_logo.png b/app/src/main/res/drawable-xxxhdpi/ic_about_us_logo.png deleted file mode 100644 index ce6055c56e702819391e8f667a1508578746b8cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6407 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 V9V@#qWT*fD002ovPDHLkV1h!<(B%LC diff --git a/app/src/main/res/drawable-xxxhdpi/ic_about_us_nervos_network.png b/app/src/main/res/drawable-xxxhdpi/ic_about_us_nervos_network.png deleted file mode 100644 index 9b46559e36dbc1c647b38169e880c65f9b79591c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3517 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 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_about_us_open_sea.png b/app/src/main/res/drawable-xxxhdpi/ic_about_us_open_sea.png deleted file mode 100644 index f960c3210b9209f5ddac3c396801f1281397124c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4993 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 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_about_us_server_pri.png b/app/src/main/res/drawable-xxxhdpi/ic_about_us_server_pri.png deleted file mode 100644 index 4b6ec939f1504a7620bd7ec491881dbf1ca8c669..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1662 zcmV-^27&pBP)LUu6%K?gJ#bPA>kohH+ntfujy zsi&rg-uoMR=z)itp{7!&aj+su0xwj^fQ2`_E1C*kK@0_@?|0T&u6;O=d+)_j!!o+379n-$jz5u!F>#Ie!w?-f$zTo zPM^4+FrhqI3xKujfvJzc=La^C!4e=DNsK~1a2iik&iWw+{)kbq3Se2Yu|k5?=ii`W z1+Z+!zHz@BJ7JcbJZjT&QfQp#jXA)RqLyKg%>foI22y7L|J(vP4gsB~!|rbM0Zy3; zRICMZo(TrGe5HUs2yEL7-0lxfa}bKIDgAgR@cu`kU^Sp@8HDxk0P*hm6g_|`{%za@ zOi5AjhVB7}+JPP0fxlV-E%IkR3B0~R4}oLX{ZOT60Qt*-jCp<;6+RndM-WFiEx!xy z=1q21K3gxobNRG=r6BSVRAZmsYp)yOu9{bphj--p z7lDQyz>VuFW%3l6rtbntqTP_LT?M}U9O&&)Vg29o8!$apwad6w6~MtiMXS4`bJ%ii zuw__1Z)^mLO5A~ERmVF7tZ-1%nm2(*r>W4bKH#gWP_R00{m;PVZWT(N49uIaQ*67= zIQ)X>mQUrF%DKk&H33~0fx!V2Kbnv0@a|oc$|bQdTZK8@w|=cSY;qW1TpTcSmK;$s zC=iz<>Yh`w4|tMfUHz)5fA>zAnsp}Z)W`F+tlX5^(-5q+ zaqv3N=#XvKKH#i{KytFG`05p)Q2>WS^2|v&CS(e_rKg2^3l^!;_oSZfTSM!!PJQNNdmL!)*3EkX4w4J94>&2n zT{gmF!!1#0ur3XD{^H-Ewe^YF2_jySHdh13j>!5SRN*lGo$u0NH0Cc_SPV>?u4?JK z3G5nWX;?YTSuh4**=S?|Q;I4sQDFK1s~j_<$;CW#HT49}Y#k26jV$1z64`YFOM|B1 z{VgMRohH`QG?PYQWQ-_sfO%%-FEicdF018Z6RUib#&`^pE?pRX7N{JK{v!vtxKuzS zsLpYxJ$iWLj&cT2Y}M4-tbJqRMg}msYq9>L@jnEX%5_R+COnFo?QOw8DSK1da7p%$ zC6^8Oi!EDWrs%n|z=@-wwIvAmD@Cr(UTo58wggXSg8krQr9$rf3216Gd2RZ<=P)~& zXIZ;@>O;Fm74y9h0SY9Ve%~EB?a5iKFH?VZLEdwi3W63PDPT~5&@?9ZE%x^VwcA41tu8+XuD5`f$nip> zoTjo0BW3A0x|EZ7H@bvnN_gh;2Jj5gowdHp^+_w` z^=qDia8j{1=Ws@*IYKBxMhRFBj5i$S`lJFtp`*6O2?IRO>kVMqimR(U@4TA^yqVH& zdJ>^B4*^GLp#QgK>~nZ<&~#GUr%g;`eAafY{c+H`eZW>j+T08WO^jjI^e0SZz3xoK z_5t%@m$pG=W|=!7(*q=gAzVce&_RzA%U36r`B2@CzL;=y)smw%!JVjNC ztS-nI-~kaRzWqX8rfx9GJAv~VLL`Vc6*Y1X6^1J53@|};cL7zOiD{-(J$cYJCNBXG z3;>7Qfw~{UHW0)Oefo)9w7Mk!loQP;Ma-~nogsY|Q?md|>8{_lEX1+aX> zB!CM5mlspxYMh8su&P~}ioiq$O>D#{q`pkktZHkX@So!S3!u24(0g*uvH$=807*qo IM6N<$f+i9bEdT%j diff --git a/app/src/main/res/drawable-xxxhdpi/ic_currency_selected.png b/app/src/main/res/drawable-xxxhdpi/ic_currency_selected.png deleted file mode 100644 index ca4d3d3efca33bfd3346847af58a65f51d9c1e90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1739 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 t;WxBh`kj4Oef-+S{{Az5({277{0lS+J~ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_setting_contact_us.png b/app/src/main/res/drawable-xxxhdpi/ic_setting_contact_us.png deleted file mode 100644 index 0f3b999be74f3d057a29218de296920e67385835..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1737 zcmV;)1~&PLP)5Q{uWrAk_j6wm^q0;P~rEL172^g;{e*6RAsbet(|+C69Qb4X8F z$v!h@_RN~~?U`A#)|$N&{uROq9clu2UF-&~-_WH~GfhbbG8O=W zKufzWj<0k{4zPJWFlQDJBD8o0OMDziVkCt)h2wQ(6-4z*jKmrSY~P6Id>Akl)N~@rxy8dh2^ji!3tyMU+q2u>z{(qt8ax}Q7)n4Kz@Z2pNdudZGLuJ970=YLZ# zsLm$f6IH;4V&N3$155LinKzys*F=%DT>#F=KKa{e;PRF6Y6Vx8@X^P{mJW(->0)5* zDj@q_H;zL?z_Avf{xHzlcDi{B=o^qJJP6zpV6$eb=}r4q zQ(_`ez8qMw1gJd#H2kjb1eXQ|IDH=Q?u)>Jxkfndd$ewv&Z=oUG;Hqa-2B-K}U(A*Zec$^*I>;oE47#`0(22ei)LB0TUt!)rtG}Sc% zr_bqs{!)VOxvY3_@2*(kkDqSs3-I#$RTP2Ddi#N&j%v34Q)>0SzZgC%3r*fn&KKZP zO9*OXZZ|>F@m9k#M-Uv0WQoo0-O-xf+i}!^A`L*^P7aL-6B6|AzcxA?s)dX+Z8)gR}pOS(|xtVs>^D~8B zavL5UU5g{J@k!+ojlL7vzp6FL{IpxI6hmbG9J|Cl9}!^gi8=SF&N!7X^{M;}vDZ}XuXJmxNi6X0jXs?uQl#ZfZNP z0t=!)=ubab1RVIoji2W=%;~JD`A-8@m&GEbbMo_X(~~WeDV;dy8L(~TXstXk>*(CI z`?h8B+M8#~d9fJ8HGY7}>reY=w9DNV-I&ee4QpRT5R#J07=vOxsW=@x45D>VgR zpuwgiCnaXK&o1$v_dLRyq) z1Ym$IS-7~YCpz|7Vl6S|Ovm8%hm>SV#lyC(JA*THEY=!|TS^<(D-q~RPXY96HPK9E z!2ZW0=7b@8#5H7{KH+a08@gSjsc*nuJEo7jWs?cm>vrK#uLKj)<%p)bUQJ~l#A#}6 z*STQQm;qj2VZc%Yx15*#T$Y1AVSKnmDZH|!Cal9L&m)^4DQ19+3yj!b)EedU${OI2 zQg!cT$=g)3UxM+X`Gcg0w6v=LbnCRC&oygrD{UQPxlxJLG>krO8Cxr|l9-Gz-8!BP zGXTdm%d;pQ7FsxR2uJbxFq&G`i9=U!WPm1X6%)V|f@_xRl*FUeUz^pIW*?#K*sI~GZ&ZoP8_Rg`8Xs+_4KNb|T z5hj?Kp{Q6_M5V3~%smpXBVh!;{$00000NkvXXu0mjf>uo+@ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_setting_fingerprint.png b/app/src/main/res/drawable-xxxhdpi/ic_setting_fingerprint.png deleted file mode 100644 index c1064d9cb88ef4b8920fee9f2f016e751cf8fd6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1062 zcmV+>1ljwEP)M~c?f=Kd|LEuc)6)O%?*Guw|If|;y}bYG>i^*1|Nj2}e0l%+`v3g=|D~h< z_xJywod4F<|E{e6hlBt0^#9`G|M~g<^z{F)uK$IC|GvEc+uHx>>HoI0|JBt0o0-1k49&{e>NKJ4D<0M5Y&RnnC}2{Uz5c9y?7r?=ro)~(JY)w{Cq2z zPtZ6{QZ+D7VjP*Qim$-w0!6d#V21LG)V8(Z6kX0&Jz%x|S@7qqgO_1>=0@ zeJo5J=e-V&T)Ij-al<_5%(w9Grh7%zw2Mk_Q8l(U`Rt`Q9 z;wklExq^OpX~G3@eP$+iA;fd)!X%b1IHYbZ#0&EPq+e1ubioj>nfBT&8Dp=6sHqEK zF)P=GBfW}+@d4XwA>ORmIN_)Z!+hRuf-}7iU6Xb&oNgN%1uwY`I|BwbrR-HQkt+J% zf=d^S3zW9s5C4@TwAbb)?l!E`vu-MaPMS)m?V9w2h%M+Bsay%h+Si49WAIu&3#C#_ zk>!Hi$G6t5Es2vW8{cs5sbb7dE!Px-MmnDd(j-yYszZ@m!d3x9(RU=IH@=`n*iZl) z6?i=sU%e^?y$nll#n!?6J(zsJUZqS!8T3ro7AMR;3VGaMxSI7zrPp}e)EkZ)FvcUX z99JqO8xO`< g`rUlf4gMVb12yz<9bRHkBLDyZ07*qoM6N<$g6u*$uK)l5 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_setting_localcoin.png b/app/src/main/res/drawable-xxxhdpi/ic_setting_localcoin.png deleted file mode 100644 index 6a219ee8b0e414c52c382f42cc1e7519993db803..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1291 zcmV+m1@!ufP)ugW9L;U++P8O~JG5VN?%DU8J*@Anz1LoQ?Q;tL z3ebY58kdjVX%1-$?4UPpUM zI1wJwAK11Q=-DInCX2cO}EfC?-g+CHxq5&(BUbJf)5C)yv zZsCX65srKI5|;%~N`$*gDIPw+uB}0Fcc5QyfVO4-2~7!;$8!hL3zBNi5oJKdaD8dD zo}$i1RSj^iQs0P=oXh5h!>UZQ{P3x+6*XaoJT3Z`0vtn`#P^1z z(U;5uNW6RiKv&Y@e5DW;SJOAVcWDy1EQ|cH!+>$(Akc-}v<&$ABlMd&hgLuEP1V$| z)^POcN7EWHyGSe4^0$_`lRh)YG||`yR7$9adE$Ut!!O?%Em0_@U9e*VzyLxb6p92} z*8tC60sD?8%8}k{>gU=Z!8eO&+FonxOiRoNM=~&vuLVi8ZMBA@gQCz#2-U%0W0k*6L z5;^$n#&THgwphZ(P$I8u&LM%0=oKuw(? z`cT3(ad=wZ36mPfDuV_Dqo0;A$2H%(h!g5*DNdn$wiP>JhGs3IX?xB0Id;N#AB&4A zel!oJ<3=oFI7*81?ViKtN*qQi+BVa%6K12CAj)BR~cP5=K5)ntwMxX-s`Euym7Yi*s?gzwdvR~7pAk+rL6xHt>6Oj3M(g0g9$@6s}z zFaTHk9LU6U(wY!upe&ThMIN<=+2DsSz`;`{I+18G&{`;;|GBa5Le$FQMA#N$Lz&)c zv9h?H)m_@P;%v>|NjO_IlP)^Ns}8n63t(xnWTv?<@=|2{{YDgHOD|>-CY0x002ovPDHLkV1j3% BbBzE1 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_setting_onoff_off.png b/app/src/main/res/drawable-xxxhdpi/ic_setting_onoff_off.png deleted file mode 100644 index d33e9c83d95a9957a3ce484679e65d1e72d7f510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2904 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
6A6m*G1K9YV*Rh)Di#yV{78BUAw*} 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 WkCTmV9QdjL00008^PF zx5KN2YA60!bSZB>J|Ru7%cFlI&$==h=eG2=d+vfQH}9)|KWMtlhh?X&+LX*0k7eD| zG}1N{Z8mc>=+H{rHu)FJL4^RHgKwU^Fym0%m$XOFVb9SeO81hs+&`dT62W7esXkwM zuXX5FiLYh;f>)Ir<8%X0NYu?Zthm;C`6R&z#;%4&=UFF&8Xd3f6PclGk;2iZFO;}> zXK!S+<{U6^N+4^+4zu|JMnd)<5R?*W9UQ+46IP$-?_lKjM?t9PE}^ iR8V$Y(XuD+4{IokZuzN`=QaQ%pTX1B&t;ucLK6T1e_7E0 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_toptitle_back_white.png b/app/src/main/res/drawable-xxxhdpi/ic_toptitle_back_white.png deleted file mode 100644 index 905bcfd0749ae7c6ca80c323bad753cc29bfc4c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 573 zcmV-D0>b@?P)NklXUy%6`1zqZIF$jKo}Tr z5EjM@go$wmVPl*?6c}p|6~+ogiP;IF#%u*~U@Aden2jJ#%o>OrQv&@5OaU^Hh)E%e zjsNdnyV%~E2dTy~Y%uvuR6$ zAV?G#2nq!Xf5dc z?1xEKN?Ag7{$sAwdxK>GnZkcjQi=~&P>yQU_fKn)yo$xqwORWCnO})-#gU}y00000 LNkvXXu0mjfw@>J= diff --git a/app/src/main/res/drawable-xxxhdpi/ic_wallet_exchange.png b/app/src/main/res/drawable-xxxhdpi/ic_wallet_exchange.png deleted file mode 100644 index a3f71852905dd52f60dbe538b247bb7b86088b40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 899 zcmV-}1AP36P)vWB>pHu}MThRCt`NSlP0x zAP_Xs>xK#9isAhKcU}gUVi^=-`pKf8VOCm_1vVVC|YN+ZbiREb0 zSBW5hXAvZ{Iu^Dq>pIr9$3P!UGOP<&Z*1Lkqv8!C$#R%H%^Yz=wy=o@vAoqmKGDuJ zKx!bFWBiD*KzQ2b9!b(bp3FB%k_A|nyDV^)iQZ))GUdidw=`}*rFW-DmaeR99*A_T zMNAf%InsaQT`m_HNu7Nc=}%b}x> z6PaJ*!{%1nab)6saF*-f&4(e4OguLo`>^0;$B{d1{t}u3Y&Yd)B@uuJcU?KN+K*-1 z1l2wUHqy;1d3<(*C27}4Fz4=po)KQ{n`;X@J5)!m1}}2clXP{CTw~Jr*tM&pFy|`* z;?VFbn$esuz#QsEHlydTrngWJ2u&mu&2sx{njzvcUfn$!#qcAV`$jRS$sf7+M>NFA z%2=%V>tylQG;ZU5oI_tA`_+_SjY2iVb7)20ul)*XTgh}qqiwvkEv$)hDX4uArO_J6 zzI;Slx*yPBg|_XoHxBfI@xf`Z^IlAiB`;1{Y*9vvLq!Pm@4 z!s`J7KkUP$gVg{2si=dvm-T6#X6sM(`A)0U`txo@{_I}t*-Ra%KwnwNvsQ00LI3-7 zdmgb~S+e)`1k#3P1r^6lB86v~=EHCdh?tVuURi96UG&QXyt3#N6I;H2N1>E=9e32H ZjsMJ5F=g`no`nDa002ovPDHLkV1gfFj*I{R diff --git a/app/src/main/res/drawable-xxxhdpi/ic_wallet_right.png b/app/src/main/res/drawable-xxxhdpi/ic_wallet_right.png deleted file mode 100644 index d6fc6e3c82c8d92883b7ddaa30fe2477d088d52e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^P9V&|3?#2~eYgdr7>k44ofvPP)Tsw@`~rMJT!Hj| z>VXN=I=jq}Y zQZeW4jN3&m3OsFxvyN~rT6Zh<{(slg2k$O2&~1OWW$we>7bQ>3Z;*6iF__>T`dFQp zmHk$P@U89KmOYdB{0+jJ<~}c(#$nH|^lhEXd!MWyg+5=znpZ1?8`(Ux-E8|(!tIgq zFD@f3YgzV*`ojOu9ccfyHm09{tx4}G7Qli9l`R_DHJHo1Qn!~B>pv}`oAO1()H;!Cby1Ghc?JAZ^j)-=j zYxn<&w1zvZj$Y@oIM4fK$fs59k?KD-T%V{Es1m1QxZL}Um(!DbMJ#s&-@g>P^@}}f z)|+EpGu$7wo!eb)bTc=fCq^!O@;#Qjd1W8hu6y^n{Qm5f7q)Ah>3uMhf8I8Gp6tI@ rer^t9L#W_0R9>ncv+F) z7N$-AqMdx-I`L+>RM$lHquU+3RQMSlet&y()0$Viv`*(fJXh-|_0{QWmfw=xrPrk8 z7nnF-T_=C!=S+!TeDl-JDfAW{Zf8t(t@3D{$Ra5G>dTX~%zi83)~1)5b5EWye9(IJ zflTG4-3|d47VJ*lt-i>nHo!srXT}+cTbF)LQhGGOC~bo~!_#LBeb0=4l=ktvZ0Am_ zn$m20v{2Ca?c0e$b?2&I%io=zFz5DPr&qHxV-4O{uX2)|`cNYEAx^HGd6U z=elKKj92O5QpWAG_8OM?`YkoMJCpfHb%bc<432ZXyMM9sm0c?;J=pP1e~szf94WTN z!Kdv5*uKSBB(`l;G4N{f*OS<|k8jF44pVWSAc4~>tVG;2d{&=H5XrPjP|)D1J7Dg0 znsYJ35mSRZp?Cad2#M-7RnD`VbF8}Yb;T92KF*aB_I;I~X)ftA_iP;Boar3m2WQNA zRLxkm^;XlxmH($|F5K~lvFFiyQ=PsOpYJfUd2R02v)0hF+NNjaviRp>W!X71pU&^r zli2a@#_#L0w|8|s-F&*dQZw!%m&~rYo7Ha4*rWC7ty$;m-t?`n%bcEEh+o<_^N7-A z!xh&}wyZL*UA)&WHO;JFsO(^1s@+;Hg+xK4Du?o|5-0i>w^X_qai(tzOnq_an9=PI zQ}y>%9{16|#?c|UyfnSx$sYS)_qkGiFBzkFZ+`JxyJuk))%>-Y)cb3BU*TVtpsIS~$Zcv%GB>H5oRt&D$SKUsg&YL~xj(k%z3V+K!GKbLh*2~7Z^YMV#^ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_wallet_top_copy.png b/app/src/main/res/drawable-xxxhdpi/ic_wallet_top_copy.png deleted file mode 100644 index 46901b64d1200540a77d678ce02232f1fb193163..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^S|H593?x6vT4n+%#^NA%C&rs6b?Si}j{u(#S0MeL z8sK?F#Ri~R5+y-?!3+-T|G%HF&|om(fWU?e1@Zgy&wof*VBcS)7up6?bH&reF{EP7 z+bb9OniY6h18$VAXz*FN>;M1DE4|IKx_%jKpMIBJ_~8wa>=3V)+($&h7gu;m>g`Ah zVlG{}B%}M#Qf|4e9M4TSUg|1bpCg=LdG^%GoyIG;*6j2>^_jP7_m(89?ThsC&RHxK z49U`5=$IIEtNF&6%Mm=9Uo|$nU(yK5T4>(?f4TkgFZb>*X1=xfia?Ti-#dm-(X;c{ z-Cyi-`6z34?tXXP-@180^ZWzPek;3w;HSxx1*ovV%t-U?h-d3@E*=RHrq itX_V0!oj*#KN*AsIH%;hEM^7zkHOQ`&t;ucLK6TDZqa}M diff --git a/app/src/main/res/drawable-xxxhdpi/ic_wallet_top_left.png b/app/src/main/res/drawable-xxxhdpi/ic_wallet_top_left.png deleted file mode 100644 index 0bda77b2301091aa5a77f58501427ac3e8aa2660..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1766 zcmVceW{F!@QY&h)(V255<`lVLCVZ9sGI>E8?#SNlckWOrcS^A^`6Vx`<`>>+S3GcG#y+C#ux{K@Uxnln)Vo7ktL_) zFfV%gKIHA-u&0kJDz@^N3nrLO1MpXAHoO2V{fV&97$(Bv^IFht1HpghJ4ZJeXic&7 z6oM_H-z~O`pXuNy>m2@d6+#Q6rNoO6WJ!=Kz!4MdD7^jaD4)AcyV!Sv{z+Z&sbUPu zd5L-y*#0`~PbyfHAL4x;L@!-6UCV?{e|<~0lp7Od2+(DM3~IWaZTxFZNSpi^HojuF zcnR$F$y z(`%M$>iz&O^V?F8pC*Ubihc=vJ@^-#Nm^2EP$V(~>`pPE6Zn3mA_tUu?bnlH;J|f1 z%zYIJgeb5Z2c84UONl2z2XXQRm~BJqz9|!px*wN;`QRGhPiIth(J^}M09(P^OvS%y z^+IlX5u{t?tXlgTd*!i*_|6HoY0ufb0(k}U3WQd`SuCvui_>Ie|2?ENiOXwY>Suw{ z#${v>gV$^OPk=t}Ns_d!-U^Cer)0VsB>4oedwj%H=p(#pH=8{ou}4!Ga1g=76gE9<`V3#``|>tkH&2-%z!h#(wxsK;IBFy7`!j4{gw90ZWgu zZmh8ipC>mx_yrGN?_%E(Vx#AhZ-Kti(viZ$*y%yiA$;jezW0DOjl01->;|}=CJa^s zOJ5_L8?+~J#h(iPybS`c?^^C*4q@<&XVm8ylmu-2PbZ(Xc1q+{qtGMn zgH-CE(KXECZwS1Mqc4rK^We3Ok0Q1E6h{|kBR{_0kyVI`O|)$!e89*_v;J3f{-b|A z@fy8#i!oIQdrjN90`v}3gt)iHN;4+? z80e?DOqre$eBaP2+!*#^F z*~DA`KhwxXmRa%@%o3m%KyQK$5K0tsD$qZd&`fhE%eTfkPNt`YFkOLStfN_oBnE#E zjUNDQ;<}OB=~q5Y&+?3j98_2X1FN=6RhO4QV57(SrBVho;tN3m^b$zxhz^y02R8+S z^RDMtlSh0Z7+eQf1T+@C++77~rqNIcZICSavTcjxM?)d}!NuKjJN^7Z)aAtSSY1fl zfA#29T2%C+1z>;uYO(ai?-+ljZzjfTNS zpF{;D`x{Ji@t;KN%(4eeGz~}Kw}D<@ZyjS2o7Hi?e%q&cJsx3ax7O1+BFU=H<3P92 zD(sy{=fD`d8{zK)I=oqnUB!bJHriG%1G+ssvH6axOBgKzjsBMexQI>b-3&4$F@%SJ zKC4NSRBXLRY01#gD^npsJ)NxpUEpt!6zLl%-J|m=qh>?%KOS$`m8NwA&;S4c07*qo IM6N<$f^~mbP5=M^ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_wallet_top_title.png b/app/src/main/res/drawable-xxxhdpi/ic_wallet_top_title.png deleted file mode 100644 index d97d6da235517c428f82cd5f54db0fe81e983b18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8050 zcmV-&AC2INP)Py9EJ;K`RCodHoe7u~#kI$)XNJXP5Q7qf&kbYH7y|}qa#t674MnxrY!}yfMCmO|wj0iK#%zeLq->y3~clvHK zcV_Mkb-wT1I#qS5>eT73e^*ua?G8*AQR3EQzlK_~S3{H8H85s~Ntz)^V+NVPR0l~@ zjak*idv}p}zFF^qZtVfaR6QN2O$Mfxu~kcaC1YzjV`_O-g?X*2+B}yS6RhcqPGU>v z(87hu$`{`^`{RTIal#0~;e?f))4FfPd%%03g$DxD$i;mrK(vH#(XfH$(b1!W#uhpq z6zOo#nKnN;bVH*#3Hwh3WVY#`e)wv=2fPQ`b&I0#zr$u9gDGTB@Nz9PZ#&v%siGjHCP>^u4AVdj~D&*s)#fTEto*kygT zG8eaZ+oN5eGkI=uF!Po>0GquW;~J2!;->e^S*HXa+H@a!4|orB9}m>roE*T-_9<9= z4&%GZS`J`5SJ}sm{@EG9TQ;rOu+5+o?%gz*>)9yYBHd_Up6pd+CQKg}{575C1@8gx zfo|)8Y1bt8*wA3+GS2r+cOoz!S5}zQ+q&1&CeW#wll&=Dum7}0P)R+z-RI31Z>|mk z_QgGU4|oss7!M?q$zbX{a~5}_FJo}KTPWwxniyPKY)6X%9W`Dv*IW+j{W#rFVBX{b zqtUY`1WVItUhp399_Vo%U^_(*^e%)4r#lyzD`!nGlZu&a6bw2M;M_oiW77>9v!s77 z^S#OAf{&dvFM1Dn5A;wE%)TbM#p(^_H*~N0E_GmT0(ed<6nJ=KrZ9?TIAhb=fw{Bq zKy#=EoU}*0;62deJ)rTfanI`J&U9y)h=ll%PRK13G}B>Pbw0PmXWOc{9e!<}3Fb`y z%#HPk54{IAE)OJ<$%?wUWxVJ5T9lHTi0r)LOxK__~`_^xz0&2T1|<2>M` zJ>muLfsN7w0-p7A&FyTt9Ah286U?LX-POvuywY}+mZ(3Kh2sb760KgObR>T&XKH@#F5qTiOi*SjhZfD?0=!q7fqgRZQ8ou!_ zd>;<4rwFzDkM+R02rHwAzF6^lfM>YP^r82F_W&LMH=_4x$sI!@TuHm81?YtDG)`xk z`Tl)4&CZa-^zjXX1K{@+hx9nX9{`>ZsKXTh<2|sEdmzG%`PK~?xYGP$W_`7R-Jfu| z07|Xb8~Oru5vHaG^i#c(=&|16WQfTiT_&wNtYP{nb z%wO}xsA#i&T7K2E#+gXxz`Do{NT;?_z$d+^LjQ(-1-`Eh)m=!Lxv)arxf}>DLVSeq zGNrYLsN?gL*Y-sXJPU4wdkjVRakuSI^cku!8iI~q%*?gm1gpU9u3N0^!*~w>JTH)Q zFuW$x*oJTkC)404-WkDXX++#Vt}$$>gf}S>m;A$svJ1N>MYg|;PZ!7aqm60%QEtnq z>?3Wg!!5Ro$iJe5N!T8Ok*iRo{4?|gjH1ivJHxJLQ3j5jD4bCbL(tKeH(6R~(1=#* zs|_j9|K{=lC(1MA9|o_D^tL4w@N6H&yE@P;;?olGi5<`xy}7`icbnn2-{s(eMYjK4 zNB@3DZj;EdZld5Acu7>j#n_s@P#04v<@BWg=%~y)gbRu(-(7Sg97)}H0bfF#!T4|; z$t*{o`VEP7*j@e)orND(PR6G=iFDWRcd)M9JHP^-Z<1&4bdluA^#J}kg!tJ`+K$NL zY$V?nMAWT4obN=+dcoYDr0p3~_|53T5tG$A3Eg_?5tuE7wLH3x_=}{!(po!bieCR< z_nAIKzLa`$7APX~aqPLL2>lLI6^_(goz&;2!s8s`4BHSP=m0n)(k<&7H=c^}00;R| zPMV`BbT7;vn%Nl^@a#w4KasnNo}yv9e95%oYb1<{5;X|y9XVHTM?Z;zoN8ML1KHxHZ{t{l`Y{KGhk}#OHh;FIDe1 zrg}ITb?ba2ebxcjT73wt&E@^c(|$mw6Yai8qvBSCT|Xevg3gWTwi-O>d>tJNI<4wx zO9FL%k#btT4}crsQMCOKVGBY}pjZ4|OdmEq#O#2evl9&`|a2E~=JB=)`hTUk-NjXoj!s*onYOKxKO33#mP*cbdo=q&P@pdTG5xt z|8q(Ve}6&$Z??@ft$>cf7 z7l1-dY$}B}Rr;v9gN@5N(twSjZce0oI0>}jsLervxlXc&NIQ@`d#8(}jwjkw`x+!G zY1^KZ#Wb81bf`qLIW1%2XfqPsyg}G9jkE-;IyErP$0jXr;^;>tYRMtJv(RIPUNHR- zP0gZ2nj!sfN-XRbJA0$K3#>kfb|CFV!Y{y^C?SR{*v4d~lBnZ2q)Q?N-32=>l1mYU zlZL3GQp}u6VUt^jaAmj>gf~@ON`_cyL|*P{mb1)3)Cn*h{(PC*`2lv>J2RS1K8Vc% zo^>5zFLi4$3t;wwb$}HL@HU0*>*v^JK0g<35`ih5HfqgIB{(L}?1% zhZC^s6Y!pdAMPb=Mf78P5))CzFVTCXl~R@j%5Fi{q$v9-%4!*xlOn&(L`kz2@nF~; z!~&n8uuB_=yaB%&@nSbKQ>G0qQ*VSda}$lnws%uvNq(!GTI_IklDbwDu2`dlH&t9q z(kNY#>^`7_8&8An3D&hVkK+WQDS zyRYNwE~Ngr8O*sT^^X)2Zh>qv^)%7ON#t99WU2~a8c@L%FA@En=Vesa#CGBIlq!UkrLm;peUIb^79b~I=44{&o%(U@m`k)!Zd$8Tp z$+XFh>$pyK6C7F7^%kH*-Jc=tN0E+zO&h!d`E2wSHidd9{0ZI`*8Y+Frtm`eKj8J~ z<*Emjc%uC+$$0>_{gvJF!};+g@}|CvEw{vIxig)HnEWnH3UMWZLI%O0Dt^)@Z|@-e zbZwU!SxDnJUw4bXjPA~b=$C=cYuMbL#Ze$sjlKiU$s3A>NYjCHm^H`oCq&rr+8za*XX1MzCr@I<9Rw1DUom?{=x9(DdPMnQfM2Xs;Dw^=k z%M`LpEP<8)V|Jv0g>YjgaMglQuFA^Jy> z&<{Ctmiq!}?j62#xlDmNmXfArbv7z%&=IbzZ$_37bh35Crwh%vy5!zX-CVm(eSp|FM!NPnh}VaPtjDo=wI3kK@uC>Wla+vdu@!j03G6b2UF%UQOTty7j)`MU3sbN(@CWRJU|uKtqV`Y4<&o*(H_v1 z+EOmiarX*}nYITE(vdWffOY5WmvAAZ8HK3bpp&YmuwQIdKZn2q6bmeSJEhNeWLFe` zX$JEb_$@c1lV!V?rDpT(<#n=YXbiDtmPh12s(W}^`K)t)5F8>IQ@IpkuyaX zbPAmzs17X~?s6(y<;c0j?V`+FOTJv?i_QaZWa|^KJ6njWN8tQdSO8Jm znmhCQq?6mu+njL4ZX^qD^qfxms#2c}H_Y-@;uX5R2abt)@HT^{P|%4TTnyTQ)O93$ zG^|;TOOF$|gfxIxTPoywMZME7?!iw9;@>a3=yGdAA@A z`e+ROVz)3hb#gD@nFgf=hkNqa;10$Xdj-@phO%eEUxT%Gj+`6*FTydttVIsCPOv-5+Q@k0ZjDdwwA4{f zOZh;jkE7cHbV%1=-N(uQC$jbyG+X(H3pgCB?~!&AEVBDH6G=ZJl@$JN>&SXR)>h{kp4UkeZEHF6TX+C`Dy%z;OW|T@81-n$ zRtROz&N9pF<|Gtar&FY3#TNhX1aI_kpf8#Yw!t3ABMG5)3Y*}q*=_-8Hv)1)0Nsm8M>KK&8|c%!r$hf zD-h>5M?*>bR~DEKLC#!Gew?B2M&%!Y&QADq2mJVVLV@2+aJV`k)E`%i1ssZnf0+H8 zg!T~j2d?}v>_ErG72!>l{uj~I-0PvuV%bZY*4_-C;#m3)@^wzUoJ8#%Ea+&1 zBCtu&js}ZJ1Ne3cz~(lZk3&rnH6|AusL zI@VgKCdt}sb5|f}xs!`tax<|-`!V7)VUq@;r8VgM%SH+aWwU@=v_Gu#O?x||V3B#=cs++uLs^tce+yGa+v61L4G!`iKxlV(L~`*g~#BJ3)9 zo`yAZ7zFQ+owDT;SoC-J)KF^Mk6t%2t1U&bV;9Qlc)KJp{fV1U4zlp1ZY{5il`(;7 ztg1H8RV2m)YXF;YdPqhE&+24$rW|aKwSj}yM27YXe&Z-i<)BP+;yqQ|myQW|M2EwV z!FJ&4>V7f2Gd_BNQ1k=X=08IEgJEj!pDm+oJyhq;7;={?B9~*O3&oG3B8v!*hgZN` z!B@gvM)X-@<^ITk!w5A~mCps{-zLA9SrbJ{M%Pi(!|+qEW@FRgU9sm)!m^?bYt4Sb z6&WR*5#FRu+93Ugdp#U}U|Ct6#~2*lfQn{1_T*5BOE{U!4)tYNDTuylFXVrmx-{Dp z)xnyw3v3c_2o&gVN7|*ZNIJUfR0!=HDRszf1G{wo&4sluA-WiwHG}$T7~@qS=-63o zlvLV)`hz?*-WTN$B-{el9+3V=^?H=9W$Tr&z_L?_wtoc+^!A0n178S#pvJM|C-7dK zVn_jvFe^A9trp>oMIc>aLIRaWCQ>JZO)C2khi|~hQSd{Kv3kS)IZnJMi2{NCPKRDY zo&^6JzR;WYbR~A_8Y2Cogqh^02aK!a%J@!$aafeL+|4VYteMPFQGLJ0t|uiE-br9D zA~$18hg=A$cO>oHp*G_v@`08zmg*6Xz`hr3LKJ?R@HX@>$Vl(hDD7)J&w!srzNAwd zk7-OeB0RBK%ydGW2|;JrK=UZ;t@onLLF?ysui1|5=0vC?_%8g2;t}a{wc~80r-bzN zZTj+OSkwLei0=kp0k@iw(EqXM914pBPP0QP|Ib%Yu|V}qe)Zxsuxkn>>_uT2^7k`p zIFb0PaBomg1nA*7B3!J5E~MR^wpTcEmxviSvLM2lw6jdFO7knnvXO~7;bZAeQuh!! zS=VCeVX$TbBAqDLbE2FO#(KyP{cOzD75aM-`8UD#$~T)bSpmwei?Z5N(Q;L!S(RPt zgb6u*w#<>I0lf$LIxfdYdjBB&7Iv+O;w=Kw-yq=-_}ZslwTJ(mVMkp;+_ zQK_z%;BV5#DewmB6xawrG*g}j3+Ni)>F{3g1+eH#u+AsVz(hYt1xBAmUJ=QK1e$Hx zV^fHJAv(I?S`tup8AbS!URt^Ml1BLHX9mmoRK(NVI{zwuI8HMSgN7lvu(tN=uScYI;*ro8#DcgXKHiyT;6JgbFNlU&{(Fyl&(3?Yi1pHn2Sa=`O zl(#=Dx+)dq{rxD?*qZQm>bQsSlf0#JE6At&z-LElZ)5jAau?~?T=qKn-h1?3=)gQJ ze2HzbW?u4$$yX$em#o6OsFNz>F_#7C$EV9 zDwGa@$HSUgCE*+3tV9|4U@SZoS+|#UhpgTy@OwvA-*tO_dvvrE-QeVfB57+8v;;dB zelbi;Ek6$@uh9MoD6fNEJEE%E9q2rtge`ZpyQcP30B(f%k*Z@^ge&P9wcpW#rp`-_ zY-~)u3x&*vs$S+R)5ir}x;|`SU>hQU%;zYkliyCC*CQXy!Fjw5)s=M-`l<`bEcikC z_h?5NOIrh}fBUEnEps%j7dW&a^mZaa>w7I}S`FqF$^}HIZ#&cks8PUoMxgKk zbrpS%Q}*8|`wnFVfJG5yD=DD!vek^LsEV4E*I`G_rE0Tk$4S$!N$%0G!90&c!mXRi zN;7K4`0$DJbfc|6M>$N378B@TXdCv)SrfvmQ_+qM%a_SdbfOA)Gyp_Ta*)1}68*3D zfcHRqJ-`?XYUY~9nS<^d)wN{yS%GG!El5|zRuuFy6G5ZY^p6Ur&NFAVQtD<20LU%2JTEN#-vS zSJ1$Z)9Hb^v+vesOs;8ETGtES1KtBY#sgYXg)t zqS-XU5vv=_^SWK;qIG13kwB8rK@%8t3V|RO%i$AUr5^hGRX_W{?Q~qt#@t$A~R#WuV@Z zy{gQF?*3n`bbq|yJ+P5`K>wxM(7=1FoB!INr-eV(U8+JhjpN+cX3$Y(Ot&=4xr2v- z^pc~HsIURyDpSo9iKn#q$Xlf01MdOvfpYgi_*$FPTPDt7e20JDl+BFq=ky#-zT4ut z`qwVdQN`NHu3Kd;;wuv8*(VZ}&h0b3m}q_U*6P*HTljR69T>KXi!Yk%XlBo^tSHZ z#MBoil^k?zLwfZo|5BgI2Gmz=nj6w^6Zg7aAZ;1)a(z>swc=a71GA=XQ&S5l)wXvU z=eFl%?}3fU1L3yEI#b=}Q&U}^H2v6n-Ki-sLjaf|_+coo9n+_N1jb~xx* zI~OiYR=)T?AE6I;XK~VuARJDpS2lX`9`GLMY!3vc5s+ERR>u;;Mfwn){Vr8Uo6>2Z zli88Pt;v4%tIgh;@?pdf07z56K{%lrCsd<_|?mgf=klh1}DZN^vmWz8W zW2=_ - - + android:layout_height="match_parent"> - + android:layout_height="match_parent" + android:orientation="vertical"> - - - + android:background="@color/white"> - + - + - + - + - + android:layout_height="1.5dp" + android:layout_alignParentBottom="true" + android:background="@color/line_form" /> - + android:layout_height="match_parent"> - + - + + + + + - - + + - - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_token_list.xml b/app/src/main/res/layout/item_token_list.xml index 4a4af402..60a25847 100644 --- a/app/src/main/res/layout/item_token_list.xml +++ b/app/src/main/res/layout/item_token_list.xml @@ -1,6 +1,7 @@ @@ -43,8 +44,8 @@ app:layout_constraintTop_toBottomOf="@id/token_name" /> + app:layout_constraintTop_toBottomOf="@id/token_balance" /> diff --git a/app/src/main/res/raw/currency.json b/app/src/main/res/raw/currency.json new file mode 100644 index 00000000..5ef2523e --- /dev/null +++ b/app/src/main/res/raw/currency.json @@ -0,0 +1,34 @@ +{ + "currency": [ + { + "name": "CNY", + "unit": "元", + "symbol": "¥" + }, + { + "name": "USD", + "unit": "美元", + "symbol": "$" + }, + { + "name": "TWD", + "unit": "新台币", + "symbol": "NT$" + }, + { + "name": "HKD", + "unit": "港元", + "symbol": "HK$" + }, + { + "name": "EUR", + "unit": "欧元", + "symbol": "€" + }, + { + "name": "RUB", + "unit": "俄罗斯卢布", + "symbol": "₽" + } + ] +} \ No newline at end of file From 41233b9cad2ab82c84b0789dad583eeeac142769 Mon Sep 17 00:00:00 2001 From: baojun Date: Fri, 3 Aug 2018 19:10:45 +0800 Subject: [PATCH 029/121] fix bugs --- .../fragment/TokenListFragment/view/TokenListFragment.java | 2 +- app/src/main/java/org/nervos/neuron/service/EthRpcService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java index 2d0a3214..a312303d 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java @@ -179,7 +179,7 @@ public void onCompleted() { TokenCurrencyManager.getTokenCurrency(item.currencyID, currencyItem.getName()).subscribe(new Subscriber() { @Override public void onCompleted() { - LogUtil.e("Token", item.symbol + ">>" + item.currencyPrice); +// LogUtil.e("Token", item.symbol + ">>" + item.currencyPrice); adapter.notifyDataSetChanged(); moneyText.setText(presenter.getTotalMoney(tokenItemList)); } diff --git a/app/src/main/java/org/nervos/neuron/service/EthRpcService.java b/app/src/main/java/org/nervos/neuron/service/EthRpcService.java index de151de5..19c36aab 100644 --- a/app/src/main/java/org/nervos/neuron/service/EthRpcService.java +++ b/app/src/main/java/org/nervos/neuron/service/EthRpcService.java @@ -62,7 +62,7 @@ public static void init(Context context) { public static double getEthBalance(String address) { try { EthGetBalance ethGetBalance = service.ethGetBalance(address, - DefaultBlockParameterName.EARLIEST).send(); + DefaultBlockParameterName.LATEST).send(); if (ethGetBalance != null) { return NumberUtil.getEthFromWei(ethGetBalance.getBalance()); } From 0e0ddb65469f43c9f480903ab1891c8089068f98 Mon Sep 17 00:00:00 2001 From: baojun Date: Fri, 3 Aug 2018 23:29:29 +0800 Subject: [PATCH 030/121] add change wallet --- app/src/main/AndroidManifest.xml | 6 +- .../neuron/activity/ChangeWalletActivity.java | 176 ++++++++++++++++++ .../nervos/neuron/custom/WalletTopView.java | 15 +- .../WalletsFragment/view/WalletsFragment.java | 18 ++ .../nervos/neuron/util/db/DBWalletUtil.java | 46 +++-- app/src/main/res/anim/wallet_activity_in.xml | 7 + app/src/main/res/anim/wallet_activity_out.xml | 7 + .../main/res/drawable-xhdpi/ic_wallet_add.png | Bin 0 -> 3733 bytes .../drawable-xhdpi/ic_wallet_change_pull.png | Bin 0 -> 1628 bytes .../res/drawable-xhdpi/ic_wallet_default.png | Bin 0 -> 926 bytes .../res/drawable-xxhdpi/ic_wallet_add.png | Bin 0 -> 6085 bytes .../drawable-xxhdpi/ic_wallet_change_pull.png | Bin 0 -> 2352 bytes .../res/drawable-xxhdpi/ic_wallet_default.png | Bin 0 -> 1160 bytes .../res/layout/activity_change_wallet.xml | 28 +++ app/src/main/res/layout/item_wallet.xml | 61 ++++++ app/src/main/res/layout/item_wallet_add.xml | 27 +++ app/src/main/res/values/strings.xml | 1 + 17 files changed, 377 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/org/nervos/neuron/activity/ChangeWalletActivity.java create mode 100644 app/src/main/res/anim/wallet_activity_in.xml create mode 100644 app/src/main/res/anim/wallet_activity_out.xml create mode 100644 app/src/main/res/drawable-xhdpi/ic_wallet_add.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_wallet_change_pull.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_wallet_default.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_wallet_add.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_wallet_change_pull.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_wallet_default.png create mode 100644 app/src/main/res/layout/activity_change_wallet.xml create mode 100644 app/src/main/res/layout/item_wallet.xml create mode 100644 app/src/main/res/layout/item_wallet_add.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 59a2a287..33af1e75 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -43,7 +43,7 @@ android:label="@string/app_name" android:launchMode="singleTop" android:screenOrientation="portrait" - android:theme="@style/AppTheme.NoActionBar"/> + android:theme="@style/AppTheme.NoActionBar" /> + walletItems = new ArrayList<>(); + private Adapter adapter; + + @Override + protected int getContentLayout() { + return R.layout.activity_change_wallet; + } + + @Override + protected void initView() { + pullImage = findViewById(R.id.iv_pull); + recyclerView = findViewById(R.id.wallet_recycler); + } + + @Override + protected void initData() { + walletItems = DBWalletUtil.getAllWallet(this); + for (int i = 0; i < walletItems.size(); i++) { + if (walletItems.get(i).name.equals(SharePrefUtil.getCurrentWalletName())) { + if (i != 0) { + Collections.swap(walletItems, 0, i); + } + break; + } + } + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + adapter = new Adapter(); + recyclerView.addItemDecoration(new SpaceItemDecoration(60)); + recyclerView.setAdapter(adapter); + } + + @Override + protected void initAction() { + pullImage.setOnClickListener((view) -> { + finish(); + overridePendingTransition(0, R.anim.wallet_activity_out); + }); + } + + @Override + protected int getStatusBarColor() { + return getResources().getColor(R.color.qr_receive_bg); + } + + class Adapter extends RecyclerView.Adapter { + + private int Wallet = 0; + private int Add = 1; + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view; + if (viewType == Wallet) { + view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_wallet, parent, false); + return new WalletHolder(view); + } else { + view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_wallet_add, parent, false); + return new AddHolder(view); + } + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + if (holder instanceof WalletHolder) { + WalletHolder walletHolder = (WalletHolder) holder; + WalletItem walletItem = walletItems.get(position); + walletHolder.nameText.setText(walletItem.name); + walletHolder.addressText.setText(walletItem.address); + walletHolder.photoImage.setImageBitmap(Blockies.createIcon(walletItem.address)); + if (position == 0) + walletHolder.defaultImage.setVisibility(View.VISIBLE); + else + walletHolder.defaultImage.setVisibility(View.GONE); + ((WalletHolder) holder).root.setOnClickListener((view) -> { + SharePrefUtil.putCurrentWalletName(walletItem.name); + EventBus.getDefault().post(new TokenRefreshEvent()); + finish(); + overridePendingTransition(0, R.anim.wallet_activity_out); + }); + } else if (holder instanceof AddHolder) { + ((AddHolder) holder).root.setOnClickListener((view) -> { + startActivity(new Intent(ChangeWalletActivity.this, AddWalletActivity.class)); + }); + } + } + + @Override + public int getItemCount() { + return walletItems.size() + 1; + } + + @Override + public int getItemViewType(int position) { + if (position == walletItems.size()) { + return Add; + } else { + return Wallet; + } + } + + class WalletHolder extends RecyclerView.ViewHolder { + ImageView photoImage, defaultImage; + TextView nameText, addressText; + RelativeLayout root; + + public WalletHolder(View itemView) { + super(itemView); + photoImage = itemView.findViewById(R.id.iv_photo); + defaultImage = itemView.findViewById(R.id.iv_default); + nameText = itemView.findViewById(R.id.tv_name); + addressText = itemView.findViewById(R.id.tv_address); + root = itemView.findViewById(R.id.root); + } + } + + class AddHolder extends RecyclerView.ViewHolder { + RelativeLayout root; + + public AddHolder(View itemView) { + super(itemView); + root = itemView.findViewById(R.id.root); + } + } + } + + class SpaceItemDecoration extends RecyclerView.ItemDecoration { + + private int space; + + public SpaceItemDecoration(int space) { + this.space = space; + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + + if (parent.getChildPosition(view) != 0) + outRect.top = space; + } + } + +} diff --git a/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java b/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java index dd6fdedd..007ce927 100644 --- a/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java +++ b/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java @@ -1,5 +1,6 @@ package org.nervos.neuron.custom; +import android.app.Activity; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; @@ -12,9 +13,13 @@ import android.widget.TextView; import android.widget.Toast; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; import org.nervos.neuron.R; +import org.nervos.neuron.activity.ChangeWalletActivity; import org.nervos.neuron.activity.QrCodeActivity; import org.nervos.neuron.activity.ReceiveQrCodeActivity; +import org.nervos.neuron.event.TokenRefreshEvent; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.util.Blockies; @@ -28,17 +33,20 @@ public class WalletTopView extends ConstraintLayout implements View.OnClickListe private ImageView leftImage, centerImage, rightImage, copyImage; private CircleImageView walletPhoto; private TextView walletName, walletAddress; - private Context context; + private Activity context; private WalletItem walletItem; public WalletTopView(Context context, AttributeSet attrs) { super(context, attrs); - this.context = context; LayoutInflater.from(context).inflate(R.layout.view_wallet_top, this); initView(); initAction(); } + public void setActivity(Activity activity) { + this.context = activity; + } + private void initView() { leftImage = findViewById(R.id.iv_left); centerImage = findViewById(R.id.iv_center); @@ -80,6 +88,9 @@ public void onClick(View view) { context.startActivity(intent1); break; case R.id.iv_center: + Intent intent2 = new Intent(context, ChangeWalletActivity.class); + context.startActivity(intent2); + context.overridePendingTransition(R.anim.wallet_activity_in, 0); break; case R.id.iv_copy: ClipboardManager cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); diff --git a/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java b/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java index baca9a50..d01c6c55 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java @@ -9,11 +9,16 @@ import android.support.v4.view.ViewPager; import android.support.v4.widget.NestedScrollView; import android.view.View; +import android.widget.ImageView; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; import org.nervos.neuron.R; import org.nervos.neuron.activity.AddWalletActivity; +import org.nervos.neuron.activity.ChangeWalletActivity; import org.nervos.neuron.custom.WalletToolbar; import org.nervos.neuron.custom.WalletTopView; +import org.nervos.neuron.event.TokenRefreshEvent; import org.nervos.neuron.fragment.NBaseFragment; import org.nervos.neuron.fragment.SettingsFragment; import org.nervos.neuron.fragment.TokenListFragment.view.TokenListFragment; @@ -37,6 +42,7 @@ public class WalletsFragment extends NBaseFragment { private WalletItem walletItem; private TokenListFragment tokenListFragment; private WalletFragmentPresenter presenter; + private ImageView rightImage; private String[] mTitles = {"代币", "藏品"}; @@ -53,6 +59,7 @@ protected void initView() { appBarLayout = (AppBarLayout) findViewById(R.id.app_bar); toolbar = (WalletToolbar) findViewById(R.id.toolbar); walletView = (WalletTopView) findViewById(R.id.wallet_view); + rightImage = (ImageView) findViewById(R.id.iv_right); mNestedScrollView = (NestedScrollView) findViewById(R.id.nestedScrollView); mNestedScrollView.setFillViewport(true); @@ -65,6 +72,7 @@ protected void initView() { @Override protected void initData() { super.initData(); + walletView.setActivity(getActivity()); mTabLayout.post(() -> { presenter.setIndicator(mTabLayout, 70, 70); }); @@ -89,6 +97,16 @@ protected void initAction() { walletView.setAlpha(1.0f - alfha); } }); + toolbar.setRightTitleClickListener((view) -> { + Intent intent2 = new Intent(getActivity(), ChangeWalletActivity.class); + startActivity(intent2); + getActivity().overridePendingTransition(R.anim.wallet_activity_in, 0); + }); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onWalletSaveEvent(TokenRefreshEvent event) { + initWalletData(); } private void initWalletData() { diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java index c3a215f4..aa09f8bb 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java @@ -50,14 +50,14 @@ public static List getAllWalletName(Context context) { DB db = DBFactory.open(context, DB_WALLET); String[] keys = db.findKeys(DB_PREFIX); List walletItems = new ArrayList<>(); - for(String key: keys) { + for (String key : keys) { walletItems.add(db.getObject(key, WalletItem.class)); } db.close(); Collections.sort(walletItems, new Comparator() { @Override public int compare(WalletItem o1, WalletItem o2) { - return (int)(o2.timestamp - o1.timestamp); + return (int) (o2.timestamp - o1.timestamp); } }); for (WalletItem walletItem : walletItems) { @@ -69,7 +69,28 @@ public int compare(WalletItem o1, WalletItem o2) { return walletList; } - public static void saveWallet(Context context, WalletItem walletItem){ + public static List getAllWallet(Context context) { + List walletItems = new ArrayList<>(); + try { + DB db = DBFactory.open(context, DB_WALLET); + String[] keys = db.findKeys(DB_PREFIX); + for (String key : keys) { + walletItems.add(db.getObject(key, WalletItem.class)); + } + db.close(); + Collections.sort(walletItems, new Comparator() { + @Override + public int compare(WalletItem o1, WalletItem o2) { + return (int) (o2.timestamp - o1.timestamp); + } + }); + } catch (SnappydbException e) { + e.printStackTrace(); + } + return walletItems; + } + + public static void saveWallet(Context context, WalletItem walletItem) { try { DB db = DBFactory.open(context, DB_WALLET); db.put(getDbKey(walletItem.name), walletItem); @@ -129,7 +150,7 @@ public static boolean checkWalletAddress(Context context, String address) { try { DB db = DBFactory.open(context, DB_WALLET); List names = getAllWalletName(context); - for(String name: names) { + for (String name : names) { WalletItem walletItem = getWallet(context, name); isKeyExist = (walletItem != null && walletItem.address.equals(address)); } @@ -151,7 +172,7 @@ public static void deleteWallet(Context context, String name) { } } - public static void addTokenToWallet(Context context, String walletName, TokenItem tokenItem){ + public static void addTokenToWallet(Context context, String walletName, TokenItem tokenItem) { WalletItem walletItem = getWallet(context, walletName); if (walletItem != null) { if (walletItem.tokenItems == null) { @@ -183,28 +204,28 @@ public static boolean checkTokenInCurrentWallet(Context context, String symbol) return false; } - public static void addTokenToAllWallet(Context context, TokenItem tokenItem){ + public static void addTokenToAllWallet(Context context, TokenItem tokenItem) { List walletNames = getAllWalletName(context); - for (String walletName: walletNames) { + for (String walletName : walletNames) { addTokenToWallet(context, walletName, tokenItem); } } - public static void addTokenToCurrentWallet(Context context, TokenItem tokenItem){ + public static void addTokenToCurrentWallet(Context context, TokenItem tokenItem) { WalletItem walletItem = getCurrentWallet(context); addTokenToWallet(context, walletItem.name, tokenItem); } - public static void deleteTokenFromWallet(Context context, String walletName, TokenItem tokenItem){ + public static void deleteTokenFromWallet(Context context, String walletName, TokenItem tokenItem) { WalletItem walletItem = getWallet(context, walletName); if (walletItem != null) { if (walletItem.tokenItems == null) { walletItem.tokenItems = new ArrayList<>(); } Iterator iterator = walletItem.tokenItems.iterator(); - while(iterator.hasNext()){ + while (iterator.hasNext()) { TokenItem item = iterator.next(); - if(tokenItem.symbol.equals(item.symbol)){ + if (tokenItem.symbol.equals(item.symbol)) { iterator.remove(); } } @@ -212,7 +233,7 @@ public static void deleteTokenFromWallet(Context context, String walletName, Tok } } - public static void deleteTokenFromCurrentWallet(Context context, TokenItem tokenItem){ + public static void deleteTokenFromCurrentWallet(Context context, TokenItem tokenItem) { WalletItem walletItem = getCurrentWallet(context); deleteTokenFromWallet(context, walletItem.name, tokenItem); } @@ -225,6 +246,7 @@ public static List getAllTokenFromWallet(Context context, String wall /** * add origin token of ethereum and cita to wallet + * * @param context * @param walletItem * @return diff --git a/app/src/main/res/anim/wallet_activity_in.xml b/app/src/main/res/anim/wallet_activity_in.xml new file mode 100644 index 00000000..2c77041a --- /dev/null +++ b/app/src/main/res/anim/wallet_activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/wallet_activity_out.xml b/app/src/main/res/anim/wallet_activity_out.xml new file mode 100644 index 00000000..f5da6e64 --- /dev/null +++ b/app/src/main/res/anim/wallet_activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/ic_wallet_add.png b/app/src/main/res/drawable-xhdpi/ic_wallet_add.png new file mode 100644 index 0000000000000000000000000000000000000000..76786b540540fd1d8cb7ba0c476d40092bac1bef GIT binary patch literal 3733 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 EA2q(cbpQYW literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_wallet_change_pull.png b/app/src/main/res/drawable-xxhdpi/ic_wallet_change_pull.png new file mode 100644 index 0000000000000000000000000000000000000000..a3b73ddb4c30e1bf56614c918e27a286074e14d8 GIT binary patch literal 2352 zcmeHI_ct4gA5CJ*L!^jJ(I_R=s#a0dDEcaht&xPK_t4T@n59W`+i%*KB1zt1W+w$4hrVB$j?aQ;#<;}yD(RNn z2_nLcFZPk9heF4{$GlZ%eUQNhqYXy0#H)Ng2uU8&7cH@2Cz~feGM?A4@btzN41d&h zzI?auWq(6HyanrYdvfZ_zha0JVs@Uv#spy{uFU9uy-%lKDgI}X`(R>l*DB=g zOaVhb%TRbQzHk0&E~M^?Vv|6v#Sn-HELYA;6oSgc$M$4biGvblgo~u%;DKTV6yAel zzSuQ*!D&uvc9bl=OCBT-s_r+v!-lK|ZxBM`_QzC@Mm76#pF2B$q2%1j!gWKt)6+>x z+MbL)QTUHXhJhm)9*LrTvW-{tJk6*h29HX8Xej}26x4>;Ymo(E!5=?8-5%ai9WDN8 zTY1gB#tb=*CcBNb7)gOC%Qb__6ar6m;ZU|4R@g-+k92q5JycP?`_|13hkkGR>5MtH!g`Kg;nO zo}L(D78<1mbh39wsz6W7agi+QLG#Q!kIgaJ*NySf@8L!5Jzx2Qd6XlKYRXa%SbY(_ zJ(?)*(wgFnLh4kzpjGx#h|u$fJD+PLT$nUr|L`?LE8Bpsej1>1bVrLHH=AjC$qIun zU~{aHTvEG`X8iJGFB9mxyG?utul{aY6#1(Iwxzv(^-06=!fu>y5cSsl_}fd>PjQd| z#ynG8#lWVam*EwbM?|7aR5!W2BfuU(j*fu1DvpH@UOog5HHv_G6nJEYQ{}#WQ#29z zk7z((6#qI!1~LXJ=W7X)nM*jj>2LAVr>!K3-c|M)E6*i*s7Po?yXK0xfpjEB>kwk^ zMI2jaliUo$do}K2N!@Mduh1f0$?J*ZPwbquY6!RG!nfs2WcQAe8<2?sCmG38f}J~Z zH!`MV2B1+Gyhw-<@(|>w@!c
p=0?FN@NK`}sP1Uaw2>@;xD0K@A~dy-<_9 znF$DzISJI#==@pHvx@q;*RdipIE6C?Y#XZExMi++87xTRfaz5*9$M?j@E};17A`d@ zya!0NGMAtU zpOpL6H%;FVfGQH`wNAzz_mX{JI$C>@brvus^Bn=d_@ETw#j8vDsw$?KCf!=gpGBs` zd&#Y!kE86Jzhhf;%PjTB{$Rt{Uzno-3OJ|Jyxn=Ym@#0yLo9U;RvT$i66W8t!co^; z-OYiz58IMNhjWJiH9(T*c1bew*b+xSX04GJ0r4}e!hsPnNn&;V!~AQse~bCi6B!f- zWc%*%r?Lg=Nx!0}b4n)!EM+yfEOY1d8006Gs`_F5 zmUaeZ#X$PecIm5e#Dv<4{#k8oa5&w) z@y|-*Gx~)0`|V6~ZGyN0d-L^AMnIlt8{xHYTz9Cv@=@2%m1{gwG#!X*_(jKX`SSB> O0+<*g4eIo8(f-D6&!tg#vA%2)z}-DUMNEptQ8*X)J9fBFqf} zEWkvea*1G43Z- zM>{%rI8Z1QM_vp&0gb`v46?UIUNW|21PxXN3DJ>O5AXODBQ6!hC34VW(oqoPV)65U z$cKG}7~*p*o(pkGh|h)iJcvULIoS82QaA=hYrWiLMh5qYe3?U-ihCz(QNCSol zf<+cjgJ2=hk&Cd?Q-LOgAd6Tm%-#z87J@>&t7yk!kmSHdLJx^#xe*;*Ass#!g05|R zJN`t43H<#OXO|u0;I8+Ar#k@_{b2>@V2D};SS3tgI&22B6hI0p__iLv3eMX=mmNU= z#t|5C8FztkcRhgK>nYBoG>Wg#4RnZtRUl9tEP2&&OS=9%blG&-*|Yw4yzeu&Y^G2) z`0&^fiK??rb(+JIyS8(6wwpiLl^47D(*qt$!TvDu%u|2KSaA8&>%Pd!bzTZIF@Nz5Ztw0Gw-#o)P{z~lzM4i_1{eO z63x1n`ObYZy`kcd2Wg`2>C%c5-X+>Lc2J7IHDlYk)*kH@ zDrL>HRa~a+Aa|Vht)#XNkhR{WXTRYKRLRT|xx!ufI5x7BS);4s2Nbzi3{5PD6p}ZM zgA0!i2KG?RGolNLWM6cjv}m-N%3TQ;zVbWu>*y_MJ`uRc`H<66!~Co(VV}e+y5?tc zO?Epqu!Up2ugNh0zsQ;W?GNgobPj4x8p>X`Gq_JW zY-n|Az4pknx5;wi+R&uAx4p6Ye#WhXuNA|_A8E{`lRpiZKkAf(EnHaiU$5!YSvNk{ zEs$$MV(w6H=?@Qrv`0UO|;fa3$)W}{h literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_change_wallet.xml b/app/src/main/res/layout/activity_change_wallet.xml new file mode 100644 index 00000000..33187eb2 --- /dev/null +++ b/app/src/main/res/layout/activity_change_wallet.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_wallet.xml b/app/src/main/res/layout/item_wallet.xml new file mode 100644 index 00000000..3ebaa3aa --- /dev/null +++ b/app/src/main/res/layout/item_wallet.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_wallet_add.xml b/app/src/main/res/layout/item_wallet_add.xml new file mode 100644 index 00000000..cadf0384 --- /dev/null +++ b/app/src/main/res/layout/item_wallet_add.xml @@ -0,0 +1,27 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8aa46cc1..b5725dab 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,6 +17,7 @@ 请选择钱包 添加新资产 新增钱包 + 添加钱包 资产管理 收款码 备份助记词 From aead44a1f896f1bcdff3d6a1b2463342bf4e6ddf Mon Sep 17 00:00:00 2001 From: baojun Date: Sat, 4 Aug 2018 10:48:30 +0800 Subject: [PATCH 031/121] fix bugs --- app/build.gradle | 2 - .../TokenListFragment/model/TokenAdapter.java | 26 +++++++------ .../view/TokenListFragment.java | 37 +++++------------- .../nervos/neuron/item/CurrencyIDItem.java | 10 ++--- .../org/nervos/neuron/item/TokenItem.java | 3 -- .../util/currency/TokenCurrencyManager.java | 39 ++++++++++++++++++- app/src/main/res/layout/item_token_list.xml | 4 +- 7 files changed, 69 insertions(+), 52 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c8afb7c9..1467efe2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,8 +110,6 @@ dependencies { implementation files('libs/crypto-3.3.0-android.jar') implementation files('libs/protobuf-3.3.0-android.jar') implementation files('libs/infura-3.3.1-android.jar') - implementation 'com.github.bumptech.glide:glide:4.7.1' - annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1' } def getVersionName(boolean isDebug) { diff --git a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java index 6d44ce86..3113e3f4 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java +++ b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java @@ -1,17 +1,19 @@ package org.nervos.neuron.fragment.TokenListFragment.model; import android.app.Activity; +import android.net.Uri; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; -import com.bumptech.glide.Glide; +import com.facebook.drawee.backends.pipeline.Fresco; +import com.facebook.drawee.interfaces.DraweeController; +import com.facebook.drawee.view.SimpleDraweeView; import org.nervos.neuron.R; import org.nervos.neuron.item.CurrencyItem; @@ -50,20 +52,20 @@ public TokenViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { @Override public void onBindViewHolder(@NonNull TokenViewHolder holder, int position) { TokenItem tokenItem = tokenItemList.get(position); + Uri uri = null; if (TextUtils.isEmpty(tokenItem.avatar)) { if (tokenItem.chainId < 0) { - Glide.with(activity) - .load(R.drawable.ether_small) - .into(holder.tokenImage); + holder.tokenImage.setImageResource(R.drawable.ether_big); } else { - Glide.with(activity) - .load(R.mipmap.ic_launcher) - .into(holder.tokenImage); + holder.tokenImage.setImageResource(R.mipmap.ic_launcher); } } else { - Glide.with(activity) - .load(tokenItem.avatar) - .into(holder.tokenImage); + uri = Uri.parse(tokenItem.avatar); + DraweeController controller = Fresco.newDraweeControllerBuilder() + .setUri(uri) + .setAutoPlayAnimations(true) + .build(); + holder.tokenImage.setController(controller); } if (tokenItem != null) { holder.tokenName.setText(tokenItem.symbol); @@ -92,7 +94,7 @@ public int getItemCount() { } class TokenViewHolder extends RecyclerView.ViewHolder { - ImageView tokenImage; + SimpleDraweeView tokenImage; TextView tokenName; TextView tokenBalance; TextView tokenNetworkText; diff --git a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java index a312303d..b9929a8a 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java @@ -172,34 +172,11 @@ public void setData() { private void getPrice() { for (TokenItem item : this.tokenItemList) { if (item.balance != 0.0 && item.chainId < 0) - TokenCurrencyManager.getTokenID(item.symbol).subscribe(new Subscriber() { + TokenCurrencyManager.getCurrency(item.symbol,currencyItem.getName()).subscribe(new Subscriber() { @Override public void onCompleted() { - if (!TextUtils.isEmpty(item.currencyID)) - TokenCurrencyManager.getTokenCurrency(item.currencyID, currencyItem.getName()).subscribe(new Subscriber() { - @Override - public void onCompleted() { -// LogUtil.e("Token", item.symbol + ">>" + item.currencyPrice); - adapter.notifyDataSetChanged(); - moneyText.setText(presenter.getTotalMoney(tokenItemList)); - } - - @Override - public void onError(Throwable e) { - - } - - @Override - public void onNext(String s) { - if (!TextUtils.isEmpty(s)) { - double price = Double.parseDouble(s.trim()); - DecimalFormat df = new DecimalFormat("######0.00"); -// item.currencyPrice = Double.parseDouble(df.format(price * 0.155)); - item.currencyPrice = Double.parseDouble(df.format(price * item.balance)); - } else - item.currencyPrice = 0.00; - } - }); + adapter.notifyDataSetChanged(); + moneyText.setText(presenter.getTotalMoney(tokenItemList)); } @Override @@ -209,7 +186,13 @@ public void onError(Throwable e) { @Override public void onNext(String s) { - item.currencyID = s; + if (!TextUtils.isEmpty(s)) { + double price = Double.parseDouble(s.trim()); + DecimalFormat df = new DecimalFormat("######0.00"); +// item.currencyPrice = Double.parseDouble(df.format(price * 0.155)); + item.currencyPrice = Double.parseDouble(df.format(price * item.balance)); + } else + item.currencyPrice = 0.00; } }); } diff --git a/app/src/main/java/org/nervos/neuron/item/CurrencyIDItem.java b/app/src/main/java/org/nervos/neuron/item/CurrencyIDItem.java index 21bcf520..3b684582 100644 --- a/app/src/main/java/org/nervos/neuron/item/CurrencyIDItem.java +++ b/app/src/main/java/org/nervos/neuron/item/CurrencyIDItem.java @@ -5,7 +5,7 @@ */ public class CurrencyIDItem { - private String id, name, symbol, website_slug; + private String id, name, symbol, websiteSlug; public String getId() { return id; @@ -31,11 +31,11 @@ public void setSymbol(String symbol) { this.symbol = symbol; } - public String getWebsite_slug() { - return website_slug; + public String getWebsiteSlug() { + return websiteSlug; } - public void setWebsite_slug(String website_slug) { - this.website_slug = website_slug; + public void setWebsiteSlug(String websiteSlug) { + this.websiteSlug = websiteSlug; } } diff --git a/app/src/main/java/org/nervos/neuron/item/TokenItem.java b/app/src/main/java/org/nervos/neuron/item/TokenItem.java index 1a99e82d..cc4ddadb 100644 --- a/app/src/main/java/org/nervos/neuron/item/TokenItem.java +++ b/app/src/main/java/org/nervos/neuron/item/TokenItem.java @@ -19,7 +19,6 @@ public class TokenItem implements Parcelable { public int chainId; public String chainName; public double balance; - public String currencyID; public double currencyPrice; public TokenItem() { @@ -85,7 +84,6 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.chainId); dest.writeString(this.chainName); dest.writeDouble(this.balance); - dest.writeString(this.currencyID); dest.writeDouble(this.currencyPrice); } @@ -100,7 +98,6 @@ protected TokenItem(Parcel in) { this.chainId = in.readInt(); this.chainName = in.readString(); this.balance = in.readDouble(); - this.currencyID = in.readString(); this.currencyPrice = in.readDouble(); } diff --git a/app/src/main/java/org/nervos/neuron/util/currency/TokenCurrencyManager.java b/app/src/main/java/org/nervos/neuron/util/currency/TokenCurrencyManager.java index 448c54b7..f3da66f6 100644 --- a/app/src/main/java/org/nervos/neuron/util/currency/TokenCurrencyManager.java +++ b/app/src/main/java/org/nervos/neuron/util/currency/TokenCurrencyManager.java @@ -1,7 +1,10 @@ package org.nervos.neuron.util.currency; +import android.text.TextUtils; + import com.google.gson.Gson; +import org.json.JSONException; import org.json.JSONObject; import org.nervos.neuron.item.CurrencyIDItem; import org.nervos.neuron.item.CurrencyIDList; @@ -26,6 +29,39 @@ public class TokenCurrencyManager { private static ArrayList list = null; + public static Observable getCurrency(String symbol, String currency) { + return getTokenID(symbol) + .subscribeOn(Schedulers.newThread()) + .flatMap(new Func1>() { + @Override + public Observable call(String ID) { + if (!TextUtils.isEmpty(ID)) { + String url = ConstUtil.Token_CURRENCY.replace("@ID", ID).replace("@Currency", currency); + Request request = new Request.Builder().url(url).build(); + Call call = NervosHttpService.getHttpClient().newCall(request); + String response = ""; + try { + response = call.execute().body().string(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + JSONObject object = new JSONObject(response); + JSONObject data = object.optJSONObject("data"); + JSONObject quotes = data.optJSONObject("quotes"); + JSONObject quote = quotes.optJSONObject(currency); + if (quote != null) { + return Observable.just(quote.optString("price")); + } + } catch (JSONException e) { + } + } + return Observable.just(null); + } + }) + .observeOn(AndroidSchedulers.mainThread()); + } + public static Observable getTokenCurrency(String ID, String currency) { return Observable.fromCallable(() -> { String url = ConstUtil.Token_CURRENCY.replace("@ID", ID).replace("@Currency", currency); @@ -66,7 +102,8 @@ public static Observable getTokenID(String symbol) { list = gson.fromJson(response, CurrencyIDList.class).getList(); } return list; - }).subscribeOn(Schedulers.newThread()) + }) + .subscribeOn(Schedulers.newThread()) .flatMap(new Func1, Observable>() { @Override public Observable call(ArrayList currencyIDItems) { diff --git a/app/src/main/res/layout/item_token_list.xml b/app/src/main/res/layout/item_token_list.xml index bf84e188..dd8872f4 100644 --- a/app/src/main/res/layout/item_token_list.xml +++ b/app/src/main/res/layout/item_token_list.xml @@ -6,13 +6,13 @@ android:layout_height="80dip" android:layout_marginLeft="20dp"> - + android:scaleType="centerInside" /> Date: Sat, 4 Aug 2018 12:46:05 +0800 Subject: [PATCH 032/121] udpate transaction list to activity --- app/src/main/AndroidManifest.xml | 4 + .../nervos/neuron/activity/MainActivity.java | 14 - .../activity/TransactionDetailActivity.java | 2 +- .../activity/TransactionListActivity.java | 244 ++++++++++++++++++ .../org/nervos/neuron/custom/TitleBar.java | 21 +- .../neuron/fragment/WalletFragment.java | 16 +- .../neuron/service/NervosHttpService.java | 63 +++++ app/src/main/res/layout/activity_main.xml | 7 - .../res/layout/activity_receive_qrcode.xml | 4 +- .../res/layout/activity_transaction_list.xml | 69 +++++ app/src/main/res/layout/custom_titlebar.xml | 6 + .../main/res/layout/item_transaction_list.xml | 5 + app/src/main/res/values/attrs.xml | 2 + app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 2 +- 15 files changed, 423 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/org/nervos/neuron/activity/TransactionListActivity.java create mode 100644 app/src/main/res/layout/activity_transaction_list.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 33af1e75..82f51867 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,6 +50,10 @@ android:screenOrientation="portrait" android:theme="@style/AppTheme.NoActionBar" /> + + transactionItemList = new ArrayList<>(); + private WalletItem walletItem; + + private RecyclerView recyclerView; + private SwipeRefreshLayout swipeRefreshLayout; + private TransactionAdapter adapter = new TransactionAdapter(); + + private AppCompatButton receiveButton, transferButton; + private TokenItem tokenItem; + + @Override + protected int getContentLayout() { + return R.layout.activity_transaction_list; + } + + @Override + protected void initView() { + recyclerView = findViewById(R.id.transaction_recycler); + swipeRefreshLayout = findViewById(R.id.swipe_refresh_layout); + receiveButton = findViewById(R.id.receive_token); + transferButton = findViewById(R.id.transfer_token); + } + + @Override + protected void initData() { + walletItem = DBWalletUtil.getCurrentWallet(mActivity); + tokenItem = getIntent().getParcelableExtra(EXTRA_TOKEN); + initAdapter(); + showProgressBar(); + getTransactionList(); + initRefreshData(); + } + + @Override + protected void initAction() { + receiveButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(mActivity, ReceiveQrCodeActivity.class)); + } + }); + transferButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(mActivity, TransferActivity.class); + intent.putExtra(TransferActivity.EXTRA_TOKEN, tokenItem); + startActivity(intent); + } + }); + } + + private void initAdapter() { + recyclerView.setLayoutManager(new LinearLayoutManager(mActivity)); + recyclerView.setAdapter(adapter); + + adapter.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(View view, int position) { + Intent intent = new Intent(mActivity, TransactionDetailActivity.class); + intent.putExtra(EXTRA_TRANSACTION, transactionItemList.get(position)); + startActivity(intent); + } + }); + } + + + private void initRefreshData() { + swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + getTransactionList(); + } + }); + } + + + private void getTransactionList() { + if (!isNativeToken(tokenItem)) return; + Observable> observable = isETH(tokenItem)? + NervosHttpService.getETHTransactionList(mActivity) + : NervosHttpService.getNervosTransactionList(mActivity); + observable.subscribe(new Subscriber>() { + @Override + public void onCompleted() { + dismissProgressBar(); + swipeRefreshLayout.setRefreshing(false); + } + @Override + public void onError(Throwable e) { + e.printStackTrace(); + dismissProgressBar(); + swipeRefreshLayout.setRefreshing(false); + } + @Override + public void onNext(List list) { + if (list == null) { + Toast.makeText(mActivity, R.string.network_error, Toast.LENGTH_SHORT).show(); + return; + } + Collections.sort(list, new Comparator() { + @Override + public int compare(TransactionItem item1, TransactionItem item2) { + return item2.getDate().compareTo(item1.getDate()); + } + }); + transactionItemList = list; + adapter.notifyDataSetChanged(); + } + }); + } + + + class TransactionAdapter extends RecyclerView.Adapter { + + public static final int VIEW_TYPE_ITEM = 1; + public static final int VIEW_TYPE_EMPTY = 0; + + public OnItemClickListener onItemClickListener; + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + this.onItemClickListener = onItemClickListener; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ + if (viewType == VIEW_TYPE_EMPTY) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_empty_view, parent, false); + ((TextView)view.findViewById(R.id.empty_text)).setText(R.string.empty_no_transaction_data); + return new RecyclerView.ViewHolder(view){}; + } + TransactionViewHolder holder = new TransactionViewHolder(LayoutInflater.from( + mActivity).inflate(R.layout.item_transaction_list, parent, + false)); + return holder; + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + if (holder instanceof TransactionViewHolder) { + TransactionItem transactionItem = transactionItemList.get(position); + TransactionViewHolder viewHolder = (TransactionViewHolder)holder; + if (walletItem != null) { + viewHolder.walletImage.setImageBitmap(Blockies.createIcon(walletItem.address)); + } + viewHolder.transactionIdText.setText(transactionItem.hash); + String value = (transactionItem.from.equalsIgnoreCase(walletItem.address)? "-" : "+") + + transactionItem.value; + viewHolder.transactionAmountText.setText(value); + viewHolder.transactionChainNameText.setText(transactionItem.chainName); + viewHolder.transactionTimeText.setText(transactionItem.getDate()); + viewHolder.itemView.setTag(position); + } + } + + @Override + public int getItemCount() { + if (transactionItemList.size() == 0) { + return 1; + } + return transactionItemList.size(); + } + + @Override + public int getItemViewType(int position) { + if (transactionItemList.size() == 0) { + return VIEW_TYPE_EMPTY; + } + return VIEW_TYPE_ITEM; + } + + class TransactionViewHolder extends RecyclerView.ViewHolder { + CircleImageView walletImage; + TextView transactionIdText; + TextView transactionAmountText; + TextView transactionTimeText; + TextView transactionChainNameText; + + public TransactionViewHolder (View view) { + super(view); + view.setOnClickListener(v -> { + if (onItemClickListener != null) { + onItemClickListener.onItemClick(v, (int)v.getTag()); + } + }); + walletImage = view.findViewById(R.id.wallet_photo); + transactionIdText = view.findViewById(R.id.transaction_id_text); + transactionTimeText = view.findViewById(R.id.transaction_time_text); + transactionAmountText = view.findViewById(R.id.transaction_amount); + transactionChainNameText = view.findViewById(R.id.transaction_chain_name); + } + } + } + + private interface OnItemClickListener{ + void onItemClick(View view, int position); + } + + private boolean isNativeToken(TokenItem tokenItem) { + return TextUtils.isEmpty(tokenItem.contractAddress); + } + + private boolean isETH(TokenItem tokenItem) { + return ConstUtil.ETH.equals(tokenItem.symbol); + } +} diff --git a/app/src/main/java/org/nervos/neuron/custom/TitleBar.java b/app/src/main/java/org/nervos/neuron/custom/TitleBar.java index 7560121c..4137d563 100644 --- a/app/src/main/java/org/nervos/neuron/custom/TitleBar.java +++ b/app/src/main/java/org/nervos/neuron/custom/TitleBar.java @@ -22,11 +22,12 @@ public class TitleBar extends RelativeLayout implements View.OnClickListener { private RelativeLayout mTitleBarView, mTitleBarLeftView, mTitleBarCenterView, mTitleBarRightView; private TextView mTitleBarLeftDefaultView, mTitleBarCenterDefaultView, mTitleBarRightDefaultView; + private View bottomLine; private String mTitle, mLeftText, mRightText; private Context mContext; private OnRightClickListener mOnRightClickListener; private OnLeftClickListener mOnLeftClickListener; - private boolean mIsShowLeft, mIsShowRight; + private boolean mIsShowLeft, mIsShowRight, mIsShowBottom; private int mTitleImg, mLeftImg, mRightImg, mTitleBg; @@ -55,6 +56,7 @@ private void initView() { mTitleBarLeftDefaultView = findViewById(R.id.title_bar_left_default); mTitleBarCenterDefaultView = findViewById(R.id.title_bar_center_default); mTitleBarRightDefaultView = findViewById(R.id.title_bar_right_default); + bottomLine = findViewById(R.id.bottom_line); } private void initListener() { @@ -66,6 +68,7 @@ private void initFromAttributes(AttributeSet attrs) { TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.TitleBar); mIsShowLeft = a.getBoolean(R.styleable.TitleBar_isShowLeft, true); mIsShowRight = a.getBoolean(R.styleable.TitleBar_isShowRight, false); + mIsShowBottom = a.getBoolean(R.styleable.TitleBar_isShowBottomLine, true); if (mIsShowRight) showRight(); @@ -77,6 +80,12 @@ private void initFromAttributes(AttributeSet attrs) { else hideLeft(); + if (mIsShowBottom) { + showBottomLine(); + } else { + hideBottomLine(); + } + mTitle = a.getString(R.styleable.TitleBar_title); mTitleBarCenterDefaultView.setText(mTitle); int mTitleColor = a.getResourceId(R.styleable.TitleBar_title_color, 0); @@ -248,6 +257,16 @@ public void showRight() { mTitleBarRightView.setVisibility(View.VISIBLE); } + public void showBottomLine() { + mIsShowBottom = true; + bottomLine.setVisibility(VISIBLE); + } + + public void hideBottomLine() { + mIsShowBottom = false; + bottomLine.setVisibility(GONE); + } + /** * 设置标题 (仅文字) diff --git a/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java b/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java index a789409f..d63d03ef 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java @@ -28,6 +28,7 @@ import org.nervos.neuron.activity.AddWalletActivity; import org.nervos.neuron.activity.ReceiveQrCodeActivity; import org.nervos.neuron.activity.TokenManageActivity; +import org.nervos.neuron.activity.TransactionListActivity; import org.nervos.neuron.activity.TransferActivity; import org.nervos.neuron.activity.WalletManageActivity; import org.nervos.neuron.custom.TitleBar; @@ -162,18 +163,9 @@ private void initAdapter() { tokenAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(View view, int position) { - TokenTransferDialog dialog = new TokenTransferDialog(getContext(), tokenItemList.get(position)); - dialog.setOnReceiveClickListener(v -> { - startActivity(new Intent(getActivity(), ReceiveQrCodeActivity.class)); - dialog.dismiss(); - }); - dialog.setOnTransferClickListener(v -> { - Intent intent = new Intent(getActivity(), TransferActivity.class); - intent.putExtra(TransferActivity.EXTRA_TOKEN, tokenItemList.get(position)); - startActivity(intent); - dialog.dismiss(); - }); - dialog.show(); + Intent intent = new Intent(getActivity(), TransactionListActivity.class); + intent.putExtra(TransactionListActivity.EXTRA_TOKEN, tokenItemList.get(position)); + startActivity(intent); } }); } diff --git a/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java b/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java index 4c559190..538bd67f 100644 --- a/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java +++ b/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java @@ -96,4 +96,67 @@ public Observable> call(List list) { .observeOn(AndroidSchedulers.mainThread()); } + + + + public static Observable> getETHTransactionList(Context context) { + return Observable.just(DBWalletUtil.getCurrentWallet(context)) + .flatMap(new Func1>>() { + @Override + public Observable> call(WalletItem walletItem) { + try { + String ethUrl = ConstUtil.ETH_TRANSACTION_URL + walletItem.address; + final Request ethRequest = new Request.Builder().url(ethUrl).build(); + Call ethCall = NervosHttpService.getHttpClient().newCall(ethRequest); + EthTransactionResponse response = new Gson().fromJson(ethCall.execute() + .body().string(), EthTransactionResponse.class); + List transactionItemList = response.result; + for(TransactionItem item : transactionItemList) { + item.chainName = ConstUtil.ETH_MAINNET; + item.value = (NumberUtil.getEthFromWeiForStringDecimal6(item.value) + ConstUtil.ETH); + } + return Observable.just(transactionItemList); + } catch (IOException e) { + e.printStackTrace(); + } + return Observable.just(null); + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + + public static Observable> getNervosTransactionList(Context context) { + WalletItem walletItem = DBWalletUtil.getCurrentWallet(context); + return Observable.fromCallable(new Callable() { + @Override + public EthMetaData.EthMetaDataResult call() { + NervosRpcService.init(context, ConstUtil.NERVOS_NODE_IP); + return NervosRpcService.getMetaData().getEthMetaDataResult(); + } + }).flatMap(new Func1>>() { + @Override + public Observable> call(EthMetaData.EthMetaDataResult result) { + try { + String nervosUrl = ConstUtil.NERVOS_TRANSACTION_URL + walletItem.address; + final Request nervosRequest = new Request.Builder().url(nervosUrl).build(); + Call nervosCall = NervosHttpService.getHttpClient().newCall(nervosRequest); + + NervosTransactionResponse response = new Gson().fromJson(nervosCall.execute() + .body().string(), NervosTransactionResponse.class); + for (TransactionItem item : response.result.transactions) { + item.chainName = result.chainName; + item.value = NumberUtil.getEthFromWeiForStringDecimal6(item.value) + + result.tokenSymbol; + } + return Observable.just(response.result.transactions); + } catch (IOException e) { + e.printStackTrace(); + } + return Observable.just(null); + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 74e97702..75ce1b01 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -29,19 +29,12 @@ android:drawableTop="@drawable/tab_wallet" android:text="@string/tab_wallet" /> - - -
diff --git a/app/src/main/res/layout/activity_receive_qrcode.xml b/app/src/main/res/layout/activity_receive_qrcode.xml index bf42aac3..9c3e5dd2 100644 --- a/app/src/main/res/layout/activity_receive_qrcode.xml +++ b/app/src/main/res/layout/activity_receive_qrcode.xml @@ -12,11 +12,13 @@ android:layout_height="48dp" android:layout_alignParentTop="true" app:isShowLeft="true" + app:left_img="@drawable/back" app:isShowRight="true" app:right_img="@drawable/ic_share" app:title="@string/title_receive_qrcode" app:title_bg="@color/transparent" - app:title_color="@color/white" /> + app:title_color="@color/white" + app:isShowBottomLine="false"/> + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/custom_titlebar.xml b/app/src/main/res/layout/custom_titlebar.xml index 72458b81..00020603 100644 --- a/app/src/main/res/layout/custom_titlebar.xml +++ b/app/src/main/res/layout/custom_titlebar.xml @@ -63,4 +63,10 @@ + \ No newline at end of file diff --git a/app/src/main/res/layout/item_transaction_list.xml b/app/src/main/res/layout/item_transaction_list.xml index 0b600178..32468f99 100644 --- a/app/src/main/res/layout/item_transaction_list.xml +++ b/app/src/main/res/layout/item_transaction_list.xml @@ -74,6 +74,11 @@ android:text="Ethereum Mainnet"/> + + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index ddd20b94..9246fc5f 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -13,6 +13,8 @@ + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index fe2103f9..6a71b0e3 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -25,6 +25,7 @@ #fff5f5f5 #FFFEED #ff8f27 + #FF8C36 #333333 #E5E5E5 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b5725dab..2f56a5b2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -97,7 +97,7 @@ 钱包名称 请输入钱包名称 请输入钱包密码 - 交易 + 交易列表 请输入密码 请输入新密码 请再次输入新密码 From 64c8c6c1a45596ca5c836dbc66c16940c2c950a8 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Sat, 4 Aug 2018 23:25:58 +0800 Subject: [PATCH 033/121] upgrade nosql database --- .../org/nervos/neuron/util/db/DBAppUtil.java | 2 +- .../nervos/neuron/util/db/DBChainUtil.java | 2 +- .../nervos/neuron/util/db/DBHistoryUtil.java | 2 +- .../nervos/neuron/util/db/DBTokenUtil.java | 2 +- .../org/nervos/neuron/util/db/DBUtil.java | 15 ++++++++++--- .../nervos/neuron/util/db/DBWalletUtil.java | 21 +++++++++++-------- 6 files changed, 28 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBAppUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBAppUtil.java index bce9336c..7146d51f 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBAppUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBAppUtil.java @@ -17,7 +17,7 @@ public class DBAppUtil extends DBUtil { public static void saveDbApp(Context context, AppItem appItem) { try { - DB db = DBFactory.open(context, DB_APP); + DB db = DBFactory.open(context, DB_APP, kryo); db.put(getDbKey(appItem.entry), appItem); db.close(); } catch (SnappydbException e) { diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java index a7579e5d..adc57a4d 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java @@ -22,7 +22,7 @@ public class DBChainUtil extends DBUtil { public static List getAllChain(Context context) { List chainItemList = new ArrayList<>(); try { - DB db = DBFactory.open(context, DB_CHAIN); + DB db = DBFactory.open(context, DB_CHAIN, kryo); String[] keys = db.findKeys(DB_PREFIX); for(String key: keys) { ChainItem chainItem = db.getObject(key, ChainItem.class); diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBHistoryUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBHistoryUtil.java index cf525077..16df1819 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBHistoryUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBHistoryUtil.java @@ -16,7 +16,7 @@ public class DBHistoryUtil extends DBUtil { public static List getAllHistory(Context context) { List historyList = new ArrayList<>(); try { - DB db = DBFactory.open(context, DB_HISTORY); + DB db = DBFactory.open(context, DB_HISTORY, kryo); String[] keys = db.findKeys(DB_PREFIX); for(String key: keys) { historyList.add(db.get(key)); diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBTokenUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBTokenUtil.java index 3e433ecb..aa262f1b 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBTokenUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBTokenUtil.java @@ -17,7 +17,7 @@ public class DBTokenUtil extends DBUtil { public static void saveToken(Context context, TokenItem tokenItem){ try { - DB db = DBFactory.open(context, DB_TOKEN); + DB db = DBFactory.open(context, DB_TOKEN, kryo); db.put(getDbKey(tokenItem.name), tokenItem); db.close(); } catch (SnappydbException e) { diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBUtil.java index f748dffa..9457d296 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBUtil.java @@ -1,14 +1,23 @@ package org.nervos.neuron.util.db; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer; + public class DBUtil { - protected static final String DB_PREFIX = "neuron-"; + static final String DB_PREFIX = "neuron-"; + + static final Kryo kryo = new Kryo(); + + static { + kryo.setDefaultSerializer(CompatibleFieldSerializer.class); + } - protected static String getDbKey(String origin) { + static String getDbKey(String origin) { return DB_PREFIX + origin; } - protected static String getDbOrigin(String key) { + static String getDbOrigin(String key) { return key.substring(DB_PREFIX.length()); } diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java index aa09f8bb..96e2afbb 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java @@ -3,6 +3,8 @@ import android.content.Context; import android.text.TextUtils; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer; import com.snappydb.DB; import com.snappydb.DBFactory; import com.snappydb.SnappydbException; @@ -30,7 +32,8 @@ public class DBWalletUtil extends DBUtil { public static WalletItem getWallet(Context context, String walletName) { if (TextUtils.isEmpty(walletName)) return null; try { - DB db = DBFactory.open(context, DB_WALLET); + + DB db = DBFactory.open(context, DB_WALLET, kryo); WalletItem walletItem = db.getObject(getDbKey(walletName), WalletItem.class); db.close(); return walletItem; @@ -47,7 +50,7 @@ public static WalletItem getCurrentWallet(Context context) { public static List getAllWalletName(Context context) { List walletList = new ArrayList<>(); try { - DB db = DBFactory.open(context, DB_WALLET); + DB db = DBFactory.open(context, DB_WALLET, kryo); String[] keys = db.findKeys(DB_PREFIX); List walletItems = new ArrayList<>(); for (String key : keys) { @@ -72,7 +75,7 @@ public int compare(WalletItem o1, WalletItem o2) { public static List getAllWallet(Context context) { List walletItems = new ArrayList<>(); try { - DB db = DBFactory.open(context, DB_WALLET); + DB db = DBFactory.open(context, DB_WALLET, kryo); String[] keys = db.findKeys(DB_PREFIX); for (String key : keys) { walletItems.add(db.getObject(key, WalletItem.class)); @@ -92,7 +95,7 @@ public int compare(WalletItem o1, WalletItem o2) { public static void saveWallet(Context context, WalletItem walletItem) { try { - DB db = DBFactory.open(context, DB_WALLET); + DB db = DBFactory.open(context, DB_WALLET, kryo); db.put(getDbKey(walletItem.name), walletItem); db.close(); } catch (SnappydbException e) { @@ -102,7 +105,7 @@ public static void saveWallet(Context context, WalletItem walletItem) { public static boolean updateWalletPassword(Context context, String name, String oldPassword, String newPassword) { try { - DB db = DBFactory.open(context, DB_WALLET); + DB db = DBFactory.open(context, DB_WALLET, kryo); WalletItem walletItem = db.getObject(getDbKey(name), WalletItem.class); try { String privateKey = AESCrypt.decrypt(oldPassword, walletItem.cryptPrivateKey); @@ -122,7 +125,7 @@ public static boolean updateWalletPassword(Context context, String name, String public static void updateWalletName(Context context, String name, String newName) { try { - DB db = DBFactory.open(context, DB_WALLET); + DB db = DBFactory.open(context, DB_WALLET, kryo); WalletItem walletItem = db.getObject(getDbKey(name), WalletItem.class); db.del(getDbKey(name)); walletItem.name = newName; @@ -135,7 +138,7 @@ public static void updateWalletName(Context context, String name, String newName public static boolean checkWalletName(Context context, String name) { try { - DB db = DBFactory.open(context, DB_WALLET); + DB db = DBFactory.open(context, DB_WALLET, kryo); boolean isKeyExist = db.exists(getDbKey(name)); db.close(); return isKeyExist; @@ -148,7 +151,7 @@ public static boolean checkWalletName(Context context, String name) { public static boolean checkWalletAddress(Context context, String address) { boolean isKeyExist = false; try { - DB db = DBFactory.open(context, DB_WALLET); + DB db = DBFactory.open(context, DB_WALLET, kryo); List names = getAllWalletName(context); for (String name : names) { WalletItem walletItem = getWallet(context, name); @@ -164,7 +167,7 @@ public static boolean checkWalletAddress(Context context, String address) { public static void deleteWallet(Context context, String name) { try { - DB db = DBFactory.open(context, DB_WALLET); + DB db = DBFactory.open(context, DB_WALLET, kryo); db.del(getDbKey(name)); db.close(); } catch (SnappydbException e) { From 1f39a1209bd42a19bd0c96bcadf627933acca8dc Mon Sep 17 00:00:00 2001 From: baojun Date: Sun, 5 Aug 2018 20:01:22 +0800 Subject: [PATCH 034/121] transaction detail --- .../neuron/activity/ChangeWalletActivity.java | 7 +- .../activity/TransactionDetailActivity.java | 37 ++- .../view/TokenListFragment.java | 18 +- .../drawable-xhdpi/ic_transaction_share.png | Bin 0 -> 636 bytes .../drawable-xhdpi/ic_transaction_success.png | Bin 0 -> 1165 bytes .../drawable-xxhdpi/ic_transaction_share.png | Bin 0 -> 888 bytes .../ic_transaction_success.png | Bin 0 -> 2356 bytes .../res/layout/activity_transac_detail.xml | 184 ++++++++++++ .../layout/activity_transaction_detail.xml | 273 ------------------ app/src/main/res/values/strings.xml | 9 + app/src/main/res/values/styles.xml | 17 ++ 11 files changed, 239 insertions(+), 306 deletions(-) create mode 100644 app/src/main/res/drawable-xhdpi/ic_transaction_share.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_transaction_success.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_transaction_share.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_transaction_success.png create mode 100644 app/src/main/res/layout/activity_transac_detail.xml delete mode 100644 app/src/main/res/layout/activity_transaction_detail.xml diff --git a/app/src/main/java/org/nervos/neuron/activity/ChangeWalletActivity.java b/app/src/main/java/org/nervos/neuron/activity/ChangeWalletActivity.java index ea22e0ea..e4d1ba23 100644 --- a/app/src/main/java/org/nervos/neuron/activity/ChangeWalletActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/ChangeWalletActivity.java @@ -66,7 +66,6 @@ protected void initData() { protected void initAction() { pullImage.setOnClickListener((view) -> { finish(); - overridePendingTransition(0, R.anim.wallet_activity_out); }); } @@ -75,6 +74,12 @@ protected int getStatusBarColor() { return getResources().getColor(R.color.qr_receive_bg); } + @Override + public void finish() { + super.finish(); + overridePendingTransition(0, R.anim.wallet_activity_out); + } + class Adapter extends RecyclerView.Adapter { private int Wallet = 0; diff --git a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java index b9abb568..b4bb1961 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java @@ -12,6 +12,7 @@ import android.widget.Toast; import org.nervos.neuron.R; +import org.nervos.neuron.custom.TitleBar; import org.nervos.neuron.item.TransactionItem; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.util.Blockies; @@ -29,11 +30,12 @@ public class TransactionDetailActivity extends BaseActivity { public static final String EXTRA_TRANSACTION = "extra_transaction"; private WalletItem walletItem; private TransactionItem transactionItem; + private TitleBar title; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_transaction_detail); + setContentView(R.layout.activity_transac_detail); walletItem = DBWalletUtil.getCurrentWallet(mActivity); transactionItem = getIntent().getParcelableExtra(EXTRA_TRANSACTION); @@ -42,24 +44,21 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { } private void initView() { - CircleImageView photoImage = findViewById(R.id.wallet_photo); - photoImage.setImageBitmap(Blockies.createIcon(walletItem.address)); - TextView walletNameText = findViewById(R.id.wallet_name); - TextView walletAddressText = findViewById(R.id.wallet_address); - TextView transactionHashText = findViewById(R.id.transaction_hash); + TextView transactionHashText = findViewById(R.id.tv_transaction_number); TextView transactionValueText = findViewById(R.id.transaction_amount); - TextView transactionFromText = findViewById(R.id.transaction_from_address); - TextView transactionToText = findViewById(R.id.transaction_to_address); - TextView transactionBlockNumberText = findViewById(R.id.transaction_block_number); - TextView transactionBlockTimeText = findViewById(R.id.transaction_block_time); - TextView transactionGas = findViewById(R.id.transaction_gas); - TextView transactionGasPrice = findViewById(R.id.transaction_gas_price); - TextView transactionChainName = findViewById(R.id.chain_name); + TextView transactionFromText = findViewById(R.id.tv_transaction_sender); + TextView transactionToText = findViewById(R.id.tv_transaction_receiver); + TextView transactionBlockNumberText = findViewById(R.id.tv_transaction_blockchain_no); + TextView transactionBlockTimeText = findViewById(R.id.tv_transaction_blockchain_time); + TextView transactionGas = findViewById(R.id.tv_transaction_gas); + TextView transactionGasPrice = findViewById(R.id.tv_transaction_gas_price); + TextView transactionChainName = findViewById(R.id.tv_chain_name); + title = findViewById(R.id.title); + title.setOnRightClickListener(() -> { + + }); - - walletNameText.setText(walletItem.name); - walletAddressText.setText(walletItem.address); transactionHashText.setText(transactionItem.hash); transactionFromText.setText(transactionItem.from); transactionToText.setText(transactionItem.to); @@ -69,16 +68,16 @@ private void initView() { BigInteger gasUsedBig = new BigInteger(transactionItem.gasUsed); transactionGas.setText(NumberUtil.getEthFromWeiForStringDecimal6(gasPriceBig.multiply(gasUsedBig)) + "eth"); transactionGasPrice.setText(Convert.fromWei(gasPriceBig.toString(), Convert.Unit.GWEI) + " Gwei"); - String value = (transactionItem.from.equalsIgnoreCase(walletItem.address)? + String value = (transactionItem.from.equalsIgnoreCase(walletItem.address) ? "-" : "+") + transactionItem.value; transactionValueText.setText(value); transactionBlockNumberText.setText(transactionItem.blockNumber); } else { - String value = (transactionItem.from.equalsIgnoreCase(walletItem.address)? + String value = (transactionItem.from.equalsIgnoreCase(walletItem.address) ? "-" : "+") + transactionItem.value; transactionValueText.setText(value); int blockNumber = Integer.parseInt( - Numeric.cleanHexPrefix(transactionItem.blockNumber), 16 ); + Numeric.cleanHexPrefix(transactionItem.blockNumber), 16); transactionBlockNumberText.setText(String.valueOf(blockNumber)); } diff --git a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java index b9929a8a..53dc788e 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java @@ -17,6 +17,7 @@ import org.nervos.neuron.activity.CurrencyActivity; import org.nervos.neuron.activity.ReceiveQrCodeActivity; import org.nervos.neuron.activity.TokenManageActivity; +import org.nervos.neuron.activity.TransactionListActivity; import org.nervos.neuron.activity.TransferActivity; import org.nervos.neuron.dialog.TokenTransferDialog; import org.nervos.neuron.event.TokenRefreshEvent; @@ -91,18 +92,9 @@ protected void initAction() { adapter.setTokenAdapterListener(new TokenAdapter.TokenAdapterListener() { @Override public void onItemClick(View view, int position) { - TokenTransferDialog dialog = new TokenTransferDialog(getContext(), tokenItemList.get(position)); - dialog.setOnReceiveClickListener(v -> { - startActivity(new Intent(getActivity(), ReceiveQrCodeActivity.class)); - dialog.dismiss(); - }); - dialog.setOnTransferClickListener(v -> { - Intent intent = new Intent(getActivity(), TransferActivity.class); - intent.putExtra(TransferActivity.EXTRA_TOKEN, tokenItemList.get(position)); - startActivity(intent); - dialog.dismiss(); - }); - dialog.show(); + Intent intent = new Intent(getActivity(), TransactionListActivity.class); + intent.putExtra(TransactionListActivity.EXTRA_TOKEN, tokenItemList.get(position)); + startActivity(intent); } @Override @@ -172,7 +164,7 @@ public void setData() { private void getPrice() { for (TokenItem item : this.tokenItemList) { if (item.balance != 0.0 && item.chainId < 0) - TokenCurrencyManager.getCurrency(item.symbol,currencyItem.getName()).subscribe(new Subscriber() { + TokenCurrencyManager.getCurrency(item.symbol, currencyItem.getName()).subscribe(new Subscriber() { @Override public void onCompleted() { adapter.notifyDataSetChanged(); diff --git a/app/src/main/res/drawable-xhdpi/ic_transaction_share.png b/app/src/main/res/drawable-xhdpi/ic_transaction_share.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca4bb5ab48f3da32f87c493f787679cbcf68a54 GIT binary patch literal 636 zcmeAS@N?(olHy`uVBq!ia0vp^dLYcf3?viMZ?gg^#^NA%C&rs6b?Skfv;dzFS0Jrm z;Gm-6s;23zs_CMp1w_tj+Rm!luIk!gww4Q!t)bzers)clRRzid)qtcBNEN~bYSDDj z&~Z@*D*%xo1XS-_+nV47v`MKX$S;^dz&>FA|NHR<2QIu%P*|{GLc@m#=Rel>zt~ma z;Q#I6`uVn-Ef^|+Zk^`o;uumfXYZ7|Wz7l#Ev|D}ST;8JMrCII`lo;MtNx)*!Q#t1 zFWS~I?Y7RD=9*MFPc|&Dsl-aY>1Ss|Ag}!g<}EHuZ)|99@cFd0CGMVS%G?8{vrIES zZ1XqnOgJbt>FpyfB_7r*dU*+Dhw6`so-$Y?lzv{P=~}^#+F9H3-)~LMeWcS8Qaz2q z>d{JW!PRViU(zN1_kFx< z?;FbOXP)x*wZyESL3g&jO^>bP0l+XkKILiuH literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_transaction_success.png b/app/src/main/res/drawable-xhdpi/ic_transaction_success.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e949013a2ba87cdcdffeb3459d2df97cabc984 GIT binary patch literal 1165 zcmeAS@N?(olHy`uVBq!ia0vp^0YL1}!3-q5{Wo0%QjEnx?oNz1PwLbI+4=!KA+A6{ z%jEyIiT|xr{@bMdw@UeMo&4V%$VmEcl?-CT5m43!$c2dmbvdMgxIhIEU3OqYfLsO! zs4k!(Kx2)8%98(k=Kgm`fQmabfORGPXJ`Of1ToVp18N%3cA$Eobr8dWY#_1>1&IKS z0=fZcj&1V)1h64nkNgLMRlEPY#exk_`v3e5i1GOwiu+sV{r~*+zkBZgoUZ@39{s=l z=>Pc}|F<3eKX>E*b2q>mlmCa5|DU)592Cj_&Ei0UK({$$K|==Oj7>|_qk%z|S`y?J z%phds6`5Hnld$OG$N%xho!2|=8H%)jcDf_Gas^|_ucCggRqPxG_p@x>%(Se)PVD6a z@dXZ!H(osBtlmA%FMs0550Eb);LE%J|3x1PFV5wuZFqF|@<%aX zcrwlQba4!+n6vd}dh~4r0fq;Mdkp#vPUU2r;$Z2xy{tuLiSA)muf~=Odn4ce|Ia&h z&J>GnI&)LL+P&I%@A$MelS|nG-1;xyzHV=D;r{j4UskN2=AKoMQNhA&Xk=qD%joK* zUp6-CJAUTN6kosYIdc~m*gQ+)yz|Fd>$tM<`cIdh z+|ItA5_L+~=G3doj+@81h4KTZKi(*zt*1M?qT{r7lK%FrXNv2dy2RDpz2bc5g!|sJ zJv-YYZuB(d3GrX#t@ht?fBL%CmEt|hIhgqlm zUjFqq@fj~;j`Bs^&1^QczV}ymUqvSOnth)R#$NtcUHx!cto$AGFMKxdOIK(f-s^nW z^|;M>?ya)2v+Xy&-^;oEQ@Wku_j_(^A6pt-yXC|f{c@{1mb*Diyx-_(5}_uTTs&VqU|1EZbbE+ zH*=i$YGaP_$#&U^Z#LFwoW7y^G3c&c=Xx)$xbe?!&DMi+SIMp~s((`awqfq& zDPMyba&9wt|NpGQYA-Zjr|#b?riD|!m`G{1?>u?nM5W{dtOxGXYHqV z+k1W&FF*eC;gRrLQ-h_&S6+OvzrpcwJ>!3;_xVTTl|Q-MV=7Ys6*vr@u6{1-oD!M< D*tJ*Q literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_transaction_share.png b/app/src/main/res/drawable-xxhdpi/ic_transaction_share.png new file mode 100644 index 0000000000000000000000000000000000000000..2b366e3e61fdd01b77bd5395245f720486344520 GIT binary patch literal 888 zcmeAS@N?(olHy`uVBq!ia0vp^u0ZU7LzFK4rx%apyZ$ z^g-u}h+|}eMTr!jO6cFJc)3LfgQsj`%nVZUd^yQw;yRnlVha4HwrW}kcP?oQ*pdAt z;flyKw~lMuw>g=Jh-tdKjaGE>OkCNtF`x~zw>PBG4sU53*?V8oSULAb3M7yW!e3yKC71nF1^07%vpX% zqZL zaAVQ&*4oWyXUwWo`JOp_u3ex1y3@DT74Me0clk`jzRNnN4$G#r?hkpR(3n42*!AjO zyV$5JyFD28gv@;vE*Z1Jb*Z0k^*XBwS08Hr6&GBj^o`-kq*h=;X7F_Nb6Mw<&;$T$ Clz7Mh literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_transaction_success.png b/app/src/main/res/drawable-xxhdpi/ic_transaction_success.png new file mode 100644 index 0000000000000000000000000000000000000000..1c607881eb5929d180707e5f11326722257c3c9b GIT binary patch literal 2356 zcmZWq3p7;g7ax_I$8|l6n^c5S(@+$7ClkVyE?tyIjEbgAjn|dOh?J-hdT53Sx7_h) zRNi`B&k*rPGah+H28|fc_C05&?)tBF&pKy+d;iYfzu!LJ{?tCK zrTGzL4MLs(k(G$mDaeUO79q+J3p1gvI&3%wv!eH~jXfR#4L!iX6AXx;kJ$ga4S)EE zV@L!eBIvn;z6Y8n$kau^6KLW0a>Nl(@e2`J{nMa-68`1+mt6ZKT7r-u42ZMW6HKY7 z1nPUC*3=!fD1(3sL3~giL><8e<*1eiU@&}sK5liEpFji*6-^WLiO?D%a)P$`5-2AU zdVzxjnkL{e<+p@}d|kvMT?s-XPe^(U<5Muof%qI0EP4&dm0J$XSKk>Bm695?lde9% zpFu%{-+~0}0o1oT$NwU}dR`TZ#AX8Z9_;sqyh=2*CPVii41Wgai}1DsCb{4e28>EL z=nHoKz@32;5x|>==~?iKg5F`ckp;7Ja5@_LMqq9pNY_B02A|oV5Kp=We&~(xqUbdsk9cGas&q zy=rW_VRU2T+jyPbD;w%h%Y9D2qq3;_=h$KNR1~0QnhY=i@KFokIY{aK1)V55hnoLh zFa8Tb;SY@S!%_a>pzDrZ}s6XAj{xUQ(TcoZ^_I;a#*t5resb74<#>KG*5^wA? zpzNLP-@}=zVqq}CE3C}-*$3VKo5c&4!z--r6AiSSNH)D%9c_+_QCHs(h1pq)mlTo} zQKs$_S-VOHE3;46%oXnzbwW~>um%2S4monX2#`@+G*-Z()+M$v{FR9>e^5h09k<(RmOh(cp zwKGMR;`dJ%w!aSE*i+-$-kOunlMeFfC7+PK`8aE?Hgh4PK<(p^FbC_=7PY*tC*1h0 zx$1Iy)oT<-J9RGtNw$M3sx4F_xwVQPOabQ8zSkX?uV@% z!V0%brq^q-gcZ{2XjDBd$E@K&zvtc=A@Y4m**Zaq^0*fd?E^0`b;;9%azWR0aW5X# zO?Yo$J2?|fUZ?%E(&kIfOATB47%jDJ5Uc4zxn=YT+i2x?zeT&^vSM7J$Gx}@In8>X zNx9A0qvY6Cf!Su-4gIel-AiqL%1}w6Bn4rOX$;1ob4wTH)V60@g9pc+{>(GXUGXLD z!gvVjcc3Tlm3K@&9cvea+m$*;A9>5f>Bxi37Pk1=1DFe@GarW;sWa6LVqi6m2bq>{?@DkGq>Z8mSP3&%JO2C%83_a;>9l$6EtyHkJ*jW zxQg)$0Y<-zloqXaBDuNOC0~2;b(^2OS(II$&(lh;297vGi=AAK!=5afTgRwAlfOSe z<85(u#~J?~@@7_rw`i4h{?36s*Q}1<=^aPa;uhzRO5g5j|EssqZgPyJ<+5N~}UFjI(Zq~!mDCe7YZFFI1=f+hT4p(O}ZMb@FEnDbq4@O1Kg}64B zB?gUo(}Jrj6y2=I`80Ycp@tsFsqP>=)tpKRJ0IQD7+j|yzekUf>)~M_tyz_!I^=ML zb9rrxQbb3JdWoV^=@)Ao%d!`;^Ah=<#rTEaq=zwH^@_ghCXU^3(bw_*70W&3TQ%^k zVsWb4W0HyHnHBBA(tAo zaVi=MZ%ZYQ?eAIZ+P*^>+B0@K(l(?$(f7DQJ zrDdd1NtMrmoU$lVf@JvJI<=PbPrCE5zc^mUch}k;iX2jI4=x!o-R0`O@=@Jy{zh*wb#FTJO}XpLrAf7ker={YHfe aAe11f(PmX*?1TIcFjjbid7hd3rGEfd-yU`V literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_transac_detail.xml b/app/src/main/res/layout/activity_transac_detail.xml new file mode 100644 index 00000000..8384d374 --- /dev/null +++ b/app/src/main/res/layout/activity_transac_detail.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_transaction_detail.xml b/app/src/main/res/layout/activity_transaction_detail.xml deleted file mode 100644 index b1bf6a33..00000000 --- a/app/src/main/res/layout/activity_transaction_detail.xml +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2f56a5b2..73fbb75a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -199,4 +199,13 @@ 请输入格式正确的数字 Gwei 十六进制数据 + + 区块链网络: + 接收方: + 发送方: + 手续费: + Gas价格 + 交易流水号: + 所在区块: + 入块时间: diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index a8b595e5..10440191 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -87,4 +87,21 @@ @anim/dialog_password_anim_out + + + From 5dec9d612571b9502997dda08cb0b9368f5e33e0 Mon Sep 17 00:00:00 2001 From: baojun Date: Mon, 6 Aug 2018 10:22:07 +0800 Subject: [PATCH 035/121] transaction detail share --- .../activity/ReceiveQrCodeActivity.java | 48 +-- .../activity/TransactionDetailActivity.java | 79 +++-- .../org/nervos/neuron/util/SharePicUtils.java | 65 ++++ .../res/layout/activity_transac_detail.xml | 331 +++++++++--------- 4 files changed, 294 insertions(+), 229 deletions(-) create mode 100644 app/src/main/java/org/nervos/neuron/util/SharePicUtils.java diff --git a/app/src/main/java/org/nervos/neuron/activity/ReceiveQrCodeActivity.java b/app/src/main/java/org/nervos/neuron/activity/ReceiveQrCodeActivity.java index 92e8b7fe..74234d3c 100644 --- a/app/src/main/java/org/nervos/neuron/activity/ReceiveQrCodeActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/ReceiveQrCodeActivity.java @@ -24,6 +24,7 @@ import org.nervos.neuron.custom.TitleBar; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.util.Blockies; +import org.nervos.neuron.util.SharePicUtils; import org.nervos.neuron.util.db.DBWalletUtil; import org.nervos.neuron.util.permission.PermissionUtil; import org.nervos.neuron.util.permission.RuntimeRationale; @@ -97,19 +98,10 @@ protected void initAction() { .rationale(new RuntimeRationale()) .onGranted(permissions -> { try { - savePic(); - Uri imageUri; - if (Build.VERSION.SDK_INT >= 24) { - File file = new File(savePath); - imageUri = FileProvider.getUriForFile(this, "org.nervos.neuron.fileprovider", file); - } else { - imageUri = Uri.fromFile(new File(savePath)); - } - Intent shareIntent = new Intent(); - shareIntent.setAction(Intent.ACTION_SEND); - shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri); - shareIntent.setType("image/*"); - startActivity(Intent.createChooser(shareIntent, "分享到")); + copyAddressText.setVisibility(View.GONE); + SharePicUtils.savePic(savePath, SharePicUtils.getCacheBitmapFromView(findViewById(R.id.ll_qrcode))); + copyAddressText.setVisibility(View.VISIBLE); + SharePicUtils.SharePic(this, savePath); dismissProgressBar(); } catch (FileNotFoundException e) { e.printStackTrace(); @@ -127,35 +119,5 @@ protected void initAction() { }); } - //save qrcode - private void savePic() throws IOException { - copyAddressText.setVisibility(View.GONE); - Bitmap bitmap = getCacheBitmapFromView(findViewById(R.id.ll_qrcode)); - File file = new File(savePath); - if (file.exists()) - file.delete(); - BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); - //if we use CompressFormat.JPEG,bitmap will have black background - bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos); - bos.flush(); - bos.close(); - bitmap.recycle(); - copyAddressText.setVisibility(View.VISIBLE); - } - //get screenShoot - private Bitmap getCacheBitmapFromView(View view) { - final boolean drawingCacheEnabled = true; - view.setDrawingCacheEnabled(drawingCacheEnabled); - view.buildDrawingCache(drawingCacheEnabled); - final Bitmap drawingCache = view.getDrawingCache(); - Bitmap bitmap; - if (drawingCache != null) { - bitmap = Bitmap.createBitmap(drawingCache); - view.setDrawingCacheEnabled(false); - } else { - bitmap = null; - } - return bitmap; - } } diff --git a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java index b4bb1961..3baf7348 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java @@ -4,60 +4,70 @@ import android.content.ClipboardManager; import android.content.Context; import android.os.Bundle; +import android.os.Environment; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.view.View; +import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import com.yanzhenjie.permission.AndPermission; +import com.yanzhenjie.permission.Permission; + import org.nervos.neuron.R; import org.nervos.neuron.custom.TitleBar; import org.nervos.neuron.item.TransactionItem; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.util.Blockies; import org.nervos.neuron.util.NumberUtil; +import org.nervos.neuron.util.SharePicUtils; import org.nervos.neuron.util.db.DBWalletUtil; +import org.nervos.neuron.util.permission.PermissionUtil; +import org.nervos.neuron.util.permission.RuntimeRationale; import org.web3j.utils.Convert; import org.web3j.utils.Numeric; +import java.io.FileNotFoundException; +import java.io.IOException; import java.math.BigInteger; import de.hdodenhof.circleimageview.CircleImageView; -public class TransactionDetailActivity extends BaseActivity { +public class TransactionDetailActivity extends NBaseActivity { public static final String EXTRA_TRANSACTION = "extra_transaction"; private WalletItem walletItem; private TransactionItem transactionItem; private TitleBar title; + private TextView transactionHashText, transactionValueText, transactionFromText, transactionToText, transactionBlockNumberText, + transactionBlockTimeText, transactionGas, transactionGasPrice, transactionChainName; + private static final String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Download/"; @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_transac_detail); - - walletItem = DBWalletUtil.getCurrentWallet(mActivity); - transactionItem = getIntent().getParcelableExtra(EXTRA_TRANSACTION); - - initView(); + protected int getContentLayout() { + return R.layout.activity_transac_detail; } - private void initView() { - - TextView transactionHashText = findViewById(R.id.tv_transaction_number); - TextView transactionValueText = findViewById(R.id.transaction_amount); - TextView transactionFromText = findViewById(R.id.tv_transaction_sender); - TextView transactionToText = findViewById(R.id.tv_transaction_receiver); - TextView transactionBlockNumberText = findViewById(R.id.tv_transaction_blockchain_no); - TextView transactionBlockTimeText = findViewById(R.id.tv_transaction_blockchain_time); - TextView transactionGas = findViewById(R.id.tv_transaction_gas); - TextView transactionGasPrice = findViewById(R.id.tv_transaction_gas_price); - TextView transactionChainName = findViewById(R.id.tv_chain_name); + @Override + protected void initView() { title = findViewById(R.id.title); - title.setOnRightClickListener(() -> { + transactionHashText = findViewById(R.id.tv_transaction_number); + transactionValueText = findViewById(R.id.transaction_amount); + transactionFromText = findViewById(R.id.tv_transaction_sender); + transactionToText = findViewById(R.id.tv_transaction_receiver); + transactionBlockNumberText = findViewById(R.id.tv_transaction_blockchain_no); + transactionBlockTimeText = findViewById(R.id.tv_transaction_blockchain_time); + transactionGas = findViewById(R.id.tv_transaction_gas); + transactionGasPrice = findViewById(R.id.tv_transaction_gas_price); + transactionChainName = findViewById(R.id.tv_chain_name); + } - }); + @Override + protected void initData() { + walletItem = DBWalletUtil.getCurrentWallet(mActivity); + transactionItem = getIntent().getParcelableExtra(EXTRA_TRANSACTION); transactionHashText.setText(transactionItem.hash); transactionFromText.setText(transactionItem.from); @@ -76,8 +86,7 @@ private void initView() { String value = (transactionItem.from.equalsIgnoreCase(walletItem.address) ? "-" : "+") + transactionItem.value; transactionValueText.setText(value); - int blockNumber = Integer.parseInt( - Numeric.cleanHexPrefix(transactionItem.blockNumber), 16); + int blockNumber = Integer.parseInt(Numeric.cleanHexPrefix(transactionItem.blockNumber), 16); transactionBlockNumberText.setText(String.valueOf(blockNumber)); } @@ -88,6 +97,28 @@ private void initView() { transactionHashText.setOnClickListener(v -> copyText(transactionItem.hash)); } + @Override + protected void initAction() { + title.setOnRightClickListener(() -> { + AndPermission.with(mActivity) + .runtime().permission(Permission.Group.STORAGE) + .rationale(new RuntimeRationale()) + .onGranted(permissions -> { + try { + SharePicUtils.savePic(savePath + transactionItem.blockNumber + ".png", SharePicUtils.getCacheBitmapFromView(findViewById(R.id.ll_screenshot))); + SharePicUtils.SharePic(this, savePath + transactionItem.blockNumber + ".png"); + } catch (IOException e) { + e.printStackTrace(); + } + }) + .onDenied(permissions -> { + dismissProgressBar(); + PermissionUtil.showSettingDialog(mActivity, permissions); + }) + .start(); + }); + } + private void copyText(String value) { ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); ClipData mClipData = ClipData.newPlainText("value", value); diff --git a/app/src/main/java/org/nervos/neuron/util/SharePicUtils.java b/app/src/main/java/org/nervos/neuron/util/SharePicUtils.java new file mode 100644 index 00000000..e922904e --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/util/SharePicUtils.java @@ -0,0 +1,65 @@ +package org.nervos.neuron.util; + +import android.app.Activity; +import android.content.Intent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Build; +import android.support.v4.content.FileProvider; +import android.view.View; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +/** + * Created by BaojunCZ on 2018/8/6. + */ +public class SharePicUtils { + + public static void savePic(String path, Bitmap bitmap) throws IOException { + //save qrcode + File file = new File(path); + if (file.exists()) + file.delete(); + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); + //if we use CompressFormat.JPEG,bitmap will have black background + bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos); + bos.flush(); + bos.close(); + bitmap.recycle(); + } + + //get screenShoot + public static Bitmap getCacheBitmapFromView(View view) { + final boolean drawingCacheEnabled = true; + view.setDrawingCacheEnabled(drawingCacheEnabled); + view.buildDrawingCache(drawingCacheEnabled); + final Bitmap drawingCache = view.getDrawingCache(); + Bitmap bitmap; + if (drawingCache != null) { + bitmap = Bitmap.createBitmap(drawingCache); + view.setDrawingCacheEnabled(false); + } else { + bitmap = null; + } + return bitmap; + } + + public static void SharePic(Activity activity, String savePath) { + Uri imageUri; + if (Build.VERSION.SDK_INT >= 24) { + File file = new File(savePath); + imageUri = FileProvider.getUriForFile(activity, "org.nervos.neuron.fileprovider", file); + } else { + imageUri = Uri.fromFile(new File(savePath)); + } + Intent shareIntent = new Intent(); + shareIntent.setAction(Intent.ACTION_SEND); + shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri); + shareIntent.setType("image/*"); + activity.startActivity(Intent.createChooser(shareIntent, "分享到")); + } + +} diff --git a/app/src/main/res/layout/activity_transac_detail.xml b/app/src/main/res/layout/activity_transac_detail.xml index 8384d374..062d29d9 100644 --- a/app/src/main/res/layout/activity_transac_detail.xml +++ b/app/src/main/res/layout/activity_transac_detail.xml @@ -15,170 +15,177 @@ app:right_img="@drawable/ic_transaction_share" app:title="@string/transaction_detail_title" /> - - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:background="@color/white"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From be674055b066c6623b13bb93de938b6a5ef4429d Mon Sep 17 00:00:00 2001 From: baojun Date: Mon, 6 Aug 2018 12:09:25 +0800 Subject: [PATCH 036/121] create&import wallet ui --- .../neuron/activity/AddWalletActivity.java | 26 ++- .../nervos/neuron/activity/BaseActivity.java | 6 + .../neuron/activity/CreateWalletActivity.java | 43 ++-- .../nervos/neuron/activity/NBaseActivity.java | 1 + .../res/drawable-xhdpi/ic_add_wallet_logo.png | Bin 0 -> 8889 bytes app/src/main/res/drawable-xhdpi/security.png | Bin 15348 -> 0 bytes .../drawable-xxhdpi/ic_add_wallet_logo.png | Bin 0 -> 16596 bytes app/src/main/res/drawable-xxhdpi/security.png | Bin 25381 -> 0 bytes .../drawable/add_wallet_log_corner_shape.xml | 11 + .../res/drawable/button_corner_blue_shape.xml | 8 +- .../res/drawable/button_corner_gray_shape.xml | 8 +- .../main/res/drawable/edit_input_shape.xml | 4 +- .../main/res/layout/activity_add_wallet.xml | 46 ++-- .../res/layout/activity_create_wallet.xml | 152 ++++--------- .../res/layout/fragment_import_keystore.xml | 132 +++++------ .../res/layout/fragment_import_mnemonic.xml | 212 +++++++----------- .../layout/fragment_import_private_key.xml | 177 ++++++--------- app/src/main/res/values/colors.xml | 5 +- app/src/main/res/values/strings.xml | 15 +- 19 files changed, 361 insertions(+), 485 deletions(-) create mode 100644 app/src/main/res/drawable-xhdpi/ic_add_wallet_logo.png delete mode 100644 app/src/main/res/drawable-xhdpi/security.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_add_wallet_logo.png delete mode 100644 app/src/main/res/drawable-xxhdpi/security.png create mode 100644 app/src/main/res/drawable/add_wallet_log_corner_shape.xml diff --git a/app/src/main/java/org/nervos/neuron/activity/AddWalletActivity.java b/app/src/main/java/org/nervos/neuron/activity/AddWalletActivity.java index 6e8b0d1c..f08a0cb1 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AddWalletActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AddWalletActivity.java @@ -11,13 +11,20 @@ import org.nervos.neuron.fragment.AppFragment; import org.nervos.neuron.util.db.DBWalletUtil; -public class AddWalletActivity extends BaseActivity { +public class AddWalletActivity extends NBaseActivity { @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_add_wallet); + protected int getContentLayout() { + return R.layout.activity_add_wallet; + } + + @Override + protected void initView() { + } + + @Override + protected void initData() { findViewById(R.id.create_wallet_button).setOnClickListener(v -> { startActivity(new Intent(mActivity, CreateWalletActivity.class)); }); @@ -25,10 +32,19 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { findViewById(R.id.import_wallet_button).setOnClickListener(v -> startActivity(new Intent(mActivity, ImportWalletActivity.class))); - ((TitleBar)findViewById(R.id.title)).setOnLeftClickListener(() -> goBack()); + ((TitleBar) findViewById(R.id.title)).setOnLeftClickListener(() -> goBack()); + } + + @Override + protected void initAction() { } + @Override + protected int getStatusBarColor() { + return getResources().getColor(R.color.white); + } + private void goBack() { if (DBWalletUtil.getCurrentWallet(mActivity) == null) { Intent intent = new Intent(mActivity, MainActivity.class); diff --git a/app/src/main/java/org/nervos/neuron/activity/BaseActivity.java b/app/src/main/java/org/nervos/neuron/activity/BaseActivity.java index 9775c51c..7431a2b0 100644 --- a/app/src/main/java/org/nervos/neuron/activity/BaseActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/BaseActivity.java @@ -15,6 +15,8 @@ import android.widget.FrameLayout; import android.widget.TextView; +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; import org.nervos.neuron.R; public class BaseActivity extends AppCompatActivity { @@ -50,6 +52,7 @@ public void onDestroy() { rootView = null; mProgressView = null; mProgressCircleView = null; + EventBus.getDefault().unregister(this); } /** @@ -114,4 +117,7 @@ protected void dismissProgressCircle() { rootView = null; } + @Subscribe + public void onEvent(Object object) { + } } diff --git a/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java b/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java index ff4b5371..6bbaaa64 100644 --- a/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java @@ -29,7 +29,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -public class CreateWalletActivity extends BaseActivity { +public class CreateWalletActivity extends NBaseActivity { ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); private static final String MnemonicPath = "m/44'/60'/0'/0/0"; @@ -44,15 +44,9 @@ public class CreateWalletActivity extends BaseActivity { private WalletEntity walletEntity; private WalletItem walletItem; - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_create_wallet); - EventBus.getDefault().register(this); - initView(); - checkWalletStatus(); - initListener(); + protected int getContentLayout() { + return R.layout.activity_create_wallet; } @Override @@ -61,12 +55,18 @@ public void onDestroy() { EventBus.getDefault().unregister(this); } - private void initView() { + @Override + protected void initView() { walletNameEdit = findViewById(R.id.edit_wallet_name); passwordEdit = findViewById(R.id.edit_wallet_password); rePasswordEdit = findViewById(R.id.edit_wallet_password_repeat); createWalletButton = findViewById(R.id.create_wallet_button); titleBar = findViewById(R.id.title); + } + + @Override + protected void initData() { + checkWalletStatus(); if (getIntent() != null && getIntent().getBooleanExtra(SplashActivity.EXTRA_FIRST, false)) { titleBar.hideLeft(); @@ -86,7 +86,8 @@ public void onClick(DialogInterface dialog, int which) { } } - private void initListener() { + @Override + protected void initAction() { createWalletButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -95,7 +96,7 @@ public void onClick(View view) { } else if (!TextUtils.equals(passwordEdit.getText().toString().trim(), rePasswordEdit.getText().toString().trim())) { Toast.makeText(mActivity, R.string.password_not_same, Toast.LENGTH_SHORT).show(); - } else if (DBWalletUtil.checkWalletName(mActivity, walletNameEdit.getText().toString().trim())){ + } else if (DBWalletUtil.checkWalletName(mActivity, walletNameEdit.getText().toString().trim())) { Toast.makeText(mActivity, R.string.wallet_name_exist, Toast.LENGTH_SHORT).show(); } else { final String password = rePasswordEdit.getText().toString().trim(); @@ -119,9 +120,9 @@ public void onClick(View view) { /** * save wallet information to database and add default eth token */ - private void saveWalletInfo(String password){ + private void saveWalletInfo(String password) { walletEntity = WalletEntity.createWithMnemonic(MnemonicPath); - new Thread(){ + new Thread() { @Override public void run() { super.run(); @@ -151,15 +152,15 @@ private boolean isWalletValid() { } private void setCreateButtonStatus(boolean status) { - createWalletButton.setBackgroundResource(status? - R.drawable.button_corner_blue_shape:R.drawable.button_corner_gray_shape); + createWalletButton.setBackgroundResource(status ? + R.drawable.button_corner_blue_shape : R.drawable.button_corner_gray_shape); createWalletButton.setEnabled(status); } - private boolean check1 = false, check2 = false, check3 = false; + private void checkWalletStatus() { - walletNameEdit.addTextChangedListener(new WalletTextWatcher(){ + walletNameEdit.addTextChangedListener(new WalletTextWatcher() { @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { super.onTextChanged(charSequence, i, i1, i2); @@ -167,7 +168,7 @@ public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { setCreateButtonStatus(isWalletValid()); } }); - passwordEdit.addTextChangedListener(new WalletTextWatcher(){ + passwordEdit.addTextChangedListener(new WalletTextWatcher() { @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { super.onTextChanged(charSequence, i, i1, i2); @@ -176,7 +177,7 @@ public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { setCreateButtonStatus(isWalletValid()); } }); - rePasswordEdit.addTextChangedListener(new WalletTextWatcher(){ + rePasswordEdit.addTextChangedListener(new WalletTextWatcher() { @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { super.onTextChanged(charSequence, i, i1, i2); @@ -193,10 +194,12 @@ private static class WalletTextWatcher implements TextWatcher { public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } + @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } + @Override public void afterTextChanged(Editable editable) { diff --git a/app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java b/app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java index a8f10a77..d789e162 100644 --- a/app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java @@ -20,6 +20,7 @@ protected void onCreate(Bundle savedactivityState) { if (getContentLayout() != 0) { setContentView(getContentLayout()); } + EventBus.getDefault().register(this); initView(); initData(); initAction(); diff --git a/app/src/main/res/drawable-xhdpi/ic_add_wallet_logo.png b/app/src/main/res/drawable-xhdpi/ic_add_wallet_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8536ebfc77d5a7340ec4b72c82f10ee3a3a560fc GIT binary patch literal 8889 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

~ z`UkJm;e-1*D6CEwiM=QZBa8m0S4mxpeGT9&>uH-o+g{ zcDQ@|xN)zQC!LDxUIZLLR16>MtMUtJG03NrtQ7u~8vZePF=I&uyIFNXMTG^laKmJi zCdW0U9z9Q^e*OAWpEJ&&lo`bB4<)~7*6#+*P6@&QWcG0Z3P<)QB%W_IO zSJ2c|$x$FY%t|wF1$0-&EimJHag6fTO}|m*#u*J!^E5;hsax8r4+&JLfyj4J~TdS*8p zBX1)j|24^42KxT6pYbsQ;r<$!_!((Re{to+mI|2d^ZCk(vEAP|AC|I?oHt5>-N@Il zCnhApt;;m2X=#*}mMZmyvJ_wbGP?j4+i+0o*cyr23}mQGHAO%^Qci9AkD1~Ioy0^u z+4W>+kPmX8w(KV#aFbyCq~Ys;MlZ2_vq%K^Ni{3ztM1C$MK=yyKpp_ zy+01}H9Mof2um8PpP7gBlQ|iA$}eqk znE~f%_?vY$>SOxZ)3D3L&o7Oc3C(=COpBjPV{#q;q&GXTQI3%lrw^1Lh--pugkz6Wj_1!Okhf8Oz|A?x zwD@D@A^q6l6GGU{hSPE_OhPeyO@EFM2#2&1sHeokh;8C2>*345w96LCa((UR`g5jS z5g1v%HDA-;7t1K$Xt%9=nUAd7RwSRAmP~J;9<~GcWC7|=wMKxSG*_8be~HF<`E(U} z+BJCidvfIijW9b6x{$9^`7F4=PX-6#$b@jpxDo~KeC#%J40OhTpNuHen6U!Ujm(TZ z5RZ%UMdCPSe9l4I%`o=x8TRt$XWC`99KsnI#>mg`GwN14%t~5j9AA+#lYpP;YiYmC z8g5w`-&Gc2lq1XMKXA$@GDkDaq_EQX86|N%d5^ZhJufkVreTP;7-bn57)?}v6#{+) zjOWJhbe9Fg!Vcad>W{7X&On#wgEuu#Ye+RawAo$E&c>}X?A%S*_&Sz!`8p#9NN=AT z4w=T{C)3J!zVw#PY~*X?ZKkt!WPACRc(D5OWp5ZWuRwaPf56{}6>!Ti{=-rxr}t%G z)Wh^+PqR&?pN#G+-w2oKt+<$2AyZRA4dCZX&td-L0sK53UgkpE5tM=O4dkI;@u6>l z8rm7SslVY7;KwSi%+G&{R1B>eqG4&l8kQ2wGn}6#5nK8DxWy}6YFl_j3wX-N{8-Dk zR>oG0SuviyVcM;cOW18`ePN(Ip$lRqcmjJRq|nh?L`OiB>J-@$_$g=k5cq!%Kkkn^ SnrCzX0000F%YZaX}D)r6g8jSy)(_ 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 fH=cIy0J99T2h{$GLNfxnGTAKMhLx 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 + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_corner_blue_shape.xml b/app/src/main/res/drawable/button_corner_blue_shape.xml index d3b91d9b..018132a1 100644 --- a/app/src/main/res/drawable/button_corner_blue_shape.xml +++ b/app/src/main/res/drawable/button_corner_blue_shape.xml @@ -1,10 +1,12 @@ - + - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_corner_gray_shape.xml b/app/src/main/res/drawable/button_corner_gray_shape.xml index 1e335216..98fc45aa 100644 --- a/app/src/main/res/drawable/button_corner_gray_shape.xml +++ b/app/src/main/res/drawable/button_corner_gray_shape.xml @@ -1,10 +1,12 @@ - + - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/edit_input_shape.xml b/app/src/main/res/drawable/edit_input_shape.xml index 0527b726..fb83ff15 100644 --- a/app/src/main/res/drawable/edit_input_shape.xml +++ b/app/src/main/res/drawable/edit_input_shape.xml @@ -1,8 +1,8 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_wallet.xml b/app/src/main/res/layout/activity_add_wallet.xml index 3264d7f1..85011a9e 100644 --- a/app/src/main/res/layout/activity_add_wallet.xml +++ b/app/src/main/res/layout/activity_add_wallet.xml @@ -1,55 +1,55 @@ + android:layout_height="match_parent" + android:background="@color/white" + android:orientation="vertical"> + app:isShowLeft="true" + app:title="@string/title_add_wallet" /> + android:scaleType="centerInside" + android:src="@drawable/ic_add_wallet_logo" /> + android:textSize="16sp" /> + android:textSize="14sp" /> @@ -57,24 +57,24 @@ android:id="@+id/create_wallet_button" android:layout_width="match_parent" android:layout_height="40dp" - android:layout_marginTop="30dp" android:layout_marginLeft="@dimen/default_margin" android:layout_marginRight="@dimen/default_margin" - android:background="@drawable/button_corner_blue_shape" + android:layout_marginTop="30dp" + android:background="@color/colorPrimary" android:text="@string/generate_wallet" android:textColor="@color/white" - android:textSize="14sp"/> + android:textSize="14sp" /> + android:textColor="@color/font_link" + android:textSize="14sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_create_wallet.xml b/app/src/main/res/layout/activity_create_wallet.xml index 2083216b..0abbb7dd 100644 --- a/app/src/main/res/layout/activity_create_wallet.xml +++ b/app/src/main/res/layout/activity_create_wallet.xml @@ -1,161 +1,107 @@ + android:layout_height="match_parent" + android:background="@color/default_background" + android:orientation="vertical"> + app:isShowLeft="true" + app:title="@string/title_create_wallet" /> + android:textColor="@color/warning_font" + android:textSize="12sp" /> - - - - - - - + android:gravity="start|center_vertical" + android:hint="@string/create_wallet_name" + android:paddingStart="@dimen/default_margin" + android:singleLine="true" + android:textSize="14sp" /> + android:layout_marginStart="@dimen/default_margin" + android:background="@color/line_input" /> - - - - - - - + android:gravity="start|center_vertical" + android:hint="@string/input_password" + android:inputType="textPassword" + android:paddingStart="@dimen/default_margin" + android:singleLine="true" + android:textSize="14sp" /> + android:layout_marginStart="@dimen/default_margin" + android:background="@color/line_input" /> - - - - - - - + android:gravity="start|center_vertical" + android:hint="@string/input_new_password_again_hint" + android:inputType="textPassword" + android:paddingStart="@dimen/default_margin" + android:singleLine="true" + android:textSize="14sp" /> + android:background="@color/line_input" /> + android:textColor="#FF0000" + android:textSize="12sp" /> + android:textSize="15sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_import_keystore.xml b/app/src/main/res/layout/fragment_import_keystore.xml index c3aa08f3..a01da33e 100644 --- a/app/src/main/res/layout/fragment_import_keystore.xml +++ b/app/src/main/res/layout/fragment_import_keystore.xml @@ -1,136 +1,108 @@ + android:layout_height="match_parent" + android:background="@color/default_background" + android:orientation="vertical"> + android:text="@string/import_wallet_content" + android:textColor="@color/warning_font" + android:textSize="12sp" /> + android:padding="@dimen/default_margin"> + + android:textSize="12sp" /> + android:src="@drawable/scan" /> - + + - - - - - - + android:gravity="left|center_vertical" + android:hint="@string/input_wallet_name_hint" + android:paddingEnd="@dimen/default_margin" + android:paddingLeft="@dimen/default_margin" + android:singleLine="true" + android:textSize="14sp" /> + android:layout_marginStart="@dimen/default_margin" + android:background="@color/line_input" /> + - - - - - + android:gravity="left|center_vertical" + android:hint="@string/input_password_hint" + android:inputType="textPassword" + android:paddingEnd="@dimen/default_margin" + android:paddingStart="@dimen/default_margin" + android:singleLine="true" + android:textSize="14sp" /> - + android:background="@color/line_input" /> + android:textSize="15sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_import_mnemonic.xml b/app/src/main/res/layout/fragment_import_mnemonic.xml index efa40b0c..fe0cbcb5 100644 --- a/app/src/main/res/layout/fragment_import_mnemonic.xml +++ b/app/src/main/res/layout/fragment_import_mnemonic.xml @@ -1,224 +1,180 @@ + android:layout_height="match_parent" + android:background="@color/default_background" + android:orientation="vertical"> + android:background="@color/default_background" + android:orientation="vertical" + android:paddingBottom="30dp"> + android:text="@string/import_mnemonic_warning" + android:textColor="@color/warning_font" + android:textSize="12sp" /> + android:padding="@dimen/default_margin" + android:background="@color/white"> + + android:textSize="12sp" /> + android:src="@drawable/scan" /> - + + + android:paddingStart="@dimen/default_margin"> + android:textSize="14sp" /> + android:layout_alignParentRight="true" + android:layout_centerVertical="true" + android:layout_toRightOf="@id/tv" + android:entries="@array/mnemonic_format" + android:gravity="right" /> - + + android:background="@color/line_input" /> - - - - - - - - + android:gravity="left|center_vertical" + android:hint="@string/input_wallet_name_hint" + android:paddingEnd="@dimen/default_margin" + android:paddingStart="@dimen/default_margin" + android:singleLine="true" + android:textSize="12sp" /> + android:background="@color/line_input" /> + - - - - - - - + android:gravity="left|center_vertical" + android:hint="@string/input_password_hint" + android:inputType="textPassword" + android:paddingEnd="@dimen/default_margin" + android:paddingStart="@dimen/default_margin" + android:singleLine="true" + android:textSize="12sp" /> + android:background="@color/line_input" /> - - - - - - - + android:gravity="left|center_vertical" + android:hint="@string/input_new_password_again_hint" + android:inputType="textPassword" + android:paddingEnd="@dimen/default_margin" + android:paddingStart="@dimen/default_margin" + android:singleLine="true" + android:textSize="12sp" /> + android:background="@color/line_input" /> + android:visibility="gone" /> + android:textSize="15sp" /> diff --git a/app/src/main/res/layout/fragment_import_private_key.xml b/app/src/main/res/layout/fragment_import_private_key.xml index cb50e5c8..318a3625 100644 --- a/app/src/main/res/layout/fragment_import_private_key.xml +++ b/app/src/main/res/layout/fragment_import_private_key.xml @@ -1,6 +1,5 @@ - + android:text="@string/import_private_key_warning" + android:textColor="@color/warning_font" + android:textSize="12sp" /> + android:background="@color/white" + android:padding="@dimen/default_margin"> + + android:textSize="12sp" /> + android:src="@drawable/scan" /> - + + - - - - - - + android:gravity="left|center_vertical" + android:hint="@string/input_wallet_name" + android:paddingStart="@dimen/default_margin" + android:singleLine="true" + android:textSize="14sp" /> + android:background="@color/line_input" /> + - - - - - - - + android:gravity="left|center_vertical" + android:hint="@string/input_password" + android:inputType="textPassword" + android:paddingStart="@dimen/default_margin" + android:singleLine="true" + android:textSize="14sp" /> + android:layout_marginStart="@dimen/default_margin" + android:background="@color/line_input" /> - - - - - - - + android:gravity="left|center_vertical" + android:hint="@string/input_new_password_again_hint" + android:inputType="textPassword" + android:paddingStart="@dimen/default_margin" + android:singleLine="true" + android:textSize="14sp" /> + android:layout_marginStart="@dimen/default_margin" + android:background="@color/line_input" /> + android:visibility="gone" /> + + android:textSize="15sp" /> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 6a71b0e3..ef2fddf5 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -19,11 +19,14 @@ #1646ff #f7f7f7 + #eaeaea + + #e9ebf0 #252A3E #fff5f5f5 - #FFFEED + #10ff7826 #ff8f27 #FF8C36 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2f56a5b2..e7640189 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -30,6 +30,7 @@ 下一步 完成备份 开始导入 + 钱包名称 一键备份 一键恢复 修改密码 @@ -42,10 +43,12 @@ 最近交易记录(默认十笔) 钱包管理 链管理 - 将备份好的keystore文件内容拷贝到输入框,或扫描二维码,导入密钥数据 + 将以太坊官方钱包KeyStore文件内容粘贴至输入框,或通过扫描二维码输入。 + 请导入KeyStore文本 本软件不会在云端保存您的任何信息,包括私钥、应用列表以及区块链配置。因此,您的数字资产完全依赖于您自己的保管,请妥善对您的本地数据进行保存 再次提示密码不能找回 请输入钱包助记词并选择助记词模式 + 助记词输入+空格 请将私钥粘贴至输入框,或通过二维码输入 我已经仔细阅读并同意《服务条款》 应用 @@ -64,7 +67,7 @@ - 不要截图或传送给他人 - 推荐朗读并背诵全文,或者抄写并放在安全的地方 请按顺序点击助记词,以确认你的备份助记词正确 - 输入密码 + 设置密码 确认 确认发送 确认发送 @@ -95,12 +98,12 @@ 交易费用 修改密码 钱包名称 - 请输入钱包名称 + 输入钱包名称 请输入钱包密码 交易列表 - 请输入密码 + 设置密码 请输入新密码 - 请再次输入新密码 + 重复密码 复制成功 密码错误 转账成功 @@ -149,7 +152,7 @@ 原密码不正确 密码修改成功 修改钱包名称 - 请输入钱包名称 + 输入钱包名称 删除成功 解析二维码失败 钱包管理 From 4040ab1e3dea1a073b8ebcf8675b9e4ca28fc00d Mon Sep 17 00:00:00 2001 From: baojun Date: Mon, 6 Aug 2018 13:34:05 +0800 Subject: [PATCH 037/121] create&import wallet ui --- .../neuron/activity/TransactionDetailActivity.java | 11 +---------- ...sac_detail.xml => activity_transaction_detail.xml} | 0 2 files changed, 1 insertion(+), 10 deletions(-) rename app/src/main/res/layout/{activity_transac_detail.xml => activity_transaction_detail.xml} (100%) diff --git a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java index 3baf7348..8449e061 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java @@ -3,13 +3,8 @@ import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; -import android.os.Bundle; import android.os.Environment; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; -import android.view.View; -import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; @@ -20,7 +15,6 @@ import org.nervos.neuron.custom.TitleBar; import org.nervos.neuron.item.TransactionItem; import org.nervos.neuron.item.WalletItem; -import org.nervos.neuron.util.Blockies; import org.nervos.neuron.util.NumberUtil; import org.nervos.neuron.util.SharePicUtils; import org.nervos.neuron.util.db.DBWalletUtil; @@ -29,12 +23,9 @@ import org.web3j.utils.Convert; import org.web3j.utils.Numeric; -import java.io.FileNotFoundException; import java.io.IOException; import java.math.BigInteger; -import de.hdodenhof.circleimageview.CircleImageView; - public class TransactionDetailActivity extends NBaseActivity { public static final String EXTRA_TRANSACTION = "extra_transaction"; @@ -47,7 +38,7 @@ public class TransactionDetailActivity extends NBaseActivity { @Override protected int getContentLayout() { - return R.layout.activity_transac_detail; + return R.layout.activity_transaction_detail; } @Override diff --git a/app/src/main/res/layout/activity_transac_detail.xml b/app/src/main/res/layout/activity_transaction_detail.xml similarity index 100% rename from app/src/main/res/layout/activity_transac_detail.xml rename to app/src/main/res/layout/activity_transaction_detail.xml From 29b4314e19ded1af31932aa79b07b908c791ae61 Mon Sep 17 00:00:00 2001 From: baojun Date: Mon, 6 Aug 2018 14:05:32 +0800 Subject: [PATCH 038/121] create&import wallet ui --- .../activity/BackupMnemonicActivity.java | 39 ++++++++++++------- .../activity/ConfirmMnemonicActivity.java | 7 ++++ .../neuron/activity/CreateWalletActivity.java | 5 +++ .../neuron/activity/ImportWalletActivity.java | 30 ++++++++------ .../layout/fragment_import_private_key.xml | 7 ---- 5 files changed, 55 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/BackupMnemonicActivity.java b/app/src/main/java/org/nervos/neuron/activity/BackupMnemonicActivity.java index d0dcce17..a346e267 100644 --- a/app/src/main/java/org/nervos/neuron/activity/BackupMnemonicActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/BackupMnemonicActivity.java @@ -12,33 +12,42 @@ import org.nervos.neuron.R; import org.nervos.neuron.event.CloseWalletInfoEvent; -public class BackupMnemonicActivity extends BaseActivity{ +public class BackupMnemonicActivity extends NBaseActivity { private TextView mnemonicText; + private String mnemonic; @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_backup_mnemonic); - - EventBus.getDefault().register(mActivity); + protected int getContentLayout() { + return R.layout.activity_backup_mnemonic; + } + @Override + protected void initView() { mnemonicText = findViewById(R.id.mnemonic_text); - String mnemonic = getIntent().getStringExtra(CreateWalletActivity.EXTRA_MNEMONIC); - String[] mnemonicList = mnemonic.split(" "); + } + @Override + protected void initData() { + mnemonic = getIntent().getStringExtra(CreateWalletActivity.EXTRA_MNEMONIC); mnemonicText.setText(mnemonic); + } - findViewById(R.id.backup_next_button).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Intent intent = new Intent(BackupMnemonicActivity.this, ConfirmMnemonicActivity.class); - intent.putExtra(CreateWalletActivity.EXTRA_MNEMONIC, mnemonicList); - startActivity(intent); - } + @Override + protected void initAction() { + String[] mnemonicList = mnemonic.split(" "); + findViewById(R.id.backup_next_button).setOnClickListener(v -> { + Intent intent = new Intent(BackupMnemonicActivity.this, ConfirmMnemonicActivity.class); + intent.putExtra(CreateWalletActivity.EXTRA_MNEMONIC, mnemonicList); + startActivity(intent); }); } + @Override + protected int getStatusBarColor() { + return getResources().getColor(R.color.white); + } + @Subscribe(threadMode = ThreadMode.MAIN) public void onCloseWalletEvent(CloseWalletInfoEvent event) { finish(); diff --git a/app/src/main/java/org/nervos/neuron/activity/ConfirmMnemonicActivity.java b/app/src/main/java/org/nervos/neuron/activity/ConfirmMnemonicActivity.java index 9acdd9dc..e434f496 100644 --- a/app/src/main/java/org/nervos/neuron/activity/ConfirmMnemonicActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/ConfirmMnemonicActivity.java @@ -66,12 +66,14 @@ public View getView(FlowLayout parent, int position, String s) { mnemonicView.setText(s); return mnemonicView; } + @Override public void onSelected(int position, View view) { super.onSelected(position, view); confirmList.add(shuffleList.get(position)); selectedAdapter.notifyDataChanged(); } + @Override public void unSelected(int position, View view) { super.unSelected(position, view); @@ -109,6 +111,11 @@ public boolean onTagClick(View view, int position, FlowLayout parent) { } + @Override + protected int getStatusBarColor() { + return getResources().getColor(R.color.white); + } + private void backupComplete() { findViewById(R.id.backup_complete).setOnClickListener(new View.OnClickListener() { @Override diff --git a/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java b/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java index 6bbaaa64..41fca354 100644 --- a/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java @@ -117,6 +117,11 @@ public void onClick(View view) { }); } + @Override + protected int getStatusBarColor() { + return getResources().getColor(R.color.white); + } + /** * save wallet information to database and add default eth token */ diff --git a/app/src/main/java/org/nervos/neuron/activity/ImportWalletActivity.java b/app/src/main/java/org/nervos/neuron/activity/ImportWalletActivity.java index 7359f421..b0fbde7f 100644 --- a/app/src/main/java/org/nervos/neuron/activity/ImportWalletActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/ImportWalletActivity.java @@ -11,14 +11,16 @@ import org.nervos.neuron.fragment.ImportKeystoreFragment; import org.nervos.neuron.fragment.ImportMnemonicFragment; import org.nervos.neuron.fragment.ImportPrivateKeyFragment; + import com.ogaclejapan.smarttablayout.SmartTabLayout; import java.util.ArrayList; import java.util.List; -public class ImportWalletActivity extends BaseActivity { +public class ImportWalletActivity extends NBaseActivity { private ViewPager viewPager; + private SmartTabLayout tabLayout; private ImportMnemonicFragment importMnemonicFragment; private ImportPrivateKeyFragment importPrivateKeyFragment; private ImportKeystoreFragment importKeystoreFragment; @@ -27,16 +29,13 @@ public class ImportWalletActivity extends BaseActivity { private List tabTitles = new ArrayList<>(); @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_import_wallet); - - initView(); + protected int getContentLayout() { + return R.layout.activity_import_wallet; } - - private void initView() { - SmartTabLayout tabLayout = findViewById(R.id.viewpager_tab); + @Override + protected void initView() { + tabLayout = findViewById(R.id.viewpager_tab); viewPager = findViewById(R.id.viewpager); importKeystoreFragment = new ImportKeystoreFragment(); @@ -45,11 +44,13 @@ private void initView() { importFragments.add(importKeystoreFragment); importFragments.add(importMnemonicFragment); importFragments.add(importPrivateKeyFragment); + } + @Override + protected void initData() { tabTitles.add(getString(R.string.keystore)); tabTitles.add(getString(R.string.nmemonic)); tabTitles.add(getString(R.string.private_key)); - FragmentPagerAdapter adapter = new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public Fragment getItem(int position) { @@ -71,9 +72,16 @@ public CharSequence getPageTitle(int position) { viewPager.setAdapter(adapter); tabLayout.setViewPager(viewPager); - } + @Override + protected void initAction() { + + } + @Override + protected int getStatusBarColor() { + return getResources().getColor(R.color.white); + } } diff --git a/app/src/main/res/layout/fragment_import_private_key.xml b/app/src/main/res/layout/fragment_import_private_key.xml index 318a3625..6eba9576 100644 --- a/app/src/main/res/layout/fragment_import_private_key.xml +++ b/app/src/main/res/layout/fragment_import_private_key.xml @@ -102,13 +102,6 @@ android:singleLine="true" android:textSize="14sp" /> - - Date: Mon, 6 Aug 2018 15:03:27 +0800 Subject: [PATCH 039/121] create&import wallet ui --- .../activity/ChangePasswordActivity.java | 141 ++++++++++---- .../neuron/activity/WalletManageActivity.java | 15 +- .../nervos/neuron/custom/WalletTopView.java | 8 +- .../fragment/ImportKeystoreFragment.java | 42 ++-- .../res/layout/activity_backup_mnemonic.xml | 52 ++--- .../res/layout/activity_change_password.xml | 179 ++++++------------ .../res/layout/activity_confirm_mnemonic.xml | 38 ++-- .../res/layout/activity_create_wallet.xml | 4 +- .../res/layout/activity_import_wallet.xml | 17 +- .../res/layout/fragment_import_keystore.xml | 8 +- .../res/layout/fragment_import_mnemonic.xml | 13 +- .../layout/fragment_import_private_key.xml | 16 +- app/src/main/res/values/strings.xml | 8 +- 13 files changed, 284 insertions(+), 257 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/ChangePasswordActivity.java b/app/src/main/java/org/nervos/neuron/activity/ChangePasswordActivity.java index 1b0a3431..abd8d82d 100644 --- a/app/src/main/java/org/nervos/neuron/activity/ChangePasswordActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/ChangePasswordActivity.java @@ -1,67 +1,144 @@ package org.nervos.neuron.activity; -import android.os.Bundle; -import android.support.annotation.Nullable; +import android.support.v7.widget.AppCompatButton; import android.support.v7.widget.AppCompatEditText; +import android.text.Editable; import android.text.TextUtils; -import android.view.View; +import android.text.TextWatcher; import android.widget.TextView; import android.widget.Toast; import org.nervos.neuron.R; -import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.crypto.AESCrypt; +import org.nervos.neuron.item.WalletItem; +import org.nervos.neuron.util.Blockies; import org.nervos.neuron.util.db.DBWalletUtil; -public class ChangePasswordActivity extends BaseActivity { +import de.hdodenhof.circleimageview.CircleImageView; + +public class ChangePasswordActivity extends NBaseActivity { private AppCompatEditText oldPasswordEdit; private AppCompatEditText newPasswordEdit; private AppCompatEditText newRePasswordEdit; private TextView walletNameText; + private CircleImageView walletPhoto; + private AppCompatButton button; private WalletItem walletItem; @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_change_password); - - walletItem = DBWalletUtil.getCurrentWallet(this); - - initView(); + protected int getContentLayout() { + return R.layout.activity_change_password; } - private void initView() { + @Override + protected void initView() { oldPasswordEdit = findViewById(R.id.edit_wallet_password); newPasswordEdit = findViewById(R.id.edit_wallet_new_password); newRePasswordEdit = findViewById(R.id.edit_wallet_new_repassword); walletNameText = findViewById(R.id.wallet_name_text); + walletPhoto = findViewById(R.id.wallet_photo); + button = findViewById(R.id.change_password_button); + } + @Override + protected void initData() { + checkWalletStatus(); + walletItem = DBWalletUtil.getCurrentWallet(this); walletNameText.setText(walletItem.name); + walletPhoto.setImageBitmap(Blockies.createIcon(walletItem.address)); + } + + @Override + protected void initAction() { + button.setOnClickListener(v -> { + if (TextUtils.isEmpty(oldPasswordEdit.getText().toString().trim())) { + Toast.makeText(mActivity, R.string.old_password_not_null, Toast.LENGTH_SHORT).show(); + } else if (TextUtils.isEmpty(newPasswordEdit.getText().toString().trim())) { + Toast.makeText(mActivity, R.string.new_password_not_null, Toast.LENGTH_SHORT).show(); + } else if (TextUtils.isEmpty(newRePasswordEdit.getText().toString().trim())) { + Toast.makeText(mActivity, R.string.new_password_not_null, Toast.LENGTH_SHORT).show(); + } else if (!TextUtils.equals(newPasswordEdit.getText().toString().trim(), + newRePasswordEdit.getText().toString().trim())) { + Toast.makeText(mActivity, R.string.password_not_same, Toast.LENGTH_SHORT).show(); + } else if (!AESCrypt.checkPassword(oldPasswordEdit.getText().toString().trim(), walletItem)) { + Toast.makeText(mActivity, R.string.old_password_error, Toast.LENGTH_SHORT).show(); + } else { + DBWalletUtil.updateWalletPassword(mActivity, walletItem.name, + oldPasswordEdit.getText().toString().trim(), + newPasswordEdit.getText().toString()); + Toast.makeText(mActivity, R.string.update_password_success, Toast.LENGTH_SHORT).show(); + finish(); + } + }); + } + + @Override + protected int getStatusBarColor() { + return getResources().getColor(R.color.white); + } + + private boolean isWalletValid() { + return check1 && check2 && check3; + } + + private void setCreateButtonStatus(boolean status) { + button.setBackgroundResource(status ? + R.drawable.button_corner_blue_shape : R.drawable.button_corner_gray_shape); + button.setEnabled(status); + } + + + private boolean check1 = false, check2 = false, check3 = false; - findViewById(R.id.change_password_button).setOnClickListener(new View.OnClickListener() { + private void checkWalletStatus() { + oldPasswordEdit.addTextChangedListener(new WalletTextWatcher() { + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + super.onTextChanged(charSequence, i, i1, i2); + if (!TextUtils.isEmpty(oldPasswordEdit.getText().toString().trim()) && oldPasswordEdit.getText().toString().length() >= 8) { + check1 = true; + } + setCreateButtonStatus(isWalletValid()); + } + }); + newPasswordEdit.addTextChangedListener(new WalletTextWatcher() { + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + super.onTextChanged(charSequence, i, i1, i2); + if (!TextUtils.isEmpty(newPasswordEdit.getText().toString().trim()) && newPasswordEdit.getText().toString().length() >= 8) { + check2 = true; + } + setCreateButtonStatus(isWalletValid()); + } + }); + newRePasswordEdit.addTextChangedListener(new WalletTextWatcher() { @Override - public void onClick(View v) { - if (TextUtils.isEmpty(oldPasswordEdit.getText().toString().trim())) { - Toast.makeText(mActivity, R.string.old_password_not_null, Toast.LENGTH_SHORT).show(); - } else if (TextUtils.isEmpty(newPasswordEdit.getText().toString().trim())){ - Toast.makeText(mActivity, R.string.new_password_not_null, Toast.LENGTH_SHORT).show(); - } else if (TextUtils.isEmpty(newRePasswordEdit.getText().toString().trim())) { - Toast.makeText(mActivity, R.string.new_password_not_null, Toast.LENGTH_SHORT).show(); - } else if (!TextUtils.equals(newPasswordEdit.getText().toString().trim(), - newRePasswordEdit.getText().toString().trim())) { - Toast.makeText(mActivity, R.string.password_not_same, Toast.LENGTH_SHORT).show(); - } else if (!AESCrypt.checkPassword(oldPasswordEdit.getText().toString().trim(), walletItem)) { - Toast.makeText(mActivity, R.string.old_password_error, Toast.LENGTH_SHORT).show(); - } else { - DBWalletUtil.updateWalletPassword(mActivity, walletItem.name, - oldPasswordEdit.getText().toString().trim(), - newPasswordEdit.getText().toString()); - Toast.makeText(mActivity, R.string.update_password_success, Toast.LENGTH_SHORT).show(); - finish(); + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + super.onTextChanged(charSequence, i, i1, i2); + if (!TextUtils.isEmpty(newRePasswordEdit.getText().toString().trim()) && newRePasswordEdit.getText().toString().length() >= 8) { + check3 = true; } + setCreateButtonStatus(isWalletValid()); } }); } + + private static class WalletTextWatcher implements TextWatcher { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + + } + } } diff --git a/app/src/main/java/org/nervos/neuron/activity/WalletManageActivity.java b/app/src/main/java/org/nervos/neuron/activity/WalletManageActivity.java index 6d381056..b7ff90ad 100644 --- a/app/src/main/java/org/nervos/neuron/activity/WalletManageActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/WalletManageActivity.java @@ -10,14 +10,14 @@ import android.widget.Toast; import org.nervos.neuron.R; +import org.nervos.neuron.crypto.AESCrypt; +import org.nervos.neuron.crypto.WalletEntity; import org.nervos.neuron.dialog.SimpleDialog; import org.nervos.neuron.fragment.AppFragment; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.util.Blockies; -import org.nervos.neuron.crypto.AESCrypt; import org.nervos.neuron.util.db.DBWalletUtil; import org.nervos.neuron.util.db.SharePrefUtil; -import org.nervos.neuron.crypto.WalletEntity; import java.security.GeneralSecurityException; import java.util.List; @@ -109,7 +109,7 @@ public void onOkClick() { Toast.makeText(mActivity, R.string.password_not_null, Toast.LENGTH_SHORT).show(); } else if (!AESCrypt.checkPassword(simpleDialog.getMessage(), walletItem)) { Toast.makeText(mActivity, R.string.wallet_password_error, Toast.LENGTH_SHORT).show(); - }else { + } else { generateKeystore(simpleDialog.getMessage()); simpleDialog.dismiss(); } @@ -137,7 +137,7 @@ public void onOkClick() { } List names = DBWalletUtil.getAllWalletName(mActivity); if (names.size() > 1) { - SharePrefUtil.putCurrentWalletName(names.get(names.indexOf(walletItem.name) == 0? 1:0)); + SharePrefUtil.putCurrentWalletName(names.get(names.indexOf(walletItem.name) == 0 ? 1 : 0)); } else if (names.size() > 0) { SharePrefUtil.deleteWalletName(); } @@ -156,9 +156,14 @@ public void onOkClick() { } + @Override + protected int getStatusBarColor() { + return getResources().getColor(R.color.white); + } + private void generateKeystore(String password) { showProgressBar(R.string.generating); - new Thread(){ + new Thread() { @Override public void run() { super.run(); diff --git a/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java b/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java index 007ce927..d4c37807 100644 --- a/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java +++ b/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java @@ -13,13 +13,11 @@ import android.widget.TextView; import android.widget.Toast; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; import org.nervos.neuron.R; import org.nervos.neuron.activity.ChangeWalletActivity; import org.nervos.neuron.activity.QrCodeActivity; import org.nervos.neuron.activity.ReceiveQrCodeActivity; -import org.nervos.neuron.event.TokenRefreshEvent; +import org.nervos.neuron.activity.WalletManageActivity; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.util.Blockies; @@ -66,6 +64,7 @@ private void initAction() { rightImage.setOnClickListener(this); copyImage.setOnClickListener(this); centerImage.setOnClickListener(this); + walletPhoto.setOnClickListener(this); } public void setWalletItem(WalletItem walletItem) { @@ -100,6 +99,9 @@ public void onClick(View view) { Toast.makeText(context, R.string.copy_success, Toast.LENGTH_SHORT).show(); } break; + case R.id.wallet_photo: + context.startActivity(new Intent(context, WalletManageActivity.class)); + break; } } } diff --git a/app/src/main/java/org/nervos/neuron/fragment/ImportKeystoreFragment.java b/app/src/main/java/org/nervos/neuron/fragment/ImportKeystoreFragment.java index 5d54a5e4..41573ce5 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/ImportKeystoreFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/ImportKeystoreFragment.java @@ -22,12 +22,12 @@ import org.nervos.neuron.R; import org.nervos.neuron.activity.MainActivity; import org.nervos.neuron.activity.QrCodeActivity; +import org.nervos.neuron.crypto.WalletEntity; import org.nervos.neuron.item.WalletItem; +import org.nervos.neuron.util.db.DBWalletUtil; import org.nervos.neuron.util.db.SharePrefUtil; import org.nervos.neuron.util.permission.PermissionUtil; import org.nervos.neuron.util.permission.RuntimeRationale; -import org.nervos.neuron.util.db.DBWalletUtil; -import org.nervos.neuron.crypto.WalletEntity; import org.web3j.crypto.CipherException; import java.util.concurrent.ExecutorService; @@ -65,26 +65,21 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { private void initListener() { importButton.setOnClickListener(view -> { - if (DBWalletUtil.checkWalletName(getContext(), walletNameEdit.getText().toString().trim())){ + if (DBWalletUtil.checkWalletName(getContext(), walletNameEdit.getText().toString().trim())) { Toast.makeText(getContext(), R.string.wallet_name_exist, Toast.LENGTH_SHORT).show(); return; } cachedThreadPool.execute(() -> generateAndSaveWallet()); }); - scanImage.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - AndPermission.with(getActivity()) - .runtime().permission(Permission.Group.CAMERA) - .rationale(new RuntimeRationale()) - .onGranted(permissions -> { - Intent intent = new Intent(getActivity(), QrCodeActivity.class); - startActivityForResult(intent, REQUEST_CODE); - }) - .onDenied(permissions -> PermissionUtil.showSettingDialog(getActivity(), permissions)) - .start(); - } - }); + scanImage.setOnClickListener(v -> AndPermission.with(getActivity()) + .runtime().permission(Permission.Group.CAMERA) + .rationale(new RuntimeRationale()) + .onGranted(permissions -> { + Intent intent = new Intent(getActivity(), QrCodeActivity.class); + startActivityForResult(intent, REQUEST_CODE); + }) + .onDenied(permissions -> PermissionUtil.showSettingDialog(getActivity(), permissions)) + .start()); } @@ -130,15 +125,16 @@ private boolean isWalletValid() { } private void setCreateButtonStatus(boolean status) { - importButton.setBackgroundResource(status? - R.drawable.button_corner_blue_shape:R.drawable.button_corner_gray_shape); + importButton.setBackgroundResource(status ? + R.drawable.button_corner_blue_shape : R.drawable.button_corner_gray_shape); importButton.setEnabled(status); } private boolean check1 = false, check2 = false, check3 = false; + private void checkWalletStatus() { - walletNameEdit.addTextChangedListener(new WalletTextWatcher(){ + walletNameEdit.addTextChangedListener(new WalletTextWatcher() { @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { super.onTextChanged(charSequence, i, i1, i2); @@ -146,7 +142,7 @@ public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { setCreateButtonStatus(isWalletValid()); } }); - passwordEdit.addTextChangedListener(new WalletTextWatcher(){ + passwordEdit.addTextChangedListener(new WalletTextWatcher() { @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { super.onTextChanged(charSequence, i, i1, i2); @@ -154,7 +150,7 @@ public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { setCreateButtonStatus(isWalletValid()); } }); - keystoreEdit.addTextChangedListener(new WalletTextWatcher(){ + keystoreEdit.addTextChangedListener(new WalletTextWatcher() { @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { super.onTextChanged(charSequence, i, i1, i2); @@ -170,10 +166,12 @@ private static class WalletTextWatcher implements TextWatcher { public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } + @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } + @Override public void afterTextChanged(Editable editable) { diff --git a/app/src/main/res/layout/activity_backup_mnemonic.xml b/app/src/main/res/layout/activity_backup_mnemonic.xml index a358f313..f8682d18 100644 --- a/app/src/main/res/layout/activity_backup_mnemonic.xml +++ b/app/src/main/res/layout/activity_backup_mnemonic.xml @@ -1,86 +1,86 @@ + android:layout_height="match_parent" + android:background="@color/white" + android:orientation="vertical"> + app:isShowLeft="true" + app:title="@string/backup_mnemonic" /> + android:textColor="@color/warning_font" + android:textSize="12sp" /> + android:textColor="@color/warning_font" + android:textSize="12sp" /> + android:textColor="@color/warning_font" + android:textSize="12sp" /> + android:textColor="@color/warning_font" + android:textSize="12sp" /> + android:textSize="16sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_change_password.xml b/app/src/main/res/layout/activity_change_password.xml index 07f6174e..02c24a80 100644 --- a/app/src/main/res/layout/activity_change_password.xml +++ b/app/src/main/res/layout/activity_change_password.xml @@ -1,197 +1,136 @@ + android:layout_height="match_parent" + android:background="@color/default_background" + android:orientation="vertical"> + app:isShowLeft="true" + app:title="@string/update_password" /> + android:text="@string/change_password_warning" + android:textColor="@color/warning_font" + android:textSize="12sp" /> + android:paddingStart="@dimen/default_margin"> - + + android:layout_centerVertical="true" + android:layout_marginLeft="10dp" + android:layout_toRightOf="@id/wallet_photo" + android:textColor="@color/font_title" + android:textSize="14sp" /> + android:background="@color/line_input" /> - - - - - - - + android:gravity="left|center_vertical" + android:hint="@string/input_password_hint" + android:inputType="textPassword" + android:paddingStart="@dimen/default_margin" + android:textSize="14sp" /> + android:background="@color/line_input" /> - - - - - - - + android:gravity="left|center_vertical" + android:hint="@string/input_new_password_hint" + android:inputType="textPassword" + android:paddingStart="@dimen/default_margin" + android:textSize="14sp" /> + android:background="@color/line_input" /> + - - - - - - - + android:gravity="left|center_vertical" + android:hint="@string/input_new_password_hint_again" + android:inputType="textPassword" + android:paddingStart="@dimen/default_margin" + android:textSize="14sp" /> + android:background="@color/line_input" /> + android:layout_marginTop="5dp" + android:text="@string/change_password_suggestion" + android:textColor="@color/font_inside" + android:textSize="12sp" /> + android:textSize="15sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_confirm_mnemonic.xml b/app/src/main/res/layout/activity_confirm_mnemonic.xml index e2412f44..0b10ecd5 100644 --- a/app/src/main/res/layout/activity_confirm_mnemonic.xml +++ b/app/src/main/res/layout/activity_confirm_mnemonic.xml @@ -2,59 +2,57 @@ + android:layout_height="match_parent" + android:background="@color/white" + android:orientation="vertical"> + app:isShowLeft="true" + app:title="@string/confirm_mnemonic" /> + android:textColor="@color/warning_font" + android:textSize="12sp" /> - + android:background="@drawable/add_wallet_log_corner_shape" + android:padding="5dp" + zhy:max_select="-1" /> - + android:layout_margin="@dimen/default_margin" + zhy:max_select="-1" /> + android:textSize="15sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_create_wallet.xml b/app/src/main/res/layout/activity_create_wallet.xml index 0abbb7dd..a58df6e0 100644 --- a/app/src/main/res/layout/activity_create_wallet.xml +++ b/app/src/main/res/layout/activity_create_wallet.xml @@ -30,7 +30,6 @@ android:id="@+id/edit_wallet_name" android:layout_width="match_parent" android:layout_height="48dp" - android:layout_marginEnd="20dp" android:background="@android:color/white" android:gravity="start|center_vertical" android:hint="@string/create_wallet_name" @@ -48,7 +47,6 @@ android:id="@+id/edit_wallet_password" android:layout_width="match_parent" android:layout_height="48dp" - android:layout_marginEnd="20dp" android:background="@android:color/white" android:gravity="start|center_vertical" android:hint="@string/input_password" @@ -67,7 +65,6 @@ android:id="@+id/edit_wallet_password_repeat" android:layout_width="match_parent" android:layout_height="48dp" - android:layout_marginEnd="20dp" android:background="@android:color/white" android:gravity="start|center_vertical" android:hint="@string/input_new_password_again_hint" @@ -82,6 +79,7 @@ android:background="@color/line_input" /> + android:layout_height="match_parent" + android:orientation="vertical"> + app:isShowLeft="true" + app:title="@string/title_import_wallet" /> + app:stl_underlineThickness="1dp" /> + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_import_keystore.xml b/app/src/main/res/layout/fragment_import_keystore.xml index a01da33e..d9cc33df 100644 --- a/app/src/main/res/layout/fragment_import_keystore.xml +++ b/app/src/main/res/layout/fragment_import_keystore.xml @@ -20,9 +20,9 @@ android:textSize="12sp" /> diff --git a/app/src/main/res/layout/fragment_import_mnemonic.xml b/app/src/main/res/layout/fragment_import_mnemonic.xml index fe0cbcb5..c7719613 100644 --- a/app/src/main/res/layout/fragment_import_mnemonic.xml +++ b/app/src/main/res/layout/fragment_import_mnemonic.xml @@ -29,8 +29,8 @@ + android:background="@color/white" + android:padding="@dimen/default_margin"> + + - - 将以太坊官方钱包KeyStore文件内容粘贴至输入框,或通过扫描二维码输入。 请导入KeyStore文本 本软件不会在云端保存您的任何信息,包括私钥、应用列表以及区块链配置。因此,您的数字资产完全依赖于您自己的保管,请妥善对您的本地数据进行保存 - 再次提示密码不能找回 + 钱包密码如丢失将无法找回,请您妥善保管密码 请输入钱包助记词并选择助记词模式 助记词输入+空格 请将私钥粘贴至输入框,或通过二维码输入 @@ -79,6 +79,7 @@ 申请下列权限以保证应用可以正常运行:\n\n%1$s 扫描二维码 分享Keystore + 密码必须至少8个字符,而且同时包含字母和数字 密码包含大写字母、小写字母、数字、特殊符号中的至少三类,且长度在8到50之间 您还没有Token数据 您还没有交易数据 @@ -101,8 +102,9 @@ 输入钱包名称 请输入钱包密码 交易列表 - 设置密码 - 请输入新密码 + 输入密码 + 输入新密码 + 再次输入新密码 重复密码 复制成功 密码错误 From 1dc2e75cede4d35aa496857ef4c72968355b8f28 Mon Sep 17 00:00:00 2001 From: baojun Date: Mon, 6 Aug 2018 18:44:11 +0800 Subject: [PATCH 040/121] fingerprint unlock pwd unlock --- app/src/main/AndroidManifest.xml | 8 ++ .../neuron/activity/FingerPrintActivity.java | 100 ++++++++++++++++++ .../neuron/activity/PwdUnlockActivity.java | 33 ++++++ .../neuron/activity/SplashActivity.java | 9 +- .../neuron/fragment/SettingsFragment.java | 3 +- .../drawable-xhdpi/ic_finger_print_logo.png | Bin 0 -> 26524 bytes .../drawable-xhdpi/ic_fingerprint_locked.png | Bin 0 -> 558 bytes .../drawable-xhdpi/ic_setting_onoff_off.png | Bin 1812 -> 2136 bytes .../drawable-xhdpi/ic_setting_onoff_on.png | Bin 2033 -> 2103 bytes .../drawable-xxhdpi/ic_finger_print_logo.png | Bin 0 -> 46646 bytes .../drawable-xxhdpi/ic_fingerprint_locked.png | Bin 0 -> 794 bytes .../drawable-xxhdpi/ic_setting_onoff_off.png | Bin 2904 -> 3713 bytes .../drawable-xxhdpi/ic_setting_onoff_on.png | Bin 3808 -> 3723 bytes .../main/res/layout/activity_fingerprint.xml | 83 +++++++++++++++ .../main/res/layout/activity_pwd_unlock.xml | 42 ++++++++ .../main/res/layout/view_setting_button.xml | 7 +- app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 8 +- 18 files changed, 287 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java create mode 100644 app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java create mode 100644 app/src/main/res/drawable-xhdpi/ic_finger_print_logo.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_fingerprint_locked.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_finger_print_logo.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_fingerprint_locked.png create mode 100644 app/src/main/res/layout/activity_fingerprint.xml create mode 100644 app/src/main/res/layout/activity_pwd_unlock.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 82f51867..f74777e2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -150,6 +150,14 @@ android:name=".activity.ChangeWalletActivity" android:screenOrientation="portrait" android:theme="@style/AppTheme.NoActionBar" /> + + 0) { + if (authFingerDialog == null) + authFingerDialog = new AuthFingerDialog(mActivity, R.style.Theme_AppCompat_Dialog); + authFingerDialog.setOnShowListener((dialogInterface) -> { + FingerPrintController.getInstance(mActivity).authenticate(authenticateResultCallback); + }); + authFingerDialog.setOnDismissListener((dialog) -> { + FingerPrintController.getInstance(mActivity).cancelAuth(); + }); + authFingerDialog.show(); + } else { + Toast.makeText(mActivity, getResources().getString(R.string.finger_print_no_touchID), Toast.LENGTH_LONG).show(); + } + break; + case R.id.iv_other: + break; + } + } +} diff --git a/app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java b/app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java new file mode 100644 index 00000000..b47a04fb --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java @@ -0,0 +1,33 @@ +package org.nervos.neuron.activity; + +import org.nervos.neuron.R; + +/** + * Created by BaojunCZ on 2018/8/6. + */ +public class PwdUnlockActivity extends NBaseActivity { + @Override + protected int getContentLayout() { + return R.layout.activity_pwd_unlock; + } + + @Override + protected void initView() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initAction() { + + } + + @Override + protected int getStatusBarColor() { + return getResources().getColor(R.color.white); + } +} diff --git a/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java b/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java index 6d9ab4d5..7eb2f447 100644 --- a/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java @@ -4,8 +4,11 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.text.TextUtils; +import android.widget.Toast; import org.nervos.neuron.R; +import org.nervos.neuron.util.FingerPrint.FingerPrintController; +import org.nervos.neuron.util.SharePreConst; import org.nervos.neuron.util.db.SharePrefUtil; public class SplashActivity extends BaseActivity { @@ -23,7 +26,11 @@ public void run() { try { sleep(1000); if (!TextUtils.isEmpty(SharePrefUtil.getCurrentWalletName())) { - startActivity(new Intent(mActivity, MainActivity.class)); + if (SharePrefUtil.getBoolean(SharePreConst.FingerPrint, false)) { + startActivity(new Intent(mActivity, FingerPrintActivity.class)); + } else { + startActivity(new Intent(mActivity, MainActivity.class)); + } } else { Intent intent = new Intent(mActivity, AddWalletActivity.class); startActivity(intent); diff --git a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java index 4e0311f3..2c484db3 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java @@ -44,10 +44,9 @@ public void initData() { currencySBV.setOther1Text(SharePrefUtil.getString(SharePreConst.Currency, "CNY")); if (FingerPrintController.getInstance(getActivity()).isSupportFingerprint()) { fingerPrintSBV.setVisibility(View.VISIBLE); - if (FingerPrintController.getInstance(getActivity()).hasEnrolledFingerprints() && FingerPrintController.getInstance(getActivity()).getEnrolledFingerprints().size() > 0 && SharePrefUtil.getBoolean(SharePreConst.FingerPrint, false)) { + if (SharePrefUtil.getBoolean(SharePreConst.FingerPrint, false)) { fingerPrintSBV.setSwitch(true); } else { - SharePrefUtil.putBoolean(SharePreConst.FingerPrint, false); fingerPrintSBV.setSwitch(false); } } else { diff --git a/app/src/main/res/drawable-xhdpi/ic_finger_print_logo.png b/app/src/main/res/drawable-xhdpi/ic_finger_print_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..dcec687c33dd57e11c2eee021f68fec0e9719a05 GIT binary patch literal 26524 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

u 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 T^+=Ic00000NkvXXu0mjf+GQy@ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_fingerprint_locked.png b/app/src/main/res/drawable-xhdpi/ic_fingerprint_locked.png new file mode 100644 index 0000000000000000000000000000000000000000..cdf1591440109ab815eb4ab7047c33841f9b683f GIT binary patch literal 558 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 O0000wAK<~TOUG@QcBx*^IS@y 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 literal 2033 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%0AhtvO7_*M=OG=r2%!h|G*G`cRJ9 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 Mr|}S7p>B=)Ke7MzY5)KL literal 2904 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 literal 3808 zcmV<64j=J}P)?7obCU& zX4bxQPHx(BZaJ9zM5&Tuzu z*pQz+d$w4)a%H}D?b_nfrAtMx*J~_Ww#;JEd7d|=+vxZERoZ39xfF`++qZve{rdF} zw%hG(tyb&qq9``$TCTdwX-oC4$_Cfz>FMcrI-Snj=gysb?fCKI|57`B)$94Cx?R%5 zvSD)4YNy9_?b@|I@v2p;`WG%-=wH5kxzt$t8cS&dqro}`fnei<$elZP&Pw9RlP4P@ zw1BV`D^@hFUcK5JA0KZBkLJ|WR8zp(MP8T5W$VE^@4R!b>g^WbYv+TV+Pg40Ir-Q3 z-h1!R(W6ISlZ~#f9x>!`jg5^V>#AOF`SRu6D_5@cAXo(Uw`|$cOUbM)ktvDpjj1Q% zb-Kfgb?eqONJFGRsz`&tZnxV?iM;>*`@bOX`?l(B6~H$wsO=N-(qF#u#v3omXhmeR z*_?(@m#Ln4Dqea1{P~_{5c5zxvzA1D5Q$8uc%qZ&WZ{7Vr>QBhC9;e}k=(lX-g|d# z+O+9A0`{Jp#@;N3bmL5%K7INZZ@u-_-$a&?DDtK?Wl!s-GY^GWE+^AHv$jO0>mr`0 zbtOM@=1g%T5+M@;1(1;lfp;rt4g8VTzt7Er`z;e`9eq`6=+o~gKqzFYKSrn%IZP&V zeyxHAXgB98ue`#BCWpjh$ByOlrb1ItA;JpX;kMSfCqke=XbY^iWNmrI7+$z-+qR!e z?~}J1Ad$C4Q}`oVBmepCyYK#o_C=<;mgnkQrgH0&WSPcNs{dJWyE}P1+H-I8wlsz2 znlke>Yu4DVQ~*@FQDM`>3%NvETRLM8J@n8%OnHv-7#&`2l_&v=$rSGK6Cjv zbOSbOHMP1oYT!AK8tIhEU>W%8)vL`LwH~&7DwVtqPy%Os&z?O$5b0mN-Ne0Lds-h~ zIDGi<&osVCd1OcHcgLq%dF`}xyS4L3ywO2nN@ZPSN@a(tExdUoj~Lw1Y;6247f9{J zNFrn5#-eZZ(fdo^83SYCCaujH>E4*Gjq

6A6m*G1K9YV*Rh)Di#yV{78BUAw*} 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 WkCTmV9QdjL0000 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_pwd_unlock.xml b/app/src/main/res/layout/activity_pwd_unlock.xml new file mode 100644 index 00000000..542c2494 --- /dev/null +++ b/app/src/main/res/layout/activity_pwd_unlock.xml @@ -0,0 +1,42 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_setting_button.xml b/app/src/main/res/layout/view_setting_button.xml index 76f60f65..0f42cb13 100644 --- a/app/src/main/res/layout/view_setting_button.xml +++ b/app/src/main/res/layout/view_setting_button.xml @@ -9,8 +9,8 @@ #1646ff #f7f7f7 + #eaeaea #252A3E diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 73fbb75a..7a4574b0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -199,7 +199,7 @@ 请输入格式正确的数字 Gwei 十六进制数据 - + 区块链网络: 接收方: 发送方: @@ -208,4 +208,10 @@ 交易流水号: 所在区块: 入块时间: + + 点击进行指纹验证 + 其它方式验证 + 指纹解锁成功! + 指纹解锁失败! + 对不起,没有可用TouchID,请用其他方式解锁 From 8764389f4e955cf8174f4bb23afd951e2b02e58b Mon Sep 17 00:00:00 2001 From: duanyytop Date: Mon, 6 Aug 2018 20:28:50 +0800 Subject: [PATCH 041/121] support ERC721 --- .../neuron/activity/AboutUsActivity.java | 13 +- .../neuron/activity/AddTokenActivity.java | 4 +- .../neuron/activity/AppWebActivity.java | 20 ++- .../neuron/activity/TransferActivity.java | 3 +- .../nervos/neuron/fragment/AppFragment.java | 7 +- .../CollectionAdapter.java | 105 ++++++++++++++ .../CollectionListFragment.java | 90 ++++++++++++ .../neuron/fragment/SettingsFragment.java | 12 +- .../view/TokenListFragment.java | 10 +- .../WalletsFragment/view/WalletsFragment.java | 15 +- .../nervos/neuron/item/CollectionItem.java | 130 ++++++++++++++++++ .../neuron/response/CollectionResponse.java | 12 ++ .../nervos/neuron/service/EthRpcService.java | 2 +- .../org/nervos/neuron/service/HttpUrls.java | 38 +++++ .../neuron/service/NervosHttpService.java | 12 +- .../TokenService.java} | 80 +++++++---- .../org/nervos/neuron/util/ConstUtil.java | 30 ---- .../org/nervos/neuron/util/db/DBAppUtil.java | 10 +- .../nervos/neuron/util/db/DBChainUtil.java | 6 +- .../nervos/neuron/util/db/DBHistoryUtil.java | 4 +- .../nervos/neuron/util/db/DBTokenUtil.java | 6 +- .../org/nervos/neuron/util/db/DBUtil.java | 9 ++ .../nervos/neuron/util/db/DBWalletUtil.java | 18 +-- .../org/nervos/neuron/webview/Web3View.java | 2 +- app/src/main/res/drawable-xhdpi/add.png | Bin 0 -> 297 bytes .../res/drawable-xhdpi/tab_app_default.png | Bin 656 -> 1292 bytes .../res/drawable-xhdpi/tab_app_selected.png | Bin 685 -> 1515 bytes .../drawable-xhdpi/tab_settings_default.png | Bin 1116 -> 2145 bytes .../drawable-xhdpi/tab_settings_selected.png | Bin 1208 -> 2054 bytes .../res/drawable-xhdpi/tab_wallet_default.png | Bin 717 -> 521 bytes .../drawable-xhdpi/tab_wallet_selected.png | Bin 731 -> 462 bytes .../main/res/drawable-xhdpi/title_close.png | Bin 1099 -> 1215 bytes .../main/res/drawable-xhdpi/title_more.png | Bin 791 -> 409 bytes app/src/main/res/drawable-xxhdpi/add.png | Bin 0 -> 559 bytes .../res/drawable-xxhdpi/tab_app_default.png | Bin 921 -> 2034 bytes .../res/drawable-xxhdpi/tab_app_selected.png | Bin 963 -> 2823 bytes .../drawable-xxhdpi/tab_settings_default.png | Bin 1830 -> 3436 bytes .../drawable-xxhdpi/tab_settings_selected.png | Bin 2012 -> 3684 bytes .../drawable-xxhdpi/tab_wallet_default.png | Bin 1044 -> 836 bytes .../drawable-xxhdpi/tab_wallet_selected.png | Bin 1025 -> 647 bytes .../main/res/drawable-xxhdpi/title_close.png | Bin 1829 -> 2533 bytes .../main/res/drawable-xxhdpi/title_more.png | Bin 1135 -> 584 bytes app/src/main/res/drawable-xxxhdpi/add.png | Bin 259 -> 0 bytes .../drawable/rectangle_border_gray_corner.xml | 2 +- .../main/res/layout/activity_add_website.xml | 11 +- app/src/main/res/layout/activity_app_web.xml | 2 +- app/src/main/res/layout/activity_main.xml | 2 +- .../main/res/layout/fragment_collection.xml | 14 ++ .../main/res/layout/fragment_token_list.xml | 3 +- app/src/main/res/layout/item_collection.xml | 60 ++++++++ app/src/main/res/layout/spinner_item.xml | 2 +- .../main/res/layout/view_setting_button.xml | 7 +- app/src/main/res/raw/init.js | 12 +- app/src/main/res/raw/neuron.js | 3 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/values/styles.xml | 3 +- 56 files changed, 618 insertions(+), 143 deletions(-) create mode 100644 app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java create mode 100644 app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java create mode 100644 app/src/main/java/org/nervos/neuron/item/CollectionItem.java create mode 100644 app/src/main/java/org/nervos/neuron/response/CollectionResponse.java create mode 100644 app/src/main/java/org/nervos/neuron/service/HttpUrls.java rename app/src/main/java/org/nervos/neuron/{util/currency/TokenCurrencyManager.java => service/TokenService.java} (60%) create mode 100644 app/src/main/res/drawable-xhdpi/add.png create mode 100644 app/src/main/res/drawable-xxhdpi/add.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/add.png create mode 100644 app/src/main/res/layout/fragment_collection.xml create mode 100644 app/src/main/res/layout/item_collection.xml diff --git a/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java b/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java index bca1fe99..90e1b0eb 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java @@ -2,12 +2,11 @@ import android.content.pm.PackageManager; import android.widget.TextView; -import android.widget.Toast; import org.nervos.neuron.R; import org.nervos.neuron.custom.SettingButtonView; import org.nervos.neuron.custom.TitleBar; -import org.nervos.neuron.util.ConstUtil; +import org.nervos.neuron.service.HttpUrls; /** * Created by 包俊 on 2018/7/30. @@ -58,19 +57,19 @@ protected void initData() { private void initListener() { sourceCodeSBV.setOpenListener(() -> { - SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, ConstUtil.SOURCE_CODE_GITHUB_URL); + SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, HttpUrls.SOURCE_CODE_GITHUB_URL); }); serverPrivateSBV.setOpenListener(() -> { - SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, ConstUtil.PRODUCT_AGREEMENT_URL); + SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, HttpUrls.PRODUCT_AGREEMENT_URL); }); NervosSBV.setOpenListener(() -> { - SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, ConstUtil.NERVOS_NETWORK); + SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, HttpUrls.NERVOS_NETWORK); }); InfuraSBV.setOpenListener(() -> { - SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, ConstUtil.INFURA); + SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, HttpUrls.INFURA); }); openSeaSBV.setOpenListener(() -> { - SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, ConstUtil.OPEN_SEA); + SimpleWebActivity.gotoSimpleWeb(AboutUsActivity.this, HttpUrls.OPEN_SEA); }); } } diff --git a/app/src/main/java/org/nervos/neuron/activity/AddTokenActivity.java b/app/src/main/java/org/nervos/neuron/activity/AddTokenActivity.java index b9b048c3..7fe889ff 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AddTokenActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AddTokenActivity.java @@ -16,11 +16,11 @@ import org.nervos.neuron.item.ChainItem; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.service.EthRpcService; +import org.nervos.neuron.service.HttpUrls; import org.nervos.neuron.service.NervosRpcService; import org.nervos.neuron.R; import org.nervos.neuron.item.TokenItem; import org.nervos.neuron.util.AddressUtil; -import org.nervos.neuron.util.ConstUtil; import org.nervos.neuron.util.db.DBTokenUtil; import org.nervos.neuron.util.permission.PermissionUtil; import org.nervos.neuron.util.permission.RuntimeRationale; @@ -61,7 +61,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { initView(); initData(); initListener(); - NervosRpcService.init(this, ConstUtil.NERVOS_NODE_IP); + NervosRpcService.init(this, HttpUrls.NERVOS_NODE_IP); } private void initView() { diff --git a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java index 5b2a3126..b6b41497 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java @@ -21,6 +21,7 @@ import org.nervos.neuron.dialog.SimpleDialog; import org.nervos.neuron.item.AppItem; import org.nervos.neuron.item.WalletItem; +import org.nervos.neuron.service.HttpUrls; import org.nervos.neuron.service.SignService; import org.nervos.neuron.util.Blockies; import org.nervos.neuron.util.ConstUtil; @@ -42,6 +43,9 @@ import org.nervos.neuron.webview.item.Message; import org.nervos.neuron.webview.item.Transaction; +import java.util.ArrayList; +import java.util.List; + public class AppWebActivity extends BaseActivity { public static final String EXTRA_PAYLOAD = "extra_payload"; @@ -138,11 +142,13 @@ private void closeMenuWindow() { private void initInjectWebView() { webView.setChainId(1); - webView.setRpcUrl(ConstUtil.ETH_NODE_IP); + webView.setRpcUrl(HttpUrls.ETH_NODE_IP); webView.setWalletAddress(new Address(walletItem.address)); webView.addJavascriptInterface(new NeuronAccount(), "neuronAccount"); + webView.addJavascriptInterface(new Neuron(), "neuron"); + webView.setOnSignTransactionListener(transaction -> { signTxAction(transaction); }); @@ -172,6 +178,18 @@ public String getAccount() { } } + private class Neuron { + @JavascriptInterface + public String getAccounts() { + List walletItems = DBWalletUtil.getAllWallet(mActivity); + List walletNames = new ArrayList<>(); + for (WalletItem item : walletItems) { + walletNames.add(item.address); + } + return new Gson().toJson(walletNames); + } + } + private void signTxAction(Transaction transaction) { this.signTransaction = transaction; if (walletItem == null) { diff --git a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java index b8b12038..fad0afa9 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java @@ -24,6 +24,7 @@ import org.nervos.neuron.item.TokenItem; import org.nervos.neuron.item.WalletItem; +import org.nervos.neuron.service.HttpUrls; import org.nervos.neuron.service.NervosRpcService; import org.nervos.neuron.R; @@ -111,7 +112,7 @@ protected void initView() { protected void initData() { tokenItem = getIntent().getParcelableExtra(EXTRA_TOKEN); EthRpcService.init(mActivity); - NervosRpcService.init(mActivity, ConstUtil.NERVOS_NODE_IP); + NervosRpcService.init(mActivity, HttpUrls.NERVOS_NODE_IP); walletItem = DBWalletUtil.getCurrentWallet(this); walletAddressText.setText(walletItem.address); walletNameText.setText(walletItem.name); diff --git a/app/src/main/java/org/nervos/neuron/fragment/AppFragment.java b/app/src/main/java/org/nervos/neuron/fragment/AppFragment.java index 8669eded..41f0e450 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/AppFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/AppFragment.java @@ -22,8 +22,7 @@ import org.nervos.neuron.activity.AddWebsiteActivity; import org.nervos.neuron.activity.AppWebActivity; import org.nervos.neuron.event.AppCollectEvent; -import org.nervos.neuron.util.ConstUtil; -import org.nervos.neuron.util.LogUtil; +import org.nervos.neuron.service.HttpUrls; import org.nervos.neuron.util.web.WebAppUtil; public class AppFragment extends Fragment { @@ -46,7 +45,7 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - webView.loadUrl(ConstUtil.DISCOVER_URL); + webView.loadUrl(HttpUrls.DISCOVER_URL); initWebSettings(); initWebView(); } @@ -70,7 +69,7 @@ public void onRefresh() { webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { - if (url.contains(ConstUtil.INNER_URL)) { + if (url.contains(HttpUrls.INNER_URL)) { return false; } else { Intent intent = new Intent(getContext(), AppWebActivity.class); diff --git a/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java new file mode 100644 index 00000000..37e071a1 --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java @@ -0,0 +1,105 @@ +package org.nervos.neuron.fragment.CollectionListFragment; + +import android.app.Activity; +import android.content.Context; +import android.net.Uri; +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.facebook.drawee.backends.pipeline.Fresco; +import com.facebook.drawee.interfaces.DraweeController; +import com.facebook.drawee.view.SimpleDraweeView; + +import org.nervos.neuron.R; +import org.nervos.neuron.item.CollectionItem; + +import java.util.List; + +public class CollectionAdapter extends RecyclerView.Adapter { + + public static final int VIEW_TYPE_ITEM = 1; + public static final int VIEW_TYPE_EMPTY = 0; + + public OnItemClickListener listener; + private Context context; + private List collectionItemList; + + public CollectionAdapter(Context context, List collectionItemList) { + this.context = context; + this.collectionItemList = collectionItemList; + notifyDataSetChanged(); + } + + public void setOnItemClickListener(OnItemClickListener listener) { + this.listener = listener; + } + + public void refresh(List collectionItemList) { + this.collectionItemList = collectionItemList; + notifyDataSetChanged(); + } + + @Override + public CollectionViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + if (viewType == VIEW_TYPE_EMPTY) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_empty_view, parent, false); + ((TextView) view.findViewById(R.id.empty_text)).setText(R.string.empty_no_token_data); + return new CollectionViewHolder(view) { + }; + } + CollectionViewHolder holder = new CollectionViewHolder( + LayoutInflater.from(context).inflate(R.layout.item_collection, parent, + false)); + return holder; + } + + @Override + public void onBindViewHolder(@NonNull CollectionViewHolder holder, int position) { + CollectionItem collectionItem = collectionItemList.get(position); + holder.collectionName.setText(collectionItem.name); + holder.collectionImage.setImageURI(collectionItem.imageUrl); + holder.collectionId.setText(String.format( + context.getString(R.string.collection_id_place_holder), collectionItem.tokenId)); + } + + @Override + public int getItemCount() { + return collectionItemList.size(); + } + + @Override + public int getItemViewType(int position) { + if (collectionItemList.size() == 0) { + return VIEW_TYPE_EMPTY; + } + return VIEW_TYPE_ITEM; + } + + class CollectionViewHolder extends RecyclerView.ViewHolder { + SimpleDraweeView collectionImage; + TextView collectionName; + TextView collectionNetwork; + TextView collectionId; + RelativeLayout root; + + public CollectionViewHolder(View view) { + super(view); + collectionImage = view.findViewById(R.id.collection_image); + collectionName = view.findViewById(R.id.collection_name); + collectionNetwork = view.findViewById(R.id.collection_network); + collectionId = view.findViewById(R.id.collection_id); + root = view.findViewById(R.id.root); + } + } + + public interface OnItemClickListener { + void onItemClick(View view, int position); + } + +} diff --git a/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java new file mode 100644 index 00000000..25a29efb --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java @@ -0,0 +1,90 @@ +package org.nervos.neuron.fragment.CollectionListFragment; + +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +import org.nervos.neuron.R; +import org.nervos.neuron.fragment.NBaseFragment; +import org.nervos.neuron.item.CollectionItem; +import org.nervos.neuron.response.CollectionResponse; +import org.nervos.neuron.service.TokenService; +import org.nervos.neuron.util.LogUtil; + +import java.util.ArrayList; +import java.util.List; + +import rx.Subscriber; + +public class CollectionListFragment extends NBaseFragment { + + private RecyclerView collectionRecycler; + private CollectionAdapter adapter; + private List collectionItemList = new ArrayList<>(); + private SwipeRefreshLayout swipeRefreshLayout; + + @Override + protected int getContentLayout() { + return R.layout.fragment_collection; + } + + @Override + protected void initView() { + super.initView(); + collectionRecycler = (RecyclerView) findViewById(R.id.collection_list); + swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout); + } + + @Override + protected void initAction() { + super.initAction(); + + adapter.setOnItemClickListener(new CollectionAdapter.OnItemClickListener() { + @Override + public void onItemClick(View view, int position) { + } + }); + + swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + getCollectionList(); + } + }); + } + + @Override + protected void initData() { + super.initData(); + adapter = new CollectionAdapter(getContext(), collectionItemList); + collectionRecycler.setLayoutManager(new LinearLayoutManager(getActivity())); + collectionRecycler.setAdapter(adapter); + + showProgressBar(); + getCollectionList(); + + } + + private void getCollectionList() { + TokenService.getCollectionList(getContext()) + .subscribe(new Subscriber() { + @Override + public void onCompleted() { + swipeRefreshLayout.setRefreshing(false); + dismissProgressBar(); + } + @Override + public void onError(Throwable e) { + e.printStackTrace(); + swipeRefreshLayout.setRefreshing(false); + dismissProgressBar(); + } + @Override + public void onNext(CollectionResponse collectionResponse) { + collectionItemList = collectionResponse.assets; + adapter.refresh(collectionItemList); + } + }); + } +} diff --git a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java index 4e0311f3..1b382137 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java @@ -2,7 +2,6 @@ import android.app.Activity; import android.app.AlertDialog; -import android.content.DialogInterface; import android.content.Intent; import android.view.View; import android.widget.Toast; @@ -13,7 +12,7 @@ import org.nervos.neuron.activity.SimpleWebActivity; import org.nervos.neuron.custom.SettingButtonView; import org.nervos.neuron.dialog.AuthFingerDialog; -import org.nervos.neuron.util.ConstUtil; +import org.nervos.neuron.service.HttpUrls; import org.nervos.neuron.util.FingerPrint.AuthenticateResultCallback; import org.nervos.neuron.util.FingerPrint.FingerPrintController; import org.nervos.neuron.util.SharePreConst; @@ -44,7 +43,9 @@ public void initData() { currencySBV.setOther1Text(SharePrefUtil.getString(SharePreConst.Currency, "CNY")); if (FingerPrintController.getInstance(getActivity()).isSupportFingerprint()) { fingerPrintSBV.setVisibility(View.VISIBLE); - if (FingerPrintController.getInstance(getActivity()).hasEnrolledFingerprints() && FingerPrintController.getInstance(getActivity()).getEnrolledFingerprints().size() > 0 && SharePrefUtil.getBoolean(SharePreConst.FingerPrint, false)) { + if (FingerPrintController.getInstance(getActivity()).hasEnrolledFingerprints() + && FingerPrintController.getInstance(getActivity()).getEnrolledFingerprints().size() > 0 + && SharePrefUtil.getBoolean(SharePreConst.FingerPrint, false)) { fingerPrintSBV.setSwitch(true); } else { SharePrefUtil.putBoolean(SharePreConst.FingerPrint, false); @@ -64,7 +65,8 @@ public void initAction() { fingerPrintSBV.setSwitchListener((is) -> { if (is) { //setting fingerprint - if (FingerPrintController.getInstance(getActivity()).hasEnrolledFingerprints() && FingerPrintController.getInstance(getActivity()).getEnrolledFingerprints().size() > 0) { + if (FingerPrintController.getInstance(getActivity()).hasEnrolledFingerprints() + && FingerPrintController.getInstance(getActivity()).getEnrolledFingerprints().size() > 0) { if (authFingerDialog == null) authFingerDialog = new AuthFingerDialog(getActivity(), R.style.Theme_AppCompat_Dialog); authFingerDialog.setOnShowListener((dialogInterface) -> { @@ -96,7 +98,7 @@ public void initAction() { startActivity(intent); }); contactUsSBV.setOpenListener(() -> { - SimpleWebActivity.gotoSimpleWeb(getContext(), ConstUtil.CONTACT_US_RUL); + SimpleWebActivity.gotoSimpleWeb(getContext(), HttpUrls.CONTACT_US_RUL); }); } diff --git a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java index 53dc788e..2cbec497 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java @@ -14,12 +14,9 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import org.nervos.neuron.R; -import org.nervos.neuron.activity.CurrencyActivity; -import org.nervos.neuron.activity.ReceiveQrCodeActivity; import org.nervos.neuron.activity.TokenManageActivity; import org.nervos.neuron.activity.TransactionListActivity; import org.nervos.neuron.activity.TransferActivity; -import org.nervos.neuron.dialog.TokenTransferDialog; import org.nervos.neuron.event.TokenRefreshEvent; import org.nervos.neuron.fragment.NBaseFragment; import org.nervos.neuron.fragment.TokenListFragment.model.TokenAdapter; @@ -28,11 +25,8 @@ import org.nervos.neuron.item.TokenItem; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.service.WalletService; -import org.nervos.neuron.util.LogUtil; -import org.nervos.neuron.util.SharePreConst; -import org.nervos.neuron.util.currency.TokenCurrencyManager; +import org.nervos.neuron.service.TokenService; import org.nervos.neuron.util.db.DBWalletUtil; -import org.nervos.neuron.util.db.SharePrefUtil; import java.text.DecimalFormat; import java.util.ArrayList; @@ -164,7 +158,7 @@ public void setData() { private void getPrice() { for (TokenItem item : this.tokenItemList) { if (item.balance != 0.0 && item.chainId < 0) - TokenCurrencyManager.getCurrency(item.symbol, currencyItem.getName()).subscribe(new Subscriber() { + TokenService.getCurrency(item.symbol,currencyItem.getName()).subscribe(new Subscriber() { @Override public void onCompleted() { adapter.notifyDataSetChanged(); diff --git a/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java b/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java index d01c6c55..5fcde705 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java @@ -19,6 +19,7 @@ import org.nervos.neuron.custom.WalletToolbar; import org.nervos.neuron.custom.WalletTopView; import org.nervos.neuron.event.TokenRefreshEvent; +import org.nervos.neuron.fragment.CollectionListFragment.CollectionListFragment; import org.nervos.neuron.fragment.NBaseFragment; import org.nervos.neuron.fragment.SettingsFragment; import org.nervos.neuron.fragment.TokenListFragment.view.TokenListFragment; @@ -41,6 +42,7 @@ public class WalletsFragment extends NBaseFragment { private WalletTopView walletView; private WalletItem walletItem; private TokenListFragment tokenListFragment; + private CollectionListFragment collectionListFragment; private WalletFragmentPresenter presenter; private ImageView rightImage; @@ -77,6 +79,7 @@ protected void initData() { presenter.setIndicator(mTabLayout, 70, 70); }); tokenListFragment = new TokenListFragment(); + collectionListFragment = new CollectionListFragment(); presenter = new WalletFragmentPresenter(getActivity()); initWalletData(); } @@ -85,16 +88,16 @@ protected void initData() { protected void initAction() { super.initAction(); appBarLayout.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> { - int scrollRangle = appBarLayout.getTotalScrollRange(); + int scrollRange = appBarLayout.getTotalScrollRange(); if (verticalOffset == 0) { toolbar.setAlpha(0.0f); toolbar.setVisibility(View.GONE); walletView.setAlpha(1.0f); } else { - float alfha = Math.round(100.0f * Math.abs(verticalOffset) / scrollRangle) / 100.0f; - toolbar.setAlpha(alfha); + float alpha = Math.round(100.0f * Math.abs(verticalOffset) / scrollRange) / 100.0f; + toolbar.setAlpha(alpha); toolbar.setVisibility(View.VISIBLE); - walletView.setAlpha(1.0f - alfha); + walletView.setAlpha(1.0f - alpha); } }); toolbar.setRightTitleClickListener((view) -> { @@ -129,9 +132,9 @@ public Fragment getItem(int position) { case 0: return tokenListFragment; case 1: - return new SettingsFragment(); + return collectionListFragment; default: - return new TokenListFragment(); + return tokenListFragment; } } diff --git a/app/src/main/java/org/nervos/neuron/item/CollectionItem.java b/app/src/main/java/org/nervos/neuron/item/CollectionItem.java new file mode 100644 index 00000000..c513823e --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/item/CollectionItem.java @@ -0,0 +1,130 @@ +package org.nervos.neuron.item; + +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +public class CollectionItem { + + + /** + * token_id : 209 + * image_url : https://storage.googleapis.com/opensea-prod.appspot.com/0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe/209.png + * image_preview_url : https://storage.googleapis.com/opensea-prod.appspot.com/0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe/209.png + * background_color : 0xffffff + * name : Digital Art 209 + * description : Digital Art 209 + * external_link : + * asset_contract : {"address":"0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe","name":"DigitalArtChain","symbol":"DAC","image_url":"https://storage.googleapis.com/opensea-static/digitalartchain-logo.png","featured_image_url":"https://storage.googleapis.com/opensea-static/Category-Thumb-DigitalArtChain.png","featured":false,"description":"Publish your own digital art on the blockchain. Digital Art is published on IPFS and associated to Ethereum ERC721 token which enables you own, sell, and purchase published Digital Art.","external_link":"http://digitalartchain.com/","wiki_link":null,"stats":null,"traits":null,"hidden":false,"nft_version":"3.0","schema_name":"ERC721","display_data":{"images":["https://storage.googleapis.com/opensea-prod.appspot.com/0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe%2F33","https://storage.googleapis.com/opensea-prod.appspot.com/0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe%2F29","https://storage.googleapis.com/opensea-prod.appspot.com/0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe%2F36","https://storage.googleapis.com/opensea-prod.appspot.com/0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe%2F32","https://storage.googleapis.com/opensea-prod.appspot.com/0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe%2F31","https://storage.googleapis.com/opensea-prod.appspot.com/0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe%2F25"]},"short_description":"ERC721","total_supply":10000,"buyer_fee_basis_points":0,"seller_fee_basis_points":125} + * owner : {"user":{"username":"fincho"},"profile_img_url":"https://storage.googleapis.com/opensea-static/opensea-profile/18.png","address":"0x0239769a1adf4def9f07da824b80b9c4fcb59593","config":""} + * auctions : [] + * traits : [] + * last_sale : null + * num_sales : 0 + */ + + @SerializedName("token_id") + public String tokenId; + @SerializedName("image_url") + public String imageUrl; + @SerializedName("image_preview_url") + public String imagePreviewUrl; + @SerializedName("background_color") + public String backgroundColor; + public String name; + public String description; + @SerializedName("external_link") + public String externalLink; + @SerializedName("asset_contract") + public AssetContractEntity assetContract; + public OwnerEntity owner; + @SerializedName("last_sale") + public Object lastSale; + @SerializedName("num_sales") + public int numSales; + public List auctions; + public List traits; + + + public static class AssetContractEntity { + /** + * address : 0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe + * name : DigitalArtChain + * symbol : DAC + * image_url : https://storage.googleapis.com/opensea-static/digitalartchain-logo.png + * featured_image_url : https://storage.googleapis.com/opensea-static/Category-Thumb-DigitalArtChain.png + * featured : false + * description : Publish your own digital art on the blockchain. Digital Art is published on IPFS and associated to Ethereum ERC721 token which enables you own, sell, and purchase published Digital Art. + * external_link : http://digitalartchain.com/ + * wiki_link : null + * stats : null + * traits : null + * hidden : false + * nft_version : 3.0 + * schema_name : ERC721 + * display_data : {"images":["https://storage.googleapis.com/opensea-prod.appspot.com/0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe%2F33","https://storage.googleapis.com/opensea-prod.appspot.com/0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe%2F29","https://storage.googleapis.com/opensea-prod.appspot.com/0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe%2F36","https://storage.googleapis.com/opensea-prod.appspot.com/0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe%2F32","https://storage.googleapis.com/opensea-prod.appspot.com/0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe%2F31","https://storage.googleapis.com/opensea-prod.appspot.com/0x323a3e1693e7a0959f65972f3bf2dfcb93239dfe%2F25"]} + * short_description : ERC721 + * total_supply : 10000 + * buyer_fee_basis_points : 0 + * seller_fee_basis_points : 125 + */ + + public String address; + public String name; + public String symbol; + @SerializedName("image_url") + public String imageUrl; + @SerializedName("featured_image_url") + public String featuredImageUrl; + public boolean featured; + public String description; + @SerializedName("external_link") + public String externalLink; + @SerializedName("wiki_link") + public String wikiLink; + public String stats; + public String traits; + public boolean hidden; + @SerializedName("nft_version") + public String nftVersion; + @SerializedName("schema_name") + public String schemaName; + @SerializedName("display_data") + public DisplayDataEntity displayData; + @SerializedName("short_description") + public String shortDescription; + @SerializedName("total_supply") + public int totalSupply; + @SerializedName("buyer_fee_basis_points") + public int buyerFeeBasisPoints; + @SerializedName("seller_fee_basis_points") + public int sellerFeeBasisPoints; + + public static class DisplayDataEntity { + public List images; + } + } + + public static class OwnerEntity { + /** + * user : {"username":"fincho"} + * profile_img_url : https://storage.googleapis.com/opensea-static/opensea-profile/18.png + * address : 0x0239769a1adf4def9f07da824b80b9c4fcb59593 + * config : + */ + + public UserEntity user; + @SerializedName("profile_img_url") + public String profileImgUrl; + public String address; + public String config; + + public static class UserEntity { + /** + * username : fincho + */ + + public String username; + } + } +} diff --git a/app/src/main/java/org/nervos/neuron/response/CollectionResponse.java b/app/src/main/java/org/nervos/neuron/response/CollectionResponse.java new file mode 100644 index 00000000..614a3555 --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/response/CollectionResponse.java @@ -0,0 +1,12 @@ +package org.nervos.neuron.response; + +import org.nervos.neuron.item.CollectionItem; + +import java.util.List; + +public class CollectionResponse { + + public long count; + public List assets; + +} diff --git a/app/src/main/java/org/nervos/neuron/service/EthRpcService.java b/app/src/main/java/org/nervos/neuron/service/EthRpcService.java index 14f718e7..8842793f 100644 --- a/app/src/main/java/org/nervos/neuron/service/EthRpcService.java +++ b/app/src/main/java/org/nervos/neuron/service/EthRpcService.java @@ -55,7 +55,7 @@ public class EthRpcService { private static Web3j service; public static void init(Context context) { - service = Web3jFactory.build(new InfuraHttpService(ConstUtil.ETH_NODE_IP)); + service = Web3jFactory.build(new InfuraHttpService(HttpUrls.ETH_NODE_IP)); walletItem = DBWalletUtil.getCurrentWallet(context); } diff --git a/app/src/main/java/org/nervos/neuron/service/HttpUrls.java b/app/src/main/java/org/nervos/neuron/service/HttpUrls.java new file mode 100644 index 00000000..7e06fb6e --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/service/HttpUrls.java @@ -0,0 +1,38 @@ +package org.nervos.neuron.service; + +public class HttpUrls { + + public static final String ETHER_SCAN_API_KEY = "T9GV1IF4V7YDXQ8F53U1FK2KHCE2KUUD8Z"; + public static final String NERVOS_SERVER_URL = "http://47.97.171.140:4000"; + public static final String NERVOS_TRANSACTION_URL = NERVOS_SERVER_URL + "/api/transactions?account="; + public static final String ETH_TRANSACTION_URL = "http://api.etherscan.io/api?apikey=" + + ETHER_SCAN_API_KEY + "&module=account&action=txlist&sort=asc&address="; + + + // setting module url list + public static final String SOURCE_CODE_GITHUB_URL = "https://github.com/cryptape/Neuron-Android"; + public static final String PRODUCT_AGREEMENT_URL = "https://cryptape.github.io/Neuron-Android/#/zh-CN/product-agreement"; + public static final String CONTACT_US_RUL = "http://appchain.nervos.org//#/contact-us"; + public static final String NERVOS_NETWORK = "https://www.nervos.org/"; + public static final String OPEN_SEA = "https://opensea.io/"; + public static final String INFURA = "https://infura.io/"; + + + // node host + public static final String NERVOS_NODE_IP = "http://121.196.200.225:1337"; + public static final String ETH_NODE_IP = "https://mainnet.infura.io/h3iIzGIN6msu3KeUrdlt"; +// public static final String ETH_NODE_IP = "https://rinkeby.infura.io/llyrtzQ3YhkdESt2Fzrk"; + + + // discover page config information + public static final String DISCOVER_URL = "http://47.97.171.140:8866/dapps"; + public static final String INNER_URL = "http://47.97.171.140:8866/"; + + + //Token Currency ID Price + public static final String TOKEN_ID = "https://api.coinmarketcap.com/v2/listings/"; + public static final String Token_CURRENCY = "https://api.coinmarketcap.com/v2/ticker/@ID/?convert=@Currency"; + + public static final String COLLECTION_LIST_URL = "https://api.opensea.io/api/v1/assets/?owner="; + +} diff --git a/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java b/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java index 538bd67f..dffafef6 100644 --- a/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java +++ b/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java @@ -45,7 +45,7 @@ public static Observable> getTransactionList(Context conte return Observable.fromCallable(new Callable() { @Override public EthMetaData.EthMetaDataResult call() { - NervosRpcService.init(context, ConstUtil.NERVOS_NODE_IP); + NervosRpcService.init(context, HttpUrls.NERVOS_NODE_IP); return NervosRpcService.getMetaData().getEthMetaDataResult(); } }).flatMap(new Func1>>() { @@ -53,7 +53,7 @@ public EthMetaData.EthMetaDataResult call() { public Observable> call(EthMetaData.EthMetaDataResult result) { ethMetaDataResult = result; try { - String nervosUrl = ConstUtil.NERVOS_TRANSACTION_URL + walletItem.address; + String nervosUrl = HttpUrls.NERVOS_TRANSACTION_URL + walletItem.address; final Request nervosRequest = new Request.Builder().url(nervosUrl).build(); Call nervosCall = NervosHttpService.getHttpClient().newCall(nervosRequest); @@ -74,7 +74,7 @@ public Observable> call(EthMetaData.EthMetaDataResult resu @Override public Observable> call(List list) { try { - String ethUrl = ConstUtil.ETH_TRANSACTION_URL + walletItem.address; + String ethUrl = HttpUrls.ETH_TRANSACTION_URL + walletItem.address; final Request ethRequest = new Request.Builder().url(ethUrl).build(); Call ethCall = NervosHttpService.getHttpClient().newCall(ethRequest); EthTransactionResponse response = new Gson().fromJson(ethCall.execute() @@ -105,7 +105,7 @@ public static Observable> getETHTransactionList(Context co @Override public Observable> call(WalletItem walletItem) { try { - String ethUrl = ConstUtil.ETH_TRANSACTION_URL + walletItem.address; + String ethUrl = HttpUrls.ETH_TRANSACTION_URL + walletItem.address; final Request ethRequest = new Request.Builder().url(ethUrl).build(); Call ethCall = NervosHttpService.getHttpClient().newCall(ethRequest); EthTransactionResponse response = new Gson().fromJson(ethCall.execute() @@ -131,14 +131,14 @@ public static Observable> getNervosTransactionList(Context return Observable.fromCallable(new Callable() { @Override public EthMetaData.EthMetaDataResult call() { - NervosRpcService.init(context, ConstUtil.NERVOS_NODE_IP); + NervosRpcService.init(context, HttpUrls.NERVOS_NODE_IP); return NervosRpcService.getMetaData().getEthMetaDataResult(); } }).flatMap(new Func1>>() { @Override public Observable> call(EthMetaData.EthMetaDataResult result) { try { - String nervosUrl = ConstUtil.NERVOS_TRANSACTION_URL + walletItem.address; + String nervosUrl = HttpUrls.NERVOS_TRANSACTION_URL + walletItem.address; final Request nervosRequest = new Request.Builder().url(nervosUrl).build(); Call nervosCall = NervosHttpService.getHttpClient().newCall(nervosRequest); diff --git a/app/src/main/java/org/nervos/neuron/util/currency/TokenCurrencyManager.java b/app/src/main/java/org/nervos/neuron/service/TokenService.java similarity index 60% rename from app/src/main/java/org/nervos/neuron/util/currency/TokenCurrencyManager.java rename to app/src/main/java/org/nervos/neuron/service/TokenService.java index f3da66f6..fa985e6c 100644 --- a/app/src/main/java/org/nervos/neuron/util/currency/TokenCurrencyManager.java +++ b/app/src/main/java/org/nervos/neuron/service/TokenService.java @@ -1,5 +1,6 @@ -package org.nervos.neuron.util.currency; +package org.nervos.neuron.service; +import android.content.Context; import android.text.TextUtils; import com.google.gson.Gson; @@ -8,16 +9,17 @@ import org.json.JSONObject; import org.nervos.neuron.item.CurrencyIDItem; import org.nervos.neuron.item.CurrencyIDList; -import org.nervos.neuron.service.NervosHttpService; -import org.nervos.neuron.util.ConstUtil; +import org.nervos.neuron.item.WalletItem; +import org.nervos.neuron.response.CollectionResponse; +import org.nervos.neuron.util.db.DBWalletUtil; import java.io.IOException; import java.util.ArrayList; +import java.util.concurrent.Callable; import okhttp3.Call; import okhttp3.Request; import rx.Observable; -import rx.Scheduler; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; import rx.schedulers.Schedulers; @@ -25,7 +27,7 @@ /** * Created by BaojunCZ on 2018/8/3. */ -public class TokenCurrencyManager { +public class TokenService { private static ArrayList list = null; @@ -36,7 +38,7 @@ public static Observable getCurrency(String symbol, String currency) { @Override public Observable call(String ID) { if (!TextUtils.isEmpty(ID)) { - String url = ConstUtil.Token_CURRENCY.replace("@ID", ID).replace("@Currency", currency); + String url = HttpUrls.Token_CURRENCY.replace("@ID", ID).replace("@Currency", currency); Request request = new Request.Builder().url(url).build(); Call call = NervosHttpService.getHttpClient().newCall(request); String response = ""; @@ -64,7 +66,7 @@ public Observable call(String ID) { public static Observable getTokenCurrency(String ID, String currency) { return Observable.fromCallable(() -> { - String url = ConstUtil.Token_CURRENCY.replace("@ID", ID).replace("@Currency", currency); + String url = HttpUrls.Token_CURRENCY.replace("@ID", ID).replace("@Currency", currency); Request request = new Request.Builder().url(url).build(); Call call = NervosHttpService.getHttpClient().newCall(request); String response = ""; @@ -82,15 +84,14 @@ public static Observable getTokenCurrency(String ID, String currency) { } else { return null; } - }) - .subscribeOn(Schedulers.newThread()) - .observeOn(AndroidSchedulers.mainThread()); + }).subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()); } public static Observable getTokenID(String symbol) { return Observable.fromCallable(() -> { if (list == null) { - Request request = new Request.Builder().url(ConstUtil.TOKEN_ID).build(); + Request request = new Request.Builder().url(HttpUrls.TOKEN_ID).build(); Call call = NervosHttpService.getHttpClient().newCall(request); String response = ""; try { @@ -102,25 +103,46 @@ public static Observable getTokenID(String symbol) { list = gson.fromJson(response, CurrencyIDList.class).getList(); } return list; - }) - .subscribeOn(Schedulers.newThread()) - .flatMap(new Func1, Observable>() { - @Override - public Observable call(ArrayList currencyIDItems) { - CurrencyIDItem res = null; - for (CurrencyIDItem item : list) { - if (item.getSymbol().equals(symbol)) { - res = item; - break; - } - } - if (res == null) { - return Observable.just(null); - } else { - return Observable.just(res.getId()); - } + }).subscribeOn(Schedulers.newThread()) + .flatMap(new Func1, Observable>() { + @Override + public Observable call(ArrayList currencyIDItems) { + CurrencyIDItem res = null; + for (CurrencyIDItem item : list) { + if (item.getSymbol().equals(symbol)) { + res = item; + break; } - }); + } + if (res == null) { + return Observable.just(null); + } else { + return Observable.just(res.getId()); + } + } + }); + } + + + // 0x0239769a1adf4def9f07da824b80b9c4fcb59593 ERC721测试地址 + public static Observable getCollectionList(Context context) { + WalletItem walletItem = DBWalletUtil.getCurrentWallet(context); + return Observable.fromCallable(new Callable() { + @Override + public CollectionResponse call() throws Exception { + Request request = new Request.Builder() + .url(HttpUrls.COLLECTION_LIST_URL + walletItem.address).build(); + Call call = NervosHttpService.getHttpClient().newCall(request); + String response = ""; + try { + response = call.execute().body().string(); + } catch (IOException e) { + e.printStackTrace(); + } + return new Gson().fromJson(response, CollectionResponse.class); + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); } } diff --git a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java index 6fb35986..4018623f 100644 --- a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java @@ -10,35 +10,9 @@ public class ConstUtil { public static final long LONG_6 = 1000000; public static final long VALID_BLOCK_NUMBER_DIFF = 80L; - - // setting module url list - public static final String SOURCE_CODE_GITHUB_URL = "https://github.com/cryptape/Neuron-Android"; - public static final String PRODUCT_AGREEMENT_URL = "https://cryptape.github.io/Neuron-Android/#/zh-CN/product-agreement"; - public static final String CONTACT_US_RUL = "http://appchain.nervos.org//#/contact-us"; - public static final String NERVOS_NETWORK = "https://www.nervos.org/"; - public static final String OPEN_SEA = "https://opensea.io/"; - public static final String INFURA = "https://infura.io/"; - // transaction list page config information public static final String ETH_MAINNET = "Ethereum Mainnet"; public static final long DEFAULT_QUATO = LONG_6; - public static final String ETHER_SCAN_API_KEY = "T9GV1IF4V7YDXQ8F53U1FK2KHCE2KUUD8Z"; - public static final String NERVOS_SERVER_URL = "http://47.97.171.140:4000"; - public static final String NERVOS_TRANSACTION_URL = NERVOS_SERVER_URL + "/api/transactions?account="; - public static final String ETH_TRANSACTION_URL = "http://api.etherscan.io/api?apikey=" - + ETHER_SCAN_API_KEY + "&module=account&action=txlist&sort=asc&address="; - - - // discover page config information - public static final String DISCOVER_URL = "http://47.97.171.140:8866/dapps"; - public static final String INNER_URL = "http://47.97.171.140:8866/"; - - - // node host - public static final String NERVOS_NODE_IP = "http://121.196.200.225:1337"; - public static final String ETH_NODE_IP = "https://mainnet.infura.io/h3iIzGIN6msu3KeUrdlt"; -// public static final String ETH_NODE_IP = "https://rinkeby.infura.io/llyrtzQ3YhkdESt2Fzrk"; - // gas constant data public static final BigInteger GAS_LIMIT = Numeric.toBigInt("0x5208"); // default eth gas limit is 21000 @@ -57,8 +31,4 @@ public class ConstUtil { public static final String DECIMALS_HASH = "313ce567"; public static final String BALANCEOF_HASH = "70a08231"; - - //Token Currency ID Price - public static final String TOKEN_ID = "https://api.coinmarketcap.com/v2/listings/"; - public static final String Token_CURRENCY = "https://api.coinmarketcap.com/v2/ticker/@ID/?convert=@Currency"; } diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBAppUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBAppUtil.java index 7146d51f..feb5a38c 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBAppUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBAppUtil.java @@ -17,7 +17,7 @@ public class DBAppUtil extends DBUtil { public static void saveDbApp(Context context, AppItem appItem) { try { - DB db = DBFactory.open(context, DB_APP, kryo); + DB db = openDB(context, DB_APP); db.put(getDbKey(appItem.entry), appItem); db.close(); } catch (SnappydbException e) { @@ -27,7 +27,7 @@ public static void saveDbApp(Context context, AppItem appItem) { public static void deleteApp(Context context, String entry) { try { - DB db = DBFactory.open(context, DB_APP); + DB db = openDB(context, DB_APP); db.del(getDbKey(entry)); db.close(); } catch (SnappydbException e) { @@ -38,7 +38,7 @@ public static void deleteApp(Context context, String entry) { public static List getAllApp(Context context) { List walletList = new ArrayList<>(); try { - DB db = DBFactory.open(context, DB_APP); + DB db = openDB(context, DB_APP); String[] keys = db.findKeys(DB_PREFIX); db.close(); for(String key: keys) { @@ -52,7 +52,7 @@ public static List getAllApp(Context context) { public static boolean findApp(Context context, String entry) { try { - DB db = DBFactory.open(context, DB_APP); + DB db = openDB(context, DB_APP); String[] keys = db.findKeys(getDbKey(entry)); db.close(); return keys.length > 0; @@ -65,7 +65,7 @@ public static boolean findApp(Context context, String entry) { public static AppItem getApp(Context context, String entry) { try { - DB db = DBFactory.open(context, DB_APP); + DB db = openDB(context, DB_APP); AppItem appItem = db.getObject(getDbKey(entry), AppItem.class); db.close(); return appItem; diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java index adc57a4d..307004e0 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java @@ -22,7 +22,7 @@ public class DBChainUtil extends DBUtil { public static List getAllChain(Context context) { List chainItemList = new ArrayList<>(); try { - DB db = DBFactory.open(context, DB_CHAIN, kryo); + DB db = openDB(context, DB_CHAIN); String[] keys = db.findKeys(DB_PREFIX); for(String key: keys) { ChainItem chainItem = db.getObject(key, ChainItem.class); @@ -38,7 +38,7 @@ public static List getAllChain(Context context) { public static ChainItem getChain(Context context, int chainId) { try { - DB db = DBFactory.open(context, DB_CHAIN); + DB db = openDB(context, DB_CHAIN); ChainItem chainItem = db.getObject(getDbKey(String.valueOf(chainId)), ChainItem.class); db.close(); return chainItem; @@ -62,7 +62,7 @@ public static List getAllChainName(Context context) { public static void saveChain(Context context, ChainItem chainItem){ try { - DB db = DBFactory.open(context, DB_CHAIN); + DB db = openDB(context, DB_CHAIN); db.put(getDbKey(String.valueOf(chainItem.chainId)), chainItem); db.close(); } catch (SnappydbException e) { diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBHistoryUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBHistoryUtil.java index 16df1819..8a71b133 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBHistoryUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBHistoryUtil.java @@ -16,7 +16,7 @@ public class DBHistoryUtil extends DBUtil { public static List getAllHistory(Context context) { List historyList = new ArrayList<>(); try { - DB db = DBFactory.open(context, DB_HISTORY, kryo); + DB db = openDB(context, DB_HISTORY); String[] keys = db.findKeys(DB_PREFIX); for(String key: keys) { historyList.add(db.get(key)); @@ -31,7 +31,7 @@ public static List getAllHistory(Context context) { public static void saveHistory(Context context, String url){ try { - DB db = DBFactory.open(context, DB_HISTORY); + DB db = openDB(context, DB_HISTORY); db.put(getDbKey(url), url); db.close(); } catch (SnappydbException e) { diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBTokenUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBTokenUtil.java index aa262f1b..224bec3e 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBTokenUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBTokenUtil.java @@ -17,7 +17,7 @@ public class DBTokenUtil extends DBUtil { public static void saveToken(Context context, TokenItem tokenItem){ try { - DB db = DBFactory.open(context, DB_TOKEN, kryo); + DB db = openDB(context, DB_TOKEN); db.put(getDbKey(tokenItem.name), tokenItem); db.close(); } catch (SnappydbException e) { @@ -27,7 +27,7 @@ public static void saveToken(Context context, TokenItem tokenItem){ public static boolean checkTokenExist(Context context, TokenItem tokenItem) { try { - DB db = DBFactory.open(context, DB_TOKEN); + DB db = openDB(context, DB_TOKEN); String[] keys = db.findKeys(getDbKey(tokenItem.name)); db.close(); return keys.length > 0; @@ -40,7 +40,7 @@ public static boolean checkTokenExist(Context context, TokenItem tokenItem) { public static List getAllTokens(Context context) { List tokenList = new ArrayList<>(); try { - DB db = DBFactory.open(context, DB_TOKEN); + DB db = openDB(context, DB_TOKEN); String[] keys = db.findKeys(DB_PREFIX); for (String key: keys) { tokenList.add(db.getObject(key, TokenItem.class)); diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBUtil.java index 9457d296..d8980d9a 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBUtil.java @@ -1,7 +1,12 @@ package org.nervos.neuron.util.db; +import android.content.Context; + import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer; +import com.snappydb.DB; +import com.snappydb.DBFactory; +import com.snappydb.SnappydbException; public class DBUtil { @@ -13,6 +18,10 @@ public class DBUtil { kryo.setDefaultSerializer(CompatibleFieldSerializer.class); } + static DB openDB(Context context, String dbName) throws SnappydbException { + return DBFactory.open(context, dbName, kryo); + } + static String getDbKey(String origin) { return DB_PREFIX + origin; } diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java index 96e2afbb..54196030 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java @@ -33,7 +33,7 @@ public static WalletItem getWallet(Context context, String walletName) { if (TextUtils.isEmpty(walletName)) return null; try { - DB db = DBFactory.open(context, DB_WALLET, kryo); + DB db = openDB(context, DB_WALLET); WalletItem walletItem = db.getObject(getDbKey(walletName), WalletItem.class); db.close(); return walletItem; @@ -50,7 +50,7 @@ public static WalletItem getCurrentWallet(Context context) { public static List getAllWalletName(Context context) { List walletList = new ArrayList<>(); try { - DB db = DBFactory.open(context, DB_WALLET, kryo); + DB db = openDB(context, DB_WALLET); String[] keys = db.findKeys(DB_PREFIX); List walletItems = new ArrayList<>(); for (String key : keys) { @@ -75,7 +75,7 @@ public int compare(WalletItem o1, WalletItem o2) { public static List getAllWallet(Context context) { List walletItems = new ArrayList<>(); try { - DB db = DBFactory.open(context, DB_WALLET, kryo); + DB db = openDB(context, DB_WALLET); String[] keys = db.findKeys(DB_PREFIX); for (String key : keys) { walletItems.add(db.getObject(key, WalletItem.class)); @@ -95,7 +95,7 @@ public int compare(WalletItem o1, WalletItem o2) { public static void saveWallet(Context context, WalletItem walletItem) { try { - DB db = DBFactory.open(context, DB_WALLET, kryo); + DB db = openDB(context, DB_WALLET); db.put(getDbKey(walletItem.name), walletItem); db.close(); } catch (SnappydbException e) { @@ -105,7 +105,7 @@ public static void saveWallet(Context context, WalletItem walletItem) { public static boolean updateWalletPassword(Context context, String name, String oldPassword, String newPassword) { try { - DB db = DBFactory.open(context, DB_WALLET, kryo); + DB db = openDB(context, DB_WALLET); WalletItem walletItem = db.getObject(getDbKey(name), WalletItem.class); try { String privateKey = AESCrypt.decrypt(oldPassword, walletItem.cryptPrivateKey); @@ -125,7 +125,7 @@ public static boolean updateWalletPassword(Context context, String name, String public static void updateWalletName(Context context, String name, String newName) { try { - DB db = DBFactory.open(context, DB_WALLET, kryo); + DB db = openDB(context, DB_WALLET); WalletItem walletItem = db.getObject(getDbKey(name), WalletItem.class); db.del(getDbKey(name)); walletItem.name = newName; @@ -138,7 +138,7 @@ public static void updateWalletName(Context context, String name, String newName public static boolean checkWalletName(Context context, String name) { try { - DB db = DBFactory.open(context, DB_WALLET, kryo); + DB db = openDB(context, DB_WALLET); boolean isKeyExist = db.exists(getDbKey(name)); db.close(); return isKeyExist; @@ -151,7 +151,7 @@ public static boolean checkWalletName(Context context, String name) { public static boolean checkWalletAddress(Context context, String address) { boolean isKeyExist = false; try { - DB db = DBFactory.open(context, DB_WALLET, kryo); + DB db = openDB(context, DB_WALLET); List names = getAllWalletName(context); for (String name : names) { WalletItem walletItem = getWallet(context, name); @@ -167,7 +167,7 @@ public static boolean checkWalletAddress(Context context, String address) { public static void deleteWallet(Context context, String name) { try { - DB db = DBFactory.open(context, DB_WALLET, kryo); + DB db = openDB(context, DB_WALLET); db.del(getDbKey(name)); db.close(); } catch (SnappydbException e) { diff --git a/app/src/main/java/org/nervos/neuron/webview/Web3View.java b/app/src/main/java/org/nervos/neuron/webview/Web3View.java index 62befb1f..358dfefc 100644 --- a/app/src/main/java/org/nervos/neuron/webview/Web3View.java +++ b/app/src/main/java/org/nervos/neuron/webview/Web3View.java @@ -83,7 +83,7 @@ private void init() { innerOnSignTransactionListener, innerOnSignMessageListener, innerOnSignPersonalMessageListener, - innerOnSignTypedMessageListener), "neuron"); + innerOnSignTypedMessageListener), "neuronSign"); super.setWebViewClient(webViewClient); } diff --git a/app/src/main/res/drawable-xhdpi/add.png b/app/src/main/res/drawable-xhdpi/add.png new file mode 100644 index 0000000000000000000000000000000000000000..80312e9107f91223927bb4da839858a0e0e8e179 GIT binary patch literal 297 zcmV+^0oMMBP)Px#<4Ht8RA>e5nZXIdP!L3SgS7++HlSy7u_3Fl91r5z7Q|*`CF1pyfnn6Z1akVb zlmFk#DT(maCQwy5-R%Uwvf?Y+4eQN#`>gKTDQ-o2fU4MX+nb;6<|F@|@Bx19#|CVG zB;Z$w1W1qD0F96=umKVvJ#GUuLbAXHNPzUX4bTY5g2fwne=+EX@f=YH62|w&GoM|> z@o~SN7H>dGtsnL^-O7h7-hdCFd_9nE8$c*2Gd7^4i*(xnLP?pi0VQ3e+XfIy%8U&t v=_1`WfKXCqY(PmD>6ZSf&&&(52`2Lb1ArC@j`N>}00000NkvXXu0mjf93_0e literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/tab_app_default.png b/app/src/main/res/drawable-xhdpi/tab_app_default.png index 780dd4ec641971c607978d51d82be8685767fae7..4eaead7aa44073bc64d41c471c475c710aea9ee2 100644 GIT binary patch literal 1292 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 R7QFxf002ovPDHLkV1h_e>i+-$ literal 685 zcmV;e0#f~nP)Px%XGugsR9Fe^S+Q;tK@go;!w*EJiG)C+3KX%FRKW!ey=hWY?!yY=1Nm^rP@_smY@+C&Gu_KRfzF+r9q$ebsieH`NjF|YGnES1lEB&vZ`Cp!k zJ6l&jHR)M?qRLoz_G@_7ejdtQ?_RxQkpmHW5yCOk4`JT@HfWzrM{gd#h7r*5Iiy|v4KX(1&?b3o0upHT*(Eakcld>0+cJc zU{qZwWUQLXaNqz}a=|DOQFWCGvBtpxuH=Ft2qhx3t9*M#t}ioHFlW}IjN{6=dT&=g zR1u9F|p{34lxQ zbakA~@1cmRD3;H&j>RpdmaxjP;2Oaem+D{|hwHd!$!#3AxKszzI9$g)OK#(^#icr! z#^E~dS#s6k@?L_4U=~xvRTP`evX3}(<9{&i89`(bS5YiT5|{*+OWv1QaNpxU>IbcrI5c0rB_e1&Uj_--cNqd z<^}at5F?k~H}qGFcEr;zSlOkddfbxoW+?H+=qQb1CKIBR;lIG z6+(8=7H#&WkALm)bfVf}<6(mF_=1W3wtWmMGN3HEJYIR$`sU_ln>w-hqA9`|dS7UL z1;kk0DsMxYfT3a{w8QGAp zyZ~2LFO1uIC?Tc%z9YGHcCI~6o@npARokLT3o$L5kADdcNlP@Usn?WMkf?$1Fx0xZ42;sD#3NG@eVVz6J9 zSAW&_FhyFHTGHOSWv!z#kJs8tTsTgtwzkA3hPZ$IRK~Bl-nN}JtUU?{ z7GB!LblV;ow*BXh)zsHYTR-u~K>tEWOc0I`L)z&^e~Q1x$x(@|rR_J?9#c(NQ&PU+ zmo}r!BC{2gSJ%BP(t0=C>PDeu5q9Xe_D#6cD#VyycjEaL>5?AcYOERqkdqinQGb4ri83R41euG zC3nN&o*hq(wirwyHb?8%C_%s*P$!hJL}b+!tagG!pT)|q;L0k?YB-SC^vwybf3JPt zmYv#?4cPf#LM}B^{k{? zx9&nVdlAKsa-_V^qldKy6R;5@v41KaYqYW+q!Q~{`ev8`hAzANv7Wc_$W z+Cr+Ah$DJg)%?a1KN*ikEX2eyF%qls;f}>QWt@c{PQXg-3G!J# zJ&%@5ZvGL!OoBF?-ajimx?f8y#6)bwNEvt2No4NKvBoRD{S1)Cq>$lt27k#!(xouE zX~&)xCOeD;*pTsnJp(vQ>2&ZgvpEllmbshGoGRQKnP9b%oXKTZtwgB#lmK+v-d<5v|E!-+lSUq8T(ENe zoLQw0kF*v(;zFWYyN6OHt0^tY!&OFe>0ii1OEN{!3cUTJ$94ZIl##qA>&$3O2W>9> z9b-f>v3hdZl`ET@n}1AL8*Me1qJ@mn3yn*_rMqfppFLwNH8H2~3V48C2%8f|Op9p1 z4Mv|$CAPMV;N>}B0fYkn2LPU0fB^g}D|uebL4Qm~qzsUy*+(Q|VVo@~8s8EX4We+n z*z{ClmE{-LJ;5ta3D6sTJz!Jl+ zHUo=VB$as5J?8W7SBPo3#<8i6>i^g=AMWKo|C@^x53pZ5d{xDbWLb@;>q3PWD8jaJ za7D@&^4?T(>sx+!NHcLbi0LZId&%dyFRHi?vJ*z9P1<&4!ogA|6fgw{8u2s1>mzOk z(oW?=o3xEhzkfGuWxY8g0aFmA^BT79&Sme^J)TV*7>~}*hK7;Mqcn0f@|}{ z9HZ@LQ-;G@HZiyVzx&&ZFHl}p*Lfnj@Q+3L2CulxeN8UPK5WdxJc_#~aQDE-qZdyK zEWTOKVs&t(pzda|g`1qaSR2qb5>zKH%xAD4_2jj}H1c2h>-Hb|J_ci``zSU50000< KMNUMnLSTYwCM3WB delta 1095 zcmV-N1i1U*5ZnlmB!2;OQb$4nuFf3k000CQNklRI|gSO;gG<}}w zZkSCsyE9|r$H1D|nfK#2v*Wz)&c=jASzcZqtyZhExW*mFnSYs@np)Q}1HG~H^Ygc{ zSS*k04fMY2=&3R>^(Lymw6ru0$T`TRJy|%epgs@hFHx_0?dmUdVt{>ywil?!mA*n- zTidH_Hv3U&3$1Dc7Yc>M;o;#QIuEi4*gTv+pPZchtoE<2u0A|FJ6nL>xZ3X3Imqtr z?px_}y6m-u{eP;X4U-c`M@M%W!BUYxl}e?!xVX59TV5=~XdC`l4gO1;w2j_Uu!O%= z8yJQM{i+S`2p9@kuj$&>0(R<^8{NaG5kw<9LG32CwSnO%8|17>ZQ8cAfY;X6?gK2< zB)A|mDc46(pRX+vIG4-aK0Q7CfX5cNJNT?w-q1FE(0^ByiBMpU`uObZyqS&$?UJp!-k2b(L!6%mxk84L(Kmt)RY%YrCtf>!-I*OJGJY2)w^+xFF!5 zHVy(Qz+*;4xg-EOcU@sQ0J0%kK4qOTeiRAGH{M+Lf?2*72mNd_Ks!1*L|M?CtG|larGRyCExqA6>)})|VI=84<~3Qn0QT4uaRfz<}7@-4&%$ ziH}zmF{(qC>8$evj+i1E7XqeIDbe5G{~xSsjB=ErEbBG}dKIwFIBxPiZ)1cr+tbsd ztx8$ySQh5o>vETHlkdEVAwKFPmVs%Z4s}fmW`8$NM(RjlG*p>z~0tn18u15W2y(X@qej0^}yP16$}ct z#ZcGBR0HPQEdYF-VL*&vw#86)*kzOMBrqZflZyot0ESzes6`#>niTh#Kt>!1%tH=_ zJ%1A;%ncZBO$&8Q^9r)L2Qe~R8$&}5m-Z{a2gyB^;Z`@=9UL5pVzFrTWZRf2+C2$7S{C@=eb-Q)SqDRt~YC@zl7P?*pSPk)#)Wz^EWPmXST*8 z&w}a9UV(gpta6vYRKLb$pINtn!(jq6z)`nyjng)LM8RqSQ^9F7nyymo9MRwx$}oQ6CmnaGrQ#rmy7F?O))i7`DZAua*D+ N002ovPDHLkV1kRF9JK%d diff --git a/app/src/main/res/drawable-xhdpi/tab_settings_selected.png b/app/src/main/res/drawable-xhdpi/tab_settings_selected.png index d777c7ed8a5803ae7f492ce47b4c583cb1f0ff70..5ebdfbc5f1e1fbf711d8139c6c2368b42243b07c 100644 GIT binary patch delta 2040 zcmVP4@60{(?wh`!X^E$uIp>~xe!hF=&VQXdZz7olJ-XVpM$Q5MZtKHFedHh0~C~P#7=dW@roya=pWP#eE5ydhF z5dEk3$kr%|pczljxoG|>*#y7WFvudfQXI=E$U8>fkM@oCs;$Wlc>YUnO8JUhMVQow z0&|l`5vnHAH-Ee*8bLFqj#X|R`nLdBSE}@a_jS>9nR@!o=vubFR=ZeBSxXoFC9MDz zr3h(+jL<3ffQA8Z6sl3}j-(Bjzs>205<49ok%GK$#Mo$lugWH;+<=keUdCb)pD&d) zaV1e3L>{6OgkU`pIGZ{EaFc!PT!3Q>){Mta+G3xaJb#o^U*E4tLfIRHK2T(L;>cDBBW**mN*!-zSEr|4)QmJ2hc$i@ABoz_&HJ#Hm( ze27NXO4KZ0w%>5p?cW+}ExUS=v>-LWJ?k$aHW> zWamdB*Re)c4VcyQ3X4rn%I1UF`4|b;pkvH}7&iywHcI2v-vqE*UldusxIS3gv8uG$ zx&b~dP%sG&GUKZ9I_9uE0UtxUp7`j1ZhyY})mI}V#^%(B_oA{7KS0lXL|gjQqX3)& z4hI3B{-f_kCv=rK_6|1Ru?#VgIn@hldd^u+gNf48MI!gyiK;7_3b#rd55W=}F*26| z=9@xGLHZOdEYqsOKxOh!M&s$u#CS3ce&Oj^zt=YT!=^Hhn}SfT{m%XMZ$; zSfgC66&!RaSU(8uV<&9pJV>v}(HuTU8I$gwQ_kjN8&_hK*l0@93MZnTN5j29pjXlQ z$Y=VcD{GUdJ#)GONn$GMhF<#iVivgZ0wR1?*n&XTGLU<+E^AMghf7$RuU4>3!s-fV zcm8Hf9?EE5zEUfCJ{^6lF8}!O8h=PrW-z6IpID2xTf8)CAXwJq49q_8Ge2m|Nu5$( zMZ}=V!Pt~7x0l<9%@QeK{%(Lvw1rBGVFn@BfV6?pky9dkf=!g@^C^54l#k_cYN%TI ziH#U(pn#XGlTAR{r5c>b^)Q*73hF(-guTJxHy+yr zZ#uTC2-}CaEQ<@Rb2onulrspHWL#z6U?4k8&o*{?GIUmC+7yxd?n-RfpCwL%!(U=A z@j(SFZ5YG2%FLq*oG7#5Ie!>u!@?qReu0jfyEXcTWTUr=v+w#Cc47NP263sMT$t=F z!tLeRA2DZ7id?EQ4Z`>;6QrkXK1`9JsC&I@M^4?qXAR6TFK4cBN@=+QMYH%>e{&@# zwcI4Lbv#SfyOYSYAe$h~ZXV4dCUNthGx4$m;*>BQu$?;cRTBHe3CGXLvcsE`iN5ClQ?Innpw$f!Q9Jy_c+JOcfx(PoWw>xlA@iDFFU2!2_v!V;mROpMbb-F zFGvG@CLAk#9xs|J4}ZN8eOu3sV`@k%HoIw8ui)1o1KrSif}Kf4leqz~Q*V_y`!`2_ zH;U2}Fr8UxJY2r9>A|X!ZnVNl6g|5_K^|#TS+muf&KmVN0|DG{xE~H>^Wy+W%wZ$b6|VEPq)iAx=!pgccDr{QBejCY?=6{+y4Na WBuG#q6$SPH0000D`^ delta 1188 zcmV;V1Y7%t5V#4DB!2;OQb$4nuFf3k000DXNkl2?CF zs>Ll7T>@blZi?)o+Z`~`mZm_}7k1X|1bF3!u`Xk1O@Dox=|`a(He56`1iWdJnUgCN z&euC|E{5v!$iWjEuvMRrs4ig4dMr2kh>ZEJk)o!@#RhCOTItxQ!q39JgeSIm2(}cr zL2bX=G(f8YmH%BazWM{}>Nby(yLH%pmKU2%t;93258a8MJm)3oTk0gew33r$F}~ z=IH9RaeDr;(6kv~aArpsY+!TaZOuQYm!5gG)KC-}+yv4+T zLx1DZO~C<4l>)!kL^p2!Pk*hgax%Wpkoe4+YOoD1UKyu-2i~U2BT7n@ znCs!rb;GA*$$zYA$%8l<>7^{k>1mh1E0jD@Mf6zAFTx6pz#4i9R_cVDKYt%JY0%{+ zEoE7li%-e4y5`#!3Pp{u>N6RIlyLcYs3iz?Ji601V8axzu#Exbqe-d$$bGG?rGI1P z?c4m;h6VIEm#{HG0cQPq_c$BaXav>?FqrU)O64QlyqcmzcfDvjh$g}I4F8SC@V?fi`cRYdU^u?<@%ycb5-8c8u+a%`jdsZC!c-5D@Sp1D_}5?pGR zU&Y;||LnE6{Y51(+jB#=mK2;;9~~CUfq%JAw;utLe;h!!N+$>a0000jgOOX}%9Two2`Q$AypE2a z_>cczUobE-yu5Q|uLL18nLrBY_B1^4wRZf??9G;2pL8OriDb? z3(6!!D;@xaC?Tk6=q3OA?=Q&#a0lE#f%IaAW_W7_==H{DfIT`U5DuI zA}kiF>blwe|Nn0_FjfP=#SGJbru@O;IFNfmZUMOo#0EQ%m*d}d5N9v}xSIxZF#~ej zpsz_r9Y|@q9u2|K5TrB&DAhlj21i4X(h#6j|7aQ<4M9pnfKvUVX>c?IDGdQi^^c~( z(Ga9G1Sr)%ng*#7f||ze13D&%%@Z&;fus2MuYYma6b+;p%uT@IH^zUA|Nb|r=(;kn zvN0{Xes<@8jt_!D4&*qHoBo5`rmEvo{U1E*GuXyy82>RbGS&hBNCkkW&soU100000 LNkvXXu0mjf>8swe literal 717 zcmV;;0y6!HP)Px%he1|W;$`grNE0&7na1gi9?1g_=Vi|GoZtD+bB-~| z(iclEms@GIT5AZi3R{NF$g(_xT4}f2uc%+pe?(nCzYvSX3h1lo+bXghuT&~Et0>B@ zs;UY2FZB}xu+Oj?m&qozfb@fl=R)X4@1I3eGulG+d z7;KpNn*zVXUIBK;EC|PEd7O>yXf#@9#bg2lR?cKH*QkH7oShhl()X|k3!3?gkp{8<~r<*C5EBG>2!J%PIqu(Zip3-*Em%EjXV2XAFl@(SC<=C*8_lm>L(Af58%4n z?OqIr!l7_$24%EfsNpd#)MH=yG`hjQkzwT$zjUbP$2)2i8tMFK8Jbr`x=O4I+-?3iIB?7?`)B`gmi7^@{NBkEFu3|H;Q& zJqz(vg}zx?m?*>)VkO`NtPCQNm8Oq@Wnz5;cbnC)A#Myd00000NkvXXu0mjfwA4m; diff --git a/app/src/main/res/drawable-xhdpi/tab_wallet_selected.png b/app/src/main/res/drawable-xhdpi/tab_wallet_selected.png index 80301060e87328021335bcf51e07adae1cf44786..a966a210f71cfb7264c8e34192ae60b74900a862 100644 GIT binary patch literal 462 zcmV;<0WtoGP)$aJ5*-QL`waKqV?&cDs3m+e=v8kE=hs8}2+mnB=)}2N z;H0pJE4OoE zUhc0?43;g{9H5X94x$DmpcgeD-!0ao23!_S=C{j;s?h8nv!CI}xL2oZEnG||^xW)^ zBnw9EJABYC>XQ;z%gf8q}Zb09(zqk}mh|9PQ8SCUH_{}#7{Y=;4Ad%_$v2el4p z_11&tpwp^o+>ws2oJy?ZPx%l}SWFR9Fe^na^v~KorN{o3yaiJ*a7|22zpS& zgCL;?q5pvtm8wS%3LX~`!Mb=@>{Uci#6oRi1xx+0yLrA*0?Wq9ZsJVSrJ2hlZ|1%C znQtbOFoW=)Wq5pfsMcr{5nu#>_7k9uL^dG^1pGn-9w59$pb7}9a%y60#c|M2nwIm# zFNY^q27mqhan>i81fqR$BJdzS@c`~y)N`l$a?86ozOrvD;8Kb5%Qg2Z`&|Ko&2f`8 z_eaD!0o=~za?Y!#`Nih8sOye_hsNCFKG6dP-4PWqb{pb1hPXIC*MF}Q-?qSxL*h}{ zb%5|X&r#7y&?J3W@!7te_Jztr{2t{W2`phBm%Y10bS5f@t~Q2#W^J=iR-fRiDy9;c zA+b>O_%YFGm9q&u13kCw{u3%_X{I|?{I|6*V!xDVpEh6w+_dlvo&BDuIu)JZE;Lxhh2K zk3PSIA3@M07DnCo1hgmGVSTjnpWX-YSK0Le)Q&>3^0H>`ho&7s{B{zdbvS;Iwe`q= zP3zrt3Wq<sGWiUZ!xXBD(Lp zQQ_o=e7eitcE-8{#{MlgRJu5zAOnjVbe!OxskQsS1@HZ^}vB4{&u+IPh N002ovPDHLkV1g92Rtf+B diff --git a/app/src/main/res/drawable-xhdpi/title_close.png b/app/src/main/res/drawable-xhdpi/title_close.png index 8b3bc3ff9efcc620ebfc24e66bbb13bf8dfabd44..2b052f743883acebda5ecab10922ce5427d0e754 100644 GIT binary patch literal 1215 zcmV;w1VHu(fQ7{*W6Kf#1geo#LMLV;3&RDmGa3PoE)5ww8@0VPUk zAW$r^1VO7Mg?J$mC17MNfQWu%W(ckVQ*8M79v^A|4nI3x_PzyzCWZEcfz^OwtG{nI6N_(VB<=A!hJ z$c6zHm|#=Dw6(R%f<;CDLJrH8pHH3dc1AK&BiX>g0u$1J40xLJ-!9e#DMPd5#L2Tv zcZ!sYLMsvDD2Cdi@hkK6SIn!^)s;K*{4BOnb$AAa^9 zWTupVcht$l^E_V3DVf@vj97{ZNaM?9w{i`L;o2{@Ysh}d z&&oHu4!F(Gwe)c1@bDr}fEcgeSgM2i4#<$wo%`cvQ9~_o^m>(NKms;@S!P0R+p)(n zlQjd59zXI0NYJ+JyUp+|Tf2rc$5jK6TEFrQNZ?nc`%K6Un|7KEj14$yf+!Fm!C#ks zE5-xx`MMp#2RPlH?5$7*@02Lc5QsBQaZ$dSn4KQfS|#MP1jyK@(@Yq~ ziGb68tmztHP_lZxs;I2eSMGtx)nm+DLKO5K`Ji~MzUKxE9xvq;Kk5%-?nBmsD$ql+ z;{7!mgl$vhp<^ZsV`D2tO%VA8T>9?+o7x|aob1BDoUs|D)~`GRT8{;6)sI%4a?EBe z)^^^p(X!wPki*R4f|dH;$|2|Yi8B@}`yn;Pfrwt~fyllide$|d^=LX|SeB=wDMw0r zcyO#o%4ih(U#-MBPxx;#$O4jV7_2e@ z@7`^aDX-?~!qLy<$hB*=*1G#TCW}lUr{?4dEQT~-V`Gy{o;p_-jLn!P*KgDr>)rNE zCfPv30u$m@t4x~wrd~)NpDVSse|8&G=OD6S01_tHlCmegA=QyL>W@79klMO=mFm;y z!G!EH{hHL*H>lj#7OBX+srvPOR4HgPvt~*C&4$i@P>=nF1t!?k%-0K~q2YFq!8irq dx^-J%`v-gowzCtG3S0mH002ovPDHLkV1ntCP2m6l literal 1099 zcmV-R1ho5!P)Px(1xZ9fR9FesS<6loK@_E@NzCYq5&ePr0$_zKL^oR_hMsXV-NP)3xM7Sh_2^(cLsyO`pL=3 z8-H$Y?j0Il8+12e7pAAD4|~1dkLyHCu)wuLu*3m7+iJCLG%hbM_ksSW1#XfZ*Vfh^ zSZ!BYU0GR~Ck8m3v>czIe&DgerrzlgT(vw1w$W&Gfx`wHNi`Jm=H})BIt2LfhLqc= zbgzgX;|;e|4aBqnE3%trYS;y?Eh+k`fv5!-WWa2&@A^o)&dsn4Qgj>V1QXs3!tJ&w zSYpVfVF4>PEfA@7YMy<|tcLi|Y+*^*18GZ*KF=>ME(X5u@1ky}!^}KukDpYp1egOR zv4|b=7w;h(v}jG~m(i>|EVeRW4wM9192i@fSsAYuz#MF8X=!$Re4G-vD}x)`hddUy zx3|AK?WHaYX9>*<^y)zhwGp8CsRgi+#ICc0iO)#}UtRChrP7)pp-s}S3A*2yK-2UM z-#zS2)4R< zfaOI_roreT`p3TIG3DXi;|TY^+hfHvtbnZ)V79Zgx}xbJ-x1)v52QJ*dM^)#P{R^n za9CUFDg&N*nwrM5j29`))6w^74`81_FCWopgUw7YGTJDtCQVG{B^l;_VKK0rWs%QE zb%R#22brGt+wJyVv)SaA_Ivn+%wlQwQNPyWW)G0Ketv%bRzOi2|HWUoe*lKkN|4(T RoI(Hq002ovPDHLkV1g9q{Zaq` diff --git a/app/src/main/res/drawable-xhdpi/title_more.png b/app/src/main/res/drawable-xhdpi/title_more.png index 4295b7c1ae2c61cb46ce32e40ed1a71ca4cd99b4..45671bbbd87688bf609360a617100c54f6232c4c 100644 GIT binary patch literal 409 zcmV;K0cQS*P)~L@o=<(y{441Fo8Vc@aFgDa? z5EmC2?YhxDwuWq}GU{-8rVr~ zdAPw22X~f#{P@Z6@ZnRc8BQ~UfHTWVin0u>tSk%wh?i1>l#=cG00000NkvXXu0mjf DF-xO{ literal 791 zcmV+y1L*vTP)Px%(Md!>R9Fe^m`z9(Q547DlopjDBxD~1K?+K^X;DHeaaCI(5&}co2vUe3u5x7r zVH<1LDsZ6$u3Cg;NPb2xA}9ny1Vby+O2Mb;8-M?S83vh|w{qq_m;=9e&)j>5^MB{v zcjwH_WD3kIzh2w6&vAVo{=uweS-bvmV|;{`!BbcPSr$g2&KQxd5JVNj5CqvzI&0mz zCbSlU8WHj`Ld*b5^1ie*&%b zB&_`qQOoi~E@E8sWb#iqUNRr$63`9LBI18$OuI&gEdL+Z#PJ>+h|@Z~3YD-1 zlYFb+w5g>TNHdUTpnx*q-`4aXxCT|AZEc)wZJE|QV-K!`5%Ak07q?AQt4DJQqDJ9z zfVltk-5}F%{A1jsUncHH^NutqXbS|1)p#*^lRO5d4?9r|`dk>f$8qf$E1}c_M3BxG$rs{GFdB&pih&u6aR3C z2JIHkQ77#mvaDC6R?xd(oae)1#Cr}-mG%%JK{i9DDme2DVRv8x^m_jlR395Bb`L!@ VuJ{5S8q)v(002ovPDHLkV1kyYWBmXC diff --git a/app/src/main/res/drawable-xxhdpi/add.png b/app/src/main/res/drawable-xxhdpi/add.png new file mode 100644 index 0000000000000000000000000000000000000000..1980c859c891c94f35a49cada15c9254e6b47e8a GIT binary patch literal 559 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 diff --git a/app/src/main/res/drawable-xxhdpi/tab_app_selected.png b/app/src/main/res/drawable-xxhdpi/tab_app_selected.png index 413327d808ada58fd30574010052ace8166afe08..0b0cddf2aaa60f65e084d0126be0ef0248745199 100644 GIT binary patch literal 2823 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 Z`7f+XS3@<4k#7J1002ovPDHLkV1jDMiva)t literal 963 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 LNkvXXu0mjfQM{*t delta 1815 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 B9pnH2 delta 1998 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 U__0DBn6el=UHx3vIVCg!0Kw-cKL7v# literal 1025 zcmV+c1pfPpP)Px&yGcYrRCodHn_FnpU=+u{lk~PZg>@^a41EzqMBGK0x{5_`_%ad31Yu8tx9w5I zH+4R!4?g%L4iSdv!_>Em2qH}E@UpoIZV21+V3$TGT6gK1e^P$1=f z%R7kLBeDIsi0A2SpJIp`^XV}FERwxfq?$)Vk?JrVW4`R?4MctD*N$W&afgC$&6jgV zc1S4$Ac|L_?7e;7g$^X=!izDAFtKcnm|zCP#26{VhFcvQGrghR5N-+e^uv~F#OdS zqT8G`h=z0MPL4=V2}YZ)Ra-mYo3G4wEZeI~Rv?xj3`@^Q1t)EdHN)amNWZ&1zM}(u z6%!eTrn`moUWOgIDe{mKUN{|s5(fFWYaub$*Kjz#B|}*0Zqp#f#$!E{4kywxoxX#( zGbzu$X>LYSH*%&x)COanbmwx~>9Mc&k51g~skqd=x?SryV~tq4Q%tZ33C^QspcvW& zU>BqPfd@vu8iG({HT6dtp`6=pWW@1(z~Ae?D0 zw*a|%3G0xn*VR2zlwil^I1pB*!%Em;EGTa;EGW5;5C9P;y*=zJ%9Jqe%O2jGJQbHOn(w+v$q9X vUSU9=JAtW>zY6As0}Lw+_`BGtcd`Eg@&6I^xv_*u00000NkvXXu0mjfh||@W diff --git a/app/src/main/res/drawable-xxhdpi/title_close.png b/app/src/main/res/drawable-xxhdpi/title_close.png index 4473a02fd26a703736963b4eef58b642a692bc25..84bdb517695d84a66e46853fd7e026e06dceb4af 100644 GIT binary patch literal 2533 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 Tp|nQc00000NkvXXu0mjf#Y#bC diff --git a/app/src/main/res/drawable-xxhdpi/title_more.png b/app/src/main/res/drawable-xxhdpi/title_more.png index bfe270567570c747af6c0eea66a13c4f5e46bbe5..455b9412e37a776b5990a65a4a79bdb3ee8f7426 100644 GIT binary patch literal 584 zcmeAS@N?(olHy`uVBq!ia0vp^u0ZU>!3HE5JESK9DVB6cUq=Rpjs4tz5?O(w|2jM=6n0C!{8^6`$Is@rxnwiy+s2r(o~sWD^!aj|;b_ z}giL{Bebjig48{vHcmlwHM^ie|O_ei^hXr!mSz(3@$lb zfej2DH$)aOFbZtcbYWytNDA&?VsSXKOn{Z6p~F{^OMpRewv&hggOVABhOJ>!*RSJ# zB(>W~L+E=r$K{okzDol2^zu{Hce9^4)8*&Sr($Rw{_F43 zlunmJzb4kDE(w&IpL6rZEz!yU8Im#z9L^QD3(3iIZ%f*9!*#J^h_#*F{v(B6SrR6x ywYiZww++j*+nNHR4KHPx(DM>^@RCodHn@>noQ541AW{BM&IKe_?$WS-FxSJ zpYPtep5x2Nux1r-DiCoxdLNBOm-4b66o6mg8EB3~BE7tZ-w+@dRD(WXS`Q5eLazcO z^FXV~ehmL?SjC7yR?FiCsPsv4H_N0pSzqSNOm=;eT#LdZ8jnRn6yrPq)8dUDuaCK2 z!X(;162?6FI43|62!s&C`3{_eOS^=)iL)2@wP8B0X7JPa0Opv%`}<%+ye&YlUx>9t zzqy?$20fMj1;&^{{2+=T8neNE2{9xuMH@Bx>n=&GH{)6m+ECUP>B7Hb zv<1Z#m#f+%mh+|qO!pai3;i~-N4V}J=9x+RL7>fd3Yg4yh`uRhZ@?9}ypDO0xCs2% z5S=#128Hnl6|f3e1*`&A0joe#1zbmLj@R;4)7S!Z#MZG|xrPRg*k%rb z<`5bpECO|41eo@fhSMM`gw+31g5W~%5_s7)Iw)ruI#Y&9*`zwK-6y*$mPyTceVI?o z%eCaj>pRiy@JQrdB}6#^H37f12>n^Ebbh~+2=mOvKMqy^i5moaPmmYj@=!uF;P|~8 zL{2KMWw7#`F=GzZHSU43SVORWd?wsd-36Ocj9X*o8Dmt}C^OoE;^qqmb`T+hbqpcHP8*UIyDgA2g5sP{A1myT+p&Dled&G#dKl7-r zaR{gg?6;uooFd)twb#7`m*JAAYn+0JANxV4HR+BxZJ!6ZETF?uGSh$3RHiMciTWT& zW`Ziv37p4l3D5}EO;l{@_}qU^fDqQ1U>VR?r2ZMCJF$jvtXT!D0#*U5fK|XMU=^?m zSOu&C$rNxMu{mC6)42j{1M`6rE~;zX=9t~aYxoTjia;9}%LZxGvmDAfgx4Tg2tEQY zQvpbSl!ebArd&jemjaIKN4->_uWQM9^-uTpvEoyzZU=$fO(7Viw^p)exRSoiqq@d1 zunGjBuAyXe4>%8(M-rkLrwsTtO;F0<*7yMC&~j-69r*z+2Cf+baRmHQYR^t#4R)itV9RH2XlFN`r=`1M9xP~1daBcF)%d{(Z{ z$ZP4hhdsho*=WMBa4KN1f@lS30^fi{(Zecwexn8~F}jD!{S9K0SM9;&=d}O;002ovPDHLkV1l)P B4MG3_ diff --git a/app/src/main/res/drawable-xxxhdpi/add.png b/app/src/main/res/drawable-xxxhdpi/add.png deleted file mode 100644 index bdde10ae95c2737758195b756f0bda90430317de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=r#xL8Ln`9l-aIJUV!*?EvGl)d z`*v1`yvZ_lyc{lXDxUm2dOj+<*7Mw%DeI?n{k895^lK2hz-)4mpZyNgI>%xMtJzDE z*c2x(2$bM%P&8m^J0Kvz{` - + diff --git a/app/src/main/res/layout/activity_add_website.xml b/app/src/main/res/layout/activity_add_website.xml index 3e1700a4..90e40c0a 100644 --- a/app/src/main/res/layout/activity_add_website.xml +++ b/app/src/main/res/layout/activity_add_website.xml @@ -2,12 +2,13 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@color/white"> @@ -35,7 +36,7 @@ android:layout_marginEnd="@dimen/default_margin" android:layout_marginBottom="@dimen/default_margin" android:layout_centerInParent="true" - android:background="@drawable/rectangle_border_white_corner"> + android:background="@color/white"> + android:background="@color/white"> diff --git a/app/src/main/res/layout/fragment_collection.xml b/app/src/main/res/layout/fragment_collection.xml new file mode 100644 index 00000000..90d462ac --- /dev/null +++ b/app/src/main/res/layout/fragment_collection.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_token_list.xml b/app/src/main/res/layout/fragment_token_list.xml index ed68c7cf..d8e41068 100644 --- a/app/src/main/res/layout/fragment_token_list.xml +++ b/app/src/main/res/layout/fragment_token_list.xml @@ -1,5 +1,6 @@ - diff --git a/app/src/main/res/layout/item_collection.xml b/app/src/main/res/layout/item_collection.xml new file mode 100644 index 00000000..59277f78 --- /dev/null +++ b/app/src/main/res/layout/item_collection.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/spinner_item.xml b/app/src/main/res/layout/spinner_item.xml index 9ab6280c..8302ede4 100644 --- a/app/src/main/res/layout/spinner_item.xml +++ b/app/src/main/res/layout/spinner_item.xml @@ -2,7 +2,7 @@ @@ -35,7 +36,7 @@ android:layout_width="11dip" android:layout_height="22dip" android:layout_marginRight="12dip" - android:scaleType="fitXY" + android:scaleType="centerInside" android:src="@drawable/arrow_right" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/raw/init.js b/app/src/main/res/raw/init.js index 49e65811..b1b0ce65 100644 --- a/app/src/main/res/raw/init.js +++ b/app/src/main/res/raw/init.js @@ -28,12 +28,12 @@ window.Neuron.init(rpcURL, { if (tx.chainType == "ETH") { var gasLimit = tx.gasLimit || tx.gas || null; var gasPrice = tx.gasPrice || null; - neuron.signTransaction(id, tx.to || null, value, nonce, gasLimit, gasPrice, + neuronSign.signTransaction(id, tx.to || null, value, nonce, gasLimit, gasPrice, data, chainId, version, chainType); } else { var quota = tx.quota || null; var validUntilBlock = tx.validUntilBlock || 0; - neuron.signTransaction(id, tx.to || null, value, nonce, quota, validUntilBlock, + neuronSign.signTransaction(id, tx.to || null, value, nonce, quota, validUntilBlock, data, chainId, version, chainType); } }, @@ -42,21 +42,21 @@ window.Neuron.init(rpcURL, { const { data, chainType } = msgParams const { id = 8888 } = msgParams Neuron.addCallback(id, cb) - neuron.signMessage(id, data, chainType); + neuronSign.signMessage(id, data, chainType); }, signPersonalMessage: function (msgParams, cb) { console.log('signPersonalMessage', msgParams) const { data, chainType } = msgParams const { id = 8888 } = msgParams Neuron.addCallback(id, cb) - neuron.signPersonalMessage(id, data, chainType); + neuronSign.signPersonalMessage(id, data, chainType); }, signTypedMessage: function (msgParams, cb) { console.log('signTypedMessage ', msgParams) const { data } = msgParams const { id = 8888 } = msgParams Neuron.addCallback(id, cb) - neuron.signTypedMessage(id, JSON.stringify(data)) + neuronSign.signTypedMessage(id, JSON.stringify(data)) } }, { address: addressHex, @@ -65,7 +65,7 @@ window.Neuron.init(rpcURL, { window.web3.setProvider = function () { console.debug('Neuron Wallet - overrode web3.setProvider') } -window.web3.eth.defaultAccount = addressHex + window.web3.version.getNetwork = function(cb) { cb(null, chainID) } diff --git a/app/src/main/res/raw/neuron.js b/app/src/main/res/raw/neuron.js index bbd74455..4cb3644e 100644 --- a/app/src/main/res/raw/neuron.js +++ b/app/src/main/res/raw/neuron.js @@ -46333,6 +46333,7 @@ HookedWalletSubprovider.prototype.handleRequest = function(payload, next, end){ return case 'sendTransaction': + console.log("sendTransaction") txParams = payload.params[0] txParams.chainType = "AppChain" waterfall([ @@ -54055,6 +54056,8 @@ var Neuron = { var engine = new ProviderEngine(); var web3 = new Web3(engine); context.web3 = web3; + context.nervos = web3; + globalSyncOptions = syncOptions; engine.addProvider(new CacheSubprovider()); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 73fbb75a..d7efb4d4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -70,6 +70,8 @@ 确认发送 请输入应用网址 + ID:%s + 请允许我们使用权限:\n\n%1$s 恢复 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 10440191..28138b58 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -25,7 +25,8 @@ bold center 3dp - 8dp + 9dp + 2dp @color/tab_text_color 10sp From 764345d7faf28d102904897a4c9134155b098184 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Tue, 7 Aug 2018 09:41:04 +0800 Subject: [PATCH 042/121] delete no use code --- .../fragment/CollectionListFragment/CollectionAdapter.java | 5 ----- .../CollectionListFragment/CollectionListFragment.java | 1 - 2 files changed, 6 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java index 37e071a1..1a7d22be 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java +++ b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java @@ -1,19 +1,14 @@ package org.nervos.neuron.fragment.CollectionListFragment; -import android.app.Activity; import android.content.Context; -import android.net.Uri; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; -import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; import android.widget.TextView; -import com.facebook.drawee.backends.pipeline.Fresco; -import com.facebook.drawee.interfaces.DraweeController; import com.facebook.drawee.view.SimpleDraweeView; import org.nervos.neuron.R; diff --git a/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java index 25a29efb..19e252c2 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java @@ -10,7 +10,6 @@ import org.nervos.neuron.item.CollectionItem; import org.nervos.neuron.response.CollectionResponse; import org.nervos.neuron.service.TokenService; -import org.nervos.neuron.util.LogUtil; import java.util.ArrayList; import java.util.List; From f3585928c8cf0e257a08c4e84dd0f60d1b5b71ff Mon Sep 17 00:00:00 2001 From: baojun Date: Tue, 7 Aug 2018 11:52:38 +0800 Subject: [PATCH 043/121] pwd unlock --- .../neuron/activity/FingerPrintActivity.java | 1 + .../neuron/activity/PwdUnlockActivity.java | 66 ++++++++- .../custom/SelectWalletPopupwWindow.java | 82 +++++++++++ .../main/res/drawable-xhdpi/ic_pwd_locked.png | Bin 0 -> 1424 bytes .../drawable-xhdpi/ic_pwd_unlock_arrow.png | Bin 0 -> 255 bytes .../res/drawable-xxhdpi/ic_pwd_locked.png | Bin 0 -> 2849 bytes .../drawable-xxhdpi/ic_pwd_unlock_arrow.png | Bin 0 -> 297 bytes .../main/res/layout/activity_pwd_unlock.xml | 130 +++++++++++++++++- .../layout/item_popupwindow_wallet_unlock.xml | 13 ++ .../layout/popupwindow_pwd_unlock_wallet.xml | 12 ++ app/src/main/res/values/strings.xml | 3 + 11 files changed, 300 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/org/nervos/neuron/custom/SelectWalletPopupwWindow.java create mode 100644 app/src/main/res/drawable-xhdpi/ic_pwd_locked.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_pwd_unlock_arrow.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_pwd_locked.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_pwd_unlock_arrow.png create mode 100644 app/src/main/res/layout/item_popupwindow_wallet_unlock.xml create mode 100644 app/src/main/res/layout/popupwindow_pwd_unlock_wallet.xml diff --git a/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java b/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java index 2729fe35..523e9145 100644 --- a/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java @@ -94,6 +94,7 @@ public void onClick(View view) { } break; case R.id.iv_other: + startActivity(new Intent(this, PwdUnlockActivity.class)); break; } } diff --git a/app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java b/app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java index b47a04fb..13497bf0 100644 --- a/app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java @@ -1,11 +1,33 @@ package org.nervos.neuron.activity; +import android.support.v7.widget.AppCompatButton; +import android.support.v7.widget.AppCompatEditText; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + import org.nervos.neuron.R; +import org.nervos.neuron.custom.SelectWalletPopupwWindow; +import org.nervos.neuron.item.WalletItem; +import org.nervos.neuron.util.db.DBWalletUtil; +import org.nervos.neuron.util.db.SharePrefUtil; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** * Created by BaojunCZ on 2018/8/6. */ -public class PwdUnlockActivity extends NBaseActivity { +public class PwdUnlockActivity extends NBaseActivity implements View.OnClickListener { + + private List walletItems = new ArrayList<>(); + private TextView cancelTv, walletNameTv, walletSelectTv; + private AppCompatEditText walletPwdEt; + private ImageView walletSelectImg, otherImg, arrowImg; + private AppCompatButton authBtn; + private WalletItem walletItem; + @Override protected int getContentLayout() { return R.layout.activity_pwd_unlock; @@ -13,21 +35,57 @@ protected int getContentLayout() { @Override protected void initView() { - + cancelTv = findViewById(R.id.tv_cancel); + walletNameTv = findViewById(R.id.tv_wallet_name); + walletSelectTv = findViewById(R.id.tv_select_hint); + walletPwdEt = findViewById(R.id.et_pwd); + walletSelectImg = findViewById(R.id.iv_down_arrow); + otherImg = findViewById(R.id.iv_other); + authBtn = findViewById(R.id.password_button); + arrowImg = findViewById(R.id.iv_down_arrow); } @Override protected void initData() { - + walletItems = DBWalletUtil.getAllWallet(this); + for (int i = 0; i < walletItems.size(); i++) { + if (walletItems.get(i).name.equals(SharePrefUtil.getCurrentWalletName())) { + if (i != 0) { + Collections.swap(walletItems, 0, i); + } + break; + } + } + walletItem = walletItems.get(0); + walletNameTv.setText(walletItem.name); } @Override protected void initAction() { - + cancelTv.setOnClickListener(this); + walletSelectTv.setOnClickListener(this); + walletSelectImg.setOnClickListener(this); + otherImg.setOnClickListener(this); + authBtn.setOnClickListener(this); + arrowImg.setOnClickListener(this); } @Override protected int getStatusBarColor() { return getResources().getColor(R.color.white); } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.iv_down_arrow: + case R.id.tv_select_hint: + SelectWalletPopupwWindow popupwWindow = new SelectWalletPopupwWindow(this, walletItems, walletItem -> { + this.walletItem = walletItem; + walletNameTv.setText(walletItem.name); + }); + popupwWindow.showAsDropDown(walletNameTv, 0, 10); + break; + } + } } diff --git a/app/src/main/java/org/nervos/neuron/custom/SelectWalletPopupwWindow.java b/app/src/main/java/org/nervos/neuron/custom/SelectWalletPopupwWindow.java new file mode 100644 index 00000000..df069ba6 --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/custom/SelectWalletPopupwWindow.java @@ -0,0 +1,82 @@ +package org.nervos.neuron.custom; + +import android.app.Activity; +import android.graphics.drawable.ColorDrawable; +import android.support.annotation.NonNull; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.PopupWindow; +import android.widget.TextView; + +import org.nervos.neuron.R; +import org.nervos.neuron.item.WalletItem; + +import java.util.List; + +/** + * Created by BaojunCZ on 2018/8/7. + */ +public class SelectWalletPopupwWindow extends PopupWindow { + + private RecyclerView recyclerView; + private List walletItems; + private onClickImpl listener; + + public SelectWalletPopupwWindow(Activity activity, List walletItems, onClickImpl listener) { + super(activity); + this.walletItems = walletItems; + this.listener = listener; + View pop = LayoutInflater.from(activity).inflate(R.layout.popupwindow_pwd_unlock_wallet, null); + recyclerView = pop.findViewById(R.id.recycler); + this.setContentView(pop); + this.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); + this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); + this.setFocusable(true); + ColorDrawable dw = new ColorDrawable(0x000000); + this.setBackgroundDrawable(dw); + recyclerView.setLayoutManager(new LinearLayoutManager(activity)); + recyclerView.setAdapter(new Adapter()); + } + + private class Adapter extends RecyclerView.Adapter { + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_popupwindow_wallet_unlock, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + holder.nameTv.setText(walletItems.get(position).name); + holder.nameTv.setOnClickListener((view) -> { + listener.click(walletItems.get(position)); + }); + } + + @Override + public int getItemCount() { + return walletItems.size(); + } + } + + private class ViewHolder extends RecyclerView.ViewHolder { + + private TextView nameTv; + + public ViewHolder(View itemView) { + super(itemView); + nameTv = itemView.findViewById(R.id.tv_name); + } + } + + public interface onClickImpl { + void click(WalletItem walletItem); + } + +} diff --git a/app/src/main/res/drawable-xhdpi/ic_pwd_locked.png b/app/src/main/res/drawable-xhdpi/ic_pwd_locked.png new file mode 100644 index 0000000000000000000000000000000000000000..5cb25a4e04ad95a7c00017547876b1cbe7d7c343 GIT binary patch literal 1424 zcmV;B1#kL^P)y@fY0A>pzz>OkV3t|=l}o&zDYzuRCt_~R||Hd zFbu?P61UjY2AqI_`=4{Akw1`52yVcjd^_h4z?6|@h8cyJ>_732J24- zzoNAm^ZAno>TY64krnCQ@w#2U-jee`DZFw{{94nCcXfN1{c5l8;(%1Vz9?fbX2zE1 zqAjGmiC8l2*1VxPJBip#vjAZ35?V)KD5(Zu`kSC(biF!y^eTPmrX&Y;uvuog{xd8u} zf>~Cp)j6*o3DEUwdd)tL*()jtDV8G!AeY?zdL&!N30Mqw!T^jWjsCAg#DOV*Kpzjdu?yNlGHARE)SQYnfxO6^Au ziQqF!*cs{3u?T;K1I2EGv>SqXVIS#ME;KE)6N$S1($f$u$z@44bA!TEQJumgP?U1_ zN&J;B8&e|fLrL4wFL|$BmBWu8M2e?KXTF9iOVwx>R(SdK-Q+7d{ zaSsPI7MLErG#Uh(t=l zfE&9N8=IJp-2H$f9^i`2BoyaZee|h_a#|gwgEAZD8jrZZG?EWQK&%4a&;Yq`@RYsj z6l##mDyhkChVzp}F96Q9m9~KaLgB9DjSLDLT33$DPgJO&txN>l$?lZi9nhq5tndn| zmkJO0J;gtvs!#AIpBcN+x4BO+lxa3%MT;pPw2kvkYQhp& zzw2h#v~@De;$uiotlWsH5Dc2iL{wzh9mP^SsPE;S!9`gpje3LtSqrqr-RGq)tpj9l zRLZW7SdDoM%*(}*T{uCCEMDxlecguA+fVo=onbOkW0S~?g$!sd@;W&AuGXy_#eD(_ z8O(eg$9jT1uYiz)y!u=tuMo@LbOAvLeG1o;#_`B+G%g@$tC%&n<@Kr1Q>P2xD|lTx z&_-XPrErl$(trEtOUrXy0pdlx;X7l?8lKaxOZ8S>ew@EO9Lem{9~$*#0&5a3Y0TGJ zk>6I|XAxxZ&~8Bb;gA2D#3xqz65xK(t@)4tMN&kjiTb0K+h4NYEsmvoIn!_k|4;D! evRnuK68#VED`o@=iecga0000Ynh5v-^$3&%`2{l+C`{C{t7 zzTv`$0}B#NKOSNQ$|ZWbIEGZrNlpk!XkZj(Zri{m(O!9riS6ANHjVQ}?v0I=(X2kN zSSD;~^NLDq&UltBDzNfwf}`DrC8^sOU5;<&Y7ub>5>{iK^hBfCvr%Qg@{)#0nH-u6 iQuHQ?Fgr7}Ffll-mn<#d=<)$t#^CAd=d#Wzp$Pz~oMX%Y literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_pwd_locked.png b/app/src/main/res/drawable-xxhdpi/ic_pwd_locked.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4e4658c3923b8d2226fc9b2664a8ed01b527d9 GIT binary patch literal 2849 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 VIad181^BN5+2HK4RcP;o{{rvlC%ymx literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_pwd_unlock_arrow.png b/app/src/main/res/drawable-xxhdpi/ic_pwd_unlock_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b3768dc36e0842e7ea8c5e846a1494c08e702083 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^sz5Bl!VDyTOnYeoq!^2X+?^P2p46!aats1|LR^9L z(W4iS9=))C|M{awf#?Dd9X@>i_;CdH*fEg!v11p3j8_|soPl}-N`m}?8S3W?B>X?` zpkVO+L%@an0u^%~PM}=3r;B4q#hm1XkTeIzGhIA9>k`>ClF}Bk@+@6=QsY#Rv$RBn zQ=rJK);0#u@RZg$D;M%PaJfFz*&o4e}kk4S9bP0l+XkKr&D!3 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_pwd_unlock.xml b/app/src/main/res/layout/activity_pwd_unlock.xml index 542c2494..b7c6323e 100644 --- a/app/src/main/res/layout/activity_pwd_unlock.xml +++ b/app/src/main/res/layout/activity_pwd_unlock.xml @@ -21,22 +21,146 @@ android:id="@+id/iv_logo" android:layout_width="80dp" android:layout_height="39dp" - android:layout_marginTop="70dp" + android:layout_marginTop="60dp" android:src="@drawable/icon_page" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_popupwindow_wallet_unlock.xml b/app/src/main/res/layout/item_popupwindow_wallet_unlock.xml new file mode 100644 index 00000000..14289d80 --- /dev/null +++ b/app/src/main/res/layout/item_popupwindow_wallet_unlock.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/popupwindow_pwd_unlock_wallet.xml b/app/src/main/res/layout/popupwindow_pwd_unlock_wallet.xml new file mode 100644 index 00000000..30b1cd8f --- /dev/null +++ b/app/src/main/res/layout/popupwindow_pwd_unlock_wallet.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7a4574b0..263be757 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,6 +15,7 @@ 设置 发送中... 请选择钱包 + 选择钱包 添加新资产 新增钱包 添加钱包 @@ -128,6 +129,7 @@ 钱包导入成功 钱包创建中... 钱包导入中... + 钱包密码 总资产 正在生成 此密码将被用于保护私钥和交易授权 @@ -214,4 +216,5 @@ 指纹解锁成功! 指纹解锁失败! 对不起,没有可用TouchID,请用其他方式解锁 + 验证 From bdb45c03e3c0c40700ea1d4ab8d9d831dbaa2e5f Mon Sep 17 00:00:00 2001 From: baojun Date: Tue, 7 Aug 2018 13:52:32 +0800 Subject: [PATCH 044/121] pwd unlock ui --- .../main/res/drawable/pop_pwd_unlock_corner_shape.xml | 11 +++++++++++ app/src/main/res/layout/activity_pwd_unlock.xml | 6 +++--- .../main/res/layout/popupwindow_pwd_unlock_wallet.xml | 3 ++- 3 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/drawable/pop_pwd_unlock_corner_shape.xml diff --git a/app/src/main/res/drawable/pop_pwd_unlock_corner_shape.xml b/app/src/main/res/drawable/pop_pwd_unlock_corner_shape.xml new file mode 100644 index 00000000..03c6bb54 --- /dev/null +++ b/app/src/main/res/drawable/pop_pwd_unlock_corner_shape.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_pwd_unlock.xml b/app/src/main/res/layout/activity_pwd_unlock.xml index b7c6323e..50f3cd6a 100644 --- a/app/src/main/res/layout/activity_pwd_unlock.xml +++ b/app/src/main/res/layout/activity_pwd_unlock.xml @@ -21,7 +21,7 @@ android:id="@+id/iv_logo" android:layout_width="80dp" android:layout_height="39dp" - android:layout_marginTop="60dp" + android:layout_marginTop="111dp" android:src="@drawable/icon_page" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -115,7 +115,7 @@ android:layout_gravity="center_horizontal" android:layout_marginEnd="30dp" android:layout_marginStart="30dp" - android:layout_marginTop="30dp" + android:layout_marginTop="50dp" android:background="@drawable/button_corner_gray_shape" android:text="@string/pwd_auth_button" android:textColor="@color/white" @@ -126,7 +126,7 @@ android:id="@+id/ll_text" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="30dp" + android:layout_marginTop="60dp" android:gravity="center_vertical" android:orientation="horizontal" app:layout_constraintTop_toBottomOf="@id/password_button"> diff --git a/app/src/main/res/layout/popupwindow_pwd_unlock_wallet.xml b/app/src/main/res/layout/popupwindow_pwd_unlock_wallet.xml index 30b1cd8f..27ef0104 100644 --- a/app/src/main/res/layout/popupwindow_pwd_unlock_wallet.xml +++ b/app/src/main/res/layout/popupwindow_pwd_unlock_wallet.xml @@ -7,6 +7,7 @@ android:id="@+id/recycler" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@color/white" /> + android:background="@drawable/pop_pwd_unlock_corner_shape" + android:padding="5dp" /> \ No newline at end of file From 39ff7b1e5a895504d7702d533ce290b8289fa1d5 Mon Sep 17 00:00:00 2001 From: baojun Date: Tue, 7 Aug 2018 14:20:27 +0800 Subject: [PATCH 045/121] pwd unlock logic --- .../neuron/activity/FingerPrintActivity.java | 1 + .../neuron/activity/PwdUnlockActivity.java | 43 +++++++++++++++++++ .../custom/SelectWalletPopupwWindow.java | 1 + .../neuron/fragment/SettingsFragment.java | 3 +- .../main/res/layout/activity_pwd_unlock.xml | 1 + app/src/main/res/values/strings.xml | 2 + 6 files changed, 50 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java b/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java index 523e9145..da95c2c3 100644 --- a/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java @@ -95,6 +95,7 @@ public void onClick(View view) { break; case R.id.iv_other: startActivity(new Intent(this, PwdUnlockActivity.class)); + finish(); break; } } diff --git a/app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java b/app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java index 123842dc..d2c14adc 100644 --- a/app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java @@ -1,12 +1,18 @@ package org.nervos.neuron.activity; +import android.content.Intent; import android.support.v7.widget.AppCompatButton; import android.support.v7.widget.AppCompatEditText; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; import android.view.View; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import org.nervos.neuron.R; +import org.nervos.neuron.crypto.AESCrypt; import org.nervos.neuron.custom.SelectWalletPopupwWindow; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.util.db.DBWalletUtil; @@ -69,6 +75,28 @@ protected void initAction() { authBtn.setOnClickListener(this); arrowImg.setOnClickListener(this); walletNameTv.setOnClickListener(this); + walletPwdEt.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + if (!TextUtils.isEmpty(walletPwdEt.getText().toString().trim()) && walletPwdEt.getText().toString().length() >= 8) { + authBtn.setBackgroundResource(R.drawable.button_corner_blue_shape); + authBtn.setEnabled(true); + } else { + authBtn.setBackgroundResource(R.drawable.button_corner_gray_shape); + authBtn.setEnabled(false); + } + } + }); } @Override @@ -88,6 +116,21 @@ public void onClick(View view) { }); popupwWindow.showAsDropDown(walletNameTv, 0, 10); break; + case R.id.iv_other: + startActivity(new Intent(this, FingerPrintActivity.class)); + finish(); + break; + case R.id.tv_cancel: + finish(); + break; + case R.id.password_button: + if (!AESCrypt.checkPassword(walletPwdEt.getText().toString().trim(), walletItem)) { + Toast.makeText(mActivity, getResources().getString(R.string.pwd_auth_failed), Toast.LENGTH_LONG).show(); + } else { + startActivity(new Intent(mActivity, MainActivity.class)); + Toast.makeText(mActivity, getResources().getString(R.string.pwd_auth_success), Toast.LENGTH_LONG).show(); + } + break; } } } diff --git a/app/src/main/java/org/nervos/neuron/custom/SelectWalletPopupwWindow.java b/app/src/main/java/org/nervos/neuron/custom/SelectWalletPopupwWindow.java index df069ba6..e431f8ab 100644 --- a/app/src/main/java/org/nervos/neuron/custom/SelectWalletPopupwWindow.java +++ b/app/src/main/java/org/nervos/neuron/custom/SelectWalletPopupwWindow.java @@ -56,6 +56,7 @@ public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.nameTv.setText(walletItems.get(position).name); holder.nameTv.setOnClickListener((view) -> { listener.click(walletItems.get(position)); + dismiss(); }); } diff --git a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java index 80c2bc67..a148574e 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java @@ -13,6 +13,7 @@ import org.nervos.neuron.activity.SimpleWebActivity; import org.nervos.neuron.custom.SettingButtonView; import org.nervos.neuron.dialog.AuthFingerDialog; +import org.nervos.neuron.service.HttpUrls; import org.nervos.neuron.util.ConstUtil; import org.nervos.neuron.util.FingerPrint.AuthenticateResultCallback; import org.nervos.neuron.util.FingerPrint.FingerPrintController; @@ -96,7 +97,7 @@ public void initAction() { startActivity(intent); }); contactUsSBV.setOpenListener(() -> { - SimpleWebActivity.gotoSimpleWeb(getContext(), ConstUtil.CONTACT_US_RUL); + SimpleWebActivity.gotoSimpleWeb(getContext(), HttpUrls.CONTACT_US_RUL); }); } diff --git a/app/src/main/res/layout/activity_pwd_unlock.xml b/app/src/main/res/layout/activity_pwd_unlock.xml index 50f3cd6a..f43d4ad7 100644 --- a/app/src/main/res/layout/activity_pwd_unlock.xml +++ b/app/src/main/res/layout/activity_pwd_unlock.xml @@ -117,6 +117,7 @@ android:layout_marginStart="30dp" android:layout_marginTop="50dp" android:background="@drawable/button_corner_gray_shape" + android:enabled="false" android:text="@string/pwd_auth_button" android:textColor="@color/white" android:textSize="18sp" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 76c672c6..1fe4a35e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -224,4 +224,6 @@ 指纹解锁失败! 对不起,没有可用TouchID,请用其他方式解锁 验证 + 密码错误,请重试 + 解锁成功 From f39f0970d7ece50ac1bda8389b76f2a2c966731f Mon Sep 17 00:00:00 2001 From: baojun Date: Tue, 7 Aug 2018 14:56:33 +0800 Subject: [PATCH 046/121] splash ui --- .../drawable-xhdpi/ic_splash_nervos_logo.png | Bin 0 -> 12703 bytes .../ic_splash_peckshield_logo.png | Bin 0 -> 2410 bytes .../drawable-xxhdpi/ic_splash_nervos_logo.png | Bin 0 -> 8654 bytes .../ic_splash_peckshield_logo.png | Bin 0 -> 3422 bytes app/src/main/res/layout/activity_splash.xml | 63 +++++++++++++++--- 5 files changed, 52 insertions(+), 11 deletions(-) create mode 100644 app/src/main/res/drawable-xhdpi/ic_splash_nervos_logo.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_splash_peckshield_logo.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_splash_nervos_logo.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_splash_peckshield_logo.png diff --git a/app/src/main/res/drawable-xhdpi/ic_splash_nervos_logo.png b/app/src/main/res/drawable-xhdpi/ic_splash_nervos_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4e8c2c79018ad8cdfa3e18eb3310bb2d7b8a080b GIT binary patch literal 12703 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_splash_peckshield_logo.png b/app/src/main/res/drawable-xxhdpi/ic_splash_peckshield_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d7bd3533b7624264606d1b8418d73ed00ea91248 GIT binary patch literal 3422 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 AUjP6A literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml index 9b702534..bb54894c 100644 --- a/app/src/main/res/layout/activity_splash.xml +++ b/app/src/main/res/layout/activity_splash.xml @@ -1,38 +1,79 @@ + android:background="@color/white" + android:orientation="vertical"> + android:layout_weight="3" /> + android:orientation="vertical"> + + android:scaleType="centerInside" + android:src="@drawable/icon_page" /> + android:text="@string/app_name" + android:textAllCaps="true" + android:textColor="@color/default_black" + android:textSize="24sp" /> + + + + + + + + + + + + \ No newline at end of file From 3ce971e9478d5a9c94136b1c56dc4685e416c7e8 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Tue, 7 Aug 2018 15:35:59 +0800 Subject: [PATCH 047/121] update tab icon and add price to tranfer page and update statebar and add history url --- .../neuron/activity/AboutUsActivity.java | 9 ++- .../neuron/activity/AppWebActivity.java | 11 ++++ .../neuron/activity/CurrencyActivity.java | 26 ++++---- .../nervos/neuron/activity/NBaseActivity.java | 4 +- .../neuron/activity/SimpleWebActivity.java | 11 ++++ .../neuron/activity/TransferActivity.java | 55 +++++++++++++++-- .../nervos/neuron/custom/WalletTopView.java | 2 + .../CollectionAdapter.java | 28 +++++---- .../CollectionListFragment.java | 2 + .../neuron/fragment/SettingsFragment.java | 13 ++-- .../presenter/TokenListFragmentPresenter.java | 18 +----- .../view/TokenListFragment.java | 57 +++++++++--------- .../WalletsFragment/view/WalletsFragment.java | 2 + .../org/nervos/neuron/util/ConstUtil.java | 3 + .../org/nervos/neuron/util/CurrencyUtil.java | 37 ++++++++++++ .../org/nervos/neuron/util/SharePreConst.java | 9 --- .../main/res/drawable-xhdpi/neuron_logo.png | Bin 0 -> 4354 bytes .../res/drawable-xhdpi/tab_app_default.png | Bin 1292 -> 1390 bytes .../res/drawable-xhdpi/tab_app_selected.png | Bin 1515 -> 1657 bytes .../drawable-xhdpi/tab_settings_default.png | Bin 2145 -> 2070 bytes .../res/drawable-xhdpi/tab_wallet_default.png | Bin 521 -> 700 bytes .../drawable-xhdpi/tab_wallet_selected.png | Bin 462 -> 475 bytes .../main/res/drawable-xxhdpi/neuron_logo.png | Bin 0 -> 7729 bytes .../res/drawable-xxhdpi/tab_app_default.png | Bin 2034 -> 2142 bytes .../res/drawable-xxhdpi/tab_app_selected.png | Bin 2823 -> 3053 bytes .../drawable-xxhdpi/tab_settings_default.png | Bin 3436 -> 3399 bytes .../drawable-xxhdpi/tab_wallet_default.png | Bin 836 -> 1123 bytes .../drawable-xxhdpi/tab_wallet_selected.png | Bin 647 -> 654 bytes app/src/main/res/layout/activity_about_us.xml | 34 ++++++++++- app/src/main/res/layout/activity_app_web.xml | 4 ++ .../main/res/layout/activity_simple_web.xml | 4 +- app/src/main/res/layout/fragment_wallets.xml | 6 +- app/src/main/res/layout/view_wallet_top.xml | 12 ++-- app/src/main/res/values/strings.xml | 7 ++- app/src/main/res/values/styles.xml | 12 ++++ build.gradle | 2 +- 36 files changed, 261 insertions(+), 107 deletions(-) create mode 100644 app/src/main/java/org/nervos/neuron/util/CurrencyUtil.java delete mode 100644 app/src/main/java/org/nervos/neuron/util/SharePreConst.java create mode 100644 app/src/main/res/drawable-xhdpi/neuron_logo.png create mode 100644 app/src/main/res/drawable-xxhdpi/neuron_logo.png diff --git a/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java b/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java index 90e1b0eb..9a2930f8 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java @@ -1,6 +1,8 @@ package org.nervos.neuron.activity; import android.content.pm.PackageManager; +import android.os.Build; +import android.view.View; import android.widget.TextView; import org.nervos.neuron.R; @@ -24,7 +26,12 @@ protected int getContentLayout() { @Override protected int getStatusBarColor() { - return getResources().getColor(R.color.white); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + return getResources().getColor(R.color.white, null); + } else { + return super.getStatusBarColor(); + } } @Override diff --git a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java index b6b41497..f1b22573 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java @@ -1,6 +1,7 @@ package org.nervos.neuron.activity; import android.content.Intent; +import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.BottomSheetDialog; @@ -100,6 +101,16 @@ public void onClick(View v) { }); } + @Override + protected int getStatusBarColor() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + return getResources().getColor(R.color.white, null); + } else { + return super.getStatusBarColor(); + } + } + private void initMenuView() { findViewById(R.id.menu_layout).setVisibility(View.VISIBLE); findViewById(R.id.menu_background).setVisibility(View.VISIBLE); diff --git a/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java b/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java index 80cd79d7..19837072 100644 --- a/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java @@ -1,6 +1,7 @@ package org.nervos.neuron.activity; import android.content.Context; +import android.os.Build; import android.support.annotation.NonNull; import android.support.constraint.ConstraintLayout; import android.support.v7.widget.LinearLayoutManager; @@ -17,11 +18,13 @@ import org.nervos.neuron.custom.TitleBar; import org.nervos.neuron.item.CurrencyItem; import org.nervos.neuron.item.CurrencyListItem; -import org.nervos.neuron.util.SharePreConst; +import org.nervos.neuron.util.ConstUtil; +import org.nervos.neuron.util.CurrencyUtil; import org.nervos.neuron.util.StreamUtils; import org.nervos.neuron.util.db.SharePrefUtil; import java.util.ArrayList; +import java.util.List; /** * Created by 包俊 on 2018/7/31. @@ -29,7 +32,7 @@ public class CurrencyActivity extends NBaseActivity { private RecyclerView currencyRecycler; - private ArrayList currencyArray; + private List currencyArray; private TitleBar title; @Override @@ -45,7 +48,12 @@ protected void initView() { @Override protected int getStatusBarColor() { - return getResources().getColor(R.color.white); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + return getResources().getColor(R.color.white, null); + } else { + return super.getStatusBarColor(); + } } @Override @@ -54,7 +62,7 @@ protected void initData() { LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); currencyRecycler.setLayoutManager(linearLayoutManager); - currencyArray = setArray(this); + currencyArray = CurrencyUtil.getCurrencyList(this); Adapter adapter = new Adapter(); currencyRecycler.setAdapter(adapter); title.setOnLeftClickListener(() -> { @@ -79,14 +87,14 @@ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { CurrencyItem currency = currencyArray.get(position); - if (SharePrefUtil.getString(SharePreConst.Currency, "CNY").equals(currency.getName())) { + if (SharePrefUtil.getString(ConstUtil.Currency, "CNY").equals(currency.getName())) { holder.chosenImage.setVisibility(View.VISIBLE); } else { holder.chosenImage.setVisibility(View.GONE); } holder.currencyText.setText(currency.getName()); holder.root.setOnClickListener((view) -> { - SharePrefUtil.putString(SharePreConst.Currency, currency.getName()); + SharePrefUtil.putString(ConstUtil.Currency, currency.getName()); notifyDataSetChanged(); }); } @@ -117,10 +125,4 @@ public void finish() { super.finish(); } - public static ArrayList setArray(Context context) { - String data = StreamUtils.get(context, R.raw.currency); - Gson gson = new Gson(); - return gson.fromJson(data, CurrencyListItem.class).getCurrency(); - } - } diff --git a/app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java b/app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java index d789e162..067a3fee 100644 --- a/app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/NBaseActivity.java @@ -15,8 +15,8 @@ public abstract class NBaseActivity extends BaseActivity { @Override - protected void onCreate(Bundle savedactivityState) { - super.onCreate(savedactivityState); + protected void onCreate(Bundle savedActivityState) { + super.onCreate(savedActivityState); if (getContentLayout() != 0) { setContentView(getContentLayout()); } diff --git a/app/src/main/java/org/nervos/neuron/activity/SimpleWebActivity.java b/app/src/main/java/org/nervos/neuron/activity/SimpleWebActivity.java index 41aaa392..1c709513 100644 --- a/app/src/main/java/org/nervos/neuron/activity/SimpleWebActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/SimpleWebActivity.java @@ -2,6 +2,7 @@ import android.content.Context; import android.content.Intent; +import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.KeyEvent; @@ -32,6 +33,16 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { webView.loadUrl(url); } + @Override + protected int getStatusBarColor() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + return getResources().getColor(R.color.white, null); + } else { + return super.getStatusBarColor(); + } + } + public static void gotoSimpleWeb(Context context, String url) { Intent intent = new Intent(context, SimpleWebActivity.class); intent.putExtra(SimpleWebActivity.EXTRA_URL, url); diff --git a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java index fad0afa9..53c1d157 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java @@ -1,5 +1,6 @@ package org.nervos.neuron.activity; +import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.support.design.widget.BottomSheetDialog; @@ -22,6 +23,7 @@ import android.widget.TextView; import android.widget.Toast; +import org.nervos.neuron.item.CurrencyItem; import org.nervos.neuron.item.TokenItem; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.service.HttpUrls; @@ -33,9 +35,11 @@ import com.yanzhenjie.permission.Permission; import org.nervos.neuron.service.EthRpcService; +import org.nervos.neuron.service.TokenService; import org.nervos.neuron.util.AddressUtil; import org.nervos.neuron.util.Blockies; import org.nervos.neuron.util.ConstUtil; +import org.nervos.neuron.util.CurrencyUtil; import org.nervos.neuron.util.LogUtil; import org.nervos.neuron.util.NumberUtil; import org.nervos.neuron.crypto.AESCrypt; @@ -47,6 +51,7 @@ import org.web3j.utils.Convert; import java.math.BigInteger; +import java.text.DecimalFormat; import de.hdodenhof.circleimageview.CircleImageView; import rx.Subscriber; @@ -77,6 +82,8 @@ public class TransferActivity extends NBaseActivity { private BigInteger mGasPrice, mGasUnit, mGasLimit = BigInteger.ZERO, mQuota, mQuotaUnit, mGas; private boolean isGasPriceOk = false, isGasLimitOk = false; private String transactionHexData; + private double mPrice = 0.0f; + private CurrencyItem currencyItem; @Override protected int getContentLayout() { @@ -120,6 +127,7 @@ protected void initData() { if (isETH()) { feeSeekBar.setMax(MAX_FEE); initGasInfo(); + initPrice(); } else { feeSeekBar.setMax(MAX_QUOTA_SEEK); initQuota(); @@ -147,14 +155,50 @@ public void onNext(BigInteger gasPrice) { mGasLimit = ConstUtil.ETH.equalsIgnoreCase(tokenItem.symbol)? ConstUtil.GAS_LIMIT : ConstUtil.GAS_ERC20_LIMIT; mGas = mGasLimit.multiply(mGasPrice); - feeSeekBar.setProgress(mGasLimit.divide(ConstUtil.GAS_MIN_LIMIT).intValue()); - feeSeekText.setText(NumberUtil.getDecimal_8(NumberUtil.getEthFromWei(mGas)) + tokenUnit); - feeValueText.setText(feeSeekText.getText()); + + initFeeText(); } }); } + private void initPrice() { + currencyItem = CurrencyUtil.getCurrencyItem(mActivity); + TokenService.getCurrency(tokenItem.symbol, currencyItem.getName()) + .subscribe(new Subscriber() { + @Override + public void onCompleted() { + } + @Override + public void onError(Throwable e) { + e.printStackTrace(); + } + @Override + public void onNext(String price) { + if (TextUtils.isEmpty(price)) return; + try { + mPrice = Double.parseDouble(price); + initFeeText(); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + }); + } + + + @SuppressLint("SetTextI18n") + private void initFeeText() { + double fee = NumberUtil.getEthFromWei(mGas); + if (fee > 0) { + feeSeekText.setText(NumberUtil.getDecimal_8(fee) + tokenUnit); + if (mPrice > 0 && currencyItem != null) { + feeValueText.setText(feeSeekText.getText() + "=" + + currencyItem.getSymbol() + NumberUtil.getDecimal_6(fee*mPrice)); + } + } + } + private void initQuota() { mQuota = TextUtils.isEmpty(tokenItem.contractAddress)? ConstUtil.QUOTA_TOKEN : ConstUtil.QUOTA_ERC20; @@ -199,10 +243,9 @@ protected void initAction() { public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { progress = progress < 1? 1 : progress; if (isETH()) { - BigInteger gas = mGasUnit.multiply(BigInteger.valueOf(progress)); + mGas = mGasUnit.multiply(BigInteger.valueOf(progress)); mGasLimit = mGasLimit.multiply(BigInteger.valueOf(progress)); - feeSeekText.setText(NumberUtil.getDecimal_8(NumberUtil.getEthFromWei(gas)) + tokenUnit); - feeValueText.setText(feeSeekText.getText()); + initFeeText(); } else { mQuota = mQuotaUnit.multiply(BigInteger.valueOf(progress)); feeSeekText.setText(String.valueOf(NumberUtil.getEthFromWei(mQuota))); diff --git a/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java b/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java index d4c37807..42a0962c 100644 --- a/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java +++ b/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java @@ -102,6 +102,8 @@ public void onClick(View view) { case R.id.wallet_photo: context.startActivity(new Intent(context, WalletManageActivity.class)); break; + default: + break; } } } diff --git a/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java index 1a7d22be..cb7039c9 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java +++ b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java @@ -16,7 +16,7 @@ import java.util.List; -public class CollectionAdapter extends RecyclerView.Adapter { +public class CollectionAdapter extends RecyclerView.Adapter { public static final int VIEW_TYPE_ITEM = 1; public static final int VIEW_TYPE_EMPTY = 0; @@ -41,11 +41,11 @@ public void refresh(List collectionItemList) { } @Override - public CollectionViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == VIEW_TYPE_EMPTY) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_empty_view, parent, false); - ((TextView) view.findViewById(R.id.empty_text)).setText(R.string.empty_no_token_data); - return new CollectionViewHolder(view) { + ((TextView) view.findViewById(R.id.empty_text)).setText(R.string.empty_no_collection_data); + return new RecyclerView.ViewHolder(view) { }; } CollectionViewHolder holder = new CollectionViewHolder( @@ -55,22 +55,28 @@ public CollectionViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { } @Override - public void onBindViewHolder(@NonNull CollectionViewHolder holder, int position) { - CollectionItem collectionItem = collectionItemList.get(position); - holder.collectionName.setText(collectionItem.name); - holder.collectionImage.setImageURI(collectionItem.imageUrl); - holder.collectionId.setText(String.format( - context.getString(R.string.collection_id_place_holder), collectionItem.tokenId)); + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { + if (viewHolder instanceof CollectionViewHolder) { + CollectionViewHolder holder = (CollectionViewHolder) viewHolder; + CollectionItem collectionItem = collectionItemList.get(position); + holder.collectionName.setText(collectionItem.name); + holder.collectionImage.setImageURI(collectionItem.imageUrl); + holder.collectionId.setText(String.format( + context.getString(R.string.collection_id_place_holder), collectionItem.tokenId)); + } } @Override public int getItemCount() { + if (collectionItemList.size() == 0) { + return 1; + } return collectionItemList.size(); } @Override public int getItemViewType(int position) { - if (collectionItemList.size() == 0) { + if (collectionItemList == null || collectionItemList.size() == 0) { return VIEW_TYPE_EMPTY; } return VIEW_TYPE_ITEM; diff --git a/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java index 19e252c2..4800461c 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java @@ -10,6 +10,7 @@ import org.nervos.neuron.item.CollectionItem; import org.nervos.neuron.response.CollectionResponse; import org.nervos.neuron.service.TokenService; +import org.nervos.neuron.util.LogUtil; import java.util.ArrayList; import java.util.List; @@ -82,6 +83,7 @@ public void onError(Throwable e) { @Override public void onNext(CollectionResponse collectionResponse) { collectionItemList = collectionResponse.assets; + LogUtil.d("collectionItemList size: " + collectionItemList.size()); adapter.refresh(collectionItemList); } }); diff --git a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java index a148574e..c786fae1 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java @@ -17,7 +17,6 @@ import org.nervos.neuron.util.ConstUtil; import org.nervos.neuron.util.FingerPrint.AuthenticateResultCallback; import org.nervos.neuron.util.FingerPrint.FingerPrintController; -import org.nervos.neuron.util.SharePreConst; import org.nervos.neuron.util.db.SharePrefUtil; public class SettingsFragment extends NBaseFragment { @@ -42,13 +41,13 @@ public void initView() { @Override public void initData() { - currencySBV.setOther1Text(SharePrefUtil.getString(SharePreConst.Currency, "CNY")); + currencySBV.setOther1Text(SharePrefUtil.getString(ConstUtil.Currency, "CNY")); if (FingerPrintController.getInstance(getActivity()).isSupportFingerprint()) { fingerPrintSBV.setVisibility(View.VISIBLE); - if (SharePrefUtil.getBoolean(SharePreConst.FingerPrint, false)) { + if (SharePrefUtil.getBoolean(ConstUtil.FingerPrint, false)) { fingerPrintSBV.setSwitch(true); } else { - SharePrefUtil.putBoolean(SharePreConst.FingerPrint, false); + SharePrefUtil.putBoolean(ConstUtil.FingerPrint, false); fingerPrintSBV.setSwitch(false); } } else { @@ -87,7 +86,7 @@ public void initAction() { } } else { //close fingerprint - SharePrefUtil.putBoolean(SharePreConst.FingerPrint, false); + SharePrefUtil.putBoolean(ConstUtil.FingerPrint, false); fingerPrintSBV.setSwitch(false); } @@ -112,7 +111,7 @@ public void onAuthenticationSucceeded() { fingerPrintSBV.setSwitch(true); if (authFingerDialog != null && authFingerDialog.isShowing()) authFingerDialog.dismiss(); - SharePrefUtil.putBoolean(SharePreConst.FingerPrint, true); + SharePrefUtil.putBoolean(ConstUtil.FingerPrint, true); Toast.makeText(getContext(), getResources().getString(R.string.fingerprint_setting_sucess), Toast.LENGTH_SHORT).show(); } @@ -128,7 +127,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case Currency_Code: - currencySBV.setOther1Text(SharePrefUtil.getString(SharePreConst.Currency, "CNY")); + currencySBV.setOther1Text(SharePrefUtil.getString(ConstUtil.Currency, "CNY")); break; } } diff --git a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/presenter/TokenListFragmentPresenter.java b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/presenter/TokenListFragmentPresenter.java index e4c49dad..300bf084 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/presenter/TokenListFragmentPresenter.java +++ b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/presenter/TokenListFragmentPresenter.java @@ -2,11 +2,10 @@ import android.app.Activity; -import org.nervos.neuron.R; import org.nervos.neuron.activity.CurrencyActivity; import org.nervos.neuron.item.CurrencyItem; import org.nervos.neuron.item.TokenItem; -import org.nervos.neuron.util.SharePreConst; +import org.nervos.neuron.util.ConstUtil; import org.nervos.neuron.util.db.SharePrefUtil; import java.text.DecimalFormat; @@ -37,19 +36,4 @@ public String getTotalMoney(List tokenItemList) { } } - public CurrencyItem getCurrencyItem() { - CurrencyItem currencyItem = null; - ArrayList list = CurrencyActivity.setArray(activity); - String currencyName = SharePrefUtil.getString(SharePreConst.Currency, "CNY"); - for (CurrencyItem item : list) { - if (item.getName().equals(currencyName)) { - currencyItem = item; - break; - } - } - if (currencyItem == null) - currencyItem = list.get(0); - return currencyItem; - } - } diff --git a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java index 2cbec497..725e719d 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java @@ -26,13 +26,16 @@ import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.service.WalletService; import org.nervos.neuron.service.TokenService; +import org.nervos.neuron.util.CurrencyUtil; import org.nervos.neuron.util.db.DBWalletUtil; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; +import rx.Observable; import rx.Subscriber; +import rx.functions.Func1; /** * Created by BaojunCZ on 2018/8/2. @@ -90,7 +93,6 @@ public void onItemClick(View view, int position) { intent.putExtra(TransactionListActivity.EXTRA_TOKEN, tokenItemList.get(position)); startActivity(intent); } - @Override public CurrencyItem getCurrency() { return currencyItem; @@ -106,8 +108,9 @@ public void onResume() { } private void setCurrency() { - if (currencyItem == null || !currencyItem.getName().equals(presenter.getCurrencyItem().getName())) { - currencyItem = presenter.getCurrencyItem(); + if (currencyItem == null || + !currencyItem.getName().equals(CurrencyUtil.getCurrencyItem(getContext()).getName())) { + currencyItem = CurrencyUtil.getCurrencyItem(getContext()); totalText.setText(getResources().getString(R.string.wallet_total_money) + "(" + currencyItem.getUnit() + ")"); getPrice(); } @@ -128,9 +131,9 @@ public void onRefresh() { } private void initWalletData(boolean showProgress) { - WalletItem walletItem1 = DBWalletUtil.getCurrentWallet(getContext()); + walletItem = DBWalletUtil.getCurrentWallet(getContext()); if (showProgress) showProgressBar(); - WalletService.getWalletTokenBalance(getContext(), walletItem1, walletItem -> + WalletService.getWalletTokenBalance(getContext(), walletItem, walletItem -> recyclerView.post(() -> { if (showProgress) dismissProgressBar(); swipeRefreshLayout.setRefreshing(false); @@ -158,29 +161,27 @@ public void setData() { private void getPrice() { for (TokenItem item : this.tokenItemList) { if (item.balance != 0.0 && item.chainId < 0) - TokenService.getCurrency(item.symbol,currencyItem.getName()).subscribe(new Subscriber() { - @Override - public void onCompleted() { - adapter.notifyDataSetChanged(); - moneyText.setText(presenter.getTotalMoney(tokenItemList)); - } - - @Override - public void onError(Throwable e) { - - } - - @Override - public void onNext(String s) { - if (!TextUtils.isEmpty(s)) { - double price = Double.parseDouble(s.trim()); - DecimalFormat df = new DecimalFormat("######0.00"); -// item.currencyPrice = Double.parseDouble(df.format(price * 0.155)); - item.currencyPrice = Double.parseDouble(df.format(price * item.balance)); - } else - item.currencyPrice = 0.00; - } - }); + TokenService.getCurrency(item.symbol, currencyItem.getName()) + .subscribe(new Subscriber() { + @Override + public void onCompleted() { + adapter.notifyDataSetChanged(); + moneyText.setText(presenter.getTotalMoney(tokenItemList)); + } + @Override + public void onError(Throwable e) { + e.printStackTrace(); + } + @Override + public void onNext(String s) { + if (!TextUtils.isEmpty(s)) { + double price = Double.parseDouble(s.trim()); + DecimalFormat df = new DecimalFormat("######0.00"); + item.currencyPrice = Double.parseDouble(df.format(price * item.balance)); + } else + item.currencyPrice = 0.00; + } + }); } } diff --git a/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java b/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java index 5fcde705..e26d0bc0 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java @@ -16,6 +16,7 @@ import org.nervos.neuron.R; import org.nervos.neuron.activity.AddWalletActivity; import org.nervos.neuron.activity.ChangeWalletActivity; +import org.nervos.neuron.activity.WalletManageActivity; import org.nervos.neuron.custom.WalletToolbar; import org.nervos.neuron.custom.WalletTopView; import org.nervos.neuron.event.TokenRefreshEvent; @@ -82,6 +83,7 @@ protected void initData() { collectionListFragment = new CollectionListFragment(); presenter = new WalletFragmentPresenter(getActivity()); initWalletData(); + } @Override diff --git a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java index 4018623f..fb46eb06 100644 --- a/app/src/main/java/org/nervos/neuron/util/ConstUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/ConstUtil.java @@ -31,4 +31,7 @@ public class ConstUtil { public static final String DECIMALS_HASH = "313ce567"; public static final String BALANCEOF_HASH = "70a08231"; + + public static final String FingerPrint = "FingerPrint"; + public static final String Currency = "Currency"; } diff --git a/app/src/main/java/org/nervos/neuron/util/CurrencyUtil.java b/app/src/main/java/org/nervos/neuron/util/CurrencyUtil.java new file mode 100644 index 00000000..687dac58 --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/util/CurrencyUtil.java @@ -0,0 +1,37 @@ +package org.nervos.neuron.util; + +import android.content.Context; + +import com.google.gson.Gson; + +import org.nervos.neuron.R; +import org.nervos.neuron.item.CurrencyItem; +import org.nervos.neuron.item.CurrencyListItem; +import org.nervos.neuron.util.db.SharePrefUtil; + +import java.util.List; + +public class CurrencyUtil { + + public static List getCurrencyList(Context context) { + String data = StreamUtils.get(context, R.raw.currency); + Gson gson = new Gson(); + return gson.fromJson(data, CurrencyListItem.class).getCurrency(); + } + + public static CurrencyItem getCurrencyItem(Context context) { + CurrencyItem currencyItem = null; + List list = getCurrencyList(context); + String currencyName = SharePrefUtil.getString(ConstUtil.Currency, "CNY"); + for (CurrencyItem item : list) { + if (item.getName().equals(currencyName)) { + currencyItem = item; + break; + } + } + if (currencyItem == null) + currencyItem = list.get(0); + return currencyItem; + } + +} diff --git a/app/src/main/java/org/nervos/neuron/util/SharePreConst.java b/app/src/main/java/org/nervos/neuron/util/SharePreConst.java deleted file mode 100644 index c1a0a7b5..00000000 --- a/app/src/main/java/org/nervos/neuron/util/SharePreConst.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.nervos.neuron.util; - -/** - * Created by BaojunCZ on 2018/7/31. - */ -public class SharePreConst { - public static final String FingerPrint = "FingerPrint"; - public static final String Currency = "Currency"; -} diff --git a/app/src/main/res/drawable-xhdpi/neuron_logo.png b/app/src/main/res/drawable-xhdpi/neuron_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d23b76486133928f329a59d48592dd84b27b7249 GIT binary patch literal 4354 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 literal 1292 zcmV+n1@roeP)S&cpGPJu zmB&g1gb?WPbRGl{AtAt`*FuCv0uD{ahITAR2(g*qf0bnsEN9701KM1Hom8-6l(?DT;sDlQGCuU19!?wE++AA%7EY0`n|x=e zpnH?!;U6`7DQBq^C-&ifvw1o{qy;>kgBz%qq(@hR;~2KF55Wy&V$yj*8D8_J!ogV+QLRBth;Sk0o zS!ypAjv+XfH3)8uHCdZ;m^$^Sz|+*+3ORf*6_0#YN^-M4cDMgsg8YPTAlgFlOj8}a5{*V? z^g6cy+IDn32pQTIK-j6@{zeI2oQy>x`hc|_J3M~BP`R4oPP%!fU;}MiSB8Gk^5lDv zzRh!($z06AjmlO_`+CDM1n1yfRFKhZZem~-4Nwk+Led{8`D1!yeNK~gRO|8 z%Y!M+X}!;>Ka)3{Hg8`#Gq;77yq)sB&~n%P8{U4i=N#HSzC%>v1JtyOw1pf<#v(`7 z8^}oC=JD^Nt>`e_AZO?x zi?GCk`+1xNr03-id{IqDo+-P;)kLOaVYd7>qnod)VbufP@;kz8>6YGf)Ys^4^9vMP z=zK?31K|b=yhgi21X22CwKo={yk!A)baZb_-JCw6s_N^s`!B5m?XdZSK;HrIoH#uvWoJ zD^O{Ctp{rrth54^##en0W*`18um9e{Z;JDhh{waf7tXKswZpr!)e7nQV!HElxwjJ< zTwm^>fZgRkJ~bZMv)r~eGo-&;olAc|ul?{UBKtpCPTEf=$bQiP0000tG@J55|#+;i{THr%t; zUO&F|?REA!XU{m9;Mjb?Z(8v3f%h^6Sm$J}h*l_{Z)Bgyd3i) zortOE&dY*0IlA*B0P1#Z`GE4>HD&_u{_y_D%$N^MIrm@hyyF5w18R_Iw!#vl9rwku@++^6nb7CLa+ityfVeCO5=^0w~R!`i`u zXlch_t96`#1El4P^mR|YxAt*)YxXI(Fd#IVhZ5d)$gjI|SH4oBTVhsFa)S8+Mv8ZG zX;oLA`SFCik>{oJB?(U*^t<%Q{z8e}k0b>1wi-xgs4XCiXKvWiO?bcQhvwOzPP(&( z-*9Op{8-O-7jDSAO5jz^S&SK4F{?0Myw^MRVP~Bjx!7}eGsJ{U@NA#<>*xFOwbt4+ ztX}SK0%uI_!<;@yjP!=7er07LPoJN0*Gg}BUF@FDA3f-IYga#0b#)pR2C6+}+% zuN#OQWXf1gI{jV6^FN<-XBcUOr>FgjU&IbAuh7vXhY_ePNE2uS9(BkzBR&%%A3dUn zsF@k}uftdC;!QcD*iXa&FdJhGBQy*@&#%Ng`EJ`ovb*Cq^xjZzFM=Oe4r#w&LqqHb zJ8h{R{BXiwUh3~<_;{C~S8AxCLNNGgQ}>3ef5}2uzchO!9Qp{x1_RJ+K-WQikl%tr zEOf=TB$H4z5eE-Q41{{U#1!hmV1l+XVNX}*8&d*c1)>~@8iAvYu>@e!n9}MJGhoD8 zI#+#TS65q*AnLNKZE7;MlCO#6k78*D8Apk@a1*Rt9&g6vqVWYf9Pf$gi_@~Qp@b~z z3{(Uw9vG_mAD!RSuj8MVQOLcjuT%Fbn2|pF$fs zp%@hul8x~qf9pf^-1$%3w|Q*SeEUoONj<%PuI285e^|XHjJSW{BoRpa1sm2A)|ATm zPDggOB@2ASB1doid`dRfW8EcWJlg`WHd2udv80PdT;o1D*YKk9Z zL#`H|H6D5~8G>1(DHpzKht*)KgG_au*h*WUaQ&K@K`(Nfc5i zcLG($lylaz`)@old z_$McELBzNOLJ-!-1hpg_0up<($}Ts1N3yQa=(|mI6I=S~12`6DUplTZ56BrH4lDk@ z2Dnx_ss`A&1tMXxFyd(!nN5}epgsZCtVcq5!>mCWAL}q{8$TsQPL_ZL+A_oHgU+1g zNI<2hIS@DaP=k7yn$z|$i_#G#lyrqUrH?twl_?%O&IZNW?4TB_JapD!HPUZV5jlra z>Bt1whMpLb>3V^T1}MP*9+mSj57Rtg&V1~!39n~tVsz`JrDHbPiNSP^dxB^R*R z@)T}FUEgc=f1TLQ#k#EDglNsw1GwOaL0QhKSNc}qCA!Q(2sWb)TZ9s%R+IcudZ_jC9q>)ifNYewUn813Fh*4o3W-$71IyyOE5MzLQWOG`N*ioty z-%N@OTIG3IH99D{2ud(Xb<8I*NDf%UhfMWYM|u7SVNB;e8CZvx00000NkvXXu0mjf DVNMwS literal 1515 zcmVO8*l)v4;blZgD!M|LIn?K|pj-Q19u6>HApE$1zH?fl8?w@L9QCb;iucmJl7Q%YoK zLguGDlf&oV&%R3RBTe&>qLbkJj<^LUvXW)8Qy;-fpmKx~;$e zC2u+>M**NDYX^Nw`s6KBviQYP_HS)qALGab=N8=Ve^%uaWp!_gi|#3D>mq#AA+^0< zZ`&e|Ex(gpO7r^7MDSFW#^DT%ozF%cAjyI zN^Y6t01iTwv0hk3^dqqWX}T^<&*d_(7&Ax??BD~(-Sul1BRc4<*oP zLooG1esI$bvM}ge_9b}W1$X=As(h-zcc=K6rz7QKpEXHoaC#)v^lfXaJbL!6>|%<= zc_YF7&$?L!{8-8DU~pP6*r|{VBu2`(&M)$-?#$y~zMGvXlB)08GdMf%UQ+DS`s~2A z^0Asa=b#E{kG_J00=t*7PCSc64XuTmmXN%nbP=4ljZ1PuW1g_Mx)sxg0P2uK3=rcs zBb+*Bt&f2dI1P5Iw&@m{B*=TPMQDAE-t{&LJHKe-EXV#PpH~~F-XwmK2 zSd(vbRX3+C2N~KBd@YBT{-brB+>@`b%c~%V;&z#O8S5m*?m@;n{i8~Su>l$DFoF}f zwUtOGoC#H|us2XA8D!B05bD7X{h-}T#zNK& zg!!80rrsE@2^K?q<<>@K=zw}nZ$hv#<%_X#zU`II@A0EnnO?GIJ$15+2t#Z;fYTC7 z=zRuokx%?kJ!TQ>2^Mq7p$AV5wZA09VIpL#2ftUq0S`Vb%G!@CiN_T29C40esk72S zUMb;bXQr1a$(Anf(1RlT_livGUx+tO6@h>LEzbWKO0Qjt}kowe}sqNcDUO6JtY5`)n zfmq~BX|C0`LO$0Fg-&wD!P|>-*^rQyN8%&1dc|)~J%i`SL9R8V5M?tIHzr3k(8`T% zLjqSqiNwxbc#k)bYrXJzsdfo~Uwg&41whQh{l)T?%oo~tN9PXCwH26aCzn8Onc13Fm1l<#ZZK~zQu zyCsF8H2v4e_(Pl1jXPAUM;(mR;fgvP!$sCdWjg9T_13=kV10@#HQ29;`9Dd|Si2kY R7QFxf002ovPDHLkV1h_e>i+-$ diff --git a/app/src/main/res/drawable-xhdpi/tab_settings_default.png b/app/src/main/res/drawable-xhdpi/tab_settings_default.png index 428c93fe12d9e6f47ac7be985bc21030082e8e97..61a56ec2c99a9865674caa4823c48553f1e64413 100644 GIT binary patch delta 2041 zcmV-Gk*uoNklJLXfvY03Xq8E1R~2QWJwlAkvnI zikMh5F;QcD1dKl*M*pZ3^^eBD4-7;!Mos*oP1Hcd^nn31f+nS=5322IR6ylb6trQx zyLbG)**n|2+ugf&D}->9?VXu(&NtsZckY>Urb7JBtFG?Jkbhr@a&(Jf%3=bq@w&SD zsb>@7Vd$(ALWP1>a7}-A>me_j*n$;{Qg-TNA!HJI+onXs2c4ZAe|y;!l9fd`wxF>( zmA0P|Qaq%Tnq&Z_kO?Kl`gm{0b~EO_N2`{vgU)6pRK$!+DgPBpd>9N^Tl>4)dd+yL zds&2|)%8O{sekDJRhY0{N^84Nc7v@HJdI1r0|6;s3x-7(yU7u2k*)0KV6&KgOUi9R zTJ1{NYw^Gh7?OC9p~1e6nUwpvd=su(ykbV;Z0a-&{s~8dwS9+L<7R?rO+%AZ_7HRxbvu}g#aB0Rsk z@m3||Du2B0v|IBWLxkh>$?CJGg(pJ3@YeKxI=YR7vZpLN9q`B#*zInjSKK5Zk0GCUv$CfCM)!EBHo1@!xsfCFovDfKM?m*Q2O6PC46hOFAi)iWl$y?=|u1Fu;;jfXinzh=44D|}Aj;*{YStZHfs zkMs{^a#|!Z0Q$@i7(JUz*`MJfVKVe(FdTWTziaoeg>0vWCu}{N7`_b;c27!(-PP5N z3wnFoJi}KOC&LL{6=FVZ^|iE&FrUT3PB80YB9m42Xrxl=Z9^8`tS?5E5S^X7hJPQr z|Mt~Lfz)Y;z=cM&d1H^I~-ULxW{t{hr;$DEmR`rRvOcG67}%3Y4I_#5(5$I zil3>1*L;Jgs>8ulFGe?quo=9V_vEw?0tG#sy9N85Glwv1Fl{JBzb61n9)HS5{`$+Q zLOiu|gjpL0BS+}&I2=+VqSif}Ls%D#luCgzr}(9m+)t@W3vLKyUB<>>6g74@AX$Fi zt&=6pQXJuCF$>0PW?oaUTsMYRKz_uwwC!hOwJWbTt)H=8-e>ei{xieZU??tk_@h`mTf#pL8j;$6gKokSHiATD&YE^KH^3@?3hAQ$S8 z8#%IVacky@3=cVYZjfKyQmN1t49X`Ex0zhuf#jyc%hQxmhq|=UwuM0R#>j=7$c-Gi zHEYiRtREhjZ&`u+2720j}lH{3d&o|@({MYNhR&B#L1y^ z{IRXaoMk}Wa>#N@7pHCPYY$(P1U`d~qCoEF2Ucp$Qa%4Fl)z^{mb?;a5T6kaOfG4O zR0;o9U@7I4NZEpK_J5q{FGw~Xgu+xj=^Xs3VXz9XbOTHA%aLvmQ1yc<9HoE`5A-Da(8-&=;DBBr@-ia13EX z+}zDU3PQ_VeC5qZ^)?yVg}CDgcO$;6W_a@VfV7%^=xzJP3xBsHVH%TkO4xck7NO9b z3sv@K%KGFVoFgc#C8fwxFS|9fQ|uy;K9OODrOyqDX_h%oES@Uiw8sxwqWdDOY2f%M zLq`{?ndblg>tJQEO9T2oAC~wCl$}Bz%M+Qg7i%zGTCq|v1pre-WL->T3gsunV%Xt1 z+E~QGBfdS%FLE{mp`r}vZa7xA$4(uI3tMf*D@J*xuG2rZF-BQ_HJ-sx8i$8|ZalBH zuaC|ETvq>-A?eHR-(JSkncRbCT|7P-&p#H`_9+qh{&@beXgG}fUe3Q`nR}0WBFFGQ Xxgppf9!EKj00000NkvXXu0mjf<&EyO delta 2117 zcmV-L2)g%{5aAGzGk*veNkl9%gxjbHZ*81k=W}7;(_@XJo8G2u6eFeu-ii1K60>nVnYAt5E zeYsPp!dp_U8xC{a*w|>bw*P*eW9tt9yr|f+N?Kbt_Ziucue<sZ3PCEOt_HEmm(gy;e7@M;)a|BA! z9-q7bORa0La(Lu^(*%4G7+Cua^Td-Q_R%eO}vJXt<%(l+PdTv7T~n1E|QzY3W`VOe+V z`TEUdnEY6HhYoFXO3#mVBFZdBR9R3uY39$pM}BaljE}+LD8bM*;Ha5&e&e%n1HLtN zumUe2I;`^1KV>9Di{}w7R=V?vgw$e%ekuu6_Fh(g?6oFSx;Vg&J`<8 zha2RA@y5Ns9BhlvzU`&Hf$q;iI|3}dz~TVgnMf{WLt?OBmRHsHFhyFHTGHOSWv!r8Mt)=ZZ)*e$$SW{BI;g>d}%p$WDlvmfiEYf;6 z-0DW5Wf6AhxA-*U^N6R94K)i9rwi?KO@B>Ik)hPn^IBpfMvhIUgOhZ4%zRsd?e6(v z4S+7D|FcXi(#0<(lWTv;wV?|Or5qfZgcVx#?uR?dq1%|rin*eJV=3ISz`QMYrm4CD z#YZ!`dv?5l-Mknpc|;aiS9g5(*`t17shMio(58f}Lk#UfC3nN&o*hq(wirwyHh)L! z*C;{28&D^du|#Cm6|8oGL!ZUUuHecl%W61~*!0Z_u79t6-@x)WpmAfc31TTDR^(HhU4pj&h{D&!dO6 z1{1ImBe5zTYqYW+q!Q~{`ev8`hJP-+Euw*R#>wKB!esq;McP8Dmxv>JS=Ic;5se31uVtKtA5OqZ?FsT(KRu6@Om6-Wzf6KQoZdex zJi1>?EW|`?#7G%;(@A9R%(2ERzWof4#-xzpbq2{q(xouEX~&)xCOeD;*ng1mfIR~^ zOzCv+Fta%iqPWRxlV@WvD~#}j4KHfR;ISrKAh&Nh;-?I4dM@uI#zr^GmapnC7IT<& zPvZt~dCj#qAxzDLZyn+p%vU=@EEzw(1uyqETxf1}_4Vh4$@=k(4s>b5*zyy~(1?YY zh>aLYR=nhpj%{{3Pq$GSXn*(ab^S1cqmotwvhSgg`FvTfj#jimTfRaWBC!w?hr~#% ziZ?QNgDHrrJ9!k($c8pZ0M9@`^A@P0=Gsd`g|nDO7CO|;*vR7gcMT?BBSvDCv8p;c zM~}9~)q0m4{;DIXEP7z%ex~MpvK_%Xw!IEeCm~F&?nr+2z(|Y1BY&o5X%DtwvzED= z&YUXT8<}9Wk(|k8SFJ>-`IG>3+TLDKRsXD?Pm@L-Wn8dw{hV2)50A7KKH@^6TDyl* zCaWne%EMJgbLn5mL`yP7&XP-S|EHyEw@CtZD6sTJz!Jl+Hh%+)S|pWt(mm$$?pKIu zxyG@nj_Uu|F(2;bKL4AG6c4apJA75ejbvGkr|Uw67bwEEad1V-7xLaza_d`uct|sG zIEd*g%6rM@xi6}?53&+Wx~NyCKNCQ2paJ-!RsS#2GUODLz}dXO}{s6WxY8g z0aFmA^BT79&VOa^)IFX}9OLr}sV37!P0w3Iq*aJ9%mhFDd4v8k2-b3KnmK}nhBM6kyzchyqdPhV)9IwyK-fg=lSW?f6@qK?#2lmTXH$m5S~fAa|G)d& zi!V@KRo8hUx$uug`3A4J%zZA(K5WdxJc_#~aQDE-qdpf;3M{@^&ti3OrJ(L+v4xwQ vyI330HWE}PF3e}JANAz5!Zh+<`Rn!{`aT9@sQV~300000NkvXXu0mjfYw;kP diff --git a/app/src/main/res/drawable-xhdpi/tab_wallet_default.png b/app/src/main/res/drawable-xhdpi/tab_wallet_default.png index 85c613a39ec93645f614465ad5dd4cb24dd9f74e..ac4630d116bde180abc7d3d2acd1da0c424a6931 100644 GIT binary patch literal 700 zcmV;t0z>_YP)58W}fpVP3;bX8#@~}Fnh@E zo4ozckKcYAW&zr4!v=4vci=G8nwS__2paG&eSLiwW1r?{ z?xa&?*R$_rSG88zYL45kNy1~!?C#ATF|*frouxOg zp3Ioz^@nb6Kk*-kcom4QsUmJR{*PMm%&U2CpF4B(ZZ4OT%-{oF0X3tVODpP@9}*E? z;VwNf!b9~Y(XT!~Fyd!KakiKrecp1yKTMd)3>+hp57brPf=Ep{S51k+}6ct$J zXBKASV+DSm_dekDG5M4SqqO~I!u`zU1D={1{}v@!W?5z;+Q79BmXkL8iCHRA;fy=3|m)f1Ukcp5bLEgY+b1l=nNY|te4KPb)`n2Gi(U4 zUbd%U^)W`TRQ4P=5&D{Nv&tJx4aT}*q)85{R_Y6G&4z~Azs$76=<#InjgOOX}%9Two2`Q$AypE2a z_>cczUobE-yu5Q|uLL18nLrBY_B1^4wRZf??9G;2pL8OriDb? z3(6!!D;@xaC?Tk6=q3OA?=Q&#a0lE#f%IaAW_W7_==H{DfIT`U5DuI zA}kiF>blwe|Nn0_FjfP=#SGJbru@O;IFNfmZUMOo#0EQ%m*d}d5N9v}xSIxZF#~ej zpsz_r9Y|@q9u2|K5TrB&DAhlj21i4X(h#6j|7aQ<4M9pnfKvUVX>c?IDGdQi^^c~( z(Ga9G1Sr)%ng*#7f||ze13D&%%@Z&;fus2MuYYma6b+;p%uT@IH^zUA|Nb|r=(;kn zvN0{Xes<@8jt_!D4&*qHoBo5`rmEvo{U1E*GuXyy82>RbGS&hBNCkkW&soU100000 LNkvXXu0mjf>8swe diff --git a/app/src/main/res/drawable-xhdpi/tab_wallet_selected.png b/app/src/main/res/drawable-xhdpi/tab_wallet_selected.png index a966a210f71cfb7264c8e34192ae60b74900a862..7700654225ac184dfb56e20d0c64e0ff1a88d2c7 100644 GIT binary patch delta 468 zcmX@de4AOZGr-TCmrII^fq{Y7)59eQNb7(w2OE%-Yl&iT$USMgTH%m4L))6#%P|iB zzfF4g{GyuSZ?i+O91(NfHR@MQ|8Vq}{;k&*J6~O_4(ZoA)$(TkjH#{6Ms>Dwc8{vo zi;GR2zQRPh-!WukWZ;2w9~hr+esNNE_PLxboQE!cOT5vsPF}q0VO7)d$Df(+W{R&r zzrjNFjaurAhO(fxpVu>0H4k5&HTBms9p7uV(d=icibQN)H$P?bW3R1R_1)Y2X8n`% z{!x3v-<;0V*==;b_U}jThnEx-{TmB1XZ)WN_~q`@+^ze(yA2i>9S%L;EnIe}tD(Pz zDQTWnV(}8M3!K^t&sGYXxvyfGy8)M=n&%FK;{kIMCY}sTEB$rs)Em>u#o={PKXY_) z_0;8#YGtdnAMxhRF?u;C{Ad4TMfO`eD@4}czvvNk_swP24Zw(E@O1TaS?83{1OQc} B*LDB^ delta 455 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/tab_app_default.png b/app/src/main/res/drawable-xxhdpi/tab_app_default.png index 36cac9fb1ac9e828409f8b3b16d5ac6d7f3f0f3b..c94441287cc88b7c050b775e9c2b370a00243fae 100644 GIT binary patch literal 2142 zcmV-k2%-0hP)1#E zk%&Bks6l_ok47=k7^M;fH5hyZ)HWeTjkUCuDj*?R3VqRbiyEN#fGCxew!1s`dd}?L z=`1bFwmaLFW+vG^XU?4a-E+P<_uhHz5@K#D19Z4}NOI;UQpIyO^gqWR!)Y#CjvhMb7x^qlF;!?zN`*KkfO`lKl(9zy6I$wIfa)K*;3AB(g;q(sl9Eay3*Q2q0pS3ak^P>DxKyZ-LVo;RwlAQHk!Sl>SILg=!$P z{KwE|#iVJoC*5{$M%BfpCPlP~l#F;q*weCSF-}Sd=NTdiNc=Y{$xpV{l^+&1ly+y{ zQqGi*fv`I?JEb)eC55f^mA`7X2q;nnFg3^|XYO*&NbNNw92g%>(yt`}8=);OYU~0a zs&_~Lfk5O5#L|ExphTo1lJfJT$yqlJgAF2P7zS=a`4(40)ed0`CT*!%n+T_G!kl8& z`MpbKSYK!>E9=qO3{edy!m%JP$=#!rKmzF^LRbyX$W&g@Tz{}e*g}yhX}K8+SH6JN zWw!7KLTjzja$)0%@-|^JLK-?W?5SBR+&$hCdJ+hwr995MV4x&ma@YpjB8Es7v9S;A zOW2H%hE&9|Wvj-tUpkMg!ZRW$ICDJ^^z&_vRl9^O9GT?ES`V0S17@_qfw|?}>>FdiScGjba!?hK znOP8X@yb6t;0ke#uG4NRNt<2u74Pe85mRkxIcqs%#n6Fvfkr6VGiBVwO~;Ovb`7-S z0TW?Q%S~aN;RRBf=nT$Ki$pAiEe+q*3ENP}KBw%jXC-x1K<~}V~I6)XA#;VyuP(rGRjEsk3|Lf`6 z39G_t4U>{CiA$SW8!Pr`wqaE4j+`}&G90ckA`BpC@A&ALjWso2Ulq3N$r}=pl%7AA zy4|ImkhuZ`IyfCANrk8D4mJqeNRV@!xv5^pV5o5Mj02_((!{OSg0|YSreHA!9U3qp zts)-J&w3Kz;^vbWNxEyKk$_2JOc)!+D3VrVhaA*ggs~slZ$&trxp7w++XZvM6IvTe zufn9b(N$l$SF?>^1(ws*Fp2Jj9AdRFfuLAPT3=Upuv4@7l|DrH%c~U1D@EtrNUYYv z8l&%f1*=wWP` zj|8NK|1erfz!R$G205aRIb-gqt3)tDX5bEPFfR<~DUz?%&GoI%QRJ=?0pnw=NCosh zYpggnTBJTlkvmKWL%Ss}et4YH(Ul3~b2>b2x>e%7+h|5fH=L@iE6*j(&Az zC?gvZB8rNNr2VBo6*8(k%{n@lz>Sdw5>_`TP2UFlK#b4U(dkJ_%{n4+`Gb`Oi%Ouq z<|f>YmfG@ZG_b(4rRCnUuk>&|Bg$ux=Y2px!23?&r6-FCbheOGY?C;7Ne(!di3W&`eTaRdq~Sz#^zav< zjHhCNutxtLE6WAd)kSbsJGc$oA_iiq2!O5jF*vyEwlbUuSQ#D@y>VII(%(Z6aXeIs z7>K3$>-x}aVJe0afiG<#o|zaE+{Rx_oVe)AFyqsjBNk%%4KwFB^A>0a4NwdvLZRF) zVuEGwP&h+E;0TFWh$;5Hg!R755XLa1p+peI6GSX9rq2r9C>emM>&pmyLy3SuBYN`& z_}UGjzONBSgb@J^7lxq~F1A?z zRB0ssZ5OQHV8`(9R2MF_7r<}8ZumNoF~0CxtUg45Lq0g>U+WmS&xv%-lL@vBf%f6s zYrk}^7=BK$*8f|R0S7YZ$r4_+^kJS+?h+B`bzuuv>M`}YAGc3D1L@CK5mY)3KgQS@ zYC|fK%RI``=Z~zey2|}FXSNE1I=rF_6*45hVEFKR$!EJ5I|EfQFhVeQbL(Z`e>AWI U?T2V*=Kufz07*qoM6N<$f*Fh4;Q#;t literal 2034 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 literal 2823 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 Z`7f+XS3@<4k#7J1002ovPDHLkV1jDMiva)t diff --git a/app/src/main/res/drawable-xxhdpi/tab_settings_default.png b/app/src/main/res/drawable-xxhdpi/tab_settings_default.png index a05e8dbda9d17edad08d421d0eda36c57f75f8a5..f9242bc17313bfe6235f227c7625468882f893fd 100644 GIT binary patch delta 3381 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

vfIu2G@IeF^r88vejZ|~_j$O+>;j3-o7UHJe4 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 U__0DBn6el=UHx3vIVCg!0Kw-cKL7v# diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index d5d6f165..c5cf269f 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/default_white_f9" + android:background="@color/default_background" android:orientation="vertical"> + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_app_web.xml b/app/src/main/res/layout/activity_app_web.xml index f90afdff..050e6303 100644 --- a/app/src/main/res/layout/activity_app_web.xml +++ b/app/src/main/res/layout/activity_app_web.xml @@ -37,6 +37,10 @@ android:singleLine="true" android:layout_centerInParent="true" /> + + + app:title_bg="@color/white" + app:title_color="@color/default_black" /> - @@ -65,11 +66,12 @@ android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="50dp" + style="@style/WalletTabLayout" android:background="@android:color/white" /> diff --git a/app/src/main/res/layout/view_wallet_top.xml b/app/src/main/res/layout/view_wallet_top.xml index 5511f3ab..6eb9d91a 100644 --- a/app/src/main/res/layout/view_wallet_top.xml +++ b/app/src/main/res/layout/view_wallet_top.xml @@ -51,9 +51,9 @@ 密码必须至少8个字符,而且同时包含字母和数字 密码包含大写字母、小写字母、数字、特殊符号中的至少三类,且长度在8到50之间 您还没有Token数据 + 您还没有藏品数据 您还没有交易数据 您还没有历史浏览记录 Ethereum Mainnet @@ -126,7 +127,7 @@ 指纹设置失败! 关于我们 联系我们 - 关于 + 关于我们 钱包密码错误 密码 确认删除钱包吗? @@ -217,7 +218,6 @@ 交易流水号: 所在区块: 入块时间: - 点击进行指纹验证 其它方式验证 指纹解锁成功! @@ -226,4 +226,7 @@ 验证 密码错误,请重试 解锁成功 + + Neuron is a + product diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 28138b58..36ae3b03 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -105,4 +105,16 @@ @color/font_title 14sp + + + + + + diff --git a/build.gradle b/build.gradle index 0dec2236..3b61be9f 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.3' + classpath 'com.android.tools.build:gradle:3.1.4' classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0' // NOTE: Do not place your application dependencies here; they belong From 80b4a7dcd0c8c1e8b292fe094c6cfa6621aef19e Mon Sep 17 00:00:00 2001 From: duanyytop Date: Tue, 7 Aug 2018 15:40:09 +0800 Subject: [PATCH 048/121] add history url to h5 --- .../java/org/nervos/neuron/activity/AppWebActivity.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java index f1b22573..4e3a976e 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java @@ -201,6 +201,7 @@ public String getAccounts() { } } + private void signTxAction(Transaction transaction) { this.signTransaction = transaction; if (walletItem == null) { @@ -243,10 +244,16 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); initCollectView(); + addHistory(); } }); } + private void addHistory() { + String app = new Gson().toJson(WebAppUtil.getAppItem()); + webView.loadUrl("javascript:__myhistory.add("+ app + ")"); + } + @Override public void onDestroy() { if (sheetDialog != null && sheetDialog.isShowing()) { From e1b57396fc20d8a5eda46b871f966d7c13305c72 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Tue, 7 Aug 2018 16:07:44 +0800 Subject: [PATCH 049/121] update transfer page title --- .../org/nervos/neuron/activity/FingerPrintActivity.java | 2 -- .../java/org/nervos/neuron/activity/SplashActivity.java | 6 ++---- .../java/org/nervos/neuron/activity/TransferActivity.java | 4 ++++ 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java b/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java index da95c2c3..f7509842 100644 --- a/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java @@ -11,8 +11,6 @@ import org.nervos.neuron.dialog.AuthFingerDialog; import org.nervos.neuron.util.FingerPrint.AuthenticateResultCallback; import org.nervos.neuron.util.FingerPrint.FingerPrintController; -import org.nervos.neuron.util.SharePreConst; -import org.nervos.neuron.util.db.SharePrefUtil; /** * Created by BaojunCZ on 2018/8/6. diff --git a/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java b/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java index 7eb2f447..1669611a 100644 --- a/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java @@ -4,11 +4,9 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.text.TextUtils; -import android.widget.Toast; import org.nervos.neuron.R; -import org.nervos.neuron.util.FingerPrint.FingerPrintController; -import org.nervos.neuron.util.SharePreConst; +import org.nervos.neuron.util.ConstUtil; import org.nervos.neuron.util.db.SharePrefUtil; public class SplashActivity extends BaseActivity { @@ -26,7 +24,7 @@ public void run() { try { sleep(1000); if (!TextUtils.isEmpty(SharePrefUtil.getCurrentWalletName())) { - if (SharePrefUtil.getBoolean(SharePreConst.FingerPrint, false)) { + if (SharePrefUtil.getBoolean(ConstUtil.FingerPrint, false)) { startActivity(new Intent(mActivity, FingerPrintActivity.class)); } else { startActivity(new Intent(mActivity, MainActivity.class)); diff --git a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java index 53c1d157..34dd6d59 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java @@ -23,6 +23,7 @@ import android.widget.TextView; import android.widget.Toast; +import org.nervos.neuron.custom.TitleBar; import org.nervos.neuron.item.CurrencyItem; import org.nervos.neuron.item.TokenItem; import org.nervos.neuron.item.WalletItem; @@ -84,6 +85,7 @@ public class TransferActivity extends NBaseActivity { private String transactionHexData; private double mPrice = 0.0f; private CurrencyItem currencyItem; + private TitleBar titleBar; @Override protected int getContentLayout() { @@ -112,12 +114,14 @@ protected void initView() { payHexDataEdit = findViewById(R.id.pay_hex_data); gasEditLayout = findViewById(R.id.gas_layout); quotaEditLayout = findViewById(R.id.quota_layout); + titleBar = findViewById(R.id.title); } @Override protected void initData() { tokenItem = getIntent().getParcelableExtra(EXTRA_TOKEN); + titleBar.setTitle(tokenItem.symbol + getString(R.string.title_transfer)); EthRpcService.init(mActivity); NervosRpcService.init(mActivity, HttpUrls.NERVOS_NODE_IP); walletItem = DBWalletUtil.getCurrentWallet(this); From ddc12a836c109bdc8c4229888d0ce1157f4d5a5e Mon Sep 17 00:00:00 2001 From: baojun Date: Wed, 8 Aug 2018 09:36:32 +0800 Subject: [PATCH 050/121] refactor activity_transaction_detail.xml ui --- .../nervos/neuron/util/db/DBWalletUtil.java | 6 +----- .../layout/activity_transaction_detail.xml | 21 ++++++++++++------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java index 54196030..7b9f5ae2 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java @@ -3,18 +3,14 @@ import android.content.Context; import android.text.TextUtils; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer; import com.snappydb.DB; -import com.snappydb.DBFactory; import com.snappydb.SnappydbException; import org.nervos.neuron.R; +import org.nervos.neuron.crypto.AESCrypt; import org.nervos.neuron.item.ChainItem; import org.nervos.neuron.item.TokenItem; import org.nervos.neuron.item.WalletItem; -import org.nervos.neuron.util.LogUtil; -import org.nervos.neuron.crypto.AESCrypt; import java.security.GeneralSecurityException; import java.util.ArrayList; diff --git a/app/src/main/res/layout/activity_transaction_detail.xml b/app/src/main/res/layout/activity_transaction_detail.xml index 062d29d9..f1d56672 100644 --- a/app/src/main/res/layout/activity_transaction_detail.xml +++ b/app/src/main/res/layout/activity_transaction_detail.xml @@ -15,22 +15,25 @@ app:right_img="@drawable/ic_transaction_share" app:title="@string/transaction_detail_title" /> - + android:layout_height="match_parent"> + android:layout_height="0dp" + app:layout_constraintDimensionRatio="h,375:130" + android:background="@color/white" + app:layout_constraintTop_toTopOf="parent"> + android:background="@color/white" + app:layout_constraintTop_toBottomOf="@id/cl_top"> - + \ No newline at end of file From 7d22ac1b61196bcc156a35eaa7121f2a1b998917 Mon Sep 17 00:00:00 2001 From: baojun Date: Wed, 8 Aug 2018 09:52:10 +0800 Subject: [PATCH 051/121] refactor view_wallet_top.xml ui --- app/src/main/res/layout/view_wallet_top.xml | 27 ++++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/layout/view_wallet_top.xml b/app/src/main/res/layout/view_wallet_top.xml index 6eb9d91a..d0e7a2cf 100644 --- a/app/src/main/res/layout/view_wallet_top.xml +++ b/app/src/main/res/layout/view_wallet_top.xml @@ -13,9 +13,9 @@ Date: Wed, 8 Aug 2018 10:10:12 +0800 Subject: [PATCH 052/121] refactor token list ui --- .../main/res/layout/fragment_token_list.xml | 28 ++-- app/src/main/res/layout/item_token_list.xml | 129 +++++++++--------- 2 files changed, 83 insertions(+), 74 deletions(-) diff --git a/app/src/main/res/layout/fragment_token_list.xml b/app/src/main/res/layout/fragment_token_list.xml index d8e41068..359dd1c8 100644 --- a/app/src/main/res/layout/fragment_token_list.xml +++ b/app/src/main/res/layout/fragment_token_list.xml @@ -1,6 +1,6 @@ - @@ -9,16 +9,16 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + android:layout_height="match_parent"> + android:layout_height="0dp" + android:background="@color/white" + app:layout_constraintDimensionRatio="h,375:48"> + android:background="@color/line_form" + app:layout_constraintTop_toBottomOf="@id/ll_total_money" /> + android:layout_height="wrap_content" + app:layout_constraintTop_toBottomOf="@id/line"> - + \ No newline at end of file diff --git a/app/src/main/res/layout/item_token_list.xml b/app/src/main/res/layout/item_token_list.xml index dd8872f4..798711a5 100644 --- a/app/src/main/res/layout/item_token_list.xml +++ b/app/src/main/res/layout/item_token_list.xml @@ -1,73 +1,78 @@ - + android:layout_height="wrap_content"> - - - + android:layout_height="0dp" + android:paddingRight="16dp" + android:paddingStart="16dp" + app:layout_constraintDimensionRatio="h,375:68"> - + - + android:layout_centerVertical="true" + android:layout_marginLeft="10dp" + android:layout_toRightOf="@id/token_image"> - + - + - + - - \ No newline at end of file + + + + + + + \ No newline at end of file From f2f9474492e1f8750d1f46ced4ff9e26eb20aac2 Mon Sep 17 00:00:00 2001 From: baojun Date: Wed, 8 Aug 2018 11:00:01 +0800 Subject: [PATCH 053/121] update statusbar color --- .../neuron/activity/AboutUsActivity.java | 10 - .../neuron/activity/AppWebActivity.java | 10 - .../activity/BackupMnemonicActivity.java | 5 - .../nervos/neuron/activity/BaseActivity.java | 6 +- .../activity/ChangePasswordActivity.java | 5 - .../activity/ConfirmMnemonicActivity.java | 5 - .../neuron/activity/CreateWalletActivity.java | 5 - .../neuron/activity/CurrencyActivity.java | 10 - .../neuron/activity/ImportWalletActivity.java | 5 - .../nervos/neuron/activity/MainActivity.java | 5 + .../neuron/activity/PayTokenActivity.java | 120 +++---- .../neuron/activity/PwdUnlockActivity.java | 5 - .../neuron/activity/SimpleWebActivity.java | 15 +- .../neuron/activity/TokenManageActivity.java | 20 +- .../activity/TransactionListActivity.java | 24 +- .../neuron/activity/TransferActivity.java | 316 ++++++++++-------- .../neuron/activity/WalletManageActivity.java | 5 - 17 files changed, 272 insertions(+), 299 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java b/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java index 9a2930f8..e0945c36 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AboutUsActivity.java @@ -24,16 +24,6 @@ protected int getContentLayout() { return R.layout.activity_about_us; } - @Override - protected int getStatusBarColor() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); - return getResources().getColor(R.color.white, null); - } else { - return super.getStatusBarColor(); - } - } - @Override protected void initView() { versionText = findViewById(R.id.app_version); diff --git a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java index 4e3a976e..328fea3e 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java @@ -101,16 +101,6 @@ public void onClick(View v) { }); } - @Override - protected int getStatusBarColor() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); - return getResources().getColor(R.color.white, null); - } else { - return super.getStatusBarColor(); - } - } - private void initMenuView() { findViewById(R.id.menu_layout).setVisibility(View.VISIBLE); findViewById(R.id.menu_background).setVisibility(View.VISIBLE); diff --git a/app/src/main/java/org/nervos/neuron/activity/BackupMnemonicActivity.java b/app/src/main/java/org/nervos/neuron/activity/BackupMnemonicActivity.java index a346e267..d55bd48b 100644 --- a/app/src/main/java/org/nervos/neuron/activity/BackupMnemonicActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/BackupMnemonicActivity.java @@ -43,11 +43,6 @@ protected void initAction() { }); } - @Override - protected int getStatusBarColor() { - return getResources().getColor(R.color.white); - } - @Subscribe(threadMode = ThreadMode.MAIN) public void onCloseWalletEvent(CloseWalletInfoEvent event) { finish(); diff --git a/app/src/main/java/org/nervos/neuron/activity/BaseActivity.java b/app/src/main/java/org/nervos/neuron/activity/BaseActivity.java index 7431a2b0..8c521a2e 100644 --- a/app/src/main/java/org/nervos/neuron/activity/BaseActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/BaseActivity.java @@ -35,6 +35,10 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { Window window = getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M + && getStatusBarColor() == getResources().getColor(R.color.white)) { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(getStatusBarColor()); } @@ -44,7 +48,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { * set statusBarColor */ protected int getStatusBarColor() { - return getResources().getColor(R.color.colorPrimary); + return getResources().getColor(R.color.white); } public void onDestroy() { diff --git a/app/src/main/java/org/nervos/neuron/activity/ChangePasswordActivity.java b/app/src/main/java/org/nervos/neuron/activity/ChangePasswordActivity.java index abd8d82d..dcb2543b 100644 --- a/app/src/main/java/org/nervos/neuron/activity/ChangePasswordActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/ChangePasswordActivity.java @@ -74,11 +74,6 @@ protected void initAction() { }); } - @Override - protected int getStatusBarColor() { - return getResources().getColor(R.color.white); - } - private boolean isWalletValid() { return check1 && check2 && check3; } diff --git a/app/src/main/java/org/nervos/neuron/activity/ConfirmMnemonicActivity.java b/app/src/main/java/org/nervos/neuron/activity/ConfirmMnemonicActivity.java index e434f496..d9f46d95 100644 --- a/app/src/main/java/org/nervos/neuron/activity/ConfirmMnemonicActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/ConfirmMnemonicActivity.java @@ -111,11 +111,6 @@ public boolean onTagClick(View view, int position, FlowLayout parent) { } - @Override - protected int getStatusBarColor() { - return getResources().getColor(R.color.white); - } - private void backupComplete() { findViewById(R.id.backup_complete).setOnClickListener(new View.OnClickListener() { @Override diff --git a/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java b/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java index 41fca354..6bbaaa64 100644 --- a/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/CreateWalletActivity.java @@ -117,11 +117,6 @@ public void onClick(View view) { }); } - @Override - protected int getStatusBarColor() { - return getResources().getColor(R.color.white); - } - /** * save wallet information to database and add default eth token */ diff --git a/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java b/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java index 19837072..6206f21e 100644 --- a/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/CurrencyActivity.java @@ -46,16 +46,6 @@ protected void initView() { title = findViewById(R.id.title); } - @Override - protected int getStatusBarColor() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); - return getResources().getColor(R.color.white, null); - } else { - return super.getStatusBarColor(); - } - } - @Override protected void initData() { title.setLeftImage(R.drawable.ic_toptitle_back_white); diff --git a/app/src/main/java/org/nervos/neuron/activity/ImportWalletActivity.java b/app/src/main/java/org/nervos/neuron/activity/ImportWalletActivity.java index b0fbde7f..23df0d90 100644 --- a/app/src/main/java/org/nervos/neuron/activity/ImportWalletActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/ImportWalletActivity.java @@ -79,9 +79,4 @@ protected void initAction() { } - @Override - protected int getStatusBarColor() { - return getResources().getColor(R.color.white); - } - } diff --git a/app/src/main/java/org/nervos/neuron/activity/MainActivity.java b/app/src/main/java/org/nervos/neuron/activity/MainActivity.java index b515d586..ddd71ca2 100644 --- a/app/src/main/java/org/nervos/neuron/activity/MainActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/MainActivity.java @@ -40,6 +40,11 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { } + @Override + protected int getStatusBarColor() { + return getResources().getColor(R.color.colorPrimary); + } + private void initView() { navigation = findViewById(R.id.navigation); navigation.check(RadioGroup.NO_ID); diff --git a/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java b/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java index 6ddd72f6..c9f2a85d 100644 --- a/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java @@ -95,11 +95,13 @@ private void initView() { public void onCompleted() { dismissProgressCircle(); } + @Override public void onError(Throwable e) { e.printStackTrace(); dismissProgressCircle(); } + @Override public void onNext(BigInteger gasPrice) { transactionInfo.gasPrice = gasPrice.toString(16); @@ -167,8 +169,8 @@ private View getConfirmTransferView(BottomSheetDialog sheetDialog) { fromAddress.setText(walletItem.address); toAddress.setText(transactionInfo.to); valueText.setText(NumberUtil.getDecimal_6(transactionInfo.getValue())); - feeConfirmText.setText(NumberUtil.getDecimal_6(transactionInfo.isEthereum()? - transactionInfo.getGas():transactionInfo.getQuota())); + feeConfirmText.setText(NumberUtil.getDecimal_6(transactionInfo.isEthereum() ? + transactionInfo.getGas() : transactionInfo.getQuota())); view.findViewById(R.id.close_layout).setOnClickListener(v -> sheetDialog.dismiss()); view.findViewById(R.id.transfer_confirm_button).setOnClickListener(v -> showPasswordConfirmView(progressBar)); @@ -206,68 +208,73 @@ public void onOkClick() { private void transferEth(String password, ProgressBar progressBar) { Observable.just(transactionInfo.gasPrice) - .flatMap(new Func1>() { - @Override - public Observable call(String gasPrice) { - if (TextUtils.isEmpty(transactionInfo.gasPrice) - || "0".equals(transactionInfo.gasPrice)) { - return EthRpcService.getEthGasPrice(); - } else { - return Observable.just(Numeric.toBigInt(gasPrice)); + .flatMap(new Func1>() { + @Override + public Observable call(String gasPrice) { + if (TextUtils.isEmpty(transactionInfo.gasPrice) + || "0".equals(transactionInfo.gasPrice)) { + return EthRpcService.getEthGasPrice(); + } else { + return Observable.just(Numeric.toBigInt(gasPrice)); + } } - } - }).flatMap(new Func1>() { - @Override - public Observable call(BigInteger gasPrice) { - return EthRpcService.transferEth(transactionInfo.to, - transactionInfo.getValue(), gasPrice, password); - } - }).subscribeOn(Schedulers.io()) - .subscribeOn(AndroidSchedulers.mainThread()) - .subscribe(new Subscriber() { - @Override - public void onCompleted() { - progressBar.setVisibility(View.GONE); - } - @Override - public void onError(Throwable e) { - e.printStackTrace(); - progressBar.setVisibility(View.GONE); - Toast.makeText(mActivity, R.string.transfer_fail, Toast.LENGTH_SHORT).show(); - gotoSignFail(e.getMessage()); - } - @Override - public void onNext(EthSendTransaction ethSendTransaction) { - handleTransfer(ethSendTransaction); - } - }); + }).flatMap(new Func1>() { + @Override + public Observable call(BigInteger gasPrice) { + return EthRpcService.transferEth(transactionInfo.to, + transactionInfo.getValue(), gasPrice, password); + } + }).subscribeOn(Schedulers.io()) + .subscribeOn(AndroidSchedulers.mainThread()) + .subscribe(new Subscriber() { + @Override + public void onCompleted() { + progressBar.setVisibility(View.GONE); + } + + @Override + public void onError(Throwable e) { + e.printStackTrace(); + progressBar.setVisibility(View.GONE); + Toast.makeText(mActivity, R.string.transfer_fail, Toast.LENGTH_SHORT).show(); + gotoSignFail(e.getMessage()); + } + + @Override + public void onNext(EthSendTransaction ethSendTransaction) { + handleTransfer(ethSendTransaction); + } + }); } private void transferNervos(String password, ProgressBar progressBar) { NervosRpcService.setHttpProvider(SharePrefUtil.getChainHostFromId(transactionInfo.chainId)); NervosRpcService.transferNervos(transactionInfo.to, transactionInfo.getValue(), transactionInfo.data, password) - .subscribe(new Subscriber() { - @Override - public void onCompleted() { - progressBar.setVisibility(View.GONE); - } - @Override - public void onError(Throwable e) { - e.printStackTrace(); - progressBar.setVisibility(View.GONE); - gotoSignFail(e.getMessage()); - } - @Override - public void onNext(org.nervos.web3j.protocol.core.methods.response.EthSendTransaction ethSendTransaction) { - handleTransfer(ethSendTransaction); - } - }); + .subscribe(new Subscriber() { + @Override + public void onCompleted() { + progressBar.setVisibility(View.GONE); + } + + @Override + public void onError(Throwable e) { + e.printStackTrace(); + progressBar.setVisibility(View.GONE); + gotoSignFail(e.getMessage()); + } + + @Override + public void onNext(org.nervos.web3j.protocol.core.methods.response.EthSendTransaction ethSendTransaction) { + handleTransfer(ethSendTransaction); + } + }); } /** * handle ethereum transfer result - * @param ethSendTransaction result of ethereum transaction + * + * @param ethSendTransaction result of ethereum transaction */ private void handleTransfer(EthSendTransaction ethSendTransaction) { if (!TextUtils.isEmpty(ethSendTransaction.getTransactionHash())) { @@ -275,7 +282,7 @@ private void handleTransfer(EthSendTransaction ethSendTransaction) { Toast.makeText(mActivity, R.string.transfer_success, Toast.LENGTH_SHORT).show(); gotoSignSuccess(ethSendTransaction.getTransactionHash()); } else if (ethSendTransaction.getError() != null && - !TextUtils.isEmpty(ethSendTransaction.getError().getMessage())){ + !TextUtils.isEmpty(ethSendTransaction.getError().getMessage())) { sheetDialog.dismiss(); Toast.makeText(mActivity, ethSendTransaction.getError().getMessage(), Toast.LENGTH_SHORT).show(); @@ -288,7 +295,8 @@ private void handleTransfer(EthSendTransaction ethSendTransaction) { /** * handle nervos transfer result - * @param nervosSendTransaction result of nervos transaction + * + * @param nervosSendTransaction result of nervos transaction */ private void handleTransfer(org.nervos.web3j.protocol.core.methods.response.EthSendTransaction nervosSendTransaction) { if (!TextUtils.isEmpty(nervosSendTransaction.getSendTransactionResult().getHash())) { @@ -296,7 +304,7 @@ private void handleTransfer(org.nervos.web3j.protocol.core.methods.response.EthS Toast.makeText(mActivity, R.string.transfer_success, Toast.LENGTH_SHORT).show(); gotoSignSuccess(nervosSendTransaction.getSendTransactionResult().getHash()); } else if (nervosSendTransaction.getError() != null && - !TextUtils.isEmpty(nervosSendTransaction.getError().getMessage())){ + !TextUtils.isEmpty(nervosSendTransaction.getError().getMessage())) { sheetDialog.dismiss(); Toast.makeText(mActivity, nervosSendTransaction.getError().getMessage(), Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java b/app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java index d2c14adc..83b5b13d 100644 --- a/app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/PwdUnlockActivity.java @@ -99,11 +99,6 @@ public void afterTextChanged(Editable editable) { }); } - @Override - protected int getStatusBarColor() { - return getResources().getColor(R.color.white); - } - @Override public void onClick(View view) { switch (view.getId()) { diff --git a/app/src/main/java/org/nervos/neuron/activity/SimpleWebActivity.java b/app/src/main/java/org/nervos/neuron/activity/SimpleWebActivity.java index 1c709513..dd57dc37 100644 --- a/app/src/main/java/org/nervos/neuron/activity/SimpleWebActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/SimpleWebActivity.java @@ -33,16 +33,6 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { webView.loadUrl(url); } - @Override - protected int getStatusBarColor() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); - return getResources().getColor(R.color.white, null); - } else { - return super.getStatusBarColor(); - } - } - public static void gotoSimpleWeb(Context context, String url) { Intent intent = new Intent(context, SimpleWebActivity.class); intent.putExtra(SimpleWebActivity.EXTRA_URL, url); @@ -54,7 +44,7 @@ private void initWebView() { titleBar = findViewById(R.id.title); progressBar = findViewById(R.id.progressBar); WebAppUtil.initWebSettings(webView.getSettings()); - webView.setWebChromeClient(new WebChromeClient(){ + webView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView webview, int newProgress) { if (newProgress == 100) { @@ -64,13 +54,14 @@ public void onProgressChanged(WebView webview, int newProgress) { progressBar.setProgress(newProgress); } } + @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); titleBar.setTitle(title); } }); - webView.setWebViewClient(new WebViewClient(){ + webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; diff --git a/app/src/main/java/org/nervos/neuron/activity/TokenManageActivity.java b/app/src/main/java/org/nervos/neuron/activity/TokenManageActivity.java index 84b9be17..ab15d84a 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TokenManageActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TokenManageActivity.java @@ -56,7 +56,8 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { private void initData() { tokenNames = DBWalletUtil.getAllWalletName(mActivity); String tokens = FileUtil.loadRawFile(mActivity, R.raw.tokens_eth); - Type type = new TypeToken>() {}.getType(); + Type type = new TypeToken>() { + }.getType(); tokenList = new Gson().fromJson(tokens, type); addCustomToken(); adapter.notifyDataSetChanged(); @@ -98,16 +99,17 @@ private void postTokenRefreshEvent() { class TokenAdapter extends RecyclerView.Adapter { @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { TokenViewHolder holder = new TokenViewHolder(LayoutInflater.from( mActivity).inflate(R.layout.item_token_info, parent, false)); return holder; } + @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (holder instanceof TokenViewHolder) { - TokenViewHolder viewHolder = (TokenViewHolder)holder; + TokenViewHolder viewHolder = (TokenViewHolder) holder; if (tokenList.get(position).logo == null || TextUtils.isEmpty(tokenList.get(position).logo.src)) { viewHolder.tokenImage.setImageResource(R.drawable.ether_big); @@ -119,14 +121,14 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi viewHolder.tokenContractAddress.setText(tokenList.get(position).address); tokenList.get(position).isSelected = DBWalletUtil.checkTokenInCurrentWallet(mActivity, tokenList.get(position).symbol); - viewHolder.tokenSelectImage.setImageResource(tokenList.get(position).isSelected? - R.drawable.circle_selected:R.drawable.circle_unselect); + viewHolder.tokenSelectImage.setImageResource(tokenList.get(position).isSelected ? + R.drawable.circle_selected : R.drawable.circle_unselect); viewHolder.tokenSelectImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { tokenList.get(position).isSelected = !tokenList.get(position).isSelected; - viewHolder.tokenSelectImage.setImageResource(tokenList.get(position).isSelected? - R.drawable.circle_selected:R.drawable.circle_unselect); + viewHolder.tokenSelectImage.setImageResource(tokenList.get(position).isSelected ? + R.drawable.circle_selected : R.drawable.circle_unselect); if (tokenList.get(position).isSelected) { DBWalletUtil.addTokenToCurrentWallet(mActivity, new TokenItem(tokenList.get(position))); @@ -146,14 +148,14 @@ public int getItemCount() { } - class TokenViewHolder extends RecyclerView.ViewHolder { + class TokenViewHolder extends RecyclerView.ViewHolder { SimpleDraweeView tokenImage; TextView tokenName; TextView tokenSymbol; TextView tokenContractAddress; ImageView tokenSelectImage; - public TokenViewHolder (View view) { + public TokenViewHolder(View view) { super(view); tokenImage = view.findViewById(R.id.token_image); tokenName = view.findViewById(R.id.token_name_text); diff --git a/app/src/main/java/org/nervos/neuron/activity/TransactionListActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransactionListActivity.java index 643e7403..29a576c5 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransactionListActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransactionListActivity.java @@ -1,6 +1,7 @@ package org.nervos.neuron.activity; import android.content.Intent; +import android.os.Build; import android.support.annotation.NonNull; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.AppCompatButton; @@ -115,7 +116,7 @@ public void onRefresh() { private void getTransactionList() { if (!isNativeToken(tokenItem)) return; - Observable> observable = isETH(tokenItem)? + Observable> observable = isETH(tokenItem) ? NervosHttpService.getETHTransactionList(mActivity) : NervosHttpService.getNervosTransactionList(mActivity); observable.subscribe(new Subscriber>() { @@ -124,12 +125,14 @@ public void onCompleted() { dismissProgressBar(); swipeRefreshLayout.setRefreshing(false); } + @Override public void onError(Throwable e) { e.printStackTrace(); dismissProgressBar(); swipeRefreshLayout.setRefreshing(false); } + @Override public void onNext(List list) { if (list == null) { @@ -161,11 +164,12 @@ public void setOnItemClickListener(OnItemClickListener onItemClickListener) { } @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == VIEW_TYPE_EMPTY) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_empty_view, parent, false); - ((TextView)view.findViewById(R.id.empty_text)).setText(R.string.empty_no_transaction_data); - return new RecyclerView.ViewHolder(view){}; + ((TextView) view.findViewById(R.id.empty_text)).setText(R.string.empty_no_transaction_data); + return new RecyclerView.ViewHolder(view) { + }; } TransactionViewHolder holder = new TransactionViewHolder(LayoutInflater.from( mActivity).inflate(R.layout.item_transaction_list, parent, @@ -177,12 +181,12 @@ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (holder instanceof TransactionViewHolder) { TransactionItem transactionItem = transactionItemList.get(position); - TransactionViewHolder viewHolder = (TransactionViewHolder)holder; + TransactionViewHolder viewHolder = (TransactionViewHolder) holder; if (walletItem != null) { viewHolder.walletImage.setImageBitmap(Blockies.createIcon(walletItem.address)); } viewHolder.transactionIdText.setText(transactionItem.hash); - String value = (transactionItem.from.equalsIgnoreCase(walletItem.address)? "-" : "+") + String value = (transactionItem.from.equalsIgnoreCase(walletItem.address) ? "-" : "+") + transactionItem.value; viewHolder.transactionAmountText.setText(value); viewHolder.transactionChainNameText.setText(transactionItem.chainName); @@ -207,18 +211,18 @@ public int getItemViewType(int position) { return VIEW_TYPE_ITEM; } - class TransactionViewHolder extends RecyclerView.ViewHolder { + class TransactionViewHolder extends RecyclerView.ViewHolder { CircleImageView walletImage; TextView transactionIdText; TextView transactionAmountText; TextView transactionTimeText; TextView transactionChainNameText; - public TransactionViewHolder (View view) { + public TransactionViewHolder(View view) { super(view); view.setOnClickListener(v -> { if (onItemClickListener != null) { - onItemClickListener.onItemClick(v, (int)v.getTag()); + onItemClickListener.onItemClick(v, (int) v.getTag()); } }); walletImage = view.findViewById(R.id.wallet_photo); @@ -230,7 +234,7 @@ public TransactionViewHolder (View view) { } } - private interface OnItemClickListener{ + private interface OnItemClickListener { void onItemClick(View view, int position); } diff --git a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java index 34dd6d59..6ea0dfa7 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java @@ -2,6 +2,7 @@ import android.annotation.SuppressLint; import android.content.Intent; +import android.os.Build; import android.os.Bundle; import android.support.design.widget.BottomSheetDialog; import android.support.v7.widget.AppCompatButton; @@ -145,18 +146,20 @@ private void initGasInfo() { public void onCompleted() { } + @Override public void onError(Throwable e) { e.printStackTrace(); Toast.makeText(mActivity, e.getMessage(), Toast.LENGTH_SHORT).show(); dismissProgressCircle(); } + @Override public void onNext(BigInteger gasPrice) { dismissProgressCircle(); mGasPrice = gasPrice; mGasUnit = gasPrice.multiply(ConstUtil.GAS_MIN_LIMIT); - mGasLimit = ConstUtil.ETH.equalsIgnoreCase(tokenItem.symbol)? + mGasLimit = ConstUtil.ETH.equalsIgnoreCase(tokenItem.symbol) ? ConstUtil.GAS_LIMIT : ConstUtil.GAS_ERC20_LIMIT; mGas = mGasLimit.multiply(mGasPrice); feeSeekBar.setProgress(mGasLimit.divide(ConstUtil.GAS_MIN_LIMIT).intValue()); @@ -169,25 +172,27 @@ public void onNext(BigInteger gasPrice) { private void initPrice() { currencyItem = CurrencyUtil.getCurrencyItem(mActivity); TokenService.getCurrency(tokenItem.symbol, currencyItem.getName()) - .subscribe(new Subscriber() { - @Override - public void onCompleted() { - } - @Override - public void onError(Throwable e) { - e.printStackTrace(); - } - @Override - public void onNext(String price) { - if (TextUtils.isEmpty(price)) return; - try { - mPrice = Double.parseDouble(price); - initFeeText(); - } catch (NumberFormatException e) { + .subscribe(new Subscriber() { + @Override + public void onCompleted() { + } + + @Override + public void onError(Throwable e) { e.printStackTrace(); } - } - }); + + @Override + public void onNext(String price) { + if (TextUtils.isEmpty(price)) return; + try { + mPrice = Double.parseDouble(price); + initFeeText(); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + }); } @@ -198,13 +203,13 @@ private void initFeeText() { feeSeekText.setText(NumberUtil.getDecimal_8(fee) + tokenUnit); if (mPrice > 0 && currencyItem != null) { feeValueText.setText(feeSeekText.getText() + "=" + - currencyItem.getSymbol() + NumberUtil.getDecimal_6(fee*mPrice)); + currencyItem.getSymbol() + NumberUtil.getDecimal_6(fee * mPrice)); } } } private void initQuota() { - mQuota = TextUtils.isEmpty(tokenItem.contractAddress)? + mQuota = TextUtils.isEmpty(tokenItem.contractAddress) ? ConstUtil.QUOTA_TOKEN : ConstUtil.QUOTA_ERC20; mQuotaUnit = ConstUtil.QUOTA_TOKEN.divide(BigInteger.valueOf(DEFAULT_QUOTA_SEEK)); feeSeekBar.setProgress(mQuota.divide(mQuotaUnit).intValue()); @@ -217,14 +222,14 @@ private void initQuota() { protected void initAction() { scanImage.setOnClickListener((view) -> { AndPermission.with(mActivity) - .runtime().permission(Permission.Group.CAMERA) - .rationale(new RuntimeRationale()) - .onGranted(permissions -> { - Intent intent = new Intent(mActivity, QrCodeActivity.class); - startActivityForResult(intent, REQUEST_CODE_SCAN); - }) - .onDenied(permissions -> PermissionUtil.showSettingDialog(mActivity, permissions)) - .start(); + .runtime().permission(Permission.Group.CAMERA) + .rationale(new RuntimeRationale()) + .onGranted(permissions -> { + Intent intent = new Intent(mActivity, QrCodeActivity.class); + startActivityForResult(intent, REQUEST_CODE_SCAN); + }) + .onDenied(permissions -> PermissionUtil.showSettingDialog(mActivity, permissions)) + .start(); }); nextActionButton.setOnClickListener(v -> { @@ -245,7 +250,7 @@ protected void initAction() { feeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - progress = progress < 1? 1 : progress; + progress = progress < 1 ? 1 : progress; if (isETH()) { mGas = mGasUnit.multiply(BigInteger.valueOf(progress)); mGasLimit = mGasLimit.multiply(BigInteger.valueOf(progress)); @@ -256,10 +261,12 @@ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { feeValueText.setText(feeSeekText.getText()); } } + @Override public void onStartTrackingTouch(SeekBar seekBar) { } + @Override public void onStopTrackingTouch(SeekBar seekBar) { @@ -289,6 +296,7 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + @Override public void onTextChanged(CharSequence s, int start, int before, int count) { try { @@ -301,6 +309,7 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { Toast.makeText(mActivity, R.string.input_correct_number, Toast.LENGTH_SHORT).show(); } } + @Override public void afterTextChanged(Editable s) { @@ -311,6 +320,7 @@ public void afterTextChanged(Editable s) { public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + @Override public void onTextChanged(CharSequence s, int start, int before, int count) { try { @@ -323,6 +333,7 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { Toast.makeText(mActivity, R.string.input_correct_number, Toast.LENGTH_SHORT).show(); } } + @Override public void afterTextChanged(Editable s) { @@ -333,6 +344,7 @@ public void afterTextChanged(Editable s) { public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + @Override public void onTextChanged(CharSequence s, int start, int before, int count) { try { @@ -345,6 +357,7 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { Toast.makeText(mActivity, R.string.input_correct_number, Toast.LENGTH_SHORT).show(); } } + @Override public void afterTextChanged(Editable s) { @@ -380,6 +393,7 @@ private void advancedSetupNervosFeeValue() { /** * struct confirm transfer view + * * @return */ private View getConfirmTransferView() { @@ -387,13 +401,13 @@ private View getConfirmTransferView() { ProgressBar progressBar = view.findViewById(R.id.transfer_progress); String value = transferValueEdit.getText().toString().trim(); - double sum = Double.parseDouble(value) + NumberUtil.getEthFromWei(isETH()? mGas : mQuota); + double sum = Double.parseDouble(value) + NumberUtil.getEthFromWei(isETH() ? mGas : mQuota); - ((TextView)view.findViewById(R.id.from_address)).setText(walletItem.address); - ((TextView)view.findViewById(R.id.to_address)).setText(receiveAddressEdit.getText().toString()); - ((TextView)view.findViewById(R.id.transfer_value)).setText(transferValueEdit.getText().toString()); - ((TextView)view.findViewById(R.id.transfer_fee)).setText(feeSeekText.getText().toString()); - ((TextView)view.findViewById(R.id.transfer_sum)).setText(String.valueOf(sum)); + ((TextView) view.findViewById(R.id.from_address)).setText(walletItem.address); + ((TextView) view.findViewById(R.id.to_address)).setText(receiveAddressEdit.getText().toString()); + ((TextView) view.findViewById(R.id.transfer_value)).setText(transferValueEdit.getText().toString()); + ((TextView) view.findViewById(R.id.transfer_fee)).setText(feeSeekText.getText().toString()); + ((TextView) view.findViewById(R.id.transfer_sum)).setText(String.valueOf(sum)); view.findViewById(R.id.close_layout).setOnClickListener(new View.OnClickListener() { @Override @@ -412,7 +426,6 @@ public void onClick(View v) { } - private void showPasswordConfirmView(String value, ProgressBar progressBar) { passwordDialog = new BottomSheetDialog(mActivity); passwordDialog.setCancelable(false); @@ -461,91 +474,97 @@ public void onClick(View v) { } - /** transfer token of etherum and appchain */ /** * transfer origin token of nervos - * @param value transfer value + * + * @param value transfer value * @param progressBar */ - private void transferNervosToken(String password, double value, ProgressBar progressBar){ + private void transferNervosToken(String password, double value, ProgressBar progressBar) { transactionHexData = payHexDataEdit.getText().toString().trim(); NervosRpcService.transferNervos(receiveAddressEdit.getText().toString().trim(), value, transactionHexData, password) - .subscribe(new Subscriber() { - @Override - public void onCompleted() { - } - @Override - public void onError(Throwable e) { - e.printStackTrace(); - Toast.makeText(TransferActivity.this, - e.getMessage(), Toast.LENGTH_SHORT).show(); - progressBar.setVisibility(View.GONE); - passwordDialog.dismiss(); - } - @Override - public void onNext(org.nervos.web3j.protocol.core.methods.response.EthSendTransaction ethSendTransaction) { - progressBar.setVisibility(View.GONE); - if (!TextUtils.isEmpty(ethSendTransaction.getSendTransactionResult().getHash())) { - Toast.makeText(TransferActivity.this, R.string.transfer_success, Toast.LENGTH_SHORT).show(); - passwordDialog.dismiss(); - finish(); - } else if (ethSendTransaction.getError() != null && - !TextUtils.isEmpty(ethSendTransaction.getError().getMessage())) { - Toast.makeText(mActivity, ethSendTransaction.getError().getMessage(), - Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(mActivity, R.string.transfer_fail, Toast.LENGTH_SHORT).show(); - } - } - }); + .subscribe(new Subscriber() { + @Override + public void onCompleted() { + } + + @Override + public void onError(Throwable e) { + e.printStackTrace(); + Toast.makeText(TransferActivity.this, + e.getMessage(), Toast.LENGTH_SHORT).show(); + progressBar.setVisibility(View.GONE); + passwordDialog.dismiss(); + } + + @Override + public void onNext(org.nervos.web3j.protocol.core.methods.response.EthSendTransaction ethSendTransaction) { + progressBar.setVisibility(View.GONE); + if (!TextUtils.isEmpty(ethSendTransaction.getSendTransactionResult().getHash())) { + Toast.makeText(TransferActivity.this, R.string.transfer_success, Toast.LENGTH_SHORT).show(); + passwordDialog.dismiss(); + finish(); + } else if (ethSendTransaction.getError() != null && + !TextUtils.isEmpty(ethSendTransaction.getError().getMessage())) { + Toast.makeText(mActivity, ethSendTransaction.getError().getMessage(), + Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(mActivity, R.string.transfer_fail, Toast.LENGTH_SHORT).show(); + } + } + }); } /** * transfer erc20 token of nervos - * @param value transfer value + * + * @param value transfer value * @param progressBar */ private void transferNervosErc20(String password, double value, ProgressBar progressBar) throws Exception { NervosRpcService.setHttpProvider(SharePrefUtil.getChainHostFromId(tokenItem.chainId)); NervosRpcService.transferErc20(tokenItem, tokenItem.contractAddress, receiveAddressEdit.getText().toString().trim(), value, password) - .subscribe(new Subscriber() { - @Override - public void onCompleted() { - } - @Override - public void onError(Throwable e) { - e.printStackTrace(); - Toast.makeText(TransferActivity.this, - e.getMessage(), Toast.LENGTH_SHORT).show(); - progressBar.setVisibility(View.GONE); - passwordDialog.dismiss(); - } - @Override - public void onNext(org.nervos.web3j.protocol.core.methods.response.EthSendTransaction ethSendTransaction) { - progressBar.setVisibility(View.GONE); - if (!TextUtils.isEmpty(ethSendTransaction.getSendTransactionResult().getHash())) { - Toast.makeText(TransferActivity.this, R.string.transfer_success, Toast.LENGTH_SHORT).show(); + .subscribe(new Subscriber() { + @Override + public void onCompleted() { + } + + @Override + public void onError(Throwable e) { + e.printStackTrace(); + Toast.makeText(TransferActivity.this, + e.getMessage(), Toast.LENGTH_SHORT).show(); + progressBar.setVisibility(View.GONE); passwordDialog.dismiss(); - finish(); - } else if (ethSendTransaction.getError() != null && - !TextUtils.isEmpty(ethSendTransaction.getError().getMessage())){ - Toast.makeText(mActivity, ethSendTransaction.getError().getMessage(), - Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(mActivity, R.string.transfer_fail, Toast.LENGTH_SHORT).show(); } - } - }); + + @Override + public void onNext(org.nervos.web3j.protocol.core.methods.response.EthSendTransaction ethSendTransaction) { + progressBar.setVisibility(View.GONE); + if (!TextUtils.isEmpty(ethSendTransaction.getSendTransactionResult().getHash())) { + Toast.makeText(TransferActivity.this, R.string.transfer_success, Toast.LENGTH_SHORT).show(); + passwordDialog.dismiss(); + finish(); + } else if (ethSendTransaction.getError() != null && + !TextUtils.isEmpty(ethSendTransaction.getError().getMessage())) { + Toast.makeText(mActivity, ethSendTransaction.getError().getMessage(), + Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(mActivity, R.string.transfer_fail, Toast.LENGTH_SHORT).show(); + } + } + }); } /** * transfer origin token of ethereum + * * @param value * @param progressBar */ @@ -553,73 +572,78 @@ private void transferEth(String password, String value, ProgressBar progressBar) transactionHexData = payHexDataEdit.getText().toString().trim(); EthRpcService.transferEth(receiveAddressEdit.getText().toString().trim(), Double.valueOf(value), mGasPrice, mGasLimit, transactionHexData, password) - .subscribe(new Subscriber() { - @Override - public void onCompleted() { - } - @Override - public void onError(Throwable e) { - e.printStackTrace(); - Toast.makeText(TransferActivity.this, - e.getMessage(), Toast.LENGTH_SHORT).show(); - progressBar.setVisibility(View.GONE); - passwordDialog.dismiss(); - } - @Override - public void onNext(EthSendTransaction ethSendTransaction) { - progressBar.setVisibility(View.GONE); - if (!TextUtils.isEmpty(ethSendTransaction.getTransactionHash())) { - Toast.makeText(TransferActivity.this, R.string.transfer_success, Toast.LENGTH_SHORT).show(); + .subscribe(new Subscriber() { + @Override + public void onCompleted() { + } + + @Override + public void onError(Throwable e) { + e.printStackTrace(); + Toast.makeText(TransferActivity.this, + e.getMessage(), Toast.LENGTH_SHORT).show(); + progressBar.setVisibility(View.GONE); passwordDialog.dismiss(); - finish(); - } else if (ethSendTransaction.getError() != null && - !TextUtils.isEmpty(ethSendTransaction.getError().getMessage())){ - LogUtil.d(ethSendTransaction.getError().getMessage()); - Toast.makeText(mActivity, ethSendTransaction.getError().getMessage(), - Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(mActivity, R.string.transfer_fail, Toast.LENGTH_SHORT).show(); } - } - }); + + @Override + public void onNext(EthSendTransaction ethSendTransaction) { + progressBar.setVisibility(View.GONE); + if (!TextUtils.isEmpty(ethSendTransaction.getTransactionHash())) { + Toast.makeText(TransferActivity.this, R.string.transfer_success, Toast.LENGTH_SHORT).show(); + passwordDialog.dismiss(); + finish(); + } else if (ethSendTransaction.getError() != null && + !TextUtils.isEmpty(ethSendTransaction.getError().getMessage())) { + LogUtil.d(ethSendTransaction.getError().getMessage()); + Toast.makeText(mActivity, ethSendTransaction.getError().getMessage(), + Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(mActivity, R.string.transfer_fail, Toast.LENGTH_SHORT).show(); + } + } + }); } /** * transfer origin token of ethereum + * * @param value * @param progressBar */ private void transferEthErc20(String password, String value, ProgressBar progressBar) { EthRpcService.transferErc20(tokenItem, receiveAddressEdit.getText().toString().trim(), Double.valueOf(value), mGasPrice, mGasLimit, password) - .subscribe(new Subscriber() { - @Override - public void onCompleted() { - } - @Override - public void onError(Throwable e) { - e.printStackTrace(); - Toast.makeText(mActivity, e.getMessage(), Toast.LENGTH_SHORT).show(); - progressBar.setVisibility(View.GONE); - passwordDialog.dismiss(); - } - @Override - public void onNext(EthSendTransaction ethSendTransaction) { - progressBar.setVisibility(View.GONE); - if (!TextUtils.isEmpty(ethSendTransaction.getTransactionHash())) { - Toast.makeText(mActivity, R.string.transfer_success, Toast.LENGTH_SHORT).show(); + .subscribe(new Subscriber() { + @Override + public void onCompleted() { + } + + @Override + public void onError(Throwable e) { + e.printStackTrace(); + Toast.makeText(mActivity, e.getMessage(), Toast.LENGTH_SHORT).show(); + progressBar.setVisibility(View.GONE); passwordDialog.dismiss(); - finish(); - } else if (ethSendTransaction.getError() != null && - !TextUtils.isEmpty(ethSendTransaction.getError().getMessage())){ - Toast.makeText(mActivity, ethSendTransaction.getError().getMessage(), - Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(mActivity, R.string.transfer_fail, Toast.LENGTH_SHORT).show(); } - } - }); + + @Override + public void onNext(EthSendTransaction ethSendTransaction) { + progressBar.setVisibility(View.GONE); + if (!TextUtils.isEmpty(ethSendTransaction.getTransactionHash())) { + Toast.makeText(mActivity, R.string.transfer_success, Toast.LENGTH_SHORT).show(); + passwordDialog.dismiss(); + finish(); + } else if (ethSendTransaction.getError() != null && + !TextUtils.isEmpty(ethSendTransaction.getError().getMessage())) { + Toast.makeText(mActivity, ethSendTransaction.getError().getMessage(), + Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(mActivity, R.string.transfer_fail, Toast.LENGTH_SHORT).show(); + } + } + }); } diff --git a/app/src/main/java/org/nervos/neuron/activity/WalletManageActivity.java b/app/src/main/java/org/nervos/neuron/activity/WalletManageActivity.java index b7ff90ad..ae07b7a0 100644 --- a/app/src/main/java/org/nervos/neuron/activity/WalletManageActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/WalletManageActivity.java @@ -156,11 +156,6 @@ public void onOkClick() { } - @Override - protected int getStatusBarColor() { - return getResources().getColor(R.color.white); - } - private void generateKeystore(String password) { showProgressBar(R.string.generating); new Thread() { From a408c8539c74abf449c7ecc28a5037efc7e764f5 Mon Sep 17 00:00:00 2001 From: baojun Date: Wed, 8 Aug 2018 11:05:33 +0800 Subject: [PATCH 054/121] update change_wallet top button margin_top update token list item divider line height --- app/src/main/res/layout/activity_change_wallet.xml | 2 +- app/src/main/res/layout/item_token_list.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/activity_change_wallet.xml b/app/src/main/res/layout/activity_change_wallet.xml index 33187eb2..ab359788 100644 --- a/app/src/main/res/layout/activity_change_wallet.xml +++ b/app/src/main/res/layout/activity_change_wallet.xml @@ -11,7 +11,7 @@ android:id="@+id/iv_pull" android:layout_width="100dp" android:layout_height="34dp" - android:layout_marginTop="15dp" + android:layout_marginTop="11dp" android:contentDescription="@null" android:src="@drawable/ic_wallet_change_pull"/> diff --git a/app/src/main/res/layout/item_token_list.xml b/app/src/main/res/layout/item_token_list.xml index 798711a5..2eb73bab 100644 --- a/app/src/main/res/layout/item_token_list.xml +++ b/app/src/main/res/layout/item_token_list.xml @@ -71,7 +71,7 @@ From 87e30e5357c72c6346248b032470bc87e026a738 Mon Sep 17 00:00:00 2001 From: baojun Date: Wed, 8 Aug 2018 11:32:40 +0800 Subject: [PATCH 055/121] update change_wallet list height --- .../neuron/activity/ChangeWalletActivity.java | 5 ++- .../res/layout/activity_change_wallet.xml | 8 ++-- app/src/main/res/layout/item_wallet.xml | 36 ++++++++++------ app/src/main/res/layout/item_wallet_add.xml | 43 ++++++++++--------- 4 files changed, 53 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/ChangeWalletActivity.java b/app/src/main/java/org/nervos/neuron/activity/ChangeWalletActivity.java index e4d1ba23..4566b312 100644 --- a/app/src/main/java/org/nervos/neuron/activity/ChangeWalletActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/ChangeWalletActivity.java @@ -3,6 +3,7 @@ import android.content.Intent; import android.graphics.Rect; import android.support.annotation.NonNull; +import android.support.constraint.ConstraintLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -140,7 +141,7 @@ public int getItemViewType(int position) { class WalletHolder extends RecyclerView.ViewHolder { ImageView photoImage, defaultImage; TextView nameText, addressText; - RelativeLayout root; + ConstraintLayout root; public WalletHolder(View itemView) { super(itemView); @@ -153,7 +154,7 @@ public WalletHolder(View itemView) { } class AddHolder extends RecyclerView.ViewHolder { - RelativeLayout root; + ConstraintLayout root; public AddHolder(View itemView) { super(itemView); diff --git a/app/src/main/res/layout/activity_change_wallet.xml b/app/src/main/res/layout/activity_change_wallet.xml index ab359788..07feed8d 100644 --- a/app/src/main/res/layout/activity_change_wallet.xml +++ b/app/src/main/res/layout/activity_change_wallet.xml @@ -9,8 +9,8 @@ @@ -19,8 +19,8 @@ android:id="@+id/wallet_recycler" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginLeft="30dip" - android:layout_marginRight="30dip" + android:layout_marginLeft="15dip" + android:layout_marginRight="15dip" android:layout_marginTop="15dp" android:background="@color/transparent" app:layout_constraintTop_toBottomOf="@id/iv_pull" /> diff --git a/app/src/main/res/layout/item_wallet.xml b/app/src/main/res/layout/item_wallet.xml index 3ebaa3aa..298fd634 100644 --- a/app/src/main/res/layout/item_wallet.xml +++ b/app/src/main/res/layout/item_wallet.xml @@ -1,5 +1,6 @@ - + android:layout_marginBottom="24dp" + android:layout_marginLeft="16dip" + android:layout_marginTop="16dp" + android:src="@mipmap/ic_launcher" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + android:orientation="vertical" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toRightOf="@id/iv_photo" + app:layout_constraintTop_toTopOf="parent"> + android:src="@drawable/ic_wallet_default" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + android:layout_marginRight="17dp" + android:src="@drawable/arrow_right" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/item_wallet_add.xml b/app/src/main/res/layout/item_wallet_add.xml index cadf0384..e6fd3111 100644 --- a/app/src/main/res/layout/item_wallet_add.xml +++ b/app/src/main/res/layout/item_wallet_add.xml @@ -1,27 +1,30 @@ - - + + - - - - - - \ No newline at end of file + android:text="@string/add_wallet" + android:textColor="@color/font_title" + android:textSize="15sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/iv" /> + \ No newline at end of file From dbb62f2255ba1df497bbec0053ad213bcb309914 Mon Sep 17 00:00:00 2001 From: baojun Date: Wed, 8 Aug 2018 11:44:33 +0800 Subject: [PATCH 056/121] update about us bottom logo --- .../main/res/drawable-xhdpi/neuron_logo.png | Bin 4354 -> 3691 bytes .../main/res/drawable-xxhdpi/neuron_logo.png | Bin 7729 -> 5795 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/src/main/res/drawable-xhdpi/neuron_logo.png b/app/src/main/res/drawable-xhdpi/neuron_logo.png index d23b76486133928f329a59d48592dd84b27b7249..6e63a3afac0aa51dca83588c7bb3f84323a32595 100644 GIT binary patch literal 3691 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 literal 7729 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 From dfe19167e530ca370ff121556c12513df2ddf9f4 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Wed, 8 Aug 2018 15:26:59 +0800 Subject: [PATCH 057/121] support rel in link --- app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java b/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java index f8eed496..4919b625 100644 --- a/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java @@ -67,6 +67,9 @@ public String call() throws IOException { Document doc = Jsoup.connect(url).get(); Elements elements = doc.getElementsByTag("link"); for(Element element: elements) { + if ("manifest".equals(element.attr("rel"))) { + return element.attr("href"); + } if ("manifest".equals(element.attr("ref"))) { return element.attr("href"); } From 64356c0392dc5662d86d2719b4458d9904d094c8 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Wed, 8 Aug 2018 15:34:16 +0800 Subject: [PATCH 058/121] fix dismiss progress bar bug --- .../nervos/neuron/activity/TransactionListActivity.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/TransactionListActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransactionListActivity.java index 29a576c5..365f11bb 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransactionListActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransactionListActivity.java @@ -1,7 +1,6 @@ package org.nervos.neuron.activity; import android.content.Intent; -import android.os.Build; import android.support.annotation.NonNull; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.AppCompatButton; @@ -115,8 +114,11 @@ public void onRefresh() { private void getTransactionList() { - if (!isNativeToken(tokenItem)) return; - Observable> observable = isETH(tokenItem) ? + if (!isNativeToken(tokenItem)) { + dismissProgressBar(); + return; + } + Observable> observable = isETH(tokenItem)? NervosHttpService.getETHTransactionList(mActivity) : NervosHttpService.getNervosTransactionList(mActivity); observable.subscribe(new Subscriber>() { From 6bf4de2b620b5870eb4941a1d64de7ff707f4573 Mon Sep 17 00:00:00 2001 From: baojun Date: Wed, 8 Aug 2018 14:34:30 +0800 Subject: [PATCH 059/121] update splash ui --- .../ic_splash_nervos_center_logo.png | Bin 0 -> 15051 bytes .../ic_splash_nervos_center_logo.png | Bin 0 -> 25898 bytes app/src/main/res/layout/activity_splash.xml | 84 ++++++++---------- 3 files changed, 38 insertions(+), 46 deletions(-) create mode 100644 app/src/main/res/drawable-xhdpi/ic_splash_nervos_center_logo.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_splash_nervos_center_logo.png diff --git a/app/src/main/res/drawable-xhdpi/ic_splash_nervos_center_logo.png b/app/src/main/res/drawable-xhdpi/ic_splash_nervos_center_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0372ec5fdfedb3b594f0f76ea9b57c0821129c05 GIT binary patch literal 15051 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_splash_nervos_center_logo.png b/app/src/main/res/drawable-xxhdpi/ic_splash_nervos_center_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f90bf9295c6dcfd70dfc363b078013331c8d6b6e GIT binary patch literal 25898 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml index bb54894c..3135e710 100644 --- a/app/src/main/res/layout/activity_splash.xml +++ b/app/src/main/res/layout/activity_splash.xml @@ -11,7 +11,7 @@ android:layout_height="0dp" android:layout_weight="3" /> - + android:src="@drawable/ic_splash_nervos_center_logo" /> - - - + android:layout_alignParentBottom="true"> - + - + - + - + + - - From a37a4c1fc59eeeb5b4d85a02d6f30ca2bc8666c1 Mon Sep 17 00:00:00 2001 From: baojun Date: Wed, 8 Aug 2018 17:00:56 +0800 Subject: [PATCH 060/121] fix fingerprint unlock QA bugs --- .../org/nervos/neuron/activity/FingerPrintActivity.java | 6 ++++-- app/src/main/res/layout/activity_fingerprint.xml | 1 + app/src/main/res/layout/activity_pwd_unlock.xml | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java b/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java index f7509842..bd818e30 100644 --- a/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/FingerPrintActivity.java @@ -53,15 +53,17 @@ protected int getStatusBarColor() { AuthenticateResultCallback authenticateResultCallback = new AuthenticateResultCallback() { @Override public void onAuthenticationError(String errorMsg) { - Toast.makeText(mActivity, errorMsg, Toast.LENGTH_SHORT).show(); + if (!errorMsg.contains("取消")) + Toast.makeText(mActivity, errorMsg, Toast.LENGTH_SHORT).show(); } @Override public void onAuthenticationSucceeded() { if (authFingerDialog != null && authFingerDialog.isShowing()) authFingerDialog.dismiss(); - Toast.makeText(mActivity, getResources().getString(R.string.fingerprint_lock_success), Toast.LENGTH_SHORT).show(); +// Toast.makeText(mActivity, getResources().getString(R.string.fingerprint_lock_success), Toast.LENGTH_SHORT).show(); startActivity(new Intent(mActivity, MainActivity.class)); + finish(); } @Override diff --git a/app/src/main/res/layout/activity_fingerprint.xml b/app/src/main/res/layout/activity_fingerprint.xml index 05e4b048..b8163076 100644 --- a/app/src/main/res/layout/activity_fingerprint.xml +++ b/app/src/main/res/layout/activity_fingerprint.xml @@ -14,6 +14,7 @@ android:text="@string/cancel" android:textColor="@color/font_inside" android:textSize="18sp" + android:visibility="gone" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/activity_pwd_unlock.xml b/app/src/main/res/layout/activity_pwd_unlock.xml index f43d4ad7..43eb7919 100644 --- a/app/src/main/res/layout/activity_pwd_unlock.xml +++ b/app/src/main/res/layout/activity_pwd_unlock.xml @@ -14,6 +14,7 @@ android:text="@string/cancel" android:textColor="@color/font_inside" android:textSize="18sp" + android:visibility="gone" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> From c99f7bf3d1be8c7f28f86259a34c5960315b00fe Mon Sep 17 00:00:00 2001 From: baojun Date: Wed, 8 Aug 2018 17:17:23 +0800 Subject: [PATCH 061/121] update about_us ui --- app/src/main/res/layout/activity_about_us.xml | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index c5cf269f..51e19706 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -18,14 +18,13 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white" - android:orientation="vertical" - android:paddingBottom="10dp" - android:paddingTop="10dp"> + android:orientation="vertical"> @@ -36,7 +35,7 @@ android:layout_gravity="center_horizontal" android:layout_marginTop="5dip" android:text="@string/app_name" - android:textColor="@color/default_black" + android:textColor="@color/font_title" android:textSize="16sp" /> @@ -91,28 +90,29 @@ app:icon="@drawable/ic_about_us_open_sea" app:name="Open Sea" app:other1="false" /> - + + - + android:textColor="@color/default_gray_9" + android:textSize="12sp" /> + + android:scaleType="centerInside" + android:src="@drawable/neuron_logo" /> + android:textColor="@color/default_gray_9" + android:textSize="12sp" /> \ No newline at end of file From c69116883f24642f5183cf9d711c5be7511b4937 Mon Sep 17 00:00:00 2001 From: baojun Date: Wed, 8 Aug 2018 17:40:14 +0800 Subject: [PATCH 062/121] update setting_button ui currency list ui --- app/src/main/res/layout/item_currency.xml | 8 ++++---- app/src/main/res/layout/view_setting_button.xml | 15 +++++++-------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/layout/item_currency.xml b/app/src/main/res/layout/item_currency.xml index 1db24a0f..9331f4db 100644 --- a/app/src/main/res/layout/item_currency.xml +++ b/app/src/main/res/layout/item_currency.xml @@ -10,7 +10,7 @@ android:id="@+id/tv_currency" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="12dip" + android:layout_marginLeft="15dip" android:text="CNY" android:textColor="@color/font_title_second" android:textSize="16sp" @@ -22,7 +22,7 @@ android:id="@+id/iv_chosen" android:layout_width="22dip" android:layout_height="22dip" - android:layout_marginRight="12dip" + android:layout_marginRight="15dip" android:src="@drawable/ic_currency_selected" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" @@ -33,8 +33,8 @@ diff --git a/app/src/main/res/layout/view_setting_button.xml b/app/src/main/res/layout/view_setting_button.xml index 6408a644..8ea8bc13 100644 --- a/app/src/main/res/layout/view_setting_button.xml +++ b/app/src/main/res/layout/view_setting_button.xml @@ -11,7 +11,7 @@ android:id="@+id/iv_setting_icon" android:layout_width="20dip" android:layout_height="20dip" - android:layout_marginLeft="12dip" + android:layout_marginLeft="15dip" android:background="@mipmap/ic_launcher" android:contentDescription="@null" android:scaleType="centerInside" @@ -33,10 +33,9 @@ Date: Wed, 8 Aug 2018 17:46:19 +0800 Subject: [PATCH 063/121] update token list ui --- app/src/main/res/layout/fragment_token_list.xml | 4 ++-- app/src/main/res/layout/item_token_list.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/fragment_token_list.xml b/app/src/main/res/layout/fragment_token_list.xml index 359dd1c8..943df3c2 100644 --- a/app/src/main/res/layout/fragment_token_list.xml +++ b/app/src/main/res/layout/fragment_token_list.xml @@ -25,7 +25,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" - android:layout_marginLeft="20dp" + android:layout_marginLeft="15dp" android:text="@string/wallet_token_total_money" android:textColor="@color/font_title_second" android:textSize="14sp" /> @@ -47,7 +47,7 @@ android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginBottom="10dip" - android:layout_marginRight="20dp" + android:layout_marginRight="15dp" android:layout_marginTop="10dip" android:src="@drawable/ic_wallet_token_add" /> diff --git a/app/src/main/res/layout/item_token_list.xml b/app/src/main/res/layout/item_token_list.xml index 2eb73bab..a2869701 100644 --- a/app/src/main/res/layout/item_token_list.xml +++ b/app/src/main/res/layout/item_token_list.xml @@ -7,8 +7,8 @@ android:id="@+id/root" android:layout_width="match_parent" android:layout_height="0dp" - android:paddingRight="16dp" - android:paddingStart="16dp" + android:paddingEnd="15dp" + android:paddingStart="15dp" app:layout_constraintDimensionRatio="h,375:68"> Date: Wed, 8 Aug 2018 17:47:50 +0800 Subject: [PATCH 064/121] add synchronized to db --- .../activity/TransactionListActivity.java | 5 + .../neuron/activity/TransferActivity.java | 88 +++++--- .../view/TokenListFragment.java | 9 +- .../neuron/fragment/WalletFragment.java | 2 +- .../nervos/neuron/service/WalletService.java | 41 +++- .../org/nervos/neuron/util/db/DBAppUtil.java | 86 +++---- .../nervos/neuron/util/db/DBChainUtil.java | 70 +++--- .../nervos/neuron/util/db/DBHistoryUtil.java | 36 +-- .../nervos/neuron/util/db/DBTokenUtil.java | 54 +++-- .../org/nervos/neuron/util/db/DBUtil.java | 2 + .../nervos/neuron/util/db/DBWalletUtil.java | 210 ++++++++++-------- .../res/layout/activity_transaction_list.xml | 3 +- app/src/main/res/values/strings.xml | 1 + 13 files changed, 361 insertions(+), 246 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/TransactionListActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransactionListActivity.java index 365f11bb..4460e067 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransactionListActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransactionListActivity.java @@ -14,6 +14,7 @@ import android.widget.Toast; import org.nervos.neuron.R; +import org.nervos.neuron.custom.TitleBar; import org.nervos.neuron.item.TokenItem; import org.nervos.neuron.item.TransactionItem; import org.nervos.neuron.item.WalletItem; @@ -44,6 +45,8 @@ public class TransactionListActivity extends NBaseActivity { private SwipeRefreshLayout swipeRefreshLayout; private TransactionAdapter adapter = new TransactionAdapter(); + private TitleBar titleBar; + private AppCompatButton receiveButton, transferButton; private TokenItem tokenItem; @@ -58,12 +61,14 @@ protected void initView() { swipeRefreshLayout = findViewById(R.id.swipe_refresh_layout); receiveButton = findViewById(R.id.receive_token); transferButton = findViewById(R.id.transfer_token); + titleBar = findViewById(R.id.title); } @Override protected void initData() { walletItem = DBWalletUtil.getCurrentWallet(mActivity); tokenItem = getIntent().getParcelableExtra(EXTRA_TOKEN); + titleBar.setTitle(tokenItem.symbol); initAdapter(); showProgressBar(); getTransactionList(); diff --git a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java index 6ea0dfa7..3d22d171 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java @@ -25,6 +25,7 @@ import android.widget.Toast; import org.nervos.neuron.custom.TitleBar; +import org.nervos.neuron.item.ChainItem; import org.nervos.neuron.item.CurrencyItem; import org.nervos.neuron.item.TokenItem; import org.nervos.neuron.item.WalletItem; @@ -38,6 +39,7 @@ import org.nervos.neuron.service.EthRpcService; import org.nervos.neuron.service.TokenService; +import org.nervos.neuron.service.WalletService; import org.nervos.neuron.util.AddressUtil; import org.nervos.neuron.util.Blockies; import org.nervos.neuron.util.ConstUtil; @@ -45,6 +47,7 @@ import org.nervos.neuron.util.LogUtil; import org.nervos.neuron.util.NumberUtil; import org.nervos.neuron.crypto.AESCrypt; +import org.nervos.neuron.util.db.DBChainUtil; import org.nervos.neuron.util.db.SharePrefUtil; import org.nervos.neuron.util.permission.PermissionUtil; import org.nervos.neuron.util.permission.RuntimeRationale; @@ -54,6 +57,7 @@ import java.math.BigInteger; import java.text.DecimalFormat; +import java.util.Objects; import de.hdodenhof.circleimageview.CircleImageView; import rx.Subscriber; @@ -62,7 +66,6 @@ public class TransferActivity extends NBaseActivity { private static final int REQUEST_CODE_SCAN = 0x01; public static final String EXTRA_TOKEN = "extra_token"; - private static final String tokenUnit = "eth"; private static final int MAX_QUOTA_SEEK = 1000; private static final int DEFAULT_QUOTA_SEEK = 8; private static final int MAX_FEE = 100; @@ -129,6 +132,7 @@ protected void initData() { walletAddressText.setText(walletItem.address); walletNameText.setText(walletItem.name); photoImage.setImageBitmap(Blockies.createIcon(walletItem.address)); + initBalance(); if (isETH()) { feeSeekBar.setMax(MAX_FEE); initGasInfo(); @@ -139,6 +143,25 @@ protected void initData() { } } + @SuppressLint("SetTextI18n") + private void initBalance() { + WalletService.getBalanceWithToken(mActivity, tokenItem).subscribe(new Subscriber() { + @Override + public void onCompleted() { + + } + @Override + public void onError(Throwable e) { + + } + @Override + public void onNext(Double balance) { + balanceText.setText(String.format( + getString(R.string.transfer_balance_place_holder), balance + tokenItem.symbol)); + } + }); + } + private void initGasInfo() { showProgressCircle(); EthRpcService.getEthGasPrice().subscribe(new Subscriber() { @@ -146,14 +169,12 @@ private void initGasInfo() { public void onCompleted() { } - @Override public void onError(Throwable e) { e.printStackTrace(); Toast.makeText(mActivity, e.getMessage(), Toast.LENGTH_SHORT).show(); dismissProgressCircle(); } - @Override public void onNext(BigInteger gasPrice) { dismissProgressCircle(); @@ -172,27 +193,26 @@ public void onNext(BigInteger gasPrice) { private void initPrice() { currencyItem = CurrencyUtil.getCurrencyItem(mActivity); TokenService.getCurrency(tokenItem.symbol, currencyItem.getName()) - .subscribe(new Subscriber() { - @Override - public void onCompleted() { - } + .subscribe(new Subscriber() { + @Override + public void onCompleted() { + } + @Override + public void onError(Throwable e) { + e.printStackTrace(); + } - @Override - public void onError(Throwable e) { + @Override + public void onNext(String price) { + if (TextUtils.isEmpty(price)) return; + try { + mPrice = Double.parseDouble(price); + initFeeText(); + } catch (NumberFormatException e) { e.printStackTrace(); } - - @Override - public void onNext(String price) { - if (TextUtils.isEmpty(price)) return; - try { - mPrice = Double.parseDouble(price); - initFeeText(); - } catch (NumberFormatException e) { - e.printStackTrace(); - } - } - }); + } + }); } @@ -200,21 +220,22 @@ public void onNext(String price) { private void initFeeText() { double fee = NumberUtil.getEthFromWei(mGas); if (fee > 0) { - feeSeekText.setText(NumberUtil.getDecimal_8(fee) + tokenUnit); + feeSeekText.setText(fee + getTokenUnit()); if (mPrice > 0 && currencyItem != null) { feeValueText.setText(feeSeekText.getText() + "=" + - currencyItem.getSymbol() + NumberUtil.getDecimal_6(fee * mPrice)); + currencyItem.getSymbol() + NumberUtil.getDecimal_8(fee * mPrice)); } } } + @SuppressLint("SetTextI18n") private void initQuota() { mQuota = TextUtils.isEmpty(tokenItem.contractAddress) ? ConstUtil.QUOTA_TOKEN : ConstUtil.QUOTA_ERC20; mQuotaUnit = ConstUtil.QUOTA_TOKEN.divide(BigInteger.valueOf(DEFAULT_QUOTA_SEEK)); feeSeekBar.setProgress(mQuota.divide(mQuotaUnit).intValue()); - feeSeekText.setText(String.valueOf(NumberUtil.getEthFromWei(mQuota))); + feeSeekText.setText(NumberUtil.getEthFromWei(mQuota) + getTokenUnit()); feeValueText.setText(feeSeekText.getText()); } @@ -257,7 +278,7 @@ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { initFeeText(); } else { mQuota = mQuotaUnit.multiply(BigInteger.valueOf(progress)); - feeSeekText.setText(String.valueOf(NumberUtil.getEthFromWei(mQuota))); + feeSeekText.setText(NumberUtil.getEthFromWei(mQuota) + getTokenUnit()); feeValueText.setText(feeSeekText.getText()); } } @@ -369,23 +390,33 @@ private boolean isETH() { return tokenItem.chainId < 0; } + private String getTokenUnit() { + if (isETH()) { + return "ETH"; + } else { + return Objects.requireNonNull(DBChainUtil.getChain(mActivity, tokenItem.chainId)).tokenSymbol; + } + } + + @SuppressLint("SetTextI18n") private void advancedSetupETHFeeValue() { gasEditLayout.setVisibility(View.VISIBLE); quotaEditLayout.setVisibility(View.GONE); if (isGasLimitOk && isGasPriceOk) { - feeValueText.setText(NumberUtil.getDecimal_8( - NumberUtil.getEthFromWei(mGasPrice.multiply(mGasLimit))) + tokenUnit); + feeValueText.setText( + NumberUtil.getEthFromWei(mGasPrice.multiply(mGasLimit)) + getTokenUnit()); } else { feeValueText.setText("0"); } } + @SuppressLint("SetTextI18n") private void advancedSetupNervosFeeValue() { gasEditLayout.setVisibility(View.GONE); quotaEditLayout.setVisibility(View.VISIBLE); if (!TextUtils.isEmpty(customQuotaEdit.getText())) { - feeValueText.setText(String.valueOf(NumberUtil.getEthFromWei(mQuota))); + feeValueText.setText(NumberUtil.getEthFromWei(mQuota) + getTokenUnit()); } else { feeValueText.setText("0"); } @@ -490,7 +521,6 @@ private void transferNervosToken(String password, double value, ProgressBar prog @Override public void onCompleted() { } - @Override public void onError(Throwable e) { e.printStackTrace(); diff --git a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java index 725e719d..8b4100b9 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java @@ -16,7 +16,6 @@ import org.nervos.neuron.R; import org.nervos.neuron.activity.TokenManageActivity; import org.nervos.neuron.activity.TransactionListActivity; -import org.nervos.neuron.activity.TransferActivity; import org.nervos.neuron.event.TokenRefreshEvent; import org.nervos.neuron.fragment.NBaseFragment; import org.nervos.neuron.fragment.TokenListFragment.model.TokenAdapter; @@ -27,15 +26,12 @@ import org.nervos.neuron.service.WalletService; import org.nervos.neuron.service.TokenService; import org.nervos.neuron.util.CurrencyUtil; -import org.nervos.neuron.util.db.DBWalletUtil; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; -import rx.Observable; import rx.Subscriber; -import rx.functions.Func1; /** * Created by BaojunCZ on 2018/8/2. @@ -51,7 +47,6 @@ public class TokenListFragment extends NBaseFragment { private TextView totalText, moneyText; private ImageView addImage; private CurrencyItem currencyItem; - private WalletItem walletItem = null; private SwipeRefreshLayout swipeRefreshLayout; @Override @@ -131,14 +126,12 @@ public void onRefresh() { } private void initWalletData(boolean showProgress) { - walletItem = DBWalletUtil.getCurrentWallet(getContext()); if (showProgress) showProgressBar(); - WalletService.getWalletTokenBalance(getContext(), walletItem, walletItem -> + WalletService.getWalletTokenBalance(getContext(), walletItem -> recyclerView.post(() -> { if (showProgress) dismissProgressBar(); swipeRefreshLayout.setRefreshing(false); if (walletItem.tokenItems != null) { - this.walletItem = walletItem; this.tokenItemList = walletItem.tokenItems; setData(); } diff --git a/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java b/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java index d63d03ef..a997c0fb 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java @@ -102,7 +102,7 @@ private void initWalletData(boolean showProgress) { walletNameText.setText(walletItem.name); addressText.setText(walletItem.address); photoImage.setImageBitmap(Blockies.createIcon(walletItem.address)); - WalletService.getWalletTokenBalance(getContext(), walletItem, walletItem -> + WalletService.getWalletTokenBalance(getContext(), walletItem -> walletNameText.post(() -> { if (showProgress) dismissProgressBar(); swipeRefreshLayout.setRefreshing(false); diff --git a/app/src/main/java/org/nervos/neuron/service/WalletService.java b/app/src/main/java/org/nervos/neuron/service/WalletService.java index b5d1819a..6aa5dc51 100644 --- a/app/src/main/java/org/nervos/neuron/service/WalletService.java +++ b/app/src/main/java/org/nervos/neuron/service/WalletService.java @@ -8,19 +8,26 @@ import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.util.ConstUtil; import org.nervos.neuron.util.db.DBChainUtil; +import org.nervos.neuron.util.db.DBWalletUtil; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import rx.Observable; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + public class WalletService { private static ExecutorService executorService = Executors.newFixedThreadPool(4); - public static void getWalletTokenBalance(Context context, WalletItem walletItem, + public static void getWalletTokenBalance(Context context, OnGetWalletTokenListener listener) { + WalletItem walletItem = DBWalletUtil.getCurrentWallet(context); if (walletItem == null || walletItem.tokenItems.size() == 0) return; List tokenItemList = new ArrayList<>(); executorService.execute(() -> { @@ -65,4 +72,36 @@ public interface OnGetWalletTokenListener { void onGetWalletToken(WalletItem walletItem); } + + public static Observable getBalanceWithToken(Context context, TokenItem tokenItem) { + WalletItem walletItem = DBWalletUtil.getCurrentWallet(context); + return Observable.fromCallable(new Callable() { + @Override + public Double call() { + if (tokenItem.chainId < 0) { // ethereum + if (ConstUtil.ETH.equals(tokenItem.symbol)) { + return EthRpcService.getEthBalance(walletItem.address); + } else { + return EthRpcService.getERC20Balance( + tokenItem.contractAddress, walletItem.address); + } + } else { // CITA + ChainItem chainItem = DBChainUtil.getChain(context, tokenItem.chainId); + if (chainItem != null) { + String httpProvider = chainItem.httpProvider; + NervosRpcService.init(context, httpProvider); + if (!TextUtils.isEmpty(tokenItem.contractAddress)) { + return NervosRpcService.getErc20Balance( + tokenItem, walletItem.address); + } else { + return NervosRpcService.getBalance(walletItem.address); + } + } + } + return 0.0; + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + } diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBAppUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBAppUtil.java index feb5a38c..5e155674 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBAppUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBAppUtil.java @@ -16,63 +16,73 @@ public class DBAppUtil extends DBUtil { private static final String DB_APP = "db_app"; public static void saveDbApp(Context context, AppItem appItem) { - try { - DB db = openDB(context, DB_APP); - db.put(getDbKey(appItem.entry), appItem); - db.close(); - } catch (SnappydbException e) { - e.printStackTrace(); + synchronized (dbObject) { + try { + DB db = openDB(context, DB_APP); + db.put(getDbKey(appItem.entry), appItem); + db.close(); + } catch (SnappydbException e) { + e.printStackTrace(); + } } } public static void deleteApp(Context context, String entry) { - try { - DB db = openDB(context, DB_APP); - db.del(getDbKey(entry)); - db.close(); - } catch (SnappydbException e) { - e.printStackTrace(); + synchronized (dbObject) { + try { + DB db = openDB(context, DB_APP); + db.del(getDbKey(entry)); + db.close(); + } catch (SnappydbException e) { + e.printStackTrace(); + } } } public static List getAllApp(Context context) { - List walletList = new ArrayList<>(); - try { - DB db = openDB(context, DB_APP); - String[] keys = db.findKeys(DB_PREFIX); - db.close(); - for(String key: keys) { - walletList.add(db.getObject(key, AppItem.class)); + synchronized (dbObject) { + List walletList = new ArrayList<>(); + try { + DB db = openDB(context, DB_APP); + String[] keys = db.findKeys(DB_PREFIX); + db.close(); + for(String key: keys) { + walletList.add(db.getObject(key, AppItem.class)); + } + } catch (SnappydbException e) { + e.printStackTrace(); } - } catch (SnappydbException e) { - e.printStackTrace(); + return walletList; } - return walletList; } public static boolean findApp(Context context, String entry) { - try { - DB db = openDB(context, DB_APP); - String[] keys = db.findKeys(getDbKey(entry)); - db.close(); - return keys.length > 0; - } catch (SnappydbException e) { - e.printStackTrace(); + synchronized (dbObject) { + try { + DB db = openDB(context, DB_APP); + String[] keys = db.findKeys(getDbKey(entry)); + db.close(); + return keys.length > 0; + } catch (SnappydbException e) { + e.printStackTrace(); + } + return false; } - return false; } public static AppItem getApp(Context context, String entry) { - try { - DB db = openDB(context, DB_APP); - AppItem appItem = db.getObject(getDbKey(entry), AppItem.class); - db.close(); - return appItem; - } catch (SnappydbException e) { - e.printStackTrace(); + synchronized (dbObject) { + try { + DB db = openDB(context, DB_APP); + AppItem appItem = db.getObject(getDbKey(entry), AppItem.class); + db.close(); + return appItem; + } catch (SnappydbException e) { + e.printStackTrace(); + } + return null; } - return null; } diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java index 307004e0..dc53f030 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java @@ -20,53 +20,61 @@ public class DBChainUtil extends DBUtil { public static List getAllChain(Context context) { - List chainItemList = new ArrayList<>(); - try { - DB db = openDB(context, DB_CHAIN); - String[] keys = db.findKeys(DB_PREFIX); - for(String key: keys) { - ChainItem chainItem = db.getObject(key, ChainItem.class); - chainItem.chainId = Integer.parseInt(getDbOrigin(key)); - chainItemList.add(chainItem); + synchronized (dbObject) { + List chainItemList = new ArrayList<>(); + try { + DB db = openDB(context, DB_CHAIN); + String[] keys = db.findKeys(DB_PREFIX); + for(String key: keys) { + ChainItem chainItem = db.getObject(key, ChainItem.class); + chainItem.chainId = Integer.parseInt(getDbOrigin(key)); + chainItemList.add(chainItem); + } + db.close(); + } catch (SnappydbException e) { + e.printStackTrace(); } - db.close(); - } catch (SnappydbException e) { - e.printStackTrace(); + return chainItemList; } - return chainItemList; } public static ChainItem getChain(Context context, int chainId) { - try { - DB db = openDB(context, DB_CHAIN); - ChainItem chainItem = db.getObject(getDbKey(String.valueOf(chainId)), ChainItem.class); - db.close(); - return chainItem; - } catch (SnappydbException e) { - e.printStackTrace(); + synchronized (dbObject) { + try { + DB db = openDB(context, DB_CHAIN); + ChainItem chainItem = db.getObject(getDbKey(String.valueOf(chainId)), ChainItem.class); + db.close(); + return chainItem; + } catch (SnappydbException e) { + e.printStackTrace(); + } + return null; } - return null; } public static List getAllChainName(Context context) { - List chainNameList = new ArrayList<>(); - List chainItemList = getAllChain(context); + synchronized (dbObject) { + List chainNameList = new ArrayList<>(); + List chainItemList = getAllChain(context); - for(ChainItem chainItem : chainItemList) { - chainNameList.add(chainItem.name); + for(ChainItem chainItem : chainItemList) { + chainNameList.add(chainItem.name); + } + return chainNameList; } - return chainNameList; } public static void saveChain(Context context, ChainItem chainItem){ - try { - DB db = openDB(context, DB_CHAIN); - db.put(getDbKey(String.valueOf(chainItem.chainId)), chainItem); - db.close(); - } catch (SnappydbException e) { - e.printStackTrace(); + synchronized (dbObject) { + try { + DB db = openDB(context, DB_CHAIN); + db.put(getDbKey(String.valueOf(chainItem.chainId)), chainItem); + db.close(); + } catch (SnappydbException e) { + e.printStackTrace(); + } } } diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBHistoryUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBHistoryUtil.java index 8a71b133..bdc1551e 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBHistoryUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBHistoryUtil.java @@ -14,28 +14,32 @@ public class DBHistoryUtil extends DBUtil { private static final String DB_HISTORY = "db_history"; public static List getAllHistory(Context context) { - List historyList = new ArrayList<>(); - try { - DB db = openDB(context, DB_HISTORY); - String[] keys = db.findKeys(DB_PREFIX); - for(String key: keys) { - historyList.add(db.get(key)); + synchronized (dbObject) { + List historyList = new ArrayList<>(); + try { + DB db = openDB(context, DB_HISTORY); + String[] keys = db.findKeys(DB_PREFIX); + for(String key: keys) { + historyList.add(db.get(key)); + } + db.close(); + } catch (SnappydbException e) { + e.printStackTrace(); } - db.close(); - } catch (SnappydbException e) { - e.printStackTrace(); + return historyList; } - return historyList; } public static void saveHistory(Context context, String url){ - try { - DB db = openDB(context, DB_HISTORY); - db.put(getDbKey(url), url); - db.close(); - } catch (SnappydbException e) { - e.printStackTrace(); + synchronized (dbObject) { + try { + DB db = openDB(context, DB_HISTORY); + db.put(getDbKey(url), url); + db.close(); + } catch (SnappydbException e) { + e.printStackTrace(); + } } } diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBTokenUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBTokenUtil.java index 224bec3e..262ddc21 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBTokenUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBTokenUtil.java @@ -16,40 +16,46 @@ public class DBTokenUtil extends DBUtil { private static final String DB_TOKEN = "db_token"; public static void saveToken(Context context, TokenItem tokenItem){ - try { - DB db = openDB(context, DB_TOKEN); - db.put(getDbKey(tokenItem.name), tokenItem); - db.close(); - } catch (SnappydbException e) { - e.printStackTrace(); + synchronized (dbObject) { + try { + DB db = openDB(context, DB_TOKEN); + db.put(getDbKey(tokenItem.name), tokenItem); + db.close(); + } catch (SnappydbException e) { + e.printStackTrace(); + } } } public static boolean checkTokenExist(Context context, TokenItem tokenItem) { - try { - DB db = openDB(context, DB_TOKEN); - String[] keys = db.findKeys(getDbKey(tokenItem.name)); - db.close(); - return keys.length > 0; - } catch (SnappydbException e) { - e.printStackTrace(); + synchronized (dbObject) { + try { + DB db = openDB(context, DB_TOKEN); + String[] keys = db.findKeys(getDbKey(tokenItem.name)); + db.close(); + return keys.length > 0; + } catch (SnappydbException e) { + e.printStackTrace(); + } + return false; } - return false; } public static List getAllTokens(Context context) { - List tokenList = new ArrayList<>(); - try { - DB db = openDB(context, DB_TOKEN); - String[] keys = db.findKeys(DB_PREFIX); - for (String key: keys) { - tokenList.add(db.getObject(key, TokenItem.class)); + synchronized (dbObject) { + List tokenList = new ArrayList<>(); + try { + DB db = openDB(context, DB_TOKEN); + String[] keys = db.findKeys(DB_PREFIX); + for (String key: keys) { + tokenList.add(db.getObject(key, TokenItem.class)); + } + db.close(); + } catch (SnappydbException e) { + e.printStackTrace(); } - db.close(); - } catch (SnappydbException e) { - e.printStackTrace(); + return tokenList; } - return tokenList; } diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBUtil.java index d8980d9a..5b888fa0 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBUtil.java @@ -12,6 +12,8 @@ public class DBUtil { static final String DB_PREFIX = "neuron-"; + static final Object dbObject = new Object(); + static final Kryo kryo = new Kryo(); static { diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java index 7b9f5ae2..a7dea3bd 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBWalletUtil.java @@ -26,16 +26,18 @@ public class DBWalletUtil extends DBUtil { private static final String ETH = "ETH"; public static WalletItem getWallet(Context context, String walletName) { - if (TextUtils.isEmpty(walletName)) return null; - try { + synchronized (dbObject) { + if (TextUtils.isEmpty(walletName)) return null; + try { - DB db = openDB(context, DB_WALLET); - WalletItem walletItem = db.getObject(getDbKey(walletName), WalletItem.class); - db.close(); - return walletItem; - } catch (SnappydbException e) { - e.printStackTrace(); - return null; + DB db = openDB(context, DB_WALLET); + WalletItem walletItem = db.getObject(getDbKey(walletName), WalletItem.class); + db.close(); + return walletItem; + } catch (SnappydbException e) { + e.printStackTrace(); + return null; + } } } @@ -44,130 +46,146 @@ public static WalletItem getCurrentWallet(Context context) { } public static List getAllWalletName(Context context) { - List walletList = new ArrayList<>(); - try { - DB db = openDB(context, DB_WALLET); - String[] keys = db.findKeys(DB_PREFIX); - List walletItems = new ArrayList<>(); - for (String key : keys) { - walletItems.add(db.getObject(key, WalletItem.class)); - } - db.close(); - Collections.sort(walletItems, new Comparator() { - @Override - public int compare(WalletItem o1, WalletItem o2) { - return (int) (o2.timestamp - o1.timestamp); + synchronized (dbObject) { + List walletList = new ArrayList<>(); + try { + DB db = openDB(context, DB_WALLET); + String[] keys = db.findKeys(DB_PREFIX); + List walletItems = new ArrayList<>(); + for (String key : keys) { + walletItems.add(db.getObject(key, WalletItem.class)); + } + db.close(); + Collections.sort(walletItems, new Comparator() { + @Override + public int compare(WalletItem o1, WalletItem o2) { + return (int) (o2.timestamp - o1.timestamp); + } + }); + for (WalletItem walletItem : walletItems) { + walletList.add(walletItem.name); } - }); - for (WalletItem walletItem : walletItems) { - walletList.add(walletItem.name); + } catch (SnappydbException e) { + e.printStackTrace(); } - } catch (SnappydbException e) { - e.printStackTrace(); + return walletList; } - return walletList; } public static List getAllWallet(Context context) { - List walletItems = new ArrayList<>(); - try { - DB db = openDB(context, DB_WALLET); - String[] keys = db.findKeys(DB_PREFIX); - for (String key : keys) { - walletItems.add(db.getObject(key, WalletItem.class)); - } - db.close(); - Collections.sort(walletItems, new Comparator() { - @Override - public int compare(WalletItem o1, WalletItem o2) { - return (int) (o2.timestamp - o1.timestamp); + synchronized (dbObject) { + List walletItems = new ArrayList<>(); + try { + DB db = openDB(context, DB_WALLET); + String[] keys = db.findKeys(DB_PREFIX); + for (String key : keys) { + walletItems.add(db.getObject(key, WalletItem.class)); } - }); - } catch (SnappydbException e) { - e.printStackTrace(); + db.close(); + Collections.sort(walletItems, new Comparator() { + @Override + public int compare(WalletItem o1, WalletItem o2) { + return (int) (o2.timestamp - o1.timestamp); + } + }); + } catch (SnappydbException e) { + e.printStackTrace(); + } + return walletItems; } - return walletItems; } public static void saveWallet(Context context, WalletItem walletItem) { - try { - DB db = openDB(context, DB_WALLET); - db.put(getDbKey(walletItem.name), walletItem); - db.close(); - } catch (SnappydbException e) { - e.printStackTrace(); + synchronized (dbObject) { + try { + DB db = openDB(context, DB_WALLET); + db.put(getDbKey(walletItem.name), walletItem); + db.close(); + } catch (SnappydbException e) { + e.printStackTrace(); + } } } public static boolean updateWalletPassword(Context context, String name, String oldPassword, String newPassword) { - try { - DB db = openDB(context, DB_WALLET); - WalletItem walletItem = db.getObject(getDbKey(name), WalletItem.class); + synchronized (dbObject) { try { - String privateKey = AESCrypt.decrypt(oldPassword, walletItem.cryptPrivateKey); - walletItem.cryptPrivateKey = AESCrypt.encrypt(newPassword, privateKey); - } catch (GeneralSecurityException e) { + DB db = openDB(context, DB_WALLET); + WalletItem walletItem = db.getObject(getDbKey(name), WalletItem.class); + try { + String privateKey = AESCrypt.decrypt(oldPassword, walletItem.cryptPrivateKey); + walletItem.cryptPrivateKey = AESCrypt.encrypt(newPassword, privateKey); + } catch (GeneralSecurityException e) { + e.printStackTrace(); + return false; + } + db.put(getDbKey(name), walletItem); + db.close(); + } catch (SnappydbException e) { e.printStackTrace(); return false; } - db.put(getDbKey(name), walletItem); - db.close(); - } catch (SnappydbException e) { - e.printStackTrace(); - return false; + return true; } - return true; } public static void updateWalletName(Context context, String name, String newName) { - try { - DB db = openDB(context, DB_WALLET); - WalletItem walletItem = db.getObject(getDbKey(name), WalletItem.class); - db.del(getDbKey(name)); - walletItem.name = newName; - db.put(getDbKey(newName), walletItem); - db.close(); - } catch (SnappydbException e) { - e.printStackTrace(); + synchronized (dbObject) { + try { + DB db = openDB(context, DB_WALLET); + WalletItem walletItem = db.getObject(getDbKey(name), WalletItem.class); + db.del(getDbKey(name)); + walletItem.name = newName; + db.put(getDbKey(newName), walletItem); + db.close(); + } catch (SnappydbException e) { + e.printStackTrace(); + } } } public static boolean checkWalletName(Context context, String name) { - try { - DB db = openDB(context, DB_WALLET); - boolean isKeyExist = db.exists(getDbKey(name)); - db.close(); - return isKeyExist; - } catch (SnappydbException e) { - e.printStackTrace(); + synchronized (dbObject) { + try { + DB db = openDB(context, DB_WALLET); + boolean isKeyExist = db.exists(getDbKey(name)); + db.close(); + return isKeyExist; + } catch (SnappydbException e) { + e.printStackTrace(); + } + return false; } - return false; } public static boolean checkWalletAddress(Context context, String address) { - boolean isKeyExist = false; - try { - DB db = openDB(context, DB_WALLET); - List names = getAllWalletName(context); - for (String name : names) { - WalletItem walletItem = getWallet(context, name); - isKeyExist = (walletItem != null && walletItem.address.equals(address)); + synchronized (dbObject) { + boolean isKeyExist = false; + try { + DB db = openDB(context, DB_WALLET); + List names = getAllWalletName(context); + for (String name : names) { + WalletItem walletItem = getWallet(context, name); + isKeyExist = (walletItem != null && walletItem.address.equals(address)); + } + db.close(); + return isKeyExist; + } catch (SnappydbException e) { + e.printStackTrace(); } - db.close(); return isKeyExist; - } catch (SnappydbException e) { - e.printStackTrace(); } - return isKeyExist; } public static void deleteWallet(Context context, String name) { - try { - DB db = openDB(context, DB_WALLET); - db.del(getDbKey(name)); - db.close(); - } catch (SnappydbException e) { - e.printStackTrace(); + synchronized (dbObject) { + try { + DB db = openDB(context, DB_WALLET); + db.del(getDbKey(name)); + db.close(); + } catch (SnappydbException e) { + e.printStackTrace(); + } } } diff --git a/app/src/main/res/layout/activity_transaction_list.xml b/app/src/main/res/layout/activity_transaction_list.xml index 12ffd425..ce7a0b68 100644 --- a/app/src/main/res/layout/activity_transaction_list.xml +++ b/app/src/main/res/layout/activity_transaction_list.xml @@ -11,8 +11,7 @@ android:layout_width="match_parent" android:layout_height="48dp" android:background="@color/colorPrimary" - app:isShowLeft="true" - app:title="@string/title_transaction" /> + app:isShowLeft="true"/> 请输入应用网址 ID:%s + 余额:%s 请允许我们使用权限:\n\n%1$s From b99635cea1577643682d2841542b894d57bc7a2f Mon Sep 17 00:00:00 2001 From: baojun Date: Wed, 8 Aug 2018 14:34:30 +0800 Subject: [PATCH 065/121] update splash ui --- .../ic_splash_nervos_center_logo.png | Bin 0 -> 15051 bytes .../ic_splash_nervos_center_logo.png | Bin 0 -> 25898 bytes app/src/main/res/layout/activity_splash.xml | 84 ++++++++---------- 3 files changed, 38 insertions(+), 46 deletions(-) create mode 100644 app/src/main/res/drawable-xhdpi/ic_splash_nervos_center_logo.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_splash_nervos_center_logo.png diff --git a/app/src/main/res/drawable-xhdpi/ic_splash_nervos_center_logo.png b/app/src/main/res/drawable-xhdpi/ic_splash_nervos_center_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0372ec5fdfedb3b594f0f76ea9b57c0821129c05 GIT binary patch literal 15051 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_splash_nervos_center_logo.png b/app/src/main/res/drawable-xxhdpi/ic_splash_nervos_center_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f90bf9295c6dcfd70dfc363b078013331c8d6b6e GIT binary patch literal 25898 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml index bb54894c..3135e710 100644 --- a/app/src/main/res/layout/activity_splash.xml +++ b/app/src/main/res/layout/activity_splash.xml @@ -11,7 +11,7 @@ android:layout_height="0dp" android:layout_weight="3" /> - + android:src="@drawable/ic_splash_nervos_center_logo" /> - - - + android:layout_alignParentBottom="true"> - + - + - + - + + - - From ba1969ac0b45424154082120685659804cff1275 Mon Sep 17 00:00:00 2001 From: baojun Date: Wed, 8 Aug 2018 17:17:23 +0800 Subject: [PATCH 066/121] update about_us ui --- app/src/main/res/layout/activity_about_us.xml | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index c5cf269f..51e19706 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -18,14 +18,13 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white" - android:orientation="vertical" - android:paddingBottom="10dp" - android:paddingTop="10dp"> + android:orientation="vertical"> @@ -36,7 +35,7 @@ android:layout_gravity="center_horizontal" android:layout_marginTop="5dip" android:text="@string/app_name" - android:textColor="@color/default_black" + android:textColor="@color/font_title" android:textSize="16sp" /> @@ -91,28 +90,29 @@ app:icon="@drawable/ic_about_us_open_sea" app:name="Open Sea" app:other1="false" /> - + + - + android:textColor="@color/default_gray_9" + android:textSize="12sp" /> + + android:scaleType="centerInside" + android:src="@drawable/neuron_logo" /> + android:textColor="@color/default_gray_9" + android:textSize="12sp" /> \ No newline at end of file From ae28f2190390bcd6bc06075a6488e851ed142b94 Mon Sep 17 00:00:00 2001 From: baojun Date: Wed, 8 Aug 2018 17:40:14 +0800 Subject: [PATCH 067/121] update setting_button ui currency list ui --- app/src/main/res/layout/item_currency.xml | 8 ++++---- app/src/main/res/layout/view_setting_button.xml | 15 +++++++-------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/layout/item_currency.xml b/app/src/main/res/layout/item_currency.xml index 1db24a0f..9331f4db 100644 --- a/app/src/main/res/layout/item_currency.xml +++ b/app/src/main/res/layout/item_currency.xml @@ -10,7 +10,7 @@ android:id="@+id/tv_currency" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="12dip" + android:layout_marginLeft="15dip" android:text="CNY" android:textColor="@color/font_title_second" android:textSize="16sp" @@ -22,7 +22,7 @@ android:id="@+id/iv_chosen" android:layout_width="22dip" android:layout_height="22dip" - android:layout_marginRight="12dip" + android:layout_marginRight="15dip" android:src="@drawable/ic_currency_selected" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" @@ -33,8 +33,8 @@ diff --git a/app/src/main/res/layout/view_setting_button.xml b/app/src/main/res/layout/view_setting_button.xml index 6408a644..8ea8bc13 100644 --- a/app/src/main/res/layout/view_setting_button.xml +++ b/app/src/main/res/layout/view_setting_button.xml @@ -11,7 +11,7 @@ android:id="@+id/iv_setting_icon" android:layout_width="20dip" android:layout_height="20dip" - android:layout_marginLeft="12dip" + android:layout_marginLeft="15dip" android:background="@mipmap/ic_launcher" android:contentDescription="@null" android:scaleType="centerInside" @@ -33,10 +33,9 @@ Date: Wed, 8 Aug 2018 17:46:19 +0800 Subject: [PATCH 068/121] update token list ui --- app/src/main/res/layout/fragment_token_list.xml | 4 ++-- app/src/main/res/layout/item_token_list.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/fragment_token_list.xml b/app/src/main/res/layout/fragment_token_list.xml index 359dd1c8..943df3c2 100644 --- a/app/src/main/res/layout/fragment_token_list.xml +++ b/app/src/main/res/layout/fragment_token_list.xml @@ -25,7 +25,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" - android:layout_marginLeft="20dp" + android:layout_marginLeft="15dp" android:text="@string/wallet_token_total_money" android:textColor="@color/font_title_second" android:textSize="14sp" /> @@ -47,7 +47,7 @@ android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginBottom="10dip" - android:layout_marginRight="20dp" + android:layout_marginRight="15dp" android:layout_marginTop="10dip" android:src="@drawable/ic_wallet_token_add" /> diff --git a/app/src/main/res/layout/item_token_list.xml b/app/src/main/res/layout/item_token_list.xml index 2eb73bab..a2869701 100644 --- a/app/src/main/res/layout/item_token_list.xml +++ b/app/src/main/res/layout/item_token_list.xml @@ -7,8 +7,8 @@ android:id="@+id/root" android:layout_width="match_parent" android:layout_height="0dp" - android:paddingRight="16dp" - android:paddingStart="16dp" + android:paddingEnd="15dp" + android:paddingStart="15dp" app:layout_constraintDimensionRatio="h,375:68"> Date: Wed, 8 Aug 2018 22:15:42 +0800 Subject: [PATCH 069/121] add cache to webview --- .../neuron/activity/AppWebActivity.java | 6 +---- .../neuron/activity/TransferActivity.java | 2 -- .../neuron/service/NervosRpcService.java | 1 - .../org/nervos/neuron/util/NetworkUtil.java | 24 +++++++++++++++++++ .../nervos/neuron/util/db/DBChainUtil.java | 2 -- .../nervos/neuron/util/web/WebAppUtil.java | 7 +++++- 6 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/org/nervos/neuron/util/NetworkUtil.java diff --git a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java index 328fea3e..bb77f36e 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java @@ -146,8 +146,6 @@ private void initInjectWebView() { webView.setRpcUrl(HttpUrls.ETH_NODE_IP); webView.setWalletAddress(new Address(walletItem.address)); - webView.addJavascriptInterface(new NeuronAccount(), "neuronAccount"); - webView.addJavascriptInterface(new Neuron(), "neuron"); webView.setOnSignTransactionListener(transaction -> { @@ -171,15 +169,13 @@ public void onSignPersonalMessage(Message message) { }); } - private class NeuronAccount { + private class Neuron { @JavascriptInterface public String getAccount() { return walletItem.address; } - } - private class Neuron { @JavascriptInterface public String getAccounts() { List walletItems = DBWalletUtil.getAllWallet(mActivity); diff --git a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java index 3d22d171..221a0326 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java @@ -2,7 +2,6 @@ import android.annotation.SuppressLint; import android.content.Intent; -import android.os.Build; import android.os.Bundle; import android.support.design.widget.BottomSheetDialog; import android.support.v7.widget.AppCompatButton; @@ -25,7 +24,6 @@ import android.widget.Toast; import org.nervos.neuron.custom.TitleBar; -import org.nervos.neuron.item.ChainItem; import org.nervos.neuron.item.CurrencyItem; import org.nervos.neuron.item.TokenItem; import org.nervos.neuron.item.WalletItem; diff --git a/app/src/main/java/org/nervos/neuron/service/NervosRpcService.java b/app/src/main/java/org/nervos/neuron/service/NervosRpcService.java index 1667a1a0..929d1c0a 100644 --- a/app/src/main/java/org/nervos/neuron/service/NervosRpcService.java +++ b/app/src/main/java/org/nervos/neuron/service/NervosRpcService.java @@ -7,7 +7,6 @@ import org.nervos.neuron.item.TokenItem; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.util.ConstUtil; -import org.nervos.neuron.util.LogUtil; import org.nervos.neuron.util.NumberUtil; import org.nervos.neuron.crypto.AESCrypt; import org.nervos.neuron.util.db.DBWalletUtil; diff --git a/app/src/main/java/org/nervos/neuron/util/NetworkUtil.java b/app/src/main/java/org/nervos/neuron/util/NetworkUtil.java new file mode 100644 index 00000000..b1eb362e --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/util/NetworkUtil.java @@ -0,0 +1,24 @@ +package org.nervos.neuron.util; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; + +public class NetworkUtil { + + public static boolean isNetworkAvailable(Context context) { + ConnectivityManager connectivity = (ConnectivityManager) context + .getSystemService(Context.CONNECTIVITY_SERVICE); + if (connectivity != null) { + NetworkInfo[] info = connectivity.getAllNetworkInfo(); + if (info != null) { + for (NetworkInfo anInfo : info) { + if (anInfo.getState() == NetworkInfo.State.CONNECTED) { + return true; + } + } + } + } + return false; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java index dc53f030..84bb4525 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java @@ -1,10 +1,8 @@ package org.nervos.neuron.util.db; import android.content.Context; -import android.util.Log; import com.snappydb.DB; -import com.snappydb.DBFactory; import com.snappydb.SnappydbException; import org.nervos.neuron.item.ChainItem; diff --git a/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java b/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java index 4919b625..7b526fe0 100644 --- a/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java @@ -25,6 +25,7 @@ import org.nervos.neuron.service.NervosRpcService; import org.nervos.neuron.util.ConstUtil; import org.nervos.neuron.util.LogUtil; +import org.nervos.neuron.util.NetworkUtil; import org.nervos.neuron.util.db.DBAppUtil; import org.nervos.neuron.util.db.DBChainUtil; import org.nervos.neuron.util.db.DBWalletUtil; @@ -202,7 +203,6 @@ public static AppItem getAppItem() { @SuppressLint("SetJavaScriptEnabled") public static void initWebSettings(WebSettings webSettings) { - webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setLoadsImagesAutomatically(true); @@ -218,6 +218,11 @@ public static void initWebSettings(WebSettings webSettings) { } public static void initWebViewCache(Context context, WebSettings webSettings) { + if (NetworkUtil.isNetworkAvailable(context)) { + webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); + } else { + webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); + } String cacheDirPath = context.getFilesDir().getAbsolutePath()+"cache/"; webSettings.setAppCachePath(cacheDirPath); webSettings.setAppCacheEnabled(true); From 1d1e349c5e33e6d169174e29e612ebdee4cdc668 Mon Sep 17 00:00:00 2001 From: baojun Date: Thu, 9 Aug 2018 17:48:52 +0800 Subject: [PATCH 070/121] change wallet animation fingerprint setting toast bug wallet top view bigger clickable area --- .../nervos/neuron/custom/WalletTopView.java | 29 ++++--- .../neuron/fragment/SettingsFragment.java | 2 +- app/src/main/res/anim/wallet_activity_in.xml | 2 +- app/src/main/res/anim/wallet_activity_out.xml | 2 +- app/src/main/res/layout/view_wallet_top.xml | 83 ++++++++++++------- 5 files changed, 74 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java b/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java index 42a0962c..54f40d0f 100644 --- a/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java +++ b/app/src/main/java/org/nervos/neuron/custom/WalletTopView.java @@ -10,6 +10,7 @@ import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; +import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; @@ -28,7 +29,7 @@ */ public class WalletTopView extends ConstraintLayout implements View.OnClickListener { - private ImageView leftImage, centerImage, rightImage, copyImage; + private RelativeLayout leftRl, centerRl, rightRl, copyRl; private CircleImageView walletPhoto; private TextView walletName, walletAddress; private Activity context; @@ -46,10 +47,10 @@ public void setActivity(Activity activity) { } private void initView() { - leftImage = findViewById(R.id.iv_left); - centerImage = findViewById(R.id.iv_center); - rightImage = findViewById(R.id.iv_right); - copyImage = findViewById(R.id.iv_copy); + leftRl = findViewById(R.id.rl_left); + centerRl = findViewById(R.id.rl_center); + rightRl = findViewById(R.id.rl_right); + copyRl = findViewById(R.id.rl_copy); walletPhoto = findViewById(R.id.wallet_photo); walletName = findViewById(R.id.qrcode_wallet_name); walletAddress = findViewById(R.id.qrcode_wallet_address); @@ -60,11 +61,12 @@ private void initData() { } private void initAction() { - leftImage.setOnClickListener(this); - rightImage.setOnClickListener(this); - copyImage.setOnClickListener(this); - centerImage.setOnClickListener(this); + leftRl.setOnClickListener(this); + rightRl.setOnClickListener(this); + copyRl.setOnClickListener(this); + centerRl.setOnClickListener(this); walletPhoto.setOnClickListener(this); + walletAddress.setOnClickListener(this); } public void setWalletItem(WalletItem walletItem) { @@ -78,20 +80,21 @@ public void setWalletItem(WalletItem walletItem) { @Override public void onClick(View view) { switch (view.getId()) { - case R.id.iv_left: + case R.id.rl_left: Intent intent = new Intent(context, ReceiveQrCodeActivity.class); context.startActivity(intent); break; - case R.id.iv_right: + case R.id.rl_right: Intent intent1 = new Intent(context, QrCodeActivity.class); context.startActivity(intent1); break; - case R.id.iv_center: + case R.id.rl_center: Intent intent2 = new Intent(context, ChangeWalletActivity.class); context.startActivity(intent2); context.overridePendingTransition(R.anim.wallet_activity_in, 0); break; - case R.id.iv_copy: + case R.id.rl_copy: + case R.id.qrcode_wallet_address: ClipboardManager cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); ClipData mClipData = ClipData.newPlainText("qrCode", walletItem.address); if (cm != null) { diff --git a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java index c786fae1..0a3fcdd9 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/SettingsFragment.java @@ -117,7 +117,7 @@ public void onAuthenticationSucceeded() { @Override public void onAuthenticationFailed() { - Toast.makeText(getContext(), getResources().getString(R.string.fingerprint_setting_sucess), Toast.LENGTH_SHORT).show(); + Toast.makeText(getContext(), getResources().getString(R.string.fingerprint_setting_failed), Toast.LENGTH_SHORT).show(); } }; diff --git a/app/src/main/res/anim/wallet_activity_in.xml b/app/src/main/res/anim/wallet_activity_in.xml index 2c77041a..f5aa59b8 100644 --- a/app/src/main/res/anim/wallet_activity_in.xml +++ b/app/src/main/res/anim/wallet_activity_in.xml @@ -2,6 +2,6 @@ \ No newline at end of file diff --git a/app/src/main/res/anim/wallet_activity_out.xml b/app/src/main/res/anim/wallet_activity_out.xml index f5da6e64..89336f62 100644 --- a/app/src/main/res/anim/wallet_activity_out.xml +++ b/app/src/main/res/anim/wallet_activity_out.xml @@ -3,5 +3,5 @@ + android:toYDelta="100%p" /> \ No newline at end of file diff --git a/app/src/main/res/layout/view_wallet_top.xml b/app/src/main/res/layout/view_wallet_top.xml index d0e7a2cf..08702d8f 100644 --- a/app/src/main/res/layout/view_wallet_top.xml +++ b/app/src/main/res/layout/view_wallet_top.xml @@ -11,36 +11,56 @@ android:background="@color/colorPrimary" app:layout_constraintTop_toTopOf="parent"> - + app:layout_constraintTop_toTopOf="parent"> + + + - + app:layout_constraintTop_toTopOf="parent"> + + + - + app:layout_constraintTop_toTopOf="parent"> + + - + app:layout_constraintTop_toTopOf="@id/qrcode_wallet_address"> + + + From 5065820bc6b335745b3319fb19dfedb0ca030964 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Fri, 10 Aug 2018 09:34:47 +0800 Subject: [PATCH 071/121] update wallet moudle ui error --- app/release/output.json | 2 +- .../org/nervos/neuron/service/HttpUrls.java | 9 +- .../nervos/neuron/service/TokenService.java | 2 +- .../main/res/drawable-xhdpi/black_back.png | Bin 1075 -> 1114 bytes .../res/drawable-xhdpi/ic_wallet_default.png | Bin 926 -> 1385 bytes .../main/res/drawable-xhdpi/right_arrow.png | Bin 613 -> 334 bytes .../res/drawable-xhdpi/tab_wallet_default.png | Bin 700 -> 739 bytes .../main/res/drawable-xxhdpi/arrow_right.png | Bin 336 -> 0 bytes .../main/res/drawable-xxhdpi/black_back.png | Bin 1584 -> 1696 bytes .../res/drawable-xxhdpi/ic_wallet_default.png | Bin 1160 -> 2479 bytes .../main/res/drawable-xxhdpi/right_arrow.png | Bin 907 -> 443 bytes .../drawable-xxhdpi/tab_wallet_default.png | Bin 1123 -> 1191 bytes .../drawable-xxxhdpi/app_wallet_default.png | Bin 1135 -> 0 bytes app/src/main/res/drawable-xxxhdpi/arrow.png | Bin 473 -> 0 bytes .../main/res/drawable-xxxhdpi/arrow_right.png | Bin 437 -> 0 bytes app/src/main/res/drawable-xxxhdpi/chain.png | Bin 3809 -> 0 bytes .../res/drawable-xxxhdpi/dialog_close.png | Bin 2057 -> 0 bytes app/src/main/res/drawable-xxxhdpi/empty.png | Bin 101705 -> 0 bytes .../main/res/drawable-xxxhdpi/ether_big.png | Bin 8500 -> 0 bytes .../main/res/drawable-xxxhdpi/ether_small.png | Bin 4020 -> 0 bytes app/src/main/res/drawable-xxxhdpi/export.png | Bin 2034 -> 0 bytes app/src/main/res/drawable-xxxhdpi/input.png | Bin 5340 -> 0 bytes .../res/drawable-xxxhdpi/receive_token.png | Bin 3113 -> 0 bytes .../res/drawable-xxxhdpi/tab_app_default.png | Bin 1321 -> 0 bytes .../res/drawable-xxxhdpi/tab_app_selected.png | Bin 1339 -> 0 bytes .../drawable-xxxhdpi/tab_settings_default.png | Bin 2493 -> 0 bytes .../tab_settings_selected.png | Bin 2630 -> 0 bytes .../tab_transaction_default.png | Bin 1010 -> 0 bytes .../tab_transaction_selected.png | Bin 1028 -> 0 bytes .../drawable-xxxhdpi/tab_wallet_default.png | Bin 1420 -> 0 bytes .../drawable-xxxhdpi/tab_wallet_selected.png | Bin 1394 -> 0 bytes .../res/drawable-xxxhdpi/token_manage.png | Bin 3746 -> 0 bytes .../drawable/add_wallet_log_corner_shape.xml | 2 +- .../res/drawable/button_blue_line_shape.xml | 2 +- .../res/drawable/button_corner_blue_shape.xml | 2 +- .../drawable/button_corner_gray_f_shape.xml | 2 +- .../res/drawable/button_corner_gray_shape.xml | 2 +- .../main/res/drawable/edit_input_shape.xml | 2 + .../drawable/token_image_circle_border.xml | 7 ++ .../main/res/drawable/wallet_item_corner.xml | 12 ++ .../main/res/layout/activity_add_token.xml | 36 ++---- .../res/layout/activity_backup_mnemonic.xml | 9 +- .../res/layout/activity_change_password.xml | 11 +- .../res/layout/activity_create_wallet.xml | 3 +- .../res/layout/activity_export_keystore.xml | 3 +- .../main/res/layout/activity_import_chain.xml | 36 ------ .../res/layout/activity_import_wallet.xml | 9 +- .../main/res/layout/activity_pay_token.xml | 19 ++- .../res/layout/activity_wallet_manage.xml | 28 ++--- app/src/main/res/layout/custom_titlebar.xml | 9 +- .../res/layout/dialog_confirm_transfer.xml | 31 +++-- .../res/layout/fragment_import_keystore.xml | 26 +--- .../res/layout/fragment_import_mnemonic.xml | 53 +++----- .../layout/fragment_import_private_key.xml | 33 ++--- .../main/res/layout/fragment_token_list.xml | 26 ++-- app/src/main/res/layout/fragment_wallets.xml | 12 +- app/src/main/res/layout/item_collection.xml | 13 +- app/src/main/res/layout/item_token_list.xml | 118 +++++++++--------- app/src/main/res/layout/item_wallet.xml | 20 ++- app/src/main/res/layout/item_wallet_add.xml | 2 +- .../main/res/layout/view_setting_button.xml | 2 +- app/src/main/res/layout/view_wallet_top.xml | 3 +- app/src/main/res/values/colors.xml | 10 +- app/src/main/res/values/strings.xml | 2 +- app/src/main/res/values/styles.xml | 4 +- 65 files changed, 241 insertions(+), 321 deletions(-) delete mode 100644 app/src/main/res/drawable-xxhdpi/arrow_right.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/app_wallet_default.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/arrow.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/arrow_right.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/chain.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/dialog_close.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/empty.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ether_big.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ether_small.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/export.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/input.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/receive_token.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/tab_app_default.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/tab_app_selected.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/tab_settings_default.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/tab_settings_selected.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/tab_transaction_default.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/tab_transaction_selected.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/tab_wallet_default.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/tab_wallet_selected.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/token_manage.png create mode 100644 app/src/main/res/drawable/token_image_circle_border.xml create mode 100644 app/src/main/res/drawable/wallet_item_corner.xml delete mode 100644 app/src/main/res/layout/activity_import_chain.xml diff --git a/app/release/output.json b/app/release/output.json index f5036503..c90e8d88 100644 --- a/app/release/output.json +++ b/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":6,"versionName":"0.5.2.180726","enabled":true,"outputFile":"neuron_v0.5.2.180726.apk","fullName":"release","baseName":"release"},"path":"neuron_v0.5.2.180726.apk","properties":{}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":6,"versionName":"0.5.2.180809","enabled":true,"outputFile":"neuron_v0.5.2.180809.apk","fullName":"release","baseName":"release"},"path":"neuron_v0.5.2.180809.apk","properties":{}}] \ No newline at end of file diff --git a/app/src/main/java/org/nervos/neuron/service/HttpUrls.java b/app/src/main/java/org/nervos/neuron/service/HttpUrls.java index 7e06fb6e..d8dc82eb 100644 --- a/app/src/main/java/org/nervos/neuron/service/HttpUrls.java +++ b/app/src/main/java/org/nervos/neuron/service/HttpUrls.java @@ -25,8 +25,13 @@ public class HttpUrls { // discover page config information - public static final String DISCOVER_URL = "http://47.97.171.140:8866/dapps"; - public static final String INNER_URL = "http://47.97.171.140:8866/"; +// public static final String DISCOVER_URL = "http://47.97.171.140:8866/dapps"; +// public static final String INNER_URL = "http://47.97.171.140:8866/"; + + public static final String DISCOVER_URL = "http://192.168.2.93:3000/dapps"; + public static final String INNER_URL = "http://192.168.2.93:3000/"; + + //Token Currency ID Price diff --git a/app/src/main/java/org/nervos/neuron/service/TokenService.java b/app/src/main/java/org/nervos/neuron/service/TokenService.java index fa985e6c..da0a32b6 100644 --- a/app/src/main/java/org/nervos/neuron/service/TokenService.java +++ b/app/src/main/java/org/nervos/neuron/service/TokenService.java @@ -131,7 +131,7 @@ public static Observable getCollectionList(Context context) @Override public CollectionResponse call() throws Exception { Request request = new Request.Builder() - .url(HttpUrls.COLLECTION_LIST_URL + walletItem.address).build(); + .url(HttpUrls.COLLECTION_LIST_URL + "0x0239769a1adf4def9f07da824b80b9c4fcb59593").build(); Call call = NervosHttpService.getHttpClient().newCall(request); String response = ""; try { diff --git a/app/src/main/res/drawable-xhdpi/black_back.png b/app/src/main/res/drawable-xhdpi/black_back.png index 7d84898a7090136d9f1cc645128316763483ca24..59eb68ba5c6637b6775c7cfdd5e7b17350c3f7a6 100644 GIT binary patch literal 1114 zcmV-g1f~0lP)Px(6iGxuR7efAmihw;0|b^jW5g8hElc+nr0hr>JM{nZUOqjy^rT~Uc5j{xurh8Ja6ZG zp6@;PoabJE|EUS}iC(2>T>+J^BG-jPFbFaesI~<(fiJVC>WPN6&mnP>Mp$ ziaUIv6Dsg1K7KO;_E}$-^U~PZ7)Io2s|oDx4fcZyF@!o%=@98$|J-z1-Ya6*ZCchh%UgLH#oV}(zCPTArQ?WM?c^;v&1jRD_#nAwf zTA?JORMI}*g+oP^9-nuh()mV<6iTJ09+_2Xv=^|VT2wVhW$MK|U9dT|D>nw^&v6Wk&-p2bk4 zIp^NOdST!2E$P;Ia_FGC1~Dw*UOZ&kDp?0_Ca3-|tCsAyfN7xwUu97aybrfCf{hI> z&(Hi$duG~Z9_vm^KgAx{9KsN#9j2d0E$}!Mj=sOweurY+v8U$^=Q_{f#}ZybnnoE@hLn%gEw4&;2?;D*|c)68kF{Tgu>{wxH$39ZnX!g#7p;wR*2Ij zWwfa@-W5zvsnl1G5FWxi`De_Q_B?3u?m+NpC7`~(YbbOh>H~pb^Wz+!#v(e2hupSF zAm2zve>K_|$9o3<2M7F5;{)h;$7+-0oAZ+^MxZ`61tur=z_5d@7N@X6U%}~$RTSl= z)RjB5XKbdyAcl!BtPx# literal 1075 zcmV-31kC%1P)Px&?MXyIR9FeMm)~7?Npf%R%h|ho z&iUkf?*0nE20g>0m6r?UgYS2y=bas1yyr%zvOWXPGGHH>iTrG{Uj13+^&FUgWpYb^ z^K*!}6A(Bc9x;>oYO}Tm6`lfz%aybbjPnE;SBenO2gqLJ@yu5b7Vi9Gr~$XOSlp8W z;6IS6b(qX4gt&zuj@57exGdj20j5inN$~r>M}P^LR6Rn#?CQ$u(c81ve^Gs|ftk@t zV!&W$N!dP?R9dO56DIpz0dwVvcmVhr%Clc4Q;(H0HO5q8Fjy&fbr6J6#e1v z0Prvy#v$yoXUdpJ)IRZ189RndVc8bb)R1fM$nTods=5iCEU^Mh4O^|n#v$Xvx zQ#mYww9bNjfPF!`{=3RigE_7<-QTMHe_*K;;68Se&a?OQfL>>#9;>(8fdni0^CxJ6 z9Mhe=g2|lEfaS8k2-7bzY4MXChd*0dcT|Y`e`BPShh-p zj9KP5P`Ae;O zwdEnu9!h)a5My{SmKY)E++sga3xz6;jZ(lg13X|xw_a>EZ!anDZmk1Qrm%q`YypGq z51S(wmKNsLF1Q{6?V)sq&v1^Dk$8rnce;i?N1^)N)=KG{W)0-~qN)5$t5&_Qyq#>9 zKzpThgyl%>p3RZMg;s0sFDIBB>j7vFCE!*xV0R#vo4MbZf8Ye|5$FI#c)`!vcxW&= zyl+V%^S?WE1XJCFV+6Ag!T!vhf;Y*xG;8Z3T3Ak7v~>!Ds=&LfFc%n zfR9DPG<#dsHmFOWJ(M>5BKp{?7)wn*Y~1}@DfIwo52f?86g2$X2s)#n9swPo0HZv_7WG%E^vAzx`=GT9thsDpUxy4F+?XmLM5G(&G6w6beQ1Z4a{tFFmz7Hp}Pa^;T002ovPDHLkV1mXw0|x*A diff --git a/app/src/main/res/drawable-xhdpi/ic_wallet_default.png b/app/src/main/res/drawable-xhdpi/ic_wallet_default.png index 4648665f15e19df45776ffb7229d653e829728fe..5130eef5bbbaaf2495c72164eccebcee00a7096d 100644 GIT binary patch delta 1379 zcmV-p1)Tbx2k8os7k?-S1^@s6k~fIn00004XF*Lt006O%3;baP000FbNkl82JE%51>gC6JI3t5){RWqG`|} zY16b8I)qxGr4Fr>@lvcoBZMdzybv#3wB4@%|LnD9pQ%+^#(x=iGH0*7_FDV@+iRb+ zdqzTR&%YBY@;_=F#&UR8x?kuEWgEAq& zu)W=I4rU+=3U{C?+g{xpo;F`QdI!^!6v?Y5e=aE8QR#VoAZ%?16f_+SOnQ`pBL(D@ zE0R^Fq_;E>o`1wttDA%2w~NwI zsY+Slx^>vH=3rhirLn5ttlF@UI{ou8*w68>}N<@!UjGX3sIxDz4&Wq&JzsS>M{C|bn`sB~w(m$e@p zm)f36xIGDLy6Iq6nZlbNL9K#z#NT`?H%}aw&-;eMElnqi3pyCb@f-~VK2(fAYN!5_ zr)AyId6^%Y2{$pf$qxtPkwMugq7W)cAbpUVgZ#)(d@WrcPRRUgGvT@>b4llt1q~oh z7;xnAaDVt07e#7c%KFYVGN;$N4Ox~ohI#x-4X>CdqAW?({M}PGR0#?j8;Ef;C*-bY zc1lg%O=}KDfGEV{v%MRn^^MZ-YwVFvs2M=nh5>RRRzM^G6PXIRi?8EeGN5N50;I_f5){-oDje(H+c$ z2}Py+cwkyf0TItw($&FjLyHPGJR#d&+_SnXx`Ww{p%b;JVSc~?BpowOofeN6%v;QY zUVqWwpOBuH%PYU4JD69@DiKA@Pf>l?7~-rLe3*=lm5dI=T>eAh4omNj^2)C04#r(# z>)0_w0H`0^J)F?vTt1Dc+z~-?M?J^lFJ6*tWKv2y_FnxJ-NCphK-8d4B=8C$z?7oR zkm%zEkgrb5;pPylzF&Tqj{TET-r0Y3SAX;(7__lC7K_a)MzM6l0<@<)0(u;r`mub3 z|EyQ^(J2`z_5b@7-NAg9CJrHO@Y93{9dvVGe)P2KQ+d_Y$^1A8$n!r*=l-gUztR8C zS9Axv@djNL%2*5nq|i?LXcqnT5JVRm@|hEJt!lRU@AQhU-yf#m8d&~{?qFTF>VIm! zVqM28rgIRp#jR&fobxPOM|+qS3qXv~PMwvt2WO>L8vOe!x`S=pkS8FMyN$!NV$sEp zB2k4ENs>6mT=a3QLxVE^S7(;LqB~gkgZg^`Mp!HnvE8bd3%dw55aTH5s)*Evxx{BN zOo@Kv&!3WY<2Aja4;8QI4tB?FB7cuP#3c(atV2eKJR*5UfP|r*pX4NFVdGfovy;-b zZ?1SncQ6Dz^|;9WcjtLl4d1mYlfejdKokB%m9~!QvREvx4RdhWDOeBxu`gu(+&Hi3 zOwI5UEVJT6e}ab lvS7?;A7wUJ|q^j|rrCR1=RXAb}X002ovPDHLkV1iguqZR-F literal 926 zcmZvaYe-XZ7{-syZp!FpncBr}CV9zbfGAU zEshq%lhcRX>*ukEHu^m-Acs?Cd=%fQ?Unxt;^nf~1R*KLXF_I%%m~^9X(ps*#F;=7 zH8LjF$Uq)r4WKB*7!aceF9#AmBu0q!h}J`_gT%lnA=-f`3(;D}^NfhnB1#8QhJ!Q+ zGayWdNXw`|4FOS7Nrgbe5cv;&8u+P*aKO{dn20p+QXQzlQzPsU!d2L%Lb#ey0;$ZP zLTCy?mDrhr9ZG~A!cHY)LWm|KBpJa9#uMc#z~g~7Kx$(4C0jEq|6Rv0vxShPB_aPM zBr!-Z9vSDDNCuH9q$g>`IS9Y!g=6HknzG_)Ikj5jjUzw~a*+=>;kGl%Q9c)Vil?r4 zxeyI#ScZ0B6}mTI00V&-!AS7WNMHgJQv3pvFs%V;k^>+&AGd*WXZPCwU#5MQMm_nq z$Han&gd^6xYhSr9j4N_Wt|xNe`L0v@FY)kbKm9u4?ppKwCqixyPN)h7wZoIgr>uSB z*7x=hk!WRh{eWlXnLO5#>LB-EjVsIBw*AW}RopUMnR4p4+{y1Pi@NH5lhb#U6TWp@ zM(3Q_-5;zT8;5+_6wWse2I*LJ)!vI;HU}o!*7#ls@G{fVTK4>uiP!heu$SqUFWS;I zS#w_3?@5b3KIjOtp3`dwm8UxSd@uT1ML-x`QPe6Dlr)cB{#H`_DDTql@B0Hv^%kw$ zGn?Vl*4sY|#zG4mKa-ZmKWW z?s#`YwMSRjDM;FC>3&=`tEnwc`=-Zi|81w_Q(RS%;>aIopJlrl*EQ>IjabL+mGq9)n;<)0wkxdVKzdb+ZT!m7sUP|s(D z=&j&q8mht(J*)E$kZ*)YI$xuzx)>#l)n@IUZ#*>-%$7|eS&2}dnJ0r@dx&&xk4Z=i zbtn;<&`)TCzB!;RdV?+~hOX!V(;z@~b7cN`xR@|SR{d7TN=N-(dt^%f@BAGlamNbr SF$qZk0000Px%A4x<(R5%fhl;2BJ zVHn51&vwqHBcy^#Npcr?Qx^pW5rvAYscT>mLYG|y{TJPL-@g!1psbv(=wc8=5K%-} zSmJ8BHlkvJl52bVKGP%n;f_6Uc;ELt&*%Mq-)OPL{pm#&OrGwUf1#LENqA z1Zb}VWKtW{L2ILLIozkcq_r2H*xG`8YE)>Q*TKb?xW`7e-^VX@#g*?F`OsR}y56>` nxXf!R)8fQxTHdx6?X~^~5p}f(bt}=?00000NkvXXu0mjfKDH(- diff --git a/app/src/main/res/drawable-xhdpi/tab_wallet_default.png b/app/src/main/res/drawable-xhdpi/tab_wallet_default.png index ac4630d116bde180abc7d3d2acd1da0c424a6931..f476310ee8b2cd5bfae1f77d1283819b2391ba58 100644 GIT binary patch delta 699 zcmV;s0!0111>*&fG=G{&L_t(o3GJCpXcIvc$KTu38jz|;G$|?t?TW>u;1_xjEi_c{ zAP9OA{J8Yup_hsW5kdtIB7#>>y?F8>f(mKHpeM0Ka05zX3zbTmRs}(!Ce1$QO`6&r zg>KDevw@jIcHYa||NHTu**(kxG}*u^ui4#q1j_au5g#U?^?%iTJ+27&OX$9VkTIBh zmwvsL9ujzOBAF=LFeX4-*K%{MwF0~tGT_h$Yt(Y9)xw2~HrxaOD+KOu-@0QUlNnxc zEAT&cJw2DgpXX=p34{6<35JBm8Mivp;m&yPED%J)xFMF!J}$Vuxt6+k{B(4Ie$E0y z;bZoB%&nFo3x5SHU;To0^jhjIIb8fyfL#;@rKIVAxtx`L>3=)nKN^~ezT-spL$T`H&@e9N ztdU{ILuZgN5ENMEXBKASxd6YwR|jxg*nY;zAdNpvc!0Saz~kei--86pEXzzpn>cm= zb0X+N1J`?nw8PqA#R0t~6hk}@wZooUst9U_6+=7^wZooUst9U_6+=7^wZooUst9U_ z6+=7^wSU8&TdD{)r^Dh?fjmd+I(V|~Czgs~tA|3O6tI1bwt;wKB0F-6Ii delta 660 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 diff --git a/app/src/main/res/drawable-xxhdpi/right_arrow.png b/app/src/main/res/drawable-xxhdpi/right_arrow.png index 1d8de5a3ef1edc7a98bc48f3aeb97573294d73da..f4d4ed6f9dc4ceb2510f9e6dac25321824ecb3e9 100644 GIT binary patch delta 430 zcmV;f0a5;o2fG817k?@U1^@s6Tssi%00004XF*Lt006O%3;baP0004UNkl@Gz)mO^c1Afc3w4Dx9pnrunW}6|>DYVJZliR1ZP)Ci_G0yuPV?M! zaY%dgVVm0DiGQM#XLeGHj_&eZg=*ifP1(N%!R(dRzTM=^$t2suFZF23c6)xW0Pv0m zgYc8q?8k2fwRdnHhfg*b3v~fmNnJr_lmj}UTyQPg1zd@C1(%|Iz*e*`*gz$~1yl;G zQAw~ur9nddvQ+nG{%MW5(*zHn3hpKrW@ YZ(et3P121~Z~y=R07*qoM6N<$f|P~8bN~PV delta 897 zcmV-{1AhFw1B(Zc7k?oL1^@s6HvHf%00001b5ch_0Itp)=>Px&MM*?KR7ee-R$WMw zQ5b&StzUzTkS)!Apdf=HN=SsDEO2TnMHxZ`kq}};K^GB)cR>Udby3t+5k(;VV3cl| zX%Gb6bsa@zuI(boLfzVSdd_j@(``-nc`o+8&)NGt-*bMyPk+F+tWGtgQh2WObh{A^ z$#DzZMvo?hd(Z>HohjrFe?VQGf?cIXR76xqHQL03`TCt~fYPk}>?LH6MExQ4nXi2e|+qbq4Dcq#v zqYlnWW^`)nIme5CClR9KD$^%Od4VJ0pxm=HHWn_+Zr1KLtBo zQLok{fLB(K{9hi0+H66sThN@AHmFsJBnDVtu762vf5eNxkD$DtfSJEDIxTNh%To#T z)8R@@E)h3(r@b%|T;p0?~uI8!1QIilq)Y9XR{Mu*#M8CS8LL%wTqq0xxy zkB9h(`FN?Rt~?_aTp4(lwDLq5YHU$@w8G@^7BafpIWo|IXA?OBa~ XW&Z-Y!^wlk00000NkvXXu0mjf4A`=+ diff --git a/app/src/main/res/drawable-xxhdpi/tab_wallet_default.png b/app/src/main/res/drawable-xxhdpi/tab_wallet_default.png index 95e4b870d5caa2ed76bf0af08b7842d27fef15b1..030ce1618867bf8a1e1b3e5741eae7b0f72265e7 100644 GIT binary patch delta 1154 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 diff --git a/app/src/main/res/drawable-xxxhdpi/arrow.png b/app/src/main/res/drawable-xxxhdpi/arrow.png deleted file mode 100644 index d7a6d123afce8c364d4406a393b775af5b13cf05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 473 zcmV;~0Ve*5P)4oZ_Jmev33h-)FR@Y@Enx!|prF&C)ZLt9ZgL~4GvA;0jp@(KJil|gZ)QWx zbqbsVcfeQ7Eo<(w33|*Ya16Wvmre*#0AtsW7ECLID1bBI(GejEU~Il6LL`7CLNtIK zLI!{pLKc7xLMDI(LN{LKT24LM4DCLN$OKLI;2pLKlDxLMMO(LN`D=f&xG* zf(k$zf)YRrf*L?Mf+9dEf+|26f-*n}f;vDtf&)M*f(t+zf)l`B2(Q2u@IE`^bOYES zJOc+y^apVA-vFL~!zKEAnM_X^xSfD8e|*>r{sC@)`>A@s3E+49*!hd)n}peZ8-SGf zq2_P`(&8NeQsdPD(&Lo@O5#-k%HkCPO5@c4%Hx#)TH;jz+Ts-eTI0I`+T%L`B;vaO zWa2vjq~faqvjPf)x;Ac5X| P00000NkvXXu0mjf_a?uZ diff --git a/app/src/main/res/drawable-xxxhdpi/arrow_right.png b/app/src/main/res/drawable-xxxhdpi/arrow_right.png deleted file mode 100644 index 19753443629b88ee1989bcb7785259a830e7ebdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437 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 X{|!?Jwf)sm00000NkvXXu0mjf(yj({ diff --git a/app/src/main/res/drawable-xxxhdpi/dialog_close.png b/app/src/main/res/drawable-xxxhdpi/dialog_close.png deleted file mode 100644 index bb89222fb72797c0233cadac5be43b05b5c3943e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2057 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 aV*3wuiMUI<7&bEi0000KX diff --git a/app/src/main/res/drawable-xxxhdpi/tab_wallet_selected.png b/app/src/main/res/drawable-xxxhdpi/tab_wallet_selected.png deleted file mode 100644 index e145c7a8e2b596cc41bd9c64ffeeee366c008f09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1394 zcmbVMYcvxI0Nw++wk0kiii&VzWJ0lIvk+q(@+iz@<{7)LS0S%UdW;()k4i30Y@>3= zgfS#}R%p#Mlh`~W&&lKJ=ly%n`5xzdKfZImKVKHk(FP`SNCp4^!0c?TUH07LC#9wK zl$391yl22D7aJ6S)~_Z603`M7tgT$*fb%@3AT>8-z~Z;-+?vWEY;mc6oXe|?rx!#f^seOwMf>F9+DT+VObXNR|G(?@`^ zvVe;az>mN4f~_6wa}q!B;1W7RYx1^2z!NmrekBflvx6|yL`?FN-zC4TrO^9MN@Q|g zA$2tO+oeC%Wci_*OfP27WKlrfp(_#znW$a@bKSAOm+zHV=u8fmSu9Hsx4}Hmq{utr z)_Cd!K+5Z5TbOwVX$2zvil`V?LvKW}lWlAWg06epGK3L3-3c9nC;QX55jx#hOVG$e zdK2MJ>+g*HTZ{v8I8W^jY=zA>l6cPR;O1>Pew$VNfG8uXi1{M~QJL!XKswe(lfRK4 zL46d0G@-P_@W;*zm!8dH2SfN}kGuTq)%~yLQbR9!Rwl`1#JqoY5QDb_avd)_D<4oQ! zG2kk@56z($Tb#8Qu9b><_6!&YH z*omMTS7#GdeE1+a1!g$~?PX<1LNlkKfp|73gB>M>sPzM~C(fj)e5_5LSPUoeVtp^L ziv5v`Uw-w@sS~U|35&=7X-@K!U8xjEHm$bbB+~!6c2M9&vP! z&aC%qH%+B{Q^Sqz5b^8*Y4CrmOWL4e9<0c?e!P^49^TA?Xb4tSGE{qrC`^Gtl=ly) z^s>w$3gHpcGT3qMcNL3Pk6@#T{yv7q;znj@wnM-(> lJDYhah5;L>Zrai1?gH9+0?47*UA?^%1=wL6t!XHH>c8bGtA_vp diff --git a/app/src/main/res/drawable-xxxhdpi/token_manage.png b/app/src/main/res/drawable-xxxhdpi/token_manage.png deleted file mode 100644 index 613d64a9aed9c66f7b9b7bde08636b706d262ee5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3746 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 - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_corner_blue_shape.xml b/app/src/main/res/drawable/button_corner_blue_shape.xml index 018132a1..35fafe64 100644 --- a/app/src/main/res/drawable/button_corner_blue_shape.xml +++ b/app/src/main/res/drawable/button_corner_blue_shape.xml @@ -7,6 +7,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_corner_gray_f_shape.xml b/app/src/main/res/drawable/button_corner_gray_f_shape.xml index b3c0592e..dcbcebaa 100644 --- a/app/src/main/res/drawable/button_corner_gray_f_shape.xml +++ b/app/src/main/res/drawable/button_corner_gray_f_shape.xml @@ -5,6 +5,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_corner_gray_shape.xml b/app/src/main/res/drawable/button_corner_gray_shape.xml index 98fc45aa..fd7a476d 100644 --- a/app/src/main/res/drawable/button_corner_gray_shape.xml +++ b/app/src/main/res/drawable/button_corner_gray_shape.xml @@ -7,6 +7,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/edit_input_shape.xml b/app/src/main/res/drawable/edit_input_shape.xml index fb83ff15..16daeac2 100644 --- a/app/src/main/res/drawable/edit_input_shape.xml +++ b/app/src/main/res/drawable/edit_input_shape.xml @@ -5,4 +5,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/drawable/token_image_circle_border.xml b/app/src/main/res/drawable/token_image_circle_border.xml new file mode 100644 index 00000000..5f9e4315 --- /dev/null +++ b/app/src/main/res/drawable/token_image_circle_border.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/wallet_item_corner.xml b/app/src/main/res/drawable/wallet_item_corner.xml new file mode 100644 index 00000000..489acd37 --- /dev/null +++ b/app/src/main/res/drawable/wallet_item_corner.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_token.xml b/app/src/main/res/layout/activity_add_token.xml index 63240767..01a6e031 100644 --- a/app/src/main/res/layout/activity_add_token.xml +++ b/app/src/main/res/layout/activity_add_token.xml @@ -12,13 +12,13 @@ android:layout_height="48dp" android:background="@color/colorPrimary" app:title="@string/title_add_token" - app:isShowLeft="true"/> + app:isShowLeft="true" + app:isShowBottomLine="true"/> @@ -56,10 +56,8 @@ - + - - + style="@style/separateLineLong" + android:layout_marginStart="@dimen/default_margin"/> + style="@style/separateLineLong" + android:layout_marginStart="@dimen/default_margin"/> + style="@style/separateLineLong" + android:layout_marginStart="@dimen/default_margin"/> - - + android:textSize="16sp"/> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_backup_mnemonic.xml b/app/src/main/res/layout/activity_backup_mnemonic.xml index f8682d18..0078362a 100644 --- a/app/src/main/res/layout/activity_backup_mnemonic.xml +++ b/app/src/main/res/layout/activity_backup_mnemonic.xml @@ -12,7 +12,8 @@ android:layout_height="48dp" android:background="@color/colorPrimary" app:isShowLeft="true" - app:title="@string/backup_mnemonic" /> + app:title="@string/backup_mnemonic" + app:isShowBottomLine="true"/> @@ -44,7 +45,7 @@ android:background="@color/warning_background" android:drawablePadding="3dp" android:paddingEnd="@dimen/default_margin" - android:paddingStart="30dp" + android:paddingStart="35dp" android:text="@string/backup_mnemonic_warning3" android:textColor="@color/warning_font" android:textSize="12sp" /> @@ -56,7 +57,7 @@ android:drawablePadding="3dp" android:paddingBottom="@dimen/default_margin" android:paddingEnd="@dimen/default_margin" - android:paddingStart="30dp" + android:paddingStart="35dp" android:text="@string/backup_mnemonic_warning4" android:textColor="@color/warning_font" android:textSize="12sp" /> diff --git a/app/src/main/res/layout/activity_change_password.xml b/app/src/main/res/layout/activity_change_password.xml index 02c24a80..70435821 100644 --- a/app/src/main/res/layout/activity_change_password.xml +++ b/app/src/main/res/layout/activity_change_password.xml @@ -16,14 +16,12 @@ @@ -106,11 +104,6 @@ android:paddingStart="@dimen/default_margin" android:textSize="14sp" /> - - + app:title="@string/title_create_wallet" + app:isShowBottomLine="true"/> + app:isShowLeft="true" + app:isShowBottomLine="true"/> - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_import_wallet.xml b/app/src/main/res/layout/activity_import_wallet.xml index aec161d3..6a927c5b 100644 --- a/app/src/main/res/layout/activity_import_wallet.xml +++ b/app/src/main/res/layout/activity_import_wallet.xml @@ -11,7 +11,8 @@ android:layout_height="48dp" android:background="@color/colorPrimary" app:isShowLeft="true" - app:title="@string/title_import_wallet" /> + app:title="@string/title_import_wallet" + app:isShowBottomLine="true"/> + app:stl_indicatorThickness="2dp" + app:stl_underlineThickness="0.5dp"/> + app:isShowLeft="true" + app:isShowBottomLine="true"/> + + android:layout_marginTop="48dp"> - + - + - - - - - + + android:paddingRight="10dp" + android:layout_alignParentRight="true"> @@ -40,21 +40,20 @@ + android:textSize="35sp"/> @@ -46,16 +45,11 @@ android:src="@drawable/scan" /> - - + style="@style/separateLineLong" + android:layout_marginLeft="@dimen/default_margin"/> - - @@ -53,15 +52,10 @@ android:src="@drawable/scan" /> - - + android:textSize="15sp" /> + style="@style/separateLineLong" + android:layout_marginLeft="@dimen/default_margin"/> + android:textSize="15sp" /> + style="@style/separateLineLong" + android:layout_marginLeft="@dimen/default_margin"/> + android:textSize="15sp" /> + style="@style/separateLineLong" + android:layout_marginLeft="@dimen/default_margin"/> - - + android:textSize="15sp" /> @@ -47,10 +46,8 @@ + style="@style/separateLineLong" + android:layout_marginLeft="@dimen/default_margin"/> + style="@style/separateLineLong" + android:layout_marginLeft="@dimen/default_margin"/> + style="@style/separateLineLong" + android:layout_marginLeft="@dimen/default_margin"/> - - + android:layout_height="match_parent" + android:background="@color/white"> + android:layout_height="40dp" + android:background="@color/white"> @@ -42,29 +42,19 @@ - - + app:layout_constraintTop_toBottomOf="@id/ll_total_money"> + android:background="#E9EBF0" /> @@ -65,14 +65,14 @@ + android:background="#E9EBF0" /> diff --git a/app/src/main/res/layout/item_collection.xml b/app/src/main/res/layout/item_collection.xml index 59277f78..c3d89140 100644 --- a/app/src/main/res/layout/item_collection.xml +++ b/app/src/main/res/layout/item_collection.xml @@ -8,8 +8,10 @@ @@ -37,7 +39,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/ethereum_mainnet" - android:textColor="@color/font_title_second" + android:textColor="@color/font_inside" android:textSize="14sp" android:layout_below="@id/collection_name" /> @@ -46,8 +48,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ID:1000" - android:textColor="@color/font_title_second" - android:textSize="14sp" + android:textColor="@color/font_title" + android:textSize="16sp" android:layout_centerVertical="true" android:layout_alignParentRight="true"/> @@ -55,6 +57,5 @@ \ No newline at end of file diff --git a/app/src/main/res/layout/item_token_list.xml b/app/src/main/res/layout/item_token_list.xml index a2869701..2fda6387 100644 --- a/app/src/main/res/layout/item_token_list.xml +++ b/app/src/main/res/layout/item_token_list.xml @@ -6,73 +6,77 @@ + android:layout_height="80dp"> - - - + android:layout_height="79dp" + android:paddingEnd="15dp" + android:paddingStart="15dp"> + - + android:layout_centerVertical="true" + android:layout_marginLeft="10dp" + android:layout_toRightOf="@id/token_image"> - + - + - + + + - + + + android:layout_marginStart="@dimen/default_margin"/> \ No newline at end of file diff --git a/app/src/main/res/layout/item_wallet.xml b/app/src/main/res/layout/item_wallet.xml index 298fd634..32a97cdc 100644 --- a/app/src/main/res/layout/item_wallet.xml +++ b/app/src/main/res/layout/item_wallet.xml @@ -3,16 +3,14 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/root" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/white"> + android:layout_height="80dp" + android:background="@drawable/wallet_item_corner"> + app:layout_constraintTop_toTopOf="parent" + android:background="@color/qr_receive_bg" + android:src="@drawable/ic_wallet_default" /> diff --git a/app/src/main/res/layout/item_wallet_add.xml b/app/src/main/res/layout/item_wallet_add.xml index e6fd3111..c5bb08ae 100644 --- a/app/src/main/res/layout/item_wallet_add.xml +++ b/app/src/main/res/layout/item_wallet_add.xml @@ -4,7 +4,7 @@ android:id="@+id/root" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@color/white"> + android:background="@drawable/wallet_item_corner"> #FF333333 #62678A - #262a44 + #242B43 #525461 - #8a8d9f + #9196A6 #c5c5d0 #1646ff @@ -26,12 +26,12 @@ #252A3E #fff5f5f5 - #FFFEED - #ff8f27 + #19FF8F27 + #FF8F27 #FF8C36 #333333 - #E5E5E5 + #F7F7F7 #ffe1e1e1 #ffeeeeee #ff999999 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b9278081..7551fb20 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -93,7 +93,7 @@ 确认支付 正在加载 拒绝 - 接受 + 同意 请求人 接收地址 转账金额 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 36ae3b03..e9f94bcd 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -67,7 +67,7 @@ From e151fea2ea7ef078920043f7dc26f455f48e04f3 Mon Sep 17 00:00:00 2001 From: baojun Date: Thu, 9 Aug 2018 17:22:44 +0800 Subject: [PATCH 074/121] update unlock ui --- .../main/res/layout/activity_pwd_unlock.xml | 8 ++--- .../main/res/layout/dialog_anth_finger.xml | 35 +++++++------------ 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/app/src/main/res/layout/activity_pwd_unlock.xml b/app/src/main/res/layout/activity_pwd_unlock.xml index 4be9a1b0..879cd8c7 100644 --- a/app/src/main/res/layout/activity_pwd_unlock.xml +++ b/app/src/main/res/layout/activity_pwd_unlock.xml @@ -87,7 +87,7 @@ android:layout_marginLeft="37dp" android:layout_marginRight="37dp" android:layout_marginTop="5dp" - android:background="@color/line_input" + android:background="@color/button_unclick" app:layout_constraintTop_toBottomOf="@id/tv_wallet_name" /> + android:background="@color/line_form" /> + android:background="@color/line_form" /> - - - - + + android:textSize="17sp" /> Date: Thu, 9 Aug 2018 18:17:12 +0800 Subject: [PATCH 075/121] fingerprint divider line color --- app/src/main/res/layout/activity_fingerprint.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/activity_fingerprint.xml b/app/src/main/res/layout/activity_fingerprint.xml index 79731f70..cbdc8b7f 100644 --- a/app/src/main/res/layout/activity_fingerprint.xml +++ b/app/src/main/res/layout/activity_fingerprint.xml @@ -62,7 +62,7 @@ android:layout_width="match_parent" android:layout_height="1dp" android:layout_weight="1000" - android:background="@color/line_input" /> + android:background="@color/line_form" /> + android:background="@color/line_form" /> Date: Fri, 10 Aug 2018 09:38:06 +0800 Subject: [PATCH 076/121] update transaction detail ui --- .../activity/TransactionDetailActivity.java | 27 ++++++++++++++++--- .../org/nervos/neuron/custom/TitleBar.java | 2 +- .../main/res/layout/activity_pwd_unlock.xml | 6 ++--- .../layout/activity_transaction_detail.xml | 3 ++- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java index 8449e061..645e8abb 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java @@ -60,9 +60,9 @@ protected void initData() { walletItem = DBWalletUtil.getCurrentWallet(mActivity); transactionItem = getIntent().getParcelableExtra(EXTRA_TRANSACTION); - transactionHashText.setText(transactionItem.hash); - transactionFromText.setText(transactionItem.from); - transactionToText.setText(transactionItem.to); + transactionHashText.setText(lineFeedHex(transactionItem.hash)); + transactionFromText.setText(lineFeedAddress(transactionItem.from)); + transactionToText.setText(lineFeedAddress(transactionItem.to)); if (!TextUtils.isEmpty(transactionItem.gasPrice)) { transactionChainName.setText(R.string.ethereum_main_net); BigInteger gasPriceBig = new BigInteger(transactionItem.gasPrice); @@ -108,6 +108,9 @@ protected void initAction() { }) .start(); }); + title.setOnLeftClickListener(() -> { + finish(); + }); } private void copyText(String value) { @@ -119,4 +122,22 @@ private void copyText(String value) { } } + private String lineFeedAddress(String address) { + StringBuffer buffer = new StringBuffer(); + buffer.append(address.substring(0, 21)); + buffer.append("\n"); + buffer.append(address.substring(21)); + return buffer.toString(); + } + + private String lineFeedHex(String hex) { + StringBuffer buffer = new StringBuffer(); + buffer.append(hex.substring(0, 22)); + buffer.append("\n"); + buffer.append(hex.substring(22, 44)); + buffer.append("\n"); + buffer.append(hex.substring(44)); + return buffer.toString(); + } + } diff --git a/app/src/main/java/org/nervos/neuron/custom/TitleBar.java b/app/src/main/java/org/nervos/neuron/custom/TitleBar.java index 4137d563..4b55f91c 100644 --- a/app/src/main/java/org/nervos/neuron/custom/TitleBar.java +++ b/app/src/main/java/org/nervos/neuron/custom/TitleBar.java @@ -112,7 +112,7 @@ private void initFromAttributes(AttributeSet attrs) { mRightImg = a.getResourceId(R.styleable.TitleBar_right_img, 0); if (0 != mRightImg) { drawable = mContext.getResources().getDrawable(mRightImg); - mTitleBarRightDefaultView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null); + mTitleBarRightDefaultView.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null); } a.recycle(); diff --git a/app/src/main/res/layout/activity_pwd_unlock.xml b/app/src/main/res/layout/activity_pwd_unlock.xml index 879cd8c7..d3b18b6e 100644 --- a/app/src/main/res/layout/activity_pwd_unlock.xml +++ b/app/src/main/res/layout/activity_pwd_unlock.xml @@ -76,14 +76,14 @@ android:layout_marginRight="5dp" android:text="@string/select_wallet_unlock" android:textColor="@color/font_inside" - android:textSize="18sp" + android:textSize="16sp" app:layout_constraintBottom_toBottomOf="@id/tv_wallet_name" app:layout_constraintRight_toLeftOf="@id/iv_down_arrow" /> From d89c08f8495f3238a993e7954d6ca6c2b94cff84 Mon Sep 17 00:00:00 2001 From: baojun Date: Fri, 10 Aug 2018 10:34:08 +0800 Subject: [PATCH 077/121] restructure split address & hex to display --- .../neuron/activity/TransactionDetailActivity.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java index 645e8abb..642f2778 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java @@ -123,20 +123,22 @@ private void copyText(String value) { } private String lineFeedAddress(String address) { + int singleLine = address.length() / 2; StringBuffer buffer = new StringBuffer(); - buffer.append(address.substring(0, 21)); + buffer.append(address.substring(0, singleLine)); buffer.append("\n"); - buffer.append(address.substring(21)); + buffer.append(address.substring(singleLine)); return buffer.toString(); } private String lineFeedHex(String hex) { + int singleLine = hex.length() / 3; StringBuffer buffer = new StringBuffer(); - buffer.append(hex.substring(0, 22)); + buffer.append(hex.substring(0, singleLine)); buffer.append("\n"); - buffer.append(hex.substring(22, 44)); + buffer.append(hex.substring(singleLine, singleLine * 2)); buffer.append("\n"); - buffer.append(hex.substring(44)); + buffer.append(hex.substring(singleLine * 2)); return buffer.toString(); } From bfe032167599e15dd7c9f403e27cc32ebb17aa93 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Fri, 10 Aug 2018 10:56:42 +0800 Subject: [PATCH 078/121] update add token page ui --- .../neuron/activity/AddWebsiteActivity.java | 20 ++++++++++++++++++ .../drawable-xhdpi/add_website_hint_image.png | Bin 0 -> 3523 bytes .../add_website_hint_image.png | Bin 0 -> 6291 bytes .../main/res/layout/activity_add_website.xml | 3 +++ .../main/res/layout/activity_token_manage.xml | 7 ++++-- app/src/main/res/layout/item_token_info.xml | 8 +++---- app/src/main/res/layout/item_web_app.xml | 4 ++-- app/src/main/res/values/colors.xml | 5 +++-- 8 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/drawable-xhdpi/add_website_hint_image.png create mode 100644 app/src/main/res/drawable-xxhdpi/add_website_hint_image.png diff --git a/app/src/main/java/org/nervos/neuron/activity/AddWebsiteActivity.java b/app/src/main/java/org/nervos/neuron/activity/AddWebsiteActivity.java index 617f6011..fb8500a5 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AddWebsiteActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AddWebsiteActivity.java @@ -9,7 +9,9 @@ import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.text.Editable; import android.text.TextUtils; +import android.text.TextWatcher; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; @@ -102,6 +104,24 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { return false; } }); + websiteEdit.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if(s.toString().length() > 0) { + websiteEdit.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); + } else { + websiteEdit.setCompoundDrawablesWithIntrinsicBounds(R.drawable.add_website_hint_image, 0, 0, 0); + } + } + @Override + public void afterTextChanged(Editable s) { + + } + }); } diff --git a/app/src/main/res/drawable-xhdpi/add_website_hint_image.png b/app/src/main/res/drawable-xhdpi/add_website_hint_image.png new file mode 100644 index 0000000000000000000000000000000000000000..f888f677a251da90911bc9abc6cc46d8eff1e2b7 GIT binary patch literal 3523 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/add_website_hint_image.png b/app/src/main/res/drawable-xxhdpi/add_website_hint_image.png new file mode 100644 index 0000000000000000000000000000000000000000..ddddebc6ff7d51405ebdc7eab34a183d3ad89e04 GIT binary patch literal 6291 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 JPDHLkV1mr?Gw1*S literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_add_website.xml b/app/src/main/res/layout/activity_add_website.xml index 90e40c0a..4794a0f7 100644 --- a/app/src/main/res/layout/activity_add_website.xml +++ b/app/src/main/res/layout/activity_add_website.xml @@ -47,8 +47,11 @@ android:singleLine="true" android:ellipsize="none" android:background="@drawable/rectangle_border_gray_corner" + android:drawableLeft="@drawable/add_website_hint_image" + android:drawablePadding="5dp" android:imeOptions="actionDone" android:hint="@string/input_app_website_hint" + android:textColorHint="@color/font_hint" android:textColor="@color/default_black" android:textSize="14sp"/> diff --git a/app/src/main/res/layout/activity_token_manage.xml b/app/src/main/res/layout/activity_token_manage.xml index 02e88bda..9b90e863 100644 --- a/app/src/main/res/layout/activity_token_manage.xml +++ b/app/src/main/res/layout/activity_token_manage.xml @@ -3,7 +3,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:background="@color/white"> + app:right_img="@drawable/add" + app:isShowBottomLine="true"/> diff --git a/app/src/main/res/layout/item_token_info.xml b/app/src/main/res/layout/item_token_info.xml index 9df6264f..2a264b43 100644 --- a/app/src/main/res/layout/item_token_info.xml +++ b/app/src/main/res/layout/item_token_info.xml @@ -31,7 +31,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="15sp" - android:textColor="@color/font_black" + android:textColor="@color/font_title" android:text="Cryptape CITA Dapp"/> @@ -68,7 +68,7 @@ + android:layout_marginStart="@dimen/default_margin"/> diff --git a/app/src/main/res/layout/item_web_app.xml b/app/src/main/res/layout/item_web_app.xml index 737a6669..09728409 100644 --- a/app/src/main/res/layout/item_web_app.xml +++ b/app/src/main/res/layout/item_web_app.xml @@ -13,7 +13,7 @@ android:lines="1" android:maxLines="1" android:ellipsize="end" - android:textSize="14sp" - android:textColor="@color/default_gray_6"/> + android:textSize="15sp" + android:textColor="@color/font_title_second"/> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index e3eed458..99260cbf 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -12,11 +12,12 @@ #FF333333 #62678A - #242B43 - #525461 + #2E313E + #9196A6 #9196A6 #c5c5d0 #1646ff + #DBDCE3 #f7f7f7 #eaeaea From 8615c3df0a8f9c6b13654317c4524613a87e8c7b Mon Sep 17 00:00:00 2001 From: duanyytop Date: Fri, 10 Aug 2018 13:49:40 +0800 Subject: [PATCH 079/121] fix pay token ui error --- .../drawable/add_wallet_log_corner_shape.xml | 2 +- .../res/drawable/button_blue_line_shape.xml | 2 +- .../drawable/rectangle_border_gray_corner.xml | 4 +- .../drawable/token_image_circle_border.xml | 2 +- .../main/res/layout/activity_add_wallet.xml | 24 ++-- .../res/layout/activity_create_wallet.xml | 20 ++-- .../main/res/layout/activity_fingerprint.xml | 2 +- .../main/res/layout/activity_pay_token.xml | 103 +++++++++--------- .../main/res/layout/activity_pwd_unlock.xml | 2 +- .../res/layout/activity_receive_qrcode.xml | 6 +- .../res/layout/activity_transaction_list.xml | 3 +- app/src/main/res/layout/custom_titlebar.xml | 4 +- .../main/res/layout/dialog_anth_finger.xml | 4 +- .../res/layout/dialog_confirm_transfer.xml | 22 ++-- .../main/res/layout/dialog_sign_message.xml | 4 +- .../main/res/layout/fragment_token_list.xml | 4 +- app/src/main/res/layout/item_currency.xml | 2 +- app/src/main/res/layout/item_token_info.xml | 6 +- .../main/res/layout/item_transaction_list.xml | 15 ++- app/src/main/res/layout/item_web_app.xml | 2 +- .../main/res/layout/view_setting_button.xml | 2 +- app/src/main/res/values/colors.xml | 8 +- 22 files changed, 126 insertions(+), 117 deletions(-) diff --git a/app/src/main/res/drawable/add_wallet_log_corner_shape.xml b/app/src/main/res/drawable/add_wallet_log_corner_shape.xml index f4814d84..df409e0d 100644 --- a/app/src/main/res/drawable/add_wallet_log_corner_shape.xml +++ b/app/src/main/res/drawable/add_wallet_log_corner_shape.xml @@ -5,7 +5,7 @@ \ No newline at end of file diff --git a/app/src/main/res/drawable/button_blue_line_shape.xml b/app/src/main/res/drawable/button_blue_line_shape.xml index 091ce75e..bb59a3c4 100644 --- a/app/src/main/res/drawable/button_blue_line_shape.xml +++ b/app/src/main/res/drawable/button_blue_line_shape.xml @@ -1,7 +1,7 @@ - + diff --git a/app/src/main/res/drawable/rectangle_border_gray_corner.xml b/app/src/main/res/drawable/rectangle_border_gray_corner.xml index bb296970..7f7b25f8 100644 --- a/app/src/main/res/drawable/rectangle_border_gray_corner.xml +++ b/app/src/main/res/drawable/rectangle_border_gray_corner.xml @@ -2,10 +2,10 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/token_image_circle_border.xml b/app/src/main/res/drawable/token_image_circle_border.xml index 5f9e4315..5dd82dab 100644 --- a/app/src/main/res/drawable/token_image_circle_border.xml +++ b/app/src/main/res/drawable/token_image_circle_border.xml @@ -2,6 +2,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_wallet.xml b/app/src/main/res/layout/activity_add_wallet.xml index 85011a9e..f15a6de6 100644 --- a/app/src/main/res/layout/activity_add_wallet.xml +++ b/app/src/main/res/layout/activity_add_wallet.xml @@ -12,7 +12,8 @@ android:layout_height="48dp" android:background="@color/colorPrimary" app:isShowLeft="true" - app:title="@string/title_add_wallet" /> + app:title="@string/title_add_wallet" + app:isShowBottomLine="true"/> @@ -38,17 +39,18 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="@string/no_find_password_content" - android:textColor="@color/default_black" + android:textColor="@color/font_title" android:textSize="16sp" /> @@ -56,25 +58,25 @@ + android:textSize="16sp" /> + android:textSize="16sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_create_wallet.xml b/app/src/main/res/layout/activity_create_wallet.xml index b2478042..7248aee3 100644 --- a/app/src/main/res/layout/activity_create_wallet.xml +++ b/app/src/main/res/layout/activity_create_wallet.xml @@ -30,13 +30,13 @@ + android:textSize="15sp" /> + android:textSize="15sp" /> + android:textSize="15sp" /> + android:textSize="16sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fingerprint.xml b/app/src/main/res/layout/activity_fingerprint.xml index cbdc8b7f..563aa650 100644 --- a/app/src/main/res/layout/activity_fingerprint.xml +++ b/app/src/main/res/layout/activity_fingerprint.xml @@ -70,7 +70,7 @@ android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:text="@string/finger_print_other_login" - android:textColor="@color/font_title_second" + android:textColor="@color/font_title_third" android:textSize="14sp" /> - + android:orientation="vertical"> + - + + @@ -66,7 +68,7 @@ @@ -118,18 +120,18 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/requester" - android:textColor="@color/default_black" - android:textSize="13sp"/> + android:textColor="@color/font_title_third" + android:textSize="15sp"/> + android:textColor="@color/font_title_third" + android:textSize="15sp"/> + android:textColor="@color/font_title_third" + android:textSize="15sp"/> + android:textColor="@color/font_title_third" + android:textSize="15sp"/> + android:textColor="@color/font_title_third" + android:textSize="15sp"/> + android:textColor="@color/font_title_second" + android:textSize="15sp"/> + android:background="@color/selected_color"/> + android:textColor="@color/font_title_second" + android:textSize="15sp"/> + android:background="@color/selected_color"/> diff --git a/app/src/main/res/layout/activity_pwd_unlock.xml b/app/src/main/res/layout/activity_pwd_unlock.xml index d3b18b6e..b025b226 100644 --- a/app/src/main/res/layout/activity_pwd_unlock.xml +++ b/app/src/main/res/layout/activity_pwd_unlock.xml @@ -157,7 +157,7 @@ android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:text="@string/finger_print_other_login" - android:textColor="@color/font_title_second" + android:textColor="@color/font_title_third" android:textSize="14sp" /> @@ -105,8 +105,8 @@ android:layout_centerHorizontal="true" android:layout_marginBottom="20dp" android:text="@string/copy_address" - android:textColor="@color/font_title_second" - android:textSize="16sp" /> + android:textColor="@color/colorPrimary" + android:textSize="14sp" /> diff --git a/app/src/main/res/layout/activity_transaction_list.xml b/app/src/main/res/layout/activity_transaction_list.xml index ce7a0b68..60f3c922 100644 --- a/app/src/main/res/layout/activity_transaction_list.xml +++ b/app/src/main/res/layout/activity_transaction_list.xml @@ -11,7 +11,8 @@ android:layout_width="match_parent" android:layout_height="48dp" android:background="@color/colorPrimary" - app:isShowLeft="true"/> + app:isShowLeft="true" + app:isShowBottomLine="true"/> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_confirm_transfer.xml b/app/src/main/res/layout/dialog_confirm_transfer.xml index 1e4a677b..fd29f097 100644 --- a/app/src/main/res/layout/dialog_confirm_transfer.xml +++ b/app/src/main/res/layout/dialog_confirm_transfer.xml @@ -58,7 +58,7 @@ android:gravity="center_vertical" android:text="@string/transfer_to_address" android:textSize="15sp" - android:textColor="@color/default_gray_6"/> + android:textColor="@color/font_title_second"/> + android:textColor="@color/font_title"/> @@ -89,7 +89,7 @@ android:gravity="center_vertical" android:text="@string/pay_wallet" android:textSize="15sp" - android:textColor="@color/default_gray_6"/> + android:textColor="@color/font_title_second"/> + android:textColor="@color/font_title"/> + android:textColor="@color/font_title_second"/> + android:textColor="@color/font_title"/> + android:textColor="@color/font_title_second"/> + android:textColor="@color/font_title"/> diff --git a/app/src/main/res/layout/dialog_sign_message.xml b/app/src/main/res/layout/dialog_sign_message.xml index 8efd34b8..0ae997fe 100644 --- a/app/src/main/res/layout/dialog_sign_message.xml +++ b/app/src/main/res/layout/dialog_sign_message.xml @@ -130,7 +130,7 @@ android:id="@+id/pay_data_left_line" android:layout_width="match_parent" android:layout_height="3dp" - android:background="#FE8227"/> + android:background="@color/selected_color"/> + android:background="@color/selected_color"/> diff --git a/app/src/main/res/layout/fragment_token_list.xml b/app/src/main/res/layout/fragment_token_list.xml index 210fadd1..1eec9390 100644 --- a/app/src/main/res/layout/fragment_token_list.xml +++ b/app/src/main/res/layout/fragment_token_list.xml @@ -27,7 +27,7 @@ android:layout_marginLeft="15dp" android:layout_centerVertical="true" android:text="@string/wallet_token_total_money" - android:textColor="@color/font_title_second" + android:textColor="@color/font_title_third" android:textSize="14sp" /> diff --git a/app/src/main/res/layout/item_transaction_list.xml b/app/src/main/res/layout/item_transaction_list.xml index 32468f99..e72cf1fe 100644 --- a/app/src/main/res/layout/item_transaction_list.xml +++ b/app/src/main/res/layout/item_transaction_list.xml @@ -32,16 +32,16 @@ android:maxEms="8" android:ellipsize="middle" android:singleLine="true" - android:textSize="14sp" - android:textColor="@color/font_black"/> + android:textSize="16sp" + android:textColor="@color/font_title"/> @@ -58,9 +58,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" - android:textStyle="bold" android:textSize="16sp" - android:textColor="@color/font_black" + android:textColor="@color/font_title" android:text="+21.15eth"/> diff --git a/app/src/main/res/layout/item_web_app.xml b/app/src/main/res/layout/item_web_app.xml index 09728409..a7cfbddc 100644 --- a/app/src/main/res/layout/item_web_app.xml +++ b/app/src/main/res/layout/item_web_app.xml @@ -14,6 +14,6 @@ android:maxLines="1" android:ellipsize="end" android:textSize="15sp" - android:textColor="@color/font_title_second"/> + android:textColor="@color/font_title_third"/> \ No newline at end of file diff --git a/app/src/main/res/layout/view_setting_button.xml b/app/src/main/res/layout/view_setting_button.xml index f1dd9e5a..cbc8aeb1 100644 --- a/app/src/main/res/layout/view_setting_button.xml +++ b/app/src/main/res/layout/view_setting_button.xml @@ -25,7 +25,7 @@ android:layout_height="wrap_content" android:layout_marginLeft="7dip" android:text="本地货币" - android:textColor="@color/font_title_second" + android:textColor="@color/font_title" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toRightOf="@id/iv_setting_icon" diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 99260cbf..cc4fe037 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -13,14 +13,15 @@ #62678A #2E313E - #9196A6 + #6C7184 + #9196A6 #9196A6 #c5c5d0 #1646ff #DBDCE3 #f7f7f7 - #eaeaea + #E9EBF0 #e9ebf0 @@ -29,7 +30,8 @@ #fff5f5f5 #19FF8F27 #FF8F27 - #FF8C36 + #03C58B + #03C58B #333333 #F7F7F7 From cab0cc6f70e3b72004bba744f9a8f0ed035fd2e4 Mon Sep 17 00:00:00 2001 From: baojun Date: Fri, 10 Aug 2018 14:48:18 +0800 Subject: [PATCH 080/121] fix websetting bug --- app/src/main/java/org/nervos/neuron/webview/Web3View.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/webview/Web3View.java b/app/src/main/java/org/nervos/neuron/webview/Web3View.java index 358dfefc..15d1d6ef 100644 --- a/app/src/main/java/org/nervos/neuron/webview/Web3View.java +++ b/app/src/main/java/org/nervos/neuron/webview/Web3View.java @@ -69,7 +69,7 @@ public void setWebViewClient(WebViewClient client) { private void init() { jsInjectorClient = new JsInjectorClient(getContext()); webViewClient = new Web3ViewClient(jsInjectorClient, new UrlHandlerManager()); - WebSettings webSettings = super.getSettings(); + WebSettings webSettings = getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setBuiltInZoomControls(true); @@ -88,12 +88,6 @@ private void init() { super.setWebViewClient(webViewClient); } - @Override - public WebSettings getSettings() { - return new WrapWebSettings(super.getSettings()); - } - - public void setWalletAddress(@NonNull Address address) { jsInjectorClient.setWalletAddress(address); } From af763e94706840cbfe6364e810b24dc571490c8d Mon Sep 17 00:00:00 2001 From: baojun Date: Fri, 10 Aug 2018 15:35:46 +0800 Subject: [PATCH 081/121] fix ui --- app/src/main/res/layout/activity_currency.xml | 2 +- app/src/main/res/layout/dialog_anth_finger.xml | 2 +- app/src/main/res/layout/fragment_settings.xml | 1 - app/src/main/res/layout/item_currency.xml | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/activity_currency.xml b/app/src/main/res/layout/activity_currency.xml index 86b4f048..f9a5d5ad 100644 --- a/app/src/main/res/layout/activity_currency.xml +++ b/app/src/main/res/layout/activity_currency.xml @@ -9,6 +9,7 @@ android:id="@+id/title" android:layout_width="match_parent" android:layout_height="48dp" + app:isShowBottomLine="true" app:isShowLeft="true" app:layout_constraintTop_toTopOf="parent" app:title="@string/about_us_title" @@ -18,7 +19,6 @@ android:id="@+id/rv_currency" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginTop="12dip" android:background="@color/white" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_anth_finger.xml b/app/src/main/res/layout/dialog_anth_finger.xml index b6ff3195..0a9a940d 100644 --- a/app/src/main/res/layout/dialog_anth_finger.xml +++ b/app/src/main/res/layout/dialog_anth_finger.xml @@ -20,7 +20,7 @@ android:layout_marginTop="11dip" android:gravity="center" android:text="@string/dialog_finger_msg" - android:textColor="@color/font_title_third" + android:textColor="@color/font_title" android:textSize="17sp" /> diff --git a/app/src/main/res/layout/item_currency.xml b/app/src/main/res/layout/item_currency.xml index 111744a1..eae0b85b 100644 --- a/app/src/main/res/layout/item_currency.xml +++ b/app/src/main/res/layout/item_currency.xml @@ -12,7 +12,7 @@ android:layout_height="wrap_content" android:layout_marginLeft="15dip" android:text="CNY" - android:textColor="@color/font_title_third" + android:textColor="@color/font_title" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" From ea7d65607ef0748757dd413c6d65fa9e453c0237 Mon Sep 17 00:00:00 2001 From: baojun Date: Mon, 13 Aug 2018 14:02:58 +0800 Subject: [PATCH 082/121] fix add_wallet back logic --- .../nervos/neuron/activity/AddWalletActivity.java | 14 +++++++++----- .../org/nervos/neuron/activity/SplashActivity.java | 1 + 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/AddWalletActivity.java b/app/src/main/java/org/nervos/neuron/activity/AddWalletActivity.java index f08a0cb1..935fd875 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AddWalletActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AddWalletActivity.java @@ -1,9 +1,6 @@ package org.nervos.neuron.activity; import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.widget.AppCompatCheckBox; import android.view.KeyEvent; import org.nervos.neuron.R; @@ -31,8 +28,14 @@ protected void initData() { findViewById(R.id.import_wallet_button).setOnClickListener(v -> startActivity(new Intent(mActivity, ImportWalletActivity.class))); + TitleBar titleBar = findViewById(R.id.title); + if (getIntent().getBooleanExtra("isFirst", false)) { + titleBar.hideLeft(); + } else { + titleBar.showLeft(); + titleBar.setOnLeftClickListener(() -> goBack()); + } - ((TitleBar) findViewById(R.id.title)).setOnLeftClickListener(() -> goBack()); } @Override @@ -59,7 +62,8 @@ private void goBack() { @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { - goBack(); + if (!getIntent().getBooleanExtra("isFirst", false)) + goBack(); } return super.onKeyDown(keyCode, event); } diff --git a/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java b/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java index 1669611a..560801f5 100644 --- a/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java @@ -31,6 +31,7 @@ public void run() { } } else { Intent intent = new Intent(mActivity, AddWalletActivity.class); + intent.putExtra("isFirst", true); startActivity(intent); } finish(); From ea54066d988b2df1a4e5ccefa1a4c74e0995a15e Mon Sep 17 00:00:00 2001 From: duanyytop Date: Fri, 10 Aug 2018 15:03:53 +0800 Subject: [PATCH 083/121] add line color --- app/src/main/res/color/tab_text_color.xml | 2 +- .../res/layout/activity_export_keystore.xml | 2 +- app/src/main/res/layout/activity_transfer.xml | 2 +- .../res/layout/fragment_import_keystore.xml | 20 +++++++++---------- .../res/layout/fragment_import_mnemonic.xml | 12 +++++------ app/src/main/res/values/colors.xml | 3 +-- 6 files changed, 20 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/color/tab_text_color.xml b/app/src/main/res/color/tab_text_color.xml index b34cbdf7..4c8d18b2 100644 --- a/app/src/main/res/color/tab_text_color.xml +++ b/app/src/main/res/color/tab_text_color.xml @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_export_keystore.xml b/app/src/main/res/layout/activity_export_keystore.xml index e0e27175..4f72b034 100644 --- a/app/src/main/res/layout/activity_export_keystore.xml +++ b/app/src/main/res/layout/activity_export_keystore.xml @@ -62,7 +62,7 @@ android:layout_marginEnd="@dimen/default_margin" android:background="@drawable/button_blue_line_shape" android:text="分享" - android:textColor="@color/font_blue" + android:textColor="@color/colorPrimary" android:textSize="16sp" /> diff --git a/app/src/main/res/layout/activity_transfer.xml b/app/src/main/res/layout/activity_transfer.xml index bef35769..54868fb3 100644 --- a/app/src/main/res/layout/activity_transfer.xml +++ b/app/src/main/res/layout/activity_transfer.xml @@ -98,7 +98,7 @@ android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_alignParentEnd="true" - android:textColor="@color/font_blue" + android:textColor="@color/colorPrimary" android:textSize="12sp"/> diff --git a/app/src/main/res/layout/fragment_import_keystore.xml b/app/src/main/res/layout/fragment_import_keystore.xml index 01ce21d7..083cd62a 100644 --- a/app/src/main/res/layout/fragment_import_keystore.xml +++ b/app/src/main/res/layout/fragment_import_keystore.xml @@ -31,24 +31,24 @@ android:background="@drawable/edit_input_shape" android:gravity="start" android:hint="@string/import_wallet_content_hint" - android:padding="5dp" + android:padding="10dp" android:textColor="@color/font_title" android:textSize="12sp" /> + android:textSize="15sp" /> + android:textSize="15sp" /> + android:textSize="16sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_import_mnemonic.xml b/app/src/main/res/layout/fragment_import_mnemonic.xml index faf37d5b..d41e7680 100644 --- a/app/src/main/res/layout/fragment_import_mnemonic.xml +++ b/app/src/main/res/layout/fragment_import_mnemonic.xml @@ -38,17 +38,17 @@ android:background="@drawable/edit_input_shape" android:gravity="start" android:hint="@string/import_mnemonic_input_hint" - android:padding="5dp" + android:padding="10dp" android:textColor="@color/font_title" - android:textSize="12sp" /> + android:textSize="14sp" /> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index cc4fe037..e96aa89e 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -5,8 +5,7 @@ #FF4081 #55FF4081 #333333 - #1646FF - #2959CC + #4f72ff #FFFFFF #FF333333 From 126c1969346744d07e80d71f3a99f729663049bd Mon Sep 17 00:00:00 2001 From: duanyytop Date: Mon, 13 Aug 2018 09:20:11 +0800 Subject: [PATCH 084/121] fix token amount show bug --- .../neuron/activity/PayTokenActivity.java | 18 +++---- .../activity/TransactionDetailActivity.java | 2 +- .../neuron/activity/TransferActivity.java | 22 ++++---- .../neuron/dialog/TokenTransferDialog.java | 2 +- .../TokenListFragment/model/TokenAdapter.java | 2 +- .../neuron/fragment/WalletFragment.java | 7 +-- .../nervos/neuron/item/TransactionInfo.java | 9 ++-- .../neuron/service/NervosHttpService.java | 8 +-- .../org/nervos/neuron/util/NumberUtil.java | 19 +++---- .../res/layout/dialog_confirm_transfer.xml | 52 +++++-------------- .../res/layout/dialog_transfer_password.xml | 2 + 11 files changed, 51 insertions(+), 92 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java b/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java index c9f2a85d..3f516d1a 100644 --- a/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java @@ -20,6 +20,7 @@ import org.nervos.neuron.service.NervosRpcService; import org.nervos.neuron.service.EthRpcService; import org.nervos.neuron.util.Blockies; +import org.nervos.neuron.util.ConstUtil; import org.nervos.neuron.util.NumberUtil; import org.nervos.neuron.crypto.AESCrypt; import org.nervos.neuron.util.db.DBWalletUtil; @@ -85,8 +86,8 @@ private void initView() { payDataText.setText(transactionInfo.data); payAddressText.setText(transactionInfo.to); if (transactionInfo.isEthereum()) { - payAmountText.setText(NumberUtil.getDecimal_6(transactionInfo.getValue())); - paySumText.setText(NumberUtil.getDecimal_6(transactionInfo.getValue() + payAmountText.setText(NumberUtil.getDecimal_10(transactionInfo.getValue())); + paySumText.setText(NumberUtil.getDecimal_10(transactionInfo.getValue() + transactionInfo.getGas())); if (TextUtils.isEmpty(transactionInfo.gasPrice) || "0".equals(transactionInfo.gasPrice)) { showProgressCircle(); @@ -101,18 +102,17 @@ public void onError(Throwable e) { e.printStackTrace(); dismissProgressCircle(); } - @Override public void onNext(BigInteger gasPrice) { transactionInfo.gasPrice = gasPrice.toString(16); - paySumText.setText(NumberUtil.getDecimal_6(transactionInfo.getValue() + paySumText.setText(NumberUtil.getDecimal_10(transactionInfo.getValue() + transactionInfo.getGas())); } }); } } else { - payAmountText.setText(NumberUtil.getDecimal_6(transactionInfo.getValue())); - paySumText.setText(NumberUtil.getDecimal_6(transactionInfo.getValue() + payAmountText.setText(NumberUtil.getDecimal_10(transactionInfo.getValue())); + paySumText.setText(NumberUtil.getDecimal_10(transactionInfo.getValue() + transactionInfo.getQuota())); } @@ -168,9 +168,9 @@ private View getConfirmTransferView(BottomSheetDialog sheetDialog) { fromAddress.setText(walletItem.address); toAddress.setText(transactionInfo.to); - valueText.setText(NumberUtil.getDecimal_6(transactionInfo.getValue())); - feeConfirmText.setText(NumberUtil.getDecimal_6(transactionInfo.isEthereum() ? - transactionInfo.getGas() : transactionInfo.getQuota())); + valueText.setText(NumberUtil.getDecimal_10(transactionInfo.getValue())); + feeConfirmText.setText(transactionInfo.isEthereum() ? + transactionInfo.getGas() + ConstUtil.ETH : transactionInfo.getQuota()); view.findViewById(R.id.close_layout).setOnClickListener(v -> sheetDialog.dismiss()); view.findViewById(R.id.transfer_confirm_button).setOnClickListener(v -> showPasswordConfirmView(progressBar)); diff --git a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java index 642f2778..5448d444 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransactionDetailActivity.java @@ -67,7 +67,7 @@ protected void initData() { transactionChainName.setText(R.string.ethereum_main_net); BigInteger gasPriceBig = new BigInteger(transactionItem.gasPrice); BigInteger gasUsedBig = new BigInteger(transactionItem.gasUsed); - transactionGas.setText(NumberUtil.getEthFromWeiForStringDecimal6(gasPriceBig.multiply(gasUsedBig)) + "eth"); + transactionGas.setText(NumberUtil.getEthFromWeiForStringDecimal10(gasPriceBig.multiply(gasUsedBig)) + "eth"); transactionGasPrice.setText(Convert.fromWei(gasPriceBig.toString(), Convert.Unit.GWEI) + " Gwei"); String value = (transactionItem.from.equalsIgnoreCase(walletItem.address) ? "-" : "+") + transactionItem.value; diff --git a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java index 221a0326..7830a2f8 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java @@ -54,7 +54,6 @@ import org.web3j.utils.Convert; import java.math.BigInteger; -import java.text.DecimalFormat; import java.util.Objects; import de.hdodenhof.circleimageview.CircleImageView; @@ -218,10 +217,10 @@ public void onNext(String price) { private void initFeeText() { double fee = NumberUtil.getEthFromWei(mGas); if (fee > 0) { - feeSeekText.setText(fee + getTokenUnit()); + feeSeekText.setText(fee + getFeeTokenUnit()); if (mPrice > 0 && currencyItem != null) { feeValueText.setText(feeSeekText.getText() + "=" + - currencyItem.getSymbol() + NumberUtil.getDecimal_8(fee * mPrice)); + currencyItem.getSymbol() + NumberUtil.getDecimal_10(fee * mPrice)); } } } @@ -233,7 +232,7 @@ private void initQuota() { mQuotaUnit = ConstUtil.QUOTA_TOKEN.divide(BigInteger.valueOf(DEFAULT_QUOTA_SEEK)); feeSeekBar.setProgress(mQuota.divide(mQuotaUnit).intValue()); - feeSeekText.setText(NumberUtil.getEthFromWei(mQuota) + getTokenUnit()); + feeSeekText.setText(NumberUtil.getEthFromWei(mQuota) + getFeeTokenUnit()); feeValueText.setText(feeSeekText.getText()); } @@ -276,7 +275,7 @@ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { initFeeText(); } else { mQuota = mQuotaUnit.multiply(BigInteger.valueOf(progress)); - feeSeekText.setText(NumberUtil.getEthFromWei(mQuota) + getTokenUnit()); + feeSeekText.setText(NumberUtil.getEthFromWei(mQuota) + getFeeTokenUnit()); feeValueText.setText(feeSeekText.getText()); } } @@ -388,7 +387,7 @@ private boolean isETH() { return tokenItem.chainId < 0; } - private String getTokenUnit() { + private String getFeeTokenUnit() { if (isETH()) { return "ETH"; } else { @@ -402,7 +401,7 @@ private void advancedSetupETHFeeValue() { quotaEditLayout.setVisibility(View.GONE); if (isGasLimitOk && isGasPriceOk) { feeValueText.setText( - NumberUtil.getEthFromWei(mGasPrice.multiply(mGasLimit)) + getTokenUnit()); + NumberUtil.getEthFromWei(mGasPrice.multiply(mGasLimit)) + getFeeTokenUnit()); } else { feeValueText.setText("0"); } @@ -414,7 +413,7 @@ private void advancedSetupNervosFeeValue() { gasEditLayout.setVisibility(View.GONE); quotaEditLayout.setVisibility(View.VISIBLE); if (!TextUtils.isEmpty(customQuotaEdit.getText())) { - feeValueText.setText(NumberUtil.getEthFromWei(mQuota) + getTokenUnit()); + feeValueText.setText(NumberUtil.getEthFromWei(mQuota) + getFeeTokenUnit()); } else { feeValueText.setText("0"); } @@ -425,18 +424,17 @@ private void advancedSetupNervosFeeValue() { * * @return */ + @SuppressLint("SetTextI18n") private View getConfirmTransferView() { View view = getLayoutInflater().inflate(R.layout.dialog_confirm_transfer, null); ProgressBar progressBar = view.findViewById(R.id.transfer_progress); String value = transferValueEdit.getText().toString().trim(); - double sum = Double.parseDouble(value) + NumberUtil.getEthFromWei(isETH() ? mGas : mQuota); ((TextView) view.findViewById(R.id.from_address)).setText(walletItem.address); ((TextView) view.findViewById(R.id.to_address)).setText(receiveAddressEdit.getText().toString()); - ((TextView) view.findViewById(R.id.transfer_value)).setText(transferValueEdit.getText().toString()); - ((TextView) view.findViewById(R.id.transfer_fee)).setText(feeSeekText.getText().toString()); - ((TextView) view.findViewById(R.id.transfer_sum)).setText(String.valueOf(sum)); + ((TextView) view.findViewById(R.id.transfer_value)).setText(value + tokenItem.symbol); + ((TextView) view.findViewById(R.id.transfer_fee)).setText(feeSeekText.getText().toString() + getFeeTokenUnit()); view.findViewById(R.id.close_layout).setOnClickListener(new View.OnClickListener() { @Override diff --git a/app/src/main/java/org/nervos/neuron/dialog/TokenTransferDialog.java b/app/src/main/java/org/nervos/neuron/dialog/TokenTransferDialog.java index 20341a32..284a2094 100644 --- a/app/src/main/java/org/nervos/neuron/dialog/TokenTransferDialog.java +++ b/app/src/main/java/org/nervos/neuron/dialog/TokenTransferDialog.java @@ -56,7 +56,7 @@ private void initView() { } else { tokenImage.setImageURI(tokenItem.avatar); } - tokenBalanceText.setText(NumberUtil.getDecimal_6(tokenItem.balance)); + tokenBalanceText.setText(NumberUtil.getDecimal_10(tokenItem.balance)); } private void initListener() { diff --git a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java index 3113e3f4..512354ee 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java +++ b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java @@ -69,7 +69,7 @@ public void onBindViewHolder(@NonNull TokenViewHolder holder, int position) { } if (tokenItem != null) { holder.tokenName.setText(tokenItem.symbol); - holder.tokenBalance.setText(NumberUtil.getDecimal_6(tokenItem.balance)); + holder.tokenBalance.setText(NumberUtil.getDecimal_10(tokenItem.balance)); } if (!TextUtils.isEmpty(tokenItem.chainName)) { holder.tokenNetworkText.setText(tokenItem.chainName); diff --git a/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java b/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java index a997c0fb..62d4196e 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java @@ -17,11 +17,9 @@ import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; -import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; -import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import org.nervos.neuron.R; @@ -29,17 +27,14 @@ import org.nervos.neuron.activity.ReceiveQrCodeActivity; import org.nervos.neuron.activity.TokenManageActivity; import org.nervos.neuron.activity.TransactionListActivity; -import org.nervos.neuron.activity.TransferActivity; import org.nervos.neuron.activity.WalletManageActivity; import org.nervos.neuron.custom.TitleBar; import org.nervos.neuron.dialog.DialogUtil; -import org.nervos.neuron.dialog.TokenTransferDialog; import org.nervos.neuron.event.TokenRefreshEvent; import org.nervos.neuron.item.TokenItem; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.service.WalletService; import org.nervos.neuron.util.Blockies; -import org.nervos.neuron.util.LogUtil; import org.nervos.neuron.util.NumberUtil; import org.nervos.neuron.util.db.DBWalletUtil; import org.nervos.neuron.util.db.SharePrefUtil; @@ -218,7 +213,7 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi } if (tokenItemList.get(position) != null) { viewHolder.tokenName.setText(tokenItemList.get(position).symbol); - viewHolder.tokenAmount.setText(NumberUtil.getDecimal_6(tokenItemList.get(position).balance)); + viewHolder.tokenAmount.setText(NumberUtil.getDecimal_10(tokenItemList.get(position).balance)); } viewHolder.itemView.setTag(position); } diff --git a/app/src/main/java/org/nervos/neuron/item/TransactionInfo.java b/app/src/main/java/org/nervos/neuron/item/TransactionInfo.java index 96abf46e..6b5f6735 100644 --- a/app/src/main/java/org/nervos/neuron/item/TransactionInfo.java +++ b/app/src/main/java/org/nervos/neuron/item/TransactionInfo.java @@ -4,10 +4,7 @@ import android.os.Parcelable; import android.text.TextUtils; -import com.google.gson.annotations.SerializedName; - import org.nervos.neuron.util.ConstUtil; -import org.nervos.neuron.util.LogUtil; import org.nervos.neuron.util.NumberUtil; import org.web3j.utils.Numeric; @@ -37,18 +34,18 @@ public TransactionInfo(String to, String value) { public double getValue() { value = TextUtils.isEmpty(value)? "0":value; - return NumberUtil.getEthFromWeiForDoubleDecimal6(value); + return NumberUtil.getEthFromWeiForDouble(value); } public double getQuota() { - return NumberUtil.getEthFromWeiForDoubleDecimal6(String.valueOf(quota)); + return NumberUtil.getEthFromWeiForDouble(String.valueOf(quota)); } public double getGas() { BigInteger limitBig = TextUtils.isEmpty(gasLimit)? ConstUtil.GAS_LIMIT:Numeric.toBigInt(gasLimit); BigInteger priceBig = TextUtils.isEmpty(gasPrice)? BigInteger.ZERO:Numeric.toBigInt(gasPrice); - return NumberUtil.getEthFromWeiForDoubleDecimal6( + return NumberUtil.getEthFromWeiForDouble( limitBig.multiply(priceBig).toString()); } diff --git a/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java b/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java index dffafef6..c12b7b81 100644 --- a/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java +++ b/app/src/main/java/org/nervos/neuron/service/NervosHttpService.java @@ -61,7 +61,7 @@ public Observable> call(EthMetaData.EthMetaDataResult resu .body().string(), NervosTransactionResponse.class); for (TransactionItem item : response.result.transactions) { item.chainName = ethMetaDataResult.chainName; - item.value = NumberUtil.getEthFromWeiForStringDecimal6(item.value) + item.value = NumberUtil.getEthFromWeiForStringDecimal10(item.value) + ethMetaDataResult.tokenSymbol; } return Observable.just(response.result.transactions); @@ -81,7 +81,7 @@ public Observable> call(List list) { .body().string(), EthTransactionResponse.class); for(TransactionItem item : response.result) { item.chainName = ConstUtil.ETH_MAINNET; - item.value = (NumberUtil.getEthFromWeiForStringDecimal6(item.value) + ConstUtil.ETH); + item.value = (NumberUtil.getEthFromWeiForStringDecimal10(item.value) + ConstUtil.ETH); } if (list != null && list.size() != 0) { response.result.addAll(list); @@ -113,7 +113,7 @@ public Observable> call(WalletItem walletItem) { List transactionItemList = response.result; for(TransactionItem item : transactionItemList) { item.chainName = ConstUtil.ETH_MAINNET; - item.value = (NumberUtil.getEthFromWeiForStringDecimal6(item.value) + ConstUtil.ETH); + item.value = (NumberUtil.getEthFromWeiForStringDecimal10(item.value) + ConstUtil.ETH); } return Observable.just(transactionItemList); } catch (IOException e) { @@ -146,7 +146,7 @@ public Observable> call(EthMetaData.EthMetaDataResult resu .body().string(), NervosTransactionResponse.class); for (TransactionItem item : response.result.transactions) { item.chainName = result.chainName; - item.value = NumberUtil.getEthFromWeiForStringDecimal6(item.value) + item.value = NumberUtil.getEthFromWeiForStringDecimal10(item.value) + result.tokenSymbol; } return Observable.just(response.result.transactions); diff --git a/app/src/main/java/org/nervos/neuron/util/NumberUtil.java b/app/src/main/java/org/nervos/neuron/util/NumberUtil.java index d5bab0af..bc576b8a 100644 --- a/app/src/main/java/org/nervos/neuron/util/NumberUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/NumberUtil.java @@ -17,13 +17,8 @@ public class NumberUtil { - public static String getDecimal_6(double value) { - DecimalFormat fmt = new DecimalFormat("0.######"); - return fmt.format(value); - } - - public static String getDecimal_8(double value) { - DecimalFormat fmt = new DecimalFormat("0.########"); + public static String getDecimal_10(double value) { + DecimalFormat fmt = new DecimalFormat("0.##########"); return fmt.format(value); } @@ -114,15 +109,15 @@ public static BigInteger getWeiFromEth(double value) { return Convert.toWei(String.valueOf(value), Convert.Unit.ETHER).toBigInteger(); } - public static String getEthFromWeiForStringDecimal6(String value) { - return getDecimal_6(getEthFromWeiForDoubleDecimal6(value)); + public static String getEthFromWeiForStringDecimal10(String value) { + return getDecimal_10(getEthFromWeiForDouble(value)); } - public static String getEthFromWeiForStringDecimal6(BigInteger value) { - return getDecimal_6(getEthFromWei(value)); + public static String getEthFromWeiForStringDecimal10(BigInteger value) { + return getDecimal_10(getEthFromWei(value)); } - public static double getEthFromWeiForDoubleDecimal6(String value) { + public static double getEthFromWeiForDouble(String value) { if (TextUtils.isEmpty(value)) return 0.0; if (Numeric.containsHexPrefix(value)) { return getEthFromWei(Numeric.toBigInt(value)); diff --git a/app/src/main/res/layout/dialog_confirm_transfer.xml b/app/src/main/res/layout/dialog_confirm_transfer.xml index fd29f097..970b34df 100644 --- a/app/src/main/res/layout/dialog_confirm_transfer.xml +++ b/app/src/main/res/layout/dialog_confirm_transfer.xml @@ -5,7 +5,7 @@ @@ -45,9 +45,10 @@ android:textColor="@color/default_black" android:textSize="35sp"/> - @@ -65,21 +66,23 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center_vertical" - android:layout_alignParentEnd="true" - android:layout_toEndOf="@id/to_address_text" android:layout_marginStart="@dimen/default_margin" + android:maxEms="16" + android:singleLine="true" + android:ellipsize="middle" android:textSize="15sp" android:textColor="@color/font_title"/> - + - @@ -93,16 +96,16 @@ - + @@ -135,37 +138,6 @@ android:textColor="@color/font_title"/> - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_transfer_password.xml b/app/src/main/res/layout/dialog_transfer_password.xml index f7f2f4d2..69cffefe 100644 --- a/app/src/main/res/layout/dialog_transfer_password.xml +++ b/app/src/main/res/layout/dialog_transfer_password.xml @@ -32,6 +32,8 @@ android:textColor="@color/default_black" android:layout_centerInParent="true"/> + + Date: Mon, 13 Aug 2018 14:29:58 +0800 Subject: [PATCH 085/121] update sign message ui --- .../neuron/activity/AppWebActivity.java | 2 + .../neuron/activity/PayTokenActivity.java | 171 ++++++++++-------- .../nervos/neuron/util/db/DBChainUtil.java | 2 +- .../main/res/layout/activity_pay_token.xml | 71 ++++++-- .../res/layout/dialog_confirm_transfer.xml | 2 +- .../main/res/layout/dialog_sign_message.xml | 90 +++++---- app/src/main/res/values/strings.xml | 1 + 7 files changed, 200 insertions(+), 139 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java index bb77f36e..093013e5 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java @@ -19,6 +19,7 @@ import com.google.gson.Gson; import org.nervos.neuron.R; +import org.nervos.neuron.custom.TitleBar; import org.nervos.neuron.dialog.SimpleDialog; import org.nervos.neuron.item.AppItem; import org.nervos.neuron.item.WalletItem; @@ -263,6 +264,7 @@ private View getSignMessageView(Message message) { TextView payDataText = view.findViewById(R.id.pay_data); CircleImageView photoImage = view.findViewById(R.id.wallet_photo); ProgressBar progressBar = view.findViewById(R.id.sign_progress); + TitleBar titleBar = view.findViewById(R.id.title); walletNameText.setText(walletItem.name); walletAddressText.setText(walletItem.address); diff --git a/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java b/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java index 3f516d1a..d0ec4e1c 100644 --- a/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java @@ -1,10 +1,12 @@ package org.nervos.neuron.activity; +import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.BottomSheetDialog; import android.text.TextUtils; +import android.text.method.ScrollingMovementMethod; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; @@ -15,6 +17,7 @@ import org.nervos.neuron.R; import org.nervos.neuron.dialog.SimpleDialog; import org.nervos.neuron.item.AppItem; +import org.nervos.neuron.item.ChainItem; import org.nervos.neuron.item.TransactionInfo; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.service.NervosRpcService; @@ -23,6 +26,7 @@ import org.nervos.neuron.util.ConstUtil; import org.nervos.neuron.util.NumberUtil; import org.nervos.neuron.crypto.AESCrypt; +import org.nervos.neuron.util.db.DBChainUtil; import org.nervos.neuron.util.db.DBWalletUtil; import org.nervos.neuron.util.db.SharePrefUtil; import org.web3j.protocol.core.methods.response.EthSendTransaction; @@ -46,20 +50,23 @@ public class PayTokenActivity extends BaseActivity { private WalletItem walletItem; private BottomSheetDialog sheetDialog; private AppItem appItem; + private TextView walletNameText, walletAddressText, payNameText, payAmountUnitText; + private TextView payAddressText, payAmountText, payFeeText, payDataText, payFeeUnitText; + private CircleImageView photoImage; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pay_token); - EthRpcService.init(this); - initData(); initView(); - initListener(); + initAction(); } private void initData() { + EthRpcService.init(this); + String payload = getIntent().getStringExtra(AppWebActivity.EXTRA_PAYLOAD); if (!TextUtils.isEmpty(payload)) { transactionInfo = new Gson().fromJson(payload, TransactionInfo.class); @@ -69,77 +76,65 @@ private void initData() { } + @SuppressLint("SetTextI18n") private void initView() { - TextView walletNameText = findViewById(R.id.wallet_name); - TextView walletAddressText = findViewById(R.id.wallet_address); - TextView payNameText = findViewById(R.id.pay_owner); - TextView payAddressText = findViewById(R.id.pay_address); - TextView payAmountText = findViewById(R.id.pay_amount); - TextView paySumText = findViewById(R.id.pay_sum); - TextView payDataText = findViewById(R.id.pay_data); - CircleImageView photoImage = findViewById(R.id.wallet_photo); - + walletNameText = findViewById(R.id.wallet_name); + walletAddressText = findViewById(R.id.wallet_address); + payNameText = findViewById(R.id.pay_owner); + payAddressText = findViewById(R.id.pay_address); + payAmountText = findViewById(R.id.pay_amount); + payFeeText = findViewById(R.id.pay_fee); + payDataText = findViewById(R.id.pay_data); + photoImage = findViewById(R.id.wallet_photo); + payAmountUnitText = findViewById(R.id.pay_amount_unit); + payFeeUnitText = findViewById(R.id.pay_fee_unit); + + payDataText.setMovementMethod(ScrollingMovementMethod.getInstance()); walletNameText.setText(walletItem.name); walletAddressText.setText(walletItem.address); photoImage.setImageBitmap(Blockies.createIcon(walletItem.address)); payNameText.setText(appItem.entry); payDataText.setText(transactionInfo.data); payAddressText.setText(transactionInfo.to); + + payAmountUnitText.setText(getNativeToken()); + payFeeUnitText.setText(getNativeToken()); + if (transactionInfo.isEthereum()) { payAmountText.setText(NumberUtil.getDecimal_10(transactionInfo.getValue())); - paySumText.setText(NumberUtil.getDecimal_10(transactionInfo.getValue() - + transactionInfo.getGas())); + payFeeText.setText(String.valueOf(transactionInfo.getGas())); if (TextUtils.isEmpty(transactionInfo.gasPrice) || "0".equals(transactionInfo.gasPrice)) { - showProgressCircle(); - EthRpcService.getEthGasPrice().subscribe(new Subscriber() { - @Override - public void onCompleted() { - dismissProgressCircle(); - } - - @Override - public void onError(Throwable e) { - e.printStackTrace(); - dismissProgressCircle(); - } - @Override - public void onNext(BigInteger gasPrice) { - transactionInfo.gasPrice = gasPrice.toString(16); - paySumText.setText(NumberUtil.getDecimal_10(transactionInfo.getValue() - + transactionInfo.getGas())); - } - }); + showEtherGas(); } } else { payAmountText.setText(NumberUtil.getDecimal_10(transactionInfo.getValue())); - paySumText.setText(NumberUtil.getDecimal_10(transactionInfo.getValue() - + transactionInfo.getQuota())); + payFeeText.setText(String.valueOf(transactionInfo.getQuota())); } - findViewById(R.id.sign_hex_layout).setOnClickListener(new View.OnClickListener() { + } + + private void showEtherGas() { + showProgressCircle(); + EthRpcService.getEthGasPrice().subscribe(new Subscriber() { @Override - public void onClick(View v) { - findViewById(R.id.pay_data_left_line).setVisibility(View.VISIBLE); - findViewById(R.id.pay_data_right_line).setVisibility(View.GONE); - payDataText.setText(transactionInfo.data); + public void onCompleted() { + dismissProgressCircle(); } - }); - - findViewById(R.id.sign_utf8_layout).setOnClickListener(new View.OnClickListener() { @Override - public void onClick(View v) { - findViewById(R.id.pay_data_left_line).setVisibility(View.GONE); - findViewById(R.id.pay_data_right_line).setVisibility(View.VISIBLE); - if (!TextUtils.isEmpty(transactionInfo.data) && - Numeric.containsHexPrefix(transactionInfo.data)) { - payDataText.setText(NumberUtil.hexToUtf8(transactionInfo.data)); - } + public void onError(Throwable e) { + e.printStackTrace(); + dismissProgressCircle(); + } + @SuppressLint("SetTextI18n") + @Override + public void onNext(BigInteger gasPrice) { + transactionInfo.gasPrice = gasPrice.toString(16); + payFeeText.setText(String.valueOf(transactionInfo.getGas())); } }); - } - private void initListener() { + private void initAction() { findViewById(R.id.pay_reject).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -156,8 +151,30 @@ public void onClick(View v) { sheetDialog.show(); } }); + + findViewById(R.id.sign_hex_layout).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + findViewById(R.id.pay_data_left_line).setVisibility(View.VISIBLE); + findViewById(R.id.pay_data_right_line).setVisibility(View.GONE); + payDataText.setText(transactionInfo.data); + } + }); + + findViewById(R.id.sign_utf8_layout).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + findViewById(R.id.pay_data_left_line).setVisibility(View.GONE); + findViewById(R.id.pay_data_right_line).setVisibility(View.VISIBLE); + if (!TextUtils.isEmpty(transactionInfo.data) && + Numeric.containsHexPrefix(transactionInfo.data)) { + payDataText.setText(NumberUtil.hexToUtf8(transactionInfo.data)); + } + } + }); } + @SuppressLint("SetTextI18n") private View getConfirmTransferView(BottomSheetDialog sheetDialog) { View view = getLayoutInflater().inflate(R.layout.dialog_confirm_transfer, null); TextView toAddress = view.findViewById(R.id.to_address); @@ -168,9 +185,12 @@ private View getConfirmTransferView(BottomSheetDialog sheetDialog) { fromAddress.setText(walletItem.address); toAddress.setText(transactionInfo.to); - valueText.setText(NumberUtil.getDecimal_10(transactionInfo.getValue())); - feeConfirmText.setText(transactionInfo.isEthereum() ? - transactionInfo.getGas() + ConstUtil.ETH : transactionInfo.getQuota()); + valueText.setText(NumberUtil.getDecimal_10(transactionInfo.getValue()) + getNativeToken()); + if (transactionInfo.isEthereum()) { + feeConfirmText.setText(transactionInfo.getGas() + getNativeToken()); + } else { + feeConfirmText.setText(transactionInfo.getQuota() + getNativeToken()); + } view.findViewById(R.id.close_layout).setOnClickListener(v -> sheetDialog.dismiss()); view.findViewById(R.id.transfer_confirm_button).setOnClickListener(v -> showPasswordConfirmView(progressBar)); @@ -208,23 +228,23 @@ public void onOkClick() { private void transferEth(String password, ProgressBar progressBar) { Observable.just(transactionInfo.gasPrice) - .flatMap(new Func1>() { - @Override - public Observable call(String gasPrice) { - if (TextUtils.isEmpty(transactionInfo.gasPrice) - || "0".equals(transactionInfo.gasPrice)) { - return EthRpcService.getEthGasPrice(); - } else { - return Observable.just(Numeric.toBigInt(gasPrice)); - } + .flatMap(new Func1>() { + @Override + public Observable call(String gasPrice) { + if (TextUtils.isEmpty(transactionInfo.gasPrice) + || "0".equals(transactionInfo.gasPrice)) { + return EthRpcService.getEthGasPrice(); + } else { + return Observable.just(Numeric.toBigInt(gasPrice)); } - }).flatMap(new Func1>() { - @Override - public Observable call(BigInteger gasPrice) { - return EthRpcService.transferEth(transactionInfo.to, - transactionInfo.getValue(), gasPrice, password); - } - }).subscribeOn(Schedulers.io()) + } + }).flatMap(new Func1>() { + @Override + public Observable call(BigInteger gasPrice) { + return EthRpcService.transferEth(transactionInfo.to, + transactionInfo.getValue(), gasPrice, password); + } + }).subscribeOn(Schedulers.io()) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber() { @Override @@ -315,6 +335,15 @@ private void handleTransfer(org.nervos.web3j.protocol.core.methods.response.EthS } } + private String getNativeToken() { + if (transactionInfo.isEthereum()) { + return ConstUtil.ETH; + } else { + ChainItem chainItem = DBChainUtil.getChain(mActivity, transactionInfo.chainId); + return chainItem == null? "": " " + chainItem.tokenSymbol; + } + } + private void gotoSignSuccess(String hexHash) { Intent intent = new Intent(); diff --git a/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java b/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java index 84bb4525..085ada4c 100644 --- a/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/db/DBChainUtil.java @@ -36,7 +36,7 @@ public static List getAllChain(Context context) { } } - public static ChainItem getChain(Context context, int chainId) { + public static ChainItem getChain(Context context, long chainId) { synchronized (dbObject) { try { DB db = openDB(context, DB_CHAIN); diff --git a/app/src/main/res/layout/activity_pay_token.xml b/app/src/main/res/layout/activity_pay_token.xml index 47c43924..56569d8a 100644 --- a/app/src/main/res/layout/activity_pay_token.xml +++ b/app/src/main/res/layout/activity_pay_token.xml @@ -164,35 +164,64 @@ android:textColor="@color/font_title_third" android:textSize="15sp"/> - + android:layout_marginTop="6dp"> + + + + + - + android:layout_marginTop="6dp"> + + + + + android:scrollbars="vertical" + android:fadeScrollbars="false" + android:lines="60" + android:textSize="15sp" + android:textColor="@color/font_title"/> diff --git a/app/src/main/res/layout/dialog_confirm_transfer.xml b/app/src/main/res/layout/dialog_confirm_transfer.xml index 970b34df..2377d32c 100644 --- a/app/src/main/res/layout/dialog_confirm_transfer.xml +++ b/app/src/main/res/layout/dialog_confirm_transfer.xml @@ -54,7 +54,7 @@ - - - - - + android:orientation="vertical"> + + + + @@ -68,7 +61,7 @@ android:layout_marginStart="@dimen/default_margin" android:layout_marginEnd="@dimen/default_margin" android:text="请求人" - android:textColor="@color/default_black" + android:textColor="@color/font_title_third" android:textSize="13sp"/> @@ -109,7 +105,7 @@ android:id="@+id/pay_separate" android:layout_width="0.5dp" android:layout_height="match_parent" - android:background="@color/default_gray_d5" + android:background="@color/line_input" android:layout_centerInParent="true"/> + android:textColor="@color/font_title_second" + android:textSize="15sp"/> @@ -144,13 +140,13 @@ android:layout_height="37dp" android:gravity="center" android:text="UTF8" - android:textColor="@color/default_black" - android:textSize="13sp"/> + android:textColor="@color/font_title_second" + android:textSize="15sp"/> @@ -162,16 +158,18 @@ android:layout_width="match_parent" android:layout_height="90dp" android:padding="10dp" + android:fadeScrollbars="false" + android:lines="60" android:text="data" - android:textSize="13sp" - android:textColor="@color/default_black"/> + android:textSize="15sp" + android:textColor="@color/font_title"/> @@ -188,7 +186,7 @@ android:layout_height="match_parent" android:layout_toStartOf="@id/pay_button_separate" android:layout_marginEnd="@dimen/default_margin" - android:text="拒绝" + android:text="@string/reject" android:textColor="@color/colorPrimary" android:textSize="16sp" android:gravity="center" @@ -200,7 +198,7 @@ android:layout_height="match_parent" android:layout_toEndOf="@id/pay_button_separate" android:layout_marginStart="@dimen/default_margin" - android:text="接受" + android:text="@string/approve" android:textColor="@color/white" android:textSize="16sp" android:gravity="center" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7551fb20..5943bc53 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -230,4 +230,5 @@ Neuron is a product + 消息签名 From 4245f3985065be11635b751a5c1f825adc98b5bb Mon Sep 17 00:00:00 2001 From: duanyytop Date: Mon, 13 Aug 2018 14:52:23 +0800 Subject: [PATCH 086/121] fix erc721 list bug --- .../java/org/nervos/neuron/activity/AppWebActivity.java | 4 +++- .../fragment/CollectionListFragment/CollectionAdapter.java | 7 ++++--- .../CollectionListFragment/CollectionListFragment.java | 1 - .../main/java/org/nervos/neuron/service/TokenService.java | 4 ++-- app/src/main/res/layout/item_collection.xml | 2 +- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java index 093013e5..1c9a893a 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java @@ -6,6 +6,7 @@ import android.support.annotation.Nullable; import android.support.design.widget.BottomSheetDialog; import android.text.TextUtils; +import android.text.method.ScrollingMovementMethod; import android.view.KeyEvent; import android.view.View; import android.webkit.JavascriptInterface; @@ -264,7 +265,8 @@ private View getSignMessageView(Message message) { TextView payDataText = view.findViewById(R.id.pay_data); CircleImageView photoImage = view.findViewById(R.id.wallet_photo); ProgressBar progressBar = view.findViewById(R.id.sign_progress); - TitleBar titleBar = view.findViewById(R.id.title); + + payDataText.setMovementMethod(ScrollingMovementMethod.getInstance()); walletNameText.setText(walletItem.name); walletAddressText.setText(walletItem.address); diff --git a/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java index cb7039c9..3eb48776 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java +++ b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionAdapter.java @@ -60,7 +60,8 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int po CollectionViewHolder holder = (CollectionViewHolder) viewHolder; CollectionItem collectionItem = collectionItemList.get(position); holder.collectionName.setText(collectionItem.name); - holder.collectionImage.setImageURI(collectionItem.imageUrl); + holder.collectionContractName.setText(collectionItem.assetContract.name); + holder.collectionImage.setImageURI(collectionItem.assetContract.imageUrl); holder.collectionId.setText(String.format( context.getString(R.string.collection_id_place_holder), collectionItem.tokenId)); } @@ -85,7 +86,7 @@ public int getItemViewType(int position) { class CollectionViewHolder extends RecyclerView.ViewHolder { SimpleDraweeView collectionImage; TextView collectionName; - TextView collectionNetwork; + TextView collectionContractName; TextView collectionId; RelativeLayout root; @@ -93,7 +94,7 @@ public CollectionViewHolder(View view) { super(view); collectionImage = view.findViewById(R.id.collection_image); collectionName = view.findViewById(R.id.collection_name); - collectionNetwork = view.findViewById(R.id.collection_network); + collectionContractName = view.findViewById(R.id.collection_contract_name); collectionId = view.findViewById(R.id.collection_id); root = view.findViewById(R.id.root); } diff --git a/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java index 4800461c..25a29efb 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/CollectionListFragment/CollectionListFragment.java @@ -83,7 +83,6 @@ public void onError(Throwable e) { @Override public void onNext(CollectionResponse collectionResponse) { collectionItemList = collectionResponse.assets; - LogUtil.d("collectionItemList size: " + collectionItemList.size()); adapter.refresh(collectionItemList); } }); diff --git a/app/src/main/java/org/nervos/neuron/service/TokenService.java b/app/src/main/java/org/nervos/neuron/service/TokenService.java index fa985e6c..569bdffa 100644 --- a/app/src/main/java/org/nervos/neuron/service/TokenService.java +++ b/app/src/main/java/org/nervos/neuron/service/TokenService.java @@ -124,14 +124,14 @@ public Observable call(ArrayList currencyIDItems) { } - // 0x0239769a1adf4def9f07da824b80b9c4fcb59593 ERC721测试地址 + // 0x50b74E19631f9D723Cd06F643BfEd5D140D1D1d4 ERC721测试地址 public static Observable getCollectionList(Context context) { WalletItem walletItem = DBWalletUtil.getCurrentWallet(context); return Observable.fromCallable(new Callable() { @Override public CollectionResponse call() throws Exception { Request request = new Request.Builder() - .url(HttpUrls.COLLECTION_LIST_URL + walletItem.address).build(); + .url(HttpUrls.COLLECTION_LIST_URL + "0x50b74E19631f9D723Cd06F643BfEd5D140D1D1d4").build(); Call call = NervosHttpService.getHttpClient().newCall(request); String response = ""; try { diff --git a/app/src/main/res/layout/item_collection.xml b/app/src/main/res/layout/item_collection.xml index c3d89140..0f8d3079 100644 --- a/app/src/main/res/layout/item_collection.xml +++ b/app/src/main/res/layout/item_collection.xml @@ -35,7 +35,7 @@ app:layout_constraintTop_toTopOf="parent" /> Date: Mon, 13 Aug 2018 17:31:33 +0800 Subject: [PATCH 087/121] update token amount show style --- .../neuron/activity/TransferActivity.java | 35 ++++++++++++------- .../TokenListFragment/model/TokenAdapter.java | 7 ++-- .../org/nervos/neuron/util/NumberUtil.java | 23 ++++++++++++ .../main/res/layout/activity_add_token.xml | 11 +++--- .../res/layout/dialog_transfer_password.xml | 7 ++-- app/src/main/res/values/strings.xml | 5 +++ 6 files changed, 65 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java index 7830a2f8..92954911 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java @@ -24,6 +24,7 @@ import android.widget.Toast; import org.nervos.neuron.custom.TitleBar; +import org.nervos.neuron.item.ChainItem; import org.nervos.neuron.item.CurrencyItem; import org.nervos.neuron.item.TokenItem; import org.nervos.neuron.item.WalletItem; @@ -84,7 +85,7 @@ public class TransferActivity extends NBaseActivity { private BigInteger mGasPrice, mGasUnit, mGasLimit = BigInteger.ZERO, mQuota, mQuotaUnit, mGas; private boolean isGasPriceOk = false, isGasLimitOk = false; private String transactionHexData; - private double mPrice = 0.0f; + private double mPrice = 0.0f, mBalance; private CurrencyItem currencyItem; private TitleBar titleBar; @@ -153,8 +154,10 @@ public void onError(Throwable e) { } @Override public void onNext(Double balance) { + mBalance = balance; balanceText.setText(String.format( - getString(R.string.transfer_balance_place_holder), balance + tokenItem.symbol)); + getString(R.string.transfer_balance_place_holder), + NumberUtil.getDecimal8ENotation(balance) + " " + tokenItem.symbol)); } }); } @@ -217,12 +220,13 @@ public void onNext(String price) { private void initFeeText() { double fee = NumberUtil.getEthFromWei(mGas); if (fee > 0) { - feeSeekText.setText(fee + getFeeTokenUnit()); + feeSeekText.setText(NumberUtil.getDecimal8ENotation(fee) + getFeeTokenUnit()); if (mPrice > 0 && currencyItem != null) { - feeValueText.setText(feeSeekText.getText() + "=" + - currencyItem.getSymbol() + NumberUtil.getDecimal_10(fee * mPrice)); + feeValueText.setText(feeSeekText.getText() + " = " + + currencyItem.getSymbol() + NumberUtil.getDecimalValid_2(fee * mPrice)); } } + } @SuppressLint("SetTextI18n") @@ -232,7 +236,8 @@ private void initQuota() { mQuotaUnit = ConstUtil.QUOTA_TOKEN.divide(BigInteger.valueOf(DEFAULT_QUOTA_SEEK)); feeSeekBar.setProgress(mQuota.divide(mQuotaUnit).intValue()); - feeSeekText.setText(NumberUtil.getEthFromWei(mQuota) + getFeeTokenUnit()); + feeSeekText.setText(NumberUtil.getDecimal8ENotation( + NumberUtil.getEthFromWei(mQuota)) + getFeeTokenUnit()); feeValueText.setText(feeSeekText.getText()); } @@ -257,6 +262,9 @@ protected void initAction() { Toast.makeText(mActivity, R.string.address_error, Toast.LENGTH_LONG).show(); } else if (TextUtils.isEmpty(transferValueEdit.getText().toString().trim())) { Toast.makeText(mActivity, R.string.transfer_amount_not_null, Toast.LENGTH_SHORT).show(); + } else if (mBalance < Double.parseDouble(transferValueEdit.getText().toString().trim())) { + Toast.makeText(mActivity, String.format(getString(R.string.balance_not_enough), + tokenItem.symbol), Toast.LENGTH_SHORT).show(); } else { confirmDialog = new BottomSheetDialog(mActivity); confirmDialog.setCancelable(false); @@ -266,6 +274,7 @@ protected void initAction() { } }); feeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @SuppressLint("SetTextI18n") @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { progress = progress < 1 ? 1 : progress; @@ -275,16 +284,15 @@ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { initFeeText(); } else { mQuota = mQuotaUnit.multiply(BigInteger.valueOf(progress)); - feeSeekText.setText(NumberUtil.getEthFromWei(mQuota) + getFeeTokenUnit()); + feeSeekText.setText(NumberUtil.getDecimal8ENotation( + NumberUtil.getEthFromWei(mQuota)) + getFeeTokenUnit()); feeValueText.setText(feeSeekText.getText()); } } - @Override public void onStartTrackingTouch(SeekBar seekBar) { } - @Override public void onStopTrackingTouch(SeekBar seekBar) { @@ -389,9 +397,10 @@ private boolean isETH() { private String getFeeTokenUnit() { if (isETH()) { - return "ETH"; + return " ETH"; } else { - return Objects.requireNonNull(DBChainUtil.getChain(mActivity, tokenItem.chainId)).tokenSymbol; + ChainItem chainItem = DBChainUtil.getChain(mActivity, tokenItem.chainId); + return chainItem == null? "" : " " + chainItem.tokenSymbol; } } @@ -434,7 +443,7 @@ private View getConfirmTransferView() { ((TextView) view.findViewById(R.id.from_address)).setText(walletItem.address); ((TextView) view.findViewById(R.id.to_address)).setText(receiveAddressEdit.getText().toString()); ((TextView) view.findViewById(R.id.transfer_value)).setText(value + tokenItem.symbol); - ((TextView) view.findViewById(R.id.transfer_fee)).setText(feeSeekText.getText().toString() + getFeeTokenUnit()); + ((TextView) view.findViewById(R.id.transfer_fee)).setText(feeSeekText.getText().toString()); view.findViewById(R.id.close_layout).setOnClickListener(new View.OnClickListener() { @Override @@ -458,7 +467,7 @@ private void showPasswordConfirmView(String value, ProgressBar progressBar) { passwordDialog.setCancelable(false); passwordDialog.getWindow().setWindowAnimations(R.style.PasswordDialog); View view = LayoutInflater.from(mActivity).inflate(R.layout.dialog_transfer_password, null); - EditText passwordEdit = view.findViewById(R.id.wallet_password_edit); + AppCompatEditText passwordEdit = view.findViewById(R.id.wallet_password_edit); view.findViewById(R.id.close_layout).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { diff --git a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java index 512354ee..2a73242c 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java +++ b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/model/TokenAdapter.java @@ -1,5 +1,6 @@ package org.nervos.neuron.fragment.TokenListFragment.model; +import android.annotation.SuppressLint; import android.app.Activity; import android.net.Uri; import android.support.annotation.NonNull; @@ -49,6 +50,7 @@ public TokenViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return holder; } + @SuppressLint("SetTextI18n") @Override public void onBindViewHolder(@NonNull TokenViewHolder holder, int position) { TokenItem tokenItem = tokenItemList.get(position); @@ -69,7 +71,7 @@ public void onBindViewHolder(@NonNull TokenViewHolder holder, int position) { } if (tokenItem != null) { holder.tokenName.setText(tokenItem.symbol); - holder.tokenBalance.setText(NumberUtil.getDecimal_10(tokenItem.balance)); + holder.tokenBalance.setText(NumberUtil.getDecimal8ENotation(tokenItem.balance)); } if (!TextUtils.isEmpty(tokenItem.chainName)) { holder.tokenNetworkText.setText(tokenItem.chainName); @@ -81,7 +83,8 @@ public void onBindViewHolder(@NonNull TokenViewHolder holder, int position) { if (tokenItem.currencyPrice == 0.00) { holder.tokenCurrencyText.setText(""); } else { - holder.tokenCurrencyText.setText(listener.getCurrency().getSymbol() + tokenItem.currencyPrice); + holder.tokenCurrencyText.setText(listener.getCurrency().getSymbol() + + NumberUtil.getDecimalValid_2(tokenItem.currencyPrice)); } holder.root.setOnClickListener((view) -> { listener.onItemClick(view, position); diff --git a/app/src/main/java/org/nervos/neuron/util/NumberUtil.java b/app/src/main/java/org/nervos/neuron/util/NumberUtil.java index bc576b8a..65313570 100644 --- a/app/src/main/java/org/nervos/neuron/util/NumberUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/NumberUtil.java @@ -8,7 +8,9 @@ import org.web3j.utils.Numeric; import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; import java.math.BigInteger; +import java.math.MathContext; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; @@ -22,6 +24,27 @@ public static String getDecimal_10(double value) { return fmt.format(value); } + public static String getDecimalValid_2(double value) { + long integer = (long)value; + double decimal = value - integer; + BigDecimal b = new BigDecimal(decimal); + BigDecimal divisor = BigDecimal.ONE; + MathContext mc = new MathContext(2); + decimal = b.divide(divisor, mc).doubleValue(); + return getDecimal8ENotation(integer + decimal); + } + + public static String getDecimal8ENotation(double value) { + if (value < 1) { + double decimal = value - (long)value; + if (decimal < 0.00000001) { + return String.valueOf(value); + } + } + DecimalFormat fmt = new DecimalFormat("0.########"); + return fmt.format(value); + } + public static String hexToUtf8(String hex) { hex = Numeric.cleanHexPrefix(hex); ByteBuffer buff = ByteBuffer.allocate(hex.length()/2); diff --git a/app/src/main/res/layout/activity_add_token.xml b/app/src/main/res/layout/activity_add_token.xml index 01a6e031..15a5d9a0 100644 --- a/app/src/main/res/layout/activity_add_token.xml +++ b/app/src/main/res/layout/activity_add_token.xml @@ -92,7 +92,7 @@ android:layout_toLeftOf="@id/add_token_contract_address_scan" android:layout_toRightOf="@id/add_token_contract_address_text" android:background="@null" - android:hint="请输入ERC20代币合约地址" + android:hint="@string/input_erc20_address" android:lines="1" android:singleLine="true" android:maxEms="20" @@ -120,7 +120,7 @@ @@ -129,6 +129,7 @@ android:layout_marginStart="5dp" android:background="@android:color/white" android:gravity="end|center_vertical" + android:enabled="false" android:textSize="14sp" android:textColor="@color/default_black" android:layout_width="match_parent" @@ -151,7 +152,7 @@ @@ -160,6 +161,7 @@ android:layout_marginStart="5dp" android:background="@android:color/white" android:gravity="end|center_vertical" + android:enabled="false" android:textSize="14sp" android:textColor="@color/default_black" android:layout_width="match_parent" @@ -182,7 +184,7 @@ @@ -191,6 +193,7 @@ android:layout_marginStart="5dp" android:background="@android:color/white" android:gravity="end|center_vertical" + android:enabled="false" android:textSize="14sp" android:textColor="@color/default_black" android:layout_width="match_parent" diff --git a/app/src/main/res/layout/dialog_transfer_password.xml b/app/src/main/res/layout/dialog_transfer_password.xml index 69cffefe..e3025630 100644 --- a/app/src/main/res/layout/dialog_transfer_password.xml +++ b/app/src/main/res/layout/dialog_transfer_password.xml @@ -36,7 +36,7 @@ - + android:background="@null"/> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5943bc53..5a30d3a8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -176,6 +176,7 @@ 收藏成功 取消收藏 转账地址不能为空 + %s余额不足 转账金额不能为空 KeyStore生成失败 请输入正确的网页地址 @@ -231,4 +232,8 @@ Neuron is a product 消息签名 + 请输入ERC20代币合约地址 + 代币名称 + 代币符合 + 小数位数 From fec1ab457dbec61b02da48b2e7aee98a83a2a451 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Mon, 13 Aug 2018 18:13:26 +0800 Subject: [PATCH 088/121] fix transfer confirm ui bug --- .../neuron/activity/TransferActivity.java | 5 +++++ .../nervos/neuron/service/TokenService.java | 2 +- .../res/layout/dialog_confirm_transfer.xml | 20 +++++++++---------- .../res/layout/dialog_transfer_password.xml | 4 ++-- app/src/main/res/values/strings.xml | 1 + 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java index 92954911..f19af6b6 100644 --- a/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/TransferActivity.java @@ -11,6 +11,7 @@ import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.widget.CompoundButton; @@ -258,6 +259,8 @@ protected void initAction() { nextActionButton.setOnClickListener(v -> { if (TextUtils.isEmpty(receiveAddressEdit.getText().toString().trim())) { Toast.makeText(mActivity, R.string.transfer_address_not_null, Toast.LENGTH_SHORT).show(); + } else if (receiveAddressEdit.getText().toString().trim().equals(walletItem.address)) { + Toast.makeText(mActivity, R.string.address_from_equal_to, Toast.LENGTH_LONG).show(); } else if (!AddressUtil.isAddressValid(receiveAddressEdit.getText().toString().trim())) { Toast.makeText(mActivity, R.string.address_error, Toast.LENGTH_LONG).show(); } else if (TextUtils.isEmpty(transferValueEdit.getText().toString().trim())) { @@ -271,6 +274,7 @@ protected void initAction() { confirmDialog.getWindow().setWindowAnimations(R.style.ConfirmDialog); confirmDialog.setContentView(getConfirmTransferView()); confirmDialog.show(); + confirmDialog.getWindow().setGravity(Gravity.BOTTOM); } }); feeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @@ -507,6 +511,7 @@ public void onClick(View v) { }); passwordDialog.setContentView(view); passwordDialog.show(); + passwordDialog.getWindow().setGravity(Gravity.BOTTOM); } diff --git a/app/src/main/java/org/nervos/neuron/service/TokenService.java b/app/src/main/java/org/nervos/neuron/service/TokenService.java index 569bdffa..a3870bcf 100644 --- a/app/src/main/java/org/nervos/neuron/service/TokenService.java +++ b/app/src/main/java/org/nervos/neuron/service/TokenService.java @@ -131,7 +131,7 @@ public static Observable getCollectionList(Context context) @Override public CollectionResponse call() throws Exception { Request request = new Request.Builder() - .url(HttpUrls.COLLECTION_LIST_URL + "0x50b74E19631f9D723Cd06F643BfEd5D140D1D1d4").build(); + .url(HttpUrls.COLLECTION_LIST_URL + walletItem.address).build(); Call call = NervosHttpService.getHttpClient().newCall(request); String response = ""; try { diff --git a/app/src/main/res/layout/dialog_confirm_transfer.xml b/app/src/main/res/layout/dialog_confirm_transfer.xml index 2377d32c..c678a772 100644 --- a/app/src/main/res/layout/dialog_confirm_transfer.xml +++ b/app/src/main/res/layout/dialog_confirm_transfer.xml @@ -1,7 +1,7 @@ + android:layout_height="400dp"> - @@ -127,16 +126,15 @@ - + diff --git a/app/src/main/res/layout/dialog_transfer_password.xml b/app/src/main/res/layout/dialog_transfer_password.xml index e3025630..754c803a 100644 --- a/app/src/main/res/layout/dialog_transfer_password.xml +++ b/app/src/main/res/layout/dialog_transfer_password.xml @@ -1,11 +1,11 @@ + android:layout_height="400dp"> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5a30d3a8..3611b43c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -181,6 +181,7 @@ KeyStore生成失败 请输入正确的网页地址 地址有误:地址一般为0x开头的42位字符 + 发送地址和收款地址不能相同 网络请求错误 请输入完整的代币信息 Keystore From ea8bcc9e6c81f6a51e089b2894c15f66aede1460 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Mon, 13 Aug 2018 19:16:19 +0800 Subject: [PATCH 089/121] fix token list refresh bug --- .../neuron/activity/ChangeWalletActivity.java | 1 - .../activity/ConfirmMnemonicActivity.java | 4 +- .../fragment/ImportKeystoreFragment.java | 3 +- .../fragment/ImportMnemonicFragment.java | 3 +- .../fragment/ImportPrivateKeyFragment.java | 3 +- .../view/TokenListFragment.java | 9 +- .../neuron/fragment/WalletFragment.java | 265 ------------------ .../WalletsFragment/view/WalletsFragment.java | 11 +- 8 files changed, 18 insertions(+), 281 deletions(-) delete mode 100644 app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java diff --git a/app/src/main/java/org/nervos/neuron/activity/ChangeWalletActivity.java b/app/src/main/java/org/nervos/neuron/activity/ChangeWalletActivity.java index 4566b312..322b20b3 100644 --- a/app/src/main/java/org/nervos/neuron/activity/ChangeWalletActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/ChangeWalletActivity.java @@ -10,7 +10,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; -import android.widget.RelativeLayout; import android.widget.TextView; import org.greenrobot.eventbus.EventBus; diff --git a/app/src/main/java/org/nervos/neuron/activity/ConfirmMnemonicActivity.java b/app/src/main/java/org/nervos/neuron/activity/ConfirmMnemonicActivity.java index d9f46d95..058c294d 100644 --- a/app/src/main/java/org/nervos/neuron/activity/ConfirmMnemonicActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/ConfirmMnemonicActivity.java @@ -17,7 +17,7 @@ import org.nervos.neuron.R; import org.nervos.neuron.event.CloseWalletInfoEvent; import org.nervos.neuron.event.WalletSaveEvent; -import org.nervos.neuron.fragment.WalletFragment; +import org.nervos.neuron.fragment.WalletsFragment.view.WalletsFragment; import java.util.ArrayList; import java.util.Arrays; @@ -119,7 +119,7 @@ public void onClick(View v) { EventBus.getDefault().post(new WalletSaveEvent()); Toast.makeText(ConfirmMnemonicActivity.this, "备份成功", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(ConfirmMnemonicActivity.this, MainActivity.class); - intent.putExtra(MainActivity.EXTRA_TAG, WalletFragment.TAG); + intent.putExtra(MainActivity.EXTRA_TAG, WalletsFragment.TAG); startActivity(intent); EventBus.getDefault().post(new CloseWalletInfoEvent()); finish(); diff --git a/app/src/main/java/org/nervos/neuron/fragment/ImportKeystoreFragment.java b/app/src/main/java/org/nervos/neuron/fragment/ImportKeystoreFragment.java index 41573ce5..e6339e36 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/ImportKeystoreFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/ImportKeystoreFragment.java @@ -23,6 +23,7 @@ import org.nervos.neuron.activity.MainActivity; import org.nervos.neuron.activity.QrCodeActivity; import org.nervos.neuron.crypto.WalletEntity; +import org.nervos.neuron.fragment.WalletsFragment.view.WalletsFragment; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.util.db.DBWalletUtil; import org.nervos.neuron.util.db.SharePrefUtil; @@ -112,7 +113,7 @@ private void generateAndSaveWallet() { SharePrefUtil.putCurrentWalletName(walletItem.name); passwordEdit.post(() -> { Intent intent = new Intent(getActivity(), MainActivity.class); - intent.putExtra(MainActivity.EXTRA_TAG, WalletFragment.TAG); + intent.putExtra(MainActivity.EXTRA_TAG, WalletsFragment.TAG); startActivity(intent); Toast.makeText(getContext(), R.string.wallet_export_success, Toast.LENGTH_SHORT).show(); dismissProgressBar(); diff --git a/app/src/main/java/org/nervos/neuron/fragment/ImportMnemonicFragment.java b/app/src/main/java/org/nervos/neuron/fragment/ImportMnemonicFragment.java index 06bfc19e..d0f9fea8 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/ImportMnemonicFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/ImportMnemonicFragment.java @@ -25,6 +25,7 @@ import org.nervos.neuron.R; import org.nervos.neuron.activity.MainActivity; import org.nervos.neuron.activity.QrCodeActivity; +import org.nervos.neuron.fragment.WalletsFragment.view.WalletsFragment; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.util.NumberUtil; import org.nervos.neuron.util.db.SharePrefUtil; @@ -163,7 +164,7 @@ private void generateAndSaveWallet() { SharePrefUtil.putCurrentWalletName(walletItem.name); passwordEdit.post(() -> { Intent intent = new Intent(getActivity(), MainActivity.class); - intent.putExtra(MainActivity.EXTRA_TAG, WalletFragment.TAG); + intent.putExtra(MainActivity.EXTRA_TAG, WalletsFragment.TAG); startActivity(intent); Toast.makeText(getContext(), R.string.wallet_export_success, Toast.LENGTH_SHORT).show(); dismissProgressBar(); diff --git a/app/src/main/java/org/nervos/neuron/fragment/ImportPrivateKeyFragment.java b/app/src/main/java/org/nervos/neuron/fragment/ImportPrivateKeyFragment.java index e05ea9c2..25d57115 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/ImportPrivateKeyFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/ImportPrivateKeyFragment.java @@ -22,6 +22,7 @@ import org.nervos.neuron.R; import org.nervos.neuron.activity.MainActivity; import org.nervos.neuron.activity.QrCodeActivity; +import org.nervos.neuron.fragment.WalletsFragment.view.WalletsFragment; import org.nervos.neuron.item.WalletItem; import org.nervos.neuron.util.NumberUtil; import org.nervos.neuron.util.db.SharePrefUtil; @@ -127,7 +128,7 @@ private void generateAndSaveWallet() { SharePrefUtil.putCurrentWalletName(walletItem.name); passwordEdit.post(() -> { Intent intent = new Intent(getActivity(), MainActivity.class); - intent.putExtra(MainActivity.EXTRA_TAG, WalletFragment.TAG); + intent.putExtra(MainActivity.EXTRA_TAG, WalletsFragment.TAG); startActivity(intent); Toast.makeText(getContext(), R.string.wallet_export_success, Toast.LENGTH_SHORT).show(); dismissProgressBar(); diff --git a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java index ca1f5bc5..434d9c54 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/TokenListFragment/view/TokenListFragment.java @@ -26,6 +26,7 @@ import org.nervos.neuron.service.WalletService; import org.nervos.neuron.service.TokenService; import org.nervos.neuron.util.CurrencyUtil; +import org.nervos.neuron.util.LogUtil; import java.text.DecimalFormat; import java.util.ArrayList; @@ -69,7 +70,7 @@ protected void initView() { protected void initData() { presenter = new TokenListFragmentPresenter(getActivity()); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); - adapter = new TokenAdapter(getActivity(), this.tokenItemList); + adapter = new TokenAdapter(getActivity(), tokenItemList); recyclerView.setAdapter(adapter); initWalletData(true); setCurrency(); @@ -114,6 +115,8 @@ private void setCurrency() { @Subscribe(threadMode = ThreadMode.MAIN) public void onWalletSaveEvent(TokenRefreshEvent event) { + tokenItemList.clear(); + adapter.notifyDataSetChanged(); initWalletData(true); moneyText.setText(""); } @@ -134,7 +137,7 @@ private void initWalletData(boolean showProgress) { if (showProgress) dismissProgressBar(); swipeRefreshLayout.setRefreshing(false); if (walletItem.tokenItems != null) { - this.tokenItemList = walletItem.tokenItems; + tokenItemList = walletItem.tokenItems; setData(); } }) @@ -148,7 +151,7 @@ public void setData() { } else { recyclerView.setVisibility(View.VISIBLE); noTokenRoot.setVisibility(View.GONE); - adapter.refresh(this.tokenItemList); + adapter.refresh(tokenItemList); getPrice(); } } diff --git a/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java b/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java deleted file mode 100644 index 62d4196e..00000000 --- a/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java +++ /dev/null @@ -1,265 +0,0 @@ -package org.nervos.neuron.fragment; - -import android.content.ClipData; -import android.content.ClipboardManager; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.content.ContextCompat; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.widget.DividerItemDecoration; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.text.TextUtils; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; -import android.widget.TextView; -import android.widget.Toast; - -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; -import org.nervos.neuron.R; -import org.nervos.neuron.activity.AddWalletActivity; -import org.nervos.neuron.activity.ReceiveQrCodeActivity; -import org.nervos.neuron.activity.TokenManageActivity; -import org.nervos.neuron.activity.TransactionListActivity; -import org.nervos.neuron.activity.WalletManageActivity; -import org.nervos.neuron.custom.TitleBar; -import org.nervos.neuron.dialog.DialogUtil; -import org.nervos.neuron.event.TokenRefreshEvent; -import org.nervos.neuron.item.TokenItem; -import org.nervos.neuron.item.WalletItem; -import org.nervos.neuron.service.WalletService; -import org.nervos.neuron.util.Blockies; -import org.nervos.neuron.util.NumberUtil; -import org.nervos.neuron.util.db.DBWalletUtil; -import org.nervos.neuron.util.db.SharePrefUtil; - -import com.facebook.drawee.view.SimpleDraweeView; - -import java.util.ArrayList; -import java.util.List; - -import de.hdodenhof.circleimageview.CircleImageView; - -public class WalletFragment extends BaseFragment { - - public static final String TAG = WalletFragment.class.getName(); - - private TextView walletNameText; - private TextView addressText; - private FrameLayout receiveLayout; - private FrameLayout tokenManageLayout; - private TitleBar titleBar; - private RecyclerView tokenRecycler; - private CircleImageView photoImage; - private SwipeRefreshLayout swipeRefreshLayout; - private TokenAdapter tokenAdapter = new TokenAdapter(); - - private List tokenItemList = new ArrayList<>(); - private List walletNameList = new ArrayList<>(); - private WalletItem walletItem; - - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_wallet, container, false); - walletNameText = view.findViewById(R.id.wallet_name); - addressText = view.findViewById(R.id.wallet_address); - tokenRecycler = view.findViewById(R.id.token_list); - receiveLayout = view.findViewById(R.id.wallet_receive_layout); - tokenManageLayout = view.findViewById(R.id.wallet_token_management_layout); - titleBar = view.findViewById(R.id.title); - swipeRefreshLayout = view.findViewById(R.id.swipe_refresh_layout); - photoImage = view.findViewById(R.id.wallet_photo); - return view; - } - - @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - initWalletData(true); - initAdapter(); - initListener(); - initTitleBarListener(); - initRefresh(); - } - - private void initWalletData(boolean showProgress) { - if ((walletItem = DBWalletUtil.getCurrentWallet(getContext())) != null) { - if (showProgress) showProgressBar(); - walletNameList = DBWalletUtil.getAllWalletName(getContext()); - walletNameText.setText(walletItem.name); - addressText.setText(walletItem.address); - photoImage.setImageBitmap(Blockies.createIcon(walletItem.address)); - WalletService.getWalletTokenBalance(getContext(), walletItem -> - walletNameText.post(() -> { - if (showProgress) dismissProgressBar(); - swipeRefreshLayout.setRefreshing(false); - if (walletItem.tokenItems != null) { - tokenItemList = walletItem.tokenItems; - tokenAdapter.notifyDataSetChanged(); - } - }) - ); - } else { - startActivity(new Intent(getActivity(), AddWalletActivity.class)); - } - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onWalletSaveEvent(TokenRefreshEvent event) { - initWalletData(true); - } - - private void initListener() { - receiveLayout.setOnClickListener(v -> startActivity(new Intent(getActivity(), ReceiveQrCodeActivity.class))); - tokenManageLayout.setOnClickListener(v -> startActivity(new Intent(getActivity(), TokenManageActivity.class))); - photoImage.setOnClickListener(v -> gotoWalletManagePage()); - addressText.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - ClipboardManager cm = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); - ClipData mClipData = ClipData.newPlainText("qrCode", walletItem.address); - if (cm != null) { - cm.setPrimaryClip(mClipData); - Toast.makeText(getContext(), R.string.copy_success, Toast.LENGTH_SHORT).show(); - } - } - }); - } - - private void gotoWalletManagePage() { - startActivity(new Intent(getActivity(), WalletManageActivity.class)); - } - - private void initRefresh() { - swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - initWalletData(false); - } - }); - } - - - private void initAdapter() { - tokenRecycler.setLayoutManager(new LinearLayoutManager(getActivity())); - DividerItemDecoration decoration = new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL); - decoration.setDrawable(ContextCompat.getDrawable(getContext(), R.drawable.recycle_line)); - tokenRecycler.addItemDecoration(decoration); - tokenRecycler.setAdapter(tokenAdapter); - - tokenAdapter.setOnItemClickListener(new OnItemClickListener() { - @Override - public void onItemClick(View view, int position) { - Intent intent = new Intent(getActivity(), TransactionListActivity.class); - intent.putExtra(TransactionListActivity.EXTRA_TOKEN, tokenItemList.get(position)); - startActivity(intent); - } - }); - } - - private void initTitleBarListener() { - titleBar.setOnRightClickListener(() -> startActivity(new Intent(getActivity(), AddWalletActivity.class))); - - titleBar.setOnLeftClickListener(() -> DialogUtil.showListDialog(getContext(), - R.string.switch_current_wallet, walletNameList, walletItem.name, which -> { - SharePrefUtil.putCurrentWalletName(walletNameList.get(which)); - initWalletData(true); - })); - } - - - class TokenAdapter extends RecyclerView.Adapter { - - public static final int VIEW_TYPE_ITEM = 1; - public static final int VIEW_TYPE_EMPTY = 0; - - public OnItemClickListener onItemClickListener; - - public void setOnItemClickListener(OnItemClickListener onItemClickListener) { - this.onItemClickListener = onItemClickListener; - } - - @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - if (viewType == VIEW_TYPE_EMPTY) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_empty_view, parent, false); - ((TextView) view.findViewById(R.id.empty_text)).setText(R.string.empty_no_token_data); - return new RecyclerView.ViewHolder(view) { - }; - } - TokenViewHolder holder = new TokenViewHolder(LayoutInflater.from( - getActivity()).inflate(R.layout.item_token_list, parent, - false)); - return holder; - } - - @Override - public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { - if (holder instanceof TokenViewHolder) { - TokenViewHolder viewHolder = (TokenViewHolder) holder; - if (TextUtils.isEmpty(tokenItemList.get(position).avatar)) { - viewHolder.tokenImage.setImageResource(tokenItemList.get(position).chainId < 0 ? - R.drawable.ether_small : R.mipmap.ic_launcher); - } else { - viewHolder.tokenImage.setImageURI(tokenItemList.get(position).avatar); - } - if (tokenItemList.get(position) != null) { - viewHolder.tokenName.setText(tokenItemList.get(position).symbol); - viewHolder.tokenAmount.setText(NumberUtil.getDecimal_10(tokenItemList.get(position).balance)); - } - viewHolder.itemView.setTag(position); - } - } - - @Override - public int getItemCount() { - if (tokenItemList.size() == 0) { - return 1; - } - return tokenItemList.size(); - } - - @Override - public int getItemViewType(int position) { - if (tokenItemList.size() == 0) { - return VIEW_TYPE_EMPTY; - } - return VIEW_TYPE_ITEM; - } - - class TokenViewHolder extends RecyclerView.ViewHolder { - SimpleDraweeView tokenImage; - TextView tokenName; - TextView tokenAmount; - - public TokenViewHolder(View view) { - super(view); - view.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (onItemClickListener != null) { - onItemClickListener.onItemClick(v, (int) v.getTag()); - } - } - }); - tokenImage = view.findViewById(R.id.token_image); - tokenName = view.findViewById(R.id.token_name); - tokenAmount = view.findViewById(R.id.token_balance); - } - } - } - - private interface OnItemClickListener { - void onItemClick(View view, int position); - } - - -} diff --git a/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java b/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java index e26d0bc0..19ca3d1b 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java @@ -16,13 +16,10 @@ import org.nervos.neuron.R; import org.nervos.neuron.activity.AddWalletActivity; import org.nervos.neuron.activity.ChangeWalletActivity; -import org.nervos.neuron.activity.WalletManageActivity; import org.nervos.neuron.custom.WalletToolbar; import org.nervos.neuron.custom.WalletTopView; -import org.nervos.neuron.event.TokenRefreshEvent; import org.nervos.neuron.fragment.CollectionListFragment.CollectionListFragment; import org.nervos.neuron.fragment.NBaseFragment; -import org.nervos.neuron.fragment.SettingsFragment; import org.nervos.neuron.fragment.TokenListFragment.view.TokenListFragment; import org.nervos.neuron.fragment.WalletsFragment.presenter.WalletFragmentPresenter; import org.nervos.neuron.item.WalletItem; @@ -109,10 +106,10 @@ protected void initAction() { }); } - @Subscribe(threadMode = ThreadMode.MAIN) - public void onWalletSaveEvent(TokenRefreshEvent event) { - initWalletData(); - } +// @Subscribe(threadMode = ThreadMode.MAIN) +// public void onWalletSaveEvent(TokenRefreshEvent event) { +// initWalletData(); +// } private void initWalletData() { if ((walletItem = DBWalletUtil.getCurrentWallet(getContext())) != null) { From a914e17ee697927717bb62131ea91d89c9553209 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Mon, 13 Aug 2018 22:07:24 +0800 Subject: [PATCH 090/121] fix manifest chain set null bug --- app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java b/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java index 7b526fe0..d25ea0f1 100644 --- a/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java @@ -95,6 +95,7 @@ public Observable call(String path) { response = call.execute().body().string(); } catch (IOException e) { e.printStackTrace(); + return Observable.error(new Throwable(e.getMessage())); } mAppItem = new Gson().fromJson(response, AppItem.class); return Observable.just(mAppItem); @@ -109,6 +110,10 @@ public Boolean call(AppItem appItem) { public Observable call(AppItem appItem) { Map chainSet = appItem.chainSet; List chainItemList = new ArrayList<>(); + if (chainSet.size() == 0) { + return Observable.error(new Throwable( + "Manifest chain set is null, please provide chain id and host")); + } for(Map.Entry entry : chainSet.entrySet()) { ChainItem item = new ChainItem(); item.chainId = Integer.parseInt(entry.getKey()); From ff8f8faaa9d0a40ff9c33bdc8bba6d76d3a73a83 Mon Sep 17 00:00:00 2001 From: baojun Date: Tue, 14 Aug 2018 09:30:06 +0800 Subject: [PATCH 091/121] fix no wallet logic --- .../java/org/nervos/neuron/activity/AddWalletActivity.java | 6 ++++-- .../java/org/nervos/neuron/activity/SplashActivity.java | 1 - 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/activity/AddWalletActivity.java b/app/src/main/java/org/nervos/neuron/activity/AddWalletActivity.java index 935fd875..c208dcc8 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AddWalletActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AddWalletActivity.java @@ -1,12 +1,14 @@ package org.nervos.neuron.activity; import android.content.Intent; +import android.text.TextUtils; import android.view.KeyEvent; import org.nervos.neuron.R; import org.nervos.neuron.custom.TitleBar; import org.nervos.neuron.fragment.AppFragment; import org.nervos.neuron.util.db.DBWalletUtil; +import org.nervos.neuron.util.db.SharePrefUtil; public class AddWalletActivity extends NBaseActivity { @@ -29,7 +31,7 @@ protected void initData() { findViewById(R.id.import_wallet_button).setOnClickListener(v -> startActivity(new Intent(mActivity, ImportWalletActivity.class))); TitleBar titleBar = findViewById(R.id.title); - if (getIntent().getBooleanExtra("isFirst", false)) { + if (TextUtils.isEmpty(SharePrefUtil.getCurrentWalletName())) { titleBar.hideLeft(); } else { titleBar.showLeft(); @@ -62,7 +64,7 @@ private void goBack() { @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { - if (!getIntent().getBooleanExtra("isFirst", false)) + if (!TextUtils.isEmpty(SharePrefUtil.getCurrentWalletName())) goBack(); } return super.onKeyDown(keyCode, event); diff --git a/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java b/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java index 560801f5..1669611a 100644 --- a/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/SplashActivity.java @@ -31,7 +31,6 @@ public void run() { } } else { Intent intent = new Intent(mActivity, AddWalletActivity.class); - intent.putExtra("isFirst", true); startActivity(intent); } finish(); From 7f4f30d9da3480ce1c348b6979bba82c8f5d1962 Mon Sep 17 00:00:00 2001 From: duanyytop Date: Tue, 14 Aug 2018 09:31:41 +0800 Subject: [PATCH 092/121] fix wallet switch bug --- .../fragment/WalletsFragment/view/WalletsFragment.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java b/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java index 19ca3d1b..4a80a5f6 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/WalletsFragment/view/WalletsFragment.java @@ -18,6 +18,7 @@ import org.nervos.neuron.activity.ChangeWalletActivity; import org.nervos.neuron.custom.WalletToolbar; import org.nervos.neuron.custom.WalletTopView; +import org.nervos.neuron.event.TokenRefreshEvent; import org.nervos.neuron.fragment.CollectionListFragment.CollectionListFragment; import org.nervos.neuron.fragment.NBaseFragment; import org.nervos.neuron.fragment.TokenListFragment.view.TokenListFragment; @@ -106,10 +107,10 @@ protected void initAction() { }); } -// @Subscribe(threadMode = ThreadMode.MAIN) -// public void onWalletSaveEvent(TokenRefreshEvent event) { -// initWalletData(); -// } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onWalletSaveEvent(TokenRefreshEvent event) { + initWalletData(); + } private void initWalletData() { if ((walletItem = DBWalletUtil.getCurrentWallet(getContext())) != null) { From ecb9b53d6fde5517680ea2a50025fb7ec6fad044 Mon Sep 17 00:00:00 2001 From: baojun Date: Mon, 13 Aug 2018 15:04:13 +0800 Subject: [PATCH 093/121] fix add_wallet animation black background --- app/src/main/AndroidManifest.xml | 6 +++--- .../org/nervos/neuron/activity/ChangeWalletActivity.java | 5 +++++ app/src/main/res/values/styles.xml | 6 ++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f74777e2..171efeb6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,7 +50,8 @@ android:screenOrientation="portrait" android:theme="@style/AppTheme.NoActionBar" /> - @@ -148,8 +149,7 @@ android:theme="@style/AppTheme.NoActionBar" /> + android:theme="@style/transparent_activity" /> true + +

L(|H9AcmcW# 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 S^|J8jmjioSXMD8{Iq^R&hNigy diff --git a/app/src/main/res/drawable-xxxhdpi/input.png b/app/src/main/res/drawable-xxxhdpi/input.png deleted file mode 100644 index 6dc37b1adbd201992075ffbe361a0012cd33ed99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5340 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 D!B6MD diff --git a/app/src/main/res/drawable-xxxhdpi/tab_app_default.png b/app/src/main/res/drawable-xxxhdpi/tab_app_default.png deleted file mode 100644 index 509470009dc521ca9b4414ad38fdaa760069c3a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1321 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 diff --git a/app/src/main/res/drawable-xxxhdpi/tab_settings_default.png b/app/src/main/res/drawable-xxxhdpi/tab_settings_default.png deleted file mode 100644 index 017842e05d943c49680392f5e6948d33e26bae04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2493 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 Hu0mjf5!SiM diff --git a/app/src/main/res/drawable-xxxhdpi/tab_settings_selected.png b/app/src/main/res/drawable-xxxhdpi/tab_settings_selected.png deleted file mode 100644 index cd657d317dc4c68f1a5f6c2774dd1557db19e699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2630 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�T8_Go+i zlV7zX|D(_gT2-_;oq`7r`7KIvJ)Pd;D?b>bz4=KM9oo`(LWI_kdqz|NQS2jWRyV8Ca*q zKlpDcalK||^!0m(T4n#e&7NLA)p8v}{hPbFb^A@EdTq^fST1nvkpKAEvF~%l&xH(s zIZyDPwzjtJZ~UF~G^% zq^0d#Q$#E}N*-wJexp{DGT(UL-HdPVa`xvvx;=CD&Du>?Cr`!tw1~4PFfek6s4nQr zlDYK#)t_rK>vjK56FDpGyxjVHXqVZ^3y&&PEB{m$zDiGD!}H#o|4qUFZD*_|&V0ka ztj<3qWNXd|&;Op{@^^3VoVg=!URsg;_8*qz=N5c9@NUxu%ZK~kI~V;Ho5Vd$&Z740 z+wET_+^H*7NnXl6Eha~BD}zj=>;Z;89f6%TWd;q(+%9_kvNDoCX5|09b!WY#(Mi+a zotevi%WQS@T5mSZKewd+@d?ff#_-o?)uS$RE5*J{HNF==E(#p)$e|_~n$#_Nn`}F6V<=tB=Z|}C=o%ds#d3C(`p6t; z*SMNCTmS31bHUDOXPUn4$;r9?Y){r2AN$vw%h(D!JsPjPIvYLfOp~G5^vazxP8aU< zId#yWfnVd>{TtOi@0YjTaGoE-u>8lH)Q3q~9kyRivKGubf1#qP!}i+=R)f{*!VDXF zl%rV>==Az995Cw35oOqHV#LUB+G0~E!H22Zk z$3?e~2ibpqr+-&pxFWam)#OD_*fhU3yKXiFO5L2J%=QT+^&*;M-I;%u-ktC2Ub(5y zjt}>%vtJZ{A+z%P`Q7mXY?Blj8WRO9cCcMf+rBO^X;JUV4?B zoSJpDH1yj-tJ0PCYVzl2?3sPvq;3D?zkN&jdzZefK4rJ|heP(~ydTr&{O6kNV(asU zZ{Otl*B4)8%w9uQK%U{E_FI X{HkQ;uD8p8*_y%A)z4*}Q$iB}n+etN diff --git a/app/src/main/res/drawable-xxxhdpi/tab_wallet_default.png b/app/src/main/res/drawable-xxxhdpi/tab_wallet_default.png deleted file mode 100644 index e16f4397557e389a7fb4c9fae7d6cd913e712824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1420 zcmV;71#|j|P)Px)MoC0LRCodHozF`ZQ547L%~P|Vi+r^$+EiKuMpO`G68T#QT7-)ts6_?+0kx5! zMYMRg~FmtXweIbpg@p(CZQSrcxvCHK9Qj}bLY;ze%|cr>Z+KXojr_c?L$uB+Gdnxu~@8(j!_n)97Q>b@)zoU z(J{)e@p$~r+}vD$Q&ZDloChMsR&y2r6zlBltOC$#%;OO9LFA2I<^9W+Br=896)UIqJTi(KY;$+G|fkijg7Aa+AD418(@Hp z1MC@;7ofp0l)jC+7e)y2!QC3K(E30rfUA`PjfEK>mSz4X)!E%6T0V)B?Dtr)R_1*w|f6`aIxj8ACCQ zek_P*0s6CIxrTD(5f$vsX0y*R(VeO%t5Y6~VFLLwLcAv`$59FxF5x1ggS(jET9uRZ zQx+gUM!updmR157E}?XMeEcEYL5rU-G>(+4&a$z<9wkrQ4g z6QusI;-7$AjVL4SWnP{D!zHYP)h2@)C3pd|)OQ%5tDBpfKgr56Wjm%)sr3NcS-@}! z%~s?dTDWC7Nm(#9WY!>3NCECK*@45<4^}*aC%~gJVVsl&V{_(CRN#^!K-UDKqZbt4 zyEP2gfZ=yrFxVxx1BJakAn!t?^uVniu3Q8*Yjy+fdknVT?LdXno?>JydiO>35e7_) z+T`TqI|wcp6<(n2rUCf~Aio#UPuN9FO-;2zVASCf(-P!I_$iLliBl2+OdI47c-2W* zRO-Q^0!%K7=qm&mQNt|=qdUiGi2xwqK)AZe35X+LL=8tElN>`}ZywBKB^T!yO%Y)%Xr zEU`6lKyHDP1_IdHJxPzs2@SGYBnZGwY#|Hg1x=GV5L?I19!+CMMl1u?e5)BS1J+DH zvv{^(2CSKYX7Oyn3|KP(&EnaD8L(yon#C8yV{&O}sZm~DZX^;3gN}ogLJydLR#jCQ zB_+XpFDCRpm@GG_aOo#0^nl4N1UZEsaL|0N^=5}2uvMX;oikv~cZ30J1|0e@O$Q(R zsf3YEr;U-3#g`^&A*EsZW9Bx5X-p*%jJbrySo3ir)vy29~nj08L$PU-IJkRokh&@DFa?cv3QVg zZ-e$bsLpNTD8fQ4w>!sSngxu?Q-WMsS*b)My9gy1^9y0X`PnF`VZcf-<`)ur!1QPv z