From 03c5569f91b05ad96cf88f405a20f4c167b5a1d9 Mon Sep 17 00:00:00 2001 From: m2049r <30435443+m2049r@users.noreply.github.com> Date: Tue, 31 Oct 2017 22:35:23 +0100 Subject: [PATCH] Sexy UI (#104) Version 29/1.1.2-alpha --- app/build.gradle | 4 +- .../m2049r/xmrwallet/GenerateFragment.java | 496 +++++++++--------- .../xmrwallet/GenerateReviewFragment.java | 138 +++-- .../com/m2049r/xmrwallet/LoginActivity.java | 366 +++++++++---- .../com/m2049r/xmrwallet/LoginFragment.java | 304 +++++++---- .../com/m2049r/xmrwallet/ReceiveFragment.java | 316 ++++------- .../com/m2049r/xmrwallet/ScannerFragment.java | 3 - .../com/m2049r/xmrwallet/SendFragment.java | 333 ++++++------ .../java/com/m2049r/xmrwallet/TxFragment.java | 133 +++-- .../com/m2049r/xmrwallet/WalletActivity.java | 129 +++-- .../com/m2049r/xmrwallet/WalletFragment.java | 225 ++++++-- .../m2049r/xmrwallet/dialog/HelpFragment.java | 9 +- .../xmrwallet/dialog/LicensesFragment.java | 19 +- .../xmrwallet/layout/AsyncExchangeRate.java | 159 ++++++ .../xmrwallet/layout/CTextInputLayout.java | 44 ++ .../m2049r/xmrwallet/layout/ExchangeView.java | 399 ++++++++++++++ .../com/m2049r/xmrwallet/layout/Toolbar.java | 155 ++++++ .../layout/TransactionInfoAdapter.java | 63 +-- .../xmrwallet/layout/WalletInfoAdapter.java | 157 ++++++ .../xmrwallet/model/TransactionHistory.java | 11 + .../xmrwallet/model/TransactionInfo.java | 16 +- .../m2049r/xmrwallet/model/WalletManager.java | 12 +- .../xmrwallet/service/WalletService.java | 17 +- .../com/m2049r/xmrwallet/util/Helper.java | 62 ++- .../com/m2049r/xmrwallet/util/NodeList.java | 2 - app/src/main/res/anim/fab_close.xml | 18 + app/src/main/res/anim/fab_close_screen.xml | 9 + app/src/main/res/anim/fab_open.xml | 18 + app/src/main/res/anim/fab_open_screen.xml | 9 + app/src/main/res/anim/rotate_backward.xml | 11 + app/src/main/res/anim/rotate_forward.xml | 11 + app/src/main/res/color/text_color.xml | 2 +- app/src/main/res/drawable/backgound_all.xml | 352 +++++++++++++ .../main/res/drawable/backgound_amount.xml | 10 + app/src/main/res/drawable/backgound_scan.xml | 15 + app/src/main/res/drawable/backgound_seed.xml | 15 + .../main/res/drawable/backgound_spinner.xml | 12 + .../drawable/backgound_toolbar_mainnet.xml | 7 + app/src/main/res/drawable/button_default.xml | 4 + app/src/main/res/drawable/button_disabled.xml | 4 + app/src/main/res/drawable/button_selector.xml | 6 + app/src/main/res/drawable/gradient_all.xml | 9 + app/src/main/res/drawable/gradient_oval.xml | 9 + app/src/main/res/drawable/gunther_wallets.xml | 73 +++ .../main/res/drawable/gunther_wallets_00.png | Bin 0 -> 2424 bytes .../main/res/drawable/gunther_wallets_01.png | Bin 0 -> 2438 bytes .../main/res/drawable/gunther_wallets_02.png | Bin 0 -> 2451 bytes .../main/res/drawable/gunther_wallets_03.png | Bin 0 -> 2438 bytes .../main/res/drawable/gunther_wallets_04.png | Bin 0 -> 2451 bytes .../main/res/drawable/gunther_wallets_05.png | Bin 0 -> 2460 bytes .../main/res/drawable/gunther_wallets_06.png | Bin 0 -> 2463 bytes .../main/res/drawable/gunther_wallets_07.png | Bin 0 -> 2464 bytes .../main/res/drawable/gunther_wallets_08.png | Bin 0 -> 2472 bytes .../main/res/drawable/gunther_wallets_09.png | Bin 0 -> 2469 bytes .../main/res/drawable/gunther_wallets_10.png | Bin 0 -> 2468 bytes .../main/res/drawable/gunther_wallets_11.png | Bin 0 -> 2474 bytes .../main/res/drawable/gunther_wallets_12.png | Bin 0 -> 2483 bytes .../main/res/drawable/gunther_wallets_13.png | Bin 0 -> 2488 bytes .../main/res/drawable/gunther_wallets_14.png | Bin 0 -> 2490 bytes .../main/res/drawable/gunther_wallets_15.png | Bin 0 -> 2493 bytes .../main/res/drawable/gunther_wallets_16.png | Bin 0 -> 2497 bytes .../main/res/drawable/gunther_wallets_17.png | Bin 0 -> 2497 bytes .../main/res/drawable/gunther_wallets_18.png | Bin 0 -> 2497 bytes .../main/res/drawable/gunther_wallets_19.png | Bin 0 -> 2493 bytes .../main/res/drawable/gunther_wallets_20.png | Bin 0 -> 2483 bytes .../main/res/drawable/gunther_wallets_21.png | Bin 0 -> 2468 bytes .../main/res/drawable/gunther_wallets_22.png | Bin 0 -> 2438 bytes .../res/drawable/ic_add_circle_outline.xml | 9 + .../main/res/drawable/ic_add_white_24dp.xml | 9 + .../res/drawable/ic_arrow_back_white_24dp.xml | 9 + .../main/res/drawable/ic_close_white_24dp.xml | 9 + .../drawable/ic_content_copy_black_24dp.xml | 9 + .../drawable/ic_content_nocopy_black_24dp.xml | 9 + app/src/main/res/drawable/ic_done_all.xml | 13 + app/src/main/res/drawable/ic_eye.xml | 28 + .../res/drawable/ic_favorite_white_14dp.xml | 9 + .../res/drawable/ic_favorite_white_24dp.xml | 9 + app/src/main/res/drawable/ic_hand.xml | 21 + ..._black_24dp.xml => ic_help_white_24dp.xml} | 12 +- .../drawable/ic_info_outline_gray_24dp.xml | 9 + ..._black_24dp.xml => ic_info_white_24dp.xml} | 2 +- app/src/main/res/drawable/ic_key.xml | 31 ++ .../ic_keyboard_arrow_right_black_24dp.xml | 9 + .../drawable/ic_logo_horizontol_xmrujo.xml | 36 ++ .../drawable/ic_navigate_next_black_24dp.xml | 9 + app/src/main/res/drawable/ic_new.xml | 41 ++ app/src/main/res/drawable/ic_scan.xml | 13 + app/src/main/res/drawable/ic_seed.xml | 21 + app/src/main/res/drawable/ic_send.xml | 9 + .../res/drawable/ic_settings_orange_24dp.xml | 9 + .../main/res/drawable/ic_share_white_24dp.xml | 9 + app/src/main/res/drawable/ic_traffic.xml | 10 + app/src/main/res/drawable/selector_login.xml | 14 + app/src/main/res/drawable/texture_cash.png | Bin 0 -> 49327 bytes ...{login_activity.xml => activity_login.xml} | 10 +- ...allet_activity.xml => activity_wallet.xml} | 11 +- app/src/main/res/layout/fragment_generate.xml | 160 ++++++ .../{help_fragment.xml => fragment_help.xml} | 0 ...ses_fragment.xml => fragment_licenses.xml} | 0 app/src/main/res/layout/fragment_login.xml | 71 +++ app/src/main/res/layout/fragment_receive.xml | 119 +++++ app/src/main/res/layout/fragment_review.xml | 222 ++++++++ .../{send_fragment.xml => fragment_send.xml} | 212 ++++---- .../{tx_fragment.xml => fragment_tx_info.xml} | 270 +++++----- app/src/main/res/layout/fragment_wallet.xml | 162 ++++++ app/src/main/res/layout/gen_fragment.xml | 112 ---- .../main/res/layout/gen_review_fragment.xml | 146 ------ app/src/main/res/layout/item_spinner.xml | 11 + app/src/main/res/layout/item_transaction.xml | 71 +++ app/src/main/res/layout/item_wallet.xml | 50 ++ app/src/main/res/layout/layout_fabmenu.xml | 166 ++++++ app/src/main/res/layout/login_fragment.xml | 47 -- app/src/main/res/layout/prompt_password.xml | 25 +- app/src/main/res/layout/receive_fragment.xml | 129 ----- app/src/main/res/layout/toolbar.xml | 10 - app/src/main/res/layout/transaction_item.xml | 70 --- app/src/main/res/layout/view_exchange.xml | 86 +++ app/src/main/res/layout/view_toolbar.xml | 54 ++ app/src/main/res/layout/wallet_fragment.xml | 110 ---- app/src/main/res/menu/create_wallet_menu.xml | 2 +- app/src/main/res/menu/list_context_menu.xml | 2 +- app/src/main/res/menu/list_menu.xml | 2 +- app/src/main/res/menu/tx_info_menu.xml | 12 + app/src/main/res/menu/wallet_details_menu.xml | 2 +- app/src/main/res/menu/wallet_menu.xml | 18 +- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 6962 -> 7294 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 3747 -> 3867 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 12348 -> 12691 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 26396 -> 26763 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 45016 -> 45368 bytes app/src/main/res/values/colors.xml | 25 +- app/src/main/res/values/dimens.xml | 12 +- app/src/main/res/values/ids.xml | 5 + app/src/main/res/values/integers.xml | 5 + app/src/main/res/values/strings.xml | 100 +++- app/src/main/res/values/styles.xml | 212 +++++++- 136 files changed, 5208 insertions(+), 2047 deletions(-) create mode 100644 app/src/main/java/com/m2049r/xmrwallet/layout/AsyncExchangeRate.java create mode 100644 app/src/main/java/com/m2049r/xmrwallet/layout/CTextInputLayout.java create mode 100644 app/src/main/java/com/m2049r/xmrwallet/layout/ExchangeView.java create mode 100644 app/src/main/java/com/m2049r/xmrwallet/layout/Toolbar.java create mode 100644 app/src/main/java/com/m2049r/xmrwallet/layout/WalletInfoAdapter.java create mode 100644 app/src/main/res/anim/fab_close.xml create mode 100644 app/src/main/res/anim/fab_close_screen.xml create mode 100644 app/src/main/res/anim/fab_open.xml create mode 100644 app/src/main/res/anim/fab_open_screen.xml create mode 100644 app/src/main/res/anim/rotate_backward.xml create mode 100644 app/src/main/res/anim/rotate_forward.xml create mode 100644 app/src/main/res/drawable/backgound_all.xml create mode 100644 app/src/main/res/drawable/backgound_amount.xml create mode 100644 app/src/main/res/drawable/backgound_scan.xml create mode 100644 app/src/main/res/drawable/backgound_seed.xml create mode 100644 app/src/main/res/drawable/backgound_spinner.xml create mode 100644 app/src/main/res/drawable/backgound_toolbar_mainnet.xml create mode 100644 app/src/main/res/drawable/button_default.xml create mode 100644 app/src/main/res/drawable/button_disabled.xml create mode 100644 app/src/main/res/drawable/button_selector.xml create mode 100644 app/src/main/res/drawable/gradient_all.xml create mode 100644 app/src/main/res/drawable/gradient_oval.xml create mode 100644 app/src/main/res/drawable/gunther_wallets.xml create mode 100644 app/src/main/res/drawable/gunther_wallets_00.png create mode 100644 app/src/main/res/drawable/gunther_wallets_01.png create mode 100644 app/src/main/res/drawable/gunther_wallets_02.png create mode 100644 app/src/main/res/drawable/gunther_wallets_03.png create mode 100644 app/src/main/res/drawable/gunther_wallets_04.png create mode 100644 app/src/main/res/drawable/gunther_wallets_05.png create mode 100644 app/src/main/res/drawable/gunther_wallets_06.png create mode 100644 app/src/main/res/drawable/gunther_wallets_07.png create mode 100644 app/src/main/res/drawable/gunther_wallets_08.png create mode 100644 app/src/main/res/drawable/gunther_wallets_09.png create mode 100644 app/src/main/res/drawable/gunther_wallets_10.png create mode 100644 app/src/main/res/drawable/gunther_wallets_11.png create mode 100644 app/src/main/res/drawable/gunther_wallets_12.png create mode 100644 app/src/main/res/drawable/gunther_wallets_13.png create mode 100644 app/src/main/res/drawable/gunther_wallets_14.png create mode 100644 app/src/main/res/drawable/gunther_wallets_15.png create mode 100644 app/src/main/res/drawable/gunther_wallets_16.png create mode 100644 app/src/main/res/drawable/gunther_wallets_17.png create mode 100644 app/src/main/res/drawable/gunther_wallets_18.png create mode 100644 app/src/main/res/drawable/gunther_wallets_19.png create mode 100644 app/src/main/res/drawable/gunther_wallets_20.png create mode 100644 app/src/main/res/drawable/gunther_wallets_21.png create mode 100644 app/src/main/res/drawable/gunther_wallets_22.png create mode 100644 app/src/main/res/drawable/ic_add_circle_outline.xml create mode 100644 app/src/main/res/drawable/ic_add_white_24dp.xml create mode 100644 app/src/main/res/drawable/ic_arrow_back_white_24dp.xml create mode 100644 app/src/main/res/drawable/ic_close_white_24dp.xml create mode 100644 app/src/main/res/drawable/ic_content_copy_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_content_nocopy_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_done_all.xml create mode 100644 app/src/main/res/drawable/ic_eye.xml create mode 100644 app/src/main/res/drawable/ic_favorite_white_14dp.xml create mode 100644 app/src/main/res/drawable/ic_favorite_white_24dp.xml create mode 100644 app/src/main/res/drawable/ic_hand.xml rename app/src/main/res/drawable/{ic_help_black_24dp.xml => ic_help_white_24dp.xml} (67%) create mode 100644 app/src/main/res/drawable/ic_info_outline_gray_24dp.xml rename app/src/main/res/drawable/{ic_info_black_24dp.xml => ic_info_white_24dp.xml} (89%) create mode 100644 app/src/main/res/drawable/ic_key.xml create mode 100644 app/src/main/res/drawable/ic_keyboard_arrow_right_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_logo_horizontol_xmrujo.xml create mode 100644 app/src/main/res/drawable/ic_navigate_next_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_new.xml create mode 100644 app/src/main/res/drawable/ic_scan.xml create mode 100644 app/src/main/res/drawable/ic_seed.xml create mode 100644 app/src/main/res/drawable/ic_send.xml create mode 100644 app/src/main/res/drawable/ic_settings_orange_24dp.xml create mode 100644 app/src/main/res/drawable/ic_share_white_24dp.xml create mode 100644 app/src/main/res/drawable/ic_traffic.xml create mode 100644 app/src/main/res/drawable/selector_login.xml create mode 100644 app/src/main/res/drawable/texture_cash.png rename app/src/main/res/layout/{login_activity.xml => activity_login.xml} (57%) rename app/src/main/res/layout/{wallet_activity.xml => activity_wallet.xml} (57%) create mode 100644 app/src/main/res/layout/fragment_generate.xml rename app/src/main/res/layout/{help_fragment.xml => fragment_help.xml} (100%) rename app/src/main/res/layout/{licenses_fragment.xml => fragment_licenses.xml} (100%) create mode 100644 app/src/main/res/layout/fragment_login.xml create mode 100644 app/src/main/res/layout/fragment_receive.xml create mode 100644 app/src/main/res/layout/fragment_review.xml rename app/src/main/res/layout/{send_fragment.xml => fragment_send.xml} (60%) rename app/src/main/res/layout/{tx_fragment.xml => fragment_tx_info.xml} (53%) create mode 100644 app/src/main/res/layout/fragment_wallet.xml delete mode 100644 app/src/main/res/layout/gen_fragment.xml delete mode 100644 app/src/main/res/layout/gen_review_fragment.xml create mode 100644 app/src/main/res/layout/item_spinner.xml create mode 100644 app/src/main/res/layout/item_transaction.xml create mode 100644 app/src/main/res/layout/item_wallet.xml create mode 100644 app/src/main/res/layout/layout_fabmenu.xml delete mode 100644 app/src/main/res/layout/login_fragment.xml delete mode 100644 app/src/main/res/layout/receive_fragment.xml delete mode 100644 app/src/main/res/layout/toolbar.xml delete mode 100644 app/src/main/res/layout/transaction_item.xml create mode 100644 app/src/main/res/layout/view_exchange.xml create mode 100644 app/src/main/res/layout/view_toolbar.xml delete mode 100644 app/src/main/res/layout/wallet_fragment.xml create mode 100644 app/src/main/res/menu/tx_info_menu.xml create mode 100644 app/src/main/res/values/ids.xml create mode 100644 app/src/main/res/values/integers.xml diff --git a/app/build.gradle b/app/build.gradle index 999189e9..8ab7b8ab 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "com.m2049r.xmrwallet" minSdkVersion 21 targetSdkVersion 25 - versionCode 26 - versionName "1.0.3" + versionCode 29 + versionName "1.1.2-alpha" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { diff --git a/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java b/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java index 8d7c6431..16387bf5 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java @@ -19,10 +19,9 @@ package com.m2049r.xmrwallet; import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; +import android.support.design.widget.TextInputLayout; import android.support.v4.app.Fragment; -import android.text.Editable; import android.text.InputType; -import android.text.TextWatcher; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -32,10 +31,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.widget.Button; -import android.widget.EditText; -import android.widget.LinearLayout; import android.widget.TextView; -import android.widget.Toast; import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.model.WalletManager; @@ -46,60 +42,93 @@ import java.io.File; public class GenerateFragment extends Fragment { static final String TAG = "GenerateFragment"; - EditText etWalletName; - EditText etWalletPassword; - EditText etWalletAddress; - EditText etWalletMnemonic; - LinearLayout llRestoreKeys; - EditText etWalletViewKey; - EditText etWalletSpendKey; - EditText etWalletRestoreHeight; + static final String TYPE = "type"; + static final String TYPE_NEW = "new"; + static final String TYPE_KEY = "key"; + static final String TYPE_SEED = "seed"; + static final String TYPE_VIEWONLY = "view"; + + TextInputLayout etWalletName; + TextInputLayout etWalletPassword; + TextInputLayout etWalletAddress; + TextInputLayout etWalletMnemonic; + TextInputLayout etWalletViewKey; + TextInputLayout etWalletSpendKey; + TextInputLayout etWalletRestoreHeight; Button bGenerate; + String type = null; + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.gen_fragment, container, false); + Bundle args = getArguments(); + this.type = args.getString(TYPE); - etWalletName = (EditText) view.findViewById(R.id.etWalletName); - etWalletPassword = (EditText) view.findViewById(R.id.etWalletPassword); - etWalletMnemonic = (EditText) view.findViewById(R.id.etWalletMnemonic); - etWalletAddress = (EditText) view.findViewById(R.id.etWalletAddress); - llRestoreKeys = (LinearLayout) view.findViewById(R.id.llRestoreKeys); - etWalletViewKey = (EditText) view.findViewById(R.id.etWalletViewKey); - etWalletSpendKey = (EditText) view.findViewById(R.id.etWalletSpendKey); - etWalletRestoreHeight = (EditText) view.findViewById(R.id.etWalletRestoreHeight); + View view = inflater.inflate(R.layout.fragment_generate, container, false); + + etWalletName = (TextInputLayout) view.findViewById(R.id.etWalletName); + etWalletPassword = (TextInputLayout) view.findViewById(R.id.etWalletPassword); + etWalletMnemonic = (TextInputLayout) view.findViewById(R.id.etWalletMnemonic); + etWalletAddress = (TextInputLayout) view.findViewById(R.id.etWalletAddress); + etWalletViewKey = (TextInputLayout) view.findViewById(R.id.etWalletViewKey); + etWalletSpendKey = (TextInputLayout) view.findViewById(R.id.etWalletSpendKey); + etWalletRestoreHeight = (TextInputLayout) view.findViewById(R.id.etWalletRestoreHeight); bGenerate = (Button) view.findViewById(R.id.bGenerate); - etWalletMnemonic.setRawInputType(InputType.TYPE_CLASS_TEXT); - etWalletAddress.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); - etWalletViewKey.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); - etWalletSpendKey.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + etWalletMnemonic.getEditText().setRawInputType(InputType.TYPE_CLASS_TEXT); + etWalletAddress.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + etWalletViewKey.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + etWalletSpendKey.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); - Helper.showKeyboard(getActivity()); - etWalletName.addTextChangedListener(new TextWatcher() { + etWalletName.getEditText().setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override - public void afterTextChanged(Editable editable) { - if (etWalletName.length() > 0) { - bGenerate.setEnabled(true); - } else { - bGenerate.setEnabled(false); + public void onFocusChange(View v, boolean hasFocus) { + if (!hasFocus) { + checkName(); } } - + }); + etWalletMnemonic.getEditText().setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { + public void onFocusChange(View v, boolean hasFocus) { + if (!hasFocus) { + checkMnemonic(); + } } }); - etWalletName.setOnEditorActionListener(new TextView.OnEditorActionListener() { + etWalletAddress.getEditText().setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (!hasFocus) { + checkAddress(); + } + } + }); + etWalletViewKey.getEditText().setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (!hasFocus) { + checkViewKey(); + } + } + }); + etWalletSpendKey.getEditText().setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (!hasFocus) { + checkSpendKey(); + } + } + }); + + Helper.showKeyboard(getActivity()); +//############## + etWalletName.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { - if (etWalletName.length() > 0) { + if (checkName()) { etWalletPassword.requestFocus(); } // otherwise ignore return true; @@ -108,159 +137,112 @@ public class GenerateFragment extends Fragment { } }); - etWalletPassword.setOnEditorActionListener(new TextView.OnEditorActionListener() { - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { - if (etWalletAddress.length() > 0) { - etWalletAddress.requestFocus(); - } else { - etWalletMnemonic.requestFocus(); - } - return true; - } - return false; - } - }); - - etWalletMnemonic.setOnEditorActionListener(new TextView.OnEditorActionListener() { - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { - if (etWalletMnemonic.length() == 0) { - etWalletAddress.requestFocus(); - } else if (mnemonicOk()) { - etWalletRestoreHeight.requestFocus(); - } else { - Toast.makeText(getActivity(), getString(R.string.generate_check_mnemonic), Toast.LENGTH_LONG).show(); - } - return true; - } - return false; - } - }); - etWalletMnemonic.addTextChangedListener(new - - TextWatcher() { - @Override - public void afterTextChanged(Editable editable) { - if (etWalletMnemonic.length() > 0) { - etWalletRestoreHeight.setVisibility(View.VISIBLE); - etWalletAddress.setVisibility(View.GONE); - } else { - etWalletAddress.setVisibility(View.VISIBLE); - if (etWalletAddress.length() == 0) { - etWalletRestoreHeight.setVisibility(View.GONE); - } else { - etWalletRestoreHeight.setVisibility(View.VISIBLE); - } - - } - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - }); - - etWalletAddress.setOnEditorActionListener(new TextView.OnEditorActionListener() - - { - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { - if (etWalletAddress.length() == 0) { - if (bGenerate.getVisibility() == View.VISIBLE) { - Helper.hideKeyboard(getActivity()); - generateWallet(); - } - } else if (addressOk()) { - etWalletViewKey.requestFocus(); - } else { - Toast.makeText(getActivity(), getString(R.string.generate_check_address), Toast.LENGTH_LONG).show(); - } - return true; - } - return false; - } - }); - etWalletAddress.addTextChangedListener(new - - TextWatcher() { - @Override - public void afterTextChanged(Editable editable) { - if (etWalletAddress.length() > 0) { - llRestoreKeys.setVisibility(View.VISIBLE); - etWalletMnemonic.setVisibility(View.INVISIBLE); - etWalletRestoreHeight.setVisibility(View.VISIBLE); - } else { - llRestoreKeys.setVisibility(View.GONE); - etWalletMnemonic.setVisibility(View.VISIBLE); - if (etWalletMnemonic.length() == 0) { - etWalletRestoreHeight.setVisibility(View.GONE); - } else { - etWalletRestoreHeight.setVisibility(View.VISIBLE); - } - } - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - }); - - etWalletViewKey.setOnEditorActionListener(new TextView.OnEditorActionListener() - - { - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { - if (viewKeyOk()) { - etWalletSpendKey.requestFocus(); - } else { - Toast.makeText(getActivity(), getString(R.string.generate_check_key), Toast.LENGTH_LONG).show(); - } - return true; - } - return false; - } - }); - etWalletSpendKey.setOnEditorActionListener(new TextView.OnEditorActionListener() - - { - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { - if (spendKeyOk()) { - etWalletRestoreHeight.requestFocus(); - } else { - Toast.makeText(getActivity(), getString(R.string.generate_check_key), Toast.LENGTH_LONG).show(); - } - return true; - } - return false; - } - }); - etWalletRestoreHeight.setOnEditorActionListener(new TextView.OnEditorActionListener() - - { - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) { - if (bGenerate.getVisibility() == View.VISIBLE) { + if (type.equals(TYPE_NEW)) { + etWalletPassword.getEditText().setImeOptions(EditorInfo.IME_ACTION_DONE); + etWalletPassword.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) { Helper.hideKeyboard(getActivity()); generateWallet(); - } else { - Toast.makeText(getActivity(), getString(R.string.generate_check_something), Toast.LENGTH_LONG).show(); + return true; } - return true; + return false; } - return false; - } - }); + }); + } else if (type.equals(TYPE_SEED)) { + etWalletPassword.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { + etWalletMnemonic.requestFocus(); + return true; + } + return false; + } + }); + etWalletMnemonic.setVisibility(View.VISIBLE); + etWalletMnemonic.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { + if (checkMnemonic()) { + etWalletRestoreHeight.requestFocus(); + } + return true; + } + return false; + } + }); + } else if (type.equals(TYPE_KEY) || type.equals(TYPE_VIEWONLY)) { + etWalletPassword.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { + etWalletAddress.requestFocus(); + return true; + } + return false; + } + }); + etWalletAddress.setVisibility(View.VISIBLE); + etWalletAddress.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() + { + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { + if (checkAddress()) { + etWalletViewKey.requestFocus(); + } + return true; + } + return false; + } + }); + etWalletViewKey.setVisibility(View.VISIBLE); + etWalletViewKey.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { + if (checkViewKey()) { + if (type.equals(TYPE_KEY)) { + etWalletSpendKey.requestFocus(); + } else { + etWalletRestoreHeight.requestFocus(); + } + } + return true; + } + return false; + } + }); + } + if (type.equals(TYPE_KEY)) { + etWalletSpendKey.setVisibility(View.VISIBLE); + etWalletSpendKey.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() + + { + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { + if (checkSpendKey()) { + etWalletRestoreHeight.requestFocus(); + } + return true; + } + return false; + } + }); + } + if (!type.equals(TYPE_NEW)) { + etWalletRestoreHeight.setVisibility(View.VISIBLE); + etWalletRestoreHeight.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() + + { + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) { + Helper.hideKeyboard(getActivity()); + generateWallet(); + return true; + } + return false; + } + }); + } bGenerate.setOnClickListener(new View.OnClickListener() { @@ -272,81 +254,112 @@ public class GenerateFragment extends Fragment { }); etWalletName.requestFocus(); + return view; } - private boolean mnemonicOk() { - String seed = etWalletMnemonic.getText().toString(); - return (seed.split("\\s").length == 25); // 25 words + private boolean checkName() { + String name = etWalletName.getEditText().getText().toString(); + boolean ok = true; + if (name.length() == 0) { + etWalletName.setError(getString(R.string.generate_wallet_name)); + ok = false; + } else if (name.charAt(0) == '.') { + etWalletName.setError(getString(R.string.generate_wallet_dot)); + ok = false; + } else { + File walletFile = Helper.getWalletFile(getActivity(), name); + if (WalletManager.getInstance().walletExists(walletFile)) { + etWalletName.setError(getString(R.string.generate_wallet_exists)); + ok = false; + } + } + if (ok) { + etWalletName.setError(null); + } + return ok; } - private boolean addressOk() { - String address = etWalletAddress.getText().toString(); - return Wallet.isAddressValid(address, WalletManager.getInstance().isTestNet()); + private boolean checkMnemonic() { + String seed = etWalletMnemonic.getEditText().getText().toString(); + boolean ok = (seed.split("\\s").length == 25); // 25 words + if (!ok) { + etWalletMnemonic.setError(getString(R.string.generate_check_mnemonic)); + } else { + etWalletMnemonic.setError(null); + } + return ok; } - private boolean viewKeyOk() { - String viewKey = etWalletViewKey.getText().toString(); - return (viewKey.length() == 64) && (viewKey.matches("^[0-9a-fA-F]+$")); + private boolean checkAddress() { + String address = etWalletAddress.getEditText().getText().toString(); + boolean ok = Wallet.isAddressValid(address, WalletManager.getInstance().isTestNet()); + if (!ok) { + etWalletAddress.setError(getString(R.string.generate_check_address)); + } else { + etWalletAddress.setError(null); + } + return ok; } - private boolean spendKeyOk() { - String spendKey = etWalletSpendKey.getText().toString(); - return ((spendKey.length() == 0) || ((spendKey.length() == 64) && (spendKey.matches("^[0-9a-fA-F]+$")))); + private boolean checkViewKey() { + String viewKey = etWalletViewKey.getEditText().getText().toString(); + boolean ok = (viewKey.length() == 64) && (viewKey.matches("^[0-9a-fA-F]+$")); + if (!ok) { + etWalletViewKey.setError(getString(R.string.generate_check_key)); + } else { + etWalletViewKey.setError(null); + } + return ok; + } + + private boolean checkSpendKey() { + String spendKey = etWalletSpendKey.getEditText().getText().toString(); + boolean ok = ((spendKey.length() == 0) || ((spendKey.length() == 64) && (spendKey.matches("^[0-9a-fA-F]+$")))); + if (!ok) { + etWalletSpendKey.setError(getString(R.string.generate_check_key)); + } else { + etWalletSpendKey.setError(null); + } + return ok; } private void generateWallet() { - String name = etWalletName.getText().toString(); - if (name.length() == 0) return; - if (name.charAt(0) == '.') { - Toast.makeText(getActivity(), getString(R.string.generate_wallet_dot), Toast.LENGTH_LONG).show(); - etWalletName.requestFocus(); - } - File walletFile = Helper.getWalletFile(getActivity(), name); - if (WalletManager.getInstance().walletExists(walletFile)) { - Toast.makeText(getActivity(), getString(R.string.generate_wallet_exists), Toast.LENGTH_LONG).show(); - etWalletName.requestFocus(); - return; - } - String password = etWalletPassword.getText().toString(); - - String seed = etWalletMnemonic.getText().toString(); - String address = etWalletAddress.getText().toString(); + if (!checkName()) return; + String name = etWalletName.getEditText().getText().toString(); + String password = etWalletPassword.getEditText().getText().toString(); long height; try { - height = Long.parseLong(etWalletRestoreHeight.getText().toString()); + height = Long.parseLong(etWalletRestoreHeight.getEditText().getText().toString()); } catch (NumberFormatException ex) { height = 0; // Keep calm and carry on! } - // figure out how we want to create this wallet - // A. from scratch - if ((seed.length() == 0) && (address.length() == 0)) { - bGenerate.setVisibility(View.GONE); + if (type.equals(TYPE_NEW)) { + bGenerate.setEnabled(false); activityCallback.onGenerate(name, password); - } else - // B. from seed - if (mnemonicOk()) { - bGenerate.setVisibility(View.GONE); - activityCallback.onGenerate(name, password, seed, height); - } else - // C. from keys - if (addressOk() && viewKeyOk() && (spendKeyOk())) { - String viewKey = etWalletViewKey.getText().toString(); - String spendKey = etWalletSpendKey.getText().toString(); - bGenerate.setVisibility(View.GONE); - activityCallback.onGenerate(name, password, address, viewKey, spendKey, height); - } else - // D. none of the above :) - { - Toast.makeText(getActivity(), getString(R.string.generate_check_something), Toast.LENGTH_LONG).show(); + } else if (type.equals(TYPE_SEED)) { + if (!checkMnemonic()) return; + String seed = etWalletMnemonic.getEditText().getText().toString(); + bGenerate.setEnabled(false); + activityCallback.onGenerate(name, password, seed, height); + } else if (type.equals(TYPE_KEY) || type.equals(TYPE_VIEWONLY)) { + if (checkAddress() && checkViewKey() && checkSpendKey()) { + bGenerate.setEnabled(false); + String address = etWalletAddress.getEditText().getText().toString(); + String viewKey = etWalletViewKey.getEditText().getText().toString(); + String spendKey = ""; + if (type.equals(TYPE_KEY)) { + spendKey = etWalletSpendKey.getEditText().getText().toString(); } + activityCallback.onGenerate(name, password, address, viewKey, spendKey, height); + } + } } public void walletGenerateError() { - bGenerate.setEnabled(etWalletName.length() > 0); - bGenerate.setVisibility(View.VISIBLE); + bGenerate.setEnabled(true); } @Override @@ -365,10 +378,7 @@ public class GenerateFragment extends Fragment { void onGenerate(String name, String password, String address, String viewKey, String spendKey, long height); - File getStorageRoot(); - void setTitle(String title); - } @Override diff --git a/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java b/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java index 4891fdeb..571c26d7 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java @@ -28,12 +28,17 @@ import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; +import android.widget.ImageButton; +import android.widget.LinearLayout; import android.widget.ProgressBar; +import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; +import com.m2049r.xmrwallet.layout.Toolbar; import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.model.WalletManager; +import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor; public class GenerateReviewFragment extends Fragment { @@ -42,6 +47,8 @@ public class GenerateReviewFragment extends Fragment { static final public String VIEW_TYPE_ACCEPT = "accept"; static final public String VIEW_TYPE_WALLET = "wallet"; + ScrollView scrollview; + ProgressBar pbProgress; TextView tvWalletName; TextView tvWalletPassword; @@ -49,14 +56,18 @@ public class GenerateReviewFragment extends Fragment { TextView tvWalletMnemonic; TextView tvWalletViewKey; TextView tvWalletSpendKey; + ImageButton bCopyAddress; + LinearLayout llAdvancedInfo; + Button bAdvancedInfo; Button bAccept; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.gen_review_fragment, container, false); + View view = inflater.inflate(R.layout.fragment_review, container, false); + scrollview = (ScrollView) view.findViewById(R.id.scrollview); pbProgress = (ProgressBar) view.findViewById(R.id.pbProgress); tvWalletName = (TextView) view.findViewById(R.id.tvWalletName); tvWalletPassword = (TextView) view.findViewById(R.id.tvWalletPassword); @@ -64,26 +75,15 @@ public class GenerateReviewFragment extends Fragment { tvWalletViewKey = (TextView) view.findViewById(R.id.tvWalletViewKey); tvWalletSpendKey = (TextView) view.findViewById(R.id.tvWalletSpendKey); tvWalletMnemonic = (TextView) view.findViewById(R.id.tvWalletMnemonic); + bCopyAddress = (ImageButton) view.findViewById(R.id.bCopyAddress); + bAdvancedInfo = (Button) view.findViewById(R.id.bAdvancedInfo); + llAdvancedInfo = (LinearLayout) view.findViewById(R.id.llAdvancedInfo); bAccept = (Button) view.findViewById(R.id.bAccept); boolean testnet = WalletManager.getInstance().isTestNet(); tvWalletMnemonic.setTextIsSelectable(testnet); tvWalletSpendKey.setTextIsSelectable(testnet); - if (!testnet) { - tvWalletMnemonic.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(getActivity(), getString(R.string.message_noselect_seed), Toast.LENGTH_SHORT).show(); - } - }); - tvWalletSpendKey.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(getActivity(), getString(R.string.message_noselect_key), Toast.LENGTH_SHORT).show(); - } - }); - } bAccept.setOnClickListener(new View.OnClickListener() { @Override @@ -91,6 +91,36 @@ public class GenerateReviewFragment extends Fragment { acceptWallet(); } }); + view.findViewById(R.id.bCopyViewKey).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + copyViewKey(); + } + }); + bCopyAddress.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + copyAddress(); + } + }); + view.findViewById(R.id.bCopySeed).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + nocopy(); + } + }); + view.findViewById(R.id.bCopySepndKey).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + nocopy(); + } + }); + view.findViewById(R.id.bAdvancedInfo).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showAdvancedInfo(); + } + }); showProgress(); @@ -103,6 +133,31 @@ public class GenerateReviewFragment extends Fragment { return view; } + void copyViewKey() { + Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_viewkey), tvWalletViewKey.getText().toString()); + Toast.makeText(getActivity(), getString(R.string.message_copy_viewkey), Toast.LENGTH_SHORT).show(); + } + + void copyAddress() { + Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_address), tvWalletAddress.getText().toString()); + Toast.makeText(getActivity(), getString(R.string.message_copy_address), Toast.LENGTH_SHORT).show(); + } + + void nocopy() { + Toast.makeText(getActivity(), getString(R.string.message_nocopy), Toast.LENGTH_SHORT).show(); + } + + void showAdvancedInfo() { + llAdvancedInfo.setVisibility(View.VISIBLE); + bAdvancedInfo.setVisibility(View.GONE); + scrollview.post(new Runnable() { + @Override + public void run() { + scrollview.fullScroll(ScrollView.FOCUS_DOWN); + } + }); + } + String type; private void acceptWallet() { @@ -148,7 +203,7 @@ public class GenerateReviewFragment extends Fragment { address = wallet.getAddress(); seed = wallet.getSeed(); viewKey = wallet.getSecretViewKey(); - spendKey = isWatchOnly ? getActivity().getString(R.string.watchonly_label) : wallet.getSecretSpendKey(); + spendKey = isWatchOnly ? getActivity().getString(R.string.label_watchonly) : wallet.getSecretSpendKey(); isWatchOnly = wallet.isWatchOnly(); if (closeWallet) wallet.close(); return true; @@ -157,6 +212,7 @@ public class GenerateReviewFragment extends Fragment { @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); + if (!isAdded()) return; // never mind tvWalletName.setText(name); if (result) { if (type.equals(GenerateReviewFragment.VIEW_TYPE_ACCEPT)) { @@ -168,9 +224,14 @@ public class GenerateReviewFragment extends Fragment { tvWalletMnemonic.setText(seed); tvWalletViewKey.setText(viewKey); tvWalletSpendKey.setText(spendKey); + bAdvancedInfo.setVisibility(View.VISIBLE); + bCopyAddress.setEnabled(true); + bCopyAddress.setImageResource(R.drawable.ic_content_copy_black_24dp); + activityCallback.setTitle(name, getString(R.string.details_title)); + activityCallback.setToolbarButton( + GenerateReviewFragment.VIEW_TYPE_ACCEPT.equals(type) ? Toolbar.BUTTON_NONE : Toolbar.BUTTON_BACK); } else { - // TODO show proper error message - // TODO end the fragment + // TODO show proper error message and/or end the fragment? tvWalletAddress.setText(status.toString()); tvWalletMnemonic.setText(status.toString()); tvWalletViewKey.setText(status.toString()); @@ -180,38 +241,55 @@ public class GenerateReviewFragment extends Fragment { } } - GenerateReviewFragment.Listener acceptCallback = null; - GenerateReviewFragment.ListenerWithWallet walletCallback = null; + Listener activityCallback = null; + AcceptListener acceptCallback = null; + ListenerWithWallet walletCallback = null; public interface Listener { + void setTitle(String title, String subtitle); + + void setToolbarButton(int type); + } + + public interface AcceptListener { void onAccept(String name, String password); } public interface ListenerWithWallet { Wallet getWallet(); - } @Override public void onAttach(Context context) { super.onAttach(context); - if (context instanceof GenerateReviewFragment.Listener) { - this.acceptCallback = (GenerateReviewFragment.Listener) context; - } else if (context instanceof GenerateReviewFragment.ListenerWithWallet) { - this.walletCallback = (GenerateReviewFragment.ListenerWithWallet) context; - } else { - throw new ClassCastException(context.toString() - + " must implement Listener"); + if (context instanceof Listener) { + this.activityCallback = (Listener) context; + } + if (context instanceof AcceptListener) { + this.acceptCallback = (AcceptListener) context; + } + if (context instanceof ListenerWithWallet) { + this.walletCallback = (ListenerWithWallet) context; } } + @Override + public void onResume() { + super.onResume(); + Log.d(TAG, "onResume()"); + String name = tvWalletName.getText().toString(); + if (name.isEmpty()) name = null; + activityCallback.setTitle(name, getString(R.string.details_title)); + activityCallback.setToolbarButton( + GenerateReviewFragment.VIEW_TYPE_ACCEPT.equals(type) ? Toolbar.BUTTON_NONE : Toolbar.BUTTON_BACK); + } + public void showProgress() { - pbProgress.setIndeterminate(true); pbProgress.setVisibility(View.VISIBLE); } public void hideProgress() { - pbProgress.setVisibility(View.INVISIBLE); + pbProgress.setVisibility(View.GONE); } boolean backOk() { diff --git a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java b/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java index 71156dde..28d9242b 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java @@ -27,30 +27,32 @@ import android.content.pm.PackageManager; import android.media.MediaScannerConnection; import android.os.AsyncTask; import android.os.Bundle; -import android.os.StrictMode; +import android.os.Handler; import android.support.annotation.NonNull; +import android.support.design.widget.TextInputLayout; import android.support.v4.app.Fragment; - import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import android.text.Editable; +import android.text.TextWatcher; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.EditorInfo; +import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.m2049r.xmrwallet.dialog.HelpFragment; import com.m2049r.xmrwallet.dialog.LicensesFragment; +import com.m2049r.xmrwallet.layout.Toolbar; import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.model.WalletManager; import com.m2049r.xmrwallet.service.WalletService; -import com.m2049r.xmrwallet.util.AsyncExchangeRate; import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor; @@ -60,19 +62,41 @@ import java.io.FileOutputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; +import java.net.SocketAddress; import java.nio.channels.FileChannel; import java.util.Date; public class LoginActivity extends AppCompatActivity implements LoginFragment.Listener, GenerateFragment.Listener, - GenerateReviewFragment.Listener, ReceiveFragment.Listener { + GenerateReviewFragment.Listener, GenerateReviewFragment.AcceptListener, ReceiveFragment.Listener { static final String TAG = "LoginActivity"; private static final String GENERATE_STACK = "gen"; static final int DAEMON_TIMEOUT = 500; // deamon must respond in 500ms + static final int DAEMON_DNS_TIMEOUT = 5000; // how long to wait for DNS resolver Toolbar toolbar; + @Override + public void setToolbarButton(int type) { + toolbar.setButton(type); + } + + @Override + public void setTitle(String title) { + toolbar.setTitle(title); + } + + @Override + public void setSubtitle(String subtitle) { + toolbar.setSubtitle(subtitle); + } + + @Override + public void setTitle(String title, String subtitle) { + toolbar.setTitle(title, subtitle); + } + @Override protected void onCreate(Bundle savedInstanceState) { Log.d(TAG, "onCreate()"); @@ -81,9 +105,29 @@ public class LoginActivity extends AppCompatActivity // we don't store anything ourselves } - setContentView(R.layout.login_activity); + setContentView(R.layout.activity_login); toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); + getSupportActionBar().setDisplayShowTitleEnabled(false); + + toolbar.setOnButtonListener(new Toolbar.OnButtonListener() { + @Override + public void onButton(int type) { + switch (type) { + case Toolbar.BUTTON_BACK: + onBackPressed(); + break; + case Toolbar.BUTTON_CLOSE: + finish(); + break; + case Toolbar.BUTTON_DONATE: + Toast.makeText(LoginActivity.this, getString(R.string.label_donate), Toast.LENGTH_SHORT).show(); + case Toolbar.BUTTON_NONE: + default: + Log.e(TAG, "Button " + type + "pressed - how can this be?"); + } + } + }); if (Helper.getWritePermission(this)) { startLoginFragment(); @@ -102,37 +146,26 @@ public class LoginActivity extends AppCompatActivity } @Override - public boolean onWalletSelected(String daemon, final String walletName, boolean testnet) { + public boolean onWalletSelected(String walletName, String daemon, boolean testnet) { if (daemon.length() == 0) { Toast.makeText(this, getString(R.string.prompt_daemon_missing), Toast.LENGTH_SHORT).show(); return false; } - - if (!checkAndSetWalletDaemon(daemon, testnet)) { - Toast.makeText(this, getString(R.string.warn_daemon_unavailable), Toast.LENGTH_SHORT).show(); + if (checkServiceRunning()) return false; + try { + WalletNode aWalletNode = new WalletNode(walletName, daemon, testnet); + new AsyncOpenWallet().execute(aWalletNode); + } catch (IllegalArgumentException ex) { + Log.e(TAG, ex.getLocalizedMessage()); + Toast.makeText(this, ex.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); return false; } - - if (checkServiceRunning()) return true; - Log.d(TAG, "selected wallet is ." + walletName + "."); - // now it's getting real, check if wallet exists - File walletFile = Helper.getWalletFile(this, walletName); - if (WalletManager.getInstance().walletExists(walletFile)) { - promptPassword(walletName, new PasswordAction() { - @Override - public void action(String walletName, String password) { - startWallet(walletName, password); - } - }); - } else { // this cannot really happen as we prefilter choices - Toast.makeText(this, getString(R.string.bad_wallet), Toast.LENGTH_SHORT).show(); - } return true; } @Override public void onWalletDetails(final String walletName, boolean testnet) { - checkAndSetWalletDaemon("", testnet); // just set selected net + setNet(testnet); Log.d(TAG, "details for wallet ." + walletName + "."); if (checkServiceRunning()) return; DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { @@ -170,7 +203,7 @@ public class LoginActivity extends AppCompatActivity @Override public void onWalletReceive(String walletName, boolean testnet) { - checkAndSetWalletDaemon("", testnet); // just set selected net + setNet(testnet); Log.d(TAG, "receive for wallet ." + walletName + "."); if (checkServiceRunning()) return; final File walletFile = Helper.getWalletFile(this, walletName); @@ -406,10 +439,10 @@ public class LoginActivity extends AppCompatActivity } @Override - public void onAddWallet(boolean testnet) { - checkAndSetWalletDaemon("", testnet); + public void onAddWallet(boolean testnet, String type) { + setNet(testnet); if (checkServiceRunning()) return; - startGenerateFragment(); + startGenerateFragment(type); } AlertDialog passwordDialog = null; // for preventing multiple clicks in wallet list @@ -423,23 +456,33 @@ public class LoginActivity extends AppCompatActivity AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context); alertDialogBuilder.setView(promptsView); - final EditText etPassword = (EditText) promptsView.findViewById(R.id.etPassword); - final TextView tvPasswordLabel = (TextView) promptsView.findViewById(R.id.tvPasswordLabel); + final TextInputLayout etPassword = (TextInputLayout) promptsView.findViewById(R.id.etPassword); + etPassword.setHint(LoginActivity.this.getString(R.string.prompt_password, wallet)); - tvPasswordLabel.setText(LoginActivity.this.getString(R.string.prompt_password, wallet)); + etPassword.getEditText().addTextChangedListener(new TextWatcher() { + + @Override + public void afterTextChanged(Editable s) { + if (etPassword.getError() != null) { + etPassword.setError(null); + } + } + + @Override + public void beforeTextChanged(CharSequence s, int start, + int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, + int before, int count) { + } + }); // set dialog message alertDialogBuilder .setCancelable(false) - .setPositiveButton("OK", - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - Helper.hideKeyboardAlways(LoginActivity.this); - String pass = etPassword.getText().toString(); - processPasswordEntry(wallet, pass, action); - passwordDialog = null; - } - }) + .setPositiveButton("OK", null) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { @@ -448,20 +491,43 @@ public class LoginActivity extends AppCompatActivity passwordDialog = null; } }); - passwordDialog = alertDialogBuilder.create(); + + passwordDialog.setOnShowListener(new DialogInterface.OnShowListener() { + @Override + public void onShow(DialogInterface dialog) { + Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String pass = etPassword.getEditText().getText().toString(); + if (processPasswordEntry(wallet, pass, action)) { + passwordDialog.dismiss(); + passwordDialog = null; + Helper.hideKeyboardAlways(LoginActivity.this); + } else { + etPassword.setError(getString(R.string.bad_password)); + } + } + }); + } + }); + Helper.showKeyboard(passwordDialog); // accept keyboard "ok" - etPassword.setOnEditorActionListener(new TextView.OnEditorActionListener() { + etPassword.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) { Helper.hideKeyboardAlways(LoginActivity.this); - String pass = etPassword.getText().toString(); - passwordDialog.cancel(); - processPasswordEntry(wallet, pass, action); - passwordDialog = null; - return false; + String pass = etPassword.getEditText().getText().toString(); + if (processPasswordEntry(wallet, pass, action)) { + passwordDialog.cancel(); + passwordDialog = null; + } else { + etPassword.setError(getString(R.string.bad_password)); + } + return true; } return false; } @@ -481,11 +547,12 @@ public class LoginActivity extends AppCompatActivity void action(String walletName, String password); } - private void processPasswordEntry(String walletName, String pass, PasswordAction action) { + private boolean processPasswordEntry(String walletName, String pass, PasswordAction action) { if (checkWalletPassword(walletName, pass)) { action.action(walletName, pass); + return true; } else { - Toast.makeText(this, getString(R.string.bad_password), Toast.LENGTH_SHORT).show(); + return false; } } @@ -505,22 +572,14 @@ public class LoginActivity extends AppCompatActivity //////////////////////////////////////// //////////////////////////////////////// - public void setTitle(String title) { - toolbar.setTitle(title); - } - - public void setSubtitle(String subtitle) { - toolbar.setSubtitle(subtitle); - } - @Override public void showNet(boolean testnet) { if (testnet) { toolbar.setBackgroundResource(R.color.colorPrimaryDark); } else { - toolbar.setBackgroundResource(R.color.moneroOrange); + toolbar.setBackgroundResource(R.drawable.backgound_toolbar_mainnet); } - setSubtitle(getString(testnet ? R.string.connect_testnet : R.string.connect_mainnet)); + toolbar.setSubtitle(getString(testnet ? R.string.connect_testnet : R.string.connect_mainnet)); } @Override @@ -532,9 +591,20 @@ public class LoginActivity extends AppCompatActivity ProgressDialog progressDialog = null; private void showProgressDialog(int msgId) { + showProgressDialog(msgId, 0); + } + + private void showProgressDialog(int msgId, long delay) { dismissProgressDialog(); // just in case progressDialog = new MyProgressDialog(LoginActivity.this, msgId); - progressDialog.show(); + if (delay > 0) { + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + public void run() { + if (progressDialog != null) progressDialog.show(); + } + }, delay); + } } private void dismissProgressDialog() { @@ -554,7 +624,6 @@ public class LoginActivity extends AppCompatActivity protected void onResume() { super.onResume(); Log.d(TAG, "onResume()"); - setTitle(getString(R.string.login_activity_name)); // wait for WalletService to finish if (WalletService.Running && (progressDialog == null)) { // and show a progress dialog, but only if there isn't one already @@ -671,8 +740,10 @@ public class LoginActivity extends AppCompatActivity Log.d(TAG, "LoginFragment added"); } - void startGenerateFragment() { - replaceFragment(new GenerateFragment(), GENERATE_STACK, null); + void startGenerateFragment(String type) { + Bundle extras = new Bundle(); + extras.putString(GenerateFragment.TYPE, type); + replaceFragment(new GenerateFragment(), GENERATE_STACK, extras); Log.d(TAG, "GenerateFragment placed"); } @@ -705,7 +776,6 @@ public class LoginActivity extends AppCompatActivity ////////////////////////////////////////// static final String MNEMONIC_LANGUAGE = "English"; // see mnemonics/electrum-words.cpp for more - private class AsyncCreateWallet extends AsyncTask<Void, Void, Boolean> { String walletName; String walletPassword; @@ -762,8 +832,6 @@ public class LoginActivity extends AppCompatActivity if (result) { startDetails(newWalletFile, walletPassword, GenerateReviewFragment.VIEW_TYPE_ACCEPT); } else { - Toast.makeText(LoginActivity.this, - getString(R.string.generate_wallet_create_failed), Toast.LENGTH_LONG).show(); walletGenerateError(); } } @@ -797,7 +865,10 @@ public class LoginActivity extends AppCompatActivity Wallet newWallet = WalletManager.getInstance() .createWallet(aFile, password, MNEMONIC_LANGUAGE); boolean success = (newWallet.getStatus() == Wallet.Status.Status_Ok); - if (!success) Log.e(TAG, newWallet.getErrorString()); + if (!success) { + Log.e(TAG, newWallet.getErrorString()); + toast(newWallet.getErrorString()); + } newWallet.close(); return success; } @@ -816,6 +887,7 @@ public class LoginActivity extends AppCompatActivity success = success && newWallet.store(); } else { Log.e(TAG, newWallet.getErrorString()); + toast(newWallet.getErrorString()); } newWallet.close(); return success; @@ -838,6 +910,7 @@ public class LoginActivity extends AppCompatActivity success = success && newWallet.store(); } else { Log.e(TAG, newWallet.getErrorString()); + toast(newWallet.getErrorString()); } newWallet.close(); return success; @@ -845,6 +918,15 @@ public class LoginActivity extends AppCompatActivity }); } + void toast(final String msg) { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(LoginActivity.this, msg, Toast.LENGTH_LONG).show(); + } + }); + } + @Override public void onAccept(final String name, final String password) { File walletFolder = getStorageRoot(); @@ -859,17 +941,10 @@ public class LoginActivity extends AppCompatActivity getString(R.string.generate_wallet_created), Toast.LENGTH_SHORT).show(); } else { Log.e(TAG, "Wallet store failed to " + walletFile.getAbsolutePath()); - Toast.makeText(LoginActivity.this, - getString(R.string.generate_wallet_create_failed), Toast.LENGTH_LONG).show(); + Toast.makeText(LoginActivity.this, getString(R.string.generate_wallet_create_failed), Toast.LENGTH_LONG).show(); } } - @Override - public void onExchange(AsyncExchangeRate.Listener listener, String currencyA, String currencyB) { - new AsyncExchangeRate(listener).execute(currencyA, currencyB); - } - - Wallet.Status testWallet(String path, String password) { Log.d(TAG, "testing wallet " + path); Wallet aWallet = WalletManager.getInstance().openWallet(path, password); @@ -896,14 +971,12 @@ public class LoginActivity extends AppCompatActivity boolean copyWallet(File srcWallet, File dstWallet, boolean backupMode) { if (walletExists(dstWallet, true) && !backupMode) return false; - Log.d(TAG, "B " + backupMode); boolean success = false; File srcDir = srcWallet.getParentFile(); String srcName = srcWallet.getName(); File dstDir = dstWallet.getParentFile(); String dstName = dstWallet.getName(); try { - Log.d(TAG, "C " + backupMode); try { copyFile(new File(srcDir, srcName), new File(dstDir, dstName)); } catch (IOException ex) { @@ -962,6 +1035,12 @@ public class LoginActivity extends AppCompatActivity if (((GenerateReviewFragment) f).backOk()) { super.onBackPressed(); } + } else if (f instanceof LoginFragment) { + if (((LoginFragment) f).isFabOpen()) { + ((LoginFragment) f).animateFAB(); + } else { + super.onBackPressed(); + } } else { super.onBackPressed(); } @@ -971,10 +1050,10 @@ public class LoginActivity extends AppCompatActivity public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_create_help: - HelpFragment.displayHelp(getSupportFragmentManager(),R.raw.help_create); + HelpFragment.displayHelp(getSupportFragmentManager(), R.raw.help_create); return true; case R.id.action_details_help: - HelpFragment.displayHelp(getSupportFragmentManager(),R.raw.help_details); + HelpFragment.displayHelp(getSupportFragmentManager(), R.raw.help_details); return true; case R.id.action_lincense_info: LicensesFragment.displayLicensesFragment(getSupportFragmentManager()); @@ -992,59 +1071,128 @@ public class LoginActivity extends AppCompatActivity } } - private boolean checkAndSetWalletDaemon(String daemon, boolean testnet) { - String daemonAddress = ""; - String username = ""; + private void setNet(boolean testnet) { + WalletManager.getInstance().setDaemon("", testnet, "", ""); + } + + static class WalletNode { + String name = null; + String host = ""; + int port = 28081; + String user = ""; String password = ""; - if (!daemon.isEmpty()) { // no actual daemon is also fine + boolean isTestnet; + + WalletNode(String walletName, String daemon, boolean isTestnet) { + if ((daemon == null) || daemon.isEmpty()) return; + this.name = walletName; + String daemonAddress; String a[] = daemon.split("@"); if (a.length == 1) { // no credentials daemonAddress = a[0]; } else if (a.length == 2) { // credentials - String up[] = a[0].split(":"); - if (up.length != 2) return false; - username = up[0]; - if (!username.isEmpty()) password = up[1]; + String userPassword[] = a[0].split(":"); + if (userPassword.length != 2) + throw new IllegalArgumentException("User:Password invalid"); + user = userPassword[0]; + if (!user.isEmpty()) password = userPassword[1]; daemonAddress = a[1]; } else { - return false; + throw new IllegalArgumentException("Too many @"); } String da[] = daemonAddress.split(":"); - if ((da.length > 2) || (da.length < 1)) return false; - String host = da[0]; - int port; + if ((da.length > 2) || (da.length < 1)) + throw new IllegalArgumentException("Too many ':' or too few"); + host = da[0]; if (da.length == 2) { try { port = Integer.parseInt(da[1]); } catch (NumberFormatException ex) { - return false; + throw new IllegalArgumentException("Port not numeric"); } } else { - port = (testnet ? 28081 : 18081); - daemonAddress = daemonAddress + ":" + port; + port = (isTestnet ? 28081 : 18081); } - //Log.d(TAG, "DAEMON " + username + "/" + password + "/" + host + "/" + port); -// if (android.os.Build.VERSION.SDK_INT > 9) { - StrictMode.ThreadPolicy prevPolicy = StrictMode.getThreadPolicy(); - StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder(prevPolicy).permitNetwork().build(); - StrictMode.setThreadPolicy(policy); + this.isTestnet = isTestnet; + } + + String getAddress() { + return host + ":" + port; + } + + boolean isValid() { + return !host.isEmpty(); + } + } + + private class AsyncOpenWallet extends AsyncTask<WalletNode, Void, Boolean> { + + WalletNode walletNode; + + @Override + protected void onPreExecute() { + super.onPreExecute(); + showProgressDialog(R.string.open_progress, DAEMON_TIMEOUT / 4); + } + + @Override + protected Boolean doInBackground(WalletNode... params) { + if (params.length != 1) return false; + this.walletNode = params[0]; + if (!walletNode.isValid()) return false; + + Log.d(TAG, "checking " + walletNode.getAddress()); + + long timeDA = new Date().getTime(); + SocketAddress address = new InetSocketAddress(walletNode.host, walletNode.port); + long timeDB = new Date().getTime(); + Log.d(TAG, "Resolving " + walletNode.host + " took " + (timeDB - timeDA) + "ms."); Socket socket = new Socket(); long timeA = new Date().getTime(); try { - socket.connect(new InetSocketAddress(host, port), LoginActivity.DAEMON_TIMEOUT); + socket.connect(address, LoginActivity.DAEMON_TIMEOUT); socket.close(); } catch (IOException ex) { - Log.d(TAG, "Cannot reach daemon " + host + "/" + port + " because " + ex.getLocalizedMessage()); + Log.d(TAG, "Cannot reach daemon " + walletNode.host + "/" + walletNode.port + " because " + ex.getMessage()); return false; - } finally { - StrictMode.setThreadPolicy(prevPolicy); } long timeB = new Date().getTime(); - Log.d(TAG, "Daemon is " + (timeB - timeA) + "ms away."); + long time = timeB - timeA; + Log.d(TAG, "Daemon " + walletNode.host + " is " + time + "ms away."); + return time < LoginActivity.DAEMON_TIMEOUT; + } + + @Override + protected void onPostExecute(Boolean result) { + super.onPostExecute(result); + if (isDestroyed()) { + return; + } + dismissProgressDialog(); + if (result) { + Log.d(TAG, "selected wallet is ." + walletNode.name + "."); + // now it's getting real, check if wallet exists + promptAndStart(walletNode); + } else { + Toast.makeText(LoginActivity.this, getString(R.string.status_wallet_connect_timeout), Toast.LENGTH_LONG).show(); + } + } + } + + void promptAndStart(WalletNode walletNode) { + File walletFile = Helper.getWalletFile(this, walletNode.name); + if (WalletManager.getInstance().walletExists(walletFile)) { + WalletManager.getInstance(). + setDaemon(walletNode.getAddress(), walletNode.isTestnet, walletNode.user, walletNode.password); + promptPassword(walletNode.name, new PasswordAction() { + @Override + public void action(String walletName, String password) { + startWallet(walletName, password); + } + }); + } else { // this cannot really happen as we prefilter choices + Toast.makeText(this, getString(R.string.bad_wallet), Toast.LENGTH_SHORT).show(); } - WalletManager mgr = WalletManager.getInstance(); - mgr.setDaemon(daemonAddress, testnet, username, password); - return true; } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java b/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java index f51979e5..fde8cb4c 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java @@ -18,13 +18,15 @@ package com.m2049r.xmrwallet; import android.content.Context; import android.content.SharedPreferences; +import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; import android.support.v4.app.Fragment; +import android.support.v7.widget.RecyclerView; import android.util.Log; -import android.view.ContextMenu; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; @@ -32,47 +34,42 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; import android.view.inputmethod.EditorInfo; import android.widget.AdapterView; import android.widget.ArrayAdapter; -import android.widget.BaseAdapter; import android.widget.EditText; -import android.widget.ListView; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.m2049r.xmrwallet.layout.DropDownEditText; +import com.m2049r.xmrwallet.layout.Toolbar; +import com.m2049r.xmrwallet.layout.WalletInfoAdapter; import com.m2049r.xmrwallet.model.WalletManager; import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.NodeList; import java.io.File; import java.util.ArrayList; -import java.util.Comparator; import java.util.List; -import java.util.Set; -import java.util.TreeSet; -public class LoginFragment extends Fragment { +public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInteractionListener, + View.OnClickListener { private static final String TAG = "LoginFragment"; - public static final String WALLETNAME_PREAMBLE = "[------] "; - public static final int WALLETNAME_PREAMBLE_LENGTH = WALLETNAME_PREAMBLE.length(); + private WalletInfoAdapter adapter; - ListView listView; - Set<String> walletList = new TreeSet<>(new Comparator<String>() { - @Override - public int compare(String o1, String o2) { - return o1.substring(WALLETNAME_PREAMBLE_LENGTH).toLowerCase() - .compareTo(o2.substring(WALLETNAME_PREAMBLE_LENGTH).toLowerCase()); - } - }); - List<String> displayedList = new ArrayList<>(); + List<WalletManager.WalletInfo> walletList = new ArrayList<>(); + List<WalletManager.WalletInfo> displayedList = new ArrayList<>(); + ImageView ivGuntherWallets; EditText etDummy; DropDownEditText etDaemonAddress; ArrayAdapter<String> nodeAdapter; - FloatingActionButton fabAdd; Listener activityCallback; @@ -82,7 +79,7 @@ public class LoginFragment extends Fragment { File getStorageRoot(); - boolean onWalletSelected(String daemon, String wallet, boolean testnet); + boolean onWalletSelected(String wallet, String daemon, boolean testnet); void onWalletDetails(String wallet, boolean testnet); @@ -94,9 +91,14 @@ public class LoginFragment extends Fragment { void onWalletArchive(String walletName); - void onAddWallet(boolean testnet); + void onAddWallet(boolean testnet, String type); void showNet(boolean testnet); + + void setToolbarButton(int type); + + void setTitle(String title); + } @Override @@ -121,55 +123,52 @@ public class LoginFragment extends Fragment { public void onResume() { super.onResume(); Log.d(TAG, "onResume()"); + activityCallback.setTitle(null); + activityCallback.setToolbarButton(Toolbar.BUTTON_DONATE); + activityCallback.showNet(isTestnet()); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG, "onCreateView"); - View view = inflater.inflate(R.layout.login_fragment, container, false); + View view = inflater.inflate(R.layout.fragment_login, container, false); - fabAdd = (FloatingActionButton) view.findViewById(R.id.fabAdd); - fabAdd.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - activityCallback.onAddWallet(isTestnet()); - } - }); + ivGuntherWallets = (ImageView) view.findViewById(R.id.ivGuntherWallets); - listView = (ListView) view.findViewById(R.id.list); - ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(), - android.R.layout.simple_list_item_1, android.R.id.text1, this.displayedList); - listView.setAdapter(adapter); - registerForContextMenu(listView); + fabScreen = (FrameLayout) view.findViewById(R.id.fabScreen); + fab = (FloatingActionButton) view.findViewById(R.id.fab); + fabNew = (FloatingActionButton) view.findViewById(R.id.fabNew); + fabView = (FloatingActionButton) view.findViewById(R.id.fabView); + fabKey = (FloatingActionButton) view.findViewById(R.id.fabKey); + fabSeed = (FloatingActionButton) view.findViewById(R.id.fabSeed); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - String itemValue = (String) listView.getItemAtPosition(position); + fabNewL = (RelativeLayout) view.findViewById(R.id.fabNewL); + fabViewL = (RelativeLayout) view.findViewById(R.id.fabViewL); + fabKeyL = (RelativeLayout) view.findViewById(R.id.fabKeyL); + fabSeedL = (RelativeLayout) view.findViewById(R.id.fabSeedL); - if (itemValue.length() <= (WALLETNAME_PREAMBLE_LENGTH)) { - Toast.makeText(getActivity(), getString(R.string.panic), Toast.LENGTH_LONG).show(); - return; - } + fab_open_screen = AnimationUtils.loadAnimation(getContext(), R.anim.fab_open_screen); + fab_close_screen = AnimationUtils.loadAnimation(getContext(), R.anim.fab_close_screen); + fab_open = AnimationUtils.loadAnimation(getContext(), R.anim.fab_open); + fab_close = AnimationUtils.loadAnimation(getContext(), R.anim.fab_close); + rotate_forward = AnimationUtils.loadAnimation(getContext(), R.anim.rotate_forward); + rotate_backward = AnimationUtils.loadAnimation(getContext(), R.anim.rotate_backward); + fab.setOnClickListener(this); + fabNew.setOnClickListener(this); + fabView.setOnClickListener(this); + fabKey.setOnClickListener(this); + fabSeed.setOnClickListener(this); + fabScreen.setOnClickListener(this); - String x = isTestnet() ? "9A-" : "4-"; - if (x.indexOf(itemValue.charAt(1)) < 0) { - Toast.makeText(getActivity(), getString(R.string.prompt_wrong_net), Toast.LENGTH_LONG).show(); - return; - } - - String wallet = itemValue.substring(WALLETNAME_PREAMBLE_LENGTH); - - if (activityCallback.onWalletSelected(getDaemon(), wallet, isTestnet())) { - savePrefs(); - } - } - }); + RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.list); + registerForContextMenu(recyclerView); + this.adapter = new WalletInfoAdapter(getActivity(), this); + recyclerView.setAdapter(adapter); etDummy = (EditText) view.findViewById(R.id.etDummy); etDaemonAddress = (DropDownEditText) view.findViewById(R.id.etDaemonAddress); - nodeAdapter = new ArrayAdapter(getContext(), android.R.layout.simple_dropdown_item_1line); + nodeAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_dropdown_item_1line); etDaemonAddress.setAdapter(nodeAdapter); Helper.hideKeyboard(getActivity()); @@ -204,72 +203,66 @@ public class LoginFragment extends Fragment { } }); + etDaemonAddress.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView<?> parent, View arg1, int pos, long id) { + Helper.hideKeyboard(getActivity()); + etDummy.requestFocus(); + + } + }); + loadPrefs(); return view; } - private void filterList() { - displayedList.clear(); - String x = isTestnet() ? "9A" : "4"; - for (String s : walletList) { - if (x.indexOf(s.charAt(1)) >= 0) displayedList.add(s); - } - } - - public void loadList() { - Log.d(TAG, "loadList()"); - // TODO this should probably be in LoginActivity - WalletManager mgr = WalletManager.getInstance(); - List<WalletManager.WalletInfo> walletInfos = - mgr.findWallets(activityCallback.getStorageRoot()); - - walletList.clear(); - for (WalletManager.WalletInfo walletInfo : walletInfos) { - // ONCE the walletInfo.address was null - because the address.txt was empty - // this was before the wallet generation was in its own therad with huge stack - // TODO: keep an eye on Wallet.getAddress() returning empty - String displayAddress = walletInfo.address; - if ((displayAddress != null) && displayAddress.length() == 95) { - displayAddress = walletInfo.address.substring(0, 6); - walletList.add("[" + displayAddress + "] " + walletInfo.name); + void showGunther() { + ivGuntherWallets.setImageResource(R.drawable.gunther_wallets); + final AnimationDrawable guntherWalletsAnim = (AnimationDrawable) ivGuntherWallets.getDrawable(); + final Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + guntherWalletsAnim.start(); } - } - filterList(); - ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged(); + }, getResources().getInteger(R.integer.gunther_wallets_delay)); + } + void normalGunther() { + ivGuntherWallets.setImageResource(R.drawable.gunther_wallets_00); + } + + // Callbacks from WalletInfoAdapter + @Override + public void onInteraction(final View view, final WalletManager.WalletInfo infoItem) { + String x = isTestnet() ? "9A-" : "4-"; + if (x.indexOf(infoItem.address.charAt(0)) < 0) { + Toast.makeText(getActivity(), getString(R.string.prompt_wrong_net), Toast.LENGTH_LONG).show(); + return; + } + + if (activityCallback.onWalletSelected(infoItem.name, getDaemon(), isTestnet())) { + savePrefs(); + } } @Override - public void onCreateContextMenu(ContextMenu menu, View v, - ContextMenu.ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, v, menuInfo); - MenuInflater inflater = getActivity().getMenuInflater(); - inflater.inflate(R.menu.list_context_menu, menu); - } - - @Override - public boolean onContextItemSelected(MenuItem item) { - AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); - String listItem = (String) listView.getItemAtPosition(info.position); - String name = nameFromListItem(listItem, isTestnet()); - if (name == null) { - Toast.makeText(getActivity(), getString(R.string.panic), Toast.LENGTH_LONG).show(); - } + public boolean onContextInteraction(MenuItem item, WalletManager.WalletInfo listItem) { switch (item.getItemId()) { case R.id.action_info: - showInfo(name); + showInfo(listItem.name); break; case R.id.action_receive: - showReceive(name); + showReceive(listItem.name); break; case R.id.action_rename: - activityCallback.onWalletRename(name); + activityCallback.onWalletRename(listItem.name); break; case R.id.action_backup: - activityCallback.onWalletBackup(name); + activityCallback.onWalletBackup(listItem.name); break; case R.id.action_archive: - activityCallback.onWalletArchive(name); + activityCallback.onWalletArchive(listItem.name); break; default: return super.onContextItemSelected(item); @@ -277,6 +270,31 @@ public class LoginFragment extends Fragment { return true; } + private void filterList() { + displayedList.clear(); + String x = isTestnet() ? "9A" : "4"; + for (WalletManager.WalletInfo s : walletList) { + if (x.indexOf(s.address.charAt(0)) >= 0) displayedList.add(s); + } + } + + public void loadList() { + Log.d(TAG, "loadList()"); + WalletManager mgr = WalletManager.getInstance(); + List<WalletManager.WalletInfo> walletInfos = + mgr.findWallets(activityCallback.getStorageRoot()); + walletList.clear(); + walletList.addAll(walletInfos); + filterList(); + adapter.setInfos(displayedList); + adapter.notifyDataSetChanged(); + if (displayedList.isEmpty()) { + showGunther(); + } else { + normalGunther(); + } + } + private void showInfo(@NonNull String name) { activityCallback.onWalletDetails(name, isTestnet()); } @@ -286,15 +304,6 @@ public class LoginFragment extends Fragment { return true; } - private String nameFromListItem(String listItem, boolean testnet) { - String wallet = listItem.substring(WALLETNAME_PREAMBLE_LENGTH); - String x = testnet ? "9A" : "4"; - if (x.indexOf(listItem.charAt(1)) < 0) { - return null; - } - return wallet; - } - @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -392,4 +401,75 @@ public class LoginFragment extends Fragment { etDummy.requestFocus(); Helper.hideKeyboard(getActivity()); } + + private boolean isFabOpen = false; + private FloatingActionButton fab, fabNew, fabView, fabKey, fabSeed; + private FrameLayout fabScreen; + private RelativeLayout fabNewL, fabViewL, fabKeyL, fabSeedL; + private Animation fab_open, fab_close, rotate_forward, rotate_backward, fab_open_screen, fab_close_screen; + + public boolean isFabOpen() { + return isFabOpen; + } + + public void animateFAB() { + if (isFabOpen) { + fabScreen.setVisibility(View.INVISIBLE); + fabScreen.setClickable(false); + fabScreen.startAnimation(fab_close_screen); + fab.startAnimation(rotate_backward); + fabNewL.startAnimation(fab_close); + fabNew.setClickable(false); + fabViewL.startAnimation(fab_close); + fabView.setClickable(false); + fabKeyL.startAnimation(fab_close); + fabKey.setClickable(false); + fabSeedL.startAnimation(fab_close); + fabSeed.setClickable(false); + isFabOpen = false; + } else { + fabScreen.setClickable(true); + fabScreen.startAnimation(fab_open_screen); + fab.startAnimation(rotate_forward); + fabNewL.startAnimation(fab_open); + fabNew.setClickable(true); + fabViewL.startAnimation(fab_open); + fabView.setClickable(true); + fabKeyL.startAnimation(fab_open); + fabKey.setClickable(true); + fabSeedL.startAnimation(fab_open); + fabSeed.setClickable(true); + isFabOpen = true; + } + } + + @Override + public void onClick(View v) { + int id = v.getId(); + switch (id) { + case R.id.fab: + animateFAB(); + break; + case R.id.fabNew: + fabScreen.setVisibility(View.INVISIBLE); + isFabOpen = false; + activityCallback.onAddWallet(isTestnet(), GenerateFragment.TYPE_NEW); + break; + case R.id.fabView: + animateFAB(); + activityCallback.onAddWallet(isTestnet(), GenerateFragment.TYPE_VIEWONLY); + break; + case R.id.fabKey: + animateFAB(); + activityCallback.onAddWallet(isTestnet(), GenerateFragment.TYPE_KEY); + break; + case R.id.fabSeed: + animateFAB(); + activityCallback.onAddWallet(isTestnet(), GenerateFragment.TYPE_SEED); + break; + case R.id.fabScreen: + animateFAB(); + break; + } + } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java b/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java index 38153c5c..80e2412e 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java @@ -17,12 +17,11 @@ package com.m2049r.xmrwallet; import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.Canvas; import android.os.AsyncTask; import android.os.Bundle; -import android.preference.PreferenceManager; +import android.support.design.widget.TextInputLayout; import android.support.v4.app.Fragment; import android.text.Editable; import android.text.InputType; @@ -33,12 +32,11 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; -import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ProgressBar; -import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; @@ -48,151 +46,102 @@ import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import com.m2049r.xmrwallet.layout.ExchangeView; +import com.m2049r.xmrwallet.layout.Toolbar; import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.model.WalletManager; -import com.m2049r.xmrwallet.util.AsyncExchangeRate; import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor; import java.util.HashMap; -import java.util.Locale; import java.util.Map; -public class ReceiveFragment extends Fragment implements AsyncExchangeRate.Listener { +public class ReceiveFragment extends Fragment { static final String TAG = "ReceiveFragment"; ProgressBar pbProgress; TextView tvAddress; - EditText etPaymentId; - EditText etAmount; - TextView tvAmountB; + TextInputLayout etPaymentId; + ExchangeView evAmount; Button bPaymentId; Button bGenerate; ImageView qrCode; EditText etDummy; + ImageButton bCopyAddress; - Spinner sCurrencyA; - Spinner sCurrencyB; + //String name; public interface Listener { - void onExchange(AsyncExchangeRate.Listener listener, String currencyA, String currencyB); - } + void setToolbarButton(int type); - @Override - public void exchange(String currencyA, String currencyB, double rate) { - // first, make sure this is what we want - String enteredCurrencyA = (String) sCurrencyA.getSelectedItem(); - String enteredCurrencyB = (String) sCurrencyB.getSelectedItem(); - if (!currencyA.equals(enteredCurrencyA) || !currencyB.equals(enteredCurrencyB)) { - // something's wrong - Log.e(TAG, "Currencies don't match!"); - tvAmountB.setText(""); - return; - } - String enteredAmount = etAmount.getText().toString(); - String xmrAmount = ""; - if (!enteredAmount.isEmpty()) { - // losing precision using double here doesn't matter - double amountA = Double.parseDouble(enteredAmount); - double amountB = amountA * rate; - if (enteredCurrencyA.equals("XMR")) { - String validatedAmountA = Helper.getDisplayAmount(Wallet.getAmountFromString(enteredAmount)); - xmrAmount = validatedAmountA; // take what was entered in XMR - etAmount.setText(xmrAmount); // display what we stick into the QR code - String displayB = String.format(Locale.US, "%.2f", amountB); - tvAmountB.setText(displayB); - } else if (enteredCurrencyB.equals("XMR")) { - xmrAmount = Wallet.getDisplayAmount(Wallet.getAmountFromDouble(amountB)); - // cut off at 5 decimals - xmrAmount = xmrAmount.substring(0, xmrAmount.length() - (12 - 5)); - tvAmountB.setText(xmrAmount); - } else { // no XMR currency - tvAmountB.setText(""); - return; // and no qr code - } - } else { - tvAmountB.setText(""); - } - generateQr(xmrAmount); + void setTitle(String title); + + void setSubtitle(String subtitle); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.receive_fragment, container, false); + View view = inflater.inflate(R.layout.fragment_receive, container, false); pbProgress = (ProgressBar) view.findViewById(R.id.pbProgress); tvAddress = (TextView) view.findViewById(R.id.tvAddress); - etPaymentId = (EditText) view.findViewById(R.id.etPaymentId); - etAmount = (EditText) view.findViewById(R.id.etAmountA); - tvAmountB = (TextView) view.findViewById(R.id.tvAmountB); + etPaymentId = (TextInputLayout) view.findViewById(R.id.etPaymentId); + evAmount = (ExchangeView) view.findViewById(R.id.evAmount); bPaymentId = (Button) view.findViewById(R.id.bPaymentId); qrCode = (ImageView) view.findViewById(R.id.qrCode); bGenerate = (Button) view.findViewById(R.id.bGenerate); etDummy = (EditText) view.findViewById(R.id.etDummy); + bCopyAddress = (ImageButton) view.findViewById(R.id.bCopyAddress); - sCurrencyA = (Spinner) view.findViewById(R.id.sCurrencyA); - sCurrencyB = (Spinner) view.findViewById(R.id.sCurrencyB); - - etPaymentId.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + etPaymentId.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); - loadPrefs(); - - etPaymentId.setOnEditorActionListener(new TextView.OnEditorActionListener() { - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { - if (paymentIdOk()) { - etAmount.requestFocus(); - } // otherwise ignore - return true; - } - return false; - } - }); - etPaymentId.addTextChangedListener(new TextWatcher() { + bCopyAddress.setOnClickListener(new View.OnClickListener() { @Override - public void afterTextChanged(Editable editable) { - qrCode.setImageBitmap(getMoneroLogo()); - if (paymentIdOk() && amountOk()) { - bGenerate.setEnabled(true); - } else { - bGenerate.setEnabled(false); - } - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { + public void onClick(View v) { + copyAddress(); } }); - etAmount.setOnEditorActionListener(new TextView.OnEditorActionListener() { + evAmount.setOnNewAmountListener(new ExchangeView.OnNewAmountListener() { + @Override + public void onNewAmount(String xmr) { + Log.d(TAG, "new amount = " + xmr); + generateQr(); + } + }); +/* + evAmount.setOnAmountInvalidatedListener(new ExchangeView.OnAmountInvalidatedListener() { + @Override + public void onAmountInvalidated() { + clearQR(); + } + }); + + evAmount.setOnFailedExchangeListener(new ExchangeView.OnFailedExchangeListener() { + @Override + public void onFailedExchange() { + Toast.makeText(getActivity(), getString(R.string.message_exchange_failed), Toast.LENGTH_LONG).show(); + } + }); +*/ + etPaymentId.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) { - if (paymentIdOk() && amountOk()) { - Helper.hideKeyboard(getActivity()); - startExchange(); + if (checkPaymentId()) { // && evAmount.checkXmrAmount(true)) { + generateQr(); } return true; } return false; } }); - etAmount.addTextChangedListener(new TextWatcher() { + etPaymentId.getEditText().addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable editable) { - tvAmountB.setText(""); - qrCode.setImageBitmap(getMoneroLogo()); - if (paymentIdOk() && amountOk()) { - bGenerate.setEnabled(true); - } else { - bGenerate.setEnabled(false); - } + clearQR(); } @Override @@ -207,10 +156,10 @@ public class ReceiveFragment extends Fragment implements AsyncExchangeRate.Liste bPaymentId.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - etPaymentId.setText((Wallet.generatePaymentId())); - etPaymentId.setSelection(etPaymentId.getText().length()); - if (paymentIdOk() && amountOk()) { - startExchange(); + etPaymentId.getEditText().setText((Wallet.generatePaymentId())); + etPaymentId.getEditText().setSelection(etPaymentId.getEditText().getText().length()); + if (checkPaymentId()) { //&& evAmount.checkXmrAmount(true)) { + generateQr(); } } }); @@ -218,101 +167,82 @@ public class ReceiveFragment extends Fragment implements AsyncExchangeRate.Liste bGenerate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if (paymentIdOk() && amountOk()) { - Helper.hideKeyboard(getActivity()); - startExchange(); + if (checkPaymentId()) { + evAmount.doExchange(); } } }); - sCurrencyA.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { - if (position != 0) { - sCurrencyB.setSelection(0, true); - } - startExchange(); - } - - @Override - public void onNothingSelected(AdapterView<?> parentView) { - // nothing (yet?) - } - }); - - sCurrencyB.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { - if (position != 0) { - sCurrencyA.setSelection(0, true); - } - tvAmountB.setText(""); - startExchange(); - } - - @Override - public void onNothingSelected(AdapterView<?> parentView) { - // nothing (yet?) - } - }); - showProgress(); - qrCode.setImageBitmap(getMoneroLogo()); + clearQR(); Bundle b = getArguments(); String address = b.getString("address"); + String walletName = b.getString("name"); + Log.d(TAG, "address=" + address + "/name=" + walletName); if (address == null) { String path = b.getString("path"); String password = b.getString("password"); - show(path, password); + loadAndShow(path, password); } else { - show(address); + show(walletName, address); } return view; } - void startExchange() { - if (paymentIdOk() && amountOk() && tvAddress.getText().length() > 0) { - String enteredCurrencyA = (String) sCurrencyA.getSelectedItem(); - String enteredCurrencyB = (String) sCurrencyB.getSelectedItem(); - String enteredAmount = etAmount.getText().toString(); - tvAmountB.setText(""); - if (!enteredAmount.isEmpty()) { // start conversion - listenerCallback.onExchange(ReceiveFragment.this, enteredCurrencyA, enteredCurrencyB); - } else { - generateQr(""); - } + void copyAddress() { + Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_address), tvAddress.getText().toString()); + Toast.makeText(getActivity(), getString(R.string.message_copy_address), Toast.LENGTH_SHORT).show(); + } + + boolean qrValid = true; + + void clearQR() { + if (qrValid) { + qrCode.setImageBitmap(getMoneroLogo()); + qrValid = false; } } + void setQR(Bitmap qr) { + qrCode.setImageBitmap(qr); + qrValid = true; + Helper.hideKeyboard(getActivity()); + etDummy.requestFocus(); + } + @Override public void onResume() { super.onResume(); Log.d(TAG, "onResume()"); - if (paymentIdOk() && amountOk() && tvAddress.getText().length() > 0) { - startExchange(); - } + listenerCallback.setToolbarButton(Toolbar.BUTTON_BACK); + listenerCallback.setSubtitle(getString(R.string.receive_title)); + generateQr(); } - private void show(String address) { + private void show(String name, String address) { + Log.d(TAG, "name=" + name); + listenerCallback.setTitle(name); tvAddress.setText(address); etPaymentId.setEnabled(true); - etAmount.setEnabled(true); + //etAmount.setEnabled(true); bPaymentId.setEnabled(true); bGenerate.setEnabled(true); + bCopyAddress.setEnabled(true); + bCopyAddress.setImageResource(R.drawable.ic_content_copy_black_24dp); hideProgress(); - startExchange(); + generateQr(); } - private void show(String walletPath, String password) { + private void loadAndShow(String walletPath, String password) { new AsyncShow().executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR, walletPath, password); } private class AsyncShow extends AsyncTask<String, Void, Boolean> { String password; - String address; + String name; @Override protected Boolean doInBackground(String... params) { @@ -321,6 +251,7 @@ public class ReceiveFragment extends Fragment implements AsyncExchangeRate.Liste password = params[1]; Wallet wallet = WalletManager.getInstance().openWallet(walletPath, password); address = wallet.getAddress(); + name = wallet.getName(); wallet.close(); return true; } @@ -328,8 +259,9 @@ public class ReceiveFragment extends Fragment implements AsyncExchangeRate.Liste @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); + if (!isAdded()) return; // never mind if (result) { - show(address); + show(name, address); } else { Toast.makeText(getActivity(), getString(R.string.receive_cannot_open), Toast.LENGTH_LONG).show(); hideProgress(); @@ -337,22 +269,29 @@ public class ReceiveFragment extends Fragment implements AsyncExchangeRate.Liste } } + private boolean checkPaymentId() { + String paymentId = etPaymentId.getEditText().getText().toString(); + boolean ok = paymentId.isEmpty() || Wallet.isPaymentIdValid(paymentId); - private boolean amountOk() { - String amountEntry = etAmount.getText().toString(); - if (amountEntry.isEmpty()) return true; - long amount = Wallet.getAmountFromString(amountEntry); - return (amount > 0); + if (!ok) { + etPaymentId.setError(getString(R.string.receive_paymentid_invalid)); + } else { + etPaymentId.setError(null); + } + return ok; } - private boolean paymentIdOk() { - String paymentId = etPaymentId.getText().toString(); - return paymentId.isEmpty() || Wallet.isPaymentIdValid(paymentId); - } - - private void generateQr(String xmrAmount) { + private void generateQr() { + Log.d(TAG, "GENQR"); String address = tvAddress.getText().toString(); - String paymentId = etPaymentId.getText().toString(); + String paymentId = etPaymentId.getEditText().getText().toString(); + String xmrAmount = evAmount.getAmount(); + Log.d(TAG, xmrAmount + "/" + paymentId + "/" + address); + if ((xmrAmount == null) || !Wallet.isAddressValid(address, WalletManager.getInstance().isTestNet())) { + clearQR(); + Log.d(TAG, "CLEARQR"); + return; + } StringBuffer sb = new StringBuffer(); sb.append(ScannerFragment.QR_SCHEME).append(address); boolean first = true; @@ -374,9 +313,10 @@ public class ReceiveFragment extends Fragment implements AsyncExchangeRate.Liste String text = sb.toString(); Bitmap qr = generate(text, 500, 500); if (qr != null) { - qrCode.setImageBitmap(qr); + setQR(qr); + Log.d(TAG, "SETQR"); etDummy.requestFocus(); - bGenerate.setEnabled(false); + Helper.hideKeyboard(getActivity()); } } @@ -439,7 +379,6 @@ public class ReceiveFragment extends Fragment implements AsyncExchangeRate.Liste } public void showProgress() { - pbProgress.setIndeterminate(true); pbProgress.setVisibility(View.VISIBLE); } @@ -463,36 +402,9 @@ public class ReceiveFragment extends Fragment implements AsyncExchangeRate.Liste static final String PREF_CURRENCY_A = "PREF_CURRENCY_A"; static final String PREF_CURRENCY_B = "PREF_CURRENCY_B"; - void loadPrefs() { - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); - int currencyA = sharedPreferences.getInt(PREF_CURRENCY_A, 0); - int currencyB = sharedPreferences.getInt(PREF_CURRENCY_B, 0); - - if (currencyA * currencyB != 0) { // make sure one of them is 0 (=XMR) - currencyA = 0; - } - // in case we change the currency lists in the future - if (currencyA >= sCurrencyA.getCount()) currencyA = 0; - if (currencyB >= sCurrencyB.getCount()) currencyB = 0; - sCurrencyA.setSelection(currencyA); - sCurrencyB.setSelection(currencyB); - } - - void savePrefs() { - int currencyA = sCurrencyA.getSelectedItemPosition(); - int currencyB = sCurrencyB.getSelectedItemPosition(); - - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putInt(PREF_CURRENCY_A, currencyA); - editor.putInt(PREF_CURRENCY_B, currencyB); - editor.apply(); - } - @Override public void onPause() { Log.d(TAG, "onPause()"); - savePrefs(); super.onPause(); } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java b/app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java index 668f1721..02405957 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java @@ -28,7 +28,6 @@ import android.widget.Toast; import com.google.zxing.BarcodeFormat; import com.google.zxing.Result; -import com.m2049r.xmrwallet.util.BarcodeData; import me.dm7.barcodescanner.zxing.ZXingScannerView; @@ -64,7 +63,6 @@ public class ScannerFragment extends Fragment implements ZXingScannerView.Result @Override public void handleResult(Result rawResult) { - //Log.d(TAG, rawResult.getBarcodeFormat().toString() + "/" + rawResult.getText()); if ((rawResult.getBarcodeFormat() == BarcodeFormat.QR_CODE) && (rawResult.getText().startsWith(QR_SCHEME))) { if (activityCallback.onAddressScanned(rawResult.getText())) { @@ -101,7 +99,6 @@ public class ScannerFragment extends Fragment implements ZXingScannerView.Result @Override public void onAttach(Context context) { super.onAttach(context); - //Log.d(TAG, "attaching scan"); if (context instanceof Listener) { this.activityCallback = (Listener) context; } else { diff --git a/app/src/main/java/com/m2049r/xmrwallet/SendFragment.java b/app/src/main/java/com/m2049r/xmrwallet/SendFragment.java index 5f135e27..bad8694e 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/SendFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/SendFragment.java @@ -20,11 +20,10 @@ import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.os.Handler; +import android.support.design.widget.TextInputLayout; import android.support.v4.app.Fragment; import android.support.v7.app.AlertDialog; -import android.text.Editable; import android.text.InputType; -import android.text.TextWatcher; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -35,24 +34,36 @@ import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ProgressBar; +import android.widget.ScrollView; import android.widget.Spinner; import android.widget.TextView; +import com.m2049r.xmrwallet.layout.ExchangeView; +import com.m2049r.xmrwallet.layout.Toolbar; import com.m2049r.xmrwallet.model.PendingTransaction; import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.model.WalletManager; -import com.m2049r.xmrwallet.util.Helper; +import com.m2049r.xmrwallet.util.AsyncExchangeRate; import com.m2049r.xmrwallet.util.BarcodeData; +import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.TxData; public class SendFragment extends Fragment { static final String TAG = "SendFragment"; - EditText etAddress; - EditText etPaymentId; - EditText etAmount; + EditText etDummy; + + ScrollView scrollview; + + TextInputLayout etAddress; + TextInputLayout etPaymentId; + //TextInputLayout etAmount; + ExchangeView evAmount; + TextView tvAmountB; + Spinner sCurrencyA; + Spinner sCurrencyB; + Button bScan; - Button bSweep; Spinner sMixin; Spinner sPriority; Button bPrepareSend; @@ -61,7 +72,8 @@ public class SendFragment extends Fragment { LinearLayout llConfirmSend; TextView tvTxAmount; TextView tvTxFee; - TextView tvTxDust; + //TextView tvTxDust; + TextView tvTxTotal; EditText etNotes; Button bSend; Button bReallySend; @@ -78,15 +90,23 @@ public class SendFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.send_fragment, container, false); + View view = inflater.inflate(R.layout.fragment_send, container, false); + + etDummy = (EditText) view.findViewById(R.id.etDummy); + etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + + scrollview = (ScrollView) view.findViewById(R.id.scrollview); sMixin = (Spinner) view.findViewById(R.id.sMixin); sPriority = (Spinner) view.findViewById(R.id.sPriority); - etAddress = (EditText) view.findViewById(R.id.etAddress); - etPaymentId = (EditText) view.findViewById(R.id.etPaymentId); - etAmount = (EditText) view.findViewById(R.id.etAmount); + etAddress = (TextInputLayout) view.findViewById(R.id.etAddress); + etPaymentId = (TextInputLayout) view.findViewById(R.id.etPaymentId); + evAmount = (ExchangeView) view.findViewById(R.id.evAmount); + tvAmountB = (TextView) view.findViewById(R.id.tvAmountB); + sCurrencyA = (Spinner) view.findViewById(R.id.sCurrencyA); + sCurrencyB = (Spinner) view.findViewById(R.id.sCurrencyB); + bScan = (Button) view.findViewById(R.id.bScan); - bSweep = (Button) view.findViewById(R.id.bSweep); bPrepareSend = (Button) view.findViewById(R.id.bPrepareSend); bPaymentId = (Button) view.findViewById(R.id.bPaymentId); bDispose = (Button) view.findViewById(R.id.bDispose); @@ -94,101 +114,64 @@ public class SendFragment extends Fragment { llConfirmSend = (LinearLayout) view.findViewById(R.id.llConfirmSend); tvTxAmount = (TextView) view.findViewById(R.id.tvTxAmount); tvTxFee = (TextView) view.findViewById(R.id.tvTxFee); - tvTxDust = (TextView) view.findViewById(R.id.tvTxDust); + //tvTxDust = (TextView) view.findViewById(R.id.tvTxDust); + tvTxTotal = (TextView) view.findViewById(R.id.tvTxTotal); etNotes = (EditText) view.findViewById(R.id.etNotes); bSend = (Button) view.findViewById(R.id.bSend); bReallySend = (Button) view.findViewById(R.id.bReallySend); pbProgress = (ProgressBar) view.findViewById(R.id.pbProgress); - etAddress.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); - etPaymentId.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + etAddress.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + etPaymentId.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); etNotes.setRawInputType(InputType.TYPE_CLASS_TEXT); Helper.showKeyboard(getActivity()); - etAddress.requestFocus(); - etAddress.setOnEditorActionListener(new TextView.OnEditorActionListener() { + etAddress.getEditText().requestFocus(); + etAddress.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { - if (addressOk()) { + if (checkAddress()) { + evAmount.focus(); + } // otherwise ignore + return true; + } + return false; + } + }); + + evAmount.setOnNewAmountListener(new ExchangeView.OnNewAmountListener() { + @Override + public void onNewAmount(String xmr) { + if ((xmr != null)) { + // stupid workaround to not show error on open of screen + if ((checkAddressNoError() && checkAmountWithError()) || checkAmount()) { etPaymentId.requestFocus(); - } // otherwise ignore - return true; + } } - return false; - } - }); - etAddress.addTextChangedListener(new TextWatcher() { - @Override - public void afterTextChanged(Editable editable) { - if (addressOk() && amountOk()) { - bPrepareSend.setEnabled(true); - } else { - bPrepareSend.setEnabled(false); - } - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - }); - etPaymentId.setOnEditorActionListener(new TextView.OnEditorActionListener() { - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { - if (paymentIdOk()) { - etAmount.requestFocus(); - } // otherwise ignore - return true; - } - return false; } }); - etAmount.setOnEditorActionListener(new TextView.OnEditorActionListener() { + etPaymentId.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) { - if (amountOk()) { + if (checkPaymentId()) { + etDummy.requestFocus(); Helper.hideKeyboard(getActivity()); - disableEdit(); - prepareSend(); } return true; } return false; } }); - etAmount.addTextChangedListener(new TextWatcher() { - @Override - public void afterTextChanged(Editable editable) { - if (addressOk() && amountOk()) { - bPrepareSend.setEnabled(true); - } else { - bPrepareSend.setEnabled(false); - } - } - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - }); - - setPrepareButtonState(); - bPrepareSend.setOnClickListener(new View.OnClickListener() - - { + bPrepareSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Helper.hideKeyboard(getActivity()); - disableEdit(); - prepareSend(); + if (checkAddress() && checkAmountWithError() && checkPaymentId()) { + Helper.hideKeyboard(getActivity()); + prepareSend(); + } } }); @@ -210,27 +193,15 @@ public class SendFragment extends Fragment { bPaymentId.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - etPaymentId.setText((Wallet.generatePaymentId())); - etPaymentId.setSelection(etPaymentId.getText().length()); - } - }); - - bSweep.setOnClickListener(new View.OnClickListener() - - { - @Override - public void onClick(View v) { - Helper.hideKeyboard(getActivity()); - prepareSweep(); + etPaymentId.getEditText().setText((Wallet.generatePaymentId())); + etPaymentId.getEditText().setSelection(etPaymentId.getEditText().getText().length()); } }); etNotes.setOnEditorActionListener(new TextView.OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) { - if (amountOk()) { - Helper.hideKeyboard(getActivity()); - } + Helper.hideKeyboard(getActivity()); return true; } return false; @@ -242,8 +213,8 @@ public class SendFragment extends Fragment { public void onClick(View v) { bSend.setEnabled(false); boolean testnet = WalletManager.getInstance().isTestNet(); - if (testnet) { - send(); + if (!testnet) { + //send(); } else { etNotes.setEnabled(false); Handler handler = new Handler(); @@ -251,6 +222,13 @@ public class SendFragment extends Fragment { @Override public void run() { bReallySend.setVisibility(View.VISIBLE); + bReallySend.setEnabled(true); + scrollview.post(new Runnable() { + @Override + public void run() { + scrollview.fullScroll(ScrollView.FOCUS_DOWN); + } + }); } }, 1000); } @@ -264,40 +242,64 @@ public class SendFragment extends Fragment { send(); } }); + + etDummy.requestFocus(); + Helper.hideKeyboard(getActivity()); + return view; } - private void setPrepareButtonState() { - if (addressOk() && amountOk() && (bSend.getVisibility() != View.VISIBLE)) { - bPrepareSend.setEnabled(true); - } else { - bPrepareSend.setEnabled(false); - } - } - - private boolean addressOk() { - String address = etAddress.getText().toString(); + private boolean checkAddressNoError() { + String address = etAddress.getEditText().getText().toString(); return Wallet.isAddressValid(address, WalletManager.getInstance().isTestNet()); } - private boolean amountOk() { - long amount = Wallet.getAmountFromString(etAmount.getText().toString()); - return (amount > 0); + private boolean checkAddress() { + boolean ok = checkAddressNoError(); + if (!ok) { + etAddress.setError(getString(R.string.send_qr_address_invalid)); + } else { + etAddress.setError(null); + } + return ok; } - private boolean paymentIdOk() { - String paymentId = etPaymentId.getText().toString(); - return paymentId.isEmpty() || Wallet.isPaymentIdValid(paymentId); + private boolean checkAmount() { + String xmr = evAmount.getAmount(); + return (xmr != null) && (Wallet.getAmountFromString(xmr) > 0); + } + + private boolean checkAmountWithError() { + boolean ok = checkAmount(); + if (!ok) { + evAmount.setError(getString(R.string.receive_amount_empty)); + } else { + evAmount.setError(null); + } + return ok; + } + + private boolean checkPaymentId() { + String paymentId = etPaymentId.getEditText().getText().toString(); + boolean ok = paymentId.isEmpty() || Wallet.isPaymentIdValid(paymentId); + if (!ok) { + etPaymentId.setError(getString(R.string.receive_paymentid_invalid)); + } else { + etPaymentId.setError(null); + } + return ok; } private void prepareSend() { - String dst_addr = etAddress.getText().toString(); - String paymentId = etPaymentId.getText().toString(); - long amount = Wallet.getAmountFromString(etAmount.getText().toString()); + etDummy.requestFocus(); + disableEdit(); + String dst_addr = etAddress.getEditText().getText().toString(); + String paymentId = etPaymentId.getEditText().getText().toString(); + long amount = Wallet.getAmountFromString(evAmount.getAmount()); int mixin = Mixins[sMixin.getSelectedItemPosition()]; int priorityIndex = sPriority.getSelectedItemPosition(); PendingTransaction.Priority priority = Priorities[priorityIndex]; - //Log.d(TAG, dst_addr + "/" + paymentId + "/" + amount + "/" + mixin + "/" + priority.toString()); + Log.d(TAG, dst_addr + "/" + paymentId + "/" + amount + "/" + mixin + "/" + priority.toString()); TxData txData = new TxData( dst_addr, paymentId, @@ -308,105 +310,106 @@ public class SendFragment extends Fragment { activityCallback.onPrepareSend(txData); } - private void prepareSweep() { - etAddress.setText(activityCallback.getWalletAddress()); - etPaymentId.setText(""); - etAmount.setText(""); - disableEdit(); - showProgress(); - activityCallback.onPrepareSweep(); - } - private void disableEdit() { sMixin.setEnabled(false); sPriority.setEnabled(false); - etAddress.setEnabled(false); - etPaymentId.setEnabled(false); - etAmount.setEnabled(false); + etAddress.getEditText().setEnabled(false); + etPaymentId.getEditText().setEnabled(false); + evAmount.enable(false); bScan.setEnabled(false); bPaymentId.setEnabled(false); - bSweep.setEnabled(false); bPrepareSend.setEnabled(false); + bPrepareSend.setVisibility(View.GONE); } private void enableEdit() { sMixin.setEnabled(true); sPriority.setEnabled(true); - etAddress.setEnabled(true); - etPaymentId.setEnabled(true); - etAmount.setEnabled(true); + etAddress.getEditText().setEnabled(true); + etPaymentId.getEditText().setEnabled(true); + evAmount.enable(true); bScan.setEnabled(true); bPaymentId.setEnabled(true); - bSweep.setEnabled(true); bPrepareSend.setEnabled(true); + bPrepareSend.setVisibility(View.VISIBLE); + llConfirmSend.setVisibility(View.GONE); - bSend.setEnabled(true); etNotes.setEnabled(true); + bSend.setEnabled(false); bReallySend.setVisibility(View.GONE); + bReallySend.setEnabled(false); + etDummy.requestFocus(); } private void send() { etNotes.setEnabled(false); + etDummy.requestFocus(); String notes = etNotes.getText().toString(); activityCallback.onSend(notes); } - SendFragment.Listener activityCallback; + Listener activityCallback; public interface Listener { void onPrepareSend(TxData data); - void onPrepareSweep(); - void onSend(String notes); String getWalletAddress(); + String getWalletName(); + void onDisposeRequest(); void onScanAddress(); - BarcodeData getScannedData(); + BarcodeData popScannedData(); + void onExchange(AsyncExchangeRate.Listener listener, String currencyA, String currencyB); + + void setSubtitle(String subtitle); + + void setToolbarButton(int type); } @Override public void onResume() { super.onResume(); Log.d(TAG, "onResume"); - BarcodeData data = activityCallback.getScannedData(); + activityCallback.setToolbarButton(Toolbar.BUTTON_BACK); + activityCallback.setSubtitle(getString(R.string.send_title)); + BarcodeData data = activityCallback.popScannedData(); if (data != null) { + Log.d(TAG, "GOT DATA"); String scannedAddress = data.address; if (scannedAddress != null) { - etAddress.setText(scannedAddress); + etAddress.getEditText().setText(scannedAddress); + checkAddress(); } else { - etAddress.getText().clear(); + etAddress.getEditText().getText().clear(); + etAddress.setError(null); } String scannedPaymenId = data.paymentId; if (scannedPaymenId != null) { - etPaymentId.setText(scannedPaymenId); + etPaymentId.getEditText().setText(scannedPaymenId); + checkPaymentId(); } else { - etPaymentId.getText().clear(); + etPaymentId.getEditText().getText().clear(); + etPaymentId.setError(null); } - if (data.amount >= 0) { + if (data.amount > 0) { String scannedAmount = Helper.getDisplayAmount(data.amount); - etAmount.setText(scannedAmount); + evAmount.setAmount(scannedAmount); } else { - etAmount.getText().clear(); - } - etAmount.requestFocus(); - etAmount.setSelection(etAmount.getText().length()); - } else { // no scan data - // jump to first empty field - if (etAddress.getText().toString().isEmpty()) { - etAddress.requestFocus(); - } else if (etPaymentId.getText().toString().isEmpty()) { - etPaymentId.requestFocus(); - } else { - etAmount.requestFocus(); - etAmount.setSelection(etAmount.getText().length()); + evAmount.setAmount(""); } } + if ((data != null) && (data.amount <= 0)) { + evAmount.focus(); + } else { + etDummy.requestFocus(); + Helper.hideKeyboard(getActivity()); + } } @Override @@ -427,9 +430,18 @@ public class SendFragment extends Fragment { return; } llConfirmSend.setVisibility(View.VISIBLE); + bSend.setEnabled(true); tvTxAmount.setText(Wallet.getDisplayAmount(pendingTransaction.getAmount())); tvTxFee.setText(Wallet.getDisplayAmount(pendingTransaction.getFee())); - tvTxDust.setText(Wallet.getDisplayAmount(pendingTransaction.getDust())); + //tvTxDust.setText(Wallet.getDisplayAmount(pendingTransaction.getDust())); + tvTxTotal.setText(Wallet.getDisplayAmount( + pendingTransaction.getFee() + pendingTransaction.getAmount())); + scrollview.post(new Runnable() { + @Override + public void run() { + scrollview.fullScroll(ScrollView.FOCUS_DOWN); + } + }); } public void onCreatedTransactionFailed(String errorText) { @@ -456,4 +468,5 @@ public class SendFragment extends Fragment { public void hideProgress() { pbProgress.setVisibility(View.GONE); } + } diff --git a/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java b/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java index 5cebf19d..88c1eafc 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java @@ -16,19 +16,22 @@ package com.m2049r.xmrwallet; -import android.content.ClipData; -import android.content.ClipboardManager; import android.content.Context; +import android.content.Intent; import android.os.Bundle; +import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v4.content.ContextCompat; import android.text.InputType; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; -import android.widget.Toast; +import com.m2049r.xmrwallet.layout.Toolbar; import com.m2049r.xmrwallet.model.TransactionInfo; import com.m2049r.xmrwallet.model.Transfer; import com.m2049r.xmrwallet.model.Wallet; @@ -64,14 +67,13 @@ public class TxFragment extends Fragment { TextView tvTxFee; TextView tvTxTransfers; TextView etTxNotes; - Button bCopy; Button bTxNotes; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.tx_fragment, container, false); + View view = inflater.inflate(R.layout.fragment_tx_info, container, false); tvTxTimestamp = (TextView) view.findViewById(R.id.tvTxTimestamp); tvTxId = (TextView) view.findViewById(R.id.tvTxId); @@ -83,18 +85,10 @@ public class TxFragment extends Fragment { tvTxFee = (TextView) view.findViewById(R.id.tvTxFee); tvTxTransfers = (TextView) view.findViewById(R.id.tvTxTransfers); etTxNotes = (TextView) view.findViewById(R.id.etTxNotes); - bCopy = (Button) view.findViewById(R.id.bCopy); bTxNotes = (Button) view.findViewById(R.id.bTxNotes); etTxNotes.setRawInputType(InputType.TYPE_CLASS_TEXT); - bCopy.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - copyToClipboard(); - } - }); - bTxNotes.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -119,28 +113,35 @@ public class TxFragment extends Fragment { } } - void copyToClipboard() { + void shareTxInfo() { if (this.info == null) return; StringBuffer sb = new StringBuffer(); - sb.append(getString(R.string.tx_address)).append(": "); - sb.append(activityCallback.getWalletAddress()).append("\n"); - sb.append(getString(R.string.tx_id)).append(": "); - sb.append(info.hash).append("\n"); - sb.append(getString(R.string.tx_key)).append(": "); - sb.append(info.txKey.isEmpty() ? "-" : info.txKey).append("\n"); - sb.append(getString(R.string.tx_paymentId)).append(": "); - sb.append(info.paymentId).append("\n"); - sb.append(getString(R.string.tx_amount)).append(": "); + + sb.append(getString(R.string.tx_timestamp)).append(":\n"); + sb.append(TS_FORMATTER.format(new Date(info.timestamp * 1000))).append("\n\n"); + + sb.append(getString(R.string.tx_amount)).append(":\n"); sb.append((info.direction == TransactionInfo.Direction.Direction_In ? "+" : "-")); sb.append(Wallet.getDisplayAmount(info.amount)).append("\n"); - sb.append(getString(R.string.tx_fee)).append(": "); - sb.append(Wallet.getDisplayAmount(info.fee)).append("\n"); - sb.append(getString(R.string.tx_notes)).append(": "); + sb.append(getString(R.string.tx_fee)).append(":\n"); + sb.append(Wallet.getDisplayAmount(info.fee)).append("\n\n"); + + sb.append(getString(R.string.tx_notes)).append(":\n"); String oneLineNotes = info.notes.replace("\n", " ; "); - sb.append(oneLineNotes.isEmpty() ? "-" : oneLineNotes).append("\n"); - sb.append(getString(R.string.tx_timestamp)).append(": "); - sb.append(TS_FORMATTER.format(new Date(info.timestamp * 1000))).append("\n"); - sb.append(getString(R.string.tx_blockheight)).append(": "); + sb.append(oneLineNotes.isEmpty() ? "-" : oneLineNotes).append("\n\n"); + + sb.append(getString(R.string.tx_destination)).append(":\n"); + sb.append(tvDestination.getText()).append("\n\n"); + + sb.append(getString(R.string.tx_paymentId)).append(":\n"); + sb.append(info.paymentId).append("\n\n"); + + sb.append(getString(R.string.tx_id)).append(":\n"); + sb.append(info.hash).append("\n"); + sb.append(getString(R.string.tx_key)).append(":\n"); + sb.append(info.txKey.isEmpty() ? "-" : info.txKey).append("\n\n"); + + sb.append(getString(R.string.tx_blockheight)).append(":\n"); if (info.isFailed) { sb.append(getString(R.string.tx_failed)).append("\n"); } else if (info.isPending) { @@ -148,7 +149,9 @@ public class TxFragment extends Fragment { } else { sb.append(info.blockheight).append("\n"); } - sb.append(getString(R.string.tx_transfers)).append(": "); + sb.append("\n"); + + sb.append(getString(R.string.tx_transfers)).append(":\n"); if (info.transfers != null) { boolean comma = false; for (Transfer transfer : info.transfers) { @@ -163,12 +166,14 @@ public class TxFragment extends Fragment { } else { sb.append("-"); } - sb.append("\n"); - ClipboardManager clipboardManager = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText(getString(R.string.tx_copy_label), sb.toString()); - clipboardManager.setPrimaryClip(clip); - Toast.makeText(getActivity(), getString(R.string.tx_copy_message), Toast.LENGTH_SHORT).show(); - //Log.d(TAG, sb.toString()); + sb.append("\n\n"); + //Helper.clipBoardCopy(getActivity(), getString(R.string.tx_copy_label), sb.toString()); + //Toast.makeText(getActivity(), getString(R.string.tx_copy_message), Toast.LENGTH_SHORT).show(); + Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, sb.toString()); + sendIntent.setType("text/plain"); + startActivity(Intent.createChooser(sendIntent, null)); } TransactionInfo info = null; @@ -176,17 +181,24 @@ public class TxFragment extends Fragment { void loadNotes(TransactionInfo info) { if (info.notes == null) { info.notes = activityCallback.getTxNotes(info.hash); - //Log.d(TAG, "NOTES:" + info.notes + ":"); } etTxNotes.setText(info.notes); } + private void setTxColour(int clr) { + tvTxAmount.setTextColor(clr); + tvTxFee.setTextColor(clr); + } + private void show(TransactionInfo info) { if (info.txKey == null) { info.txKey = activityCallback.getTxKey(info.hash); - //Log.d(TAG, "TXKEY:" + info.txKey + ":"); } loadNotes(info); + + activityCallback.setSubtitle(getString(R.string.tx_title)); + activityCallback.setToolbarButton(Toolbar.BUTTON_BACK); + tvTxTimestamp.setText(TS_FORMATTER.format(new Date(info.timestamp * 1000))); tvTxId.setText(info.hash); tvTxKey.setText(info.txKey.isEmpty() ? "-" : info.txKey); @@ -199,8 +211,30 @@ public class TxFragment extends Fragment { tvTxBlockheight.setText("" + info.blockheight); } String sign = (info.direction == TransactionInfo.Direction.Direction_In ? "+" : "-"); + tvTxAmount.setText(sign + Wallet.getDisplayAmount(info.amount)); - tvTxFee.setText(Wallet.getDisplayAmount(info.fee)); + if ((info.fee > 0)) { + String fee = Wallet.getDisplayAmount(info.fee); + if (info.isPending) { + tvTxFee.setText(getString(R.string.tx_list_fee_pending, fee)); + } else { + tvTxFee.setText(getString(R.string.tx_list_fee, fee)); + } + } else { + tvTxFee.setText(null); + tvTxFee.setVisibility(View.GONE); + } + if (info.isFailed) { + tvTxAmount.setText(getString(R.string.tx_list_amount_failed, Wallet.getDisplayAmount(info.amount))); + tvTxFee.setText(getString(R.string.tx_list_failed_text)); + setTxColour(ContextCompat.getColor(getContext(), R.color.tx_failed)); + } else if (info.isPending) { + setTxColour(ContextCompat.getColor(getContext(), R.color.tx_pending)); + } else if (info.direction == TransactionInfo.Direction.Direction_In) { + setTxColour(ContextCompat.getColor(getContext(), R.color.tx_green)); + } else { + setTxColour(ContextCompat.getColor(getContext(), R.color.tx_red)); + } Set<String> destinations = new HashSet<>(); StringBuffer sb = new StringBuffer(); StringBuffer dstSb = new StringBuffer(); @@ -232,10 +266,21 @@ public class TxFragment extends Fragment { tvTxTransfers.setText(sb.toString()); tvDestination.setText(dstSb.toString()); this.info = info; - bCopy.setEnabled(true); } - TxFragment.Listener activityCallback; + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setHasOptionsMenu(true); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.tx_info_menu, menu); + super.onCreateOptionsMenu(menu, inflater); + } + + Listener activityCallback; public interface Listener { String getWalletAddress(); @@ -246,6 +291,10 @@ public class TxFragment extends Fragment { void onSetNote(String txId, String notes); + void setToolbarButton(int type); + + void setSubtitle(String subtitle); + } @Override diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java index 4dfb3329..8890192e 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java @@ -17,7 +17,6 @@ package com.m2049r.xmrwallet; import android.app.AlertDialog; -import android.app.ProgressDialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; @@ -25,7 +24,6 @@ import android.content.Intent; import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.net.Uri; -import android.os.AsyncTask; import android.os.Bundle; import android.os.IBinder; import android.os.PowerManager; @@ -34,11 +32,11 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.MenuItem; import android.widget.Toast; +import com.m2049r.xmrwallet.layout.Toolbar; import com.m2049r.xmrwallet.model.PendingTransaction; import com.m2049r.xmrwallet.model.TransactionInfo; import com.m2049r.xmrwallet.model.Wallet; @@ -49,16 +47,13 @@ import com.m2049r.xmrwallet.util.BarcodeData; import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.TxData; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.File; import java.util.HashMap; import java.util.Map; public class WalletActivity extends AppCompatActivity implements WalletFragment.Listener, WalletService.Observer, SendFragment.Listener, TxFragment.Listener, GenerateReviewFragment.ListenerWithWallet, + GenerateReviewFragment.Listener, ScannerFragment.Listener, ReceiveFragment.Listener { private static final String TAG = "WalletActivity"; @@ -67,6 +62,27 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. Toolbar toolbar; + @Override + public void setToolbarButton(int type) { + toolbar.setButton(type); + } + + @Override + public void setTitle(String title, String subtitle) { + toolbar.setTitle(title, subtitle); + } + + @Override + public void setTitle(String title) { + Log.d(TAG, "setTitle:" + title + "."); + toolbar.setTitle(title); + } + + @Override + public void setSubtitle(String subtitle) { + toolbar.setSubtitle(subtitle); + } + private boolean synced = false; @Override @@ -137,8 +153,11 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. case R.id.action_info: onWalletDetails(); return true; - case R.id.action_receive: - onWalletReceive(); + case R.id.action_donate: + onWalletDetails(); + return true; + case R.id.action_share: + onShareTxInfo(); return true; default: return super.onOptionsItemSelected(item); @@ -157,17 +176,35 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. return; } - setContentView(R.layout.wallet_activity); + setContentView(R.layout.activity_wallet); toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); + getSupportActionBar().setDisplayShowTitleEnabled(false); - toolbar.setTitle(R.string.app_name); + toolbar.setOnButtonListener(new Toolbar.OnButtonListener() { + @Override + public void onButton(int type) { + switch (type) { + case Toolbar.BUTTON_BACK: + onBackPressed(); + break; + case Toolbar.BUTTON_CLOSE: + finish(); + break; + case Toolbar.BUTTON_DONATE: + Toast.makeText(WalletActivity.this, getString(R.string.label_donate), Toast.LENGTH_SHORT).show(); + case Toolbar.BUTTON_NONE: + default: + Log.e(TAG, "Button " + type + "pressed - how can this be?"); + } + } + }); boolean testnet = WalletManager.getInstance().isTestNet(); if (testnet) { toolbar.setBackgroundResource(R.color.colorPrimaryDark); } else { - toolbar.setBackgroundResource(R.color.moneroOrange); + toolbar.setBackgroundResource(R.drawable.backgound_toolbar_mainnet); } Fragment walletFragment = new WalletFragment(); @@ -195,18 +232,15 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. // service that we know is running in our own process, we can // cast its IBinder to a concrete class and directly access it. mBoundService = ((WalletService.WalletServiceBinder) service).getService(); - //Log.d(TAG, "setting observer of " + mBoundService); mBoundService.setObserver(WalletActivity.this); Bundle extras = getIntent().getExtras(); if (extras != null) { String walletId = extras.getString(REQUEST_ID); if (walletId != null) { - setTitle(walletId); - setSubtitle(""); + setTitle(walletId, getString(R.string.status_wallet_connecting)); } } updateProgress(); - //TODO show current pbProgress (eg. if the service is already busy saving last wallet) Log.d(TAG, "CONNECTED"); } @@ -216,8 +250,7 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. // Because it is running in our same process, we should never // see this happen. mBoundService = null; - setTitle(getString(R.string.wallet_activity_name)); - setSubtitle(""); + setTitle(getString(R.string.wallet_activity_name), getString(R.string.status_wallet_disconnected)); Log.d(TAG, "DISCONNECTED"); } }; @@ -269,7 +302,7 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. wl.acquire(); Log.d(TAG, "WakeLock acquired"); } catch (SecurityException ex) { - Log.d(TAG, "WakeLock NOT acquired: " + ex.getLocalizedMessage()); + Log.w(TAG, "WakeLock NOT acquired: " + ex.getLocalizedMessage()); wl = null; } } @@ -292,9 +325,9 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. } } - ////////////////////////////////////////// - // WalletFragment.Listener - ////////////////////////////////////////// +////////////////////////////////////////// +// WalletFragment.Listener +////////////////////////////////////////// @Override public boolean hasBoundService() { @@ -311,16 +344,6 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. return mBoundService.getDaemonHeight(); } - @Override - public void setTitle(String title) { - toolbar.setTitle(title); - } - - @Override - public void setSubtitle(String subtitle) { - toolbar.setSubtitle(subtitle); - } - @Override public void onSendRequest() { replaceFragment(new SendFragment(), null, null); @@ -342,9 +365,9 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. } } - /////////////////////////// - // WalletService.Observer - /////////////////////////// +/////////////////////////// +// WalletService.Observer +/////////////////////////// // refresh and return if successful @Override @@ -514,9 +537,9 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. } } - /////////////////////////// - // SendFragment.Listener - /////////////////////////// +/////////////////////////// +// SendFragment.Listener +/////////////////////////// @Override public void onSend(String notes) { @@ -561,20 +584,13 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. } @Override - public void onPrepareSweep() { - if (mIsBound) { // no point in talking to unbound service - Intent intent = new Intent(getApplicationContext(), WalletService.class); - intent.putExtra(WalletService.REQUEST, WalletService.REQUEST_CMD_SWEEP); - startService(intent); - Log.d(TAG, "SWEEP TX request sent"); - } else { - Log.e(TAG, "Service not bound"); - } + public String getWalletAddress() { + return getWallet().getAddress(); } @Override - public String getWalletAddress() { - return getWallet().getAddress(); + public String getWalletName() { + return getWallet().getName(); } void popFragmentStack(String name) { @@ -619,6 +635,18 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. .show(); } + void onShareTxInfo() { + try { + TxFragment fragment = (TxFragment) + getSupportFragmentManager().findFragmentById(R.id.fragment_container); + fragment.shareTxInfo(); + } catch (ClassCastException ex) { + // not in wallet fragment + Log.e(TAG, ex.getLocalizedMessage()); + // keep calm and carry on + } + } + @Override public void onDisposeRequest() { getWallet().disposePendingTransaction(); @@ -710,7 +738,7 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. @Override - public BarcodeData getScannedData() { + public BarcodeData popScannedData() { BarcodeData data = scannedData; scannedData = null; return data; @@ -745,6 +773,7 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. Log.d(TAG, "startReceive()"); Bundle b = new Bundle(); b.putString("address", address); + b.putString("name", getWalletName()); startReceiveFragment(b); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java b/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java index b9f205f1..d8acead1 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java @@ -19,22 +19,25 @@ package com.m2049r.xmrwallet; import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; -import android.support.constraint.ConstraintLayout; import android.support.v4.app.Fragment; -import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; import android.widget.Button; -import android.widget.LinearLayout; +import android.widget.FrameLayout; +import android.widget.ImageView; import android.widget.ProgressBar; +import android.widget.Spinner; import android.widget.TextView; +import com.m2049r.xmrwallet.layout.AsyncExchangeRate; +import com.m2049r.xmrwallet.layout.Toolbar; import com.m2049r.xmrwallet.layout.TransactionInfoAdapter; import com.m2049r.xmrwallet.model.TransactionInfo; import com.m2049r.xmrwallet.model.Wallet; @@ -43,19 +46,24 @@ import com.m2049r.xmrwallet.util.Helper; import java.text.NumberFormat; import java.util.List; -public class WalletFragment extends Fragment implements TransactionInfoAdapter.OnInteractionListener { +public class WalletFragment extends Fragment + implements TransactionInfoAdapter.OnInteractionListener, + AsyncExchangeRate.Listener { private static final String TAG = "WalletFragment"; private TransactionInfoAdapter adapter; private NumberFormat formatter = NumberFormat.getInstance(); + FrameLayout flExchange; TextView tvBalance; TextView tvUnconfirmedAmount; - TextView tvBlockHeightProgress; - ConstraintLayout clProgress; TextView tvProgress; + ImageView ivSynced; ProgressBar pbProgress; + Button bReceive; Button bSend; + Spinner sCurrency; + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -72,44 +80,145 @@ public class WalletFragment extends Fragment implements TransactionInfoAdapter.O @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.wallet_fragment, container, false); + View view = inflater.inflate(R.layout.fragment_wallet, container, false); + + flExchange = (FrameLayout) view.findViewById(R.id.flExchange); + ((ProgressBar) view.findViewById(R.id.pbExchange)).getIndeterminateDrawable(). + setColorFilter(getResources().getColor(R.color.trafficGray), + android.graphics.PorterDuff.Mode.MULTIPLY); tvProgress = (TextView) view.findViewById(R.id.tvProgress); pbProgress = (ProgressBar) view.findViewById(R.id.pbProgress); - clProgress = (ConstraintLayout) view.findViewById(R.id.clProgress); tvBalance = (TextView) view.findViewById(R.id.tvBalance); - tvBalance.setText(getResources().getString(R.string.xmr_balance, Helper.getDisplayAmount(0))); + tvBalance.setText(Helper.getDisplayAmount(0)); tvUnconfirmedAmount = (TextView) view.findViewById(R.id.tvUnconfirmedAmount); tvUnconfirmedAmount.setText(getResources().getString(R.string.xmr_unconfirmed_amount, Helper.getDisplayAmount(0))); - tvBlockHeightProgress = (TextView) view.findViewById(R.id.tvBlockHeightProgress); + ivSynced = (ImageView) view.findViewById(R.id.ivSynced); + + sCurrency = (Spinner) view.findViewById(R.id.sCurrency); + sCurrency.setAdapter(ArrayAdapter.createFromResource(getContext(), R.array.currency, R.layout.item_spinner)); bSend = (Button) view.findViewById(R.id.bSend); + bReceive = (Button) view.findViewById(R.id.bReceive); RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.list); this.adapter = new TransactionInfoAdapter(getActivity(), this); recyclerView.setAdapter(adapter); - bSend.setOnClickListener(new View.OnClickListener() - - { + bSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { activityCallback.onSendRequest(); } }); + bReceive.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + activityCallback.onWalletReceive(); + } + }); + + sCurrency.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { + refreshBalance(); + } + + @Override + public void onNothingSelected(AdapterView<?> parentView) { + // nothing (yet?) + } + }); + if (activityCallback.isSynced()) { onSynced(); } -// activityCallback.setTitle(getString(R.string.status_wallet_loading)); - activityCallback.forceUpdate(); return view; } + String balanceCurrency = "XMR"; + double balanceRate = 1.0; + + void refreshBalance() { + if (sCurrency.getSelectedItemPosition() == 0) { // XMR + double amountXmr = Double.parseDouble(Wallet.getDisplayAmount(unlockedBalance)); // assume this cannot fail! + tvBalance.setText(Helper.getFormattedAmount(amountXmr, true)); + } else { // not XMR + String currency = (String) sCurrency.getSelectedItem(); + if (!currency.equals(balanceCurrency) || (balanceRate <= 0)) { + showExchanging(); + new AsyncExchangeRate(this).execute("XMR", currency); + } else { + exchange("XMR", balanceCurrency, balanceRate); + } + } + } + + boolean isExchanging = false; + + void showExchanging() { + isExchanging = true; + tvBalance.setVisibility(View.GONE); + flExchange.setVisibility(View.VISIBLE); + } + + void hideExchanging() { + isExchanging = false; + tvBalance.setVisibility(View.VISIBLE); + flExchange.setVisibility(View.GONE); + } + + // Callbacks from AsyncExchangeRate + + // callback from AsyncExchangeRate when it can't get exchange rate + public void exchangeFailed() { + sCurrency.setSelection(0, true); // default to XMR + double amountXmr = Double.parseDouble(Wallet.getDisplayAmount(unlockedBalance)); // assume this cannot fail! + tvBalance.setText(Helper.getFormattedAmount(amountXmr, true)); + hideExchanging(); + } + + void updateBalance() { + if (isExchanging) return; // wait for exchange to finish - it will fire this itself then. + // at this point selection is XMR in case of error + String displayB; + double amountA = Double.parseDouble(Wallet.getDisplayAmount(unlockedBalance)); // assume this cannot fail! + if (!"XMR".equals(balanceCurrency)) { // not XMR + double amountB = amountA * balanceRate; + displayB = Helper.getFormattedAmount(amountB, false); + } else { // XMR + displayB = Helper.getFormattedAmount(amountA, true); + } + tvBalance.setText(displayB); + } + + // callback from AsyncExchangeRate when we have a rate + public void exchange(String currencyA, String currencyB, double rate) { + hideExchanging(); + if (!"XMR".equals(currencyA)) { + Log.e(TAG, "Not XMR"); + sCurrency.setSelection(0, true); + balanceCurrency = "XMR"; + balanceRate = 1.0; + } else { + int spinnerPosition = ((ArrayAdapter) sCurrency.getAdapter()).getPosition(currencyB); + if (spinnerPosition < 0) { // requested currency not in list + Log.e(TAG, "Requested currency not in list " + currencyB); + sCurrency.setSelection(0, true); + } else { + sCurrency.setSelection(spinnerPosition, true); + } + balanceCurrency = currencyB; + balanceRate = rate; + } + updateBalance(); + } + // Callbacks from TransactionInfoAdapter @Override public void onInteraction(final View view, final TransactionInfo infoItem) { @@ -117,6 +226,7 @@ public class WalletFragment extends Fragment implements TransactionInfoAdapter.O } // called from activity + public void onRefreshed(final Wallet wallet, final boolean full) { Log.d(TAG, "onRefreshed()"); if (full) { @@ -134,13 +244,17 @@ public class WalletFragment extends Fragment implements TransactionInfoAdapter.O } } + public void setProgressText(final String text) { + tvProgress.setText(text); + } + public void onProgress(final String text) { if (text != null) { - tvProgress.setText(text); - showProgress(); + setProgressText(text); + pbProgress.setVisibility(View.VISIBLE); } else { - hideProgress(); - tvProgress.setText(getString(R.string.status_working)); + pbProgress.setVisibility(View.INVISIBLE); + setProgressText(getString(R.string.status_working)); onProgress(-1); } } @@ -154,48 +268,35 @@ public class WalletFragment extends Fragment implements TransactionInfoAdapter.O } } - public void showProgress() { - clProgress.setVisibility(View.VISIBLE); - tvBlockHeightProgress.setVisibility(View.GONE); - } - - public void hideProgress() { - clProgress.setVisibility(View.GONE); - tvBlockHeightProgress.setVisibility(View.VISIBLE); - } - - String setActivityTitle(Wallet wallet) { - if (wallet == null) return null; - String shortName = wallet.getName(); - if (shortName.length() > 16) { - shortName = shortName.substring(0, 14) + "..."; - } - // TODO very very rarely this craches because getAddress returns "" or so ... - // maybe because this runs in the ui thread and not in a 5MB thread - String title = "[" + wallet.getAddress().substring(0, 6) + "] " + shortName; - activityCallback.setTitle(title); - - String watchOnly = (wallet.isWatchOnly() ? " " + getString(R.string.watchonly_label) : ""); - String net = (wallet.isTestNet() ? getString(R.string.connect_testnet) : getString(R.string.connect_mainnet)); - activityCallback.setSubtitle(net + " " + watchOnly); - Log.d(TAG, "wallet title is " + title); - return title; + void setActivityTitle(Wallet wallet) { + if (wallet == null) return; + walletTitle = wallet.getName(); + String watchOnly = (wallet.isWatchOnly() ? getString(R.string.label_watchonly) : ""); + walletSubtitle = wallet.getAddress().substring(0, 16) + "…" + watchOnly; + activityCallback.setTitle(walletTitle, walletSubtitle); + Log.d(TAG, "wallet title is " + walletTitle); } private long firstBlock = 0; private String walletTitle = null; + private String walletSubtitle = null; + private long unlockedBalance = 0; private void updateStatus(Wallet wallet) { if (!isAdded()) return; Log.d(TAG, "updateStatus()"); if (walletTitle == null) { - walletTitle = setActivityTitle(wallet); + setActivityTitle(wallet); onProgress(100); // of loading } long balance = wallet.getBalance(); - long unlockedBalance = wallet.getUnlockedBalance(); - tvBalance.setText(getResources().getString(R.string.xmr_balance, Helper.getDisplayAmount(unlockedBalance))); - tvUnconfirmedAmount.setText(getResources().getString(R.string.xmr_unconfirmed_amount, Helper.getDisplayAmount(balance - unlockedBalance))); + unlockedBalance = wallet.getUnlockedBalance(); + refreshBalance(); + double amountXmr = Double.parseDouble(Helper.getDisplayAmount(balance - unlockedBalance)); // assume this cannot fail! + String unconfirmed = Helper.getFormattedAmount(amountXmr, true); + tvUnconfirmedAmount.setText(getResources().getString(R.string.xmr_unconfirmed_amount, unconfirmed)); + //tvUnconfirmedAmount.setText(getResources().getString(R.string.xmr_unconfirmed_amount, + // Helper.getDisplayAmount(balance - unlockedBalance, Helper.DISPLAY_DIGITS_SHORT))); String sync = ""; if (!activityCallback.hasBoundService()) throw new IllegalStateException("WalletService not bound."); @@ -212,13 +313,13 @@ public class WalletFragment extends Fragment implements TransactionInfoAdapter.O onProgress(getString(R.string.status_syncing) + " " + sync); if (x == 0) x = -1; onProgress(x); + ivSynced.setVisibility(View.GONE); } else { sync = getString(R.string.status_synced) + ": " + formatter.format(wallet.getBlockChainHeight()); + ivSynced.setVisibility(View.VISIBLE); } } - tvBlockHeightProgress.setText(sync); - //String net = (wallet.isTestNet() ? getString(R.string.connect_testnet) : getString(R.string.connect_mainnet)); - //activityCallback.setSubtitle(net + " " + daemonConnected.toString().substring(17)); + setProgressText(sync); // TODO show connected status somewhere } @@ -234,10 +335,6 @@ public class WalletFragment extends Fragment implements TransactionInfoAdapter.O long getDaemonHeight(); //mBoundService.getDaemonHeight(); - void setTitle(String title); - - void setSubtitle(String subtitle); - void onSendRequest(); void onTxDetailsRequest(TransactionInfo info); @@ -251,6 +348,12 @@ public class WalletFragment extends Fragment implements TransactionInfoAdapter.O void onWalletReceive(); boolean hasWallet(); + + void setToolbarButton(int type); + + void setTitle(String title, String subtitle); + + void setSubtitle(String subtitle); } @Override @@ -263,4 +366,12 @@ public class WalletFragment extends Fragment implements TransactionInfoAdapter.O + " must implement Listener"); } } + + @Override + public void onResume() { + super.onResume(); + Log.d(TAG, "onResume()"); + activityCallback.setTitle(walletTitle, walletSubtitle); + activityCallback.setToolbarButton(Toolbar.BUTTON_CLOSE); + } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/dialog/HelpFragment.java b/app/src/main/java/com/m2049r/xmrwallet/dialog/HelpFragment.java index 72751f89..75a15e66 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/dialog/HelpFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/dialog/HelpFragment.java @@ -26,6 +26,7 @@ import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.webkit.WebView; @@ -43,6 +44,7 @@ import java.io.InputStreamReader; * http://speakman.net.nz */ public class HelpFragment extends DialogFragment { + static final String TAG = "HelpFragment"; private static final String FRAGMENT_TAG = "com.m2049r.xmrwallet.dialog.HelpFragment"; private static final String HELP_ID = "HELP_ID"; @@ -67,7 +69,6 @@ public class HelpFragment extends DialogFragment { if (prev != null) { ft.remove(prev); } - ft.addToBackStack(null); // Create and show the dialog. DialogFragment newFragment = HelpFragment.newInstance(helpResourceId); @@ -100,7 +101,7 @@ public class HelpFragment extends DialogFragment { @SuppressLint("InflateParams") @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - View content = LayoutInflater.from(getActivity()).inflate(R.layout.help_fragment, null); + View content = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_help, null); webView = (WebView) content.findViewById(R.id.helpFragmentWebView); progress = (ProgressBar) content.findViewById(R.id.helpFragmentProgress); @@ -136,8 +137,8 @@ public class HelpFragment extends DialogFragment { sb.append("\n"); } bufferedReader.close(); - } catch (IOException e) { - // TODO You may want to include some logging here. + } catch (IOException ex) { + Log.e(TAG, ex.getLocalizedMessage()); } return sb.toString(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/dialog/LicensesFragment.java b/app/src/main/java/com/m2049r/xmrwallet/dialog/LicensesFragment.java index f9c0794a..d2fcbab5 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/dialog/LicensesFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/dialog/LicensesFragment.java @@ -16,22 +16,17 @@ package com.m2049r.xmrwallet.dialog; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - import android.annotation.SuppressLint; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.AsyncTask; import android.os.Bundle; -//TODO If you don't support Android 2.x, you should use the non-support version! import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.webkit.WebView; @@ -41,11 +36,17 @@ import android.widget.TextView; import com.m2049r.xmrwallet.BuildConfig; import com.m2049r.xmrwallet.R; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + /** * Created by Adam Speakman on 24/09/13. * http://speakman.net.nz */ public class LicensesFragment extends DialogFragment { + static final String TAG = "LicensesFragment"; int versionCode = BuildConfig.VERSION_CODE; String versionName = BuildConfig.VERSION_NAME; @@ -102,7 +103,7 @@ public class LicensesFragment extends DialogFragment { @SuppressLint("InflateParams") @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - View content = LayoutInflater.from(getActivity()).inflate(R.layout.licenses_fragment, null); + View content = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_licenses, null); mWebView = (WebView) content.findViewById(R.id.licensesFragmentWebView); mIndeterminateProgress = (ProgressBar) content.findViewById(R.id.licensesFragmentIndeterminateProgress); @@ -140,8 +141,8 @@ public class LicensesFragment extends DialogFragment { sb.append("\n"); } bufferedReader.close(); - } catch (IOException e) { - // TODO You may want to include some logging here. + } catch (IOException ex) { + Log.e(TAG, ex.getLocalizedMessage()); } return sb.toString(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/AsyncExchangeRate.java b/app/src/main/java/com/m2049r/xmrwallet/layout/AsyncExchangeRate.java new file mode 100644 index 00000000..9d563644 --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/layout/AsyncExchangeRate.java @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2017 m2049r + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.m2049r.xmrwallet.layout; + +import android.os.AsyncTask; +import android.util.Log; + +import com.m2049r.xmrwallet.util.Helper; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.lang.ref.WeakReference; + +public class AsyncExchangeRate extends AsyncTask<String, Void, Boolean> { + static final String TAG = "AsyncExchangeRate"; + static final long TIME_REFRESH_INTERVAL = 60000; // refresh exchange rate max every minute + + public interface Listener { + void exchangeFailed(); + + // callback from AsyncExchangeRate when we have a rate + void exchange(String currencyA, String currencyB, double rate); + } + + static long RateTime = 0; + static double Rate = 0; + static String Fiat = null; + + private final WeakReference<Listener> exchangeViewRef; + + public AsyncExchangeRate(Listener exchangeView) { + super(); + exchangeViewRef = new WeakReference<>(exchangeView); + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + } + + boolean inverse = false; + String currencyA = null; + String currencyB = null; + + @Override + protected Boolean doInBackground(String... params) { + if (params.length != 2) return false; + Log.d(TAG, "Getting " + params[0]); + currencyA = params[0]; + currencyB = params[1]; + + String fiat = null; + if (currencyA.equals("XMR")) { + fiat = currencyB; + inverse = false; + } + if (currencyB.equals("XMR")) { + fiat = currencyA; + inverse = true; + } + + if (currencyA.equals(currencyB)) { + Fiat = null; + Rate = 1; + RateTime = System.currentTimeMillis(); + return true; + } + + if (fiat == null) { + Fiat = null; + Rate = 0; + RateTime = 0; + return false; + } + + if (!fiat.equals(Fiat)) { // new currency - reset all + Fiat = fiat; + Rate = 0; + RateTime = 0; + } + + if (System.currentTimeMillis() > RateTime + TIME_REFRESH_INTERVAL) { + Log.d(TAG, "Fetching " + Fiat); + String closePrice = getExchangeRate(Fiat); + if (closePrice != null) { + try { + Rate = Double.parseDouble(closePrice); + RateTime = System.currentTimeMillis(); + return true; + } catch (NumberFormatException ex) { + Rate = 0; + Log.e(TAG, ex.getLocalizedMessage()); + return false; + } + } else { + Rate = 0; + Log.e(TAG, "exchange url failed"); + return false; + } + } + return true; // no change but still valid + } + + @Override + protected void onPostExecute(Boolean result) { + super.onPostExecute(result); + Listener exchangeView = exchangeViewRef.get(); + if (result) { + Log.d(TAG, "yay! = " + Rate); + if (exchangeView != null) { + exchangeView.exchange(currencyA, currencyB, inverse ? (1 / Rate) : Rate); + } + } else { + Log.d(TAG, "nay!"); + if (exchangeView != null) { + exchangeView.exchangeFailed(); + } + } + } + + // "https://api.kraken.com/0/public/Ticker?pair=XMREUR" + String getExchangeRate(String fiat) { + String jsonResponse = + Helper.getUrl("https://api.kraken.com/0/public/Ticker?pair=XMR" + fiat); + if (jsonResponse == null) return null; + try { + JSONObject response = new JSONObject(jsonResponse); + JSONArray errors = response.getJSONArray("error"); + Log.e(TAG, "errors=" + errors.toString()); + if (errors.length() == 0) { + JSONObject result = response.getJSONObject("result"); + JSONObject pair = result.getJSONObject("XXMRZ" + fiat); + JSONArray close = pair.getJSONArray("c"); + String closePrice = close.getString(0); + Log.d(TAG, "closePrice=" + closePrice); + return closePrice; + } + } catch (JSONException ex) { + Log.e(TAG, ex.getLocalizedMessage()); + } + return null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/CTextInputLayout.java b/app/src/main/java/com/m2049r/xmrwallet/layout/CTextInputLayout.java new file mode 100644 index 00000000..6be40f04 --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/layout/CTextInputLayout.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2017 m2049r + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// based on from https://stackoverflow.com/a/45325876 (which did not work for me) + +package com.m2049r.xmrwallet.layout; + +import android.content.Context; +import android.support.design.widget.TextInputLayout; +import android.util.AttributeSet; +import android.widget.EditText; + +public class CTextInputLayout extends TextInputLayout { + public CTextInputLayout(Context context) { + super(context); + } + + public CTextInputLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public CTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + public int getBaseline() { + EditText editText = getEditText(); + return editText.getBaseline() - (getMeasuredHeight() - editText.getMeasuredHeight()); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/ExchangeView.java b/app/src/main/java/com/m2049r/xmrwallet/layout/ExchangeView.java new file mode 100644 index 00000000..39b4c02e --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/layout/ExchangeView.java @@ -0,0 +1,399 @@ +/* + * Copyright (c) 2017 m2049r + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// based on https://code.tutsplus.com/tutorials/creating-compound-views-on-android--cms-22889 + +package com.m2049r.xmrwallet.layout; + +import android.content.Context; +import android.support.design.widget.TextInputLayout; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.AttributeSet; +import android.util.Log; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.AdapterView; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.Spinner; +import android.widget.TextView; + +import com.m2049r.xmrwallet.R; +import com.m2049r.xmrwallet.model.Wallet; +import com.m2049r.xmrwallet.util.Helper; + +import java.util.Locale; + +public class ExchangeView extends LinearLayout implements AsyncExchangeRate.Listener { + static final String TAG = "ExchangeView"; + + public boolean focus() { + return etAmount.requestFocus(); + } + + public void enable(boolean enable) { + etAmount.setEnabled(enable); + sCurrencyA.setEnabled(enable); + sCurrencyB.setEnabled(enable); + } + + String xmrAmount = null; + String notXmrAmount = null; + + void setXmr(String xmr) { + xmrAmount = xmr; + if (onNewAmountListener != null) { + onNewAmountListener.onNewAmount(xmr); + } + } + + public void setAmount(String xmrAmount) { + if (xmrAmount != null) { + setCurrencyA(0); + setXmr(xmrAmount); + this.notXmrAmount = null; + doExchange(); + } else { + setXmr(null); + this.notXmrAmount = null; + tvAmountB.setText("--"); + } + } + + public String getAmount() { + return xmrAmount; + } + + public void setError(String msg) { + etAmount.setError(msg); + } + + TextInputLayout etAmount; + TextView tvAmountB; + Spinner sCurrencyA; + Spinner sCurrencyB; + ImageView evExchange; + ProgressBar pbExchange; + + + public void setCurrencyA(int currency) { + if ((currency != 0) && (getCurrencyB() != 0)) { + setCurrencyB(0); + } + sCurrencyA.setSelection(currency, true); + doExchange(); + } + + public void setCurrencyB(int currency) { + if ((currency != 0) && (getCurrencyA() != 0)) { + setCurrencyA(0); + } + sCurrencyB.setSelection(currency, true); + doExchange(); + } + + public int getCurrencyA() { + return sCurrencyA.getSelectedItemPosition(); + } + + public int getCurrencyB() { + return sCurrencyB.getSelectedItemPosition(); + } + + public ExchangeView(Context context) { + super(context); + initializeViews(context); + } + + public ExchangeView(Context context, AttributeSet attrs) { + super(context, attrs); + initializeViews(context); + } + + public ExchangeView(Context context, + AttributeSet attrs, + int defStyle) { + super(context, attrs, defStyle); + initializeViews(context); + } + + /** + * Inflates the views in the layout. + * + * @param context the current context for the view. + */ + private void initializeViews(Context context) { + LayoutInflater inflater = (LayoutInflater) context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + inflater.inflate(R.layout.view_exchange, this); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + etAmount = (TextInputLayout) findViewById(R.id.etAmount); + tvAmountB = (TextView) findViewById(R.id.tvAmountB); + sCurrencyA = (Spinner) findViewById(R.id.sCurrencyA); + sCurrencyB = (Spinner) findViewById(R.id.sCurrencyB); + evExchange = (ImageView) findViewById(R.id.evExchange); + pbExchange = (ProgressBar) findViewById(R.id.pbExchange); + + // make progress circle gray + pbExchange.getIndeterminateDrawable(). + setColorFilter(getResources().getColor(R.color.trafficGray), + android.graphics.PorterDuff.Mode.MULTIPLY); + + + sCurrencyA.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { + if (position != 0) { // if not XMR, select XMR on other + sCurrencyB.setSelection(0, true); + } + doExchange(); + } + + @Override + public void onNothingSelected(AdapterView<?> parentView) { + // nothing (yet?) + } + }); + + sCurrencyB.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { + if (position != 0) { // if not XMR, select XMR on other + sCurrencyA.setSelection(0, true); + } + doExchange(); + } + + @Override + public void onNothingSelected(AdapterView<?> parentView) { + // nothing (yet?) + } + }); + + etAmount.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) { + doExchange(); + return true; + } + return false; + } + }); + + + etAmount.getEditText().addTextChangedListener(new TextWatcher() { + @Override + public void afterTextChanged(Editable editable) { + etAmount.setError(null); + if ((xmrAmount != null) || (notXmrAmount != null)) { + tvAmountB.setText("--"); + setXmr(null); + notXmrAmount = null; + } + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + }); + + } + + final static double MAX_AMOUNT_XMR = 1000; + final static double MAX_AMOUNT_NOTXMR = 100000; + + public boolean checkEnteredAmount() { + boolean ok = true; + Log.d(TAG, "checkEnteredAmount"); + String amountEntry = etAmount.getEditText().getText().toString(); + if (!amountEntry.isEmpty()) { + try { + double a = Double.parseDouble(amountEntry); + double maxAmount = (getCurrencyA() == 0) ? MAX_AMOUNT_XMR : MAX_AMOUNT_NOTXMR; + if (a > (maxAmount)) { + etAmount.setError(getResources(). + getString(R.string.receive_amount_too_big, + String.format(Locale.US, "%,.0f", maxAmount))); + ok = false; + } else if (a < 0) { + etAmount.setError(getResources().getString(R.string.receive_amount_negative)); + ok = false; + } + } catch (NumberFormatException ex) { + etAmount.setError(getResources().getString(R.string.receive_amount_nan)); + ok = false; + } + } + if (ok) { + etAmount.setError(null); + } + return ok; + } + + int selectedNotXmrCurrency() { + return Math.max(getCurrencyA(), getCurrencyB()); + } + + public void doExchange() { + tvAmountB.setText("--"); + // TODO cache & use cached exchange rate here + startExchange(); + } + + void startExchange() { + showProgress(); + String currencyA = (String) sCurrencyA.getSelectedItem(); + String currencyB = (String) sCurrencyB.getSelectedItem(); + new AsyncExchangeRate(this).execute(currencyA, currencyB); + } + + public void exchange(double rate) { + if (getCurrencyA() == 0) { + if (!xmrAmount.isEmpty() && (rate > 0)) { + double amountB = rate * Double.parseDouble(xmrAmount); + notXmrAmount = Helper.getFormattedAmount(amountB, getCurrencyB() == 0); + } else { + notXmrAmount = ""; + } + tvAmountB.setText(notXmrAmount); + } else if (getCurrencyB() == 0) { + if (!notXmrAmount.isEmpty() && (rate > 0)) { + double amountB = rate * Double.parseDouble(notXmrAmount); + setXmr(Helper.getFormattedAmount(amountB, true)); + } else { + setXmr(""); + } + tvAmountB.setText(xmrAmount); + } else { // no XMR currency - cannot happen! + Log.e(TAG, "No XMR currency!"); + setXmr(null); + notXmrAmount = null; + return; + } + } + + boolean prepareExchange() { + Log.d(TAG, "prepareExchange()"); + if (checkEnteredAmount()) { + String enteredAmount = etAmount.getEditText().getText().toString(); + if (!enteredAmount.isEmpty()) { + String cleanAmount = ""; + if (getCurrencyA() == 0) { + // sanitize the input + cleanAmount = Helper.getDisplayAmount(Wallet.getAmountFromString(enteredAmount)); + setXmr(cleanAmount); + notXmrAmount = null; + Log.d(TAG, "cleanAmount = " + cleanAmount); + } else if (getCurrencyB() == 0) { // we use B & 0 here for the else below ... + // sanitize the input + double amountA = Double.parseDouble(enteredAmount); + cleanAmount = String.format(Locale.US, "%.2f", amountA); + setXmr(null); + notXmrAmount = cleanAmount; + } else { // no XMR currency - cannot happen! + Log.e(TAG, "No XMR currency!"); + setXmr(null); + notXmrAmount = null; + return false; + } + Log.d(TAG, "prepareExchange() " + cleanAmount); + //etAmount.getEditText().setText(cleanAmount); // display what we use + } else { + setXmr(""); + notXmrAmount = ""; + } + return true; + } else { + setXmr(null); + notXmrAmount = null; + return false; + } + } + + // callback from AsyncExchangeRate when it failed getting a rate + public void exchangeFailed() { + hideProgress(); + exchange(0); + // TODO Toast it failed - I think this happens elsewhere already + } + + // callback from AsyncExchangeRate when we have a rate + public void exchange(String currencyA, String currencyB, double rate) { + hideProgress(); + // first, make sure this is what we want + String enteredCurrencyA = (String) sCurrencyA.getSelectedItem(); + String enteredCurrencyB = (String) sCurrencyB.getSelectedItem(); + if (!currencyA.equals(enteredCurrencyA) || !currencyB.equals(enteredCurrencyB)) { + // something's wrong + Log.e(TAG, "Currencies don't match!"); + return; + } + if (prepareExchange()) { + exchange(rate); + } + } + + private void showProgress() { + pbExchange.setVisibility(View.VISIBLE); + } + + private void hideProgress() { + pbExchange.setVisibility(View.INVISIBLE); + } + + // Hooks + public interface OnNewAmountListener { + void onNewAmount(String xmr); + } + + OnNewAmountListener onNewAmountListener; + + public void setOnNewAmountListener(OnNewAmountListener listener) { + onNewAmountListener = listener; + } + + public interface OnAmountInvalidatedListener { + void onAmountInvalidated(); + } + + OnAmountInvalidatedListener onAmountInvalidatedListener; + + public void setOnAmountInvalidatedListener(OnAmountInvalidatedListener listener) { + onAmountInvalidatedListener = listener; + } + + public interface OnFailedExchangeListener { + void onFailedExchange(); + } + + OnFailedExchangeListener onFailedExchangeListener; + + public void setOnFailedExchangeListener(OnFailedExchangeListener listener) { + onFailedExchangeListener = listener; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/Toolbar.java b/app/src/main/java/com/m2049r/xmrwallet/layout/Toolbar.java new file mode 100644 index 00000000..4da1b17b --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/layout/Toolbar.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2017 m2049r + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// based on https://code.tutsplus.com/tutorials/creating-compound-views-on-android--cms-22889 + +package com.m2049r.xmrwallet.layout; + +import android.content.Context; +import android.util.AttributeSet; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import com.m2049r.xmrwallet.R; + +public class Toolbar extends android.support.v7.widget.Toolbar { + static final String TAG = "Toolbar"; + + public interface OnButtonListener { + void onButton(int type); + } + + OnButtonListener onButtonListener; + + public void setOnButtonListener(OnButtonListener listener) { + onButtonListener = listener; + } + + ImageView toolbarImage; + TextView toolbarTitle; + TextView toolbarSubtitle; + Button bDonate; + + public Toolbar(Context context) { + super(context); + initializeViews(context); + } + + public Toolbar(Context context, AttributeSet attrs) { + super(context, attrs); + initializeViews(context); + } + + public Toolbar(Context context, + AttributeSet attrs, + int defStyle) { + super(context, attrs, defStyle); + initializeViews(context); + } + + /** + * Inflates the views in the layout. + * + * @param context the current context for the view. + */ + private void initializeViews(Context context) { + LayoutInflater inflater = (LayoutInflater) context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + inflater.inflate(R.layout.view_toolbar, this); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + toolbarImage = (ImageView) findViewById(R.id.toolbarImage); + toolbarTitle = (TextView) findViewById(R.id.toolbarTitle); + toolbarSubtitle = (TextView) findViewById(R.id.toolbarSubtitle); + bDonate = (Button) findViewById(R.id.bDonate); + bDonate.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + if (onButtonListener != null) { + onButtonListener.onButton(buttonType); + } + } + }); + } + + public void setTitle(String title, String subtitle) { + setTitle(title); + setSubtitle(subtitle); + } + + public void setTitle(String title) { + toolbarTitle.setText(title); + if (title != null) { + toolbarImage.setVisibility(View.INVISIBLE); + toolbarTitle.setVisibility(View.VISIBLE); + } else { + toolbarImage.setVisibility(View.VISIBLE); + toolbarTitle.setVisibility(View.INVISIBLE); + } + } + + public final static int BUTTON_NONE = 0; + public final static int BUTTON_BACK = 1; + public final static int BUTTON_CLOSE = 2; + public final static int BUTTON_DONATE = 3; + + int buttonType = BUTTON_DONATE; + + public void setButton(int type) { + switch (type) { + case BUTTON_BACK: + Log.d(TAG, "BUTTON_BACK"); + bDonate.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_arrow_back_white_24dp, 0, 0, 0); + bDonate.setText(null); + bDonate.setVisibility(View.VISIBLE); + break; + case BUTTON_CLOSE: + Log.d(TAG, "BUTTON_CLOSE"); + bDonate.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_close_white_24dp, 0, 0, 0); + bDonate.setText(R.string.label_close); + bDonate.setVisibility(View.VISIBLE); + break; + case BUTTON_DONATE: + Log.d(TAG, "BUTTON_DONATE"); + bDonate.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_favorite_white_24dp, 0, 0, 0); + bDonate.setText(R.string.label_donate); + bDonate.setVisibility(View.VISIBLE); + break; + case BUTTON_NONE: + default: + Log.d(TAG, "BUTTON_NONE"); + bDonate.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); + bDonate.setText(null); + bDonate.setVisibility(View.INVISIBLE); + } + buttonType = type; + } + + public void setSubtitle(String subtitle) { + toolbarSubtitle.setText(subtitle); + if (subtitle != null) { + toolbarSubtitle.setVisibility(View.VISIBLE); + } else { + toolbarSubtitle.setVisibility(View.INVISIBLE); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java index 7e833005..3ea8ea6b 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java +++ b/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java @@ -17,7 +17,6 @@ package com.m2049r.xmrwallet.layout; import android.content.Context; -import android.graphics.Color; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.util.Log; @@ -28,13 +27,12 @@ import android.widget.TextView; import com.m2049r.xmrwallet.R; import com.m2049r.xmrwallet.model.TransactionInfo; -import com.m2049r.xmrwallet.model.Wallet; +import com.m2049r.xmrwallet.util.Helper; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; -import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.TimeZone; @@ -69,7 +67,7 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo outboundColour = ContextCompat.getColor(context, R.color.tx_red); pendingColour = ContextCompat.getColor(context, R.color.tx_pending); failedColour = ContextCompat.getColor(context, R.color.tx_failed); - this.infoItems = new ArrayList<>(); + infoItems = new ArrayList<>(); this.listener = listener; Calendar cal = Calendar.getInstance(); TimeZone tz = cal.getTimeZone(); //get the local time zone. @@ -79,7 +77,7 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.transaction_item, parent, false); + .inflate(R.layout.item_transaction, parent, false); return new ViewHolder(view); } @@ -99,22 +97,8 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo this.infoItems.clear(); if (data != null) { Log.d(TAG, "setInfos " + data.size()); - // sort by block height - Collections.sort(data, new Comparator<TransactionInfo>() { - @Override - public int compare(TransactionInfo o1, TransactionInfo o2) { - long b1 = o1.timestamp; - long b2 = o2.timestamp; - if (b1 > b2) { - return -1; - } else if (b1 < b2) { - return 1; - } else { - return o1.hash.compareTo(o2.hash); - } - } - }); - this.infoItems.addAll(data); + infoItems.addAll(data); + Collections.sort(infoItems); } else { Log.d(TAG, "setInfos null"); } @@ -147,36 +131,41 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo void bind(int position) { this.infoItem = infoItems.get(position); - String displayAmount = Wallet.getDisplayAmount(infoItem.amount); - // TODO fix this with i8n code but cryptonote::print_money always uses '.' for decimal point - String amount = displayAmount.substring(0, displayAmount.length() - (12 - 5)); - this.tvAmount.setText(amount); + + long realAmount = infoItem.amount; + if (infoItem.isPending) { + realAmount = realAmount - infoItem.fee; + } + + String displayAmount = Helper.getDisplayAmount(realAmount, Helper.DISPLAY_DIGITS_INFO); + if (infoItem.direction == TransactionInfo.Direction.Direction_Out) { + this.tvAmount.setText(context.getString(R.string.tx_list_amount_negative, displayAmount)); + } else { + this.tvAmount.setText(context.getString(R.string.tx_list_amount_positive, displayAmount)); + } if ((infoItem.fee > 0)) { - String feeAmount = Wallet.getDisplayAmount(infoItem.fee); - String fee = feeAmount.substring(0, feeAmount.length() - (12 - 5)); - if (infoItem.isPending) { - this.tvFee.setText(context.getString(R.string.tx_list_fee_pending, fee)); - } else { - this.tvFee.setText(context.getString(R.string.tx_list_fee, fee)); - } + String fee = Helper.getDisplayAmount(infoItem.fee, 5); + this.tvFee.setText(context.getString(R.string.tx_list_fee, fee)); } else { this.tvFee.setText(""); } if (infoItem.isFailed) { - this.tvAmount.setText(context.getString(R.string.tx_list_amount_failed, amount)); + this.tvAmount.setText(context.getString(R.string.tx_list_amount_failed, displayAmount)); + this.tvFee.setText(context.getString(R.string.tx_list_failed_text)); setTxColour(failedColour); } else if (infoItem.isPending) { setTxColour(pendingColour); - if (infoItem.direction == TransactionInfo.Direction.Direction_Out) { - this.tvAmount.setText(context.getString(R.string.tx_list_amount_negative, amount)); - } } else if (infoItem.direction == TransactionInfo.Direction.Direction_In) { setTxColour(inboundColour); } else { setTxColour(outboundColour); } - this.tvPaymentId.setText(infoItem.paymentId.equals("0000000000000000") ? "" : infoItem.paymentId); + if ((infoItem.notes == null) || (infoItem.notes.isEmpty())) { + this.tvPaymentId.setText(infoItem.paymentId.equals("0000000000000000") ? "" : infoItem.paymentId); + } else { + this.tvPaymentId.setText(infoItem.notes); + } this.tvDateTime.setText(getDateTime(infoItem.timestamp)); itemView.setOnClickListener(this); diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/WalletInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/layout/WalletInfoAdapter.java new file mode 100644 index 00000000..1ac2c932 --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/layout/WalletInfoAdapter.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2017 m2049r + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.m2049r.xmrwallet.layout; + +import android.content.Context; +import android.support.v7.widget.PopupMenu; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.TextView; + +import com.m2049r.xmrwallet.R; +import com.m2049r.xmrwallet.model.WalletManager; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +public class WalletInfoAdapter extends RecyclerView.Adapter<WalletInfoAdapter.ViewHolder> { + private static final String TAG = "WalletInfoAdapter"; + + private final SimpleDateFormat DATETIME_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + + public interface OnInteractionListener { + void onInteraction(View view, WalletManager.WalletInfo item); + + boolean onContextInteraction(MenuItem item, WalletManager.WalletInfo infoItem); + } + + private final List<WalletManager.WalletInfo> infoItems; + private final OnInteractionListener listener; + + Context context; + + public WalletInfoAdapter(Context context, OnInteractionListener listener) { + this.context = context; + this.infoItems = new ArrayList<>(); + this.listener = listener; + Calendar cal = Calendar.getInstance(); + TimeZone tz = cal.getTimeZone(); //get the local time zone. + DATETIME_FORMATTER.setTimeZone(tz); + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item_wallet, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(final ViewHolder holder, int position) { + holder.bind(position); + } + + @Override + public int getItemCount() { + return infoItems.size(); + } + + public WalletManager.WalletInfo getItem(int position) { + return infoItems.get(position); + } + + public void setInfos(List<WalletManager.WalletInfo> data) { + // TODO do stuff with data so we can really recycle elements (i.e. add only new tx) + // as the WalletInfo items are always recreated, we cannot recycle + infoItems.clear(); + if (data != null) { + Log.d(TAG, "setInfos " + data.size()); + infoItems.addAll(data); + Collections.sort(infoItems); + } else { + Log.d(TAG, "setInfos null"); + } + notifyDataSetChanged(); + } + + class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + final TextView tvName; + final TextView tvAddress; + final ImageButton ibOptions; + WalletManager.WalletInfo infoItem; + + ViewHolder(View itemView) { + super(itemView); + tvName = (TextView) itemView.findViewById(R.id.tvName); + tvAddress = (TextView) itemView.findViewById(R.id.tvAddress); + ibOptions = (ImageButton) itemView.findViewById(R.id.ibOptions); + ibOptions.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + //creating a popup menu + PopupMenu popup = new PopupMenu(context, ibOptions); + //inflating menu from xml resource + popup.inflate(R.menu.list_context_menu); + //adding click listener + popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + if (listener != null) { + return listener.onContextInteraction(item, infoItem); + } + return false; + } + }); + //displaying the popup + popup.show(); + + } + }); + itemView.setOnClickListener(this); + } + + private String getDateTime(long time) { + return DATETIME_FORMATTER.format(new Date(time * 1000)); + } + + void bind(int position) { + infoItem = infoItems.get(position); + tvName.setText(infoItem.name); + tvAddress.setText(infoItem.address.substring(0, 16) + "..."); + } + + @Override + public void onClick(View view) { + if (listener != null) { + int position = getAdapterPosition(); // gets item position + if (position != RecyclerView.NO_POSITION) { // Check if an item was deleted, but the user clicked it before the UI removed it + listener.onInteraction(view, infoItems.get(position)); + } + } + } + } +} diff --git a/app/src/main/java/com/m2049r/xmrwallet/model/TransactionHistory.java b/app/src/main/java/com/m2049r/xmrwallet/model/TransactionHistory.java index e6c55f4a..efee88a5 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/model/TransactionHistory.java +++ b/app/src/main/java/com/m2049r/xmrwallet/model/TransactionHistory.java @@ -30,6 +30,12 @@ public class TransactionHistory { this.handle = handle; } + public void loadNotes(Wallet wallet) { + for (TransactionInfo info : transactions) { + info.notes = wallet.getUserNote(info.hash); + } + } + public native int getCount(); //private native long getTransactionByIndexJ(int i); @@ -42,6 +48,11 @@ public class TransactionHistory { private List<TransactionInfo> transactions = new ArrayList<>(); + public void refreshWithNotes(Wallet wallet) { + refresh(); + loadNotes(wallet); + } + public void refresh() { transactions = refreshJ(); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/model/TransactionInfo.java b/app/src/main/java/com/m2049r/xmrwallet/model/TransactionInfo.java index 141b09fa..40a0b7dc 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/model/TransactionInfo.java +++ b/app/src/main/java/com/m2049r/xmrwallet/model/TransactionInfo.java @@ -25,7 +25,7 @@ import java.util.Random; // this is not the TransactionInfo from the API as that is owned by the TransactionHistory // this is a POJO for the TransactionInfoAdapter -public class TransactionInfo implements Parcelable { +public class TransactionInfo implements Parcelable, Comparable<TransactionInfo> { static final String TAG = "TransactionInfo"; public enum Direction { @@ -92,7 +92,6 @@ public class TransactionInfo implements Parcelable { this.confirmations = confirmations; this.transfers = transfers; } - Random rnd = new Random(); public String toString() { return direction + "@" + blockheight + " " + amount; @@ -146,4 +145,17 @@ public class TransactionInfo implements Parcelable { return 0; } + @Override + public int compareTo(TransactionInfo another) { + long b1 = this.timestamp; + long b2 = another.timestamp; + if (b1 > b2) { + return -1; + } else if (b1 < b2) { + return 1; + } else { + return this.hash.compareTo(another.hash); + } + } + } diff --git a/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java b/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java index 479922ca..7c506735 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java +++ b/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java @@ -144,10 +144,20 @@ public class WalletManager { //public native List<String> findWallets(String path); // this does not work - some error in boost - public class WalletInfo { + public class WalletInfo implements Comparable<WalletInfo> { public File path; public String name; public String address; + + @Override + public int compareTo(WalletInfo another) { + int n = name.toLowerCase().compareTo(another.name.toLowerCase()); + if (n != 0) { + return n; + } else { // wallet names are the same + return address.compareTo(another.address); + } + } } public WalletInfo getWalletInfo(File wallet) { diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java b/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java index 791ad7eb..5d48b603 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java @@ -147,7 +147,7 @@ public class WalletService extends Service { if (updated) { if (observer != null) { updateDaemonState(wallet, 0); - wallet.getHistory().refresh(); + wallet.getHistory().refreshWithNotes(wallet); if (observer != null) { updated = !observer.onRefreshed(wallet, true); } @@ -297,7 +297,7 @@ public class WalletService extends Service { boolean rc = myWallet.store(); Log.d(TAG, "wallet stored: " + myWallet.getName() + " with rc=" + rc); if (!rc) { - Log.d(TAG, "Wallet store failed: " + myWallet.getErrorString()); + Log.w(TAG, "Wallet store failed: " + myWallet.getErrorString()); } if (observer != null) observer.onWalletStored(rc); } else if (cmd.equals(REQUEST_CMD_TX)) { @@ -309,7 +309,7 @@ public class WalletService extends Service { PendingTransaction.Status status = pendingTransaction.getStatus(); Log.d(TAG, "transaction status " + status); if (status != PendingTransaction.Status.Status_Ok) { - Log.d(TAG, "Create Transaction failed: " + pendingTransaction.getErrorString()); + Log.w(TAG, "Create Transaction failed: " + pendingTransaction.getErrorString()); } if (observer != null) { observer.onCreatedTransaction(pendingTransaction); @@ -323,7 +323,7 @@ public class WalletService extends Service { PendingTransaction.Status status = pendingTransaction.getStatus(); Log.d(TAG, "transaction status " + status); if (status != PendingTransaction.Status.Status_Ok) { - Log.d(TAG, "Create Transaction failed: " + pendingTransaction.getErrorString()); + Log.w(TAG, "Create Transaction failed: " + pendingTransaction.getErrorString()); } if (observer != null) { observer.onCreatedTransaction(pendingTransaction); @@ -352,7 +352,7 @@ public class WalletService extends Service { boolean rc = myWallet.store(); Log.d(TAG, "wallet stored: " + myWallet.getName() + " with rc=" + rc); if (!rc) { - Log.d(TAG, "Wallet store failed: " + myWallet.getErrorString()); + Log.w(TAG, "Wallet store failed: " + myWallet.getErrorString()); } if (observer != null) observer.onWalletStored(rc); listener.updated = true; @@ -372,7 +372,7 @@ public class WalletService extends Service { boolean rc = myWallet.store(); Log.d(TAG, "wallet stored: " + myWallet.getName() + " with rc=" + rc); if (!rc) { - Log.d(TAG, "Wallet store failed: " + myWallet.getErrorString()); + Log.w(TAG, "Wallet store failed: " + myWallet.getErrorString()); } if (observer != null) observer.onWalletStored(rc); } @@ -505,17 +505,12 @@ public class WalletService extends Service { } private Wallet loadWallet(String walletName, String walletPassword) { - //String path = Helper.getWalletPath(getApplicationContext(), walletName); - //Log.d(TAG, "open wallet " + path); Wallet wallet = openWallet(walletName, walletPassword); - //Log.d(TAG, "wallet opened: " + wallet); if (wallet != null) { - //Log.d(TAG, wallet.getStatus().toString()); Log.d(TAG, "Using daemon " + WalletManager.getInstance().getDaemonAddress()); showProgress(55); wallet.init(0); showProgress(90); - //Log.d(TAG, wallet.getConnectionStatus().toString()); } return wallet; } diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java index 782ea3e2..59924ab0 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java @@ -19,6 +19,8 @@ package com.m2049r.xmrwallet.util; import android.Manifest; import android.app.Activity; import android.app.Dialog; +import android.content.ClipData; +import android.content.ClipboardManager; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.Bitmap; @@ -40,7 +42,9 @@ import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; +import java.net.SocketTimeoutException; import java.net.URL; +import java.util.Locale; import javax.net.ssl.HttpsURLConnection; @@ -48,6 +52,9 @@ public class Helper { static private final String TAG = "Helper"; static private final String WALLET_DIR = "monerujo"; + static public int DISPLAY_DIGITS_INFO = 5; + static public int DISPLAY_DIGITS_SHORT = 5; + static public File getStorageRoot(Context context) { if (!isExternalStorageWritable()) { String msg = context.getString(R.string.message_strorage_not_writable); @@ -73,7 +80,7 @@ public class Helper { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { if (context.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { - Log.d(TAG, "Permission denied to WRITE_EXTERNAL_STORAGE - requesting it"); + Log.w(TAG, "Permission denied to WRITE_EXTERNAL_STORAGE - requesting it"); String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE}; context.requestPermissions(permissions, PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); return false; @@ -91,7 +98,7 @@ public class Helper { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { if (context.checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_DENIED) { - Log.d(TAG, "Permission denied for CAMERA - requesting it"); + Log.w(TAG, "Permission denied for CAMERA - requesting it"); String[] permissions = {Manifest.permission.CAMERA}; context.requestPermissions(permissions, PERMISSIONS_REQUEST_CAMERA); return false; @@ -103,13 +110,8 @@ public class Helper { } } -// static public String getWalletPath(Context context, String aWalletName) { -// return getWalletFile(context, aWalletName).getAbsolutePath(); -// } - static public File getWalletFile(Context context, String aWalletName) { File walletDir = getStorageRoot(context); - //d(TAG, "walletdir=" + walletDir.getAbsolutePath()); File f = new File(walletDir, aWalletName); Log.d(TAG, "wallet = " + f.getAbsolutePath() + " size=" + f.length()); return f; @@ -127,6 +129,7 @@ public class Helper { } static public void hideKeyboard(Activity act) { + if (act == null) return; if (act.getCurrentFocus() == null) { act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); } else { @@ -145,19 +148,38 @@ public class Helper { } static public String getDisplayAmount(long amount) { - String s = Wallet.getDisplayAmount(amount); + return getDisplayAmount(amount, 20); + } + + static public String getDisplayAmount(long amount, int maxDecimals) { + return getDisplayAmount(Wallet.getDisplayAmount(amount), maxDecimals); + } + + // amountString must have '.' as decimal point + static public String getDisplayAmount(String amountString, int maxDecimals) { int lastZero = 0; int decimal = 0; - for (int i = s.length() - 1; i >= 0; i--) { - if ((lastZero == 0) && (s.charAt(i) != '0')) lastZero = i + 1; + for (int i = amountString.length() - 1; i >= 0; i--) { + if ((lastZero == 0) && (amountString.charAt(i) != '0')) lastZero = i + 1; // TODO i18n - if (s.charAt(i) == '.') { - decimal = i; + if (amountString.charAt(i) == '.') { + decimal = i + 1; break; } } - int cutoff = Math.max(lastZero, decimal + 2); - return s.substring(0, cutoff); + int cutoff = Math.min(Math.max(lastZero, decimal + 2), decimal + maxDecimals); + return amountString.substring(0, cutoff); + } + + static public String getFormattedAmount(double amount, boolean isXmr) { + // at this point selection is XMR in case of error + String displayB; + if (isXmr) { // not XMR + displayB = String.format(Locale.US, "%,.5f", amount); + } else { // XMR + displayB = String.format(Locale.US, "%,.2f", amount); + } + return displayB; } static public Bitmap getBitmap(Context context, int drawableId) { @@ -180,11 +202,15 @@ public class Helper { return bitmap; } + static final int HTTP_TIMEOUT = 5000; + static public String getUrl(String httpsUrl) { HttpsURLConnection urlConnection = null; try { URL url = new URL(httpsUrl); urlConnection = (HttpsURLConnection) url.openConnection(); + urlConnection.setConnectTimeout(HTTP_TIMEOUT); + urlConnection.setReadTimeout(HTTP_TIMEOUT); InputStreamReader in = new InputStreamReader(urlConnection.getInputStream()); StringBuffer sb = new StringBuffer(); final int BUFFER_SIZE = 512; @@ -195,6 +221,8 @@ public class Helper { length = in.read(buffer, 0, BUFFER_SIZE); } return sb.toString(); + } catch (SocketTimeoutException ex) { + Log.w(TAG, "C " + ex.getLocalizedMessage()); } catch (MalformedURLException ex) { Log.e(TAG, "A " + ex.getLocalizedMessage()); } catch (IOException ex) { @@ -206,4 +234,10 @@ public class Helper { } return null; } + + static public void clipBoardCopy(Context context, String label, String text) { + ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText(label, text); + clipboardManager.setPrimaryClip(clip); + } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/NodeList.java b/app/src/main/java/com/m2049r/xmrwallet/util/NodeList.java index f036a6aa..6989bf95 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/NodeList.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/NodeList.java @@ -16,8 +16,6 @@ package com.m2049r.xmrwallet.util; -import android.util.Log; - import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/app/src/main/res/anim/fab_close.xml b/app/src/main/res/anim/fab_close.xml new file mode 100644 index 00000000..9dd7e780 --- /dev/null +++ b/app/src/main/res/anim/fab_close.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:fillAfter="true"> + <scale + android:duration="300" + android:fromXScale="1.0" + android:fromYScale="1.0" + android:interpolator="@android:anim/linear_interpolator" + android:pivotX="50%" + android:pivotY="50%" + android:toXScale="0.0" + android:toYScale="0.0" /> + <alpha + android:duration="300" + android:fromAlpha="1.0" + android:interpolator="@android:anim/accelerate_interpolator" + android:toAlpha="0.0" /> +</set> \ No newline at end of file diff --git a/app/src/main/res/anim/fab_close_screen.xml b/app/src/main/res/anim/fab_close_screen.xml new file mode 100644 index 00000000..ec4ee1ac --- /dev/null +++ b/app/src/main/res/anim/fab_close_screen.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:fillAfter="false"> + <alpha + android:duration="300" + android:fromAlpha="1.0" + android:interpolator="@android:anim/accelerate_interpolator" + android:toAlpha="0.0" /> +</set> \ No newline at end of file diff --git a/app/src/main/res/anim/fab_open.xml b/app/src/main/res/anim/fab_open.xml new file mode 100644 index 00000000..5ac74ac0 --- /dev/null +++ b/app/src/main/res/anim/fab_open.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:fillAfter="true"> + <scale + android:duration="300" + android:fromXScale="0.0" + android:fromYScale="0.0" + android:interpolator="@android:anim/linear_interpolator" + android:pivotX="50%" + android:pivotY="50%" + android:toXScale="1.0" + android:toYScale="1.0" /> + <alpha + android:duration="300" + android:fromAlpha="0.0" + android:interpolator="@android:anim/accelerate_interpolator" + android:toAlpha="1.0" /> +</set> \ No newline at end of file diff --git a/app/src/main/res/anim/fab_open_screen.xml b/app/src/main/res/anim/fab_open_screen.xml new file mode 100644 index 00000000..ceb2831a --- /dev/null +++ b/app/src/main/res/anim/fab_open_screen.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:fillAfter="true"> + <alpha + android:duration="300" + android:fromAlpha="0.0" + android:interpolator="@android:anim/accelerate_interpolator" + android:toAlpha="1.0" /> +</set> \ No newline at end of file diff --git a/app/src/main/res/anim/rotate_backward.xml b/app/src/main/res/anim/rotate_backward.xml new file mode 100644 index 00000000..fed9d931 --- /dev/null +++ b/app/src/main/res/anim/rotate_backward.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:fillAfter="true"> + <rotate + android:duration="300" + android:fromDegrees="315" + android:interpolator="@android:anim/linear_interpolator" + android:pivotX="50%" + android:pivotY="50%" + android:toDegrees="0" /> +</set> \ No newline at end of file diff --git a/app/src/main/res/anim/rotate_forward.xml b/app/src/main/res/anim/rotate_forward.xml new file mode 100644 index 00000000..47877dd4 --- /dev/null +++ b/app/src/main/res/anim/rotate_forward.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:fillAfter="true"> + <rotate + android:duration="300" + android:fromDegrees="0" + android:interpolator="@android:anim/linear_interpolator" + android:pivotX="50%" + android:pivotY="50%" + android:toDegrees="315" /> +</set> \ No newline at end of file diff --git a/app/src/main/res/color/text_color.xml b/app/src/main/res/color/text_color.xml index bdb0a30f..97f46e94 100644 --- a/app/src/main/res/color/text_color.xml +++ b/app/src/main/res/color/text_color.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:color="@color/moneroGray" android:state_enabled="false" /> + <item android:color="@color/moneroText" android:state_enabled="false" /> <item android:color="@color/moneroWhite" /> </selector> \ No newline at end of file diff --git a/app/src/main/res/drawable/backgound_all.xml b/app/src/main/res/drawable/backgound_all.xml new file mode 100644 index 00000000..7e94c2e7 --- /dev/null +++ b/app/src/main/res/drawable/backgound_all.xml @@ -0,0 +1,352 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="1080dp" + android:height="1920dp" + android:viewportWidth="1080" + android:viewportHeight="1920"> + + <group> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 134.4 -393.2 L 215.2 -363 L 231.2 -273.1 L 109.9 -318.4 L 134.4 -393.2 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 457.7 -272.4 L 538.5 -242.2 L 408.8 -122.7 L 424.8 -32.7 L 263.1 -93.1 L 457.7 -272.4 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 1023.6 -61 L 1266.1 29.6 L 1071.5 208.9 L 1023.6 -61 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 1266.1 29.6 L 1589.5 150.4 L 1524.6 210.1 L 1363 149.7 L 1233.2 269.3 L 1071.5 208.9 L 1266.1 29.6 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 215.2 -363 L 457.7 -272.4 L 263.1 -93.1 L 215.2 -363 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 1363 149.7 L 1524.6 210.1 L 1394.9 329.6 L 1363 149.7 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 109.9 -318.4 L 231.2 -273.1 L 263.1 -93.1 L 424.8 -32.7 L 440.7 57.3 L 36.5 -93.7 L 109.9 -318.4 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 36.5 -93.7 L 440.7 57.3 L 456.7 147.2 L 52.5 -3.8 L -12.4 56 L 36.5 -93.7 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 619.5 -212 L 1023.6 -61 L 1071.5 208.9 L 1233.2 269.3 L 1281.1 539.2 L 634.4 297.6 L 602.4 117.7 L 683.3 147.9 L 619.5 -212 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 1589.5 150.4 L 1670.4 180.5 L 1572.5 480 L 1377.9 659.3 L 1362 569.4 L 1297 629.1 L 1233.2 269.3 L 1363 149.7 L 1394.9 329.6 L 1589.5 150.4 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 52.5 -3.8 L 456.7 147.2 L 472.7 237.2 L 278.1 416.5 L 230.1 146.6 L 100.4 266.1 L 52.5 -3.8 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 1474.7 779.4 L 1232.2 688.9 L 1167.3 748.7 L 1183.3 838.6 L 1021.6 778.1 L 891.8 897.7 L 568.5 777 L 503.6 836.8 L 180.2 716 L 634.4 297.6 L 1281.1 539.2 L 1297 629.1 L 1362 569.4 L 1377.9 659.3 L 1572.5 480 L 1474.7 779.4 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 1232.2 688.9 L 1474.7 779.4 L 1345 898.9 L 1264.2 868.8 L 1232.2 688.9 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 538.5 -242.2 L 619.5 -212 L 683.3 147.9 L 602.4 117.7 L 634.4 297.6 L 180.2 716 L 341.9 776.4 L 357.9 866.3 L 163.3 1045.6 L 51.5 415.8 L -78.3 535.4 L 2.6 565.6 L -127.2 685.1 L -208 654.9 L -12.4 56 L 52.5 -3.8 L 100.4 266.1 L 230.1 146.6 L 278.1 416.5 L 472.7 237.2 L 408.8 -122.7 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 1232.2 688.9 L 1264.2 868.8 L 1199.2 928.5 L 1167.3 748.7 L 1232.2 688.9 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 1264.2 868.8 L 1345 898.9 L 1360.9 988.9 L 1199.2 928.5 L 1264.2 868.8 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 1474.7 779.4 L 1376.9 1078.9 L 1345 898.9 L 1474.7 779.4 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 51.5 415.8 L 115.3 775.7 L -127.2 685.1 L 2.6 565.6 L -78.3 535.4 L 51.5 415.8 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 341.9 776.4 L 503.6 836.8 L 438.7 896.5 L 357.9 866.3 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 811 867.6 L 891.8 897.7 L 923.7 1077.6 L 842.9 1047.5 L 811 867.6 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M -208 654.9 L 115.3 775.7 L 147.3 955.6 L -176.1 834.8 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 357.9 866.3 L 438.7 896.5 L 373.8 956.3 L 405.8 1136.2 L 421.7 1226.1 L -225 984.6 L -354.7 1104.1 L -305.8 954.4 L -176.1 834.8 L 147.3 955.6 L 163.3 1045.6 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 811 867.5 L 842.9 1047.4 L 778.1 1107.3 L 746.2 927.4 L 811 867.5 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 842.9 1047.5 L 923.7 1077.6 L 939.7 1167.6 L 778.1 1107.3 L 842.9 1047.5 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 568.5 777 L 811 867.6 L 746.1 927.4 L 778.1 1107.3 L 939.7 1167.6 L 874.8 1227.3 L 632.4 1136.8 L 568.5 777 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 405.8 1136.2 L 421.7 1226.2 L 421.7 1226.1 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 1021.6 778.1 L 1183.3 838.6 L 1199.2 928.5 L 1360.9 988.9 L 1376.9 1078.9 L 1254.6 1453.2 L 1214.2 1438.1 L 1134.4 988.4 L 1069.5 1048.1 L 1021.6 778.1 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M -208 654.9 L -176.1 834.8 L -305.8 954.4 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 476.8 1536.3 L 485.6 1586 L 485.6 1586 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 485.7 1586 L 728.1 1676.6 L 533.5 1855.9 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 728.1 1676.6 L 889.8 1737 L 760 1856.5 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 729.2 1256.9 L 745.1 1346.9 L 664.3 1316.7 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 1069.5 1048.1 L 1134.4 988.3 L 1214.2 1438.1 L 1149.2 1497.9 L 745.1 1346.9 L 810 1287.1 L 874.8 1227.3 L 939.7 1167.6 L 923.7 1077.6 L 891.8 897.7 L 1021.6 778.1 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 729.2 1257 L 810 1287.2 L 745.1 1346.9 L 729.2 1257 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M -144.2 1014.8 L 421.7 1226.1 L 437.6 1316.1 L 518.6 1346.3 L 453.6 1406.1 L 469.6 1496 L 65.4 1345 L 49.4 1255 L -15.4 1314.9 L -96.3 1284.7 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 568.5 777 L 632.4 1136.8 L 437.7 1316.1 L 421.7 1226.2 L 421.7 1226.1 L 405.8 1136.2 L 373.8 956.3 L 438.7 896.5 L 503.6 836.8 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 874.8 1227.3 L 810 1287.1 L 729.2 1256.9 L 664.3 1316.7 L 583.5 1286.6 L 518.6 1346.3 L 437.6 1316.1 L 632.3 1136.7 L 874.8 1227.3 " /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M -225 984.6 L -144.2 1014.8 L -96.2 1284.7 L -355.7 1523.8 L -194.1 1584.2 L -178.1 1674.1 L -420.6 1583.5 L -452.6 1403.6 L -354.7 1104.1 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M -145.2 1434.4 L -129.2 1524.3 L 65.4 1345 L 469.6 1496 L 476.8 1536.3 L 485.6 1586 L 243.1 1495.4 L 113.3 1614.9 L 48.4 1674.7 L -355.8 1523.8 L -96.3 1284.7 L -15.5 1314.8 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 1132.3 1827.6 L 1083.4 1977.3 L 888.8 2156.6 L 872.9 2066.6 L 937.7 2006.9 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M -15.5 1314.8 L -15.4 1314.9 L -145.1 1434.4 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 49.4 1255.1 L 65.4 1345.1 L -129.2 1524.4 L -145.1 1434.4 L -15.5 1314.8 L -15.4 1314.9 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 1214.2 1438.1 L 1254.6 1453.2 L 1230.1 1528.1 L 1149.2 1497.9 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M -452.6 1403.6 L -420.6 1583.5 L -501.5 1553.3 L -452.6 1403.6 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M -194.1 1584.2 L 48.4 1674.7 L -16.4 1734.5 L 47.5 2094.3 L -195.1 2003.7 L -243 1733.9 L -307.9 1793.6 L -509.9 1718.1 L -525.9 1628.2 L -501.5 1553.3 L -178.1 1674.1 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 306.9 1855.2 L 436.7 1735.7 L 468.6 1915.6 L 274 2094.9 L 258 2004.9 L 128.3 2124.5 L 47.4 2094.3 L -16.4 1734.5 L 48.4 1674.7 L 113.3 1614.9 L 243.1 1495.4 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 243.1 1495.4 L 485.6 1586 L 533.5 1855.9 L 695.2 1916.3 L 630.3 1976 L 468.6 1915.6 L 436.7 1735.7 L 306.9 1855.2 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 695.2 1916.3 L 937.7 2006.9 L 872.9 2066.6 L 888.8 2156.6 L 1010.1 2201.9 L 936.7 2426.5 L 775 2366.1 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 1083.5 1977.3 L 1010.1 2201.9 L 888.8 2156.6 L 1083.5 1977.3 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M -243 1733.9 L -195.1 2003.7 L -437.6 1913.2 L -243 1733.9 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 468.6 1915.6 L 630.3 1976 L 435.7 2155.3 L 370.8 2215.1 L 128.3 2124.5 L 258 2004.9 L 274 2094.9 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M -509.9 1718.1 L -307.9 1793.6 L -437.6 1913.2 L -599.3 1852.8 L -574.8 1777.8 L -509.9 1718.1 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M -525.9 1628.2 L -509.9 1718.1 L -574.8 1777.8 L -525.9 1628.2 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 695.2 1916.3 L 775 2366.1 L 370.8 2215.1 L 435.7 2155.3 L 630.3 1976 Z" /> + <path + android:fillColor="#F0F0F0" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 583.5 1286.6 L 1230.2 1528.1 L 1181.3 1677.8 L 615.4 1466.5 Z" /> + <path + android:fillColor="#FFFFFF" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 583.5 1286.6 L 615.4 1466.5 L 485.7 1586 L 453.7 1406.1 Z" /> + <path + android:fillColor="#F6F5F5" + android:fillAlpha="0.62" + android:strokeAlpha="0.62" + android:strokeWidth="1" + android:pathData="M 615.4 1466.5 L 1181.3 1677.8 L 1132.3 1827.6 L 937.7 2006.9 L 533.5 1855.9 L 728.1 1676.6 L 760 1856.5 L 889.8 1737 L 485.7 1586 Z" /> + </group> +</vector> \ No newline at end of file diff --git a/app/src/main/res/drawable/backgound_amount.xml b/app/src/main/res/drawable/backgound_amount.xml new file mode 100644 index 00000000..8fe9ec70 --- /dev/null +++ b/app/src/main/res/drawable/backgound_amount.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <solid android:color="@color/white" /> + <padding + android:bottom="8dp" + android:left="8dp" + android:right="8dp" + android:top="8dp" /> +</shape> diff --git a/app/src/main/res/drawable/backgound_scan.xml b/app/src/main/res/drawable/backgound_scan.xml new file mode 100644 index 00000000..255a292d --- /dev/null +++ b/app/src/main/res/drawable/backgound_scan.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <padding + android:bottom="8dp" + android:left="8dp" + android:right="8dp" + android:top="8dp" /> + <corners android:radius="3dp" /> + <stroke + android:width="2dp" + android:color="@color/gradientOrange" + android:dashGap="16dp" + android:dashWidth="16dp" /> +</shape> diff --git a/app/src/main/res/drawable/backgound_seed.xml b/app/src/main/res/drawable/backgound_seed.xml new file mode 100644 index 00000000..bb134fc4 --- /dev/null +++ b/app/src/main/res/drawable/backgound_seed.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <solid android:color="@color/white" /> + <padding + android:bottom="8dp" + android:left="8dp" + android:right="8dp" + android:top="8dp" /> + <stroke + android:width="2dp" + android:color="#FF979797" + android:dashGap="8dp" + android:dashWidth="8dp" /> +</shape> diff --git a/app/src/main/res/drawable/backgound_spinner.xml b/app/src/main/res/drawable/backgound_spinner.xml new file mode 100644 index 00000000..4e227118 --- /dev/null +++ b/app/src/main/res/drawable/backgound_spinner.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <padding + android:bottom="8dp" + android:left="8dp" + android:right="8dp" + android:top="8dp" /> + <stroke + android:width="2dp" + android:color="@color/gradientOrange" /> +</shape> diff --git a/app/src/main/res/drawable/backgound_toolbar_mainnet.xml b/app/src/main/res/drawable/backgound_toolbar_mainnet.xml new file mode 100644 index 00000000..5d19b551 --- /dev/null +++ b/app/src/main/res/drawable/backgound_toolbar_mainnet.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@drawable/gradient_all" /> + <item + android:height="?attr/actionBarSize" + android:drawable="@drawable/texture_cash" /> +</layer-list> \ No newline at end of file diff --git a/app/src/main/res/drawable/button_default.xml b/app/src/main/res/drawable/button_default.xml new file mode 100644 index 00000000..a337794a --- /dev/null +++ b/app/src/main/res/drawable/button_default.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <solid android:color="@color/gradientOrange" /> +</shape> \ No newline at end of file diff --git a/app/src/main/res/drawable/button_disabled.xml b/app/src/main/res/drawable/button_disabled.xml new file mode 100644 index 00000000..4186e72b --- /dev/null +++ b/app/src/main/res/drawable/button_disabled.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <solid android:color="@color/moneroGray" /> +</shape> \ No newline at end of file diff --git a/app/src/main/res/drawable/button_selector.xml b/app/src/main/res/drawable/button_selector.xml new file mode 100644 index 00000000..3363a24a --- /dev/null +++ b/app/src/main/res/drawable/button_selector.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@drawable/button_disabled" android:state_enabled="false" /> + <item android:drawable="@drawable/button_default" android:state_enabled="true" /> + <item android:drawable="@drawable/button_default" android:state_pressed="false" /> +</selector> \ No newline at end of file diff --git a/app/src/main/res/drawable/gradient_all.xml b/app/src/main/res/drawable/gradient_all.xml new file mode 100644 index 00000000..4675e861 --- /dev/null +++ b/app/src/main/res/drawable/gradient_all.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <gradient + android:angle="45" + android:endColor="@color/gradientOrange" + android:startColor="@color/gradientPink" + android:type="linear" /> +</shape> diff --git a/app/src/main/res/drawable/gradient_oval.xml b/app/src/main/res/drawable/gradient_oval.xml new file mode 100644 index 00000000..88749402 --- /dev/null +++ b/app/src/main/res/drawable/gradient_oval.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="oval"> + <gradient + android:angle="45" + android:endColor="@color/gradientOrange" + android:startColor="@color/gradientPink" + android:type="linear" /> +</shape> \ No newline at end of file diff --git a/app/src/main/res/drawable/gunther_wallets.xml b/app/src/main/res/drawable/gunther_wallets.xml new file mode 100644 index 00000000..9873abda --- /dev/null +++ b/app/src/main/res/drawable/gunther_wallets.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="utf-8"?> +<animation-list xmlns:android="http://schemas.android.com/apk/res/android" + android:oneshot="true"> + <item + android:drawable="@drawable/gunther_wallets_00" + android:duration="500" /> + <item + android:drawable="@drawable/gunther_wallets_01" + android:duration="200" /> + <item + android:drawable="@drawable/gunther_wallets_02" + android:duration="2000" /> + <item + android:drawable="@drawable/gunther_wallets_03" + android:duration="1000" /> + <item + android:drawable="@drawable/gunther_wallets_04" + android:duration="100" /> + <item + android:drawable="@drawable/gunther_wallets_05" + android:duration="1000" /> + <item + android:drawable="@drawable/gunther_wallets_06" + android:duration="0" /> + <item + android:drawable="@drawable/gunther_wallets_07" + android:duration="0" /> + <item + android:drawable="@drawable/gunther_wallets_08" + android:duration="0" /> + <item + android:drawable="@drawable/gunther_wallets_09" + android:duration="0" /> + <item + android:drawable="@drawable/gunther_wallets_10" + android:duration="0" /> + <item + android:drawable="@drawable/gunther_wallets_11" + android:duration="0" /> + <item + android:drawable="@drawable/gunther_wallets_12" + android:duration="0" /> + <item + android:drawable="@drawable/gunther_wallets_13" + android:duration="0" /> + <item + android:drawable="@drawable/gunther_wallets_14" + android:duration="0" /> + <item + android:drawable="@drawable/gunther_wallets_15" + android:duration="0" /> + <item + android:drawable="@drawable/gunther_wallets_16" + android:duration="0" /> + <item + android:drawable="@drawable/gunther_wallets_17" + android:duration="0" /> + <item + android:drawable="@drawable/gunther_wallets_18" + android:duration="5000" /> + <item + android:drawable="@drawable/gunther_wallets_19" + android:duration="0" /> + <item + android:drawable="@drawable/gunther_wallets_20" + android:duration="0" /> + <item + android:drawable="@drawable/gunther_wallets_21" + android:duration="100" /> + <item + android:drawable="@drawable/gunther_wallets_22" + android:duration="200" /> +</animation-list> \ No newline at end of file diff --git a/app/src/main/res/drawable/gunther_wallets_00.png b/app/src/main/res/drawable/gunther_wallets_00.png new file mode 100644 index 0000000000000000000000000000000000000000..acb5162478d558b06a0ffd580987884c28c77022 GIT binary patch literal 2424 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 F{{u*T=!*aV literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_01.png b/app/src/main/res/drawable/gunther_wallets_01.png new file mode 100644 index 0000000000000000000000000000000000000000..eaaabcdc6b2c2155527424f0e3726c099243f05c GIT binary patch literal 2438 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 Ggueg{3gs>U literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_02.png b/app/src/main/res/drawable/gunther_wallets_02.png new file mode 100644 index 0000000000000000000000000000000000000000..860705d62011ac2ad411b104d3e677c298f695bc GIT binary patch literal 2451 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_03.png b/app/src/main/res/drawable/gunther_wallets_03.png new file mode 100644 index 0000000000000000000000000000000000000000..eaaabcdc6b2c2155527424f0e3726c099243f05c GIT binary patch literal 2438 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 Ggueg{3gs>U literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_04.png b/app/src/main/res/drawable/gunther_wallets_04.png new file mode 100644 index 0000000000000000000000000000000000000000..530ef69738cbc64a1910873e179c89771836aa4d GIT binary patch literal 2451 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 UkpuTsW%D5dGh;NW!q6@LPg7v>0RR91 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_05.png b/app/src/main/res/drawable/gunther_wallets_05.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e69e1907f6209aaa034a2d73ce3d3ca065a251 GIT binary patch literal 2460 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_06.png b/app/src/main/res/drawable/gunther_wallets_06.png new file mode 100644 index 0000000000000000000000000000000000000000..a616646981c50c24b2a87c97d3b03f61dc3bc02a GIT binary patch literal 2463 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_07.png b/app/src/main/res/drawable/gunther_wallets_07.png new file mode 100644 index 0000000000000000000000000000000000000000..534d353a2588bfd8ade56dd3c2f16b755f21d4b0 GIT binary patch literal 2464 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_08.png b/app/src/main/res/drawable/gunther_wallets_08.png new file mode 100644 index 0000000000000000000000000000000000000000..7b11c8391ab556ceb1bb5cb4520676d8c5fa535d GIT binary patch literal 2472 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_09.png b/app/src/main/res/drawable/gunther_wallets_09.png new file mode 100644 index 0000000000000000000000000000000000000000..1d3ce00e43e9aa3fe1fe21b40dd5abefafc90f2b GIT binary patch literal 2469 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_10.png b/app/src/main/res/drawable/gunther_wallets_10.png new file mode 100644 index 0000000000000000000000000000000000000000..1f013994bb86251e5584b7ff45646ec9ec044735 GIT binary patch literal 2468 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_11.png b/app/src/main/res/drawable/gunther_wallets_11.png new file mode 100644 index 0000000000000000000000000000000000000000..7135fd03968e4a1350f7a96a6b213ce22a24d1ee GIT binary patch literal 2474 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_12.png b/app/src/main/res/drawable/gunther_wallets_12.png new file mode 100644 index 0000000000000000000000000000000000000000..92bb8ac1025f44216efd8ce40f0a72f79f7f141a GIT binary patch literal 2483 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 E6F8gv@&Et; literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_13.png b/app/src/main/res/drawable/gunther_wallets_13.png new file mode 100644 index 0000000000000000000000000000000000000000..9eed5c39fa97ccfae183f32fc5fd96faaed6cb79 GIT binary patch literal 2488 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 YjnP#90uXpxTDu#8xd|Tk1nU|1U-cIKRsaA1 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_14.png b/app/src/main/res/drawable/gunther_wallets_14.png new file mode 100644 index 0000000000000000000000000000000000000000..c6b4f890f49290cc595349e2931142e43f4009c2 GIT binary patch literal 2490 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 K$KACjr2iXru?bfI literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_15.png b/app/src/main/res/drawable/gunther_wallets_15.png new file mode 100644 index 0000000000000000000000000000000000000000..e878836d7505627c00257a654a3927ff50d90312 GIT binary patch literal 2493 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 Y(fX*b2@*rabzczJTH&!p7>~H$0O;TbJ^%m! literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_16.png b/app/src/main/res/drawable/gunther_wallets_16.png new file mode 100644 index 0000000000000000000000000000000000000000..5a598b45b412f25d109456b72cc56d50dbf61525 GIT binary patch literal 2497 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 ZV2-gw{}G`2gx&Iqfrl#|d(Al{<9F%l1=Iil literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_17.png b/app/src/main/res/drawable/gunther_wallets_17.png new file mode 100644 index 0000000000000000000000000000000000000000..5a598b45b412f25d109456b72cc56d50dbf61525 GIT binary patch literal 2497 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 ZV2-gw{}G`2gx&Iqfrl#|d(Al{<9F%l1=Iil literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_18.png b/app/src/main/res/drawable/gunther_wallets_18.png new file mode 100644 index 0000000000000000000000000000000000000000..5a598b45b412f25d109456b72cc56d50dbf61525 GIT binary patch literal 2497 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 ZV2-gw{}G`2gx&Iqfrl#|d(Al{<9F%l1=Iil literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_19.png b/app/src/main/res/drawable/gunther_wallets_19.png new file mode 100644 index 0000000000000000000000000000000000000000..e878836d7505627c00257a654a3927ff50d90312 GIT binary patch literal 2493 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 Y(fX*b2@*rabzczJTH&!p7>~H$0O;TbJ^%m! literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_20.png b/app/src/main/res/drawable/gunther_wallets_20.png new file mode 100644 index 0000000000000000000000000000000000000000..92bb8ac1025f44216efd8ce40f0a72f79f7f141a GIT binary patch literal 2483 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 E6F8gv@&Et; literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_21.png b/app/src/main/res/drawable/gunther_wallets_21.png new file mode 100644 index 0000000000000000000000000000000000000000..1f013994bb86251e5584b7ff45646ec9ec044735 GIT binary patch literal 2468 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/gunther_wallets_22.png b/app/src/main/res/drawable/gunther_wallets_22.png new file mode 100644 index 0000000000000000000000000000000000000000..eaaabcdc6b2c2155527424f0e3726c099243f05c GIT binary patch literal 2438 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 Ggueg{3gs>U literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_add_circle_outline.xml b/app/src/main/res/drawable/ic_add_circle_outline.xml new file mode 100644 index 00000000..13c94bf1 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_circle_outline.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="20.0" + android:viewportWidth="20.0"> + <path + android:fillColor="@color/moneroFab" + android:pathData="M11,5L9,5L9,9L5,9L5,11L9,11L9,15L11,15L11,11L15,11L15,9L11,9L11,5L11,5ZM10,0C4.5,0 0,4.5 0,10C0,15.5 4.5,20 10,20C15.5,20 20,15.5 20,10C20,4.5 15.5,0 10,0L10,0ZM10,18C5.6,18 2,14.4 2,10C2,5.6 5.6,2 10,2C14.4,2 18,5.6 18,10C18,14.4 14.4,18 10,18L10,18Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_add_white_24dp.xml b/app/src/main/res/drawable/ic_add_white_24dp.xml new file mode 100644 index 00000000..ba7fc6e4 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_white_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> + <path + android:fillColor="#FFffffff" + android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_arrow_back_white_24dp.xml b/app/src/main/res/drawable/ic_arrow_back_white_24dp.xml new file mode 100644 index 00000000..bd276311 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_back_white_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> + <path + android:fillColor="#FFffffff" + android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_close_white_24dp.xml b/app/src/main/res/drawable/ic_close_white_24dp.xml new file mode 100644 index 00000000..f107a22f --- /dev/null +++ b/app/src/main/res/drawable/ic_close_white_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFffffff" + android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_content_copy_black_24dp.xml b/app/src/main/res/drawable/ic_content_copy_black_24dp.xml new file mode 100644 index 00000000..53a58588 --- /dev/null +++ b/app/src/main/res/drawable/ic_content_copy_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="@color/moneroBlack" + android:pathData="M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_content_nocopy_black_24dp.xml b/app/src/main/res/drawable/ic_content_nocopy_black_24dp.xml new file mode 100644 index 00000000..73932a18 --- /dev/null +++ b/app/src/main/res/drawable/ic_content_nocopy_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="@color/moneroGray" + android:pathData="M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_done_all.xml b/app/src/main/res/drawable/ic_done_all.xml new file mode 100644 index 00000000..d2b3c562 --- /dev/null +++ b/app/src/main/res/drawable/ic_done_all.xml @@ -0,0 +1,13 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> + <group + android:translateX="0.000000" + android:translateY="+7.000000"> + <path + android:fillColor="#417505" + android:pathData="M17.6,1.4L16.2,0L9.9,6.3L11.3,7.7L17.6,1.4L17.6,1.4ZM21.8,0L11.3,10.6L7.1,6.4L5.7,7.8L11.3,13.4L23.3,1.4L21.8,0L21.8,0ZM0,7.8L5.6,13.4L7,12L1.4,6.4L0,7.8L0,7.8Z" /> + </group> +</vector> diff --git a/app/src/main/res/drawable/ic_eye.xml b/app/src/main/res/drawable/ic_eye.xml new file mode 100644 index 00000000..1668f114 --- /dev/null +++ b/app/src/main/res/drawable/ic_eye.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="29dp" + android:height="17dp" + android:viewportHeight="17" + android:viewportWidth="29"> + + <group + android:translateX="-219.000000" + android:translateY="-74.000000"> + <group + android:translateX="219.000000" + android:translateY="74.000000"> + <path + android:fillColor="#FEFEFE" + android:pathData="M14.4474298,13.6840973 C11.5770468,13.6840973 9.24995106,11.3571559 +9.24995106,8.48677287 C9.24995106,5.61623564 11.5770468,3.28929415 +14.4474298,3.28929415 C17.3178128,3.28929415 19.6449085,5.61623564 +19.6449085,8.48677287 C19.6449085,11.3571559 17.3178128,13.6840973 +14.4474298,13.6840973 M14.4474298,-4.62765957e-05 C8.23695638,-4.62765957e-05 +2.82706809,3.42395904 3.08510638e-05,8.48692713 C2.82706809,13.5494324 +8.23695638,16.9734378 14.4474298,16.9734378 C20.6579032,16.9734378 +26.0676372,13.5494324 28.8948287,8.48692713 C26.0676372,3.42395904 +20.6579032,-4.62765957e-05 14.4474298,-4.62765957e-05" + android:strokeWidth="1" /> + </group> + </group> +</vector> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_favorite_white_14dp.xml b/app/src/main/res/drawable/ic_favorite_white_14dp.xml new file mode 100644 index 00000000..736aacd7 --- /dev/null +++ b/app/src/main/res/drawable/ic_favorite_white_14dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="14dp" + android:height="14dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> + <path + android:fillColor="#FFffffff" + android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_favorite_white_24dp.xml b/app/src/main/res/drawable/ic_favorite_white_24dp.xml new file mode 100644 index 00000000..df182e10 --- /dev/null +++ b/app/src/main/res/drawable/ic_favorite_white_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> + <path + android:fillColor="#FFffffff" + android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_hand.xml b/app/src/main/res/drawable/ic_hand.xml new file mode 100644 index 00000000..c8f20cf5 --- /dev/null +++ b/app/src/main/res/drawable/ic_hand.xml @@ -0,0 +1,21 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="22.0" + android:viewportWidth="22.0"> + <path + android:fillColor="#FFFFFF" + android:pathData="M13.985,8.648C14.245,8.798 14.478,8.873 14.684,8.873C14.817,8.873 14.925,8.842 15.008,8.777C15.093,8.713 15.135,8.63 15.135,8.527C15.135,8.418 15.089,8.333 14.998,8.272C14.907,8.212 14.778,8.181 14.611,8.181C14.43,8.181 14.24,8.219 14.04,8.295L14.293,6.397L15.913,6.397L15.913,7.177L14.985,7.177L14.915,7.502C14.976,7.498 15.025,7.496 15.063,7.496C15.33,7.496 15.556,7.592 15.74,7.782C15.923,7.971 16.014,8.207 16.014,8.49C16.014,8.822 15.896,9.099 15.66,9.321C15.426,9.543 15.132,9.654 14.776,9.654C14.472,9.654 14.175,9.572 13.882,9.407L13.985,8.648ZM15,11C16.657,11 18,9.657 18,8C18,6.343 16.657,5 15,5C13.343,5 12,6.343 12,8C12,9.657 13.343,11 15,11L15,11Z" + android:strokeColor="#00000000" + android:strokeWidth="1" /> + <path + android:fillColor="#FFFFFF" + android:pathData="M21.344,12.691C20.503,12.122 19.588,12.527 19.168,12.769L14.417,16.615L10.807,16.616L10.035,15.847L12.871,15.847C13.724,15.847 14.679,15.293 14.679,14.308C14.679,13.262 13.724,12.769 12.871,12.769L11.808,12.769C11.019,12.769 10.096,12.839 9.446,12.492C8.828,12.179 8.116,12.001 7.356,12.001C6.081,12.001 4.939,12.507 4.157,13.307L-0,17.385L4.631,22L6.175,19.692L13.993,19.692C14.771,19.692 15.522,19.408 16.103,18.893L21.397,13.745C21.72,13.459 21.702,12.933 21.344,12.691" + android:strokeColor="#00000000" + android:strokeWidth="1" /> + <path + android:fillColor="#FFFFFF" + android:pathData="M10.115,1.099L11.102,1.099L11.102,3.926L10.397,3.926L10.397,1.776L10.115,1.776L10.115,1.099ZM10.692,5C11.967,5 13,3.881 13,2.5C13,1.119 11.967,-0 10.692,-0C9.418,-0 8.384,1.119 8.384,2.5C8.384,3.881 9.418,5 10.692,5L10.692,5Z" + android:strokeColor="#00000000" + android:strokeWidth="1" /> +</vector> diff --git a/app/src/main/res/drawable/ic_help_black_24dp.xml b/app/src/main/res/drawable/ic_help_white_24dp.xml similarity index 67% rename from app/src/main/res/drawable/ic_help_black_24dp.xml rename to app/src/main/res/drawable/ic_help_white_24dp.xml index 1517747d..d5f35201 100644 --- a/app/src/main/res/drawable/ic_help_black_24dp.xml +++ b/app/src/main/res/drawable/ic_help_white_24dp.xml @@ -1,9 +1,9 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> + android:width="24dp" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> <path - android:fillColor="#FF000000" - android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,19h-2v-2h2v2zM15.07,11.25l-0.9,0.92C13.45,12.9 13,13.5 13,15h-2v-0.5c0,-1.1 0.45,-2.1 1.17,-2.83l1.24,-1.26c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2L8,9c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,0.88 -0.36,1.68 -0.93,2.25z"/> + android:fillColor="#FFffffff" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,19h-2v-2h2v2zM15.07,11.25l-0.9,0.92C13.45,12.9 13,13.5 13,15h-2v-0.5c0,-1.1 0.45,-2.1 1.17,-2.83l1.24,-1.26c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2L8,9c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,0.88 -0.36,1.68 -0.93,2.25z" /> </vector> diff --git a/app/src/main/res/drawable/ic_info_outline_gray_24dp.xml b/app/src/main/res/drawable/ic_info_outline_gray_24dp.xml new file mode 100644 index 00000000..979fc481 --- /dev/null +++ b/app/src/main/res/drawable/ic_info_outline_gray_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="@color/moneroFab" + android:pathData="M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_info_black_24dp.xml b/app/src/main/res/drawable/ic_info_white_24dp.xml similarity index 89% rename from app/src/main/res/drawable/ic_info_black_24dp.xml rename to app/src/main/res/drawable/ic_info_white_24dp.xml index 34b8202e..449ec46b 100644 --- a/app/src/main/res/drawable/ic_info_black_24dp.xml +++ b/app/src/main/res/drawable/ic_info_white_24dp.xml @@ -4,6 +4,6 @@ android:viewportHeight="24.0" android:viewportWidth="24.0"> <path - android:fillColor="#FF000000" + android:fillColor="#FFffffff" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zm1,15h-2v-6h2v6zm0,-8h-2V7h2v2z" /> </vector> diff --git a/app/src/main/res/drawable/ic_key.xml b/app/src/main/res/drawable/ic_key.xml new file mode 100644 index 00000000..ac50e393 --- /dev/null +++ b/app/src/main/res/drawable/ic_key.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="29dp" + android:height="13dp" + android:viewportHeight="13" + android:viewportWidth="29"> + + <group + android:translateX="-219.000000" + android:translateY="-136.000000"> + <group + android:translateX="219.000000" + android:translateY="136.000000"> + <path + android:fillColor="#FEFEFE" + android:pathData="M6.29687258,9.00290326 C4.95784407,9.00290326 3.87228646,7.88216454 +3.87228646,6.49992511 C3.87228646,5.11783546 4.95784407,3.99709674 +6.29687258,3.99709674 C7.63604617,3.99709674 8.72160379,5.11783546 +8.72160379,6.49992511 C8.72160379,7.88216454 7.63604617,9.00290326 +6.29687258,9.00290326 L6.29687258,9.00290326 Z M19.5790661,4.89647346 +L12.4001961,4.89647346 C11.7082656,2.08212076 9.23841162,0 6.29687258,0 +C2.81922883,0 0,2.9099068 0,6.49992511 C0,10.0899434 2.81922883,13 6.29687258,13 +C9.23841162,13 11.7082656,10.9178792 12.4001961,8.10352654 +L19.5790661,8.10352654 L19.5790661,13 L21.3018556,13 L21.3018556,9.33689328 +L23.3905602,9.33689328 L23.3905602,13 L25.3240193,13 L25.3240193,10.81259 +L27.3216078,10.81259 L27.3216078,13 L29,13 L29,8.10352654 L29,4.89647346 +L19.5790661,4.89647346 Z" + android:strokeWidth="1" /> + </group> + </group> +</vector> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_keyboard_arrow_right_black_24dp.xml b/app/src/main/res/drawable/ic_keyboard_arrow_right_black_24dp.xml new file mode 100644 index 00000000..a3d16222 --- /dev/null +++ b/app/src/main/res/drawable/ic_keyboard_arrow_right_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M8.59,16.34l4.58,-4.59 -4.58,-4.59L10,5.75l6,6 -6,6z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_logo_horizontol_xmrujo.xml b/app/src/main/res/drawable/ic_logo_horizontol_xmrujo.xml new file mode 100644 index 00000000..cf1dde3c --- /dev/null +++ b/app/src/main/res/drawable/ic_logo_horizontol_xmrujo.xml @@ -0,0 +1,36 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="135dp" + android:height="48dp" + android:viewportHeight="108.0" + android:viewportWidth="304.0"> + <path + android:fillColor="#FFffffff" + android:pathData="M74.4,65.14q-4.73,-4.88 -4.73,-12.84t4.95,-12.87A16.88,16.88 0,0 1,87 34.52a16.88,16.88 0,0 1,12.4 4.92q4.95,4.92 4.95,12.84A16.91,16.91 0,0 1,99.2 65.11,17.62 17.62,0 0,1 86.58,70 16.2,16.2 0,0 1,74.4 65.14ZM86.58,65.33a11.53,11.53 0,0 0,8.36 -3.48q3.54,-3.48 3.54,-9.61T95.1,42.66a11.11,11.11 0,0 0,-8.24 -3.44,10.7 10.7,0 0,0 -8.11,3.44q-3.26,3.45 -3.26,9.61t3.13,9.61A10.27,10.27 0,0 0,86.58 65.33Z" /> + <path + android:fillColor="#FFffffff" + android:pathData="M117.21,35.08v5.57q3.51,-6.14 11.21,-6.14a13,13 0,0 1,9.52 3.79q3.82,3.79 3.82,10.8V69.46h-5.64V50.05q0,-5.2 -2.5,-7.89a9,9 0,0 0,-6.92 -2.69,9.09 9.09,0 0,0 -7,2.69q-2.54,2.69 -2.54,7.89V69.46h-5.7V35.08Z" /> + <path + android:fillColor="#FFffffff" + android:pathData="M165.24,70a15.82,15.82 0,0 1,-12 -4.88q-4.63,-4.88 -4.63,-12.9t4.7,-12.87a16.2,16.2 0,0 1,12.18 -4.85q7.48,0 12,4.6A16,16 0,0 1,182 50.87a21.51,21.51 0,0 1,-0.25 3.38L154.4,54.25a11.81,11.81 0,0 0,3.22 8.11,10.3 10.3,0 0,0 7.61,3 10.63,10.63 0,0 0,5.92 -1.57,9.3 9.3,0 0,0 3.54,-4.13h6.14a15.79,15.79 0,0 1,-5.61 7.45A16.33,16.33 0,0 1,165.24 70ZM172.94,42.16a11.23,11.23 0,0 0,-15.16 -0.06,11.65 11.65,0 0,0 -3.32,8h21.61A10.73,10.73 0,0 0,172.94 42.19Z" /> + <path + android:fillColor="#FFffffff" + android:pathData="M194.8,35.08v5.82q3.07,-6.39 10.46,-6.39v5.95h-1.5q-4.38,0 -6.67,2.29t-2.29,7.92V69.46h-5.7V35.08Z" /> + <path + android:fillColor="#FFffffff" + android:pathData="M236.38,35.08h5.7V69.46h-5.7V64Q232.93,70 225.17,70a13,13 0,0 1,-9.52 -3.79q-3.82,-3.79 -3.82,-10.74V35.08h5.64V54.56q0,5.14 2.54,7.86a10.15,10.15 0,0 0,13.84 0q2.54,-2.72 2.54,-7.86Z" /> + <path + android:fillColor="#FFffffff" + android:pathData="M254.35,29.57a3.9,3.9 0,0 0,2.76 -6.64,3.85 3.85,0 0,0 -6.58,2.76 3.8,3.8 0,0 0,1.1 2.75A3.64,3.64 0,0 0,254.35 29.57Z" /> + <path + android:fillColor="#FFffffff" + android:pathData="M251.43,76.85a4.48,4.48 0,0 1,-1 3.24,4.61 4.61,0 0,1 -3.33,1h-2.43v4.67h3.56c5.93,0 8.85,-3 8.85,-8.88V35.07h-5.69Z" /> + <path + android:fillColor="#FFffffff" + android:pathData="M59.82,29.57a3.9,3.9 0,0 0,2.76 -6.64A3.85,3.85 0,0 0,56 25.69a3.8,3.8 0,0 0,1.1 2.75A3.64,3.64 0,0 0,59.82 29.57Z" /> + <path + android:fillColor="#FFffffff" + android:pathData="M59,38.31a13.12,13.12 0,0 0,-9.64 -3.79,13.81 13.81,0 0,0 -7.35,2A14,14 0,0 0,36.92 42a12,12 0,0 0,-4.82 -5.54A13.65,13.65 0,0 0,25 34.52q-7.7,0 -11.21,6.14V35.07H8V69.46h5.75V50.05q0,-5.2 2.54,-7.89a9.09,9.09 0,0 1,7 -2.69,9 9,0 0,1 6.91,2.69q2.5,2.69 2.5,7.89v19.4h5.64V50.05q0,-5.2 2.54,-7.89a9.06,9.06 0,0 1,6.92 -2.69,9 9,0 0,1 6.91,2.69c1.69,1.8 2.52,4.43 2.52,7.89V69.46l0,7.39a4.48,4.48 0,0 1,-0.95 3.24,4.59 4.59,0 0,1 -3.33,1H50.41v4.67H54c5.93,0 8.82,-3 8.82,-8.88V49.11C62.82,44.44 61.56,40.84 59,38.31Z" /> + <path + android:fillColor="#FFffffff" + android:pathData="M269,65.14q-4.73,-4.88 -4.73,-12.84t4.95,-12.87a18.09,18.09 0,0 1,24.8 0Q299,44.35 299,52.28a16.91,16.91 0,0 1,-5.17 12.84A17.62,17.62 0,0 1,281.21 70,16.2 16.2,0 0,1 269,65.14ZM281.18,65.33a11.53,11.53 0,0 0,8.36 -3.48q3.54,-3.48 3.54,-9.61t-3.38,-9.58a11.11,11.11 0,0 0,-8.24 -3.44,10.7 10.7,0 0,0 -8.11,3.44q-3.26,3.45 -3.26,9.61t3.13,9.61A10.27,10.27 0,0 0,281.21 65.33Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_navigate_next_black_24dp.xml b/app/src/main/res/drawable/ic_navigate_next_black_24dp.xml new file mode 100644 index 00000000..24835127 --- /dev/null +++ b/app/src/main/res/drawable/ic_navigate_next_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_new.xml b/app/src/main/res/drawable/ic_new.xml new file mode 100644 index 00000000..eb0b47bb --- /dev/null +++ b/app/src/main/res/drawable/ic_new.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="29dp" + android:height="29dp" + android:viewportHeight="29" + android:viewportWidth="29"> + + <group + android:translateX="-219.000000" + android:translateY="-7.000000"> + <group + android:translateX="219.000000" + android:translateY="7.000000"> + <path + android:fillColor="#FEFEFE" + android:pathData="M11.0476403,8.86547314 C10.1626979,9.41441547 9.41459398,10.1624996 +8.86563718,11.047619 L3.4524022,5.63432651 L5.63440531,3.45238095 +L11.0476403,8.86547314 Z M14.8450352,7.41694052 C14.2508096,7.41694052 +13.6733955,7.47975215 13.1190689,7.5952381 L13.1190689,0 L16.5714498,0 +L16.5714498,7.5952381 C16.0168991,7.47995092 15.4394849,7.41694052 +14.8450352,7.41694052 Z M7.92772894,14.8624137 C7.92772894,15.4344301 +7.99486447,15.9902634 8.11830037,16.5240878 L0,16.5240878 L0,13.2007396 +L8.11830037,13.2007396 C7.99486447,13.734564 7.92772894,14.2903973 +7.92772894,14.8624137 Z M20.1343478,11.047619 C19.5854054,10.1627 +18.8375216,9.41461581 17.9524022,8.86547314 L23.3654944,3.45238095 +L25.5476403,5.63432651 L20.1343478,11.047619 Z M21.4047832,13.1190476 +L29.0000212,13.1190476 L29.0000212,16.5714286 L21.4047832,16.5714286 +C21.5202661,16.0168778 21.5830761,15.4394636 21.5830761,14.8452381 +C21.5830761,14.2510125 21.5202661,13.6735984 21.4047832,13.1190476 Z +M8.86557962,17.952381 C9.4145509,18.8373234 10.1626745,19.5854273 +11.0476403,20.1345844 L5.63446287,25.547619 L3.4524022,23.3656159 +L8.86557962,17.952381 Z M17.9524022,20.1345269 C18.8373679,19.5855845 +19.5854916,18.8375004 20.1344629,17.952381 L25.5476403,23.3654731 +L23.36578,25.547619 L17.9524022,20.1345269 Z M14.8450352,21.5830595 +C15.4394849,21.5830595 16.0168991,21.5200491 16.5714498,21.4047619 +L16.5714498,29 L13.1190689,29 L13.1190689,21.4047619 C13.6733955,21.5200491 +14.2508096,21.5830595 14.8450352,21.5830595 Z" + android:strokeWidth="1" /> + </group> + </group> +</vector> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_scan.xml b/app/src/main/res/drawable/ic_scan.xml new file mode 100644 index 00000000..dfe72fe9 --- /dev/null +++ b/app/src/main/res/drawable/ic_scan.xml @@ -0,0 +1,13 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt" + android:width="24dp" + android:height="24dp" + android:viewportHeight="30.0" + android:viewportWidth="30.0"> + <path + android:fillColor="#FF640C" + android:fillType="evenOdd" + android:pathData="M26.667,27.996L27.991,26.667L27.991,20L30,20L30,26.667C30,28.5 28.5,30 26.667,30L20,30L20,27.996L26.667,27.996ZM3.333,27.996L10,27.996L10,30L3.333,30C1.5,30 0,28.5 0,26.667L0,20L2.009,20L2.009,26.667L3.333,27.996ZM26.667,2.004L20,2.004L20,0L26.667,0C28.5,0 30,1.5 30,3.333L30,10L27.991,10L27.991,3.333L26.667,2.004ZM3.333,2.004L2.009,3.333L2.009,10L0,10L0,3.333C0,1.5 1.5,0 3.333,0L10,0L10,2.004L3.333,2.004Z" + android:strokeColor="#00000000" + android:strokeWidth="1" /> +</vector> diff --git a/app/src/main/res/drawable/ic_seed.xml b/app/src/main/res/drawable/ic_seed.xml new file mode 100644 index 00000000..ba295044 --- /dev/null +++ b/app/src/main/res/drawable/ic_seed.xml @@ -0,0 +1,21 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="6.35" + android:viewportHeight="6.3500004"> + <path + android:pathData="m4.518,3.147c0.341,-0.341 0.45,-0.827 0.327,-1.26 -0.433,-0.123 -0.919,-0.014 -1.26,0.327 -0.341,0.341 -0.45,0.827 -0.327,1.26 0.433,0.123 0.919,0.014 1.26,-0.328" + android:fillColor="#ffffff"/> + <path + android:pathData="m2.731,2.214c-0.341,-0.341 -0.826,-0.45 -1.26,-0.327 -0.123,0.433 -0.014,0.919 0.327,1.26 0.341,0.341 0.827,0.45 1.26,0.328 0.123,-0.433 0.014,-0.919 -0.327,-1.26" + android:fillColor="#ffffff"/> + <path + android:pathData="M3.064,2.185l0.206,0l0,3.126l-0.206,0z" + android:fillColor="#ffffff"/> + <path + android:pathData="m4.18,5.357c0,-0.549 -0.445,-0.994 -0.994,-0.994 -0.549,0 -0.994,0.445 -0.994,0.994 0,0.549 0.445,0.994 0.994,0.994 0.549,0 0.994,-0.445 0.994,-0.994" + android:fillColor="#ffffff"/> + <path + android:pathData="m3.834,1.123c0,-0.482 -0.266,-0.903 -0.659,-1.123 -0.393,0.22 -0.659,0.64 -0.659,1.123 -0,0.483 0.266,0.903 0.659,1.123 0.393,-0.22 0.659,-0.64 0.659,-1.123" + android:fillColor="#ffffff"/> +</vector> diff --git a/app/src/main/res/drawable/ic_send.xml b/app/src/main/res/drawable/ic_send.xml new file mode 100644 index 00000000..d42e1543 --- /dev/null +++ b/app/src/main/res/drawable/ic_send.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_settings_orange_24dp.xml b/app/src/main/res/drawable/ic_settings_orange_24dp.xml new file mode 100644 index 00000000..090a85e8 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_orange_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="@color/gradientOrange" + android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_share_white_24dp.xml b/app/src/main/res/drawable/ic_share_white_24dp.xml new file mode 100644 index 00000000..874169d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_share_white_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> + <path + android:fillColor="@color/moneroWhite" + android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_traffic.xml b/app/src/main/res/drawable/ic_traffic.xml new file mode 100644 index 00000000..e7c45cd4 --- /dev/null +++ b/app/src/main/res/drawable/ic_traffic.xml @@ -0,0 +1,10 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="16.0" + android:viewportWidth="13.0"> + <path + android:fillColor="@color/trafficGray" + android:fillType="evenOdd" + android:pathData="M8.401,0.431L8.401,1.741C8.401,2.064 8.163,2.326 7.87,2.326L0.569,2.326C0.255,2.326 0,2.605 0,2.951L0,5.031C0,5.376 0.255,5.657 0.569,5.657L7.87,5.657C8.163,5.657 8.401,5.918 8.401,6.24L8.401,7.569C8.401,7.934 8.788,8.133 9.042,7.899L12.809,4.447C13.064,4.215 13.064,3.785 12.809,3.553L9.042,0.101C8.788,-0.133 8.401,0.066 8.401,0.431L8.401,0.431L8.401,0.431ZM4.599,8.431L4.599,9.742C4.599,10.065 4.837,10.326 5.131,10.326L12.431,10.326C12.746,10.326 13,10.606 13,10.952L13,13.03C13,13.376 12.746,13.656 12.431,13.656L5.131,13.656C4.837,13.656 4.599,13.917 4.599,14.24L4.599,15.569C4.599,15.934 4.212,16.133 3.957,15.9L0.19,12.447C-0.063,12.215 -0.063,11.786 0.19,11.553L3.957,8.101C4.212,7.867 4.599,8.066 4.599,8.431L4.599,8.431L4.599,8.431Z" /> +</vector> diff --git a/app/src/main/res/drawable/selector_login.xml b/app/src/main/res/drawable/selector_login.xml new file mode 100644 index 00000000..25d68162 --- /dev/null +++ b/app/src/main/res/drawable/selector_login.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true"> + <shape> + <solid android:color="@color/colorAccent" /> + </shape> + </item> + + <item android:state_pressed="false"> + <shape> + <solid android:color="@android:color/transparent" /> + </shape> + </item> +</selector> \ No newline at end of file diff --git a/app/src/main/res/drawable/texture_cash.png b/app/src/main/res/drawable/texture_cash.png new file mode 100644 index 0000000000000000000000000000000000000000..bcd550b09b860c1e4014c126a47dc5b71c44d51c GIT binary patch literal 49327 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/login_activity.xml b/app/src/main/res/layout/activity_login.xml similarity index 57% rename from app/src/main/res/layout/login_activity.xml rename to app/src/main/res/layout/activity_login.xml index 49d3f66c..7b155697 100644 --- a/app/src/main/res/layout/login_activity.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,11 +2,17 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@drawable/backgound_all" android:gravity="center_horizontal" android:orientation="vertical"> - <include - layout="@layout/toolbar" /> + <com.m2049r.xmrwallet.layout.Toolbar + android:id="@+id/toolbar" + style="@style/ToolBarStyle.Event" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/backgound_toolbar_mainnet" + android:minHeight="?attr/actionBarSize" /> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment_container" diff --git a/app/src/main/res/layout/wallet_activity.xml b/app/src/main/res/layout/activity_wallet.xml similarity index 57% rename from app/src/main/res/layout/wallet_activity.xml rename to app/src/main/res/layout/activity_wallet.xml index 718b393c..7b155697 100644 --- a/app/src/main/res/layout/wallet_activity.xml +++ b/app/src/main/res/layout/activity_wallet.xml @@ -2,12 +2,17 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@drawable/backgound_all" android:gravity="center_horizontal" - android:background="@color/moneroBlack" android:orientation="vertical"> - <include - layout="@layout/toolbar" /> + <com.m2049r.xmrwallet.layout.Toolbar + android:id="@+id/toolbar" + style="@style/ToolBarStyle.Event" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/backgound_toolbar_mainnet" + android:minHeight="?attr/actionBarSize" /> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment_container" diff --git a/app/src/main/res/layout/fragment_generate.xml b/app/src/main/res/layout/fragment_generate.xml new file mode 100644 index 00000000..b4573dbf --- /dev/null +++ b/app/src/main/res/layout/fragment_generate.xml @@ -0,0 +1,160 @@ +<?xml version="1.0" encoding="utf-8"?> +<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_margin="8sp"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:weightSum="2"> + + <android.support.design.widget.TextInputLayout + android:id="@+id/etWalletName" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + app:counterEnabled="true" + app:counterMaxLength="20" + app:errorEnabled="true"> + + <android.support.design.widget.TextInputEditText + style="@style/MoneroEdit" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/generate_name_hint" + android:imeOptions="actionNext" + android:inputType="text" + android:maxLines="1" + android:textAlignment="textStart" /> + + </android.support.design.widget.TextInputLayout> + + <android.support.design.widget.TextInputLayout + android:id="@+id/etWalletPassword" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1"> + + <android.support.design.widget.TextInputEditText + style="@style/MoneroEdit" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:hint="@string/generate_password_hint" + android:imeOptions="actionNext" + android:inputType="text" + android:textAlignment="textStart" /> + + </android.support.design.widget.TextInputLayout> + </LinearLayout> + + <android.support.design.widget.TextInputLayout + android:id="@+id/etWalletMnemonic" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" + app:errorEnabled="true"> + + <android.support.design.widget.TextInputEditText + style="@style/MoneroEdit" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/generate_mnemonic_hint" + android:imeOptions="actionNext" + android:inputType="textMultiLine" + android:textAlignment="center" /> + </android.support.design.widget.TextInputLayout> + + <android.support.design.widget.TextInputLayout + android:id="@+id/etWalletAddress" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" + + app:counterEnabled="true" + app:counterMaxLength="95" + app:errorEnabled="true"> + + <android.support.design.widget.TextInputEditText + style="@style/MoneroEdit" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/generate_address_hint" + android:imeOptions="actionNext" + android:inputType="textMultiLine" + android:textAlignment="center" /> + </android.support.design.widget.TextInputLayout> + + <android.support.design.widget.TextInputLayout + android:id="@+id/etWalletViewKey" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" + app:counterEnabled="true" + app:counterMaxLength="64" + app:errorEnabled="true"> + + <android.support.design.widget.TextInputEditText + android:id="@+id/textInputEditText" + style="@style/MoneroEdit" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/generate_viewkey_hint" + android:imeOptions="actionNext" + android:inputType="textMultiLine" + android:textAlignment="center" /> + </android.support.design.widget.TextInputLayout> + + <android.support.design.widget.TextInputLayout + android:id="@+id/etWalletSpendKey" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" + app:counterEnabled="true" + app:counterMaxLength="64" + app:errorEnabled="true"> + + <android.support.design.widget.TextInputEditText + style="@style/MoneroEdit" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/generate_spendkey_hint" + android:imeOptions="actionNext" + android:inputType="textMultiLine" + android:textAlignment="center" /> + </android.support.design.widget.TextInputLayout> + + <android.support.design.widget.TextInputLayout + android:id="@+id/etWalletRestoreHeight" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" + app:errorEnabled="true"> + + <android.support.design.widget.TextInputEditText + style="@style/MoneroEdit" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/generate_restoreheight_hint" + android:imeOptions="actionDone" + android:inputType="number" + android:textAlignment="center" /> + </android.support.design.widget.TextInputLayout> + + <Button + android:id="@+id/bGenerate" + style="@style/MoneroButton" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="8dp" + android:text="@string/generate_buttonGenerate" /> + + </LinearLayout> +</ScrollView> \ No newline at end of file diff --git a/app/src/main/res/layout/help_fragment.xml b/app/src/main/res/layout/fragment_help.xml similarity index 100% rename from app/src/main/res/layout/help_fragment.xml rename to app/src/main/res/layout/fragment_help.xml diff --git a/app/src/main/res/layout/licenses_fragment.xml b/app/src/main/res/layout/fragment_licenses.xml similarity index 100% rename from app/src/main/res/layout/licenses_fragment.xml rename to app/src/main/res/layout/fragment_licenses.xml diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml new file mode 100644 index 00000000..41ceb686 --- /dev/null +++ b/app/src/main/res/layout/fragment_login.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_margin="8sp"> + + <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <EditText + android:id="@+id/etDummy" + android:layout_width="0dp" + android:layout_height="0dp" /> + + <android.support.design.widget.TextInputLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_margin="16dp" + android:hint="@string/label_daemon"> + + <com.m2049r.xmrwallet.layout.DropDownEditText + android:id="@+id/etDaemonAddress" + style="@style/MoneroEdit.Small" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="start" + android:hint="@string/prompt_daemon" + android:imeOptions="actionDone" + android:inputType="textWebEmailAddress|textNoSuggestions" + android:maxLines="1" + android:textIsSelectable="true" /> + </android.support.design.widget.TextInputLayout> + + + <TextView + style="@style/MoneroLabel.Heading" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center" + android:padding="8sp" + android:text="@string/label_login_wallets" /> + + <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <ImageView + android:id="@+id/ivGuntherWallets" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:src="@drawable/gunther_wallets_00" /> + + <android.support.v7.widget.RecyclerView xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/list" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:clipToPadding="false" + android:paddingBottom="72dp" + app:layoutManager="LinearLayoutManager" + tools:listitem="@layout/item_wallet" /> + </FrameLayout> + </LinearLayout> + + <include layout="@layout/layout_fabmenu" /> + +</FrameLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_receive.xml b/app/src/main/res/layout/fragment_receive.xml new file mode 100644 index 00000000..f884df63 --- /dev/null +++ b/app/src/main/res/layout/fragment_receive.xml @@ -0,0 +1,119 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_margin="8sp" + android:orientation="vertical"> + + <ProgressBar + android:id="@+id/pbProgress" + style="@style/Widget.AppCompat.ProgressBar.Horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="4sp" + android:indeterminate="true" + android:visibility="gone" /> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <TextView + style="@style/MoneroLabel.Heading" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_gravity="center" + android:text="@string/generate_address_label" /> + + <ImageButton + android:id="@+id/bCopyAddress" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:layout_marginEnd="80dp" + android:background="?android:selectableItemBackground" + android:enabled="false" + android:src="@drawable/ic_content_nocopy_black_24dp" /> + </FrameLayout> + + <TextView + android:id="@+id/tvAddress" + style="@style/MoneroText.Medium" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textAlignment="center" + tools:text="9wZnnNctRc7RaLya1rxykH21dUwfQpNGmVLjAvkvqe7nKT2Mw848AJNGMunW5xjoSZ5vCCU3uDnUoVqSSHxzRtQBE3f6crx" /> + + <com.m2049r.xmrwallet.layout.ExchangeView + android:id="@+id/evAmount" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="16sp" /> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="4sp" + android:layout_marginTop="8sp" + android:orientation="horizontal" + android:weightSum="10"> + + <android.support.design.widget.TextInputLayout + android:id="@+id/etPaymentId" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="10" + app:counterEnabled="true" + app:counterMaxLength="16" + app:errorEnabled="true"> + + <android.support.design.widget.TextInputEditText + style="@style/MoneroEdit" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/receive_paymentid_hint" + android:imeOptions="actionDone" + android:inputType="textMultiLine" + android:textAlignment="textStart" /> + + </android.support.design.widget.TextInputLayout> + + <Button + android:id="@+id/bPaymentId" + style="@style/MoneroText.Button.Small" + android:layout_width="56dp" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_weight="0" + android:background="?android:selectableItemBackground" + android:drawableTop="@drawable/ic_settings_orange_24dp" + android:text="@string/send_generate_paymentid_hint" + android:visibility="visible" /> + + </LinearLayout> + + <Button + android:id="@+id/bGenerate" + style="@style/MoneroButton" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="4sp" + android:layout_marginTop="4sp" + android:enabled="false" + android:minHeight="36sp" + android:text="@string/receive_generate_hint" /> + + <ImageView + android:id="@+id/qrCode" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:adjustViewBounds="true" /> + + <EditText + android:id="@+id/etDummy" + android:layout_width="0sp" + android:layout_height="0sp" /> + +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_review.xml b/app/src/main/res/layout/fragment_review.xml new file mode 100644 index 00000000..bc1fa80d --- /dev/null +++ b/app/src/main/res/layout/fragment_review.xml @@ -0,0 +1,222 @@ +<?xml version="1.0" encoding="utf-8"?> +<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/scrollview" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_margin="8sp"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <ProgressBar + android:id="@+id/pbProgress" + style="@style/Widget.AppCompat.ProgressBar.Horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:indeterminate="true" + android:visibility="gone" /> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/header_top_first" + android:orientation="horizontal" + android:weightSum="2"> + + <TextView + style="@style/MoneroLabel.Heading" + android:layout_width="0sp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="@string/generate_wallet_label" + android:textAlignment="center" /> + + <TextView + style="@style/MoneroLabel.Heading" + android:layout_width="0sp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="@string/generate_password_label" + android:textAlignment="center" /> + </LinearLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/data_top" + android:orientation="horizontal" + android:weightSum="2"> + + <TextView + android:id="@+id/tvWalletName" + style="@style/MoneroText" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="center" /> + + <TextView + android:id="@+id/tvWalletPassword" + style="@style/MoneroText" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="***" + android:textAlignment="center" /> + </LinearLayout> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/header_top"> + + <TextView + style="@style/MoneroLabel.Heading" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_gravity="center" + android:text="@string/generate_address_label" /> + + <ImageButton + android:id="@+id/bCopyAddress" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:layout_marginEnd="80dp" + android:background="?android:selectableItemBackground" + android:enabled="false" + android:src="@drawable/ic_content_nocopy_black_24dp" /> + </FrameLayout> + + <TextView + android:id="@+id/tvWalletAddress" + style="@style/MoneroText.Monospace" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/data_top" + android:textAlignment="center" /> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/header_top"> + + <TextView + style="@style/MoneroLabel.Heading" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_gravity="center" + android:text="@string/generate_mnemonic_label" /> + + <ImageButton + android:id="@+id/bCopySeed" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:layout_marginEnd="80dp" + android:background="?android:selectableItemBackground" + android:src="@drawable/ic_content_nocopy_black_24dp" /> + </FrameLayout> + + <TextView + android:id="@+id/tvWalletMnemonic" + style="@style/MoneroText.Monospace.Mnemonic" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/data_top" + android:background="@drawable/backgound_seed" + android:textAlignment="center" /> + + <Button + android:id="@+id/bAccept" + style="@style/MoneroButton" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/section_top" + android:text="@string/generate_button_accept" + android:visibility="gone" /> + + <Button + android:id="@+id/bAdvancedInfo" + style="@style/MoneroFab" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_marginTop="@dimen/section_top" + android:background="?android:selectableItemBackground" + android:drawablePadding="4sp" + android:drawableStart="@drawable/ic_add_circle_outline" + android:text="@string/label_wallet_advanced_details" + android:visibility="gone" /> + + <LinearLayout + android:id="@+id/llAdvancedInfo" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/section_top" + android:orientation="vertical" + android:visibility="gone"> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <TextView + style="@style/MoneroLabel.Heading" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_gravity="center" + android:text="@string/generate_viewkey_label" /> + + <ImageButton + android:id="@+id/bCopyViewKey" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:layout_marginEnd="80dp" + android:background="?android:selectableItemBackground" + android:src="@drawable/ic_content_copy_black_24dp" /> + </FrameLayout> + + <TextView + android:id="@+id/tvWalletViewKey" + style="@style/MoneroText.Monospace" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/data_top" + android:textAlignment="center" /> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/header_top"> + + <TextView + style="@style/MoneroLabel.Heading" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_gravity="center" + android:text="@string/generate_spendkey_label" /> + + <ImageButton + android:id="@+id/bCopySepndKey" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:layout_marginEnd="80dp" + android:background="?android:selectableItemBackground" + android:src="@drawable/ic_content_nocopy_black_24dp" /> + </FrameLayout> + + <TextView + android:id="@+id/tvWalletSpendKey" + style="@style/MoneroText.Monospace" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/data_top" + android:textAlignment="center" /> + </LinearLayout> + </LinearLayout> +</ScrollView> \ No newline at end of file diff --git a/app/src/main/res/layout/send_fragment.xml b/app/src/main/res/layout/fragment_send.xml similarity index 60% rename from app/src/main/res/layout/send_fragment.xml rename to app/src/main/res/layout/fragment_send.xml index f104efe5..6c78ab8d 100644 --- a/app/src/main/res/layout/send_fragment.xml +++ b/app/src/main/res/layout/fragment_send.xml @@ -1,39 +1,21 @@ <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/scrollview" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:layout_margin="8sp"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:layout_marginBottom="8sp" - android:weightSum="2"> - - <Spinner - android:id="@+id/sMixin" - style="@style/MoneroSpinner" - android:layout_width="0sp" - android:layout_height="match_parent" - android:layout_weight="1" - android:entries="@array/mixin" - android:textAlignment="center" /> - - <Spinner - android:id="@+id/sPriority" - style="@style/MoneroSpinner" - android:layout_width="0sp" - android:layout_height="match_parent" - android:layout_weight="1" - android:entries="@array/priority" - android:textAlignment="center" /> - - </LinearLayout> + <EditText + android:id="@+id/etDummy" + android:layout_width="0sp" + android:layout_height="0sp" /> <LinearLayout android:layout_width="match_parent" @@ -43,29 +25,43 @@ android:orientation="horizontal" android:weightSum="10"> - <EditText + <android.support.design.widget.TextInputLayout android:id="@+id/etAddress" - style="@style/MoneroEdit" - android:layout_width="0sp" + android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_weight="8" - android:hint="@string/send_address_hint" - android:imeOptions="actionNext" - android:inputType="textMultiLine" - android:textAlignment="center" /> + android:layout_weight="10" + app:counterEnabled="true" + app:counterMaxLength="95" + app:errorEnabled="true"> + + <android.support.design.widget.TextInputEditText + style="@style/MoneroEdit.Medium" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/send_address_hint" + android:imeOptions="actionNext" + android:inputType="textMultiLine" + android:textAlignment="textStart" /> + </android.support.design.widget.TextInputLayout> <Button android:id="@+id/bScan" - style="@style/MoneroButton.Small" - android:layout_width="0sp" - android:layout_height="wrap_content" + style="@style/MoneroText.Button" + android:layout_width="56sp" + android:layout_height="56sp" android:layout_gravity="center" - android:layout_weight="2" - android:enabled="true" - android:minHeight="36sp" + android:layout_marginStart="8sp" + android:background="@drawable/ic_scan" android:text="@string/send_qr_hint" /> </LinearLayout> + <com.m2049r.xmrwallet.layout.ExchangeView + android:id="@+id/evAmount" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="4sp" + android:layout_marginTop="4sp" /> + <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" @@ -74,57 +70,70 @@ android:orientation="horizontal" android:weightSum="10"> - <EditText + <android.support.design.widget.TextInputLayout android:id="@+id/etPaymentId" - style="@style/MoneroEdit" - android:layout_width="0sp" + android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_weight="8" - android:hint="@string/send_paymentid_hint" - android:imeOptions="actionNext" - android:inputType="textMultiLine" - android:textAlignment="center" /> + android:layout_weight="10" + app:counterEnabled="true" + app:counterMaxLength="16" + app:errorEnabled="true"> + + <android.support.design.widget.TextInputEditText + style="@style/MoneroEdit" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="10" + android:hint="@string/send_paymentid_hint" + android:imeOptions="actionDone" + android:inputType="textMultiLine" + android:textAlignment="textStart" /> + </android.support.design.widget.TextInputLayout> <Button android:id="@+id/bPaymentId" - style="@style/MoneroButton.Small" - android:layout_width="0sp" - android:layout_height="wrap_content" + style="@style/MoneroText.Button.Small" + android:layout_width="56dp" + android:layout_height="56sp" android:layout_gravity="center" - android:layout_weight="2" - android:enabled="true" - android:minHeight="36sp" + android:layout_marginStart="8sp" + android:background="?android:selectableItemBackground" + android:drawableTop="@drawable/ic_settings_orange_24dp" android:text="@string/send_generate_paymentid_hint" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="4sp" - android:layout_marginTop="4sp" - android:orientation="horizontal" - android:weightSum="10"> + android:layout_marginBottom="16sp" + android:orientation="horizontal"> - <EditText - android:id="@+id/etAmount" - style="@style/MoneroEdit" - android:layout_width="0sp" + <TextView + style="@style/MoneroLabel.Caps.Stealth.Small" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_weight="8" - android:hint="@string/send_amount_hint" - android:imeOptions="actionDone" - android:inputType="numberDecimal" + android:layout_gravity="center|end" + android:layout_marginEnd="8sp" + android:text="Advanced:" + android:textAlignment="textEnd" /> + + <Spinner + android:id="@+id/sMixin" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="8sp" + android:layout_weight="1" + android:entries="@array/mixin" + android:textAlignment="center" /> + + <Spinner + android:id="@+id/sPriority" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:entries="@array/priority" android:textAlignment="center" /> - <Button - android:id="@+id/bSweep" - style="@style/MoneroButton" - android:layout_width="0sp" - android:layout_height="match_parent" - android:layout_weight="2" - android:enabled="true" - android:text="@string/send_sweep_hint" - android:visibility="invisible" /> </LinearLayout> <Button @@ -134,15 +143,16 @@ android:layout_height="wrap_content" android:layout_marginBottom="4sp" android:layout_marginTop="4sp" - android:enabled="false" + android:enabled="true" android:minHeight="36sp" android:text="@string/send_prepare_hint" /> <ProgressBar android:id="@+id/pbProgress" - style="@style/MoneroProgress" + style="@style/Widget.AppCompat.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" + android:indeterminate="true" android:visibility="gone" /> <LinearLayout @@ -156,7 +166,7 @@ <Button android:id="@+id/bDispose" - style="@style/MoneroButton" + style="@style/MoneroButton.Alert" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4sp" @@ -171,10 +181,10 @@ <TextView android:id="@+id/tvTxAmountLabel" - style="@style/MoneroLabel" + style="@style/MoneroLabel.Caps" android:layout_width="0sp" android:layout_height="wrap_content" - android:layout_marginRight="8sp" + android:layout_marginEnd="8sp" android:layout_weight="1" android:text="@string/send_amount_label" android:textAlignment="textEnd" /> @@ -184,9 +194,10 @@ style="@style/MoneroText" android:layout_width="0sp" android:layout_height="wrap_content" - android:layout_marginLeft="8sp" + android:layout_marginStart="8sp" android:layout_weight="2" - android:textAlignment="textEnd" /> + android:textAlignment="textEnd" + tools:text="143.008000000000" /> </LinearLayout> <LinearLayout @@ -197,22 +208,23 @@ <TextView android:id="@+id/tvTxFeeLabel" - style="@style/MoneroLabel" + style="@style/MoneroLabel.Caps.Gray" android:layout_width="0sp" android:layout_height="wrap_content" - android:layout_marginRight="4sp" + android:layout_marginEnd="4sp" android:layout_weight="1" android:text="@string/send_fee_label" android:textAlignment="textEnd" /> <TextView android:id="@+id/tvTxFee" - style="@style/MoneroText" + style="@style/MoneroText.Gray" android:layout_width="0sp" android:layout_height="wrap_content" - android:layout_marginLeft="8sp" + android:layout_marginStart="8sp" android:layout_weight="2" - android:textAlignment="textEnd" /> + android:textAlignment="textEnd" + tools:text="0.006817000000" /> </LinearLayout> <LinearLayout @@ -222,23 +234,24 @@ android:weightSum="3"> <TextView - android:id="@+id/tvTxDustLabel" - style="@style/MoneroLabel" + android:id="@+id/tvTxTotalLabel" + style="@style/MoneroLabel.Caps.Black" android:layout_width="0sp" android:layout_height="wrap_content" - android:layout_marginRight="8sp" + android:layout_marginEnd="8sp" android:layout_weight="1" - android:text="@string/send_dust_label" + android:text="@string/send_total_label" android:textAlignment="textEnd" /> <TextView - android:id="@+id/tvTxDust" - style="@style/MoneroText" + android:id="@+id/tvTxTotal" + style="@style/MoneroText.Black" android:layout_width="0sp" android:layout_height="wrap_content" android:layout_marginLeft="8sp" android:layout_weight="2" - android:textAlignment="textEnd" /> + android:textAlignment="textEnd" + tools:text="143.014817000000" /> </LinearLayout> <EditText @@ -250,7 +263,7 @@ android:hint="@string/send_notes_hint" android:imeOptions="actionDone" android:inputType="textMultiLine" - android:textAlignment="center" /> + android:textAlignment="textStart" /> <Button android:id="@+id/bSend" @@ -259,6 +272,7 @@ android:layout_height="wrap_content" android:layout_marginBottom="4sp" android:layout_marginTop="4sp" + android:enabled="false" android:minHeight="36sp" android:text="@string/send_send_hint" /> @@ -267,8 +281,10 @@ style="@style/MoneroButton.Alert" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="4sp" - android:layout_marginTop="4sp" + android:layout_marginBottom="8sp" + android:layout_marginTop="16sp" + android:enabled="false" + android:padding="8dp" android:text="@string/send_really_send_hint" android:visibility="gone" /> </LinearLayout> diff --git a/app/src/main/res/layout/tx_fragment.xml b/app/src/main/res/layout/fragment_tx_info.xml similarity index 53% rename from app/src/main/res/layout/tx_fragment.xml rename to app/src/main/res/layout/fragment_tx_info.xml index e6aa4adb..00a43577 100644 --- a/app/src/main/res/layout/tx_fragment.xml +++ b/app/src/main/res/layout/fragment_tx_info.xml @@ -1,14 +1,64 @@ <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_margin="8sp" android:fillViewport="true"> <LinearLayout android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="wrap_content" android:orientation="vertical"> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="16sp"> + + <LinearLayout + android:layout_width="0sp" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_weight="2" + android:gravity="end" + android:orientation="vertical"> + + <TextView + android:id="@+id/tvTxAmount" + style="@style/MoneroText.PosAmount" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:selectAllOnFocus="true" + android:textIsSelectable="true" + tools:text="+ 1,092.00229" /> + + <TextView + android:id="@+id/tvTxFee" + style="@style/MoneroText.PosFee" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:selectAllOnFocus="true" + android:textIsSelectable="true" + tools:text="Fee 0.0003688271" /> + </LinearLayout> + + <TextView + android:id="@+id/tvTxTimestamp" + style="@style/MoneroText.PosDate" + android:layout_width="0sp" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_marginStart="24sp" + android:layout_weight="1" + android:gravity="center" + android:selectAllOnFocus="true" + android:textIsSelectable="true" + tools:text="2017-10-09 12:44:13 +0200" /> + </LinearLayout> + + <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" @@ -17,122 +67,11 @@ <TableRow> <TextView - style="@style/MoneroLabel" - android:gravity="right" + style="@style/MoneroLabel.Small" + android:layout_gravity="center_vertical" + android:gravity="end" android:padding="8sp" - android:text="@string/tx_id" - android:textColor="@color/colorAccent" /> - - <TextView - android:id="@+id/tvTxId" - style="@style/MoneroText" - android:gravity="left" - android:padding="8sp" - android:selectAllOnFocus="true" - android:textIsSelectable="true" /> - </TableRow> - - <TableRow> - - <TextView - style="@style/MoneroLabel" - android:gravity="right" - android:padding="8sp" - android:text="@string/tx_key" - android:textColor="@color/colorAccent" /> - - <TextView - android:id="@+id/tvTxKey" - style="@style/MoneroText" - android:gravity="left" - android:padding="8sp" - android:selectAllOnFocus="true" - android:textIsSelectable="true" /> - </TableRow> - - <TableRow> - - <TextView - style="@style/MoneroLabel" - android:gravity="right" - android:padding="8sp" - android:text="@string/tx_destination" - android:textColor="@color/colorAccent" /> - - <TextView - android:id="@+id/tvDestination" - style="@style/MoneroText" - android:gravity="left" - android:padding="8sp" - android:selectAllOnFocus="true" - android:textIsSelectable="true" /> - </TableRow> - - <TableRow> - - <TextView - style="@style/MoneroLabel" - android:gravity="right" - android:padding="8sp" - android:text="@string/tx_paymentId" - android:textColor="@color/colorAccent" /> - - <TextView - android:id="@+id/tvTxPaymentId" - style="@style/MoneroText" - android:gravity="left" - android:padding="8sp" - android:selectAllOnFocus="true" - android:textIsSelectable="true" /> - </TableRow> - - <TableRow> - - <TextView - style="@style/MoneroLabel" - android:gravity="right" - android:padding="8sp" - android:selectAllOnFocus="true" - android:text="@string/tx_amount" - android:textColor="@color/colorAccent" - android:textIsSelectable="true" /> - - <TextView - android:id="@+id/tvTxAmount" - style="@style/MoneroText" - android:gravity="left" - android:padding="8sp" - android:selectAllOnFocus="true" - android:textIsSelectable="true" /> - </TableRow> - - <TableRow> - - <TextView - style="@style/MoneroLabel" - android:gravity="right" - android:padding="8sp" - android:text="@string/tx_fee" - android:textColor="@color/colorAccent" /> - - <TextView - android:id="@+id/tvTxFee" - style="@style/MoneroText" - android:gravity="left" - android:padding="8sp" - android:selectAllOnFocus="true" - android:textIsSelectable="true" /> - </TableRow> - - <TableRow> - - <TextView - style="@style/MoneroLabel" - android:gravity="right" - android:padding="8sp" - android:text="@string/tx_notes" - android:textColor="@color/colorAccent" /> - + android:text="@string/tx_notes" /> <LinearLayout android:layout_width="match_parent" @@ -148,7 +87,7 @@ android:layout_weight="8" android:hint="@string/tx_notes_hint" android:inputType="textMultiLine" - android:textAlignment="textStart"/> + android:textAlignment="textStart" /> <Button android:id="@+id/bTxNotes" @@ -159,7 +98,7 @@ android:layout_marginTop="8sp" android:layout_weight="2" android:enabled="true" - android:text="@string/tx_button_notes"/> + android:text="@string/tx_button_notes" /> </LinearLayout> </TableRow> @@ -167,35 +106,88 @@ <TableRow> <TextView - style="@style/MoneroLabel" - android:gravity="right" + style="@style/MoneroLabel.Small" + android:layout_gravity="center_vertical" + android:gravity="end" android:padding="8sp" - android:text="@string/tx_timestamp" - android:textColor="@color/colorAccent" /> + android:text="@string/tx_destination" /> <TextView - android:id="@+id/tvTxTimestamp" + android:id="@+id/tvDestination" style="@style/MoneroText" - android:gravity="left" + android:gravity="start" android:padding="8sp" android:selectAllOnFocus="true" android:textIsSelectable="true" /> </TableRow> + <TableRow> + + <TextView + style="@style/MoneroLabel.Small" + android:layout_gravity="center_vertical" + android:gravity="end" + android:padding="8sp" + android:text="@string/tx_paymentId" /> + + <TextView + android:id="@+id/tvTxPaymentId" + style="@style/MoneroText" + android:gravity="start" + android:padding="8sp" + android:selectAllOnFocus="true" + android:textIsSelectable="true" /> + </TableRow> <TableRow> <TextView - style="@style/MoneroLabel" - android:gravity="right" + style="@style/MoneroLabel.Small" + android:layout_gravity="center_vertical" + android:gravity="end" android:padding="8sp" - android:text="@string/tx_blockheight" - android:textColor="@color/colorAccent" /> + android:text="@string/tx_id" /> + + <TextView + android:id="@+id/tvTxId" + style="@style/MoneroText" + android:gravity="start" + android:padding="8sp" + android:selectAllOnFocus="true" + android:textIsSelectable="true" /> + </TableRow> + + <TableRow> + + <TextView + style="@style/MoneroLabel.Small" + android:layout_gravity="center_vertical" + android:gravity="end" + android:padding="8sp" + android:text="@string/tx_key" /> + + <TextView + android:id="@+id/tvTxKey" + style="@style/MoneroText" + android:gravity="start" + android:padding="8sp" + android:selectAllOnFocus="true" + android:textIsSelectable="true" /> + </TableRow> + + <TableRow> + + <TextView + style="@style/MoneroLabel.Small" + android:layout_gravity="center_vertical" + android:gravity="end" + android:padding="8sp" + android:text="@string/tx_blockheight" /> <TextView android:id="@+id/tvTxBlockheight" style="@style/MoneroText" - android:gravity="left" + android:gravity="start" android:padding="8sp" android:selectAllOnFocus="true" android:textIsSelectable="true" /> @@ -204,16 +196,16 @@ <TableRow> <TextView - style="@style/MoneroLabel" - android:gravity="right" + style="@style/MoneroLabel.Small" + android:layout_gravity="center_vertical" + android:gravity="end" android:padding="8sp" - android:text="@string/tx_transfers" - android:textColor="@color/colorAccent" /> + android:text="@string/tx_transfers" /> <TextView android:id="@+id/tvTxTransfers" style="@style/MoneroText" - android:gravity="left" + android:gravity="start" android:padding="8sp" android:selectAllOnFocus="true" android:textIsSelectable="true" /> @@ -221,15 +213,5 @@ </TableRow> </TableLayout> - - <Button - android:id="@+id/bCopy" - style="@style/MoneroButton" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="8sp" - android:enabled="false" - android:text="@string/tx_button_copy" /> - </LinearLayout> </ScrollView> \ 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 new file mode 100644 index 00000000..c200ded9 --- /dev/null +++ b/app/src/main/res/layout/fragment_wallet.xml @@ -0,0 +1,162 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_margin="8sp" + android:orientation="vertical"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center" + android:orientation="horizontal"> + + <FrameLayout + android:id="@+id/flExchange" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_marginEnd="0sp" + android:layout_marginStart="8sp" + android:visibility="gone"> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:src="@drawable/ic_traffic" /> + + <ProgressBar + android:id="@+id/pbExchange" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:indeterminate="true" /> + </FrameLayout> + + <TextView + android:id="@+id/tvBalance" + style="@style/MoneroText.Balance" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="center" + android:visibility="visible" + tools:text="1099700.23001" /> + + <Spinner + android:id="@+id/sCurrency" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:entries="@array/currency" + android:gravity="center" + android:paddingBottom="0dp" + android:paddingEnd="4dp" + android:paddingStart="4dp" + android:paddingTop="0dp" + tools:listitem="@layout/item_spinner" /> + </LinearLayout> + + <TextView + android:id="@+id/tvUnconfirmedAmount" + style="@style/MoneroText.Unconfirmed" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:gravity="center" + tools:text="+ 0.00 unconfirmed" /> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/header_top_first" + android:gravity="center" + android:orientation="horizontal"> + + <ImageView + android:id="@+id/ivSynced" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="8sp" + android:src="@drawable/ic_done_all" + android:visibility="gone" /> + + <TextView + android:id="@+id/tvProgress" + style="@style/MoneroText.Medium" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:visibility="visible" + tools:text="Synced 1 410 674 blocks" /> + </LinearLayout> + + <ProgressBar + android:id="@+id/pbProgress" + style="@style/Widget.AppCompat.ProgressBar.Horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:indeterminate="true" + android:visibility="invisible" /> + + </LinearLayout> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <android.support.v7.widget.RecyclerView xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/list" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:clipToPadding="false" + android:paddingBottom="72dp" + app:layoutManager="LinearLayoutManager" + tools:listitem="@layout/item_transaction" /> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="bottom" + android:layout_margin="4dp" + android:orientation="horizontal" + android:weightSum="2"> + + <Button + android:id="@+id/bReceive" + style="@style/MoneroButton.Take" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_margin="8dp" + android:layout_weight="1" + android:drawableStart="@drawable/ic_hand" + android:enabled="true" + android:paddingEnd="16dp" + android:paddingStart="16dp" + android:text="@string/label_wallet_receive" + android:visibility="visible" /> + + <Button + android:id="@+id/bSend" + style="@style/MoneroButton.Give" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_margin="8dp" + android:layout_weight="1" + android:drawableStart="@drawable/ic_send" + android:enabled="true" + android:paddingEnd="16dp" + android:paddingStart="16dp" + android:text="@string/label_wallet_send" + android:visibility="invisible" /> + + </LinearLayout> + </FrameLayout> +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/gen_fragment.xml b/app/src/main/res/layout/gen_fragment.xml deleted file mode 100644 index d6b3273e..00000000 --- a/app/src/main/res/layout/gen_fragment.xml +++ /dev/null @@ -1,112 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:weightSum="2"> - - <EditText - android:id="@+id/etWalletName" - style="@style/MoneroEdit" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:hint="@string/generate_name_hint" - android:imeOptions="actionNext" - android:inputType="text" - android:maxLines="1" - android:textAlignment="center" /> - - <EditText - android:id="@+id/etWalletPassword" - style="@style/MoneroEdit" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:hint="@string/generate_password_hint" - android:imeOptions="actionNext" - android:inputType="text" - android:textAlignment="center" /> - </LinearLayout> - - <EditText - android:id="@+id/etWalletMnemonic" - style="@style/MoneroEdit" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/generate_mnemonic_hint" - android:imeOptions="actionNext" - android:inputType="textMultiLine" - android:textAlignment="center" /> - - <EditText - android:id="@+id/etWalletAddress" - style="@style/MoneroEdit" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/generate_address_hint" - android:imeOptions="actionNext" - android:inputType="textMultiLine" - android:textAlignment="center" /> - - <LinearLayout - android:id="@+id/llRestoreKeys" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center" - android:orientation="vertical" - android:visibility="gone"> - - <EditText - android:id="@+id/etWalletViewKey" - style="@style/MoneroEdit" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/generate_viewkey_hint" - android:imeOptions="actionNext" - android:inputType="textMultiLine" - android:textAlignment="center" /> - - <EditText - android:id="@+id/etWalletSpendKey" - style="@style/MoneroEdit" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/generate_spendkey_hint" - android:imeOptions="actionNext" - android:inputType="textMultiLine" - android:textAlignment="center" /> - </LinearLayout> - - <EditText - android:id="@+id/etWalletRestoreHeight" - style="@style/MoneroEdit" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/generate_restoreheight_hint" - android:imeOptions="actionDone" - android:inputType="number" - android:textAlignment="center" - android:visibility="gone" /> - - <Button - android:id="@+id/bGenerate" - style="@style/MoneroButton" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="8dp" - android:layout_marginTop="8dp" - android:enabled="false" - android:text="@string/generate_buttonGenerate" /> - - </LinearLayout> -</ScrollView> \ No newline at end of file diff --git a/app/src/main/res/layout/gen_review_fragment.xml b/app/src/main/res/layout/gen_review_fragment.xml deleted file mode 100644 index f3ac4144..00000000 --- a/app/src/main/res/layout/gen_review_fragment.xml +++ /dev/null @@ -1,146 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <ProgressBar - android:id="@+id/pbProgress" - style="@android:style/Widget.ProgressBar.Horizontal" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="8sp" - android:visibility="invisible" /> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:weightSum="2"> - - <TextView - android:id="@+id/tvWalletLabel" - style="@style/MoneroLabel" - android:layout_width="0sp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:text="@string/generate_wallet_label" - android:textAlignment="center" /> - - <TextView - android:id="@+id/tvWalletPasswordLabel" - style="@style/MoneroLabel" - android:layout_width="0sp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:text="@string/generate_password_label" - android:textAlignment="center" /> - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="8dp" - android:orientation="horizontal" - android:weightSum="2"> - - <TextView - android:id="@+id/tvWalletName" - style="@style/MoneroText" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:textAlignment="center" /> - - <TextView - android:id="@+id/tvWalletPassword" - style="@style/MoneroText" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:text="***" - android:textAlignment="center" /> - </LinearLayout> - - <TextView - android:id="@+id/tvWalletMnemonicLabel" - style="@style/MoneroLabel" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/generate_mnemonic_label" - android:textAlignment="center" /> - - <TextView - android:id="@+id/tvWalletMnemonic" - style="@style/MoneroText" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:textAlignment="center" /> - - <TextView - android:id="@+id/tvWalletAddressLabel" - style="@style/MoneroLabel" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:text="@string/generate_address_label" - android:textAlignment="center" /> - - <TextView - android:id="@+id/tvWalletAddress" - style="@style/MoneroText" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:selectAllOnFocus="true" - android:textAlignment="center" - android:textIsSelectable="true" /> - - <TextView - android:id="@+id/tvWalletViewKeyLabel" - style="@style/MoneroLabel" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:text="@string/generate_viewkey_label" - android:textAlignment="center" /> - - <TextView - android:id="@+id/tvWalletViewKey" - style="@style/MoneroText" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:selectAllOnFocus="true" - android:textAlignment="center" - android:textIsSelectable="true" /> - - <TextView - android:id="@+id/tvWalletSpendKeyLabel" - style="@style/MoneroLabel" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:text="@string/generate_spendkey_label" - android:textAlignment="center" /> - - <TextView - android:id="@+id/tvWalletSpendKey" - style="@style/MoneroText" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:textAlignment="center" - android:textIsSelectable="true" /> - - <Button - android:id="@+id/bAccept" - style="@style/MoneroButton" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="16dp" - android:text="@string/generate_button_accept" - android:visibility="gone" /> - </LinearLayout> -</ScrollView> \ No newline at end of file diff --git a/app/src/main/res/layout/item_spinner.xml b/app/src/main/res/layout/item_spinner.xml new file mode 100644 index 00000000..17e59505 --- /dev/null +++ b/app/src/main/res/layout/item_spinner.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<TextView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@android:id/text1" + style="@style/MoneroSpinnerItem.Balance" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ellipsize="marquee" + android:singleLine="true" + android:textAlignment="center" + tools:text="XMR" /> diff --git a/app/src/main/res/layout/item_transaction.xml b/app/src/main/res/layout/item_transaction.xml new file mode 100644 index 00000000..fab42544 --- /dev/null +++ b/app/src/main/res/layout/item_transaction.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:card_view="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/card" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_margin="4dp" + card_view:cardCornerRadius="1dp" + card_view:cardElevation="4dp"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="8dp"> + + <LinearLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_weight="11" + android:orientation="vertical"> + + <TextView + android:id="@+id/tx_amount" + style="@style/MoneroText.PosAmount" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="end" + tools:text="999999.99999" /> + + <TextView + android:id="@+id/tx_fee" + style="@style/MoneroText.PosFee" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="end" + tools:text="Fee 0.06817" /> + </LinearLayout> + + <TextView + android:id="@+id/tx_paymentid" + style="@style/MoneroText.PosNote" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_marginEnd="16sp" + android:layout_marginStart="16sp" + android:layout_weight="13" + android:gravity="start" + android:text="0123456789abcdef" /> + + <TextView + android:id="@+id/tx_datetime" + style="@style/MoneroText.PosDate" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_weight="6" + android:gravity="center" + android:text="2017-05-22 21:32" /> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:src="@drawable/ic_navigate_next_black_24dp" /> + </LinearLayout> +</android.support.v7.widget.CardView> 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..74056e73 --- /dev/null +++ b/app/src/main/res/layout/item_wallet.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:card_view="http://schemas.android.com/apk/res-auto" + android:id="@+id/card_view" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_margin="16dp" + card_view:cardCornerRadius="1dp" + card_view:cardElevation="8dp"> + + <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:background="@drawable/selector_login" + android:orientation="horizontal"> + + <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="32dp" + android:layout_marginRight="32dp" + android:orientation="vertical" + android:padding="16dp"> + + <TextView + android:id="@+id/tvName" + style="@style/MoneroText.Label" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="My Wallet" /> + + <TextView + android:id="@+id/tvAddress" + style="@style/MoneroText.Small" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/tvName" + android:text="4AdkPJox...g3viqCuk" /> + </RelativeLayout> + + <ImageButton + android:id="@+id/ibOptions" + style="?android:attr/actionOverflowButtonStyle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentEnd="true" + android:layout_centerInParent="true" /> + </RelativeLayout> +</android.support.v7.widget.CardView> \ No newline at end of file diff --git a/app/src/main/res/layout/layout_fabmenu.xml b/app/src/main/res/layout/layout_fabmenu.xml new file mode 100644 index 00000000..0be2fa22 --- /dev/null +++ b/app/src/main/res/layout/layout_fabmenu.xml @@ -0,0 +1,166 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <FrameLayout + android:id="@+id/fabScreen" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="#CCffffff" + android:visibility="invisible"> + + <RelativeLayout + android:id="@+id/fabNewL" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|end" + android:layout_marginBottom="224dp" + android:layout_marginEnd="16dp"> + + <TextView + android:id="@+id/fabNewT" + style="@style/MoneroFab" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_marginEnd="8dp" + android:text="@string/fab_create_new" /> + + <android.support.design.widget.FloatingActionButton + android:id="@+id/fabNew" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="8dp" + android:layout_toEndOf="@+id/fabNewT" + android:backgroundTint="@color/gradientPink" + android:elevation="6dp" + android:src="@drawable/ic_new" + app:borderWidth="0dp" + app:fabSize="mini" + app:pressedTranslationZ="12dp" /> + + </RelativeLayout> + + <RelativeLayout + android:id="@+id/fabViewL" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|end" + android:layout_marginBottom="176dp" + android:layout_marginEnd="16dp"> + + <TextView + android:id="@+id/fabViewT" + style="@style/MoneroFab" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_marginEnd="8dp" + android:text="@string/fab_restore_viewonly" /> + + <android.support.design.widget.FloatingActionButton + android:id="@+id/fabView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="8dp" + android:layout_toEndOf="@+id/fabViewT" + android:backgroundTint="@color/gradientPink" + android:elevation="6dp" + android:src="@drawable/ic_eye" + app:borderWidth="0dp" + app:fabSize="mini" + app:pressedTranslationZ="12dp" /> + + </RelativeLayout> + + <RelativeLayout + android:id="@+id/fabKeyL" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|end" + android:layout_marginBottom="128dp" + android:layout_marginEnd="16dp"> + + <TextView + android:id="@+id/fabKeyT" + style="@style/MoneroFab" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_marginEnd="8dp" + android:text="@string/fab_restore_key" /> + + <android.support.design.widget.FloatingActionButton + android:id="@+id/fabKey" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="8dp" + android:layout_toEndOf="@+id/fabKeyT" + android:backgroundTint="@color/gradientPink" + android:elevation="6dp" + android:src="@drawable/ic_key" + app:borderWidth="0dp" + app:fabSize="mini" + app:pressedTranslationZ="12dp" /> + + </RelativeLayout> + + <RelativeLayout + android:id="@+id/fabSeedL" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|end" + android:layout_marginBottom="80dp" + android:layout_marginEnd="16dp"> + + <TextView + android:id="@+id/fabSeedT" + style="@style/MoneroFab" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_marginEnd="8dp" + android:text="@string/fab_restore_seed" /> + + <android.support.design.widget.FloatingActionButton + android:id="@+id/fabSeed" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="8dp" + android:layout_toEndOf="@+id/fabSeedT" + android:backgroundTint="@color/gradientPink" + android:elevation="6dp" + android:src="@drawable/ic_seed" + app:borderWidth="0dp" + app:fabSize="mini" + app:pressedTranslationZ="12dp" /> + + </RelativeLayout> + + </FrameLayout> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|end" + android:layout_margin="16dp" + android:background="@drawable/gradient_oval" + android:elevation="6dp"> + + <android.support.design.widget.FloatingActionButton + android:id="@+id/fab" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|end" + android:backgroundTint="@android:color/transparent" + android:backgroundTintMode="src_in" + android:src="@drawable/ic_add_white_24dp" + app:borderWidth="0dp" + app:elevation="0dp" + app:fabSize="normal" + app:pressedTranslationZ="0dp" /> + </LinearLayout> + +</FrameLayout> diff --git a/app/src/main/res/layout/login_fragment.xml b/app/src/main/res/layout/login_fragment.xml deleted file mode 100644 index de59e618..00000000 --- a/app/src/main/res/layout/login_fragment.xml +++ /dev/null @@ -1,47 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <EditText - android:id="@+id/etDummy" - android:layout_width="0sp" - android:layout_height="0sp" /> - - <com.m2049r.xmrwallet.layout.DropDownEditText - android:id="@+id/etDaemonAddress" - style="@style/MoneroEdit" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center" - android:hint="@string/prompt_daemon" - android:imeOptions="actionDone" - android:inputType="textWebEmailAddress|textNoSuggestions" - android:maxLines="1" - android:textIsSelectable="true" /> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <ListView - android:id="@+id/list" - style="@style/MoneroListView" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="4dp" /> - - <android.support.design.widget.FloatingActionButton xmlns:app="http://schemas.android.com/apk/res-auto" - android:id="@+id/fabAdd" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="bottom|end" - android:layout_margin="16sp" - android:src="@drawable/ic_add_black_24dp" - app:elevation="6dp" - app:fabSize="auto" - app:pressedTranslationZ="12dp" /> - </FrameLayout> - -</LinearLayout> diff --git a/app/src/main/res/layout/prompt_password.xml b/app/src/main/res/layout/prompt_password.xml index 8eb7222d..24c9f450 100644 --- a/app/src/main/res/layout/prompt_password.xml +++ b/app/src/main/res/layout/prompt_password.xml @@ -1,29 +1,24 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/layout_root" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp"> - <TextView - android:id="@+id/tvPasswordLabel" - style="@style/MoneroLabel" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:labelFor="@+id/etPassword" - android:text="@string/prompt_password" - android:textAppearance="?android:attr/textAppearanceLarge" /> - - <EditText + <android.support.design.widget.TextInputLayout android:id="@+id/etPassword" - style="@style/MoneroEdit" android:layout_width="match_parent" android:layout_height="wrap_content" - android:imeOptions="normal" - android:inputType="textPassword"> + app:errorEnabled="true"> + <android.support.design.widget.TextInputEditText + style="@style/MoneroEdit" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:imeOptions="normal" + android:inputType="textPassword" /> - </EditText> - + </android.support.design.widget.TextInputLayout> </LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/receive_fragment.xml b/app/src/main/res/layout/receive_fragment.xml deleted file mode 100644 index 8d110439..00000000 --- a/app/src/main/res/layout/receive_fragment.xml +++ /dev/null @@ -1,129 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@color/moneroBlack" - android:orientation="vertical"> - - <ProgressBar - android:id="@+id/pbProgress" - style="@android:style/Widget.ProgressBar.Horizontal" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="8sp" - android:progressBackgroundTint="@color/colorPrimaryDark" - android:progressTint="@color/colorPrimary" - android:visibility="gone" /> - - <TextView - android:id="@+id/tvAddress" - style="@style/MoneroText" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="4sp" - android:layout_marginTop="4sp" - android:hint="@string/send_address_hint" - android:selectAllOnFocus="true" - android:textAlignment="center" - android:textIsSelectable="true" /> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="4sp" - android:layout_marginTop="4sp" - android:orientation="horizontal" - android:weightSum="10"> - - <EditText - android:id="@+id/etPaymentId" - style="@style/MoneroEdit" - android:layout_width="0sp" - android:layout_height="wrap_content" - android:layout_weight="8" - android:enabled="false" - android:hint="@string/receive_paymentid_hint" - android:imeOptions="actionNext" - android:inputType="textMultiLine" - android:textAlignment="center" /> - - <Button - android:id="@+id/bPaymentId" - style="@style/MoneroButton.Small" - android:layout_width="0sp" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:layout_weight="2" - android:enabled="false" - android:minHeight="36sp" - android:text="@string/receive_paymentid_button" /> - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="4sp" - android:layout_marginTop="4sp" - android:orientation="horizontal"> - - <EditText - android:id="@+id/etAmountA" - style="@style/MoneroEdit" - android:layout_width="0sp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:hint="@string/receive_amount_hint" - android:imeOptions="actionDone" - android:inputType="numberDecimal" - android:textAlignment="textEnd" /> - - <Spinner - android:id="@+id/sCurrencyA" - style="@style/MoneroSpinner" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:entries="@array/currency" - android:textAlignment="center" /> - - <TextView - android:id="@+id/tvAmountB" - style="@style/MoneroText" - android:layout_width="0sp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:textAlignment="textEnd" /> - - <Spinner - android:id="@+id/sCurrencyB" - style="@style/MoneroSpinner" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:entries="@array/currency" - android:textAlignment="center" /> - - </LinearLayout> - - <Button - android:id="@+id/bGenerate" - style="@style/MoneroButton" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="4sp" - android:layout_marginTop="4sp" - android:enabled="false" - android:minHeight="36sp" - android:text="@string/receive_generate_hint" /> - - <ImageView - android:id="@+id/qrCode" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:layout_margin="16sp" - android:adjustViewBounds="true" /> - - <EditText - android:id="@+id/etDummy" - android:layout_width="0sp" - android:layout_height="0sp" /> - -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/toolbar.xml b/app/src/main/res/layout/toolbar.xml deleted file mode 100644 index 12c9e089..00000000 --- a/app/src/main/res/layout/toolbar.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:local="http://schemas.android.com/apk/res-auto" - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="?attr/colorPrimary" - android:minHeight="?attr/actionBarSize" - local:popupTheme="@style/ThemeOverlay.AppCompat.Light" - local:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" /> \ No newline at end of file diff --git a/app/src/main/res/layout/transaction_item.xml b/app/src/main/res/layout/transaction_item.xml deleted file mode 100644 index 5368b7d2..00000000 --- a/app/src/main/res/layout/transaction_item.xml +++ /dev/null @@ -1,70 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/card" - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/moneroBlack" - android:orientation="vertical" - android:padding="8dp"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:weightSum="2"> - - <TextView - android:id="@+id/tx_amount" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:gravity="right" - android:text="9999999.99999" - android:textColor="@color/moneroOrange" - android:textSize="20dp" /> - - <TextView - android:id="@+id/tx_datetime" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:gravity="right" - android:text="2017-05-22 21:32" - android:textColor="@color/textColorPrimary" - android:textSize="20dp" /> - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:weightSum="2"> - - <TextView - android:id="@+id/tx_fee" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:gravity="right" - android:text="9999999.99999" - android:textColor="@color/moneroOrange" - android:textSize="16dp" /> - - <TextView - android:id="@+id/tx_paymentid" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:gravity="right" - android:text="0123456789abcdef" - android:textColor="@color/textColorPrimary" - android:textSize="16dp" /> - </LinearLayout> - - </LinearLayout> -</android.support.v7.widget.CardView> diff --git a/app/src/main/res/layout/view_exchange.xml b/app/src/main/res/layout/view_exchange.xml new file mode 100644 index 00000000..a8cf6cd9 --- /dev/null +++ b/app/src/main/res/layout/view_exchange.xml @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="utf-8"?> +<merge xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + + <com.m2049r.xmrwallet.layout.CTextInputLayout + android:id="@+id/etAmount" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="3" + app:counterEnabled="false" + app:errorEnabled="true"> + + <android.support.design.widget.TextInputEditText + style="@style/MoneroEdit" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="end" + android:hint="@string/receive_amount_hint" + android:imeOptions="actionDone" + android:inputType="numberDecimal" + tools:text="87.00000" /> + + </com.m2049r.xmrwallet.layout.CTextInputLayout> + + <Spinner + android:id="@+id/sCurrencyA" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_marginStart="4dp" + android:entries="@array/currency" + android:gravity="center" + android:paddingBottom="8dp" + android:paddingTop="8dp" + android:textAlignment="center" /> + + <FrameLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_marginEnd="0sp" + android:layout_marginStart="8sp"> + + <ImageView + android:id="@+id/evExchange" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:src="@drawable/ic_traffic" /> + + <ProgressBar + android:id="@+id/pbExchange" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:indeterminate="true" + android:visibility="invisible" /> + </FrameLayout> + + <TextView + android:id="@+id/tvAmountB" + style="@style/MoneroText" + android:layout_width="0sp" + android:layout_height="wrap_content" + android:layout_gravity="center|end" + android:layout_weight="3" + android:singleLine="true" + android:text="--" + android:textAlignment="textEnd" + tools:text="87.00000" /> + + <Spinner + android:id="@+id/sCurrencyB" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_marginStart="4dp" + android:entries="@array/currency" + android:gravity="center" + android:paddingBottom="8dp" + android:paddingTop="8dp" + android:textAlignment="center" /> + +</merge> + diff --git a/app/src/main/res/layout/view_toolbar.xml b/app/src/main/res/layout/view_toolbar.xml new file mode 100644 index 00000000..e37e1a61 --- /dev/null +++ b/app/src/main/res/layout/view_toolbar.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="utf-8"?> +<merge xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools"> + + <Button + android:id="@+id/bDonate" + style="@style/ToolBarStyle.ActionButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:drawableStart="@drawable/ic_favorite_white_24dp" + android:text="@string/label_donate" /> + + <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_gravity="center"> + + <ImageView + android:id="@+id/toolbarImage" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_gravity="center" + android:layout_marginTop="-4dp" + android:src="@drawable/ic_logo_horizontol_xmrujo" + android:visibility="visible" /> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_gravity="center" + android:orientation="vertical"> + + <TextView + android:id="@+id/toolbarTitle" + style="@style/MoneroLabel.Title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:gravity="center" + android:visibility="invisible" + tools:text="monerujo" /> + + <TextView + android:id="@+id/toolbarSubtitle" + style="@style/MoneroLabel.Subtitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_marginTop="-4dp" + android:visibility="invisible" + tools:text="monerujo" /> + </LinearLayout> + </FrameLayout> +</merge> \ No newline at end of file diff --git a/app/src/main/res/layout/wallet_fragment.xml b/app/src/main/res/layout/wallet_fragment.xml deleted file mode 100644 index 05736915..00000000 --- a/app/src/main/res/layout/wallet_fragment.xml +++ /dev/null @@ -1,110 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@color/moneroBlack" - android:orientation="vertical"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/moneroOrange" - android:orientation="vertical" - android:paddingBottom="8sp"> - - <android.support.constraint.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/clProgress" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:visibility="gone" - app:layout_constraintTop_toTopOf="parent"> - - <ProgressBar - android:id="@+id/pbProgress" - style="@style/MoneroProgress" - android:layout_width="0sp" - android:layout_height="wrap_content" - android:layout_marginLeft="8dp" - android:layout_marginRight="8dp" - android:progress="0" - app:layout_constraintBottom_toBottomOf="@+id/tvProgress" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toTopOf="@+id/tvProgress" /> - - <TextView - android:id="@+id/tvProgress" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:gravity="center" - android:text="Loading..." - android:textColor="@color/moneroWhite" - android:textSize="16sp" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" /> - </android.support.constraint.ConstraintLayout> - - <TextView - android:id="@+id/tvBlockHeightProgress" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginRight="8sp" - android:gravity="right" - android:text="Loading..." - android:textSize="12sp" - android:visibility="visible" /> - - <TextView - android:id="@+id/tvBalance" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center" - android:text="00000000.000000000000 XMR" - android:textColor="@color/white" - android:textSize="24sp" /> - - <TextView - android:id="@+id/tvUnconfirmedAmount" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center" - android:text="+00000000.000000000000 unconfirmed" - android:textColor="@color/tx_pending" - android:textSize="16sp" /> - </LinearLayout> - - <android.support.constraint.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <android.support.v7.widget.RecyclerView xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/list" - android:layout_width="0dp" - android:layout_height="0dp" - app:layoutManager="LinearLayoutManager" - app:layout_constraintBottom_toTopOf="@+id/bSend" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toTopOf="parent" - tools:listitem="@layout/transaction_item" /> - - <Button - android:id="@+id/bSend" - style="@style/MoneroButton" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:enabled="true" - android:text="@string/wallet_send_hint" - android:visibility="gone" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" /> - - </android.support.constraint.ConstraintLayout> - -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/menu/create_wallet_menu.xml b/app/src/main/res/menu/create_wallet_menu.xml index 938ac7fb..dab0fd35 100644 --- a/app/src/main/res/menu/create_wallet_menu.xml +++ b/app/src/main/res/menu/create_wallet_menu.xml @@ -4,7 +4,7 @@ <item android:id="@+id/action_create_help" - android:icon="@drawable/ic_help_black_24dp" + android:icon="@drawable/ic_help_white_24dp" android:orderInCategory="100" android:title="@string/menu_help" app:showAsAction="always" /> diff --git a/app/src/main/res/menu/list_context_menu.xml b/app/src/main/res/menu/list_context_menu.xml index d52b7a95..83336987 100644 --- a/app/src/main/res/menu/list_context_menu.xml +++ b/app/src/main/res/menu/list_context_menu.xml @@ -3,7 +3,7 @@ <item android:id="@+id/action_info" - android:icon="@drawable/ic_info_black_24dp" + android:icon="@drawable/ic_info_white_24dp" android:title="@string/menu_info" /> <item diff --git a/app/src/main/res/menu/list_menu.xml b/app/src/main/res/menu/list_menu.xml index 4880d3f6..af2635fe 100644 --- a/app/src/main/res/menu/list_menu.xml +++ b/app/src/main/res/menu/list_menu.xml @@ -11,7 +11,7 @@ <item android:id="@+id/action_lincense_info" - android:icon="@drawable/ic_info_black_24dp" + android:icon="@drawable/ic_info_white_24dp" android:orderInCategory="200" android:title="@string/menu_about" app:showAsAction="never" /> diff --git a/app/src/main/res/menu/tx_info_menu.xml b/app/src/main/res/menu/tx_info_menu.xml new file mode 100644 index 00000000..e50c8254 --- /dev/null +++ b/app/src/main/res/menu/tx_info_menu.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + <item + android:id="@+id/action_share" + android:icon="@drawable/ic_share_white_24dp" + android:orderInCategory="100" + android:title="@string/menu_help" + app:showAsAction="always" /> + +</menu> \ No newline at end of file diff --git a/app/src/main/res/menu/wallet_details_menu.xml b/app/src/main/res/menu/wallet_details_menu.xml index 0ab31c15..794aaebf 100644 --- a/app/src/main/res/menu/wallet_details_menu.xml +++ b/app/src/main/res/menu/wallet_details_menu.xml @@ -4,7 +4,7 @@ <item android:id="@+id/action_details_help" - android:icon="@drawable/ic_help_black_24dp" + android:icon="@drawable/ic_help_white_24dp" android:orderInCategory="100" android:title="@string/menu_help" app:showAsAction="always" /> diff --git a/app/src/main/res/menu/wallet_menu.xml b/app/src/main/res/menu/wallet_menu.xml index 1c2e90f2..2dc76172 100644 --- a/app/src/main/res/menu/wallet_menu.xml +++ b/app/src/main/res/menu/wallet_menu.xml @@ -3,17 +3,17 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> <item - android:id="@+id/action_info" - android:icon="@drawable/ic_info_black_24dp" - android:orderInCategory="100" - android:title="@string/menu_info" - app:showAsAction="always" /> + android:id="@+id/action_donate" + android:icon="@drawable/ic_favorite_white_24dp" + android:orderInCategory="10" + android:title="@string/label_donate" + app:showAsAction="always|withText" /> <item - android:id="@+id/action_receive" - android:icon="@drawable/ic_monero_qr_24dp" + android:id="@+id/action_info" + android:icon="@drawable/ic_info_white_24dp" android:orderInCategory="100" - android:title="@string/menu_receive" - app:showAsAction="always" /> + android:title="@string/menu_info" + app:showAsAction="ifRoom" /> </menu> \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index d8c8f334c38ed4d128786cb74822f5794c13c5df..1cde97fd033d8c307e0f86f471a73bd4526a158c 100644 GIT binary patch literal 7294 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 Y0lm5`LqW%jKmY&$07*qoM6N<$f*TL^3jhEB literal 6962 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 A)Bpeg diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png index 0df3628e0e2662a87d9660dc25e58e7b36f1b8ca..1026166cad46a8747857637a48e0a430e09180db 100644 GIT binary patch literal 3867 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 literal 3747 zcmV;U4qWkxP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000hZNkl<Zc-rlm zX>66(na2Y*tMP)(=H15ozV9~PZES38V;js4AtWT7QIgUbrZa6i>8PS=(^XxhO7kTX zrD{i+rXSi5qfApJQlwU?Mw(VG#s*@8!SB9a+XSQkJm<XUzW0)*sc*lK553Y6AYE~P z&;R|O=lP%WKJmogKA++bfGAqgk9kG?HQ*cB`V<MdexC3z(%+M4Wzb50OpE<?(#NrV zBE0g%vtUcw@C=lV&p?iPn$|@q(N96$L~HW}s9T<dy!9O9ZD*luKLaJ^G}PErP~%QO zjXw@GVG3H}F{nwC&~{Bg+j9ik-ZAL=Mxdn(!$=*1k$wnz#sJK$gD|rDpy%|!%I$`g z-wC6j9ahl+SS78nN?Tx;H{mZ95h~yklns}#wDD<L7kzkn(*?+z&qLmFPQVlRb^?z% z1!c!c$Z^LZ$4@~?An=_>34Q|Vu5l>4$Dr;Vg(l$DR02;QgqCp-T4q1N_rf4}Ew>YT zeg|}d*9l%PZiPYcMp+Zo@_JUlhCf?CaI@I9y-Ox|iQr{gQq)tBqAx(&M2c^I63UkI zKD<ouihx&0d4-f`@XF3fA70&k1PZ}(<&%e@lk#es2X7F(M)3N62HyoeuLCB*n*yFG zZ;|q5MFXUYTD<elJIUd!A1xr7{W(27ohOrRBvPKiGvyVo{F9JKd1>oeNCYp1!^blC zN0nCuysvyRQ+^0K!K(zXbLIP>?eB(8@J60z8-w7D;x?EBZ<aCmM%Y#LkSeS3=9_O8 zhqHcc0q?&1Za(w9M7EKA+mQOCyh6$=zUNOtX10kX+r&+A&vW?1Fx%`2hd%_3;F;%{ zZFJ^&p?nZtFJ#KMK`-%aV-UPiSr4na7IJkZUVr`dl64gz3wWlyBH)7?R{n_cYMf^q znQWsaPWrY9hu4H{7(7#6%kpfabK8XAx$-4U`DR!IZ*llK*tIo~Ys>NKtFM->?+HX- z<erzfZ9I4-yxRnABj7#dC!r*bLkojf8GOnRDSrrRx(BakG24*xIiB+NrGLhUzrTi+ ze}5f%DQ#MUH_IEL6TC_AW=##ux=Kj(rRy(%wMxEWMaSX3C*@_|HYa$;VZIN-t4TrS z$At2Sp$d2{UDzhevyCd?4eB@#Zp`E1!-sq+hpF`vyjj`6;hFMweHHA63aE`G5j=rM z+NGzwO3EucPWiS`30@|6h2S;TaRj`wcLX}Y2bI^k^3*OlJXt5F+p`U8mxb+E{l!}x z{=Ot*zOfzm%Ilz4)xqM*SHU89yQvIPQ&9v3aNm<{2tL^Bm2lgzjzjR8unmLP_OM>h zY;zbo_4<%)4tlo9?)ejV)^VhYb}XKK7S~$3F;h~FyA?Ii3EmR$Cc!%`C6HSRBPf9T z-fNe9({klc`tU0AeWKUvHP&&MZCJbH%8QPZ&Ni)3KHF2C4Jrn22zZ^QtXkTH+a>jw zE3L){<<*d?s$mFtN5DI6MNr%F*Iz*Rl;!O*OnJ5F65OjlMc}JHAyp|lq)fnh<{Mb~ z@mpAZ>$h0_uV2Bw@?Dywqe6KP-Y6f0`!BCx_2>VM`@en<t3UfC+$%3bt8RlrQ+A04 zl}zwjZ52#{w+P-Mc$?sz_5vvFxe;vQZRdP=W*slzc!SF9`g~~9b-sxEznk&@9ljpi zS%N<N9Bo+2HlxpC?e@Ko{oaQ&*P#uP?W${F)H3BOVK#=~tpf#cJM*A)?2n)TF{py@ z;Zs)czT*G*%I|OBfoec|<v*}^=8IT3{}R+6{U_D}%U%((26glj)^rp1@7#s{weMl^ z;)_^({-0pH@pC+U@W3nL#!aZr)H>@)`9@}&Qdq4XyxpD$yDJB3S5^cC#CV&QPg&M& z!Xkp+^N)T3_azOpb*FJHxfjzZ-Iz}8#B^E*ZjL^OwblFlJ8NzL_h)ZnzP=yV^BXWz zScjRST3jox#_h|Y|4aYM%TOE2U^bU<c;`SNhj%)2;Phle>&b|q0NS*w$Tw`mYP?-~ z`9|yc2meQJzw`tA-#+RdDLuHA)`NwNZp>$P;bs;EvY-CK|K6SFu3(1XZxq&JzPKK@ zOY5*uUV~c|RS5j%H~c%!+y8^bhGH0D%DbJpaJsYM_GLopNn3vbTI|V3@(qLMnVz-F z-p~19*SaoZI+>u;dLd=@L7|8sQ#g}yI-y<uiub*>HT<Eb3$p~jSkgcnwgDPVS-pzo z8``ix{Jv+$>(_9rfi`O^gU^T6kpsJXKkS}NxcwPW`%)u#0?ha9Kq97W5S~Q@qyMsB zz;w+q%%%3=UPkXD`9`ByY&_-JV{LU6e<*6e2c*1A@GP7e6wb_A)-EgIe9bF#<%1iz z(U=FhEtlYP;S#*ln?>qpz#T|~axgi9Cy;QQ4=Qe(q)<51_tEPAZ0HHpOyYy|ZmvAb zH@sc)K}Dyji=NfiR#x#xg1<wy(SrGgB7#K`!E7w20{+b}V76&L<n|oubWHgy*aYt! zOoMwU1?u452%f;sV_vf4;cT2o1aHdHQE=czzkom1PGEsNuVi;WGG*DIvY!52sDRR1 z+%BtyMz%3UL@*o5Y08!&@XD9@_g1NZxt46)YtQ2FP7r=D1@6#3Xoq&MzW_b)s7RI} zcthkHec*Y&fa`VRxRuqx!&!Jl(2Lq&KXchH;96M?7AYbaA|iwjD(4$7izhIL>#doP zIx~HEXCMX6p?wG(-V1ejR|Ewlv0NX@H^FeGQ@$|{g%wbL1oPSLkaOuMDB#&~(4dH5 zU;1pQ0E!5URaMZ*^F|oFMT2VjoB!%Pf%!Si9!Q7Woer}<4Hm)M1n&&*MPPI{CDp_T zEF|&`OP1<B5zfRx+!*?Mzkr#BF)ZY?LnY7a1tEB|v>EoZFZu<{R950{O$8rRELqwD z-lmA)e(Ou#6QBa-+S9PqlS=TZq<k`*p}nvV?}j^;1a%}Kf&%yz2yNJ8?-qf<^JK{m z;=_LzDxhfu3%LiN2G6ntua~j|NfWH+UJwPWV5X`Zi?wCY8$-&oUhj0|VfouH`31~& zq+qEp1=gSk?-0B*ngsVqBDAsi2)a<%{SCWC@RKF=dgJhCLKbQs!F*mTzXCDDEdqzH zXn_5h=S3T(0&2=|x4r~Mb12_1c#EcN;5%Oo70|U0QvW{KKKw3HKN0Rk0<<G>5$pki z_iQu7ZNty9S^Yc~Yc*u87ru<e7rum<(he*Xv_KK}H^D0qtBQJkUq6)3U%{O#mvOze z7>kWX{*<*?zUgFxDjR|Ce!<%V3$vK(-V14956t1+ut#>mCU|E&0fEVQs1vafJOOqb zWVR9aH^D2A;Gnvb+m6}X7TnBl#@(W3vW<6(V2WD=lLnPe$?`58#BUM&e0?FL=0ccE zc>&KNg58^m<?nq#JOL`8cQ=*>J$Q#HPw?(UJlvzP&?aLdC?M7AIQ}g{wis0G3M9W1 z3T@iE1+BPS*bJqlncpHXc(clbw`j_m^_5U4oGmpLb9k-IQ=Wx0i{KrCcly(@`~y({ zdjfsCAPpr^{3hj(B)}nfXEGM<)DEaew?|Mw7(BbbG5jkK@8*nMfoR2Tv}s$QKXQLl zN148wrfemjvQ~2`*`}D3FZ`2y6QF!!Q?C#FDA<K&FxQ_5X*dzq*iKJ*g13+EfO~v9 z)MMM$Ux1M@$l=Xw?+V1o^&)~9cKKwLw))E3RSi7fSmGAJB6yqNZGyK5-XeILCrdBi zI1GLuozyMFhyVKyFTj5PSC|{v37OiZHSWPX$9BM(+79=`HYihDBPbwqfS+Z9_cx}< zHzqsFipwW<e`A!h%O~#i?&Zmi(&Rtv$m6_V%k$u<<wDBn0D-?-;n@NhZcA82^w zzIp+3gYi(tm~G<V9QELx<J;hz+zR>l<_NkF>o`n#$~O#NXM>7O*<vxM#N`uDmQ~*6 zlO^(vMft`icw5-U?g+uNh!9};=6oZa(j+>~-NW+qZ?X9GOSm==kNM#^Xyd{*Q!yOg zJ+T$esm+j2Y+8Q-*8aY*WGTW~@d5A7k_HuTmrQwaf5UCVZV{TjDH}Y9Gk7NqKA3M< zL{J9z;PyZgW)JSf48h+Rio?CJSeTPc`55xO2XCL;0_XH5NGGBruuu-EpV!6njZye$ zL}2g+^?F0VTVa<^Je(aU@;uMsb9~!)$ugCqaWY)WH#&v0#Y2f$7)rpM!|_-mczuH4 zkA>hJ22bicXQCmWidx_0?tAaOS7_#Sd&#oEOO|FyD_7nYgUVCBR>WfO^2v_~EZ@+S zW$-qgWgR*Wx(8{)ihRT1*_5?Ll3<MPgfW%?b36_f-?TBj<1l!a;N8=kX+^_18$|_d z#A~m;R`y8+@RtT}yzxewp6_)WL%iZKM7}XNd_9M^>Z)NkRPto$3V3E477^SoZ_2V> z?^3UK2SUmRMkt(7z6nsi3GgW!#|M==^)c{gHqna0^0|$WPHn)|t5^3k#<$;oJNlDe zF>RId+i260@)Qwl@qWrCc!%I^YL_-mS(o5#3TJ_qQn&=~68v(f2hVO1R{CkmlJd+p z%R|Xnp-jI_@PV;iSQ$^m3gw%Xqw!ci7K@eRF<3sa9m~{hR!(if%9+hrKD!Blb5U41 zzY*ry4Y+;s3HFL<+j`!SMQH>-U(krfqDDxi4Y)_ADfWtoy(L+yu7p%q&ab<rh9XE! z1&~_uAhqQ{YR`t!l?A1n9m3Nnn594&@HVV6v>WQ-Bq$?0p^mb483%QI2b75zK4saU zQm3{+Iqr2F`D8RyvW<Lt0~QJ1JkJY=TJM|6ZM3p`dwaVtT(~fN`t<3?ve<9;(1)@7 zMfE>g#N_1UX8LOkt+>a$Vi?O`_2QjvmiOO(f79b!e|E$E?ei)5{68<P@0FP8A_o8f N002ovPDHLkV1i&aY*hdN diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 9093b06447ebb129e971bc379a6a66cf92ff86d5..1978d6a83b8963c916cdef3e694a97fb4d8648dc 100644 GIT binary patch literal 12691 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 KSgYaq=6?W&0X~la literal 12348 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 HWc2?49c>-r diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 59aa0cb3a55dd3ca224537f9ef75ded03ae82e73..4015b646b3d27c2384af42358ca2304aa66b3aa0 100644 GIT binary patch literal 26763 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 QWC-+JMN_$0@%6|50c_kWW&i*H literal 26396 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ࢫjI0#a>AvQok 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,)~TL|X1DJqvSsF9s9PSuj;C^0J_ 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 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 0de5b60066d362a925c8e809edcab251255d0ebd..67477ee561d3cbd9920df908c0f04c69bddae4fc 100644 GIT binary patch literal 45368 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 C2SYUg literal 45016 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 Q*}#vkw&Cr(TlT^K2gQc)EdT%j diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 47f52d72..009969df 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,21 +1,34 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <color name="tx_green">#5C8447</color> - <color name="tx_red">#AC2527</color> - <color name="tx_pending">#e2e2e2</color> - <color name="tx_failed">#FF80AB</color> + <color name="tx_green">@color/take</color> + <color name="tx_red">@color/give</color> + <color name="tx_pending">@color/gradientPink</color> + <color name="tx_failed">@color/moneroFab</color> + + <color name="gradientOrange">#FFFF6105</color> + <color name="gradientPink">#FFF0006B</color> + + <color name="trafficGray">#9B9B9B</color> + + <color name="take">#FF417505</color> + <color name="give">#FFFF6105</color> <color name="moneroOrange">#cc5100</color> <color name="moneroWhite">#e2e2e2</color> <color name="moneroBlack">#000000</color> - <color name="moneroGray">#4c4c4c</color> + <color name="moneroGray">#FD9B9B9B</color> + + <color name="moneroFab">#61000000</color> + <color name="moneroText">#FF616161</color> + <color name="colorPrimary">#cc5100</color> <color name="colorPrimaryDark">#61221A</color> <color name="textColorPrimary">#dcdcdc</color> <color name="windowBackground">#ffffff</color> <color name="navigationBarColor">#2B4868</color> - <color name="colorAccent">#009ADA</color> + <!--color name="colorAccent">#009ADA</color--> + <color name="colorAccent">@color/gradientPink</color> <color name="anotherColor">#F8CC5A</color> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index bf080f4e..b16edfa3 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,6 +1,16 @@ <resources> - <!-- Default screen margins, per the Android Design guidelines. --> + <dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen> <dimen name="nav_drawer_width">260dp</dimen> + + <dimen name="fab_margin">16dp</dimen> + + <dimen name="event_title_text_size">@dimen/abc_text_size_title_material_toolbar</dimen> + + <dimen name="header_top_first">12sp</dimen> + <dimen name="header_top">16sp</dimen> + <dimen name="section_top">24sp</dimen> + <dimen name="data_top">8sp</dimen> + </resources> diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml new file mode 100644 index 00000000..e804b5b2 --- /dev/null +++ b/app/src/main/res/values/ids.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <item name="visible" type="id"/> + <item name="masked" type="id"/> +</resources> \ No newline at end of file diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml new file mode 100644 index 00000000..68bd3b33 --- /dev/null +++ b/app/src/main/res/values/integers.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <integer name="gunther_wallets_duration">200</integer> + <integer name="gunther_wallets_delay">1000</integer> +</resources> \ 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 1fb14e37..66d78e1e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,6 +6,7 @@ <string name="menu_testnet">Testnet</string> <string name="menu_about">About …</string> + <string name="menu_share">Share</string> <string name="menu_help">Help</string> <string name="menu_info">Details</string> <string name="menu_receive">QR Receive</string> @@ -13,9 +14,15 @@ <string name="menu_archive">Archive</string> <string name="menu_backup">Backup</string> + <string name="label_login_wallets">Wallets</string> + <string name="label_donate">Donate</string> + <string name="label_close">Close</string> + <string name="label_wallet_advanced_details">Touch for detailed information</string> + <string name="backup_progress">Backup in progress</string> <string name="archive_progress">Archive in progress</string> <string name="rename_progress">Rename in progress</string> + <string name="open_progress">Checking daemon connection</string> <string name="service_progress">Wrapping things up …\nThis can take a while!</string> @@ -26,7 +33,8 @@ <string name="delete_failed">Delete failed!</string> <string name="rename_failed">Rename failed!</string> - <string name="prompt_daemon">[<user>:<pass>@]<daemon>[:<port>]</string> + <string name="label_daemon">Node</string> + <string name="prompt_daemon">([<user>:<pass>@]<daemon>[:<port>])</string> <string name="prompt_mainnet">Net Selection</string> <string name="connect_testnet">TestNet</string> <string name="connect_mainnet">MainNet</string> @@ -37,7 +45,12 @@ <string name="status_wallet_unload_failed">Wallet save failed!</string> <string name="status_wallet_connecting">Connecting …</string> <string name="status_wallet_connect_failed">Daemon connection failed!\nCheck username/password</string> + <string name="status_wallet_connect_timeout">Daemon connection timed out!\nTry again or another!</string> <string name="status_working">Working on it …</string> + <string name="status_wallet_disconnected">Disconnected</string> + + + <string name="status_exchanging">…</string> <string name="status_transaction_sent">Transaction sent!</string> <string name="status_transaction_failed">Transaction failed!</string> @@ -56,14 +69,16 @@ <string name="warn_daemon_unavailable">Cannot connect to daemon! Try again.</string> <string name="panic">Something\'s wrong!</string> - <string name="watchonly_label">(Watch Only)</string> + <string name="label_watchonly">(Watch Only)</string> - <string name="wallet_send_hint">Send some</string> + <string name="label_wallet_receive">Take</string> + <string name="label_wallet_send">Give</string> <string name="title_amount">Amount</string> <string name="title_date">Date</string> - <string name="xmr_unconfirmed_amount">+ %1$s unconfirmed</string> - <string name="xmr_balance">%1$s XMR</string> + <string name="xmr_unconfirmed_amount">+ %1$s XMR unconfirmed</string> + <!--string name="xmr_balance">%1$s XMR</string--> + <string name="xmr">XMR</string> <string name="label_transactions">Transactions</string> <string name="text_daemonConnected">Daemon connected!</string> @@ -83,15 +98,22 @@ <string name="message_strorage_not_permitted">We really need those External Storage permissions!</string> <string name="message_camera_not_permitted">No camera = No QR scanning!</string> + <string name="label_copy_viewkey">View Key</string> + <string name="label_copy_address">Public Address</string> + <string name="message_copy_viewkey">View Key copied to clipboard!</string> + <string name="message_copy_address">Wallet Address copied to clipboard!</string> <string name="message_noselect_seed">Selecting seed disabled for security reasons!</string> <string name="message_noselect_key">Selecting spend key disabled for security reasons!</string> + <string name="message_nocopy">Copy disabled for security reasons!</string> + + <string name="message_exchange_failed">Cannot get exchange rate!\nUse XMR/XMR or try again</string> <string name="generate_title">Create Wallet</string> <string name="generate_name_hint">Wallet Name</string> <string name="generate_password_hint">Wallet Password</string> <string name="generate_buttonGenerate">Make me a wallet already!</string> <string name="generate_seed">Mnemonic Seed</string> - <string name="generate_button_accept">I have noted the above</string> + <string name="generate_button_accept">I have noted these 25 words!</string> <string name="generate_button_backup">Backup</string> <string name="generate_button_export">Export Keys</string> @@ -99,8 +121,9 @@ <string name="generate_wallet_watchonly"><Watch Only Wallet></string> - <string name="generate_wallet_exists">Wallet exists! Choose another name</string> - <string name="generate_wallet_dot">Wallet name may not begin with \'.\'</string> + <string name="generate_wallet_name">Give me a name!</string> + <string name="generate_wallet_exists">Wallet exists!</string> + <string name="generate_wallet_dot">Cannot begin with .</string> <string name="generate_wallet_creating">Creating wallet</string> <string name="generate_wallet_created">Wallet created</string> <string name="generate_wallet_create_failed">Wallet create failed</string> @@ -110,11 +133,11 @@ <string name="generate_mnemonic_placeholder">camp feline inflamed memoir afloat eight alerts females gutter cogs menu waveform gather tawny judge gusts yahoo doctor females biscuit alchemy reef agony austere camp</string> <string name="generate_restoreheight_placeholder">1307882</string> - <string name="generate_address_hint">Public Address (optional)</string> + <string name="generate_address_hint">Public Address</string> <string name="generate_viewkey_hint">View Key</string> - <string name="generate_spendkey_hint">Spend Key (optional)</string> - <string name="generate_mnemonic_hint">Mnemonic Seed (optional)</string> - <string name="generate_restoreheight_hint">Restore Height (optional)</string> + <string name="generate_spendkey_hint">Spend Key</string> + <string name="generate_mnemonic_hint">25-Word Mnemonic Seed</string> + <string name="generate_restoreheight_hint">Restore Height</string> <string name="generate_wallet_label">Wallet</string> <string name="generate_password_label">Password</string> @@ -124,11 +147,11 @@ <string name="generate_mnemonic_label">Mnemonic Seed</string> <string name="generate_restoreheight_label">Restore Height:</string> - <string name="generate_check_keys">Check your keys!</string> - <string name="generate_check_key">Check your key!</string> - <string name="generate_check_address">Check your address!</string> - <string name="generate_check_mnemonic">Check your mnemonic seed!</string> - <string name="generate_check_something">Check your entry!</string> + <!--string name="generate_check_keys">Check your keys!</string--> + <string name="generate_check_key">Enter valid Key</string> + <string name="generate_check_address">Enter valid Address</string> + <string name="generate_check_mnemonic">Enter your 25 word seed</string> + <!--string name="generate_check_something">Check your entry!</string--> <string name="send_address_hint">Receiver\'s Address</string> <string name="send_paymentid_hint">Payment ID (optional)</string> @@ -146,17 +169,21 @@ <string name="send_qr_invalid">Not a monero QR Code</string> <string name="send_qr_address_invalid">Invalid Monero address</string> <string name="send_preparing_progress">Preparing transaction</string> + <string name="send_title">Send</string> <string name="send_amount_label">Amount</string> <string name="send_fee_label">Fee</string> <string name="send_dust_label">Dust</string> + <string name="send_total_label">Total</string> <string name="send_error_title">Transaction Error</string> <string name="tx_list_fee_pending">incl. %1$s fee</string> - <string name="tx_list_fee">+ %1$s fee</string> + <string name="tx_list_fee">- Fee %1$s</string> <string name="tx_list_amount_failed">(%1$s)</string> - <string name="tx_list_amount_negative">-%1$s</string> + <string name="tx_list_failed_text">failed</string> + <string name="tx_list_amount_negative">- %1$s</string> + <string name="tx_list_amount_positive">+ %1$s</string> <string name="tx_address">Address</string> <string name="tx_timestamp">Timestamp</string> @@ -176,21 +203,31 @@ <string name="tx_button_notes">Save</string> <string name="tx_notes_set">Notes saved</string> <string name="tx_notes_set_failed">Notes saved failed</string> + <string name="tx_title">Transaction Details</string> <string name="tx_pending">PENDING</string> <string name="tx_failed">FAILED</string> <string name="receive_generate_hint">Show me the QR Code</string> <string name="receive_paymentid_button">Generate</string> - <string name="receive_paymentid_label">PaymentID</string> - <string name="receive_paymentid_hint">Payment ID (optional)</string> + <string name="receive_paymentid_hint">Payment ID</string> <string name="receive_amount_hint">Amount</string> <string name="receive_amount_xmr_hint">XMR</string> <string name="receive_cannot_open">Could not open wallet!</string> + <string name="receive_paymentid_invalid">Must be 16 Hex characters</string> + <string name="receive_amount_invalid">Must be > 0</string> + + <string name="receive_amount_empty">Enter value</string> + <string name="receive_amount_too_big">Max. %1$s</string> + <string name="receive_amount_negative">Min. 0</string> + <string name="receive_amount_nan">XMR not a number</string> + + <string name="receive_title">Receive</string> <string name="details_alert_message">Sensitive data will now be shown.\nLook over your shoulder!</string> <string name="details_alert_yes">I\'m safe</string> <string name="details_alert_no">Take me back!</string> + <string name="details_title">Details</string> <string name="archive_alert_message">The wallet will be backed up and then deleted!</string> <string name="archive_alert_yes">Yes, do that!</string> @@ -199,17 +236,17 @@ <string name="big_amount">999999.999999999999</string> <string-array name="mixin"> - <item>Ring Size 5</item> - <item>Ring Size 8</item> - <item>Ring Size 13</item> - <item>Ring Size 26</item> + <item>Ringsize 5</item> + <item>Ringsize 8</item> + <item>Ringsize 13</item> + <item>Ringsize 26</item> </string-array> <string-array name="priority"> - <item>Default Priority</item> - <item>Low Priority</item> - <item>Medium Priority</item> - <item>High Priority</item> + <item>Priority Default</item> + <item>Priority Low</item> + <item>Priority Medium</item> + <item>Priority High</item> </string-array> <string-array name="currency"> @@ -217,4 +254,9 @@ <item>EUR</item> <item>USD</item> </string-array> + + <string name="fab_create_new">Create new wallet</string> + <string name="fab_restore_viewonly">Restore view-only wallet</string> + <string name="fab_restore_key">Restore wallet from private keys</string> + <string name="fab_restore_seed">Restore wallet 25 words seed</string> </resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 3181df2c..660bc77c 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,28 +1,183 @@ <resources> - <style name="MyMaterialTheme" parent="MyMaterialTheme.Base" /> + <style name="ToolBarStyle.Base" parent=""> + <item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item> + <item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item> + </style> - <style name="MyMaterialTheme.Base" parent="Theme.AppCompat"> + <style name="ToolBarStyle" parent="ToolBarStyle.Base" /> + + <style name="ToolBarStyle.Event" parent="ToolBarStyle"> + <item name="titleTextAppearance">@style/TextAppearance.Widget.Event.Toolbar.Title</item> + </style> + + <style name="ToolBarStyle.ActionButton" parent="Widget.AppCompat.ActionButton"> + <item name="android:textAllCaps">true</item> + <item name="android:textSize">10sp</item> + <item name="android:textColor">@color/white</item> + <item name="android:textStyle">bold</item> + </style> + + <style name="TextAppearance.Widget.Event.Toolbar.Title" parent="TextAppearance.Widget.AppCompat.Toolbar.Title"> + <!-- Text styling can be done here--> + </style> + + + <style name="MyMaterialTheme" parent="Theme.AppCompat.Light"> <item name="windowNoTitle">true</item> <item name="windowActionBar">false</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> - <item name="colorPrimary">@color/colorPrimary</item> - <item name="colorAccent">@color/colorAccent</item> + <item name="colorPrimary">@color/moneroText</item> + <item name="colorAccent">@color/gradientPink</item> + + <item name="android:spinnerItemStyle">@style/MoneroSpinnerItem</item> + <item name="android:spinnerStyle">@style/MoneroSpinner</item> </style> <style name="MoneroLabel" parent="@android:style/TextAppearance.DeviceDefault.Medium"> - <item name="android:textColor">?colorAccent</item> + <item name="android:textColor">?colorPrimary</item> + <item name="android:textColorHint">@color/moneroText</item> + </style> + + <style name="MoneroLabel.Small"> + <item name="android:textSize">10sp</item> + </style> + + <style name="MoneroLabel.Caps"> + <item name="android:textAllCaps">true</item> + </style> + + <style name="MoneroLabel.Caps.Black"> + <item name="android:textColor">@color/moneroBlack</item> + </style> + + <style name="MoneroLabel.Caps.Gray"> + <item name="android:textColor">@color/moneroGray</item> + </style> + + <style name="MoneroLabel.Caps.Stealth"> + <item name="android:textColor">@color/moneroFab</item> + </style> + + <style name="MoneroLabel.Caps.Stealth.Small"> + <item name="android:textSize">12sp</item> + </style> + + <style name="MoneroText.Balance"> + <item name="android:textSize">32sp</item> + <item name="android:textColor">@color/moneroBlack</item> + <item name="android:textStyle">bold</item> + </style> + + <style name="MoneroText.Unconfirmed"> + <item name="android:textSize">14sp</item> + <item name="android:textColor">@color/moneroGray</item> + <item name="android:textStyle">bold</item> + </style> + + <style name="MoneroText.PosAmount"> + <item name="android:textSize">16sp</item> + <item name="android:textColor">@color/moneroBlack</item> + <item name="android:textStyle">bold</item> + </style> + + <style name="MoneroText.PosFee"> + <item name="android:textSize">10sp</item> + <item name="android:textColor">#FF898989</item> + <item name="android:textStyle">normal</item> + </style> + + <style name="MoneroText.PosNote"> + <item name="android:textSize">12sp</item> + <item name="android:textColor">#FF4A4A4A</item> + <item name="android:textStyle">italic</item> + </style> + + <style name="MoneroText.PosDate"> + <item name="android:textSize">10sp</item> + <item name="android:textColor">#FF616161</item> + <item name="android:textStyle">normal</item> + </style> + + <style name="MoneroLabel.Title"> + <item name="android:textSize">20sp</item> + <item name="android:textColor">@color/white</item> + </style> + + <style name="MoneroLabel.Subtitle"> + <item name="android:textSize">12sp</item> + <item name="android:textColor">@color/moneroWhite</item> + </style> + + <style name="MoneroLabel.Heading"> + <item name="android:textSize">14sp</item> + <item name="android:textColor">@color/moneroFab</item> + <item name="android:textStyle">bold</item> + </style> + + <style name="MoneroFab" parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textSize">12sp</item> + <item name="android:textColor">@color/moneroFab</item> + <item name="android:textStyle">bold</item> </style> <style name="MoneroText" parent="@android:style/TextAppearance.DeviceDefault.Medium"> <item name="android:textColor">?colorPrimary</item> - <item name="android:textColorHint">@color/moneroGray</item> + <item name="android:textColorHint">@color/moneroText</item> + </style> + + <style name="MoneroText.Gray"> + <item name="android:textColor">@color/moneroGray</item> + </style> + + <style name="MoneroText.Black"> + <item name="android:textColor">@color/moneroBlack</item> + </style> + + <style name="MoneroText.Monospace"> + <item name="android:fontFamily">monospace</item> + </style> + + <style name="MoneroText.Monospace.Mnemonic"> + <item name="android:lineSpacingMultiplier">1.2</item> + <item name="android:textSize">18sp</item> + <item name="android:textStyle">bold</item> + </style> + + <style name="MoneroText.Label"> + <item name="android:textSize">18dp</item> + </style> + + <style name="MoneroText.Label.Medium"> + <item name="android:textSize">14dp</item> + </style> + + <style name="MoneroText.Small"> + <item name="android:textSize">10dp</item> + </style> + + <style name="MoneroText.Medium"> + <item name="android:textSize">12dp</item> + </style> + + <style name="MoneroText.Large"> + <item name="android:textSize">24dp</item> + </style> + + <style name="MoneroText.Button" parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textSize">14sp</item> + <item name="android:textColor">@color/gradientOrange</item> + <item name="android:textStyle">bold</item> + </style> + + <style name="MoneroText.Button.Small"> + <item name="android:textSize">10sp</item> </style> <style name="MoneroButton" parent="@style/Widget.AppCompat.Button"> + <item name="android:background">@drawable/button_selector</item> <item name="android:textColor">@color/text_color</item> - <item name="android:background">?colorPrimary</item> <item name="android:textAppearance">@style/MoneroLabel</item> <item name="android:textAllCaps">true</item> </style> @@ -33,13 +188,29 @@ <style name="MoneroButton.Alert"> <item name="android:textColor">@color/moneroBlack</item> - <item name="android:background">@color/moneroOrange</item> + <item name="android:background">@color/gradientPink</item> + </style> + + <style name="MoneroButton.Take"> + <item name="android:background">@color/take</item> + </style> + + <style name="MoneroButton.Give"> + <item name="android:background">@color/give</item> </style> <style name="MoneroEdit" parent="MoneroText"> <item name="android:textColor">?colorPrimary</item> - <item name="android:backgroundTint">?colorPrimary</item> - <item name="android:foregroundTint">@color/moneroWhite</item> + <item name="android:backgroundTint">@color/gradientPink</item> + </style> + + <style name="MoneroEdit.Medium" parent="MoneroText.Medium"> + <item name="android:textColor">?colorPrimary</item> + <item name="android:backgroundTint">@color/gradientPink</item> + </style> + + <style name="MoneroEdit.Small"> + <item name="android:textSize">14sp</item> </style> <style name="MoneroProgress" parent="@android:style/Widget.ProgressBar.Horizontal"> @@ -47,16 +218,29 @@ <item name="android:progressBackgroundTint">?colorPrimary</item> </style> - <!--style name="MoneroSpinner" parent="@style/Widget.AppCompat.Spinner"> - </style--> - <style name="MoneroListView" parent="@android:style/Widget.ListView"> <item name="android:divider">@null</item> <item name="android:dividerHeight">0dp</item> </style> <style name="MoneroSpinner" parent="@style/Widget.AppCompat.Spinner"> - <item name="android:background">@android:drawable/screen_background_dark_transparent</item> + <item name="android:background">@drawable/backgound_spinner</item> </style> + <style name="MoneroSpinnerItem" parent="android:Widget.TextView.SpinnerItem"> + <item name="android:textAppearance">@style/MoneroTextAppearanceSpinnerItem</item> + </style> + + <style name="MoneroTextAppearanceSpinnerItem" parent="android:TextAppearance.Widget.TextView.SpinnerItem"> + <item name="android:textColor">@color/gradientOrange</item> + </style> + + <style name="MoneroSpinnerItem.Balance"> + <item name="android:textSize">32sp</item> + <item name="android:textStyle">bold</item> + </style> + + + + </resources>