From b9a4ab18e1daec97e591ed969d882146d6962a8e Mon Sep 17 00:00:00 2001
From: pokkst
Date: Wed, 7 Sep 2022 14:43:41 -0500
Subject: [PATCH] Delete 99% of Monerujo code, replace with basic Monero wallet
app to built from.
NOTE: As of this commit, the app logs the wallet seed for development purposes.
---
LICENSE | 214 ++-
README.md | 51 +-
app/build.gradle | 7 +
app/src/main/AndroidManifest.xml | 58 +-
.../com/m2049r/xmrwallet/BaseActivity.java | 313 ----
.../m2049r/xmrwallet/GenerateFragment.java | 615 -------
.../xmrwallet/GenerateReviewFragment.java | 711 --------
.../com/m2049r/xmrwallet/LoginActivity.java | 1469 -----------------
.../com/m2049r/xmrwallet/LoginFragment.java | 563 -------
.../com/m2049r/xmrwallet/MainActivity.java | 83 +-
.../com/m2049r/xmrwallet/NodeFragment.java | 589 -------
.../xmrwallet/OnBackPressedListener.java | 21 -
.../xmrwallet/OnBlockUpdateListener.java | 23 -
.../xmrwallet/OnUriScannedListener.java | 23 -
.../com/m2049r/xmrwallet/ReceiveFragment.java | 469 ------
.../com/m2049r/xmrwallet/ScannerFragment.java | 96 --
.../com/m2049r/xmrwallet/SecureActivity.java | 73 -
.../m2049r/xmrwallet/SettingsFragment.java | 125 --
.../m2049r/xmrwallet/SubaddressFragment.java | 241 ---
.../xmrwallet/SubaddressInfoFragment.java | 173 --
.../java/com/m2049r/xmrwallet/TxFragment.java | 406 -----
.../com/m2049r/xmrwallet/WalletActivity.java | 1220 --------------
.../com/m2049r/xmrwallet/WalletFragment.java | 559 -------
.../xmrwallet/XmrWalletApplication.java | 77 -
.../com/m2049r/xmrwallet/data/Crypto.java | 12 +-
.../com/m2049r/xmrwallet/data/UserNotes.java | 19 -
.../xmrwallet/dialog/AboutFragment.java | 90 -
.../xmrwallet/dialog/CreditsFragment.java | 69 -
.../m2049r/xmrwallet/dialog/HelpFragment.java | 115 --
.../xmrwallet/dialog/PrivacyFragment.java | 69 -
.../xmrwallet/dialog/ProgressDialog.java | 132 --
.../xmrwallet/fragment/home/HomeFragment.java | 118 ++
.../fragment/home/HomeViewModel.java | 41 +
.../send/SendAddressWizardFragment.java | 525 ------
.../send/SendAmountWizardFragment.java | 159 --
.../send/SendBtcAmountWizardFragment.java | 263 ---
.../send/SendBtcConfirmWizardFragment.java | 551 -------
.../send/SendBtcSuccessWizardFragment.java | 262 ---
.../xmrwallet/fragment/send/SendConfirm.java | 27 -
.../send/SendConfirmWizardFragment.java | 247 ---
.../xmrwallet/fragment/send/SendFragment.java | 558 -------
.../send/SendSuccessWizardFragment.java | 128 --
.../fragment/send/SendWizardFragment.java | 36 -
.../fragment/settings/SettingsFragment.java | 39 +
.../fragment/settings/SettingsViewModel.java | 7 +
.../m2049r/xmrwallet/layout/DiffCallback.java | 46 -
.../xmrwallet/layout/NodeInfoAdapter.java | 261 ---
.../xmrwallet/layout/SpendViewPager.java | 73 -
.../layout/SubaddressInfoAdapter.java | 164 --
.../layout/TransactionInfoAdapter.java | 278 ----
.../xmrwallet/layout/WalletInfoAdapter.java | 174 --
.../ledger/LedgerProgressDialog.java | 183 --
.../xmrwallet/livedata/SingleLiveEvent.java | 77 +
.../m2049r/xmrwallet/model/WalletManager.java | 4 +-
.../onboarding/OnBoardingActivity.java | 123 --
.../onboarding/OnBoardingAdapter.java | 92 --
.../onboarding/OnBoardingManager.java | 51 -
.../onboarding/OnBoardingScreen.java | 59 -
.../onboarding/OnBoardingViewPager.java | 86 -
.../service/MoneroHandlerThread.java | 167 +-
.../m2049r/xmrwallet/service/ServiceBase.java | 21 +
.../m2049r/xmrwallet/service/TxService.java | 26 +
.../xmrwallet/service/WalletService.java | 595 -------
.../service/exchange/api/ExchangeApi.java | 37 -
.../exchange/api/ExchangeCallback.java | 26 -
.../exchange/api/ExchangeException.java | 48 -
.../service/exchange/api/ExchangeRate.java | 29 -
.../service/exchange/ecb/ExchangeApiImpl.java | 203 ---
.../exchange/ecb/ExchangeRateImpl.java | 57 -
.../exchange/kraken/ExchangeApiImpl.java | 124 --
.../exchange/kraken/ExchangeRateImpl.java | 94 --
.../exchange/krakenEcb/ExchangeApiImpl.java | 92 --
.../exchange/krakenEcb/ExchangeRateImpl.java | 54 -
.../service/shift/NetworkCallback.java | 27 -
.../xmrwallet/service/shift/ShiftApiCall.java | 28 -
.../service/shift/ShiftCallback.java | 24 -
.../xmrwallet/service/shift/ShiftError.java | 54 -
.../service/shift/ShiftException.java | 33 -
.../shift/sideshift/api/CreateOrder.java | 42 -
.../sideshift/api/QueryOrderParameters.java | 27 -
.../shift/sideshift/api/QueryOrderStatus.java | 65 -
.../shift/sideshift/api/RequestQuote.java | 34 -
.../shift/sideshift/api/SideShiftApi.java | 64 -
.../sideshift/network/CreateOrderImpl.java | 122 --
.../network/QueryOrderParametersImpl.java | 73 -
.../network/QueryOrderStatusImpl.java | 146 --
.../sideshift/network/RequestQuoteImpl.java | 126 --
.../sideshift/network/SideShiftApiImpl.java | 122 --
.../com/m2049r/xmrwallet/util/Helper.java | 190 ---
.../com/m2049r/xmrwallet/util/Notice.java | 127 --
.../m2049r/xmrwallet/util/ServiceHelper.java | 5 -
.../xmrwallet/widget/CTextInputLayout.java | 44 -
.../com/m2049r/xmrwallet/widget/DotBar.java | 156 --
.../xmrwallet/widget/DropDownEditText.java | 54 -
.../xmrwallet/widget/ExchangeEditText.java | 421 -----
.../widget/ExchangeOtherEditText.java | 196 ---
.../m2049r/xmrwallet/widget/ExchangeView.java | 469 ------
.../xmrwallet/widget/PasswordEntryView.java | 73 -
.../xmrwallet/widget/SendProgressView.java | 87 -
.../com/m2049r/xmrwallet/widget/Toolbar.java | 161 --
app/src/main/res/drawable/ic_monero_qr.xml | 18 +
app/src/main/res/layout/activity_login.xml | 21 -
app/src/main/res/layout/activity_main.xml | 19 +
.../main/res/layout/activity_on_boarding.xml | 57 -
app/src/main/res/layout/activity_wallet.xml | 40 -
app/src/main/res/layout/checkbox_confirm.xml | 13 -
.../res/layout/dialog_ledger_progress.xml | 54 -
app/src/main/res/layout/fragment_about.xml | 47 -
app/src/main/res/layout/fragment_credits.xml | 30 -
app/src/main/res/layout/fragment_generate.xml | 214 ---
app/src/main/res/layout/fragment_help.xml | 20 -
app/src/main/res/layout/fragment_home.xml | 91 +
app/src/main/res/layout/fragment_login.xml | 158 --
app/src/main/res/layout/fragment_node.xml | 74 -
.../res/layout/fragment_privacy_policy.xml | 31 -
app/src/main/res/layout/fragment_receive.xml | 145 --
app/src/main/res/layout/fragment_review.xml | 259 ---
app/src/main/res/layout/fragment_send.xml | 78 -
.../main/res/layout/fragment_send_address.xml | 220 ---
.../main/res/layout/fragment_send_amount.xml | 69 -
.../res/layout/fragment_send_btc_amount.xml | 65 -
.../res/layout/fragment_send_btc_confirm.xml | 257 ---
.../res/layout/fragment_send_btc_success.xml | 230 ---
.../main/res/layout/fragment_send_confirm.xml | 178 --
.../main/res/layout/fragment_send_success.xml | 110 --
app/src/main/res/layout/fragment_settings.xml | 19 +
.../main/res/layout/fragment_subaddress.xml | 75 -
.../res/layout/fragment_subaddressinfo.xml | 56 -
app/src/main/res/layout/fragment_tx_info.xml | 362 ----
app/src/main/res/layout/fragment_wallet.xml | 198 ---
app/src/main/res/layout/item_node.xml | 71 -
app/src/main/res/layout/item_spinner.xml | 11 -
.../main/res/layout/item_spinner_balance.xml | 11 -
.../res/layout/item_spinner_dropdown_item.xml | 11 -
app/src/main/res/layout/item_subaddress.xml | 49 -
app/src/main/res/layout/item_transaction.xml | 116 --
app/src/main/res/layout/item_wallet.xml | 35 -
app/src/main/res/layout/layout_fabmenu.xml | 232 ---
app/src/main/res/layout/nav_header.xml | 28 -
app/src/main/res/layout/prompt_changepw.xml | 74 -
app/src/main/res/layout/prompt_editnode.xml | 159 --
.../main/res/layout/prompt_ledger_seed.xml | 68 -
app/src/main/res/layout/prompt_password.xml | 34 -
app/src/main/res/layout/prompt_rename.xml | 32 -
app/src/main/res/layout/template_notice.xml | 36 -
app/src/main/res/layout/view_exchange.xml | 112 --
.../main/res/layout/view_exchange_edit.xml | 109 --
app/src/main/res/layout/view_onboarding.xml | 65 -
.../main/res/layout/view_send_progress.xml | 47 -
app/src/main/res/layout/view_toolbar.xml | 59 -
app/src/main/res/menu/create_wallet_keys.xml | 12 -
.../main/res/menu/create_wallet_ledger.xml | 12 -
app/src/main/res/menu/create_wallet_new.xml | 12 -
app/src/main/res/menu/create_wallet_seed.xml | 19 -
app/src/main/res/menu/create_wallet_view.xml | 12 -
app/src/main/res/menu/drawer_view.xml | 15 -
app/src/main/res/menu/list_context_menu.xml | 33 -
app/src/main/res/menu/list_menu.xml | 11 -
app/src/main/res/menu/node_menu.xml | 17 -
app/src/main/res/menu/receive_menu.xml | 12 -
app/src/main/res/menu/send_menu.xml | 12 -
app/src/main/res/menu/tx_info_menu.xml | 19 -
.../res/menu/wallet_details_help_menu.xml | 12 -
app/src/main/res/menu/wallet_details_menu.xml | 18 -
app/src/main/res/menu/wallet_menu.xml | 48 -
app/src/main/res/navigation/main_nav.xml | 26 +
app/src/main/res/values-cat/about.xml | 54 -
app/src/main/res/values-cat/help.xml | 254 ---
app/src/main/res/values-cat/strings.xml | 450 -----
app/src/main/res/values-de/about.xml | 61 -
app/src/main/res/values-de/help.xml | 314 ----
app/src/main/res/values-de/strings.xml | 451 -----
app/src/main/res/values-el/about.xml | 61 -
app/src/main/res/values-el/help.xml | 296 ----
app/src/main/res/values-el/strings.xml | 452 -----
app/src/main/res/values-eo/about.xml | 57 -
app/src/main/res/values-eo/help.xml | 340 ----
app/src/main/res/values-eo/strings.xml | 452 -----
app/src/main/res/values-es/about.xml | 58 -
app/src/main/res/values-es/help.xml | 336 ----
app/src/main/res/values-es/strings.xml | 443 -----
app/src/main/res/values-et/about.xml | 61 -
app/src/main/res/values-et/help.xml | 316 ----
app/src/main/res/values-et/strings.xml | 450 -----
app/src/main/res/values-fa/about.xml | 59 -
app/src/main/res/values-fa/help.xml | 425 -----
app/src/main/res/values-fa/strings.xml | 703 --------
app/src/main/res/values-fr/about.xml | 66 -
app/src/main/res/values-fr/help.xml | 334 ----
app/src/main/res/values-fr/strings.xml | 456 -----
app/src/main/res/values-hu/about.xml | 61 -
app/src/main/res/values-hu/help.xml | 318 ----
app/src/main/res/values-hu/strings.xml | 454 -----
app/src/main/res/values-it/about.xml | 49 -
app/src/main/res/values-it/help.xml | 319 ----
app/src/main/res/values-it/strings.xml | 455 -----
app/src/main/res/values-ja/about.xml | 63 -
app/src/main/res/values-ja/help.xml | 447 -----
app/src/main/res/values-ja/strings.xml | 455 -----
app/src/main/res/values-land/dimens.xml | 3 +
app/src/main/res/values-nb/about.xml | 61 -
app/src/main/res/values-nb/help.xml | 316 ----
app/src/main/res/values-nb/strings.xml | 452 -----
app/src/main/res/values-nl/about.xml | 49 -
app/src/main/res/values-nl/help.xml | 254 ---
app/src/main/res/values-nl/strings.xml | 452 -----
app/src/main/res/values-pt-rBR/about.xml | 62 -
app/src/main/res/values-pt-rBR/help.xml | 315 ----
app/src/main/res/values-pt-rBR/strings.xml | 445 -----
app/src/main/res/values-pt/about.xml | 62 -
app/src/main/res/values-pt/help.xml | 315 ----
app/src/main/res/values-pt/strings.xml | 456 -----
app/src/main/res/values-ro/about.xml | 62 -
app/src/main/res/values-ro/help.xml | 322 ----
app/src/main/res/values-ro/strings.xml | 452 -----
app/src/main/res/values-ru/about.xml | 62 -
app/src/main/res/values-ru/help.xml | 319 ----
app/src/main/res/values-ru/strings.xml | 456 -----
app/src/main/res/values-sk/about.xml | 52 -
app/src/main/res/values-sk/help.xml | 283 ----
app/src/main/res/values-sk/strings.xml | 453 -----
app/src/main/res/values-sr/about.xml | 61 -
app/src/main/res/values-sr/help.xml | 314 ----
app/src/main/res/values-sr/strings.xml | 451 -----
app/src/main/res/values-sv/about.xml | 61 -
app/src/main/res/values-sv/help.xml | 303 ----
app/src/main/res/values-sv/strings.xml | 444 -----
app/src/main/res/values-ta/about.xml | 55 -
app/src/main/res/values-ta/help.xml | 322 ----
app/src/main/res/values-ta/strings.xml | 450 -----
app/src/main/res/values-uk/about.xml | 62 -
app/src/main/res/values-uk/help.xml | 314 ----
app/src/main/res/values-uk/strings.xml | 456 -----
app/src/main/res/values-zh-rCN/about.xml | 46 -
app/src/main/res/values-zh-rCN/help.xml | 254 ---
app/src/main/res/values-zh-rCN/strings.xml | 376 -----
app/src/main/res/values-zh-rTW/about.xml | 47 -
app/src/main/res/values-zh-rTW/help.xml | 255 ---
app/src/main/res/values-zh-rTW/strings.xml | 451 -----
app/src/main/res/values/dimens.xml | 1 +
app/src/main/res/values/strings.xml | 11 +
241 files changed, 889 insertions(+), 41835 deletions(-)
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/BaseActivity.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/NodeFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/OnBackPressedListener.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/OnBlockUpdateListener.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/OnUriScannedListener.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/SecureActivity.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/SettingsFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/SubaddressFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/SubaddressInfoFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/TxFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/dialog/AboutFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/dialog/CreditsFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/dialog/HelpFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/dialog/PrivacyFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/dialog/ProgressDialog.java
create mode 100644 app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeFragment.java
create mode 100644 app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeViewModel.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAddressWizardFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAmountWizardFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcAmountWizardFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcConfirmWizardFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirm.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirmWizardFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendSuccessWizardFragment.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendWizardFragment.java
create mode 100644 app/src/main/java/com/m2049r/xmrwallet/fragment/settings/SettingsFragment.java
create mode 100644 app/src/main/java/com/m2049r/xmrwallet/fragment/settings/SettingsViewModel.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/layout/DiffCallback.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/layout/NodeInfoAdapter.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/layout/SpendViewPager.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/layout/SubaddressInfoAdapter.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/layout/WalletInfoAdapter.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/ledger/LedgerProgressDialog.java
create mode 100644 app/src/main/java/com/m2049r/xmrwallet/livedata/SingleLiveEvent.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingActivity.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingAdapter.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingManager.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingScreen.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingViewPager.java
create mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/ServiceBase.java
create mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/TxService.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeApi.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeCallback.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeException.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeRate.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/exchange/ecb/ExchangeApiImpl.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/exchange/ecb/ExchangeRateImpl.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/exchange/kraken/ExchangeApiImpl.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/exchange/kraken/ExchangeRateImpl.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/exchange/krakenEcb/ExchangeApiImpl.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/exchange/krakenEcb/ExchangeRateImpl.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/shift/NetworkCallback.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftApiCall.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftCallback.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftError.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftException.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/CreateOrder.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/QueryOrderParameters.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/QueryOrderStatus.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/RequestQuote.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/SideShiftApi.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/CreateOrderImpl.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderParametersImpl.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderStatusImpl.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/RequestQuoteImpl.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/SideShiftApiImpl.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/util/Notice.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/widget/CTextInputLayout.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/widget/DotBar.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/widget/DropDownEditText.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeOtherEditText.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeView.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/widget/PasswordEntryView.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/widget/SendProgressView.java
delete mode 100644 app/src/main/java/com/m2049r/xmrwallet/widget/Toolbar.java
create mode 100644 app/src/main/res/drawable/ic_monero_qr.xml
delete mode 100644 app/src/main/res/layout/activity_login.xml
create mode 100644 app/src/main/res/layout/activity_main.xml
delete mode 100644 app/src/main/res/layout/activity_on_boarding.xml
delete mode 100644 app/src/main/res/layout/activity_wallet.xml
delete mode 100644 app/src/main/res/layout/checkbox_confirm.xml
delete mode 100644 app/src/main/res/layout/dialog_ledger_progress.xml
delete mode 100644 app/src/main/res/layout/fragment_about.xml
delete mode 100644 app/src/main/res/layout/fragment_credits.xml
delete mode 100644 app/src/main/res/layout/fragment_generate.xml
delete mode 100644 app/src/main/res/layout/fragment_help.xml
create mode 100644 app/src/main/res/layout/fragment_home.xml
delete mode 100644 app/src/main/res/layout/fragment_login.xml
delete mode 100644 app/src/main/res/layout/fragment_node.xml
delete mode 100644 app/src/main/res/layout/fragment_privacy_policy.xml
delete mode 100644 app/src/main/res/layout/fragment_receive.xml
delete mode 100644 app/src/main/res/layout/fragment_review.xml
delete mode 100644 app/src/main/res/layout/fragment_send.xml
delete mode 100644 app/src/main/res/layout/fragment_send_address.xml
delete mode 100644 app/src/main/res/layout/fragment_send_amount.xml
delete mode 100644 app/src/main/res/layout/fragment_send_btc_amount.xml
delete mode 100644 app/src/main/res/layout/fragment_send_btc_confirm.xml
delete mode 100644 app/src/main/res/layout/fragment_send_btc_success.xml
delete mode 100644 app/src/main/res/layout/fragment_send_confirm.xml
delete mode 100644 app/src/main/res/layout/fragment_send_success.xml
create mode 100644 app/src/main/res/layout/fragment_settings.xml
delete mode 100644 app/src/main/res/layout/fragment_subaddress.xml
delete mode 100644 app/src/main/res/layout/fragment_subaddressinfo.xml
delete mode 100644 app/src/main/res/layout/fragment_tx_info.xml
delete mode 100644 app/src/main/res/layout/fragment_wallet.xml
delete mode 100644 app/src/main/res/layout/item_node.xml
delete mode 100644 app/src/main/res/layout/item_spinner.xml
delete mode 100644 app/src/main/res/layout/item_spinner_balance.xml
delete mode 100644 app/src/main/res/layout/item_spinner_dropdown_item.xml
delete mode 100644 app/src/main/res/layout/item_subaddress.xml
delete mode 100644 app/src/main/res/layout/item_transaction.xml
delete mode 100644 app/src/main/res/layout/item_wallet.xml
delete mode 100644 app/src/main/res/layout/layout_fabmenu.xml
delete mode 100644 app/src/main/res/layout/nav_header.xml
delete mode 100644 app/src/main/res/layout/prompt_changepw.xml
delete mode 100644 app/src/main/res/layout/prompt_editnode.xml
delete mode 100644 app/src/main/res/layout/prompt_ledger_seed.xml
delete mode 100644 app/src/main/res/layout/prompt_password.xml
delete mode 100644 app/src/main/res/layout/prompt_rename.xml
delete mode 100644 app/src/main/res/layout/template_notice.xml
delete mode 100644 app/src/main/res/layout/view_exchange.xml
delete mode 100644 app/src/main/res/layout/view_exchange_edit.xml
delete mode 100644 app/src/main/res/layout/view_onboarding.xml
delete mode 100644 app/src/main/res/layout/view_send_progress.xml
delete mode 100644 app/src/main/res/layout/view_toolbar.xml
delete mode 100644 app/src/main/res/menu/create_wallet_keys.xml
delete mode 100644 app/src/main/res/menu/create_wallet_ledger.xml
delete mode 100644 app/src/main/res/menu/create_wallet_new.xml
delete mode 100644 app/src/main/res/menu/create_wallet_seed.xml
delete mode 100644 app/src/main/res/menu/create_wallet_view.xml
delete mode 100644 app/src/main/res/menu/drawer_view.xml
delete mode 100644 app/src/main/res/menu/list_context_menu.xml
delete mode 100644 app/src/main/res/menu/list_menu.xml
delete mode 100644 app/src/main/res/menu/node_menu.xml
delete mode 100644 app/src/main/res/menu/receive_menu.xml
delete mode 100644 app/src/main/res/menu/send_menu.xml
delete mode 100644 app/src/main/res/menu/tx_info_menu.xml
delete mode 100644 app/src/main/res/menu/wallet_details_help_menu.xml
delete mode 100644 app/src/main/res/menu/wallet_details_menu.xml
delete mode 100644 app/src/main/res/menu/wallet_menu.xml
create mode 100644 app/src/main/res/navigation/main_nav.xml
delete mode 100644 app/src/main/res/values-cat/about.xml
delete mode 100644 app/src/main/res/values-cat/help.xml
delete mode 100644 app/src/main/res/values-cat/strings.xml
delete mode 100644 app/src/main/res/values-de/about.xml
delete mode 100644 app/src/main/res/values-de/help.xml
delete mode 100644 app/src/main/res/values-de/strings.xml
delete mode 100644 app/src/main/res/values-el/about.xml
delete mode 100644 app/src/main/res/values-el/help.xml
delete mode 100644 app/src/main/res/values-el/strings.xml
delete mode 100644 app/src/main/res/values-eo/about.xml
delete mode 100644 app/src/main/res/values-eo/help.xml
delete mode 100644 app/src/main/res/values-eo/strings.xml
delete mode 100644 app/src/main/res/values-es/about.xml
delete mode 100644 app/src/main/res/values-es/help.xml
delete mode 100644 app/src/main/res/values-es/strings.xml
delete mode 100644 app/src/main/res/values-et/about.xml
delete mode 100644 app/src/main/res/values-et/help.xml
delete mode 100644 app/src/main/res/values-et/strings.xml
delete mode 100644 app/src/main/res/values-fa/about.xml
delete mode 100644 app/src/main/res/values-fa/help.xml
delete mode 100644 app/src/main/res/values-fa/strings.xml
delete mode 100644 app/src/main/res/values-fr/about.xml
delete mode 100644 app/src/main/res/values-fr/help.xml
delete mode 100644 app/src/main/res/values-fr/strings.xml
delete mode 100644 app/src/main/res/values-hu/about.xml
delete mode 100644 app/src/main/res/values-hu/help.xml
delete mode 100644 app/src/main/res/values-hu/strings.xml
delete mode 100644 app/src/main/res/values-it/about.xml
delete mode 100644 app/src/main/res/values-it/help.xml
delete mode 100644 app/src/main/res/values-it/strings.xml
delete mode 100644 app/src/main/res/values-ja/about.xml
delete mode 100644 app/src/main/res/values-ja/help.xml
delete mode 100644 app/src/main/res/values-ja/strings.xml
create mode 100644 app/src/main/res/values-land/dimens.xml
delete mode 100644 app/src/main/res/values-nb/about.xml
delete mode 100644 app/src/main/res/values-nb/help.xml
delete mode 100644 app/src/main/res/values-nb/strings.xml
delete mode 100644 app/src/main/res/values-nl/about.xml
delete mode 100644 app/src/main/res/values-nl/help.xml
delete mode 100644 app/src/main/res/values-nl/strings.xml
delete mode 100755 app/src/main/res/values-pt-rBR/about.xml
delete mode 100755 app/src/main/res/values-pt-rBR/help.xml
delete mode 100755 app/src/main/res/values-pt-rBR/strings.xml
delete mode 100644 app/src/main/res/values-pt/about.xml
delete mode 100644 app/src/main/res/values-pt/help.xml
delete mode 100644 app/src/main/res/values-pt/strings.xml
delete mode 100644 app/src/main/res/values-ro/about.xml
delete mode 100644 app/src/main/res/values-ro/help.xml
delete mode 100644 app/src/main/res/values-ro/strings.xml
delete mode 100644 app/src/main/res/values-ru/about.xml
delete mode 100644 app/src/main/res/values-ru/help.xml
delete mode 100644 app/src/main/res/values-ru/strings.xml
delete mode 100644 app/src/main/res/values-sk/about.xml
delete mode 100644 app/src/main/res/values-sk/help.xml
delete mode 100644 app/src/main/res/values-sk/strings.xml
delete mode 100644 app/src/main/res/values-sr/about.xml
delete mode 100644 app/src/main/res/values-sr/help.xml
delete mode 100644 app/src/main/res/values-sr/strings.xml
delete mode 100644 app/src/main/res/values-sv/about.xml
delete mode 100644 app/src/main/res/values-sv/help.xml
delete mode 100644 app/src/main/res/values-sv/strings.xml
delete mode 100644 app/src/main/res/values-ta/about.xml
delete mode 100644 app/src/main/res/values-ta/help.xml
delete mode 100644 app/src/main/res/values-ta/strings.xml
delete mode 100644 app/src/main/res/values-uk/about.xml
delete mode 100644 app/src/main/res/values-uk/help.xml
delete mode 100644 app/src/main/res/values-uk/strings.xml
delete mode 100644 app/src/main/res/values-zh-rCN/about.xml
delete mode 100644 app/src/main/res/values-zh-rCN/help.xml
delete mode 100644 app/src/main/res/values-zh-rCN/strings.xml
delete mode 100644 app/src/main/res/values-zh-rTW/about.xml
delete mode 100644 app/src/main/res/values-zh-rTW/help.xml
delete mode 100644 app/src/main/res/values-zh-rTW/strings.xml
diff --git a/LICENSE b/LICENSE
index f29b709..8dada3e 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,21 +1,201 @@
-MIT License
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
-Copyright (c) 2022 pokkst
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
+ 1. Definitions.
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ 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.
diff --git a/README.md b/README.md
index 87adf83..284959c 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,49 @@
-# monero-wallet
-WIP Monero Wallet
+# Monerujo
+Another Android Monero Wallet for Monero
+ **(not
+ Monero Classic,
+ Monero-Classic,
+ Monero Zero,
+ Monero Original,
+ Monero C,
+ Monero V)**
+
+### QUICKSTART
+- Download the APK for the most current release [here](https://github.com/m2049r/xmrwallet/releases) and install it
+- Alternatively add our F-Droid repo https://f-droid.monerujo.io/fdroid/repo with fingerpint ```A8 2C 68 E1 4A F0 AA 6A 2E C2 0E 6B 27 2E FF 25 E5 A0 38 F3 F6 58 84 31 6E 0F 5E 0D 91 E7 B7 13``` to your F-Droid client
+- Run the App and select "Generate Wallet" to create a new wallet or recover a wallet
+- Advanced users can copy over synced wallet files (all files) onto sdcard in directory Monerujo (created first time App is started)
+- See the [FAQ](doc/FAQ.md)
+
+## Translations
+Help us translate Monerujo! You can find instructions for adding a new translation or updating an existent one in [this guide](https://github.com/monero-ecosystem/monero-translations/blob/master/translate-monerujo.md), but is suggested to contact the Monero Localization Workgroup first if you have any doubt or question. You can do so in many ways. For example by email: translate@getmonero.org or chatting in `#monero-translations` (chatroom on Freenode, matrix and MatterMost). To see the complete list of contacts, take a look at the [official repository of the workgroup on GitHub](https://github.com/monero-ecosystem/monero-translations/blob/master/README.md#contacts).
+
+### Disclaimer
+You may lose all your Moneroj if you use this App. Be cautious when spending on the mainnet.
+
+### Random Notes
+- works on the mainnet & stagenet
+- use your own daemon - it's easy
+- Monerujo means "Monero Wallet" according to https://www.reddit.com/r/Monero/comments/3exy7t/esperanto_corner/
+
+### TODO
+- see taiga.getmonero.org & issues on github
+
+### Issues / Pitfalls
+- Users of Zenfone MAX & Zenfone 2 Laser (possibly others) **MUST** use the armeabi-v7a APK as the arm64-v8a build uses hardware AES
+functionality these models don't have.
+- You should backup your wallet files in the "monerujo" folder periodically.
+- Also note, that on some devices the backups will only be visible on a PC over USB after a reboot of the device (it's an Android bug/feature)
+- Created wallets on a private testnet are unusable because the restore height is set to that
+of the "real" testnet. After creating a new wallet, make a **new** one by recovering from the seed.
+The official monero client shows the same behaviour.
+
+### HOW TO BUILD
+
+See [the instructions](doc/BUILDING-external-libs.md)
+
+Then, fire up Android Studio and build the APK.
+
+### Donations
+- Address: 4AdkPJoxn7JCvAby9szgnt93MSEwdnxdhaASxbTBm6x5dCwmsDep2UYN4FhStDn5i11nsJbpU7oj59ahg8gXb1Mg3viqCuk
+- Viewkey: b1aff2a12191723da0afbe75516f94dd8b068215f6e847d8da57aca5f1f98e0c
diff --git a/app/build.gradle b/app/build.gradle
index 40e250f..0e61e27 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -112,6 +112,9 @@ android {
targetCompatibility JavaVersion.VERSION_1_8
}
namespace 'com.m2049r.xmrwallet'
+ buildFeatures {
+ viewBinding true
+ }
}
static def getId(name) {
@@ -146,6 +149,10 @@ dependencies {
implementation 'org.jitsi:dnssecjava:1.2.0'
implementation 'org.slf4j:slf4j-nop:1.7.36'
implementation 'com.github.brnunes:swipeablerecyclerview:1.0.2'
+ implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1'
+ implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
+ implementation 'androidx.navigation:navigation-fragment:2.5.1'
+ implementation 'androidx.navigation:navigation-ui:2.5.1'
//noinspection GradleDependency
testImplementation "junit:junit:4.13.2"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4e9ab3e..a43e517 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,5 +1,6 @@
-
+
@@ -28,7 +29,6 @@
+ android:exported="true">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
0) {
- Handler handler = new Handler();
- handler.postDelayed(new Runnable() {
- public void run() {
- if (progressDialog != null) progressDialog.show();
- }
- }, delayMillis);
- } else {
- progressDialog.show();
- }
- }
-
- @Override
- public void showLedgerProgressDialog(int mode) {
- dismissProgressDialog(); // just in case
- progressDialog = new LedgerProgressDialog(BaseActivity.this, mode);
- Ledger.setListener((Ledger.Listener) progressDialog);
- progressDialog.show();
- }
-
- @Override
- public void dismissProgressDialog() {
- if (progressDialog == null) return; // nothing to do
- if (progressDialog instanceof Ledger.Listener) {
- Ledger.unsetListener((Ledger.Listener) progressDialog);
- }
- if (progressDialog.isShowing()) {
- progressDialog.dismiss();
- }
- progressDialog = null;
- }
-
- static final int RELEASE_WAKE_LOCK_DELAY = 5000; // millisconds
-
- private PowerManager.WakeLock wl = null;
-
- void acquireWakeLock() {
- if ((wl != null) && wl.isHeld()) return;
- PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
- this.wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, getString(R.string.app_name));
- try {
- wl.acquire();
- Timber.d("WakeLock acquired");
- } catch (SecurityException ex) {
- Timber.w("WakeLock NOT acquired: %s", ex.getLocalizedMessage());
- wl = null;
- }
- }
-
- void releaseWakeLock(int delayMillis) {
- Handler handler = new Handler(Looper.getMainLooper());
- handler.postDelayed(new Runnable() {
- @Override
- public void run() {
- releaseWakeLock();
- }
- }, delayMillis);
- }
-
- void releaseWakeLock() {
- if ((wl == null) || !wl.isHeld()) return;
- wl.release();
- wl = null;
- Timber.d("WakeLock released");
- }
-
-
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- initNfc();
- }
-
- @Override
- protected void onPostResume() {
- super.onPostResume();
- if (nfcAdapter != null) {
- nfcAdapter.enableForegroundDispatch(this, nfcPendingIntent, null, null);
- // intercept all techs so we can tell the user their tag is no good
- }
- }
-
- @Override
- protected void onPause() {
- Timber.d("onPause()");
- if (nfcAdapter != null)
- nfcAdapter.disableForegroundDispatch(this);
- super.onPause();
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- processNfcIntent(intent);
- }
-
- // NFC stuff
- private NfcAdapter nfcAdapter;
- private PendingIntent nfcPendingIntent;
-
- public void initNfc() {
- nfcAdapter = NfcAdapter.getDefaultAdapter(this);
- if (nfcAdapter == null) // no NFC support
- return;
- nfcPendingIntent = PendingIntent.getActivity(this, 0,
- new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
- Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_IMMUTABLE : 0);
- }
-
- private void processNfcIntent(Intent intent) {
- String action = intent.getAction();
- Timber.d("ACTION=%s", action);
- if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)
- || NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)
- || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
- Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
- Ndef ndef = Ndef.get(tag);
- if (ndef == null) {
- Toast.makeText(this, getString(R.string.nfc_tag_unsupported), Toast.LENGTH_LONG).show();
- return;
- }
-
- Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
- if (f instanceof ReceiveFragment) {
- // We want to write a Tag from the ReceiveFragment
- BarcodeData bc = ((ReceiveFragment) f).getBarcodeData();
- if (bc != null) {
- new AsyncWriteTag(ndef, bc.getUri()).execute();
- } // else wallet is not loaded yet or receive is otherwise not ready - ignore
- } else if (f instanceof SendFragment) {
- // We want to read a Tag for the SendFragment
- NdefMessage ndefMessage = ndef.getCachedNdefMessage();
- if (ndefMessage == null) {
- Toast.makeText(this, getString(R.string.nfc_tag_read_undef), Toast.LENGTH_LONG).show();
- return;
- }
- NdefRecord firstRecord = ndefMessage.getRecords()[0];
- Uri uri = firstRecord.toUri(); // we insist on the first record
- if (uri == null) {
- Toast.makeText(this, getString(R.string.nfc_tag_read_undef), Toast.LENGTH_LONG).show();
- } else {
- BarcodeData bc = BarcodeData.fromString(uri.toString());
- if (bc == null)
- Toast.makeText(this, getString(R.string.nfc_tag_read_undef), Toast.LENGTH_LONG).show();
- else
- onUriScanned(bc);
- }
- }
- }
- }
-
- // this gets called only if we get data
- @CallSuper
- void onUriScanned(BarcodeData barcodeData) {
- // do nothing by default yet
- }
-
- private BarcodeData barcodeData = null;
-
- private BarcodeData popBarcodeData() {
- BarcodeData popped = barcodeData;
- barcodeData = null;
- return popped;
- }
-
- private class AsyncWriteTag extends AsyncTask {
-
- Ndef ndef;
- Uri uri;
- String errorMessage = null;
-
- AsyncWriteTag(Ndef ndef, Uri uri) {
- this.ndef = ndef;
- this.uri = uri;
- }
-
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- showProgressDialog(R.string.progress_nfc_write);
- }
-
- @Override
- protected Boolean doInBackground(Void... params) {
- if (params.length != 0) return false;
- try {
- writeNdef(ndef, uri);
- return true;
- } catch (IOException | FormatException ex) {
- Timber.e(ex);
- } catch (IllegalArgumentException ex) {
- errorMessage = ex.getMessage();
- Timber.d(errorMessage);
- } finally {
- try {
- ndef.close();
- } catch (IOException ex) {
- Timber.e(ex);
- }
- }
- return false;
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- super.onPostExecute(result);
- if (isDestroyed()) {
- return;
- }
- dismissProgressDialog();
- if (!result) {
- if (errorMessage != null)
- Toast.makeText(getApplicationContext(), errorMessage, Toast.LENGTH_LONG).show();
- else
- Toast.makeText(getApplicationContext(), getString(R.string.nfc_write_failed), Toast.LENGTH_LONG).show();
- } else {
- Toast.makeText(getApplicationContext(), getString(R.string.nfc_write_successful), Toast.LENGTH_SHORT).show();
- }
- }
- }
-
- void writeNdef(Ndef ndef, Uri uri) throws IOException, FormatException {
- NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
- if (nfcAdapter == null) return; // no NFC support here
-
- NdefRecord recordNFC = NdefRecord.createUri(uri);
- NdefMessage message = new NdefMessage(recordNFC);
- ndef.connect();
- int tagSize = ndef.getMaxSize();
- int msgSize = message.getByteArrayLength();
- Timber.d("tagSize=%d, msgSIze=%d, uriSize=%d", tagSize, msgSize, uri.toString().length());
- if (tagSize < msgSize)
- throw new IllegalArgumentException(getString(R.string.nfc_tag_size, tagSize, msgSize));
- ndef.writeNdefMessage(message);
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java b/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java
deleted file mode 100644
index 6370e99..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java
+++ /dev/null
@@ -1,615 +0,0 @@
-/*
- * 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;
-
-import androidx.annotation.NonNull;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.Html;
-import android.text.InputType;
-import android.text.TextWatcher;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.view.inputmethod.EditorInfo;
-import android.widget.Button;
-import android.widget.LinearLayout;
-
-import androidx.annotation.Nullable;
-import androidx.appcompat.app.AlertDialog;
-import androidx.fragment.app.Fragment;
-
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.google.android.material.switchmaterial.SwitchMaterial;
-import com.google.android.material.textfield.TextInputLayout;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.model.WalletManager;
-import com.m2049r.xmrwallet.util.FingerprintHelper;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.KeyStoreHelper;
-import com.m2049r.xmrwallet.util.RestoreHeight;
-import com.m2049r.xmrwallet.util.ledger.Monero;
-import com.m2049r.xmrwallet.widget.PasswordEntryView;
-import com.m2049r.xmrwallet.widget.Toolbar;
-
-import java.io.File;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-
-import timber.log.Timber;
-
-public class GenerateFragment extends Fragment {
-
- 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_LEDGER = "ledger";
- static final String TYPE_VIEWONLY = "view";
-
- private TextInputLayout etWalletName;
- private PasswordEntryView etWalletPassword;
- private LinearLayout llFingerprintAuth;
- private TextInputLayout etWalletAddress;
- private TextInputLayout etWalletMnemonic;
- private TextInputLayout etWalletViewKey;
- private TextInputLayout etWalletSpendKey;
- private TextInputLayout etWalletRestoreHeight;
- private Button bGenerate;
-
- private Button bSeedOffset;
- private TextInputLayout etSeedOffset;
-
- private String type = null;
-
- private void clearErrorOnTextEntry(final TextInputLayout textInputLayout) {
- textInputLayout.getEditText().addTextChangedListener(new TextWatcher() {
- @Override
- public void afterTextChanged(Editable editable) {
- textInputLayout.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) {
- }
- });
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
-
- Bundle args = getArguments();
- this.type = args.getString(TYPE);
-
- View view = inflater.inflate(R.layout.fragment_generate, container, false);
-
- etWalletName = view.findViewById(R.id.etWalletName);
- etWalletPassword = view.findViewById(R.id.etWalletPassword);
- llFingerprintAuth = view.findViewById(R.id.llFingerprintAuth);
- etWalletMnemonic = view.findViewById(R.id.etWalletMnemonic);
- etWalletAddress = view.findViewById(R.id.etWalletAddress);
- etWalletViewKey = view.findViewById(R.id.etWalletViewKey);
- etWalletSpendKey = view.findViewById(R.id.etWalletSpendKey);
- etWalletRestoreHeight = view.findViewById(R.id.etWalletRestoreHeight);
- bGenerate = view.findViewById(R.id.bGenerate);
- bSeedOffset = view.findViewById(R.id.bSeedOffset);
- etSeedOffset = view.findViewById(R.id.etSeedOffset);
-
- 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);
-
- etWalletName.getEditText().setOnFocusChangeListener((v, hasFocus) -> {
- if (!hasFocus) {
- checkName();
- }
- });
- clearErrorOnTextEntry(etWalletName);
-
- etWalletMnemonic.getEditText().setOnFocusChangeListener((v, hasFocus) -> {
- if (!hasFocus) {
- checkMnemonic();
- }
- });
- clearErrorOnTextEntry(etWalletMnemonic);
-
- etWalletAddress.getEditText().setOnFocusChangeListener((v, hasFocus) -> {
- if (!hasFocus) {
- checkAddress();
- }
- });
- clearErrorOnTextEntry(etWalletAddress);
-
- etWalletViewKey.getEditText().setOnFocusChangeListener((v, hasFocus) -> {
- if (!hasFocus) {
- checkViewKey();
- }
- });
- clearErrorOnTextEntry(etWalletViewKey);
-
- etWalletSpendKey.getEditText().setOnFocusChangeListener((v, hasFocus) -> {
- if (!hasFocus) {
- checkSpendKey();
- }
- });
- clearErrorOnTextEntry(etWalletSpendKey);
-
- Helper.showKeyboard(requireActivity());
-
- etWalletName.getEditText().setOnEditorActionListener((v, actionId, event) -> {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_NEXT)) {
- if (checkName()) {
- etWalletPassword.requestFocus();
- } // otherwise ignore
- return true;
- }
- return false;
- });
-
- if (FingerprintHelper.isDeviceSupported(getContext())) {
- llFingerprintAuth.setVisibility(View.VISIBLE);
-
- final SwitchMaterial swFingerprintAllowed = (SwitchMaterial) llFingerprintAuth.getChildAt(0);
- swFingerprintAllowed.setOnClickListener(view1 -> {
- if (!swFingerprintAllowed.isChecked()) return;
-
- MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireActivity());
- builder.setMessage(Html.fromHtml(getString(R.string.generate_fingerprint_warn)))
- .setCancelable(false)
- .setPositiveButton(getString(R.string.label_ok), null)
- .setNegativeButton(getString(R.string.label_cancel), (dialogInterface, i) -> swFingerprintAllowed.setChecked(false))
- .show();
- });
- }
-
- switch (type) {
- case TYPE_NEW:
- etWalletPassword.getEditText().setImeOptions(EditorInfo.IME_ACTION_UNSPECIFIED);
- break;
- case TYPE_LEDGER:
- etWalletPassword.getEditText().setImeOptions(EditorInfo.IME_ACTION_DONE);
- etWalletPassword.getEditText().setOnEditorActionListener((v, actionId, event) -> {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_DONE)) {
- etWalletRestoreHeight.requestFocus();
- return true;
- }
- return false;
- });
- break;
- case TYPE_SEED:
- etWalletPassword.getEditText().setOnEditorActionListener((v, actionId, event) -> {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_NEXT)) {
- etWalletMnemonic.requestFocus();
- return true;
- }
- return false;
- });
- etWalletMnemonic.setVisibility(View.VISIBLE);
- etWalletMnemonic.getEditText().setOnEditorActionListener((v, actionId, event) -> {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_NEXT)) {
- if (checkMnemonic()) {
- etWalletRestoreHeight.requestFocus();
- }
- return true;
- }
- return false;
- });
- bSeedOffset.setVisibility(View.VISIBLE);
- bSeedOffset.setOnClickListener(v -> toggleSeedOffset());
- break;
- case TYPE_KEY:
- case TYPE_VIEWONLY:
- etWalletPassword.getEditText().setOnEditorActionListener((v, actionId, event) -> {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_NEXT)) {
- etWalletAddress.requestFocus();
- return true;
- }
- return false;
- });
- etWalletAddress.setVisibility(View.VISIBLE);
- etWalletAddress.getEditText().setOnEditorActionListener((v, actionId, event) -> {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_NEXT)) {
- if (checkAddress()) {
- etWalletViewKey.requestFocus();
- }
- return true;
- }
- return false;
- });
- etWalletViewKey.setVisibility(View.VISIBLE);
- etWalletViewKey.getEditText().setOnEditorActionListener((v, actionId, event) -> {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_NEXT)) {
- if (checkViewKey()) {
- if (type.equals(TYPE_KEY)) {
- etWalletSpendKey.requestFocus();
- } else {
- etWalletRestoreHeight.requestFocus();
- }
- }
- return true;
- }
- return false;
- });
- break;
- }
- if (type.equals(TYPE_KEY)) {
- etWalletSpendKey.setVisibility(View.VISIBLE);
- etWalletSpendKey.getEditText().setOnEditorActionListener((v, actionId, event) -> {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_NEXT)) {
- if (checkSpendKey()) {
- etWalletRestoreHeight.requestFocus();
- }
- return true;
- }
- return false;
- });
- }
- if (!type.equals(TYPE_NEW)) {
- etWalletRestoreHeight.setVisibility(View.VISIBLE);
- etWalletRestoreHeight.getEditText().setImeOptions(EditorInfo.IME_ACTION_UNSPECIFIED);
- }
- bGenerate.setOnClickListener(v -> {
- Helper.hideKeyboard(getActivity());
- generateWallet();
- });
-
- etWalletName.requestFocus();
-
- return view;
- }
-
- void toggleSeedOffset() {
- if (etSeedOffset.getVisibility() == View.VISIBLE) {
- etSeedOffset.getEditText().getText().clear();
- etSeedOffset.setVisibility(View.GONE);
- bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_keyboard_arrow_down, 0, 0, 0);
- } else {
- etSeedOffset.setVisibility(View.VISIBLE);
- bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_keyboard_arrow_up, 0, 0, 0);
- etSeedOffset.requestFocusFromTouch();
- }
- }
-
- 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 checkHeight() {
- long height = !type.equals(TYPE_NEW) ? getHeight() : 0;
- boolean ok = true;
- if (height < 0) {
- etWalletRestoreHeight.setError(getString(R.string.generate_restoreheight_error));
- ok = false;
- }
- if (ok) {
- etWalletRestoreHeight.setError(null);
- }
- return ok;
- }
-
- private long getHeight() {
- long height = -1;
-
- String restoreHeight = etWalletRestoreHeight.getEditText().getText().toString().trim();
- if (restoreHeight.isEmpty()) return -1;
- try {
- // is it a date?
- SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd");
- parser.setLenient(false);
- height = RestoreHeight.getInstance().getHeight(parser.parse(restoreHeight));
- } catch (ParseException ignored) {
- }
- if ((height < 0) && (restoreHeight.length() == 8))
- try {
- // is it a date without dashes?
- SimpleDateFormat parser = new SimpleDateFormat("yyyyMMdd");
- parser.setLenient(false);
- height = RestoreHeight.getInstance().getHeight(parser.parse(restoreHeight));
- } catch (ParseException ignored) {
- }
- if (height < 0)
- try {
- // or is it a height?
- height = Long.parseLong(restoreHeight);
- } catch (NumberFormatException ex) {
- return -1;
- }
- Timber.d("Using Restore Height = %d", height);
- return height;
- }
-
- 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 checkAddress() {
- String address = etWalletAddress.getEditText().getText().toString();
- boolean ok = Wallet.isAddressValid(address);
- if (!ok) {
- etWalletAddress.setError(getString(R.string.generate_check_address));
- } else {
- etWalletAddress.setError(null);
- }
- return ok;
- }
-
- 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() {
- if (!checkName()) return;
- if (!checkHeight()) return;
-
- String name = etWalletName.getEditText().getText().toString();
- String password = etWalletPassword.getEditText().getText().toString();
- boolean fingerprintAuthAllowed = ((SwitchMaterial) llFingerprintAuth.getChildAt(0)).isChecked();
-
- // create the real wallet password
- String crazyPass = KeyStoreHelper.getCrazyPass(getActivity(), password);
-
- long height = getHeight();
- if (height < 0) height = 0;
-
- switch (type) {
- case TYPE_NEW:
- bGenerate.setEnabled(false);
- if (fingerprintAuthAllowed) {
- KeyStoreHelper.saveWalletUserPass(requireActivity(), name, password);
- }
- activityCallback.onGenerate(name, crazyPass);
- break;
- case TYPE_SEED:
- if (!checkMnemonic()) return;
- final String seed = etWalletMnemonic.getEditText().getText().toString();
- bGenerate.setEnabled(false);
- if (fingerprintAuthAllowed) {
- KeyStoreHelper.saveWalletUserPass(requireActivity(), name, password);
- }
- final String offset = etSeedOffset.getEditText().getText().toString();
- activityCallback.onGenerate(name, crazyPass, seed, offset, height);
- break;
- case TYPE_LEDGER:
- bGenerate.setEnabled(false);
- if (fingerprintAuthAllowed) {
- KeyStoreHelper.saveWalletUserPass(requireActivity(), name, password);
- }
- activityCallback.onGenerateLedger(name, crazyPass, height);
- break;
- case TYPE_KEY:
- case 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();
- }
- if (fingerprintAuthAllowed) {
- KeyStoreHelper.saveWalletUserPass(requireActivity(), name, password);
- }
- activityCallback.onGenerate(name, crazyPass, address, viewKey, spendKey, height);
- }
- break;
- }
- }
-
- public void walletGenerateError() {
- bGenerate.setEnabled(true);
- }
-
- @Override
- public void onResume() {
- super.onResume();
- Timber.d("onResume()");
- activityCallback.setTitle(getString(R.string.generate_title) + " - " + getType());
- activityCallback.setToolbarButton(Toolbar.BUTTON_BACK);
-
- }
-
- String getType() {
- switch (type) {
- case TYPE_KEY:
- return getString(R.string.generate_wallet_type_key);
- case TYPE_NEW:
- return getString(R.string.generate_wallet_type_new);
- case TYPE_SEED:
- return getString(R.string.generate_wallet_type_seed);
- case TYPE_LEDGER:
- return getString(R.string.generate_wallet_type_ledger);
- case TYPE_VIEWONLY:
- return getString(R.string.generate_wallet_type_view);
- default:
- Timber.e("unknown type %s", type);
- return "?";
- }
- }
-
- GenerateFragment.Listener activityCallback;
-
- public interface Listener {
- void onGenerate(String name, String password);
-
- void onGenerate(String name, String password, String seed, String offset, long height);
-
- void onGenerate(String name, String password, String address, String viewKey, String spendKey, long height);
-
- void onGenerateLedger(String name, String password, long height);
-
- void setTitle(String title);
-
- void setToolbarButton(int type);
-
- }
-
- @Override
- public void onAttach(@NonNull Context context) {
- super.onAttach(context);
- if (context instanceof GenerateFragment.Listener) {
- this.activityCallback = (GenerateFragment.Listener) context;
- } else {
- throw new ClassCastException(context.toString()
- + " must implement Listener");
- }
- }
-
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
- }
-
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- switch (type) {
- case TYPE_KEY:
- inflater.inflate(R.menu.create_wallet_keys, menu);
- break;
- case TYPE_NEW:
- inflater.inflate(R.menu.create_wallet_new, menu);
- break;
- case TYPE_SEED:
- inflater.inflate(R.menu.create_wallet_seed, menu);
- break;
- case TYPE_LEDGER:
- inflater.inflate(R.menu.create_wallet_ledger, menu);
- break;
- case TYPE_VIEWONLY:
- inflater.inflate(R.menu.create_wallet_view, menu);
- break;
- default:
- }
- super.onCreateOptionsMenu(menu, inflater);
- }
-
- AlertDialog ledgerDialog = null;
-
- public void convertLedgerSeed() {
- if (ledgerDialog != null) return;
- final Activity activity = requireActivity();
- View promptsView = getLayoutInflater().inflate(R.layout.prompt_ledger_seed, null);
- MaterialAlertDialogBuilder alertDialogBuilder = new MaterialAlertDialogBuilder(activity);
- alertDialogBuilder.setView(promptsView);
-
- final TextInputLayout etSeed = promptsView.findViewById(R.id.etSeed);
- final TextInputLayout etPassphrase = promptsView.findViewById(R.id.etPassphrase);
-
- clearErrorOnTextEntry(etSeed);
-
- alertDialogBuilder
- .setCancelable(false)
- .setPositiveButton(getString(R.string.label_ok), null)
- .setNegativeButton(getString(R.string.label_cancel),
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- Helper.hideKeyboardAlways(activity);
- etWalletMnemonic.getEditText().getText().clear();
- dialog.cancel();
- ledgerDialog = null;
- }
- });
-
- ledgerDialog = alertDialogBuilder.create();
-
- ledgerDialog.setOnShowListener(dialog -> {
- Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
- button.setOnClickListener(view -> {
- String ledgerSeed = etSeed.getEditText().getText().toString();
- String ledgerPassphrase = etPassphrase.getEditText().getText().toString();
- String moneroSeed = Monero.convert(ledgerSeed, ledgerPassphrase);
- if (moneroSeed != null) {
- etWalletMnemonic.getEditText().setText(moneroSeed);
- ledgerDialog.dismiss();
- ledgerDialog = null;
- } else {
- etSeed.setError(getString(R.string.bad_ledger_seed));
- }
- });
- });
-
- if (Helper.preventScreenshot()) {
- ledgerDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
- }
-
- ledgerDialog.show();
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java b/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java
deleted file mode 100644
index cb40b84..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java
+++ /dev/null
@@ -1,711 +0,0 @@
-/*
- * 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;
-
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.Html;
-import android.text.TextWatcher;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.view.inputmethod.EditorInfo;
-import android.widget.Button;
-import android.widget.FrameLayout;
-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 androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.appcompat.app.AlertDialog;
-import androidx.fragment.app.Fragment;
-
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.google.android.material.switchmaterial.SwitchMaterial;
-import com.google.android.material.textfield.TextInputLayout;
-import com.m2049r.xmrwallet.ledger.Ledger;
-import com.m2049r.xmrwallet.ledger.LedgerProgressDialog;
-import com.m2049r.xmrwallet.model.NetworkType;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.model.WalletManager;
-import com.m2049r.xmrwallet.util.FingerprintHelper;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.KeyStoreHelper;
-import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor;
-import com.m2049r.xmrwallet.widget.PasswordEntryView;
-import com.m2049r.xmrwallet.widget.Toolbar;
-
-import java.text.NumberFormat;
-
-import timber.log.Timber;
-
-public class GenerateReviewFragment extends Fragment {
- static final public String VIEW_TYPE_DETAILS = "details";
- static final public String VIEW_TYPE_ACCEPT = "accept";
- static final public String VIEW_TYPE_WALLET = "wallet";
-
- public static final String REQUEST_TYPE = "type";
- public static final String REQUEST_PATH = "path";
- public static final String REQUEST_PASSWORD = "password";
-
- private ScrollView scrollview;
-
- private ProgressBar pbProgress;
- private TextView tvWalletPassword;
- private TextView tvWalletAddress;
- private FrameLayout flWalletMnemonic;
- private TextView tvWalletMnemonic;
- private TextView tvWalletHeight;
- private TextView tvWalletViewKey;
- private TextView tvWalletSpendKey;
- private ImageButton bCopyAddress;
- private LinearLayout llAdvancedInfo;
- private LinearLayout llPassword;
- private LinearLayout llMnemonic;
- private LinearLayout llSpendKey;
- private LinearLayout llViewKey;
- private Button bAdvancedInfo;
- private Button bAccept;
-
- private Button bSeedOffset;
- private TextInputLayout etSeedOffset;
-
- private String walletPath;
- private String walletName;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
-
- View view = inflater.inflate(R.layout.fragment_review, container, false);
-
- scrollview = view.findViewById(R.id.scrollview);
- pbProgress = view.findViewById(R.id.pbProgress);
- tvWalletPassword = view.findViewById(R.id.tvWalletPassword);
- tvWalletAddress = view.findViewById(R.id.tvWalletAddress);
- tvWalletViewKey = view.findViewById(R.id.tvWalletViewKey);
- tvWalletSpendKey = view.findViewById(R.id.tvWalletSpendKey);
- tvWalletMnemonic = view.findViewById(R.id.tvWalletMnemonic);
- flWalletMnemonic = view.findViewById(R.id.flWalletMnemonic);
- tvWalletHeight = view.findViewById(R.id.tvWalletHeight);
- bCopyAddress = view.findViewById(R.id.bCopyAddress);
- bAdvancedInfo = view.findViewById(R.id.bAdvancedInfo);
- llAdvancedInfo = view.findViewById(R.id.llAdvancedInfo);
- llPassword = view.findViewById(R.id.llPassword);
- llMnemonic = view.findViewById(R.id.llMnemonic);
- llSpendKey = view.findViewById(R.id.llSpendKey);
- llViewKey = view.findViewById(R.id.llViewKey);
-
- etSeedOffset = view.findViewById(R.id.etSeedOffset);
- bSeedOffset = view.findViewById(R.id.bSeedOffset);
-
- bAccept = view.findViewById(R.id.bAccept);
-
- boolean allowCopy = WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet;
- tvWalletMnemonic.setTextIsSelectable(allowCopy);
- tvWalletSpendKey.setTextIsSelectable(allowCopy);
- tvWalletPassword.setTextIsSelectable(allowCopy);
-
- bAccept.setOnClickListener(v -> acceptWallet());
- view.findViewById(R.id.bCopyViewKey).setOnClickListener(v -> copyViewKey());
- bCopyAddress.setEnabled(false);
- bCopyAddress.setOnClickListener(v -> copyAddress());
- bAdvancedInfo.setOnClickListener(v -> toggleAdvancedInfo());
-
- bSeedOffset.setOnClickListener(v -> toggleSeedOffset());
- etSeedOffset.getEditText().addTextChangedListener(new TextWatcher() {
- @Override
- public void afterTextChanged(Editable s) {
- showSeed();
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start,
- int count, int after) {
- }
-
- @Override
- public void onTextChanged(CharSequence s, int start,
- int before, int count) {
- }
- });
-
- Bundle args = getArguments();
- type = args.getString(REQUEST_TYPE);
- walletPath = args.getString(REQUEST_PATH);
- localPassword = args.getString(REQUEST_PASSWORD);
- showDetails();
- return view;
- }
-
- String getSeedOffset() {
- return etSeedOffset.getEditText().getText().toString();
- }
-
- boolean seedOffsetInProgress = false;
-
- void showSeed() {
- synchronized (this) {
- if (seedOffsetInProgress) return;
- seedOffsetInProgress = true;
- }
- new AsyncShowSeed().executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR, walletPath);
- }
-
- void showDetails() {
- tvWalletPassword.setText(null);
- new AsyncShow().executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR, walletPath);
- }
-
- void copyViewKey() {
- Helper.clipBoardCopy(requireActivity(), 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(requireActivity(), 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 toggleAdvancedInfo() {
- if (llAdvancedInfo.getVisibility() == View.VISIBLE) {
- llAdvancedInfo.setVisibility(View.GONE);
- bAdvancedInfo.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_keyboard_arrow_down, 0, 0, 0);
- } else {
- llAdvancedInfo.setVisibility(View.VISIBLE);
- bAdvancedInfo.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_keyboard_arrow_up, 0, 0, 0);
- scrollview.post(() -> scrollview.fullScroll(ScrollView.FOCUS_DOWN));
- }
- }
-
- void toggleSeedOffset() {
- if (etSeedOffset.getVisibility() == View.VISIBLE) {
- etSeedOffset.getEditText().getText().clear();
- etSeedOffset.setVisibility(View.GONE);
- bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_keyboard_arrow_down, 0, 0, 0);
- } else {
- etSeedOffset.setVisibility(View.VISIBLE);
- bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_keyboard_arrow_up, 0, 0, 0);
- etSeedOffset.requestFocusFromTouch();
- }
- }
-
- String type;
-
- private void acceptWallet() {
- bAccept.setEnabled(false);
- acceptCallback.onAccept(walletName, getPassword());
- }
-
- private class AsyncShow extends AsyncTask {
- String name;
- String address;
- long height;
- String seed;
- String viewKey;
- String spendKey;
- Wallet.Status walletStatus;
-
- boolean dialogOpened = false;
-
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- showProgress();
- if ((walletPath != null)
- && (WalletManager.getInstance().queryWalletDevice(walletPath + ".keys", getPassword())
- == Wallet.Device.Device_Ledger)
- && (progressCallback != null)) {
- progressCallback.showLedgerProgressDialog(LedgerProgressDialog.TYPE_RESTORE);
- dialogOpened = true;
- }
- }
-
- @Override
- protected Boolean doInBackground(String... params) {
- if (params.length != 1) return false;
- String walletPath = params[0];
-
- Wallet wallet;
- boolean closeWallet;
- if (type.equals(GenerateReviewFragment.VIEW_TYPE_WALLET)) {
- wallet = GenerateReviewFragment.this.walletCallback.getWallet();
- closeWallet = false;
- } else {
- wallet = WalletManager.getInstance().openWallet(walletPath, getPassword());
- closeWallet = true;
- }
- name = wallet.getName();
- walletStatus = wallet.getStatus();
- if (!walletStatus.isOk()) {
- if (closeWallet) wallet.close();
- return false;
- }
-
- address = wallet.getAddress();
- height = wallet.getRestoreHeight();
- seed = wallet.getSeed(getSeedOffset());
- switch (wallet.getDeviceType()) {
- case Device_Ledger:
- viewKey = Ledger.Key();
- break;
- case Device_Software:
- viewKey = wallet.getSecretViewKey();
- break;
- default:
- throw new IllegalStateException("Hardware backing not supported. At all!");
- }
- spendKey = wallet.isWatchOnly() ? getActivity().getString(R.string.label_watchonly) : wallet.getSecretSpendKey();
- if (closeWallet) wallet.close();
- return true;
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- super.onPostExecute(result);
- if (dialogOpened)
- progressCallback.dismissProgressDialog();
- if (!isAdded()) return; // never mind
- walletName = name;
- if (result) {
- if (type.equals(GenerateReviewFragment.VIEW_TYPE_ACCEPT)) {
- bAccept.setVisibility(View.VISIBLE);
- bAccept.setEnabled(true);
- }
- llPassword.setVisibility(View.VISIBLE);
- tvWalletPassword.setText(getPassword());
- tvWalletAddress.setText(address);
- tvWalletHeight.setText(NumberFormat.getInstance().format(height));
- if (!seed.isEmpty()) {
- llMnemonic.setVisibility(View.VISIBLE);
- tvWalletMnemonic.setText(seed);
- }
- boolean showAdvanced = false;
- if (isKeyValid(viewKey)) {
- llViewKey.setVisibility(View.VISIBLE);
- tvWalletViewKey.setText(viewKey);
- showAdvanced = true;
- }
- if (isKeyValid(spendKey)) {
- llSpendKey.setVisibility(View.VISIBLE);
- tvWalletSpendKey.setText(spendKey);
- showAdvanced = true;
- }
- if (showAdvanced) bAdvancedInfo.setVisibility(View.VISIBLE);
- bCopyAddress.setEnabled(true);
- 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 and/or end the fragment?
- tvWalletAddress.setText(walletStatus.toString());
- tvWalletHeight.setText(walletStatus.toString());
- tvWalletMnemonic.setText(walletStatus.toString());
- tvWalletViewKey.setText(walletStatus.toString());
- tvWalletSpendKey.setText(walletStatus.toString());
- }
- hideProgress();
- }
- }
-
- Listener activityCallback = null;
- ProgressListener progressCallback = null;
- AcceptListener acceptCallback = null;
- ListenerWithWallet walletCallback = null;
- PasswordChangedListener passwordCallback = null;
-
- public interface Listener {
- void setTitle(String title, String subtitle);
-
- void setToolbarButton(int type);
- }
-
- public interface ProgressListener {
- void showProgressDialog(int msgId);
-
- void showLedgerProgressDialog(int mode);
-
- void dismissProgressDialog();
- }
-
- public interface AcceptListener {
- void onAccept(String name, String password);
- }
-
- public interface ListenerWithWallet {
- Wallet getWallet();
- }
-
- public interface PasswordChangedListener {
- void onPasswordChanged(String newPassword);
-
- String getPassword();
- }
-
- private String localPassword = null;
-
- private String getPassword() {
- if (passwordCallback != null) return passwordCallback.getPassword();
- return localPassword;
- }
-
- private void setPassword(String password) {
- if (passwordCallback != null) passwordCallback.onPasswordChanged(password);
- else localPassword = password;
- }
-
- @Override
- public void onAttach(@NonNull Context context) {
- super.onAttach(context);
- if (context instanceof Listener) {
- this.activityCallback = (Listener) context;
- }
- if (context instanceof ProgressListener) {
- this.progressCallback = (ProgressListener) context;
- }
- if (context instanceof AcceptListener) {
- this.acceptCallback = (AcceptListener) context;
- }
- if (context instanceof ListenerWithWallet) {
- this.walletCallback = (ListenerWithWallet) context;
- }
- if (context instanceof PasswordChangedListener) {
- this.passwordCallback = (PasswordChangedListener) context;
- }
- }
-
- @Override
- public void onResume() {
- super.onResume();
- Timber.d("onResume()");
- activityCallback.setTitle(walletName, getString(R.string.details_title));
- activityCallback.setToolbarButton(
- GenerateReviewFragment.VIEW_TYPE_ACCEPT.equals(type) ? Toolbar.BUTTON_NONE : Toolbar.BUTTON_BACK);
- }
-
- public void showProgress() {
- pbProgress.setVisibility(View.VISIBLE);
- }
-
- public void hideProgress() {
- pbProgress.setVisibility(View.INVISIBLE);
- }
-
- boolean backOk() {
- return !type.equals(GenerateReviewFragment.VIEW_TYPE_ACCEPT);
- }
-
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
- }
-
- @Override
- public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
- String type = getArguments().getString(REQUEST_TYPE); // intance variable not set yet
- if (GenerateReviewFragment.VIEW_TYPE_ACCEPT.equals(type)) {
- inflater.inflate(R.menu.wallet_details_help_menu, menu);
- super.onCreateOptionsMenu(menu, inflater);
- } else {
- inflater.inflate(R.menu.wallet_details_menu, menu);
- super.onCreateOptionsMenu(menu, inflater);
- }
- }
-
- boolean changeWalletPassword(String newPassword) {
- Wallet wallet;
- boolean closeWallet;
- if (type.equals(GenerateReviewFragment.VIEW_TYPE_WALLET)) {
- wallet = GenerateReviewFragment.this.walletCallback.getWallet();
- closeWallet = false;
- } else {
- wallet = WalletManager.getInstance().openWallet(walletPath, getPassword());
- closeWallet = true;
- }
-
- boolean ok = false;
- Wallet.Status walletStatus = wallet.getStatus();
- if (walletStatus.isOk()) {
- wallet.setPassword(newPassword);
- ok = true;
- }
- if (closeWallet) wallet.close();
- return ok;
- }
-
- private class AsyncChangePassword extends AsyncTask {
- String newPassword;
-
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- if (progressCallback != null)
- progressCallback.showProgressDialog(R.string.changepw_progress);
- }
-
- @Override
- protected Boolean doInBackground(String... params) {
- if (params.length != 2) return false;
- final String userPassword = params[0];
- final boolean fingerPassValid = Boolean.parseBoolean(params[1]);
- newPassword = KeyStoreHelper.getCrazyPass(getActivity(), userPassword);
- final boolean success = changeWalletPassword(newPassword);
- if (success) {
- Context ctx = getActivity();
- if (ctx != null)
- if (fingerPassValid) {
- KeyStoreHelper.saveWalletUserPass(ctx, walletName, userPassword);
- } else {
- KeyStoreHelper.removeWalletUserPass(ctx, walletName);
- }
- }
- return success;
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- super.onPostExecute(result);
- if ((getActivity() == null) || getActivity().isDestroyed()) {
- return;
- }
- if (progressCallback != null)
- progressCallback.dismissProgressDialog();
- if (result) {
- Toast.makeText(getActivity(), getString(R.string.changepw_success), Toast.LENGTH_SHORT).show();
- setPassword(newPassword);
- showDetails();
- } else {
- Toast.makeText(getActivity(), getString(R.string.changepw_failed), Toast.LENGTH_LONG).show();
- }
- }
- }
-
- AlertDialog openDialog = null; // for preventing opening of multiple dialogs
-
- public AlertDialog createChangePasswordDialog() {
- if (openDialog != null) return null; // we are already open
- LayoutInflater li = LayoutInflater.from(getActivity());
- View promptsView = li.inflate(R.layout.prompt_changepw, null);
-
- AlertDialog.Builder alertDialogBuilder = new MaterialAlertDialogBuilder(requireActivity());
- alertDialogBuilder.setView(promptsView);
-
- final PasswordEntryView etPasswordA = promptsView.findViewById(R.id.etWalletPasswordA);
- etPasswordA.setHint(getString(R.string.prompt_changepw, walletName));
-
- final TextInputLayout etPasswordB = promptsView.findViewById(R.id.etWalletPasswordB);
- etPasswordB.setHint(getString(R.string.prompt_changepwB, walletName));
-
- LinearLayout llFingerprintAuth = promptsView.findViewById(R.id.llFingerprintAuth);
- final SwitchMaterial swFingerprintAllowed = (SwitchMaterial) llFingerprintAuth.getChildAt(0);
- if (FingerprintHelper.isDeviceSupported(getActivity())) {
- llFingerprintAuth.setVisibility(View.VISIBLE);
-
- swFingerprintAllowed.setOnClickListener(view -> {
- if (!swFingerprintAllowed.isChecked()) return;
-
- AlertDialog.Builder builder = new MaterialAlertDialogBuilder(requireActivity());
- builder.setMessage(Html.fromHtml(getString(R.string.generate_fingerprint_warn)))
- .setCancelable(false)
- .setPositiveButton(getString(R.string.label_ok), null)
- .setNegativeButton(getString(R.string.label_cancel), new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
- swFingerprintAllowed.setChecked(false);
- }
- })
- .show();
- });
-
- swFingerprintAllowed.setChecked(FingerprintHelper.isFingerPassValid(getActivity(), walletName));
- }
-
- etPasswordA.getEditText().addTextChangedListener(new TextWatcher() {
- @Override
- public void afterTextChanged(Editable s) {
- if (etPasswordB.getError() != null) {
- etPasswordB.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) {
- }
- });
-
- etPasswordB.getEditText().addTextChangedListener(new TextWatcher() {
- @Override
- public void afterTextChanged(Editable s) {
- if (etPasswordB.getError() != null) {
- etPasswordB.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(getString(R.string.label_ok), null)
- .setNegativeButton(getString(R.string.label_cancel),
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- Helper.hideKeyboardAlways(requireActivity());
- dialog.cancel();
- openDialog = null;
- }
- });
-
- openDialog = alertDialogBuilder.create();
- openDialog.setOnShowListener(dialog -> {
- Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
- button.setOnClickListener(view -> {
- String newPasswordA = etPasswordA.getEditText().getText().toString();
- String newPasswordB = etPasswordB.getEditText().getText().toString();
- if (!newPasswordA.equals(newPasswordB)) {
- etPasswordB.setError(getString(R.string.generate_bad_passwordB));
- } else {
- new AsyncChangePassword().execute(newPasswordA, Boolean.toString(swFingerprintAllowed.isChecked()));
- Helper.hideKeyboardAlways(requireActivity());
- openDialog.dismiss();
- openDialog = null;
- }
- });
- });
-
- // accept keyboard "ok"
- etPasswordB.getEditText().setOnEditorActionListener((v, actionId, event) -> {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_DONE)) {
- String newPasswordA = etPasswordA.getEditText().getText().toString();
- String newPasswordB = etPasswordB.getEditText().getText().toString();
- // disallow empty passwords
- if (!newPasswordA.equals(newPasswordB)) {
- etPasswordB.setError(getString(R.string.generate_bad_passwordB));
- } else {
- new AsyncChangePassword().execute(newPasswordA, Boolean.toString(swFingerprintAllowed.isChecked()));
- Helper.hideKeyboardAlways(requireActivity());
- openDialog.dismiss();
- openDialog = null;
- }
- return true;
- }
- return false;
- });
-
- if (Helper.preventScreenshot()) {
- openDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
- }
-
- return openDialog;
- }
-
- private boolean isKeyValid(String key) {
- return (key != null) && (key.length() == 64)
- && !key.equals("0000000000000000000000000000000000000000000000000000000000000000")
- && !key.toLowerCase().equals("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
- // ledger implmenetation returns the spend key as f's
- }
-
- private class AsyncShowSeed extends AsyncTask {
- String seed;
- String offset;
- Wallet.Status walletStatus;
-
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- offset = getSeedOffset();
- flWalletMnemonic.setAlpha(0.1f);
- }
-
- @Override
- protected Boolean doInBackground(String... params) {
- if (params.length != 1) return false;
- String walletPath = params[0];
-
- Wallet wallet;
- boolean closeWallet;
- if (type.equals(GenerateReviewFragment.VIEW_TYPE_WALLET)) {
- wallet = GenerateReviewFragment.this.walletCallback.getWallet();
- closeWallet = false;
- } else {
- wallet = WalletManager.getInstance().openWallet(walletPath, getPassword());
- closeWallet = true;
- }
- walletStatus = wallet.getStatus();
- if (!walletStatus.isOk()) {
- if (closeWallet) wallet.close();
- return false;
- }
-
- seed = wallet.getSeed(offset);
- if (closeWallet) wallet.close();
- return true;
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- super.onPostExecute(result);
- if (!isAdded()) return; // never mind
- if (result) {
- if (!seed.isEmpty()) {
- llMnemonic.setVisibility(View.VISIBLE);
- tvWalletMnemonic.setText(seed);
- }
- } else {
- tvWalletMnemonic.setText(walletStatus.toString());
- }
- seedOffsetInProgress = false;
- if (!getSeedOffset().equals(offset)) { // make sure we have encrypted with the correct offset
- showSeed(); // seed has changed in the meantime - recalc
- } else
- flWalletMnemonic.setAlpha(1);
- }
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java b/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java
deleted file mode 100644
index 0cb2991..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java
+++ /dev/null
@@ -1,1469 +0,0 @@
-/*
- * 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;
-
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.SharedPreferences;
-import android.hardware.usb.UsbDevice;
-import android.hardware.usb.UsbManager;
-import android.os.AsyncTask;
-import android.os.Build;
-import android.os.Bundle;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.inputmethod.EditorInfo;
-import android.widget.EditText;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.appcompat.app.AlertDialog;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-
-import com.google.android.material.checkbox.MaterialCheckBox;
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.m2049r.xmrwallet.data.DefaultNodes;
-import com.m2049r.xmrwallet.data.Node;
-import com.m2049r.xmrwallet.data.NodeInfo;
-import com.m2049r.xmrwallet.dialog.CreditsFragment;
-import com.m2049r.xmrwallet.dialog.HelpFragment;
-import com.m2049r.xmrwallet.ledger.Ledger;
-import com.m2049r.xmrwallet.ledger.LedgerProgressDialog;
-import com.m2049r.xmrwallet.model.NetworkType;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.model.WalletManager;
-import com.m2049r.xmrwallet.service.WalletService;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.KeyStoreHelper;
-import com.m2049r.xmrwallet.util.LegacyStorageHelper;
-import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor;
-import com.m2049r.xmrwallet.util.NetCipherHelper;
-import com.m2049r.xmrwallet.util.ThemeHelper;
-import com.m2049r.xmrwallet.util.ZipBackup;
-import com.m2049r.xmrwallet.util.ZipRestore;
-import com.m2049r.xmrwallet.widget.Toolbar;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.channels.FileChannel;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import timber.log.Timber;
-
-public class LoginActivity extends BaseActivity
- implements LoginFragment.Listener, GenerateFragment.Listener,
- GenerateReviewFragment.Listener, GenerateReviewFragment.AcceptListener,
- NodeFragment.Listener, SettingsFragment.Listener {
- private static final String GENERATE_STACK = "gen";
-
- private static final String NODES_PREFS_NAME = "nodes";
- private static final String SELECTED_NODE_PREFS_NAME = "selected_node";
- private static final String PREF_DAEMON_TESTNET = "daemon_testnet";
- private static final String PREF_DAEMON_STAGENET = "daemon_stagenet";
- private static final String PREF_DAEMON_MAINNET = "daemon_mainnet";
-
- private NodeInfo node = null;
-
- Set favouriteNodes = new HashSet<>();
-
- @Override
- public NodeInfo getNode() {
- return node;
- }
-
- @Override
- public void setNode(NodeInfo node) {
- setNode(node, true);
- }
-
- private void setNode(NodeInfo node, boolean save) {
- if (node != this.node) {
- if ((node != null) && (node.getNetworkType() != WalletManager.getInstance().getNetworkType()))
- throw new IllegalArgumentException("network type does not match");
- this.node = node;
- for (NodeInfo nodeInfo : favouriteNodes) {
- nodeInfo.setSelected(nodeInfo == node);
- }
- WalletManager.getInstance().setDaemon(node);
- if (save)
- saveSelectedNode();
- }
- }
-
- @Override
- public Set getFavouriteNodes() {
- return favouriteNodes;
- }
-
- @Override
- public Set getOrPopulateFavourites() {
- if (favouriteNodes.isEmpty()) {
- for (DefaultNodes node : DefaultNodes.values()) {
- NodeInfo nodeInfo = NodeInfo.fromString(node.getUri());
- if (nodeInfo != null) {
- nodeInfo.setFavourite(true);
- favouriteNodes.add(nodeInfo);
- }
- }
- saveFavourites();
- }
- return favouriteNodes;
- }
-
- @Override
- public void setFavouriteNodes(Collection nodes) {
- Timber.d("adding %d nodes", nodes.size());
- favouriteNodes.clear();
- for (NodeInfo node : nodes) {
- Timber.d("adding %s %b", node, node.isFavourite());
- if (node.isFavourite())
- favouriteNodes.add(node);
- }
- saveFavourites();
- }
-
- private void loadFavouritesWithNetwork() {
- Helper.runWithNetwork(() -> {
- loadFavourites();
- return true;
- });
- }
-
- private void loadFavourites() {
- Timber.d("loadFavourites");
- favouriteNodes.clear();
- final String selectedNodeId = getSelectedNodeId();
- Map storedNodes = getSharedPreferences(NODES_PREFS_NAME, Context.MODE_PRIVATE).getAll();
- for (Map.Entry nodeEntry : storedNodes.entrySet()) {
- if (nodeEntry != null) { // just in case, ignore possible future errors
- final String nodeId = (String) nodeEntry.getValue();
- final NodeInfo addedNode = addFavourite(nodeId);
- if (addedNode != null) {
- if (nodeId.equals(selectedNodeId)) {
- addedNode.setSelected(true);
- }
- }
- }
- }
- if (storedNodes.isEmpty()) { // try to load legacy list & remove it (i.e. migrate the data once)
- SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
- switch (WalletManager.getInstance().getNetworkType()) {
- case NetworkType_Mainnet:
- loadLegacyList(sharedPref.getString(PREF_DAEMON_MAINNET, null));
- sharedPref.edit().remove(PREF_DAEMON_MAINNET).apply();
- break;
- case NetworkType_Stagenet:
- loadLegacyList(sharedPref.getString(PREF_DAEMON_STAGENET, null));
- sharedPref.edit().remove(PREF_DAEMON_STAGENET).apply();
- break;
- case NetworkType_Testnet:
- loadLegacyList(sharedPref.getString(PREF_DAEMON_TESTNET, null));
- sharedPref.edit().remove(PREF_DAEMON_TESTNET).apply();
- break;
- default:
- throw new IllegalStateException("unsupported net " + WalletManager.getInstance().getNetworkType());
- }
- }
- }
-
- private void saveFavourites() {
- Timber.d("SAVE");
- SharedPreferences.Editor editor = getSharedPreferences(NODES_PREFS_NAME, Context.MODE_PRIVATE).edit();
- editor.clear();
- int i = 1;
- for (Node info : favouriteNodes) {
- final String nodeString = info.toNodeString();
- editor.putString(Integer.toString(i), nodeString);
- Timber.d("saved %d:%s", i, nodeString);
- i++;
- }
- editor.apply();
- }
-
- private NodeInfo addFavourite(String nodeString) {
- final NodeInfo nodeInfo = NodeInfo.fromString(nodeString);
- if (nodeInfo != null) {
- nodeInfo.setFavourite(true);
- favouriteNodes.add(nodeInfo);
- } else
- Timber.w("nodeString invalid: %s", nodeString);
- return nodeInfo;
- }
-
- private void loadLegacyList(final String legacyListString) {
- if (legacyListString == null) return;
- final String[] nodeStrings = legacyListString.split(";");
- for (final String nodeString : nodeStrings) {
- addFavourite(nodeString);
- }
- }
-
- private void saveSelectedNode() { // save only if changed
- final NodeInfo nodeInfo = getNode();
- final String selectedNodeId = getSelectedNodeId();
- if (nodeInfo != null) {
- if (!nodeInfo.toNodeString().equals(selectedNodeId))
- saveSelectedNode(nodeInfo);
- } else {
- if (selectedNodeId != null)
- saveSelectedNode(null);
- }
- }
-
- private void saveSelectedNode(NodeInfo nodeInfo) {
- SharedPreferences.Editor editor = getSharedPreferences(SELECTED_NODE_PREFS_NAME, Context.MODE_PRIVATE).edit();
- if (nodeInfo == null) {
- editor.clear();
- } else {
- editor.putString("0", getNode().toNodeString());
- }
- editor.apply();
- }
-
- private String getSelectedNodeId() {
- return getSharedPreferences(SELECTED_NODE_PREFS_NAME, Context.MODE_PRIVATE)
- .getString("0", null);
- }
-
-
- private 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
- public boolean hasLedger() {
- return Ledger.isConnected();
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- Timber.d("onCreate()");
- ThemeHelper.setPreferred(this);
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.activity_login);
- toolbar = findViewById(R.id.toolbar);
- setSupportActionBar(toolbar);
- getSupportActionBar().setDisplayShowTitleEnabled(false);
-
- toolbar.setOnButtonListener(type -> {
- switch (type) {
- case Toolbar.BUTTON_BACK:
- onBackPressed();
- break;
- case Toolbar.BUTTON_CLOSE:
- finish();
- break;
- case Toolbar.BUTTON_SETTINGS:
- startSettingsFragment();
- break;
- case Toolbar.BUTTON_NONE:
- break;
- default:
- Timber.e("Button " + type + "pressed - how can this be?");
- }
- });
-
- loadFavouritesWithNetwork();
-
- LegacyStorageHelper.migrateWallets(this);
-
- if (savedInstanceState == null) startLoginFragment();
-
- // try intents
- Intent intent = getIntent();
- if (!processUsbIntent(intent))
- processUriIntent(intent);
- }
-
- boolean checkServiceRunning() {
- if (WalletService.Running) {
- Toast.makeText(this, getString(R.string.service_busy), Toast.LENGTH_SHORT).show();
- return true;
- } else {
- return false;
- }
- }
-
- @Override
- public boolean onWalletSelected(String walletName, boolean streetmode) {
- if (node == null) {
- Toast.makeText(this, getString(R.string.prompt_daemon_missing), Toast.LENGTH_SHORT).show();
- return false;
- }
- if (checkServiceRunning()) return false;
- try {
- new AsyncOpenWallet(walletName, node, streetmode).execute();
- } catch (IllegalArgumentException ex) {
- Timber.e(ex.getLocalizedMessage());
- Toast.makeText(this, ex.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
- return false;
- }
- return true;
- }
-
- @Override
- public void onWalletDetails(final String walletName) {
- Timber.d("details for wallet .%s.", walletName);
- if (checkServiceRunning()) return;
- DialogInterface.OnClickListener dialogClickListener = (dialog, which) -> {
- switch (which) {
- case DialogInterface.BUTTON_POSITIVE:
- final File walletFile = Helper.getWalletFile(LoginActivity.this, walletName);
- if (WalletManager.getInstance().walletExists(walletFile)) {
- Helper.promptPassword(LoginActivity.this, walletName, true, new Helper.PasswordAction() {
- @Override
- public void act(String walletName1, String password, boolean fingerprintUsed) {
- if (checkDevice(walletName1, password))
- startDetails(walletFile, password, GenerateReviewFragment.VIEW_TYPE_DETAILS);
- }
-
- @Override
- public void fail(String walletName) {
- }
- });
- } else { // this cannot really happen as we prefilter choices
- Timber.e("Wallet missing: %s", walletName);
- Toast.makeText(LoginActivity.this, getString(R.string.bad_wallet), Toast.LENGTH_SHORT).show();
- }
- break;
-
- case DialogInterface.BUTTON_NEGATIVE:
- // do nothing
- break;
- }
- };
-
- AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
- builder.setMessage(getString(R.string.details_alert_message))
- .setPositiveButton(getString(R.string.details_alert_yes), dialogClickListener)
- .setNegativeButton(getString(R.string.details_alert_no), dialogClickListener)
- .show();
- }
-
- private void renameWallet(String oldName, String newName) {
- File walletFile = Helper.getWalletFile(this, oldName);
- boolean success = renameWallet(walletFile, newName);
- if (success) {
- reloadWalletList();
- } else {
- Toast.makeText(LoginActivity.this, getString(R.string.rename_failed), Toast.LENGTH_LONG).show();
- }
- }
-
- // copy + delete seems safer than rename because we can rollback easily
- boolean renameWallet(File walletFile, String newName) {
- if (copyWallet(walletFile, new File(walletFile.getParentFile(), newName), false, true)) {
- try {
- KeyStoreHelper.copyWalletUserPass(this, walletFile.getName(), newName);
- } catch (KeyStoreHelper.BrokenPasswordStoreException ex) {
- Timber.w(ex);
- }
- deleteWallet(walletFile); // also deletes the keystore entry
- return true;
- } else {
- return false;
- }
- }
-
- @Override
- public void onWalletRename(final String walletName) {
- Timber.d("rename for wallet ." + walletName + ".");
- if (checkServiceRunning()) return;
- LayoutInflater li = LayoutInflater.from(this);
- View promptsView = li.inflate(R.layout.prompt_rename, null);
-
- AlertDialog.Builder alertDialogBuilder = new MaterialAlertDialogBuilder(this);
- alertDialogBuilder.setView(promptsView);
-
- final EditText etRename = promptsView.findViewById(R.id.etRename);
- final TextView tvRenameLabel = promptsView.findViewById(R.id.tvRenameLabel);
-
- tvRenameLabel.setText(getString(R.string.prompt_rename, walletName));
-
- // set dialog message
- alertDialogBuilder
- .setCancelable(false)
- .setPositiveButton(getString(R.string.label_ok),
- (dialog, id) -> {
- Helper.hideKeyboardAlways(LoginActivity.this);
- String newName = etRename.getText().toString();
- renameWallet(walletName, newName);
- })
- .setNegativeButton(getString(R.string.label_cancel),
- (dialog, id) -> {
- Helper.hideKeyboardAlways(LoginActivity.this);
- dialog.cancel();
- });
-
- final AlertDialog dialog = alertDialogBuilder.create();
- Helper.showKeyboard(dialog);
-
- // accept keyboard "ok"
- etRename.setOnEditorActionListener((v, actionId, event) -> {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_DONE)) {
- Helper.hideKeyboardAlways(LoginActivity.this);
- String newName = etRename.getText().toString();
- dialog.cancel();
- renameWallet(walletName, newName);
- return false;
- }
- return false;
- });
-
- dialog.show();
- }
-
- private static final int CREATE_BACKUP_INTENT = 4711;
- private static final int RESTORE_BACKUP_INTENT = 4712;
- private ZipBackup zipBackup;
-
- @Override
- public void onWalletBackup(String walletName) {
- Timber.d("backup for wallet ." + walletName + ".");
- // overwrite any pending backup request
- zipBackup = new ZipBackup(this, walletName);
-
- Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
- intent.addCategory(Intent.CATEGORY_OPENABLE);
- intent.setType("application/zip");
- intent.putExtra(Intent.EXTRA_TITLE, zipBackup.getBackupName());
- startActivityForResult(intent, CREATE_BACKUP_INTENT);
- }
-
- @Override
- public void onWalletRestore() {
- Timber.d("restore wallet");
-
- Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
- intent.addCategory(Intent.CATEGORY_OPENABLE);
- intent.setType("application/zip");
- startActivityForResult(intent, RESTORE_BACKUP_INTENT);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (requestCode == CREATE_BACKUP_INTENT) {
- if (data == null) {
- // nothing selected
- Toast.makeText(this, getString(R.string.backup_failed), Toast.LENGTH_LONG).show();
- zipBackup = null;
- return;
- }
- try {
- if (zipBackup == null) return; // ignore unsolicited request
- zipBackup.writeTo(data.getData());
- Toast.makeText(this, getString(R.string.backup_success), Toast.LENGTH_SHORT).show();
- } catch (IOException ex) {
- Timber.e(ex);
- Toast.makeText(this, getString(R.string.backup_failed), Toast.LENGTH_LONG).show();
- } finally {
- zipBackup = null;
- }
- } else if (requestCode == RESTORE_BACKUP_INTENT) {
- if (data == null) {
- // nothing selected
- Toast.makeText(this, getString(R.string.restore_failed), Toast.LENGTH_LONG).show();
- return;
- }
- try {
- ZipRestore zipRestore = new ZipRestore(this, data.getData());
- Toast.makeText(this, getString(R.string.menu_restore), Toast.LENGTH_SHORT).show();
- if (zipRestore.restore()) {
- reloadWalletList();
- } else {
- Toast.makeText(this, getString(R.string.restore_failed), Toast.LENGTH_LONG).show();
- }
- } catch (IOException ex) {
- Timber.e(ex);
- Toast.makeText(this, getString(R.string.restore_failed), Toast.LENGTH_LONG).show();
- }
- }
- }
-
- @Override
- public void onWalletDelete(final String walletName) {
- Timber.d("delete for wallet ." + walletName + ".");
- if (checkServiceRunning()) return;
- DialogInterface.OnClickListener dialogClickListener = (dialog, which) -> {
- switch (which) {
- case DialogInterface.BUTTON_POSITIVE:
- if (deleteWallet(Helper.getWalletFile(LoginActivity.this, walletName))) {
- reloadWalletList();
- } else {
- Toast.makeText(LoginActivity.this, getString(R.string.delete_failed), Toast.LENGTH_LONG).show();
- }
- break;
- case DialogInterface.BUTTON_NEGATIVE:
- // do nothing
- break;
- }
- };
-
- final AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
- final AlertDialog confirm = builder.setMessage(getString(R.string.delete_alert_message))
- .setTitle(walletName)
- .setPositiveButton(getString(R.string.delete_alert_yes), dialogClickListener)
- .setNegativeButton(getString(R.string.delete_alert_no), dialogClickListener)
- .setView(View.inflate(builder.getContext(), R.layout.checkbox_confirm, null))
- .show();
- confirm.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(false);
- final MaterialCheckBox checkBox = confirm.findViewById(R.id.checkbox);
- checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
- confirm.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(isChecked);
- });
- }
-
- @Override
- public void onWalletDeleteCache(final String walletName) {
- Timber.d("delete cache for wallet ." + walletName + ".");
- if (checkServiceRunning()) return;
- DialogInterface.OnClickListener dialogClickListener = (dialog, which) -> {
- switch (which) {
- case DialogInterface.BUTTON_POSITIVE:
- if (!deleteWalletCache(Helper.getWalletFile(LoginActivity.this, walletName))) {
- Toast.makeText(LoginActivity.this, getString(R.string.delete_failed), Toast.LENGTH_LONG).show();
- }
- break;
- case DialogInterface.BUTTON_NEGATIVE:
- // do nothing
- break;
- }
- };
-
- final AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
- final AlertDialog confirm = builder.setMessage(getString(R.string.deletecache_alert_message))
- .setTitle(walletName)
- .setPositiveButton(getString(R.string.delete_alert_yes), dialogClickListener)
- .setNegativeButton(getString(R.string.delete_alert_no), dialogClickListener)
- .setView(View.inflate(builder.getContext(), R.layout.checkbox_confirm, null))
- .show();
- confirm.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(false);
- final MaterialCheckBox checkBox = confirm.findViewById(R.id.checkbox);
- checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
- confirm.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(isChecked);
- });
- }
-
- void reloadWalletList() {
- Timber.d("reloadWalletList()");
- try {
- LoginFragment loginFragment = (LoginFragment)
- getSupportFragmentManager().findFragmentById(R.id.fragment_container);
- if (loginFragment != null) {
- loginFragment.loadList();
- }
- } catch (ClassCastException ex) {
- Timber.w(ex);
- }
- }
-
- public void onWalletChangePassword() {//final String walletName, final String walletPassword) {
- try {
- GenerateReviewFragment detailsFragment = (GenerateReviewFragment)
- getSupportFragmentManager().findFragmentById(R.id.fragment_container);
- AlertDialog dialog = detailsFragment.createChangePasswordDialog();
- if (dialog != null) {
- Helper.showKeyboard(dialog);
- dialog.show();
- }
- } catch (ClassCastException ex) {
- Timber.w("onWalletChangePassword() called, but no GenerateReviewFragment active");
- }
- }
-
- @Override
- public void onAddWallet(String type) {
- if (checkServiceRunning()) return;
- startGenerateFragment(type);
- }
-
- @Override
- public void onNodePrefs() {
- Timber.d("node prefs");
- if (checkServiceRunning()) return;
- startNodeFragment();
- }
-
- ////////////////////////////////////////
- // LoginFragment.Listener
- ////////////////////////////////////////
-
- @Override
- public File getStorageRoot() {
- return Helper.getWalletRoot(getApplicationContext());
- }
-
- ////////////////////////////////////////
- ////////////////////////////////////////
-
- @Override
- public void showNet() {
- showNet(WalletManager.getInstance().getNetworkType());
- }
-
- private void showNet(NetworkType net) {
- switch (net) {
- case NetworkType_Mainnet:
- toolbar.setSubtitle(null);
- toolbar.setBackgroundResource(R.drawable.backgound_toolbar_mainnet);
- break;
- case NetworkType_Testnet:
- toolbar.setSubtitle(getString(R.string.connect_testnet));
- toolbar.setBackgroundResource(ThemeHelper.getThemedResourceId(this, R.attr.colorPrimaryDark));
- break;
- case NetworkType_Stagenet:
- toolbar.setSubtitle(getString(R.string.connect_stagenet));
- toolbar.setBackgroundResource(ThemeHelper.getThemedResourceId(this, R.attr.colorPrimaryDark));
- break;
- default:
- throw new IllegalStateException("NetworkType unknown: " + net);
- }
- }
-
- @Override
- protected void onPause() {
- Timber.d("onPause()");
- super.onPause();
- }
-
- @Override
- protected void onDestroy() {
- Timber.d("onDestroy");
- dismissProgressDialog();
- unregisterDetachReceiver();
- Ledger.disconnect();
- super.onDestroy();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- Timber.d("onResume()");
- // wait for WalletService to finish
- if (WalletService.Running && (progressDialog == null)) {
- // and show a progress dialog, but only if there isn't one already
- new AsyncWaitForService().execute();
- }
- if (!Ledger.isConnected()) attachLedger();
- registerTor();
- }
-
- private class AsyncWaitForService extends AsyncTask {
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- showProgressDialog(R.string.service_progress);
- }
-
- @Override
- protected Void doInBackground(Void... params) {
- try {
- while (WalletService.Running & !isCancelled()) {
- Thread.sleep(250);
- }
- } catch (InterruptedException ex) {
- // oh well ...
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(Void result) {
- super.onPostExecute(result);
- if (isDestroyed()) {
- return;
- }
- dismissProgressDialog();
- }
- }
-
- void startWallet(String walletName, String walletPassword,
- boolean fingerprintUsed, boolean streetmode) {
- Timber.d("startWallet()");
- Intent intent = new Intent(getApplicationContext(), WalletActivity.class);
- intent.putExtra(WalletActivity.REQUEST_ID, walletName);
- intent.putExtra(WalletActivity.REQUEST_PW, walletPassword);
- intent.putExtra(WalletActivity.REQUEST_FINGERPRINT_USED, fingerprintUsed);
- intent.putExtra(WalletActivity.REQUEST_STREETMODE, streetmode);
- if (uri != null) {
- intent.putExtra(WalletActivity.REQUEST_URI, uri);
- uri = null; // use only once
- }
- startActivity(intent);
- }
-
- void startDetails(File walletFile, String password, String type) {
- Timber.d("startDetails()");
- Bundle b = new Bundle();
- b.putString("path", walletFile.getAbsolutePath());
- b.putString("password", password);
- b.putString("type", type);
- startReviewFragment(b);
- }
-
- void startLoginFragment() {
- // we set these here because we cannot be ceratin we have permissions for storage before
- Helper.setMoneroHome(this);
- Helper.initLogger(this);
- Fragment fragment = new LoginFragment();
- getSupportFragmentManager().beginTransaction()
- .add(R.id.fragment_container, fragment).commit();
- Timber.d("LoginFragment added");
- }
-
- void startGenerateFragment(String type) {
- Bundle extras = new Bundle();
- extras.putString(GenerateFragment.TYPE, type);
- replaceFragment(new GenerateFragment(), GENERATE_STACK, extras);
- Timber.d("GenerateFragment placed");
- }
-
- void startReviewFragment(Bundle extras) {
- replaceFragment(new GenerateReviewFragment(), null, extras);
- Timber.d("GenerateReviewFragment placed");
- }
-
- void startNodeFragment() {
- replaceFragment(new NodeFragment(), null, null);
- Timber.d("NodeFragment placed");
- }
-
- void startSettingsFragment() {
- replaceFragment(new SettingsFragment(), null, null);
- Timber.d("SettingsFragment placed");
- }
-
- void replaceFragment(Fragment newFragment, String stackName, Bundle extras) {
- if (extras != null) {
- newFragment.setArguments(extras);
- }
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.fragment_container, newFragment);
- transaction.addToBackStack(stackName);
- transaction.commit();
- }
-
- void popFragmentStack(String name) {
- getSupportFragmentManager().popBackStack(name, FragmentManager.POP_BACK_STACK_INCLUSIVE);
- }
-
- //////////////////////////////////////////
- // GenerateFragment.Listener
- //////////////////////////////////////////
- static final String MNEMONIC_LANGUAGE = "English"; // see mnemonics/electrum-words.cpp for more
-
- private class AsyncCreateWallet extends AsyncTask {
- final String walletName;
- final String walletPassword;
- final WalletCreator walletCreator;
-
- File newWalletFile;
-
- AsyncCreateWallet(final String name, final String password,
- final WalletCreator walletCreator) {
- super();
- this.walletName = name;
- this.walletPassword = password;
- this.walletCreator = walletCreator;
- }
-
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- acquireWakeLock();
- if (walletCreator.isLedger()) {
- showLedgerProgressDialog(LedgerProgressDialog.TYPE_RESTORE);
- } else {
- showProgressDialog(R.string.generate_wallet_creating);
- }
- }
-
- @Override
- protected Boolean doInBackground(Void... params) {
- // check if the wallet we want to create already exists
- File walletFolder = getStorageRoot();
- if (!walletFolder.isDirectory()) {
- Timber.e("Wallet dir " + walletFolder.getAbsolutePath() + "is not a directory");
- return false;
- }
- File cacheFile = new File(walletFolder, walletName);
- File keysFile = new File(walletFolder, walletName + ".keys");
- File addressFile = new File(walletFolder, walletName + ".address.txt");
-
- if (cacheFile.exists() || keysFile.exists() || addressFile.exists()) {
- Timber.e("Some wallet files already exist for %s", cacheFile.getAbsolutePath());
- return false;
- }
-
- newWalletFile = new File(walletFolder, walletName);
- boolean success = walletCreator.createWallet(newWalletFile, walletPassword);
- if (success) {
- return true;
- } else {
- Timber.e("Could not create new wallet in %s", newWalletFile.getAbsolutePath());
- return false;
- }
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- super.onPostExecute(result);
- releaseWakeLock(RELEASE_WAKE_LOCK_DELAY);
- if (isDestroyed()) {
- return;
- }
- dismissProgressDialog();
- if (result) {
- startDetails(newWalletFile, walletPassword, GenerateReviewFragment.VIEW_TYPE_ACCEPT);
- } else {
- walletGenerateError();
- }
- }
- }
-
- public void createWallet(final String name, final String password,
- final WalletCreator walletCreator) {
- new AsyncCreateWallet(name, password, walletCreator)
- .executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR);
- }
-
- void walletGenerateError() {
- try {
- GenerateFragment genFragment = (GenerateFragment)
- getSupportFragmentManager().findFragmentById(R.id.fragment_container);
- genFragment.walletGenerateError();
- } catch (ClassCastException ex) {
- Timber.e("walletGenerateError() but not in GenerateFragment");
- }
- }
-
- interface WalletCreator {
- boolean createWallet(File aFile, String password);
-
- boolean isLedger();
-
- }
-
- boolean checkAndCloseWallet(Wallet aWallet) {
- Wallet.Status walletStatus = aWallet.getStatus();
- if (!walletStatus.isOk()) {
- Timber.e(walletStatus.getErrorString());
- toast(walletStatus.getErrorString());
- }
- aWallet.close();
- return walletStatus.isOk();
- }
-
- @Override
- public void onGenerate(final String name, final String password) {
- createWallet(name, password,
- new WalletCreator() {
- @Override
- public boolean isLedger() {
- return false;
- }
-
- @Override
- public boolean createWallet(File aFile, String password) {
- NodeInfo currentNode = getNode();
- // get it from the connected node if we have one
- final long restoreHeight =
- (currentNode != null) ? currentNode.getHeight() : -1;
- Wallet newWallet = WalletManager.getInstance()
- .createWallet(aFile, password, MNEMONIC_LANGUAGE, restoreHeight);
- return checkAndCloseWallet(newWallet);
- }
- });
- }
-
- @Override
- public void onGenerate(final String name, final String password,
- final String seed, final String offset,
- final long restoreHeight) {
- createWallet(name, password,
- new WalletCreator() {
- @Override
- public boolean isLedger() {
- return false;
- }
-
- @Override
- public boolean createWallet(File aFile, String password) {
- Wallet newWallet = WalletManager.getInstance()
- .recoveryWallet(aFile, password, seed, offset, restoreHeight);
- return checkAndCloseWallet(newWallet);
- }
- });
- }
-
- @Override
- public void onGenerateLedger(final String name, final String password,
- final long restoreHeight) {
- createWallet(name, password,
- new WalletCreator() {
- @Override
- public boolean isLedger() {
- return true;
- }
-
- @Override
- public boolean createWallet(File aFile, String password) {
- Wallet newWallet = WalletManager.getInstance()
- .createWalletFromDevice(aFile, password,
- restoreHeight, "Ledger");
- return checkAndCloseWallet(newWallet);
- }
- });
- }
-
- @Override
- public void onGenerate(final String name, final String password,
- final String address, final String viewKey, final String spendKey,
- final long restoreHeight) {
- createWallet(name, password,
- new WalletCreator() {
- @Override
- public boolean isLedger() {
- return false;
- }
-
- @Override
- public boolean createWallet(File aFile, String password) {
- Wallet newWallet = WalletManager.getInstance()
- .createWalletWithKeys(aFile, password, MNEMONIC_LANGUAGE, restoreHeight,
- address, viewKey, spendKey);
- return checkAndCloseWallet(newWallet);
- }
- });
- }
-
- private void toast(final String msg) {
- runOnUiThread(() -> Toast.makeText(LoginActivity.this, msg, Toast.LENGTH_LONG).show());
- }
-
- private void toast(final int msgId) {
- runOnUiThread(() -> Toast.makeText(LoginActivity.this, getString(msgId), Toast.LENGTH_LONG).show());
- }
-
- @Override
- public void onAccept(final String name, final String password) {
- File walletFolder = getStorageRoot();
- File walletFile = new File(walletFolder, name);
- Timber.d("New Wallet %s", walletFile.getAbsolutePath());
- walletFile.delete(); // when recovering wallets, the cache seems corrupt - so remove it
-
- popFragmentStack(GENERATE_STACK);
- Toast.makeText(LoginActivity.this,
- getString(R.string.generate_wallet_created), Toast.LENGTH_SHORT).show();
- }
-
- boolean walletExists(File walletFile, boolean any) {
- File dir = walletFile.getParentFile();
- String name = walletFile.getName();
- if (any) {
- return new File(dir, name).exists()
- || new File(dir, name + ".keys").exists()
- || new File(dir, name + ".address.txt").exists();
- } else {
- return new File(dir, name).exists()
- && new File(dir, name + ".keys").exists()
- && new File(dir, name + ".address.txt").exists();
- }
- }
-
- boolean copyWallet(File srcWallet, File dstWallet, boolean overwrite, boolean ignoreCacheError) {
- if (walletExists(dstWallet, true) && !overwrite) return false;
- boolean success = false;
- File srcDir = srcWallet.getParentFile();
- String srcName = srcWallet.getName();
- File dstDir = dstWallet.getParentFile();
- String dstName = dstWallet.getName();
- try {
- copyFile(new File(srcDir, srcName + ".keys"), new File(dstDir, dstName + ".keys"));
- try { // cache & address.txt are optional files
- copyFile(new File(srcDir, srcName), new File(dstDir, dstName));
- copyFile(new File(srcDir, srcName + ".address.txt"), new File(dstDir, dstName + ".address.txt"));
- } catch (IOException ex) {
- Timber.d("CACHE %s", ignoreCacheError);
- if (!ignoreCacheError) { // ignore cache backup error if backing up (can be resynced)
- throw ex;
- }
- }
- success = true;
- } catch (IOException ex) {
- Timber.e("wallet copy failed: %s", ex.getMessage());
- // try to rollback
- deleteWallet(dstWallet);
- }
- return success;
- }
-
- // do our best to delete as much as possible of the wallet files
- boolean deleteWallet(File walletFile) {
- Timber.d("deleteWallet %s", walletFile.getAbsolutePath());
- File dir = walletFile.getParentFile();
- String name = walletFile.getName();
- boolean success = true;
- File cacheFile = new File(dir, name);
- if (cacheFile.exists()) {
- success = cacheFile.delete();
- }
- success = new File(dir, name + ".keys").delete() && success;
- File addressFile = new File(dir, name + ".address.txt");
- if (addressFile.exists()) {
- success = addressFile.delete() && success;
- }
- Timber.d("deleteWallet is %s", success);
- KeyStoreHelper.removeWalletUserPass(this, walletFile.getName());
- return success;
- }
-
- boolean deleteWalletCache(File walletFile) {
- Timber.d("deleteWalletCache %s", walletFile.getAbsolutePath());
- File dir = walletFile.getParentFile();
- String name = walletFile.getName();
- boolean success = true;
- File cacheFile = new File(dir, name);
- if (cacheFile.exists()) {
- success = cacheFile.delete();
- }
- return success;
- }
-
- void copyFile(File src, File dst) throws IOException {
- try (FileChannel inChannel = new FileInputStream(src).getChannel();
- FileChannel outChannel = new FileOutputStream(dst).getChannel()) {
- inChannel.transferTo(0, inChannel.size(), outChannel);
- }
- }
-
- @Override
- public void onBackPressed() {
- Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
- if (f instanceof GenerateReviewFragment) {
- if (((GenerateReviewFragment) f).backOk()) {
- super.onBackPressed();
- }
- } else if (f instanceof NodeFragment) {
- if (!((NodeFragment) f).isRefreshing()) {
- super.onBackPressed();
- } else {
- Toast.makeText(LoginActivity.this, getString(R.string.node_refresh_wait), Toast.LENGTH_LONG).show();
- }
- } else if (f instanceof LoginFragment) {
- if (((LoginFragment) f).isFabOpen()) {
- ((LoginFragment) f).animateFAB();
- } else {
- super.onBackPressed();
- }
- } else {
- super.onBackPressed();
- }
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- final int id = item.getItemId();
- if (id == R.id.action_create_help_new) {
- HelpFragment.display(getSupportFragmentManager(), R.string.help_create_new);
- return true;
- } else if (id == R.id.action_create_help_keys) {
- HelpFragment.display(getSupportFragmentManager(), R.string.help_create_keys);
- return true;
- } else if (id == R.id.action_create_help_view) {
- HelpFragment.display(getSupportFragmentManager(), R.string.help_create_view);
- return true;
- } else if (id == R.id.action_create_help_seed) {
- HelpFragment.display(getSupportFragmentManager(), R.string.help_create_seed);
- return true;
- } else if (id == R.id.action_create_help_ledger) {
- HelpFragment.display(getSupportFragmentManager(), R.string.help_create_ledger);
- return true;
- } else if (id == R.id.action_details_help) {
- HelpFragment.display(getSupportFragmentManager(), R.string.help_details);
- return true;
- } else if (id == R.id.action_details_changepw) {
- onWalletChangePassword();
- return true;
- } else if (id == R.id.action_help_list) {
- HelpFragment.display(getSupportFragmentManager(), R.string.help_list);
- return true;
- } else if (id == R.id.action_help_node) {
- HelpFragment.display(getSupportFragmentManager(), R.string.help_node);
- return true;
- } else if (id == R.id.action_default_nodes) {
- Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
- if ((WalletManager.getInstance().getNetworkType() == NetworkType.NetworkType_Mainnet) &&
- (f instanceof NodeFragment)) {
- ((NodeFragment) f).restoreDefaultNodes();
- }
- return true;
- } else if (id == R.id.action_ledger_seed) {
- Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
- if (f instanceof GenerateFragment) {
- ((GenerateFragment) f).convertLedgerSeed();
- }
- return true;
- } else {
- return super.onOptionsItemSelected(item);
- }
- }
-
- // an AsyncTask which tests the node before trying to open the wallet
- private class AsyncOpenWallet extends AsyncTask {
- final static int OK = 0;
- final static int TIMEOUT = 1;
- final static int INVALID = 2;
- final static int IOEX = 3;
-
- private final String walletName;
- private final NodeInfo node;
- private final boolean streetmode;
-
- AsyncOpenWallet(String walletName, NodeInfo node, boolean streetmode) {
- this.walletName = walletName;
- this.node = node;
- this.streetmode = streetmode;
- }
-
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- }
-
- @Override
- protected Boolean doInBackground(Void... params) {
- Timber.d("checking %s", node.getAddress());
- return node.testRpcService();
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- super.onPostExecute(result);
- if (isDestroyed()) {
- return;
- }
- if (result) {
- Timber.d("selected wallet is .%s.", node.getName());
- // now it's getting real, onValidateFields if wallet exists
- promptAndStart(walletName, streetmode);
- } else {
- if (node.getResponseCode() == 0) { // IOException
- Toast.makeText(LoginActivity.this, getString(R.string.status_wallet_node_invalid), Toast.LENGTH_LONG).show();
- } else { // connected but broken
- Toast.makeText(LoginActivity.this, getString(R.string.status_wallet_connect_ioex), Toast.LENGTH_LONG).show();
- }
- }
- }
-
- }
-
- boolean checkDevice(String walletName, String password) {
- String keyPath = new File(Helper.getWalletRoot(LoginActivity.this),
- walletName + ".keys").getAbsolutePath();
- // check if we need connected hardware
- Wallet.Device device = WalletManager.getInstance().queryWalletDevice(keyPath, password);
- if (device == Wallet.Device.Device_Ledger) {
- if (!hasLedger()) {
- toast(R.string.open_wallet_ledger_missing);
- } else {
- return true;
- }
- } else {// device could be undefined meaning the password is wrong
- // this gets dealt with later
- return true;
- }
- return false;
- }
-
- void promptAndStart(String walletName, final boolean streetmode) {
- File walletFile = Helper.getWalletFile(this, walletName);
- if (WalletManager.getInstance().walletExists(walletFile)) {
- Helper.promptPassword(LoginActivity.this, walletName, false,
- new Helper.PasswordAction() {
- @Override
- public void act(String walletName, String password, boolean fingerprintUsed) {
- if (checkDevice(walletName, password))
- startWallet(walletName, password, fingerprintUsed, streetmode);
- }
-
- @Override
- public void fail(String walletName) {
- }
-
- });
- } else { // this cannot really happen as we prefilter choices
- Toast.makeText(this, getString(R.string.bad_wallet), Toast.LENGTH_SHORT).show();
- }
- }
-
- // USB Stuff - (Ledger)
-
- private static final String ACTION_USB_PERMISSION = "com.m2049r.xmrwallet.USB_PERMISSION";
-
- void attachLedger() {
- final UsbManager usbManager = getUsbManager();
- UsbDevice device = Ledger.findDevice(usbManager);
- if (device != null) {
- if (usbManager.hasPermission(device)) {
- connectLedger(usbManager, device);
- } else {
- registerReceiver(usbPermissionReceiver, new IntentFilter(ACTION_USB_PERMISSION));
- usbManager.requestPermission(device,
- PendingIntent.getBroadcast(this, 0,
- new Intent(ACTION_USB_PERMISSION),
- Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_IMMUTABLE : 0));
- }
- } else {
- Timber.d("no ledger device found");
- }
- }
-
- private final BroadcastReceiver usbPermissionReceiver = new BroadcastReceiver() {
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (ACTION_USB_PERMISSION.equals(action)) {
- unregisterReceiver(usbPermissionReceiver);
- synchronized (this) {
- UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
- if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
- if (device != null) {
- connectLedger(getUsbManager(), device);
- }
- } else {
- Timber.w("User denied permission for device %s", device.getProductName());
- }
- }
- }
- }
- };
-
- private void connectLedger(UsbManager usbManager, final UsbDevice usbDevice) {
- if (Ledger.ENABLED)
- try {
- Ledger.connect(usbManager, usbDevice);
- if (!Ledger.check()) {
- Ledger.disconnect();
- runOnUiThread(() -> Toast.makeText(LoginActivity.this,
- getString(R.string.toast_ledger_start_app, usbDevice.getProductName()),
- Toast.LENGTH_SHORT)
- .show());
- } else {
- registerDetachReceiver();
- onLedgerAction();
- runOnUiThread(() -> Toast.makeText(LoginActivity.this,
- getString(R.string.toast_ledger_attached, usbDevice.getProductName()),
- Toast.LENGTH_SHORT)
- .show());
- }
- } catch (IOException ex) {
- runOnUiThread(() -> Toast.makeText(LoginActivity.this,
- getString(R.string.open_wallet_ledger_missing),
- Toast.LENGTH_SHORT)
- .show());
- }
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- processUsbIntent(intent);
- }
-
- private boolean processUsbIntent(Intent intent) {
- String action = intent.getAction();
- if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
- synchronized (this) {
- final UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
- if (device != null) {
- final UsbManager usbManager = getUsbManager();
- if (usbManager.hasPermission(device)) {
- Timber.d("Ledger attached by intent");
- connectLedger(usbManager, device);
- }
- }
- }
- return true;
- }
- return false;
- }
-
- private String uri = null;
-
- private void processUriIntent(Intent intent) {
- String action = intent.getAction();
- if (Intent.ACTION_VIEW.equals(action)) {
- synchronized (this) {
- uri = intent.getDataString();
- Timber.d("URI Intent %s", uri);
- HelpFragment.display(getSupportFragmentManager(), R.string.help_uri);
- }
- }
- }
-
- BroadcastReceiver detachReceiver;
-
- private void unregisterDetachReceiver() {
- if (detachReceiver != null) {
- unregisterReceiver(detachReceiver);
- detachReceiver = null;
- }
- }
-
- private void registerDetachReceiver() {
- detachReceiver = new BroadcastReceiver() {
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) {
- unregisterDetachReceiver();
- final UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
- Timber.i("Ledger detached!");
- if (device != null)
- runOnUiThread(() -> Toast.makeText(LoginActivity.this,
- getString(R.string.toast_ledger_detached, device.getProductName()),
- Toast.LENGTH_SHORT)
- .show());
- Ledger.disconnect();
- onLedgerAction();
- }
- }
- };
-
- registerReceiver(detachReceiver, new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED));
- }
-
- public void onLedgerAction() {
- Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
- if (f instanceof GenerateFragment) {
- onBackPressed();
- } else if (f instanceof LoginFragment) {
- if (((LoginFragment) f).isFabOpen()) {
- ((LoginFragment) f).animateFAB();
- }
- }
- }
-
- // get UsbManager or die trying
- @NonNull
- private UsbManager getUsbManager() {
- final UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
- if (usbManager == null) {
- throw new IllegalStateException("no USB_SERVICE");
- }
- return usbManager;
- }
-
- //
- // Tor (Orbot) stuff
- //
-
- void torNotify() {
- final Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
- if (fragment == null) return;
-
- if (fragment instanceof LoginFragment) {
- runOnUiThread(((LoginFragment) fragment)::showNetwork);
- }
- }
-
- private void deregisterTor() {
- NetCipherHelper.deregister();
- }
-
- private void registerTor() {
- NetCipherHelper.register(new NetCipherHelper.OnStatusChangedListener() {
- @Override
- public void connected() {
- Timber.d("CONNECTED");
- WalletManager.getInstance().setProxy(NetCipherHelper.getProxy());
- torNotify();
- if (waitingUiTask != null) {
- Timber.d("RUN");
- runOnUiThread(waitingUiTask);
- waitingUiTask = null;
- }
- }
-
- @Override
- public void disconnected() {
- Timber.d("DISCONNECTED");
- WalletManager.getInstance().setProxy("");
- torNotify();
- }
-
- @Override
- public void notInstalled() {
- Timber.d("NOT INSTALLED");
- WalletManager.getInstance().setProxy("");
- torNotify();
- }
-
- @Override
- public void notEnabled() {
- Timber.d("NOT ENABLED");
- notInstalled();
- }
- });
- }
-
- private Runnable waitingUiTask;
-
- @Override
- public void runOnNetCipher(Runnable uiTask) {
- if (waitingUiTask != null) throw new IllegalStateException("only one tor task at a time");
- if (NetCipherHelper.hasClient()) {
- runOnUiThread(uiTask);
- } else {
- waitingUiTask = uiTask;
- }
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java b/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java
deleted file mode 100644
index 21b85be..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java
+++ /dev/null
@@ -1,563 +0,0 @@
-/*
- * 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;
-
-import android.content.Context;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.text.Html;
-import android.text.Spanned;
-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.view.animation.Animation;
-import android.view.animation.AnimationUtils;
-import android.widget.FrameLayout;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.google.android.material.floatingactionbutton.FloatingActionButton;
-import com.google.android.material.progressindicator.CircularProgressIndicator;
-import com.m2049r.xmrwallet.data.NodeInfo;
-import com.m2049r.xmrwallet.dialog.HelpFragment;
-import com.m2049r.xmrwallet.layout.WalletInfoAdapter;
-import com.m2049r.xmrwallet.model.WalletManager;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.KeyStoreHelper;
-import com.m2049r.xmrwallet.util.NetCipherHelper;
-import com.m2049r.xmrwallet.util.NodePinger;
-import com.m2049r.xmrwallet.util.Notice;
-import com.m2049r.xmrwallet.util.ThemeHelper;
-import com.m2049r.xmrwallet.widget.Toolbar;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-import timber.log.Timber;
-
-public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInteractionListener,
- View.OnClickListener {
-
- private WalletInfoAdapter adapter;
-
- private final List walletList = new ArrayList<>();
-
- private View tvGuntherSays;
- private ImageView ivGunther;
- private TextView tvNodeName;
- private TextView tvNodeInfo;
- private ImageButton ibNetwork;
- private CircularProgressIndicator pbNetwork;
-
- private Listener activityCallback;
-
- // Container Activity must implement this interface
- public interface Listener {
- File getStorageRoot();
-
- boolean onWalletSelected(String wallet, boolean streetmode);
-
- void onWalletDetails(String wallet);
-
- void onWalletRename(String name);
-
- void onWalletBackup(String name);
-
- void onWalletRestore();
-
- void onWalletDelete(String walletName);
-
- void onWalletDeleteCache(String walletName);
-
- void onAddWallet(String type);
-
- void onNodePrefs();
-
- void showNet();
-
- void setToolbarButton(int type);
-
- void setTitle(String title);
-
- void setNode(NodeInfo node);
-
- NodeInfo getNode();
-
- Set getFavouriteNodes();
-
- Set getOrPopulateFavourites();
-
- boolean hasLedger();
-
- void runOnNetCipher(Runnable runnable);
- }
-
- @Override
- public void onAttach(@NonNull Context context) {
- super.onAttach(context);
- if (context instanceof Listener) {
- this.activityCallback = (Listener) context;
- } else {
- throw new ClassCastException(context.toString()
- + " must implement Listener");
- }
- }
-
- @Override
- public void onPause() {
- Timber.d("onPause()");
- torStatus = null;
- super.onPause();
- }
-
- @Override
- public void onResume() {
- super.onResume();
- Timber.d("onResume() %s", activityCallback.getFavouriteNodes().size());
- activityCallback.setTitle(null);
- activityCallback.setToolbarButton(Toolbar.BUTTON_SETTINGS);
- activityCallback.showNet();
- showNetwork();
- //activityCallback.runOnNetCipher(this::pingSelectedNode);
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- Timber.d("onCreateView");
- View view = inflater.inflate(R.layout.fragment_login, container, false);
-
- tvGuntherSays = view.findViewById(R.id.tvGuntherSays);
- ivGunther = view.findViewById(R.id.ivGunther);
- fabScreen = view.findViewById(R.id.fabScreen);
- fab = view.findViewById(R.id.fab);
- fabNew = view.findViewById(R.id.fabNew);
- fabView = view.findViewById(R.id.fabView);
- fabKey = view.findViewById(R.id.fabKey);
- fabSeed = view.findViewById(R.id.fabSeed);
- fabImport = view.findViewById(R.id.fabImport);
- fabLedger = view.findViewById(R.id.fabLedger);
-
- fabNewL = view.findViewById(R.id.fabNewL);
- fabViewL = view.findViewById(R.id.fabViewL);
- fabKeyL = view.findViewById(R.id.fabKeyL);
- fabSeedL = view.findViewById(R.id.fabSeedL);
- fabImportL = view.findViewById(R.id.fabImportL);
- fabLedgerL = view.findViewById(R.id.fabLedgerL);
-
- fab_pulse = AnimationUtils.loadAnimation(getContext(), R.anim.fab_pulse);
- 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);
- fabImport.setOnClickListener(this);
- fabLedger.setOnClickListener(this);
- fabScreen.setOnClickListener(this);
-
- RecyclerView recyclerView = view.findViewById(R.id.list);
- registerForContextMenu(recyclerView);
- this.adapter = new WalletInfoAdapter(getActivity(), this);
- recyclerView.setAdapter(adapter);
-
- ViewGroup llNotice = view.findViewById(R.id.llNotice);
- Notice.showAll(llNotice, ".*_login");
-
- view.findViewById(R.id.llNode).setOnClickListener(v -> startNodePrefs());
- tvNodeName = view.findViewById(R.id.tvNodeName);
- tvNodeInfo = view.findViewById(R.id.tvInfo);
- view.findViewById(R.id.ibRenew).setOnClickListener(v -> findBestNode());
- ibNetwork = view.findViewById(R.id.ibNetwork);
- ibNetwork.setOnClickListener(v -> changeNetwork());
- ibNetwork.setEnabled(false);
- pbNetwork = view.findViewById(R.id.pbNetwork);
-
- Helper.hideKeyboard(getActivity());
-
- loadList();
-
- return view;
- }
-
- // Callbacks from WalletInfoAdapter
-
- // Wallet touched
- @Override
- public void onInteraction(final View view, final WalletManager.WalletInfo infoItem) {
- openWallet(infoItem.getName(), false);
- }
-
- private void openWallet(String name, boolean streetmode) {
- activityCallback.onWalletSelected(name, streetmode);
- }
-
- @Override
- public boolean onContextInteraction(MenuItem item, WalletManager.WalletInfo listItem) {
- final int id = item.getItemId();
- if (id == R.id.action_streetmode) {
- openWallet(listItem.getName(), true);
- } else if (id == R.id.action_info) {
- showInfo(listItem.getName());
- } else if (id == R.id.action_rename) {
- activityCallback.onWalletRename(listItem.getName());
- } else if (id == R.id.action_backup) {
- activityCallback.onWalletBackup(listItem.getName());
- } else if (id == R.id.action_archive) {
- activityCallback.onWalletDelete(listItem.getName());
- } else if (id == R.id.action_deletecache) {
- activityCallback.onWalletDeleteCache(listItem.getName());
- } else {
- return super.onContextItemSelected(item);
- }
- return true;
- }
-
- public void loadList() {
- Timber.d("loadList()");
- WalletManager mgr = WalletManager.getInstance();
- walletList.clear();
- walletList.addAll(mgr.findWallets(activityCallback.getStorageRoot()));
- adapter.setInfos(walletList);
-
- // deal with Gunther & FAB animation
- if (walletList.isEmpty()) {
- fab.startAnimation(fab_pulse);
- if (ivGunther.getDrawable() == null) {
- ivGunther.setImageResource(R.drawable.ic_emptygunther);
- tvGuntherSays.setVisibility(View.VISIBLE);
- }
- } else {
- fab.clearAnimation();
- if (ivGunther.getDrawable() != null) {
- ivGunther.setImageDrawable(null);
- }
- tvGuntherSays.setVisibility(View.GONE);
- }
-
- // remove information of non-existent wallet
- Set removedWallets = getActivity()
- .getSharedPreferences(KeyStoreHelper.SecurityConstants.WALLET_PASS_PREFS_NAME, Context.MODE_PRIVATE)
- .getAll().keySet();
- for (WalletManager.WalletInfo s : walletList) {
- removedWallets.remove(s.getName());
- }
- for (String name : removedWallets) {
- KeyStoreHelper.removeWalletUserPass(getActivity(), name);
- }
- }
-
- private void showInfo(@NonNull String name) {
- activityCallback.onWalletDetails(name);
- }
-
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
- }
-
- @Override
- public void onCreateOptionsMenu(@NonNull Menu menu, MenuInflater inflater) {
- inflater.inflate(R.menu.list_menu, menu);
- super.onCreateOptionsMenu(menu, inflater);
- }
-
- private boolean isFabOpen = false;
- private FloatingActionButton fab, fabNew, fabView, fabKey, fabSeed, fabImport, fabLedger;
- private RelativeLayout fabScreen;
- private RelativeLayout fabNewL, fabViewL, fabKeyL, fabSeedL, fabImportL, fabLedgerL;
- private Animation fab_open, fab_close, rotate_forward, rotate_backward, fab_open_screen, fab_close_screen;
- private Animation fab_pulse;
-
- public boolean isFabOpen() {
- return isFabOpen;
- }
-
- public void animateFAB() {
- if (isFabOpen) { // close the fab
- fabScreen.setClickable(false);
- fabScreen.startAnimation(fab_close_screen);
- fab.startAnimation(rotate_backward);
- if (fabLedgerL.getVisibility() == View.VISIBLE) {
- fabLedgerL.startAnimation(fab_close);
- fabLedger.setClickable(false);
- } else {
- 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);
- fabImportL.startAnimation(fab_close);
- fabImport.setClickable(false);
- }
- isFabOpen = false;
- } else { // open the fab
- fabScreen.setClickable(true);
- fabScreen.startAnimation(fab_open_screen);
- fab.startAnimation(rotate_forward);
- if (activityCallback.hasLedger()) {
- fabLedgerL.setVisibility(View.VISIBLE);
- fabNewL.setVisibility(View.GONE);
- fabViewL.setVisibility(View.GONE);
- fabKeyL.setVisibility(View.GONE);
- fabSeedL.setVisibility(View.GONE);
- fabImportL.setVisibility(View.GONE);
-
- fabLedgerL.startAnimation(fab_open);
- fabLedger.setClickable(true);
- } else {
- fabLedgerL.setVisibility(View.GONE);
- fabNewL.setVisibility(View.VISIBLE);
- fabViewL.setVisibility(View.VISIBLE);
- fabKeyL.setVisibility(View.VISIBLE);
- fabSeedL.setVisibility(View.VISIBLE);
- fabImportL.setVisibility(View.VISIBLE);
-
- 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);
- fabImportL.startAnimation(fab_open);
- fabImport.setClickable(true);
- }
- isFabOpen = true;
- }
- }
-
- @Override
- public void onClick(View v) {
- final int id = v.getId();
- Timber.d("onClick %d/%d", id, R.id.fabLedger);
- if (id == R.id.fab) {
- animateFAB();
- } else if (id == R.id.fabNew) {
- fabScreen.setVisibility(View.INVISIBLE);
- isFabOpen = false;
- activityCallback.onAddWallet(GenerateFragment.TYPE_NEW);
- } else if (id == R.id.fabView) {
- animateFAB();
- activityCallback.onAddWallet(GenerateFragment.TYPE_VIEWONLY);
- } else if (id == R.id.fabKey) {
- animateFAB();
- activityCallback.onAddWallet(GenerateFragment.TYPE_KEY);
- } else if (id == R.id.fabSeed) {
- animateFAB();
- activityCallback.onAddWallet(GenerateFragment.TYPE_SEED);
- } else if (id == R.id.fabImport) {
- animateFAB();
- activityCallback.onWalletRestore();
- } else if (id == R.id.fabLedger) {
- Timber.d("FAB_LEDGER");
- animateFAB();
- activityCallback.onAddWallet(GenerateFragment.TYPE_LEDGER);
- } else if (id == R.id.fabScreen) {
- animateFAB();
- }
- }
-
- public void findBestNode() {
- new AsyncFindBestNode().execute(AsyncFindBestNode.FIND_BEST);
- }
-
- public void pingSelectedNode() {
- new AsyncFindBestNode().execute(AsyncFindBestNode.PING_SELECTED);
- }
-
- private NodeInfo autoselect(Set nodes) {
- if (nodes.isEmpty()) return null;
- NodePinger.execute(nodes, null);
- List nodeList = new ArrayList<>(nodes);
- Collections.sort(nodeList, NodeInfo.BestNodeComparator);
- return nodeList.get(0);
- }
-
- private void setSubtext(String status) {
- final Context ctx = getContext();
- final Spanned text = Html.fromHtml(ctx.getString(R.string.status,
- Integer.toHexString(ThemeHelper.getThemedColor(ctx, R.attr.positiveColor) & 0xFFFFFF),
- Integer.toHexString(ThemeHelper.getThemedColor(ctx, android.R.attr.colorBackground) & 0xFFFFFF),
- status, ""));
- tvNodeInfo.setText(text);
- }
-
- private class AsyncFindBestNode extends AsyncTask {
- final static int PING_SELECTED = 0;
- final static int FIND_BEST = 1;
-
- private boolean netState;
-
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- tvNodeName.setVisibility(View.GONE);
- pbNetwork.setVisibility(View.VISIBLE);
- netState = ibNetwork.isClickable();
- ibNetwork.setClickable(false);
- setSubtext(getString(R.string.node_waiting));
- }
-
- @Override
- protected NodeInfo doInBackground(Integer... params) {
- Set favourites = activityCallback.getOrPopulateFavourites();
- NodeInfo selectedNode;
- if (params[0] == FIND_BEST) {
- selectedNode = autoselect(favourites);
- } else if (params[0] == PING_SELECTED) {
- selectedNode = activityCallback.getNode();
- if (!activityCallback.getFavouriteNodes().contains(selectedNode))
- selectedNode = null; // it's not in the favourites (any longer)
- if (selectedNode == null)
- for (NodeInfo node : favourites) {
- if (node.isSelected()) {
- selectedNode = node;
- break;
- }
- }
- if (selectedNode == null) { // autoselect
- selectedNode = autoselect(favourites);
- } else {
- selectedNode.testRpcService();
- }
- } else throw new IllegalStateException();
- if ((selectedNode != null) && selectedNode.isValid()) {
- activityCallback.setNode(selectedNode);
- return selectedNode;
- } else {
- activityCallback.setNode(null);
- return null;
- }
- }
-
- @Override
- protected void onPostExecute(NodeInfo result) {
- if (!isAdded()) return;
- tvNodeName.setVisibility(View.VISIBLE);
- pbNetwork.setVisibility(View.INVISIBLE);
- ibNetwork.setClickable(netState);
- if (result != null) {
- Timber.d("found a good node %s", result.toString());
- showNode(result);
- } else {
- tvNodeName.setText(getResources().getText(R.string.node_create_hint));
- tvNodeName.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
- tvNodeInfo.setText(null);
- tvNodeInfo.setVisibility(View.GONE);
- }
- }
-
- @Override
- protected void onCancelled(NodeInfo result) { //TODO: cancel this on exit from fragment
- Timber.d("cancelled with %s", result);
- }
- }
-
- private void showNode(NodeInfo nodeInfo) {
- tvNodeName.setText(nodeInfo.getName());
- nodeInfo.showInfo(tvNodeInfo);
- tvNodeInfo.setVisibility(View.VISIBLE);
- }
-
- private void startNodePrefs() {
- activityCallback.onNodePrefs();
- }
-
- // Network (Tor) stuff
-
- private void changeNetwork() {
- Timber.d("S: %s", NetCipherHelper.getStatus());
- final NetCipherHelper.Status status = NetCipherHelper.getStatus();
- if (status == NetCipherHelper.Status.NOT_INSTALLED) {
- HelpFragment.display(requireActivity().getSupportFragmentManager(), R.string.help_tor);
- } else if (status == NetCipherHelper.Status.NOT_ENABLED) {
- Toast.makeText(getActivity(), getString(R.string.tor_enable_background), Toast.LENGTH_LONG).show();
- } else {
- pbNetwork.setVisibility(View.VISIBLE);
- ibNetwork.setEnabled(false);
- NetCipherHelper.getInstance().toggle();
- }
- }
-
- private NetCipherHelper.Status torStatus = null;
-
- void showNetwork() {
- final NetCipherHelper.Status status = NetCipherHelper.getStatus();
- Timber.d("SHOW %s", status);
- if (status == torStatus) return;
- torStatus = status;
- switch (status) {
- case ENABLED:
- ibNetwork.setImageResource(R.drawable.ic_network_tor_on);
- ibNetwork.setEnabled(true);
- ibNetwork.setClickable(true);
- pbNetwork.setVisibility(View.INVISIBLE);
- break;
- case NOT_ENABLED:
- case DISABLED:
- ibNetwork.setImageResource(R.drawable.ic_network_clearnet);
- ibNetwork.setEnabled(true);
- ibNetwork.setClickable(true);
- pbNetwork.setVisibility(View.INVISIBLE);
- break;
- case STARTING:
- ibNetwork.setImageResource(R.drawable.ic_network_clearnet);
- ibNetwork.setEnabled(false);
- pbNetwork.setVisibility(View.VISIBLE);
- break;
- case STOPPING:
- ibNetwork.setImageResource(R.drawable.ic_network_clearnet);
- ibNetwork.setEnabled(false);
- pbNetwork.setVisibility(View.VISIBLE);
- break;
- case NOT_INSTALLED:
- ibNetwork.setEnabled(true);
- ibNetwork.setClickable(true);
- pbNetwork.setVisibility(View.INVISIBLE);
- ibNetwork.setImageResource(R.drawable.ic_network_clearnet);
- break;
- default:
- return;
- }
- activityCallback.runOnNetCipher(this::pingSelectedNode);
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/MainActivity.java b/app/src/main/java/com/m2049r/xmrwallet/MainActivity.java
index 5c7cc75..86601f5 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/MainActivity.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/MainActivity.java
@@ -1,39 +1,62 @@
-/*
- * Copyright (c) 2018-2020 EarlOfEgo, 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;
-import android.content.Intent;
import android.os.Bundle;
-
-import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+import com.m2049r.xmrwallet.model.TransactionInfo;
+import com.m2049r.xmrwallet.model.Wallet;
+import com.m2049r.xmrwallet.model.WalletManager;
+import com.m2049r.xmrwallet.service.MoneroHandlerThread;
+import com.m2049r.xmrwallet.service.TxService;
+import java.io.File;
+import java.util.List;
-import com.m2049r.xmrwallet.onboarding.OnBoardingActivity;
-import com.m2049r.xmrwallet.onboarding.OnBoardingManager;
+public class MainActivity extends AppCompatActivity implements MoneroHandlerThread.Listener {
+ private final MutableLiveData _address = new MutableLiveData<>("");
+ public LiveData address = _address;
+ private final MutableLiveData _balance = new MutableLiveData<>(0L);
+ public LiveData balance = _balance;
+ private final MutableLiveData> _history = new MutableLiveData<>();
+ public LiveData> history = _history;
+
+ private MoneroHandlerThread thread = null;
+ private TxService txService = null;
-public class MainActivity extends BaseActivity {
@Override
- protected void onCreate(@Nullable final Bundle savedInstanceState) {
+ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (OnBoardingManager.shouldShowOnBoarding(getApplicationContext())) {
- startActivity(new Intent(this, OnBoardingActivity.class));
- } else {
- startActivity(new Intent(this, LoginActivity.class));
- }
- finish();
+ setContentView(R.layout.activity_main);
+ init();
}
-}
+
+ public MoneroHandlerThread getThread() {
+ return thread;
+ }
+
+ private void init() {
+ File walletFile = new File(getApplicationInfo().dataDir, "xmr_wallet");
+ Wallet wallet = null;
+ if(walletFile.exists()) {
+ wallet = WalletManager.getInstance().openWallet(walletFile.getAbsolutePath(), "");
+ } else {
+ wallet = WalletManager.getInstance().createWallet(walletFile, "", "English", 0);
+ }
+ WalletManager.getInstance().setProxy("127.0.0.1:9050");
+ thread = new MoneroHandlerThread("WalletService", wallet, this);
+ thread.start();
+ this.txService = new TxService(this, thread);
+ }
+
+ @Override
+ public void onRefresh() {
+ WalletManager walletManager = WalletManager.getInstance();
+ Wallet wallet = walletManager.getWallet();
+ if(wallet != null) {
+ String address = wallet.getLastSubaddress(0);
+ _history.postValue(wallet.getHistory().getAll());
+ _balance.postValue(wallet.getBalance());
+ _address.postValue(address);
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/NodeFragment.java b/app/src/main/java/com/m2049r/xmrwallet/NodeFragment.java
deleted file mode 100644
index 0bbc5a4..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/NodeFragment.java
+++ /dev/null
@@ -1,589 +0,0 @@
-/*
- * Copyright (c) 2018 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;
-
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.view.inputmethod.EditorInfo;
-import android.widget.Button;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import androidx.annotation.Nullable;
-import androidx.appcompat.app.AlertDialog;
-import androidx.fragment.app.Fragment;
-import androidx.recyclerview.widget.RecyclerView;
-import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
-
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.google.android.material.textfield.TextInputLayout;
-import com.m2049r.levin.scanner.Dispatcher;
-import com.m2049r.xmrwallet.data.DefaultNodes;
-import com.m2049r.xmrwallet.data.Node;
-import com.m2049r.xmrwallet.data.NodeInfo;
-import com.m2049r.xmrwallet.layout.NodeInfoAdapter;
-import com.m2049r.xmrwallet.model.NetworkType;
-import com.m2049r.xmrwallet.model.WalletManager;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.NodePinger;
-import com.m2049r.xmrwallet.util.Notice;
-import com.m2049r.xmrwallet.widget.Toolbar;
-
-import java.io.File;
-import java.net.InetSocketAddress;
-import java.net.UnknownHostException;
-import java.text.NumberFormat;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import timber.log.Timber;
-
-public class NodeFragment extends Fragment
- implements NodeInfoAdapter.OnInteractionListener, View.OnClickListener {
-
- static private int NODES_TO_FIND = 10;
-
- static private NumberFormat FORMATTER = NumberFormat.getInstance();
-
- private SwipeRefreshLayout pullToRefresh;
- private TextView tvPull;
- private View fab;
-
- private Set nodeList = new HashSet<>();
-
- private NodeInfoAdapter nodesAdapter;
-
- private Listener activityCallback;
-
- public interface Listener {
- File getStorageRoot();
-
- void setToolbarButton(int type);
-
- void setSubtitle(String title);
-
- Set getFavouriteNodes();
-
- Set getOrPopulateFavourites();
-
- void setFavouriteNodes(Collection favouriteNodes);
-
- void setNode(NodeInfo node);
- }
-
- void filterFavourites() {
- for (Iterator iter = nodeList.iterator(); iter.hasNext(); ) {
- Node node = iter.next();
- if (!node.isFavourite()) iter.remove();
- }
- }
-
- @Override
- public void onAttach(Context context) {
- super.onAttach(context);
- if (context instanceof Listener) {
- this.activityCallback = (Listener) context;
- } else {
- throw new ClassCastException(context.toString()
- + " must implement Listener");
- }
- }
-
- @Override
- public void onPause() {
- Timber.d("onPause() %d", nodeList.size());
- if (asyncFindNodes != null)
- asyncFindNodes.cancel(true);
- if (activityCallback != null)
- activityCallback.setFavouriteNodes(nodeList);
- super.onPause();
- }
-
- @Override
- public void onResume() {
- super.onResume();
- Timber.d("onResume()");
- activityCallback.setSubtitle(getString(R.string.label_nodes));
- updateRefreshElements();
- }
-
- boolean isRefreshing() {
- return asyncFindNodes != null;
- }
-
- void updateRefreshElements() {
- if (isRefreshing()) {
- activityCallback.setToolbarButton(Toolbar.BUTTON_NONE);
- fab.setVisibility(View.GONE);
- } else {
- activityCallback.setToolbarButton(Toolbar.BUTTON_BACK);
- fab.setVisibility(View.VISIBLE);
- }
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- Timber.d("onCreateView");
- View view = inflater.inflate(R.layout.fragment_node, container, false);
-
- fab = view.findViewById(R.id.fab);
- fab.setOnClickListener(this);
-
- RecyclerView recyclerView = view.findViewById(R.id.list);
- nodesAdapter = new NodeInfoAdapter(getActivity(), this);
- recyclerView.setAdapter(nodesAdapter);
-
- tvPull = view.findViewById(R.id.tvPull);
-
- pullToRefresh = view.findViewById(R.id.pullToRefresh);
- pullToRefresh.setOnRefreshListener(() -> {
- if (WalletManager.getInstance().getNetworkType() == NetworkType.NetworkType_Mainnet) {
- refresh(AsyncFindNodes.SCAN);
- } else {
- Toast.makeText(getActivity(), getString(R.string.node_wrong_net), Toast.LENGTH_LONG).show();
- pullToRefresh.setRefreshing(false);
- }
- });
-
- Helper.hideKeyboard(getActivity());
-
- nodeList = new HashSet<>(activityCallback.getFavouriteNodes());
- nodesAdapter.setNodes(nodeList);
-
- ViewGroup llNotice = view.findViewById(R.id.llNotice);
- Notice.showAll(llNotice, ".*_nodes");
-
- refresh(AsyncFindNodes.PING); // start connection tests
-
- return view;
- }
-
- private AsyncFindNodes asyncFindNodes = null;
-
- private boolean refresh(int type) {
- if (asyncFindNodes != null) return false; // ignore refresh request as one is ongoing
- asyncFindNodes = new AsyncFindNodes();
- updateRefreshElements();
- asyncFindNodes.execute(type);
- return true;
- }
-
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
- }
-
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- inflater.inflate(R.menu.node_menu, menu);
- super.onCreateOptionsMenu(menu, inflater);
- }
-
- // Callbacks from NodeInfoAdapter
- @Override
- public void onInteraction(final View view, final NodeInfo nodeItem) {
- Timber.d("onInteraction");
- if (!nodeItem.isFavourite()) {
- nodeItem.setFavourite(true);
- activityCallback.setFavouriteNodes(nodeList);
- }
- AsyncTask.execute(() -> {
- activityCallback.setNode(nodeItem); // this marks it as selected & saves it as well
- nodeItem.setSelecting(false);
- try {
- requireActivity().runOnUiThread(() -> nodesAdapter.allowClick(true));
- } catch (IllegalStateException ex) {
- // it's ok
- }
- });
- }
-
- // open up edit dialog
- @Override
- public boolean onLongInteraction(final View view, final NodeInfo nodeItem) {
- Timber.d("onLongInteraction");
- EditDialog diag = createEditDialog(nodeItem);
- if (diag != null) {
- diag.show();
- }
- return true;
- }
-
- @Override
- public void onClick(View v) {
- int id = v.getId();
- if (id == R.id.fab) {
- EditDialog diag = createEditDialog(null);
- if (diag != null) {
- diag.show();
- }
- }
- }
-
- private class AsyncFindNodes extends AsyncTask
- implements NodePinger.Listener {
- final static int SCAN = 0;
- final static int RESTORE_DEFAULTS = 1;
- final static int PING = 2;
-
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- filterFavourites();
- nodesAdapter.setNodes(null);
- nodesAdapter.allowClick(false);
- tvPull.setText(getString(R.string.node_scanning));
- }
-
- @Override
- protected Boolean doInBackground(Integer... params) {
- if (params[0] == RESTORE_DEFAULTS) { // true = restore defaults
- for (DefaultNodes node : DefaultNodes.values()) {
- NodeInfo nodeInfo = NodeInfo.fromString(node.getUri());
- if (nodeInfo != null) {
- nodeInfo.setFavourite(true);
- nodeList.add(nodeInfo);
- }
- }
- NodePinger.execute(nodeList, this);
- return true;
- } else if (params[0] == PING) {
- NodePinger.execute(nodeList, this);
- return true;
- } else if (params[0] == SCAN) {
- // otherwise scan the network
- Timber.d("scanning");
- Set seedList = new HashSet<>();
- seedList.addAll(nodeList);
- nodeList.clear();
- Timber.d("seed %d", seedList.size());
- Dispatcher d = new Dispatcher(info -> publishProgress(info));
- d.seedPeers(seedList);
- d.awaitTermination(NODES_TO_FIND);
-
- // we didn't find enough because we didn't ask around enough? ask more!
- if ((d.getRpcNodes().size() < NODES_TO_FIND) &&
- (d.getPeerCount() < NODES_TO_FIND + seedList.size())) {
- // try again
- publishProgress((NodeInfo[]) null);
- d = new Dispatcher(new Dispatcher.Listener() {
- @Override
- public void onGet(NodeInfo info) {
- publishProgress(info);
- }
- });
- // also seed with monero seed nodes (see p2p/net_node.inl:410 in monero src)
- seedList.add(new NodeInfo(new InetSocketAddress("107.152.130.98", 18080)));
- seedList.add(new NodeInfo(new InetSocketAddress("212.83.175.67", 18080)));
- seedList.add(new NodeInfo(new InetSocketAddress("5.9.100.248", 18080)));
- seedList.add(new NodeInfo(new InetSocketAddress("163.172.182.165", 18080)));
- seedList.add(new NodeInfo(new InetSocketAddress("161.67.132.39", 18080)));
- seedList.add(new NodeInfo(new InetSocketAddress("198.74.231.92", 18080)));
- seedList.add(new NodeInfo(new InetSocketAddress("195.154.123.123", 18080)));
- seedList.add(new NodeInfo(new InetSocketAddress("212.83.172.165", 18080)));
- seedList.add(new NodeInfo(new InetSocketAddress("192.110.160.146", 18080)));
- d.seedPeers(seedList);
- d.awaitTermination(NODES_TO_FIND);
- }
- // final (filtered) result
- nodeList.addAll(d.getRpcNodes());
- return true;
- }
- return false;
- }
-
- @Override
- protected void onProgressUpdate(NodeInfo... values) {
- Timber.d("onProgressUpdate");
- if (!isCancelled())
- if (values != null)
- nodesAdapter.addNode(values[0]);
- else
- nodesAdapter.setNodes(null);
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- Timber.d("done scanning");
- complete();
- }
-
- @Override
- protected void onCancelled(Boolean result) {
- Timber.d("cancelled scanning");
- complete();
- }
-
- private void complete() {
- asyncFindNodes = null;
- if (!isAdded()) return;
- //if (isCancelled()) return;
- tvPull.setText(getString(R.string.node_pull_hint));
- pullToRefresh.setRefreshing(false);
- nodesAdapter.setNodes(nodeList);
- nodesAdapter.allowClick(true);
- updateRefreshElements();
- }
-
- public void publish(NodeInfo nodeInfo) {
- publishProgress(nodeInfo);
- }
- }
-
- @Override
- public void onDetach() {
- Timber.d("detached");
- super.onDetach();
- }
-
- private EditDialog editDialog = null; // for preventing opening of multiple dialogs
-
- private EditDialog createEditDialog(final NodeInfo nodeInfo) {
- if (editDialog != null) return null; // we are already open
- editDialog = new EditDialog(nodeInfo);
- return editDialog;
- }
-
- class EditDialog {
- final NodeInfo nodeInfo;
- final NodeInfo nodeBackup;
-
- private boolean applyChanges() {
- nodeInfo.clear();
- showTestResult();
-
- final String portString = etNodePort.getEditText().getText().toString().trim();
- int port;
- if (portString.isEmpty()) {
- port = Node.getDefaultRpcPort();
- } else {
- try {
- port = Integer.parseInt(portString);
- } catch (NumberFormatException ex) {
- etNodePort.setError(getString(R.string.node_port_numeric));
- return false;
- }
- }
- etNodePort.setError(null);
- if ((port <= 0) || (port > 65535)) {
- etNodePort.setError(getString(R.string.node_port_range));
- return false;
- }
-
- final String host = etNodeHost.getEditText().getText().toString().trim();
- if (host.isEmpty()) {
- etNodeHost.setError(getString(R.string.node_host_empty));
- return false;
- }
- final boolean setHostSuccess = Helper.runWithNetwork(() -> {
- try {
- nodeInfo.setHost(host);
- return true;
- } catch (UnknownHostException ex) {
- return false;
- }
- });
- if (!setHostSuccess) {
- etNodeHost.setError(getString(R.string.node_host_unresolved));
- return false;
- }
- etNodeHost.setError(null);
- nodeInfo.setRpcPort(port);
- // setName() may trigger reverse DNS
- Helper.runWithNetwork(new Helper.Action() {
- @Override
- public boolean run() {
- nodeInfo.setName(etNodeName.getEditText().getText().toString().trim());
- return true;
- }
- });
- nodeInfo.setUsername(etNodeUser.getEditText().getText().toString().trim());
- nodeInfo.setPassword(etNodePass.getEditText().getText().toString()); // no trim for pw
- return true;
- }
-
- private boolean shutdown = false;
-
- private void apply() {
- if (applyChanges()) {
- closeDialog();
- if (nodeBackup == null) { // this is a (FAB) new node
- nodeInfo.setFavourite(true);
- nodeList.add(nodeInfo);
- }
- shutdown = true;
- new AsyncTestNode().execute();
- }
- }
-
- private void closeDialog() {
- if (editDialog == null) throw new IllegalStateException();
- Helper.hideKeyboardAlways(getActivity());
- editDialog.dismiss();
- editDialog = null;
- NodeFragment.this.editDialog = null;
- }
-
- private void show() {
- editDialog.show();
- }
-
- private void test() {
- if (applyChanges())
- new AsyncTestNode().execute();
- }
-
- private void showKeyboard() {
- Helper.showKeyboard(editDialog);
- }
-
- AlertDialog editDialog = null;
-
- TextInputLayout etNodeName;
- TextInputLayout etNodeHost;
- TextInputLayout etNodePort;
- TextInputLayout etNodeUser;
- TextInputLayout etNodePass;
- TextView tvResult;
-
- void showTestResult() {
- if (nodeInfo.isSuccessful()) {
- tvResult.setText(getString(R.string.node_result,
- FORMATTER.format(nodeInfo.getHeight()), nodeInfo.getMajorVersion(),
- nodeInfo.getResponseTime(), nodeInfo.getHostAddress()));
- } else {
- tvResult.setText(NodeInfoAdapter.getResponseErrorText(getActivity(), nodeInfo.getResponseCode()));
- }
- }
-
- EditDialog(final NodeInfo nodeInfo) {
- AlertDialog.Builder alertDialogBuilder = new MaterialAlertDialogBuilder(getActivity());
- LayoutInflater li = LayoutInflater.from(alertDialogBuilder.getContext());
- View promptsView = li.inflate(R.layout.prompt_editnode, null);
- alertDialogBuilder.setView(promptsView);
-
- etNodeName = promptsView.findViewById(R.id.etNodeName);
- etNodeHost = promptsView.findViewById(R.id.etNodeHost);
- etNodePort = promptsView.findViewById(R.id.etNodePort);
- etNodeUser = promptsView.findViewById(R.id.etNodeUser);
- etNodePass = promptsView.findViewById(R.id.etNodePass);
- tvResult = promptsView.findViewById(R.id.tvResult);
-
- if (nodeInfo != null) {
- this.nodeInfo = nodeInfo;
- nodeBackup = new NodeInfo(nodeInfo);
- etNodeName.getEditText().setText(nodeInfo.getName());
- etNodeHost.getEditText().setText(nodeInfo.getHost());
- etNodePort.getEditText().setText(Integer.toString(nodeInfo.getRpcPort()));
- etNodeUser.getEditText().setText(nodeInfo.getUsername());
- etNodePass.getEditText().setText(nodeInfo.getPassword());
- showTestResult();
- } else {
- this.nodeInfo = new NodeInfo();
- nodeBackup = null;
- }
-
- // set dialog message
- alertDialogBuilder
- .setCancelable(false)
- .setPositiveButton(getString(R.string.label_ok), null)
- .setNeutralButton(getString(R.string.label_test), null)
- .setNegativeButton(getString(R.string.label_cancel),
- (dialog, id) -> {
- closeDialog();
- nodesAdapter.setNodes(); // to refresh test results
- });
-
- editDialog = alertDialogBuilder.create();
- // these need to be here, since we don't always close the dialog
- editDialog.setOnShowListener(new DialogInterface.OnShowListener() {
- @Override
- public void onShow(final DialogInterface dialog) {
- Button testButton = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_NEUTRAL);
- testButton.setOnClickListener(view -> test());
-
- Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
- button.setOnClickListener(view -> apply());
- }
- });
-
- if (Helper.preventScreenshot()) {
- editDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
- }
-
- etNodePass.getEditText().setOnEditorActionListener((v, actionId, event) -> {
- if (actionId == EditorInfo.IME_ACTION_DONE) {
- editDialog.getButton(DialogInterface.BUTTON_NEUTRAL).requestFocus();
- test();
- return true;
- }
- return false;
- });
- }
-
- private class AsyncTestNode extends AsyncTask {
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- tvResult.setText(getString(R.string.node_testing, nodeInfo.getHostAddress()));
- }
-
- @Override
- protected Boolean doInBackground(Void... params) {
- nodeInfo.testRpcService();
- return true;
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- if (editDialog != null) {
- showTestResult();
- }
- if (shutdown) {
- if (nodeBackup == null) {
- nodesAdapter.addNode(nodeInfo);
- } else {
- nodesAdapter.setNodes();
- }
- nodesAdapter.notifyItemChanged(nodeInfo);
- }
- }
- }
- }
-
- void restoreDefaultNodes() {
- if (WalletManager.getInstance().getNetworkType() == NetworkType.NetworkType_Mainnet) {
- if (!refresh(AsyncFindNodes.RESTORE_DEFAULTS)) {
- Toast.makeText(getActivity(), getString(R.string.toast_default_nodes), Toast.LENGTH_SHORT).show();
- }
- } else {
- Toast.makeText(getActivity(), getString(R.string.node_wrong_net), Toast.LENGTH_LONG).show();
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/OnBackPressedListener.java b/app/src/main/java/com/m2049r/xmrwallet/OnBackPressedListener.java
deleted file mode 100644
index eb09125..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/OnBackPressedListener.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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;
-
-public interface OnBackPressedListener {
- boolean onBackPressed();
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/OnBlockUpdateListener.java b/app/src/main/java/com/m2049r/xmrwallet/OnBlockUpdateListener.java
deleted file mode 100644
index 242bea0..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/OnBlockUpdateListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (c) 2021 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;
-
-import com.m2049r.xmrwallet.model.Wallet;
-
-public interface OnBlockUpdateListener {
- void onBlockUpdate(final Wallet wallet);
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/OnUriScannedListener.java b/app/src/main/java/com/m2049r/xmrwallet/OnUriScannedListener.java
deleted file mode 100644
index 34fa1c5..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/OnUriScannedListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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;
-
-import com.m2049r.xmrwallet.data.BarcodeData;
-
-public interface OnUriScannedListener {
- boolean onUriScanned(BarcodeData barcodeData);
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java b/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java
deleted file mode 100644
index 06621ff..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java
+++ /dev/null
@@ -1,469 +0,0 @@
-/*
- * 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;
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.drawable.BitmapDrawable;
-import android.net.Uri;
-import android.nfc.NfcManager;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.Html;
-import android.text.InputType;
-import android.text.Spanned;
-import android.text.TextWatcher;
-import android.view.KeyEvent;
-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.view.inputmethod.EditorInfo;
-import android.widget.EditText;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.core.content.FileProvider;
-import androidx.fragment.app.Fragment;
-
-import com.google.android.material.textfield.TextInputLayout;
-import com.google.android.material.transition.MaterialContainerTransform;
-import com.google.zxing.BarcodeFormat;
-import com.google.zxing.EncodeHintType;
-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.data.BarcodeData;
-import com.m2049r.xmrwallet.data.Crypto;
-import com.m2049r.xmrwallet.data.Subaddress;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.ThemeHelper;
-import com.m2049r.xmrwallet.widget.ExchangeView;
-import com.m2049r.xmrwallet.widget.Toolbar;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-
-import timber.log.Timber;
-
-public class ReceiveFragment extends Fragment {
-
- private ProgressBar pbProgress;
- private TextView tvAddress;
- private TextInputLayout etNotes;
- private ExchangeView evAmount;
- private TextView tvQrCode;
- private ImageView ivQrCode;
- private ImageView ivQrCodeFull;
- private EditText etDummy;
- private ImageButton bCopyAddress;
- private MenuItem shareItem;
-
- private Wallet wallet = null;
- private boolean isMyWallet = false;
-
- public interface Listener {
- void setToolbarButton(int type);
-
- void setTitle(String title);
-
- void setSubtitle(String subtitle);
-
- void showSubaddresses(boolean managerMode);
-
- Subaddress getSelectedSubaddress();
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
-
- View view = inflater.inflate(R.layout.fragment_receive, container, false);
-
- pbProgress = view.findViewById(R.id.pbProgress);
- tvAddress = view.findViewById(R.id.tvAddress);
- etNotes = view.findViewById(R.id.etNotes);
- evAmount = view.findViewById(R.id.evAmount);
- ivQrCode = view.findViewById(R.id.qrCode);
- tvQrCode = view.findViewById(R.id.tvQrCode);
- ivQrCodeFull = view.findViewById(R.id.qrCodeFull);
- etDummy = view.findViewById(R.id.etDummy);
- bCopyAddress = view.findViewById(R.id.bCopyAddress);
-
- etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
-
- bCopyAddress.setOnClickListener(v -> copyAddress());
-
- evAmount.setOnNewAmountListener(xmr -> {
- Timber.d("new amount = %s", xmr);
- generateQr();
- if (shareRequested && (xmr != null)) share();
- });
-
- evAmount.setOnFailedExchangeListener(() -> {
- if (isAdded()) {
- clearQR();
- Toast.makeText(getActivity(), getString(R.string.message_exchange_failed), Toast.LENGTH_LONG).show();
- }
- });
-
- final EditText notesEdit = etNotes.getEditText();
- notesEdit.setRawInputType(InputType.TYPE_CLASS_TEXT);
- notesEdit.setOnEditorActionListener((v, actionId, event) -> {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_DONE)) {
- generateQr();
- return true;
- }
- return false;
- });
- notesEdit.addTextChangedListener(new TextWatcher() {
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- }
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- clearQR();
- }
-
- @Override
- public void afterTextChanged(Editable s) {
- }
- });
-
- tvAddress.setOnClickListener(v -> {
- listenerCallback.showSubaddresses(false);
- });
-
- view.findViewById(R.id.cvQrCode).setOnClickListener(v -> {
- Helper.hideKeyboard(getActivity());
- etDummy.requestFocus();
- if (qrValid) {
- ivQrCodeFull.setImageBitmap(((BitmapDrawable) ivQrCode.getDrawable()).getBitmap());
- ivQrCodeFull.setVisibility(View.VISIBLE);
- } else {
- evAmount.doExchange();
- }
- });
-
- ivQrCodeFull.setOnClickListener(v -> {
- ivQrCodeFull.setImageBitmap(null);
- ivQrCodeFull.setVisibility(View.GONE);
- });
-
- showProgress();
- clearQR();
-
- if (getActivity() instanceof GenerateReviewFragment.ListenerWithWallet) {
- wallet = ((GenerateReviewFragment.ListenerWithWallet) getActivity()).getWallet();
- show();
- } else {
- throw new IllegalStateException("no wallet info");
- }
-
- View tvNfc = view.findViewById(R.id.tvNfc);
- NfcManager manager = (NfcManager) getContext().getSystemService(Context.NFC_SERVICE);
- if ((manager != null) && (manager.getDefaultAdapter() != null))
- tvNfc.setVisibility(View.VISIBLE);
-
- return view;
- }
-
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
- final MaterialContainerTransform transform = new MaterialContainerTransform();
- transform.setDrawingViewId(R.id.fragment_container);
- transform.setDuration(getResources().getInteger(R.integer.tx_item_transition_duration));
- transform.setAllContainerColors(ThemeHelper.getThemedColor(getContext(), android.R.attr.colorBackground));
- setSharedElementEnterTransition(transform);
- }
-
- private boolean shareRequested = false;
-
- @Override
- public void onCreateOptionsMenu(@NonNull Menu menu, final MenuInflater inflater) {
- inflater.inflate(R.menu.receive_menu, menu);
- super.onCreateOptionsMenu(menu, inflater);
-
- shareItem = menu.findItem(R.id.menu_item_share);
- shareItem.setOnMenuItemClickListener(item -> {
- if (shareRequested) return true;
- shareRequested = true;
- if (!qrValid) {
- evAmount.doExchange();
- } else {
- share();
- }
- return true;
- });
- }
-
- private void share() {
- shareRequested = false;
- if (saveQrCode()) {
- final Intent sendIntent = getSendIntent();
- if (sendIntent != null)
- startActivity(Intent.createChooser(sendIntent, null));
- } else {
- Toast.makeText(getActivity(), getString(R.string.message_qr_failed), Toast.LENGTH_SHORT).show();
- }
- }
-
- private boolean saveQrCode() {
- if (!qrValid) throw new IllegalStateException("trying to save null qr code!");
-
- File cachePath = new File(getActivity().getCacheDir(), "images");
- if (!cachePath.exists())
- if (!cachePath.mkdirs()) throw new IllegalStateException("cannot create images folder");
- File png = new File(cachePath, "QR.png");
- try {
- FileOutputStream stream = new FileOutputStream(png);
- Bitmap qrBitmap = ((BitmapDrawable) ivQrCode.getDrawable()).getBitmap();
- qrBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
- stream.close();
- return true;
- } catch (IOException ex) {
- Timber.e(ex);
- // make sure we don't share an old qr code
- if (!png.delete()) throw new IllegalStateException("cannot delete old qr code");
- // if we manage to delete it, the URI points to nothing and the user gets a toast with the error
- }
- return false;
- }
-
- private Intent getSendIntent() {
- File imagePath = new File(requireActivity().getCacheDir(), "images");
- File png = new File(imagePath, "QR.png");
- Uri contentUri = FileProvider.getUriForFile(requireActivity(), BuildConfig.APPLICATION_ID + ".fileprovider", png);
- if (contentUri != null) {
- Intent shareIntent = new Intent();
- shareIntent.setAction(Intent.ACTION_SEND);
- shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file
- shareIntent.setTypeAndNormalize("image/png");
- shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
- if (bcData != null)
- shareIntent.putExtra(Intent.EXTRA_TEXT, bcData.getUriString());
- return shareIntent;
- }
- return null;
- }
-
- void copyAddress() {
- Helper.clipBoardCopy(requireActivity(), getString(R.string.label_copy_address), subaddress.getAddress());
- Toast.makeText(getActivity(), getString(R.string.message_copy_address), Toast.LENGTH_SHORT).show();
- }
-
- private boolean qrValid = false;
-
- void clearQR() {
- if (qrValid) {
- ivQrCode.setImageBitmap(null);
- qrValid = false;
- if (isLoaded)
- tvQrCode.setVisibility(View.VISIBLE);
- }
- }
-
- void setQR(Bitmap qr) {
- ivQrCode.setImageBitmap(qr);
- qrValid = true;
- tvQrCode.setVisibility(View.GONE);
- }
-
- @Override
- public void onResume() {
- super.onResume();
- Timber.d("onResume()");
- listenerCallback.setToolbarButton(Toolbar.BUTTON_BACK);
- if (wallet != null) {
- listenerCallback.setTitle(wallet.getName());
- listenerCallback.setSubtitle(wallet.getAccountLabel());
- setNewSubaddress();
- } else {
- listenerCallback.setSubtitle(getString(R.string.status_wallet_loading));
- clearQR();
- }
- }
-
- private boolean isLoaded = false;
-
- private void show() {
- Timber.d("name=%s", wallet.getName());
- isLoaded = true;
- hideProgress();
- }
-
- public BarcodeData getBarcodeData() {
- if (qrValid)
- return bcData;
- else
- return null;
- }
-
- private BarcodeData bcData = null;
-
- private void generateQr() {
- Timber.d("GENQR");
- String address = subaddress.getAddress();
- String notes = etNotes.getEditText().getText().toString();
- String xmrAmount = evAmount.getAmount();
- Timber.d("%s/%s/%s", xmrAmount, notes, address);
- if ((xmrAmount == null) || !Wallet.isAddressValid(address)) {
- clearQR();
- Timber.d("CLEARQR");
- return;
- }
- bcData = new BarcodeData(Crypto.XMR, address, notes, xmrAmount);
- int size = Math.max(ivQrCode.getWidth(), ivQrCode.getHeight());
- Bitmap qr = generate(bcData.getUriString(), size, size);
- if (qr != null) {
- setQR(qr);
- Timber.d("SETQR");
- etDummy.requestFocus();
- Helper.hideKeyboard(getActivity());
- }
- }
-
- public Bitmap generate(String text, int width, int height) {
- if ((width <= 0) || (height <= 0)) return null;
- Map hints = new HashMap<>();
- hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
- hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
- try {
- BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);
- int[] pixels = new int[width * height];
- for (int i = 0; i < height; i++) {
- for (int j = 0; j < width; j++) {
- if (bitMatrix.get(j, i)) {
- pixels[i * width + j] = 0x00000000;
- } else {
- pixels[i * height + j] = 0xffffffff;
- }
- }
- }
- Bitmap bitmap = Bitmap.createBitmap(pixels, 0, width, width, height, Bitmap.Config.RGB_565);
- bitmap = addLogo(bitmap);
- return bitmap;
- } catch (WriterException ex) {
- Timber.e(ex);
- }
- return null;
- }
-
- private Bitmap addLogo(Bitmap qrBitmap) {
- // addume logo & qrcode are both square
- Bitmap logo = getMoneroLogo();
- final int qrSize = qrBitmap.getWidth();
- final int logoSize = logo.getWidth();
-
- Bitmap logoBitmap = Bitmap.createBitmap(qrSize, qrSize, Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(logoBitmap);
- canvas.drawBitmap(qrBitmap, 0, 0, null);
- canvas.save();
- final float sx = 0.2f * qrSize / logoSize;
- canvas.scale(sx, sx, qrSize / 2f, qrSize / 2f);
- canvas.drawBitmap(logo, (qrSize - logoSize) / 2f, (qrSize - logoSize) / 2f, null);
- canvas.restore();
- return logoBitmap;
- }
-
- private Bitmap logo = null;
-
- private Bitmap getMoneroLogo() {
- if (logo == null) {
- logo = Helper.getBitmap(getContext(), R.drawable.ic_monero_logo_b);
- }
- return logo;
- }
-
- public void showProgress() {
- pbProgress.setVisibility(View.VISIBLE);
- }
-
- public void hideProgress() {
- pbProgress.setVisibility(View.GONE);
- }
-
- Listener listenerCallback = null;
-
- @Override
- public void onAttach(@NonNull Context context) {
- super.onAttach(context);
- if (context instanceof Listener) {
- this.listenerCallback = (Listener) context;
- } else {
- throw new ClassCastException(context.toString()
- + " must implement Listener");
- }
- }
-
- @Override
- public void onPause() {
- Timber.d("onPause()");
- Helper.hideKeyboard(getActivity());
- super.onPause();
- }
-
- @Override
- public void onDetach() {
- Timber.d("onDetach()");
- if ((wallet != null) && (isMyWallet)) {
- wallet.close();
- wallet = null;
- isMyWallet = false;
- }
- super.onDetach();
- }
-
- private Subaddress subaddress = null;
-
- void setNewSubaddress() {
- final Subaddress newSubaddress = listenerCallback.getSelectedSubaddress();
- if (!Objects.equals(subaddress, newSubaddress)) {
- final Runnable resetSize = () -> tvAddress.animate().setDuration(125).scaleX(1).scaleY(1).start();
- tvAddress.animate().alpha(1).setDuration(125)
- .scaleX(1.2f).scaleY(1.2f)
- .withEndAction(resetSize).start();
- }
- subaddress = newSubaddress;
- final Context context = getContext();
- Spanned label = Html.fromHtml(context.getString(R.string.receive_subaddress,
- Integer.toHexString(ThemeHelper.getThemedColor(context, R.attr.positiveColor) & 0xFFFFFF),
- Integer.toHexString(ThemeHelper.getThemedColor(context, android.R.attr.colorBackground) & 0xFFFFFF),
- subaddress.getDisplayLabel(), subaddress.getAddress()));
- tvAddress.setText(label);
- generateQr();
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java b/app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java
deleted file mode 100644
index 32512fd..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2017 dm77, 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;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.os.Handler;
-import androidx.fragment.app.Fragment;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Toast;
-
-import com.google.zxing.BarcodeFormat;
-import com.google.zxing.Result;
-
-import me.dm7.barcodescanner.zxing.ZXingScannerView;
-import timber.log.Timber;
-
-public class ScannerFragment extends Fragment implements ZXingScannerView.ResultHandler {
-
- private OnScannedListener onScannedListener;
-
- public interface OnScannedListener {
- boolean onScanned(String qrCode);
- }
-
- private ZXingScannerView mScannerView;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- Timber.d("onCreateView");
- mScannerView = new ZXingScannerView(getActivity());
- return mScannerView;
- }
-
- @Override
- public void onResume() {
- super.onResume();
- Timber.d("onResume");
- mScannerView.setResultHandler(this);
- mScannerView.startCamera();
- }
-
- @Override
- public void handleResult(Result rawResult) {
- if ((rawResult.getBarcodeFormat() == BarcodeFormat.QR_CODE)) {
- if (onScannedListener.onScanned(rawResult.getText())) {
- return;
- } else {
- Toast.makeText(getActivity(), getString(R.string.send_qr_address_invalid), Toast.LENGTH_SHORT).show();
- }
- } else {
- Toast.makeText(getActivity(), getString(R.string.send_qr_invalid), Toast.LENGTH_SHORT).show();
- }
-
- // Note from dm77:
- // * Wait 2 seconds to resume the preview.
- // * On older devices continuously stopping and resuming camera preview can result in freezing the app.
- // * I don't know why this is the case but I don't have the time to figure out.
- Handler handler = new Handler();
- handler.postDelayed(() -> mScannerView.resumeCameraPreview(ScannerFragment.this), 2000);
- }
-
- @Override
- public void onPause() {
- Timber.d("onPause");
- mScannerView.stopCamera();
- super.onPause();
- }
-
- @Override
- public void onAttach(Context context) {
- super.onAttach(context);
- if (context instanceof OnScannedListener) {
- this.onScannedListener = (OnScannedListener) context;
- } else {
- throw new ClassCastException(context.toString()
- + " must implement Listener");
- }
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/SecureActivity.java b/app/src/main/java/com/m2049r/xmrwallet/SecureActivity.java
deleted file mode 100644
index 238aeea..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/SecureActivity.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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;
-
-import android.content.Context;
-import android.content.res.Configuration;
-import android.os.Build;
-import android.os.Bundle;
-
-import androidx.annotation.Nullable;
-import androidx.appcompat.app.AppCompatActivity;
-
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.LocaleHelper;
-
-import java.util.Locale;
-
-import static android.view.WindowManager.LayoutParams;
-
-public abstract class SecureActivity extends AppCompatActivity {
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- if (Helper.preventScreenshot()) {
- getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
- }
- }
-
- @Override
- protected void attachBaseContext(Context newBase) {
- super.attachBaseContext(newBase);
- applyOverrideConfiguration(new Configuration());
- }
-
- @Override
- public void applyOverrideConfiguration(Configuration newConfig) {
- super.applyOverrideConfiguration(updateConfigurationIfSupported(newConfig));
- }
-
- private Configuration updateConfigurationIfSupported(Configuration config) {
- // Configuration.getLocales is added after 24 and Configuration.locale is deprecated in 24
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- if (!config.getLocales().isEmpty()) {
- return config;
- }
- } else {
- if (config.locale != null) {
- return config;
- }
- }
-
- Locale locale = LocaleHelper.getPreferredLocale(this);
- if (locale != null) {
- config.setLocale(locale);
- }
- return config;
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/SettingsFragment.java b/app/src/main/java/com/m2049r/xmrwallet/SettingsFragment.java
deleted file mode 100644
index 6a4bb5a..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/SettingsFragment.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package com.m2049r.xmrwallet;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-
-import androidx.annotation.StyleRes;
-import androidx.preference.ListPreference;
-import androidx.preference.PreferenceFragmentCompat;
-import androidx.preference.PreferenceManager;
-
-import com.m2049r.xmrwallet.dialog.AboutFragment;
-import com.m2049r.xmrwallet.dialog.CreditsFragment;
-import com.m2049r.xmrwallet.dialog.PrivacyFragment;
-import com.m2049r.xmrwallet.util.DayNightMode;
-import com.m2049r.xmrwallet.util.LocaleHelper;
-import com.m2049r.xmrwallet.util.NightmodeHelper;
-import com.m2049r.xmrwallet.util.ThemeHelper;
-import com.m2049r.xmrwallet.widget.Toolbar;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Locale;
-
-import timber.log.Timber;
-
-public class SettingsFragment extends PreferenceFragmentCompat
- implements SharedPreferences.OnSharedPreferenceChangeListener {
- @Override
- public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
- setPreferencesFromResource(R.xml.root_preferences, rootKey);
-
- findPreference(getString(R.string.about_info)).setOnPreferenceClickListener(preference -> {
- AboutFragment.display(getParentFragmentManager());
- return true;
- });
- findPreference(getString(R.string.privacy_info)).setOnPreferenceClickListener(preference -> {
- PrivacyFragment.display(getParentFragmentManager());
- return true;
- });
- findPreference(getString(R.string.credits_info)).setOnPreferenceClickListener(preference -> {
- CreditsFragment.display(getParentFragmentManager());
- return true;
- });
- }
-
- @Override
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
- if (key.equals(getString(R.string.preferred_locale))) {
- activity.recreate();
- } else if (key.equals(getString(R.string.preferred_nightmode))) {
- NightmodeHelper.setNightMode(DayNightMode.valueOf(sharedPreferences.getString(key, "AUTO")));
- } else if (key.equals(getString(R.string.preferred_theme))) {
- ThemeHelper.setTheme((Activity) activity, sharedPreferences.getString(key, "Classic"));
- activity.recreate();
- }
- }
-
- private SettingsFragment.Listener activity;
-
- @Override
- public void onAttach(Context context) {
- super.onAttach(context);
- if (context instanceof SettingsFragment.Listener) {
- activity = (SettingsFragment.Listener) context;
- } else {
- throw new ClassCastException(context + " must implement Listener");
- }
- }
-
- @Override
- public void onResume() {
- super.onResume();
- Timber.d("onResume()");
- activity.setSubtitle(getString(R.string.menu_settings));
- activity.setToolbarButton(Toolbar.BUTTON_BACK);
- populateLanguages();
- PreferenceManager.getDefaultSharedPreferences(requireContext())
- .registerOnSharedPreferenceChangeListener(this);
- }
-
- @Override
- public void onPause() {
- super.onPause();
- PreferenceManager.getDefaultSharedPreferences(requireContext())
- .unregisterOnSharedPreferenceChangeListener(this);
- }
-
- public interface Listener {
- void setToolbarButton(int type);
-
- void setSubtitle(String title);
-
- void recreate();
-
- void setTheme(@StyleRes final int resId);
- }
-
- public void populateLanguages() {
- ListPreference language = findPreference(getString(R.string.preferred_locale));
- assert language != null;
-
- final ArrayList availableLocales = LocaleHelper.getAvailableLocales(requireContext());
- Collections.sort(availableLocales, (locale1, locale2) -> {
- String localeString1 = LocaleHelper.getDisplayName(locale1, true);
- String localeString2 = LocaleHelper.getDisplayName(locale2, true);
- return localeString1.compareTo(localeString2);
- });
-
- String[] localeDisplayNames = new String[1 + availableLocales.size()];
- localeDisplayNames[0] = getString(R.string.language_system_default);
- for (int i = 1; i < localeDisplayNames.length; i++) {
- localeDisplayNames[i] = LocaleHelper.getDisplayName(availableLocales.get(i - 1), true);
- }
- language.setEntries(localeDisplayNames);
-
- String[] languageTags = new String[1 + availableLocales.size()];
- languageTags[0] = "";
- for (int i = 1; i < languageTags.length; i++) {
- languageTags[i] = availableLocales.get(i - 1).toLanguageTag();
- }
- language.setEntryValues(languageTags);
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/SubaddressFragment.java b/app/src/main/java/com/m2049r/xmrwallet/SubaddressFragment.java
deleted file mode 100644
index c42ae7a..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/SubaddressFragment.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * 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;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Toast;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.m2049r.xmrwallet.data.Subaddress;
-import com.m2049r.xmrwallet.layout.SubaddressInfoAdapter;
-import com.m2049r.xmrwallet.ledger.LedgerProgressDialog;
-import com.m2049r.xmrwallet.model.TransactionInfo;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.model.WalletManager;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor;
-import com.m2049r.xmrwallet.widget.Toolbar;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import lombok.RequiredArgsConstructor;
-import timber.log.Timber;
-
-public class SubaddressFragment extends Fragment implements SubaddressInfoAdapter.OnInteractionListener,
- View.OnClickListener, OnBlockUpdateListener {
- static public final String KEY_MODE = "mode";
- static public final String MODE_MANAGER = "manager";
-
- private SubaddressInfoAdapter adapter;
-
- private Listener activityCallback;
-
- private Wallet wallet;
-
- // Container Activity must implement this interface
- public interface Listener {
- void onSubaddressSelected(Subaddress subaddress);
-
- void setSubtitle(String title);
-
- void setToolbarButton(int type);
-
- void showSubaddress(View view, final int subaddressIndex);
-
- void saveWallet();
- }
-
- public interface ProgressListener {
- void showProgressDialog(int msgId);
-
- void showLedgerProgressDialog(int mode);
-
- void dismissProgressDialog();
- }
-
- private ProgressListener progressCallback = null;
-
- @Override
- public void onAttach(@NonNull Context context) {
- super.onAttach(context);
- if (context instanceof ProgressListener) {
- progressCallback = (ProgressListener) context;
- }
- if (context instanceof Listener) {
- activityCallback = (Listener) context;
- } else {
- throw new ClassCastException(context.toString()
- + " must implement Listener");
- }
- }
-
- @Override
- public void onPause() {
- Timber.d("onPause()");
- super.onPause();
- }
-
- @Override
- public void onResume() {
- super.onResume();
- activityCallback.setSubtitle(getString(R.string.subbaddress_title));
- activityCallback.setToolbarButton(Toolbar.BUTTON_BACK);
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- Timber.d("onCreateView");
-
- final Bundle b = getArguments();
- managerMode = ((b != null) && (MODE_MANAGER.equals(b.getString(KEY_MODE))));
-
- View view = inflater.inflate(R.layout.fragment_subaddress, container, false);
- view.findViewById(R.id.fab).setOnClickListener(this);
-
- if (managerMode) {
- view.findViewById(R.id.tvInstruction).setVisibility(View.GONE);
- view.findViewById(R.id.tvHint).setVisibility(View.GONE);
- }
-
- final RecyclerView list = view.findViewById(R.id.list);
- adapter = new SubaddressInfoAdapter(getActivity(), this);
- list.setAdapter(adapter);
- adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
- @Override
- public void onItemRangeInserted(int positionStart, int itemCount) {
- list.scrollToPosition(positionStart);
- }
- });
-
- Helper.hideKeyboard(getActivity());
-
- wallet = WalletManager.getInstance().getWallet();
-
- loadList();
-
- return view;
- }
-
- @Override
- public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- }
-
- public void loadList() {
- Timber.d("loadList()");
- final int numSubaddresses = wallet.getNumSubaddresses();
- final List list = new ArrayList<>();
- for (int i = 0; i < numSubaddresses; i++) {
- list.add(wallet.getSubaddressObject(i));
- }
- adapter.setInfos(list);
- }
-
- @Override
- public void onBlockUpdate(Wallet wallet) {
- loadList();
- }
-
- @Override
- public void onClick(View v) {
- int id = v.getId();
- if (id == R.id.fab) {
- getNewSubaddress();
- }
- }
-
- private int lastUsedSubaddress() {
- int lastUsedSubaddress = 0;
- for (TransactionInfo info : wallet.getHistory().getAll()) {
- if (info.addressIndex > lastUsedSubaddress)
- lastUsedSubaddress = info.addressIndex;
- }
- return lastUsedSubaddress;
- }
-
- private void getNewSubaddress() {
- final int maxSubaddresses = lastUsedSubaddress() + wallet.getDeviceType().getSubaddressLookahead();
- if (wallet.getNumSubaddresses() < maxSubaddresses)
- new AsyncSubaddress().executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR);
- else
- Toast.makeText(getActivity(), getString(R.string.max_subaddress_warning), Toast.LENGTH_LONG).show();
- }
-
- @SuppressLint("StaticFieldLeak")
- @RequiredArgsConstructor
- private class AsyncSubaddress extends AsyncTask {
- boolean dialogOpened = false;
-
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- if ((wallet.getDeviceType() == Wallet.Device.Device_Ledger) && (progressCallback != null)) {
- progressCallback.showLedgerProgressDialog(LedgerProgressDialog.TYPE_SUBADDRESS);
- dialogOpened = true;
- }
- }
-
- @Override
- protected Boolean doInBackground(Void... params) {
- if (params.length != 0) return false;
- wallet.getNewSubaddress();
- if (activityCallback != null) {
- activityCallback.saveWallet();
- }
- return true;
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- super.onPostExecute(result);
- if (dialogOpened)
- progressCallback.dismissProgressDialog();
- if (!isAdded()) // never mind then
- return;
- loadList();
- }
- }
-
- boolean managerMode = false;
-
- // Callbacks from SubaddressInfoAdapter
- @Override
- public void onInteraction(final View view, final Subaddress subaddress) {
- if (managerMode)
- activityCallback.showSubaddress(view, subaddress.getAddressIndex());
- else
- activityCallback.onSubaddressSelected(subaddress); // also closes the fragment with onBackpressed()
- }
-
- @Override
- public boolean onLongInteraction(View view, Subaddress subaddress) {
- activityCallback.showSubaddress(view, subaddress.getAddressIndex());
- return false;
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/SubaddressInfoFragment.java b/app/src/main/java/com/m2049r/xmrwallet/SubaddressInfoFragment.java
deleted file mode 100644
index 3b0941a..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/SubaddressInfoFragment.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * 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;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.inputmethod.EditorInfo;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-import androidx.recyclerview.widget.RecyclerView;
-import androidx.transition.Transition;
-import androidx.transition.TransitionInflater;
-
-import com.google.android.material.textfield.TextInputLayout;
-import com.m2049r.xmrwallet.data.Subaddress;
-import com.m2049r.xmrwallet.layout.TransactionInfoAdapter;
-import com.m2049r.xmrwallet.model.TransactionInfo;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.widget.Toolbar;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import timber.log.Timber;
-
-public class SubaddressInfoFragment extends Fragment
- implements TransactionInfoAdapter.OnInteractionListener, OnBlockUpdateListener {
- private TransactionInfoAdapter adapter;
-
- private Subaddress subaddress;
-
- private TextInputLayout etName;
- private TextView tvAddress;
- private TextView tvTxLabel;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.fragment_subaddressinfo, container, false);
-
- etName = view.findViewById(R.id.etName);
- tvAddress = view.findViewById(R.id.tvAddress);
- tvTxLabel = view.findViewById(R.id.tvTxLabel);
-
- final RecyclerView list = view.findViewById(R.id.list);
- adapter = new TransactionInfoAdapter(getActivity(), this);
- list.setAdapter(adapter);
-
- final Wallet wallet = activityCallback.getWallet();
-
- Bundle b = getArguments();
- final int subaddressIndex = b.getInt("subaddressIndex");
- subaddress = wallet.getSubaddressObject(subaddressIndex);
-
- etName.getEditText().setText(subaddress.getDisplayLabel());
- tvAddress.setText(getContext().getString(R.string.subbaddress_info_subtitle,
- subaddress.getAddressIndex(), subaddress.getSquashedAddress()));
-
- etName.getEditText().setOnFocusChangeListener((v, hasFocus) -> {
- if (!hasFocus) {
- wallet.setSubaddressLabel(subaddressIndex, etName.getEditText().getText().toString());
- }
- });
- etName.getEditText().setOnEditorActionListener((v, actionId, event) -> {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_DONE)) {
- Helper.hideKeyboard(getActivity());
- wallet.setSubaddressLabel(subaddressIndex, etName.getEditText().getText().toString());
- onRefreshed(wallet);
- return true;
- }
- return false;
- });
-
- onRefreshed(wallet);
-
- return view;
- }
-
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Transition transform = TransitionInflater.from(requireContext())
- .inflateTransition(R.transition.details);
- setSharedElementEnterTransition(transform);
- }
-
- public void onRefreshed(final Wallet wallet) {
- Timber.d("onRefreshed");
- List list = new ArrayList<>();
- for (TransactionInfo info : wallet.getHistory().getAll()) {
- if (info.addressIndex == subaddress.getAddressIndex())
- list.add(info);
- }
- adapter.setInfos(list);
- if (list.isEmpty())
- tvTxLabel.setText(R.string.subaddress_notx_label);
- else
- tvTxLabel.setText(R.string.subaddress_tx_label);
- }
-
- @Override
- public void onBlockUpdate(Wallet wallet) {
- onRefreshed(wallet);
- }
-
- // Callbacks from TransactionInfoAdapter
- @Override
- public void onInteraction(final View view, final TransactionInfo infoItem) {
- activityCallback.onTxDetailsRequest(view, infoItem);
- }
-
- Listener activityCallback;
-
- // Container Activity must implement this interface
- public interface Listener {
- void onTxDetailsRequest(View view, TransactionInfo info);
-
- Wallet getWallet();
-
- void setToolbarButton(int type);
-
- void setTitle(String title, String subtitle);
-
- void setSubtitle(String subtitle);
- }
-
- @Override
- public void onAttach(@NonNull Context context) {
- super.onAttach(context);
- if (context instanceof Listener) {
- this.activityCallback = (Listener) context;
- } else {
- throw new ClassCastException(context.toString()
- + " must implement Listener");
- }
- }
-
- @Override
- public void onResume() {
- super.onResume();
- Timber.d("onResume()");
- activityCallback.setSubtitle(getString(R.string.subbaddress_title));
- activityCallback.setToolbarButton(Toolbar.BUTTON_BACK);
- }
-
- @Override
- public void onPause() {
- super.onPause();
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java b/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java
deleted file mode 100644
index 82be82b..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * 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;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Paint;
-import android.net.Uri;
-import android.os.Bundle;
-import android.text.Html;
-import android.text.InputType;
-import android.text.Spanned;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-import androidx.transition.Transition;
-import androidx.transition.TransitionInflater;
-
-import com.m2049r.xmrwallet.data.Subaddress;
-import com.m2049r.xmrwallet.data.UserNotes;
-import com.m2049r.xmrwallet.model.TransactionInfo;
-import com.m2049r.xmrwallet.model.Transfer;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.ThemeHelper;
-import com.m2049r.xmrwallet.widget.Toolbar;
-
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.TimeZone;
-
-import timber.log.Timber;
-
-public class TxFragment extends Fragment {
-
- static public final String ARG_INFO = "info";
-
- private final SimpleDateFormat TS_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
-
- public TxFragment() {
- super();
- Calendar cal = Calendar.getInstance();
- TimeZone tz = cal.getTimeZone(); //get the local time zone.
- TS_FORMATTER.setTimeZone(tz);
- }
-
- private TextView tvAccount;
- private TextView tvAddress;
- private TextView tvTxTimestamp;
- private TextView tvTxId;
- private TextView tvTxKey;
- private TextView tvDestination;
- private TextView tvTxPaymentId;
- private TextView tvTxBlockheight;
- private TextView tvTxAmount;
- private TextView tvTxFee;
- private TextView tvTxTransfers;
- private TextView etTxNotes;
-
- // XMRTO stuff
- private View cvXmrTo;
- private TextView tvTxXmrToKey;
- private TextView tvDestinationBtc;
- private TextView tvTxAmountBtc;
- private TextView tvXmrToSupport;
- private TextView tvXmrToKeyLabel;
- private ImageView tvXmrToLogo;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.fragment_tx_info, container, false);
-
- cvXmrTo = view.findViewById(R.id.cvXmrTo);
- tvTxXmrToKey = view.findViewById(R.id.tvTxXmrToKey);
- tvDestinationBtc = view.findViewById(R.id.tvDestinationBtc);
- tvTxAmountBtc = view.findViewById(R.id.tvTxAmountBtc);
- tvXmrToSupport = view.findViewById(R.id.tvXmrToSupport);
- tvXmrToKeyLabel = view.findViewById(R.id.tvXmrToKeyLabel);
- tvXmrToLogo = view.findViewById(R.id.tvXmrToLogo);
-
- tvAccount = view.findViewById(R.id.tvAccount);
- tvAddress = view.findViewById(R.id.tvAddress);
- tvTxTimestamp = view.findViewById(R.id.tvTxTimestamp);
- tvTxId = view.findViewById(R.id.tvTxId);
- tvTxKey = view.findViewById(R.id.tvTxKey);
- tvDestination = view.findViewById(R.id.tvDestination);
- tvTxPaymentId = view.findViewById(R.id.tvTxPaymentId);
- tvTxBlockheight = view.findViewById(R.id.tvTxBlockheight);
- tvTxAmount = view.findViewById(R.id.tvTxAmount);
- tvTxFee = view.findViewById(R.id.tvTxFee);
- tvTxTransfers = view.findViewById(R.id.tvTxTransfers);
- etTxNotes = view.findViewById(R.id.etTxNotes);
-
- etTxNotes.setRawInputType(InputType.TYPE_CLASS_TEXT);
-
- tvTxXmrToKey.setOnClickListener(v -> {
- Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_xmrtokey), tvTxXmrToKey.getText().toString());
- Toast.makeText(getActivity(), getString(R.string.message_copy_xmrtokey), Toast.LENGTH_SHORT).show();
- });
-
- info = getArguments().getParcelable(ARG_INFO);
- show();
- return view;
- }
-
- void shareTxInfo() {
- if (this.info == null) return;
- StringBuffer sb = new StringBuffer();
-
- 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(":\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\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) {
- sb.append(getString(R.string.tx_pending)).append("\n");
- } else {
- sb.append(info.blockheight).append("\n");
- }
- sb.append("\n");
-
- sb.append(getString(R.string.tx_transfers)).append(":\n");
- if (info.transfers != null) {
- boolean comma = false;
- for (Transfer transfer : info.transfers) {
- if (comma) {
- sb.append(", ");
- } else {
- comma = true;
- }
- sb.append(transfer.address).append(": ");
- sb.append(Wallet.getDisplayAmount(transfer.amount));
- }
- } else {
- sb.append("-");
- }
- sb.append("\n\n");
-
- 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;
- UserNotes userNotes = null;
-
- void loadNotes() {
- if ((userNotes == null) || (info.notes == null)) {
- info.notes = activityCallback.getTxNotes(info.hash);
- }
- userNotes = new UserNotes(info.notes);
- etTxNotes.setText(userNotes.note);
- }
-
- private void setTxColour(int clr) {
- tvTxAmount.setTextColor(clr);
- tvTxFee.setTextColor(clr);
- }
-
- private void showSubaddressLabel() {
- final Subaddress subaddress = activityCallback.getWalletSubaddress(info.accountIndex, info.addressIndex);
- final Context ctx = getContext();
- Spanned label = Html.fromHtml(ctx.getString(R.string.tx_account_formatted,
- info.accountIndex, info.addressIndex,
- Integer.toHexString(ThemeHelper.getThemedColor(ctx, R.attr.positiveColor) & 0xFFFFFF),
- Integer.toHexString(ThemeHelper.getThemedColor(ctx, android.R.attr.colorBackground) & 0xFFFFFF),
- subaddress.getDisplayLabel()));
- tvAccount.setText(label);
- tvAccount.setOnClickListener(v -> activityCallback.showSubaddress(v, info.addressIndex));
- }
-
- private void show() {
- if (info.txKey == null) {
- info.txKey = activityCallback.getTxKey(info.hash);
- }
- if (info.address == null) {
- info.address = activityCallback.getTxAddress(info.accountIndex, info.addressIndex);
- }
- loadNotes();
-
- showSubaddressLabel();
- tvAddress.setText(info.address);
-
- tvTxTimestamp.setText(TS_FORMATTER.format(new Date(info.timestamp * 1000)));
- tvTxId.setText(info.hash);
- tvTxKey.setText(info.txKey.isEmpty() ? "-" : info.txKey);
- tvTxPaymentId.setText(info.paymentId);
- if (info.isFailed) {
- tvTxBlockheight.setText(getString(R.string.tx_failed));
- } else if (info.isPending) {
- tvTxBlockheight.setText(getString(R.string.tx_pending));
- } else {
- tvTxBlockheight.setText("" + info.blockheight);
- }
- String sign = (info.direction == TransactionInfo.Direction.Direction_In ? "+" : "-");
-
- long realAmount = info.amount;
- tvTxAmount.setText(sign + Wallet.getDisplayAmount(realAmount));
-
- if ((info.fee > 0)) {
- String fee = Wallet.getDisplayAmount(info.fee);
- 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(ThemeHelper.getThemedColor(getContext(), R.attr.neutralColor));
- } else if (info.isPending) {
- setTxColour(ThemeHelper.getThemedColor(getContext(), R.attr.neutralColor));
- } else if (info.direction == TransactionInfo.Direction.Direction_In) {
- setTxColour(ThemeHelper.getThemedColor(getContext(), R.attr.positiveColor));
- } else {
- setTxColour(ThemeHelper.getThemedColor(getContext(), R.attr.negativeColor));
- }
- Set destinations = new HashSet<>();
- StringBuilder sb = new StringBuilder();
- StringBuilder dstSb = new StringBuilder();
- if (info.transfers != null) {
- boolean newline = false;
- for (Transfer transfer : info.transfers) {
- destinations.add(transfer.address);
- if (newline) {
- sb.append("\n");
- } else {
- newline = true;
- }
- sb.append("[").append(transfer.address.substring(0, 6)).append("] ");
- sb.append(Wallet.getDisplayAmount(transfer.amount));
- }
- newline = false;
- for (String dst : destinations) {
- if (newline) {
- dstSb.append("\n");
- } else {
- newline = true;
- }
- dstSb.append(dst);
- }
- } else {
- sb.append("-");
- dstSb.append(info.direction == TransactionInfo.Direction.Direction_In ?
- activityCallback.getWalletSubaddress(info.accountIndex, info.addressIndex).getAddress() :
- "-");
- }
- tvTxTransfers.setText(sb.toString());
- tvDestination.setText(dstSb.toString());
- showBtcInfo();
- }
-
- @SuppressLint("SetTextI18n")
- void showBtcInfo() {
- if (userNotes.xmrtoKey != null) {
- cvXmrTo.setVisibility(View.VISIBLE);
- String key = userNotes.xmrtoKey;
- if ("xmrto".equals(userNotes.xmrtoTag)) { // legacy xmr.to service :(
- key = "xmrto-" + key;
- }
- tvTxXmrToKey.setText(key);
- tvDestinationBtc.setText(userNotes.xmrtoDestination);
- tvTxAmountBtc.setText(userNotes.xmrtoAmount + " " + userNotes.xmrtoCurrency);
- switch (userNotes.xmrtoTag) {
- case "xmrto":
- tvXmrToSupport.setVisibility(View.GONE);
- tvXmrToKeyLabel.setVisibility(View.INVISIBLE);
- tvXmrToLogo.setImageResource(R.drawable.ic_xmrto_logo);
- break;
- case "side": // defaults in layout - just add underline
- tvXmrToSupport.setPaintFlags(tvXmrToSupport.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
- tvXmrToSupport.setOnClickListener(v -> {
- Uri uri = Uri.parse("https://sideshift.ai/orders/" + userNotes.xmrtoKey);
- Intent intent = new Intent(Intent.ACTION_VIEW, uri);
- startActivity(intent);
- });
- break;
- default:
- tvXmrToSupport.setVisibility(View.GONE);
- tvXmrToKeyLabel.setVisibility(View.INVISIBLE);
- tvXmrToLogo.setVisibility(View.GONE);
- }
- } else {
- cvXmrTo.setVisibility(View.GONE);
- }
- }
-
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
- Transition transform = TransitionInflater.from(requireContext())
- .inflateTransition(R.transition.details);
- setSharedElementEnterTransition(transform);
- }
-
- @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 {
- Subaddress getWalletSubaddress(int accountIndex, int subaddressIndex);
-
- String getTxKey(String hash);
-
- String getTxNotes(String hash);
-
- boolean setTxNotes(String txId, String txNotes);
-
- String getTxAddress(int major, int minor);
-
- void setToolbarButton(int type);
-
- void setSubtitle(String subtitle);
-
- void showSubaddress(View view, final int subaddressIndex);
-
- }
-
- @Override
- public void onAttach(Context context) {
- super.onAttach(context);
- if (context instanceof TxFragment.Listener) {
- this.activityCallback = (TxFragment.Listener) context;
- } else {
- throw new ClassCastException(context.toString()
- + " must implement Listener");
- }
- }
-
- @Override
- public void onPause() {
- if (!etTxNotes.getText().toString().equals(userNotes.note)) { // notes have changed
- // save them
- userNotes.setNote(etTxNotes.getText().toString());
- info.notes = userNotes.txNotes;
- activityCallback.setTxNotes(info.hash, info.notes);
- }
- Helper.hideKeyboard(getActivity());
- super.onPause();
- }
-
- @Override
- public void onResume() {
- super.onResume();
- Timber.d("onResume()");
- activityCallback.setSubtitle(getString(R.string.tx_title));
- activityCallback.setToolbarButton(Toolbar.BUTTON_BACK);
- showSubaddressLabel();
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java
deleted file mode 100644
index 5ab6ad7..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java
+++ /dev/null
@@ -1,1220 +0,0 @@
-/*
- * 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;
-
-import android.annotation.SuppressLint;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.inputmethod.EditorInfo;
-import android.widget.EditText;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.appcompat.app.ActionBarDrawerToggle;
-import androidx.appcompat.app.AlertDialog;
-import androidx.core.view.GravityCompat;
-import androidx.drawerlayout.widget.DrawerLayout;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.google.android.material.navigation.NavigationView;
-import com.m2049r.xmrwallet.data.BarcodeData;
-import com.m2049r.xmrwallet.data.Subaddress;
-import com.m2049r.xmrwallet.data.TxData;
-import com.m2049r.xmrwallet.data.UserNotes;
-import com.m2049r.xmrwallet.dialog.CreditsFragment;
-import com.m2049r.xmrwallet.dialog.HelpFragment;
-import com.m2049r.xmrwallet.fragment.send.SendAddressWizardFragment;
-import com.m2049r.xmrwallet.fragment.send.SendFragment;
-import com.m2049r.xmrwallet.ledger.LedgerProgressDialog;
-import com.m2049r.xmrwallet.model.PendingTransaction;
-import com.m2049r.xmrwallet.model.TransactionInfo;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.model.WalletManager;
-import com.m2049r.xmrwallet.service.WalletService;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor;
-import com.m2049r.xmrwallet.util.ThemeHelper;
-import com.m2049r.xmrwallet.widget.Toolbar;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import timber.log.Timber;
-
-public class WalletActivity extends BaseActivity implements WalletFragment.Listener,
- WalletService.Observer, SendFragment.Listener, TxFragment.Listener,
- GenerateReviewFragment.ListenerWithWallet,
- GenerateReviewFragment.Listener,
- GenerateReviewFragment.PasswordChangedListener,
- ScannerFragment.OnScannedListener, ReceiveFragment.Listener,
- SendAddressWizardFragment.OnScanListener,
- WalletFragment.DrawerLocker,
- NavigationView.OnNavigationItemSelectedListener,
- SubaddressFragment.Listener,
- SubaddressInfoFragment.Listener {
-
- public static final String REQUEST_ID = "id";
- public static final String REQUEST_PW = "pw";
- public static final String REQUEST_FINGERPRINT_USED = "fingerprint";
- public static final String REQUEST_STREETMODE = "streetmode";
- public static final String REQUEST_URI = "uri";
-
- private NavigationView accountsView;
- private DrawerLayout drawer;
- private ActionBarDrawerToggle drawerToggle;
-
- private Toolbar toolbar;
- private boolean requestStreetMode = false;
-
- private String password;
-
- private String uri = null;
-
- private long streetMode = 0;
-
- @Override
- public void onPasswordChanged(String newPassword) {
- password = newPassword;
- }
-
- @Override
- public String getPassword() {
- return password;
- }
-
- @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) {
- Timber.d("setTitle:%s.", title);
- toolbar.setTitle(title);
- }
-
- @Override
- public void setSubtitle(String subtitle) {
- toolbar.setSubtitle(subtitle);
- }
-
- private boolean synced = false;
-
- @Override
- public boolean isSynced() {
- return synced;
- }
-
- private WalletFragment getWalletFragment() {
- return (WalletFragment) getSupportFragmentManager().findFragmentByTag(WalletFragment.class.getName());
- }
-
- private Fragment getCurrentFragment() {
- return getSupportFragmentManager().findFragmentById(R.id.fragment_container);
- }
-
- @Override
- public boolean isStreetMode() {
- return streetMode > 0;
- }
-
- private void enableStreetMode(boolean enable) {
- if (enable) {
- streetMode = getWallet().getDaemonBlockChainHeight();
- } else {
- streetMode = 0;
- }
- final WalletFragment walletFragment = getWalletFragment();
- if (walletFragment != null) walletFragment.resetDismissedTransactions();
- forceUpdate();
- runOnUiThread(() -> {
- if (getWallet() != null)
- updateAccountsBalance();
- });
- }
-
- @Override
- public long getStreetModeHeight() {
- return streetMode;
- }
-
- @Override
- public boolean isWatchOnly() {
- return getWallet().isWatchOnly();
- }
-
- @Override
- public String getTxKey(String txId) {
- return getWallet().getTxKey(txId);
- }
-
- @Override
- public String getTxNotes(String txId) {
- return getWallet().getUserNote(txId);
- }
-
- @Override
- public boolean setTxNotes(String txId, String txNotes) {
- return getWallet().setUserNote(txId, txNotes);
- }
-
- @Override
- public String getTxAddress(int major, int minor) {
- return getWallet().getSubaddress(major, minor);
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- Timber.d("onStart()");
- }
-
- private void startWalletService() {
- Bundle extras = getIntent().getExtras();
- if (extras != null) {
- acquireWakeLock();
- String walletId = extras.getString(REQUEST_ID);
- // we can set the streetmode height AFTER opening the wallet
- requestStreetMode = extras.getBoolean(REQUEST_STREETMODE);
- password = extras.getString(REQUEST_PW);
- uri = extras.getString(REQUEST_URI);
- connectWalletService(walletId, password);
- } else {
- finish();
- }
- }
-
- private void stopWalletService() {
- disconnectWalletService();
- releaseWakeLock();
- }
-
- private void onWalletRescan() {
- try {
- final WalletFragment walletFragment = getWalletFragment();
- getWallet().rescanBlockchainAsync();
- synced = false;
- walletFragment.unsync();
- invalidateOptionsMenu();
- } catch (ClassCastException ex) {
- Timber.d(ex.getLocalizedMessage());
- // keep calm and carry on
- }
- }
-
- @Override
- protected void onStop() {
- Timber.d("onStop()");
- super.onStop();
- }
-
- @Override
- protected void onDestroy() {
- Timber.d("onDestroy()");
- if ((mBoundService != null) && (getWallet() != null)) {
- saveWallet();
- }
- stopWalletService();
- if (drawer != null) drawer.removeDrawerListener(drawerToggle);
- super.onDestroy();
- }
-
- @Override
- public boolean hasWallet() {
- return haveWallet;
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- MenuItem renameItem = menu.findItem(R.id.action_rename);
- if (renameItem != null)
- renameItem.setEnabled(hasWallet() && getWallet().isSynchronized());
- MenuItem streetmodeItem = menu.findItem(R.id.action_streetmode);
- if (streetmodeItem != null)
- if (isStreetMode()) {
- streetmodeItem.setIcon(R.drawable.gunther_csi_24dp);
- } else {
- streetmodeItem.setIcon(R.drawable.gunther_24dp);
- }
- final MenuItem rescanItem = menu.findItem(R.id.action_rescan);
- if (rescanItem != null)
- rescanItem.setEnabled(isSynced());
- return super.onPrepareOptionsMenu(menu);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- final int itemId = item.getItemId();
- if (itemId == R.id.action_rescan) {
- onWalletRescan();
- } else if (itemId == R.id.action_info) {
- onWalletDetails();
- } else if (itemId == R.id.action_credits) {
- CreditsFragment.display(getSupportFragmentManager());
- } else if (itemId == R.id.action_share) {
- onShareTxInfo();
- } else if (itemId == R.id.action_help_tx_info) {
- HelpFragment.display(getSupportFragmentManager(), R.string.help_tx_details);
- } else if (itemId == R.id.action_help_wallet) {
- HelpFragment.display(getSupportFragmentManager(), R.string.help_wallet);
- } else if (itemId == R.id.action_details_help) {
- HelpFragment.display(getSupportFragmentManager(), R.string.help_details);
- } else if (itemId == R.id.action_details_changepw) {
- onWalletChangePassword();
- } else if (itemId == R.id.action_help_send) {
- HelpFragment.display(getSupportFragmentManager(), R.string.help_send);
- } else if (itemId == R.id.action_rename) {
- onAccountRename();
- } else if (itemId == R.id.action_subaddresses) {
- showSubaddresses(true);
- } else if (itemId == R.id.action_streetmode) {
- if (isStreetMode()) { // disable streetmode
- onDisableStreetMode();
- } else {
- onEnableStreetMode();
- }
- } else
- return super.onOptionsItemSelected(item);
- return true;
- }
-
- private void updateStreetMode() {
- invalidateOptionsMenu();
- }
-
- private void onEnableStreetMode() {
- enableStreetMode(true);
- updateStreetMode();
- }
-
- private void onDisableStreetMode() {
- Helper.promptPassword(WalletActivity.this, getWallet().getName(), false, new Helper.PasswordAction() {
- @Override
- public void act(String walletName, String password, boolean fingerprintUsed) {
- runOnUiThread(() -> {
- enableStreetMode(false);
- updateStreetMode();
- });
- }
-
- @Override
- public void fail(String walletName) {
- }
- });
- }
-
-
- public void onWalletChangePassword() {
- try {
- GenerateReviewFragment detailsFragment = (GenerateReviewFragment) getCurrentFragment();
- AlertDialog dialog = detailsFragment.createChangePasswordDialog();
- if (dialog != null) {
- Helper.showKeyboard(dialog);
- dialog.show();
- }
- } catch (ClassCastException ex) {
- Timber.w("onWalletChangePassword() called, but no GenerateReviewFragment active");
- }
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- Timber.d("onCreate()");
- ThemeHelper.setPreferred(this);
- super.onCreate(savedInstanceState);
- if (savedInstanceState != null) {
- // activity restarted
- // we don't want that - finish it and fall back to previous activity
- finish();
- return;
- }
-
- setContentView(R.layout.activity_wallet);
- 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:
- onDisposeRequest();
- onBackPressed();
- break;
- case Toolbar.BUTTON_CANCEL:
- onDisposeRequest();
- Helper.hideKeyboard(WalletActivity.this);
- WalletActivity.super.onBackPressed();
- break;
- case Toolbar.BUTTON_CLOSE:
- finish();
- break;
- case Toolbar.BUTTON_SETTINGS:
- Toast.makeText(WalletActivity.this, getString(R.string.label_credits), Toast.LENGTH_SHORT).show();
- case Toolbar.BUTTON_NONE:
- default:
- Timber.e("Button " + type + "pressed - how can this be?");
- }
- }
- });
-
- drawer = findViewById(R.id.drawer_layout);
- drawerToggle = new ActionBarDrawerToggle(this, drawer, toolbar, 0, 0);
- drawer.addDrawerListener(drawerToggle);
- drawerToggle.syncState();
- setDrawerEnabled(false); // disable until synced
-
- accountsView = findViewById(R.id.accounts_nav);
- accountsView.setNavigationItemSelectedListener(this);
-
- showNet();
-
- Fragment walletFragment = new WalletFragment();
- getSupportFragmentManager().beginTransaction()
- .add(R.id.fragment_container, walletFragment, WalletFragment.class.getName()).commit();
- Timber.d("fragment added");
-
- startWalletService();
- Timber.d("onCreate() done.");
- }
-
- public void showNet() {
- switch (WalletManager.getInstance().getNetworkType()) {
- case NetworkType_Mainnet:
- toolbar.setBackgroundResource(R.drawable.backgound_toolbar_mainnet);
- break;
- case NetworkType_Stagenet:
- case NetworkType_Testnet:
- toolbar.setBackgroundResource(ThemeHelper.getThemedResourceId(this, R.attr.colorPrimaryDark));
- break;
- default:
- throw new IllegalStateException("Unsupported Network: " + WalletManager.getInstance().getNetworkType());
- }
- }
-
- @Override
- public Wallet getWallet() {
- if (mBoundService == null) throw new IllegalStateException("WalletService not bound.");
- return mBoundService.getWallet();
- }
-
- private WalletService mBoundService = null;
- private boolean mIsBound = false;
-
- private final ServiceConnection mConnection = new ServiceConnection() {
- public void onServiceConnected(ComponentName className, IBinder service) {
- // This is called when the connection with the service has been
- // established, giving us the service object we can use to
- // interact with the service. Because we have bound to a explicit
- // 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();
- mBoundService.setObserver(WalletActivity.this);
- Bundle extras = getIntent().getExtras();
- if (extras != null) {
- String walletId = extras.getString(REQUEST_ID);
- if (walletId != null) {
- setTitle(walletId, getString(R.string.status_wallet_connecting));
- }
- }
- updateProgress();
- Timber.d("CONNECTED");
- }
-
- public void onServiceDisconnected(ComponentName className) {
- // This is called when the connection with the service has been
- // unexpectedly disconnected -- that is, its process crashed.
- // Because it is running in our same process, we should never
- // see this happen.
- mBoundService = null;
- setTitle(getString(R.string.wallet_activity_name), getString(R.string.status_wallet_disconnected));
- Timber.d("DISCONNECTED");
- }
- };
-
- void connectWalletService(String walletName, String walletPassword) {
- // Establish a connection with the service. We use an explicit
- // class name because we want a specific service implementation that
- // we know will be running in our own process (and thus won't be
- // supporting component replacement by other applications).
- Intent intent = new Intent(getApplicationContext(), WalletService.class);
- intent.putExtra(WalletService.REQUEST_WALLET, walletName);
- intent.putExtra(WalletService.REQUEST, WalletService.REQUEST_CMD_LOAD);
- intent.putExtra(WalletService.REQUEST_CMD_LOAD_PW, walletPassword);
- startService(intent);
- bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
- mIsBound = true;
- Timber.d("BOUND");
- }
-
- void disconnectWalletService() {
- if (mIsBound) {
- // Detach our existing connection.
- mBoundService.setObserver(null);
- unbindService(mConnection);
- mIsBound = false;
- Timber.d("UNBOUND");
- }
- }
-
- @Override
- protected void onPause() {
- Timber.d("onPause()");
- super.onPause();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- Timber.d("onResume()");
- }
-
- @Override
- public void saveWallet() {
- if (mIsBound) { // no point in talking to unbound service
- Intent intent = new Intent(getApplicationContext(), WalletService.class);
- intent.putExtra(WalletService.REQUEST, WalletService.REQUEST_CMD_STORE);
- startService(intent);
- Timber.d("STORE request sent");
- } else {
- Timber.e("Service not bound");
- }
- }
-
-//////////////////////////////////////////
-// WalletFragment.Listener
-//////////////////////////////////////////
-
- @Override
- public boolean hasBoundService() {
- return mBoundService != null;
- }
-
- @Override
- public Wallet.ConnectionStatus getConnectionStatus() {
- return mBoundService.getConnectionStatus();
- }
-
- @Override
- public long getDaemonHeight() {
- return mBoundService.getDaemonHeight();
- }
-
- @Override
- public void onSendRequest(View view) {
- replaceFragment(SendFragment.newInstance(uri), null, null);
- uri = null; // only use uri once
- }
-
- @Override
- public void onTxDetailsRequest(View view, TransactionInfo info) {
- Bundle args = new Bundle();
- args.putParcelable(TxFragment.ARG_INFO, info);
- replaceFragmentWithTransition(view, new TxFragment(), null, args);
- }
-
- @Override
- public void forceUpdate() {
- try {
- onRefreshed(getWallet(), true);
- } catch (IllegalStateException ex) {
- Timber.e(ex.getLocalizedMessage());
- }
- }
-
-///////////////////////////
-// WalletService.Observer
-///////////////////////////
-
- private int numAccounts = -1;
-
- // refresh and return true if successful
- @Override
- public boolean onRefreshed(final Wallet wallet, final boolean full) {
- Timber.d("onRefreshed()");
- runOnUiThread(() -> {
- if (getWallet() != null)
- updateAccountsBalance();
- });
- if (numAccounts != wallet.getNumAccounts()) {
- numAccounts = wallet.getNumAccounts();
- runOnUiThread(this::updateAccountsList);
- }
- try {
- final WalletFragment walletFragment = getWalletFragment();
- if (wallet.isSynchronized()) {
- releaseWakeLock(RELEASE_WAKE_LOCK_DELAY); // the idea is to stay awake until synced
- if (!synced) { // first sync
- onProgress(-1);
- saveWallet(); // save on first sync
- synced = true;
- runOnUiThread(walletFragment::onSynced);
- }
- }
- runOnUiThread(() -> {
- walletFragment.onRefreshed(wallet, full);
- updateCurrentFragment(wallet);
- });
- return true;
- } catch (ClassCastException ex) {
- // not in wallet fragment (probably send monero)
- Timber.d(ex.getLocalizedMessage());
- // keep calm and carry on
- }
- return false;
- }
-
- private void updateCurrentFragment(final Wallet wallet) {
- final Fragment fragment = getCurrentFragment();
- if (fragment instanceof OnBlockUpdateListener) {
- ((OnBlockUpdateListener) fragment).onBlockUpdate(wallet);
- }
- }
-
- @Override
- public void onWalletStored(final boolean success) {
- runOnUiThread(() -> {
- if (!success) {
- Toast.makeText(WalletActivity.this, getString(R.string.status_wallet_unload_failed), Toast.LENGTH_LONG).show();
- }
- });
- }
-
- boolean haveWallet = false;
-
- @Override
- public void onWalletOpen(final Wallet.Device device) {
- if (device == Wallet.Device.Device_Ledger) {
- runOnUiThread(() -> showLedgerProgressDialog(LedgerProgressDialog.TYPE_RESTORE));
- }
- }
-
- @Override
- public void onWalletStarted(final Wallet.Status walletStatus) {
- runOnUiThread(() -> {
- dismissProgressDialog();
- if (walletStatus == null) {
- // guess what went wrong
- Toast.makeText(WalletActivity.this, getString(R.string.status_wallet_connect_failed), Toast.LENGTH_LONG).show();
- } else {
- if (Wallet.ConnectionStatus.ConnectionStatus_WrongVersion == walletStatus.getConnectionStatus())
- Toast.makeText(WalletActivity.this, getString(R.string.status_wallet_connect_wrongversion), Toast.LENGTH_LONG).show();
- else if (!walletStatus.isOk())
- Toast.makeText(WalletActivity.this, walletStatus.getErrorString(), Toast.LENGTH_LONG).show();
- }
- });
- if ((walletStatus == null) || (Wallet.ConnectionStatus.ConnectionStatus_Connected != walletStatus.getConnectionStatus())) {
- finish();
- } else {
- haveWallet = true;
- invalidateOptionsMenu();
-
- if (requestStreetMode) onEnableStreetMode();
-
- final WalletFragment walletFragment = getWalletFragment();
- runOnUiThread(() -> {
- updateAccountsHeader();
- if (walletFragment != null) {
- walletFragment.onLoaded();
- }
- });
- }
- }
-
- @Override
- public void onTransactionCreated(final String txTag, final PendingTransaction pendingTransaction) {
- try {
- final SendFragment sendFragment = (SendFragment) getCurrentFragment();
- runOnUiThread(() -> {
- dismissProgressDialog();
- PendingTransaction.Status status = pendingTransaction.getStatus();
- if (status != PendingTransaction.Status.Status_Ok) {
- String errorText = pendingTransaction.getErrorString();
- getWallet().disposePendingTransaction();
- sendFragment.onCreateTransactionFailed(errorText);
- } else {
- sendFragment.onTransactionCreated(txTag, pendingTransaction);
- }
- });
- } catch (ClassCastException ex) {
- // not in spend fragment
- Timber.d(ex.getLocalizedMessage());
- // don't need the transaction any more
- getWallet().disposePendingTransaction();
- }
- }
-
- @Override
- public void onSendTransactionFailed(final String error) {
- try {
- final SendFragment sendFragment = (SendFragment) getCurrentFragment();
- runOnUiThread(() -> sendFragment.onSendTransactionFailed(error));
- } catch (ClassCastException ex) {
- // not in spend fragment
- Timber.d(ex.getLocalizedMessage());
- }
- }
-
- @Override
- public void onTransactionSent(final String txId) {
- try {
- final SendFragment sendFragment = (SendFragment) getCurrentFragment();
- runOnUiThread(() -> sendFragment.onTransactionSent(txId));
- } catch (ClassCastException ex) {
- // not in spend fragment
- Timber.d(ex.getLocalizedMessage());
- }
- }
-
- @Override
- public void onProgress(final String text) {
- try {
- final WalletFragment walletFragment = getWalletFragment();
- runOnUiThread(new Runnable() {
- public void run() {
- walletFragment.setProgress(text);
- }
- });
- } catch (ClassCastException ex) {
- // not in wallet fragment (probably send monero)
- Timber.d(ex.getLocalizedMessage());
- // keep calm and carry on
- }
- }
-
- @Override
- public void onProgress(final int n) {
- runOnUiThread(() -> {
- try {
- WalletFragment walletFragment = getWalletFragment();
- if (walletFragment != null)
- walletFragment.setProgress(n);
- } catch (ClassCastException ex) {
- // not in wallet fragment (probably send monero)
- Timber.d(ex.getLocalizedMessage());
- // keep calm and carry on
- }
- });
- }
-
- private void updateProgress() {
- // TODO maybe show real state of WalletService (like "still closing previous wallet")
- if (hasBoundService()) {
- onProgress(mBoundService.getProgressText());
- onProgress(mBoundService.getProgressValue());
- }
- }
-
-///////////////////////////
-// SendFragment.Listener
-///////////////////////////
-
- @Override
- public void onSend(UserNotes notes) {
- if (mIsBound) { // no point in talking to unbound service
- Intent intent = new Intent(getApplicationContext(), WalletService.class);
- intent.putExtra(WalletService.REQUEST, WalletService.REQUEST_CMD_SEND);
- intent.putExtra(WalletService.REQUEST_CMD_SEND_NOTES, notes.txNotes);
- startService(intent);
- Timber.d("SEND TX request sent");
- } else {
- Timber.e("Service not bound");
- }
-
- }
-
- @Override
- public void onPrepareSend(final String tag, final TxData txData) {
- if (mIsBound) { // no point in talking to unbound service
- Intent intent = new Intent(getApplicationContext(), WalletService.class);
- intent.putExtra(WalletService.REQUEST, WalletService.REQUEST_CMD_TX);
- intent.putExtra(WalletService.REQUEST_CMD_TX_DATA, txData);
- intent.putExtra(WalletService.REQUEST_CMD_TX_TAG, tag);
- startService(intent);
- Timber.d("CREATE TX request sent");
- if (getWallet().getDeviceType() == Wallet.Device.Device_Ledger)
- showLedgerProgressDialog(LedgerProgressDialog.TYPE_SEND);
- } else {
- Timber.e("Service not bound");
- }
- }
-
- @Override
- public Subaddress getWalletSubaddress(int accountIndex, int subaddressIndex) {
- return getWallet().getSubaddressObject(accountIndex, subaddressIndex);
- }
-
- public String getWalletName() {
- return getWallet().getName();
- }
-
- void popFragmentStack(String name) {
- if (name == null) {
- getSupportFragmentManager().popBackStack();
- } else {
- getSupportFragmentManager().popBackStack(name, FragmentManager.POP_BACK_STACK_INCLUSIVE);
- }
- }
-
- void replaceFragmentWithTransition(View view, Fragment newFragment, String stackName, Bundle extras) {
- if (extras != null) {
- newFragment.setArguments(extras);
- }
- int transition;
- if (newFragment instanceof TxFragment)
- transition = R.string.tx_details_transition_name;
- else if (newFragment instanceof SubaddressInfoFragment)
- transition = R.string.subaddress_info_transition_name;
- else
- throw new IllegalStateException("expecting known transition");
-
- getSupportFragmentManager().beginTransaction()
- .addSharedElement(view, getString(transition))
- .replace(R.id.fragment_container, newFragment)
- .addToBackStack(stackName)
- .commit();
- }
-
- void replaceFragment(Fragment newFragment, String stackName, Bundle extras) {
- if (extras != null) {
- newFragment.setArguments(extras);
- }
- getSupportFragmentManager()
- .beginTransaction()
- .replace(R.id.fragment_container, newFragment)
- .addToBackStack(stackName)
- .commit();
- }
-
- private void onWalletDetails() {
- DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- switch (which) {
- case DialogInterface.BUTTON_POSITIVE:
- final Bundle extras = new Bundle();
- extras.putString(GenerateReviewFragment.REQUEST_TYPE, GenerateReviewFragment.VIEW_TYPE_WALLET);
-
- Helper.promptPassword(WalletActivity.this, getWallet().getName(), true, new Helper.PasswordAction() {
- @Override
- public void act(String walletName, String password, boolean fingerprintUsed) {
- replaceFragment(new GenerateReviewFragment(), null, extras);
- }
-
- @Override
- public void fail(String walletName) {
- }
- });
-
- break;
- case DialogInterface.BUTTON_NEGATIVE:
- // do nothing
- break;
- }
- }
- };
-
- AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
- builder.setMessage(getString(R.string.details_alert_message))
- .setPositiveButton(getString(R.string.details_alert_yes), dialogClickListener)
- .setNegativeButton(getString(R.string.details_alert_no), dialogClickListener)
- .show();
- }
-
- void onShareTxInfo() {
- try {
- TxFragment fragment = (TxFragment) getCurrentFragment();
- fragment.shareTxInfo();
- } catch (ClassCastException ex) {
- // not in wallet fragment
- Timber.e(ex.getLocalizedMessage());
- // keep calm and carry on
- }
- }
-
- @Override
- public void onDisposeRequest() {
- //TODO consider doing this through the WalletService to avoid concurrency issues
- getWallet().disposePendingTransaction();
- }
-
- private boolean startScanFragment = false;
-
- @Override
- protected void onResumeFragments() {
- super.onResumeFragments();
- if (startScanFragment) {
- startScanFragment();
- startScanFragment = false;
- }
- }
-
- private void startScanFragment() {
- Bundle extras = new Bundle();
- replaceFragment(new ScannerFragment(), null, extras);
- }
-
- /// QR scanner callbacks
- @Override
- public void onScan() {
- if (Helper.getCameraPermission(this)) {
- startScanFragment();
- } else {
- Timber.i("Waiting for permissions");
- }
- }
-
- @Override
- public boolean onScanned(String qrCode) {
- // #gurke
- BarcodeData bcData = BarcodeData.fromString(qrCode);
- if (bcData != null) {
- popFragmentStack(null);
- Timber.d("AAA");
- onUriScanned(bcData);
- return true;
- } else {
- return false;
- }
- }
-
- OnUriScannedListener onUriScannedListener = null;
-
- @Override
- public void setOnUriScannedListener(OnUriScannedListener onUriScannedListener) {
- this.onUriScannedListener = onUriScannedListener;
- }
-
- @Override
- void onUriScanned(BarcodeData barcodeData) {
- super.onUriScanned(barcodeData);
- boolean processed = false;
- if (onUriScannedListener != null) {
- processed = onUriScannedListener.onUriScanned(barcodeData);
- }
- if (!processed || (onUriScannedListener == null)) {
- Toast.makeText(this, getString(R.string.nfc_tag_read_what), Toast.LENGTH_LONG).show();
- }
- }
-
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- Timber.d("onRequestPermissionsResult()");
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- if (requestCode == Helper.PERMISSIONS_REQUEST_CAMERA) { // If request is cancelled, the result arrays are empty.
- if (grantResults.length > 0
- && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- startScanFragment = true;
- } else {
- String msg = getString(R.string.message_camera_not_permitted);
- Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
- }
- }
- }
-
- @Override
- public void onWalletReceive(View view) {
- final String address = getWallet().getAddress();
- Timber.d("startReceive()");
- Bundle b = new Bundle();
- b.putString("address", address);
- b.putString("name", getWalletName());
- replaceFragment(new ReceiveFragment(), null, b);
- Timber.d("ReceiveFragment placed");
- }
-
- @Override
- public long getTotalFunds() {
- return getWallet().getUnlockedBalance();
- }
-
- @Override
- public void onBackPressed() {
- if (drawer.isDrawerOpen(GravityCompat.START)) {
- drawer.closeDrawer(GravityCompat.START);
- return;
- }
- final Fragment fragment = getCurrentFragment();
- if (fragment instanceof OnBackPressedListener) {
- if (!((OnBackPressedListener) fragment).onBackPressed()) {
- super.onBackPressed();
- }
- } else {
- super.onBackPressed();
- }
- Helper.hideKeyboard(this);
- }
-
- @Override
- public void onFragmentDone() {
- popFragmentStack(null);
- }
-
- @Override
- public SharedPreferences getPrefs() {
- return getPreferences(Context.MODE_PRIVATE);
- }
-
- private final List accountIds = new ArrayList<>();
-
- // generate and cache unique ids for use in accounts list
- private int getAccountId(int accountIndex) {
- final int n = accountIds.size();
- for (int i = n; i <= accountIndex; i++) {
- accountIds.add(View.generateViewId());
- }
- return accountIds.get(accountIndex);
- }
-
- // drawer stuff
-
- void updateAccountsBalance() {
- final TextView tvBalance = accountsView.getHeaderView(0).findViewById(R.id.tvBalance);
- if (!isStreetMode()) {
- tvBalance.setText(getString(R.string.accounts_balance,
- Helper.getDisplayAmount(getWallet().getBalanceAll(), 5)));
- } else {
- tvBalance.setText(null);
- }
- updateAccountsList();
- }
-
- void updateAccountsHeader() {
- final Wallet wallet = getWallet();
- final TextView tvName = accountsView.getHeaderView(0).findViewById(R.id.tvName);
- tvName.setText(wallet.getName());
- }
-
- void updateAccountsList() {
- Menu menu = accountsView.getMenu();
- menu.removeGroup(R.id.accounts_list);
- final Wallet wallet = getWallet();
- if (wallet != null) {
- final int n = wallet.getNumAccounts();
- final boolean showBalances = (n > 1) && !isStreetMode();
- for (int i = 0; i < n; i++) {
- final String label = (showBalances ?
- getString(R.string.label_account, wallet.getAccountLabel(i), Helper.getDisplayAmount(wallet.getBalance(i), 2))
- : wallet.getAccountLabel(i));
- final MenuItem item = menu.add(R.id.accounts_list, getAccountId(i), 2 * i, label);
- item.setIcon(R.drawable.ic_account_balance_wallet_black_24dp);
- if (i == wallet.getAccountIndex())
- item.setChecked(true);
- }
- menu.setGroupCheckable(R.id.accounts_list, true, true);
- }
- }
-
- @Override
- public void setDrawerEnabled(boolean enabled) {
- Timber.d("setDrawerEnabled %b", enabled);
- final int lockMode = enabled ? DrawerLayout.LOCK_MODE_UNLOCKED :
- DrawerLayout.LOCK_MODE_LOCKED_CLOSED;
- drawer.setDrawerLockMode(lockMode);
- drawerToggle.setDrawerIndicatorEnabled(enabled);
- invalidateOptionsMenu(); // menu may need to be changed
- }
-
- void updateAccountName() {
- setSubtitle(getWallet().getAccountLabel());
- updateAccountsList();
- }
-
- public void onAccountRename() {
- final LayoutInflater li = LayoutInflater.from(this);
- final View promptsView = li.inflate(R.layout.prompt_rename, null);
-
- final AlertDialog.Builder alertDialogBuilder = new MaterialAlertDialogBuilder(this);
- alertDialogBuilder.setView(promptsView);
-
- final EditText etRename = promptsView.findViewById(R.id.etRename);
- final TextView tvRenameLabel = promptsView.findViewById(R.id.tvRenameLabel);
- final Wallet wallet = getWallet();
- tvRenameLabel.setText(getString(R.string.prompt_rename, wallet.getAccountLabel()));
-
- // set dialog message
- alertDialogBuilder
- .setCancelable(false)
- .setPositiveButton(getString(R.string.label_ok),
- (dialog, id) -> {
- Helper.hideKeyboardAlways(WalletActivity.this);
- String newName = etRename.getText().toString();
- wallet.setAccountLabel(newName);
- updateAccountName();
- })
- .setNegativeButton(getString(R.string.label_cancel),
- (dialog, id) -> {
- Helper.hideKeyboardAlways(WalletActivity.this);
- dialog.cancel();
- });
-
- final AlertDialog dialog = alertDialogBuilder.create();
- Helper.showKeyboard(dialog);
-
- // accept keyboard "ok"
- etRename.setOnEditorActionListener((v, actionId, event) -> {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_DONE)) {
- Helper.hideKeyboardAlways(WalletActivity.this);
- String newName = etRename.getText().toString();
- dialog.cancel();
- wallet.setAccountLabel(newName);
- updateAccountName();
- return false;
- }
- return false;
- });
-
- dialog.show();
- }
-
- public void setAccountIndex(int accountIndex) {
- getWallet().setAccountIndex(accountIndex);
- selectedSubaddressIndex = 0;
- }
-
- @Override
- public boolean onNavigationItemSelected(MenuItem item) {
- final int id = item.getItemId();
- if (id == R.id.account_new) {
- addAccount();
- } else {
- Timber.d("NavigationDrawer ID=%d", id);
- int accountIdx = accountIds.indexOf(id);
- if (accountIdx >= 0) {
- Timber.d("found @%d", accountIdx);
- setAccountIndex(accountIdx);
- }
- forceUpdate();
- drawer.closeDrawer(GravityCompat.START);
- }
- return true;
- }
-
- private int lastUsedAccount() {
- int lastUsedAccount = 0;
- for (TransactionInfo info : getWallet().getHistory().getAll()) {
- if (info.accountIndex > lastUsedAccount)
- lastUsedAccount = info.accountIndex;
- }
- return lastUsedAccount;
- }
-
- private void addAccount() {
- final Wallet wallet = getWallet();
- final int maxAccounts = lastUsedAccount() + wallet.getDeviceType().getAccountLookahead();
- if (wallet.getNumAccounts() < maxAccounts)
- new AsyncAddAccount().executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR);
- else
- Toast.makeText(this, getString(R.string.max_account_warning), Toast.LENGTH_LONG).show();
- }
-
- @SuppressLint("StaticFieldLeak")
- private class AsyncAddAccount extends AsyncTask {
- boolean dialogOpened = false;
-
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- switch (getWallet().getDeviceType()) {
- case Device_Ledger:
- showLedgerProgressDialog(LedgerProgressDialog.TYPE_ACCOUNT);
- dialogOpened = true;
- break;
- case Device_Software:
- showProgressDialog(R.string.accounts_progress_new);
- dialogOpened = true;
- break;
- default:
- throw new IllegalStateException("Hardware backing not supported. At all!");
- }
- }
-
- @Override
- protected Boolean doInBackground(Void... params) {
- if (params.length != 0) return false;
- getWallet().addAccount();
- setAccountIndex(getWallet().getNumAccounts() - 1);
- return true;
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- super.onPostExecute(result);
- forceUpdate();
- drawer.closeDrawer(GravityCompat.START);
- if (dialogOpened)
- dismissProgressDialog();
- Toast.makeText(WalletActivity.this,
- getString(R.string.accounts_new, getWallet().getNumAccounts() - 1),
- Toast.LENGTH_SHORT).show();
- }
- }
-
- // we store the index only and always retrieve a new Subaddress object
- // to ensure we get the current label
- private int selectedSubaddressIndex = 0;
-
- @Override
- public Subaddress getSelectedSubaddress() {
- return getWallet().getSubaddressObject(selectedSubaddressIndex);
- }
-
- @Override
- public void onSubaddressSelected(@Nullable final Subaddress subaddress) {
- selectedSubaddressIndex = subaddress.getAddressIndex();
- onBackPressed();
- }
-
- @Override
- public void showSubaddresses(boolean managerMode) {
- final Bundle b = new Bundle();
- if (managerMode)
- b.putString(SubaddressFragment.KEY_MODE, SubaddressFragment.MODE_MANAGER);
- replaceFragment(new SubaddressFragment(), null, b);
- }
-
- @Override
- public void showSubaddress(View view, final int subaddressIndex) {
- final Bundle b = new Bundle();
- b.putInt("subaddressIndex", subaddressIndex);
- replaceFragmentWithTransition(view, new SubaddressInfoFragment(), null, b);
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java b/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java
deleted file mode 100644
index 515d2d8..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java
+++ /dev/null
@@ -1,559 +0,0 @@
-/*
- * 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;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.ProgressBar;
-import android.widget.Spinner;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.core.content.ContextCompat;
-import androidx.fragment.app.Fragment;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.github.brnunes.swipeablerecyclerview.SwipeableRecyclerViewTouchListener;
-import com.m2049r.xmrwallet.layout.TransactionInfoAdapter;
-import com.m2049r.xmrwallet.model.TransactionInfo;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeApi;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.ServiceHelper;
-import com.m2049r.xmrwallet.util.ThemeHelper;
-import com.m2049r.xmrwallet.widget.Toolbar;
-
-import java.text.NumberFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import timber.log.Timber;
-
-public class WalletFragment extends Fragment
- implements TransactionInfoAdapter.OnInteractionListener {
- private TransactionInfoAdapter adapter;
- private final NumberFormat formatter = NumberFormat.getInstance();
-
- private TextView tvStreetView;
- private LinearLayout llBalance;
- private FrameLayout flExchange;
- private TextView tvBalance;
- private TextView tvUnconfirmedAmount;
- private TextView tvProgress;
- private ImageView ivSynced;
- private ProgressBar pbProgress;
- private Button bReceive;
- private Button bSend;
- private ImageView ivStreetGunther;
- private Drawable streetGunther = null;
- RecyclerView txlist;
-
- private Spinner sCurrency;
-
- private final List dismissedTransactions = new ArrayList<>();
-
- public void resetDismissedTransactions() {
- dismissedTransactions.clear();
- }
-
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
- }
-
- @Override
- public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
- if (activityCallback.hasWallet())
- inflater.inflate(R.menu.wallet_menu, menu);
- super.onCreateOptionsMenu(menu, inflater);
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.fragment_wallet, container, false);
-
- ivStreetGunther = view.findViewById(R.id.ivStreetGunther);
- tvStreetView = view.findViewById(R.id.tvStreetView);
- llBalance = view.findViewById(R.id.llBalance);
- flExchange = view.findViewById(R.id.flExchange);
- ((ProgressBar) view.findViewById(R.id.pbExchange)).getIndeterminateDrawable().
- setColorFilter(
- ThemeHelper.getThemedColor(getContext(), R.attr.colorPrimaryVariant),
- android.graphics.PorterDuff.Mode.MULTIPLY);
-
- tvProgress = view.findViewById(R.id.tvProgress);
- pbProgress = view.findViewById(R.id.pbProgress);
- tvBalance = view.findViewById(R.id.tvBalance);
- showBalance(Helper.getDisplayAmount(0));
- tvUnconfirmedAmount = view.findViewById(R.id.tvUnconfirmedAmount);
- showUnconfirmed(0);
- ivSynced = view.findViewById(R.id.ivSynced);
-
- sCurrency = view.findViewById(R.id.sCurrency);
- List currencies = new ArrayList<>();
- currencies.add(Helper.BASE_CRYPTO);
- if (Helper.SHOW_EXCHANGERATES)
- currencies.addAll(Arrays.asList(getResources().getStringArray(R.array.currency)));
- ArrayAdapter spinnerAdapter = new ArrayAdapter<>(requireContext(), R.layout.item_spinner_balance, currencies);
- spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- sCurrency.setAdapter(spinnerAdapter);
-
- bSend = view.findViewById(R.id.bSend);
- bReceive = view.findViewById(R.id.bReceive);
-
- txlist = view.findViewById(R.id.list);
- adapter = new TransactionInfoAdapter(getActivity(), this);
- txlist.setAdapter(adapter);
- adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
- @Override
- public void onItemRangeInserted(int positionStart, int itemCount) {
- if ((positionStart == 0) && (txlist.computeVerticalScrollOffset() == 0))
- txlist.scrollToPosition(positionStart);
- }
- });
-
- txlist.addOnItemTouchListener(
- new SwipeableRecyclerViewTouchListener(txlist,
- new SwipeableRecyclerViewTouchListener.SwipeListener() {
- @Override
- public boolean canSwipeLeft(int position) {
- return activityCallback.isStreetMode();
- }
-
- @Override
- public boolean canSwipeRight(int position) {
- return activityCallback.isStreetMode();
- }
-
- @Override
- public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] reverseSortedPositions) {
- for (int position : reverseSortedPositions) {
- dismissedTransactions.add(adapter.getItem(position).hash);
- adapter.removeItem(position);
- }
- }
-
- @Override
- public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions) {
- for (int position : reverseSortedPositions) {
- dismissedTransactions.add(adapter.getItem(position).hash);
- adapter.removeItem(position);
- }
- }
- }));
-
- bSend.setOnClickListener(v -> activityCallback.onSendRequest(v));
- bReceive.setOnClickListener(v -> activityCallback.onWalletReceive(v));
-
- 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.forceUpdate();
-
- return view;
- }
-
- @Override
- public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- }
-
- void showBalance(String balance) {
- tvBalance.setText(balance);
- final boolean streetMode = activityCallback.isStreetMode();
- if (!streetMode) {
- llBalance.setVisibility(View.VISIBLE);
- tvStreetView.setVisibility(View.INVISIBLE);
- } else {
- llBalance.setVisibility(View.INVISIBLE);
- tvStreetView.setVisibility(View.VISIBLE);
- }
- setStreetModeBackground(streetMode);
- }
-
- void showUnconfirmed(double unconfirmedAmount) {
- if (activityCallback.isStreetMode() || unconfirmedAmount == 0) {
- tvUnconfirmedAmount.setText(null);
- tvUnconfirmedAmount.setVisibility(View.GONE);
- } else {
- String unconfirmed = Helper.getFormattedAmount(unconfirmedAmount, true);
- tvUnconfirmedAmount.setText(getResources().getString(R.string.xmr_unconfirmed_amount, unconfirmed));
- tvUnconfirmedAmount.setVisibility(View.VISIBLE);
- }
- }
-
- 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 = Helper.getDecimalAmount(unlockedBalance).doubleValue();
- if (!Helper.BASE_CRYPTO.equals(balanceCurrency)) { // not XMR
- double amountB = amountA * balanceRate;
- displayB = Helper.getFormattedAmount(amountB, false);
- } else { // XMR
- displayB = Helper.getFormattedAmount(amountA, true);
- }
- showBalance(displayB);
- }
-
- String balanceCurrency = Helper.BASE_CRYPTO;
- double balanceRate = 1.0;
-
- private final ExchangeApi exchangeApi = ServiceHelper.getExchangeApi();
-
- void refreshBalance() {
- double unconfirmedXmr = Helper.getDecimalAmount(balance - unlockedBalance).doubleValue();
- showUnconfirmed(unconfirmedXmr);
- if (sCurrency.getSelectedItemPosition() == 0) { // XMR
- double amountXmr = Helper.getDecimalAmount(unlockedBalance).doubleValue();
- showBalance(Helper.getFormattedAmount(amountXmr, true));
- } else { // not XMR
- String currency = (String) sCurrency.getSelectedItem();
- Timber.d(currency);
- if (!currency.equals(balanceCurrency) || (balanceRate <= 0)) {
- showExchanging();
- exchangeApi.queryExchangeRate(Helper.BASE_CRYPTO, currency,
- new ExchangeCallback() {
- @Override
- public void onSuccess(final ExchangeRate exchangeRate) {
- if (isAdded())
- new Handler(Looper.getMainLooper()).post(() -> exchange(exchangeRate));
- }
-
- @Override
- public void onError(final Exception e) {
- Timber.e(e.getLocalizedMessage());
- if (isAdded())
- new Handler(Looper.getMainLooper()).post(() -> exchangeFailed());
- }
- });
- } else {
- updateBalance();
- }
- }
- }
-
- boolean isExchanging = false;
-
- void showExchanging() {
- isExchanging = true;
- tvBalance.setVisibility(View.GONE);
- flExchange.setVisibility(View.VISIBLE);
- sCurrency.setEnabled(false);
- }
-
- void hideExchanging() {
- isExchanging = false;
- tvBalance.setVisibility(View.VISIBLE);
- flExchange.setVisibility(View.GONE);
- sCurrency.setEnabled(true);
- }
-
- public void exchangeFailed() {
- sCurrency.setSelection(0, true); // default to XMR
- double amountXmr = Helper.getDecimalAmount(unlockedBalance).doubleValue();
- showBalance(Helper.getFormattedAmount(amountXmr, true));
- hideExchanging();
- }
-
- public void exchange(final ExchangeRate exchangeRate) {
- hideExchanging();
- if (!Helper.BASE_CRYPTO.equals(exchangeRate.getBaseCurrency())) {
- Timber.e("Not XMR");
- sCurrency.setSelection(0, true);
- balanceCurrency = Helper.BASE_CRYPTO;
- balanceRate = 1.0;
- } else {
- int spinnerPosition = ((ArrayAdapter) sCurrency.getAdapter()).getPosition(exchangeRate.getQuoteCurrency());
- if (spinnerPosition < 0) { // requested currency not in list
- Timber.e("Requested currency not in list %s", exchangeRate.getQuoteCurrency());
- sCurrency.setSelection(0, true);
- } else {
- sCurrency.setSelection(spinnerPosition, true);
- }
- balanceCurrency = exchangeRate.getQuoteCurrency();
- balanceRate = exchangeRate.getRate();
- }
- updateBalance();
- }
-
- // Callbacks from TransactionInfoAdapter
- @Override
- public void onInteraction(final View view, final TransactionInfo infoItem) {
- activityCallback.onTxDetailsRequest(view, infoItem);
- }
-
- // if account index has changed scroll to top?
- private int accountIndex = 0;
-
- public void onRefreshed(final Wallet wallet, boolean full) {
- Timber.d("onRefreshed(%b)", full);
-
- if (adapter.needsTransactionUpdateOnNewBlock()) {
- wallet.refreshHistory();
- full = true;
- }
- if (full) {
- List list = new ArrayList<>();
- final long streetHeight = activityCallback.getStreetModeHeight();
- Timber.d("StreetHeight=%d", streetHeight);
- wallet.refreshHistory();
- for (TransactionInfo info : wallet.getHistory().getAll()) {
- Timber.d("TxHeight=%d, Label=%s", info.blockheight, info.subaddressLabel);
- if ((info.isPending || (info.blockheight >= streetHeight))
- && !dismissedTransactions.contains(info.hash))
- list.add(info);
- }
- adapter.setInfos(list);
- if (accountIndex != wallet.getAccountIndex()) {
- accountIndex = wallet.getAccountIndex();
- txlist.scrollToPosition(0);
- }
- }
- updateStatus(wallet);
- }
-
- public void onSynced() {
- if (!activityCallback.isWatchOnly()) {
- bSend.setVisibility(View.VISIBLE);
- bSend.setEnabled(true);
- }
- if (isVisible()) enableAccountsList(true); //otherwise it is enabled in onResume()
- }
-
- public void unsync() {
- if (!activityCallback.isWatchOnly()) {
- bSend.setVisibility(View.INVISIBLE);
- bSend.setEnabled(false);
- }
- if (isVisible()) enableAccountsList(false); //otherwise it is enabled in onResume()
- firstBlock = 0;
- }
-
- boolean walletLoaded = false;
-
- public void onLoaded() {
- walletLoaded = true;
- showReceive();
- }
-
- private void showReceive() {
- if (walletLoaded) {
- bReceive.setVisibility(View.VISIBLE);
- bReceive.setEnabled(true);
- }
- }
-
- private String syncText = null;
-
- public void setProgress(final String text) {
- syncText = text;
- tvProgress.setText(text);
- }
-
- private int syncProgress = -1;
-
- public void setProgress(final int n) {
- syncProgress = n;
- if (n > 100) {
- pbProgress.setIndeterminate(true);
- pbProgress.setVisibility(View.VISIBLE);
- } else if (n >= 0) {
- pbProgress.setIndeterminate(false);
- pbProgress.setProgress(n);
- pbProgress.setVisibility(View.VISIBLE);
- } else { // <0
- pbProgress.setVisibility(View.INVISIBLE);
- }
- }
-
- void setActivityTitle(Wallet wallet) {
- if (wallet == null) return;
- walletTitle = wallet.getName();
- walletSubtitle = wallet.getAccountLabel();
- activityCallback.setTitle(walletTitle, walletSubtitle);
- Timber.d("wallet title is %s", walletTitle);
- }
-
- private long firstBlock = 0;
- private String walletTitle = null;
- private String walletSubtitle = null;
- private long unlockedBalance = 0;
- private long balance = 0;
-
- private int accountIdx = -1;
-
- private void updateStatus(Wallet wallet) {
- if (!isAdded()) return;
- Timber.d("updateStatus()");
- if ((walletTitle == null) || (accountIdx != wallet.getAccountIndex())) {
- accountIdx = wallet.getAccountIndex();
- setActivityTitle(wallet);
- }
- balance = wallet.getBalance();
- unlockedBalance = wallet.getUnlockedBalance();
- refreshBalance();
- String sync;
- if (!activityCallback.hasBoundService())
- throw new IllegalStateException("WalletService not bound.");
- Wallet.ConnectionStatus daemonConnected = activityCallback.getConnectionStatus();
- if (daemonConnected == Wallet.ConnectionStatus.ConnectionStatus_Connected) {
- if (!wallet.isSynchronized()) {
- long daemonHeight = activityCallback.getDaemonHeight();
- long walletHeight = wallet.getBlockChainHeight();
- long n = daemonHeight - walletHeight;
- sync = getString(R.string.status_syncing) + " " + formatter.format(n) + " " + getString(R.string.status_remaining);
- if (firstBlock == 0) {
- firstBlock = walletHeight;
- }
- int x = 100 - Math.round(100f * n / (1f * daemonHeight - firstBlock));
- if (x == 0) x = 101; // indeterminate
- setProgress(x);
- ivSynced.setVisibility(View.GONE);
- } else {
- sync = getString(R.string.status_synced) + " " + formatter.format(wallet.getBlockChainHeight());
- ivSynced.setVisibility(View.VISIBLE);
- }
- } else {
- sync = getString(R.string.status_wallet_connecting);
- setProgress(101);
- }
- setProgress(sync);
- // TODO show connected status somewhere
- }
-
- Listener activityCallback;
-
- // Container Activity must implement this interface
- public interface Listener {
- boolean hasBoundService();
-
- void forceUpdate();
-
- Wallet.ConnectionStatus getConnectionStatus();
-
- long getDaemonHeight(); //mBoundService.getDaemonHeight();
-
- void onSendRequest(View view);
-
- void onTxDetailsRequest(View view, TransactionInfo info);
-
- boolean isSynced();
-
- boolean isStreetMode();
-
- long getStreetModeHeight();
-
- boolean isWatchOnly();
-
- String getTxKey(String txId);
-
- void onWalletReceive(View view);
-
- boolean hasWallet();
-
- Wallet getWallet();
-
- void setToolbarButton(int type);
-
- void setTitle(String title, String subtitle);
-
- void setSubtitle(String subtitle);
- }
-
- @Override
- public void onAttach(@NonNull Context context) {
- super.onAttach(context);
- if (context instanceof Listener) {
- this.activityCallback = (Listener) context;
- } else {
- throw new ClassCastException(context.toString()
- + " must implement Listener");
- }
- }
-
- @Override
- public void onResume() {
- super.onResume();
- Timber.d("onResume()");
- activityCallback.setTitle(walletTitle, walletSubtitle);
- activityCallback.setToolbarButton(Toolbar.BUTTON_NONE);
- setProgress(syncProgress);
- setProgress(syncText);
- showReceive();
- if (activityCallback.isSynced()) enableAccountsList(true);
- }
-
- @Override
- public void onPause() {
- enableAccountsList(false);
- super.onPause();
- }
-
- public interface DrawerLocker {
- void setDrawerEnabled(boolean enabled);
- }
-
- private void enableAccountsList(boolean enable) {
- if (activityCallback instanceof DrawerLocker) {
- ((DrawerLocker) activityCallback).setDrawerEnabled(enable);
- }
- }
-
- public void setStreetModeBackground(boolean enable) {
- //TODO figure out why gunther disappears on return from send although he is still set
- if (enable) {
- if (streetGunther == null)
- streetGunther = ContextCompat.getDrawable(requireContext(), R.drawable.ic_gunther_streetmode);
- ivStreetGunther.setImageDrawable(streetGunther);
- } else
- ivStreetGunther.setImageDrawable(null);
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java b/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java
deleted file mode 100644
index 3762fb1..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2017 m2049r et al.
- *
- * 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;
-
-import android.app.Application;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.os.Build;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.FragmentManager;
-
-import com.m2049r.xmrwallet.model.NetworkType;
-import com.m2049r.xmrwallet.util.LocaleHelper;
-import com.m2049r.xmrwallet.util.NetCipherHelper;
-import com.m2049r.xmrwallet.util.NightmodeHelper;
-
-import timber.log.Timber;
-
-public class XmrWalletApplication extends Application {
-
- @Override
- public void onCreate() {
- super.onCreate();
- FragmentManager.enableNewStateManager(false);
- if (BuildConfig.DEBUG) {
- Timber.plant(new Timber.DebugTree());
- }
-
- NightmodeHelper.setPreferredNightmode(this);
-
- NetCipherHelper.createInstance(this);
- }
-
- @Override
- protected void attachBaseContext(Context context) {
- super.attachBaseContext(LocaleHelper.setPreferredLocale(context));
- }
-
- @Override
- public void onConfigurationChanged(@NonNull Configuration configuration) {
- super.onConfigurationChanged(configuration);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- LocaleHelper.updateSystemDefaultLocale(configuration.getLocales().get(0));
- } else {
- LocaleHelper.updateSystemDefaultLocale(configuration.locale);
- }
- LocaleHelper.setPreferredLocale(this);
- }
-
- static public NetworkType getNetworkType() {
- switch (BuildConfig.FLAVOR_net) {
- case "mainnet":
- return NetworkType.NetworkType_Mainnet;
- case "stagenet":
- return NetworkType.NetworkType_Stagenet;
- case "devnet": // flavors cannot start with "test"
- return NetworkType.NetworkType_Testnet;
- default:
- throw new IllegalStateException("unknown net flavor " + BuildConfig.FLAVOR_net);
- }
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/Crypto.java b/app/src/main/java/com/m2049r/xmrwallet/data/Crypto.java
index e9e66f1..45b49e6 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/data/Crypto.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/data/Crypto.java
@@ -14,18 +14,18 @@ import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public enum Crypto {
- XMR("XMR", true, "monero:tx_amount:recipient_name:tx_description", R.id.ibXMR, R.drawable.ic_monero, R.drawable.ic_monero_bw, Wallet::isAddressValid),
- BTC("BTC", true, "bitcoin:amount:label:message", R.id.ibBTC, R.drawable.ic_xmrto_btc, R.drawable.ic_xmrto_btc_off, address -> {
+ XMR("XMR", true, "monero:tx_amount:recipient_name:tx_description", 0, R.drawable.ic_monero, R.drawable.ic_monero_bw, Wallet::isAddressValid),
+ BTC("BTC", true, "bitcoin:amount:label:message", 0, R.drawable.ic_xmrto_btc, R.drawable.ic_xmrto_btc_off, address -> {
return BitcoinAddressValidator.validate(address, BitcoinAddressType.BTC);
}),
- DASH("DASH", true, "dash:amount:label:message", R.id.ibDASH, R.drawable.ic_xmrto_dash, R.drawable.ic_xmrto_dash_off, address -> {
+ DASH("DASH", true, "dash:amount:label:message", 0, R.drawable.ic_xmrto_dash, R.drawable.ic_xmrto_dash_off, address -> {
return BitcoinAddressValidator.validate(address, BitcoinAddressType.DASH);
}),
- DOGE("DOGE", true, "dogecoin:amount:label:message", R.id.ibDOGE, R.drawable.ic_xmrto_doge, R.drawable.ic_xmrto_doge_off, address -> {
+ DOGE("DOGE", true, "dogecoin:amount:label:message", 0, R.drawable.ic_xmrto_doge, R.drawable.ic_xmrto_doge_off, address -> {
return BitcoinAddressValidator.validate(address, BitcoinAddressType.DOGE);
}),
- ETH("ETH", false, "ethereum:amount:label:message", R.id.ibETH, R.drawable.ic_xmrto_eth, R.drawable.ic_xmrto_eth_off, EthAddressValidator::validate),
- LTC("LTC", true, "litecoin:amount:label:message", R.id.ibLTC, R.drawable.ic_xmrto_ltc, R.drawable.ic_xmrto_ltc_off, address -> {
+ ETH("ETH", false, "ethereum:amount:label:message", 0, R.drawable.ic_xmrto_eth, R.drawable.ic_xmrto_eth_off, EthAddressValidator::validate),
+ LTC("LTC", true, "litecoin:amount:label:message", 0, R.drawable.ic_xmrto_ltc, R.drawable.ic_xmrto_ltc_off, address -> {
return BitcoinAddressValidator.validate(address, BitcoinAddressType.LTC);
});
diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/UserNotes.java b/app/src/main/java/com/m2049r/xmrwallet/data/UserNotes.java
index f5eb14b..646af50 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/data/UserNotes.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/data/UserNotes.java
@@ -16,9 +16,6 @@
package com.m2049r.xmrwallet.data;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.CreateOrder;
-import com.m2049r.xmrwallet.util.Helper;
-
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -59,22 +56,6 @@ public class UserNotes {
txNotes = buildTxNote();
}
- public void setXmrtoOrder(CreateOrder order) {
- if (order != null) {
- xmrtoTag = order.TAG;
- xmrtoKey = order.getOrderId();
- xmrtoAmount = Helper.getDisplayAmount(order.getBtcAmount());
- xmrtoCurrency = order.getBtcCurrency();
- xmrtoDestination = order.getBtcAddress();
- } else {
- xmrtoTag = null;
- xmrtoKey = null;
- xmrtoAmount = null;
- xmrtoDestination = null;
- }
- txNotes = buildTxNote();
- }
-
private String buildTxNote() {
StringBuilder sb = new StringBuilder();
if (xmrtoKey != null) {
diff --git a/app/src/main/java/com/m2049r/xmrwallet/dialog/AboutFragment.java b/app/src/main/java/com/m2049r/xmrwallet/dialog/AboutFragment.java
deleted file mode 100644
index dc1047e..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/dialog/AboutFragment.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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.dialog;
-
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import androidx.fragment.app.DialogFragment;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-import android.text.Html;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.TextView;
-
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.m2049r.xmrwallet.BuildConfig;
-import com.m2049r.xmrwallet.R;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.nio.charset.StandardCharsets;
-
-import timber.log.Timber;
-
-public class AboutFragment extends DialogFragment {
- static final String TAG = "AboutFragment";
-
- public static AboutFragment newInstance() {
- return new AboutFragment();
- }
-
- public static void display(FragmentManager fm) {
- FragmentTransaction ft = fm.beginTransaction();
- Fragment prev = fm.findFragmentByTag(TAG);
- if (prev != null) {
- ft.remove(prev);
- }
-
- AboutFragment.newInstance().show(ft, TAG);
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_about, null);
- ((TextView) view.findViewById(R.id.tvHelp)).setText(Html.fromHtml(getLicencesHtml()));
- ((TextView) view.findViewById(R.id.tvVersion)).setText(getString(R.string.about_version, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE));
-
- MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getActivity())
- .setView(view)
- .setNegativeButton(R.string.about_close,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int id) {
- dialog.dismiss();
- }
- });
- return builder.create();
- }
-
- private String getLicencesHtml() {
- try (BufferedReader reader = new BufferedReader(
- new InputStreamReader(getContext().getAssets().open("licenses.html"), StandardCharsets.UTF_8))) {
- StringBuilder sb = new StringBuilder();
- String line;
- while ((line = reader.readLine()) != null)
- sb.append(line);
- return sb.toString();
- } catch (IOException ex) {
- Timber.e(ex);
- return ex.getLocalizedMessage();
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/dialog/CreditsFragment.java b/app/src/main/java/com/m2049r/xmrwallet/dialog/CreditsFragment.java
deleted file mode 100644
index d33921e..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/dialog/CreditsFragment.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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.dialog;
-
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.text.Html;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.TextView;
-
-import androidx.fragment.app.DialogFragment;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.m2049r.xmrwallet.R;
-
-public class CreditsFragment extends DialogFragment {
- static final String TAG = "DonationFragment";
-
- public static CreditsFragment newInstance() {
- return new CreditsFragment();
- }
-
- public static void display(FragmentManager fm) {
- FragmentTransaction ft = fm.beginTransaction();
- Fragment prev = fm.findFragmentByTag(TAG);
- if (prev != null) {
- ft.remove(prev);
- }
-
- CreditsFragment.newInstance().show(ft, TAG);
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_credits, null);
-
- ((TextView) view.findViewById(R.id.tvCredits)).setText(Html.fromHtml(getString(R.string.credits_text)));
-
- MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getActivity())
- .setView(view)
- .setNegativeButton(R.string.about_close,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int id) {
- dialog.dismiss();
- }
- });
- return builder.create();
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/dialog/HelpFragment.java b/app/src/main/java/com/m2049r/xmrwallet/dialog/HelpFragment.java
deleted file mode 100644
index 6928937..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/dialog/HelpFragment.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * 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.dialog;
-
-import android.app.Dialog;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.os.Bundle;
-import android.text.Html;
-import android.text.Spanned;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.core.content.ContextCompat;
-import androidx.fragment.app.DialogFragment;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.util.NetCipherHelper;
-
-public class HelpFragment extends DialogFragment {
- static final String TAG = "HelpFragment";
- private static final String HELP_ID = "HELP_ID";
- private static final String TOR_BUTTON = "TOR";
-
- public static HelpFragment newInstance(int helpResourceId) {
- HelpFragment fragment = new HelpFragment();
- Bundle bundle = new Bundle();
- bundle.putInt(HELP_ID, helpResourceId);
- // a hack for the tor button
- if (helpResourceId == R.string.help_tor)
- bundle.putInt(TOR_BUTTON, 7);
- fragment.setArguments(bundle);
- return fragment;
- }
-
- public static void display(FragmentManager fm, int helpResourceId) {
- FragmentTransaction ft = fm.beginTransaction();
- Fragment prev = fm.findFragmentByTag(TAG);
- if (prev != null) {
- ft.remove(prev);
- }
-
- HelpFragment.newInstance(helpResourceId).show(ft, TAG);
- }
-
- private Spanned getHtml(String html, double textSize) {
- final Html.ImageGetter imageGetter = source -> {
- final int imageId = getResources().getIdentifier(source.replace("/", ""), "drawable", requireActivity().getPackageName());
- // Don't die if we don't find the image - use a heart instead
- final Drawable drawable = ContextCompat.getDrawable(requireActivity(), imageId > 0 ? imageId : R.drawable.ic_favorite_24dp);
- final double f = textSize / drawable.getIntrinsicHeight();
- drawable.setBounds(0, 0, (int) (f * drawable.getIntrinsicWidth()), (int) textSize);
- return drawable;
- };
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY, imageGetter, null);
- } else {
- return Html.fromHtml(html, imageGetter, null);
- }
- }
-
- @NonNull
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_help, null);
-
- int helpId = 0;
- boolean torButton = false;
- Bundle arguments = getArguments();
- if (arguments != null) {
- helpId = arguments.getInt(HELP_ID);
- torButton = arguments.getInt(TOR_BUTTON) > 0;
- }
- final TextView helpTv = view.findViewById(R.id.tvHelp);
- if (helpId > 0)
- helpTv.setText(getHtml(getString(helpId), helpTv.getTextSize()));
-
- MaterialAlertDialogBuilder builder =
- new MaterialAlertDialogBuilder(requireActivity())
- .setView(view);
- if (torButton) {
- builder.setNegativeButton(R.string.help_nok,
- (dialog, id) -> dialog.dismiss())
- .setPositiveButton(R.string.help_getorbot,
- (dialog, id) -> {
- dialog.dismiss();
- NetCipherHelper.getInstance().installOrbot(requireActivity());
- });
- } else {
- builder.setNegativeButton(R.string.help_ok,
- (dialog, id) -> dialog.dismiss());
- }
- return builder.create();
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/dialog/PrivacyFragment.java b/app/src/main/java/com/m2049r/xmrwallet/dialog/PrivacyFragment.java
deleted file mode 100644
index 6ddb2e4..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/dialog/PrivacyFragment.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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.dialog;
-
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.text.Html;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.TextView;
-
-import androidx.fragment.app.DialogFragment;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.m2049r.xmrwallet.R;
-
-public class PrivacyFragment extends DialogFragment {
- static final String TAG = "PrivacyFragment";
-
- public static PrivacyFragment newInstance() {
- return new PrivacyFragment();
- }
-
- public static void display(FragmentManager fm) {
- FragmentTransaction ft = fm.beginTransaction();
- Fragment prev = fm.findFragmentByTag(TAG);
- if (prev != null) {
- ft.remove(prev);
- }
-
- PrivacyFragment.newInstance().show(ft, TAG);
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_privacy_policy, null);
-
- ((TextView) view.findViewById(R.id.tvCredits)).setText(Html.fromHtml(getString(R.string.privacy_policy)));
-
- MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getActivity())
- .setView(view)
- .setNegativeButton(R.string.about_close,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int id) {
- dialog.dismiss();
- }
- });
- return builder.create();
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/dialog/ProgressDialog.java b/app/src/main/java/com/m2049r/xmrwallet/dialog/ProgressDialog.java
deleted file mode 100644
index a8bb780..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/dialog/ProgressDialog.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package com.m2049r.xmrwallet.dialog;
-
-/*
- * Copyright (C) 2007 The Android Open Source Project
- * Copyright (C) 2018 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.
- */
-
-import android.content.Context;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import androidx.appcompat.app.AlertDialog;
-
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.util.Helper;
-
-import java.util.Locale;
-
-import timber.log.Timber;
-
-public class ProgressDialog extends AlertDialog {
-
- private ProgressBar pbBar;
-
- private TextView tvMessage;
-
- private TextView tvProgress;
-
- private View rlProgressBar, pbCircle;
-
- static private final String PROGRESS_FORMAT = "%1d/%2d";
-
- private CharSequence message;
- private int maxValue, progressValue;
- private boolean indeterminate = true;
-
- public ProgressDialog(Context context) {
- super(context);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- final View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_ledger_progress, null);
- pbCircle = view.findViewById(R.id.pbCircle);
- tvMessage = view.findViewById(R.id.tvMessage);
- rlProgressBar = view.findViewById(R.id.rlProgressBar);
- pbBar = view.findViewById(R.id.pbBar);
- tvProgress = view.findViewById(R.id.tvProgress);
- setView(view);
- setIndeterminate(indeterminate);
- if (maxValue > 0) {
- setMax(maxValue);
- }
- if (progressValue > 0) {
- setProgress(progressValue);
- }
- if (message != null) {
- Timber.d("msg=%s", message);
- setMessage(message);
- }
-
- super.onCreate(savedInstanceState);
-
- if (Helper.preventScreenshot()) {
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
- }
- }
-
- public void setProgress(int value, int max) {
- progressValue = value;
- maxValue = max;
- if (pbBar != null) {
- pbBar.setProgress(value);
- pbBar.setMax(max);
- tvProgress.setText(String.format(Locale.getDefault(), PROGRESS_FORMAT, value, maxValue));
- }
- }
-
- public void setProgress(int value) {
- progressValue = value;
- if (pbBar != null) {
- pbBar.setProgress(value);
- tvProgress.setText(String.format(Locale.getDefault(), PROGRESS_FORMAT, value, maxValue));
- }
- }
-
- public void setMax(int max) {
- maxValue = max;
- if (pbBar != null) {
- pbBar.setMax(max);
- }
- }
-
- public void setIndeterminate(boolean indeterminate) {
- if (this.indeterminate != indeterminate) {
- if (rlProgressBar != null) {
- if (indeterminate) {
- pbCircle.setVisibility(View.VISIBLE);
- rlProgressBar.setVisibility(View.GONE);
- } else {
- pbCircle.setVisibility(View.GONE);
- rlProgressBar.setVisibility(View.VISIBLE);
- }
- }
- this.indeterminate = indeterminate;
- }
- }
-
- @Override
- public void setMessage(CharSequence message) {
- this.message = message;
- if (tvMessage != null) {
- tvMessage.setText(message);
- }
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeFragment.java
new file mode 100644
index 0000000..71cb2f3
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeFragment.java
@@ -0,0 +1,118 @@
+package com.m2049r.xmrwallet.fragment.home;
+
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.lifecycle.Observer;
+import androidx.lifecycle.ViewModelProvider;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.navigation.NavController;
+import androidx.navigation.fragment.NavHostFragment;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+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.MainActivity;
+import com.m2049r.xmrwallet.R;
+import com.m2049r.xmrwallet.data.BarcodeData;
+import com.m2049r.xmrwallet.data.Crypto;
+import com.m2049r.xmrwallet.model.Wallet;
+import com.m2049r.xmrwallet.service.TxService;
+import com.m2049r.xmrwallet.util.Helper;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import timber.log.Timber;
+
+public class HomeFragment extends Fragment {
+
+ private HomeViewModel mViewModel;
+
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.fragment_home, container, false);
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ mViewModel = new ViewModelProvider(this).get(HomeViewModel.class);
+ MainActivity mainActivity = (MainActivity) getActivity();
+ if(mainActivity == null) return;
+
+ ImageView settingsImageView = view.findViewById(R.id.settings_imageview);
+ ImageView addressImageView = view.findViewById(R.id.monero_qr_imageview);
+ TextView addressTextView = view.findViewById(R.id.address_textview);
+ TextView balanceTextView = view.findViewById(R.id.balance_textview);
+ EditText addressEditText = view.findViewById(R.id.address_edittext);
+ EditText amountEditText = view.findViewById(R.id.amount_edittext);
+ Button sendButton = view.findViewById(R.id.send_button);
+
+ mainActivity.address.observe(getViewLifecycleOwner(), addr -> {
+ if(!addr.isEmpty()) {
+ addressTextView.setText(addr);
+ addressImageView.setImageBitmap(mViewModel.generate(addr, 256, 256));
+ }
+ });
+
+ mainActivity.balance.observe(getViewLifecycleOwner(), balance -> {
+ balanceTextView.setText(getString(R.string.wallet_balance_text, Wallet.getDisplayAmount(balance)));
+ });
+
+ TxService.getInstance().clearSendEvent.observe(getViewLifecycleOwner(), o -> {
+ addressEditText.setText(null);
+ amountEditText.setText(null);
+ sendButton.setEnabled(true);
+ });
+
+ settingsImageView.setOnClickListener(view12 -> {
+ navigate(R.id.settings_fragment);
+ });
+
+ sendButton.setOnClickListener(view1 -> {
+ String address = addressEditText.getText().toString().trim();
+ String amount = amountEditText.getText().toString().trim();
+ boolean validAddress = Wallet.isAddressValid(address);
+ if(validAddress && !amount.isEmpty()) {
+ sendButton.setEnabled(false);
+ TxService.getInstance().sendTx(address, amount);
+ } else if(!validAddress) {
+ Toast.makeText(getActivity(), getString(R.string.send_address_invalid), Toast.LENGTH_SHORT).show();
+ } else if(amount.isEmpty()) {
+ Toast.makeText(getActivity(), getString(R.string.send_amount_empty), Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+
+ private void navigate(int destination) {
+ FragmentActivity activity = getActivity();
+ if(activity != null) {
+ FragmentManager fm = activity.getSupportFragmentManager();
+ NavHostFragment navHostFragment =
+ (NavHostFragment) fm.findFragmentById(R.id.nav_host_fragment);
+ if(navHostFragment != null) {
+ navHostFragment.getNavController().navigate(destination);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeViewModel.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeViewModel.java
new file mode 100644
index 0000000..214fb22
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeViewModel.java
@@ -0,0 +1,41 @@
+package com.m2049r.xmrwallet.fragment.home;
+
+import android.graphics.Bitmap;
+
+import androidx.lifecycle.ViewModel;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+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 java.util.HashMap;
+import java.util.Map;
+
+import timber.log.Timber;
+
+public class HomeViewModel extends ViewModel {
+ public Bitmap generate(String text, int width, int height) {
+ if ((width <= 0) || (height <= 0)) return null;
+ Map hints = new HashMap<>();
+ hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
+ hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
+ try {
+ BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);
+ int[] pixels = new int[width * height];
+ for (int i = 0; i < height; i++) {
+ for (int j = 0; j < width; j++) {
+ if (bitMatrix.get(j, i)) {
+ pixels[i * width + j] = 0x00000000;
+ } else {
+ pixels[i * height + j] = 0xffffffff;
+ }
+ }
+ }
+ return Bitmap.createBitmap(pixels, 0, width, width, height, Bitmap.Config.RGB_565);
+ } catch (WriterException ex) {
+ Timber.e(ex);
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAddressWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAddressWizardFragment.java
deleted file mode 100644
index f25ad19..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAddressWizardFragment.java
+++ /dev/null
@@ -1,525 +0,0 @@
-/*
- * 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.fragment.send;
-
-import android.content.Context;
-import android.nfc.NfcManager;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.Html;
-import android.text.InputType;
-import android.text.Spanned;
-import android.text.TextWatcher;
-import android.util.Patterns;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.inputmethod.EditorInfo;
-import android.widget.EditText;
-import android.widget.ImageButton;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import androidx.annotation.NonNull;
-
-import com.google.android.material.textfield.TextInputLayout;
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.data.BarcodeData;
-import com.m2049r.xmrwallet.data.Crypto;
-import com.m2049r.xmrwallet.data.TxData;
-import com.m2049r.xmrwallet.data.TxDataBtc;
-import com.m2049r.xmrwallet.data.UserNotes;
-import com.m2049r.xmrwallet.model.PendingTransaction;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.OpenAliasHelper;
-import com.m2049r.xmrwallet.util.ServiceHelper;
-import com.m2049r.xmrwallet.util.validator.BitcoinAddressType;
-import com.m2049r.xmrwallet.util.validator.BitcoinAddressValidator;
-import com.m2049r.xmrwallet.util.validator.EthAddressValidator;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import timber.log.Timber;
-
-public class SendAddressWizardFragment extends SendWizardFragment {
-
- static final int INTEGRATED_ADDRESS_LENGTH = 106;
-
- public static SendAddressWizardFragment newInstance(Listener listener) {
- SendAddressWizardFragment instance = new SendAddressWizardFragment();
- instance.setSendListener(listener);
- return instance;
- }
-
- Listener sendListener;
-
- public void setSendListener(Listener listener) {
- this.sendListener = listener;
- }
-
- public interface Listener {
- void setBarcodeData(BarcodeData data);
-
- BarcodeData getBarcodeData();
-
- BarcodeData popBarcodeData();
-
- void setMode(SendFragment.Mode mode);
-
- TxData getTxData();
- }
-
- private EditText etDummy;
- private TextInputLayout etAddress;
- private TextInputLayout etNotes;
- private TextView tvXmrTo;
- private TextView tvTor;
- private Map ibCrypto;
- final private Set possibleCryptos = new HashSet<>();
- private Crypto selectedCrypto = null;
-
- private boolean resolvingOA = false;
-
- OnScanListener onScanListener;
-
- public interface OnScanListener {
- void onScan();
- }
-
- private Crypto getCryptoForButton(ImageButton button) {
- for (Map.Entry entry : ibCrypto.entrySet()) {
- if (entry.getValue() == button) return entry.getKey();
- }
- return null;
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- Timber.d("onCreateView() %s", (String.valueOf(savedInstanceState)));
-
- View view = inflater.inflate(R.layout.fragment_send_address, container, false);
-
- tvTor = view.findViewById(R.id.tvTor);
- tvXmrTo = view.findViewById(R.id.tvXmrTo);
- ibCrypto = new HashMap<>();
- for (Crypto crypto : Crypto.values()) {
- final ImageButton button = view.findViewById(crypto.getButtonId());
- if (Helper.ALLOW_SHIFT || (crypto == Crypto.XMR)) {
- ibCrypto.put(crypto, button);
- button.setOnClickListener(v -> {
- if (possibleCryptos.contains(crypto)) {
- selectedCrypto = crypto;
- updateCryptoButtons(false);
- } else {
- // show help what to do:
- if (button.getId() != R.id.ibXMR) {
- final String name = getResources().getStringArray(R.array.cryptos)[crypto.ordinal()];
- final String symbol = getCryptoForButton(button).getSymbol();
- tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto_help, name, symbol)));
- tvXmrTo.setVisibility(View.VISIBLE);
- } else {
- tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto_help_xmr)));
- tvXmrTo.setVisibility(View.VISIBLE);
- tvTor.setVisibility(View.INVISIBLE);
- }
- }
- });
- } else {
- button.setImageResource(crypto.getIconDisabledId());
- button.setImageAlpha(128);
- button.setEnabled(false);
- }
- }
- if (!Helper.ALLOW_SHIFT) {
- tvTor.setVisibility(View.VISIBLE);
- }
- updateCryptoButtons(true);
-
- etAddress = view.findViewById(R.id.etAddress);
- etAddress.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
- etAddress.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() {
- public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
- // ignore ENTER
- return ((event != null) && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER));
- }
- });
- etAddress.getEditText().setOnFocusChangeListener((v, hasFocus) -> {
- if (!hasFocus) {
- String enteredAddress = etAddress.getEditText().getText().toString().trim();
- String dnsOA = dnsFromOpenAlias(enteredAddress);
- Timber.d("OpenAlias is %s", dnsOA);
- if (dnsOA != null) {
- processOpenAlias(dnsOA);
- }
- }
- });
- etAddress.getEditText().addTextChangedListener(new TextWatcher() {
- @Override
- public void afterTextChanged(Editable editable) {
- Timber.d("AFTER: %s", editable.toString());
- etAddress.setError(null);
- possibleCryptos.clear();
- selectedCrypto = null;
- final String address = etAddress.getEditText().getText().toString();
- if (isIntegratedAddress(address)) {
- Timber.d("isIntegratedAddress");
- possibleCryptos.add(Crypto.XMR);
- selectedCrypto = Crypto.XMR;
- etAddress.setError(getString(R.string.info_paymentid_integrated));
- sendListener.setMode(SendFragment.Mode.XMR);
- } else if (isStandardAddress(address)) {
- Timber.d("isStandardAddress");
- possibleCryptos.add(Crypto.XMR);
- selectedCrypto = Crypto.XMR;
- sendListener.setMode(SendFragment.Mode.XMR);
- }
- if (!Helper.ALLOW_SHIFT) return;
- if ((selectedCrypto == null) && isEthAddress(address)) {
- Timber.d("isEthAddress");
- possibleCryptos.add(Crypto.ETH);
- selectedCrypto = Crypto.ETH;
- tvXmrTo.setVisibility(View.VISIBLE);
- sendListener.setMode(SendFragment.Mode.BTC);
- }
- if (possibleCryptos.isEmpty()) {
- Timber.d("isBitcoinAddress");
- for (BitcoinAddressType type : BitcoinAddressType.values()) {
- if (BitcoinAddressValidator.validate(address, type)) {
- possibleCryptos.add(Crypto.valueOf(type.name()));
- }
- }
- if (!possibleCryptos.isEmpty()) // found something in need of shifting!
- sendListener.setMode(SendFragment.Mode.BTC);
- if (possibleCryptos.size() == 1) {
- selectedCrypto = (Crypto) possibleCryptos.toArray()[0];
- }
- }
- if (possibleCryptos.isEmpty()) {
- Timber.d("other");
- tvXmrTo.setVisibility(View.INVISIBLE);
- sendListener.setMode(SendFragment.Mode.XMR);
- }
- updateCryptoButtons(address.isEmpty());
- }
-
- @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 ImageButton bPasteAddress = view.findViewById(R.id.bPasteAddress);
- bPasteAddress.setOnClickListener(v -> {
- final String clip = Helper.getClipBoardText(getActivity());
- if (clip == null) return;
- // clean it up
- final String address = clip.replaceAll("( +)|(\\r?\\n?)", "");
- BarcodeData bc = BarcodeData.fromString(address);
- if (bc != null) {
- processScannedData(bc);
- final EditText et = etAddress.getEditText();
- et.setSelection(et.getText().length());
- etAddress.requestFocus();
- } else {
- Toast.makeText(getActivity(), getString(R.string.send_address_invalid), Toast.LENGTH_SHORT).show();
- }
- });
-
- etNotes = view.findViewById(R.id.etNotes);
- etNotes.getEditText().setRawInputType(InputType.TYPE_CLASS_TEXT);
- etNotes.getEditText().
-
- setOnEditorActionListener((v, actionId, event) -> {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_DONE)) {
- etDummy.requestFocus();
- return true;
- }
- return false;
- });
-
- final View cvScan = view.findViewById(R.id.bScan);
- cvScan.setOnClickListener(v -> onScanListener.onScan());
-
- etDummy = view.findViewById(R.id.etDummy);
- etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
- etDummy.requestFocus();
-
- View tvNfc = view.findViewById(R.id.tvNfc);
- NfcManager manager = (NfcManager) getContext().getSystemService(Context.NFC_SERVICE);
- if ((manager != null) && (manager.getDefaultAdapter() != null))
- tvNfc.setVisibility(View.VISIBLE);
-
- return view;
- }
-
- private void selectedCrypto(Crypto crypto) {
- final ImageButton button = ibCrypto.get(crypto);
- button.setImageResource(crypto.getIconEnabledId());
- button.setImageAlpha(255);
- button.setEnabled(true);
- }
-
- private void possibleCrypto(Crypto crypto) {
- final ImageButton button = ibCrypto.get(crypto);
- button.setImageResource(crypto.getIconDisabledId());
- button.setImageAlpha(255);
- button.setEnabled(true);
- }
-
- private void impossibleCrypto(Crypto crypto) {
- final ImageButton button = ibCrypto.get(crypto);
- button.setImageResource(crypto.getIconDisabledId());
- button.setImageAlpha(128);
- button.setEnabled(true);
- }
-
- private void updateCryptoButtons(boolean noAddress) {
- if (!Helper.ALLOW_SHIFT) return;
- for (Crypto crypto : Crypto.values()) {
- if (crypto == selectedCrypto) {
- selectedCrypto(crypto);
- } else if (possibleCryptos.contains(crypto)) {
- possibleCrypto(crypto);
- } else {
- impossibleCrypto(crypto);
- }
- }
- if ((selectedCrypto != null) && (selectedCrypto != Crypto.XMR)) {
- tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto, selectedCrypto.getSymbol())));
- tvXmrTo.setVisibility(View.VISIBLE);
- } else if ((selectedCrypto == null) && (possibleCryptos.size() > 1)) {
- tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto_ambiguous)));
- tvXmrTo.setVisibility(View.VISIBLE);
- } else {
- tvXmrTo.setVisibility(View.INVISIBLE);
- }
- if (noAddress) {
- selectedCrypto(Crypto.XMR);
- }
- }
-
- private void processOpenAlias(String dnsOA) {
- if (resolvingOA) return; // already resolving - just wait
- sendListener.popBarcodeData();
- if (dnsOA != null) {
- resolvingOA = true;
- etAddress.setError(getString(R.string.send_address_resolve_openalias));
- OpenAliasHelper.resolve(dnsOA, new OpenAliasHelper.OnResolvedListener() {
- @Override
- public void onResolved(Map dataMap) {
- resolvingOA = false;
- BarcodeData barcodeData = dataMap.get(Crypto.XMR);
- if (barcodeData == null) barcodeData = dataMap.get(Crypto.BTC);
- if (barcodeData != null) {
- Timber.d("Security=%s, %s", barcodeData.security.toString(), barcodeData.address);
- processScannedData(barcodeData);
- } else {
- etAddress.setError(getString(R.string.send_address_not_openalias));
- Timber.d("NO XMR OPENALIAS TXT FOUND");
- }
- }
-
- @Override
- public void onFailure() {
- resolvingOA = false;
- etAddress.setError(getString(R.string.send_address_not_openalias));
- Timber.e("OA FAILED");
- }
- });
- } // else ignore
- }
-
- private boolean checkAddressNoError() {
- return selectedCrypto != null;
- }
-
- private boolean checkAddress() {
- boolean ok = checkAddressNoError();
- if (possibleCryptos.isEmpty()) {
- etAddress.setError(getString(R.string.send_address_invalid));
- } else {
- etAddress.setError(null);
- }
- return ok;
- }
-
- private boolean isStandardAddress(String address) {
- return Wallet.isAddressValid(address);
- }
-
- private boolean isIntegratedAddress(String address) {
- return (address.length() == INTEGRATED_ADDRESS_LENGTH)
- && Wallet.isAddressValid(address);
- }
-
- private boolean isBitcoinishAddress(String address) {
- return BitcoinAddressValidator.validate(address, BitcoinAddressType.BTC)
- ||
- BitcoinAddressValidator.validate(address, BitcoinAddressType.LTC)
- ||
- BitcoinAddressValidator.validate(address, BitcoinAddressType.DASH);
- }
-
- private boolean isEthAddress(String address) {
- return EthAddressValidator.validate(address);
- }
-
- private void shakeAddress() {
- if (possibleCryptos.size() > 1) { // address ambiguous
- for (Crypto crypto : Crypto.values()) {
- if (possibleCryptos.contains(crypto)) {
- ibCrypto.get(crypto).startAnimation(Helper.getShakeAnimation(getContext()));
- }
- }
- } else {
- etAddress.startAnimation(Helper.getShakeAnimation(getContext()));
- }
- }
-
- @Override
- public boolean onValidateFields() {
- if (!checkAddressNoError()) {
- shakeAddress();
- String enteredAddress = etAddress.getEditText().getText().toString().trim();
- String dnsOA = dnsFromOpenAlias(enteredAddress);
- Timber.d("OpenAlias is %s", dnsOA);
- if (dnsOA != null) {
- processOpenAlias(dnsOA);
- }
- return false;
- }
-
- if (sendListener != null) {
- TxData txData = sendListener.getTxData();
- if (txData instanceof TxDataBtc) {
- ((TxDataBtc) txData).setBtcAddress(etAddress.getEditText().getText().toString());
- ((TxDataBtc) txData).setBtcSymbol(selectedCrypto.getSymbol());
- txData.setDestinationAddress(null);
- ServiceHelper.ASSET = selectedCrypto.getSymbol().toLowerCase();
- } else {
- txData.setDestinationAddress(etAddress.getEditText().getText().toString());
- ServiceHelper.ASSET = null;
- }
- txData.setUserNotes(new UserNotes(etNotes.getEditText().getText().toString()));
- txData.setPriority(PendingTransaction.Priority.Priority_Default);
- txData.setMixin(SendFragment.MIXIN);
- }
- return true;
- }
-
- @Override
- public void onAttach(@NonNull Context context) {
- super.onAttach(context);
- if (context instanceof OnScanListener) {
- onScanListener = (OnScanListener) context;
- } else {
- throw new ClassCastException(context.toString()
- + " must implement ScanListener");
- }
- }
-
- // QR Scan Stuff
-
- @Override
- public void onResume() {
- super.onResume();
- Timber.d("onResume");
- processScannedData();
- }
-
- public void processScannedData(BarcodeData barcodeData) {
- sendListener.setBarcodeData(barcodeData);
- if (isResumed())
- processScannedData();
- }
-
- public void processScannedData() {
- BarcodeData barcodeData = sendListener.getBarcodeData();
- if (barcodeData != null) {
- Timber.d("GOT DATA");
- if (!Helper.ALLOW_SHIFT && (barcodeData.asset != Crypto.XMR)) {
- Timber.d("BUT ONLY XMR SUPPORTED");
- barcodeData = null;
- sendListener.setBarcodeData(barcodeData);
- return;
- }
- if (barcodeData.address != null) {
- etAddress.getEditText().setText(barcodeData.address);
- possibleCryptos.clear();
- selectedCrypto = null;
- if (barcodeData.isAmbiguous()) {
- possibleCryptos.addAll(barcodeData.ambiguousAssets);
- } else {
- possibleCryptos.add(barcodeData.asset);
- selectedCrypto = barcodeData.asset;
- }
- if (Helper.ALLOW_SHIFT)
- updateCryptoButtons(false);
- if (checkAddress()) {
- if (barcodeData.security == BarcodeData.Security.OA_NO_DNSSEC)
- etAddress.setError(getString(R.string.send_address_no_dnssec));
- else if (barcodeData.security == BarcodeData.Security.OA_DNSSEC)
- etAddress.setError(getString(R.string.send_address_openalias));
- }
- } else {
- etAddress.getEditText().getText().clear();
- etAddress.setError(null);
- }
-
- String scannedNotes = barcodeData.addressName;
- if (scannedNotes == null) {
- scannedNotes = barcodeData.description;
- } else if (barcodeData.description != null) {
- scannedNotes = scannedNotes + ": " + barcodeData.description;
- }
- if (scannedNotes != null) {
- etNotes.getEditText().setText(scannedNotes);
- } else {
- etNotes.getEditText().getText().clear();
- etNotes.setError(null);
- }
- } else
- Timber.d("barcodeData=null");
- }
-
- @Override
- public void onResumeFragment() {
- super.onResumeFragment();
- Timber.d("onResumeFragment()");
- etDummy.requestFocus();
- }
-
- String dnsFromOpenAlias(String openalias) {
- Timber.d("checking openalias candidate %s", openalias);
- if (Patterns.DOMAIN_NAME.matcher(openalias).matches()) return openalias;
- if (Patterns.EMAIL_ADDRESS.matcher(openalias).matches()) {
- openalias = openalias.replaceFirst("@", ".");
- if (Patterns.DOMAIN_NAME.matcher(openalias).matches()) return openalias;
- }
- return null; // not an openalias
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAmountWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAmountWizardFragment.java
deleted file mode 100644
index 12edaf6..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAmountWizardFragment.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * 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.fragment.send;
-
-import android.os.Bundle;
-import android.view.LayoutInflater;
-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.data.BarcodeData;
-import com.m2049r.xmrwallet.data.TxData;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.widget.ExchangeEditText;
-
-import timber.log.Timber;
-
-public class SendAmountWizardFragment extends SendWizardFragment {
-
- public static SendAmountWizardFragment newInstance(Listener listener) {
- SendAmountWizardFragment instance = new SendAmountWizardFragment();
- instance.setSendListener(listener);
- return instance;
- }
-
- Listener sendListener;
-
- public void setSendListener(Listener listener) {
- this.sendListener = listener;
- }
-
- interface Listener {
- SendFragment.Listener getActivityCallback();
-
- TxData getTxData();
-
- BarcodeData popBarcodeData();
- }
-
- private TextView tvFunds;
- private ExchangeEditText etAmount;
- private View rlSweep;
- private ImageButton ibSweep;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
-
- Timber.d("onCreateView() %s", (String.valueOf(savedInstanceState)));
-
- sendListener = (Listener) getParentFragment();
-
- View view = inflater.inflate(R.layout.fragment_send_amount, container, false);
-
- tvFunds = view.findViewById(R.id.tvFunds);
- etAmount = view.findViewById(R.id.etAmount);
- rlSweep = view.findViewById(R.id.rlSweep);
-
- view.findViewById(R.id.ivSweep).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- sweepAll(false);
- }
- });
-
- ibSweep = view.findViewById(R.id.ibSweep);
-
- ibSweep.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- sweepAll(true);
- }
- });
-
- etAmount.requestFocus();
- return view;
- }
-
- private boolean spendAllMode = false;
-
- private void sweepAll(boolean spendAllMode) {
- if (spendAllMode) {
- ibSweep.setVisibility(View.INVISIBLE);
- etAmount.setVisibility(View.GONE);
- rlSweep.setVisibility(View.VISIBLE);
- } else {
- ibSweep.setVisibility(View.VISIBLE);
- etAmount.setVisibility(View.VISIBLE);
- rlSweep.setVisibility(View.GONE);
- }
- this.spendAllMode = spendAllMode;
- }
-
- @Override
- public boolean onValidateFields() {
- if (spendAllMode) {
- if (sendListener != null) {
- sendListener.getTxData().setAmount(Wallet.SWEEP_ALL);
- }
- } else {
- if (!etAmount.validate(maxFunds, 0)) {
- return false;
- }
-
- if (sendListener != null) {
- String xmr = etAmount.getNativeAmount();
- if (xmr != null) {
- sendListener.getTxData().setAmount(Wallet.getAmountFromString(xmr));
- } else {
- sendListener.getTxData().setAmount(0L);
- }
- }
- }
- return true;
- }
-
- double maxFunds = 0;
-
- @Override
- public void onResumeFragment() {
- super.onResumeFragment();
- Timber.d("onResumeFragment()");
- Helper.showKeyboard(getActivity());
- final long funds = getTotalFunds();
- maxFunds = 1.0 * funds / Helper.ONE_XMR;
- if (!sendListener.getActivityCallback().isStreetMode()) {
- tvFunds.setText(getString(R.string.send_available,
- Wallet.getDisplayAmount(funds)));
- } else {
- tvFunds.setText(getString(R.string.send_available,
- getString(R.string.unknown_amount)));
- }
- final BarcodeData data = sendListener.popBarcodeData();
- if ((data != null) && (data.amount != null)) {
- etAmount.setAmount(data.amount);
- }
- }
-
- long getTotalFunds() {
- return sendListener.getActivityCallback().getTotalFunds();
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcAmountWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcAmountWizardFragment.java
deleted file mode 100644
index 72b2e98..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcAmountWizardFragment.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * 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.fragment.send;
-
-import android.os.Bundle;
-import android.text.Html;
-import android.text.Spanned;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.data.BarcodeData;
-import com.m2049r.xmrwallet.data.TxDataBtc;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.service.shift.ShiftCallback;
-import com.m2049r.xmrwallet.service.shift.ShiftError;
-import com.m2049r.xmrwallet.service.shift.ShiftException;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderParameters;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi;
-import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.ServiceHelper;
-import com.m2049r.xmrwallet.widget.ExchangeOtherEditText;
-import com.m2049r.xmrwallet.widget.SendProgressView;
-
-import java.text.NumberFormat;
-import java.util.Locale;
-
-import timber.log.Timber;
-
-public class SendBtcAmountWizardFragment extends SendWizardFragment {
-
- public static SendBtcAmountWizardFragment newInstance(SendAmountWizardFragment.Listener listener) {
- SendBtcAmountWizardFragment instance = new SendBtcAmountWizardFragment();
- instance.setSendListener(listener);
- return instance;
- }
-
- SendAmountWizardFragment.Listener sendListener;
-
- public SendBtcAmountWizardFragment setSendListener(SendAmountWizardFragment.Listener listener) {
- this.sendListener = listener;
- return this;
- }
-
- private TextView tvFunds;
- private ExchangeOtherEditText etAmount;
-
- private TextView tvXmrToParms;
- private SendProgressView evParams;
- private View llXmrToParms;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
-
- Timber.d("onCreateView() %s", (String.valueOf(savedInstanceState)));
-
- sendListener = (SendAmountWizardFragment.Listener) getParentFragment();
-
- View view = inflater.inflate(R.layout.fragment_send_btc_amount, container, false);
-
- tvFunds = view.findViewById(R.id.tvFunds);
-
- evParams = view.findViewById(R.id.evXmrToParms);
- llXmrToParms = view.findViewById(R.id.llXmrToParms);
-
- tvXmrToParms = view.findViewById(R.id.tvXmrToParms);
-
- etAmount = view.findViewById(R.id.etAmount);
- etAmount.requestFocus();
-
- return view;
- }
-
- @Override
- public boolean onValidateFields() {
- Timber.i(maxBtc + "/" + minBtc);
- if (!etAmount.validate(maxBtc, minBtc)) {
- return false;
- }
- if (orderParameters == null) {
- return false; // this should never happen
- }
- if (sendListener != null) {
- TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
- String btcString = etAmount.getNativeAmount();
- if (btcString != null) {
- try {
- double btc = Double.parseDouble(btcString);
- Timber.d("setBtcAmount %f", btc);
- txDataBtc.setBtcAmount(btc);
- txDataBtc.setAmount(btc / orderParameters.getPrice());
- } catch (NumberFormatException ex) {
- Timber.d(ex.getLocalizedMessage());
- txDataBtc.setBtcAmount(0);
- }
- } else {
- txDataBtc.setBtcAmount(0);
- }
- }
- return true;
- }
-
- double maxBtc = 0;
- double minBtc = 0;
-
- @Override
- public void onPauseFragment() {
- llXmrToParms.setVisibility(View.INVISIBLE);
- }
-
- @Override
- public void onResumeFragment() {
- super.onResumeFragment();
- Timber.d("onResumeFragment()");
- final String btcSymbol = ((TxDataBtc) sendListener.getTxData()).getBtcSymbol();
- if (!btcSymbol.toLowerCase().equals(ServiceHelper.ASSET))
- throw new IllegalStateException("Asset Symbol is wrong!");
- final long funds = getTotalFunds();
- if (!sendListener.getActivityCallback().isStreetMode()) {
- tvFunds.setText(getString(R.string.send_available,
- Wallet.getDisplayAmount(funds)));
- //TODO
- } else {
- tvFunds.setText(getString(R.string.send_available,
- getString(R.string.unknown_amount)));
- }
- etAmount.setAmount("");
- final BarcodeData data = sendListener.popBarcodeData();
- if (data != null) {
- if (data.amount != null) {
- etAmount.setAmount(data.amount);
- }
- }
- etAmount.setBaseCurrency(btcSymbol);
- callXmrTo();
- }
-
- long getTotalFunds() {
- return sendListener.getActivityCallback().getTotalFunds();
- }
-
- private QueryOrderParameters orderParameters = null;
-
- private void processOrderParms(final QueryOrderParameters orderParameters) {
- this.orderParameters = orderParameters;
- getView().post(() -> {
- final double price = orderParameters.getPrice();
- etAmount.setExchangeRate(1 / price);
- maxBtc = price * orderParameters.getUpperLimit();
- minBtc = price * orderParameters.getLowerLimit();
- Timber.d("minBtc=%f / maxBtc=%f", minBtc, maxBtc);
- NumberFormat df = NumberFormat.getInstance(Locale.US);
- df.setMaximumFractionDigits(6);
- String min = df.format(minBtc);
- String max = df.format(maxBtc);
- String rate = df.format(price);
- final TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
- Spanned xmrParmText = Html.fromHtml(getString(R.string.info_send_xmrto_parms,
- min, max, rate, txDataBtc.getBtcSymbol()));
- tvXmrToParms.setText(xmrParmText);
-
- final long funds = getTotalFunds();
- double availableXmr = 1.0 * funds / Helper.ONE_XMR;
-
- String availBtcString;
- String availXmrString;
- if (!sendListener.getActivityCallback().isStreetMode()) {
- availBtcString = df.format(availableXmr * price);
- availXmrString = df.format(availableXmr);
- } else {
- availBtcString = getString(R.string.unknown_amount);
- availXmrString = availBtcString;
- }
- tvFunds.setText(getString(R.string.send_available_btc,
- availXmrString,
- availBtcString,
- ((TxDataBtc) sendListener.getTxData()).getBtcSymbol()));
- llXmrToParms.setVisibility(View.VISIBLE);
- evParams.hideProgress();
- });
- }
-
- private void processOrderParmsError(final Exception ex) {
- etAmount.setExchangeRate(0);
- orderParameters = null;
- maxBtc = 0;
- minBtc = 0;
- Timber.e(ex);
- getView().post(() -> {
- if (ex instanceof ShiftException) {
- ShiftException xmrEx = (ShiftException) ex;
- ShiftError xmrErr = xmrEx.getError();
- if (xmrErr != null) {
- if (xmrErr.isRetryable()) {
- evParams.showMessage(xmrErr.getErrorType().toString(), xmrErr.getErrorMsg(),
- getString(R.string.text_retry));
- evParams.setOnClickListener(v -> {
- evParams.setOnClickListener(null);
- callXmrTo();
- });
- } else {
- evParams.showMessage(xmrErr.getErrorType().toString(), xmrErr.getErrorMsg(),
- getString(R.string.text_noretry));
- }
- } else {
- evParams.showMessage(getString(R.string.label_generic_xmrto_error),
- getString(R.string.text_generic_xmrto_error, xmrEx.getCode()),
- getString(R.string.text_noretry));
- }
- } else {
- evParams.showMessage(getString(R.string.label_generic_xmrto_error),
- ex.getLocalizedMessage(),
- getString(R.string.text_noretry));
- }
- });
- }
-
- private void callXmrTo() {
- evParams.showProgress(getString(R.string.label_send_progress_queryparms));
- getXmrToApi().queryOrderParameters(new ShiftCallback() {
- @Override
- public void onSuccess(final QueryOrderParameters orderParameters) {
- processOrderParms(orderParameters);
- }
-
- @Override
- public void onError(final Exception e) {
- processOrderParmsError(e);
- }
- });
- }
-
- private SideShiftApi xmrToApi = null;
-
- private SideShiftApi getXmrToApi() {
- if (xmrToApi == null) {
- synchronized (this) {
- if (xmrToApi == null) {
- xmrToApi = new SideShiftApiImpl(ServiceHelper.getXmrToBaseUrl());
- }
- }
- }
- return xmrToApi;
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcConfirmWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcConfirmWizardFragment.java
deleted file mode 100644
index 66a66c2..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcConfirmWizardFragment.java
+++ /dev/null
@@ -1,551 +0,0 @@
-/*
- * 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.fragment.send;
-
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.data.TxData;
-import com.m2049r.xmrwallet.data.TxDataBtc;
-import com.m2049r.xmrwallet.model.PendingTransaction;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.service.shift.ShiftCallback;
-import com.m2049r.xmrwallet.service.shift.ShiftError;
-import com.m2049r.xmrwallet.service.shift.ShiftException;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.CreateOrder;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.RequestQuote;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi;
-import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.ServiceHelper;
-import com.m2049r.xmrwallet.widget.SendProgressView;
-
-import java.text.NumberFormat;
-import java.util.Locale;
-
-import timber.log.Timber;
-
-public class SendBtcConfirmWizardFragment extends SendWizardFragment implements SendConfirm {
- public static SendBtcConfirmWizardFragment newInstance(SendConfirmWizardFragment.Listener listener) {
- SendBtcConfirmWizardFragment instance = new SendBtcConfirmWizardFragment();
- instance.setSendListener(listener);
- return instance;
- }
-
- SendConfirmWizardFragment.Listener sendListener;
-
- public void setSendListener(SendConfirmWizardFragment.Listener listener) {
- this.sendListener = listener;
- }
-
- private View llStageA;
- private SendProgressView evStageA;
- private View llStageB;
- private SendProgressView evStageB;
- private View llStageC;
- private SendProgressView evStageC;
- private TextView tvTxBtcAmount;
- private TextView tvTxBtcRate;
- private TextView tvTxBtcAddress;
- private TextView tvTxBtcAddressLabel;
- private TextView tvTxXmrToKey;
- private TextView tvTxFee;
- private TextView tvTxTotal;
- private View llConfirmSend;
- private Button bSend;
- private View pbProgressSend;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
-
- Timber.d("onCreateView(%s)", (String.valueOf(savedInstanceState)));
-
- View view = inflater.inflate(
- R.layout.fragment_send_btc_confirm, container, false);
-
- tvTxBtcAddress = view.findViewById(R.id.tvTxBtcAddress);
- tvTxBtcAddressLabel = view.findViewById(R.id.tvTxBtcAddressLabel);
- tvTxBtcAmount = view.findViewById(R.id.tvTxBtcAmount);
- tvTxBtcRate = view.findViewById(R.id.tvTxBtcRate);
- tvTxXmrToKey = view.findViewById(R.id.tvTxXmrToKey);
-
- tvTxFee = view.findViewById(R.id.tvTxFee);
- tvTxTotal = view.findViewById(R.id.tvTxTotal);
-
- llStageA = view.findViewById(R.id.llStageA);
- evStageA = view.findViewById(R.id.evStageA);
- llStageB = view.findViewById(R.id.llStageB);
- evStageB = view.findViewById(R.id.evStageB);
- llStageC = view.findViewById(R.id.llStageC);
- evStageC = view.findViewById(R.id.evStageC);
-
- tvTxXmrToKey.setOnClickListener(v -> {
- Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_xmrtokey), tvTxXmrToKey.getText().toString());
- Toast.makeText(getActivity(), getString(R.string.message_copy_xmrtokey), Toast.LENGTH_SHORT).show();
- });
-
- llConfirmSend = view.findViewById(R.id.llConfirmSend);
- pbProgressSend = view.findViewById(R.id.pbProgressSend);
-
- bSend = view.findViewById(R.id.bSend);
- bSend.setEnabled(false);
-
- bSend.setOnClickListener(v -> {
- Timber.d("bSend.setOnClickListener");
- bSend.setEnabled(false);
- preSend();
- });
-
- return view;
- }
-
- int inProgress = 0;
- final static int STAGE_X = 0;
- final static int STAGE_A = 1;
- final static int STAGE_B = 2;
- final static int STAGE_C = 3;
-
- private void showProgress(int stage, String progressText) {
- Timber.d("showProgress(%d)", stage);
- inProgress = stage;
- switch (stage) {
- case STAGE_A:
- evStageA.showProgress(progressText);
- break;
- case STAGE_B:
- evStageB.showProgress(progressText);
- break;
- case STAGE_C:
- evStageC.showProgress(progressText);
- break;
- default:
- throw new IllegalStateException("unknown stage " + stage);
- }
- }
-
- public void hideProgress() {
- Timber.d("hideProgress(%d)", inProgress);
- switch (inProgress) {
- case STAGE_A:
- evStageA.hideProgress();
- llStageA.setVisibility(View.VISIBLE);
- break;
- case STAGE_B:
- evStageB.hideProgress();
- llStageB.setVisibility(View.VISIBLE);
- break;
- case STAGE_C:
- evStageC.hideProgress();
- llStageC.setVisibility(View.VISIBLE);
- break;
- default:
- throw new IllegalStateException("unknown stage " + inProgress);
- }
- inProgress = STAGE_X;
- }
-
- public void showStageError(String code, String message, String solution) {
- switch (inProgress) {
- case STAGE_A:
- evStageA.showMessage(code, message, solution);
- break;
- case STAGE_B:
- evStageB.showMessage(code, message, solution);
- break;
- case STAGE_C:
- evStageC.showMessage(code, message, solution);
- break;
- default:
- throw new IllegalStateException("unknown stage");
- }
- inProgress = STAGE_X;
- }
-
- PendingTransaction pendingTransaction = null;
-
- void send() {
- Timber.d("SEND @%d", sendCountdown);
- if (sendCountdown <= 0) {
- Timber.i("User waited too long in password dialog.");
- Toast.makeText(getContext(), getString(R.string.send_xmrto_timeout), Toast.LENGTH_SHORT).show();
- return;
- }
- sendListener.getTxData().getUserNotes().setXmrtoOrder(xmrtoOrder); // note the transaction in the TX notes
- ((TxDataBtc) sendListener.getTxData()).setXmrtoOrderId(xmrtoOrder.getOrderId()); // remember the order id for later
- // TODO make method in TxDataBtc to set both of the above in one go
- sendListener.commitTransaction();
- getActivity().runOnUiThread(() -> pbProgressSend.setVisibility(View.VISIBLE));
- }
-
- @Override
- public void sendFailed(String error) {
- pbProgressSend.setVisibility(View.INVISIBLE);
- Toast.makeText(getContext(), getString(R.string.status_transaction_failed, error), Toast.LENGTH_LONG).show();
- }
-
- @Override
- // callback from wallet when PendingTransaction created (started by prepareSend() here
- public void transactionCreated(final String txTag, final PendingTransaction pendingTransaction) {
- if (isResumed
- && (inProgress == STAGE_C)
- && (xmrtoOrder != null)
- && (xmrtoOrder.getOrderId().equals(txTag))) {
- this.pendingTransaction = pendingTransaction;
- getView().post(() -> {
- hideProgress();
- tvTxFee.setText(Wallet.getDisplayAmount(pendingTransaction.getFee()));
- tvTxTotal.setText(Wallet.getDisplayAmount(
- pendingTransaction.getFee() + pendingTransaction.getAmount()));
- updateSendButton();
- });
- } else {
- this.pendingTransaction = null;
- sendListener.disposeTransaction();
- }
- }
-
- @Override
- public void createTransactionFailed(String errorText) {
- Timber.e("CREATE TX FAILED");
- if (pendingTransaction != null) {
- throw new IllegalStateException("pendingTransaction is not null");
- }
- showStageError(getString(R.string.send_create_tx_error_title),
- errorText,
- getString(R.string.text_noretry_monero));
- }
-
- @Override
- public boolean onValidateFields() {
- return true;
- }
-
- private boolean isResumed = false;
-
- @Override
- public void onPauseFragment() {
- isResumed = false;
- stopSendTimer();
- sendListener.disposeTransaction();
- pendingTransaction = null;
- inProgress = STAGE_X;
- updateSendButton();
- super.onPauseFragment();
- }
-
- @Override
- public void onResumeFragment() {
- super.onResumeFragment();
- Timber.d("onResumeFragment()");
- if (sendListener.getMode() != SendFragment.Mode.BTC) {
- throw new IllegalStateException("Mode is not BTC!");
- }
- if (!((TxDataBtc) sendListener.getTxData()).getBtcSymbol().toLowerCase().equals(ServiceHelper.ASSET))
- throw new IllegalStateException("Asset Symbol is wrong!");
- Helper.hideKeyboard(getActivity());
- llStageA.setVisibility(View.INVISIBLE);
- evStageA.hideProgress();
- llStageB.setVisibility(View.INVISIBLE);
- evStageB.hideProgress();
- llStageC.setVisibility(View.INVISIBLE);
- evStageC.hideProgress();
- isResumed = true;
- if ((pendingTransaction == null) && (inProgress == STAGE_X)) {
- stageA();
- } // otherwise just sit there blank
- // TODO: don't sit there blank - can this happen? should we just die?
- }
-
- private int sendCountdown = 0;
- private static final int XMRTO_COUNTDOWN_STEP = 1; // 1 second
-
- Runnable updateRunnable = null;
-
- void startSendTimer(int timeout) {
- Timber.d("startSendTimer()");
- sendCountdown = timeout;
- updateRunnable = new Runnable() {
- @Override
- public void run() {
- if (!isAdded())
- return;
- Timber.d("updateTimer()");
- if (sendCountdown <= 0) {
- bSend.setEnabled(false);
- sendCountdown = 0;
- Toast.makeText(getContext(), getString(R.string.send_xmrto_timeout), Toast.LENGTH_SHORT).show();
- }
- int minutes = sendCountdown / 60;
- int seconds = sendCountdown % 60;
- String t = String.format("%d:%02d", minutes, seconds);
- bSend.setText(getString(R.string.send_send_timed_label, t));
- if (sendCountdown > 0) {
- sendCountdown -= XMRTO_COUNTDOWN_STEP;
- getView().postDelayed(this, XMRTO_COUNTDOWN_STEP * 1000);
- }
- }
- };
- getView().post(updateRunnable);
- }
-
- void stopSendTimer() {
- getView().removeCallbacks(updateRunnable);
- }
-
- void updateSendButton() {
- Timber.d("updateSendButton()");
- if (pendingTransaction != null) {
- llConfirmSend.setVisibility(View.VISIBLE);
- bSend.setEnabled(sendCountdown > 0);
- } else {
- llConfirmSend.setVisibility(View.GONE);
- bSend.setEnabled(false);
- }
- }
-
- public void preSend() {
- Helper.promptPassword(getContext(), getActivityCallback().getWalletName(), false, new Helper.PasswordAction() {
- @Override
- public void act(String walletName, String password, boolean fingerprintUsed) {
- send();
- }
-
- public void fail(String walletName) {
- getActivity().runOnUiThread(() -> {
- bSend.setEnabled(sendCountdown > 0); // allow to try again
- });
- }
- });
- }
-
- // creates a pending transaction and calls us back with transactionCreated()
- // or createTransactionFailed()
- void prepareSend() {
- if (!isResumed) return;
- if ((xmrtoOrder == null)) {
- throw new IllegalStateException("xmrtoOrder is null");
- }
- showProgress(3, getString(R.string.label_send_progress_create_tx));
- final TxData txData = sendListener.getTxData();
- txData.setDestinationAddress(xmrtoOrder.getXmrAddress());
- txData.setAmount(xmrtoOrder.getXmrAmount());
- getActivityCallback().onPrepareSend(xmrtoOrder.getOrderId(), txData);
- }
-
- SendFragment.Listener getActivityCallback() {
- return sendListener.getActivityCallback();
- }
-
- private RequestQuote xmrtoQuote = null;
-
- private void processStageA(final RequestQuote requestQuote) {
- Timber.d("processCreateOrder %s", requestQuote.getId());
- TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
- // verify the BTC amount is correct
- if (requestQuote.getBtcAmount() != txDataBtc.getBtcAmount()) {
- Timber.d("Failed to get quote");
- getView().post(() -> showStageError(ShiftError.Error.SERVICE.toString(),
- getString(R.string.shift_noquote),
- getString(R.string.shift_checkamount)));
- return; // just stop for now
- }
- xmrtoQuote = requestQuote;
- txDataBtc.setAmount(xmrtoQuote.getXmrAmount());
- getView().post(() -> {
- // show data from the actual quote as that is what is used to
- NumberFormat df = NumberFormat.getInstance(Locale.US);
- df.setMaximumFractionDigits(12);
- final String btcAmount = df.format(xmrtoQuote.getBtcAmount());
- final String xmrAmountTotal = df.format(xmrtoQuote.getXmrAmount());
- tvTxBtcAmount.setText(getString(R.string.text_send_btc_amount,
- btcAmount, xmrAmountTotal, txDataBtc.getBtcSymbol()));
- final String xmrPriceBtc = df.format(xmrtoQuote.getPrice());
- tvTxBtcRate.setText(getString(R.string.text_send_btc_rate, xmrPriceBtc, txDataBtc.getBtcSymbol()));
- hideProgress();
- });
- stageB(requestQuote.getId());
- }
-
- private void processStageAError(final Exception ex) {
- Timber.e("processStageAError %s", ex.getLocalizedMessage());
- getView().post(() -> {
- if (ex instanceof ShiftException) {
- ShiftException xmrEx = (ShiftException) ex;
- ShiftError xmrErr = xmrEx.getError();
- if (xmrErr != null) {
- if (xmrErr.isRetryable()) {
- showStageError(xmrErr.getErrorType().toString(), xmrErr.getErrorMsg(),
- getString(R.string.text_retry));
- evStageA.setOnClickListener(v -> {
- evStageA.setOnClickListener(null);
- stageA();
- });
- } else {
- showStageError(xmrErr.getErrorType().toString(), xmrErr.getErrorMsg(),
- getString(R.string.text_noretry));
- }
- } else {
- showStageError(getString(R.string.label_generic_xmrto_error),
- getString(R.string.text_generic_xmrto_error, xmrEx.getCode()),
- getString(R.string.text_noretry));
- }
- } else {
- evStageA.showMessage(getString(R.string.label_generic_xmrto_error),
- ex.getLocalizedMessage(),
- getString(R.string.text_noretry));
- }
- });
- }
-
- private void stageA() {
- if (!isResumed) return;
- Timber.d("Request Quote");
- xmrtoQuote = null;
- xmrtoOrder = null;
- showProgress(1, getString(R.string.label_send_progress_xmrto_create));
- TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
-
- ShiftCallback callback = new ShiftCallback() {
- @Override
- public void onSuccess(RequestQuote requestQuote) {
- if (!isResumed) return;
- if (xmrtoQuote != null) {
- Timber.w("another ongoing request quote request");
- return;
- }
- processStageA(requestQuote);
- }
-
- @Override
- public void onError(Exception ex) {
- if (!isResumed) return;
- if (xmrtoQuote != null) {
- Timber.w("another ongoing request quote request");
- return;
- }
- processStageAError(ex);
- }
- };
-
- getXmrToApi().requestQuote(txDataBtc.getBtcAmount(), callback);
- }
-
- private CreateOrder xmrtoOrder = null;
-
- private void processStageB(final CreateOrder order) {
- Timber.d("processCreateOrder %s for %s", order.getOrderId(), order.getQuoteId());
- TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
- // verify amount & destination
- if ((order.getBtcAmount() != txDataBtc.getBtcAmount())
- || (!txDataBtc.validateAddress(order.getBtcAddress()))) {
- throw new IllegalStateException("Order does not fulfill quote!"); // something is terribly wrong - die
- }
- xmrtoOrder = order;
- getView().post(() -> {
- tvTxXmrToKey.setText(order.getOrderId());
- tvTxBtcAddress.setText(order.getBtcAddress());
- tvTxBtcAddressLabel.setText(getString(R.string.label_send_btc_address, txDataBtc.getBtcSymbol()));
- hideProgress();
- Timber.d("Expires @ %s", order.getExpiresAt().toString());
- final int timeout = (int) (order.getExpiresAt().getTime() - order.getCreatedAt().getTime()) / 1000 - 60; // -1 minute buffer
- startSendTimer(timeout);
- prepareSend();
- });
- }
-
- private void processStageBError(final Exception ex) {
- Timber.e("processCreateOrderError %s", ex.getLocalizedMessage());
- getView().post(() -> {
- if (ex instanceof ShiftException) {
- ShiftException xmrEx = (ShiftException) ex;
- ShiftError xmrErr = xmrEx.getError();
- if (xmrErr != null) {
- if (xmrErr.isRetryable()) {
- showStageError(xmrErr.getErrorType().toString(), xmrErr.getErrorMsg(),
- getString(R.string.text_retry));
- evStageB.setOnClickListener(v -> {
- evStageB.setOnClickListener(null);
- stageB(xmrtoOrder.getOrderId());
- });
- } else {
- showStageError(xmrErr.getErrorType().toString(), xmrErr.getErrorMsg(),
- getString(R.string.text_noretry));
- }
- } else {
- showStageError(getString(R.string.label_generic_xmrto_error),
- getString(R.string.text_generic_xmrto_error, xmrEx.getCode()),
- getString(R.string.text_noretry));
- }
- } else {
- evStageB.showMessage(getString(R.string.label_generic_xmrto_error),
- ex.getLocalizedMessage(),
- getString(R.string.text_noretry));
- }
- });
- }
-
- private void stageB(final String quoteId) {
- Timber.d("createOrder(%s)", quoteId);
- if (!isResumed) return;
- final String btcAddress = ((TxDataBtc) sendListener.getTxData()).getBtcAddress();
- getView().post(() -> {
- xmrtoOrder = null;
- showProgress(2, getString(R.string.label_send_progress_xmrto_query));
- getXmrToApi().createOrder(quoteId, btcAddress, new ShiftCallback() {
- @Override
- public void onSuccess(CreateOrder order) {
- if (!isResumed) return;
- if (xmrtoQuote == null) return;
- if (!order.getQuoteId().equals(xmrtoQuote.getId())) {
- Timber.d("Quote ID does not match");
- // ignore (we got a response to a stale request)
- return;
- }
- if (xmrtoOrder != null)
- throw new IllegalStateException("xmrtoOrder must be null here!");
- processStageB(order);
- }
-
- @Override
- public void onError(Exception ex) {
- if (!isResumed) return;
- processStageBError(ex);
- }
- });
- });
- }
-
- private SideShiftApi xmrToApi = null;
-
- private SideShiftApi getXmrToApi() {
- if (xmrToApi == null) {
- synchronized (this) {
- if (xmrToApi == null) {
- xmrToApi = new SideShiftApiImpl(ServiceHelper.getXmrToBaseUrl());
- }
- }
- }
- return xmrToApi;
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java
deleted file mode 100644
index 41c13db..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * 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.fragment.send;
-
-import android.content.Intent;
-import android.graphics.Paint;
-import android.net.Uri;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.data.Crypto;
-import com.m2049r.xmrwallet.data.PendingTx;
-import com.m2049r.xmrwallet.data.TxDataBtc;
-import com.m2049r.xmrwallet.service.shift.ShiftCallback;
-import com.m2049r.xmrwallet.service.shift.ShiftException;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderStatus;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi;
-import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.ServiceHelper;
-import com.m2049r.xmrwallet.util.ThemeHelper;
-
-import java.text.NumberFormat;
-import java.util.Locale;
-
-import timber.log.Timber;
-
-public class SendBtcSuccessWizardFragment extends SendWizardFragment {
-
- public static SendBtcSuccessWizardFragment newInstance(SendSuccessWizardFragment.Listener listener) {
- SendBtcSuccessWizardFragment instance = new SendBtcSuccessWizardFragment();
- instance.setSendListener(listener);
- return instance;
- }
-
- SendSuccessWizardFragment.Listener sendListener;
-
- public void setSendListener(SendSuccessWizardFragment.Listener listener) {
- this.sendListener = listener;
- }
-
- ImageButton bCopyTxId;
- private TextView tvTxId;
- private TextView tvTxAddress;
- private TextView tvTxAmount;
- private TextView tvTxFee;
- private TextView tvXmrToAmount;
- private ImageView ivXmrToIcon;
- private TextView tvXmrToStatus;
- private ImageView ivXmrToStatus;
- private ImageView ivXmrToStatusBig;
- private ProgressBar pbXmrto;
- private TextView tvTxXmrToKey;
- private TextView tvXmrToSupport;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
-
- Timber.d("onCreateView() %s", (String.valueOf(savedInstanceState)));
-
- View view = inflater.inflate(
- R.layout.fragment_send_btc_success, container, false);
-
- bCopyTxId = view.findViewById(R.id.bCopyTxId);
- bCopyTxId.setEnabled(false);
- bCopyTxId.setOnClickListener(v -> {
- Helper.clipBoardCopy(getActivity(), getString(R.string.label_send_txid), tvTxId.getText().toString());
- Toast.makeText(getActivity(), getString(R.string.message_copy_txid), Toast.LENGTH_SHORT).show();
- });
-
- tvXmrToAmount = view.findViewById(R.id.tvXmrToAmount);
- ivXmrToIcon = view.findViewById(R.id.ivXmrToIcon);
- tvXmrToStatus = view.findViewById(R.id.tvXmrToStatus);
- ivXmrToStatus = view.findViewById(R.id.ivXmrToStatus);
- ivXmrToStatusBig = view.findViewById(R.id.ivXmrToStatusBig);
-
- tvTxId = view.findViewById(R.id.tvTxId);
- tvTxAddress = view.findViewById(R.id.tvTxAddress);
- tvTxAmount = view.findViewById(R.id.tvTxAmount);
- tvTxFee = view.findViewById(R.id.tvTxFee);
-
- pbXmrto = view.findViewById(R.id.pbXmrto);
- pbXmrto.getIndeterminateDrawable().setColorFilter(0x61000000, android.graphics.PorterDuff.Mode.MULTIPLY);
-
- tvTxXmrToKey = view.findViewById(R.id.tvTxXmrToKey);
- tvTxXmrToKey.setOnClickListener(v -> {
- Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_xmrtokey), tvTxXmrToKey.getText().toString());
- Toast.makeText(getActivity(), getString(R.string.message_copy_xmrtokey), Toast.LENGTH_SHORT).show();
- });
-
- tvXmrToSupport = view.findViewById(R.id.tvXmrToSupport);
- tvXmrToSupport.setPaintFlags(tvXmrToSupport.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
-
- return view;
- }
-
- @Override
- public boolean onValidateFields() {
- return true;
- }
-
- private boolean isResumed = false;
-
- @Override
- public void onPauseFragment() {
- isResumed = false;
- super.onPauseFragment();
- }
-
- TxDataBtc btcData = null;
-
- @Override
- public void onResumeFragment() {
- super.onResumeFragment();
- Timber.d("onResumeFragment()");
- Helper.hideKeyboard(getActivity());
- isResumed = true;
-
- btcData = (TxDataBtc) sendListener.getTxData();
- tvTxAddress.setText(btcData.getDestinationAddress());
-
- final PendingTx committedTx = sendListener.getCommittedTx();
- if (committedTx != null) {
- tvTxId.setText(committedTx.txId);
- bCopyTxId.setEnabled(true);
- tvTxAmount.setText(getString(R.string.send_amount, Helper.getDisplayAmount(committedTx.amount)));
- tvTxFee.setText(getString(R.string.send_fee, Helper.getDisplayAmount(committedTx.fee)));
- if (btcData != null) {
- NumberFormat df = NumberFormat.getInstance(Locale.US);
- df.setMaximumFractionDigits(12);
- String btcAmount = df.format(btcData.getBtcAmount());
- tvXmrToAmount.setText(getString(R.string.info_send_xmrto_success_btc, btcAmount, btcData.getBtcSymbol()));
- //TODO btcData.getBtcAddress();
- tvTxXmrToKey.setText(btcData.getXmrtoOrderId());
- final Crypto crypto = Crypto.withSymbol(btcData.getBtcSymbol());
- ivXmrToIcon.setImageResource(crypto.getIconEnabledId());
- tvXmrToSupport.setOnClickListener(v -> {
- Uri orderUri = getXmrToApi().getQueryOrderUri(btcData.getXmrtoOrderId());
- Intent intent = new Intent(Intent.ACTION_VIEW, orderUri);
- startActivity(intent);
- });
- queryOrder();
- } else {
- throw new IllegalStateException("btcData is null");
- }
- }
- sendListener.enableDone();
- }
-
- private void processQueryOrder(final QueryOrderStatus status) {
- Timber.d("processQueryOrder %s for %s", status.getState().toString(), status.getOrderId());
- if (!btcData.getXmrtoOrderId().equals(status.getOrderId()))
- throw new IllegalStateException("UUIDs do not match!");
- if (isResumed && (getView() != null))
- getView().post(() -> {
- showXmrToStatus(status);
- if (!status.isTerminal()) {
- getView().postDelayed(this::queryOrder, SideShiftApi.QUERY_INTERVAL);
- }
- });
- }
-
- private void queryOrder() {
- Timber.d("queryOrder(%s)", btcData.getXmrtoOrderId());
- if (!isResumed) return;
- getXmrToApi().queryOrderStatus(btcData.getXmrtoOrderId(), new ShiftCallback() {
- @Override
- public void onSuccess(QueryOrderStatus status) {
- if (!isAdded()) return;
- processQueryOrder(status);
- }
-
- @Override
- public void onError(final Exception ex) {
- if (!isResumed) return;
- Timber.w(ex);
- getActivity().runOnUiThread(() -> {
- if (ex instanceof ShiftException) {
- Toast.makeText(getActivity(), ((ShiftException) ex).getError().getErrorMsg(), Toast.LENGTH_LONG).show();
- } else {
- Toast.makeText(getActivity(), ex.getLocalizedMessage(), Toast.LENGTH_LONG).show();
- }
- });
- }
- });
- }
-
- void showXmrToStatus(final QueryOrderStatus status) {
- int statusResource = 0;
- if (status.isError()) {
- tvXmrToStatus.setText(getString(R.string.info_send_xmrto_error, status.toString()));
- statusResource = R.drawable.ic_error_red_24dp;
- pbXmrto.getIndeterminateDrawable().setColorFilter(
- ThemeHelper.getThemedColor(getContext(), android.R.attr.colorError),
- android.graphics.PorterDuff.Mode.MULTIPLY);
- } else if (status.isSent() || status.isPaid()) {
- tvXmrToStatus.setText(getString(R.string.info_send_xmrto_sent, btcData.getBtcSymbol()));
- statusResource = R.drawable.ic_success;
- pbXmrto.getIndeterminateDrawable().setColorFilter(
- ThemeHelper.getThemedColor(getContext(), R.attr.positiveColor),
- android.graphics.PorterDuff.Mode.MULTIPLY);
- } else if (status.isWaiting()) {
- tvXmrToStatus.setText(getString(R.string.info_send_xmrto_unpaid));
- statusResource = R.drawable.ic_pending;
- pbXmrto.getIndeterminateDrawable().setColorFilter(
- ThemeHelper.getThemedColor(getContext(), R.attr.neutralColor),
- android.graphics.PorterDuff.Mode.MULTIPLY);
- } else if (status.isPending()) {
- tvXmrToStatus.setText(getString(R.string.info_send_xmrto_paid));
- statusResource = R.drawable.ic_pending;
- pbXmrto.getIndeterminateDrawable().setColorFilter(
- ThemeHelper.getThemedColor(getContext(), R.attr.neutralColor),
- android.graphics.PorterDuff.Mode.MULTIPLY);
- } else {
- throw new IllegalStateException("status is broken: " + status.toString());
- }
- ivXmrToStatus.setImageResource(statusResource);
- if (status.isTerminal()) {
- pbXmrto.setVisibility(View.INVISIBLE);
- ivXmrToIcon.setVisibility(View.GONE);
- ivXmrToStatus.setVisibility(View.GONE);
- ivXmrToStatusBig.setImageResource(statusResource);
- ivXmrToStatusBig.setVisibility(View.VISIBLE);
- }
- }
-
- private SideShiftApi xmrToApi = null;
-
- private SideShiftApi getXmrToApi() {
- if (xmrToApi == null) {
- synchronized (this) {
- if (xmrToApi == null) {
- xmrToApi = new SideShiftApiImpl(ServiceHelper.getXmrToBaseUrl());
- }
- }
- }
- return xmrToApi;
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirm.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirm.java
deleted file mode 100644
index 69e97c8..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirm.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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.fragment.send;
-
-import com.m2049r.xmrwallet.model.PendingTransaction;
-
-interface SendConfirm {
- void sendFailed(String errorText);
-
- void createTransactionFailed(String errorText);
-
- void transactionCreated(String txTag, PendingTransaction pendingTransaction);
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirmWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirmWizardFragment.java
deleted file mode 100644
index f4d334e..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirmWizardFragment.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * 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.fragment.send;
-
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.TextWatcher;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import androidx.appcompat.app.AlertDialog;
-
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.google.android.material.textfield.TextInputLayout;
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.data.TxData;
-import com.m2049r.xmrwallet.data.UserNotes;
-import com.m2049r.xmrwallet.model.PendingTransaction;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.util.Helper;
-
-import timber.log.Timber;
-
-public class SendConfirmWizardFragment extends SendWizardFragment implements SendConfirm {
-
- public static SendConfirmWizardFragment newInstance(Listener listener) {
- SendConfirmWizardFragment instance = new SendConfirmWizardFragment();
- instance.setSendListener(listener);
- return instance;
- }
-
- Listener sendListener;
-
- public SendConfirmWizardFragment setSendListener(Listener listener) {
- this.sendListener = listener;
- return this;
- }
-
- interface Listener {
- SendFragment.Listener getActivityCallback();
-
- TxData getTxData();
-
- void commitTransaction();
-
- void disposeTransaction();
-
- SendFragment.Mode getMode();
- }
-
- private TextView tvTxAddress;
- private TextView tvTxNotes;
- private TextView tvTxAmount;
- private TextView tvTxFee;
- private TextView tvTxTotal;
- private View llProgress;
- private View bSend;
- private View llConfirmSend;
- private View pbProgressSend;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
-
- Timber.d("onCreateView() %s", (String.valueOf(savedInstanceState)));
-
- View view = inflater.inflate(
- R.layout.fragment_send_confirm, container, false);
-
- tvTxAddress = view.findViewById(R.id.tvTxAddress);
- tvTxNotes = view.findViewById(R.id.tvTxNotes);
- tvTxAmount = view.findViewById(R.id.tvTxAmount);
- tvTxFee = view.findViewById(R.id.tvTxFee);
- tvTxTotal = view.findViewById(R.id.tvTxTotal);
-
- llProgress = view.findViewById(R.id.llProgress);
- pbProgressSend = view.findViewById(R.id.pbProgressSend);
- llConfirmSend = view.findViewById(R.id.llConfirmSend);
-
- bSend = view.findViewById(R.id.bSend);
- bSend.setEnabled(false);
- bSend.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Timber.d("bSend.setOnClickListener");
- bSend.setEnabled(false);
- preSend();
- }
- });
- return view;
- }
-
- boolean inProgress = false;
-
- public void hideProgress() {
- llProgress.setVisibility(View.INVISIBLE);
- inProgress = false;
- }
-
- public void showProgress() {
- llProgress.setVisibility(View.VISIBLE);
- inProgress = true;
- }
-
- PendingTransaction pendingTransaction = null;
-
- @Override
- // callback from wallet when PendingTransaction created
- public void transactionCreated(String txTag, PendingTransaction pendingTransaction) {
- // ignore txTag - the app flow ensures this is the correct tx
- // TODO: use the txTag
- hideProgress();
- if (isResumed) {
- this.pendingTransaction = pendingTransaction;
- refreshTransactionDetails();
- } else {
- sendListener.disposeTransaction();
- }
- }
-
- void send() {
- sendListener.commitTransaction();
- getActivity().runOnUiThread(() -> pbProgressSend.setVisibility(View.VISIBLE));
- }
-
- @Override
- public void sendFailed(String errorText) {
- pbProgressSend.setVisibility(View.INVISIBLE);
- showAlert(getString(R.string.send_create_tx_error_title), errorText);
- }
-
- @Override
- public void createTransactionFailed(String errorText) {
- hideProgress();
- showAlert(getString(R.string.send_create_tx_error_title), errorText);
- }
-
- private void showAlert(String title, String message) {
- AlertDialog.Builder builder = new MaterialAlertDialogBuilder(getActivity());
- builder.setCancelable(true).
- setTitle(title).
- setMessage(message).
- create().
- show();
- }
-
- @Override
- public boolean onValidateFields() {
- return true;
- }
-
- private boolean isResumed = false;
-
- @Override
- public void onPauseFragment() {
- isResumed = false;
- pendingTransaction = null;
- sendListener.disposeTransaction();
- refreshTransactionDetails();
- super.onPauseFragment();
- }
-
- @Override
- public void onResumeFragment() {
- super.onResumeFragment();
- Timber.d("onResumeFragment()");
- Helper.hideKeyboard(getActivity());
- isResumed = true;
-
- final TxData txData = sendListener.getTxData();
- tvTxAddress.setText(txData.getDestinationAddress());
- UserNotes notes = sendListener.getTxData().getUserNotes();
- if ((notes != null) && (!notes.note.isEmpty())) {
- tvTxNotes.setText(notes.note);
- } else {
- tvTxNotes.setText("-");
- }
- refreshTransactionDetails();
- if ((pendingTransaction == null) && (!inProgress)) {
- showProgress();
- prepareSend(txData);
- }
- }
-
- void refreshTransactionDetails() {
- Timber.d("refreshTransactionDetails()");
- if (pendingTransaction != null) {
- llConfirmSend.setVisibility(View.VISIBLE);
- bSend.setEnabled(true);
- tvTxFee.setText(Wallet.getDisplayAmount(pendingTransaction.getFee()));
- if (getActivityCallback().isStreetMode()
- && (sendListener.getTxData().getAmount() == Wallet.SWEEP_ALL)) {
- tvTxAmount.setText(getString(R.string.street_sweep_amount));
- tvTxTotal.setText(getString(R.string.street_sweep_amount));
- } else {
- tvTxAmount.setText(Wallet.getDisplayAmount(pendingTransaction.getAmount()));
- tvTxTotal.setText(Wallet.getDisplayAmount(
- pendingTransaction.getFee() + pendingTransaction.getAmount()));
- }
- } else {
- llConfirmSend.setVisibility(View.GONE);
- bSend.setEnabled(false);
- }
- }
-
- public void preSend() {
- Helper.promptPassword(getContext(), getActivityCallback().getWalletName(), false, new Helper.PasswordAction() {
- @Override
- public void act(String walletName, String password, boolean fingerprintUsed) {
- send();
- }
-
- public void fail(String walletName) {
- getActivity().runOnUiThread(() -> {
- bSend.setEnabled(true); // allow to try again
- });
- }
- });
- }
-
- // creates a pending transaction and calls us back with transactionCreated()
- // or createTransactionFailed()
- void prepareSend(TxData txData) {
- getActivityCallback().onPrepareSend(null, txData);
- }
-
- SendFragment.Listener getActivityCallback() {
- return sendListener.getActivityCallback();
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java
deleted file mode 100644
index ce82795..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java
+++ /dev/null
@@ -1,558 +0,0 @@
-/*
- * 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.fragment.send;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.text.InputType;
-import android.util.SparseArray;
-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.EditText;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentStatePagerAdapter;
-import androidx.viewpager.widget.ViewPager;
-
-import com.google.android.material.transition.MaterialContainerTransform;
-import com.m2049r.xmrwallet.OnBackPressedListener;
-import com.m2049r.xmrwallet.OnUriScannedListener;
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.WalletActivity;
-import com.m2049r.xmrwallet.data.BarcodeData;
-import com.m2049r.xmrwallet.data.PendingTx;
-import com.m2049r.xmrwallet.data.TxData;
-import com.m2049r.xmrwallet.data.TxDataBtc;
-import com.m2049r.xmrwallet.data.UserNotes;
-import com.m2049r.xmrwallet.layout.SpendViewPager;
-import com.m2049r.xmrwallet.model.PendingTransaction;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.Notice;
-import com.m2049r.xmrwallet.util.ThemeHelper;
-import com.m2049r.xmrwallet.widget.DotBar;
-import com.m2049r.xmrwallet.widget.Toolbar;
-
-import java.lang.ref.WeakReference;
-
-import timber.log.Timber;
-
-public class SendFragment extends Fragment
- implements SendAddressWizardFragment.Listener,
- SendAmountWizardFragment.Listener,
- SendConfirmWizardFragment.Listener,
- SendSuccessWizardFragment.Listener,
- OnBackPressedListener, OnUriScannedListener {
-
- final static public int MIXIN = 0;
-
- private Listener activityCallback;
-
- public interface Listener {
- SharedPreferences getPrefs();
-
- long getTotalFunds();
-
- boolean isStreetMode();
-
- void onPrepareSend(String tag, TxData data);
-
- String getWalletName();
-
- void onSend(UserNotes notes);
-
- void onDisposeRequest();
-
- void onFragmentDone();
-
- void setToolbarButton(int type);
-
- void setTitle(String title);
-
- void setSubtitle(String subtitle);
-
- void setOnUriScannedListener(OnUriScannedListener onUriScannedListener);
- }
-
- private View llNavBar;
- private DotBar dotBar;
- private Button bPrev;
- private Button bNext;
-
- private Button bDone;
-
- static private final int MAX_FALLBACK = Integer.MAX_VALUE;
-
- public static SendFragment newInstance(String uri) {
- SendFragment f = new SendFragment();
- Bundle args = new Bundle();
- args.putString(WalletActivity.REQUEST_URI, uri);
- f.setArguments(args);
- return f;
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
-
- final View view = inflater.inflate(R.layout.fragment_send, container, false);
-
- llNavBar = view.findViewById(R.id.llNavBar);
- bDone = view.findViewById(R.id.bDone);
-
- dotBar = view.findViewById(R.id.dotBar);
- bPrev = view.findViewById(R.id.bPrev);
- bNext = view.findViewById(R.id.bNext);
-
- ViewGroup llNotice = view.findViewById(R.id.llNotice);
- Notice.showAll(llNotice, ".*_send");
-
- spendViewPager = view.findViewById(R.id.pager);
- pagerAdapter = new SpendPagerAdapter(getChildFragmentManager());
- spendViewPager.setOffscreenPageLimit(pagerAdapter.getCount()); // load & keep all pages in cache
- spendViewPager.setAdapter(pagerAdapter);
-
- spendViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
- private int fallbackPosition = MAX_FALLBACK;
- private int currentPosition = 0;
-
- @Override
- public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
- }
-
- @Override
- public void onPageSelected(int newPosition) {
- Timber.d("onPageSelected=%d/%d", newPosition, fallbackPosition);
- if (fallbackPosition < newPosition) {
- spendViewPager.setCurrentItem(fallbackPosition);
- } else {
- pagerAdapter.getFragment(currentPosition).onPauseFragment();
- pagerAdapter.getFragment(newPosition).onResumeFragment();
- updatePosition(newPosition);
- currentPosition = newPosition;
- fallbackPosition = MAX_FALLBACK;
- }
- }
-
- @Override
- public void onPageScrollStateChanged(int state) {
- if (state == ViewPager.SCROLL_STATE_DRAGGING) {
- if (!spendViewPager.validateFields(spendViewPager.getCurrentItem())) {
- fallbackPosition = spendViewPager.getCurrentItem();
- } else {
- fallbackPosition = spendViewPager.getCurrentItem() + 1;
- }
- }
- }
- });
-
- bPrev.setOnClickListener(v -> spendViewPager.previous());
-
- bNext.setOnClickListener(v -> spendViewPager.next());
-
- bDone.setOnClickListener(v -> {
- Timber.d("bDone.onClick");
- activityCallback.onFragmentDone();
- });
-
- updatePosition(0);
-
- final EditText etDummy = view.findViewById(R.id.etDummy);
- etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
- etDummy.requestFocus();
- Helper.hideKeyboard(getActivity());
-
- Bundle args = getArguments();
- if (args != null) {
- String uri = args.getString(WalletActivity.REQUEST_URI);
- Timber.d("URI: %s", uri);
- if (uri != null) {
- barcodeData = BarcodeData.fromString(uri);
- Timber.d("barcodeData: %s", barcodeData != null ? barcodeData.toString() : "null");
- }
- }
-
- return view;
- }
-
- void updatePosition(int position) {
- dotBar.setActiveDot(position);
- CharSequence nextLabel = pagerAdapter.getPageTitle(position + 1);
- bNext.setText(nextLabel);
- if (nextLabel != null) {
- bNext.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_navigate_next, 0);
- } else {
- bNext.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
- }
- CharSequence prevLabel = pagerAdapter.getPageTitle(position - 1);
- bPrev.setText(prevLabel);
- if (prevLabel != null) {
- bPrev.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_navigate_prev, 0, 0, 0);
- } else {
- bPrev.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
- }
- }
-
- @Override
- public void onResume() {
- super.onResume();
- Timber.d("onResume");
- activityCallback.setSubtitle(getString(R.string.send_title));
- if (spendViewPager.getCurrentItem() == SpendPagerAdapter.POS_SUCCESS) {
- activityCallback.setToolbarButton(Toolbar.BUTTON_NONE);
- } else {
- activityCallback.setToolbarButton(Toolbar.BUTTON_CANCEL);
- }
- }
-
- @Override
- public void onAttach(@NonNull Context context) {
- Timber.d("onAttach %s", context);
- super.onAttach(context);
- if (context instanceof Listener) {
- activityCallback = (Listener) context;
- activityCallback.setOnUriScannedListener(this);
- } else {
- throw new ClassCastException(context.toString()
- + " must implement Listener");
- }
- }
-
- @Override
- public void onDetach() {
- activityCallback.setOnUriScannedListener(null);
- super.onDetach();
- }
-
- private SpendViewPager spendViewPager;
- private SpendPagerAdapter pagerAdapter;
-
- @Override
- public boolean onBackPressed() {
- if (isComitted()) return true; // no going back
- if (spendViewPager.getCurrentItem() == 0) {
- return false;
- } else {
- spendViewPager.previous();
- return true;
- }
- }
-
- @Override
- public boolean onUriScanned(BarcodeData barcodeData) {
- if (spendViewPager.getCurrentItem() == SpendPagerAdapter.POS_ADDRESS) {
- final SendWizardFragment fragment = pagerAdapter.getFragment(SpendPagerAdapter.POS_ADDRESS);
- if (fragment instanceof SendAddressWizardFragment) {
- ((SendAddressWizardFragment) fragment).processScannedData(barcodeData);
- return true;
- }
- }
- return false;
- }
-
- enum Mode {
- XMR, BTC
- }
-
- Mode mode = Mode.XMR;
-
- @Override
- public void setMode(Mode aMode) {
- if (mode != aMode) {
- mode = aMode;
- switch (aMode) {
- case XMR:
- txData = new TxData();
- break;
- case BTC:
- txData = new TxDataBtc();
- break;
- default:
- throw new IllegalArgumentException("Mode " + String.valueOf(aMode) + " unknown!");
- }
- getView().post(() -> pagerAdapter.notifyDataSetChanged());
- Timber.d("New Mode = %s", mode.toString());
- }
- }
-
- @Override
- public Mode getMode() {
- return mode;
- }
-
- public class SpendPagerAdapter extends FragmentStatePagerAdapter {
- private static final int POS_ADDRESS = 0;
- private static final int POS_AMOUNT = 1;
- private static final int POS_CONFIRM = 2;
- private static final int POS_SUCCESS = 3;
- private int numPages = 3;
-
- SparseArray> myFragments = new SparseArray<>();
-
- public SpendPagerAdapter(FragmentManager fm) {
- super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
- }
-
- public void addSuccess() {
- numPages++;
- notifyDataSetChanged();
- }
-
- @Override
- public int getCount() {
- return numPages;
- }
-
- @NonNull
- @Override
- public Object instantiateItem(@NonNull ViewGroup container, int position) {
- Timber.d("instantiateItem %d", position);
- SendWizardFragment fragment = (SendWizardFragment) super.instantiateItem(container, position);
- myFragments.put(position, new WeakReference<>(fragment));
- return fragment;
- }
-
- @Override
- public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
- Timber.d("destroyItem %d", position);
- myFragments.remove(position);
- super.destroyItem(container, position, object);
- }
-
- public SendWizardFragment getFragment(int position) {
- WeakReference ref = myFragments.get(position);
- if (ref != null)
- return myFragments.get(position).get();
- else
- return null;
- }
-
- @NonNull
- @Override
- public SendWizardFragment getItem(int position) {
- Timber.d("getItem(%d) CREATE", position);
- Timber.d("Mode=%s", mode.toString());
- if (mode == Mode.XMR) {
- switch (position) {
- case POS_ADDRESS:
- return SendAddressWizardFragment.newInstance(SendFragment.this);
- case POS_AMOUNT:
- return SendAmountWizardFragment.newInstance(SendFragment.this);
- case POS_CONFIRM:
- return SendConfirmWizardFragment.newInstance(SendFragment.this);
- case POS_SUCCESS:
- return SendSuccessWizardFragment.newInstance(SendFragment.this);
- default:
- throw new IllegalArgumentException("no such send position(" + position + ")");
- }
- } else if (mode == Mode.BTC) {
- switch (position) {
- case POS_ADDRESS:
- return SendAddressWizardFragment.newInstance(SendFragment.this);
- case POS_AMOUNT:
- return SendBtcAmountWizardFragment.newInstance(SendFragment.this);
- case POS_CONFIRM:
- return SendBtcConfirmWizardFragment.newInstance(SendFragment.this);
- case POS_SUCCESS:
- return SendBtcSuccessWizardFragment.newInstance(SendFragment.this);
- default:
- throw new IllegalArgumentException("no such send position(" + position + ")");
- }
- } else {
- throw new IllegalStateException("Unknown mode!");
- }
- }
-
- @Override
- public CharSequence getPageTitle(int position) {
- Timber.d("getPageTitle(%d)", position);
- if (position >= numPages) return null;
- switch (position) {
- case POS_ADDRESS:
- return getString(R.string.send_address_title);
- case POS_AMOUNT:
- return getString(R.string.send_amount_title);
- case POS_CONFIRM:
- return getString(R.string.send_confirm_title);
- case POS_SUCCESS:
- return getString(R.string.send_success_title);
- default:
- return null;
- }
- }
-
- @Override
- public int getItemPosition(@NonNull Object object) {
- Timber.d("getItemPosition %s", String.valueOf(object));
- if (object instanceof SendAddressWizardFragment) {
- // keep these pages
- return POSITION_UNCHANGED;
- } else {
- return POSITION_NONE;
- }
- }
- }
-
- @Override
- public TxData getTxData() {
- return txData;
- }
-
- private TxData txData = new TxData();
-
- private BarcodeData barcodeData;
-
- // Listeners
- @Override
- public void setBarcodeData(BarcodeData data) {
- barcodeData = data;
- }
-
- @Override
- public BarcodeData getBarcodeData() {
- return barcodeData;
- }
-
- @Override
- public BarcodeData popBarcodeData() {
- Timber.d("POPPED");
- BarcodeData data = barcodeData;
- barcodeData = null;
- return data;
- }
-
- boolean isComitted() {
- return committedTx != null;
- }
-
- PendingTx committedTx;
-
- @Override
- public PendingTx getCommittedTx() {
- return committedTx;
- }
-
-
- @Override
- public void commitTransaction() {
- Timber.d("REALLY SEND");
- disableNavigation(); // committed - disable all navigation
- activityCallback.onSend(txData.getUserNotes());
- committedTx = pendingTx;
- }
-
- void disableNavigation() {
- spendViewPager.allowSwipe(false);
- }
-
- void enableNavigation() {
- spendViewPager.allowSwipe(true);
- }
-
- @Override
- public void enableDone() {
- llNavBar.setVisibility(View.INVISIBLE);
- bDone.setVisibility(View.VISIBLE);
- }
-
- public Listener getActivityCallback() {
- return activityCallback;
- }
-
-
- // callbacks from send service
-
- public void onTransactionCreated(final String txTag, final PendingTransaction pendingTransaction) {
- final SendConfirm confirm = getSendConfirm();
- if (confirm != null) {
- pendingTx = new PendingTx(pendingTransaction);
- confirm.transactionCreated(txTag, pendingTransaction);
- } else {
- // not in confirm fragment => dispose & move on
- disposeTransaction();
- }
- }
-
- @Override
- public void disposeTransaction() {
- pendingTx = null;
- activityCallback.onDisposeRequest();
- }
-
- PendingTx pendingTx;
-
- public PendingTx getPendingTx() {
- return pendingTx;
- }
-
- public void onCreateTransactionFailed(String errorText) {
- final SendConfirm confirm = getSendConfirm();
- if (confirm != null) {
- confirm.createTransactionFailed(errorText);
- }
- }
-
- SendConfirm getSendConfirm() {
- final SendWizardFragment fragment = pagerAdapter.getFragment(SpendPagerAdapter.POS_CONFIRM);
- if (fragment instanceof SendConfirm) {
- return (SendConfirm) fragment;
- } else {
- return null;
- }
- }
-
- public void onTransactionSent(final String txId) {
- Timber.d("txid=%s", txId);
- pagerAdapter.addSuccess();
- Timber.d("numPages=%d", spendViewPager.getAdapter().getCount());
- activityCallback.setToolbarButton(Toolbar.BUTTON_NONE);
- spendViewPager.setCurrentItem(SpendPagerAdapter.POS_SUCCESS);
- }
-
- public void onSendTransactionFailed(final String error) {
- Timber.d("error=%s", error);
- committedTx = null;
- final SendConfirm confirm = getSendConfirm();
- if (confirm != null) {
- confirm.sendFailed(getString(R.string.status_transaction_failed, error));
- }
- enableNavigation();
- }
-
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
- final MaterialContainerTransform transform = new MaterialContainerTransform();
- transform.setDrawingViewId(R.id.fragment_container);
- transform.setDuration(getResources().getInteger(R.integer.tx_item_transition_duration));
- transform.setAllContainerColors(ThemeHelper.getThemedColor(getContext(), android.R.attr.colorBackground));
- setSharedElementEnterTransition(transform);
- }
-
- @Override
- public void onCreateOptionsMenu(@NonNull Menu menu, MenuInflater inflater) {
- inflater.inflate(R.menu.send_menu, menu);
- super.onCreateOptionsMenu(menu, inflater);
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendSuccessWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendSuccessWizardFragment.java
deleted file mode 100644
index 34f3339..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendSuccessWizardFragment.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * 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.fragment.send;
-
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageButton;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.data.PendingTx;
-import com.m2049r.xmrwallet.data.TxData;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.util.Helper;
-
-import timber.log.Timber;
-
-public class SendSuccessWizardFragment extends SendWizardFragment {
-
- public static SendSuccessWizardFragment newInstance(Listener listener) {
- SendSuccessWizardFragment instance = new SendSuccessWizardFragment();
- instance.setSendListener(listener);
- return instance;
- }
-
- Listener sendListener;
-
- public SendSuccessWizardFragment setSendListener(Listener listener) {
- this.sendListener = listener;
- return this;
- }
-
- interface Listener {
- TxData getTxData();
-
- PendingTx getCommittedTx();
-
- void enableDone();
-
- SendFragment.Mode getMode();
-
- SendFragment.Listener getActivityCallback();
- }
-
- ImageButton bCopyTxId;
- private TextView tvTxId;
- private TextView tvTxAddress;
- private TextView tvTxPaymentId;
- private TextView tvTxAmount;
- private TextView tvTxFee;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
-
- Timber.d("onCreateView() %s", (String.valueOf(savedInstanceState)));
-
- View view = inflater.inflate(
- R.layout.fragment_send_success, container, false);
-
- bCopyTxId = view.findViewById(R.id.bCopyTxId);
- bCopyTxId.setEnabled(false);
- bCopyTxId.setOnClickListener(v -> {
- Helper.clipBoardCopy(getActivity(), getString(R.string.label_send_txid), tvTxId.getText().toString());
- Toast.makeText(getActivity(), getString(R.string.message_copy_txid), Toast.LENGTH_SHORT).show();
- });
-
- tvTxId = view.findViewById(R.id.tvTxId);
- tvTxAddress = view.findViewById(R.id.tvTxAddress);
- tvTxPaymentId = view.findViewById(R.id.tvTxPaymentId);
- tvTxAmount = view.findViewById(R.id.tvTxAmount);
- tvTxFee = view.findViewById(R.id.tvTxFee);
-
- return view;
- }
-
- @Override
- public boolean onValidateFields() {
- return true;
- }
-
- @Override
- public void onPauseFragment() {
- super.onPauseFragment();
- }
-
- @Override
- public void onResumeFragment() {
- super.onResumeFragment();
- Timber.d("onResumeFragment()");
- Helper.hideKeyboard(getActivity());
-
- final TxData txData = sendListener.getTxData();
- tvTxAddress.setText(txData.getDestinationAddress());
-
- final PendingTx committedTx = sendListener.getCommittedTx();
- if (committedTx != null) {
- tvTxId.setText(committedTx.txId);
- bCopyTxId.setEnabled(true);
-
- if (sendListener.getActivityCallback().isStreetMode()
- && (sendListener.getTxData().getAmount() == Wallet.SWEEP_ALL)) {
- tvTxAmount.setText(getString(R.string.street_sweep_amount));
- } else {
- tvTxAmount.setText(getString(R.string.send_amount, Helper.getDisplayAmount(committedTx.amount)));
- }
- tvTxFee.setText(getString(R.string.send_fee, Helper.getDisplayAmount(committedTx.fee)));
- }
- sendListener.enableDone();
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendWizardFragment.java
deleted file mode 100644
index 5848ad8..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendWizardFragment.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.fragment.send;
-
-import androidx.fragment.app.Fragment;
-
-import com.m2049r.xmrwallet.layout.SpendViewPager;
-
-abstract public class SendWizardFragment extends Fragment
- implements SpendViewPager.OnValidateFieldsListener {
-
- @Override
- public boolean onValidateFields() {
- return true;
- }
-
- public void onPauseFragment() {
- }
-
- public void onResumeFragment() {
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/settings/SettingsFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/settings/SettingsFragment.java
new file mode 100644
index 0000000..bd70220
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/settings/SettingsFragment.java
@@ -0,0 +1,39 @@
+package com.m2049r.xmrwallet.fragment.settings;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.lifecycle.ViewModelProvider;
+import androidx.navigation.fragment.NavHostFragment;
+
+import com.m2049r.xmrwallet.R;
+import com.m2049r.xmrwallet.model.Wallet;
+
+public class SettingsFragment extends Fragment {
+
+ private SettingsViewModel mViewModel;
+
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.fragment_settings, container, false);
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ mViewModel = new ViewModelProvider(this).get(SettingsViewModel.class);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/settings/SettingsViewModel.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/settings/SettingsViewModel.java
new file mode 100644
index 0000000..58d27c6
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/settings/SettingsViewModel.java
@@ -0,0 +1,7 @@
+package com.m2049r.xmrwallet.fragment.settings;
+
+import androidx.lifecycle.ViewModel;
+
+public class SettingsViewModel extends ViewModel{
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/DiffCallback.java b/app/src/main/java/com/m2049r/xmrwallet/layout/DiffCallback.java
deleted file mode 100644
index 231f7c1..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/layout/DiffCallback.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2021 yorha-0x
- *
- * 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 androidx.recyclerview.widget.DiffUtil;
-
-import java.util.List;
-
-public abstract class DiffCallback extends DiffUtil.Callback {
-
- protected final List mOldList;
- protected final List mNewList;
-
- public DiffCallback(List oldList, List newList) {
- this.mOldList = oldList;
- this.mNewList = newList;
- }
-
- @Override
- public int getOldListSize() {
- return mOldList.size();
- }
-
- @Override
- public int getNewListSize() {
- return mNewList.size();
- }
-
- public abstract boolean areItemsTheSame(int oldItemPosition, int newItemPosition);
-
- public abstract boolean areContentsTheSame(int oldItemPosition, int newItemPosition);
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/NodeInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/layout/NodeInfoAdapter.java
deleted file mode 100644
index baae49e..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/layout/NodeInfoAdapter.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (c) 2018 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.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.FragmentActivity;
-import androidx.recyclerview.widget.DiffUtil;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.data.NodeInfo;
-import com.m2049r.xmrwallet.dialog.HelpFragment;
-import com.m2049r.xmrwallet.util.NetCipherHelper;
-
-import java.net.HttpURLConnection;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-public class NodeInfoAdapter extends RecyclerView.Adapter {
- public interface OnInteractionListener {
- void onInteraction(View view, NodeInfo item);
-
- boolean onLongInteraction(View view, NodeInfo item);
- }
-
- private final List nodeItems = new ArrayList<>();
- private final OnInteractionListener listener;
-
- private final FragmentActivity activity;
-
- public NodeInfoAdapter(FragmentActivity activity, OnInteractionListener listener) {
- this.activity = activity;
- this.listener = listener;
- }
-
- public void notifyItemChanged(NodeInfo nodeInfo) {
- final int pos = nodeItems.indexOf(nodeInfo);
- if (pos >= 0) notifyItemChanged(pos);
- }
-
- private static class NodeDiff extends DiffCallback {
-
- public NodeDiff(List oldList, List newList) {
- super(oldList, newList);
- }
-
- @Override
- public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
- return mOldList.get(oldItemPosition).equals(mNewList.get(newItemPosition));
- }
-
- @Override
- public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
- final NodeInfo oldItem = mOldList.get(oldItemPosition);
- final NodeInfo newItem = mNewList.get(newItemPosition);
- return (oldItem.getTimestamp() == newItem.getTimestamp())
- && (oldItem.isTested() == newItem.isTested())
- && (oldItem.isValid() == newItem.isValid())
- && (oldItem.getResponseTime() == newItem.getResponseTime())
- && (oldItem.isSelected() == newItem.isSelected())
- && (oldItem.getName().equals(newItem.getName()));
- }
- }
-
- @Override
- public @NonNull
- ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
- View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_node, parent, false);
- return new ViewHolder(view);
- }
-
- @Override
- public void onBindViewHolder(final @NonNull ViewHolder holder, int position) {
- holder.bind(position);
- }
-
- @Override
- public int getItemCount() {
- return nodeItems.size();
- }
-
- public void addNode(NodeInfo node) {
- List newItems = new ArrayList<>(nodeItems);
- if (!nodeItems.contains(node))
- newItems.add(node);
- setNodes(newItems); // in case the nodeinfo has changed
- }
-
- public void setNodes(Collection newItemsCollection) {
- List newItems;
- if (newItemsCollection != null) {
- newItems = new ArrayList<>(newItemsCollection);
- Collections.sort(newItems, NodeInfo.BestNodeComparator);
- } else {
- newItems = new ArrayList<>();
- }
- final NodeInfoAdapter.NodeDiff diffCallback = new NodeInfoAdapter.NodeDiff(nodeItems, newItems);
- final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback);
- nodeItems.clear();
- nodeItems.addAll(newItems);
- diffResult.dispatchUpdatesTo(this);
- }
-
- public void setNodes() {
- setNodes(nodeItems);
- }
-
- private boolean itemsClickable = true;
-
- public void allowClick(boolean clickable) {
- itemsClickable = clickable;
- notifyDataSetChanged();
- }
-
- class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
- final ImageButton ibBookmark;
- final View pbBookmark;
- final TextView tvName;
- final TextView tvInfo;
- final ImageView ivPing;
- NodeInfo nodeItem;
-
- ViewHolder(View itemView) {
- super(itemView);
- ibBookmark = itemView.findViewById(R.id.ibBookmark);
- pbBookmark = itemView.findViewById(R.id.pbBookmark);
- tvName = itemView.findViewById(R.id.tvName);
- tvInfo = itemView.findViewById(R.id.tvInfo);
- ivPing = itemView.findViewById(R.id.ivPing);
- ibBookmark.setOnClickListener(v -> {
- nodeItem.toggleFavourite();
- showStar();
- if (!nodeItem.isFavourite()) {
- nodeItem.setSelected(false);
- setNodes(nodeItems);
- }
- });
- itemView.setOnClickListener(this);
- itemView.setOnLongClickListener(this);
- }
-
- private void showStar() {
- if (nodeItem.isFavourite()) {
- ibBookmark.setImageResource(R.drawable.ic_favorite_24dp);
- } else {
- ibBookmark.setImageResource(R.drawable.ic_favorite_border_24dp);
- }
- }
-
- void bind(int position) {
- nodeItem = nodeItems.get(position);
- tvName.setText(nodeItem.getName());
- ivPing.setImageResource(getPingIcon(nodeItem));
- if (nodeItem.isTested()) {
- if (nodeItem.isValid()) {
- nodeItem.showInfo(tvInfo);
- } else {
- nodeItem.showInfo(tvInfo, getResponseErrorText(activity, nodeItem.getResponseCode()), true);
- }
- } else {
- nodeItem.showInfo(tvInfo);
- }
- itemView.setSelected(nodeItem.isSelected());
- itemView.setClickable(itemsClickable);
- itemView.setEnabled(itemsClickable);
- ibBookmark.setClickable(itemsClickable);
- pbBookmark.setVisibility(nodeItem.isSelecting() ? View.VISIBLE : View.INVISIBLE);
- showStar();
- }
-
- @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
- final NodeInfo node = nodeItems.get(position);
- if (node.isOnion()) {
- switch (NetCipherHelper.getStatus()) {
- case NOT_INSTALLED:
- HelpFragment.display(activity.getSupportFragmentManager(), R.string.help_tor);
- return;
- case DISABLED:
- HelpFragment.display(activity.getSupportFragmentManager(), R.string.help_tor_enable);
- return;
- }
- }
- node.setSelecting(true);
- allowClick(false);
- listener.onInteraction(view, node);
- }
- }
- }
-
- @Override
- public boolean onLongClick(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
- return listener.onLongInteraction(view, nodeItems.get(position));
- }
- }
- return false;
- }
- }
-
- static public int getPingIcon(NodeInfo nodeInfo) {
- if (nodeInfo.isUnauthorized()) {
- return R.drawable.ic_wifi_lock;
- }
- if (nodeInfo.isValid()) {
- final double ping = nodeInfo.getResponseTime();
- if (ping < NodeInfo.PING_GOOD) {
- return R.drawable.ic_wifi_4_bar;
- } else if (ping < NodeInfo.PING_MEDIUM) {
- return R.drawable.ic_wifi_3_bar;
- } else if (ping < NodeInfo.PING_BAD) {
- return R.drawable.ic_wifi_2_bar;
- } else {
- return R.drawable.ic_wifi_1_bar;
- }
- } else {
- return R.drawable.ic_wifi_off;
- }
- }
-
- static public String getResponseErrorText(Context ctx, int responseCode) {
- if (responseCode == 0) {
- return ctx.getResources().getString(R.string.node_general_error);
- } else if (responseCode == HttpURLConnection.HTTP_UNAUTHORIZED) {
- return ctx.getResources().getString(R.string.node_auth_error);
- } else if (responseCode == 418) {
- return ctx.getResources().getString(R.string.node_tor_error);
- } else {
- return ctx.getResources().getString(R.string.node_test_error, responseCode);
- }
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/SpendViewPager.java b/app/src/main/java/com/m2049r/xmrwallet/layout/SpendViewPager.java
deleted file mode 100644
index 71b7e0c..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/layout/SpendViewPager.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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 androidx.viewpager.widget.ViewPager;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-
-import com.m2049r.xmrwallet.fragment.send.SendFragment;
-
-public class SpendViewPager extends ViewPager {
-
- public interface OnValidateFieldsListener {
- boolean onValidateFields();
- }
-
- public SpendViewPager(Context context) {
- super(context);
- }
-
- public SpendViewPager(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public void next() {
- int pos = getCurrentItem();
- if (validateFields(pos)) {
- setCurrentItem(pos + 1);
- }
- }
-
- public void previous() {
- setCurrentItem(getCurrentItem() - 1);
- }
-
- private boolean allowSwipe = true;
-
- public void allowSwipe(boolean allow) {
- allowSwipe = allow;
- }
-
- public boolean validateFields(int position) {
- OnValidateFieldsListener c = ((SendFragment.SpendPagerAdapter) getAdapter()).getFragment(position);
- return c.onValidateFields();
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent event) {
- if (allowSwipe) return super.onInterceptTouchEvent(event);
- return false;
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- if (allowSwipe) return super.onTouchEvent(event);
- return false;
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/SubaddressInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/layout/SubaddressInfoAdapter.java
deleted file mode 100644
index 6dab349..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/layout/SubaddressInfoAdapter.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * 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.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.recyclerview.widget.DiffUtil;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.data.Subaddress;
-import com.m2049r.xmrwallet.util.Helper;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import timber.log.Timber;
-
-public class SubaddressInfoAdapter extends RecyclerView.Adapter {
- public interface OnInteractionListener {
- void onInteraction(View view, Subaddress item);
-
- boolean onLongInteraction(View view, Subaddress item);
- }
-
- private final List items;
- private final OnInteractionListener listener;
-
- Context context;
-
- public SubaddressInfoAdapter(Context context, OnInteractionListener listener) {
- this.context = context;
- this.items = new ArrayList<>();
- this.listener = listener;
- }
-
- private static class SubaddressInfoDiff extends DiffCallback {
-
- public SubaddressInfoDiff(List oldList, List newList) {
- super(oldList, newList);
- }
-
- @Override
- public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
- return mOldList.get(oldItemPosition).getAddress().equals(mNewList.get(newItemPosition).getAddress());
- }
-
- @Override
- public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
- return mOldList.get(oldItemPosition).equals(mNewList.get(newItemPosition));
- }
- }
-
- @NonNull
- @Override
- public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- View view = LayoutInflater.from(parent.getContext())
- .inflate(R.layout.item_subaddress, parent, false);
- return new ViewHolder(view);
- }
-
- @Override
- public void onBindViewHolder(final ViewHolder holder, int position) {
- holder.bind(position);
- }
-
- @Override
- public int getItemCount() {
- return items.size();
- }
-
- public Subaddress getItem(int position) {
- return items.get(position);
- }
-
- public void setInfos(List newItems) {
- if (newItems == null) {
- newItems = new ArrayList<>();
- Timber.d("setInfos null");
- } else {
- Timber.d("setInfos %s", newItems.size());
- }
- Collections.sort(newItems);
- final DiffCallback diffCallback = new SubaddressInfoDiff(items, newItems);
- final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback);
- items.clear();
- items.addAll(newItems);
- diffResult.dispatchUpdatesTo(this);
- }
-
- class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
- final TextView tvName;
- final TextView tvAddress;
- final TextView tvAmount;
- Subaddress item;
-
- ViewHolder(View itemView) {
- super(itemView);
- tvName = itemView.findViewById(R.id.tvName);
- tvAddress = itemView.findViewById(R.id.tvAddress);
- tvAmount = itemView.findViewById(R.id.tx_amount);
- itemView.setOnClickListener(this);
- itemView.setOnLongClickListener(this);
- }
-
- void bind(int position) {
- item = getItem(position);
- itemView.setTransitionName(context.getString(R.string.subaddress_item_transition_name, item.getAddressIndex()));
-
- final String label = item.getDisplayLabel();
- final String address = context.getString(R.string.subbaddress_info_subtitle,
- item.getAddressIndex(), item.getSquashedAddress());
- tvName.setText(label.isEmpty() ? address : label);
- tvAddress.setText(address);
- final long amount = item.getAmount();
- if (amount > 0)
- tvAmount.setText(context.getString(R.string.tx_list_amount_positive,
- Helper.getDisplayAmount(amount, Helper.DISPLAY_DIGITS_INFO)));
- else
- tvAmount.setText("");
- }
-
- @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, getItem(position));
- }
- }
- }
-
- @Override
- public boolean onLongClick(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
- return listener.onLongInteraction(view, getItem(position));
- }
- }
- return true;
- }
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java
deleted file mode 100644
index c4ce06e..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * 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.text.Html;
-import android.text.Spanned;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.core.content.ContextCompat;
-import androidx.recyclerview.widget.DiffUtil;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.google.android.material.progressindicator.CircularProgressIndicator;
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.data.Crypto;
-import com.m2049r.xmrwallet.data.UserNotes;
-import com.m2049r.xmrwallet.model.TransactionInfo;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.ThemeHelper;
-
-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.Objects;
-import java.util.TimeZone;
-
-import timber.log.Timber;
-
-public class TransactionInfoAdapter extends RecyclerView.Adapter {
- private final static SimpleDateFormat DATETIME_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm");
-
- private final int outboundColour;
- private final int inboundColour;
- private final int pendingColour;
- private final int failedColour;
-
- public interface OnInteractionListener {
- void onInteraction(View view, TransactionInfo item);
- }
-
- private final List infoItems;
- private final OnInteractionListener listener;
-
- private final Context context;
-
- public TransactionInfoAdapter(Context context, OnInteractionListener listener) {
- this.context = context;
- inboundColour = ThemeHelper.getThemedColor(context, R.attr.positiveColor);
- outboundColour = ThemeHelper.getThemedColor(context, R.attr.negativeColor);
- pendingColour = ThemeHelper.getThemedColor(context, R.attr.neutralColor);
- failedColour = ThemeHelper.getThemedColor(context, R.attr.neutralColor);
- infoItems = new ArrayList<>();
- this.listener = listener;
- Calendar cal = Calendar.getInstance();
- TimeZone tz = cal.getTimeZone(); //get the local time zone.
- DATETIME_FORMATTER.setTimeZone(tz);
- }
-
- public boolean needsTransactionUpdateOnNewBlock() {
- return (infoItems.size() > 0) && !infoItems.get(0).isConfirmed();
- }
-
- private static class TransactionInfoDiff extends DiffCallback {
-
- public TransactionInfoDiff(List oldList, List newList) {
- super(oldList, newList);
- }
-
- @Override
- public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
- return mOldList.get(oldItemPosition).hash.equals(mNewList.get(newItemPosition).hash);
- }
-
- @Override
- public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
- final TransactionInfo oldItem = mOldList.get(oldItemPosition);
- final TransactionInfo newItem = mNewList.get(newItemPosition);
- return (oldItem.direction == newItem.direction)
- && (oldItem.isPending == newItem.isPending)
- && (oldItem.isFailed == newItem.isFailed)
- && ((oldItem.confirmations == newItem.confirmations) || (oldItem.isConfirmed()))
- && (oldItem.subaddressLabel.equals(newItem.subaddressLabel))
- && (Objects.equals(oldItem.notes, newItem.notes));
- }
- }
-
- @NonNull
- @Override
- public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_transaction, 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 void setInfos(List newItems) {
- if (newItems == null) {
- newItems = new ArrayList<>();
- Timber.d("setInfos null");
- } else {
- Timber.d("setInfos %s", newItems.size());
- }
- Collections.sort(newItems);
- final DiffCallback diffCallback = new TransactionInfoAdapter.TransactionInfoDiff(infoItems, newItems);
- final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback);
- infoItems.clear();
- infoItems.addAll(newItems);
- diffResult.dispatchUpdatesTo(this);
- }
-
- public void removeItem(int position) {
- List newItems = new ArrayList<>(infoItems);
- if (newItems.size() > position)
- newItems.remove(position);
- setInfos(newItems); // in case the nodeinfo has changed
- }
-
- public TransactionInfo getItem(int position) {
- return infoItems.get(position);
- }
-
- class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
- final ImageView ivTxType;
- final TextView tvAmount;
- final TextView tvFailed;
- final TextView tvPaymentId;
- final TextView tvDateTime;
- final CircularProgressIndicator pbConfirmations;
- final TextView tvConfirmations;
- TransactionInfo infoItem;
-
- ViewHolder(View itemView) {
- super(itemView);
- ivTxType = itemView.findViewById(R.id.ivTxType);
- tvAmount = itemView.findViewById(R.id.tx_amount);
- tvFailed = itemView.findViewById(R.id.tx_failed);
- tvPaymentId = itemView.findViewById(R.id.tx_paymentid);
- tvDateTime = itemView.findViewById(R.id.tx_datetime);
- pbConfirmations = itemView.findViewById(R.id.pbConfirmations);
- pbConfirmations.setMax(TransactionInfo.CONFIRMATION);
- tvConfirmations = itemView.findViewById(R.id.tvConfirmations);
- }
-
- private String getDateTime(long time) {
- return DATETIME_FORMATTER.format(new Date(time * 1000));
- }
-
- private void setTxColour(int clr) {
- tvAmount.setTextColor(clr);
- }
-
- void bind(int position) {
- infoItem = infoItems.get(position);
- itemView.setTransitionName(context.getString(R.string.tx_item_transition_name, infoItem.hash));
-
- UserNotes userNotes = new UserNotes(infoItem.notes);
- if (userNotes.xmrtoKey != null) {
- final Crypto crypto = Crypto.withSymbol(userNotes.xmrtoCurrency);
- if (crypto != null) {
- ivTxType.setImageResource(crypto.getIconEnabledId());
- ivTxType.setVisibility(View.VISIBLE);
- } else {// otherwirse pretend we don't know it's a shift
- ivTxType.setVisibility(View.GONE);
- }
- } else {
- ivTxType.setVisibility(View.GONE);
- }
-
- String displayAmount = Helper.getDisplayAmount(infoItem.amount, Helper.DISPLAY_DIGITS_INFO);
- if (infoItem.direction == TransactionInfo.Direction.Direction_Out) {
- tvAmount.setText(context.getString(R.string.tx_list_amount_negative, displayAmount));
- } else {
- tvAmount.setText(context.getString(R.string.tx_list_amount_positive, displayAmount));
- }
-
- tvFailed.setVisibility(View.GONE);
- if (infoItem.isFailed) {
- this.tvAmount.setText(context.getString(R.string.tx_list_amount_failed, displayAmount));
- tvFailed.setVisibility(View.VISIBLE);
- setTxColour(failedColour);
- pbConfirmations.setVisibility(View.GONE);
- tvConfirmations.setVisibility(View.GONE);
- } else if (infoItem.isPending) {
- setTxColour(pendingColour);
- pbConfirmations.setVisibility(View.GONE);
- pbConfirmations.setIndeterminate(true);
- pbConfirmations.setVisibility(View.VISIBLE);
- tvConfirmations.setVisibility(View.GONE);
- } else if (infoItem.direction == TransactionInfo.Direction.Direction_In) {
- setTxColour(inboundColour);
- if (!infoItem.isConfirmed()) {
- pbConfirmations.setVisibility(View.VISIBLE);
- final int confirmations = (int) infoItem.confirmations;
- pbConfirmations.setProgressCompat(confirmations, true);
- final String confCount = Integer.toString(confirmations);
- tvConfirmations.setText(confCount);
- if (confCount.length() == 1) // we only have space for character in the progress circle
- tvConfirmations.setVisibility(View.VISIBLE);
- else
- tvConfirmations.setVisibility(View.GONE);
- } else {
- pbConfirmations.setVisibility(View.GONE);
- tvConfirmations.setVisibility(View.GONE);
- }
- } else {
- setTxColour(outboundColour);
- pbConfirmations.setVisibility(View.GONE);
- tvConfirmations.setVisibility(View.GONE);
- }
-
- String tag = null;
- String info = "";
- if ((infoItem.addressIndex != 0) && (infoItem.direction == TransactionInfo.Direction.Direction_In))
- tag = infoItem.getDisplayLabel();
- if ((userNotes.note.isEmpty())) {
- if (!infoItem.paymentId.equals("0000000000000000")) {
- info = infoItem.paymentId;
- }
- } else {
- info = userNotes.note;
- }
- if (tag == null) {
- tvPaymentId.setText(info);
- } else {
- Spanned label = Html.fromHtml(context.getString(R.string.tx_details_notes,
- Integer.toHexString(ThemeHelper.getThemedColor(context, R.attr.positiveColor) & 0xFFFFFF),
- Integer.toHexString(ThemeHelper.getThemedColor(context, android.R.attr.colorBackground) & 0xFFFFFF),
- tag, info.isEmpty() ? "" : (" " + info)));
- tvPaymentId.setText(label);
- }
-
- this.tvDateTime.setText(getDateTime(infoItem.timestamp));
-
- itemView.setOnClickListener(this);
- }
-
- @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/layout/WalletInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/layout/WalletInfoAdapter.java
deleted file mode 100644
index ad885e7..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/layout/WalletInfoAdapter.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * 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.view.LayoutInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageButton;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.appcompat.widget.PopupMenu;
-import androidx.recyclerview.widget.DiffUtil;
-import androidx.recyclerview.widget.RecyclerView;
-
-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;
-
-import timber.log.Timber;
-
-public class WalletInfoAdapter extends RecyclerView.Adapter {
-
- 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 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);
- }
-
- private static class WalletInfoDiff extends DiffCallback {
-
- public WalletInfoDiff(List oldList, List newList) {
- super(oldList, newList);
- }
-
- @Override
- public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
- return mOldList.get(oldItemPosition).getName().equals(mNewList.get(newItemPosition).getName());
- }
-
- @Override
- public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
- return mOldList.get(oldItemPosition).compareTo(mNewList.get(newItemPosition)) == 0;
- }
- }
-
- @NonNull
- @Override
- public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- return new ViewHolder(
- LayoutInflater.from(parent.getContext()).inflate(R.layout.item_wallet, parent, false)
- );
- }
-
- @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 newItems) {
- if (newItems == null) {
- newItems = new ArrayList<>();
- Timber.d("setInfos null");
- } else {
- Timber.d("setInfos %s", newItems.size());
- }
- Collections.sort(newItems);
- final DiffCallback diffCallback = new WalletInfoAdapter.WalletInfoDiff(infoItems, newItems);
- final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback);
- infoItems.clear();
- infoItems.addAll(newItems);
- diffResult.dispatchUpdatesTo(this);
- }
-
- class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
- final TextView tvName;
- final ImageButton ibOptions;
- WalletManager.WalletInfo infoItem;
- boolean popupOpen = false;
-
- ViewHolder(View itemView) {
- super(itemView);
- tvName = itemView.findViewById(R.id.tvName);
- ibOptions = itemView.findViewById(R.id.ibOptions);
- ibOptions.setOnClickListener(view -> {
- if (popupOpen) return;
- //creating a popup menu
- PopupMenu popup = new PopupMenu(context, ibOptions);
- //inflating menu from xml resource
- popup.inflate(R.menu.list_context_menu);
- popupOpen = true;
- //adding click listener
- popup.setOnMenuItemClickListener(item -> {
- if (listener != null) {
- return listener.onContextInteraction(item, infoItem);
- }
- return false;
- });
- //displaying the popup
- popup.show();
- popup.setOnDismissListener(menu -> popupOpen = false);
-
- });
- 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.getName());
- }
-
- @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/ledger/LedgerProgressDialog.java b/app/src/main/java/com/m2049r/xmrwallet/ledger/LedgerProgressDialog.java
deleted file mode 100644
index 0c81cb2..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/ledger/LedgerProgressDialog.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (c) 2018 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.ledger;
-
-import android.content.Context;
-import android.os.Handler;
-import android.os.Looper;
-
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.dialog.ProgressDialog;
-
-import timber.log.Timber;
-
-public class LedgerProgressDialog extends ProgressDialog implements Ledger.Listener {
-
- static public final int TYPE_DEBUG = 0;
- static public final int TYPE_RESTORE = 1;
- static public final int TYPE_SUBADDRESS = 2;
- static public final int TYPE_ACCOUNT = 3;
- static public final int TYPE_SEND = 4;
-
- private final int type;
- private Handler uiHandler = new Handler(Looper.getMainLooper());
-
- public LedgerProgressDialog(Context context, int type) {
- super(context);
- this.type = type;
- setCancelable(false);
- if (type == TYPE_SEND)
- setMessage(context.getString(R.string.info_prepare_tx));
- else
- setMessage(context.getString(R.string.progress_ledger_progress));
- }
-
- @Override
- public void onBackPressed() {
- // prevent back button
- }
-
- private int firstSubaddress = Integer.MAX_VALUE;
-
- private boolean validate = false;
- private boolean validated = false;
-
- @Override
- public void onInstructionSend(final Instruction ins, final byte[] apdu) {
- Timber.d("LedgerProgressDialog SEND %s", ins);
- uiHandler.post(new Runnable() {
- @Override
- public void run() {
- if (type > TYPE_DEBUG) {
- validate = false;
- switch (ins) {
- case INS_RESET: // ledger may ask for confirmation - maybe a bug?
- case INS_GET_KEY: // ledger asks for confirmation to send keys
- case INS_DISPLAY_ADDRESS:
- setIndeterminate(true);
- setMessage(getContext().getString(R.string.progress_ledger_confirm));
- break;
- case INS_GET_SUBADDRESS_SPEND_PUBLIC_KEY: // lookahead
- //00 4a 00 00 09 00 01000000 30000000
- // 0 1 2 3 4 5 6 7 8 9 a b c d
- int account = bytesToInteger(apdu, 6);
- int subaddress = bytesToInteger(apdu, 10);
- Timber.d("fetching subaddress (%d, %d)", account, subaddress);
- switch (type) {
- case TYPE_RESTORE:
- setProgress(account * Ledger.LOOKAHEAD_SUBADDRESSES + subaddress + 1,
- Ledger.LOOKAHEAD_ACCOUNTS * Ledger.LOOKAHEAD_SUBADDRESSES);
- setIndeterminate(false);
- break;
- case TYPE_ACCOUNT:
- final int requestedSubaddress = account * Ledger.LOOKAHEAD_SUBADDRESSES + subaddress;
- if (firstSubaddress > requestedSubaddress) {
- firstSubaddress = requestedSubaddress;
- }
- setProgress(requestedSubaddress - firstSubaddress + 1,
- Ledger.LOOKAHEAD_ACCOUNTS * Ledger.LOOKAHEAD_SUBADDRESSES);
- setIndeterminate(false);
- break;
- case TYPE_SUBADDRESS:
- if (firstSubaddress > subaddress) {
- firstSubaddress = subaddress;
- }
- setProgress(subaddress - firstSubaddress + 1, Ledger.LOOKAHEAD_SUBADDRESSES);
- setIndeterminate(false);
- break;
- default:
- setIndeterminate(true);
- break;
- }
- setMessage(getContext().getString(R.string.progress_ledger_lookahead));
- break;
- case INS_VERIFY_KEY:
- setIndeterminate(true);
- setMessage(getContext().getString(R.string.progress_ledger_verify));
- break;
- case INS_OPEN_TX:
- setIndeterminate(true);
- setMessage(getContext().getString(R.string.progress_ledger_opentx));
- break;
- case INS_MLSAG:
- if (validated) {
- setIndeterminate(true);
- setMessage(getContext().getString(R.string.progress_ledger_mlsag));
- }
- break;
- case INS_PREFIX_HASH:
- if ((apdu[2] != 1) || (apdu[3] != 0)) break;
- setIndeterminate(true);
- setMessage(getContext().getString(R.string.progress_ledger_confirm));
- break;
- case INS_VALIDATE:
- if ((apdu[2] != 1) || (apdu[3] != 1)) break;
- validate = true;
- uiHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- if (validate) {
- setIndeterminate(true);
- setMessage(getContext().getString(R.string.progress_ledger_confirm));
- validated = true;
- }
- }
- }, 250);
- break;
- default:
- // ignore others and maintain state
- }
- } else {
- setMessage(ins.name());
- }
- }
- });
- }
-
- @Override
- public void onInstructionReceive(final Instruction ins, final byte[] data) {
- Timber.d("LedgerProgressDialog RECV %s", ins);
- uiHandler.post(new Runnable() {
- @Override
- public void run() {
- if (type > TYPE_DEBUG) {
- switch (ins) {
- case INS_GET_SUBADDRESS_SPEND_PUBLIC_KEY: // lookahead
- case INS_VERIFY_KEY:
- case INS_GET_CHACHA8_PREKEY:
- break;
- default:
- if (type != TYPE_SEND)
- setMessage(getContext().getString(R.string.progress_ledger_progress));
- }
- } else {
- setMessage("Returned from " + ins.name());
- }
- }
- });
- }
-
- // TODO: we use ints in Java but the are signed; accounts & subaddresses are unsigned ...
- private int bytesToInteger(byte[] bytes, int offset) {
- int result = 0;
- for (int i = 3; i >= 0; i--) {
- result <<= 8;
- result |= (bytes[offset + i] & 0xFF);
- }
- return result;
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/livedata/SingleLiveEvent.java b/app/src/main/java/com/m2049r/xmrwallet/livedata/SingleLiveEvent.java
new file mode 100644
index 0000000..8ecbcea
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/livedata/SingleLiveEvent.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * 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.livedata;
+
+import android.util.Log;
+
+import androidx.annotation.MainThread;
+import androidx.annotation.Nullable;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.MutableLiveData;
+import androidx.lifecycle.Observer;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * A lifecycle-aware observable that sends only new updates after subscription, used for events like
+ * navigation and Snackbar messages.
+ *
+ * This avoids a common problem with events: on configuration change (like rotation) an update
+ * can be emitted if the observer is active. This LiveData only calls the observable if there's an
+ * explicit call to setValue() or call().
+ *
+ * Note that only one observer is going to be notified of changes.
+ */
+public class SingleLiveEvent extends MutableLiveData {
+
+ private static final String TAG = "SingleLiveEvent";
+
+ private final AtomicBoolean mPending = new AtomicBoolean(false);
+
+ @MainThread
+ @Override
+ public void observe(LifecycleOwner owner, final Observer super T> observer) {
+
+ if (hasActiveObservers()) {
+ Log.w(TAG, "Multiple observers registered but only one will be notified of changes.");
+ }
+
+ // Observe the internal MutableLiveData
+ super.observe(owner, new Observer() {
+ @Override
+ public void onChanged(@Nullable T t) {
+ if (mPending.compareAndSet(true, false)) {
+ observer.onChanged(t);
+ }
+ }
+ });
+ }
+
+ @MainThread
+ public void setValue(@Nullable T t) {
+ mPending.set(true);
+ super.setValue(t);
+ }
+
+ /**
+ * Used for cases where T is Void, to make calls cleaner.
+ */
+ @MainThread
+ public void call() {
+ setValue(null);
+ }
+}
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 f5aa743..2257140 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java
@@ -16,7 +16,6 @@
package com.m2049r.xmrwallet.model;
-import com.m2049r.xmrwallet.XmrWalletApplication;
import com.m2049r.xmrwallet.data.Node;
import com.m2049r.xmrwallet.ledger.Ledger;
import com.m2049r.xmrwallet.util.RestoreHeight;
@@ -25,7 +24,6 @@ import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Calendar;
-import java.util.Date;
import java.util.List;
import lombok.Getter;
@@ -248,7 +246,7 @@ public class WalletManager {
//TODO virtual bool checkPayment(const std::string &address, const std::string &txid, const std::string &txkey, const std::string &daemon_address, uint64_t &received, uint64_t &height, std::string &error) const = 0;
private String daemonAddress = null;
- private final NetworkType networkType = XmrWalletApplication.getNetworkType();
+ private final NetworkType networkType = NetworkType.NetworkType_Mainnet;
public NetworkType getNetworkType() {
return networkType;
diff --git a/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingActivity.java b/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingActivity.java
deleted file mode 100644
index c2793a1..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingActivity.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2018-2020 EarlOfEgo, 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.onboarding;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.TypedValue;
-import android.view.View;
-import android.widget.Button;
-import android.widget.LinearLayout;
-
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.viewpager.widget.ViewPager;
-
-import com.google.android.material.tabs.TabLayout;
-import com.m2049r.xmrwallet.LoginActivity;
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.util.KeyStoreHelper;
-
-public class OnBoardingActivity extends AppCompatActivity implements OnBoardingAdapter.Listener {
-
- private OnBoardingViewPager pager;
- private OnBoardingAdapter pagerAdapter;
- private Button nextButton;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_on_boarding);
-
- nextButton = findViewById(R.id.buttonNext);
-
- pager = findViewById(R.id.pager);
- pagerAdapter = new OnBoardingAdapter(this, this);
- pager.setAdapter(pagerAdapter);
- int pixels = (int) TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics());
- pager.setPageMargin(pixels);
- pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
- @Override
- public void onPageSelected(int position) {
- setButtonState(position);
- }
- });
-
- final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
- if (pagerAdapter.getCount() > 1) {
- tabLayout.setupWithViewPager(pager, true);
- LinearLayout tabStrip = ((LinearLayout) tabLayout.getChildAt(0));
- for (int i = 0; i < tabStrip.getChildCount(); i++) {
- tabStrip.getChildAt(i).setClickable(false);
- }
- } else {
- tabLayout.setVisibility(View.GONE);
- }
-
- nextButton.setOnClickListener(v -> {
- final int item = pager.getCurrentItem();
- if (item + 1 >= pagerAdapter.getCount()) {
- finishOnboarding();
- } else {
- pager.setCurrentItem(item + 1);
- }
- });
-
- // let old users who have fingerprint wallets already agree for fingerprint sending
- OnBoardingScreen.FPSEND.setMustAgree(KeyStoreHelper.hasStoredPasswords(this));
-
- for (int i = 0; i < OnBoardingScreen.values().length; i++) {
- agreed[i] = !OnBoardingScreen.values()[i].isMustAgree();
- }
-
- setButtonState(0);
- }
-
- private void finishOnboarding() {
- nextButton.setEnabled(false);
- OnBoardingManager.setOnBoardingShown(getApplicationContext());
- startActivity(new Intent(this, LoginActivity.class));
- finish();
- }
-
- boolean[] agreed = new boolean[OnBoardingScreen.values().length];
-
- @Override
- public void setAgreeClicked(int position, boolean isChecked) {
- agreed[position] = isChecked;
- setButtonState(position);
- }
-
- @Override
- public boolean isAgreeClicked(int position) {
- return agreed[position];
- }
-
- @Override
- public void setButtonState(int position) {
- nextButton.setEnabled(agreed[position]);
- if (nextButton.isEnabled())
- pager.setAllowedSwipeDirection(OnBoardingViewPager.SwipeDirection.ALL);
- else
- pager.setAllowedSwipeDirection(OnBoardingViewPager.SwipeDirection.LEFT);
- if (pager.getCurrentItem() + 1 == pagerAdapter.getCount()) { // last page
- nextButton.setText(R.string.onboarding_button_ready);
- } else {
- nextButton.setText(R.string.onboarding_button_next);
- }
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingAdapter.java
deleted file mode 100644
index adfc7d9..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingAdapter.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2018-2020 EarlOfEgo, 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.onboarding;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.CheckBox;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.core.content.ContextCompat;
-import androidx.viewpager.widget.PagerAdapter;
-
-import com.m2049r.xmrwallet.R;
-
-import timber.log.Timber;
-
-public class OnBoardingAdapter extends PagerAdapter {
-
- interface Listener {
- void setAgreeClicked(int position, boolean isChecked);
-
- boolean isAgreeClicked(int position);
-
- void setButtonState(int position);
- }
-
- private final Context context;
- private Listener listener;
-
- OnBoardingAdapter(final Context context, final Listener listener) {
- this.context = context;
- this.listener = listener;
- }
-
- @NonNull
- @Override
- public Object instantiateItem(@NonNull ViewGroup collection, int position) {
- LayoutInflater inflater = LayoutInflater.from(context);
- final View view = inflater.inflate(R.layout.view_onboarding, collection, false);
- final OnBoardingScreen onBoardingScreen = OnBoardingScreen.values()[position];
-
- final Drawable drawable = ContextCompat.getDrawable(context, onBoardingScreen.getDrawable());
- ((ImageView) view.findViewById(R.id.onboardingImage)).setImageDrawable(drawable);
- ((TextView) view.findViewById(R.id.onboardingTitle)).setText(onBoardingScreen.getTitle());
- ((TextView) view.findViewById(R.id.onboardingInformation)).setText(onBoardingScreen.getInformation());
- if (onBoardingScreen.isMustAgree()) {
- final CheckBox agree = ((CheckBox) view.findViewById(R.id.onboardingAgree));
- agree.setVisibility(View.VISIBLE);
- agree.setChecked(listener.isAgreeClicked(position));
- agree.setOnClickListener(v -> {
- listener.setAgreeClicked(position, ((CheckBox) v).isChecked());
- });
- }
- collection.addView(view);
- return view;
- }
-
- @Override
- public int getCount() {
- return OnBoardingScreen.values().length;
- }
-
- @Override
- public void destroyItem(@NonNull ViewGroup collection, int position, @NonNull Object view) {
- Timber.d("destroy " + position);
- collection.removeView((View) view);
- }
-
- @Override
- public boolean isViewFromObject(@NonNull final View view, @NonNull final Object object) {
- return view == object;
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingManager.java b/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingManager.java
deleted file mode 100644
index eb28331..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingManager.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2018-2020 EarlOfEgo, 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.onboarding;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-
-import com.m2049r.xmrwallet.util.KeyStoreHelper;
-
-import java.util.Date;
-
-import timber.log.Timber;
-
-public class OnBoardingManager {
-
- private static final String PREFS_ONBOARDING = "PREFS_ONBOARDING";
- private static final String ONBOARDING_SHOWN = "ONBOARDING_SHOWN";
-
- public static boolean shouldShowOnBoarding(final Context context) {
- return !getSharedPreferences(context).contains(ONBOARDING_SHOWN);
- }
-
- public static void setOnBoardingShown(final Context context) {
- Timber.d("Set onboarding shown.");
- SharedPreferences sharedPreferences = getSharedPreferences(context);
- sharedPreferences.edit().putLong(ONBOARDING_SHOWN, new Date().getTime()).apply();
- }
-
- public static void clearOnBoardingShown(final Context context) {
- SharedPreferences sharedPreferences = getSharedPreferences(context);
- sharedPreferences.edit().remove(ONBOARDING_SHOWN).apply();
- }
-
- private static SharedPreferences getSharedPreferences(final Context context) {
- return context.getSharedPreferences(PREFS_ONBOARDING, Context.MODE_PRIVATE);
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingScreen.java b/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingScreen.java
deleted file mode 100644
index c6227d5..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingScreen.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2018-2020 EarlOfEgo, 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.onboarding;
-
-import com.m2049r.xmrwallet.R;
-
-enum OnBoardingScreen {
- WELCOME(R.string.onboarding_welcome_title, R.string.onboarding_welcome_information, R.drawable.ic_onboarding_welcome, false),
- SEED(R.string.onboarding_seed_title, R.string.onboarding_seed_information, R.drawable.ic_onboarding_seed, true),
- FPSEND(R.string.onboarding_fpsend_title, R.string.onboarding_fpsend_information, R.drawable.ic_onboarding_fingerprint, false),
- XMRTO(R.string.onboarding_xmrto_title, R.string.onboarding_xmrto_information, R.drawable.ic_onboarding_xmrto, false),
- NODES(R.string.onboarding_nodes_title, R.string.onboarding_nodes_information, R.drawable.ic_onboarding_nodes, false);
-
- private final int title;
- private final int information;
- private final int drawable;
- private boolean mustAgree;
-
- OnBoardingScreen(final int title, final int information, final int drawable, final boolean mustAgree) {
- this.title = title;
- this.information = information;
- this.drawable = drawable;
- this.mustAgree = mustAgree;
- }
-
- public int getTitle() {
- return title;
- }
-
- public int getInformation() {
- return information;
- }
-
- public int getDrawable() {
- return drawable;
- }
-
- public boolean isMustAgree() {
- return mustAgree;
- }
-
- public boolean setMustAgree(boolean mustAgree) {
- return this.mustAgree = mustAgree;
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingViewPager.java b/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingViewPager.java
deleted file mode 100644
index 3e26352..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingViewPager.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2020 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://stackoverflow.com/a/34076649
-
-package com.m2049r.xmrwallet.onboarding;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-
-import androidx.viewpager.widget.ViewPager;
-
-public class OnBoardingViewPager extends ViewPager {
-
- public enum SwipeDirection {
- ALL, LEFT, RIGHT, NONE;
- }
-
- private float initialXValue;
- private SwipeDirection direction;
-
- public OnBoardingViewPager(Context context, AttributeSet attrs) {
- super(context, attrs);
- this.direction = SwipeDirection.ALL;
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- if (this.IsSwipeAllowed(event)) {
- return super.onTouchEvent(event);
- }
-
- return false;
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent event) {
- if (this.IsSwipeAllowed(event)) {
- return super.onInterceptTouchEvent(event);
- }
-
- return false;
- }
-
- private boolean IsSwipeAllowed(MotionEvent event) {
- if (this.direction == SwipeDirection.ALL) return true;
-
- if (direction == SwipeDirection.NONE)//disable any swipe
- return false;
-
- if (event.getAction() == MotionEvent.ACTION_DOWN) {
- initialXValue = event.getX();
- return true;
- }
-
- if (event.getAction() == MotionEvent.ACTION_MOVE) {
- float diffX = event.getX() - initialXValue;
- if (diffX > 0 && direction == SwipeDirection.RIGHT) {
- // swipe from left to right detected
- return false;
- } else if (diffX < 0 && direction == SwipeDirection.LEFT) {
- // swipe from right to left detected
- return false;
- }
- }
-
- return true;
- }
-
- public void setAllowedSwipeDirection(SwipeDirection direction) {
- this.direction = direction;
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/MoneroHandlerThread.java b/app/src/main/java/com/m2049r/xmrwallet/service/MoneroHandlerThread.java
index 79ac246..02b386f 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/service/MoneroHandlerThread.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/service/MoneroHandlerThread.java
@@ -22,140 +22,85 @@ import android.os.Looper;
import android.os.Message;
import android.os.Process;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+
+import com.m2049r.xmrwallet.data.DefaultNodes;
+import com.m2049r.xmrwallet.data.Node;
+import com.m2049r.xmrwallet.data.TxData;
+import com.m2049r.xmrwallet.fragment.home.HomeViewModel;
+import com.m2049r.xmrwallet.model.PendingTransaction;
+import com.m2049r.xmrwallet.model.Wallet;
+import com.m2049r.xmrwallet.model.WalletListener;
+import com.m2049r.xmrwallet.model.WalletManager;
+
/**
* Handy class for starting a new thread that has a looper. The looper can then be
* used to create handler classes. Note that start() must still be called.
* The started Thread has a stck size of STACK_SIZE (=5MB)
*/
-public class MoneroHandlerThread extends Thread {
+public class MoneroHandlerThread extends Thread implements WalletListener {
+ private Listener listener = null;
+ private Wallet wallet = null;
// from src/cryptonote_config.h
static public final long THREAD_STACK_SIZE = 5 * 1024 * 1024;
- private int mPriority;
- private int mTid = -1;
- private Looper mLooper;
- public MoneroHandlerThread(String name) {
+ public MoneroHandlerThread(String name, Wallet wallet, Listener listener) {
super(null, null, name, THREAD_STACK_SIZE);
- mPriority = Process.THREAD_PRIORITY_DEFAULT;
- }
-
- /**
- * Constructs a MoneroHandlerThread.
- *
- * @param name
- * @param priority The priority to run the thread at. The value supplied must be from
- * {@link android.os.Process} and not from java.lang.Thread.
- */
- MoneroHandlerThread(String name, int priority) {
- super(null, null, name, THREAD_STACK_SIZE);
- mPriority = priority;
- }
-
- /**
- * Call back method that can be explicitly overridden if needed to execute some
- * setup before Looper loops.
- */
-
- private void onLooperPrepared() {
+ this.wallet = wallet;
+ this.listener = listener;
+ this.listener.onRefresh();
}
@Override
public void run() {
- mTid = Process.myTid();
- Looper.prepare();
- synchronized (this) {
- mLooper = Looper.myLooper();
- notifyAll();
- }
- Process.setThreadPriority(mPriority);
- onLooperPrepared();
- Looper.loop();
- mTid = -1;
+ WalletManager.getInstance().setDaemon(Node.fromString(DefaultNodes.XMRTW.getUri()));
+ System.out.println(WalletManager.getInstance().getBlockchainHeight());
+ System.out.println(wallet.getSeed(""));
+ wallet.init(0);
+ wallet.setListener(this);
+ wallet.startRefresh();
}
- /**
- * This method returns the Looper associated with this thread. If this thread not been started
- * or for any reason is isAlive() returns false, this method will return null. If this thread
- * has been started, this method will block until the looper has been initialized.
- *
- * @return The looper.
- */
- Looper getLooper() {
- if (!isAlive()) {
- return null;
- }
+ @Override
+ public void moneySpent(String txId, long amount) {}
+ @Override
+ public void moneyReceived(String txId, long amount) {}
+ @Override
+ public void unconfirmedMoneyReceived(String txId, long amount) {}
- // If the thread has been started, wait until the looper has been created.
- synchronized (this) {
- while (isAlive() && mLooper == null) {
- try {
- wait();
- } catch (InterruptedException e) {
- }
- }
+ @Override
+ public void newBlock(long height) {
+ if(height % 1000 == 0) {
+ refresh();
}
- return mLooper;
}
- /**
- * Quits the handler thread's looper.
- *
- * Causes the handler thread's looper to terminate without processing any
- * more messages in the message queue.
- *
- * Any attempt to post messages to the queue after the looper is asked to quit will fail.
- * For example, the {@link Handler#sendMessage(Message)} method will return false.
- *
- * Using this method may be unsafe because some messages may not be delivered
- * before the looper terminates. Consider using {@link #quitSafely} instead to ensure
- * that all pending work is completed in an orderly manner.
- *
- *
- * @return True if the looper looper has been asked to quit or false if the
- * thread had not yet started running.
- * @see #quitSafely
- */
- public boolean quit() {
- Looper looper = getLooper();
- if (looper != null) {
- looper.quit();
- return true;
- }
- return false;
+ @Override
+ public void updated() {
+ refresh();
}
- /**
- * Quits the handler thread's looper safely.
- *
- * Causes the handler thread's looper to terminate as soon as all remaining messages
- * in the message queue that are already due to be delivered have been handled.
- * Pending delayed messages with due times in the future will not be delivered.
- *
- * Any attempt to post messages to the queue after the looper is asked to quit will fail.
- * For example, the {@link Handler#sendMessage(Message)} method will return false.
- *
- * If the thread has not been started or has finished (that is if
- * {@link #getLooper} returns null), then false is returned.
- * Otherwise the looper is asked to quit and true is returned.
- *
- *
- * @return True if the looper looper has been asked to quit or false if the
- * thread had not yet started running.
- */
- public boolean quitSafely() {
- Looper looper = getLooper();
- if (looper != null) {
- looper.quitSafely();
- return true;
- }
- return false;
+ @Override
+ public void refreshed() {
+ wallet.setSynchronized();
+ refresh();
}
- /**
- * Returns the identifier of this thread. See Process.myTid().
- */
- public int getThreadId() {
- return mTid;
+ private void refresh() {
+ wallet.refreshHistory();
+ wallet.store();
+ listener.onRefresh();
+ }
+
+ public boolean sendTx(String address, String amountStr) {
+ long amount = Wallet.getAmountFromString(amountStr);
+ PendingTransaction pendingTx = wallet.createTransaction(new TxData(address, amount, 0, PendingTransaction.Priority.Priority_Default));
+ return pendingTx.commit("", true);
+ }
+
+ public interface Listener {
+ void onRefresh();
}
}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/ServiceBase.java b/app/src/main/java/com/m2049r/xmrwallet/service/ServiceBase.java
new file mode 100644
index 0000000..7a663e3
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/service/ServiceBase.java
@@ -0,0 +1,21 @@
+package com.m2049r.xmrwallet.service;
+
+import com.m2049r.xmrwallet.MainActivity;
+
+public class ServiceBase {
+ private MainActivity mainActivity;
+ private MoneroHandlerThread thread;
+
+ public ServiceBase(MainActivity mainActivity, MoneroHandlerThread thread) {
+ this.mainActivity = mainActivity;
+ this.thread = thread;
+ }
+
+ public MainActivity getMainActivity() {
+ return mainActivity;
+ }
+
+ public MoneroHandlerThread getThread() {
+ return thread;
+ }
+}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/TxService.java b/app/src/main/java/com/m2049r/xmrwallet/service/TxService.java
new file mode 100644
index 0000000..e6e34bc
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/service/TxService.java
@@ -0,0 +1,26 @@
+package com.m2049r.xmrwallet.service;
+
+import com.m2049r.xmrwallet.MainActivity;
+import com.m2049r.xmrwallet.livedata.SingleLiveEvent;
+
+public class TxService extends ServiceBase {
+ public static TxService instance = null;
+ public static TxService getInstance() {
+ return instance;
+ }
+
+ private final SingleLiveEvent _clearSendEvent = new SingleLiveEvent();
+ public SingleLiveEvent clearSendEvent = _clearSendEvent;
+
+ public TxService(MainActivity mainActivity, MoneroHandlerThread thread) {
+ super(mainActivity, thread);
+ instance = this;
+ }
+
+ public void sendTx(String address, String amount) {
+ boolean success = this.getThread().sendTx(address, amount);
+ if(success) {
+ _clearSendEvent.call();
+ }
+ }
+}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java b/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java
deleted file mode 100644
index ece003e..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java
+++ /dev/null
@@ -1,595 +0,0 @@
-/*
- * 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.service;
-
-import android.app.Notification;
-import android.app.NotificationChannel;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Binder;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
-import android.os.Process;
-
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.core.app.NotificationCompat;
-
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.WalletActivity;
-import com.m2049r.xmrwallet.data.TxData;
-import com.m2049r.xmrwallet.model.PendingTransaction;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.model.WalletListener;
-import com.m2049r.xmrwallet.model.WalletManager;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.LocaleHelper;
-import com.m2049r.xmrwallet.util.NetCipherHelper;
-
-import timber.log.Timber;
-
-public class WalletService extends Service {
- public static boolean Running = false;
-
- final static int NOTIFICATION_ID = 2049;
- final static String CHANNEL_ID = "m_service";
-
- public static final String REQUEST_WALLET = "wallet";
- public static final String REQUEST = "request";
-
- public static final String REQUEST_CMD_LOAD = "load";
- public static final String REQUEST_CMD_LOAD_PW = "walletPassword";
-
- public static final String REQUEST_CMD_STORE = "store";
-
- public static final String REQUEST_CMD_TX = "createTX";
- public static final String REQUEST_CMD_TX_DATA = "data";
- public static final String REQUEST_CMD_TX_TAG = "tag";
-
- public static final String REQUEST_CMD_SWEEP = "sweepTX";
-
- public static final String REQUEST_CMD_SEND = "send";
- public static final String REQUEST_CMD_SEND_NOTES = "notes";
-
- public static final int START_SERVICE = 1;
- public static final int STOP_SERVICE = 2;
-
- private MyWalletListener listener = null;
-
- private class MyWalletListener implements WalletListener {
- boolean updated = true;
-
- void start() {
- Timber.d("MyWalletListener.start()");
- Wallet wallet = getWallet();
- if (wallet == null) throw new IllegalStateException("No wallet!");
- wallet.setListener(this);
- wallet.startRefresh();
- }
-
- void stop() {
- Timber.d("MyWalletListener.stop()");
- Wallet wallet = getWallet();
- if (wallet == null) throw new IllegalStateException("No wallet!");
- wallet.pauseRefresh();
- wallet.setListener(null);
- }
-
- // WalletListener callbacks
- public void moneySpent(String txId, long amount) {
- Timber.d("moneySpent() %d @ %s", amount, txId);
- }
-
- public void moneyReceived(String txId, long amount) {
- Timber.d("moneyReceived() %d @ %s", amount, txId);
- }
-
- public void unconfirmedMoneyReceived(String txId, long amount) {
- Timber.d("unconfirmedMoneyReceived() %d @ %s", amount, txId);
- }
-
- private long lastBlockTime = 0;
- private int lastTxCount = 0;
-
- public void newBlock(long height) {
- final Wallet wallet = getWallet();
- if (wallet == null) throw new IllegalStateException("No wallet!");
- // don't flood with an update for every block ...
- if (lastBlockTime < System.currentTimeMillis() - 2000) {
- lastBlockTime = System.currentTimeMillis();
- Timber.d("newBlock() @ %d with observer %s", height, observer);
- if (observer != null) {
- boolean fullRefresh = false;
- updateDaemonState(wallet, wallet.isSynchronized() ? height : 0);
- if (!wallet.isSynchronized()) {
- updated = true;
- // we want to see our transactions as they come in
- wallet.refreshHistory();
- int txCount = wallet.getHistory().getCount();
- if (txCount > lastTxCount) {
- // update the transaction list only if we have more than before
- lastTxCount = txCount;
- fullRefresh = true;
- }
- }
- if (observer != null)
- observer.onRefreshed(wallet, fullRefresh);
- }
- }
- }
-
- public void updated() {
- Timber.d("updated()");
- Wallet wallet = getWallet();
- if (wallet == null) throw new IllegalStateException("No wallet!");
- updated = true;
- }
-
- public void refreshed() { // this means it's synced
- Timber.d("refreshed()");
- final Wallet wallet = getWallet();
- if (wallet == null) throw new IllegalStateException("No wallet!");
- wallet.setSynchronized();
- if (updated) {
- updateDaemonState(wallet, wallet.getBlockChainHeight());
- wallet.refreshHistory();
- if (observer != null) {
- updated = !observer.onRefreshed(wallet, true);
- }
- }
- }
- }
-
- private long lastDaemonStatusUpdate = 0;
- private long daemonHeight = 0;
- private Wallet.ConnectionStatus connectionStatus = Wallet.ConnectionStatus.ConnectionStatus_Disconnected;
- private static final long STATUS_UPDATE_INTERVAL = 120000; // 120s (blocktime)
-
- private void updateDaemonState(Wallet wallet, long height) {
- long t = System.currentTimeMillis();
- if (height > 0) { // if we get a height, we are connected
- daemonHeight = height;
- connectionStatus = Wallet.ConnectionStatus.ConnectionStatus_Connected;
- lastDaemonStatusUpdate = t;
- } else {
- if (t - lastDaemonStatusUpdate > STATUS_UPDATE_INTERVAL) {
- lastDaemonStatusUpdate = t;
- // these calls really connect to the daemon - wasting time
- daemonHeight = wallet.getDaemonBlockChainHeight();
- if (daemonHeight > 0) {
- // if we get a valid height, then obviously we are connected
- connectionStatus = Wallet.ConnectionStatus.ConnectionStatus_Connected;
- } else {
- connectionStatus = Wallet.ConnectionStatus.ConnectionStatus_Disconnected;
- }
- }
- }
- }
-
- public long getDaemonHeight() {
- return this.daemonHeight;
- }
-
- public Wallet.ConnectionStatus getConnectionStatus() {
- return this.connectionStatus;
- }
-
- /////////////////////////////////////////////
- // communication back to client (activity) //
- /////////////////////////////////////////////
- // NB: This allows for only one observer, i.e. only a single activity bound here
-
- private Observer observer = null;
-
- public void setObserver(Observer anObserver) {
- observer = anObserver;
- Timber.d("setObserver %s", observer);
- }
-
- public interface Observer {
- boolean onRefreshed(Wallet wallet, boolean full);
-
- void onProgress(String text);
-
- void onProgress(int n);
-
- void onWalletStored(boolean success);
-
- void onTransactionCreated(String tag, PendingTransaction pendingTransaction);
-
- void onTransactionSent(String txid);
-
- void onSendTransactionFailed(String error);
-
- void onWalletStarted(Wallet.Status walletStatus);
-
- void onWalletOpen(Wallet.Device device);
- }
-
- String progressText = null;
- int progressValue = -1;
-
- private void showProgress(String text) {
- progressText = text;
- if (observer != null) {
- observer.onProgress(text);
- }
- }
-
- private void showProgress(int n) {
- progressValue = n;
- if (observer != null) {
- observer.onProgress(n);
- }
- }
-
- public String getProgressText() {
- return progressText;
- }
-
- public int getProgressValue() {
- return progressValue;
- }
-
- //
- public Wallet getWallet() {
- return WalletManager.getInstance().getWallet();
- }
-
- /////////////////////////////////////////////
- /////////////////////////////////////////////
-
- private WalletService.ServiceHandler mServiceHandler;
-
- private boolean errorState = false;
-
- // Handler that receives messages from the thread
- private final class ServiceHandler extends Handler {
- ServiceHandler(Looper looper) {
- super(looper);
- }
-
- @Override
- public void handleMessage(Message msg) {
- Timber.d("Handling %s", msg.arg2);
- if (errorState) {
- Timber.i("In error state.");
- // also, we have already stopped ourselves
- return;
- }
- switch (msg.arg2) {
- case START_SERVICE: {
- Bundle extras = msg.getData();
- String cmd = extras.getString(REQUEST, null);
- switch (cmd) {
- case REQUEST_CMD_LOAD:
- String walletId = extras.getString(REQUEST_WALLET, null);
- String walletPw = extras.getString(REQUEST_CMD_LOAD_PW, null);
- Timber.d("LOAD wallet %s", walletId);
- if (walletId != null) {
- showProgress(getString(R.string.status_wallet_loading));
- showProgress(10);
- Wallet.Status walletStatus = start(walletId, walletPw);
- if (observer != null) observer.onWalletStarted(walletStatus);
- if ((walletStatus == null) || !walletStatus.isOk()) {
- errorState = true;
- stop();
- }
- }
- break;
- case REQUEST_CMD_STORE: {
- Wallet myWallet = getWallet();
- if (myWallet == null) break;
- Timber.d("STORE wallet: %s", myWallet.getName());
- boolean rc = myWallet.store();
- Timber.d("wallet stored: %s with rc=%b", myWallet.getName(), rc);
- if (!rc) {
- Timber.w("Wallet store failed: %s", myWallet.getStatus().getErrorString());
- }
- if (observer != null) observer.onWalletStored(rc);
- break;
- }
- case REQUEST_CMD_TX: {
- Wallet myWallet = getWallet();
- if (myWallet == null) break;
- Timber.d("CREATE TX for wallet: %s", myWallet.getName());
- myWallet.disposePendingTransaction(); // remove any old pending tx
-
- TxData txData = extras.getParcelable(REQUEST_CMD_TX_DATA);
- String txTag = extras.getString(REQUEST_CMD_TX_TAG);
- PendingTransaction pendingTransaction = myWallet.createTransaction(txData);
- PendingTransaction.Status status = pendingTransaction.getStatus();
- Timber.d("transaction status %s", status);
- if (status != PendingTransaction.Status.Status_Ok) {
- Timber.w("Create Transaction failed: %s", pendingTransaction.getErrorString());
- }
- if (observer != null) {
- observer.onTransactionCreated(txTag, pendingTransaction);
- } else {
- myWallet.disposePendingTransaction();
- }
- break;
- }
- case REQUEST_CMD_SWEEP: {
- Wallet myWallet = getWallet();
- if (myWallet == null) break;
- Timber.d("SWEEP TX for wallet: %s", myWallet.getName());
- myWallet.disposePendingTransaction(); // remove any old pending tx
-
- String txTag = extras.getString(REQUEST_CMD_TX_TAG);
- PendingTransaction pendingTransaction = myWallet.createSweepUnmixableTransaction();
- PendingTransaction.Status status = pendingTransaction.getStatus();
- Timber.d("transaction status %s", status);
- if (status != PendingTransaction.Status.Status_Ok) {
- Timber.w("Create Transaction failed: %s", pendingTransaction.getErrorString());
- }
- if (observer != null) {
- observer.onTransactionCreated(txTag, pendingTransaction);
- } else {
- myWallet.disposePendingTransaction();
- }
- break;
- }
- case REQUEST_CMD_SEND: {
- Wallet myWallet = getWallet();
- if (myWallet == null) break;
- Timber.d("SEND TX for wallet: %s", myWallet.getName());
- PendingTransaction pendingTransaction = myWallet.getPendingTransaction();
- if (pendingTransaction == null) {
- throw new IllegalArgumentException("PendingTransaction is null"); // die
- }
- if (pendingTransaction.getStatus() != PendingTransaction.Status.Status_Ok) {
- Timber.e("PendingTransaction is %s", pendingTransaction.getStatus());
- final String error = pendingTransaction.getErrorString();
- myWallet.disposePendingTransaction(); // it's broken anyway
- if (observer != null) observer.onSendTransactionFailed(error);
- return;
- }
- final String txid = pendingTransaction.getFirstTxId(); // tx ids vanish after commit()!
-
- boolean success = pendingTransaction.commit("", true);
- if (success) {
- myWallet.disposePendingTransaction();
- if (observer != null) observer.onTransactionSent(txid);
- String notes = extras.getString(REQUEST_CMD_SEND_NOTES);
- if ((notes != null) && (!notes.isEmpty())) {
- myWallet.setUserNote(txid, notes);
- }
- boolean rc = myWallet.store();
- Timber.d("wallet stored: %s with rc=%b", myWallet.getName(), rc);
- if (!rc) {
- Timber.w("Wallet store failed: %s", myWallet.getStatus().getErrorString());
- }
- if (observer != null) observer.onWalletStored(rc);
- listener.updated = true;
- } else {
- final String error = pendingTransaction.getErrorString();
- myWallet.disposePendingTransaction();
- if (observer != null) observer.onSendTransactionFailed(error);
- return;
- }
- break;
- }
- }
- }
- break;
- case STOP_SERVICE:
- stop();
- break;
- default:
- Timber.e("UNKNOWN %s", msg.arg2);
- }
- }
- }
-
- @Override
- public void onCreate() {
- // We are using a HandlerThread and a Looper to avoid loading and closing
- // concurrency
- MoneroHandlerThread thread = new MoneroHandlerThread("WalletService",
- Process.THREAD_PRIORITY_BACKGROUND);
- thread.start();
-
- // Get the HandlerThread's Looper and use it for our Handler
- final Looper serviceLooper = thread.getLooper();
- mServiceHandler = new WalletService.ServiceHandler(serviceLooper);
-
- Timber.d("Service created");
- }
-
- @Override
- public void onDestroy() {
- Timber.d("onDestroy()");
- if (this.listener != null) {
- Timber.w("onDestroy() with active listener");
- // no need to stop() here because the wallet closing should have been triggered
- // through onUnbind() already
- }
- }
-
- @Override
- protected void attachBaseContext(Context context) {
- super.attachBaseContext(LocaleHelper.setPreferredLocale(context));
- }
-
- public class WalletServiceBinder extends Binder {
- public WalletService getService() {
- return WalletService.this;
- }
- }
-
- private final IBinder mBinder = new WalletServiceBinder();
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- Running = true;
- // when the activity starts the service, it expects to start it for a new wallet
- // the service is possibly still occupied with saving the last opened wallet
- // so we queue the open request
- // this should not matter since the old activity is not getting updates
- // and the new one is not listening yet (although it will be bound)
- Timber.d("onStartCommand()");
- // For each start request, send a message to start a job and deliver the
- // start ID so we know which request we're stopping when we finish the job
- Message msg = mServiceHandler.obtainMessage();
- msg.arg2 = START_SERVICE;
- if (intent != null) {
- msg.setData(intent.getExtras());
- mServiceHandler.sendMessage(msg);
- return START_STICKY;
- } else {
- // process restart - don't do anything - let system kill it again
- stop();
- return START_NOT_STICKY;
- }
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- // Very first client binds
- Timber.d("onBind()");
- return mBinder;
- }
-
- @Override
- public boolean onUnbind(Intent intent) {
- Timber.d("onUnbind()");
- // All clients have unbound with unbindService()
- Message msg = mServiceHandler.obtainMessage();
- msg.arg2 = STOP_SERVICE;
- mServiceHandler.sendMessage(msg);
- Timber.d("onUnbind() message sent");
- return true; // true is important so that onUnbind is also called next time
- }
-
- @Nullable
- private Wallet.Status start(String walletName, String walletPassword) {
- Timber.d("start()");
- startNotfication();
- showProgress(getString(R.string.status_wallet_loading));
- showProgress(10);
- if (listener == null) {
- Timber.d("start() loadWallet");
- Wallet aWallet = loadWallet(walletName, walletPassword);
- if (aWallet == null) return null;
- Wallet.Status walletStatus = aWallet.getFullStatus();
- if (!walletStatus.isOk()) {
- aWallet.close();
- return walletStatus;
- }
- listener = new MyWalletListener();
- listener.start();
- showProgress(100);
- }
- showProgress(getString(R.string.status_wallet_connecting));
- showProgress(101);
- // if we try to refresh the history here we get occasional segfaults!
- // doesnt matter since we update as soon as we get a new block anyway
- Timber.d("start() done");
- return getWallet().getFullStatus();
- }
-
- public void stop() {
- Timber.d("stop()");
- setObserver(null); // in case it was not reset already
- if (listener != null) {
- listener.stop();
- Wallet myWallet = getWallet();
- Timber.d("stop() closing");
- myWallet.close();
- Timber.d("stop() closed");
- listener = null;
- }
- stopForeground(true);
- stopSelf();
- Running = false;
- }
-
- private Wallet loadWallet(String walletName, String walletPassword) {
- Wallet wallet = openWallet(walletName, walletPassword);
- if (wallet != null) {
- Timber.d("Using daemon %s", WalletManager.getInstance().getDaemonAddress());
- showProgress(55);
- wallet.init(0);
- wallet.setProxy(NetCipherHelper.getProxy());
- showProgress(90);
- }
- return wallet;
- }
-
- private Wallet openWallet(String walletName, String walletPassword) {
- String path = Helper.getWalletFile(getApplicationContext(), walletName).getAbsolutePath();
- showProgress(20);
- Wallet wallet = null;
- WalletManager walletMgr = WalletManager.getInstance();
- Timber.d("WalletManager network=%s", walletMgr.getNetworkType().name());
- showProgress(30);
- if (walletMgr.walletExists(path)) {
- Timber.d("open wallet %s", path);
- Wallet.Device device = WalletManager.getInstance().queryWalletDevice(path + ".keys", walletPassword);
- Timber.d("device is %s", device.toString());
- if (observer != null) observer.onWalletOpen(device);
- wallet = walletMgr.openWallet(path, walletPassword);
- showProgress(60);
- Timber.d("wallet opened");
- Wallet.Status walletStatus = wallet.getStatus();
- if (!walletStatus.isOk()) {
- Timber.d("wallet status is %s", walletStatus);
- WalletManager.getInstance().close(wallet); // TODO close() failed?
- wallet = null;
- // TODO what do we do with the progress??
- // TODO tell the activity this failed
- // this crashes in MyWalletListener(Wallet aWallet) as wallet == null
- }
- }
- return wallet;
- }
-
- private void startNotfication() {
- Intent notificationIntent = new Intent(this, WalletActivity.class);
- PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent,
- Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_IMMUTABLE : 0);
-
- String channelId = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? createNotificationChannel() : "";
- Notification notification = new NotificationCompat.Builder(this, channelId)
- .setContentTitle(getString(R.string.service_description))
- .setOngoing(true)
- .setSmallIcon(R.drawable.ic_monerujo)
- .setPriority(NotificationCompat.PRIORITY_MIN)
- .setCategory(NotificationCompat.CATEGORY_SERVICE)
- .setContentIntent(pendingIntent)
- .build();
- startForeground(NOTIFICATION_ID, notification);
- }
-
- @RequiresApi(Build.VERSION_CODES.O)
- private String createNotificationChannel() {
- NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- NotificationChannel channel = new NotificationChannel(CHANNEL_ID, getString(R.string.service_description),
- NotificationManager.IMPORTANCE_LOW);
- channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
- notificationManager.createNotificationChannel(channel);
- return CHANNEL_ID;
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeApi.java b/app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeApi.java
deleted file mode 100644
index 7b7972a..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeApi.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- * 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.service.exchange.api;
-
-
-import androidx.annotation.NonNull;
-
-
-public interface ExchangeApi {
-
- /**
- * Queries the exchnage rate
- *
- * @param baseCurrency base currency
- * @param quoteCurrency quote currency
- * @param callback the callback with the exchange rate
- */
- void queryExchangeRate(@NonNull final String baseCurrency, @NonNull final String quoteCurrency,
- @NonNull final ExchangeCallback callback);
-
-}
-
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeCallback.java b/app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeCallback.java
deleted file mode 100644
index c5b939c..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeCallback.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- * 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.service.exchange.api;
-
-public interface ExchangeCallback {
-
- void onSuccess(ExchangeRate exchangeRate);
-
- void onError(Exception ex);
-
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeException.java b/app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeException.java
deleted file mode 100644
index 905819d..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeException.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.service.exchange.api;
-
-public class ExchangeException extends Exception {
- private final int code;
- private final String errorMsg;
-
- public String getErrorMsg() {
- return errorMsg;
- }
-
- public ExchangeException(final int code) {
- super();
- this.code = code;
- this.errorMsg = null;
- }
-
- public ExchangeException(final String errorMsg) {
- super();
- this.code = 0;
- this.errorMsg = errorMsg;
- }
-
- public ExchangeException(final int code, final String errorMsg) {
- super();
- this.code = code;
- this.errorMsg = errorMsg;
- }
-
- public int getCode() {
- return code;
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeRate.java b/app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeRate.java
deleted file mode 100644
index 3c0fadf..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/api/ExchangeRate.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2017 m2049r et al.
- *
- * 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.service.exchange.api;
-
-public interface ExchangeRate {
-
- String getServiceName();
-
- String getBaseCurrency();
-
- String getQuoteCurrency();
-
- double getRate();
-
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/ecb/ExchangeApiImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/exchange/ecb/ExchangeApiImpl.java
deleted file mode 100644
index e355ff5..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/ecb/ExchangeApiImpl.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (c) 2019 m2049r@monerujo.io
- *
- * 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.
- */
-
-// https://developer.android.com/training/basics/network-ops/xml
-
-package com.m2049r.xmrwallet.service.exchange.ecb;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.VisibleForTesting;
-
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeApi;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeException;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate;
-import com.m2049r.xmrwallet.util.NetCipherHelper;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-import java.io.IOException;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TimeZone;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import okhttp3.Call;
-import okhttp3.HttpUrl;
-import okhttp3.Response;
-import timber.log.Timber;
-
-public class ExchangeApiImpl implements ExchangeApi {
- @NonNull
- private final HttpUrl baseUrl;
-
- //so we can inject the mockserver url
- @VisibleForTesting
- public ExchangeApiImpl(@NonNull final HttpUrl baseUrl) {
- this.baseUrl = baseUrl;
- }
-
- public ExchangeApiImpl() {
- this(HttpUrl.parse("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"));
- // data is daily and is refreshed around 16:00 CET every working day
- }
-
- public static boolean isSameDay(Calendar calendar, Calendar anotherCalendar) {
- return (calendar.get(Calendar.YEAR) == anotherCalendar.get(Calendar.YEAR)) &&
- (calendar.get(Calendar.DAY_OF_YEAR) == anotherCalendar.get(Calendar.DAY_OF_YEAR));
- }
-
- @Override
- public void queryExchangeRate(@NonNull final String baseCurrency, @NonNull final String quoteCurrency,
- @NonNull final ExchangeCallback callback) {
- if (!baseCurrency.equals("EUR")) {
- callback.onError(new IllegalArgumentException("Only EUR supported as base"));
- return;
- }
-
- if (baseCurrency.equals(quoteCurrency)) {
- callback.onSuccess(new ExchangeRateImpl(quoteCurrency, 1.0, new Date()));
- return;
- }
-
- if (fetchDate != null) { // we have data
- boolean useCache = false;
- // figure out if we can use the cached values
- // data is daily and is refreshed around 16:00 CET every working day
- Calendar now = Calendar.getInstance(TimeZone.getTimeZone("CET"));
-
- int fetchWeekday = fetchDate.get(Calendar.DAY_OF_WEEK);
- int fetchDay = fetchDate.get(Calendar.DAY_OF_YEAR);
- int fetchHour = fetchDate.get(Calendar.HOUR_OF_DAY);
-
- int today = now.get(Calendar.DAY_OF_YEAR);
- int nowHour = now.get(Calendar.HOUR_OF_DAY);
-
- if (
- // was it fetched today before 16:00? assume no new data iff now < 16:00 as well
- ((today == fetchDay) && (fetchHour < 16) && (nowHour < 16))
- // was it fetched after, 17:00? we can assume there is no newer data
- || ((today == fetchDay) && (fetchHour > 17))
- || ((today == fetchDay + 1) && (fetchHour > 17) && (nowHour < 16))
- // is the data itself from today? there can be no newer data
- || (fxDate.get(Calendar.DAY_OF_YEAR) == today)
- // was it fetched Sat/Sun? we can assume there is no newer data
- || ((fetchWeekday == Calendar.SATURDAY) || (fetchWeekday == Calendar.SUNDAY))
- ) { // return cached rate
- try {
- callback.onSuccess(getRate(quoteCurrency));
- } catch (ExchangeException ex) {
- callback.onError(ex);
- }
- return;
- }
- }
-
- final NetCipherHelper.Request httpRequest = new NetCipherHelper.Request(baseUrl);
- httpRequest.enqueue(new okhttp3.Callback() {
- @Override
- public void onFailure(final Call call, final IOException ex) {
- callback.onError(ex);
- }
-
- @Override
- public void onResponse(final Call call, final Response response) throws IOException {
- if (response.isSuccessful()) {
- try {
- DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
- DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
- Document doc = dBuilder.parse(response.body().byteStream());
- doc.getDocumentElement().normalize();
- parse(doc);
- try {
- callback.onSuccess(getRate(quoteCurrency));
- } catch (ExchangeException ex) {
- callback.onError(ex);
- }
- } catch (ParserConfigurationException | SAXException ex) {
- Timber.w(ex);
- callback.onError(new ExchangeException(ex.getLocalizedMessage()));
- }
- } else {
- callback.onError(new ExchangeException(response.code(), response.message()));
- }
- }
- });
- }
-
- final private Map fxEntries = new HashMap<>();
- private Calendar fxDate = null;
- private Calendar fetchDate = null;
-
- synchronized private ExchangeRate getRate(String currency) throws ExchangeException {
- Timber.d("Getting %s", currency);
- final Double rate = fxEntries.get(currency);
- if (rate == null) throw new ExchangeException(404, "Currency not supported: " + currency);
- return new ExchangeRateImpl(currency, rate, fxDate.getTime());
- }
-
- private final static SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
-
- {
- DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
- }
-
- private void parse(final Document xmlRootDoc) {
- final Map entries = new HashMap<>();
- Calendar date = Calendar.getInstance(TimeZone.getTimeZone("CET"));
- try {
- NodeList cubes = xmlRootDoc.getElementsByTagName("Cube");
- for (int i = 0; i < cubes.getLength(); i++) {
- Node node = cubes.item(i);
- if (node.getNodeType() == Node.ELEMENT_NODE) {
- Element cube = (Element) node;
- if (cube.hasAttribute("time")) { // a time Cube
- final Date time = DATE_FORMAT.parse(cube.getAttribute("time"));
- date.setTime(time);
- } else if (cube.hasAttribute("currency")
- && cube.hasAttribute("rate")) { // a rate Cube
- String currency = cube.getAttribute("currency");
- double rate = Double.valueOf(cube.getAttribute("rate"));
- entries.put(currency, rate);
- } // else an empty Cube - ignore
- }
- }
- } catch (ParseException ex) {
- Timber.d(ex);
- }
- synchronized (this) {
- if (date != null) {
- fetchDate = Calendar.getInstance(TimeZone.getTimeZone("CET"));
- fxDate = date;
- fxEntries.clear();
- fxEntries.putAll(entries);
- }
- // else don't change what we have
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/ecb/ExchangeRateImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/exchange/ecb/ExchangeRateImpl.java
deleted file mode 100644
index 4691dfa..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/ecb/ExchangeRateImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2019 m2049r et al.
- *
- * 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.service.exchange.ecb;
-
-import androidx.annotation.NonNull;
-
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate;
-
-import java.util.Date;
-
-class ExchangeRateImpl implements ExchangeRate {
- private final Date date;
- private final String baseCurrency = "EUR";
- private final String quoteCurrency;
- private final double rate;
-
- @Override
- public String getServiceName() {
- return "ecb.europa.eu";
- }
-
- @Override
- public String getBaseCurrency() {
- return baseCurrency;
- }
-
- @Override
- public String getQuoteCurrency() {
- return quoteCurrency;
- }
-
- @Override
- public double getRate() {
- return rate;
- }
-
- ExchangeRateImpl(@NonNull final String quoteCurrency, double rate, @NonNull final Date date) {
- super();
- this.quoteCurrency = quoteCurrency;
- this.rate = rate;
- this.date = date;
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/kraken/ExchangeApiImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/exchange/kraken/ExchangeApiImpl.java
deleted file mode 100644
index ab36259..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/kraken/ExchangeApiImpl.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2017-2019 m2049r et al.
- *
- * 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.service.exchange.kraken;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.VisibleForTesting;
-
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeApi;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeException;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.NetCipherHelper;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.io.IOException;
-
-import okhttp3.Call;
-import okhttp3.HttpUrl;
-import okhttp3.Response;
-import timber.log.Timber;
-
-public class ExchangeApiImpl implements ExchangeApi {
-
- private final HttpUrl baseUrl;
-
- //so we can inject the mockserver url
- @VisibleForTesting
- public ExchangeApiImpl(final HttpUrl baseUrl) {
- this.baseUrl = baseUrl;
- }
-
- public ExchangeApiImpl() {
- this(HttpUrl.parse("https://api.kraken.com/0/public/Ticker"));
- }
-
- @Override
- public void queryExchangeRate(@NonNull final String baseCurrency, @NonNull final String quoteCurrency,
- @NonNull final ExchangeCallback callback) {
-
- if (baseCurrency.equals(quoteCurrency)) {
- callback.onSuccess(new ExchangeRateImpl(baseCurrency, quoteCurrency, 1.0));
- return;
- }
-
- boolean invertQuery;
-
-
- if (Helper.BASE_CRYPTO.equals(baseCurrency)) {
- invertQuery = false;
- } else if (Helper.BASE_CRYPTO.equals(quoteCurrency)) {
- invertQuery = true;
- } else {
- callback.onError(new IllegalArgumentException("no crypto specified"));
- return;
- }
-
- Timber.d("queryExchangeRate: i %b, b %s, q %s", invertQuery, baseCurrency, quoteCurrency);
- final boolean invert = invertQuery;
- final String base = invert ? quoteCurrency : baseCurrency;
- final String quote = invert ? baseCurrency : quoteCurrency;
-
- final HttpUrl url = baseUrl.newBuilder()
- .addQueryParameter("pair", base + (quote.equals("BTC") ? "XBT" : quote))
- .build();
-
- final NetCipherHelper.Request httpRequest = new NetCipherHelper.Request(url);
- httpRequest.enqueue(new okhttp3.Callback() {
- @Override
- public void onFailure(final Call call, final IOException ex) {
- callback.onError(ex);
- }
-
- @Override
- public void onResponse(final Call call, final Response response) throws IOException {
- if (response.isSuccessful()) {
- try {
- final JSONObject json = new JSONObject(response.body().string());
- final JSONArray jsonError = json.getJSONArray("error");
- if (jsonError.length() > 0) {
- final String errorMsg = jsonError.getString(0);
- callback.onError(new ExchangeException(response.code(), errorMsg));
- } else {
- final JSONObject jsonResult = json.getJSONObject("result");
- reportSuccess(jsonResult, invert, callback);
- }
- } catch (JSONException ex) {
- callback.onError(new ExchangeException(ex.getLocalizedMessage()));
- }
- } else {
- callback.onError(new ExchangeException(response.code(), response.message()));
- }
- }
- });
- }
-
- void reportSuccess(JSONObject jsonObject, boolean swapAssets, ExchangeCallback callback) {
- try {
- final ExchangeRate exchangeRate = new ExchangeRateImpl(jsonObject, swapAssets);
- callback.onSuccess(exchangeRate);
- } catch (JSONException ex) {
- callback.onError(new ExchangeException(ex.getLocalizedMessage()));
- } catch (ExchangeException ex) {
- callback.onError(ex);
- }
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/kraken/ExchangeRateImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/exchange/kraken/ExchangeRateImpl.java
deleted file mode 100644
index e3afb5f..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/kraken/ExchangeRateImpl.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2017 m2049r et al.
- *
- * 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.service.exchange.kraken;
-
-import androidx.annotation.NonNull;
-
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeException;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.util.NoSuchElementException;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-class ExchangeRateImpl implements ExchangeRate {
-
- private final String baseCurrency;
- private final String quoteCurrency;
- private final double rate;
-
- @Override
- public String getServiceName() {
- return "kraken.com";
- }
-
- @Override
- public String getBaseCurrency() {
- return baseCurrency;
- }
-
- @Override
- public String getQuoteCurrency() {
- return quoteCurrency;
- }
-
- @Override
- public double getRate() {
- return rate;
- }
-
- ExchangeRateImpl(@NonNull final String baseCurrency, @NonNull final String quoteCurrency, double rate) {
- super();
- this.baseCurrency = baseCurrency;
- this.quoteCurrency = quoteCurrency;
- this.rate = rate;
- }
-
- ExchangeRateImpl(final JSONObject jsonObject, final boolean swapAssets) throws JSONException, ExchangeException {
- try {
- final String key = jsonObject.keys().next(); // we expect only one
- Pattern pattern = Pattern.compile("^X(.*?)Z(.*?)$");
- Matcher matcher = pattern.matcher(key);
- if (matcher.find()) {
- baseCurrency = swapAssets ? matcher.group(2) : matcher.group(1);
- quoteCurrency = swapAssets ? matcher.group(1) : matcher.group(2);
- } else {
- throw new ExchangeException("no pair returned!");
- }
-
- JSONObject pair = jsonObject.getJSONObject(key);
- JSONArray close = pair.getJSONArray("c");
- String closePrice = close.getString(0);
- if (closePrice != null) {
- try {
- double rate = Double.parseDouble(closePrice);
- this.rate = swapAssets ? (1 / rate) : rate;
- } catch (NumberFormatException ex) {
- throw new ExchangeException(ex.getLocalizedMessage());
- }
- } else {
- throw new ExchangeException("no close price returned!");
- }
- } catch (NoSuchElementException ex) {
- throw new ExchangeException(ex.getLocalizedMessage());
- }
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/krakenEcb/ExchangeApiImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/exchange/krakenEcb/ExchangeApiImpl.java
deleted file mode 100644
index b8021b9..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/krakenEcb/ExchangeApiImpl.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2019 m2049r@monerujo.io
- *
- * 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.
- */
-
-// https://developer.android.com/training/basics/network-ops/xml
-
-package com.m2049r.xmrwallet.service.exchange.krakenEcb;
-
-import androidx.annotation.NonNull;
-
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeApi;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate;
-import com.m2049r.xmrwallet.util.Helper;
-
-import okhttp3.OkHttpClient;
-import timber.log.Timber;
-
-/*
- Gets the XMR/EUR rate from kraken and then gets the EUR/fiat rate from the ECB
- */
-
-public class ExchangeApiImpl implements ExchangeApi {
- static public final String BASE_FIAT = "EUR";
-
- @Override
- public void queryExchangeRate(@NonNull final String baseCurrency, @NonNull final String quoteCurrency,
- @NonNull final ExchangeCallback callback) {
- Timber.d("B=%s Q=%s", baseCurrency, quoteCurrency);
- if (baseCurrency.equals(quoteCurrency)) {
- Timber.d("BASE=QUOTE=1");
- callback.onSuccess(new ExchangeRateImpl(baseCurrency, quoteCurrency, 1.0));
- return;
- }
-
- if (!Helper.BASE_CRYPTO.equals(baseCurrency)
- && !Helper.BASE_CRYPTO.equals(quoteCurrency)) {
- callback.onError(new IllegalArgumentException("no " + Helper.BASE_CRYPTO + " specified"));
- return;
- }
-
- final String quote = Helper.BASE_CRYPTO.equals(baseCurrency) ? quoteCurrency : baseCurrency;
-
- final ExchangeApi krakenApi =
- new com.m2049r.xmrwallet.service.exchange.kraken.ExchangeApiImpl();
- krakenApi.queryExchangeRate(Helper.BASE_CRYPTO, BASE_FIAT, new ExchangeCallback() {
- @Override
- public void onSuccess(final ExchangeRate krakenRate) {
- Timber.d("kraken = %f", krakenRate.getRate());
- final ExchangeApi ecbApi =
- new com.m2049r.xmrwallet.service.exchange.ecb.ExchangeApiImpl();
- ecbApi.queryExchangeRate(BASE_FIAT, quote, new ExchangeCallback() {
- @Override
- public void onSuccess(final ExchangeRate ecbRate) {
- Timber.d("ECB = %f", ecbRate.getRate());
- double rate = ecbRate.getRate() * krakenRate.getRate();
- Timber.d("Q=%s QC=%s", quote, quoteCurrency);
- if (!quote.equals(quoteCurrency)) rate = 1.0d / rate;
- Timber.d("rate = %f", rate);
- final ExchangeRate exchangeRate =
- new ExchangeRateImpl(baseCurrency, quoteCurrency, rate);
- callback.onSuccess(exchangeRate);
- }
-
- @Override
- public void onError(Exception ex) {
- Timber.d(ex);
- callback.onError(ex);
- }
- });
- }
-
- @Override
- public void onError(Exception ex) {
- Timber.d(ex);
- callback.onError(ex);
- }
- });
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/krakenEcb/ExchangeRateImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/exchange/krakenEcb/ExchangeRateImpl.java
deleted file mode 100644
index 48b8ef0..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/exchange/krakenEcb/ExchangeRateImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2019 m2049r et al.
- *
- * 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.service.exchange.krakenEcb;
-
-import androidx.annotation.NonNull;
-
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate;
-
-class ExchangeRateImpl implements ExchangeRate {
- private final String baseCurrency;
- private final String quoteCurrency;
- private final double rate;
-
- @Override
- public String getServiceName() {
- return "kraken+ecb";
- }
-
- @Override
- public String getBaseCurrency() {
- return baseCurrency;
- }
-
- @Override
- public String getQuoteCurrency() {
- return quoteCurrency;
- }
-
- @Override
- public double getRate() {
- return rate;
- }
-
- ExchangeRateImpl(@NonNull final String baseCurrency, @NonNull final String quoteCurrency, double rate) {
- super();
- this.baseCurrency = baseCurrency;
- this.quoteCurrency = quoteCurrency;
- this.rate = rate;
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/NetworkCallback.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/NetworkCallback.java
deleted file mode 100644
index f77128c..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/NetworkCallback.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2017 m2049r et al.
- *
- * 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.service.shift;
-
-import org.json.JSONObject;
-
-public interface NetworkCallback {
-
- void onSuccess(JSONObject jsonObject);
-
- void onError(Exception ex);
-
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftApiCall.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftApiCall.java
deleted file mode 100644
index c4daeb3..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftApiCall.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2017 m2049r et al.
- *
- * 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.service.shift;
-
-import androidx.annotation.NonNull;
-
-import org.json.JSONObject;
-
-public interface ShiftApiCall {
-
- void call(@NonNull final String path, @NonNull final NetworkCallback callback);
-
- void call(@NonNull final String path, final JSONObject request, @NonNull final NetworkCallback callback);
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftCallback.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftCallback.java
deleted file mode 100644
index 4dee50d..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftCallback.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (c) 2017 m2049r et al.
- *
- * 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.service.shift;
-
-public interface ShiftCallback {
-
- void onSuccess(T t);
-
- void onError(Exception ex);
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftError.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftError.java
deleted file mode 100644
index d789ec5..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftError.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2017-2021 m2049r et al.
- *
- * 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.service.shift;
-
-import androidx.annotation.NonNull;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-@RequiredArgsConstructor
-public class ShiftError {
- @Getter
- private final Error errorType;
- @Getter
- private final String errorMsg;
-
- public enum Error {
- SERVICE,
- INFRASTRUCTURE
- }
-
- public boolean isRetryable() {
- return errorType == Error.INFRASTRUCTURE;
- }
-
- public ShiftError(final JSONObject jsonObject) throws JSONException {
- final JSONObject errorObject = jsonObject.getJSONObject("error");
- errorType = Error.SERVICE;
- errorMsg = errorObject.getString("message");
- }
-
- @Override
- @NonNull
- public String toString() {
- return getErrorMsg();
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftException.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftException.java
deleted file mode 100644
index 3a750b1..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2017-2021 m2049r et al.
- *
- * 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.service.shift;
-
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-@RequiredArgsConstructor
-public class ShiftException extends Exception {
- @Getter
- private final int code;
- @Getter
- private final ShiftError error;
-
- public ShiftException(int code) {
- this.code = code;
- this.error = null;
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/CreateOrder.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/CreateOrder.java
deleted file mode 100644
index f738956..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/CreateOrder.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2017-2021 m2049r et al.
- *
- * 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.service.shift.sideshift.api;
-
-import java.util.Date;
-
-public interface CreateOrder {
- String TAG = "side";
-
- String getBtcCurrency();
-
- double getBtcAmount();
-
- String getBtcAddress();
-
- String getQuoteId();
-
- String getOrderId();
-
- double getXmrAmount();
-
- String getXmrAddress();
-
- Date getCreatedAt(); // createdAt
-
- Date getExpiresAt(); // expiresAt
-
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/QueryOrderParameters.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/QueryOrderParameters.java
deleted file mode 100644
index ebd2d2f..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/QueryOrderParameters.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2017-2021 m2049r et al.
- *
- * 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.service.shift.sideshift.api;
-
-public interface QueryOrderParameters {
-
- double getLowerLimit();
-
- double getPrice();
-
- double getUpperLimit();
-
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/QueryOrderStatus.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/QueryOrderStatus.java
deleted file mode 100644
index acb201c..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/QueryOrderStatus.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2017-2021 m2049r et al.
- *
- * 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.service.shift.sideshift.api;
-
-import java.util.Date;
-
-public interface QueryOrderStatus {
- enum State {
- WAITING, // Waiting for mempool
- PENDING, // Detected (waiting for confirmations)
- SETTLING, // Settlement in progress
- SETTLED, // Settlement completed
- // no refunding in monerujo so theese are ignored:
-// REFUND, // Queued for refund
-// REFUNDING, // Refund in progress
-// REFUNDED // Refund completed
- UNDEFINED
- }
-
- boolean isCreated();
-
- boolean isTerminal();
-
- boolean isWaiting();
-
- boolean isPending();
-
- boolean isSent();
-
- boolean isPaid();
-
- boolean isError();
-
- QueryOrderStatus.State getState();
-
- String getOrderId();
-
- Date getCreatedAt();
-
- Date getExpiresAt();
-
- double getBtcAmount();
-
- String getBtcAddress();
-
- double getXmrAmount();
-
- String getXmrAddress();
-
- double getPrice();
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/RequestQuote.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/RequestQuote.java
deleted file mode 100644
index cbbb36f..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/RequestQuote.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2017-2021 m2049r et al.
- *
- * 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.service.shift.sideshift.api;
-
-import java.util.Date;
-
-public interface RequestQuote {
-
- double getBtcAmount(); // settleAmount
-
- String getId(); // id
-
- Date getCreatedAt(); // createdAt
-
- Date getExpiresAt(); // expiresAt
-
- double getXmrAmount(); // depositAmount
-
- double getPrice(); // rate
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/SideShiftApi.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/SideShiftApi.java
deleted file mode 100644
index 6c9331c..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/SideShiftApi.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2017-2021 m2049r et al.
- *
- * 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.service.shift.sideshift.api;
-
-import android.net.Uri;
-
-import androidx.annotation.NonNull;
-
-import com.m2049r.xmrwallet.service.shift.ShiftCallback;
-
-public interface SideShiftApi {
- int QUERY_INTERVAL = 5000; // ms
-
- /**
- * Queries the order parameter.
- *
- * @param callback the callback with the OrderParameter object
- */
- void queryOrderParameters(@NonNull final ShiftCallback callback);
-
- /**
- * Creates an order
- *
- * @param xmrAmount the desired XMR amount
- */
- void requestQuote(final double xmrAmount, @NonNull final ShiftCallback callback);
-
- /**
- * Creates an order
- *
- * @param quoteId the desired XMR amount
- * @param btcAddress the target bitcoin address
- */
- void createOrder(final String quoteId, @NonNull final String btcAddress, @NonNull final ShiftCallback callback);
-
- /**
- * Queries the order status for given current order
- *
- * @param orderId the order ID
- * @param callback the callback with the OrderStatus object
- */
- void queryOrderStatus(@NonNull final String orderId, @NonNull final ShiftCallback callback);
-
- /*
- * Returns the URL for manually querying the order status
- *
- * @param orderId the order ID
- */
- Uri getQueryOrderUri(String orderId);
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/CreateOrderImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/CreateOrderImpl.java
deleted file mode 100644
index 258cf4d..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/CreateOrderImpl.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (c) 2017-2021 m2049r et al.
- *
- * 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.service.shift.sideshift.network;
-
-import androidx.annotation.NonNull;
-
-import com.m2049r.xmrwallet.BuildConfig;
-import com.m2049r.xmrwallet.service.shift.NetworkCallback;
-import com.m2049r.xmrwallet.service.shift.ShiftApiCall;
-import com.m2049r.xmrwallet.service.shift.ShiftCallback;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.CreateOrder;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi;
-import com.m2049r.xmrwallet.util.DateHelper;
-import com.m2049r.xmrwallet.util.ServiceHelper;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.text.ParseException;
-import java.util.Date;
-
-import lombok.Getter;
-
-class CreateOrderImpl implements CreateOrder {
- @Getter
- private final String btcCurrency;
- @Getter
- private final double btcAmount;
- @Getter
- private final String btcAddress;
- @Getter
- private final String quoteId;
- @Getter
- private final String orderId;
- @Getter
- private final double xmrAmount;
- @Getter
- private final String xmrAddress;
- @Getter
- private final Date createdAt;
- @Getter
- private final Date expiresAt;
-
- CreateOrderImpl(final JSONObject jsonObject) throws JSONException {
- // sanity checks
- final String depositMethod = jsonObject.getString("depositMethodId");
- final String settleMethod = jsonObject.getString("settleMethodId");
- if (!"xmr".equals(depositMethod) || !ServiceHelper.ASSET.equals(settleMethod))
- throw new IllegalStateException();
-
- btcCurrency = settleMethod.toUpperCase();
- btcAmount = jsonObject.getDouble("settleAmount");
- JSONObject settleAddress = jsonObject.getJSONObject("settleAddress");
- btcAddress = settleAddress.getString("address");
-
- xmrAmount = jsonObject.getDouble("depositAmount");
- JSONObject depositAddress = jsonObject.getJSONObject("depositAddress");
- xmrAddress = depositAddress.getString("address");
-
- quoteId = jsonObject.getString("quoteId");
-
- orderId = jsonObject.getString("orderId");
-
- try {
- final String created = jsonObject.getString("createdAtISO");
- createdAt = DateHelper.parse(created);
- final String expires = jsonObject.getString("expiresAtISO");
- expiresAt = DateHelper.parse(expires);
- } catch (ParseException ex) {
- throw new JSONException(ex.getLocalizedMessage());
- }
- }
-
- public static void call(@NonNull final ShiftApiCall api, final String quoteId, @NonNull final String btcAddress,
- @NonNull final ShiftCallback callback) {
- try {
- final JSONObject request = createRequest(quoteId, btcAddress);
- api.call("orders", request, new NetworkCallback() {
- @Override
- public void onSuccess(JSONObject jsonObject) {
- try {
- callback.onSuccess(new CreateOrderImpl(jsonObject));
- } catch (JSONException ex) {
- callback.onError(ex);
- }
- }
-
- @Override
- public void onError(Exception ex) {
- callback.onError(ex);
- }
- });
- } catch (JSONException ex) {
- callback.onError(ex);
- }
- }
-
- static JSONObject createRequest(final String quoteId, final String address) throws JSONException {
- final JSONObject jsonObject = new JSONObject();
- jsonObject.put("type", "fixed");
- jsonObject.put("quoteId", quoteId);
- jsonObject.put("settleAddress", address);
- if (!BuildConfig.ID_A.isEmpty() && !"null".equals(BuildConfig.ID_A)) {
- jsonObject.put("affiliateId", BuildConfig.ID_A);
- }
- return jsonObject;
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderParametersImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderParametersImpl.java
deleted file mode 100644
index afa5527..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderParametersImpl.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2017-2021 m2049r et al.
- *
- * 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.service.shift.sideshift.network;
-
-import androidx.annotation.NonNull;
-
-import com.m2049r.xmrwallet.service.shift.NetworkCallback;
-import com.m2049r.xmrwallet.service.shift.ShiftApiCall;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderParameters;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi;
-import com.m2049r.xmrwallet.service.shift.ShiftCallback;
-import com.m2049r.xmrwallet.util.ServiceHelper;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-class QueryOrderParametersImpl implements QueryOrderParameters {
-
- private double lowerLimit;
- private double price;
- private double upperLimit;
-
- public double getLowerLimit() {
- return lowerLimit;
- }
-
- public double getPrice() {
- return price;
- }
-
- public double getUpperLimit() {
- return upperLimit;
- }
-
- QueryOrderParametersImpl(final JSONObject jsonObject) throws JSONException {
- lowerLimit = jsonObject.getDouble("min");
- price = jsonObject.getDouble("rate");
- upperLimit = jsonObject.getDouble("max");
- }
-
- public static void call(@NonNull final ShiftApiCall api,
- @NonNull final ShiftCallback callback) {
- api.call("pairs/xmr/" + ServiceHelper.ASSET, new NetworkCallback() {
- @Override
- public void onSuccess(JSONObject jsonObject) {
- try {
- callback.onSuccess(new QueryOrderParametersImpl(jsonObject));
- } catch (JSONException ex) {
- callback.onError(ex);
- }
- }
-
- @Override
- public void onError(Exception ex) {
- callback.onError(ex);
- }
- });
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderStatusImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderStatusImpl.java
deleted file mode 100644
index 439cb93..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderStatusImpl.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (c) 2017-2021 m2049r et al.
- *
- * 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.service.shift.sideshift.network;
-
-import androidx.annotation.NonNull;
-
-import com.m2049r.xmrwallet.service.shift.NetworkCallback;
-import com.m2049r.xmrwallet.service.shift.ShiftApiCall;
-import com.m2049r.xmrwallet.util.DateHelper;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderStatus;
-import com.m2049r.xmrwallet.service.shift.ShiftCallback;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.text.ParseException;
-import java.util.Date;
-
-import lombok.Getter;
-import timber.log.Timber;
-
-class QueryOrderStatusImpl implements QueryOrderStatus {
-
- @Getter
- private QueryOrderStatus.State state;
- @Getter
- private final String orderId;
- @Getter
- private final Date createdAt;
- @Getter
- private final Date expiresAt;
- @Getter
- private final double btcAmount;
- @Getter
- private final String btcAddress;
- @Getter
- private final double xmrAmount;
- @Getter
- private final String xmrAddress;
-
- public boolean isCreated() {
- return true;
- }
-
- public boolean isTerminal() {
- return (state.equals(State.SETTLED) || isError());
- }
-
- public boolean isError() {
- return state.equals(State.UNDEFINED);
- }
-
- public boolean isWaiting() {
- return state.equals(State.WAITING);
- }
-
- public boolean isPending() {
- return state.equals(State.PENDING);
- }
-
- public boolean isSent() {
- return state.equals(State.SETTLING);
- }
-
- public boolean isPaid() {
- return state.equals(State.SETTLED);
- }
-
- public double getPrice() {
- return btcAmount / xmrAmount;
- }
-
- QueryOrderStatusImpl(final JSONObject jsonObject) throws JSONException {
- try {
- String created = jsonObject.getString("createdAtISO");
- createdAt = DateHelper.parse(created);
- String expires = jsonObject.getString("expiresAtISO");
- expiresAt = DateHelper.parse(expires);
- } catch (ParseException ex) {
- throw new JSONException(ex.getLocalizedMessage());
- }
- orderId = jsonObject.getString("orderId");
-
- btcAmount = jsonObject.getDouble("settleAmount");
- JSONObject settleAddress = jsonObject.getJSONObject("settleAddress");
- btcAddress = settleAddress.getString("address");
-
- xmrAmount = jsonObject.getDouble("depositAmount");
- JSONObject depositAddress = jsonObject.getJSONObject("depositAddress");
- xmrAddress = settleAddress.getString("address");
-
- JSONArray deposits = jsonObject.getJSONArray("deposits");
- // we only create one deposit, so die if there are more than one:
- if (deposits.length() > 1)
- throw new IllegalStateException("more than one deposits");
-
- state = State.UNDEFINED;
- if (deposits.length() == 0) {
- state = State.WAITING;
- } else if (deposits.length() == 1) {
- // sanity check
- if (!orderId.equals(deposits.getJSONObject(0).getString("orderId")))
- throw new IllegalStateException("deposit has different order id!");
- String stateName = deposits.getJSONObject(0).getString("status");
- try {
- state = State.valueOf(stateName.toUpperCase());
- } catch (IllegalArgumentException ex) {
- state = State.UNDEFINED;
- }
- }
- }
-
- public static void call(@NonNull final ShiftApiCall api, @NonNull final String orderId,
- @NonNull final ShiftCallback callback) {
- api.call("orders/" + orderId, new NetworkCallback() {
- @Override
- public void onSuccess(JSONObject jsonObject) {
- try {
- callback.onSuccess(new QueryOrderStatusImpl(jsonObject));
- } catch (JSONException ex) {
- callback.onError(ex);
- }
- }
-
- @Override
- public void onError(Exception ex) {
- callback.onError(ex);
- }
- });
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/RequestQuoteImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/RequestQuoteImpl.java
deleted file mode 100644
index 1cbdf24..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/RequestQuoteImpl.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (c) 2017-2021 m2049r et al.
- *
- * 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.service.shift.sideshift.network;
-
-import androidx.annotation.NonNull;
-
-import com.m2049r.xmrwallet.service.shift.NetworkCallback;
-import com.m2049r.xmrwallet.service.shift.ShiftApiCall;
-import com.m2049r.xmrwallet.service.shift.ShiftCallback;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.RequestQuote;
-import com.m2049r.xmrwallet.util.DateHelper;
-import com.m2049r.xmrwallet.util.ServiceHelper;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.text.ParseException;
-import java.util.Date;
-import java.util.Locale;
-
-import lombok.Getter;
-
-class RequestQuoteImpl implements RequestQuote {
- @Getter
- private final double btcAmount;
- @Getter
- private final String id;
- @Getter
- private final Date createdAt;
- @Getter
- private final Date expiresAt;
- @Getter
- private final double xmrAmount;
- @Getter
- private final double price;
-
- // TODO do something with errors - they always seem to send us 500
-
- RequestQuoteImpl(final JSONObject jsonObject) throws JSONException {
- // sanity checks
- final String depositMethod = jsonObject.getString("depositMethod");
- final String settleMethod = jsonObject.getString("settleMethod");
- if (!"xmr".equals(depositMethod) || !ServiceHelper.ASSET.equals(settleMethod))
- throw new IllegalStateException();
-
- btcAmount = jsonObject.getDouble("settleAmount");
- id = jsonObject.getString("id");
-
- try {
- final String created = jsonObject.getString("createdAt");
- createdAt = DateHelper.parse(created);
- final String expires = jsonObject.getString("expiresAt");
- expiresAt = DateHelper.parse(expires);
- } catch (ParseException ex) {
- throw new JSONException(ex.getLocalizedMessage());
- }
- xmrAmount = jsonObject.getDouble("depositAmount");
- price = jsonObject.getDouble("rate");
- }
-
- public static void call(@NonNull final ShiftApiCall api, final double btcAmount,
- @NonNull final ShiftCallback callback) {
- try {
- final JSONObject request = createRequest(btcAmount);
- api.call("quotes", request, new NetworkCallback() {
- @Override
- public void onSuccess(JSONObject jsonObject) {
- try {
- callback.onSuccess(new RequestQuoteImpl(jsonObject));
- } catch (JSONException ex) {
- callback.onError(ex);
- }
- }
-
- @Override
- public void onError(Exception ex) {
- callback.onError(ex);
- }
- });
- } catch (JSONException ex) {
- callback.onError(ex);
- }
- }
-
- /**
- * Create JSON request object
- *
- * @param btcAmount how much XMR to shift to BTC
- */
-
- static JSONObject createRequest(final double btcAmount) throws JSONException {
- final JSONObject jsonObject = new JSONObject();
- jsonObject.put("depositMethod", "xmr");
- jsonObject.put("settleMethod", ServiceHelper.ASSET);
- // #sideshift is silly and likes numbers as strings
- String amount = AmountFormatter.format(btcAmount);
- jsonObject.put("settleAmount", amount);
- return jsonObject;
- }
-
- static final DecimalFormat AmountFormatter;
-
- static {
- AmountFormatter = new DecimalFormat();
- AmountFormatter.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US));
- AmountFormatter.setMinimumIntegerDigits(1);
- AmountFormatter.setMaximumFractionDigits(12);
- AmountFormatter.setGroupingUsed(false);
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/SideShiftApiImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/SideShiftApiImpl.java
deleted file mode 100644
index c22e322..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/SideShiftApiImpl.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (c) 2017-2021 m2049r et al.
- *
- * 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.service.shift.sideshift.network;
-
-import android.net.Uri;
-
-import androidx.annotation.NonNull;
-
-import com.m2049r.xmrwallet.service.shift.NetworkCallback;
-import com.m2049r.xmrwallet.service.shift.ShiftApiCall;
-import com.m2049r.xmrwallet.service.shift.ShiftCallback;
-import com.m2049r.xmrwallet.service.shift.ShiftError;
-import com.m2049r.xmrwallet.service.shift.ShiftException;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.CreateOrder;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderParameters;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderStatus;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.RequestQuote;
-import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi;
-import com.m2049r.xmrwallet.util.NetCipherHelper;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.io.IOException;
-
-import okhttp3.Call;
-import okhttp3.HttpUrl;
-import okhttp3.Response;
-import timber.log.Timber;
-
-public class SideShiftApiImpl implements SideShiftApi, ShiftApiCall {
-
- private final HttpUrl baseUrl;
-
- public SideShiftApiImpl(final HttpUrl baseUrl) {
- this.baseUrl = baseUrl;
- }
-
- @Override
- public void queryOrderParameters(@NonNull final ShiftCallback callback) {
- QueryOrderParametersImpl.call(this, callback);
- }
-
- @Override
- public void requestQuote(final double btcAmount, @NonNull final ShiftCallback callback) {
- RequestQuoteImpl.call(this, btcAmount, callback);
- }
-
- @Override
- public void createOrder(final String quoteId, @NonNull final String btcAddress,
- @NonNull final ShiftCallback callback) {
- CreateOrderImpl.call(this, quoteId, btcAddress, callback);
- }
-
- @Override
- public void queryOrderStatus(@NonNull final String uuid,
- @NonNull final ShiftCallback callback) {
- QueryOrderStatusImpl.call(this, uuid, callback);
- }
-
- @Override
- public Uri getQueryOrderUri(String orderId) {
- return Uri.parse("https://sideshift.ai/orders/" + orderId);
- }
-
- @Override
- public void call(@NonNull final String path, @NonNull final NetworkCallback callback) {
- call(path, null, callback);
- }
-
- @Override
- public void call(@NonNull final String path, final JSONObject request, @NonNull final NetworkCallback callback) {
- final HttpUrl url = baseUrl.newBuilder()
- .addPathSegments(path)
- .build();
-
- NetCipherHelper.Request httpRequest = new NetCipherHelper.Request(url, request);
- httpRequest.enqueue(new okhttp3.Callback() {
- @Override
- public void onFailure(final Call call, final IOException ex) {
- callback.onError(ex);
- }
-
- @Override
- public void onResponse(@NonNull final Call call, @NonNull final Response response) throws IOException {
- Timber.d("onResponse code=%d", response.code());
- if (response.isSuccessful()) {
- try {
- final JSONObject json = new JSONObject(response.body().string());
- callback.onSuccess(json);
- } catch (JSONException ex) {
- callback.onError(ex);
- }
- } else {
- try {
- final JSONObject json = new JSONObject(response.body().string());
- Timber.d(json.toString(2));
- final ShiftError error = new ShiftError(json);
- Timber.w("%s says %d/%s", CreateOrder.TAG, response.code(), error.toString());
- callback.onError(new ShiftException(response.code(), error));
- } catch (JSONException ex) {
- callback.onError(new ShiftException(response.code()));
- }
- }
- }
- });
- }
-}
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 4cd90cf..3620338 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java
@@ -381,196 +381,6 @@ public class Helper {
static AlertDialog openDialog = null; // for preventing opening of multiple dialogs
static AsyncTask passwordTask = null;
- static public void promptPassword(final Context context, final String wallet, boolean fingerprintDisabled, final PasswordAction action) {
- if (openDialog != null) return; // we are already asking for password
- LayoutInflater li = LayoutInflater.from(context);
- final View promptsView = li.inflate(R.layout.prompt_password, null);
-
- AlertDialog.Builder alertDialogBuilder = new MaterialAlertDialogBuilder(context);
- alertDialogBuilder.setView(promptsView);
-
- final TextInputLayout etPassword = promptsView.findViewById(R.id.etPassword);
- etPassword.setHint(context.getString(R.string.prompt_password, wallet));
-
- final TextView tvOpenPrompt = promptsView.findViewById(R.id.tvOpenPrompt);
- final Drawable icFingerprint = context.getDrawable(R.drawable.ic_fingerprint);
- final Drawable icError = context.getDrawable(R.drawable.ic_error_red_36dp);
- final Drawable icInfo = context.getDrawable(R.drawable.ic_info_white_24dp);
-
- final boolean fingerprintAuthCheck = FingerprintHelper.isFingerPassValid(context, wallet);
-
- final boolean fingerprintAuthAllowed = !fingerprintDisabled && fingerprintAuthCheck;
- final CancellationSignal cancelSignal = new CancellationSignal();
-
- final AtomicBoolean incorrectSavedPass = new AtomicBoolean(false);
-
- class PasswordTask extends AsyncTask {
- private String pass;
- private boolean fingerprintUsed;
-
- PasswordTask(String pass, boolean fingerprintUsed) {
- this.pass = pass;
- this.fingerprintUsed = fingerprintUsed;
- }
-
- @Override
- protected void onPreExecute() {
- tvOpenPrompt.setCompoundDrawablesRelativeWithIntrinsicBounds(icInfo, null, null, null);
- tvOpenPrompt.setText(context.getText(R.string.prompt_open_wallet));
- tvOpenPrompt.setVisibility(View.VISIBLE);
- }
-
- @Override
- protected Boolean doInBackground(Void... unused) {
- return processPasswordEntry(context, wallet, pass, fingerprintUsed, action);
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- if (result) {
- Helper.hideKeyboardAlways((Activity) context);
- cancelSignal.cancel();
- openDialog.dismiss();
- openDialog = null;
- } else {
- if (fingerprintUsed) {
- incorrectSavedPass.set(true);
- tvOpenPrompt.setCompoundDrawablesRelativeWithIntrinsicBounds(icError, null, null, null);
- tvOpenPrompt.setText(context.getText(R.string.bad_saved_password));
- } else {
- if (!fingerprintAuthAllowed) {
- tvOpenPrompt.setVisibility(View.GONE);
- } else if (incorrectSavedPass.get()) {
- tvOpenPrompt.setCompoundDrawablesRelativeWithIntrinsicBounds(icError, null, null, null);
- tvOpenPrompt.setText(context.getText(R.string.bad_password));
- } else {
- tvOpenPrompt.setCompoundDrawablesRelativeWithIntrinsicBounds(icFingerprint, null, null, null);
- tvOpenPrompt.setText(context.getText(R.string.prompt_fingerprint_auth));
- }
- etPassword.setError(context.getString(R.string.bad_password));
- }
- }
- passwordTask = null;
- }
- }
-
- 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(context.getString(R.string.label_ok), null)
- .setNegativeButton(context.getString(R.string.label_cancel),
- (dialog, id) -> {
- action.fail(wallet);
- Helper.hideKeyboardAlways((Activity) context);
- cancelSignal.cancel();
- if (passwordTask != null) {
- passwordTask.cancel(true);
- passwordTask = null;
- }
- dialog.cancel();
- openDialog = null;
- });
- openDialog = alertDialogBuilder.create();
-
- final FingerprintManager.AuthenticationCallback fingerprintAuthCallback;
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
- fingerprintAuthCallback = null;
- } else {
- fingerprintAuthCallback = new FingerprintManager.AuthenticationCallback() {
- @Override
- public void onAuthenticationError(int errMsgId, CharSequence errString) {
- tvOpenPrompt.setCompoundDrawablesRelativeWithIntrinsicBounds(icError, null, null, null);
- tvOpenPrompt.setText(errString);
- }
-
- @Override
- public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
- tvOpenPrompt.setCompoundDrawablesRelativeWithIntrinsicBounds(icError, null, null, null);
- tvOpenPrompt.setText(helpString);
- }
-
- @Override
- public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
- try {
- String userPass = KeyStoreHelper.loadWalletUserPass(context, wallet);
- if (passwordTask == null) {
- passwordTask = new PasswordTask(userPass, true);
- passwordTask.execute();
- }
- } catch (KeyStoreHelper.BrokenPasswordStoreException ex) {
- etPassword.setError(context.getString(R.string.bad_password));
- // TODO: better error message here - what would it be?
- }
- }
-
- @Override
- public void onAuthenticationFailed() {
- tvOpenPrompt.setCompoundDrawablesRelativeWithIntrinsicBounds(icError, null, null, null);
- tvOpenPrompt.setText(context.getString(R.string.bad_fingerprint));
- }
- };
- }
-
- openDialog.setOnShowListener(dialog -> {
- if (fingerprintAuthAllowed && fingerprintAuthCallback != null) {
- tvOpenPrompt.setCompoundDrawablesRelativeWithIntrinsicBounds(icFingerprint, null, null, null);
- tvOpenPrompt.setText(context.getText(R.string.prompt_fingerprint_auth));
- tvOpenPrompt.setVisibility(View.VISIBLE);
- FingerprintHelper.authenticate(context, cancelSignal, fingerprintAuthCallback);
- } else {
- etPassword.requestFocus();
- }
- Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
- button.setOnClickListener(view -> {
- String pass = etPassword.getEditText().getText().toString();
- if (passwordTask == null) {
- passwordTask = new PasswordTask(pass, false);
- passwordTask.execute();
- }
- });
- });
-
- // accept keyboard "ok"
- etPassword.getEditText().setOnEditorActionListener((v, actionId, event) -> {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_DONE)) {
- String pass = etPassword.getEditText().getText().toString();
- if (passwordTask == null) {
- passwordTask = new PasswordTask(pass, false);
- passwordTask.execute();
- }
- return true;
- }
- return false;
- });
-
- if (Helper.preventScreenshot()) {
- openDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
- }
-
- Helper.showKeyboard(openDialog);
- openDialog.show();
- }
-
public interface PasswordAction {
void act(String walletName, String password, boolean fingerprintUsed);
diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/Notice.java b/app/src/main/java/com/m2049r/xmrwallet/util/Notice.java
deleted file mode 100644
index 727c395..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/util/Notice.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (c) 2018 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.util;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import androidx.fragment.app.FragmentActivity;
-import androidx.fragment.app.FragmentManager;
-
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.dialog.HelpFragment;
-import com.m2049r.xmrwallet.ledger.Ledger;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class Notice {
- private static final String PREFS_NAME = "notice";
- private static List notices = null;
-
- private static final String NOTICE_SHOW_XMRTO_ENABLED_SEND = "notice_xmrto_enabled_send";
- private static final String NOTICE_SHOW_LEDGER = "notice_ledger_enabled_login";
-
- private static void init() {
- synchronized (Notice.class) {
- if (notices != null) return;
- notices = new ArrayList<>();
- if (Helper.ALLOW_SHIFT)
- notices.add(
- new Notice(NOTICE_SHOW_XMRTO_ENABLED_SEND,
- R.string.info_xmrto_enabled,
- R.string.help_xmrto,
- 1)
- );
- if (Ledger.ENABLED)
- notices.add(
- new Notice(NOTICE_SHOW_LEDGER,
- R.string.info_ledger_enabled,
- R.string.help_create_ledger,
- 1)
- );
- }
- }
-
- public static void showAll(ViewGroup parent, String selector) {
- if (notices == null) init();
- for (Notice notice : notices) {
- if (notice.id.matches(selector))
- notice.show(parent);
- }
- }
-
- private final String id;
- private final int textResId;
- private final int helpResId;
- private final int defaultCount;
- private transient int count = -1;
-
- private Notice(final String id, final int textResId, final int helpResId, final int defaultCount) {
- this.id = id;
- this.textResId = textResId;
- this.helpResId = helpResId;
- this.defaultCount = defaultCount;
- }
-
- // show this notice as a child of the given parent view
- // NB: it assumes the parent is in a Fragment
- private void show(final ViewGroup parent) {
- final Context context = parent.getContext();
- if (getCount(context) <= 0) return; // don't add it
-
- final LinearLayout ll =
- (LinearLayout) LayoutInflater.from(context)
- .inflate(R.layout.template_notice, parent, false);
-
- ((TextView) ll.findViewById(R.id.tvNotice)).setText(textResId);
-
- final FragmentManager fragmentManager =
- ((FragmentActivity) context).getSupportFragmentManager();
- ll.setOnClickListener(v -> HelpFragment.display(fragmentManager, helpResId));
-
- ImageButton ib = ll.findViewById(R.id.ibClose);
- ib.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- ll.setVisibility(View.GONE);
- decCount(context);
- }
- });
- parent.addView(ll);
- }
-
- private int getCount(final Context context) {
- count = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
- .getInt(id, defaultCount);
- return count;
- }
-
- private void decCount(final Context context) {
- final SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
- if (count < 0) // not initialized yet
- count = prefs.getInt(id, defaultCount);
- if (count > 0)
- prefs.edit().putInt(id, count - 1).apply();
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/ServiceHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/ServiceHelper.java
index 2762291..e629329 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/util/ServiceHelper.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/util/ServiceHelper.java
@@ -2,7 +2,6 @@ package com.m2049r.xmrwallet.util;
import com.m2049r.xmrwallet.model.NetworkType;
import com.m2049r.xmrwallet.model.WalletManager;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeApi;
import okhttp3.HttpUrl;
@@ -17,8 +16,4 @@ public class ServiceHelper {
return HttpUrl.parse("https://sideshift.ai/api/v1/");
}
}
-
- static public ExchangeApi getExchangeApi() {
- return new com.m2049r.xmrwallet.service.exchange.krakenEcb.ExchangeApiImpl();
- }
}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/CTextInputLayout.java b/app/src/main/java/com/m2049r/xmrwallet/widget/CTextInputLayout.java
deleted file mode 100644
index 59b884d..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/widget/CTextInputLayout.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.widget;
-
-import android.content.Context;
-import com.google.android.material.textfield.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/widget/DotBar.java b/app/src/main/java/com/m2049r/xmrwallet/widget/DotBar.java
deleted file mode 100644
index 0baf2d3..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/widget/DotBar.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (c) 2017 m2049r et al.
- *
- * 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://github.com/marcokstephen/StepProgressBar
-
-package com.m2049r.xmrwallet.widget;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.util.AttributeSet;
-import android.view.View;
-
-import com.m2049r.xmrwallet.R;
-
-import timber.log.Timber;
-
-public class DotBar extends View {
-
- final private int inactiveColor;
- final private int activeColor;
-
- final private float dotSize;
- private float dotSpacing;
-
- final private int numDots;
- private int activeDot;
-
- final private Paint paint;
-
- public DotBar(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.DotBar, 0, 0);
- try {
- inactiveColor = ta.getInt(R.styleable.DotBar_inactiveColor, 0);
- activeColor = ta.getInt(R.styleable.DotBar_activeColor, 0);
- dotSize = ta.getDimensionPixelSize(R.styleable.DotBar_dotSize, 8);
- numDots = ta.getInt(R.styleable.DotBar_numberDots, 5);
- activeDot = ta.getInt(R.styleable.DotBar_activeDot, 0);
- } finally {
- ta.recycle();
- }
-
- paint = new Paint(Paint.ANTI_ALIAS_FLAG);
- paint.setStyle(Paint.Style.FILL);
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int desiredWidth = (int) ((numDots * dotSize) + getPaddingLeft() + getPaddingRight());
- int desiredHeight = (int) (dotSize + getPaddingBottom() + getPaddingTop());
-
- int widthMode = MeasureSpec.getMode(widthMeasureSpec);
- int widthSize = MeasureSpec.getSize(widthMeasureSpec);
- int heightMode = MeasureSpec.getMode(heightMeasureSpec);
- int heightSize = MeasureSpec.getSize(heightMeasureSpec);
-
- int width;
- int height;
-
- //Measure Width
- if (widthMode == MeasureSpec.EXACTLY) {
- //Must be this size
- width = widthSize;
- } else if (widthMode == MeasureSpec.AT_MOST) {
- //Can't be bigger than...
- width = Math.min(desiredWidth, widthSize);
- } else {
- //Be whatever you want
- width = desiredWidth;
- }
-
- //Measure Height
- if (heightMode == MeasureSpec.EXACTLY) {
- //Must be this size
- height = heightSize;
- } else if (heightMode == MeasureSpec.AT_MOST) {
- //Can't be bigger than...
- height = Math.min(desiredHeight, heightSize);
- } else {
- //Be whatever you want
- height = desiredHeight;
- }
-
- dotSpacing = (int) (((1.0 * width - (getPaddingLeft() + getPaddingRight())) / numDots - dotSize) / (numDots - 1));
-
- Timber.d("dotSpacing=%f", dotSpacing);
- //MUST CALL THIS
- setMeasuredDimension(width, height);
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
-
- // Centering the dots in the middle of the canvas
- float singleDotSize = dotSpacing + dotSize;
- float combinedDotSize = singleDotSize * numDots - dotSpacing;
- int startingX = (int) ((canvas.getWidth() - combinedDotSize) / 2);
- int startingY = (int) ((canvas.getHeight() - dotSize) / 2);
-
- for (int i = 0; i < numDots; i++) {
- int x = (int) (startingX + i * singleDotSize);
- if (i == activeDot) {
- paint.setColor(activeColor);
- } else {
- paint.setColor(inactiveColor);
- }
- canvas.drawCircle(x + dotSize / 2, startingY + dotSize / 2, dotSize / 2, paint);
- }
- }
-
- public void next() {
- if (activeDot < numDots - 2) {
- activeDot++;
- invalidate();
- } // else no next - stay stuck at end
- }
-
- public void previous() {
- if (activeDot >= 0) {
- activeDot--;
- invalidate();
- } // else no previous - stay stuck at beginning
- }
-
- public void setActiveDot(int i) {
- if ((i >= 0) && (i < numDots)) {
- activeDot = i;
- invalidate();
- }
- }
-
- public int getActiveDot() {
- return activeDot;
- }
-
- public int getNumDots() {
- return numDots;
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/DropDownEditText.java b/app/src/main/java/com/m2049r/xmrwallet/widget/DropDownEditText.java
deleted file mode 100644
index 9a767f5..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/widget/DropDownEditText.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.
- */
-
-// https://stackoverflow.com/questions/2126717/android-autocompletetextview-show-suggestions-when-no-text-entered
-
-package com.m2049r.xmrwallet.widget;
-
-import android.content.Context;
-import android.graphics.Rect;
-import androidx.appcompat.widget.AppCompatAutoCompleteTextView;
-import android.util.AttributeSet;
-
-public class DropDownEditText extends AppCompatAutoCompleteTextView {
-
- public DropDownEditText(Context context) {
- super(context);
- }
-
- public DropDownEditText(Context arg0, AttributeSet arg1) {
- super(arg0, arg1);
- }
-
- public DropDownEditText(Context arg0, AttributeSet arg1, int arg2) {
- super(arg0, arg1, arg2);
- }
-
- @Override
- public boolean enoughToFilter() {
- return true;
- }
-
- @Override
- protected void onFocusChanged(boolean focused, int direction,
- Rect previouslyFocusedRect) {
- super.onFocusChanged(focused, direction, previouslyFocusedRect);
- if (focused && getAdapter() != null) {
- performFiltering("", 0);
- }
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java
deleted file mode 100644
index 00b1b19..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- * Copyright (c) 2017-2019 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.widget;
-
-import android.content.Context;
-import android.os.Handler;
-import android.os.Looper;
-import android.text.Editable;
-import android.text.TextWatcher;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.ProgressBar;
-import android.widget.Spinner;
-import android.widget.TextView;
-
-import com.google.android.material.textfield.TextInputLayout;
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeApi;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.ServiceHelper;
-import com.m2049r.xmrwallet.util.ThemeHelper;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-
-import timber.log.Timber;
-
-public class ExchangeEditText extends LinearLayout {
-
- private double getEnteredAmount() {
- String enteredAmount = etAmountA.getEditText().getText().toString();
- try {
- return Double.parseDouble(enteredAmount);
- } catch (NumberFormatException ex) {
- Timber.i(ex.getLocalizedMessage());
- }
- return 0;
- }
-
- public boolean validate(double max, double min) {
- Timber.d("inProgress=%b", isExchangeInProgress());
- if (isExchangeInProgress()) {
- shakeExchangeField();
- return false;
- }
- boolean ok = true;
- String nativeAmount = getNativeAmount();
- if (nativeAmount == null) {
- ok = false;
- } else {
- try {
- double amount = Double.parseDouble(nativeAmount);
- if ((amount < min) || (amount > max)) {
- ok = false;
- }
- } catch (NumberFormatException ex) {
- // this cannot be
- Timber.e(ex.getLocalizedMessage());
- ok = false;
- }
- }
- if (!ok) {
- shakeAmountField();
- }
- return ok;
- }
-
- void shakeAmountField() {
- etAmountA.startAnimation(Helper.getShakeAnimation(getContext()));
- }
-
- void shakeExchangeField() {
- tvAmountB.startAnimation(Helper.getShakeAnimation(getContext()));
- }
-
- public void setAmount(String nativeAmount) {
- if (nativeAmount != null) {
- etAmountA.getEditText().setText(nativeAmount);
- tvAmountB.setText(null);
- if (sCurrencyA.getSelectedItemPosition() != 0)
- sCurrencyA.setSelection(0, true); // set native currency & trigger exchange
- else
- doExchange();
- } else {
- tvAmountB.setText(null);
- }
- }
-
- public void setEditable(boolean editable) {
- etAmountA.setEnabled(editable);
- }
-
- public String getNativeAmount() {
- if (isExchangeInProgress()) return null;
- if (getCurrencyA() == 0)
- return getCleanAmountString(etAmountA.getEditText().getText().toString());
- else
- return getCleanAmountString(tvAmountB.getText().toString());
- }
-
- TextInputLayout etAmountA;
- TextView tvAmountB;
- Spinner sCurrencyA;
- Spinner sCurrencyB;
- ImageView evExchange;
- ProgressBar pbExchange;
-
- public int getCurrencyA() {
- return sCurrencyA.getSelectedItemPosition();
- }
-
- public int getCurrencyB() {
- return sCurrencyB.getSelectedItemPosition();
- }
-
- public ExchangeEditText(Context context) {
- super(context);
- initializeViews(context);
- }
-
- public ExchangeEditText(Context context, AttributeSet attrs) {
- super(context, attrs);
- initializeViews(context);
- }
-
- public ExchangeEditText(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.
- */
- void initializeViews(Context context) {
- LayoutInflater inflater = (LayoutInflater) context
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- inflater.inflate(R.layout.view_exchange_edit, this);
- }
-
- void setCurrencyAdapter(Spinner spinner) {
- List currencies = new ArrayList<>();
- currencies.add(Helper.BASE_CRYPTO);
- setCurrencyAdapter(spinner, currencies);
- }
-
- protected void setCurrencyAdapter(Spinner spinner, List currencies) {
- if (Helper.SHOW_EXCHANGERATES)
- currencies.addAll(Arrays.asList(getResources().getStringArray(R.array.currency)));
- ArrayAdapter spinnerAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, currencies);
- spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- spinner.setAdapter(spinnerAdapter);
- }
-
- void setInitialSpinnerSelections(Spinner baseSpinner, Spinner quoteSpinner) {
- baseSpinner.setSelection(0, true);
- quoteSpinner.setSelection(0, true);
- }
-
- private boolean isInitialized = false;
-
- void postInitialize() {
- setInitialSpinnerSelections(sCurrencyA, sCurrencyB);
- isInitialized = true;
- startExchange();
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- etAmountA = findViewById(R.id.etAmountA);
- etAmountA.getEditText().addTextChangedListener(new TextWatcher() {
- @Override
- public void afterTextChanged(Editable s) {
- doExchange();
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- }
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- }
-
- });
- tvAmountB = findViewById(R.id.tvAmountB);
- sCurrencyA = findViewById(R.id.sCurrencyA);
- sCurrencyB = findViewById(R.id.sCurrencyB);
- evExchange = findViewById(R.id.evExchange);
- pbExchange = findViewById(R.id.pbExchange);
-
- setCurrencyAdapter(sCurrencyA);
- setCurrencyAdapter(sCurrencyB);
-
- post(this::postInitialize);
-
- // make progress circle gray
- pbExchange.getIndeterminateDrawable().
- setColorFilter(ThemeHelper.getThemedColor(getContext(), R.attr.colorPrimaryVariant),
- android.graphics.PorterDuff.Mode.MULTIPLY);
-
- sCurrencyA.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView> parentView, View selectedItemView, int position, long id) {
- if (!isInitialized) return;
- if (position != 0) { // if not native, select native on other
- sCurrencyB.setSelection(0, true);
- }
- doExchange();
- }
-
- @Override
- public void onNothingSelected(AdapterView> parentView) {
- // nothing
- }
- });
-
- sCurrencyB.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(final AdapterView> parentView, View selectedItemView, int position, long id) {
- if (!isInitialized) return;
- if (position != 0) { // if not native, select native on other
- sCurrencyA.setSelection(0, true);
- }
- doExchange();
- }
-
- @Override
- public void onNothingSelected(AdapterView> parentView) {
- // nothing
- }
- });
- }
-
- private boolean exchangeRateCacheIsUsable() {
- return (exchangeRateCache != null) &&
- ((exchangeRateCache.getBaseCurrency().equals(sCurrencyA.getSelectedItem()) &&
- exchangeRateCache.getQuoteCurrency().equals(sCurrencyB.getSelectedItem())) ||
- (exchangeRateCache.getBaseCurrency().equals(sCurrencyB.getSelectedItem()) &&
- exchangeRateCache.getQuoteCurrency().equals(sCurrencyA.getSelectedItem())));
- }
-
- private double exchangeRateFromCache() {
- if (!exchangeRateCacheIsUsable()) return 0;
- if (exchangeRateCache.getBaseCurrency().equals(sCurrencyA.getSelectedItem())) {
- return exchangeRateCache.getRate();
- } else {
- return 1.0d / exchangeRateCache.getRate();
- }
- }
-
- public void doExchange() {
- if (!isInitialized) return;
- tvAmountB.setText(null);
- if (getCurrencyA() == getCurrencyB()) {
- exchange(1);
- return;
- }
- // use cached exchange rate if we have it
- if (!isExchangeInProgress()) {
- double rate = exchangeRateFromCache();
- if (rate > 0) {
- if (prepareExchange()) {
- exchange(rate);
- }
- } else {
- startExchange();
- }
- }
- }
-
- private final ExchangeApi exchangeApi = ServiceHelper.getExchangeApi();
-
- // starts exchange through exchange api
- void startExchange() {
- String currencyA = (String) sCurrencyA.getSelectedItem();
- String currencyB = (String) sCurrencyB.getSelectedItem();
- if ((currencyA == null) || (currencyB == null)) return; // nothing to do
- execExchange(currencyA, currencyB);
- }
-
- void execExchange(String currencyA, String currencyB) {
- showProgress();
- queryExchangeRate(currencyA, currencyB,
- new ExchangeCallback() {
- @Override
- public void onSuccess(final ExchangeRate exchangeRate) {
- if (isAttachedToWindow())
- new Handler(Looper.getMainLooper()).post(new Runnable() {
- @Override
- public void run() {
- exchange(exchangeRate);
- }
- });
- }
-
- @Override
- public void onError(final Exception e) {
- Timber.e(e.getLocalizedMessage());
- new Handler(Looper.getMainLooper()).post(new Runnable() {
- @Override
- public void run() {
- exchangeFailed();
- }
- });
- }
- });
- }
-
- void queryExchangeRate(final String base, final String quote, ExchangeCallback callback) {
- exchangeApi.queryExchangeRate(base, quote, callback);
- }
-
- private void exchange(double rate) {
- double amount = getEnteredAmount();
- if (rate > 0) {
- tvAmountB.setText(Helper.getFormattedAmount(rate * amount, getCurrencyB() == 0));
- } else {
- tvAmountB.setText("--");
- Timber.d("No rate!");
- }
- }
-
- private static final String CLEAN_FORMAT = "%." + Helper.XMR_DECIMALS + "f";
-
- private String getCleanAmountString(String enteredAmount) {
- try {
- double amount = Double.parseDouble(enteredAmount);
- if (amount >= 0) {
- return String.format(Locale.US, CLEAN_FORMAT, amount);
- } else {
- return null;
- }
- } catch (NumberFormatException ex) {
- return null;
- }
- }
-
- boolean prepareExchange() {
- Timber.d("prepareExchange()");
- String enteredAmount = etAmountA.getEditText().getText().toString();
- if (!enteredAmount.isEmpty()) {
- String cleanAmount = getCleanAmountString(enteredAmount);
- Timber.d("cleanAmount = %s", cleanAmount);
- if (cleanAmount == null) {
- shakeAmountField();
- return false;
- }
- } else {
- return false;
- }
- return true;
- }
-
- public void exchangeFailed() {
- hideProgress();
- exchange(0);
- }
-
- // cache for exchange rate
- ExchangeRate exchangeRateCache = null;
-
- public void exchange(ExchangeRate exchangeRate) {
- hideProgress();
- // make sure this is what we want
- if (!exchangeRate.getBaseCurrency().equals(sCurrencyA.getSelectedItem()) ||
- !exchangeRate.getQuoteCurrency().equals(sCurrencyB.getSelectedItem())) {
- // something's wrong
- Timber.i("Currencies don't match! A: %s==%s B: %s==%s",
- exchangeRate.getBaseCurrency(), sCurrencyA.getSelectedItem(),
- exchangeRate.getQuoteCurrency(), sCurrencyB.getSelectedItem());
- return;
- }
-
- exchangeRateCache = exchangeRate;
- if (prepareExchange()) {
- exchange(exchangeRate.getRate());
- }
- }
-
- void showProgress() {
- pbExchange.setVisibility(View.VISIBLE);
- }
-
- private boolean isExchangeInProgress() {
- return pbExchange.getVisibility() == View.VISIBLE;
- }
-
- private void hideProgress() {
- pbExchange.setVisibility(View.INVISIBLE);
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeOtherEditText.java b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeOtherEditText.java
deleted file mode 100644
index 3dd344e..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeOtherEditText.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (c) 2017-2019 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.widget;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.os.Handler;
-import android.os.Looper;
-import android.util.AttributeSet;
-import android.widget.Spinner;
-
-import androidx.annotation.NonNull;
-
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate;
-import com.m2049r.xmrwallet.util.Helper;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import timber.log.Timber;
-
-public class ExchangeOtherEditText extends ExchangeEditText {
- /*
- all exchanges are done through XMR
- baseCurrency is the native currency
- */
-
- String baseCurrency = null; // not XMR
- private double exchangeRate = 0; // baseCurrency to XMR
-
- public void setExchangeRate(double rate) {
- exchangeRate = rate;
- post(this::startExchange);
- }
-
- public void setBaseCurrency(@NonNull String symbol) {
- if (symbol.equals(baseCurrency)) return;
- baseCurrency = symbol;
- setCurrencyAdapter(sCurrencyA);
- setCurrencyAdapter(sCurrencyB);
- post(this::postInitialize);
- }
-
- private void setBaseCurrency(Context context, AttributeSet attrs) {
- TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ExchangeEditText, 0, 0);
- try {
- baseCurrency = ta.getString(R.styleable.ExchangeEditText_baseSymbol);
- if (baseCurrency == null)
- throw new IllegalArgumentException("base currency must be set");
- } finally {
- ta.recycle();
- }
- }
-
- public ExchangeOtherEditText(Context context, AttributeSet attrs) {
- super(context, attrs);
- setBaseCurrency(context, attrs);
- }
-
- public ExchangeOtherEditText(Context context,
- AttributeSet attrs,
- int defStyle) {
- super(context, attrs, defStyle);
- setBaseCurrency(context, attrs);
- }
-
- @Override
- void setCurrencyAdapter(Spinner spinner) {
- List currencies = new ArrayList<>();
- if (!baseCurrency.equals(Helper.BASE_CRYPTO)) currencies.add(baseCurrency);
- currencies.add(Helper.BASE_CRYPTO);
- setCurrencyAdapter(spinner, currencies);
- }
-
- @Override
- void setInitialSpinnerSelections(Spinner baseSpinner, Spinner quoteSpinner) {
- baseSpinner.setSelection(0, true);
- quoteSpinner.setSelection(1, true);
- }
-
- private void localExchange(final String base, final String quote, final double rate) {
- exchange(new ExchangeRate() {
- @Override
- public String getServiceName() {
- return "Local";
- }
-
- @Override
- public String getBaseCurrency() {
- return base;
- }
-
- @Override
- public String getQuoteCurrency() {
- return quote;
- }
-
- @Override
- public double getRate() {
- return rate;
- }
- });
- }
-
- @Override
- void execExchange(String currencyA, String currencyB) {
- if (!currencyA.equals(baseCurrency) && !currencyB.equals(baseCurrency)) {
- throw new IllegalStateException("I can only exchange " + baseCurrency);
- }
-
- showProgress();
-
- Timber.d("execExchange(%s, %s)", currencyA, currencyB);
-
- // first deal with XMR/baseCurrency & baseCurrency/XMR
-
- if (currencyA.equals(Helper.BASE_CRYPTO) && (currencyB.equals(baseCurrency))) {
- localExchange(currencyA, currencyB, 1.0d / exchangeRate);
- return;
- }
- if (currencyA.equals(baseCurrency) && (currencyB.equals(Helper.BASE_CRYPTO))) {
- localExchange(currencyA, currencyB, exchangeRate);
- return;
- }
-
- // next, deal with XMR/baseCurrency
-
- if (currencyA.equals(baseCurrency)) {
- queryExchangeRate(Helper.BASE_CRYPTO, currencyB, exchangeRate, true);
- } else {
- queryExchangeRate(currencyA, Helper.BASE_CRYPTO, 1.0d / exchangeRate, false);
- }
- }
-
- private void queryExchangeRate(final String base, final String quote, final double factor,
- final boolean baseIsBaseCrypto) {
- queryExchangeRate(base, quote,
- new ExchangeCallback() {
- @Override
- public void onSuccess(final ExchangeRate exchangeRate) {
- if (isAttachedToWindow())
- new Handler(Looper.getMainLooper()).post(new Runnable() {
- @Override
- public void run() {
- ExchangeRate xchange = new ExchangeRate() {
- @Override
- public String getServiceName() {
- return exchangeRate.getServiceName() + "+" + baseCurrency;
- }
-
- @Override
- public String getBaseCurrency() {
- return baseIsBaseCrypto ? baseCurrency : base;
- }
-
- @Override
- public String getQuoteCurrency() {
- return baseIsBaseCrypto ? quote : baseCurrency;
- }
-
- @Override
- public double getRate() {
- return exchangeRate.getRate() * factor;
- }
- };
- exchange(xchange);
- }
- });
- }
-
- @Override
- public void onError(final Exception e) {
- Timber.e(e.getLocalizedMessage());
- new Handler(Looper.getMainLooper()).post(() -> exchangeFailed());
- }
- });
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeView.java b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeView.java
deleted file mode 100644
index 3208f72..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeView.java
+++ /dev/null
@@ -1,469 +0,0 @@
-/*
- * 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.widget;
-
-import android.content.Context;
-import android.os.Handler;
-import android.os.Looper;
-import android.text.Editable;
-import android.text.TextWatcher;
-import android.util.AttributeSet;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.inputmethod.EditorInfo;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.ProgressBar;
-import android.widget.Spinner;
-import android.widget.TextView;
-
-import com.google.android.material.textfield.TextInputLayout;
-import com.m2049r.xmrwallet.R;
-import com.m2049r.xmrwallet.model.Wallet;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeApi;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback;
-import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate;
-import com.m2049r.xmrwallet.util.ThemeHelper;
-import com.m2049r.xmrwallet.util.Helper;
-import com.m2049r.xmrwallet.util.ServiceHelper;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-
-import timber.log.Timber;
-
-public class ExchangeView extends LinearLayout {
- String xmrAmount = null;
- String notXmrAmount = null;
-
- public void enable(boolean enable) {
- etAmount.setEnabled(enable);
- sCurrencyA.setEnabled(enable);
- sCurrencyB.setEnabled(enable);
- }
-
- void setXmr(String xmr) {
- xmrAmount = xmr;
- if (onNewAmountListener != null) {
- onNewAmountListener.onNewAmount(xmr);
- }
- }
-
- public void setAmount(String xmrAmount) {
- if (xmrAmount != null) {
- setCurrencyA(0);
- etAmount.getEditText().setText(xmrAmount);
- 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);
- }
-
- void setCurrencyAdapter(Spinner spinner) {
- List currencies = new ArrayList<>();
- currencies.add(Helper.BASE_CRYPTO);
- if (Helper.SHOW_EXCHANGERATES)
- currencies.addAll(Arrays.asList(getResources().getStringArray(R.array.currency)));
- ArrayAdapter spinnerAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, currencies);
- spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- spinner.setAdapter(spinnerAdapter);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- etAmount = findViewById(R.id.etAmount);
- tvAmountB = findViewById(R.id.tvAmountB);
- sCurrencyA = findViewById(R.id.sCurrencyA);
- sCurrencyB = findViewById(R.id.sCurrencyB);
- evExchange = findViewById(R.id.evExchange);
- pbExchange = findViewById(R.id.pbExchange);
-
- setCurrencyAdapter(sCurrencyA);
- setCurrencyAdapter(sCurrencyB);
-
- // make progress circle gray
- pbExchange.getIndeterminateDrawable().
- setColorFilter(ThemeHelper.getThemedColor(getContext(), R.attr.colorPrimaryVariant),
- 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(final 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
- }
- });
-
- etAmount.getEditText().setOnFocusChangeListener(new OnFocusChangeListener() {
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- if (!hasFocus) {
- doExchange();
- }
- }
- });
-
- etAmount.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() {
- public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
- if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
- || (actionId == EditorInfo.IME_ACTION_DONE)) {
- doExchange();
- return true;
- }
- return false;
- }
- });
-
-
- etAmount.getEditText().addTextChangedListener(new TextWatcher() {
- @Override
- public void afterTextChanged(Editable editable) {
- etAmount.setError(null);
- clearAmounts();
- }
-
- @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;
- Timber.d("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;
- }
-
- public void doExchange() {
- tvAmountB.setText("--");
- // use cached exchange rate if we have it
- if (!isExchangeInProgress()) {
- String enteredCurrencyA = (String) sCurrencyA.getSelectedItem();
- String enteredCurrencyB = (String) sCurrencyB.getSelectedItem();
- if ((enteredCurrencyA + enteredCurrencyB).equals(assetPair)) {
- if (prepareExchange()) {
- exchange(assetRate);
- } else {
- clearAmounts();
- }
- } else {
- clearAmounts();
- startExchange();
- }
- } else {
- clearAmounts();
- }
- }
-
- private void clearAmounts() {
- if ((xmrAmount != null) || (notXmrAmount != null)) {
- tvAmountB.setText("--");
- setXmr(null);
- notXmrAmount = null;
- }
- }
-
- private final ExchangeApi exchangeApi = ServiceHelper.getExchangeApi();
-
- void startExchange() {
- showProgress();
- String currencyA = (String) sCurrencyA.getSelectedItem();
- String currencyB = (String) sCurrencyB.getSelectedItem();
-
- exchangeApi.queryExchangeRate(currencyA, currencyB,
- new ExchangeCallback() {
- @Override
- public void onSuccess(final ExchangeRate exchangeRate) {
- if (isAttachedToWindow())
- new Handler(Looper.getMainLooper()).post(() -> exchange(exchangeRate));
- }
-
- @Override
- public void onError(final Exception e) {
- Timber.e(e.getLocalizedMessage());
- new Handler(Looper.getMainLooper()).post(() -> exchangeFailed());
- }
- });
- }
-
- public void exchange(double rate) {
- if (getCurrencyA() == 0) {
- if (xmrAmount == null) return;
- 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 == null) return;
- 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!
- throw new IllegalStateException("No XMR currency!");
- }
- if (rate == 0)
- tvAmountB.setText("--");
- }
-
- boolean prepareExchange() {
- Timber.d("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;
- Timber.d("cleanAmount = %s", 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!
- Timber.e("No XMR currency!");
- setXmr(null);
- notXmrAmount = null;
- return false;
- }
- Timber.d("prepareExchange() %s", cleanAmount);
- } else {
- setXmr("");
- notXmrAmount = "";
- }
- return true;
- } else {
- setXmr(null);
- notXmrAmount = null;
- return false;
- }
- }
-
- public void exchangeFailed() {
- hideProgress();
- exchange(0);
- if (onFailedExchangeListener != null) {
- onFailedExchangeListener.onFailedExchange();
- }
- }
-
- String assetPair = null;
- double assetRate = 0;
-
- public void exchange(ExchangeRate exchangeRate) {
- hideProgress();
- // first, make sure this is what we want
- String enteredCurrencyA = (String) sCurrencyA.getSelectedItem();
- String enteredCurrencyB = (String) sCurrencyB.getSelectedItem();
- if (!exchangeRate.getBaseCurrency().equals(enteredCurrencyA)
- || !exchangeRate.getQuoteCurrency().equals(enteredCurrencyB)) {
- // something's wrong
- Timber.e("Currencies don't match!");
- return;
- }
- assetPair = enteredCurrencyA + enteredCurrencyB;
- assetRate = exchangeRate.getRate();
- if (prepareExchange()) {
- exchange(exchangeRate.getRate());
- }
- }
-
- private void showProgress() {
- pbExchange.setVisibility(View.VISIBLE);
- }
-
- private boolean isExchangeInProgress() {
- return pbExchange.getVisibility() == 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;
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/PasswordEntryView.java b/app/src/main/java/com/m2049r/xmrwallet/widget/PasswordEntryView.java
deleted file mode 100644
index 6d5fee1..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/widget/PasswordEntryView.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.m2049r.xmrwallet.widget;
-
-import android.content.Context;
-import android.text.Editable;
-import android.text.TextWatcher;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.EditText;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.google.android.material.textfield.TextInputLayout;
-import com.m2049r.xmrwallet.R;
-import com.nulabinc.zxcvbn.Zxcvbn;
-
-public class PasswordEntryView extends TextInputLayout implements TextWatcher {
- final private Zxcvbn zxcvbn = new Zxcvbn();
-
- public PasswordEntryView(@NonNull Context context) {
- super(context, null);
- }
-
- public PasswordEntryView(@NonNull Context context, @Nullable AttributeSet attrs) {
- super(context, attrs, R.attr.textInputStyle);
- }
-
- public PasswordEntryView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- @Override
- public void addView(@NonNull View child, int index, @NonNull final ViewGroup.LayoutParams params) {
- super.addView(child, index, params);
- final EditText et = getEditText();
- if (et != null)
- et.addTextChangedListener(this);
- }
-
- @Override
- public void afterTextChanged(Editable s) {
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- }
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- String password = s.toString();
- int icon = 0;
- if (!password.isEmpty()) {
- final double strength = Math.min(zxcvbn.measure(password).getGuessesLog10(), 15) / 3 * 20; // 0-100%
- if (strength < 21)
- icon = R.drawable.ic_smiley_sad_filled;
- else if (strength < 40)
- icon = R.drawable.ic_smiley_meh_filled;
- else if (strength < 60)
- icon = R.drawable.ic_smiley_neutral_filled;
- else if (strength < 80)
- icon = R.drawable.ic_smiley_happy_filled;
- else if (strength < 99)
- icon = R.drawable.ic_smiley_ecstatic_filled;
- else
- icon = R.drawable.ic_smiley_gunther_filled;
- }
- setErrorIconDrawable(icon);
- if (icon != 0)
- setError(" ");
- else setError(null);
- }
-}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/SendProgressView.java b/app/src/main/java/com/m2049r/xmrwallet/widget/SendProgressView.java
deleted file mode 100644
index 11d5355..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/widget/SendProgressView.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * 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.widget;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.m2049r.xmrwallet.R;
-
-public class SendProgressView extends LinearLayout {
-
- public SendProgressView(Context context, AttributeSet attrs) {
- super(context, attrs);
- initializeViews(context);
- }
-
- public SendProgressView(Context context,
- AttributeSet attrs,
- int defStyle) {
- super(context, attrs, defStyle);
- initializeViews(context);
- }
-
- private void initializeViews(Context context) {
- LayoutInflater inflater = (LayoutInflater) context
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- inflater.inflate(R.layout.view_send_progress, this);
- }
-
-
- View pbProgress;
- View llMessage;
- TextView tvCode;
- TextView tvMessage;
- TextView tvSolution;
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- pbProgress = findViewById(R.id.pbProgress);
- llMessage = findViewById(R.id.llMessage);
- tvCode = findViewById(R.id.tvCode);
- tvMessage = findViewById(R.id.tvMessage);
- tvSolution = findViewById(R.id.tvSolution);
- }
-
- public void showProgress(String progressText) {
- pbProgress.setVisibility(VISIBLE);
- tvCode.setVisibility(INVISIBLE);
- tvMessage.setText(progressText);
- llMessage.setVisibility(VISIBLE);
- tvSolution.setVisibility(INVISIBLE);
- }
-
- public void hideProgress() {
- pbProgress.setVisibility(INVISIBLE);
- llMessage.setVisibility(INVISIBLE);
- }
-
- public void showMessage(String code, String message, String solution) {
- tvCode.setText(code);
- tvMessage.setText(message);
- tvSolution.setText(solution);
- tvCode.setVisibility(VISIBLE);
- llMessage.setVisibility(VISIBLE);
- tvSolution.setVisibility(VISIBLE);
- pbProgress.setVisibility(INVISIBLE);
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/Toolbar.java b/app/src/main/java/com/m2049r/xmrwallet/widget/Toolbar.java
deleted file mode 100644
index 768f8a8..0000000
--- a/app/src/main/java/com/m2049r/xmrwallet/widget/Toolbar.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * 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.widget;
-
-import android.content.Context;
-import android.os.Build;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.google.android.material.appbar.MaterialToolbar;
-import com.m2049r.xmrwallet.R;
-
-import timber.log.Timber;
-
-public class Toolbar extends MaterialToolbar {
- public interface OnButtonListener {
- void onButton(int type);
- }
-
- OnButtonListener onButtonListener;
-
- public void setOnButtonListener(OnButtonListener listener) {
- onButtonListener = listener;
- }
-
- ImageView toolbarImage;
- TextView toolbarTitle;
- TextView toolbarSubtitle;
- ImageButton bSettings;
-
- 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 = findViewById(R.id.toolbarImage);
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
- // the vector image does not work well for androis < Nougat
- toolbarImage.getLayoutParams().width = (int) getResources().getDimension(R.dimen.logo_width);
- toolbarImage.setImageResource(R.drawable.logo_horizontol_xmrujo);
- }
-
- toolbarTitle = findViewById(R.id.toolbarTitle);
- toolbarSubtitle = findViewById(R.id.toolbarSubtitle);
- bSettings = findViewById(R.id.bSettings);
- bSettings.setOnClickListener(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_SETTINGS = 3;
- public final static int BUTTON_CANCEL = 4;
-
- int buttonType = BUTTON_SETTINGS;
-
- public void setButton(int type) {
- switch (type) {
- case BUTTON_BACK:
- Timber.d("BUTTON_BACK");
- bSettings.setImageResource(R.drawable.ic_arrow_back);
- bSettings.setVisibility(View.VISIBLE);
- break;
- case BUTTON_CLOSE:
- Timber.d("BUTTON_CLOSE");
- bSettings.setImageResource(R.drawable.ic_close_white_24dp);
- bSettings.setVisibility(View.VISIBLE);
- break;
- case BUTTON_SETTINGS:
- Timber.d("BUTTON_SETTINGS");
- bSettings.setImageResource(R.drawable.ic_settings);
- bSettings.setVisibility(View.VISIBLE);
- break;
- case BUTTON_CANCEL:
- Timber.d("BUTTON_CANCEL");
- bSettings.setImageResource(R.drawable.ic_close_white_24dp);
- bSettings.setVisibility(View.VISIBLE);
- break;
- case BUTTON_NONE:
- default:
- Timber.d("BUTTON_NONE");
- bSettings.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/res/drawable/ic_monero_qr.xml b/app/src/main/res/drawable/ic_monero_qr.xml
new file mode 100644
index 0000000..2456cf8
--- /dev/null
+++ b/app/src/main/res/drawable/ic_monero_qr.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
deleted file mode 100644
index c6cdff3..0000000
--- a/app/src/main/res/layout/activity_login.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..432bd65
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,19 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_on_boarding.xml b/app/src/main/res/layout/activity_on_boarding.xml
deleted file mode 100644
index cfaf918..0000000
--- a/app/src/main/res/layout/activity_on_boarding.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/activity_wallet.xml b/app/src/main/res/layout/activity_wallet.xml
deleted file mode 100644
index 583b039..0000000
--- a/app/src/main/res/layout/activity_wallet.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/checkbox_confirm.xml b/app/src/main/res/layout/checkbox_confirm.xml
deleted file mode 100644
index 1ff959b..0000000
--- a/app/src/main/res/layout/checkbox_confirm.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/layout/dialog_ledger_progress.xml b/app/src/main/res/layout/dialog_ledger_progress.xml
deleted file mode 100644
index f6bff98..0000000
--- a/app/src/main/res/layout/dialog_ledger_progress.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml
deleted file mode 100644
index 4c698a2..0000000
--- a/app/src/main/res/layout/fragment_about.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_credits.xml b/app/src/main/res/layout/fragment_credits.xml
deleted file mode 100644
index 9bb1d1b..0000000
--- a/app/src/main/res/layout/fragment_credits.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_generate.xml b/app/src/main/res/layout/fragment_generate.xml
deleted file mode 100644
index cf6e4a8..0000000
--- a/app/src/main/res/layout/fragment_generate.xml
+++ /dev/null
@@ -1,214 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_help.xml b/app/src/main/res/layout/fragment_help.xml
deleted file mode 100644
index 7ad2eac..0000000
--- a/app/src/main/res/layout/fragment_help.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..e815152
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml
deleted file mode 100644
index 029689d..0000000
--- a/app/src/main/res/layout/fragment_login.xml
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_node.xml b/app/src/main/res/layout/fragment_node.xml
deleted file mode 100644
index 0fd65a1..0000000
--- a/app/src/main/res/layout/fragment_node.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_privacy_policy.xml b/app/src/main/res/layout/fragment_privacy_policy.xml
deleted file mode 100644
index 002dc05..0000000
--- a/app/src/main/res/layout/fragment_privacy_policy.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_receive.xml b/app/src/main/res/layout/fragment_receive.xml
deleted file mode 100644
index c4bea6e..0000000
--- a/app/src/main/res/layout/fragment_receive.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_review.xml b/app/src/main/res/layout/fragment_review.xml
deleted file mode 100644
index 29af8dd..0000000
--- a/app/src/main/res/layout/fragment_review.xml
+++ /dev/null
@@ -1,259 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_send.xml b/app/src/main/res/layout/fragment_send.xml
deleted file mode 100644
index 20487ea..0000000
--- a/app/src/main/res/layout/fragment_send.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_send_address.xml b/app/src/main/res/layout/fragment_send_address.xml
deleted file mode 100644
index 375e0f0..0000000
--- a/app/src/main/res/layout/fragment_send_address.xml
+++ /dev/null
@@ -1,220 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_send_amount.xml b/app/src/main/res/layout/fragment_send_amount.xml
deleted file mode 100644
index c891e4f..0000000
--- a/app/src/main/res/layout/fragment_send_amount.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_send_btc_amount.xml b/app/src/main/res/layout/fragment_send_btc_amount.xml
deleted file mode 100644
index fd1b9f8..0000000
--- a/app/src/main/res/layout/fragment_send_btc_amount.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_send_btc_confirm.xml b/app/src/main/res/layout/fragment_send_btc_confirm.xml
deleted file mode 100644
index 72a2fb9..0000000
--- a/app/src/main/res/layout/fragment_send_btc_confirm.xml
+++ /dev/null
@@ -1,257 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_send_btc_success.xml b/app/src/main/res/layout/fragment_send_btc_success.xml
deleted file mode 100644
index 74138b3..0000000
--- a/app/src/main/res/layout/fragment_send_btc_success.xml
+++ /dev/null
@@ -1,230 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_send_confirm.xml b/app/src/main/res/layout/fragment_send_confirm.xml
deleted file mode 100644
index 8f987a3..0000000
--- a/app/src/main/res/layout/fragment_send_confirm.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_send_success.xml b/app/src/main/res/layout/fragment_send_success.xml
deleted file mode 100644
index 55585ac..0000000
--- a/app/src/main/res/layout/fragment_send_success.xml
+++ /dev/null
@@ -1,110 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml
new file mode 100644
index 0000000..59d4a98
--- /dev/null
+++ b/app/src/main/res/layout/fragment_settings.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_subaddress.xml b/app/src/main/res/layout/fragment_subaddress.xml
deleted file mode 100644
index f54900f..0000000
--- a/app/src/main/res/layout/fragment_subaddress.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_subaddressinfo.xml b/app/src/main/res/layout/fragment_subaddressinfo.xml
deleted file mode 100644
index 5310fbc..0000000
--- a/app/src/main/res/layout/fragment_subaddressinfo.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_tx_info.xml b/app/src/main/res/layout/fragment_tx_info.xml
deleted file mode 100644
index 194bf11..0000000
--- a/app/src/main/res/layout/fragment_tx_info.xml
+++ /dev/null
@@ -1,362 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ 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
deleted file mode 100644
index 80aa34d..0000000
--- a/app/src/main/res/layout/fragment_wallet.xml
+++ /dev/null
@@ -1,198 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/item_node.xml b/app/src/main/res/layout/item_node.xml
deleted file mode 100644
index 873d1b6..0000000
--- a/app/src/main/res/layout/item_node.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/item_spinner.xml b/app/src/main/res/layout/item_spinner.xml
deleted file mode 100644
index 17ccda1..0000000
--- a/app/src/main/res/layout/item_spinner.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
diff --git a/app/src/main/res/layout/item_spinner_balance.xml b/app/src/main/res/layout/item_spinner_balance.xml
deleted file mode 100644
index 17e5950..0000000
--- a/app/src/main/res/layout/item_spinner_balance.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
diff --git a/app/src/main/res/layout/item_spinner_dropdown_item.xml b/app/src/main/res/layout/item_spinner_dropdown_item.xml
deleted file mode 100644
index 4d05bea..0000000
--- a/app/src/main/res/layout/item_spinner_dropdown_item.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
diff --git a/app/src/main/res/layout/item_subaddress.xml b/app/src/main/res/layout/item_subaddress.xml
deleted file mode 100644
index 5348a28..0000000
--- a/app/src/main/res/layout/item_subaddress.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/item_transaction.xml b/app/src/main/res/layout/item_transaction.xml
deleted file mode 100644
index 9edf678..0000000
--- a/app/src/main/res/layout/item_transaction.xml
+++ /dev/null
@@ -1,116 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/item_wallet.xml b/app/src/main/res/layout/item_wallet.xml
deleted file mode 100644
index 4d18aef..0000000
--- a/app/src/main/res/layout/item_wallet.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ 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
deleted file mode 100644
index 71db0eb..0000000
--- a/app/src/main/res/layout/layout_fabmenu.xml
+++ /dev/null
@@ -1,232 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/nav_header.xml b/app/src/main/res/layout/nav_header.xml
deleted file mode 100644
index 774df12..0000000
--- a/app/src/main/res/layout/nav_header.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/prompt_changepw.xml b/app/src/main/res/layout/prompt_changepw.xml
deleted file mode 100644
index 7d8e8f7..0000000
--- a/app/src/main/res/layout/prompt_changepw.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/prompt_editnode.xml b/app/src/main/res/layout/prompt_editnode.xml
deleted file mode 100644
index 9b86c99..0000000
--- a/app/src/main/res/layout/prompt_editnode.xml
+++ /dev/null
@@ -1,159 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/prompt_ledger_seed.xml b/app/src/main/res/layout/prompt_ledger_seed.xml
deleted file mode 100644
index a4f5712..0000000
--- a/app/src/main/res/layout/prompt_ledger_seed.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/prompt_password.xml b/app/src/main/res/layout/prompt_password.xml
deleted file mode 100644
index fe307b9..0000000
--- a/app/src/main/res/layout/prompt_password.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/prompt_rename.xml b/app/src/main/res/layout/prompt_rename.xml
deleted file mode 100644
index 5446ea4..0000000
--- a/app/src/main/res/layout/prompt_rename.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/template_notice.xml b/app/src/main/res/layout/template_notice.xml
deleted file mode 100644
index 48103e8..0000000
--- a/app/src/main/res/layout/template_notice.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/view_exchange.xml b/app/src/main/res/layout/view_exchange.xml
deleted file mode 100644
index b354a2b..0000000
--- a/app/src/main/res/layout/view_exchange.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/view_exchange_edit.xml b/app/src/main/res/layout/view_exchange_edit.xml
deleted file mode 100644
index 1ba5dfa..0000000
--- a/app/src/main/res/layout/view_exchange_edit.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/view_onboarding.xml b/app/src/main/res/layout/view_onboarding.xml
deleted file mode 100644
index 1076b57..0000000
--- a/app/src/main/res/layout/view_onboarding.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/view_send_progress.xml b/app/src/main/res/layout/view_send_progress.xml
deleted file mode 100644
index 4151940..0000000
--- a/app/src/main/res/layout/view_send_progress.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/view_toolbar.xml b/app/src/main/res/layout/view_toolbar.xml
deleted file mode 100644
index 0c16bbd..0000000
--- a/app/src/main/res/layout/view_toolbar.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/create_wallet_keys.xml b/app/src/main/res/menu/create_wallet_keys.xml
deleted file mode 100644
index ce118cb..0000000
--- a/app/src/main/res/menu/create_wallet_keys.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/create_wallet_ledger.xml b/app/src/main/res/menu/create_wallet_ledger.xml
deleted file mode 100644
index 8bd54cb..0000000
--- a/app/src/main/res/menu/create_wallet_ledger.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/create_wallet_new.xml b/app/src/main/res/menu/create_wallet_new.xml
deleted file mode 100644
index 30d6a22..0000000
--- a/app/src/main/res/menu/create_wallet_new.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/create_wallet_seed.xml b/app/src/main/res/menu/create_wallet_seed.xml
deleted file mode 100644
index 0c89dd4..0000000
--- a/app/src/main/res/menu/create_wallet_seed.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/create_wallet_view.xml b/app/src/main/res/menu/create_wallet_view.xml
deleted file mode 100644
index fe6baa8..0000000
--- a/app/src/main/res/menu/create_wallet_view.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/drawer_view.xml b/app/src/main/res/menu/drawer_view.xml
deleted file mode 100644
index 7336710..0000000
--- a/app/src/main/res/menu/drawer_view.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/list_context_menu.xml b/app/src/main/res/menu/list_context_menu.xml
deleted file mode 100644
index 4e78794..0000000
--- a/app/src/main/res/menu/list_context_menu.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/list_menu.xml b/app/src/main/res/menu/list_menu.xml
deleted file mode 100644
index f660304..0000000
--- a/app/src/main/res/menu/list_menu.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/node_menu.xml b/app/src/main/res/menu/node_menu.xml
deleted file mode 100644
index 82a2aee..0000000
--- a/app/src/main/res/menu/node_menu.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/receive_menu.xml b/app/src/main/res/menu/receive_menu.xml
deleted file mode 100644
index e3ece5c..0000000
--- a/app/src/main/res/menu/receive_menu.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/send_menu.xml b/app/src/main/res/menu/send_menu.xml
deleted file mode 100644
index fabbf27..0000000
--- a/app/src/main/res/menu/send_menu.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/tx_info_menu.xml b/app/src/main/res/menu/tx_info_menu.xml
deleted file mode 100644
index 710ac36..0000000
--- a/app/src/main/res/menu/tx_info_menu.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/wallet_details_help_menu.xml b/app/src/main/res/menu/wallet_details_help_menu.xml
deleted file mode 100644
index 92a8067..0000000
--- a/app/src/main/res/menu/wallet_details_help_menu.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
\ 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
deleted file mode 100644
index 45dc6d7..0000000
--- a/app/src/main/res/menu/wallet_details_menu.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/wallet_menu.xml b/app/src/main/res/menu/wallet_menu.xml
deleted file mode 100644
index 32f5e65..0000000
--- a/app/src/main/res/menu/wallet_menu.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/navigation/main_nav.xml b/app/src/main/res/navigation/main_nav.xml
new file mode 100644
index 0000000..4b935ce
--- /dev/null
+++ b/app/src/main/res/navigation/main_nav.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-cat/about.xml b/app/src/main/res/values-cat/about.xml
deleted file mode 100644
index 65923cf..0000000
--- a/app/src/main/res/values-cat/about.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
- Tancar
- Sóc en monerujo
- Versió %1$s (%2$d)
-
- Credits
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo, ErCiccione et al.
-
Aquesta pàgina us informa de les nostres polítiques relatives a la recopilació,
- ús i divulgació de la informació personal que rebem dels usuaris de la nostra
- aplicació (monerujo: Monero Wallet).
-
-
Mitjançant l’ús d’aquesta aplicació vostè accepta la recopilació i l’ús de la informació d’acord amb aquesta política.
-
-
Dades Recopilades
-
Les dades personals són qualsevol tipus de dades que puguin identificar un individu.
-
-
Les claus i les adreces públiques de Monero són recollides i processades per l’aplicació de forma local per tal de processar les transaccions i transmetre-les a la xarxa Monero de forma encriptada.
-
-
L’aplicació no recopila altres dades personals.
-
Si utilitzeu la funcionalitat d’intercanvi (opcional), monerujo obté el canvi
- a través de l’API pública de coinmarketcap.com.
- Consulteu la seva política de privacitat a https://coinmarketcap.com/privacy per a més detalls sobre com es recullen les dades de les vostres peticions
-
Si utilitzeu l’aplicació per pagar a adreces BTC, utilitzareu el servei SideShift.ai.
- Consulteu la seva política de privacitat a https://sideshift.ai/ per obtenir més informació. Monerujo els envia l’adreça de destinació de BTC i la quantitat. La vostra IP també podrà ser recollida.
-
Permisos de la App
-
-
INTERNET : Connectar a la xarxa Monero mitjançant un Node Daemon de Monero
-
READ_EXTERNAL_STORAGE : Llegir els arxius del portamonedes emmagatzemats al dispositiu
-
WRITE_EXTERNAL_STORAGE : Escriure els arxius del portamonedes emmagatzemats al dispositiu
-
WAKE_LOCK : Mantenir el dispositiu despert durant la sincronització
-
CAMERA : Escanejar codis QR per rebre Monero
-
-
Canvis en aquesta Política de Privacitat
-
És possible que actualitzem aquesta política de privacitat de tant en tant. Li notificarem de qualsevol canvi publicant la nova política de privacitat a l’aplicació i al lloc web (www.monerujo.io)
- Us recomanem que reviseu aquesta política de privacitat periòdicament per conèixer els canvis.
-
Aquesta Política de Privacitat es va actualitzar per darrer cop: 10th November, 2017.
-
-
Contacti amb nosaltres
-
Si teniu alguna consulta sobre la nostra política de privadesa,
- o com es recullen i processen les vostres dades,
- si us plau envieu un correu electrònic a privacy@monerujo.io.
-
Introduïu un nom i contrasenya únics del portamonedes.
- La contrasenya s’utilitza per protegir les dades del seu portamonedes en el dispositiu. Utilitzeu una contrasenya sòlida - encara millor si utiliza una frase.
-
Apunteu la vostra llavor mnemotècnica!
-
A la pantalla següent trobareu la vostra "Llavor Mnemotècnica" de 25 paraules.
- Aquestes són les úniques dades necessàries per a recuperar el vostre portamonedes i obtenir accés total als vostres fons.
- Mantenir-la segura i privada és molt important ja que permet que qualsevol persona tingui accés total als vostres fons!.
-
Si perdeu la contrasenya del portamonedes encara podrieu recuperar-lo amb la llavor Mnemotècnica.
-
La llavor Mnemotècnica tampoc no es pot canviar mai, i si és robada o compromesa d’alguna manera haureu de traslladar els vostres fons a un nou portamonedes (amb una nova llavor mnemotècnica). Per tant, es recomana que feu còpies de seguretat de la vostra llavor mnemotècnica escrivint-la i emmagatzemant-la a múltiple llocs de forma segura.
- ]]>
-
- Crear Portamonedes - Llavor
-
Si ja teniu una adreça Monero i voleu recuperar les transaccions de la blockchain!
-
Introduïu un nom i contrasenya únics del portamonedes.
- La contrasenya s’utilitza per protegir les dades del seu portamonedes en el dispositiu. Utilitzeu una contrasenya sòlida - encara millor si utiliza una frase.
-
Introduïu la Llavor en el camp \"Llavor Mnemotècnica\".
-
Introduïu el número de bloc de la primera transacció realitzada en aquesta adreça en el camp "Restaurar Alçada". També podeu utilitzar una data en el format AAAA-MM-DD. Si no esteu segurs, introduïu una data / alçada de bloc aproximada abans d’haver fer servir aquesta adreça del portamonedes.
- ]]>
-
- Crear Portamonedes - Ledger
-
Si voleu recuperar el vostre portamonedes desde un dispositiu Ledger Nano S!
-
Les vostres claus secretes no surten mai del dispositiu Ledger, de manera que necessiteu que estigui connectat sempre que vulgueu accedir aal vostre portamonedes.
-
Introduïu un nom i contrasenya únics del portamonedes. La contrasenya s’utilitza per protegir les dades de la seva cartera al dispositiu Android. Utilitzeu una contrasenya sòlida - encara millor si utiliza una frase.
-
Introduïu el número de bloc de la primera transacció realitzada en aquesta adreça en el camp "Restaurar Alçada". També podeu utilitzar una data en el format AAAA-MM-DD. Si no esteu segurs, introduïu una data / alçada de bloc aproximada abans d’haver fer servir aquesta adreça del portamonedes.
- ]]>
-
- Crear Portamonedes - Claus
-
Si voleu recuperar el vostre portamonedes fent servir les vostres claus!
-
Introduïu un nom i contrasenya únics del portamonedes. La contrasenya s’utilitza per protegir les dades de la seva cartera al dispositiu. Utilitzeu una contrasenya sòlida - encara millor si utiliza una frase.
-
Introduïu la vostra Adreça Monero en el camp \"Adreça Pública\" i ompliu \"Clau de Visualització\" i \"Clau de Despesa\"
-
Introduïu el número de bloc de la primera transacció realitzada en aquesta adreça en el
- camp "Restaurar Alçada". També podeu utilitzar una data en el format AAAA-MM-DD. Si no esteu segurs, introduïu una data / alçada de bloc aproximada abans d’haver fer servir aquesta adreça del portamonedes.
- ]]>
-
- Crear Portamonedes - Només de Lectura
-
Si només voleu monitoritzar les transaccions entrants del portamonedes!
-
Introduïu un nom i contrasenya únics del portamonedes. La contrasenya s’utilitza per protegir les dades de la seva cartera al dispositiu. Utilitzeu una contrasenya sòlida - encara millor si utiliza una frase.
-
Introduïu la vostra Adreça Monero en el camp \"Adreça Pública\" i ompliu \"Clau de Visualització\".
-
Introduïu el número de bloc de la primera transacció realitzada en aquesta adreça en el camp "Restaurar Alçada". També podeu utilitzar una data en el format AAAA-MM-DD. Si no esteu segurs, introduïu una data / alçada de bloc aproximada abans d’haver fer servir aquesta adreça del portamonedes.
- ]]>
-
- Detalls del portamonedes
-
Adreça pública
- La vostra adreça pública és com el vostre número de compte bancari que podeu compartir amb qualsevol persona sense haver de tenir por de perdre el vostres Monero. La gent enviarà Monero al seu portamonedes mitjançant aquesta adreça.
-
Clau Mnemotècnica
- Aquestes són les úniques dades necessàries per a recuperar el vostre portamonedes i obtenir accés total als vostres fons.
- Mantenir-la segura i privada és molt important ja que permet que qualsevol persona tingui accés total als vostres fons! Si no us heu escrit en cap lloc segur, feu-ho!
-
Contrasenya de Recuperació d’Arxius del Portamonedes
- Assegureu-vos que heu escrit aquesta contrasenya. Si restabliu el dispositiu o desinstal·leu l’aplicació, la necessitarà per tornar a accedir al seu portamonedes.
-
CrAzYsenya
- Si la contrasenya que es mostra aquí és de 52 caràcters alfanumèrics en grups de 4 - felicitats!
- Els fitxers del portamonedes estan protegits amb una clau de 256 bits generada per la funció de seguretat del vostre dispositiu basades en la contrasenya que heu triat (durant la creació o al canviar-la). Això ho fa extremadament difícil de piratejar!
- Aquesta opció és obligatoria per a tots els nous portamonedes.
-
Contrasenya de Llegat
- Si veieu la vostra contrasenya aquí, els fitxers del portamonedes no estan tan segurs com quan s’utilitza la CrAzYsenya. Per solucionar-ho, seleccioneu \"Canviar Contrasenya\" des del menú. Després d’entrar una nova contrasenya (potser fins i tot la mateixa que abans) l’aplicació generarà una CrAzYsenya per a protegir els vostres arxius del portamonedes. Anoteu-la!
-
CrAzYsenya del Portamonedes
- Si mai necessiteu tornar a instal·lar Monerujo (per exemple, després de restablir el telèfon o canviar-lo per un de nou) o voleu utilitzar els arxius del portamonedes en un altre dispositiu o PC, cal que ho feu utilitzant aquesta Contrasenya de Recuperació (CrAzYsenya) per tornar a accedir al vostre portamonedes.
- En seleccionar \"Canviar Contrasenya\" des del menú, podeu triar una nova contrasenya. Aneu amb compte que això generarà una nova Contrasenya de Recuperació (CrAzYsenya). Anoteu-la!
-
Clau de Visualització
- La vostra clau de visualització es pot utilitzar per monitoritzar les transaccions entrants al vostre portamonedes sense donar-ne permís per gastar els fons a dins seu.
-
Clau de Despesa
- La vostra clau de despesa permet a qualsevol persona gastar els Monero associats al seu portamonedes, així que no ho compartiu amb ningú, mantingueu-la segura com la vostra Llavor Mnemotècnica.
- ]]>
-
- Llista de Portamonedes
-
Node
-
Monerujo utilitza un node remot per comunicar-se amb la xarxa Monero sense necessitat
- de descarregar i emmagatzemar una còpia de tota la blockchain sencera. Podeu trobar una llista dels nodes remots més populars o aprendre a configurar el vostre propi node remot aquí https://moneroworld.com/
-
Monerujo té alguns Nodes remots incorporats. Se’n recorda dels últims cinc nodes empleats.
-
Portamonedes
-
Aquí podeu veure els portamonedes. Es troben a la carpeta monerujo
- dins l’emmagatzematge intern del dispositiu. Podeu utilitzar una aplicació d’exploració d’arxius per veure’ls. Haurieu de fer còpies de seguretat d’aquesta carpeta de manera regular en un emmagatzematge extern al dispositiu en cas que el vostre dispositiu exploti o el robin.
-
Seleccioneu una portamonedes per obrir-lo o premeu el botó "+" per crear-ne un de nou.
- O seleccioneu una de les operacions del portamonedes:
-
Detalls
-
Mostra els detalls del portamonedes, la llavor i les seves claus.
-
Rebre
-
Crea un codi QR per rebre Moneroj.
-
Canvi de Nom
-
Canvia el nom del portamonedes. El canvi de nom no afecta a les còpies de seguretat.
-
Còpia de Seguretat
-
Feu una còpia del portamonedes en la carpeta backups dins del monerujo
- per a sobreescriure còpies anteriors.
-
Arxiu
-
Feu una còpia de seguretat i a continuació elimineu el portamonedes. La còpia es mantindrà a la carpeta backups . Si ja no necessiteu les vostres còpies de seguretat les haureu d’eliminar amb un explorador d’arxius o una aplicació segura.
- ]]>
-
- Detalls de Transacció
-
Destí
- Aquesta és l’adreça pública del portamonedes on esteu enviant els Monero.
-
ID de Pagament
- Podeu utilitzar un ID de pagament per identificar el motiu pel qual heu enviat a Monero entre dues parts. Això és totalment opcional i privat. Per exemple, això pot permetre a una empresa associar la transacció amb un article que heu comprat.
-
ID de Transacció
- Aquest és el vostre ID de transacció que podeu utilitzar per identificar la vostra transacció oculta en un Explorador de Blockchain de Monero com https://xmrchain.net/
-
Clau de Transacció
- Aquesta és la vostra clau privada de transacció, manteniu-la segureta ja que mostrar-la a tercers els revelia quina signatura dins un anell és la vostra, fent que la vostra transacció sigui transparent.
-
Bloc
- Aquest és el bloc de la cadena de Monero on la vostra transacció ha estat inclosa.
- ]]>
-
- Enviar
-
Adreça del Receptor
-
Aquesta és l’adreça pública del portamonedes a la qual esteu enviant Moneroj. Podeu copiar-la al porta-retalls, escanejar un codi QR o introduir-la manualment. Assegureu- vos de confirmar-ho a consciencia i que no estigueu enviant monedes a la direcció incorrecta.
-
A més d’utilitzar una adreça XMR, també podeu utilitzar
-
-
un OpenAlias per XMR o BTC
-
una adreça BTC
-
- Tingueu en compte que l’enviament de BTC es duu a terme a través del servei SideShift.ai (consulteu https://sideshift.ai per a més detalls). Consulteu la secció sobre l’enviament de BTC més avall.
-
Enviant BTC
-
SideShift.ai
-
SideShift.ai és un servei de tercers que fa proporciona el canvi de Monero a Bitcoin.
- Nosaltres fem servir l’API SideShift.ai per integrar els pagaments de Bitcoin a Monerujo. Si us plau, doneu un cop d’ull a https://sideshift.ai i decidiu vosaltres mateixos si és una cosa que volgueu utilitzar. L’equip de Monerujo no està associat amb SideShift.ai i no pot oferir assistència amb el seu servei.
-
Tipus de Canvi SideShift.ai
-
A la pantalla \"Quantitat\" es mostraran els paràmetres actuals del servei SideShift.ai. Aquests
- inclouen el tipus de canvi actual, així com els límits de BTC superiors i inferiors. Tingueu en compte que la tarifa no està garantida en aquell mateix moment.
-
Ordre de compra SideShift.ai
-
A la pantalla \"Confirmar\", veureu l’ordre de compra SideShift.ai real. Aquesta comanda és vàlida per a
- un temps limitat: és possible que veieu un compte enrere en el botó \"Gastar\". El tipus de canvi pot
- ser diferent del mostrat en pantalles anteriors.
-
Clau Secreta SideShift.ai
-
Com que Monerujo només gestiona la part Monero de la vostra transacció, la vostra clau secreta per SideShift.ai es pot utilitzar per fer el seguiment de la part de Bitcoin de la vostra comanda a la pàgina principal de SideShift.ai.
-
Compte enrere SideShift.ai!
-
Una vegada el compte enrere arribi a zero haureu d’obtenir una nova sol·licitud de SideShift.ai tornant enrere al pas anterior i després tornar a la pantalla de \"Confirmar\".
- ]]>
-
- Enviant BTC
-
SideShift.ai
-
SideShift.ai és un servei de tercers que fa proporciona el canvi de Monero a Bitcoin.
- Nosaltres fem servir l’API SideShift.ai per integrar els pagaments de Bitcoin a Monerujo. Si us plau, doneu un cop d’ull a https://sideshift.ai i decidiu vosaltres mateixos si és una cosa que volgueu utilitzar. L’equip de Monerujo no està associat amb SideShift.ai i no pot oferir assistència amb el seu servei.
-
Tipus de Canvi SideShift.ai
-
A la pantalla \"Quantitat\" es mostraran els paràmetres actuals del servei SideShift.ai. Aquests
- inclouen el tipus de canvi actual, així com els límits de BTC superiors i inferiors. Tingueu en compte que la tarifa no està garantida en aquell mateix moment.
-
Ordre de compra SideShift.ai
-
A la pantalla \"Confirmar\", veureu l’ordre de compra SideShift.ai real. Aquesta comanda és vàlida per a
- un temps limitat: és possible que veieu un compte enrere en el botó \"Gastar\". El tipus de canvi pot
- ser diferent del mostrat en pantalles anteriors.
-
Clau Secreta SideShift.ai
-
Com que Monerujo només gestiona la part Monero de la vostra transacció, la vostra clau secreta per SideShift.ai es pot utilitzar per fer el seguiment de la part de Bitcoin de la vostra comanda a la pàgina principal de SideShift.ai.
-
Compte enrere SideShift.ai!
-
Una vegada el compte enrere arribi a zero haureu d’obtenir una nova sol·licitud de SideShift.ai tornant enrere al pas anterior i després tornar a la pantalla de \"Confirmar\".
- ]]>
-
- El Portamonedes
-
Mode de carrer
-
El mode de carrer es pot habilitar / desactivar des del menú o a la icona principal de Gunther. En aquest mode, el vostre balanç no es mostra a cap pantalla perquè pugueu utilitzar la vostra cartera amb seguretat al carrer, al pub o qualsevol lloc públic. Les transaccions anteriors també estan ocultes. Es mostraran les noves transaccions perquè pogueu veure que heu enviat / rebut els vostres estimats Moneroj!
-
Escanejant
- Perquè a Monero li agrada mantenir les coses privades, cada cop que obri un portamonedes Monerujo hem d’escanejar la blockchain per veure si s’han enviat nous moneroj al seu portamonedes. Això només emmagatzema l’informació al telèfon que pertany al seu portamonedes. De vegades pot trigar una estona perquè no s’ha sincronitzat en molt de temps.
-
El Balanç
-
Ajuda! El balanç del meu portamonedes ha desaparegut o consta com a no confirmat!
- No patiu! Quan envieu fons desde el vostre portamonedes part del balanç apareixerà com a no confirmat de forma temporal.
- Això succeeix pel fet de com Monero és intercanviat a través de la blockchain i com es produeix el canvi.
- Podeu llegir més sobre el canvi a https://getmonero.org/resources/moneropedia/change.html
-
Llista de Transacció
-
Llistat de les transaccions del portamonedes. Els portamonedes de visualització només mostraran les transaccions entrants.
- ]]>
-
- Nodes
-
TL;DR
-
Actualitzeu la llista de nodes prement cap avall; marqueu 3–5 nodes per permetre a Monerujo
- triar el millor per a tu!
-
Què és un Node?
-
Monerujo utilitza un Node Remot (de vegades també anomenat daemon) per comunicar-se
- la xarxa Monero sense haver de descarregar i emmagatzemar una còpia de
- tota la blockchain mateixa.
-
Llista de Nodes
-
Si la llista està buida, podeu afegir nous nodes manualment o deixar que Monerujo
- escanegi la xarxa per vostè. O ambdós. Llegiu …
-
La llista de nodes mostra tots els nodes coneguts. A més, la marca de temps
- de l’últim bloc conegut per a cada node es mostra sota el nom del node. La icona
- que representa el temps de resposta del node
- (que indica el nivell de connectivitat estimat)
- es mostra al costat de cada node.
-
Es pot marcar qualsevol node de la llista per utilitzar-lo més endevant.
- Es descartaràn els nodes que no hagin estat seleccionats.
-
Monerujo escollirà el node òptim (marcat) cada vegada que l’utilitzeu.
- Això ho fa mitjançant la comprovació de l’alçada de bloc (com d’actualitzat
- està el node?), així com el temps de resposta (què tan ràpidament respon el node a les peticions?).
-
La llista s’ordena per aquestes característiques, de manera que el node superior seria el que Monerujo
- triaria ara mateix. La part inferior de la llista mostraria els nodes més lents o no disponibles.
-
Afegir Node
-
Si premeu el botó "Afegir Node" a la part inferior, se us demanarà
- que introduïu els detalls del node al següent diàleg.
- El "Adreça" és el nom del servidor o adreça IP del node - aquesta és la única
- entrada obligatòria.
- Introduïu el "Port" si el node s’executa en un port no predeterminat (per exemple, 18089).
- També podeu anomenar opcionalment el node, de manera que el pugueu identificar més fàcilment més endavant.
- Alguns nodes necessiten credencials per utilitzar-los. Introduïu el nom d’usuari i
- contrasenya proporcionats als camps corresponents. Ara podeu "Test" aquesta configuració.
- Els "Resultats de les Proves" mostraran l’alçada de bloc, el temps de resposta i l’IP real.
- El resultat també pot ser un error - generalment perquè el nom del servidor proporcionat no és
- accessible dins d’un temps raonable o les credencials són incorrectes.
- O la combinació de nom del servidor/port no apunta cap a un node real de Monero!
- Un cop aprovada la prova (sense error), ja estás llest per prémer "D’acord" per desar iamp;
- marcar aquest node.
-
Escanejar Nodes
-
A més, podeu escanejar la xarxa per buscar nodes. Monerujo començarà
- escanejant la xarxa per als nodes remots al port 18089. Començarà per preguntar als vostres
- nodes marcats per altres companys de la xarxa P2P de Monero, i després continuarà
- preguntant-los per als seus companys, etc. Si no teniu cap node marcat
- (o no ens informen sobre els seus companys),
- Monerujo anirà directament als nodes de llavor de Monero codificats a dins de Monero.
- L’escaneig s’atura quan troba un total de 10 nodes remots.
- ]]>
-
- Fer servir un enllaç de pagament
-
Heu iniciat monerujo amb un enllaç de pagament. Per enviar fons, feu el següent:
-
- 1. Obrir el portamonedes desde la qual voleu gastar els fons
- 2. Espereu fins que es sincronitzi el portamonedes i el botó de "Donar" apareixi
- 3. Premeu el botó de "Donar"
-
-
Els detalls de pagament es completaran. Comproveu-les i continueu com a qualsevol altra transacció.
- ]]>
-
- Ja ho tinc!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-cat/strings.xml b/app/src/main/res/values-cat/strings.xml
deleted file mode 100644
index 7be3375..0000000
--- a/app/src/main/res/values-cat/strings.xml
+++ /dev/null
@@ -1,450 +0,0 @@
-
-
- Portamonedes
-
- Sobre
- Política de Privacitat
-
- Compartir
- Ajuda
- Rebre
- Canvi de nom
- Còpia de seguretat
- Canvi de contrasenya
-
- Segueix escrivint …
- Més o menys…
- Vinga, ho pots fer millor!
- Força bé, pero millorbale …
- Genial, ets tot un hacker!
-
- Portamonedes
- Crèdits
- D\'acord
- Cancel·lar
- Tancar
- Informació més detallada
-
- Enviat correctament!
- Fet
-
- Premi aquí per mostrar codi QR
-
- Pagament amb BTC habilitat, premi aquí per més informació.
- Ledger habilitat, premi aquí per més informació.
-
- Heu introduït una adreça %1$s.
- Està a punt d\'enviar XMR i el destinatari rebrà %1$s a través del servei SideShift.ai service.
- ]]>
-
- Ordre SideShift.ai
-
- %1$s %2$s
-
- Confirmació Pendent
- Pagament Pendent
- Error de SideShift.ai (%1$s)
- %1$s Enviats!
- Consultant …
-
- You can send %1$s — %2$s %4$s.
- SideShift.ai està oferint una tasa de canvi de %3$s %4$s/XMRen aquest moment.
- ]]>
-
- Balanç: %2$s %3$s (%1$s XMR)
-
- ✔ ID de pagment integrat
- Preparant la seva transacció
-
- Creant ordre SideShift.ai
- Consultant ordre SideShift.ai
- Preparant transacció Monero
-
- Consultant paràmetres SideShift.ai
-
- ERROR SideShift.ai
- Codi: %1$d
-
- Premi aquí per tornar-ho a intentar
- Vatua l\'olla! Sembla ser que estem encallats!
- Ups, sembla que SideShift.ai no està disponible ara mateix!
-
- %1$s %3$s = %2$s XMR
- (Canvi: %1$s %2$s/XMR)
-
- Visita SideShift.ai per suport i seguiment
- Clau secreta\nSideShift.ai
- Clau secreta SideShift.ai
- Adreça %1$s de destí
- Quantitat
-
- ID de transacció
- Adreça de destí
- Notes
-
- Còpia de seguretat en curs
- Arxiu en curs
- Canvi de nom en curs
- Canvi de contrasenya en curs
-
- Posant les coses al see bloc …\nAixò pot trigar una estona!
-
- Còpia de seguretat amb èxit
- Còpia de seguretat fallida!
- Canvi de nom fallit!
- Canvi de contrasenya fallit!
- La contrasenya ha canviat
-
- Node
- Carregant Portamonedes …
- Portamonedes desat
- Ha fallat el desat del portamonedas!
- Connectant …
- Ha fallat la connexió del node!\nComprovar nom d\'usuari/contrasenya
- Versió del node incompatible - actualitzi si us plau!
- Node invàlid!\nProvi un altre.
- No es pot arribar al node!\nTorni-ho a intentar o esculpí un altre.
-
- Desconectat
-
- Transacció fallida: %1$s
-
- Has esperat massa temps, estaquirot!
-
- Encara estic ocupat amb el teu últim portamonedes …
-
- Canvi de nom %1$s
-
- Nova contrasenya per %1$s
- Repetir contrasenya per %1$s
- Contrasenya per %1$s
- Pots obrir el portamonedes fent servir l\'empremta digital.\nPremi el sensor.
- Obrint el portamonedes…
- Empremta no reconeguda. Torni-ho a intentar.
- Contrasenya incorrecta!
- La contrasenya desada és incorrecta.\nIntrodueixi la contrasenya manualment.
- El portamonedes no existeix!
- S\'ha de configurar el node!
- El portamonedes no coincideix amb la xarxa seleccionada
-
- (Només de Visualització)
-
- Rebre
- Enviar
-
- + %1$s XMR sense confirmar
-
- Servei de monerujo
-
- Sincronitzat:
- Blocs restants
- Escanejant:
-
- L’emmagatzematge extern no es pot escriure! Pànic!
- De veritat que necessitem els permisos per l\'Emmagatzematge Extern!
- Sense càmara = Cap escaneig QR!
-
- Clau de visualització
- Adreça Pública
- Clau
- Clau de visualització copiada al porta-retalls!
- Clau de SideShift.ai copiada al porta-retalls!
- Adreça del portamonedes copiada al porta-retalls!
- ID de transacció copiada al porta-retalls!
- S\'ha inhabilitat la funció de copiar per raons de seguretat!
-
- No s\'ha pogut obtenir el tipus de canvi!\nUtilitzi XMR/XMR o torni-ho a intentar
-
- Crear portamonedes
- Nom del portamonedes
- Contrasenya del portamonedes
- Permetre obrir el portamonedes amb l\'empremta digital
- Autenticació d’empremta digitals
-
Amb l’autenticació d’empremta digital habilitada podeu veure el balanç del portamonedes i rebre fons
- sense la necessitat d’introduir la contrasenya.
-
Per a més seguretat, monerujo encara us demanarà que introduïu la contrasenya per
- veure els detalls del portamonedes o enviar fons.
- Advertència de seguretat
-
Finalment, monerujo vol recordar-li que qualsevol que pugui obtenir la seva empremta digital serà
- capaç d’observar el balanç del seu portamonedes.
-
Per exemple, un usuari maliciós del vostre voltant pot obrir la vostra cartera quan esteu dormint.
- Esteu segurs d’habilitar aquesta funcionalitat?
- ]]>
- La contrasenya no coincideix
- La contrasenya no pot estar buida
- Fes-me un portamonedes ara mateix!
- Ja ho he apuntat tot!
-
- Dona\'m un nom!
- El portamonedes ja existeix!
- No pot començar amb .
- Creant portamonedes
- Portamonedes creat
-
- Introduïu un número o una data (AAAA-MM-DD)
-
- Claus
- Nou
- Llavor
- Visualitzar
-
- Adreça Pública
- Clau de Visualització
- Clau de Despeses
- Llavor Mnemòtica de 25 paraules
- Restablir Alçada o Data (AAAA-MM-DD)
-
- Adreça Pública
- Clau de Visualització
- Clau de Despeses
- Llavor Mnemòtica
- Contrasenya de Restauració per l\'Arxiu del Portamonedes
-
- Introduïu una clau vàlida
- Introduïu una adreça vàlida
- Introduïu la vostra llavor de 25 paraules
-
- Notes privades (opcional)
- Generar
- Spend my sweet Moneroj
- Gastar els meus estimats Moneroj (%1$s)
- No es un codi QR
- No es un codi de pagament QR vàlid
- No es una adreça vàlida
- La direcció OpenAlias no està disponible
- OpenAlias segur ✔
- Resolent OpenAlias…
- OpenAlias sense DNSSEC - l\'adreça pot ser compromesa
- Enviar
- Balanç: %1$s XMR
- Adreça
- Quantitat
- Confirmar
- Fet
-
- Quantitat
- Comissió (XMR)
- Comissió
- Total (XMR)
- Total
-
- %1$s XMR
- +%1$s Comissió
-
- Error creant la transacció
-
- Comissió %1$s
- (%1$s)
- fallit
- - %1$s
- + %1$s
-
- Marca de temps
- ID de transacció
- Clau de transacció
- Destí
- ID de pagament
- Bloc
- Quantitat
- Comissió
- Transferències
- Notes
- (opcional)
- Detalls de Transacció
-
- PENDENT
- FALLIT
-
- Quantitat
- Descripció (opcional)
- No s\'ha pogut obrir el portamonedes!
-
- Màx. %1$s
- Mín. 0
- XMR no és un número
-
- Ara es mostrarà informació delicada.\nEsteu a l\'aguait!
- Estic segur
- Torna\'m enrere!
- Detalls
-
- Si, fes-ho!
- No gràcies!
-
- Crear un nou portamonedes
- Restablir portamonedes de només lectura
- Restablir portamonedes desde les claus privades
- Restablir portamonedes desde la llavor de 25 paraules
-
- Crear Compte
- Nou compte afegit #%1$d
- Compte #
-
- Envia tots els fons confirmats cap aquest compte!
- Subadreces
- Subadreces Públiques #%1$d: %2$s
-
- Idioma
- Utilitzar Idioma del Sistema
-
- Restablir desde Ledger Nano
-
- Comunicant amb Ledger
- Es requereix confirmació en Ledger!
- Recuperant subadreces
- Verificant claus
- Fent càlculs ben bojos
- Hashing per aquí i per allà
- Si us plau (re)conecteu el dispositiu Ledger
-
- Creant compte
-
- %1$s adjunt
- %1$s separat
-
- Escrivint etiquetatge
- Escriptura d\'Etiquetatge fallit!
- Escriptura d\'Etiquetatge exitosa
- L\'etiquetatge no suporta NDEF!
- L\'etiquetatge proporciona %1$d bits, però es necessiten %2$d!
- No entenc l\'etiquetatge!
- No sé què vols!
- NFC Disponible!
-
- Mostra Secrets!
- Mode de Carrer
-
- Node-o-matiC habilitat, premi aquí per més informació.
- Últim bloc actualitzat: %1$s
- Nodes
- Nom del Node (Opcional)
- Nom del servidor
- Port
- Nom d\'usuari (Opcional)
- Contrasenya (Opcional)
- No es pot resoldre el servidor
- Necessitem això!
- Ha d\'ésser numéric
- Ha d\'ésser 1–65535
- Afegir Node
- Premi aquí per refrescar!
- ERROR DE CONEXIÓ %1$d
- ERROR DE CONEXIÓ
- AUTENTICACIÓ FALLIDA
- Resultat del test:
- Alçada: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- Provant l\'IP: %1$s …
- Si us plau, esperi a que finalitzi l\'escaneig
- Premi aquí per seleccionar o afegir nodes
- Afegir nodes de forma manual o tireu cap avall per escanejar
- Escanejant la xarxa…
- S\'han marcat de forma automàtica els millors %1$d nodes
- Provar
-
- Receptor
-
- TOT!
-
- Convertir la llavor del Ledger
- Paraules de la llavor del Ledger
- Contrasenya Ledger (avançat)
- Llavor de Ledger no vàlida!
- Introduir la vostra llavor del Ledger aquí té un elevat risc de seguretat!
-
- Restablir Alçada
-
- Start Monero App on %1$s
-
- Rescan!
-
- I get it!
- Next
- I\'m ready!
-
- Welcome to Monerujo!
- This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.
- Keep your seed safe
- The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.
- Send Crypto
- Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.
- Nodes, your way
- Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.
- Send with fingerprint
- You\'re now able to send XMR with just your fingerprint if you enabled it. To request the password, just disable fingerprint access.
-
- Dark Mode
-
- Auto
- Day
- Night
-
- There is nothing here\nPlease create or restore a wallet
-
- Restore default nodes
- Restoring already in progress…
-
- Last Block: %1$d seconds ago
- Last Block: %1$d minutes ago
- Last Block: %1$d hours ago
- Last Block: %1$d days ago
-
- Cannot get quote
- Check amount and try again
-
- Ambiguous address.
- Please select the type above.
- ]]>
-
- Please enter or scan a %1$s address.
- You'll send XMR and the receiver will get %2$s using the SideShift.ai service.
- ]]>
-
- Please enter or scan a Monero address.
- ]]>
-
- Subaddresses
- Subaddress Name
- Too many unused addresses - use some to enable creating more!
- Too many unused accounts - use some to enable creating more!
- Transactions for this subaddress:
- No transactions for this subaddress yet
- Select a subaddress
- Long-press for details
-
- This wallet will be deleted. Your funds will be gone forever unless you have your seed or a working backup to recover it.
- Delete
- Delete failed!
-
- Import wallet
- Import failed!
-
- Reset wallet!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-de/about.xml b/app/src/main/res/values-de/about.xml
deleted file mode 100644
index 970bd2f..0000000
--- a/app/src/main/res/values-de/about.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
- Schließen
- Ich bin Monerujo
- Version %1$s (%2$d)
-
- Credits
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo et al.
-
Diese Seite informiert dich über unsere Richtlinien bezüglich der Sammlung,
- Nutzung und Weitergabe persönlicher Informationen, die wir von Nutzern unserer
- App erhalten (monerujo: Monero-Wallet).
-
-
Mit der Nutzung der App stimmst du der Erfassung und Nutzung von Informationen in
- Übereinstimmung mit dieser Erklärung zu.
-
-
Gesammelte Daten
-
Personenbezogene Daten sind jegliche Art von Daten, die eine Person identifizieren können.
-
-
Monero-Schlüssel und öffentliche Adressen werden von der App zum Zweck der Verarbeitung
- von Transaktionen lokal gesammelt und verarbeitet und verschlüsselt in das Monero-Netzwerk übertragen.
-
-
Andere persönliche Daten werden von der App nicht gesammelt.
-
Wenn du den Umrechner (optional) nutzt, fragt Monerujo
- den aktuellen Kurs über die öffentliche Schnittstelle von coinmarketcap.com ab.
- Siehe dir ihre Datenschutzerklärung unter https://coinmarketcap.com/privacy für
- Details darüber an, wie Daten in deinen Anfragen gesammelt werden.
-
Wenn du die App zum Bezahlen an BTC-Adressen verwendest, verwendest du den Dienst SideShift.ai.
- Weitere Informationen findest du in der Datenschutzerklärung unter https://sideshift.ai/.
- Monerujo schickt dem Anbieter die BTC-Zieladresse und den Betrag.
- Deine IP-Adresse kann dabei aufgezeichnet werden.
-
App-Berechtigungen
-
-
INTERNET : Verbinde zum Monero-Netzwerk über einen Monero-Node
-
READ_EXTERNAL_STORAGE : Lese die auf dem Gerät gespeicherten Wallet-Dateien aus
-
WRITE_EXTERNAL_STORAGE : Schreibe Wallet-Dateien auf das Gerät
-
WAKE_LOCK : Halte das Gerät während der Synchronisation wach
-
CAMERA : Scanne QR-Codes, um Monero zu erhalten
-
-
Änderungen an dieser Datenschutzerklärung
-
Wir können diese Datenschutzerklärung von Zeit zu Zeit aktualisieren.
- Wir werden dich über jegliche Änderungen an der Datenschutzerklärung in der App und auf der
- Website (www.monerujo.io) informieren.
- Es wird empfohlen, diese Datenschutzerklärung regelmäßig auf Änderungen zu überprüfen.
-
Diese Datenschutzerklärung wurde zuletzt geändert am: 10. November 2017.
-
-
Kontakt
-
Wenn du Fragen zu unserer Datenschutzerklärung hast,
- oder wie deine Daten gesammelt und verarbeitet werden,
- schreibe bitte eine eMail an privacy@monerujo.io
-
Gib einen eindeutigen Wallet-Namen und ein Passwort ein.
- Das Passwort schützt deine Wallet-Daten auf dem Gerät. Benutze ein starkes Passwort –
- eine Passwortphrase ist sogar noch besser.
-
Notiere dir deinen mnemonischen Seed!
-
Auf dem folgenden Bildschirm findest du deinen, aus 25 Wörtern bestehenden, \"Mnemonischen Seed\".
- Dies sind die einzigen Daten, die du benötigst, um dein Wallet zu einem späteren
- Zeitpunkt wiederherzustellen und vollen Zugriff auf deine Gelder zu erhalten.
- Diese Daten geheim und sicher aufzubewahren ist sehr wichtig, da sie jedem
- vollen Zugriff auf diese Gelder geben!
-
Falls du dein Passwort verlierst, kannst du immer noch das Wallet mit dem Mnemonischen Seed wiederherstellen.
-
Es gibt keine Möglichkeit, den Mnemonischen Seed wiederherzustellen.
- Wenn du ihn verlierst, sind deine Gelder verloren!
- Der Mnemonische Seed kann auch nicht geändert werden, und falls du ihn verlierst oder er anderweitig
- kompromittiert wird, musst du deine Gelder auf ein neues Wallet transferieren – inklusive neuem Mnemonischen Seed.
- Deshalb ist es am besten, wenn du deinen Mnemonischen Seed aufschreibst
- und sicher und geheim an mehreren Orten aufbewahrst.
- ]]>
-
- Wallet erstellen – Seed
-
Falls du schon eine Monero-Adresse besitzt und wieder Zugriff auf die Transaktionen auf der Blockchain haben willst!
-
Gib einen eindeutigen Wallet-Namen und ein Passwort ein. Das Passwort schützt deine Wallet-Daten auf dem Gerät.
- Benutze ein starkes Passwort – noch besser ist eine Passwortphrase.
-
Trage deinen Seed in das Feld \"Mnemonischer Seed\" ein.
-
Gib die Blocknummer der ersten Transaktion dieser Adresse in das Feld \"Restore Height\" ein.
- Du kannst auch ein Datum im Format JJJJ-MM-DD eingeben. Falls du nicht sicher bist, gib ein
- ungefähres Datum oder eine Blockhöhe, bevor du diese Adresse zum ersten Mal benutzt hast, ein.
- ]]>
-
- Wallet erstellen – Schlüssel
-
Falls du dein Wallet mit Schlüsseln wiederherstellen willst!
-
Gib einen eindeutigen Wallet-Namen und ein Passwort ein. Das Passwort schützt deine Wallet-Daten auf dem Gerät.
- Benutze ein starkes Passwort – noch besser ist eine Passwortphrase.
-
Gib deine Monero-Adresse im Feld \"Öffentliche Adresse\" ein und fülle die Felder \"View Key\" und \"Spend Key\" aus.
-
Gib die Blocknummer der ersten Transaktion dieser Adresse in das Feld \"Restore Height\" ein.
- Du kannst auch ein Datum im Format JJJJ-MM-DD eingeben. Falls du nicht sicher bist, gib ein
- ungefähres Datum oder eine Blockhöhe, bevor du diese Adresse zum ersten Mal benutzt hast, ein.
- ]]>
-
- Wallet erstellen – View
-
Falls du nur eingehende Transaktionen auf dieses Wallet überwachen willst!
-
Gib einen eindeutigen Wallet-Namen und ein Passwort ein. Das Passwort schützt deine Wallet-Daten auf dem Gerät.
- Benutze ein starkes Passwort – noch besser ist eine Passwortphrase.
-
Gib deine Monero-Adresse im Feld \"Öffentliche Adresse\" ein und fülle das Feld \"View Key\" aus.
-
Gib die Blocknummer der ersten Transaktion dieser Adresse in das Feld \"Restore Height\" ein.
- Du kannst auch ein Datum im Format JJJJ-MM-DD eingeben. Falls du nicht sicher bist, gib ein
- ungefähres Datum oder eine Blockhöhe, bevor du diese Adresse zum ersten Mal benutzt hast, ein.
- ]]>
-
- Wallet-Details
-
Öffentliche Adresse
- Die öffentliche Adresse ist wie deine Kontonummer, die du anderen Personen mitteilen kannst, ohne Angst zu haben, dein Geld zu verlieren.
- Andere Personen werden dir Monero an diese Adresse schicken.
-
Mnemonischer Seed
- Dies sind die einzigen Daten, die du benötigst, um dein Wallet zu einem späteren
- Zeitpunkt wiederherzustellen und vollen Zugriff auf deine Gelder zu erhalten.
- Diese Daten geheim und sicher aufzubewahren ist sehr wichtig, da sie jedem
- vollen Zugriff auf diese Gelder geben! Falls du ihn nicht an mehreren, sicheren Stellen aufgeschrieben hast, mach dies bitte jetzt!
-
Wiederherstellungspasswort für Wallet-Dateien
- Stelle sicher, dieses Passwort aufzuschreiben. Falls du dein Gerät auf Werkseinstellungen zurücksetzt oder
- die App deinstallierst, brauchst du dieses Passwort, um Zugriff auf dein Wallet zu erhalten.
-
CrAzYpass
- Falls das hier angezeigte Passwort aus 52 alphanumerischen Zeichen in 4er-Gruppen besteht – Glückwunsch!
- Deine Wallet-Dateien sind nun durch einen 256-Bit-Schlüssel gesichert, der durch Sicherheitsfeatures
- deines Gerätes aus deiner Passwortphrase erstellt wurde (bei Erstellung oder Änderung der Passwortphrase).
- Dies macht einen Hack der Wallet-Dateien extrem schwierig!
- Dieses Feature ist verpflichtend für alle neu erstellten Wallets.
-
Legacy-Passwort
- Falls du hier deine Passwortphrase siehst, sind deine Wallet-Dateien nicht so gut gesichert wie
- bei der Benutzung von CrAzYpass. Um dies zu beheben, wähle einfach \"Passwortphrase ändern\" aus dem Menü.
- Nachdem du eine neue Passwortphrase eingegeben hast (auch bei der gleichen wie zuvor) wird die App
- ein neues CrAzYpass für dich erstellen und deine Wallet-Dateien sichern. Schreibe es auf!
-
CrAzYpass-Wallets
- Falls du Monerujo jemals neu installieren musst (zum Beispiel nachdem du dein Gerät auf Werkseinstellungen zurückgesetzt hast
- oder du ein neues Gerät besitzt) oder die Wallet-Dateien auf einem anderen Gerät oder PC nutzen willst, dann
- musst du dieses Wiederherstellungspasswort nutzen, um Zugriff auf dein Wallet zu erhalten.
- Durch die Auswahl \"Passwortphrase ändern\" aus dem Menü kannst du eine andere Passwortphrase wählen. Beachte,
- dass dies ein neues Wiederherstellungspasswort erzeugt. Schreibe es auf!
-
View-Key
- Dein View-Key kann benutzt werden, um eingehende Transaktionen zu diesem Wallet zu überwachen, ohne anderen
- die Möglichkeit zu geben, Gelder aus diesem Wallet auszugeben.
-
Spend-Key
- Der Spend-Key ermöglicht jedem, Monero aus diesem Wallet auszugeben. Bewahre diesen Spend-Key also genauso sicher
- wie den Mnemomischen Seed auf.
- ]]>
-
- Wallet-Liste
-
Node
-
Monerujo benutzt einen Drittanbieter-Node, um mit dem Monero-Netzwerk zu kommunizieren, ohne
- die gesamte Blockchain herunterladen zu müssen. Eine Liste bekannter Drittanbieter-Nodes
- oder eine Anleitung zum Betreiben eines eigenen Drittanbieter-Nodes findest du unter https://moneroworld.com/
-
Monerujo besitzt einige voreingestellte Drittanbieter-Nodes. Es erinnert sich an die letzten 5 benutzten Nodes.
-
Wallets
-
Hier siehst du deine Wallets. Sie befinden sich im monerujo Ordner
- im internen Speicher deines Geräts. Du kannst einen Datei-Explorer nutzen, um sie zu finden.
- Du solltest regelmäßig Backups von diesem Ordner machen und diese sicher aufbewahren für den Fall,
- dass dein Gerät EXPLODIERT oder gestohlen wird.
-
Wähle ein Wallet, um sie zu öffnen oder tippe \"+\", um eine neue zu erstellen.
- Oder wähle eine der folgenden Wallet-Optionen:
-
Details
-
Zeige die Wallet-Details, Seed & Keys.
-
Empfangen
-
Generiere einen QR-Code, um Moneroj zu empfangen.
-
Umbenennen
-
Benenne das Wallet um. Backups werden nicht umbenannt.
-
Backup
-
Erstelle eine Kopie des Wallets im backups Ordner innerhalb des monerujo Ordners.
- Eine bereits vorhandene Kopie wird überschrieben.
-
Archivieren
-
Erstellt ein Backup und löscht danach das Wallet. Die Kopie verbleibt im backups
- Ordner. Falls du deine Backups nicht länger benötigst, solltest du sie mit einem Datei-Explorer löschen oder
- die App sauber und ordentlich deinstallieren.
- ]]>
-
- Transaktionsdetails
-
Ziel
- Dies ist die öffentliche Adresse des Wallets, zu dem du Moneroj gesendet hast.
-
Zahlungs-ID
- Du kannst eine Zahlungs-ID benutzen, um Zahlungen zu identifizieren. Dies ist optional und ist nicht öffentlich einsehbar.
- Zum Beispiel kann ein Unternehmen damit Zahlungen und Verkäufe miteinander verbinden.
-
TX-ID
- Dies ist deine Transaktions-ID, die du benutzen kannst, um verschleierte Transaktionen mit einem Monero-
- Blockchain-Explorer wie https://xmrchain.net/ zu identifizieren.
-
TX-Schlüssel (Transaktionsschlüssel)
- Dies ist dein geheimer Transaktionsschlüssel. Bewahre ihn sicher auf, da er Dritten deine Signatur in einem Ring offenbart
- und deshalb deine Transaktionen transparent macht.
-
Block
- Dies ist der Block, der deine Transaktion beinhaltet.
- ]]>
-
- Senden
-
Empfängeradresse
-
Dies ist die öffentliche Adresse des Wallets, an das du Moneroj sendest. Du kannst sie aus der Zwischenablage kopieren,
- einen QR-Code scannen oder sie manuell eingeben. Vergewissere dich, dass es die richtige Adresse ist, um
- sicherzustellen, die Moneroj nicht irrtümlich an eine falsche Adresse zu senden.
-
Zusätzlich zu einer normalen Monero-Adresse kannst du auch
-
-
einen OpenAlias für XMR oder BTC
-
eine BTC-Adresse
-
- nutzen. Beachte bitte, dass das Senden von BTC über den Service von SideShift.ai erfolgt. (Siehe https://sideshift.ai
- für Details). Weitere Details sind weiter unten unter "BTC senden".
-
BTC senden
-
SideShift.ai
-
SideShift.ai ist ein Drittanbieter-Service, welcher als Wechselservice von Monero zu Bitcoin fungiert.
- Wir nutzen die SideShift.ai-Schnittstelle, um Bitcoin-Zahlungen in Monerujo zu integrieren. Bitte schaue dir
- https://sideshift.ai an und entscheide selbst, ob du diesen Service nutzen willst. Das Monerujo-Team
- gehört nicht zu SideShift.ai und kann keinen Support für dessen Service bieten.
-
SideShift.ai-Wechselkurs
-
Auf dem \"Menge\" Bildschirm siehst du die aktuellen Werte des SideShift.ai-Service. Diese beinhalten den aktuellen Tauschkurs
- sowie die oberen und unteren BTC-Limits. Bitte bedenke, dass dieser Kurs zu diesem Zeitpunkt nicht garantiert ist.
-
SideShift.ai-Auftrag
-
Auf dem \"Bestätigen\" Bildschirm siehst du das genaue SideShift.ai-Angebot. Dieses Angebot gilt
- für eine bestimmte Zeit – du siehst einen Countdown auf dem \"Ausgeben\" Button. Der Wechselkurs kann
- sich von den vorherigen Angaben unterscheiden.
-
Geheimer SideShift.ai-Schlüssel
-
Da Monerujo nur den Monero-Teil deiner Transaktion verarbeitet, kann dein geheimer SideShift.ai-Schlüssel
- dazu benutzt werden, den Bitcoin-Teil deines Auftrags auf der SideShift.ai-Homepage zu verfolgen.
-
SideShift.ai-Countdown!
-
Wenn der Countdown 0 erreicht, musst du ein neues Angebot von SideShift.ai anfordern, indem du zum vorherigen Schritt
- zurückkehrst und wieder zum \"Bestätigen\"-Bildschirm zurückkommst.
- ]]>
-
- BTC senden
-
SideShift.ai
-
SideShift.ai ist ein Drittanbieter-Service, welcher als Wechselservice von Monero zu Bitcoin fungiert.
- Wir nutzen die SideShift.ai-Schnittstelle, um Bitcoin-Zahlungen in Monerujo zu integrieren. Bitte schaue dir
- https://sideshift.ai an und entscheide selbst, ob du diesen Service nutzen willst. Das Monerujo-Team
- gehört nicht zu SideShift.ai und kann keinen Support für dessen Service bieten.
-
SideShift.ai-Wechselkurs
-
Auf dem \"Menge\" Bildschirm siehst du die aktuellen Werte des SideShift.ai-Service. Diese beinhalten den aktuellen Tauschkurs
- sowie die oberen und unteren BTC-Limits. Bitte bedenke, dass dieser Kurs zu diesem Zeitpunkt nicht garantiert ist.
-
SideShift.ai-Auftrag
-
Auf dem \"Bestätigen\" Bildschirm siehst du das genaue SideShift.ai-Angebot. Dieses Angebot gilt
- für eine bestimmte Zeit – du siehst einen Countdown auf dem \"Ausgeben\" Button. Der Wechselkurs kann
- sich von den vorherigen Angaben unterscheiden.
-
Geheimer SideShift.ai-Schlüssel
-
Da Monerujo nur den Monero-Teil deiner Transaktion verarbeitet, kann dein geheimer SideShift.ai-Schlüssel
- dazu benutzt werden, den Bitcoin-Teil deines Auftrags auf der SideShift.ai-Homepage zu verfolgen.
-
SideShift.ai-Countdown!
-
Wenn der Countdown 0 erreicht, musst du ein neues Angebot von SideShift.ai anfordern, indem du zum vorherigen Schritt
- zurückkehrst und wieder zum \"Bestätigen\"-Bildschirm zurückkommst.
- ]]>
-
- Wallet erstellen – Ledger
-
Falls du dein Wallet mit einem "Ledger Nano S" wiederherstellen willst!
-
Dein geheimer Schüssel verlässt nie das Ledger-Gerät. Es muss also immer eingesteckt sein,
- wenn du dieses Wallet benutzt.
-
Gib einen eindeutigen Wallet-Namen und ein Passwort ein. Das Passwort schützt deine Wallet-Daten auf dem Gerät.
- Benutze ein starkes Passwort – noch besser ist eine Passwortphrase.
-
Gib die Blocknummer der ersten Transaktion dieser Adresse in das Feld \"Restore Height\" ein.
- Du kannst auch ein Datum im Format JJJJ-MM-DD eingeben. Falls du nicht sicher bist, gib ein
- ungefähres Datum oder eine Blockhöhe, bevor du diese Adresse zum ersten Mal benutzt hast, ein.
- ]]>
-
- Die Wallet
-
Straßenmodus
-
Der Straßenmodus kann im Menü unterhalb Gunthers Kopfsymbol an- und ausgeschaltet werden. In diesem Modus wird dein
- Guthaben in keinem Menüpunkt angezeigt, sodass du dein Wallet gefahrlos auf der Straße, in einer Bar oder
- anderem öffentlichen Ort nutzen kannst. Vorherige Transaktionen sind ebenfalls verborgen. Neue Transaktionen werden angezeigt, damit
- du sehen kannst, wenn du diese genialen Moneroj versendet oder empfangen hast!
-
Scannen
- Weil Monero gerne Dinge geheim hält, wird nach jedem Öffnen eines Monerujo-Wallets die Blockchain gescannt,
- um zu überprüfen, ob neue Moneroj zu diesem Wallet gesendet wurden. Dies speichert ausschließlich Informationen,
- die zum Wallet auf diesem Gerät gehören. Manchmal kann dies etwas länger dauern, falls die letzte Synchronisierung
- eine Weile her ist.
-
Das Guthaben
-
Hilfe! Mein Wallet-Guthaben ist verschwunden oder ist unbestätigt!
- Keine Panik! Wenn du Gelder von deinem Wallet sendest, wird ein Teil deines Guthabens kurzzeitig als unbestätigt angezeigt.
- Dies geschieht aufgrund der zugrunde liegenden Technologie und wie Moneroj auf der Blockchain bewegt werden.
- Lies mehr darüber auf https://getmonero.org/resources/moneropedia/change.html
-
Transaktionsliste
-
Eine Liste deiner Transaktionen. In View-Wallets werden nur die eingehenden Transaktionen angezeigt.
- ]]>
-
- Nodes
-
Kurzfassung
-
Aktualisiere die Liste der Nodes, indem du nach unten ziehst & merke 3–5 davon vor, um es Monerujo zu ermöglichen,
- den bestmöglichen für dich auszuwählen!
-
Was ist ein Node?
-
Monerujo nutzt einen Drittanbieter-Node (manchmal auch Monero Knoten oder Daemon genannt), um mit
- dem Monero-Netzwerk zu kommunizieren, ohne die Blockchain selbst herunterladen und
- speichern zu müssen.
-
Node-Liste
-
Wenn die Liste leer ist, kannst du entweder selbst manuell neue Nodes hinzufügen oder Monerujo
- das Netzwerk für dich scannen lassen – oder beides. Weiterlesen…
-
Die Node-Liste zeigt alle derzeit bekannten Nodes an. Außerdem wird der Zeitstempel
- des letzten, diesem Node bekannten, Block unter dem Namen eines jeden Nodes angezeigt. Ein Icon,
- das das Antwortverhalten dieses Nodes anzeigt
- (was die zu erwartende Verbindungsqualität anzeigt),
- wird neben jedem Node angezeigt.
-
Jeder Node in dieser Liste kann für spätere Verwendung vorgemerkt werden.
- Nicht vorgemerkte Nodes werden vergessen.
-
Jedes Mal, wenn du Monerujo nutzt, wird es aus den vorgemerkten Nodes den optimalen auswählen.
- Das macht es, indem es die Blockhöhe (wie aktuell
- ist der Node?) sowie das Antwortverhalten (wie schnell reagiert der Node auf Anfragen?) prüft.
-
Die Liste wird anhand dieser Eigenschaften geordnet. Der oberste Node ist also immer der, den Monerujo
- momentan auswählen würde. Ganz unten in der Liste würden sehr langsame oder nicht erreichbare Nodes angezeigt werden.
-
Füge einen Node hinzu
-
Wenn du den "Node hinzufügen" Button unten berührst, wirst du nach den
- Node-Details im nachfolgenden Dialog gefragt werden.
- Die "Adresse" ist die Web- oder IP-Adresse des Nodes – dies ist der einzig
- notwendige Eintrag.
- Gebe den "Port" ein, wenn der Node nicht den standardmäßigen Port (also 18089) benutzt.
- Du kannst auch optional den Node benennen, damit du ihn später einfacher identifizieren kannst.
- Einige Nodes erfordern Login-Informationen, um sie zu benutzen. Gebe den dir zugekommenen Nutzernamen &
- das Passwort in die entsprechenden Felder ein. Jetzt kannst du diese Einstellung "Testen".
- Die "Testergebnisse" werden die Blockhöhe, Reaktionszeit und verwendete IP anzeigen.
- Das Ergebnis kann aber auch fehlerbehaftet sein – meistens weil die eingegebene Webadresse
- im Moment nicht in einer vertretbaren Zeit erreicht werden konnte oder weil die Login-Informationen falsch waren.
- Oder die Kombination aus Webadresse und Port zeigt nicht auf einen richtigen Monero-Node!
- Wenn der Test bestanden wird (keine Fehler), kannst du "OK" drücken, um diesen Node zu speichern &
- vorzumerken.
-
Suche nach Nodes
-
Außerdem kannst du das Netzwerk nach Nodes durchsuchen. Monerujo wird
- das Netzwerk nach Drittanbieter-Nodes auf Port 18089 durchsuchen. Es fängt damit an, deine
- vorgemerkten Nodes nach anderen Teilnehmern im Monero-P2P-Netzwerk zu fragen und fährt dann damit fort,
- diese nach ihren Verbindungen zu fragen und so weiter. Wenn du keine vorgemerkten Nodes hast
- (oder diese uns nicht über ihre Verbindungen informieren),
- wird sich Monerujo direkt mit den, in Monero fest eingebetteten, Ursprungsnodes verbinden. Die
- Suche stoppt, wenn insgesamt 10 Nodes gefunden wurden.
- ]]>
-
-
-
- Nutzung eines Zahlungslinks
-
Du hast Monerujo mit einem Zahlungslink gestartet. Gehe wie folgt vor, um Gelder zu versenden:
-
- 1. Öffne das Wallet, von der aus du senden möchtest
- 2. Warte, bis das Wallet synchronisiert ist & der "Sende"-Button erscheint
- 3. Drücke den "Sende"-Button
-
-
Die Zahlungsdetails werden ausgefüllt. Überprüfe sie und fahre fort wie bei jeder anderen Transaktion.
- ]]>
-
- Hab\'s verstanden!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
deleted file mode 100644
index 677a39c..0000000
--- a/app/src/main/res/values-de/strings.xml
+++ /dev/null
@@ -1,451 +0,0 @@
-
-
- Wallet
-
- Über
- Datenschutzerklärung
-
- Teilen
- Hilfe
- Empfangen
- Umbenennen
- Löschen
- Backup
- Passwort ändern
-
- Tippe weiter …
- Hmmm …
- Komm schon – das kannst du besser!
- Fast da …
- Yeah baby, h4x0r style!
-
- Wallets
- Credits
- OK
- Abbrechen
- Schließen
- Detailinfos
-
- Erfolgreich gesendet
- Fertig
-
- Berühren für QR-Code
-
- BTC-Zahlung aktiviert – Tippe für mehr Infos.
- Ledger aktiviert – Tippe für mehr Infos.
-
- Du hast eine %1$s-Adresse eingegeben.
- Du wirst XMR versenden und der Empfänger durch den SideShift.ai Service %1$s erhalten.
- ]]>
-
- SideShift.ai-Auftrag
-
- %1$s %2$s
-
- Bestätigung ausstehend
- Bezahlung ausstehend
- SideShift.ai-Fehler (%1$s)
- %1$s gesendet!
- Frage ab …
-
- Du kannst %1$s — %2$s %4$s senden.
- SideShift.ai gibt dir aktuell einen Wechselkurs von %3$s %4$s/XMR.
- ]]>
-
- Guthaben: %2$s %3$s (%1$s XMR)
-
- ✔ Zahlungs-ID integriert
- Bereite deine Transaktion vor
-
- Erstelle SideShift.ai-Auftrag
- Frage SideShift.ai-Auftrag ab
- Bereite Monero-Transaktion vor
-
- Frage SideShift.ai-Parameter ab
-
- SideShift.ai-FEHLER
- Code: %1$d
-
- Berühre zum Wiederholen
- Jetzt hängen wir hier fest!
- Oh oh – SideShift.ai scheint im Moment nicht verfügbar zu sein!
-
- %1$s %3$s = %2$s XMR
- (Kurs: %1$s %2$s/XMR)
-
- Besuche SideShift.ai für Support & Nachverfolgung
- Geheimer Schlüssel\nSideShift.ai
- SideShift.ai – Geheimer Schlüssel
- %1$s-Zieladresse
- Betrag
-
- Transaktions-ID
- Zieladresse
- Notizen
-
- Backup wird erstellt
- Archivierung wird ausgeführt
- Umbenennung wird ausgeführt
- Ändere Passwort
-
- Fertigstellen …\nDies kann einen Moment dauern!
-
- Backup erfolgreich
- Backup fehlgeschlagen!
- Löschen fehlgeschlagen!
- Umbenennen fehlgeschlagen!
- Passwort ändern fehlgeschlagen!
- Passwort geändert
-
- Node
- Lade Wallet …
- Wallet gespeichert
- Speichern des Wallets fehlgeschlagen!
- Verbinde …
- Verbindung zum Node fehlgeschlagen!\nPrüfe Nutzername/Passwort
- Node ungültig!\nVersuche anderen.
- Kann Node nicht erreichen!\nNochmal oder anderen Node versuchen.
-
- Verbindung getrennt
-
- Transaktion fehlgeschlagen: %1$s
-
- Da hast du zu lange gewartet, mein Freund!
-
- Ich bin noch mit deinem letzten Wallet beschäftigt …
-
- Umbenennen %1$s
-
- Neues Passwort für %1$s
- Passwort für %1$s wiederholen
- Passwort für %1$s
- Fingerabdruck-Authentifizierung möglich.\nBitte Sensor berühren.
- Öffne Wallet …
- Fingerabdruck nicht erkannt. Nochmals versuchen.
- Falsches Passwort!
- Hinterlegtes Passwort falsch.\nBitte Passwort manuell eingeben.
- Wallet existiert nicht!
- Node-Adresse muss gesetzt sein!
- Wallet entspricht nicht dem ausgewähltem Netz
-
- (View-Only)
-
- Empfange
- Sende
-
- + %1$s XMR unbestätigt
-
- monerujo Service
-
- Synchronisiert:
- Blöcke verbleibend
- Scanne:
-
- Externer Speicher nicht beschreibbar!
- Wir brauchen die Zugriffsrechte auf den externen Speicher wirklich!
- Keine Kamera = Kein QR-Code scannen!
-
- View-Key
- Empfangsadresse
- Schlüssel
- View-Key in Zwischenablage kopiert!
- Schlüssel in Zwischenablage kopiert!
- Wallet-Adresse in Zwischenablage kopiert!
- Transaktions-ID in Zwischenablage kopiert!
- Kopieren aus Sicherheitsgründen deaktiviert!
-
- Umtausch-Rate nicht verfügbar!\nNutze XMR/XMR oder versuche es noch einmal
-
- Wallet erstellen
- Wallet-Name
- Wallet-Passwort
- Erlaubt das Öffnen des Wallets durch Fingerabdruck-Authentifizierung
- Fingerabdruck-Authentifizierung
-
Mit aktivierter Fingerabdruck-Authentifizierung kannst du ohne Eingabe eines Passworts
- das Wallet-Guthaben einsehen sowie Gelder empfangen.
-
Aus Sicherheitsgründen wird Monerujo weiterhin dein Passwort abfragen,
- wenn du Wallet-Details einsehen oder Gelder senden möchtest.
- Sicherheits-Warnung
-
Bedenke bitte, dass jeder mit Zugriff auf deinen Fingerabdruck dein Wallet-Saldo einsehen kann.
-
Eine bösartige Person könnte dies zum Beispiel versuchen, während du schläfst.
- Bist du sicher, dass du diese Funktion aktivieren willst?
- ]]>
- Passwörter stimmen nicht überein
- Passwort darf nicht leer sein
- Erstell mir jetzt endlich ein Wallet!
- Ich habe den Mnemonischen Seed notiert!
-
- Gib mir einen Namen!
- Wallet existiert bereits!
- Kann nicht mit einem . beginnen
- Erstelle Wallet
- Wallet erstellt
-
- Gib eine Blocknummer oder ein Datum (JJJJ-MM-TT) ein
-
- Schlüssel
- Neu
- Seed
- View
-
- Empfangsadresse
- View-Key
- Spend-Key
- mnemonischer Seed (25 Wörter)
- Wiederherstellungshöhe oder Datum (JJJJ-MM-TT)
-
- Empfangsadresse
- View-Key
- Spend-Key
- Mnemonischer Seed
- Wiederherstellungspasswort für Wallet-Dateien
-
- Gib einen gültigen Schlüssel ein
- Gib eine gültige Adresse ein
- Gib deinen, 25 Wörter langen, Seed ein
-
- Private Notizen (optional)
- Erzeuge
- Gib meine wertvollen Moneroj aus
- Gib meine wertvollen Moneroj aus (%1$s)
- Kein QR-Code
- Kein gültiger Zahlungs-QR-Code
- Keine gültige Adresse
- Senden
- Verfügbar: %1$s XMR
- Adresse
- Betrag
- Bestätigen
- Fertig
-
- Betrag
- Gebühr (XMR)
- Gebühr
- Total (XMR)
- Total
-
- %1$s XMR
- +%1$s Gebühr
-
- Fehler bei Transaktionserstellung
-
- Gebühr %1$s
- (%1$s)
- fehlgeschlagen
- - %1$s
- + %1$s
-
- Zeitstempel
- Transaktions-ID
- Transaktionsschlüssel
- Ziel
- Zahlungs-ID
- Block
- Betrag
- Gebühr
- Transfers
- Notizen
- (optional)
- Transaktionsdetails
-
- AUSSTEHEND
- FEHLGESCHLAGEN
-
- Betrag
- Konnte Wallet nicht öffnen!
-
- Max. %1$s
- Min. 0
- XMR keine Nummer
-
- Sensible Daten werden angezeigt.\nSchau über deine Schulter!
- Ich bin sicher
- Nein, doch nicht!
- Details
-
- Das Wallet wird gelöscht. Dein Geld wird für immer verloren sein, außer wenn Du den Seed oder ein funktionierendes Backup hast um es wiederherzustellen.
- Ja, mach das!
- Nein, danke!
-
- Neues Wallet erstellen
- View-Only-Wallet wiederherstellen
- Mit privaten Schlüsseln wiederherstellen
- Mit 25-Wörter-Seed wiederherstellen
-
- Konto erstellen
- Neues Konto #%1$d hinzugefügt
- Konto #
-
- Versende ALLE(!) verfügbaren Gelder aus diesem Konto
- Subadresse
- Öffentliche Subadresse #%1$d: %2$s
-
- Sprache
- Benutze Systemsprache
-
- Wallet mit Ledger Nano wiederherstellen
-
- Kommunikation mit Ledger
- Bestätigung auf Ledger benötigt!
- Abrufen von Subadressen
- Prüfe Schlüssel
- Mache verrückte Mathe
- Berechne ein paar Hashwerte
- Bitte Ledger (wieder-)anschließen!
-
- Erzeuge Konto
-
- %1$s angesteckt
- %1$s abgesteckt
-
- Beschreibung (optional)
-
- OpenAlias-Adresse nicht verfügbar
- OpenAlias sicher ✔
- Löse OpenAlias auf…
- OpenAlias ohne DNSSEC – Adresse kann gefälscht sein!
-
- Schreibe Tag
- Schreiben des Tags fehlgeschlagen!
- Tag erfolgreich geschrieben
- Tag unterstützt NDEF nicht!
- Tag bietet %1$d Bytes, aber wir brauchen %2$d!
- Ich verstehe den Tag nicht!
- Ich weiß nicht, was du willst!
- NFC verfügbar!
-
- Node Version inkompatibel – bitte updaten!
-
- Zeige Geheimnisse!
- Straßenmodus
-
- Node-o-matiC aktiviert – drücke für mehr Info.
- Letzter aktualisierter Block: %1$s
- Nodes
- Node-Name (Optional)
- Webadresse
- Port
- Nutzername (Optional)
- Passwort (Optional)
- Kann Webadresse nicht auflösen
- Wir brauchen das!
- Muss eine Zahl sein
- Muss 1–65535 sein
- Node hinzufügen
- Tippe zum aktualisieren!
- VERBINDUNGSFEHLER %1$d
- VERBINDUNGSFEHLER
- AUTHENTIFIZIERUNG FEHLGESCHLAGEN
- Testergebnis:
- Höhe: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- Teste IP: %1$s …
- Warte bitte, bis die Suche abgeschlossen ist.
- Tippe, um Nodes auszuwählen oder hinzuzufügen
- Füge manuell Nodes hinzu oder ziehe nach unten, um zu suchen
- Durchsuche Netzwerk…
- Beste %1$d Nodes automatisch vorgemerkt
- Testen
-
- Empfänger
-
- ALLES!
-
- Konvertiere Ledger-Seed
- Ledger-Seed-Wörter
- Ledger-Passphrase (optional)
- Ungültiger Ledger-Seed!
- Deinen Ledger-Seed hier einzugeben, stellt ein erhebliches Sicherheitsrisiko dar!
-
- Wiederherstellungshöhe
-
- Start Monero App on %1$s
-
- Rescan!
-
- I get it!
- Next
- I\'m ready!
-
- Welcome to Monerujo!
- This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.
- Keep your seed safe
- The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.
- Send Crypto
- Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.
- Nodes, your way
- Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.
- Send with fingerprint
- You\'re now able to send XMR with just your fingerprint if you enabled it. To request the password, just disable fingerprint access.
-
- Dark Mode
-
- Auto
- Day
- Night
-
- There is nothing here\nPlease create or restore a wallet
-
- Restore default nodes
- Restoring already in progress…
-
- Last Block: %1$d seconds ago
- Last Block: %1$d minutes ago
- Last Block: %1$d hours ago
- Last Block: %1$d days ago
-
- Cannot get quote
- Check amount and try again
-
- Ambiguous address.
- Please select the type above.
- ]]>
-
- Please enter or scan a %1$s address.
- You'll send XMR and the receiver will get %2$s using the SideShift.ai service.
- ]]>
-
- Please enter or scan a Monero address.
- ]]>
-
- Subaddresses
- Subaddress Name
- Too many unused addresses - use some to enable creating more!
- Too many unused accounts - use some to enable creating more!
- Transactions for this subaddress:
- No transactions for this subaddress yet
- Select a subaddress
- Long-press for details
-
- Import wallet
- Import failed!
-
- Reset wallet!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-el/about.xml b/app/src/main/res/values-el/about.xml
deleted file mode 100644
index 81d4515..0000000
--- a/app/src/main/res/values-el/about.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
- Close
- I am monerujo
- Version %1$s (%2$d)
-
- Credits
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo et al.
-
This page informs you of our policies regarding the collection,
- use and disclosure of personal information we receive from users of our
- app (monerujo: Monero Wallet).
-
-
By using the app, you agree to the collection and use of information in
- accordance with this policy.
-
-
Data Collected
-
Personal data is any kind of data that could identify an individual.
-
-
Monero keys and public addresses are collected and processed by the app locally
- for the purpose of processing transactions and transmitted into the Monero Network
- in encrypted form.
-
-
Other personal data is not collected by the app.
-
If you use the exchange (optional) functionality, monerujo fetches the exchange
- rate through the public API of coinmarketcap.com.
- See their privacy policy at https://coinmarketcap.com/privacy for
- details on how data in your requests is collected.
-
If you use the app to pay to BTC addresses, you will be using the SideShift.ai service.
- See their privacy policy at https://sideshift.ai/ for details. Monerujo send them the BTC
- destination address and amount. Your IP will also be collectable.
-
App Permissions
-
-
INTERNET : Connect to the Monero Network via a Monero Daemon Node
-
READ_EXTERNAL_STORAGE : Read wallet files stored on the device
-
WRITE_EXTERNAL_STORAGE : Write wallet files stored on the device
-
WAKE_LOCK : Keep device awake while syncing
-
CAMERA : Scan QR Codes for receiving Monero
-
-
Changes to this Privacy Policy
-
We may update this privacy policy from time to time. We will notify
- you of any changes by posting the new privacy policy in the app and on the
- website (www.monerujo.io)
- You are advised to review this privacy policy periodically for any changes.
-
This Privacy Policy was last updated: 10th November, 2017.
-
-
Contact Us
-
If you have any questions about our privacy policy,
- or how your data is being collected and processed,
- please e-mail privacy@monerujo.io.
-
- ]]>
-
diff --git a/app/src/main/res/values-el/help.xml b/app/src/main/res/values-el/help.xml
deleted file mode 100644
index 9683ba5..0000000
--- a/app/src/main/res/values-el/help.xml
+++ /dev/null
@@ -1,296 +0,0 @@
-
-
- Δημιουργία πορτοφολιού - Νέο
-
Εάν χρειάζεστε μια νέα διεύθυνση Monero!
-
Δώσε ένα μοναδικό όνομα και κωδικό πρόσβασης πορτοφολιού.
- Ο κωδικός πρόσβασης χρησιμοποιείται για τη διασφάλιση των δεδομένων του πορτοφολιού στη συσκευή.
- Χρησιμοποίησε έναν ισχυρό κωδικό πρόσβασης - ακόμα καλύτερα χρησιμοποιήσε μια φράση-κωδικό.
-
Σημείωσε τον μνημονικό σου σπόρο!
-
Στην παρακάτω οθόνη θα βρείς τον 25-λέξεων \"Μνημονικό Σπόρο \".
- Αυτό είναι τα μόνα δεδομένα που χρειάζεσαι για να επαναφέρεις το πορτοφόλι σου στο μέλλον
- και να έχεις πλήρη πρόσβαση στα κεφάλαιά σου.
- Το να το κρατήσεις ασφαλές και ιδιωτικό είναι πολύ σημαντικό, καθώς δίνει στον οποιονδήποτε
- πλήρη πρόσβαση στα κεφάλαιά σου!
-
Αν χάσεις τον κωδικό του πορτοφολιού σου, μπορείς να επαναφέρεις το πορτοφόλι σου με τον Μνημονικό Σπόρο
-
Δεν υπάρχει τρόπος να επαναφέρεις τον Μνημονικό σου Σπόρο, αν τον χάσεις όλα σου τα κεφάλαια θα χαθούν!
- Επίσης, ο Μνημονικός Σπόρος δεν γίνεται να αλλάξει, και αν κλαπεί ή εκτεθεί,
- θα πρέπει να μεταφέρεις τα κεφάλαιά σου σε ένα νέο πορτοφόλι (με νέο Μνημονιακό Σπόρο). Επομένως, το καλύτερο
- είναι να κρατήσεις αντίγραφο του Μνημονικού Σπόρου σου γράφοντάς τον και αποθηκεύοντάς τον πολλαπλές φορές σε
- ασφαλή μέρη.
- ]]>
-
- Δημιουργία πορτοφολιού - Σπόρος
-
Εάν έχεις ήδη μια Διεύθυνση Monero και θέλεις να επαναφέρεις τις συναλλαγές από το blockchain!
-
Βάλε ένα μοναδικό όνομα χρήστη και κωδικό για το πορτοφόλι. Ο κωδικός χρησιμοποιείται για τη διασφάλιση των δεδομένων του πορτοφολιού στη συσκευή.
- Χρησιμοποιήστε έναν ισχυρό κωδικό πρόσβασης - ακόμα καλύτερα χρησιμοποιήστε μια φράση-κωδικό.
-
Βάλε τον Σπόρο σου στο πεδίο \"Μνημονικός Σπόρος\".
-
Εάν ξέρεις τον αριθμό μπλοκ της πρώτης συναλλαγής για αυτή την διεύθυνση, βάλε τον στο
- πεδίο \"Ύψος ανάκτησης\" - αφήνοντάς το κενό θα σαρωθεί ολόκληρο το blockchain για
- συναλλαγές που ανήκουν στην διεύθυνσή σου. Αυτό παίρνει πολύ ώρα.
- ]]>
-
- Δημιουργία πορτοφολιού - Κλειδιά
-
Εάν επαναφέρεις το πορτοφόλι χρησιμοποιώντας τα κλειδιά του πορτοφολιού σου!
-
Βάλε ένα μοναδικό όνομα χρήστη και κωδικό για το πορτοφόλι. Ο κωδικός χρησιμοποιείται για τη διασφάλιση των δεδομένων του πορτοφολιού στη συσκευή.
- Χρησιμοποιήστε έναν ισχυρό κωδικό πρόσβασης - ακόμα καλύτερα χρησιμοποιήστε μια φράση-κωδικό.
-
Βάλε την Διεύθυνση Monero στο πεδίο \"Δημόσια Διεύθυνση\" και συμπλήρωσε το \"Κλειδί Προβολής\" και \"Κλειδί Ξοδεύματος\".
-
Εάν ξέρεις τον αριθμό μπλοκ της πρώτης συναλλαγής για αυτή την διεύθυνση, βάλε τον στο
- πεδίο \"Ύψος ανάκτησης\" - αφήνοντάς το κενό θα σαρωθεί ολόκληρο το blockchain για
- συναλλαγές που ανήκουν στην διεύθυνσή σου. Αυτό παίρνει πολύ ώρα.
- ]]>
-
- Δημιουργία πορτοφολιού - Παρακολούθησης
-
Εάν θέλεις μόνο να παρακολουθείς για εισερχόμενες συναλλαγές σε ένα πορτοφόλι!
-
Βάλε ένα μοναδικό όνομα χρήστη και κωδικό για το πορτοφόλι. Ο κωδικός χρησιμοποιείται για τη διασφάλιση των δεδομένων του πορτοφολιού στη συσκευή.
- Χρησιμοποιήστε έναν ισχυρό κωδικό πρόσβασης - ακόμα καλύτερα χρησιμοποιήστε μια φράση-κωδικό.
-
Βάλε την Διεύθυνση Monero στο πεδίο \"Δημόσια Διεύθυνση\" και συμπλήρωσε το \"Κλειδί Προβολής\".
-
Εάν ξέρεις τον αριθμό μπλοκ της πρώτης συναλλαγής για αυτή την διεύθυνση, βάλε τον στο
- πεδίο \"Ύψος ανάκτησης\" - αφήνοντάς το κενό θα σαρωθεί ολόκληρο το blockchain για
- συναλλαγές που ανήκουν στην διεύθυνσή σου. Αυτό παίρνει πολύ ώρα.
- ]]>
-
- Λεπτομέρειες Πορτοφολιού
-
Δημόσια διεύθυνση
- Η δημόσια διεύθυνσή σου είναι σαν τον αριθμό τραπεζικού λογαριασμού μπορείς να την μοιραστείς με οποιονδήποτε
- χωρίς να φοβάσαι οτι θα χάσεις τα Monero σου. Μπορείς να λάβεις Monero στο πορτοφόλι σου με αυτή την διεύθυνση.
-
Μνημονικός Σπόρος
- Αυτό είναι τα μόνα δεδομένα που χρειάζεσαι για να επαναφέρεις το πορτοφόλι σου οποτεδήποτε στο μέλλον
- και να έχεις πλήρη πρόσβαση στα κεφάλαιά σου. Το να το κρατήσεις ασφαλές και ιδιωτικό είναι πολύ σημαντικό, καθώς δίνει στον οποιονδήποτε
- πλήρη πρόσβαση στα κεφάλαιά σου! Αν δεν το έχεις σημειώσει ήδη σε ασφαλές μέρος παρακαλώ κάνε το!
-
Κλειδί προβολής
- Το κλειδί προβολής(view key) μπορεί να χρησιμοποιηθεί για να παρακολουθήσει εισερχόμενες συναλλαγές
- στο πορτοφόλι σου χωρίς να δίνει την δυνατότητα να ξοδέψεις κεφάλαια από αυτό.
-
Κλειδί ξοδεύματος
- Το κλειδί ξοδεύματος(spend key) επιτρέπει στον οποιονδήποτε να ξοδέψει τα Monero που σχετίζοντε με το πορτοφόλι σου,
- για αυτό μην μοιραστείς με κανέναν αυτό το κλειδί, κράτα το ασφαλές όπως και τον Μνημονικό σου Σπόρο.
- ]]>
-
- Λίστα Πορτοφολιών
-
Κόμβος
-
Το Monerujo χρησιμοποιεί έναν Απομακρυσμένο Κόμβο(Remote Node) για επικοινωνία με το Δίκτυο του Monero χωρίς
- να χρειάζεται να κατεβάσει και αποθηκεύσει ολόκληρο το blockchain. Μπορείς να βρεις μια λίστα απο δημοφιλείς
- απομακρυσμένους κόμβους ή να μάθεις πως να τρέχεις τον δικό σου απομακρυσμένο κόμβο εδώ https://moneroworld.com/
-
Το Monerujo έχει κάποιους προκαθορισμένους Απομακρυσμένους Κόμβους. Θυμάται τους τελευταίους πέντε που χρησιμοποιήθηκαν.
-
Πορτοφόλια
-
Εδώ βλέπεις τα πορτοφόλια σου. Βρίσκοντε στον φάκελο monerujo
- στην εσωτερική αποθήκευση της συσκευής σας. Μπορείς να τα δεις με μια εφαρμογή εξερεύνησης αρχείων.
- Θα πρέπει να κρατάς συχνά αντίγραφα ασφαλείας αυτού του φακέλου εκτώς συσκευής σε
- περίπτωση που η συσκευή σου ανατιναχθεί ή κλαπεί.
-
Επέλεξε ένα πορτοφόλι για να το ανοίξεις ή πάτα στο \"+\" για να φτιάξεις ένα καινούριο.
- Ή επέλεξε μία από τις λειτουργίες πορτοφολιού:
-
Λεπτομέριες
-
Δες λεπτομέρειες πορτοφολιού, σπόρο & κλειδιά.
-
Λήψη
-
Δημιουργία ενός κωδικού QR για λήψη Moneroj.
-
Μετονομασία
-
Μετονόμασε το πορτοφόλι. Τα αντίγραφα ασφαλείας δεν θα μετονομαστούν.
-
Αντιγρ. Ασφαλείας
-
Φτιάχνει ένα αντίγραφο ασφαλείας του πορτοφολιού στον φάκελο backups που είναι
- στον φάκελο monerujo αντικαθιστόντας προηγούμενα αντίγραφα εκεί.
-
Αρχειοθέτηση
-
Φτιάχνει ένα αντίγραφο ασφαλείας και στη συνέχεια διαγράφει το πορτοφόλι. Το αντίγραφο παραμένει στον
- backups φάκελο. Εάν δεν χρειάζεσαι πλεον τα αντίγραφα θα πρεπει να τα διαγράψεις με μια
- εφαρμογή εξερεύνησης αρχείων ή μια εφαρμογή ασφαλούς διαγραφής.
- ]]>
-
- Λεπτομέρειες Συναλλαγής
-
Προορισμός
- Αυτό είναι η δημόσια διεύθυνση του πορτοφολιού που στέλνεις Monero.
-
ID Πληρωμής
- Μπορείς να χρησιμοποιήσεις ένα ID Πληρωμής(Payment ID) για να προσδιορίσεις τον λόγο που στέλνεις Monero
- ανάμεσα σε δύο ενδιαφερόμενους αυτό είναι προεραιτικό και ιδωτικό. Για παράδειγμα μπορεί να επιτρέψει σε μια επιχείρηση
- να κανονίσει την συναλλαγή σου με ένα αντικείμενο που αγόρασες.
-
ID Συναλλαγής(TX ID)
- Αυτό είναι το ID της συναλλαγής που μπορείς να χρησιμοποιήσεις για να διευκρινήσεις την θολωμένη συναλλαγή σου σε εναν Monero
- Blockchain εξερευνητή όπως το https://xmrchain.net/
-
Κλειδί συναλλαγής(TX KEY)
- Αυτό είναι το ιδιωτικό κλειδί της συναλλαγής σου, κράτησέ το ασφαλές από τρίτους γιατί
- αποκαλύπτει ποια υπογραφή σε έναν δακτύλιο(ring) είναι δική σου, επομένως κάνει την συναλλαγή σου φανερή.
-
Μπλοκ
- Αυτό είναι ο αριθμός του μπλοκ στο οποιο συμπεριλήφθει μέσα η συναλλαγή σου.
- ]]>
-
- Αποστολή
-
Διεύθυνση παραλήπτη
-
Αυή είναι η δημόσια διεύθυνση πορτοφολιού που στέλνεις Moneroj, μπορείς να το αντιγράψεις
- από το πρόχειρο, να σαρώσεις έναν κωδικό QR ή να το πληκτρολογήσεις. Βεβαιώσου οτι έχεις τριπλο-ελέγξει
- για να είσαι σίγουρος ότι δεν στέλνεις σε λάθος διύθυνση τα κεφάλαια σου.
-
In addition to using an XMR address, you can also use
-
-
an OpenAlias for XMR or BTC
-
a BTC address
-
- Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai
- for details). See the section on sending BTC below.
-
Αποστολή BTC
-
SideShift.ai
-
Το SideShift.ai είναι τρίτος πάροχος που δρα σαν ανταλλακτήριο από Monero σε Bitcoin.
- Χρησιμοποιούμε το API του SideShift.ai για να ενσωματώσουμε πληρωμές Bitcoin στο Monerujo. Παρακαλώ δες το
- https://sideshift.ai και αποφάσισε για τον εαυτό σου εαν αυτό είναι κάτι που θες να χρησιμοποιήσεις. Η Ομάδα του
- Monerujo δεν συνδέεται με το SideShift.ai και δεν μπορεί να σε βοηθήσει με την υπηρεσία.
-
Ισοτιμία συναλλάγματος SideShift.ai
-
Στην οθόνη \"Ποσό\" θα σου δωθούν οι τρέχουσες παράμετροι της υπηρεσίας SideShift.ai. Αυτές
- περιλαμβάνουν την τρέχουσα ισοτιμία καθώς και τα μέγιστα και ελάχιστα όρια BTC. Σημειωτέον ότι αυτή η
- ισοτιμία δεν εξασφαλίζεται σε αυτό το σημείο.
-
Εντολή SideShift.ai
-
Στην οθόνη \"Επιβεβαίωση\", θα δεις την πραγματική εντολή SideShift.ai. Αυτή η εντολή ισχύει για
- περιορισμένο χρόνο - μπορεί να προσέξεις μια αντίστροφη μέτρηση στο κουμπί \"Ξόδεψε\". Η ισοτιμία
- μπορεί να είναι διαφορετική από την ενδεικτική που φαινόταν σε προηγούμενες οθόνες.
-
Μυστικό Κλειδί SideShift.ai
-
Μιας και το Monerujo διαχειρίζεται μόνο την πλευρά του Monero της συναλλαγής το μυστικό κλειδί SideShift.ai
- μπορεί να χρησιμοποιηθεί για να εντοπίσει την συναλλαγή απο μεριάς Bitcoin στην SideShift.ai εντολή σου στην αρχική τους σελίδα.
-
Αντίστροφη μέτρηση SideShift.ai!
-
Μόλις η αντίστροφη μέτρηση φθάσει στο μηδέν, χρειάζεται να ξεκινήσεις πάλι την συναλλαγή στο SideShift.ai πηγαίνοντας
- πίσω στο προηγούμενο βήμα και μετά επιστρέφοντας στην οθόνη \"Επιβεβαίωση\".
- ]]>
-
- Αποστολή BTC
-
SideShift.ai
-
Το SideShift.ai είναι τρίτος πάροχος που δρα σαν ανταλλακτήριο από Monero σε Bitcoin.
- Χρησιμοποιούμε το API του SideShift.ai για να ενσωματώσουμε πληρωμές Bitcoin στο Monerujo. Παρακαλώ δες το
- https://sideshift.ai και αποφάσισε για τον εαυτό σου εαν αυτό είναι κάτι που θες να χρησιμοποιήσεις. Η Ομάδα του
- Monerujo δεν συνδέεται με το SideShift.ai και δεν μπορεί να σε βοηθήσει με την υπηρεσία.
-
Ισοτιμία συναλλάγματος SideShift.ai
-
Στην οθόνη \"Ποσό\" θα σου δωθούν οι τρέχουσες παράμετροι της υπηρεσίας SideShift.ai. Αυτές
- περιλαμβάνουν την τρέχουσα ισοτιμία καθώς και τα μέγιστα και ελάχιστα όρια BTC. Σημειωτέον ότι αυτή η
- ισοτιμία δεν εξασφαλίζεται σε αυτό το σημείο.
-
Εντολή SideShift.ai
-
Στην οθόνη \"Επιβεβαίωση\", θα δεις την πραγματική εντολή SideShift.ai. Αυτή η εντολή ισχύει για
- περιορισμένο χρόνο - μπορεί να προσέξεις μια αντίστροφη μέτρηση στο κουμπί \"Ξόδεψε\". Η ισοτιμία
- μπορεί να είναι διαφορετική από την ενδεικτική που φαινόταν σε προηγούμενες οθόνες.
-
Μυστικό Κλειδί SideShift.ai
-
Μιας και το Monerujo διαχειρίζεται μόνο την πλευρά του Monero της συναλλαγής το μυστικό κλειδί SideShift.ai
- μπορεί να χρησιμοποιηθεί για να εντοπίσει την συναλλαγή απο μεριάς Bitcoin στην SideShift.ai εντολή σου στην αρχική τους σελίδα.
-
Αντίστροφη μέτρηση SideShift.ai!
-
Μόλις η αντίστροφη μέτρηση φθάσει στο μηδέν, χρειάζεται να ξεκινήσεις πάλι την συναλλαγή στο SideShift.ai πηγαίνοντας
- πίσω στο προηγούμενο βήμα και μετά επιστρέφοντας στην οθόνη \"Επιβεβαίωση\".
- ]]>
-
- Create Wallet - Ledger
-
You want to recover your wallet from your Ledger Nano S device.
-
Your secret keys never leave the Ledger device, so you need it plugged in every
- time you want to access your wallet.
-
Enter a unique wallet name and password. The password is used for securing your wallet data on the Android
- device. Use a strong password - even better use a passphrase.
-
Enter the block number of the first transaction used for this address in the
- field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
- enter an approximate date/blockheight before you first used this wallet address.
- ]]>
-
- Το Πορτοφόλι
-
Street Mode
-
Street mode can be enabled/disabled in the menu or Gunther\'s head icon. In this mode, your
- balance is not shown on any screen so you can safely use your wallet on the street, a pub or
- other public place. Previous transactions are also hidden. New transactions will be shown, so
- you can see that you have sent/received sweet Moneroj!
-
Σάρωση
- Επειδή το Monero θέλει να κρατάει τα πράγματα ιδιωτικά, κάθε φορά που ανοίγεις ένα πορτοφόλι
- Monerujo πρέπει να σαρώσουμε όλο το blockchain για να βρεθούν νέα ληφθέντα Moneroj στο πορτοφόλι σας, αυτό
- αποθηκεύει μόνο πληροφορίες στο τηλέφωνό σου που ανιστοιχούν στο πορτοφόλι σου. Μερικές φορές
- μπορεί να χρειαστεί λίγος χρόνος γιατί δεν έχεις συγχρονίσει για μεγάλο χρονικό διάστημα.
-
Το Υπόλοιπο
-
Βοήθεια! Το υπόλοιπο του πορτοφολιού μου εξαφανίστηκε ή ειναι μη επιβεβαιωμένο!
- Μην πανικοβάλεσαι! Όταν στέλνεις κεφάλαια από το πορτοφόλι σου, ένα μέρος
- του υπολοίπου σου θα δείχνει για λίγο ως μη επιβεβαιωμένο.
- Αυτό συμβαίνει σαν αποτέλεσμα του πως το Monero ανταλλάσεται στο blockchain και το πως δουλεύουν τα ρέστα.
- Διάβασε περισσότερα για τα ρέστα εδώ(Αγγλικά) https://getmonero.org/resources/moneropedia/change.html
-
Λίστα Συναλλαγών
-
Μια λίστα απο τις συναλλαγές του πορτοφολιού. Στα πορτοφόλια παρακολούθησης φαίνοντε μόνο οι εισερχόμενες συναλλαγές.
- ]]>
-
- Nodes
-
TL;DR
-
Refresh the nodes list by pulling down & bookmark 3–5 nodes to allow Monerujo
- to choose the best one for you!
-
What's a Node?
-
Monerujo uses a Remote Node (sometimes also called Daemon) to communicate with
- the Monero Network without having to download and store a copy of the
- whole blockchain itself.
-
Node List
-
If the list is empty, you can either add new nodes manually or let Monerujo
- scan the network for you. Or both. Read on…
-
The node list shows all currently known nodes. Additionally, the timestamp
- of the latest block known to each node is shown under the node name. An icon
- representing the node's response behaviour
- (which indicates the level of connectivity to be expected)
- is shown next to each node.
-
Any node in the list can be bookmarked for later use.
- Nodes which are not bookmarked will be forgotten.
-
Monerujo will choose the optimal bookmarked node each time you use it.
- It does this by checking the blockheight (how up-to-date
- is the node?) as well as the response behaviour (how fast does the node respond to requests?).
-
The list is sorted by these characteristics, so the top node would be the one Monerujo
- would choose right now. The bottom of the list would show very slow or unavailable nodes.
-
Add a Node
-
By touching the "Add Node" button at the bottom, you will be asked to
- enter the node details in the following dialog.
- The "Address" is the hostname or IP-address of the node - this is the only
- mandatory entry.
- Enter the "Port" if the node runs on a non-default port (e.g. 18089).
- You can also optionally name the node, so you can identify it easier later on.
- Some nodes require credentials to use them. Enter the provided username &
- password in the appropriate fields. Now you can "Test" these setting.
- The "Test Results" will display the blockheight, response time and actual IP used.
- The result may also be an error - usually because the hostname provided is
- not reachable in a sensible amount of time or the credentials are incorrect.
- Or the hostname/port combination does not point to an actual Monero Node!
- Once the test passes (no error) - you're set to press "OK" to save &
- bookmark this node.
-
Scan for Nodes
-
Additionally, you can scan the network for nodes. Monerujo will start
- scanning the network for Remote Nodes on port 18089. It begins by asking your
- bookmarked nodes for other peers in the Monero P2P network and then continues
- by asking those for their peers, and so on. If you have no bookmarked nodes
- (or they don't tell us about their peers),
- Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
- scan stops when it finds 10 remote nodes in total.
- ]]>
-
-
-
- Using a payment link
-
You have started monerujo with a payment link. In order to send funds, please do the following:
-
- 1. Open the wallet you want to spend from
- 2. Wait until the wallet is synced & the "Give" button appears
- 3. Touch the "Give" button
-
-
The payment details will be filled in. Check them and proceed like for any other transaction.
- ]]>
-
- Got it!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
deleted file mode 100644
index fedd248..0000000
--- a/app/src/main/res/values-el/strings.xml
+++ /dev/null
@@ -1,452 +0,0 @@
-
-
- Πορτοφόλι
-
- Σχετικά
- Πολιτική Απορρήτου
-
- Μοιράσου
- Βοήθεια
- Λήψη
- Μετονομασία
- Δημιουργία αντίγραφου ασφαλείας
-
- Συνέχισε να πληκτρολογείς …
- Εεχ …
- Έλα, μπορείς και καλύτερα!
- Κοντεύεις …
- Έτσι! χακεράδικο στιλ!!
-
- Πορτοφόλια
- Ευχαριστίες
- OK
- Άκυρο
- Κλείσιμο
- Λεπτομερείς πληροφορίες
-
- Αποστολή με επιτυχία
- Έγινε
-
- Πατήστε για QR κωδικό
-
- Συναλλαγή BTC ενεργοποιήθηκε, πάτα για περισσότερες πληροφορείες.
- Ledger ενεργοποιήθηκε, πάτα για περισσότερες πληροφορείες.
-
- Έβαλες μια διεύθυνση %1$s.
- Θα στείλεις XMR και ο παραλήπτης θα πάρει %1$s μέσο της υπηρεσίας SideShift.ai.
- ]]>
-
- Εντολή SideShift.ai
-
- %1$s %2$s
-
- Επιβεβαίωση Εκκρεμεί
- Πληρωμή σε εκκρεμότητα
- SideShift.ai Σφάλμα (%1$s)
- %1$s Αποστάλθηκαν!
- Αίτηση …
-
- Μπορείς να στείλεις %1$s — %2$s %4$s.
- Το SideShift.ai σου δίνει ισοτιμία ανταλλαγής %3$s %4$s/XMRαυτή τη στιγμή.
- ]]>
-
- Σύνολο: %2$s %3$s (%1$s XMR)
-
- ✔ ID πληρωμής ενσωματωμένο
- Προετοιμασία της συναλλαγής σου
-
- Δημιουργία εντολής με SideShift.ai
- Αίτηση εντολής στο SideShift.ai
- Προετοιμασά συναλλαγής Monero
-
- Αίτηση στο SideShift.ai για παραμέτρους
-
- SideShift.ai ΣΦΑΛΜΑ
- Κωδικός σφάλματος: %1$d
-
- Πάτησε για να προσπαθήσεις ξανά
- Τώρα έχουμε κολλήσει εδώ!
- Ωχ,το SideShift.ai φαίνεται να μην ειναι προσωρινά διαθέσιμο!
-
- %1$s %3$s = %2$s XMR
- (Rate: %1$s %2$s/XMR)
-
- Επίσκεψη στο SideShift.ai για υποστήριξη & με εντοπισμό συναλλαγής
- Μυστικό Κλειδί\nSideShift.ai
- SideShift.ai Μυστικό Κλειδί
- %1$s Διεύθυνση Παραλήπτη
- Ποσό
-
- ID Συναλλαγής
- Διεύθυνση Παραλήπτη
- Σημειώσεις
-
- Δημιουργία αντίγραφου ασφαλείας σε εξέλιξη
- Αρχειοθέτηση σε εξέλιξη
- Μετονομασία σε εξέλιξη
-
- Μάζεμα των πραγμάτων …\nΑυτό μπορεί να διαρκέσει λίγο!
-
- Η δημιουργία αντίγραφου ασφαλείας ήταν επιτυχής
- Η δημιουργία αντίγραφου ασφαλείας απέτυχε!
- Η μετονομασία απέτυχε!
-
- Κόμβος(Δαίμονας)
- Φόρτωση Πορτοφολιού …
- Πορτοφόλι αποθηκεύτηκε
- Η αποθήκευση του πορτοφολιού απέτυχε!
- Σύνδεση …
- Η σύνδεση με τον κόμβο απέτυχε!\nΈλεγξε χρήστη/κωδικό
- Ο κόμβος είναι μη έγκυρος!\nΠροσπάθησε με άλλον.
- Δεν είναι δυνατή η πρόσβαση στον κόμβο!\nΠροσπάθησε πάλι ή με άλλον.
-
- Αποσυνδέθηκε
-
- Η συναλλαγή απέτυχε: %1$s
-
- Περίμενες για πολύ καιρό φίλε μου!
-
- Δουλεύω ακόμα στο προηγούμενο πορτοφόλι σου …
-
- Μετονομασία %1$s
-
- Κωδικός για %1$s
- Λάθος κωδικός!
- Το πορτοφόλι δεν υπάρχει!
- Η διεύθυνση δαίμονα πρέπει να οριστεί!
- Το πορτοφόλι δεν ταιριάζει με το επιλεγμένο δίκτυο
-
- (Μόνο Παρακολούθηση)
-
- Λήψη
- Αποστολή
-
- + %1$s XMR μη επιβεβαιωμένα
-
- Υπηρεσία monerujo
-
- Συγχρονισμένα:
- Μπλοκς που απομένουν
- Έρευνα:
-
- Η εξωτερική αποθήκευση δεν είναι εγγράψιμη! Πανικός!
- Χρειαζόμαστε πραγματικά αυτά τα δικαιώματα εξωτερικής αποθήκευσης!
- Όχι κάμερα = Όχι QR σκανάρισμα!
-
- Κλειδί Προβολής(View Key)
- Δημόσια Διεύθυνση(Public Address)
- Κλειδή
- Το Κλειδί Προβολής αντιγράφηκε στο πρόχειρο!
- Το Κλειδή αντιγράφηκε στο πρόχειρο!
- Η διύθυνση πορτοφολιού αντιγράφηκε στο πρόχειρο!
- Το ID συναλλαγής αντιγράφηκε στο πρόχειρο!
- Η αντιγραφή είναι απενεργοποιημένη για λόγους ασφαλείας!
-
- Δεν είναι δυνατή η συναλλαγματική ισοτιμία! Χρησιμοποίησε XMR/XMR ή προσπάθησε ξανά
-
- Δημιουργία Πορτοφολιού
- Όνομα Πορτοφολιού
- Κωδικός Πορτοφολιού
- Φτιάξε μου ένα πορτοφόλι επιτέλους!
- Έχω σημειώσει αυτές τις 25 λέξεις!
-
- Δώσε μου ένα όνομα!
- Το Πορτοφόλι υπάρχει!
- Δεν γίνεται να ξεκινάει με .
- Το πορτοφόλι δημιουργείται
- Το Πορτοφόλι δημιουργήθηκε
-
- Βάλε αριθμό ή ημερομηνία (YYYY-MM-DD δλδ χρονιά-μήνας-μέρα)
-
- Κλειδιά
- Νέο
- Σπόρος
- Προβολή
-
- Δημόσια Διεύθυνση(Public Address)
- Κλειδί Προβολής(View Key)
- Κλειδί Ξοδεύματος(Spend Key)
- Μνημονικός Σπόρος(Mnemonic Seed) 25-Λέξεων
- Ύψος ανάκτησης ή Ημερομηνία (YYYY-MM-DD δλδ χρονιά-μήνας-μέρα)
-
- Δημόσια Διεύθυνση(Public Address)
- Κλειδί προβολής(View Key)
- Κλειδί ξοδεύματος(Spend Key)
- Μνημονικός Σπόρος(Mnemonic Seed)
-
- Δώστε έγκυρο κλειδί
- Δώστε έγκυρη διεύθυνση
- Βάλε τον σπόρο σου 25-λέξεων
-
- Προσωπικές σημειώσεις (προαιρετικό)
- Δημιουργία
- Ξόδεψε τα γλυκά μου Moneroj
- Ξόδεψε τα γλυκά μου Moneroj (%1$s)
- Δεν είναι QR κώδικας
- Δεν είναι έγκυρος κωδικός QR πληρωμής
- Δεν είναι έγκυρη η διεύθυνση
- Αποστολή
- Υπόλοιπο: %1$s XMR
- Διεύθυνση
- Ποσό
- Επιβεβαίωση
- Έγινε
-
- Ποσό
- Κόμιστρο (XMR)
- Κόμιστρο
- Σύνολο (XMR)
- Σύνολο
-
- %1$s XMR
- +%1$s Κόμιστρο
-
- Σφάλμα Δημιουργίας Συναλλαγής
-
- Κόμιστρο %1$s
- (%1$s)
- απέτυχε
- - %1$s
- + %1$s
-
- Ημερομηνία
- ID Συναλλαγής(TX ID)
- Κλειδί συναλλαγής(TX Key)
- Προορισμός
- ID Πληρωμής(Payment ID)
- Μπλοκ
- Ποσό
- Κόμιστρο
- Συναλλαγές
- Σημειώσεις
- (προαιρετικό)
- Λεπτομέρειες Συναλλαγής
-
- ΕΚΚΡΕΜΗ
- ΑΠΕΤΥΧΕ
-
- Ποσό
- Δεν ήταν δυνατό το άνοιγμα του πορτοφολιού!
-
- Μέγιστο %1$s
- Ελάχιστο 0
- XMR δεν υπάρχει αριθμός
-
- Θα εμφανιστούν τώρα ευαίσθητα δεδομένα. \nΠρόσεχε ποιος είναι πίσω σου!
- Είμαι ασφαλής
- Πήγαινε με πίσω!
- Λεπτομέρειες
-
- Ναι, κάνε αυτό!
- Όχι ευχαριστώ!
-
- Δημιουργία νέου πορτοφολιού
- Επαναφορά πορτοφολιού προβολής-μόνο
- Επαναφορά πορτοφολιού από ιδιωτικά κλειδιά
- Επαναφορά πορτοφολιού από σπόρο 25-λέξεων
-
- Change Passphrase
- Change Password in progress
- Change Password failed!
- Password changed
- New Passphrase for %1$s
- Repeat Passphrase for %1$s
- You can also open wallet using fingerprint.\nPlease touch sensor.
- Opening the wallet…
- Fingerprint not recognized. Try again.
- Saved password is incorrect.\nPlease enter password manually.
- Allow to open wallet using fingerprint
-
- Fingerprint Authentication
-
With fingerprint authentication enabled, you can view wallet balance and receive funds
- without entering password.
-
But for additional security, monerujo will still require you to enter password when
- viewing wallet details or sending funds.
- Security Warning
-
Finally, monerujo wants to remind you that anyone who can get your fingerprint will be
- able to peep into your wallet balance.
-
For instance, a malicious user around you can open your wallet when you are asleep.
- Are you sure to enable this function?
-
- Passphrases do not match
- Passphrase may not be empty
- Wallet Files Restore Password
- Create Account
- Added new account #%1$d
- Account #
- Send all confirmed funds in this account!
- Subaddress
- Public Subaddress #%1$d: %2$s
-
- Language
- Use System Language
-
- Restore from Ledger Nano
-
- Communicating with Ledger
- Confirmation on Ledger required!
- Retrieving subaddresses
- Verifying keys
- Doing crazy maths
- Hashing stuff
- Please (re)connect Ledger device
-
- Creating account
-
- %1$s attached
- %1$s detached
-
- Writing Tag
- Writing Tag failed!
- Writing Tag successful
- Tag does not support NDEF!
- Tag provides %1$d bytes, but we need %2$d!
- I don\'t understand the Tag!
- I don\'t know what you want!
- NFC Available!
-
- Description (optional)
-
- OpenAlias address not available
- OpenAlias secure ✔
- Resolving OpenAlias…
- OpenAlias without DNSSEC - address may be spoofed
-
- Node version incompatible - please upgrade!
-
- Λεπτομέριες
- Street Mode
-
- Node-o-matiC enabled, tap for more info.
- Last block updated: %1$s
- Nodes
- Node Name (Optional)
- Hostname
- Port
- Username (Optional)
- Password (Optional)
- Cannot resolve host
- We need this!
- Must be numeric
- Must be 1–65535
- Add Node
- Touch to refresh!
- CONNECTION ERROR %1$d
- CONNECTION ERROR
- AUTHENTICATION FAILED
- Test Result:
- Height: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- Testing IP: %1$s …
- Please wait for scan to finish
- Touch to select or add nodes
- Add nodes manually or pull down to scan
- Scanning network…
- Automatically bookmarked best %1$d nodes
- Test
-
- Receiver
-
- EVERYTHING!
-
- Convert Ledger Seed
- Ledger Seed Words
- Ledger Passphrase (optional)
- Invalid Ledger Seed!
- Entering your Ledger Seed here is a major security risk!
-
- Ύψος ανάκτησης
-
- Start Monero App on %1$s
-
- Rescan!
-
- I get it!
- Next
- I\'m ready!
-
- Welcome to Monerujo!
- This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.
- Keep your seed safe
- The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.
- Send Crypto
- Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.
- Nodes, your way
- Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.
- Send with fingerprint
- You\'re now able to send XMR with just your fingerprint if you enabled it. To request the password, just disable fingerprint access.
-
- Dark Mode
-
- Auto
- Day
- Night
-
- There is nothing here\nPlease create or restore a wallet
-
- Restore default nodes
- Restoring already in progress…
-
- Last Block: %1$d seconds ago
- Last Block: %1$d minutes ago
- Last Block: %1$d hours ago
- Last Block: %1$d days ago
-
- Cannot get quote
- Check amount and try again
-
- Ambiguous address.
- Please select the type above.
- ]]>
-
- Please enter or scan a %1$s address.
- You'll send XMR and the receiver will get %2$s using the SideShift.ai service.
- ]]>
-
- Please enter or scan a Monero address.
- ]]>
-
- Subaddresses
- Subaddress Name
- Too many unused addresses - use some to enable creating more!
- Too many unused accounts - use some to enable creating more!
- Transactions for this subaddress:
- No transactions for this subaddress yet
- Select a subaddress
- Long-press for details
-
- This wallet will be deleted. Your funds will be gone forever unless you have your seed or a working backup to recover it.
- Delete
- Delete failed!
-
- Import wallet
- Import failed!
-
- Reset wallet!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-eo/about.xml b/app/src/main/res/values-eo/about.xml
deleted file mode 100644
index 2742fef..0000000
--- a/app/src/main/res/values-eo/about.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
- Fermi
- Mi estas monerujo
- Versio %1$s (%2$d)
-
- Agnoskoj
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo, ErCiccione kaj aliaj.
-
Tiu paĝo informas vin pri nia politiko rilate al la kolektado, uzado
- kaj rivelado de personaj informoj kiujn ni ricevas de uzantoj de la
- aplikaĵo. (monerujo: Monero Wallet).
-
Uzante la aplikaĵon, vi akceptas la kolektadon kaj uzon de informoj
- kongrue al tiu politiko.
-
Kolektitaj datumoj
-
Persona datumo estas ĉiu ajn datumo kiu povas identigi personon.
-
Monero-ŝlosiloj kaj publikaj adresoj kolektiĝas kaj traktiĝas de la aplikaĵo
- lokale, por la celo trakti transakciojn, kaj sendiĝas sur la Monero-reto je ĉifrita
- formo.
-
Aliaj personaj datumoj ne kolektiĝas de la aplikaĵo.
-
Se vi uzas la opcian funkcionon, kiu permesas nombrumi vian pagon je alia valuto (ekz. dolaroj),
- monerujo informpetos pri la kurzo per la publika interfaco de coinmarketcap.com.
- Vidu ilian privatecan politikon je https://coinmarketcap.com/privacy por detaloj pri
- kiel la datumo de viaj petoj kolektiĝos.
-
Se vi uzas la aplikaĵon por pagi al Bitmono-adresoj, vi uzos la SideShift.ai-servon.
- Vidu ilian privatecan politikon je https://sideshift.ai/ por detaloj. Monerujo sendos al ili la
- BTC-ricevontadreson kaj kvanton. Via IP-adreso ankaŭ kolekteblos.
-
Permesoj de la aplikaĵo
-
-
INTERRETO : Konekti kun la Monero-reto per noda demono
-
LEGI_EKSTERAJN_MEMORILOJN : Legi la monujdosierojn kiuj konserviĝas en la aparato
-
SKRIBI_EKSTERAJN_MEMORILOJN : Skribi la monujdosierojn kiuj konserviĝas en la aparato
-
LASI_VEKA : Lasi la aparaton veka dum la sinkronizado
-
FILMILO : Skani QR-kodojn por ricevi Monerojn
-
-
Ŝanĝoj de la privateca politiko
-
Ni eble ĝisdatigos tiun privatecan politikon de temp\' al tempo. Ni
- sciigos vin pri ĉiu ŝanĝo tiel : ni sendos la novan privatecan politikon en la
- aplikaĵon kaj sur la retejo (www.monerujo.io)
- Ni konsilas al vi, ke vi regule gvatu tiun dokumenton kaze de ŝanĝoj.
-
Tiu privateca politiko ĝisdatiĝis lastfoje la 10an de novembro 2017.
-
-
Kontaktu nin
-
Se vi havas ian demandon pri nia privateca politiko,
- aŭ pri kiel viaj datumoj kolektiĝas kaj traktiĝas,
- kontaktu retpoŝte privacy@monerujo.io.
-
Entajpu unikan monujnomon kaj pasvorton.
- La pasvorto estas uzita por sekurigi la datumojn de via monujo sur via aparato. Uzu fortan
- pasvorton - eĉ pli bone, uzu pasfrazon.
-
Skribu vian mnemonikan semon surpapere!
-
Sur la venonta ekrano, vi trovos vian 25-vortan \"mnemonikan semon\".
- Estas la nura datumo, kiu bezoniĝos por restaŭri vian monujon en la estonteco, kaj reiĝi
- estro de via mono!
-
Se vi perdas la pasvorton de via monujo, vi tamen povos restaŭri vian monujon per
- la mnemonikan semon.
-
Estas neniu ebleco retrovi vian mnemonikan semon. Se vi perdas ĝin, via tuta mono
- perdiĝas ankaŭ! La mnemonika semo ne ŝanĝeblas, kaj se ĝi ŝteliĝas aŭ endanĝeriĝas,
- vi devos transigi vian monon al nova monujo (kun nova mnemonika semo). Tial estas
- plej bone ke vi sekurkopiu vian mnemonikan semon skribante ĝin surpapere, kaj konservu
- ĝin en pluraj sekuraj lokoj.
- ]]>
-
- Krei monujon - Semo
-
Se vi jam havas Monero-adreson kaj volas reĉerpi la transkaciojn el la blokĉeno!
-
Entajpu unikan monujnomon kaj pasvorton.
- La pasvorto estas uzita por sekurigi la datumojn de via monujo sur via aparato. Uzu fortan
- pasvorton - eĉ pli bone, uzu pasfrazon.
-
Entajpu vian semon en la kampo \"Mnemonika Semo\".
-
Entajpu la bloknumeron de la unua transakcio okazinta por tiu adreso en la kampon \"Restaŭralteco\".
- Vi ankaŭ povas uzi daton je la formato JJJJ-MM-TT. Se vi ne certas, entajpu proksimuman
- bloknumeron aŭ daton de iom antaŭ via unua uzo de tiu adreso.
- ]]>
-
- Krei monujon - Ledger
-
Do vi volas retrovi vian monujon de via Ledger Nano S aparato.
-
Viaj sekretaj ŝlosiloj ne forlasos la Ledger-aparaton, do ĝi estu enkonektita ĉiufoje, kiam
- vi volas atingi vian monujon.
-
Entajpu unikan monujnomon kaj pasvorton.
- La pasvorto estas uzita por sekurigi la datumojn de via monujo sur via Android-aparato. Uzu fortan
- pasvorton - eĉ pli bone, uzu pasfrazon.
-
Entajpu la bloknumeron de la unua transakcio okazinta por tiu adreso en la kampon \"Restaŭralteco\".
- Vi ankaŭ povas uzi daton je la formato JJJJ-MM-TT. Se vi ne certas, entajpu proksimuman
- bloknumeron aŭ daton de iom antaŭ via unua uzo de tiu adreso.
- ]]>
-
-
- Krei monujon - Ŝlosiloj
-
Se vi restaŭras vian monujon per viaj ŝlosiloj!
-
Entajpu unikan monujnomon kaj pasvorton.
- La pasvorto estas uzita por sekurigi la datumojn de via monujo sur via Android-aparato. Uzu fortan
- pasvorton - eĉ pli bone, uzu pasfrazon.
-
Entajpu vian Monero-adreson en la kamp \"Public Address\" kaj plenigu \"Vida ŝlosilo\" kaj \"Elspezŝlosilo\".
-
Entajpu la bloknumeron de la unua transakcio okazinta por tiu adreso en la kampon \"Restaŭralteco\".
- Vi ankaŭ povas uzi daton je la formato JJJJ-MM-TT. Se vi ne certas, entajpu proksimuman
- bloknumeron aŭ daton de iom antaŭ via unua uzo de tiu adreso.
- ]]>
-
- Krei monujon - nurvida
-
Se vi nur volas sekvi transakciojn kiuj alvenas en la monujon!
-
Entajpu unikan monujnomon kaj pasvorton.
- La pasvorto estas uzita por sekurigi la datumojn restaŭrasde via monujo sur via Android-aparato. Uzu fortan
- pasvorton - eĉ pli bone, uzu pasfrazon.
-
Entajpu vian Monero-adreson en la kampo \"Publika adreso\" kaj plenigu \"Vida ŝlosilo\".
-
Entajpu la bloknumeron de la unua transakcio okazinta por tiu adreso en la kampon \"Restaŭralteco\".
- Vi ankaŭ povas uzi daton je la formato JJJJ-MM-TT. Se vi ne certas, entajpu proksimuman
- bloknumeron aŭ daton de iom antaŭ via unua uzo de tiu adreso.
- ]]>
-
- Monujdetaloj
-
Publika adreso
- Via publika adreso estas kiel via banka kontonumero, kiun vi povas montri al iu ajn, kaj fidi
- ke vi ne perdos viajn Monerojn. Per tiu adreso, homoj sendos Monerojn al via monujo.
-
-
Mnemonika semo
- Tio estas la nura datumo, kiu bezoniĝas por restaŭri vian monujon en la estonteco, kaj reiĝi
- estro de via mono! Estas gravege konservi ĝin private kaj sekrete, ĉar ĝi lasus iun ajn
- forŝteli viajn Monerojn! Se vi je jam skribis ĝin surpapere, bonvolu fari tion tuj!
-
-
Pasvorto por retrovi monujdosierojn
- Certiĝu ke vi skribas tiun pasvorton surpapere. Se vi restartas vian aparaton aŭ malinstalas
- la aplikaĵon, vi bezonos ĝin por atingi vian monujon denove.
-
-
CrAzYpass
- Se la ĉi-montrita pasvorto estas 52 ciferoj kaj literoj je kvaropoj, gratulojn!
- Signifas ke viaj monujdosieroj nun sekuriĝas per 256-bita ŝlosilo, kiun kreis la sekurfunkcioj
- de via parato, bazante sur la pasfrazo skribita de vi (ĉu ĵus kreite aŭ ĉu nur ŝanĝite).
- Tiu afero igas la monujon treege malfacile kodrompebla!
- Tiu funkcio estas deviga por ĉiuj nove kreitaj monujoj.
-
-
Malnova pasvorto
- Se vi vidas vian pasfrazon ĉi tie, signifas ke viaj monujdosieroj ne tiom sekuras kiel uzante
- CrAzYpass. Por solvi tion, simple elektu \"Ŝanĝi pasfrazon\" el la menuo. Per tiu nova pasfrazo
- (kiu ja povas esti la sama kiel antaŭe) la aplikaĵo kreos iun CrAzYpass por vi, kaj sekurigos
- viajn monujdosierojn per ĝi. Skribu ĝin surpapere!
-
-
CrAzYpass-monujoj
- Se vi iam bezonas reinstali Monerujon (ekz. post restartigo de via telefono aŭ ŝanĝo de telefono)
- aŭ se vi intencas uzi viajn monujdosierojn kun alia aparato aŭ komputilo, vi devos uzi tiun
- Restaŭrpasvorton por atingi vian monujon denove.
- Elektante \"Ŝanĝi pasfrazon\" el la menuo, vi povos entajpi alian pasfrazon. Atentu pri tio
- ke nova Restaŭrpasvorto kreiĝos. Srkibu ĝin surpapere!
-
-
Vida ŝlosilo
- Via vida ŝlosilo uzeblas por sekvi transakciojn venantajn al via monujo, sen permesigi
- elspezon de la mono troviĝanta en via monujo.
-
-
Elspezŝlosilo
- Via elspezŝlosilo ebligas ĉiun ajn elspezi la Monerojn ligitajn kun via monujo, do ne montru
- ĝin al iu ajn, konservu ĝin sekure, kiel vian Mnemonikan Semon.
- ]]>
-
- Listo de monujoj
-
-
Nodo
-
Monerujo uzas foran nodon por komuniki kun la Monero-Reto sen elŝuti kaj konservi kopion
- de la tuta blokĉeno. Vi povas trovi liston de popularaj foraj nodoj, aŭ lerni kiel starigi
- vian propran foran nodon, tie : https://moneroworld.com/
-
Monerujo estas jam antaŭagordita por kelkaj foraj nodoj. Ĝi memoros la kvin laste uzitajn
- nodojn.
-
-
Monujoj
-
Jen viaj monujoj. Ili troviĝas en la monerujodosierujo, en la interna memorilo de
- via aparato. Vi povas uzi dosieran foliumilon por vidi ilin. Vi devus regule sekurkopii
- tiun dosierujon, kaze de eksplodo aŭ ŝtelo de via aparato.
-
Elektu monujon por malfermi ĝin, aŭ premu la \"+\" por krei novan.
- Aŭ elektu iun el tiuj monuj-operacioj:
-
-
Detaloj
-
Montras la monujdetalojn, semon kaj ŝlosilojn.
-
-
Ricevi
-
Kreas QR-kodon por ricevi Monerojn.
-
-
Renomi
-
Renomas la monujon. Sekurkopioj ne renomiĝos.
-
-
Sekurkopio
-
Kreas kopion de la monujo en la sekurkopioj-dosierujo en la monerujo,
- anstataŭigante antaŭajn kopiojn tie.
-
-
Arkivo
-
Kreas sekurkopion kaj forviŝas la monujon poste. La kopio restos en la
- sekurkopioj-dosierujo. Se vi ne plu bezonas viajn sekurkopiojn, vi devus forviŝi ilin
- per dosiera foliumilo, aŭ sekure forviŝi la aplikaĵon.
- ]]>
-
- Transakciaj detaloj
-
Destino
- Jen la publika adreso de la monujo al kiu vi sendas Monerojn.
-
-
Paga ID
- Vi povas uzi pagan IDon por identigi la kialon de la transakcio. Tio estas tute opcia kaj
- privata. Ekzemple, tio permesas al komercisto kunligi vian transakcion kun varo kiun vi aĉetis.
-
-
Transakcia ID
- Tio identigas vian transakcion, vi povas uzi ĝin por sekvi vian tro daŭran transakction ĉe
- Monera blokĉen-esplorilo, kiel https://xmrchain.net/
-
-
Transakcia ŝlosilo
- Tio estas la privata ŝlosilo de la transakcio, vi konservu ĝin sekrete. Se iu triulo vidos
- ĝin, li malkovros kiun subskribon estas via en unu ringo, tiel malprivatigante vian
- transakcion.
-
Bloko
- Jen la bloko en kiu via transakcio enskribiĝis.
- ]]>
-
- Sendi
-
Adreso de la ricevonto
- Jen la publika adreso de la monujo al kiu vi sendas Monerojn. Vi povas kopii tion el via
- tondujo, skani QR-kodo, aŭ mane entajpi ĝin. Kontrolu ĝin trifoje por certiĝi ke vi ne sendas
- monon al malĝusta adreso.
-
Aldone al tio, vi ankaŭ povas uzi
-
-
iun OpenAlias por XMR aŭ BTC
-
bitmonan-adreson (BTC)
-
- Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai
- for details). See the section on sending BTC below.
-
-
Sendi BTC
-
-
SideShift.ai
-
SideShift.ai estas ekstera liveranto kiu agas kiel ŝanĝisto de Monero al Bitmono. Ni uzas la
- interfacon de XMR.TR por integrigi pagojn de bitmono en Monerujo. Bonvolu mem legi ĉe
- https://sideshift.ai kaj decidu ĉu vi volas uzi tion. La Monerujo-teamo ne asocias kun SideShift.ai kaj ne
- kapablas helpi vin kun ilia servo.
-
-
Kurzo de SideShift.ai
-
Sur la \"Kvanto\"-ekrano montriĝos la nunaj parametroj de la SideShift.ai-servo. Ili inkludas la
- nunan XMR/BTC-kurzon, la superan limon kaj suban limon de la eblaj BTC-transakcioj. Bonvolu
- noti ke tiu kurzo ĉiam ŝanĝiĝas.
-
Mendo al SideShift.ai
-
Sur la \"konfirmi\"-ekrano, vi vidos la efektivan SideShift.ai-mendon. Tiu mendo validas nur dum
- limigita tempo - vi certe ekvidos retrokalkulon sur la \"Spendi\"-butonon. La kurzo estos
- eble malsama ol tiu antaŭe montrita.
-
-
Sekreta ŝlosilo de SideShift.ai
-
Ĉar Monerujo nur traktas la Monero-flankon de via transakcio, vi uzu la sekretan
- SideShift.ai-ŝlosilon por sekvi la Bitmono-parton de via mendo sur la hejmpaĝo de SideShift.ai.
-
La retrokalkulo de SideShift.ai!
-
Kiam la retrokalkulo atingas nulon, vi devos akiri novan QUOTE de SideShift.ai, reirante al la
- antaŭa fazo kaj el tie repaŝi ĝis la \"Konfirmi\"-ekrano.
- ]]>
-
- Elspezi Bitmonon
-
-
SideShift.ai
-
SideShift.ai estas ekstera liveranto kiu agas kiel ŝanĝisto de Monero al Bitmono. Ni uzas la
- interfacon de XMR.TR por integrigi pagojn de bitmono en Monerujo. Bonvolu mem legi ĉe
- https://sideshift.ai kaj decidu ĉu vi volas uzi tion. La Monerujo-teamo ne asocias kun SideShift.ai kaj ne
- kapablas helpi vin kun ilia servo.
-
-
Kurzo de SideShift.ai
-
Sur la \"Kvanto\"-ekrano montriĝos la nunaj parametroj de la SideShift.ai-servo. Ili inkludas la
- nunan XMR/BTC-kurzon, la superan limon kaj suban limon de la eblaj BTC-transakcioj. Bonvolu
- noti ke tiu kurzo ĉiam ŝanĝiĝas.
-
Mendo al SideShift.ai
-
Sur la \"konfirmi\"-ekrano, vi vidos la efektivan SideShift.ai-mendon. Tiu mendo validas nur dum
- limigita tempo - vi certe ekvidos retrokalkulon sur la \"Spendi\"-butonon. La kurzo estos
- eble malsama ol tiu antaŭe montrita.
-
-
Sekreta ŝlosilo de SideShift.ai
-
Ĉar Monerujo nur traktas la Monero-flankon de via transakcio, vi uzu la sekretan
- SideShift.ai-ŝlosilon por sekvi la Bitmono-parton de via mendo sur la hejmpaĝo de SideShift.ai.
-
La retrokalkulo de SideShift.ai!
-
Kiam la retrokalkulo atingas nulon, vi devos akiri novan QUOTE de SideShift.ai, reirante al la
- antaŭa fazo kaj el tie repaŝi ĝis la \"Konfirmi\"-ekrano.
- ]]>
-
- La monujo
-
Street Mode
-
Strata moduso enŝaltiĝas/malŝaltiĝas en la menuo aŭ ĉe la bildeto de la vizaĝo de Gunther.
- En tiu moduso, via saldo ne montriĝos, sur neniu ekrano, tiel vi povas sekure uzi vian
- monujon surstrate, trinkeje, aŭ ie publike. Antaŭaj transakcioj ankaŭ kaŝiĝas. Nova
- transakcioj montriĝos, til vi povos vidi ke vi sendis/ricevis dolĉajn Monerojn!
-
-
Skanado
- Ĉar Monero ŝatas privatumi, je ĉiu starto la monujo devas skani la blokĉenon por vidi ĉu
- novaj Moneroj sendiĝis al via monujo, kaj via aparato memoras nur la informojn kiuj apartenas
- al via monujo. Povas daŭri iom da tempo fojfoje, des pli se vi ne sinkronizis de longa tempo.
-
La saldo
-
Helpon! La saldo de mia monujo malaperis aŭ ne konfirmiĝis!
- Ne paniku! Kiam vi sendas monon al via monujo, iom el via saldo maldaŭre montriĝos nekonfirmite.
- Tio okazas kiel rezulto de la maniero laŭ kiu Monero sendiĝas sur la blokĉeno, kaj
- kiel \"restmono\" traktiĝas.
- Legu pli pri restmono tie: https://getmonero.org/resources/moneropedia/change.html
-
Transakcia listo
-
Listo de la transakcioj de la monujo. En vidaj monujoj, nur la envenaj transakcioj montriĝas.
- ]]>
-
- Nodoj
-
Resumo
-
Aktualigu la liston de nodoj tirante suben kaj aldonu legosignojn al nodoj por rajtigi
- Monerujon elekti la plej bonan por vi!
-
-
Kio estas nodo?
-
Monerujo uzas foran nodon (kelkfoje nomata \"demono\") por komuniki kun la Monero-reto sen
- elŝuti la tutan blokĉenon kaj gardi kopion de ĝi.
-
-
Listo de nodoj
-
Se la listo malplenas, vi povas mane aldoni novajn nodojn, aŭ lasi Monerujon skani la reton
- por vi. Aŭ ambaŭ. Legu pli…
-
La listo de nodoj montras ĉiujn konatajn nodojn. Aldone, la tempindiko de la bloko kiu plej
- laste koniĝis de ĉiu nodo estas montrita sub la nodnomo. Apud ĉiu nodo estas bildeto kiu simbolas
- la respond-sintenon de ĝi (indikilo de la postulinda konekt-nivelo).
-
Ĉiu nodo de la listo povas markiĝi por pli posta uzo. Nodoj kiuj ne markiĝas, forgesiĝos.
-
Ĉiam kiam uzite, Monerujo elektos la plej taŭgan markitan nodon.
- Tio okazas kontrolante la blokaltecon (kiom ĝisdata estas la nodo?) kaj la respond-sintenon (kiom
- rapide respondas la nodon?).
-
La listo estas ordigita laŭ tiuj ecoj, do la plej supra nodo uziĝos de Monerujo. La plej subaj
- nodoj estas ege malrapidaj aŭ nedisponaj.
-
-
Aldoni nodon
-
Post tuŝi la "Aldoni Nodon"-butono ĉi-sube, vi devos entajpi la detalojn de la nodo
- en la sekva formularo.
- La "Adreso" estas la nomo de la gastiganto aŭ IP-adreso de la nodo - estas la nura
- deviga entajpo.
- Entajpu la "Pordont" se la nodo funkcias je nedefaŭlta pordo (ekz. 18089).
- Vi opcie povas nomi la nodon, tiel ke vi poste rekonu ĝin pli facile.
- Iuj nodoj postulas ensalutilojn (uzantonomon kaj pasvorton) por uziĝi. Entajpu ilin en la
- taŭgaj kampoj. Nun vi povas "Testi" tiujn agordojn.
- La "Testrezulto" aperigos la blokaltecon, la responddaŭron kaj la uzitan IP-adreson.
- La rezulto eble estos eraro - plej ofte ĉar la provizita nomo de gastiganto ne atingeblas sufiĉe
- rapide, aŭ ĉar la ensalutiloj ne kongruas.
- Ankaŭ povas esti ke la kombinaĵo gastigantonomo/pordo ne indikas ekzistantan nodon de Monero!
- Post la sukceso de la testo (neniu eraro) - vi povas premi "OK" por konservi tiun nodon.
-
-
Serĉi nodojn
-
Vi povas aldone skani la reton, serĉante nodojn. Monerujo komencos la skanadon je la pordo 18089.
- Ĝi komence petos viajn markitajn nodojn je aliaj partoprenantoj de la P2P-reto,
- kaj poste petos tiujn partoprenantoj je iliaj aliaj konektitaj partoprenantojn,
- kaj tiel plu.
- Se vi ne markis nodojn (aŭ se ili ne respondas pri iliaj konektoj), Monerujo direkte petos la
- pranodojn konservitajn en la kerno de Monero. La skanado haltos kiam 10 foraj nodoj estos trovitaj.
- ]]>
-
- Using a payment link
-
You have started monerujo with a payment link. In order to send funds, please do the following:
-
- 1. Open the wallet you want to spend from
- 2. Wait until the wallet is synced & the "Give" button appears
- 3. Touch the "Give" button
-
-
The payment details will be filled in. Check them and proceed like for any other transaction.
- ]]>
-
- Got it!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
deleted file mode 100644
index 91aa7f3..0000000
--- a/app/src/main/res/values-eo/strings.xml
+++ /dev/null
@@ -1,452 +0,0 @@
-
-
- Wallet
-
- Pri
- Privateca polikito
-
- Kunhavigi
- Helpo
- Ricevi
- Renomi
- Sekurkopio
- Ŝanĝi pasfrazon
-
- Tajpu plu …
- Nja …
- Provu almenaŭ!
- Jam pli bone …
- Mojose, vi estas nerdulo!
-
- Monujoj
- Agnoskoj
- OK
- Nuligi
- Fermi
- Detalaj informoj
-
- Sukcese sendis
- Farite
-
- Tuŝu por QR-kodo
-
- BTC-pago permesita, frapetu por detaloj.
- Ledger permesita, frapetu por detaloj.
-
- Vi entajpis %1$s-adreson.
- Vi sendos XMR-on, kaj per laSideShift.ai-servo, la ricevanto havos %1$s-on.
- ]]>
-
- mendo al SideShift.ai
-
- %1$s %2$s
-
- Konfirmo okazonta
- Pago okazonta
- SideShift.ai eraro (%1$s)
- %1$s sendiĝis!
- Informpetante …
-
- Vi povas sendi %1$s — %2$s %4$s.
- SideShift.ai proponas al vi tiun kurzon: %3$s %4$s/XMRnun.
- ]]>
-
- Saldo: %2$s %3$s (%1$s XMR)
-
- ✔ Paga-ID integriĝis
- Preparante vian transakcion
-
- Kreante mendon al SideShift.ai
- Petante SideShift.ai-mendon
- Preparante la Monero-transakcion
-
- Petante la SideShift.ai-parametrojn
-
- ERARO JE SideShift.ai
- kodo: %1$d
-
- Tuŝu por reprovi
- Ni blokiĝis ĉi tie!
- Uh-oh, ŝajne SideShift.ai ne disponas momente!
-
- %1$s %3$s = %2$s XMR
- (kurzo: %1$s %2$s/XMR)
-
- Vizitu SideShift.ai por helpo kaj sekvado
- Sekreta ŝlosilo\nSideShift.ai
- SideShift.ai sekreta ŝlosilo
- Ricevanta %1$s-adreso
- Kvanto
-
- Transakcia ID
- Ricevanta adreso
- Notoj
-
- Sekurkopio okazanta
- Arkivado okazanta
- Renomigo okazanta
- Pasvortŝanĝo okazanta
-
- Reordigado …\nTio ja povas daŭri!
-
- Sekurkopio sukcesis!
- Sekurkopio malsukcesis!
- Renomado malsukcesis!
- Pasvortŝanĝo malsukcesis!
- Pasvortŝanĝo sukcesis!
-
- Nodo
- Ŝarĝante la monujon …
- La monujo konserviĝis
- La monujkonservoo malsukcesis!
- Konektiĝas…
- Nodkonektiĝo malsukcesis!\nKontrolu uzantnomon/pasvorton
- Nekongrua nodversio - bonvolu plibonigi!
- Nekongrua nodo!\nProvu alian.
- Ne kapablas atingi la nodon!\nProvu alian aŭ reprovu.
-
- Malkonektite
-
- Transakcio malsukcesis: %1$s
-
- Vi atendis tro longe, kara.
-
- Mi daŭre okupiĝas pri via lasta monujo …
-
- Renomi %1$s
-
- Nova pasfrazo por %1$s
- Retajpu pasfrazon por %1$s
- Pasvorto por %1$s
- Vi ankaŭ povas malfermi la monujon per fingropremaĵo.\nBonvolu tûsi la sentilon.
- Malfermante la monujon…
- La fringropremaĵo ne rekoniĝis. Reprovu.
- Malkorekta pasvorto!
- La konservita pasvorto ne korektas.\nBonvolu tajpi la pasvorton.
- La monujo ne ekzistas!
- La nodo devas esti agordita!
- La monujo ne kongruas kun la elektita reto
-
- (nurvida)
-
- Ricevi
- Doni
-
- + %1$s XMR nekonfirmite
-
- monerujo Servo
-
- Sinkronizas:
- Restaj blokoj
- Skanante:
-
- La ekstera memorilo ne skribeblas! Paniko!
- Ni vere bezonas tiujn permesojn je la ekstera memorilo!
- Neniu filmilo = Neniu QR-kodo skaniĝas!
-
- Vida ŝlosilo
- Publika adreso
- Ŝlosilo
- Vida ŝlosilo kopiiĝis en la tondujon!
- Ŝlosilo kopiiĝis en la tondujon!
- La monujadreso kopiiĝis en la tondujon!
- La transakcia ID kopiiĝis en la tondujon!
- Por pli da sekureco, vi ne rajtas kopii tion!
-
- La kurzo ne haveblas!\nUzu XMR/XMR aŭ reprovu
-
- Krei monujon
- Nomo de la monujo
- Pasfrazo de la monujo
- Permesi malfermon de la monujo per fingropremaĵo
- Aŭtentiĝi per fingropremaĵo
-
Per la fringra aŭtentiĝo, vi povos vidi la saldon de la monujo kaj ricevi monon, sen
- entajpi vian pasvorton.
-
Sed por plia sekureco, monerujo petos vin, ke vi retajpu vian pasvorton por vidi
- monujdetalojn aŭ por elspezi.
- Sekureca atentigo
-
Ankoraŭ indas scii, ke iu ajn, posedante vian fingropremaĵon, kapablos eltrovi la
- saldon de via monujo.
-
Iu fiulo povus, ekzemple, gvati vian monujon kiam vi dormas.
- Ĉu vi certas ke vi volas permesi tiun funkcion?
- ]]>
- La pasfrazoj ne kongruas
- La pasfrazo ne estu malplena
- Nun kreu monujon, homo!
- Jes mi skribis la mnemonikan semon sur papero.
-
- Donu nomon al mi!
- La monujo ekzistas!
- La nomo ne komenciĝu per .
- Kreante monujon
- La monujo kreiĝis!
-
- Entajpu nombron aŭ daton (JJJJ-MM-TT)
-
- Ŝlosiloj
- Nova
- Semo
- Nurvida
-
- Publika adreso
- Vida ŝlosilo
- Elspezŝlosilo
- 25-vorta mnemonika semo
- Restaŭralteco aŭ dato (JJJJ-MM-TT)
-
- Publika adreso
- Vida ŝlosilo
- Elspezŝlosilo
- Mnemonika semo
- Pasvorto por restaŭri monujdosierojn
-
- Entajpu validan ŝlosilon
- Entajpu validan adreson
- Entajpu vian 25-vortan semon
-
- Privataj notoj (opcia)
- Generate
- Elspezi miajn dolĉajn monerojn
- Elspezi miajn dolĉajn monerojn (%1$s)
- Tio ne estas QR-kodo
- Tio ne estas kongrua paga QR-kodo
- Tio ne estas valida adreso
- OpenAlias-adreso ne haveblas
- OpenAlias sekuras ✔
- Solvante OpenAlias…
- OpenAlias ne havas DNSSEC - la adreso estas eble uzurpita
- Sendi
- Saldo: %1$s XMR
- Adreso
- Kvanto
- Konfirmi
- Farite
-
- Kvanto
- Kosto (XMR)
- Kosto
- Sumo (XMR)
- Sumo
-
- %1$s XMR
- +%1$s Kosto
-
- Krei transakci-eraron
-
- Kosto %1$s
- (%1$s)
- masukcesis
- - %1$s
- + %1$s
-
- Tempindiko
- TX ID
- TX Ŝlosilo
- Destino
- Paga-ID
- Bloko
- Kvanto
- Kosto
- Transigoj
- Notoj
- (opcia)
- Transakciaj detaloj
-
- OKAZONTE
- MALSUCKESIS
-
- Kvanto
- Priskribo (opcia)
- Ne sukcesis malfermi la monujon!
-
- Maks. %1$s
- Min. 0
- Bv. entajpu nombron
-
- Konfidencaj datumoj ne montriĝu.\nRigardu super via ŝultro!
- Mi sekuras.
- Malantaŭen!
- Detaloj
-
- Jes, faru tion!
- Ne dankon!
-
- Krei novan monujon
- Restaŭri nurvidan monujon
- Restaŭri monujon per privataj ŝlosiloj
- Restaŭri monujon per 25-vorta semo
-
- Krei konton
- Aldonis novan konton #%1$d
- Konto #
-
- Sendi ĉiujn konfirmitajn monsumojn al tiu konto!
- Subadreso
- Publika subadreso #%1$d: %2$s
-
- Lingvo
- Uzi la sistemlingvon
-
- Restaŭri de Ledger Nano
-
- Komunikante kun Ledger
- Konfirmo je la Ledger estas postulita!
- Retrovante subadresojn
- Kontrolante ŝlosilojn
- Matematikumante
- Haketumante
- Bonvolu (re)konekti la Ledger-aparaton
-
- Kreante konton
-
- %1$s kunligita
- %1$s malligita
-
- Skribante etikedon
- Etikedsribo malsukcesis!
- Etikedskribo sukcesis
- Etikedo ne subtenas NDEF!
- La etikedo provizas %1$d bajtojn, sed ni bezonas %2$d!
- Mi ne komprenas la etikedon!
- Damne, kion vi volas?!
- NFC disponeblas!
-
-
- Montru sekretojn!
- Strata moduso
-
-
- Node-o-matiC permesiĝas, frapetu por detaloj.
- Lasta ĝisdatigita bloko: %1$s
- Nodoj
- Nodnomo (Opcia)
- Gastiga nomo
- Pordo
- Uzantnomo (Opcia)
- Pasvorto (Opcia)
- Ne povas solvi gastigon
- Ni bezonas tion!
- Devas esti nombra
- Devas esti 1–65535
- Aldoni nodon
- Tuŝu por aktualigi!
- KONEKTIĜERARO %1$d
- KONEKTIĜERARO
- AUTENTIĜO MALSUKCESIS
- Testrezulto:
- Alteco: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- Testante IP: %1$s …
- Bonvolu atendi ĝis la fino de la skanado
- Tuŝi por elekti aŭ aldoni nodojn
- Aldoni nodojn mane aŭ tiru menuon por skani
- Skanante la reton…
- Aŭtomate memoris la %1$d plej bonajn nodojn
- Testo
-
- Ricevanto
-
- ĈIO!
-
- Convert Ledger Seed
- Ledger Seed Words
- Ledger Passphrase (optional)
- Invalid Ledger Seed!
- Entering your Ledger Seed here is a major security risk!
-
- Restaŭralteco
-
- Start Monero App on %1$s
-
- Rescan!
-
- I get it!
- Next
- I\'m ready!
-
- Welcome to Monerujo!
- This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.
- Keep your seed safe
- The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.
- Send Crypto
- Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.
- Nodes, your way
- Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.
- Send with fingerprint
- You\'re now able to send XMR with just your fingerprint if you enabled it. To request the password, just disable fingerprint access.
-
- Dark Mode
-
- Auto
- Day
- Night
-
- There is nothing here\nPlease create or restore a wallet
-
- Restore default nodes
- Restoring already in progress…
-
- Last Block: %1$d seconds ago
- Last Block: %1$d minutes ago
- Last Block: %1$d hours ago
- Last Block: %1$d days ago
-
- Cannot get quote
- Check amount and try again
-
- Ambiguous address.
- Please select the type above.
- ]]>
-
- Please enter or scan a %1$s address.
- You'll send XMR and the receiver will get %2$s using the SideShift.ai service.
- ]]>
-
- Please enter or scan a Monero address.
- ]]>
-
- Subaddresses
- Subaddress Name
- Too many unused addresses - use some to enable creating more!
- Too many unused accounts - use some to enable creating more!
- Transactions for this subaddress:
- No transactions for this subaddress yet
- Select a subaddress
- Long-press for details
-
- This wallet will be deleted. Your funds will be gone forever unless you have your seed or a working backup to recover it.
- Delete
- Delete failed!
-
- Import wallet
- Import failed!
-
- Reset wallet!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-es/about.xml b/app/src/main/res/values-es/about.xml
deleted file mode 100644
index 531aa40..0000000
--- a/app/src/main/res/values-es/about.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
- Cerrar
- Versión %1$s (%2$d)
-
- Créditos
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo et al.
-
Esta página le informa de nuestras políticas con respecto a la recopilación, uso
- y divulgación de la información personal que recibimos de los usuarios de nuestra app
- (monerujo: Monero Wallet).
-
-
Al usar esta app, acepta la recopilación y uso de información en acuerdo con
- esta política.
-
-
Datos Recopilados
-
Los datos personales son cualquier tipo de dato que podrían identificar a un individuo.
-
-
Las claves y direcciones públicas de Monero son recopiladas y procesadas por la app
- localmente con el propósito de procesar la transacciones y transmitirlas en la red de
- Monero de forma cifrada.
-
-
Otros datos personales no son recopilados por la app.
-
Si utiliza la funcionalidad de cambio (opcional), monerujo obtiene la tasa
- de cambio a través de la API pública de coinmarketcap.com.
- Vea su política de privadad en https://coinmarketcap.com/privacy para conocer más
- detalles acerca de como se recopilan los datos de sus peticiones.
-
Permisos de la App
-
-
INTERNET : Conectar a la red de Monero a través de un Daemon Nodo de Monero
-
READ_EXTERNAL_STORAGE : Leer los ficheros de la cartera almacenados en el dispositivo
-
WRITE_EXTERNAL_STORAGE : Escribir los ficheros de la cartera almacenados en el dispositivo
-
WAKE_LOCK : Mantener el dispositivo despierto durante la sincronización
-
CAMERA : Escanear códigos QR para recibir Monero
-
-
Cambios a esta Política de Privacidad
-
Es posible que actualicemos esta política de privacidad de vez en cuando. Le
- notificaremos de cualquier cambio publicando la nueva política de privacidad en la app
- y en el sitio web (www.monerujo.io)
- Le aconsejamos que revise esta política de privacidad periódicamente para cualquier
- cambio.
-
Esta Política de Privacidad fue actualizada por última vez: 10 de Noviembre de 2017.
-
-
Contáctanos
-
Si tiene cualquier cuestión sobre nuestra política de privacidad,
- o sobre como sus datos están siendo recolectados y procesados,
- por favor escríbanos a privacy@monerujo.io
-
- ]]>
-
\ No newline at end of file
diff --git a/app/src/main/res/values-es/help.xml b/app/src/main/res/values-es/help.xml
deleted file mode 100644
index b816928..0000000
--- a/app/src/main/res/values-es/help.xml
+++ /dev/null
@@ -1,336 +0,0 @@
-
-
- Crear nuevo monedero
-
¡En caso de que necesites una nueva dirección de Monero!
-
Introduce un nombre único para tu monedero y una contraseña.
- La contraseña es utilizada para proteger los datos de tu monedero en el dispositivo.
- Utiliza una contraseña fuerte - incluso mejor si utilizas una frase.
-
¡Anota tu semilla!
-
En la siguiente pantalla encontrarás tu \"Semilla\" de 25 palabras.
- Este es el único dato necesario para recuperar tu cartera en un futuro y obtener acceso
- completo a tus fondos.
- ¡Mantenerla segura y privada es muy importante, ya que permite a quien sea
- acceso completo a tus fondos!
-
Si pierdes la contraseña de tu monedero, todavía puedes recuperar acceso con la
- semilla.
-
No hay forma de recuperar tu semilla, ¡si la pierdes todos tus fondos se
- perderán! La semilla no se puede cambiar nunca, y si es robada o comprometida
- de alguna manera, tendrás que mover todos tus fondos a una nuevo monedero (con una
- nueva semilla). Por tanto, es mejor si haces una copia de tu semilla
- mnemotécnica anotándola y guardándola en múltiples lugares seguros y
- privados.
- ]]>
-
- Restaurar monedero con semilla
-
¡Si ya tienes una dirección de Monero y quieres recuperar sus transacciones desde la
- cadena de bloques!
-
La contraseña es utilizada para proteger los datos de tu monedero en el dispositivo.
- Utiliza una contraseña fuerte - incluso mejor si utilizas una frase.
-
Introduce tu semilla en el campo \"Semilla\".
-
Si conoces el número de bloque de la primera transacción usada en esta dirección,
- introdúcelo en el campo \"Altura de Restauración\" - dejándolo en blanco se escaneará la
- cadana de bloques entera en busca de transacciones que pertenezcan a tu dirección.
- Esto puede llevar bastante tiempo.
- ]]>
-
- Crear monedero con claves
-
¡Si vas a recuperar tu monedero usando tus claves!
-
Introduce un nombre único para tu monedero y una contraseña.
- La contraseña es utilizada para proteger los datos de tu monedero en el dispositivo.
- Utiliza una contraseña fuerte - incluso mejor si utilizas una frase.
-
Ingresa tu dirección de Monero en el campo \"Dirección Pública\" y completa
- \"Clave de Vista\" y \"Clave de Gasto\".
-
Si conoces el número de bloque de la primera transacción usada en esta dirección,
- introdúcelo en el campo \"Altura de Restauración\" - dejándolo en blanco se escaneará la
- cadena de bloques entera en busca de transacciones que pertenezcan a tu dirección.
- Esto puede llevar bastante tiempo.
- ]]>
-
- Crear monedero de sólo vista
-
¡En caso de que solamente quieras monitorizar las transacciones entrantes de una dirección!
-
Introduce un nombre único para tu monedero y una contraseña.
- La contraseña es utilizada para proteger los datos de tu monedero en el dispositivo.
- Utiliza una contraseña fuerte - incluso mejor si utilizas una frase.
-
Ingresa tu dirección de Monero en el campo \"Dirección Pública\" y completa
- \"Clave de Vista\".
-
Si conoces el número de bloque de la primera transacción usada en esta dirección,
- introdúcelo en el campo \"Altura de Restauración\" - dejándolo en blanco se escaneará la
- cadena de bloques entera en busca de transacciones que pertenezcan a tu dirección.
- Esto puede llevar bastante tiempo.
- ]]>
-
- Detalles del monedero
-
Dirección pública
- Tu dirección pública es como el número de tu cuenta bancaria que puedes compartir con
- cualquiera sin miedo a perder tus fondos. La gente enviará moneroj a tu monedero usando esta
- dirección.
-
Semilla
- Este es el único dato necesario para recuperar tu cartera en un futuro y obtener acceso
- completo a tus fondos.
- ¡Mantenerla segura y privada es muy importante, ya que permite a quien sea
- acceso completo a tus fondos! Si no la anotaste en un lugar seguro aún, ¡por favor hazlo!
-
Wallet Files Recovery Password
- Asegúrate de escribir esta contraseña. Si restablececes tu dispositivo o desinstalas esta
- aplicación, vas a necesitarla para acceder a tu monedero otra vez.
-
CrAzYpass
- Si la contraseña que se muestra consiste de 52 caracteres alfanuméricos en grupos de 4…
- ¡felicitaciones!
- Los archivos de tu monedero están asegurado con una clave de 256 bits, generada por tu
- propio dispositivo basándose en la contraseña que elegiste (al crear el monedero o luego
- cambiándola manualmente). ¡Esto hace a tus archivos extremadamente difíciles de hackear!
- Esta opción es obligatoria en todos los monederos nuevos.
-
Contraseña Antigua
- Si ves tu contraseña aquí, los archivos de tu billetera no están tan seguros que cuando
- se usa una CrAzYpass. Para solucionar esto, simplemente elige \"Cambiar Contraseña\" en el
- menú. Después de ingresar una nueva contraseña (aún si eliges la misma que antes) la
- aplicación generará una CrAzYpass y asegurará los archivos de tu monedero con ella.
- ¡Por favor anótala bien!
-
Monederos CrAzYpass
- Si alguna vez necesitas reinstalar Monerujo (por ejemplo luego de restaurar tu teléfono
- o cambiar a uno nuevo) o si necesitas abrir los archivos de tu monedero en otro dispositivo
- o en una PC, vas a tener que usar esta Contraseña de Recuperación (CrAzYpass) para poder
- acceder a tu monedero otra vez.
- Seleccionando \"Cambiar Contraseña\" en el menú, pueder elegir otra contraseña.
- Ten presente que esto generará una nueva Contraseña de Recuperación (CrAzYpass). ¡Anótala bien!
-
Clave de vista
- Tu clave de vista puede usarse para monitorizar las transacciones entrantes de tu
- monedero sin otorgar permiso para gastar los fondos guardados en ella.
-
Clave de gasto
- Tu clave de gasto permite a quien sea gastar los moneroj asociados a tu cartera, de modo
- que no digas a nadie esta clave, guárdala tan segura como tu semilla mnemotécnica.
- ]]>
-
- Lista de monederos
-
Nodo
-
Monerujo utiliza un nodo remoto para comunicarse con la red de Monero sin tener que
- descargar y almacenar una copia completa de la cadena de bloques. Puedes encontrar una lista
- de nodos remotos populares o aprender como montar tu propio nodo remoto aquí https://moneroworld.com
-
Monerujo viene con un nodo remoto ya preconfigurado. También recuerda los últimos cinco
- nodos utilizados.
-
Monederos
-
Aquí puedes ver tus monederos. Están ubicados en el directorio monerujo del
- almacenamiento interno de tu dispositivo. Puedes utilizar un explorador de archivos
- para verlos. Deberías hacer copias de seguridad de este directorio de forma regular en
- almacenamientos fuera del dispositivo por si tu dispositivo explota o es robado.
- De esta manera mantienes todas tus notas asociadas a transacciones.
-
Selecciona un monedero para abrirlo o pulsa en \"+\" para crear uno nuevo.
- También puedes seleccionar otras acciones:
-
Detalles
-
Muestra los detalles del monedero, su semilla y sus claves.
-
Recibir
-
Crea un código QR para recibir moneroj.
-
Renombrar
-
Permite cambiar el nombre de tu monedero. La copia de seguridad no será renombrada.
-
Copia de seguridad
-
Crea una copia de tu monedero en el directorio backups que se encuentra dentro
- de monerujo sobreescribiendo cualquier copia previa existente.
-
Archivar
-
Crea una copia de seguridad y borra la cartera inmediatamente después. La copia
- permanecerá en el directorio backups. Si no necesitas más tus copias de seguridad
- deberás borrarlas con un explorador de archivos o una aplicacin de borrado seguro.
- ]]>
-
- Detalles de la transacción
-
Destinatario
- Esta es la dirección pública del monedero al que has enviado moneroj
-
ID de Pago
- Al ser Monero ofuscado por naturaleza, puedes usar un ID de Pago para identificar un envío de Monero entre
- dos partes. Esto es completamente opcional y privado. Por ejemplo, esto permitiría que un
- negocio pueda asociar inequívocamente tu transacción con un producto que has comprado.
-
ID de Transacción
- Este es un identificador de tu transacción que puede ser utilizado para ubicar tu transacción
- ofuscada en la cadena de bloques de Monero usando un explorador como https://xmrchain.net/
-
Clave de transacción
- Esta es la clave privada de tu transacción, mantenla segura ya que revelarla a un tercero
- desvela que firma en un anillo de transacciones es la tuya, por tanto haciendo tus transacciones transparentes.
-
Bloque
- Este es el bloque de la cadena de Monero en el que tu transacción fue incluída.
- ]]>
-
- Enviar
-
Dirección del receptor
-
Esta es la dirección pública del monedero al que vas a enviar moneroj. Puedes copiarla
- desde tu portapapeles, escanear un código QR o introducirla manualmente. Asegúrate de
- comprobarla varias veces para confirmar que no estás enviando moneroj a la dirección equivocada.
-
In addition to using an XMR address, you can also use
-
-
an OpenAlias for XMR or BTC
-
a BTC address
-
- Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai
- for details). See the section on sending BTC below.
-
Enviar BTC
-
SideShift.ai
-
SideShift.ai es un servicio de terceros que actúa como casa de cambio de Monero a Bitcoin.
- Usamos la API de SideShift.ai para integrar pagos de Bitcoin dentro de Monerujo. Por favor revisa
- https://sideshift.ai y decide por ti mismo si es un servicio que quieres usar. El equipo de Monerujo
- no está asociado con SideShift.ai y no puede ayudarte con su servicio.
-
Tipo de cambio SideShift.ai
-
En la pantalla de \"Monto\" se te mostrará las condiciones actuales del servicio SideShift.ai.
- Estas incluyen el tipo de cambio del momento así como también los límites mínimo y máximo de BTC.
- Toma nota de que el tipo de cambio aún no está garantizado en esa instancia.
-
Orden SideShift.ai
-
En la pantalla \"Confirmar\" verás la orden SideShift.ai final. Esta orden es válida por un
- tiempo limitado - notarás una cuenta atrás en el botón de \"Gastar\". El tipo de cambio a
- esta altura puede ser distinto al aproximado que era mostrado en pantallas anteriores.
-
Clave secreta SideShift.ai
-
Dado que Monerujo sólo administra la parte en Monero de tu transacción, puedes usar tu
- clave secreta SideShift.ai para rastrear la parte en Bitcoin de tu orden en la página de SideShift.ai.
-
Cuenta atrás SideShift.ai!
-
Una vez que la cuenta atrás alcanza el cero, necesitarás pedir una nueva cotización de
- parte de SideShift.ai, esto se logra dando un paso atrás y luego volviendo a la pantalla de
- \"Confirmar\".
- ]]>
-
- Enviar BTC
-
SideShift.ai
-
SideShift.ai es un servicio de terceros que actúa como casa de cambio de Monero a Bitcoin.
- Usamos la API de SideShift.ai para integrar pagos de Bitcoin dentro de Monerujo. Por favor revisa
- https://sideshift.ai y decide por ti mismo si es un servicio que quieres usar. El equipo de Monerujo
- no está asociado con SideShift.ai y no puede ayudarte con su servicio.
-
Tipo de cambio SideShift.ai
-
En la pantalla de \"Monto\" se te mostrará las condiciones actuales del servicio SideShift.ai.
- Estas incluyen el tipo de cambio del momento así como también los límites mínimo y máximo de BTC.
- Toma nota de que el tipo de cambio aún no está garantizado en esa instancia.
-
Orden SideShift.ai
-
En la pantalla \"Confirmar\" verás la orden SideShift.ai final. Esta orden es válida por un
- tiempo limitado - notarás una cuenta atrás en el botón de \"Gastar\". El tipo de cambio a
- esta altura puede ser distinto al aproximado que era mostrado en pantallas anteriores.
-
Clave secreta SideShift.ai
-
Dado que Monerujo sólo administra la parte en Monero de tu transacción, puedes usar tu
- clave secreta SideShift.ai para rastrear la parte en Bitcoin de tu orden en la página de SideShift.ai.
-
Cuenta atrás SideShift.ai!
-
Una vez que la cuenta atrás alcanza el cero, necesitarás pedir una nueva cotización de
- parte de SideShift.ai, esto se logra dando un paso atrás y luego volviendo a la pantalla de
- \"Confirmar\".
- ]]>
-
- Crear Monedero - Ledger
-
Deseas recuperar tu monedero desde tu dispositivo Ledger Nano S.
-
Tus claves secretas nunca dejan el dispositivo Ledger, así que lo necesitas conectado cada
- vez que deseas acceder a tu monedero.
-
Ingresa un nombre de monedero y contraseña únicos. La contraseña es usada para asegurar tu información del monedero en el dispositivo
- Android. Usa una contraseña fuerte - o mejor aún, usa una frase de contraseña.
-
Ingresa el número del bloque de la primera transacción usada para esta dirección en el
- campo \"Altura de restaurado\". También puedes usar una fecha en formato AAAA-MM-DD. Si no estás seguro,
- ingresa una fecha o altura del bloque aproximada anterior a la primera vez que usaste esta dirección del monedero.
- ]]>
-
- El monedero
-
Modo Público
-
El Modo Público puede ser habilitado/deshabilitado en el menú o en el icono de Gunther\'s. En este modo, tu
- balance no se muestra en ninguna pantalla para que puedas usar de manera segura tu monedero en la calle, un pub u
- otro lugar público. Transacciones anteriores también se ocultan. Nuevas transacciones serán mostradas, para
- que puedas ver que has enviado/recibido Moneroj.
-
Escaneado
- Como a Monero le gusta mantener las cosas privadas, cada vez que abres una cartera de
- Monerujo es necesario escanear la cadena de bloques para ver si nuevos moneroj han sido
- enviados a tu dirección. Esto solo almacena en tu teléfono las transacciones que pertenecen a tu
- monedero. Esto puede llevar un rato si hace tiempo que no sincronizas.
-
Saldo
-
¡Ayuda! ¡El saldo de mi monedero ha desaparecido o aparece sin confirmar!
- ¡No entres en pánico! Cuando envias fondos a tu monedero, parte de tu saldo se mostrará
- temporalmente como sin confirmar.
- Esto es debido a como funcionan las transacciones y su cambio en Monero. Todo está bien.
- Puedes leer más al respecto en https://getmonero.org/resources/moneropedia/change.html
-
Lista de transacciones
-
Es una lista con las transacciones del monedero. Ten en cuenta que en monederos de solo vista, únicamente se
- mostrarán las transacciones entrantes y no las salientes, por lo tanto la suma no es indicativa de los fondos disponibles.
- ]]>
-
- Nodos
-
TL;DR
-
Refresca la lista de nodos al mostrar los marcadores de nodos para permitir a Monerujo
- elegir el mejor para ti.
-
¿Qué es un Nodo?h2>
-
Monerujo usa un Nodo Remoto (algunas veces también llamado Daemon) para comunicarse con
- la red de Monero sin tener que descargar y almacenar una copia de la
- cadena de bloques completa.
-
Lista de Nodos
-
Si la lista está vacía, puedes agregar nuevos nodos manualmente o dejar que Monerujo
- escanee la red por ti. O ambos.
-
La lista de nodos muestra todos los nodos actualmente conocidos. Adicionalmente, la marca de tiempo
- del último bloque conocido para cada nodo se muestra bajo el nombre del nodo. Un icono
- representando el comportamiento de respuesta del nodo
- (el cual indica el nivel de conectividad esperado)
- es mostrado seguido de cada nodo.
-
Cualquier nodo en la lista puede ser marcado para un posterior uso.
- Nodos que no sean marcados serán olvidados.
-
Monerujo elegirá el nodo marcado óptimo cada vez que lo uses.
- Esto lo hace revisando la altura del bloque (¿qué tan al día
- está el nodo?) así como el comportamiento de respuesta (¿qué tan rápido responde el nodo a solicitudes?).
-
La lista se ordena por estas características, por lo tanto el primer nodo en la lista sería el que Monerujo
- elegiría en ese momento. El final de la lista mostraría nodos muy lentos o no disponibles.
-
Agregar un Nodo
-
Presionando en el botón "Agregar Nodo" en la parte inferior, se te pedirá que
- ingreses los detalles del nodo en el siguiente cuadro de diálogo.
- La "Dirección" es el nombre del host o dirección IP del nodo - esta es la única
- entrada obligatoria.
- Ingresa el "Puerto" si el nodo se ejecuta en un puerto que no es por defecto (e.g. 18089).
- Puedes también nombrar el nodo opcionalmente, para que puedas identificarlo después fácilmente.
- Algunos nodos requieren credenciales para usarlos. Ingresa el nombre de usuario provisto &
- contraseña en los campos apropiados. Ahora puedes "Verificar" estos ajustes.
- Los "Resultados de la Prueba" mostrarán la altura del bloque, tiempo de respuesta y dirección IP real usados.
- El resultado puede ser también un error - usualmente porque el nombre de host provisto no
- es alcanzable en una sensible cantidad de tiempo o las credenciales son incorrectas.
- O la combinación nombre de host/puerto no indican a un nodo de Monero real.
- Una vez que la prueba sea exitosa (sin error) - estás listo para presionar "OK" para guardar &
- como marcador este nodo.
-
Escanear por Nodos
-
Adicionalmente, puedes escanear la red por nodos. Monerujo empezará
- escaneando la red por Nodos Remotos con puerto 18089. Comienza preguntando tus
- nodos marcados por otros compañeros en la red P2P de Monero y después continúa
- preguntando por nodos a ellos por sus compañeros, y así. Si no tienes nodos marcados
- (o no nos comunican sobre sus compañeros),
- Monerujo irá directo a los nodos semilla de Monero codificados en Monero. El
- escaneo parará cuando encuentre 10 nodos remotos en total.
- ]]>
-
-
-
- Usando un vínculo de pago
-
Acabas de iniciar Monerujo con un vínculo de pago. Para poder enviar fondos, por favor haz lo siguiente:
-
- 1. Abre el monedero desde el cual quieras gastar
- 2. Espera hasta que esté sincronizado y el botón de "Enviar" aparezca
- 3. Presiona el botón de "Enviar"
-
-
Los detalles del pago ya estarán completos. Revísalos y prosigue como con cualquier otra transacción.
- ]]>
-
- ¡Entendido!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
deleted file mode 100644
index c9f51fb..0000000
--- a/app/src/main/res/values-es/strings.xml
+++ /dev/null
@@ -1,443 +0,0 @@
-
-
- Monedero
-
- Acerca De
- Política de Privacidad
-
- Compartir
- Ayuda
- Recibir
- Renombrar
- Copia de seguridad
- Cambiar contraseña
-
- Sigue escribiendo …
- Mas o menos.
- Puedes hacerlo mejor.
- Casi …
- ¡Bien ahí, hacker nivel 4!
-
- Monederos
- Créditos
- Aceptar
- Cancelar
- Cerrar
- Información más detallada
-
- ¡Éxito!
- Hecho
-
- Toca para mostrar código QR
-
- ✔ ID de pago integrado
- Preparando tu transacción
-
- ¡ID de transacción copiado al portapapeles!
-
- ID de Transacción
- Dirección de Destino
- Notas
-
- Copia de seguridad en progreso
- Archivado en progreso
- Cambio de nombre en progreso
- Cambiando contraseña en progreso
-
- Guardando todo\n¡Puede llevar un tiempo!
-
- Copia de seguridad exitosa
- ¡Copia de seguridad fallida!
- ¡Cambio de nombre fallido!
- ¡Cambio de contraseña fallido!
- Contraseña cambiada
-
- Nodo
- Cargando monedero…
- Monedero guardado
- ¡Guardado de monedero fallido!
- Conectando…
- ¡Conexión con el nodo fallida!\nComprueba el usuario/contraseña
- ¡Nodo inválido!\nInténtalo con otro.
- ¡No se puede alcanzar el nodo!\nInténtalo de nuevo o prueba otro.
-
- Desconectado
-
- Transacción fallida: %1$s
-
- Todavía estoy ocupado con tu último monedero …
-
- Renombrar %1$s
-
- Nueva contraseña para %1$s
- Repetir contraseña para %1$s
- Contraseña para %1$s
- Puedes poner tu dedo en el sensor para autorizar con tu huella.
- Abriendo el monedero…
- Huella no reconocida. Inténtalo nuevamente.
- ¡Contraseña incorrecta!
- La contraseña guardada es incorrecta.\nIngrésala manualmente.
- ¡El monedero no existe!
- ¡La dirección del daemon debe estar configurada!
- El monedero no coincide con la red seleccionada
-
- (Sólo Vista)
-
- Recibir
- Enviar
-
- + %1$s XMR sin confirmar
-
- Servicio de Monerujo
-
- Sincronizado:
- bloques restantes
- Escaneando:
-
- ¡No se puede escribir en el almacenamiento externo! ¡Pánico!
- ¡De verdad necesitamos ese permiso para el almacenamiento externo!
- Sin cámara = ¡Sin escaneo de QR!
-
- Clave de Vista
- Dirección Pública
- ¡Clave de vista copiada al portapapeles!
- ¡Dirección del monedero copiada al portapapeles!
- ¡Copia desactivada por motivos de seguridad!
-
- ¡No se ha podido obtener la tasa de cambio!\nUsa XMR/XMR o inténtalo de nuevo
-
- Crear monedero
- Nombre del monedero
- Frase de contraseña
- Permitir abrir usando huella dactilar
- Autenticación por huella
-
Con la autenticación por huella dactilar activada, puedes acceder al balance y recibir fondos
- sin la necesidad de ingresar tu contraseña.
-
Sin embargo, por seguridad extra, Monerujo va a requerir tu contraseña para ver la información
- sensible de tu monedero o enviar fondos.
- Advertencia de seguridad
-
Si bien es cómodo, recuerda que cualquier persona que tenga acceso a tu huella dactilar
- va a ser capaz de mirar el balance de tu monedero.
-
Por ejemplo, un actor malicioso cercano podría abrir tu monedero con tu dedo mientras duermes.
- ¿Estás seguro de activar esta función?
- ]]>
- Contraseñas no coinciden
- Contraseña no puede estar vacía
- ¡Házme ya un monedero!
- ¡Ya anote todo!
-
- ¡Dame un nombre!
- ¡El monedero ya existe!
- No puede empezar con .
- Creando monedero
- Monedero creada
-
- Introduce un número o una fecha (AAAA-MM-DD)
-
- Claves
- Nuevo
- Semilla
- Ver
-
- Dirección Pública
- Clave de Vista
- Clave de Gasto
- Semilla Mnemotécnica de 25 Palabras
- Altura o Fecha (YYYY-MM-DD) de Restauración
-
- Dirección Pública
- Clave de Vista
- Clave de Gasto
- Semilla Mnemotécnica
- Contraseña de restauración para el archivo del monedero
-
- Introduce una clave válida
- Introduce una dirección válida
- Introduce tu semilla de 25 palabras
-
- Notas Privadas (opcional)
- Generar
- No es un Código QR de monero
- Dirección de Monero inválida
- Enviar
- Fondos disponibles: %1$s XMR
- Dirección
- Monto
- Aprobar
- Hecho
-
- Monto
- Comisión
- Total
-
- Error creando la transacción
-
- Comisión %1$s
- (%1$s)
- fallido
- - %1$s
- + %1$s
-
- Marca de tiempo
- ID de Transacción
- Clave de Transacción
- Destino
- ID de Pago
- Bloque
- Monto
- Comisión
- Transferencias
- Notas
- (opcional)
- Detalles de la Transacción
-
- PENDIENTE
- FALLIDO
-
- Monto
- ¡No se ha podido abrir el monedero!
-
- Max. %1$s
- Min. 0
- XMR no es un número
-
- Se va a mostrar información delicada.\n¡Mira por encima del hombro!
- Estoy seguro
- ¡Llévame de vuelta!
- Detalles
-
- Este monedero será borrado. Tus fondos se irán para siempre a menos que tengas tu semilla o una copia de seguridad funcional para recuperarlo.
- ¡Sí, hazlo!
- ¡No, gracias!
-
- Crear nuevo monedero
- Restaurar monedero de sólo vista
- Restaurar monedero con claves privadas
- Restaurar monedero con semilla de 25 palabras
- Ingresaste una dirección %1$s
- Vas a enviar XMR y el destinatario recibirá %1$s usando el servicio SideShift.ai.
- ]]>
- %1$s %2$s
- Confirmación pendiente
- Pago pendiente
- Error de SideShift.ai (%1$s)
- %1$s Enviados!
- Consultando …
- Puedes enviar %1$s — %2$s %4$s.
- SideShift.ai está ofreciendo una tasa de cambio de %3$s %4$s/XMRen este momento.
- ]]>
- Saldo: %2$s %3$s (%1$s XMR)
- Creando orden SideShift.ai
- Consultando orden SideShift.ai
- Preparando transacción Monero
- Consultando parámetros SideShift.ai
- ERROR SideShift.ai
- Código: %1$d
- Toca para reintentar
- Parece que estamos atascados!
- Oh-oh, parece que SideShift.ai no está disponible ahora!
- %1$s %3$s = %2$s XMR
- (Cambio: %1$s %2$s/XMR)
- Visita https://sideshift.ai para soporte y rastreo
- Clave secreta\nSideShift.ai
- Clave secreta SideShift.ai
- Dirección %1$s destino
- Monto
- Oye, tardaste demasiado!
- Clave
- ¡Clave copiada al portapapeles!
- Enviar mis preciados moneroj
- Gastar mis preciados moneroj (%1$s)
- No es una dirección válida
- Comisión (XMR)
- Total (XMR)
- %1$s XMR
- +%1$s Comisión
- Soy Monerujo
- Orden SideShift.ai
-
- Pago en BTC activado, toca para más info.
- Ledger activado, toca para más info.
-
- Crear Cuenta
- Nueva cuenta agregada #%1$d
- # de cuenta
-
- ¡Enviar todos los fondos confirmados en esta cuenta!
- Subdirección
- Subdirecciones Públicas #%1$d: %2$s
-
- Lenguaje
- Usar Idioma del Sistema
-
- Restaurar desde Ledger Nano
-
- Comunicándose con Ledger
- ¡Confirmación en Ledger requerida!
- Recuperando subdirecciones
- Verificando claves
- Realizando cálculos alocados
- Cosas de hash
- Por favor (re)conecta el dispositivo Ledger
-
- Creando cuenta
-
- %1$s adjunto
- %1$s separado
-
- Escribiento Etiqueta
- ¡Escritura de Etiqueta fallida!
- Escritura de Etiqueta exitosa
- ¡Etiqueta no soporta NDEF!
- La etiqueta provee %1$d bytes, pero necesitamos %2$d!
- ¡No comprendo la etiqueta!
- ¡No sé lo que pides!
- ¡NFC disponible!
-
- Descripción (opcional)
-
- Dirección OpenAlias no disponible
- OpenAlias asegurado ✔
- Resolviendo OpenAlias…
- OpenAlias sin DNSSEC - la drección puede ser falsificada
-
- Versión de nodo incompatible - ¡por favor actualiza!
-
- Detalles
-
- Modo Público
-
- Nodo-o-matiC habilitado, toque para más información.
- Último bloque actualizado: %1$s
- Nodos
- Nombre del Nodo (Opcional)
- Nombre del Host
- Puerto
- Usuario (Opcional)
- Contraseña (Opcional)
- No se puede resolver el host
- ¡Necesitamos esto!
- Debe ser numérico
- Debe ser 1–65535
- Agregar Nodo
- ¡Toca para refrescar!
- ERROR DE CONECCIÓN %1$d
- ERROR DE CONECCIÓN
- AUTENTIFICACIÓN FALLIDA
- Resultados de la prueba:
- Altura: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- Probando el IP: %1$s …
- Por favor espera a que termine el escaneo
- Toca para seleccionar o agregar nodos
- Agrega nodos manualmente o tira para buscar
- Escaneando la red…
- Mejores %1$d nodos marcados automáticamente
- Probar
-
-
- Receptor
-
- TODO!
-
- Convertir semilla de Ledger
- Palabras de la semilla de Ledger
- Contraseña de Ledger (opcional)
- ¡Semilla de Ledger inválida!
- ¡Ingresar tu semilla de Ledger aquí implica un riesgo importante!
-
- Altura de Restauración
-
- Arrancar aplicación de Monero en %1$s
-
- ¡Re-escanear!
-
- ¡Entendido!
- Siguiente
- ¡Estoy listo!
-
- ¡Bienvenido a Monerujo!
- Esta aplicación te permite crear y usar monederos de Monero. Puedes guardar tus dulces moneroj en ellos.
- Mantén segura tu semilla
- La semilla otorga acceso total a quien la posee. Si la pierdes, nadie puede ayudarte a recuperarla y perderás tus preciados moneroj.
- Enviar Criptos
- Monerujo tiene SideShift.ai incorporado. Simplemente pega o escanea una dirección de BTC, LTC, ETH, DASH o DOGE y podrás enviar esas monedas usando tu XMR.
- Nodos, a tu manera
- Los nodos son tu conexión con la red de Monero. Elige entre usar nodos públicos, o ir totalmente ciberpunk conectándote al tuyo propio.
- Enviar con tu huella
- Ahora puedes enviar XMR con sólo tu huella dactilar si lo deseas. Para forzar el pedido de contraseña, simplemente desactiva la opción de huella.
-
- Tema
-
- Automático
- Claro
- Oscuro
-
- No hay nada aquí.\nPor favor crea o restaura un monedero.
-
- Restaurar los nodos por defecto
- Restauración ya en proceso…
-
- Último bloque hace %1$d segundos
- Último bloque hace %1$d minutos
- Último bloque hace %1$d horas
- Último bloque hace %1$d días
-
- No pudo obtenerse una cotización
- Revisa el monto y trata nuevamente
-
- Dirección ambigua.
- Por favor selecciona la moneda deseada.
- ]]>
-
- Por favor ingresa o escanea una dirección %1$s.
- Vas a enviar XMR y el receptor obtendrá %2$s a través de SideShift.ai
- ]]>
-
- Por favor ingresa o escanea una dirección de Monero.
- ]]>
-
- Subdirecciones
- Nombre de la subdirección
- Demasiadas direcciones sin usar. ¡Usa alguna antes de crear más!
- Demasiadas cuentas sin usar. ¡Usa alguna antes de crear más!
- Transacciones recibidas en esta subdirección:
- Aún no hay transacciones recibidas en esta subdirección.
- Elige una subdirección
- Presiona largo para ver detalles
-
- Delete
- Delete failed!
-
- Import wallet
- Import failed!
-
- Reset wallet!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-et/about.xml b/app/src/main/res/values-et/about.xml
deleted file mode 100644
index 78de89e..0000000
--- a/app/src/main/res/values-et/about.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
- Sulge
- Ma olen monerujo
- Versioon %1$s (%2$d)
-
- Autorid
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo, ErCiccione jt
-
See leht informeerib sind personaalsete andmete kogumise, kasutamise ja
- avaldamise osas, mida saame meie äpi (monerujo: Monero Wallet) kasutajatelt.
-
-
Äppi kasutades nõustute teabe kogumise ja kasutamisega vastavalt sellele
- poliitikale.
-
-
Kogutud andmed
-
Isikuandmed on igasugused andmed, mis võivad isikut tuvastada.
-
-
Monero võtmeid ja avalikke aadresse kogutakse ja töödeldakse äpisiseselt
- tehingute töötlemiseks ja edastatakse Monero võrku krüptitud kujul.
-
-
Rakendus ei kogu muid isikuandmeid.
-
Kui kasutate vahetusfunktsiooni, kasutab monerujo selleks coinmarketcap.com\'i
- avaliku API funktsiooni. Vaadake nende privaatsuspoliitikat aadressil
- https://coinmarketcap.com/privacy, et saada üksikasju, kuidas teie päringute kohta
- andmeid kogutakse.
-
Kui kasutate äppi BTC-aadressitele raha saatmiseks, siis kasutatakse selleks
- SideShift.ai teenust. Lisateabe saamiseks vaadake nende privaatsuspoliitikat aadressil
- https://sideshift.ai/. Monerujo saadab neile BTC sihtkoha aadressi ja summa. Koguda
- võidakse ka teie IP aadressi.
-
Äpi õigused
-
-
INTERNET : Monero võrguga ühenduse loomine Monero Daemoni sõlmpunkti kaudu
WAKE_LOCK : Sünkroonimise ajal hoiab seadme ärkvel
-
CAMERA : QR-koodi lugemine Monero saamiseks
-
-
Privaatsuspoliitika muudatused
-
Me võime aeg-ajalt seda privaatsuspoliitikat uuendada. Teatame teile kõigist
- muudatustest, avaldades uued privaatsuseeskirjad äpis ja veebis (www.monerujo.io)
- Soovitame teil seda privaatsuspoliitikat perioodiliselt üle vaadata juhuks,
- kui vahepeal on toimunud muutusi.
-
-
Seda privaatsuspoliitikat uuendati viimati: 10. november, 2017.
-
-
Võta meiega ühendust
-
Kui teil on mingeid küsimusi meie privaatsuseeskirjade kohta või kuidas teie
- andmeid kogutakse ja töödeldakse, siis palume saata e-post aadressile
- privacy@monerujo.io.
-
- ]]>
-
diff --git a/app/src/main/res/values-et/help.xml b/app/src/main/res/values-et/help.xml
deleted file mode 100644
index cf7e47a..0000000
--- a/app/src/main/res/values-et/help.xml
+++ /dev/null
@@ -1,316 +0,0 @@
-
-
- Loo rahakott - uus
-
If you need a new Monero Address!
-
Enter a unique wallet name and password.
- The password is used for securing your wallet data on the device. Use a strong password -
- even better use a passphrase.
-
Note your Mnemonic Seed!
-
On the following screen you will find your 25-word \"Mnemonic Seed\".
- This is the only data needed to recover your wallet at a later point
- and gain full access to your funds.
- Keeping this secure and private is very important, as it gives anyone
- full access to your funds!
-
If you lose your wallet password, you can still recover your wallet with the Mnemonic Seed.
-
There is no way to recover your Mnemonic Seed, if you lose it all your funds will be lost!
- The Mnemonic Seed can also never be changed, and if it is stolen or otherwise compromised,
- you will have to move your funds to new wallet (with a new Mnemonic Seed). Therefore, it is best
- that you backup your Mnemonic Seed by writing it down and storing it in multiple safe
- and secure places.
- ]]>
-
- Loo rahakott - seemnest
-
If you already have a Monero Address and want to recover the transactions from the blockchain!
-
Enter a unique wallet name and password. The password is used for securing your wallet data on the device.
- Use a strong password - even better use a passphrase.
-
Enter your Seed in the field \"Mnemonic Seed\".
-
Enter the block number of the first transaction used for this address in the
- field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
- enter an approximate date/blockheight before you first used this wallet address.
- ]]>
-
- Loo rahakott - Ledger
-
You want to recover your wallet from your Ledger Nano S device.
-
Your secret keys never leave the Ledger device, so you need it plugged in every
- time you want to access your wallet.
-
Enter a unique wallet name and password. The password is used for securing your wallet data on the Android
- device. Use a strong password - even better use a passphrase.
-
Enter the block number of the first transaction used for this address in the
- field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
- enter an approximate date/blockheight before you first used this wallet address.
- ]]>
-
- Loo rahakott - võtmetest
-
If you are recovering your wallet using your keys!
-
Enter a unique wallet name and password. The password is used for securing your wallet data on the device.
- Use a strong password - even better use a passphrase.
-
Enter your Monero Address in the field \"Public Address\" and fill out \"View Key\" and \"Spend Key\".
-
Enter the block number of the first transaction used for this address in the
- field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
- enter an approximate date/blockheight before you first used this wallet address.
- ]]>
-
- Loo rahakott - vaatamiseks
-
If you just want to monitor incoming transactions to a wallet!
-
Enter a unique wallet name and password. The password is used for securing your wallet data on the device.
- Use a strong password - even better use a passphrase.
-
Enter your Monero Address in the field \"Public Address\" and fill out the \"View Key\".
-
Enter the block number of the first transaction used for this address in the
- field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
- enter an approximate date/blockheight before you first used this wallet address.
- ]]>
-
- Rahakoti info
-
Avalik aadress
- Your public address is like your bank account number you can share this with anyone without
- having to fear losing your Monero. People will send Monero to your wallet using this address.
-
Mnemooniline seeme
- This is the only data needed to recover your wallet at a later point and gain full access to
- your funds. Keeping this private and secure is very important, as it gives anyone full
- access to your Monero! If you haven’t written this down somewhere safe please do!
-
Rahakoti failide taastamise parool
- Make sure you write this password down. If you reset your device or uninstall the app, you
- will need it to access your wallet again.
-
CrAzYpass
- If the password displayed here is 52 alphanumeric characters in groups of 4 - congratulations!
- Your wallet files are secured with a 256-bit key generated by your device's security
- features based on the passphrase you chose (on creation or by changing it). This makes it
- extremely difficult to hack!
- This feature is mandatory for all newly created wallets.
-
Vananenud parool
- If you see your passphrase here, your wallet files are not as secure as when using
- a CrAzYpass. To fix this, simply select \"Change Passphrase\" from the menu. After entering
- a new passphrase (maybe even the same one as before) the app will generate a CrAzYpass for
- you and secure your wallet files with it. Write it down!
-
CrAzYpass rahakotid
- If you ever need to reinstall Monerujo (for example after resetting your phone or switching
- to a new one) or you want to use your wallet files on a different device or PC, you have to
- use this Recovery Password in order to access your wallet again.
- By selecting \"Change Passphrase\" from the menu, you can choose another passphrase. Beware
- that this will generate a new Recovery Password. Write it down!
-
Vaatamise võti
- Your view key can be used to monitor incoming transactions to your wallet without giving
- permission to spend the funds inside your wallet.
-
Kulutamise võti
- Your spend key allows anyone to spend the Monero associated with your wallet, so don’t tell
- anyone this key, keep it safe like your Mnemonic Seed.
- ]]>
-
- Rahakottide nimekiri
-
Server
-
Monerujo uses a Remote Node to communicate with the Monero Network without having
- to download and store a copy of the whole blockchain itself. You can find a list of popular
- remote nodes or learn how to run your own remote node here https://moneroworld.com/
-
Monerujo comes with some Remote Nodes preset. It remembers the last five nodes used.
-
Rahakotid
-
Here you see your wallets. They are located in the monerujo folder
- in the internal storage of your device. You can use a file explorer app to see them.
- You should make backups of this folder on a regular basis to off-device storage in
- case your device explodes or gets stolen.
-
Select a wallet to open it or press the \"+\" to create a new one.
- Or select one of the wallet operations:
-
Info
-
Show the wallet details, seed & keys.
-
Küsi raha
-
Make a QR code for receiving Moneroj.
-
Nimeta ümber
-
Rename the wallet. Backups are not renamed.
-
Tagavarakoopia
-
Make a copy of the wallet in the backups folder inside the monerujo
- overwriting previous copies there.
-
Arhiveeri
-
Make a backup and delete the wallet afterwards. The copy remains in the backups
- folder. If you no longer need your backups you should delete them with a file explorer or
- secure delete app.
- ]]>
-
- Ülekannete info
-
Sihtkoht
- This is the public address of the wallet you sent Monero to
-
Makse ID
- You can use a Payment ID to identify the reason you sent Monero between two parties this is
- fully optional and private. For example it can allow a Business to reconcile your transaction
- with an item you bought.
-
Ülekande ID (TX ID)
- This is your Transaction ID you can use it to identify your obfuscated transaction on a Monero
- Blockchain explorer like https://xmrchain.net/
-
Ülekande võti (TX KEY)
- This is your transaction private key, keep this safe as revealing this to a third party
- reveals which signature in a ring is yours, thereby making your transaction transparent.
-
Plokk
- This was the block your transaction was included in.
- ]]>
-
- Saatmine
-
Saaja aadress
-
This is the public address of the wallet you are sending Moneroj to, you can copy this from
- your clipboard, scan a QR code or enter it manually. Make sure you triple check this to
- ensure you aren’t sending coins to the wrong address.
-
In addition to using an XMR address, you can also use
-
-
an OpenAlias for XMR or BTC
-
a BTC address
-
- Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai
- for details). See the section on sending BTC below.
-
Bitcoini (BTC) saatmine
-
SideShift.ai
-
SideShift.ai is a third party service which acts as an exchange from Monero to Bitcoin.
- We use the SideShift.ai API to integrate Bitcoin payments into Monerujo. Please check out
- https://sideshift.ai and decide for yourself if this is something you want to use. The Monerujo
- Team is not associated with SideShift.ai and cannot help you with their service.
-
SideShift.ai vahetuskurss
-
On the \"Amount\" screen you will be shown the current parameters of the SideShift.ai service. These
- include the current exchange rate as well as upper and lower BTC limits. Note that this
- rate is not guaranteed at this point.
-
SideShift.ai tellimus
-
On the \"Confirm\" screen, you will see the actual SideShift.ai order. This order is valid for
- a limited time - you may notice a countdown on the \"Spend\" button. The exchange rate may
- be different to the indicative one shown on previous screens.
-
SideShift.ai privaatvõti
-
Since Monerujo only handles the Monero part of your transaction your SideShift.ai secret key
- can be used to track the Bitcoin part of your order on the SideShift.ai homepage.
-
SideShift.ai loendur
-
Once the countdown reaches zero, you need to get a new quote from SideShift.ai by going back to the
- previous step and then coming back to the \"Confirm\" screen.
- ]]>
-
- Bitcoini (BTC) saatmine
-
SideShift.ai
-
SideShift.ai is a third party service which acts as an exchange from Monero to Bitcoin.
- We use the SideShift.ai API to integrate Bitcoin payments into Monerujo. Please check out
- https://sideshift.ai and decide for yourself if this is something you want to use. The Monerujo
- Team is not associated with SideShift.ai and cannot help you with their service.
-
SideShift.ai vahetuskurss
-
On the \"Amount\" screen you will be shown the current parameters of the SideShift.ai service. These
- include the current exchange rate as well as upper and lower BTC limits. Note that this
- rate is not guaranteed at this point.
-
SideShift.ai tellimus
-
On the \"Confirm\" screen, you will see the actual SideShift.ai order. This order is valid for
- a limited time - you may notice a countdown on the \"Spend\" button. The exchange rate may
- be different to the indicative one shown on previous screens.
-
SideShift.ai privaatvõti
-
Since Monerujo only handles the Monero part of your transaction your SideShift.ai secret key
- can be used to track the Bitcoin part of your order on the SideShift.ai homepage.
-
SideShift.ai loendur
-
Once the countdown reaches zero, you need to get a new quote from SideShift.ai by going back to the
- previous step and then coming back to the \"Confirm\" screen.
- ]]>
-
- Rahakott
-
Avalik režiim
-
Street mode can be enabled/disabled in the menu or Gunther\'s head icon. In this mode, your
- balance is not shown on any screen so you can safely use your wallet on the street, a pub or
- other public place. Previous transactions are also hidden. New transactions will be shown, so
- you can see that you have sent/received sweet Moneroj!
-
Uuendamine
- Because Monero likes to keep things private, every time you open a Monerujo wallet we have to
- scan the blockchain to see if any new Moneroj have been sent to your wallet, this only
- stores information to your phone which belongs to your wallet. Sometimes it can take a while
- because you haven’t synced in a long time.
-
Kontojääk
-
Help! My wallet balance has disappeared or is unconfirmed!
- Don’t panic! When you send funds from your wallet, some of your balance will temporarily show
- as unconfirmed.
- This happens as a result of how Monero is exchanged on the blockchain and how change works.
- Read more about change at https://getmonero.org/resources/moneropedia/change.html
-
Ülekannete ajalugu
-
A list of the wallet transactions. In view wallets, only incoming transactions are shown.
- ]]>
-
- Nodes
-
TL;DR
-
Refresh the nodes list by pulling down & bookmark 3–5 nodes to allow Monerujo
- to choose the best one for you!
-
What's a Node?
-
Monerujo uses a Remote Node (sometimes also called Daemon) to communicate with
- the Monero Network without having to download and store a copy of the
- whole blockchain itself.
-
Node List
-
If the list is empty, you can either add new nodes manually or let Monerujo
- scan the network for you. Or both. Read on…
-
The node list shows all currently known nodes. Additionally, the timestamp
- of the latest block known to each node is shown under the node name. An icon
- representing the node's response behaviour
- (which indicates the level of connectivity to be expected)
- is shown next to each node.
-
Any node in the list can be bookmarked for later use.
- Nodes which are not bookmarked will be forgotten.
-
Monerujo will choose the optimal bookmarked node each time you use it.
- It does this by checking the blockheight (how up-to-date
- is the node?) as well as the response behaviour (how fast does the node respond to requests?).
-
The list is sorted by these characteristics, so the top node would be the one Monerujo
- would choose right now. The bottom of the list would show very slow or unavailable nodes.
-
Add a Node
-
By touching the "Add Node" button at the bottom, you will be asked to
- enter the node details in the following dialog.
- The "Address" is the hostname or IP-address of the node - this is the only
- mandatory entry.
- Enter the "Port" if the node runs on a non-default port (e.g. 18089).
- You can also optionally name the node, so you can identify it easier later on.
- Some nodes require credentials to use them. Enter the provided username &
- password in the appropriate fields. Now you can "Test" these setting.
- The "Test Results" will display the blockheight, response time and actual IP used.
- The result may also be an error - usually because the hostname provided is
- not reachable in a sensible amount of time or the credentials are incorrect.
- Or the hostname/port combination does not point to an actual Monero Node!
- Once the test passes (no error) - you're set to press "OK" to save &
- bookmark this node.
-
Scan for Nodes
-
Additionally, you can scan the network for nodes. Monerujo will start
- scanning the network for Remote Nodes on port 18089. It begins by asking your
- bookmarked nodes for other peers in the Monero P2P network and then continues
- by asking those for their peers, and so on. If you have no bookmarked nodes
- (or they don't tell us about their peers),
- Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
- scan stops when it finds 10 remote nodes in total.
- ]]>
-
-
-
- Using a payment link
-
You have started monerujo with a payment link. In order to send funds, please do the following:
-
- 1. Open the wallet you want to spend from
- 2. Wait until the wallet is synced & the "Give" button appears
- 3. Touch the "Give" button
-
-
The payment details will be filled in. Check them and proceed like for any other transaction.
- ]]>
-
- Got it!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
deleted file mode 100644
index e8e7e5b..0000000
--- a/app/src/main/res/values-et/strings.xml
+++ /dev/null
@@ -1,450 +0,0 @@
-
-
- Rahakott
-
- Meist
- Privaatsuspoliitika
-
- Jaga
- Abi
- Küsi raha
- Nimeta ümber
- Tagavarakoopia
- Vaheta parooli
-
- Jätka tippimist …
- Meh …
- Sa suudad veelgi paremini!
- Jõuad peagi kohale …
- Hurraa, h2kker1 stiilis!
-
- Rahakotid
- Autorid
- OK
- Katkesta
- Sulge
- Lisainfo
-
- Edukalt saadetud
- Tehtud
-
- Puuduta QR koodi saamiseks
-
- Bitcoini maksed sisse lülitatud, puuduta lisainfo saamiseks.
- Ledger\'i tugi sisse lülitatud, puuduta lisainfo saamiseks.
-
- Sa sisestasid %1$s aadressi.
- See tähendab, et sa saadad Monerosid ning kohale jõuavad %1$s kasutades SideShift.ai teenust.
- ]]>
-
- SideShift.ai tellimus
-
- %1$s %2$s
-
- Ootan kinnitust
- Ootan makset
- SideShift.ai viga (%1$s)
- %1$s saadetud!
- Küsin …
-
- Sa saad saata %1$s — %2$s %4$s.
- SideShift.ai annab hetkel vahetuskursiks %3$s %4$s/XMR.
- ]]>
-
- Kontojääk: %2$s %3$s (%1$s XMR)
-
- ✔ Makse ID integreeritud
- Valmistan ülekannet ette
-
- Loon SideShift.ai tellimust
- Küsin SideShift.ai tellimust
- Valmistan ette Monero ülekannet
-
- Küsin SideShift.ai parameetreid
-
- SideShift.ai viga
- Kood: %1$d
-
- Puuduta uuesti proovimiseks
- Nüüd jõudsime küll tupikusse!
- Oh ei, SideShift.ai ei ole hetkel saadaval!
-
- %1$s %3$s = %2$s XMR
- (Kurss: %1$s %2$s/XMR)
-
- Külasta SideShift.ai lisainfo saamiseks & jälgin
- Privaatvõti\nSideShift.ai
- SideShift.ai privaatvõti
- Sihtkoha %1$s aadress
- Kogus
-
- Ülekande ID
- Sihtkoha address
- Kommentaarid
-
- Teostan tagavarakoopiat
- Arhiveerin
- Nimetan ümber
- Vahetan parooli
-
- Teen ettevalmistusi …\nSee võib aega võtta!
-
- Tagavarakoopia ebaõnnestus!
- Ümber nimetamine ebaõnnestus!
- Parooli vahetamine ebaõnnestus!
- Parool vahetatud
-
- Server
- Laen rahakotti …
- Rahakott salvestatud
- Rahakoti salvestamine ebaõnnestus!
- Ühendun …
- Serveriga ühendumine ebaõnnestus!\nKontrolli kasutajanime/parooli
- Ebasobilik server!\nVali mõni teine.
- Server ei vastanud!\nProovi uuesti või vali teine server.
-
- Lahti ühendatud
-
- Ülekanne ebaõnnestus: %1$s
-
- Sõber, sa ootasid liiga kaua!
-
- Ma tegelen ikka veel su eelmise rahakotiga …
-
- Nimeta ümber %1$s
-
- Uus parool rahakotile %1$s
- Korda parooli rahakotile %1$s
- Prool rahakotile %1$s
- Sa saad rahakoti avamiseks kasutada ka sõrmejälge.\nSelleks puuduta sõrmejäljelugejat.
- Avan rahakoti…
- Sõrmejälge ei tuntud ära. Proovi uuesti.
- Vale parool!
- Salvestatud parool on vale.\nPalun sisesta parool käsitsi.
- Rahakotti pole olemas!
- Server peab olema valitud!
- Rahakott ei ühildu valitud võrguga
-
- (Ainult vaatamiseks)
-
- Küsi raha
- Saada
-
- + %1$s XMR kinnitamata
-
- monerujo teenus
-
- Uuendatud:
- Plokki veel
- Uuendamine:
-
- Mälusse kirjutamine ei õnnestunud! Paanika-Jaanika!
- Mälusse kirjutamine on tegelikult meile väga oluline!
- Pole kaamerat = pole QR koodide lugemist!
-
- Vaatamise võti
- Avalik aadress
- Võti
- Vaatamise võti on kopeeritud lõikepuhvrisse!
- Võti on kopeeritud lõikepuhvrisse!
- Rahakoti aadress on kopeeritud lõikepuhvrisse!
- Ülekande ID on kopeeritud lõikepuhvrisse!
- Lõikepuhvrisse kopeerimine on turvakaalutlustel keelatud!
-
- Vahetuskursi küsimine ebaõnnestus!\nKasuta XMR/XMR või proovi uuesti
-
- Loo rahakott
- Rahakoti nimi
- Rahakoti parool
- Luba rahakoti avamine sõrmejäljega
- Sõrmejäljega avamine
-
Kui sõrmejäljega avamine on sisse lülitatud, saad kontoseisu vaadata ja raha vastu võtta ilma parooli sisestamata.
-
Kuid kõrgema turvalisuse nimel palutakse sul sisestada parool siis, kui vaatad rahakoti infot või saadad raha.
- Turvahoiatus
-
Lõpetuseks, monerujo tahab sulle meelde tuletada, et igaüks, kes pääseb ligi sinu sõrmejäljele, saab vaadata su kontoseisu.
-
Näiteks on võimalik pahatahtlikel inimestel nii avada su rahakott, kui sa magad.
- Oled kindel, et soovid selle aktiveerida?
- ]]>
- Paroolid ei kattu
- Parool ei saa olla tühi
- Loo mulle juba üks rahakott!
- Olen mnemoonilise seemne üles kirjutanud
-
- Anna mulle nimi!
- Rahakott juba eksisteerib!
- Nimi ei saa alata märgiga .
- Loon rahakotti
- Rahakott loodud
-
- Sisesta plokinumber või kuupäev (YYYY-MM-DD)
-
- Võtmed
- Uus
- Seeme
- Vaatamiseks
-
- Avalik aadress
- Vaatamise võti
- Kulutamise võti
- 25-sõnaline mnemooniline seeme
- Taastamise plokinumber või kuupäev (YYYY-MM-DD)
-
- Avalik aadress
- Vaatamise võti
- Kulutamise võti
- Mnemooniline seeme
- Rahakoti failide taastamise parool
-
- Sisesta korrektne võti
- Sisesta korrektne aadress
- Sisesta oma 25-sõnaline seeme
-
- Privaatsed kommentaarid (valikuline)
- Genereeri
- Saada mu kallid Monerod teele
- Saada mu kallid Monerod (%1$s)
- See pole QR kood
- See pole sobiv QR kood
- See pole sobiv aadress
- OpenAlias aadress pole saadaval
- OpenAlias secure ✔
- Lahendan OpenAlias…
- OpenAlias ilma DNSSEC\'ita - aadress võib olla võltsitud
- Saada
- Kontojääk: %1$s XMR
- Aadress
- Kogus
- Kinnita
- Tehtud
-
- Kogus
- Teenustasu (XMR)
- Teenustasu
- Kokku (XMR)
- Kokku
-
- %1$s XMR
- +%1$s teenustasu
-
- Viga ülekande genereerimisel
-
- teenustasu %1$s
- (%1$s)
- ebaõnnestus
- - %1$s
- + %1$s
-
- Aeg
- Ülekande ID
- Ülekande võti
- Sihtkoht
- Makse ID
- Plokk
- Kogus
- Teenustasu
- Ülekanded
- Kommentaarid
- (valikuline)
- Ülekande lisainfo
-
- OOTEL
- EBAÕNNESTUS
-
- Kogus
- Kommentaarid (valikuline)
- Rahakotti ei õnnestunud avada!
-
- Kuni %1$s
- Vähemalt 0
- XMR pole arv
-
- Nüüd näidatakse tundlikku infot.\nPiilu oma seljataha!
- Olen turvalises kohas
- Vii mind tagasi!
- Lisainfo
-
- Täpselt nii!
- Ei, tänan!
-
- Loo uus rahakott
- Taasta rahakott vaatamiseks
- Taasta rahakott privaatvõtmetest
- Taasta rahakott 25-sõnalisest seemnest
-
- Loo konto
- Uus konto lisatud #%1$d
- Konto #
-
- Saada kõik selle konto kinnitatud vahendid!
- Alamaadress
- Avalik alamaadress #%1$d: %2$s
-
- Keel
- Kasuta süsteemi keelt
-
- Taasta seadmelt Ledger Nano
-
- Suhtlen seadmega Ledger
- Seadmelt Ledger on vajalik kinnitus!
- Otsin alamaadresse
- Kontrollin võtmeid
- Arvutan keerulisi tehteid
- Segan juppe räsiga
- Palun (taas)ühenda seade Ledger
-
- Loon kontot
-
- %1$s lisatud
- %1$s eemaldatud
-
- Kirjutan silti
- Sildi kirjutamine ebaõnnestus!
- Sildi kirjutamine õnnestus
- Silt ei toeta NDEF\'i!
- Sildil on %1$d baiti, kuid meil on vaja %2$d!
- Ma ei oska seda silti lugeda!
- Ma ei tea, mida sa tahad!
- NFC on saadaval!
-
- Serveri versioon ei sobi - palun uuenda!
-
- Näita salajast infot
- Avalik režiim
-
- Node-o-matiC sisse lülitatud, puuduta lisainfo saamiseks.
- Viimane uuendatud plokk: %1$s
- Serverid
- Serveri nimi (valikuline)
- Aadress
- Port
- Kasutajanimi (valikuline)
- Parool (valikuline)
- Aadressi lahendmine ebaõnnestus
- Meil on seda vaja!
- Peab olema arv
- Peab olema 1–65535
- Lisa server
- Puuduta värskendamiseks!
- ÜHENDUSE VIGA %1$d
- ÜHENDUSE VIGA
- SISSE LOGIMINE EBAÕNNESTUS
- Testi tulemus:
- Kõrgus: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- Testimise IP: %1$s …
- Palun oota otsimise lõpuni
- Puuduta serverite valimiseks või lisamiseks
- Lisa serverid käsitsi või pühi sõrmega alla, et otsida
- Otsin võrgust…
- Automaatselt salvestati parimad %1$d serverit
- Testi
-
- Tagavarakoopia õnnestus
-
-
- Saaja
-
- EVERYTHING!
-
- Convert Ledger Seed
- Ledger Seed Words
- Ledger Passphrase (optional)
- Invalid Ledger Seed!
- Entering your Ledger Seed here is a major security risk!
-
- Taastamise plokinumber
-
- Start Monero App on %1$s
-
- Rescan!
-
- I get it!
- Next
- I\'m ready!
-
- Welcome to Monerujo!
- This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.
- Keep your seed safe
- The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.
- Send Crypto
- Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.
- Nodes, your way
- Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.
- Send with fingerprint
- You\'re now able to send XMR with just your fingerprint if you enabled it. To request the password, just disable fingerprint access.
-
- Dark Mode
-
- Auto
- Day
- Night
-
- There is nothing here\nPlease create or restore a wallet
-
- Restore default nodes
- Restoring already in progress…
-
- Last Block: %1$d seconds ago
- Last Block: %1$d minutes ago
- Last Block: %1$d hours ago
- Last Block: %1$d days ago
-
- Cannot get quote
- Check amount and try again
-
- Ambiguous address.
- Please select the type above.
- ]]>
-
- Please enter or scan a %1$s address.
- You'll send XMR and the receiver will get %2$s using the SideShift.ai service.
- ]]>
-
- Please enter or scan a Monero address.
- ]]>
-
- Subaddresses
- Subaddress Name
- Too many unused addresses - use some to enable creating more!
- Too many unused accounts - use some to enable creating more!
- Transactions for this subaddress:
- No transactions for this subaddress yet
- Select a subaddress
- Long-press for details
-
- This wallet will be deleted. Your funds will be gone forever unless you have your seed or a working backup to recover it.
- Delete
- Delete failed!
-
- Import wallet
- Import failed!
-
- Reset wallet!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-fa/about.xml b/app/src/main/res/values-fa/about.xml
deleted file mode 100644
index 59edac0..0000000
--- a/app/src/main/res/values-fa/about.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
- بستن
- من مونروجو هستم
-
- نسخهٔ
- %1$s (%2$d)
-
-
- دست اندرکاران
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo, ErCiccione et al.
-
این صفحه شما را از سیاستهای ما در مورد جمعآوری، استفاده و افشای اطلاعات شخصی که از کاربران برنامهٔ خود (مونروجو به معنای «کیفپول مونرو») دریافت میکنیم مطلع میکند.
-
با استفاده از برنامه، با جمعآوری و استفاده از اطلاعات، مطابق با این سیاست، موافقت میکنید.
-
دادههای جمعآوری شده
-
دادههای شخصی هر نوع دادهای است که بتواند یک فرد را شناسایی کند.
-
کلیدها و آدرسهای عمومی مونرو توسط برنامه به صورت داخلی برای پردازش تراکنشها جمعآوری و پردازش میشوند و به شکل رمزگذاری شده به شبکه مونرو منتقل می شوند.
-
سایر اطلاعات شخصی توسط برنامه جمعآوری نمیشوند.
-
- اگر از قابلیت اختیاری تبدیل رمزارز استفاده کنید، این برنامه نرخ ارز را از طریق API عمومی coinmarketcap.com دریافت میکند. برای اطلاع از جزئیات نحوهٔ جمعآوری دادههای درخواستهایتان، خطمشی رازداری آنها را در
- coinmarketcap.com/privacy
- ببینید.
-
-
- اگر از برنامه برای پرداخت به آدرسهای بیتکوین استفاده میکنید، از سرویس SideShift.ai استفاده خواهید کرد. برای جزئیات بیشتر به خطمشی رازداری آنها در
- sideshift.ai
- مراجعه کنید. مونروجو مقدار و آدرس مقصد بیتکوین را برای آنها ارسال میکند. آدرس IP شما نیز قابل جمعآوری خواهد بود.
-
-
دسترسیهای نرمافزار
-
-
اینترنت: اتصال به شبکهٔ مونرو
-
خوانش حافظهٔ خارجی: خواندن فایلهای کیفپول ذخیره شده برروی دستگاه
-
نوشتار حافظهٔ خارجی: نوشتن فایلهای کیفپول ذخیره شده برروی دستگاه
-
قفل بیداری: بیدار نگه داشتن دستگاه در هنگام همگامسازی
-
دوربین: اسکن کدهای کیوآر برای ارسال مونرو
-
-
تغییرات در این خطمشی رازداری
-
- ممکن است هرازچندگاهی این خطمشی رازداری را بهروز کنیم. ما با ارسال خطمشی رازداری جدید در برنامه و وبسایت
- (www.monerujo.app)
- شما را از هرگونه تغییر مطلع خواهیم کرد. به شما توصیه میشود برای هرگونه تغییر، این خطمشی رازداری را به صورت دورهای مرور کنید.
-
-
آخرین بهروزرسانی این خطمشی رازداری: 10 نوامبر 2017
-
تماس با ما
-
- اگر در مورد خطمشی رازداری ما یا نحوهٔ جمعآوری و پردازش دادههای خود سؤالی دارید، لطفا به
- privacy@monerujo.io
- ایمیل بزنید.
-
- یک نام کیف پول و رمز عبور منحصر به فرد وارد کنید. رمز عبور برای ایمن سازی اطلاعات کیف
- پول شما در دستگاه استفاده میشود. از یک رمز عبور قوی استفاده کنید - حتی بهتر، از یک «عبارت عبور» استفاده کنید.
-
-
بذر یادآوری خود را روی کاغذ یادداشت کنید!
-
- در صفحهٔ زیر «بذر یادآوری» 25 کلمهای خود را پیدا خواهید کرد. این تنها چیزی است که برای بازیابی کیف پول
- شما در آینده و دسترسی کامل به وجوه شما مورد نیاز است. نگهداری «ایمن» و «خصوصی» این کلمات بسیار مهم است، زیرا به
- همه
- امکان دسترسی کامل به وجوه شما را میدهد!
-
-
- اگر عبارت عبور کیف پول خود را گم کردید، همچنان میتوانید کیف پول خود را با بذر یادآوری بازیابی کنید.
-
-
- هیچ راهی برای بازیابی بذر یادآوری وجود ندارد، اگر آن را از دست بدهید تمام سرمایهٔ شما از بین خواهد رفت!
- بذر یادآوری نیز هرگز قابل تغییر نیست، و اگر به سرقت رفته یا به خطر بیفتد، باید وجوه خود را به کیفپول
- جدید (با یک بذر جدید) منتقل کنید. بنابراین، بهتر است از بذر یادآوری خود با نوشتن و ذخیرهٔ آن در
- چندین
- مکان امن و مطمئن، پشتیبان تهیه کنید.
-
- ]]>
-
- بازیابی کیف پول از بذر
-
اگر از پیش یک کیف پول مونرو دارید و میخواهید تراکنشها را از بلاکچین بازیابی کنید!
-
- یک نام کیف پول و رمز عبور منحصر به فرد وارد کنید. رمز عبور برای ایمن سازی اطلاعات کیف پول شما
- در دستگاه استفاده میشود. از یک رمز عبور قوی استفاده کنید - حتی بهتر، از یک «عبارت عبور» استفاده کنید.
-
-
بذر خود را در قسمت «بذر یادآوری» وارد کنید.
-
- شمارهٔ بلوک اولین تراکنش استفاده شده برای این آدرس را در فیلد «ارتفاع بازیابی» وارد کنید. همچنین میتوانید از تاریخ میلادی در قالب
- YYYY-MM-DD
- استفاده کنید. اگر مطمئن نیستید، یک تاریخ یا ارتفاع بازیابی تقریبی
- قبل از
- اولین استفاده از این آدرس کیف پول را وارد کنید.
-
- ]]>
-
- بازیابی کیف پول از لجر
-
- اگر میخواهید کیف پول خود را از دستگاه Ledger Nano S خود بازیابی کنید.
-
-
کلیدهای خصوصی شما هرگز از دستگاه لجر خارج نمیشوند، بنابراین هربار که میخواهید به کیف پول خود دسترسی داشته باشید، باید آن را به تلفن خود وصل کنید.
-
- یک نام کیف پول و رمز عبور منحصر به فرد وارد کنید. رمز عبور برای ایمن سازی اطلاعات کیف پول شما در دستگاه اندرویدی استفاده میشود. از یک رمز عبور قوی استفاده کنید - حتی بهتر، از یک «عبارت عبور» استفاده کنید.
-
-
- شمارهٔ بلوک اولین تراکنش استفاده شده برای این آدرس را در فیلد «ارتفاع بازیابی» وارد کنید. همچنین میتوانید از تاریخ میلادی در قالب
- YYYY-MM-DD
- استفاده کنید. اگر مطمئن نیستید، یک تاریخ یا ارتفاع بازیابی تقریبی
- قبل از
- اولین استفاده از این آدرس کیف پول را وارد کنید.
-
- ]]>
-
- بازیابی کیف پول از کلیدها
-
اگر میخواهید با استفاده از کلیدهای خود کیف پول خود را بازیابی میکنید!
-
- یک نام کیف پول و رمز عبور منحصر به فرد وارد کنید. رمز عبور برای ایمن سازی اطلاعات کیف پول شما در دستگاه استفاده میشود. از یک رمز عبور قوی استفاده کنید - حتی بهتر، از یک «عبارت عبور» استفاده کنید.
-
-
آدرس مونروی خود را در قسمت «آدرس عمومی» وارد کنید و «کلید مشاهده» و «کلید مصرف» را پر کنید.
-
- شمارهٔ بلوک اولین تراکنش استفاده شده برای این آدرس را در فیلد «ارتفاع بازیابی» وارد کنید. همچنین میتوانید از تاریخ میلادی در قالب
- YYYY-MM-DD
- استفاده کنید. اگر مطمئن نیستید، یک تاریخ یا ارتفاع بازیابی تقریبی
- قبل از
- اولین استفاده از این آدرس کیف پول را وارد کنید.
-
- ]]>
-
-
- ساخت کیف پول «فقط مشاهدهای»
-
-
اگر فقط میخواهید تراکنشهای ورودی به کیف پول را نظارت کنید!
-
یک نام کیف پول و رمز عبور منحصر به فرد وارد کنید. رمز عبور برای ایمن سازی اطلاعات کیف پول شما در دستگاه استفاده میشود. از یک رمز عبور قوی استفاده کنید - حتی بهتر، از یک «عبارت عبور» استفاده کنید.
-
آدرس مونروی خود را در قسمت «آدرس عمومی» وارد کنید و «کلید مشاهده» را پر کنید.
-
- شمارهٔ بلوک اولین تراکنش استفاده شده برای این آدرس را در فیلد «ارتفاع بازیابی» وارد کنید. همچنین میتوانید از تاریخ میلادی در قالب
- YYYY-MM-DD
- استفاده کنید. اگر مطمئن نیستید، یک تاریخ یا ارتفاع بازیابی تقریبی
- قبل از
- اولین استفاده از این آدرس کیف پول را وارد کنید.
-
- ]]>
-
- جزئیات کیف پول
-
آدرس عمومی
- آدرس عمومی شما مانند شمارهٔ حساب بانکی شما است که میتوانید آن را با هرکسی به اشتراک بگذارید
- بدون اینکه نگران از دست دادن مونروی خود باشید. دیگران مونرو را با استفاده از این آدرس به کیف پول شما ارسال میکنند.
-
بذر یادآوری
- این تنها دادهای است که برای بازیابی کیف پول شما در آینده و دسترسی کامل به وجوه شما مورد نیاز است.
- نگهداری خصوصی و امن این بذر بسیار مهم است، زیرا به هرکسی اجازه دسترسی کامل به مونروی
- شما را میدهد! اگر این کد را در جایی امن یادداشت نکردهاید، لطفاً انجام دهید!
-
رمز عبور بازیابی فایلهای کیف پول
- حتما این رمز عبور را روی کاغذ یادداشت کنید. اگر دستگاه خود را بازنشانی کنید یا برنامه را حذف نصب کنید،
- برای دسترسی مجدد به فایلهای کیف پول خود به آن نیاز خواهید داشت.
-
CrAzYpass
- اگر رمز عبور نمایش داده شده در اینجا 52 کاراکتر در گروههای 4 تایی است - تبریک میگوییم!
- فایلهای کیف پول شما با یک کلید 256 بیتی ایجاده شده براساس عبارت عبوری که انتخاب کردهاید ایمن شده. این کار هک
- شدن را بسیار سخت میکند!
- این ویژگی برای همهٔ کیف پولهای تازه ایجاد شده اجباری است.
-
رمز عبور قدیمی
- اگر عین عبارت عبور خود را در اینجا میبینید، فایلهای کیف پول شما به اندازهٔ زمانی
- که از CrAzYpass استفاده میکنید ایمن نیستند. برای رفع این مشکل، کافی است «تغییر عبارت عبور» را
- از منو انتخاب کنید. برنامه پس از وارد کردن یک عبارت عبور جدید (حتی شاید با همان عبارت قبلی)
- یک CrAzYpass برای شما تولید و فایلهای کیف پول شما را با آن ایمن میکند. آن را روی کاغذ بنویسید!
-
- کیف پولهای CrAzYpass
-
- اگر زمانی نیاز به نصب مجدد مونروجو داشتید (مثلاً پس از تنظیم مجدد تلفن یا مهاجرت به یک تلفن جدید) یا میخواهید
- از فایلهای کیف پول خود در دستگاه یا رایانه شخصی دیگری استفاده کنید، باید از این رمز بازیابی برای
- دسترسی مجدد به کیف پول خود استفاده کنید.
- با انتخاب «تغییر عبارت عبور» از منو میتوانید عبارت دیگری را انتخاب کنید. مراقب باشید که با این کار
- یک رمز عبور بازیابی جدید ایجاد میشود. آن را روی کاغذ بنویسید!
-
کلید مشاهده
- کلید مشاهدهٔ شما میتواند برای ساخت یک کیف پول «فقط مشاهدهای» برای نظارت بر تراکنشهای دریافتی
- به کیف پول شما بدون اجازه داشتن برای خرج کردن وجوه، استفاده شود.
-
کلید مصرف
- کلید مصرف شما به هرکسی اجازه میدهد مونروی مربوط به کیف پول شما را خرج
- کند، بنابراین این کلید را به کسی نگویید، آن را مانند بذر یادآوری خود ایمن نگه دارید.
- ]]>
-
- فهرست کیف پول
-
«گِره»
-
- مونروجو از یک گرهٔ راه دور برای برقراری ارتباط با شبکهٔ مونرو، بدون نیاز به دانلود و ذخیرهٔ یک کپی از کل بلاکچین، استفاده میکند. میتوانید فهرستی از گرههای راه دور محبوب را در اینجا
- https://moneroworld.com
- پیدا کنید یا یاد بگیرید که چگونه گرهٔ راه دور خود را راه بیندازید.
-
-
مونروجو با تعدادی گرههای راه دور از پیش تنظیم شده است و پنج گرهٔ استفاده شدهٔ آخر را به خاطر نگه میدارد.
-
کیف پولها
-
- در اینجا کیف پولهای خود را میبینید. آنها در پوشهٔ
- monerujo
- در حافظهٔ داخلی دستگاه شما قرار دارند. برای مشاهدهٔ آنهای میتوانید از یک مرورگر فایل استفاده کنید.
- باید به طور منظم از این پوشه در فضای ذخیرهسازی خارج از دستگاه، نسخهٔ پشتیبان تهیه کنید زیرا شاید
- روزی دستگاه شما منفجر یا دزدیده شود.
-
-
- کیف پولی را برای باز شدن انتخاب کنید، برای ایجاد کیف جدید «+» را لمس کنید یا یکی از گزینهها را انتخاب کنید:
-
-
جزئیات
-
نمایش جزئیات، بذر و کلیدهای کیف پول.
-
دریافت
-
یک کد کیوآر برای دریافت مونرو بسازید.
-
تغییر نام
-
تغییر نام کیف پول. نام فایلهای پشتیبان تغییر نمیکند.
-
پشتیبان گیری
-
- تهیهٔ یک نسخهٔ پشتیبان در پوشهٔ
- backups
- داخل پوشهٔ
- monerujo
- با حذف نسخهٔ پیشین.
-
-
آرشیو کردن
-
- تهیهٔ یک نسخهٔ پشتیبان و حذف کیف پول در برنامه. فایل پشتیبان در پوشهٔ
- backups
- باقی میماند. اگر دیگر نیازی به نسخهٔ پشتیبان خود ندارید، باید آنها را با یک مرورگر فایل یا برنامهٔ حذف ایمن حذف کنید.
-
- ]]>
-
- جزئیات تراکنش
-
مقصد
- این آدرس عمومی کیف پولی است که شما به آن مونرو فرستادید.
-
شناسهٔ پرداخت
- میتوانید از شناسهٔ پرداخت برای شناسایی دلیل ارسال مونرو بین دو طرف استفاده کنید، این
- موضوع کاملاً اختیاری و خصوصی است. به عنوان مثال میتواند به یک کسب و کار اجازه دهد
- معاملهٔ شما را با کالایی که خریدهاید تطبیق دهد.
-
شناسهٔ تراکنش
- این شناسهٔ تراکنش شماست که میتوانید از آن برای شناسایی تراکنش خود بر روی یک کاوشگر بلاکچین، مانند
- xmrchain.net
- استفاده بکنید.
-
کلید تراکنش
- این کلید خصوصی تراکنش شماست، آن را ایمن نگه دارید زیرا افشای آن برای یه شخص ثالث باعث
- آشکار شدن این که کدام امضا در حلقه متعلق به شماست شده و در نتیجه، تراکنش شما قابل ردیابی میشود.
-
بلوک
- این شمارهٔ بلوکی است که تراکنش شما را شامل میشود.
- ]]>
-
- ارسال
-
آدرس گیرنده
-
- این آدرس عمومی کیف پولی است که به آن مونرو ارسال میکنید، میتوانید این آدرس را از حافظهٔ
- دستگاه خود کپی کرده، یک کد کیوآر را اسکن کنید یا به صورت دستی وارد کنید. قبل از زدن دکمهٔ
- ارسال، آدرس را به دقت بررسی کرده تا از ارسال به آدرس اشتباه خودداری کنید.
-
-
- علاوه بر این میتوانید به جای استفاده از یک آدرس مونرو، یکی از گزینههای زیر را فراهم کنید:
-
-
- یک آدرس OpenAlias برای مونرو یا بیتکوین
-
-
یک آدرس بیتکوین
-
- لطفا توجه داشته باشید که ارسال بیتکوین از طریق سرویس SideShift.ai پردازش
- میشود (برای جزئیات به
- https://sideshift.ai
- مراجعه کنید). جزئیات ارسال بیتکوین را در زیر بخوانید.
-
-
ارسال بیتکوین
-
SideShift.ai
-
- وبسایت SideShift.ai یک سرویس شخص ثالث است که بهعنوان صرافی مونرو به بیتکوین عمل میکند.
- ما از API آنها برای ادغام پرداختهای بیتکوین در مونروجو استفاده میکنیم. لطفا https://sideshift.ai را
- بررسی کنید و برای خودتان تصمیم بگیرید که آیا این چیزی است که میخواهید استفاده کنید یا خیر. تیم
- مونروجو به SideShift.ai مرتبط نیست و نمیتواند به شما در خدمات آنها کمکی کند.
-
-
- نرخ تبادل SideShift.ai
-
-
- در صفحهٔ «مقدار» پارامترهای فعلی سرویس SideShift.ai به شما نشان داده میشود. اینها شامل
- نرخ فعلی تبادل و همچنین محدودیتهای مقداری حداکثر و حداقلی بیتکوین میشود.
- توجه داشته باشید که این نرخ در این نقطه تقریبی است.
-
-
- سفارش SideShift.ai
-
-
- در صفحهٔ «تایید»، سفارش واقعی SideShift.ai را خواهید دید.این سفارش برای مدت محدودی معتبر
- است - ممکن است متوجه یک شمارش معکوس روی دکمهٔ «مصرف» بشوید. نرخ تبادل ممکن است
- با نرخی که در صفحات قبل نشان داده شد متفاوت باشد.
-
-
- کلید خصوصی SideShift.ai
-
-
- از آنجایی که مونروجو فقط بخش مونروی تراکنش شما را مدیریت میکند، این کلید خصوصی میتواند
- برای ردیابی بخش بیتکوین سفارش شما در وبسایت SideShift.ai استفاده شود.
-
-
- شمارش معکوس SideShift.ai
-
-
- هنگامی که شمارش معکوس به صفر رسید، باید با رفتن به مرحلهٔ قبل و سپس بازگشت
- به صفحهٔ «تایید»، یک نقل قول جدید از SideShift.ai دریافت کنید.
-
- ]]>
-
- ارسال بیتکوین
-
SideShift.ai
-
- وبسایت SideShift.ai یک سرویس شخص ثالث است که بهعنوان صرافی مونرو به بیتکوین عمل میکند.
- ما از API آنها برای ادغام پرداختهای بیتکوین در مونروجو استفاده میکنیم. لطفا https://sideshift.ai را
- بررسی کنید و برای خودتان تصمیم بگیرید که آیا این چیزی است که میخواهید استفاده کنید یا خیر. تیم
- مونروجو به SideShift.ai مرتبط نیست و نمیتواند به شما در خدمات آنها کمکی کند.
-
-
- نرخ تبادل SideShift.ai
-
-
- در صفحهٔ «مقدار» پارامترهای فعلی سرویس SideShift.ai به شما نشان داده میشود. اینها شامل
- نرخ فعلی تبادل و همچنین محدودیتهای مقداری حداکثر و حداقلی بیتکوین میشود.
- توجه داشته باشید که این نرخ در این نقطه تقریبی است.
-
-
- سفارش SideShift.ai
-
-
- در صفحهٔ «تایید»، سفارش واقعی SideShift.ai را خواهید دید.این سفارش برای مدت محدودی معتبر
- است - ممکن است متوجه یک شمارش معکوس روی دکمهٔ «مصرف» بشوید. نرخ تبادل ممکن است
- با نرخی که در صفحات قبل نشان داده شد متفاوت باشد.
-
-
- کلید خصوصی SideShift.ai
-
-
- از آنجایی که مونروجو فقط بخش مونروی تراکنش شما را مدیریت میکند، این کلید خصوصی میتواند
- برای ردیابی بخش بیتکوین سفارش شما در وبسایت SideShift.ai استفاده شود.
-
-
- شمارش معکوس SideShift.ai
-
-
- هنگامی که شمارش معکوس به صفر رسید، باید با رفتن به مرحلهٔ قبل و سپس بازگشت
- به صفحهٔ «تایید»، یک نقل قول جدید از SideShift.ai دریافت کنید.
-
- ]]>
-
- کیف پول
-
حالت خیابان
-
- حالت خیابان را میتوان در منو یا نماد سر گانتر فعال یا غیرفعال کرد. در این حالت، موجودی
- شما روی هیچ صفحهای نشان داده نمیشود، بنابراین میتوانید با خیال راحت از کیف پول خود
- در خیابان، کافه یا دیگر مکانهای عمومی استفاده کنید. تراکنشهای پیشین نیز پنهان هستند اما
- تراکنشهای جدید نشان داده میشوند تا بتوانید ببینید که مونروها را ارسال یا دریافت کردهاید!
-
-
اسکن کردن
- از آنجایی که مونرو دوست دارد همه چیز را خصوصی نگه دارد، هر بار که کیف پول مونروجو را باز
- میکنید، باید بلاکچین را اسکن کنیم تا ببینیم آیا مونروهای جدیدی به کیف پول شما ارسال شده است
- یا خیر، این کار فقط اطلاعات متعلق به کیف پول شما را در تلفن شما ذخیره میکند. بعضی اوقات که
- مدت زمان زیادی از آخرین همگام سازی گذشته باشد، ممکن است همگام سازی زمان زیادی طول بکشد.
-
موجودی
-
کمک! موجودی کیف پول من ناپدید شده یا تایید نشده!
- نترسید! وقتی از کیف پول خود وجوه ارسال میکنید، مقداری از موجودی شما بهطور موقت
- تایید نشده نشان داده میشود. این در نتیجهٔ نحوهٔ انجام تراکنش در بلاکچین مونرو اتفاق میفتد.
- اطلاعات بیشتر دربارهٔ چنج (باقی مانده) را در
- اینجا
- بخوانید.
-
فهرست تراکنشها
-
یک فهرست از تراکنشهای کیف پول.
-
- در کیف پول «فقط مشاهدهای» (کیف پولی که فقط با کلید مشاهده ساخته شده)، فقط تراکنشهای دریافتی نشان داده میشوند.
- ]]>
-
- «گِرهها»
-
خلاصه
-
- فهرست گرهها را با پایین کشیدن تازهسازی کنید و با نشانکگذاری ۳ تا ۵ گره به مونروجو اجازه دهید بهترین مورد را برای شما انتخاب کند!
-
-
گره چیست؟
-
- مونروجو از یک گرهٔ راه دور (که گاهی اوقات Daemon نیز نامیده میشود) برای برقراری ارتباط با شبکهٔ مونرو بدون نیاز به دانلود و ذخیره یک کپی از کل بلاکچین، استفاده میکند.
-
-
فهرست گرهها
-
- اگر این فهرست خالی است، میتوانید گرههای جدید را به صورت دستی اضافه کنید یا به مونروجو اجازه دهید تا شبکه را برای شما اسکن کند. ادامهٔ مطلب را بخوانید...
-
-
- فهرست گرهها تمام گرههای شناخته شدهٔ فعلی را نشان میدهد. علاوه بر این، زمان آخرین
- بلوک شناخته شده در زیر نام هر گره نشان داده میشود. یک نماد نشان دهندهٔ کیفیت
- گره و اتصال به آن در کنار هر گره نشان داده میشود.
-
-
- هر گرهٔ در فهرست را میتوان برای استفادهٔ بعدی نشانک کرد. گرههایی که نشانهگذاری نشدهاند فراموش خواهند شد.
-
-
- مونروجو در هربار استفاده بهینهترین گرهٔ نشانهگذاری شده را انتخاب میکند. این کار را با بررسی ارتفاع بلوک (بهروز بودن گره) و همچنین کیفیت اتصال انجام میدهد.
-
-
- این فهرست بر اساس این ویژگیها مرتب شده است و اولین گره در فهرست توسط مونروجو انتخاب میشود. در پایین فهرست گرههای بسیار کند یا غیرقابل دسترس قرار میگیرند.
-
-
اضافه کردن گره
-
- با لمس دکمهٔ «افزودن گره» در پایین، از شما خواسته میشود که جزئیات گره را در ادامه وارد کنید.
- «آدرس»، نام دامنه یا آدرس IP گره است - این مورد تنها دادهٔ اجباری برای اضافه کردن گره است.
- پورت را اگر گره روی یک پورت غیر پیشفرض (18089) اجرا میشود وارد کنید.
- همچنین به صورت اختیاری میتوانید گره را نامگذاری کنید، تا بتوانید بعداً آن را آسانتر شناسایی کنید.
- بعضی از گرهها برای استفاده نیاز به نام کاربری و رمز عبور دارند. آنها را در جای مخصوص وارد کنید. سپس میتوانید این تنظیمات را بررسی کنید.
- «نتیجهٔ بررسی» به شما ارتفاع بلوک، مدت پاسخگویی و آیپی استفاده شده را نمایش خواهد داد.
- همچنین میتوانید با خطا مواجه شوید - معمولا به این دلیل که آدرس ارائه شده در مدت زمان معقولی قابل دسترس نبوده یا رمز و نام کاربری اشتباه بوده است.
- و آدرس یا پورت به یک گرهٔ مونرو اشاره نمیکند!
- زمانی که بررسی با موفقیت انجام شد، شما میتوانید با فشردن «OK» این گره را ذخیره و نشانهگذاری کنید.
-
-
اسکن برای گرهها
-
- علاوه بر این، میتوانید شبکه را برای یافتن گرهها اسکن کنید. مونروجو شروع به اسکن شبکه برای یافتن گرههای راه دور برروی پورت 18089 میکند. این کار با پرسیدن از گرههای نشانهگذاری شده برای گرههای بیشتر شروع میشود و سپس از آنها نیز برای گرههای بیشتر پرسوجو میکند و همینطور ادامه میدهد. اگر گرهی نشانهگذاری شده نداشته باشید (یا آنها دربارهی همتایان خود به ما نگویند)، مونروجو به سراغ گرههای از پیش تعیین شده در برنامه میرود. اسکن پس از یافتن مجموع 10 گره پایان مییابد.
-
- ]]>
-
- استفاده از لینک پرداخت
-
- شما مونروجو را با یک لینک پرداخت آغاز کردهاید، برای ارسال وجوه، لطفا این مراحل را انجام دهید:
-
-
- 1. کیف پولی که قصد استفاده از آن را دارید باز کنید
-
- 2. تا زمان همگام شدن کیف پول و ظاهر شدن دکمهٔ «ارسال» منتظر بمانید
-
- 3. دکمهٔ «پرداخت» را لمس کنید
-
-
- جزئیات پرداخت نمایش داده شده، آنها را بررسی کرده و مانند هر تراکنش دیگر ادامه دهید.
-
- تور، در انگلیسی مخفف «روتر پیازی»، یک نرمافزار آزاد و متنباز برای فعالسازی ارتباطات ناشناس در بستر اینترنت است.
-
-
- فعالسازی تور اتصال شما را از 3 رله میگذراند و آدرس IP شما را از گره مخفی خواهد
- کرد. به یاد داشته باشید که این نوع اتصالات در عین خصوصی بودن، کندتر نیز هستند.
-
-
- برای استفاده از تور در مونروجو، شما به نصب بودن Orbot در دستگاه خود نیاز خواهید
- داشت. پس از نصب و راهاندازی Orbot، با کلیک کردن بر روی نماد
-
- در صفحهٔ فهرست کیف پولها، از فعال شدن این قابلیت مطمئن شوید.
-
-
- اگر با اتصال تور مشکلی داشتید، یک هویت جدید را داخل
- برنامهٔ Orbot (با لمس نماد بالا راست صفحه) دریافت کنید.
-
- ]]>
-
- گرهٔ تور
-
- این یک گرهٔ تور است. برای استفاده از آن، باید حالت تور را با لمس نماد
-
- در بالای صفحهٔ فهرست کیف پولها فعال کنید.
-
-
- ]]>
-
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
deleted file mode 100644
index 0e26d93..0000000
--- a/app/src/main/res/values-fa/strings.xml
+++ /dev/null
@@ -1,703 +0,0 @@
-]>
-
- کیف پول
-
- درباره
- خطمشی رازداری
-
- اشتراک گذاری
- راهنمایی
- دریافت
- تغییر نام
- حذف
- پشتیبانگیری
- تغییر عبارت عبور
-
- ادامه بده...
- اوهوم...
- بیخیال، بهتر هم میتونی...
- یه خرده دیگه...
- آره جیگر، مثل یه هکر!
-
- کیف پولها
- دست اندرکاران
- OK
- لغو
- بستن
- اطلاعات بیشتر
-
- با موفقیت ارسال شد
- انجام شد
-
- برای نمایش کد کیوآر لمس کنید
-
- پرداختهای غیر مونرویی فعال شد، برای اطلاعات بیشتر لمس کنید.
- پشتیبانی از لجر فعال شد، برای اطلاعات بیشتر لمس کنید.
-
-
- شما یک آدرس
- %1$s
- وارد کردید.
-
-
- شما با ارسال XMR با استفاده از سرویس
- SideShift.ai
- برای دریافت کننده
- %1$s
- خواهید فرستاد.
-
- ]]>
-
-
- سفارش SideShift.ai
-
-
- %1$s %2$s
-
- در حال تایید
- در حال پرداخت
-
- خطای SideShift.ai
- (%1$s)
-
- %1$s
- ارسال شد!
-
- در حال پرسوجو...
-
-
- شما میتوانید
- %1$s
- را بفرستید
- —
- %2$s %4$s
- .
-
- در حال حاضر
- سرویس
- SideShift.ai
- به شما نرخ تبدیل
- %3$s %4$s/XMR
- را میدهد.
- .
- ]]>
-
-
- موجودی
- %2$s %3$s (%1$s XMR)
-
-
- شناسهٔ پرداخت ادغام شد
- ✔
-
- در حال آمادهسازی تراکنش
-
-
- در حال ساخت تراکنش SideShift.ai
-
-
- در حال پرسوجوی سفارش SideShift.ai
-
- در حال آمادهسازی تراکنش مونرو
-
-
- در حال پرسوجوی پارامترهای SideShift.ai
-
-
-
- خطای SideShift.ai
-
-
- کد:
- %1$d
-
- برای تلاش دوباره لمس کنید
- ما اینجا گیر کردیم!
-
- سرویس SideShift.ai در حال حاضر در دسترس نیست!
-
-
- %1$s %3$s = %2$s XMR
-
- (نرخ:
- %1$s %2$s/XMR)
-
-
- برای پشتیبانی و رهگیری سفارش به SideShift.ai مراجعه کنید
-
-
- کلید خصوصی
- \nSideShift.ai
-
- کلید خصوصی SideShift.ai
-
-
- آدرس مقصد
- %1$s
-
- مقدار
-
- شناسهٔ تراکنش
- آدرس مقصد
- یادداشتها
-
- در حال پشتیبانگیری
- در حال آرشیو کردن
- در حال تغییر نام
- در حال تغییر رمز
-
-
- در حال انجام...
- \n
- این کار ممکن است زمان زیادی طول بکشد!
-
-
- پشتیبانگیری موفق بود
- پشتیبانگیری شکست خورد!
- حذف شکست خورد!
- تغییر نام شکست خورد!
- تغییر رمز شکست خورد!
- رمز عبور تغییر کرد
-
- شبکه
- بارگذاری کیف پول...
- کیف پول ذخیره شد
- ذخیرهٔ کیف پول شکست خورد!
- در حال اتصال...
-
- اتصال گره شکست خورد!
- \n
- نام کاربری و رمز عبور را بررسی کنید
-
- نسخه با گره همخوان نیست، لطفا برنامه را بهروزرسانی کنید!
-
- گره معتبر نیست!
- \n
- یک گرهٔ دیگر را امتحان کنید.
-
-
- به گره نرسیدیم!
- \n
- دوباره تلاش کنید یا گرهای دیگر انتخاب کنید.
-
-
- قطع شد
-
-
- تراکنش شکست خورد:
- %1$s
-
- زمان شما تمام شد!
-
- هنوز با کیف پول قبلی شما مشغول هستم...
-
-
- تغییر نام
- %1$s
-
-
- عبارت عبور جدید برای
- %1$s
-
- عبارت عبور را برای
- %1$s
- تکرار کنید
-
-
- رمز عبور برای
- %1$s
-
- همینطور میتوانید با اثر انگشت کیف پول را باز کنید.
- \n
- لطفا حسگر را لمس کنید.
-
- در حال بازگشایی کیف پول...
- اثر انگشت شناسایی نشد. دوباره امتحان کنید.
- رمز عبور اشتباه است!
-
- رمز عبور ذخیره شده اشتباه است.
- \n
- لطفا رمز عبور را دستی وارد کنید.
-
- کیف پول پیدا نشد!
- گره باید تنظیم شود!
- کیف پول با شبکهٔ بلاکچین انتخاب شده مطابقت ندارد
-
- (فقط مشاهدهای)
-
- دریافت
- ارسال
-
-
- مقدار
- +%1$s XMR
- تایید نشده است
-
-
- سرویس مونروجو
-
- همگام شد:
- بلوک باقی مانده
- در حال اسکن:
-
- حافظهٔ خارجی قابل نوشتن نیست!
- به اجازهٔ دسترسی برای نوشتن در حافظهٔ خارجی نیازمندیم!
- بدون دوربین نمیتوان کدها را اسکن کرد!
-
- کلید مشاهده
- آدرس عمومی
- کلید
- کلید مشاهده کپی شد!
- کلید در حافظه کپی شد!
- آدرس کیف پول کپی شد!
- شناسهٔ تراکنش در حافظه کپی شد!
- کپی به دلایل امنیتی غیرفعال شد!
-
-
- نرخ تبدیل دریافت نشد!
- \n
- دوباره امتحان کنید
-
-
- ساخت کیف پول
- نام کیف پول
- عبارت عبور کیف پول
- اجازه برای بازگشایی کیف پول با اثر انگشت
- احراز با اثر انگشت
-
- با فعال بودن احراز با اثر انگشت میتوانید بدون نیاز به وارد کردن رمز عبور، موجودی کیف پول را دیده و وجوه دریافت کنید.
-
-
- اما برای امنیت بیشتر، مونروجو برای مشاهدهٔ جزئیات کیف پول و ارسال وجوه از شما برای وارد کردن رمز عبور میپرسد.
-
- هشدار امنیتی
-
- در نهایت، مونروجو به شما یادآور میشود که هرکس دسترسی به اثر انگشت شما داشته باشد قابلیت فضولی و مشاهدهٔ موجودی شما را خواهد داشت.
-
-
- برای مثال، شخصی میتواند کیف پول شما را وقتی که خواب هستید باز کند.
-
- برای فعالسازی این قابلیت اطمینان دارید؟
- ]]>
- عبارت عبور تطابق ندارد
- عبارت عبور نمیتواند خالی باشد
- کیف پول را بساز!
- بذر یادآوری را یادداشت کردهام
-
- یک نام برایم بگذار!
- کیف پول از پیش وجود دارد!
- با نقطه نمیتواند شروع شود
- در حال ساخت کیف پول
- کیف پول ساخته شد
-
-
- ارتفاع یا تاریخ میلادی بازیابی
- (YYYY-MM-DD)
- را وارد کنید
-
-
- کلیدها
- جدید
- بذر
- مشاهدهای
-
- آدرس عمومی
- کلید مشاهده
- کلید مصرف
- بذر یادآوری 25 کلمهای
-
- ارتفاع یا تاریخ میلادی بازیابی
- (YYYY-MM-DD)
-
- آدرس عمومی
- کلید مشاهده
- کلید مصرف
- بذر یادآوری
- رمز عبور بازیابی فایلهای کیف پول
-
- یک کلید معتبر وارد کنید
- یک آدرس معتبر وارد کنید
- بذر 25 کلمهای خود را وارد کنید
-
- یادداشتهای خصوصی (اختیاری)
- ساخت
- مونروها رو خرج کن
-
- مونروها رو خرج کن
- (%1$s)
- کد کیوآر نامعتبر
- این کد کیوآر معتبر نیست
- این آدرس معتبر نیست
-
- این آدرس
- OpenAlias
- در دسترس نیست
-
-
- این آدرس
- OpenAlias
- امن است
- ✔
-
-
- بررسی
- OpenAlias...
-
-
- دستیابی به آدرس OpenAlias بدون DNSSEC. آدرس ممکن است جعلی باشد!
-
- ارسال
-
- موجودی:
- %1$s XMR
- آدرس
- مقدار
- تایید
- انجام شد
- مقدار
-
- هزینهٔ تراکنش (XMR)
-
- هزینهٔ تراکنش
- سرجمع (XMR)
- سرجمع
-
- %1$s XMR
- +%1$s
- هزینهٔ تراکنش
-
-
- ساخت خطای تراکنش
-
-
- هزینهٔ تراکنش
- %1$s
- (%1$s)
- شکست خورد
- -%1$s
- +%1$s
-
- زمان
- شناسهٔ تراکنش
- کلید تراکنش
- مقصد
- شناسهٔ پرداخت
- ارتفاع بلوک
- مقدار
- هزینهٔ تراکنش
- انتقال
- یادداشتها
- (اختیاری)
- جزئیات تراکنش
-
- در حال تراکنش
- تراکنش شکست خورد!
-
- مقدار
- توضیحات (اختیاری)
- نمیتوان کیف پول را باز کرد!
-
-
- حداکثر:
- %1$s
- حداقل: صفر
- برای مقدار XMR یک عدد وارد کنید
-
-
- دادههای حساس نمایش داده خواهند شد.
- \n
- مراقب پشت سر خود باشید!
-
- حله!
- بازگشت!
- جزئیات
-
-
- این کیف پول حذف خواهد شد. وجوه شما برای همیشه از بین خواهند رفت مگر اینکه بذر یا فایل پشتیبان برای بازیابی داشته باشید.
-
- آره انجامش بده!
- نه مرسی!
-
- ساخت کیف پول جدید
- بازگردانی کیف پول فقط مشاهدهای
- بازگردانی کیف پول با کلیدهای شخصی
- بازگردانی کیف پول با بذر 25 کلمهای
-
- ساخت حساب
-
- حساب شمارهٔ
- %1$d
- ساخته شد
-
- شمارهٔ حساب
-
- همهٔ وجوه تایید شدهٔ این حساب را بفرست!
- آدرس فرعی
-
- آدرس عمومی شمارهٔ
- %1$d: %2$s
-
-
- زبان
- زبان سیستم
-
-
- بازیابی از Ledger Nano
-
-
- در حال ارتباط با لجر
- تایید در لجر مورد نیاز است!
- در حال بازیابی آدرسهای فرعی
- در حال تایید کلیدها
- انجام عملیاتهای پیچیده
- هش کردن
- لطفا دستگاه لجر را (باز)وصل کنید
-
- در حال ساخت حساب
-
-
- %1$s
- متصل شد
-
-
- %1$s
- جدا شد
-
-
- نوشتن برچسب
- نوشتن برچسب شکست خورد!
- نوشتن برچسب موفق بود
- برچسب از
- NDEF
- پشتیبانی نمیکند
-
-
- برچسب
- %1$d
- بایت فراهم کرد، ولی ما
- %2$d
- بایت نیاز داریم!
-
- من برچسب را متوجه نمیشوم!
- نمیدونم از جونم چی میخوای!
-
- قابلیت
- NFC
- دردسترس است!
-
-
- نمایش اسرار!
- حالت خیابان
-
-
- حالت
- Node-o-matiC
- فعال شد، برای اطلاعات بیشتر لمس کنید.
-
-
- آخرین بهروزرسانی بلوک:
- %1$s
- گرهها
- نام گره (اختیاری)
- دامنه
- پورت
- نام کاربری (اختیاری)
- رمز (اختیاری)
- آدرس پیدا نشد
- الزامی است!
- عددی نیست
- باید بین 1 تا 65535 باشد
- اضافه کردن گره
- برای تازهسازی لمس کنید!
-
- خطای اتصال
- %1$d
- خطای اتصال
- احراز شکست خورد
- نتایح بررسی
-
- ارتفاع:
- %1$s (v%2$d),
- پینگ:
- %3$.0fms,
- آدرس IP:
- %4$s
-
- در حال بررسی IP:
- %1$s ...
- لطفا تا اتمام اسکن صبر کنید
- برای انتخاب یا اضافه کردن گره لمس کنید
- گرهها را به طور دستی وارد کنید یا برای اسکن به پایین بکشید
- در حال اسکن شبکه...
-
- تعداد
- %1$d
- گره به طور خودکار نشانهگذاری شدند
-
- بررسی
-
- گیرنده
-
- همه شو بده!
-
-
- تبدیل بذر لجر
-
- کلمات بذر لجر
- عبارت عبور لجر (پیشرفته)
- بذر لجر نامعتبر!
-
- نوشتن بذر لجر خود در اینجا یک خطر امنیتی بزرگ است!
-
-
- ارتفاع بازیابی
-
-
- برنامهٔ مونرو را روی
- %1$s
- اجرا کنید
-
-
- اسکن دوباره!
-
- متوجه شدم!
- بعدی
- من آماده هستم!
-
- به مونروجو خوش آمدید!
-
- این برنامه به شما امکان میدهد کیف پولهای مونرو را ایجاد و استفاده کنید. میتوانید مونروهای شیرین خود را در آن کیفها ذخیره کنید.
-
- بذر خود را ایمن نگه دارید
-
- این بذر به هرکسی که آن را در اختیار دارد دسترسی کامل میدهد. اگر آن را از دست بدهید، ما نمیتوانیم به شما کمک کنیم آن را بازیابی کنید و مونروهای محبوب خود را از دست می دهید.
-
- هرنوع رمزارز ارسال کنید
-
- مونروجو دارای پشتیبانی داخلی SideShift.ai است. فقط یک آدرس BTC، LTC، ETH، DASH یا DOGE را بچسبانید یا اسکن کنید و با خرج کردن XMR، این رمزارزها را ارسال خواهید کرد (آدرس IP ایران در تحریم است).
-
- گرهها، به میل شما
-
- گرهها شما را به شبکه مونرو متصل میکنند. از بین گرههای عمومی یکی را انتخاب کنید یا با استفاده از گرهٔ خود متصل شوید.
-
- ارسال با اثر انگشت
-
- اکنون می توانید قابلیت ارسال مونرو با اثرانگشت را فعال کنید. برای بازگشت به استفاده از رمز عبور، دسترسی اثر انگشت را غیرفعال کنید.
-
-
- حالت تاریک
-
- خودکار
- روز
- شب
-
-
- هیچ خبری نیست
- \n
- لطفا یک کیف پول بسازید یا بازیابی کنید
-
-
- بازگردانی گرههای پیشفرض
- بازگردانی در حال انجام است...
-
-
- آخرین بلاک:
- %1$d
- ثانیه پیش
-
-
- آخرین بلاک:
- %1$d
- دقیقه پیش
-
-
- آخرین بلاک:
- %1$d
- ساعت پیش
-
-
- آخرین بلاک:
- %1$d
- روز پیش
-
-
- نمیتوان مظنه دریافت کرد
- مقدار را بررسی کرده و دوباره امتحان کنید
-
- آدرس مبهم.
- لطفا یک نوع را از بالا انتخاب کنید
- ]]>
-
- لطفا یک آدرس
- %1$s
- را اسکن یا وارد کنید.
-
- شما به وسیلهٔ سرویس
- SideShift.ai
- با ارسال XMR برای گیرنده
- %2$s
- ارسال خواهید کرد.
-
- ]]>
-
- لطفا یک آدرس مونرو را اسکن یا وارد کنید.
- ]]>
-
- آدرسهای فرعی
- نام آدرس فرعی
-
- آدرسهای استفاده نشده زیاد هستند، از بعضی از آنها استفاده کنید تا بتوانید آدرسهای بیشتر بسازید!
-
-
- حسابهای استفاده نشده زیاد هستند، از بعضی از آنها استفاده کنید تا بتوانید حسابهای بیشتر بسازید!
-
- تراکنشهای این آدرس فرعی:
- هنوز تراکنشی برای این آدرس فرعی وجود ندارد
- یک آدرس فرعی را انتخاب کنید
- برای اطلاعات بیشتر یک مورد را نگه دارید
-
- وارد کردن کیف پول
- وارد کردن شکست خورد!
-
- بازنشانی کیفپول!
-
- این کیف پول بازنشانی و باعث از بین رفتن اطلاعات محلی (مانند یادداشتها، حسابها، نام آدرسهای فرعی، کلیدهای تراکنش و...) خواهد شد!
- فقط
- در زمانی که کیف پول خراب شده و بارگذاری نمیشود این کار را کنید.
-
-
- اتصال به تور لازم است
-
-
- در انتظار گره
-
-
-
- برای استفاده از تور، تنظیمات «اجازه دادن به اجرا در پسزمینه» را در Orbot فعال کنید!
-
-
- قابلیت SideShift.ai از تور پشتیبانی نمیکند. برای تبدیل XMR تور را غیرفعال کنید.
-
-
- رمزگذاری بذر (قابلیت آزمایشی)
- عبارت رمزگذاری بذر (اختیاری)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-fr/about.xml b/app/src/main/res/values-fr/about.xml
deleted file mode 100644
index 78c82cb..0000000
--- a/app/src/main/res/values-fr/about.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
- Fermer
- Je suis monerujo
- Version %1$s (%2$d)
-
- Crédits
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo et al.
-
- monerujo.io
- ]]>
-
- Politique de Confidentialité
-
Cette page vous informe de nos politiques en matière de collecte,
- utilisation et divulgation des informations personnelles que nous
- recevons des utilisateurs de notre application (monerujo: Monero Wallet).
-
-
En utilisant l’application, vous consentez à la collecte et à l’utilisation
- d’informations en accord avec cette politique.
-
-
Données Collectées
-
Une donnée personnelle est tout type de donnée qui est succeptible
- d’identifier un individu.
-
-
Les clefs et adresses publiques Monero collectées sont traitées localement par
- l’application pour le besoin de traitement des transactions et transmises sur le
- réseau Monero sous une forme chiffrée.
-
-
Aucune autre donnée personnelle n’est collectée par l’application.
-
Si vous utilisez la fonction (optionnelle) de change, monerujo récupère le
- taux de change via l’API publique de coinmarketcap.com.
- Consultez leur politique de confidentialité sur https://coinmarketcap.com/privacy
- pour des détails sur la façon dont les données de vos requêtes sont collectées.
-
Si vous utilisez l’application pour payer à une adresse BTC, vous utiliserez
- le service SideShift.ai. Consultez leur politique de confidentialité sur https://sideshift.ai/
- pour plus de détails. Monerujo leur transmet l’adresse de destination BTC et le
- montant. Votre IP serait également collectable.
-
Permissions de l’application
-
-
INTERNET : Connection au réseau Monero via le démon d’un nœud Monero
-
READ_EXTERNAL_STORAGE : Lire les fichiers de portefeuille stockés sur l’appareil
-
WRITE_EXTERNAL_STORAGE : Écrire les fichiers de portefeuille stockés sur l’appareil
-
WAKE_LOCK : Garder l’appareil actif pendant la synchronisation
-
CAMERA : Scanner les QR Codes pour recevoir Monero
-
-
Changements à cette Politique de Confidentialité
-
Nous pourrions avoir besoin de mettre à jour cette politique de confidentialité
- de temps en temps. Nous vous indiquerons tout changement en publiant la nouvelle
- politique de confidentialité dans l’application et sur le site web (www.monerujo.io)
- Il vous est conseillé de contrôler cette Politique de Confidentialité périodiquement
- pour tout changement.
-
Cette Politique de Confidentialité é été mise à jour pour la dernière fois : le
- 10 Novembre 2017.
-
-
Nous contacter
-
Si vous avez des questions à propos de notre politique de confidentialité,
- ou si vos données ont été collectées et traitées,
- merci d’envoyer un e-mail à privacy@monerujo.io.
-
Si vous avez besoin d’une nouvelle adresse Monero !
-
Entrez un nom et un mot de passe unique pour le portefeuille.
- Le mot de passe permet de sécuriser les données de votre portefeuille sur votre appareil.
- Utilisez un mot de passe fort - mieux, utilisez une phrase secrète.
-
Notez votre phrase Mnémonique !
-
Sur l’écran suivant vous trouverez les 25 mots de votre \"Phrase Mnémonique\".
- C’est la seule donnée necessaire pour récupérer votre portefeuille ultérieurement
- et obtenir l’accès à vos fonds.
- Il est très imprtant de la garder sécurisée et confidentielle, car elle donne
- à quiconque le contrôle total de vos fonds !
-
Si vous perdez le mot de passe de votre portefeuille, vous pouvez toujours récupérer votre
- portefeuille avec la phrase Mnémonique.
-
Il n’y a aucun moyen de récupérer votre phrase Mnémonique, si vous la perdez tous vos fonds
- seront perdus ! La phrase Mnémonique ne peut pas non plus être changée, et si elle est dérobée
- ou compromise, vous devrez transférer vos fonds vers un nouveau portefeuille (avec une nouvelle
- phrase Mnémonique). Par conséquent, il vaut mieux que vous sauvegardiez votre phrase Mnémonique
- en l’écrivant et en la conservant à de multiples endroits sécurisés.
Si vous avez déjà une adresse Monero et que vus voulez reécupérer vos transactions depuis la chaïne de blocs !
-
Entrez un nom et un mot de passe unique pour le portefeuille.
- Le mot de passe permet de sécuriser les données de votre portefeuille sur votre appareil.
- Utilisez un mot de passe fort - mieux, utilisez une phrase secrète.
-
Entrez votre phrase Mnémonique dans le champ \"Phrase Mnémonique\".
-
Entrez le numéro du bloc de la première transaction utilisée pour cette adresse dans le
- champ \"Hauteur de restauration\". Vous pouvez également utiliser une date au format AAA-MM-JJ.
- Si vous n\'êtes pas sûr, entrer une date / hauteur de block approximative avant que vous
- n’ayez utilisé cette adresse de portefeuille pour la première fois.
- ]]>
-
- Créer un Portefeuille - Clefs
-
Si vous récupérez votr portefeuille en utilisant vos clefs !
-
Entrez un nom et un mot de passe unique pour le portefeuille.
- Le mot de passe permet de sécuriser les données de votre portefeuille sur votre appareil.
- Utilisez un mot de passe fort - mieux, utilisez une phrase secrète.
-
Entrez votre adresse Monero dans le champ \"Adresse Publique\" et remplissez \"Clef d’Audit\" et \"Clef de dépense\".
-
Entrez le numéro du bloc de la première transaction utilisée pour cette adresse dans le
- champ \"Hauteur de restauration\". Vous pouvez également utiliser une date au format AAA-MM-JJ.
- Si vous n\'êtes pas sûr, entrer une date / hauteur de block approximative avant que vous
- n’ayez utilisé cette adresse de portefeuille pour la première fois.
- ]]>
-
- Créer un Portefeuille d’Audit
-
Si vous voulez suveiller les transaction entrantes sur un portefeuille !
-
Entrez un nom et un mot de passe unique pour le portefeuille.
- Le mot de passe permet de sécuriser les données de votre portefeuille sur votre appareil.
- Utilisez un mot de passe fort - mieux, utilisez une phrase secrète.
-
Entrez votre adresse Monero dans le champ \"Adresse Publique\" et remplissez la \"Clef d’Audit\".
-
Entrez le numéro du bloc de la première transaction utilisée pour cette adresse dans le
- champ \"Hauteur de restauration\". Vous pouvez également utiliser une date au format AAA-MM-JJ.
- Si vous n\'êtes pas sûr, entrer une date / hauteur de block approximative avant que vous
- n’ayez utilisé cette adresse de portefeuille pour la première fois.
- ]]>
-
- Détails du Portefeuille
-
Adresse Publique
- Votre adresse publique est comme votre numéro de compte en banque, vous pouvez la partager avec n’importe qui sans
- craindre de perdre vos Moneroj. On porra envoyer des Moneroj dans votre portefeuille en utilisant cette adresse.
-
Phrase Mnémonique
- C’est la seule donée nécessaire pour récupérer votre portefeuille ultérieurement et obtenir l’accès à
- vos fonds. Il est très imprtant de la garder sécurisée et confidentielle, car elle donne à quiconque
- le contrôle total de vos Moneroj ! Si vous ne l’avez pas écrite à un emplacement sécurisé, faites-le !
-
Mdp de restauration des fichiers du Portefeuille
- Assurez vous de noter ce mot de passe. Si vous réinitialisez votre appareil ou désinstallez l’application,
- vous en aurez besoin pour accéder de nouveau à votre portefeuille.
-
CrAzYpass
- Si le mot de passe affiché ici comporte 52 caractères alphanumériques par groupes de 4 - félicitations !
- Vos fichiers de portefeuille sont sécurisé avec une clef 256 bits généré par les fonctionnalité de
- sécurité de votre appareil sur la base de la phrase secrète que vous avez choisis (lors de la création
- ou en l’ayant changée). Cela le rend êtrèmement difficile à pirater !
- Cette fonctionnalité est obligatoire pour tous les nouveaux portefeuilles.
-
Mot de passe traditionnel
- Si ici vous voyez votre phrase secrète, les fichiers de votre portefeuille ne sont pas aussi sécurisés qu’en
- utilisant un CrAzYpass. Pour y remédier, choisissez simplement \"Changer la phrase secrète\" à partir du menu.
- Après avoir renseigné une nouvelle phrase secrète (voire la même que précédemment) l’application va générer
- un CrAzYpass pour vous et sécuriser les fichiers de votre portefeuille avec. Notez-le !
-
Portefeuilles CrAzYpass
- Si vous avez un jour besoin de réinstaller Monerujo (par exemple après réinitialisation de votre téléphone, ou
- remplacement de celui-ci) ou si vous voulez utiliser vos fichiers de portefeuille sur un appareil différent ou
- un PC, vous devrez utiliser ce Mot de Passe de Restauration adin d’accéder de nouveau à votre portefeuille.
- En choisissant \"Modifier Phrase Secrète\" à partir du menu, vous pouvez choisir une nouvelle phrase secrète.
- Prenez garde, cela génèrera un nouveau Mot de Passe de Restauration. Notez-le !
-
Clef d’Audit
- Votre clef d’Audit peut vous servir à surveiller les transactions entrantes sur votre portefeuille sans autoriser
- la dépense de vos fonds dans votre portefeuille.
-
Clefs de dépense
- Votre clef de dépense permet à quiconque de dépenser les Moneroj associés à votre portefeuille, alors ne la
- communiquez à personne, gardez-la en sécurité comme votre phrase Mnémonique.
- ]]>
-
- Liste des Portefeuilles
-
Nœud
-
Monerujo utilise un nœud distant pour communiquer avec le réseau Monero sans avoir à
- télécharger et stocker une copie complète de la chaîne de bloc. vous pourrez trouver une
- liste de nœud distant populaire ou apprendre comment faire fonctionner votre propre nœud
- distant ici https://moneroworld.com/
-
Monerujo est fourni avec quelques Nœuds distants préenregistrés. Les cinq derniers nœuds utilisé sont sauvegardés.
-
Portefeuilles
-
Ici vous pouvez voir vos Portefeuilles. Ils se trouvent dans le dossier monerujo
- du stockage interne de votre appareil. Vous pouvez utiliser une application d’explorateur
- de fichiers pour les vois. Vous devriez faire des sauvegardes régulières de ce répertoire
- sur un stockage externe au cas où votre appareil exploserait ou serait volé.
-
Sélectionnez un portefeuille à ouvrir ou appuyez sur \"+\" pour en créer un nouveau.
- Ou choisissez l’une des opérations de portefeuille :
-
Détails
-
Affichez les détails du portefeuille, phrase mnémonique & Clefs.
-
Recevoir
-
Faites un QR code pour recevoir des Moneroj.
-
Renommer
-
Renommez le portefeuille. Les sauvegardes ne sont pas renommées.
-
Sauvegarde
-
Faites une copie du portefeuille dans le sous-répertoire backups de monerujo
- remplaçant les copies précédentes s’y trouvant.
-
Archivage
-
Faites une sauvegarde du portefeuille suivi de sa suppression. La copie reste dans le répertoire
- backups. Si vous n’avez plus besoin de vos sauvegardes, vous devriez les supprimer avec
- une application d’explorateur de fichiers ou une application de suppression sécurisée.
- ]]>
-
- Détails de la Transaction
-
Destination
- C’est l’adresse publique du portefeuille auquel vous avez envoyé des Moneroj
-
ID de Paiement
- Vous pouvez utiliser un ID de paiement pour identifier la raison pour laquelle vous avez
- envoyé des Moneroj entre deux parties. C’est totallement privé et optionnel. Il permet par
- exemple à une société de faire concorder votre transaction avec un article que vous avez
- acheté.
-
ID TX
- C’est votre ID de transaction, vous pouvez l’utiliser pour identifier vos transaction masquées
- sur un explorateur de la chaîne de blocs Monero comme https://xmrchain.net/
-
Clef TX (Clef de Transaction)
- C’est la clef privée de votre transaction, conservez là en sécurité car la révéler à un
- tiers révèlerait quelle signature est la votre dans un cercle, et donc rendrait votre
- transaction transparente.
-
Bloc
- C’est le bloc dans lequel votre transaction a été insérée.
- ]]>
-
- Envoyer
-
Adresse de Destinataire
-
C’est l’adresse publique du portefeuille auquel vous allez envoyer des Moneroj, vous pouvez
- la copier/coller, scanner un QR code ou la saisir manuellement. Vérifiez là bien trois fois
- afin de vous assurer que vous n’envoyez pas de pièces à la mauvaise adresse.
-
En complément de l’utilisation d’une adresse XMR, vous pouvez aussi utiliser
-
-
une adresse OpenAlias pour XMR ou BTC
-
une adresse BTC
-
- Notez que l’envoi de BTC est traité à travers le service SideShift.ai (voir https://sideshift.ai pour
- plus de détails). Voir la rubrique sur l’envoi de BTC plus bas.
-
Envoyer des BTC
-
SideShift.ai
-
SideShift.ai est un service tierce-partie qui agit commme un change depuis Monero vers Bitcoin.
- Nous utilisons l’API SideShift.ai pour intégrer les paiements Bitcoin dans Monerujo. Veuillez
- consulter https://sideshift.ai et décidez vous-même si vous souhaitez l’utiliser. L’équipe Monerujo
- n’est pas affiliée à SideShift.ai et ne peut pas vous aider concernant leurs services.
-
Taux de change SideShift.ai
-
Sur l’écran \"Montant\" vous seront indiqué les paramètres actuels du serive SideShift.ai. Cela
- inclus le taux de change actuel, ainsi que les limites BTC hautes et basses. Notez que ce taux
- n’est pas garantit à ce stade.
-
Ordre SideShift.ai
-
Sur l’écran \"Confirmation\", vous verez l’ordre SideShift.ai actuel. Cette ordre est valide pour
- un temps limité - vous pouvez remarquer le compte à rebours sur le bouton \"Dépenser\". Ce taux
- de change peut être différent du taux indicatif de l’écran précédent.
-
Clef Secrète SideShift.ai
-
Comme Monerujo ne traite que le volet Monero de votre transaction, votre clef secrète
- SideShift.ai peut être utilisée pour suivre le volet Bitcoin de votre ordre sur la page d’accueil
- de SideShift.ai.
-
Compte à Rebours SideShift.ai !
-
Une fois que le compte à rebours atteint zéro, vous devrez obtenir un nouveau devis depuis
- SideShift.ai en retournant à l’étape précédente puis en revenant à l’écran \"Confirmation\".
- ]]>
-
- Envoyer des BTC
-
SideShift.ai
-
SideShift.ai est un service tierce-partie qui agit commme un change depuis Monero vers Bitcoin.
- Nous utilisons l’API SideShift.ai pour intégrer les paiements Bitcoin dans Monerujo. Veuillez
- consulter https://sideshift.ai et décidez vous-même si vous souhaitez l’utiliser. L’équipe Monerujo
- n’est pas affiliée à SideShift.ai et ne peut pas vous aider concernant leurs services.
-
Taux de change SideShift.ai
-
Sur l’écran \"Montant\" vous seront indiqué les paramètres actuels du serive SideShift.ai. Cela
- inclus le taux de change actuel, ainsi que les limites BTC hautes et basses. Notez que ce taux
- n’est pas garantit à ce stade.
-
Ordre SideShift.ai
-
Sur l’écran \"Confirmation\", vous verez l’ordre SideShift.ai actuel. Cette ordre est valide pour
- un temps limité - vous pouvez remarquer le compte à rebours sur le bouton \"Dépenser\". Ce taux
- de change peut être différent du taux indicatif de l’écran précédent.
-
Clef Secrète SideShift.ai
-
Comme Monerujo ne traite que le volet Monero de votre transaction, votre clef secrète
- SideShift.ai peut être utilisée pour suivre le volet Bitcoin de votre ordre sur la page d’accueil
- de SideShift.ai.
-
Compte à Rebours SideShift.ai !
-
Une fois que le compte à rebours atteint zéro, vous devrez obtenir un nouveau devis depuis
- SideShift.ai en retournant à l’étape précédente puis en revenant à l’écran \"Confirmation\".
- ]]>
-
- Créer un Portefeuille - Ledger
-
Vous voulez restaurer votre portefeuille depuis votre Ledger Nano S.
-
Vos clefs privées ne quittent jamais votre Ledger, donc vous devrez le connecter
- à chaque fois que vous voudrez accéder à votre portefeuille.
-
Entrez un nom de portefeuille unique et un mot de passe. Le mot de passe est utilisé pour
- sécuriser les données de votre portefeuille sur votre appareil Android. Utilisez un mot de passe
- fort, ou mieux, utilisez une phrase de sécurité.
-
Entrez le numéro du bloc de la première transaction utilisée pour cette adresse dans le
- champ \"Hauteur de restauration\". Vous pouvez également utiliser une date au format AAA-MM-JJ.
- Si vous n\'êtes pas sûr, entrer une date / hauteur de block approximative avant que vous
- n’ayez utilisé cette adresse de portefeuille pour la première fois.
- ]]>
-
- Le Portefeuille
-
Mode Urbain
-
Le mode urbain peut être activé / désactivé dans le menu ou l’icône de la tête de Gunther. Dans
- ce mode, votre solde n’est visible sur aucun écran afin que vous puissiez utiliser votre
- portefeuille en toute sécurité dans la rue, un bar ou autre lieu public. Les transactions
- précédentes sont également masquées. Les nouvelles transactions seront affichées, afin que vous
- puissiez voir que vous avez envoyé ou reçu vos doux Moneroj !
-
Analyse
- Comme Monero aime garder les choses confidentielles, nous devons scanner la chaîne de blocs
- chaque fois que vous ouvrez un portefeuille Monerujo pour voir si de nouveaux Moneroj ont été
- envoyés à votre portefeuille, cela ne stocke sur votre appareil que les informations appartenant
- à votre portefeuille. Parfois cela peut prendre un moment si vous n’avez pas synchronisé depuis
- longtemps.
-
Le Solde
-
Au secours ! Le solde de mon portefeuille a disparu ou est non confirmé !
- Ne paniquez pas ! Lorsque vous envoyez des fonds sur votre portefeuille, une partie de votre
- solde sera temporairement affichée comme non confirmée.
- Cela se produit à cause de la façon dont Monero est échangé sur la chaîne de blocs et du
- fonctionnement de la monnaie dans Monero. Apprenez-en plus à propos de la monnaie dans Monero
- sur https://getmonero.org/fr/resources/moneropedia/change.html
-
Liste des Transactions
-
Une listes des transactions du portefeuille. Dans un portefeuille d’Audit, seules les
- transactions entrantes sont affichées.
- ]]>
-
- Nœuds
-
En résumé
-
Rafraichit la liste de nœuds en faisant glisser vers le bas & met en favoris 3 à 5 nœuds pour permettre à Monerujo
- de choisir le meilleur pour vous !
-
Qu’est-ce qu’un Nœud ?
-
Monerujo utilise un Nœud distant (parfois appelé un Démon) pour communiquer avec
- le réseau Monero sans avoir à télécharger et stocker une copie complète de la
- chaîne de blocs elle-même.
-
Liste de Nœuds
-
Si la liste est vide, vous pouvez soit ajouter de nouveaux nœuds manuellement, ou laisser Monerujo
- scanner le réseau pour vous. Ou les deux. Lire la suite…
-
La liste des nœuds affiche tous les nœuds connus. De plus, l’horodatage
- du dernier bloc connu par chaque nœud est indiqué en dessous du nom du nœud. Une icône
- représenant le comportement de réponse du nœud
- (qui indique le niveau de connectivité à escompter)
- est affiché à coté de chaque nœud.
-
N’importe quel nœud de la liste peut être ajouté aux favoris pour un usage ultérieur.
- Les nœuds qui ne sont pas en favoris seront oubliés.
-
Monerujo choisira le nœud optimal parmi les favoris à chaque fois que vous l’utiliserez.
- Ceci est fait en vérifiant la hauteur de bloc (à quel point le nœud
- est à jour ?) de même que le comportement de réponse (à quelle vitesse le nœud répond aux requêtes ?).
-
La liste est triée selon ces caractéristiques, afin que le nœud le plus haut soit celui que Monerujo
- utilisera tout de suite. Le bas de la liste montrera des nœuds très lents ou indisponibles.
-
Ajouter un Nœud
-
En touchant le bouton "Ajouter un Nœud" en bas, il vous sera demandé
- d’entrer les détails du nœud dans la boite de dialogue suivante.
- L’"Adresse" est le nom d’hôte ou l’adresse IP du nœud - c’est le seul
- champ obligatoire.
- Entrer le "Port" si le nœud ne fonctionne pas sur un port par défaut (p.e. 18089).
- Vous pouvez optionnellement donner un nom au nœud, afin que vous puissiez plus facilement l’identifier plus tard.
- Certains nœud nécessitent des identifiants pour les utiliser. Entrer les nom d’utilisateur &
- mot de passe dans les champs appropriés. Maintenant vous pouvez "Tester" ces paramêtres.
- Le "Résultat du test" indiquera la hauteur de bloc, le temps de réponse et l’adresse IP actuellement utilisée.
- Le résultat pourrait également être une erreur - habituellement car le nom d’hôte fourni n’est
- pas joignable pendant un temps non négligeable, ou que les identifiants sont incorrects.
- Ou la combinaison nom d’hôte/port ne renvoie pas vers un nœud Monero réel !
- Une fois que le test réussit (sans erreur) - vous êtes prêt à appuyer sur "OK" pour sauvegarder &
- mettre ce nœud en favori.
-
Rechercher des Nœuds
-
De plus, vous pouvez rechercher des nœuds sur le réseau. Monerujo va commencer à
- parcourir le réseau à la recherche de nœuds distants sur le port 18089. Il commence par demander à vos
- nœuds en favoris d’autres homologues dans le réseau Monero P2P puis continue
- en demandant leurs homologues à ceux-ci, et ainsi de suite. Si vous n’avez pas de nœuds en favoris
- (ou s’ils ne communiquent pas leurs homologues),
- Monerujo va communiquer directement avec les nœuds d’ensemencement codés en dur dans Monero. La
- recherche s’arrête lorsqu’un total de 10 nœuds distant est récupéré.
- ]]>
-
-
-
- Utiliser un lien de paiement
-
Vous avez démarré monerujo avec un lien de paiement. Afin d’envoyer des fonds, merci de procéder comme suit :
-
- 1. Ouvrez le portefeuille à partir duquel vous souhaitez envoyer des fonds
- 2. Attendez que le portefeuille soit synchronisé & que le bouton "Envoyer" apparaisse
- 3. Taper sur le bouton "Envoyer"
-
-
Les détails du paiement seront remplis. Vérifiez-les et procédez de la même manière que pour toute autre transaction.
- ]]>
-
- Got it!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
deleted file mode 100644
index 8834935..0000000
--- a/app/src/main/res/values-fr/strings.xml
+++ /dev/null
@@ -1,456 +0,0 @@
-
-
- Portefeuille
-
- À Propos
- Politique de Confidentialité
-
- Partage
- Aide
- Recevoir
- Renommer
- Sauvegarder
- Modifier Phrase secrète
-
- Continuez de taper …
- Bof …
- Allez, vous pouvez mieux faire!
- On y arrive …
- Yeah baby, h4ck3r style !
-
- Portefeuilles
- Crédits
- OK
- Annuler
- Fermer
- Plus d\'infos
-
- Envoi réussi
- Fait
-
- Toucher pour le QR Code
-
- Paiement BTC activé, tapez pour plus d\'infos.
- Ledger activé, tapez pour plus d\'infos.
-
- Vous avez entré une adresse %1$s.
- Vous envoyez des XMR et le destinataire recevra des %1$s via le service SideShift.ai.
- ]]>
-
- Ordres SideShift.ai
-
- %1$s %2$s
-
-
- En Attente de Confirmation
- En Attente de Paiement
- Erreur SideShift.ai (%1$s)
- %1$s Envoyé !
- Interrogation …
-
- Vous pouvez envoyer %1$s — %2$s %4$s.
- SideShift.ai vous donne un taux de change de %3$s %4$s/XMRactuellement.
- ]]>
-
- Solde : %2$s %3$s (%1$s XMR)
-
- ✔ ID de Paiement intégré
- Préparation de votre transaction
-
- Création de l\'ordre SideShift.ai
- Interrogation de l\'ordre SideShift.ai
- Préparation de la Transaction Monero
-
- Interrogation des paramètres SideShift.ai
-
- ERREUR SideShift.ai
- Code : %1$d
-
- Touchez pour réessayer
- Maintenant on est coincé ici !
- Oh-oh, SideShift.ai n\'a pas l\'air disponible pour le moment !
-
- %1$s %3$s = %2$s XMR
- (Taux : %1$s %2$s/XMR)
-
- Visitez SideShift.ai pour l\'assistance & le suivi
- Clef Secrète\nSideShift.ai
- Clef Secrète SideShift.ai
- Adresse %1$s Destination
- Montant
-
- ID de Transaction
- Adresse Destination
- Notes
-
- Sauvegarde en cours
- Archivage en cours
- Renommage en cours
- Modification du mot de passe en cours
-
- Remise en ordre …\nCela peut prendre un moment !
-
- Sauvegarde réussie
- Sauvegarde Échouée !
- Renommage Échoué !
- Modification du mot de passe Échouée !
- Modification du mot de passe réussie
-
- Nœud
- Chargement du Portefeuille …
- Portefeuille Sauvegardé
- Sauvegarde du Portefeuille Échouée !
- Connexion …
- Connexion au nœud échouée !\nVérifiez utilisateur/mot de passe
- Nœud invalide !\nEssayez un autre.
- Nœud injoignable !\nEssayez à nouveau ou un autre.
-
- Déconnecté
-
- Transaction échouée : %1$s
-
- Vous avez attendu trop longtemps l\'ami !
-
- Je suis toujours occupé avec votre dernier portefeuille …
-
- Renommer %1$s
-
- Nouvelle Phase secrète pour %1$s
- Répéter la Phase secrète pour %1$s
- Mot de passe pour %1$s
- Vous pouvez également ouvrir le portefeuille avec votre empreinte digitale.\nMerci de toucher le capteur.
- Ouverture du portefeuille …
- Empreinte digitale non reconnue. Résessayez.
- Mot de passe incorrect !
- Mot de passe sauvegardé incorrect.\nVeuillez entrer le mot de passe manuellement.
- Portefeuille inexistant !
- L\'adresse du démon ne peut pas être configurée !
- Portefeuille incompatible avec le réseau sélectionné
-
- (Audit)
-
- Recevoir
- Envoyer
-
- + %1$s XMR non confirmés
-
- Service monerujo
-
- Synchronisé :
- Blocs restant
- Analyse :
-
- Stockage Externe non inscriptible ! Panique !
- On a vraiment besoin de ces permissions de Stockage Externe !
- Pas de camera = Pas de Scan QR !
-
- Clef d\'Audit
- Adresse Publique
- Clef
- Clef d\'audit copiée !
- Clef copiée !
- Adresse du Portefeuille copiée !
- ID de Transaction copié !
- Copie désactivée par sécurité !
-
- Taux de change introuvable !\nUtilisez XMR/XMR ou essayez à nouveau
-
- Créer un Portefeuille
- Nom du Portefeuille
- Mot de Passe du Portefeuille
- Allow to open wallet using fingerprint
- Authentification par empreinte dgitale
-
En activant l\'authentification par empreinte digitale, vous pouvez voir le solde de
- votre portefeuille et recevoir des fonds sans entrer de mot de passe.
-
Mais pour plus de sécurité, monerujo continuera de vous demander votre mot de passe
- lorsque vous afficherez les détails du portefeuille ou enverez des fonds.
- Avertissement de Sécurité
-
Enfin, monerujo vous rappel que quiconque pouvant obtenir votre empreinte digitale
- sera capable de jeter un coup d\'œil au solde de votre portefeuille.
-
Par exemple, un utilisateur malveillant à vos côtés pourrait ouvrir votre portefeuille
- pendant votre sommeil.
- Êtes vous certain de vouloir activer cette fonctionnalité ?
- ]]>
- Phrases secrètes non correspondantes
- La Phrase secrète ne doit pas être vide
- Faites moi un Portefeuille déjà !
- J\'ai noté ces 25 mots !
-
- Donnez-moi un nom !
- Le Portefeuille existe !
- Ne peut pas commencer par .
- Création du Portefeuille
- Portefeuille créé
-
- Entrer un nombre ou une date (YYYY-MM-DD)
-
- Clefs
- Nouveau
- Phrase Mnémonique
- Audit
-
- Adresse Publique
- Clef d\'audit
- Clef de dépense
- Phrase Mnémonique
- Hauteur ou date de restauration (YYYY-MM-DD)
-
- Adresse publique
- Clef d\'audit
- Clef de dépense
- Phrase Mnémonique
- Mdp de restauration des fichiers Portefeuille
-
- Entrez une clef valide
- Entrez une Adresse valide
- Entrez votre phrase Mnémonique
-
- Notes Privées (optionnelles)
- Générer
- Dépenser mes beaux Moneroj
- Dépenser mes beaux Moneroj (%1$s)
- QR Code invalide
- QR code de paiement invalide
- Adresse invalide
- Envoi
- Solde : %1$s XMR
- Adresse
- Montant
- Confirmation
- Terminé
-
- Montant
- Frais (XMR)
- Frais
- Total (XMR)
- Total
-
- %1$s XMR
- +%1$s Frais
-
- Erreur de Création de Transaction
-
- Frais %1$s
- (%1$s)
- Echoué
- - %1$s
- + %1$s
-
- Horodatage
- ID TX
- Clef TX
- Destination
- ID de Paiement
- Bloc
- Montant
- Frais
- Transferts
- Notes
- (optionnelles)
- Détails de la Transaction
-
- EN ATTENTE
- ÉCHOUÉ
-
- Montant
- Ouverture du portefeuille impossible !
-
- Max. %1$s
- Min. 0
- XMR pas un nombre
-
- Des données sensible vont être affichées.\nRegardez autour de vous !
- C\'est bon
- Non merci !
- Détails
-
- Ce portefeuille sera supprimé. Vos fonds seront perdus à jamais, sauf si vous disposez de votre semence ou d\'une sauvegarde fonctionnelle pour les récupérer.
- Oui, procéder !
- Non merci !
-
- Créer un nouveau portefeuille
- Restaurer un portefeuille d\'audit
- Restaurer depuis la clef privée
- Restaurer depuis la phrase mnémonique
-
- Créer un Compte
- Nouveau Compte #%1$d ajouté
- Compte #
-
- Envoyer tous les fonds confirmés sur ce compte !
- Sous-adresse
- Sous-adresse publique #%1$d: %2$s
-
- Restaurer depuis Ledger Nano
-
- Communication avec Ledger
- Confirmation requise sur Ledger !
- Récupération des sous-adresses
- Vérification des clefs
- En cours de calculs crazy
- Trucs de Hachage
- Merci de (re)connecter le Ledger
-
- Création du compte
-
- %1$s connecté
- %1$s déconnecté
-
- Écriture du Tag
- Échec de l\'écriture du Tag !
- Tag écrit avec succès
- le Tag ne supporte pas NDEF !
- Le Tag donne %1$d octets, mais il en faut %2$d !
- Je ne comprend pas le Tag !
- Je ne sais pas ce que vous voulez !
- NFC Disponible !
-
- Langue
- Utiliser la Langue du Système
-
- Description (optionnelle)
-
- Adresse OpenAlias indisponible
- Sécurisé OpenAlias ✔
- Résolution OpenAlias…
- OpenAlias sans DNSSEC - l\'adresse pourrait être usurpée !
-
- Version du Nœud incompatible - merci de mettre à jour !
-
- Montrer les secrets !
- Mode Urbain
-
- Nœud-tomatiC activé, tapez pour plus d\'infos.
- Dernier bloc mis à jour : %1$s
- Nœuds
- Nom du Nœud (Optionnel)
- Nom d\'hôte
- Port
- Nom d\'utilisateur (Optionnel)
- Mot de passe (Optionnel)
- L\'hôte ne peut pas être résolu
- On a besoin de ça !
- Doit être un nombre
- Doit être de 1 à 65535
- Ajouter un Nœud
- Toucher pour raffraichir !
- ERREUR DE CONNEXION %1$d
- ERREUR DE CONNEXION
- ÉCHEC D\'AUTHENTIFICATION
- Résultat du test :
- Hauteur : %1$s (v%2$d), Ping : %3$.0fms, IP : %4$s
- Test de l\'IP : %1$s …
- Patientez jusq\'à la fin de la recherche
- Toucher pour sélectionner ou ajouter des nœuds
- Ajouter des nœuds manuellement ou faire glisser vers le bas pour rechercher
- Recherche de nœuds…
- %1$d meilleurs nœuds mis en favoris automatiquement
- Tester
-
-
- Destinataire
-
- TOTALITÉ!
-
- Convertir mnémonique Ledger
- Phrase mnémonique Ledger
- Mot de passe Ledger (optionnel)
- Phrase mnémonique Ledger invalide !
- Saisir votre phrase mnémonique Ledger ici est un risque majeur de sécurité !
-
- Hauteur de restauration
-
- Start Monero App on %1$s
-
- Rescan!
-
- I get it!
- Next
- I\'m ready!
-
- Welcome to Monerujo!
- This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.
- Keep your seed safe
- The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.
- Send Crypto
- Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.
- Nodes, your way
- Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.
- Send with fingerprint
- You\'re now able to send XMR with just your fingerprint if you enabled it. To request the password, just disable fingerprint access.
-
- Dark Mode
-
- Auto
- Day
- Night
-
- There is nothing here\nPlease create or restore a wallet
-
- Restore default nodes
- Restoring already in progress…
-
- Last Block: %1$d seconds ago
- Last Block: %1$d minutes ago
- Last Block: %1$d hours ago
- Last Block: %1$d days ago
-
- Cannot get quote
- Check amount and try again
-
- Ambiguous address.
- Please select the type above.
- ]]>
-
- Please enter or scan a %1$s address.
- You'll send XMR and the receiver will get %2$s using the SideShift.ai service.
- ]]>
-
- Please enter or scan a Monero address.
- ]]>
-
- Subaddresses
- Subaddress Name
- Too many unused addresses - use some to enable creating more!
- Too many unused accounts - use some to enable creating more!
- Transactions for this subaddress:
- No transactions for this subaddress yet
- Select a subaddress
- Long-press for details
-
- Delete
- Delete failed!
-
- Import wallet
- Import failed!
-
- Reset wallet!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-hu/about.xml b/app/src/main/res/values-hu/about.xml
deleted file mode 100644
index 4720a2a..0000000
--- a/app/src/main/res/values-hu/about.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
- Bezárás
- Monerujo vagyok
- Verzió: %1$s (%2$d)
-
- Készítők
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo et al.
-
Ez az oldal nyújt tájékoztatást az applikációnkat (monerujo: Monero pénztárca)
- használók személyes információinak gyűjtésére, felhasználására és közzétételére
- vonatkozó irányelveinkről.
-
-
Az applikáció használatával elfogadod az ezen irányelveknek megfelelő
- információgyűjtést és azok felhasználását.
-
-
Gyűjtött adatok
-
Személyes adat bármi olyan adat, mely személyazonosításra alkalmas.
-
-
A Monero-kulcsok és a nyilvános címek az applikáció által helyileg kerülnek
- összegyűjtésre és feldolgozásra a tranzakciók lebonyolítása céljából, majd ezek
- titkosított formában kerülnek továbbításra a Monero hálózatába.
-
-
Más személyes adatot nem gyűjt az applikáció.
-
Az átváltási funkció (opcionális) használata esetén a monerujo a coinmarketcap.com
- nyilvános API-ján keresztül kéri le az árfolyamot.
- A kéréseid során történő adatgyűjtés módjával kapcsolatban tekintsd meg az adatvédelmi
- irányelveiket a https://coinmarketcap.com/privacy weboldalon.
-
Ha BTC-címekre való fizetésre használod az applikációt, akkor az SideShift.ai szolgáltatását
- használod. Részletes adatvédelmi irányelveiket a https://sideshift.ai/ weboldalon tekintheted meg.
- A monerujo számukra a kedvezményezett BTC-címet és a küldeni kívánt mennyiséget közli meg,
- ám az IP-címed is begyűjthető.
-
Applikációengedélyek
-
-
INTERNET : csatlakozás a Monero-hálózathoz egy Monero daemon csomóponton keresztül
-
READ_EXTERNAL_STORAGE : az eszközön tárolt tárcafájlok olvasása
-
WRITE_EXTERNAL_STORAGE : az eszközön tárolt tárcafájlok írása
-
WAKE_LOCK : az eszköz ébren tartása szinkronizálás közben
-
CAMERA : QR-kódok beolvasása Monero fogadásához
-
-
Az adatvédelmi irányelvek módosításai
-
Az adatvédelmi irányelveket időnként frissíthetjük. Bármiféle módosításról
- értesíteni fogunk az új adatvédelmi irányelvek applikációban és weboldalon (www.monerujo.io)
- történő közzétételével.
- Javasolt az adatvédelmi irányelvek időközönkénti átolvasása a változásokról való értesülés céljából.
-
Az adatvédelmi irányelvek legutolsó frissítése: 2017. november 10.
-
-
Lépj kapcsolatba velünk
-
Ha bármilyen kérdésed merül fel az adatvédelmi irányelveinkkel vagy az adatok
- gyűjtésével és feldolgozásával kapcsolatban, úgy kérlek, írj e-mailt a privacy@monerujo.io címre.
-
Adj meg egy egyedi tárcanevet és jelszót.
- A jelszó a tárcaadataidnak az eszközön való biztosítására szolgál. Használj erős jelszót, de
- még jobb a jelmondat használata.
-
Jegyezd le a mnemonikus magot!
-
A következő oldalon találod a 25 szóból álló úgynevezett mnemonikus magot.
- Ez az egyetlen adat, mely a tárcád későbbi visszaállításához és a pénzedhez való újbóli hozzáféréshez
- szükséges. Titokban és biztonságban tartása rendkívül fontos, ugyanis ennek ismeretében bárki
- teljes hozzáférést szerezhet a Moneródhoz.
-
Ha elveszted vagy elfeljted a jelszavadat, a tárdád még visszaállítható a mnemonikus mag használatával.
-
A mnemonikus mag visszaállítására nincsen lehetőség, így ennek elvesztése esetén a pénzedet is elveszíted!
- A mnemonikus mag megváltoztatása nem lehetséges, tehét ha azt ellopják vagy más módon veszélyeztetett
- helyezetbe kerül, akkor pénzedet át kell tenned egy új tárcába (melyhez új mnemonikus mag is jár).
- Ebből adódóan tehát a lehető legjobb az, ha biztonsági mentést készítesz a mnemonikus magról, azaz leírod
- és több biztonságos helyre elteszed.
- ]]>
-
- Tárcalétrehozás - mag
-
Ha már van Monero-címed és szeretnéd a tranzakciókat újból betölteni a blokkláncból!
-
Adj meg egy egyedi tárcanevet és jelszót. A jelszó a tárcaadataidnak az eszközön való biztosítására szolgál.
- Használj erős jelszót, de még jobb a jelmondat használata.
-
Add meg a mnemonikus magodat a megfelelő mezőben.
-
Add meg a címhez tartozó első tranzakció blokkszámát a Visszaállítási lánchossz mezőben, de megadhatod dátum
- formátumban (ÉÉÉÉ-HH-NN) is. Ha nem vagy biztos benne, adj meg egy megközelítő dátumot/blokkszámot a tárca első
- használata előttről.
- ]]>
-
- Tárcalétrehozás - kulcsok
-
Ha a kulcsaid használatával állítod vissza a tárcád!
-
Adj meg egy egyedi tárcanevet és jelszót. A jelszó a tárcaadataidnak az eszközön való biztosítására szolgál.
- Használj erős jelszót, de még jobb a jelmondat használata.
-
Add meg a Monero-címed a Nyilvános cím mezőben és töltsd ki a Figyelőkulcs és Költőkulcs mezőket.
-
Add meg a címhez tartozó első tranzakció blokkszámát a Visszaállítási lánchossz mezőben, de megadhatod dátum
- formátumban (ÉÉÉÉ-HH-NN) is. Ha nem vagy biztos benne, adj meg egy megközelítő dátumot/blokkszámot a tárca első
- használata előttről.
- ]]>
-
- Tárcalétrehozás - figyelőtárca
-
Ha csak a tárcába beérkező tranzakciókat szeretnéd figyelemmel követni!
-
Adj meg egy egyedi tárcanevet és jelszót. A jelszó a tárcaadataidnak az eszközön való biztosítására szolgál.
- Használj erős jelszót, de még jobb a jelmondat használata.
-
Add meg a Monero-címed a Nyilvános cím mezőben és töltsd ki a Figyelőkulcs mezőt.
-
Add meg a címhez tartozó első tranzakció blokkszámát a Visszaállítási lánchossz mezőben, de megadhatod dátum
- formátumban (ÉÉÉÉ-HH-NN) is. Ha nem vagy biztos benne, adj meg egy megközelítő dátumot/blokkszámot a tárca első
- használata előttről.
- ]]>
-
- Tárcarészletek
-
Nyilvános cím
- A nyilvános címed olyan, mint a bankszámlaszámod: megoszthatod bárkivel, nem kell félned attól,
- hogy elvész a Moneród. Mások ezen cím használatával tudnak neked Monerót küldeni.
-
Mnemonikus mag
- Ez az egyetlen adat, mely a tárcád későbbi visszaállításához és a pénzedhez való újbóli hozzáféréshez
- szükséges. Titokban és biztonságban tartása rendkívül fontos, ugyanis ennek ismeretében bárki
- teljes hozzáférést szerezhet a Moneródhoz. Ha még nem jegyezted le valami biztonságos helyre, úgy kérlek,
- ezt tedd meg most!
-
Tárcafájl-visszaállító jelszó
- Mindenképpen írd le ezt a jelszót. Ha visszaállítod az eszközöd vagy eltávolítod az applikációt, akkor
- erre a jelszóra lesz szükséged a tárcád újbóli eléréséhez.
-
CrAzYpass
- Ha az itt megjelenített jelszó 52 darab alfanumerikus karakter négyes csoportokba szervezve - gratulálunk!
- A tárcafájljaid biztosítva vannak egy, az eszközöd által generált 256-bites kulccsal a tárca létrehozásakor
- vagy jelszómódosításkor választott jelszó alapján. A tárca feltörése ezáltal igen nehézzé válik.
- Ez a szolgáltatás minden újonnan létrehozott tárca esetén kötelező.
-
Hagyatéki jelszó
- Ha látod itt a jelszavadat, akkor a tárcafájljaid nincsenek olyan biztonságban, mint a CrAzYpass
- használata esetén. Ennek megoldására egyszerűen csak válaszd ki a Jelszómódosítás menüpontot. Egy
- új jelszó megadása (ami akár a korábbival megegyező is lehet) esetén az applikáció generálni fog
- számodra egy CrAzYpass-t, majd azzal biztosítani fogja a tárcafájljaid. Írd le!
-
CrAzYpass-os tárcák
- Ha bármikor szükségessé válik a monerujo újratelepítése (például gyári állapo visszaállítása vagy
- telefoncsere esetén) vagy tárcafájljaidat egy másik eszközön, esetleg számítógépen szeretnéd használni,
- akkor ezt a visszaállító jelszót kell használnod a tárcád újbóli eléréséhez.
- A Jelszómódosítás menüpontban másik jelszót választhatsz, ám légy figyelmes, ugyanis ez új visszaállító
- jelszó generálásához is vezet. Írd le!
-
Figyelőkulcs
- A figyelőkulcsod (view key) használható a beérkező tranzakciók megfigyelésére anélkül, hogy felhatalmazást
- adnál a tárcádban található pénzösszeg elköltésére.
-
Költőkulcs
- A költőkulcsod (spend key) lehetővé teszi a tárcádban található Monero elköltését, így ezen kulcsot
- tartsd titokban csakúgy, mint a mnemonikus magot.
- ]]>
-
- Tárcalista
-
Csomópont
-
A monerujo távoli csomópontot használ a Monero-hálózattal való kommunikációhoz, így nem
- kell az egész blokklánc egy másolatát letölteni és tárolni. A népszerű távoli csomópontokról
- és a saját csomópont futtatásáról a https://moneroworld.com weboldalon olvashatsz.
-
A monerujo tartalmaz néhány előbeállított távoli csomópontot. Megjegyzésre az utolsó öt
- használt csomópont kerül.
-
Tárcák
-
Itt láthatod a tárcáidat. Helyileg az eszközöd belső tárhelyén, a monerujo
- mappában találhatók, és egy fájlkezelő használatával ezeket könnyedén meg is találhatod.
- Időközönként csinálj biztonsági mentést erről a mappáról egy külső tárolóra arra az esetre,
- ha az eszközöd tönkremenne, esetleg ellopnák azt.
-
Válassz egy tárcát megnyitásra vagy koppints a „+” gombra új létrehozásához.
- Esetleg használd az alábbi műveletek valamelyikét:
-
Részletek
-
Tárca részleteinek, valamint a mnemonikus mag és kulcsok mutatása.
-
Fogadás
-
QR-kód létrehozása Monero fogadására.
-
Átnevezés
-
Tárca átnevezése. A biztonsági mentések nem kerülnek átnevezésre.
-
Biztonsági mentés
-
Másolat készítése a tárcáról a monerujo alatt található backups
- mappán belül. A korábbi másolatok felülírásra kerülnek.
-
Archiválás
-
Biztonsági mentés készítése a tárcáról, majd annak ezt követő törlése. A másolat a
- backups mappában marad. Ha már nincsen szükséged a biztonsági mentéseidre, töröld
- azokat egy fájlkezelő vagy biztonságos tisztítóapplikáció használatával.
- ]]>
-
- Tranzakciórészletek
-
Kedvezményezett címe
- A tárca nyilvános címe, melyre Monerót küldtél.
-
Fizetési azonosító
- Fizetési azonosítót (Payment ID) használhatsz arra a célra, hogy beazonosítsd, miért történt
- tranzakció két fél között. Ez teljes mértékben opcionális és privát. A fizetési azonosító például
- lehetővé teszi egy üzlet számára a tranzakciód és a megvásárolt tételed összeegyeztetését.
-
Tranzakcióazonosító
- A tranzakcióazonosítód (TX ID) szolgál arra, hogy a titkosított tranzakciódat azonosítani tudd
- egy blokkkeresőben, mint például a https://xmrchain.net/.
-
Tranzakciókulcs
- Ez a tranzakciós privát kulcsod (TX KEY). Tartsd biztonságban, ugyanis harmadik félnek való megmutatása
- felfedi, hogy egy gyűrűn belül melyik aláírás a tiéd, ezáltal nyílttá téve a tranzakciódat.
-
Blokk
- A blokk, melybe a tranzakciód került.
- ]]>
-
- Küldés
-
Kedvezményezett címe
-
Azon tárca nyilvános címe, melyre Monerót küldesz. Begépelhető kézileg, de akár vágólapról vagy
- QR-kódból is beilleszthető. Többször is ellenőrizd, hogy biztosan jó címre utalsz-e.
-
In addition to using an XMR address, you can also use
-
-
an OpenAlias for XMR or BTC
-
a BTC address
-
- Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai
- for details). See the section on sending BTC below.
-
BTC-küldés
-
SideShift.ai
-
Az SideShift.ai egy harmadik féltől származó szolgáltatás, mely Moneróról Bitcoinra való átváltóként
- viselkedik. Az SideShift.ai API-ját használjuk a Bitcoinban való fizetés monerujóba való integrálásához.
- Kérlek, látogass el a https://sideshift.ai weboldalra, és döntsd el magad, hogy szeretnéd-e használni.
- A monerujo csapata nincsen kapcsolatban az SideShift.ai-val és nem tudnak segítséget nyújtani a
- szolgáltatásaikkal kapcsolatban.
-
SideShift.ai árfolyam
-
A Mennyiség oldalon kerülnek megjelenítésre az SideShift.ai szolgáltatás paraméterei. Ez magában
- foglalja az aktuális árfolyamot, valamint a BTC alsó és felső határértékeit. Vedd figyelembe,
- hogy ez az árfolyam ekkor még nem garantált.
-
SideShift.ai megrendelés
-
A Megerősítés oldalon láthatod a tényleges megrendelést. A megrendelés korlátozott ideig
- érvényes - láthatod a visszaszámlálást a Küldés gombon. Az árfolyam különbözhet a korábbi képernyőkön
- látottaktól.
-
SideShift.ai titkos kulcs
-
Mivel a monerujo csak a tranzakciód Monero részét kezeli, így az SideShift.ai titkos kulcsod
- használható a megrendelésed Bitcoin részének nyomonkövetésére az SideShift.ai kezdőlapján.
-
SideShift.ai visszaszámlálás!
-
Amint a visszaszámlálás eléri a nullát, új ajánlatot kell kérned az SideShift.ai-tól azáltal, hogy
- visszamész az előző lépésre, majd visszajössz a Megerősítés oldalra.
- ]]>
-
- BTC-küldés
-
SideShift.ai
-
Az SideShift.ai egy harmadik féltől származó szolgáltatás, mely Moneróról Bitcoinra való átváltóként
- viselkedik. Az SideShift.ai API-ját használjuk a Bitcoinban való fizetés monerujóba való integrálásához.
- Kérlek, látogass el a https://sideshift.ai weboldalra, és döntsd el magad, hogy szeretnéd-e használni.
- A monerujo csapata nincsen kapcsolatban az SideShift.ai-val és nem tudnak segítséget nyújtani a
- szolgáltatásaikkal kapcsolatban.
-
SideShift.ai árfolyam
-
A Mennyiség oldalon kerülnek megjelenítésre az SideShift.ai szolgáltatás paraméterei. Ez magában
- foglalja az aktuális árfolyamot, valamint a BTC alsó és felső határértékeit. Vedd figyelembe,
- hogy ez az árfolyam ekkor még nem garantált.
-
SideShift.ai megrendelés
-
A Megerősítés oldalon láthatod a tényleges megrendelést. A megrendelés korlátozott ideig
- érvényes - láthatod a visszaszámlálást a Küldés gombon. Az árfolyam különbözhet a korábbi képernyőkön
- látottaktól.
-
SideShift.ai titkos kulcs
-
Mivel a monerujo csak a tranzakciód Monero részét kezeli, így az SideShift.ai titkos kulcsod
- használható a megrendelésed Bitcoin részének nyomonkövetésére az SideShift.ai kezdőlapján.
-
SideShift.ai visszaszámlálás!
-
Amint a visszaszámlálás eléri a nullát, új ajánlatot kell kérned az SideShift.ai-tól azáltal, hogy
- visszamész az előző lépésre, majd visszajössz a Megerősítés oldalra.
- ]]>
-
- Tárcalétrehozás - Ledger
-
Ha a Ledger Nano S eszközödről szeretenéd visszaállítani a tárcád.
-
A titkos kulcsaid mindig a Ledgeren maradnak, így azt mindig csatlakoztatnod kell,
- ha hozzá szeretnél férni a tárcádhoz.
-
Adj meg egy egyedi tárcanevet és jelszót. A jelszó a tárcaadataidnak az eszközön való biztosítására szolgál.
- Használj erős jelszót, de még jobb a jelmondat használata.
-
Add meg a címhez tartozó első tranzakció blokkszámát a Visszaállítási lánchossz mezőben, de megadhatod dátum
- formátumban (ÉÉÉÉ-HH-NN) is. Ha nem vagy biztos benne, adj meg egy megközelítő dátumot/blokkszámot a tárca első
- használata előttről.
- ]]>
-
- A tárca
-
Street Mode
-
Street mode can be enabled/disabled in the menu or Gunther\'s head icon. In this mode, your
- balance is not shown on any screen so you can safely use your wallet on the street, a pub or
- other public place. Previous transactions are also hidden. New transactions will be shown, so
- you can see that you have sent/received sweet Moneroj!
-
Beolvasás
- Mivel a Monero szereti titokban tartani a dolgokat, így a monerujo-tárca minden egyes megnyitásakor
- beolvasásra kerül a blokklánc, hogy megnézzük, került-e a tárcádba Monero. Ez csakis olyan információt
- tárol a telefonodon, mely a tárcádhoz tartozik. Ha már hosszú ideje nem szinkronizáltál, a művelet
- eltarthat egy ideig.
-
Az egyenleg
-
Segítség! A tárcaegyenlegem eltűnt vagy függőben van!
- Ne pánikolj! Amikor pénzt küldesz a tárcádból, az egyenleged egy része átmenetileg függőként
- fog megjelenni.
- Ez a Monero blokkláncon való kicserélődési módjának és a visszajáró kezelésének eredményeképp van.
- Erről részletesen a https://getmonero.org/resources/moneropedia/change.html weboldalon olvashatsz.
-
Tranzakciólista
-
A tárcához tartozó tranzakciók listája. A csak megtekintésre szolgáló tárcák esetében kizárólag
- a bejövő tranzakciók kerülnek megjelenítésre.
- ]]>
-
- Nodes
-
TL;DR
-
Refresh the nodes list by pulling down & bookmark 3–5 nodes to allow Monerujo
- to choose the best one for you!
-
What's a Node?
-
Monerujo uses a Remote Node (sometimes also called Daemon) to communicate with
- the Monero Network without having to download and store a copy of the
- whole blockchain itself.
-
Node List
-
If the list is empty, you can either add new nodes manually or let Monerujo
- scan the network for you. Or both. Read on…
-
The node list shows all currently known nodes. Additionally, the timestamp
- of the latest block known to each node is shown under the node name. An icon
- representing the node's response behaviour
- (which indicates the level of connectivity to be expected)
- is shown next to each node.
-
Any node in the list can be bookmarked for later use.
- Nodes which are not bookmarked will be forgotten.
-
Monerujo will choose the optimal bookmarked node each time you use it.
- It does this by checking the blockheight (how up-to-date
- is the node?) as well as the response behaviour (how fast does the node respond to requests?).
-
The list is sorted by these characteristics, so the top node would be the one Monerujo
- would choose right now. The bottom of the list would show very slow or unavailable nodes.
-
Add a Node
-
By touching the "Add Node" button at the bottom, you will be asked to
- enter the node details in the following dialog.
- The "Address" is the hostname or IP-address of the node - this is the only
- mandatory entry.
- Enter the "Port" if the node runs on a non-default port (e.g. 18089).
- You can also optionally name the node, so you can identify it easier later on.
- Some nodes require credentials to use them. Enter the provided username &
- password in the appropriate fields. Now you can "Test" these setting.
- The "Test Results" will display the blockheight, response time and actual IP used.
- The result may also be an error - usually because the hostname provided is
- not reachable in a sensible amount of time or the credentials are incorrect.
- Or the hostname/port combination does not point to an actual Monero Node!
- Once the test passes (no error) - you're set to press "OK" to save &
- bookmark this node.
-
Scan for Nodes
-
Additionally, you can scan the network for nodes. Monerujo will start
- scanning the network for Remote Nodes on port 18089. It begins by asking your
- bookmarked nodes for other peers in the Monero P2P network and then continues
- by asking those for their peers, and so on. If you have no bookmarked nodes
- (or they don't tell us about their peers),
- Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
- scan stops when it finds 10 remote nodes in total.
- ]]>
-
-
-
- Using a payment link
-
You have started monerujo with a payment link. In order to send funds, please do the following:
-
- 1. Open the wallet you want to spend from
- 2. Wait until the wallet is synced & the "Give" button appears
- 3. Touch the "Give" button
-
-
The payment details will be filled in. Check them and proceed like for any other transaction.
- ]]>
-
- Got it!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
deleted file mode 100644
index dfdd5eb..0000000
--- a/app/src/main/res/values-hu/strings.xml
+++ /dev/null
@@ -1,454 +0,0 @@
-
-
- Tárca
-
- Névjegy
- Adatvédelem
-
- Megosztás
- Segítség
- Fogadás
- Átnevezés
- Biztonsági mentés
- Jelszómódosítás
-
- Folytasd a gépelést…
- Ehh…
- Gyerünk, tudsz ennél jobbat!
- Alakul…
- Ez igen, h4ck3r stílus!
-
- Tárcák
- Készítők
- OK
- Mégsem
- Bezárás
- Részletes információk
-
- Sikeresen elküldve
- Kész
-
- Koppints a QR-kódért
-
- BTC fizetés engedélyezve, koppints ide a részletekért.
- Ledger engedélyezve, koppints ide a részletekért
-
- %1$s-címet adtál meg.
- XMR-t fogsz küldeni, a fogadó pedig %1$s-t fog kapni az SideShift.ai szolgáltatásán keresztül.
- ]]>
-
- SideShift.ai megrendelés
-
- %1$s %2$s
-
- Megerősítés folyamatban
- Kifizetés folyamatban
- SideShift.ai-hiba (%1$s)
- %1$s elküldve!
- Lekérdezés…
-
- Elküldhetsz: %1$s — %2$s %4$s.
- Az SideShift.aiaktuális árfolyama: %3$s %4$s/XMR.
- ]]>
-
- Egyenleg: %2$s %3$s (%1$s XMR)
-
- ✔ Fizetési azonosító integrálva
- Tranzakció előkészítése
-
- SideShift.ai megrendelés létrehozása
- SideShift.ai megrendelés lekérdezése
- Monero-tranzakció előkészítése
-
- SideShift.ai paraméterek lekérdezése
-
- SideShift.ai HIBA
- Kód: %1$d
-
- Koppints az újrapróbálkozáshoz
- Itt most elakadtunk!
- Ajjaj! Úgy néz ki, az SideShift.ai most nem elérhető!
-
- %1$s %3$s = %2$s XMR
- (Arány: %1$s %2$s/XMR)
-
- Segítségért és nyomonkövetésért látogass el az SideShift.ai weboldalra
- Titkos kulcs\nSideShift.ai
- SideShift.ai titkos kulcs
- Kedvezményezett %1$s-címe
- Mennyiség
-
- Tranzakcióazonosító
- Kedvezményezett címe
- Közlemény
-
- Biztonsági mentés folyamatban
- Archiválás folyamatban
- Átnevezés folyamatban
- Jelszómódosítás folyamatban
-
- Műveletek befejezése…\nEz eltarthat egy ideig!
-
- Sikertelen biztonsági mentés!
- Sikertelen átnevezés!
- Sikertelen jelszómódosítás!
- Jelszó megváltoztatva
-
- Csomópont
- Tárca betöltése…
- Tárca mentve
- Sikertelen mentés!
- Kapcsolódás…
- Sikertelen kapcsolódás.\nEllenőrizd a felhasználónevet és jelszót.
- Érvénytelen csomópont!\nPróbálkozz egy másikkal.
- Nem lehet elérni a csomópontot!\nPróbáld újra vagy próbálkozz egy másikkal.
-
- Szétkapcsolva
-
- Sikertelen tranzakció: %1$s
-
- Túl sokat vártál, barátom!
-
- Még az előző tárcáddal vagyok elfoglalva…
-
- %1$s átnevezése
-
- A(z) %1$s tárca új jelszava
- Ismételd meg a(z) %1$s tárca új jelszavát
- A(z) %1$s tárca jelszava
- Ujjlenyomattal is megnyithatod a tárcát.\nKérlek, érintsd meg a szenzort.
- Tárca megnyitása…
- Az ujjlenyomat nem felismerhető. Próbáld újra.
- Helytelen jelszó!
- Az elmentett jelszó helytelen.\nKérlek, add meg a jelszót manuálisan.
- A tárca nem létezik!
- A daemon címét meg kell adni!
- A tárcához nem a megfelelő hálózat van kiválasztva
-
- (csak megtekintés)
-
- Fogadás
- Küldés
-
- + %1$s XMR függőben
-
- monerujo szolgáltatás
-
- Szinkronizálva:
- blokk van hátra
- Beolvasás:
-
- A külső tárhely nem írható! Pánik!
- Nagyon szükségünk van a külső tárhely engedélyeire!
- Ha nincs kamera, nincs QR-kód beolvasás sem!
-
- Figyelőkulcs
- Nyilvános cím
- Kulcs
- Figyelőkulcs vágólapra másolva!
- Kulcs vágólapra másolva!
- Tárcacím vágólapra másolva!
- Tranzakcióazonosító vágólapra másolva!
- A másolás biztonsági okokból tiltásra került!
-
- Nem sikerült az árfolyam lekérése!\nHasználj XMR/XMR-t vagy próbáld újra
-
- Tárcalétrehozás
- Tárca neve
- Tárca jelszava
- Tárca ujjlenyomattal való megnyitásának engedélyezése
- Ujjlenyomat-azonosítás
-
Az ujjlenyomat-azonosítás engedélyezésével jelszó megadása nélkül tekintheted meg a
- tárcaegyenleget és fogadhatsz pénzösszegeket.
-
A további biztonság érdekében ugyanakkor a monerujo továbbra is jelszót fog kérni a
- tárca részletes adatainak megtekintése és a pénzküldés esetén.
- Biztonsági figyelmeztetés
-
A monerujo felhívja a figyelmed arra, hogy az ujjlenyomatoddal rendelkező személy(ek)
- megtekinthetik a tárcaegyenleged.
-
Egy rosszhiszemű személy például megnyithatja a tárcádat míg te alszol.
- Biztosan engedélyezni szeretnéd ezt a funckiót?
- ]]>
- A jelszavak nem egyeznek
- A jelszó nem lehet üres
- Legyen kész a tárcám!
- Lejegyeztem a mnemonikus magot
-
- Nevezz el!
- Már létezik ez a tárca!
- Nem kezdődhet ponttal.
- Tárca létrehozása
- Tárca létrehozva
-
- Számot vagy dátumot (ÉÉÉÉ-HH-NN) adj meg
-
- Kulcsok
- Új
- Mag
- Figyelőtárca
-
- Nyilvános cím
- Figyelőkulcs
- Költőkulcs
- 25 szavas mnemonikus mag
- Visszaállítási lánchossz vagy dátum (ÉÉÉÉ-HH-NN)
-
- Nyilvános cím
- Figyelőkulcs
- Költőkulcs
- Mnemonikus mag
- Tárcafájl-visszaállító jelszó
-
- Adj meg egy valós kulcsot
- Adj meg egy valós címet
- Add meg a 25 szavas magod
-
- Privát közlemény (opcionális)
- Generálás
- Édes, drága Monero elköltése
- Édes, drága Monero elköltése (%1$s)
- Ez nem egy QR-kód
- Érvénytelen cím
- Érvénytelen QR-kód
- Küldés
- Egyenleg: %1$s XMR
- Cím
- Mennyiség
- Megerősítés
- Kész
-
- Mennyiség
- Díj (XMR)
- Díj
- Összesen (XMR)
- Összesen
-
- %1$s XMR
- +%1$s díj
-
- Tranzakciólétrehozási hiba
-
- %1$s díj
- (%1$s)
- sikertelen
- - %1$s
- + %1$s
-
- Időbélyeg
- Tranzakcióazonosító
- Tranzkaciós kulcs
- Cél
- Fizetési azonosító
- Blokk
- Mennyiség
- Díj
- Transzferek
- Közlemény
- (opcionális)
- Tranzakciórészletek
-
- FÜGGŐBEN
- SIKERTELEN
-
- Mennyiség
- Nem sikerült megnyitni a tárcát!
-
- Max. %1$s
- Min. 0
- XMR nem egy szám
-
- Bizalmas adatok kerülnek megjelenítésre.\nBizonyosodj meg róla, hogy más nem látja!
- Mehet
- Inkább ne!
- Részletek
-
- Igen, mehet!
- Inkább ne!
-
- Új tárca létrehozása
- Figyelőtárca visszaállítása
- Visszaállítás privát kulcsokkal
- Visszaállítás mnemonikus maggal
-
- Számla létrehozása
- Új számla hozzáadva (#%1$d)
- Számla #
-
- Teljes megerősített egyenleg küldése!
- Alcím
- Nyilvános alcím #%1$d: %2$s
-
- Nyelv
- Rendszernyelv használata
-
- Visszaállítás Ledger Nano-ről
-
- Kommunikáció a Ledgerrel
- Ledgeren való megerősítés szükséges!
- Alcímek visszakeresése
- Kulcsok ellenőrzése
- Őrült matekozás
- Dolgok hash-elése
- Csatlakoztasd (újra) a Ledgert
-
- Számla létrehozása
-
- %1$s csatlakoztatva
- %1$s leválasztva
-
- Címke írása
- Sikertelen címkeírás!
- Sikeres címkeírás
- A címke nem támogatja az NDEF-et!
- A címke %1$d byte-os, de %2$d kellene!
- Nem értem a címkét!
- Nem tudom, mit akarsz!
- NFC elérhető!
-
- Description (optional)
-
- OpenAlias address not available
- OpenAlias secure ✔
- Resolving OpenAlias…
- OpenAlias without DNSSEC - address may be spoofed
-
- Node version incompatible - please upgrade!
-
- Részletek
- Street Mode
-
- Node-o-matiC enabled, tap for more info.
- Last block updated: %1$s
- Nodes
- Node Name (Optional)
- Hostname
- Port
- Username (Optional)
- Password (Optional)
- Cannot resolve host
- We need this!
- Must be numeric
- Must be 1–65535
- Add Node
- Touch to refresh!
- CONNECTION ERROR %1$d
- CONNECTION ERROR
- AUTHENTICATION FAILED
- Test Result:
- Height: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- Testing IP: %1$s …
- Please wait for scan to finish
- Touch to select or add nodes
- Add nodes manually or pull down to scan
- Scanning network…
- Automatically bookmarked best %1$d nodes
- Test
-
- Backup successful
-
- Receiver
-
- EVERYTHING!
-
- Convert Ledger Seed
- Ledger Seed Words
- Ledger Passphrase (optional)
- Invalid Ledger Seed!
- Entering your Ledger Seed here is a major security risk!
-
- Visszaállítási lánchossz
-
- Start Monero App on %1$s
-
- Rescan!
-
- I get it!
- Next
- I\'m ready!
-
- Welcome to Monerujo!
- This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.
- Keep your seed safe
- The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.
- Send Crypto
- Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.
- Nodes, your way
- Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.
- Send with fingerprint
- You\'re now able to send XMR with just your fingerprint if you enabled it. To request the password, just disable fingerprint access.
-
- Dark Mode
-
- Auto
- Day
- Night
-
- There is nothing here\nPlease create or restore a wallet
-
- Restore default nodes
- Restoring already in progress…
-
- Last Block: %1$d seconds ago
- Last Block: %1$d minutes ago
- Last Block: %1$d hours ago
- Last Block: %1$d days ago
-
- Cannot get quote
- Check amount and try again
-
- Ambiguous address.
- Please select the type above.
- ]]>
-
- Please enter or scan a %1$s address.
- You'll send XMR and the receiver will get %2$s using the SideShift.ai service.
- ]]>
-
- Please enter or scan a Monero address.
- ]]>
-
- Subaddresses
- Subaddress Name
- Too many unused addresses - use some to enable creating more!
- Too many unused accounts - use some to enable creating more!
- Transactions for this subaddress:
- No transactions for this subaddress yet
- Select a subaddress
- Long-press for details
-
- This wallet will be deleted. Your funds will be gone forever unless you have your seed or a working backup to recover it.
- Delete
- Delete failed!
-
- Import wallet
- Import failed!
-
- Reset wallet!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-it/about.xml b/app/src/main/res/values-it/about.xml
deleted file mode 100644
index 63e3d31..0000000
--- a/app/src/main/res/values-it/about.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
- Chiudi
- Io sono monerujo
- Versione %1$s (%2$d)
-
- Crediti
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo et al.
-
Questa pagina ti informa sulla nostra politica riguardante la raccolta, l\'utilizzo e la rivelazione di informazioni personali che riceviamo dagli utenti della nostra app (monerujo: Portafoglio Monero).
-
-
Usando questa app, acconsenti alla raccolta e all\'utilizzo delle informazioni in accordo con questa politica.
-
-
Dati raccolti
-
Per "dato personale" si intende ogni tipo di dato grazie al quale è possibile identificare un individuo.
-
-
Le chiavi e gli indirizzi pubblici di Monero vengono raccolti e processati dall\'app localmente con lo scopo di processare le transazioni e vengono trasmessi all\'interno della rete Monero in modo cifrato.
-
-
Altri dati personali non sono raccolti dall\'app.
-
Se usi la funzionalità (opzionale) del cambio, monerujo recupera il tasso di cambio attraverso le API pubbliche di coinmarketcap.com.
- Controlla la loro politica per la privacy (in lingua inglese) su https://coinmarketcap.com/privacy per conoscere i dettagli su come vengono raccolti i dati nelle tue richieste.
-
Se utilizzi l\'app per effettuare pagamenti ad indirizzi BTC, stai usando il servizio SideShift.ai.
- Controlla la loro politica per la privacy (in lingua inglese) su https://sideshift.ai/ per conoscere i dettagli. Monerujo invia a loro l\'indirizzo di destinazione BTC e l\'ammontare della transazione. Anche il tuo IP potrebbe essere raccolto.
-
Permessi app
-
-
INTERNET : Connessione alla rete Monero attraverso un nodo
-
READ_EXTERNAL_STORAGE : Legge i file di portafoglio salvati all\'interno del dispositivo
-
WRITE_EXTERNAL_STORAGE : Scrive i file di portafoglio salvati all\'interno del dispositivo
-
WAKE_LOCK : Tiene il dispositivo sveglio durante la sincronizzazione
-
CAMERA : Scansione codici QR di indirizzi Monero
-
-
Modifica a questa Politica per la Privacy
-
Potremmo aggiorare questa politica per la privacy di volta in volta. Ti invieremo una notifica su ciò che è cambiato pubblicando la nuova politica per la privacy all\'interno dell\'app e sul sito (www.monerujo.io)
- Sei invitato a rivedere periodicamente questa politica per la privacy per controllarne i cambiamenti.
-
Questa politica per la privacy è stata aggiornata il 10 novembre 2017.
-
-
Contattaci
-
Se hai dubbi o domande sulla nostra politica per la privacy, oppure su come i tuoi dati vengono raccolti e processati, contattaci all\'indirizzo email privacy@monerujo.io.
-
- ]]>
-
diff --git a/app/src/main/res/values-it/help.xml b/app/src/main/res/values-it/help.xml
deleted file mode 100644
index 84e772f..0000000
--- a/app/src/main/res/values-it/help.xml
+++ /dev/null
@@ -1,319 +0,0 @@
-
-
- Crea un portafoglio - Nuovo
-
Se hai bisogno di un nuovo indirizzo Monero!
-
Inserisci nome e password del portafoglio.
- La password viene usata per rendere sicuri i dati del portafoglio sul tuo dispositivo. Utilizza una password efficace - meglio se una passphrase.
-
Prendi nota del tuo Seed Mnemonico!
-
Sulla schermata successiva troverai il tuo \"Seed Mnemonico\" da 25 parole.
- Questa è l'unica informazione necessaria per recuperare il tuo portafoglio d'ora in poi
- e avere pieno accesso ai tuoi fondi.
- E' molto importante mantenerlo privato e conservarlo in un luogo sicuro, poiché può concedere a chiunque
- pieno accesso ai tuoi fondi!
-
Se perdi la password del tuo portafoglio, puoi ancora recuperare il tuo portafoglio mediante il Seed Mnemonico.
-
Non esiste alcun modo per recuperare il tuo Seed Mnemonico; se lo perdi, tutti i tuoi fondi andranno persi!
- Inoltre, il Seed Mnemonico non può mai essere modificato, pertanto se viene rubato o compromesso in altro modo,
- dovrai spostare i tuoi fondi su un nuovo portafoglio (dotato di un altro Seed Mnemonico). Pertanto, ti consigliamo caldamente di
- annotare il tuo Seed Mnemonico e conservarlo in diversi posti sicuri.
- ]]>
-
- Crea un portafoglio - Seed
-
Se sei già in possesso di un indirizzo Monero e vuoi recuperare le transazioni dalla blockchain!
-
Inserisci nome e password del portafoglio.
- La password viene usata per rendere sicuri i dati relativi al portafoglio sul tuo dispositivo. Utilizza una password efficace -
- ancora meglio se una passphrase.
-
Inserisci il tuo Seed nel campo \"Seed Mnemonico\".
-
Se conosci il numero di blocco dove si trova la prima transazione utilizzata per questo indirizzo,
- inseriscilo nel campo \"Altezza di Recupero\" - se lasci il campo in bianco verrà scansionata
- l'intera blockchain alla ricerca di transazioni che appartengono al tuo indirizzo.
- Questo processo può richiedere parecchio tempo.
- ]]>
-
- Crea un portafoglio - Chiavi
-
Se stai recuperando il tuo portafoglio utilizzando le tue chiavi!
-
Inserisci nome e password del portafoglio.
- La password viene usata per rendere sicuri i dati relativi al portafoglio sul tuo dispositivo.
- Utilizza una password efficace - ancora meglio se una passphrase.
-
Inserisci il tuo indirizzo Monero nel campo \"Indirizzo Pubblico\" e riempi i campi \"Chiave di Visualizzazione\"
- e \"Chiave di Spesa\".
-
Se conosci il numero di blocco dove si trova la prima transazione utilizzata per questo indirizzo,
- inseriscilo nel campo \"Altezza di Recupero\" - se lasci il campo in bianco verrà scansionata
- l'intera blockchain alla ricerca di transazioni che appartengono al tuo indirizzo.
- Questo processo può richiedere parecchio tempo.
- ]]>
-
- Crea un portafoglio - Visualizzazione
-
Se vuoi solamente monitorare le transazioni in ingresso ad un portafoglio!
-
Inserisci nome e password del portafoglio.
- La password viene usata per rendere sicuri i dati relativi al portafoglio sul tuo dispositivo. Utilizza una password efficace -
- ancora meglio se una passphrase.
-
Inserisci il tuo indirizzo Monero nel campo \"Indirizzo Pubblico\" e riempi il campo \"Chiave di Visualizzazione\".
-
Se conosci il numero di blocco dove si trova la prima transazione utilizzata per questo indirizzo,
- inseriscilo nel campo \"Altezza di Recupero\" - se lasci il campo in bianco verrà scansionata
- l'intera blockchain alla ricerca di transazioni che appartengono al tuo indirizzo.
- Questo processo può richiedere parecchio tempo.
- ]]>
-
- Dettagli del Portafoglio
-
Indirizzo pubblico
- Il tuo indirizzo pubblico Monero equivale al tuo IBAN. Puoi condividerlo con chiunque senza temere di
- perdere i tuoi Moneroj. I Moneroj verranno inviati al tuo portafoglio utilizzando questo indirizzo.
-
Seed Mnemonico
- Questa è l'unica informazione necessaria per recuperare il tuo portafoglio in futuro
- e avere pieno accesso ai tuoi fondi.
- E' molto importante mantenerlo privato e conservarlo in un luogo sicuro, poiché può concedere a chiunque
- pieno accesso ai tuoi Moneroj! Se non lo hai già fatto, annotati il Seed Mnemonico e conservalo in un luogo sicuro!
-
Password di ripristino dei file del portafoglio
- Assicurati di aver salvato questa password. Se resetti il tuo dispositivo o disinstalli l'app
- ne avrai bisogno per accedere di nuovo al tuo portafoglio.
-
CrAzYpass
- Se la password visualizzata qui contiene 52 caratteri alfanumerici in gruppi di 4 - Congratulazioni!
- I file del tuo portafoglio sono criptati con una chiave a 256-bit generata dal tuo dispositivo
- e basata sulla passphrase che hai scelto (alla creazione o quando l'hai modificata). Questo la rende estremamente
- difficile da hackerare!
- Questa funzionalità è obbligatoria per tutti i nuovi portafogli.
-
Password precedente
- Se vedi la tua passphrase qui, i file del tuo portaglio non sono così sicuri come
- quelli criptati da CrAzYpass. Per adeguare la tua password semplicemente seleziona \"Cambia Passphrase\" dal menu.
- Dopo aver inserito una nuova passphrase (eventualmente la stessa usata in precedenza) l'applicazione genererà
- una CrAzYpass per te e la userà per mettere al sicuro i file del tuo wallet. Annotala!
-
Portafogli CrAzYpass
- Se dovessi avere bisogno di reinstallare Monerujo (per esempio dopo aver resettato il tuo telefono
- o dopo averlo sostituito) o vuoi usare i file del tuo portafoglio su un diverso dispositivo o PC, devi
- usare questa password di recupero per poter accedere nuovamente al tuo portafoglio.
- Selezionando \'Cambia Passphrase\' dal menu, potrai scegliere un'altra passphrase. Questa azione
- creerà una nuova password di recupero. Ricordati di annotarla!
-
Chiave di Visualizzazione
- La tua chiave di visualizzazione può essere usata per monitorare le transazioni in ingresso
- al tuo portafoglio senza concedere il permesso di spendere i fondi.
-
Chiave di Spesa
- La tua chiave di spesa permette a chiunque di spendere i Moneroj contenuti nel tuo portafoglio,
- pertanto non rivelarla a nessuno e conservala in un luogo sicuro, come fai con il tuo Seed Mnemonico.
- ]]>
-
- Lista dei portafogli
-
Nodo
-
Monerujo usa un nodo remoto per comunicare con la rete Monero senza dover scaricare e mantenere in
- memoria una copia della blockchain intera. Puoi trovare una lista di nodi remoti popolari o
- imparare come eseguire un tuo personale nodo remoto a questo sito: https://moneroworld.com/
-
Monerujo contiene già una lista di nodi remoti e tiene memoria degli ultimi cinque nodi utilizzati.
-
Portafogli
-
Qui trovi la lista dei portafogli. I portafogli sono fisicamente posizionati nella cartella monerujo
- nella memoria interna del tuo dispositivo. Puoi usare un'applicazione di file explorer per vederli.
- E' buona regola effettuare dei backup periodici di questa cartella su un'unità di memoria esterna al tuo
- dispositivo nel caso in cui il tuo dispositivo esploda o venga rubato.
-
Seleziona un portafoglio per aprirlo o premere \"+\" per crearne uno nuovo.
- Oppure seleziona una delle operazioni di portafoglio:
-
Dettagli
-
Mostra i dettagli del portafoglio, seed e chiavi.
-
Ricevi
-
Genera un codice QR per ricevere Moneroj.
-
Rinomina
-
Rinomina il portafoglio. Le copie di backup non vengono rinominate.
-
Backup
-
Fai una copia del portafoglio all'interno della cartella backups, a sua volta all'interno della
- cartella monerujo, sovrascrivendo eventuali copie precedenti.
-
Archivia
-
Effettua un backup e successivamente elimina il portafoglio. La copia rimane nella cartella backups.
- Se non hai più bisogno dei backup, è meglio cancellare i file interessati utilizzando un'applicazione di
- tipo file explorer o un'applicazione di rimozione dati sicura.
- ]]>
-
- Dettagli della transazione
-
Destinazione
- Questo è l'indirizzo pubblico del portafoglio cui hai inviato Moneroj
-
ID Pagamento
- Puoi usare un ID Pagamento per identificare la causale della transazione. Questa è un'informazione opzionale e privata.
- Ad esempio può aiutare un venditore ad associare una transazione ricevuta ad un bene da te acquistato.
-
TX ID (ID di Transazione)
- Questo è l'ID della transazione che puoi usare per identificare la tua transazione offuscata su un explorer della
- blockchain Monero, ad esempio https://xmrchain.net/
-
TX KEY (Chiave di transazione)
- Questa è la tua chiave privata della transazione. Conservala al sicuro poiché rivelare questa chiave a terze
- parti rivela quale firma in un anello è la tua, rendendo quindi la tua transazione trasparente.
-
Blocco
- Questo è il blocco nel quale la tua transazione è stata inclusa.
- ]]>
-
- Invia
-
Indirizzo del ricevente
-
Questo è l'indirizzo pubblico del portafoglio cui stai inviando Moneroj, puoi incollare qui un indirizzo
- che hai precededentemente copiato sul blocco appunti, scansionare un codice QR o inserire un indirizzo
- manualmente. Accertati più volte che sia l'indirizzo corretto e che tu non stia inviando Moneroj ad un indirizzo sbagliato.
-
In alternativa a un indirizzo XMR, puoi anche usare
-
-
un OpenAlias per XMR o BTC
-
un indirizzo BTC
-
- L'invio di BTC è processato tramite il servizio SideShift.ai. (per dettagli: https://sideshift.ai). Vedi la sezione sull'invio di BTC in basso.
-
Inviare BTC
-
SideShift.ai
-
SideShift.ai è un servizio di terze parti che funziona come cambiavaluta da Monero a Bitcoin.
- Utilizziamo le API SideShift.ai per integrare pagamenti Bitcoin all'interno di Monerujo. Controlla https://sideshift.ai
- e decidi tu stesso se questa è una funzionalità che vuoi usare. Il team Monerujo non è associato in alcun modo
- con SideShift.ai e non è in grado di aiutarti con il servizio da loro offerto.
-
Tasso di cambio SideShift.ai
-
Sulla schermata \"Ammontare\" ti verranno mostrati i parametri attuali del servizio SideShift.ai. Questi parametri
- includono il tasso di cambio attuale oltre ai limiti massimo e minimo di BTC. Considera che il tasso che ti viene mostrato
- non è ancora garantito in questa fase.
-
Ordine SideShift.ai
-
Sulla schermata \"Conferma\", troverai il vero ordine SideShift.ai. Questo ordine è valido per un tempo limitato - potresti
- notare un conto alla rovescia sul pulsante \"Spendi\". Il tasso di cambio potrebbe essere diverso da quello indicativo
- mostrato nelle schermate precedenti.
-
Chiave segreta SideShift.ai
-
Dal momento che Monerujo gestisce soltanto il versante Monero della tua transazione, può essere usata la chiave
- segreta SideShift.ai per tracciare il versante Bitcoin del tuo ordine sulla homepage SideShift.ai.
-
Conto alla rovescia SideShift.ai!
-
Non appena il conto alla rovescia arriva a zero, è necessario richiedere una nuova quotazione a SideShift.ai tornando
- indietro al passo precedente e tornando poi di nuovo alla schermata \"Conferma\".
- ]]>
-
- Inviare BTC
-
SideShift.ai
-
SideShift.ai è un servizio di terze parti che funziona come cambiavaluta da Monero a Bitcoin.
- Utilizziamo le API SideShift.ai per integrare pagamenti Bitcoin all'interno di Monerujo. Controlla https://sideshift.ai
- e decidi tu stesso se questa è una funzionalità che vuoi usare. Il team Monerujo non è associato in alcun modo
- con SideShift.ai e non è in grado di aiutarti con il servizio da loro offerto.
-
Tasso di cambio SideShift.ai
-
Sulla schermata \"Ammontare\" ti verranno mostrati i parametri attuali del servizio SideShift.ai. Questi parametri
- includono il tasso di cambio attuale oltre ai limiti massimo e minimo di BTC. Considera che il tasso che ti viene mostrato
- non è ancora garantito in questa fase.
-
Ordine SideShift.ai
-
Sulla schermata \"Conferma\", troverai il vero ordine SideShift.ai. Questo ordine è valido per un tempo limitato - potresti
- notare un conto alla rovescia sul pulsante \"Spendi\". Il tasso di cambio potrebbe essere diverso da quello indicativo
- mostrato nelle schermate precedenti.
-
Chiave segreta SideShift.ai
-
Dal momento che Monerujo gestisce soltanto il versante Monero della tua transazione, può essere usata la chiave
- segreta SideShift.ai per tracciare il versante Bitcoin del tuo ordine sulla homepage SideShift.ai.
-
Conto alla rovescia SideShift.ai!
-
Non appena il conto alla rovescia arriva a zero, è necessario richiedere una nuova quotazione a SideShift.ai tornando
- indietro al passo precedente e tornando poi di nuovo alla schermata \"Conferma\".
- ]]>
-
- Crea portafoglio - Ledger
-
Vuoi ripristinare il tuo portafoglio dal tuo dispositivo Ledger Nano S.
-
Le tue chiavi segrete non lasciano mai il dispositivo Ledger, quindi hai sempre bisogno di tenerlo collegato ogni
- volta che vuoi accedere al tuo portafoglio.
-
Inserisci un nome portafoglio unico ed una password. La password viene usata per tenere al sicuro i dati del tuo
- portafoglio sul dispositivo Android. Usa una password sicura - se usi una passphrase ancora meglio.
-
Inserisci il numero di blocco della prima transazione usata per questo indirizzo nel campo \"Altezza di ripristino\".
- Puoi anche usare una data nel formato AAAA-MM-GG. Se non sei sicuro/a, inserisci una data/altezza di
- blocco approssimativa precedente a quella di primo utilizzo dell'indirizzo del portafoglio.
- ]]>
-
- Il portafoglio
-
Modalità strada
-
La modalità strada può essere abilitata/disabilitata nel menu o toccando l'icona della testa di Gunther.
- In questa modalità, il tuo saldo non viene mostrato sullo schermo in modo tale da consentirti di usare
- il tuo portafoglio per strada, in un pub o in qualsiasi altro luogo pubblico. Anche le transazioni precedenti
- vengono nascoste. Le transazioni nuove verranno invece mostrate, così puoi vedere che hai inviato/ricevuto dei bei Moneroj!
-
Scansione
- Dal momento che a Monero piace tenere le cose private, tutte le volte in cui apri un portafoglio Monerujo dobbiamo
- effettuare una scansione della blockchain per controllare se nuovi Moneroj sono stati inviati al tuo portafoglio.
- Questa procedura salva sul tuo telefono informazioni che riguardano il tuo portafoglio. A volte essa può risultare
- lenta perché la scansione non è stata fatta da parecchio tempo.
-
Il Saldo
-
Aiuto! Il saldo del mio portafoglio è scomparso o è non confermato!
- Nessuna paura! Quando invii fondi dal tuo portafoglio, parte del tuo saldo viene temporaneamente visualizzato come non-confermato.
- Questo è un effetto di come Monero viene scambiato sulla blockchain e di come funzionano i resti.
- Ulteriori informazioni sui resti su
- https://getmonero.org/it/resources/moneropedia/change.html
-
Lista delle transazioni
-
Una lista delle transazioni relative al portafoglio. Nei portafogli solo-visualizzazione, vengono visualizzate solo
- le transazioni in ingresso.
- ]]>
-
- Nodi
-
In breve
-
Aggiorna la lista dei nodi tirando giù & contrassegna 3–5 i nodi per consentire a Monerujo
- di scegliere il migliore per te!
-
Cos'è un nodo?
-
Monerujo usa un nodo remoto (talvolta chiamato Daemon) per comunicare con la
- rete Monero senza dover scaricare e tenere in memoria una copia
- dell'intera blockchain
-
Lista dei nodi
-
Se la lista è vuota, puoi aggiungere nuovi nodi manualmente o lasciare che Monerujo
- effettui la scansione della rete per te. O entrambe le cose. Leggi su…
-
La lista dei nodi mostra tutti i nodi conosciuti. Inoltre, sotto il nome del nodo viene visualizzato il timestamp
- dell'ultimo blocco conosciuto ad ogni nodo. Accanto ad ogni nodo viene visualizzata un'icona che
- rappresenta il comportamento in risposta di quel nodo
- (che in sostanza indica il livello di connettività atteso).
-
Ogni nodo della lista può essere aggiunto come segnalibro per un utilizzo successivo.
- Nodi che non vengono aggiunti come segnalibro saranno dimenticati successivamente.
-
Monerujo sceglie il miglior nodo registrato ogni volta che lo usi.
- Il nodo migliore viene selezionato controllando l'altezza di blocco (quanto è aggiornato
- il nodo?) nonché il suo comportamento in risposta (quanto velocemente il nodo risponde alle richieste?).
-
La lista è ordinata per queste caratteristiche, in modo tale che il nodo in cima alla lista è quello che Monerujo
- selezionerebbe adesso. In fondo alla lista compaiono i nodi ritenuti molto lenti o non disponibili.
-
Aggiungere un nodo
-
Toccando il pulsante "Aggiungi nodo" in fondo, ti verrà chiesto di
- inserire i dettagli del nodo nella schermata successiva.
- L'"Indirizzo" è il nome host o l'indirizzo IP del nodo - questa è l'unica informazione necessaria.
- Inserisci la "Porta" se il nodo utilizza una porta diversa da quella di default (es. 18089).
- Puoi inoltre assegnare un nome al nodo, in modo tale da poterlo facilmente identificare in futuro.
- Alcuni nodi richiedono delle credenziali per poter essere usati. Inserisci negli appositi campi il nome utente &
- password forniti. Ora puoi "Effettuare un Test" con queste impostazioni.
- I "Risultati del Test" visualizzeranno l'altezza di blocco, il tempo di risposta e l'IP correntemente utilizzato.
- Il risultato potrebbe essere anche un errore - molte volte perché il nome host fornito non è
- raggiungibile per un ragionevole lasso di tempo o le credenziali non sono corrette.
- O se la combinazione nome host/porta non punta a un vero nodo Monero!
- Una volta che il test ha dato esito positivo (nessun errore) - hai la possibilità di premere "OK" per salvare&
- aggiungere questo nodo ai segnalibri.
-
Esegui scansione alla ricerca di nodi
-
Puoi anche eseguire una scansione su rete alla ricerca di nodi. Monerujo inizierà
- la scansione della rete alla ricerca di nodi sulla porta 18089, chiedendo dapprima ai tuoi
- nodi salvati i loro peer all'interno della rete P2P di Monero per poi proseguire
- chiedendo peer a questi ultimi e così via. Se non hai nodi salvati
- (o se essi non ci comunicano i loro peer),
- Monerujo proseguirà con i nodi seed codificati in Monero. La scansione
- termina quando vengono trovati 10 nodi in totale.
- ]]>
-
-
-
- Uso di un link di pagamento
-
Hai avviato monerujo con un link di pagamento. Per inviare fondi, procedi in questo modo:
-
- 1. Apri il portafogli da cui vuoi spendere
- 2. Attendi la sincronizzazione del portafogli; apparirà il pulsante "Invia"
- 3. Tocca il pulsante "Invia"
-
-
I dettagli del pagamento saranno auto-inseriti. Controllali e procedi come per qualsiasi altra transazione.
- ]]>
-
- Got it!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
deleted file mode 100644
index 0404025..0000000
--- a/app/src/main/res/values-it/strings.xml
+++ /dev/null
@@ -1,455 +0,0 @@
-
-
- Portafoglio
-
- Informazioni
- Politiche Privacy
-
- Condividi
- Aiuto
- Ricevi
- Rinomina
- Backup
- Cambia passphrase
-
- Continua a scrivere …
- Mah …
- Suvvia, puoi fare di meglio!
- Ci siamo quasi …
- Yeah baby, come un h4ck3r!
-
- Portafogli
- Crediti
- OK
- Cancella
- Chiudi
- Informazioni dettagliate
-
- Invio riuscito
- Fatto
-
- Tocca per il codice QR
-
- Pagamento BTC abilitato, tocca per maggiori informazioni.
- Ledger abilitato, tocca per maggiori informazioni.
-
- Hai inserito un indirizzo %1$s.
- Invierai XMR e il destinatario riceverà %1$s tramite il servizio SideShift.ai.
- ]]>
-
- Ordine SideShift.ai
-
- %1$s %2$s
-
-
- In attesa di conferma
- In attesa del pagamento
- Errore SideShift.ai (%1$s)
- %1$s Inviati!
- Richiedendo …
-
- Puoi inviare %1$s — %2$s %4$s.
- SideShift.ai ti sta attualmente concedendo un tasso di cambio di %3$s %4$s/XMR.
- ]]>
-
- Saldo: %2$s %3$s (%1$s XMR)
-
- ✔ ID pagamento integrato
- Preparando la tua transazione
-
- Creando l\'ordine SideShift.ai
- Richiedendo l\'ordine SideShift.ai
- Preparando la transazione Monero
-
- Richiedendo i parametri SideShift.ai
-
- ERRORE SideShift.ai
- Codice: %1$d
-
- Tocca per riprovare
- Ora siamo bloccati qui!!
- Oh Oh, SideShift.ai sembra non essere disponibile in questo momento!
-
- %1$s %3$s = %2$s XMR
- (Tasso: %1$s %2$s/XMR)
-
- Visita SideShift.ai per supporto e tracciamento
- Chiave segreta\nSideShift.ai
- Chiave segreta SideShift.ai
- Indirizzo %1$s di destinazione
- Ammontare
-
- ID Transazione
- Indirizzo di Destinazione
- Note
-
- Backup in corso
- Archiviazione in corso
- Rinomina in corso
- Modifica password in corso
-
- Rimettendo le cose a posto …\nPuò richiedere del tempo!
-
- Backup effettuato con successo
- Backup fallito!
- Rinomina fallita!
- Modifica password fallita!
- Password cambiata
-
- Nodo
- Caricando portafoglio …
- Portafoglio salvato
- Salvataggio portafoglio fallito!
- In connessione …
- Connessione con il nodo fallita!\nControlla username/password
- Nodo invalido!\nProvane un altro.
- Impossibile raggiungere il nodo!\nProva di nuovo o provane un altro.
-
- Disconnesso
-
- Transazione fallita: %1$s
-
- Amico/a, hai aspettato troppo a lungo!
-
- Sono ancora occupato con il tuo ultimo portafoglio …
-
- Rinomina %1$s
-
- Nuova passphrase per %1$s
- Ripeti passphrase per %1$s
- Password per %1$s
- Puoi aprire il portafoglio anche usando la tua impronta digitale.\nTocca il sensore.
- Aprendo il portafoglio…
- Impronta digitale non riconosciuta. Prova di nuovo.
- Password errata!
- La password salvata è scorretta.\nInserisci la password manualmente.
- Il portafoglio non esiste!
- Deve essere impostato l\'indirizzo del Daemon!
- Il portafoglio non si abbina con la rete selezionata
-
- (solo-visualizzazione)
-
- Ricevi
- Invia
-
- + %1$s XMR non confermati
-
- Servizio monerujo
-
- Sincronizzati:
- Blocchi rimanenti
- Scansionando:
-
- L\'unità di memoria esterna non è scrivibile! Aiuto!
- Abbiamo veramente bisogno di questi permessi sull\'unità di memoria esterna!
- Nessuna telecamera = Nessuna scansione QR!
-
- Chiave di visualizzazione
- Indirizzo pubblico
- Chiave
- Chiave di visualizzazione copiata negli appunti!
- Chiave copiata negli appunti!
- Indirizzo del portafoglio copiato negli appunti!
- ID transazione copiato negli appunti!
- Copia disabilitata per ragioni di sicurezza!
-
- Impossibile recuperare il tasso di cambio!\nUsa XMR/XMR o prova di nuovo
-
- Crea portafoglio
- Nome del portafoglio
- Passphrase del portafoglio
- Permetti di aprire il portafoglio usando la tua impronta digitale
- [Autenticazione tramite impronta digitale
-
Abilitando l\'autenticazione tramite impronta digitale, puoi visualizzare il tuo saldo e ricevere fondi
- senza inserire la password.
-
Per sicurezza aggiuntiva, Monerujo richiederà comunque di inserire la password per visualizzare i dettagli
- del tuo portafoglio o inviare denaro.
- Avviso di sicurezza
-
Infine, Monerujo ci tiene a ricordarti che chiunque sia in grado di procurarsi la tua impronta digitale
- sarà in grado anche di sbirciare il saldo del tuo portafoglio.
-
Per esempio, un utente malintenzionato potrebbe aprire il tuo portafoglio mentre dormi.
- Sei sicuro/a di voler abilitare questa funzione?
- ]]>]
- Le passphrase non corrispondono
- La passphrase potrebbe non essere vuota
- Fammi subito un portafoglio!
- Ho annotato le informazioni qui sopra!
-
- Dammi un nome!
- Il portafoglio esiste!
- Non può iniziare con .
- Portafoglio in creazione
- Portafoglio creato
-
- Inserisci un numero o una data (AAAA-MM-GG)
-
- Chiavi
- Nuovo
- Seed
- Visualizzazione
-
- Indirizzo pubblico
- Chiave di visualizzazione
- Chiave di spesa
- Seed mnemonico da 25 parole
- Altezza o data (AAAA-MM-GG) di ripristino
-
- Indirizzo pubblico
- Chiave di visualizzazione
- Chiave di spesa
- Seed mnemonico
- Password di ripristino dei file del portafoglio
-
- Inserisci una chiave valida
- Inserisci un indirizzo valido
- Inserisci il tuo seed di 25 parole
-
- Note private (opzionali)
- Genera
- Spendi i miei bei Moneroj
- Spendi i miei bei Moneroj (%1$s)
- Non è un codice QR
- Non è un codice QR pagamento valido
- Non è un indirizzo valido
- Invia
- Saldo: %1$s XMR
- Indirizzo
- Ammontare
- Conferma
- Fatto
-
- Ammontare
- Commissione (XMR)
- Commissione
- Totale (XMR)
- Totale
-
- %1$s XMR
- +%1$s di commissione
-
- Errore nella creazione della transazione
-
- Commissione %1$s
- (%1$s)
- fallita
- - %1$s
- + %1$s
-
- Timestamp
- ID TX
- Chiave TX
- Destinazione
- ID Pagamento
- Blocco
- Ammontare
- Commissione
- Trasferimenti
- Note
- (opzionale)
- Dettagli della transazione
-
- IN ATTESA
- FALLITA
-
- Ammontare
- Impossibile aprire il portafoglio!
-
- Max. %1$s
- Min. 0
- XMR non è un numero
-
- Verranno ora mostrati dati sensibili.\nGuardati alle spalle!
- Sono al sicuro
- Torna indietro!
- Dettagli
-
- Questo portafoglio sarà cancellato. I tuoi fondi saranno andati per sempre a meno che tu non abbia il tuo seme o un backup funzionante per recuperarli.
- Sì, procedi!
- No grazie!
-
- Crea un nuovo portafoglio
- Recupera un portafoglio solo-visualizzazione
- Recupera un portafoglio dalle chiavi private
- Recupera un portafoglio da un seed di 25 parole
-
- Crea Account
- Aggiunto nuovo account #%1$d
- Account #
-
- Manda tutti i fondi confermati in questo account!
- Sottoindirizzo
- Sottoindirizzo pubblico #%1$d: %2$s
-
- Lingua
- Usa lingua di sistema
-
- Ripristina da Ledger Nano
-
- In comunicazione con Ledger
- Conferma su Ledger richiesta!
- Recuperando subaddresses
- Verificando le chiavi
- Folli calcoli matematici
- Hashing in corso
- (Ri)connetti il dispositivo Ledger
-
- Creando account
-
- %1$s allegati
- %1$s allegati
-
- Scrivendo tag
- Scrittura tag fallita!
- Scrittura tag riuscita
- La tag non supporta NDEF!
- La Tag fornisce %1$d bytes, ma ne servono %2$d!
- Non capisco la tag!
- Non capisco cosa mi hai chiesto!
- NFC disponibile!
-
- Descrizione (opzionale)
-
- Indirizzo OpenAlias non disponibile
- OpenAlias sicuro ✔
- Risolvendo OpenAlias…
- OpenAlias senza DNSSEC - L\'indirizzo potrebbe essere rubato
-
- Versione del nodo incompatibile - si prega di aggiornare!
-
- Mostra i segreti!
- Modalità strada
-
- Node-o-matiC abilitato, tocca per maggiori informazioni.
- Ultimo blocco aggiornato: %1$s
- Nodi
- Nome nodo (opzionale)
- Nome host
- Porta
- Nome utente (opzionale)
- Password (opzionale)
- Host non risolvibile
- Abbiamo bisogno di questo!
- Deve essere numerico
- Deve essere 1–65535
- Aggiungi nodo
- Tocca per aggiornare!
- ERRORE CONNESSIONE %1$d
- ERRORE CONNESSIONE
- AUTENTICAZIONE FALLITA
- Risultato del test:
- Altezza: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- Controllo IP: %1$s …
- Attendi il termine della scansione
- Tocca per selezionare o aggiungere nodi
- Aggiungi nodi manualmente o tira giù per effettuare scansione
- Scansione rete…
- Aggiunti automaticamente ai segnalibri i %1$d nodi migliori
- Effettua Test
-
-
- Ricevente
-
- TUTTO!
-
- Converti seed Ledger
- Parole del seed Ledger
- Frase d\'accesso Ledger (opzionale)
- Seed di Ledger invalido!
- Inserire il tuo seed di Ledger qui è un grosso rischio!
-
- Altezza di ripristino
-
- Avvia app Monero su %1$s
-
- Riscansiona!
-
- Ho capito!
- Next
- Sono pronto!
-
- Benvenuto su Monerujo!
- Questa app ti permette di creare ed usare portafogli di Monero. Puoi conservare i tuoi bei moneroj all\'interno.
- Tieni al sicuro il tuo seed
- Il seed permette l\'accesso al portafogli a chiunque lo abbia. Se lo perdi, non possiamo aiutarti a recuperarlo.
- Invia altre crypto
- Monerujo supporta SideShift.ai. Copia o scansiona un indirizzo BTC, LTC, ETH, DASH o DOGE per inviare una di queste crypto spendendo XMR.
- Nodi, a modo tuo
- I nodi ti connettono alla rete di Monero. Scegli tra i vari nodi pubblici oppure usa il tuo.
- Invia con impronta
- Ora puoi inviare XMR con la tua impronta digitale. Per richiedere la password, disabilita l\'accesso all\'impronta.
-
- Modalità scura
-
- Auto
- Giorno
- Notte
-
- Non c\'è niente qui\n Crea o ripristina un portafogli
-
- Ripristina i nodi predefiniti
- Ripristino già in corso…
-
- Ultimo blocco: %1$d secondi fa
- Ultimo blocco: %1$d minuti fa
- Ultimo blocco: %1$d ore fa
- Ultimo blocco: %1$d giorni fa
-
- Impossibile ottenere la quota
- Controlla l\'ammontare e riprova
-
- Indirizzo ambiguo.
- Si prega di inserire il tipo selezionato.
- ]]>
-
- Inserisci o scansiona un indirizzo %1$s.
- Invierai XMR e il destinatario otterrà %2$s tramite il servizio SideShift.ai.
- ]]>
-
- Inserisci o scansiona un indirizzo di Monero.
- ]]>
-
- Sottoindirizzi
- Nome sottoindirizzo
- Troppi indirizzi non usati - usane qualcuno per poterne creare altri!
- Troppi account non usati - usane qualcuno per poterne creare altri!
- Transazioni per questo sottoindirizzo:
- Nessuna transazione per questo sottoindirizzo
- Seleziona un sottoindirizzo
- Tieni premuto per i dettagli
-
- Elimina
- Eliminazione fallita!
-
- Importa portafogli
- Importazione fallita!
-
- Resetta portafogli!
-
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-ja/about.xml b/app/src/main/res/values-ja/about.xml
deleted file mode 100644
index 3ecf7b6..0000000
--- a/app/src/main/res/values-ja/about.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
- 閉じる
- 私はmonerujoです
- バージョン %1$s (%2$d)
-
- クレジット
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo, ErCiccione et al.
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
This page informs you of our policies regarding the collection,
- use and disclosure of personal information we receive from users of our
- app (monerujo: Monero Wallet).
-
-
By using the app, you agree to the collection and use of information in
- accordance with this policy.
-
-
Data Collected
-
Personal data is any kind of data that could identify an individual.
-
-
Monero keys and public addresses are collected and processed by the app locally
- for the purpose of processing transactions and transmitted into the Monero Network
- in encrypted form.
-
-
Other personal data is not collected by the app.
-
If you use the exchange (optional) functionality, monerujo fetches the exchange
- rate through the public API of coinmarketcap.com.
- See their privacy policy at https://coinmarketcap.com/privacy for
- details on how data in your requests is collected.
-
If you use the app to pay to BTC addresses, you will be using the SideShift.ai service.
- See their privacy policy at https://sideshift.ai/ for details. Monerujo send them the BTC
- destination address and amount. Your IP will also be collectable.
-
App Permissions
-
-
INTERNET : Connect to the Monero Network via a Monero Daemon Node
-
READ_EXTERNAL_STORAGE : Read wallet files stored on the device
-
WRITE_EXTERNAL_STORAGE : Write wallet files stored on the device
-
WAKE_LOCK : Keep device awake while syncing
-
CAMERA : Scan QR Codes for receiving Monero
-
-
Changes to this Privacy Policy
-
We may update this privacy policy from time to time. We will notify
- you of any changes by posting the new privacy policy in the app and on the
- website (www.monerujo.io)
- You are advised to review this privacy policy periodically for any changes.
-
This Privacy Policy was last updated: 10th November, 2017.
-
-
Contact Us
-
If you have any questions about our privacy policy,
- or how your data is being collected and processed,
- please e-mail privacy@monerujo.io.
-
- ]]>
-
diff --git a/app/src/main/res/values-nb/help.xml b/app/src/main/res/values-nb/help.xml
deleted file mode 100644
index 70cdab6..0000000
--- a/app/src/main/res/values-nb/help.xml
+++ /dev/null
@@ -1,316 +0,0 @@
-
-
- Lage lommebok - Ny
-
Hvis du trenger en ny Monero addresse!
-
Skriv inn et unikt lommebok navn og passord.
- Passordet blir brukt til å sikre lommebokdataene på enheten. Bruk et sterkt passord -
- helst en passordfrase.
-
Noter ditt mnemoniske seed!
-
På neste side vil du finne ditt 25 ord lange \"Mnemonisk Seed\".
- Dette er den eneste dataen du trenger for å gjenopprette lommeboken din senere,
- og få tilgang til alle pengene dine.
- Det er veldig viktig å holde dette sikkert, siden det gir hvem som helst
- full tilgang på pengene dine!
-
Hvis du mister lommebokpassordet ditt, kan du fortsatt gjenoprette lommeboka med den mnemoniske seeden din.
-
Det finnes ingen måte å gjennoprette ditt mnemoniske seed, så hvis du mister det er alle pengene dine tapt.
- Det mnemoniske seedet kan heller aldri forandres, og hvis det blir stjelt eller har blitt kompromittert,
- må du flytte pengene dine til en ny lommebok (med et ny mnemonisk seed). Derfor er det best
- at du backer opp ditt mnemoniske seed, ved å skrive det ned og lagre det i flere trygge
- og sikre plasser.
- ]]>
-
- Lage lommebook - Seed
-
Hvis du allerede har en Monero addresse og vil gjennoprette transaksjonene fra blokkjeden!
-
Skriv inn et unikt lommebok navn og passord. Passordet er brukt for å sikre lommebokdataene på denne enheten.
- Bruk et sterkt passord, helst en passordfrase.
-
Skriv inn seedet ditt i feltet \"Mnemonisk Seed\".
-
Hvis du kjenner til blokkhøyden til den første transaksjonen til denne addressen,
- skriv det inn i feltet \"Gjenopprettelseshøyde\" - hvis det er tomt vil hele blokkjeden skannes etter
- transaksjoner som hører til denne addressen. Dette tar veldig lang tid.
- ]]>
-
- Lage lommebok - Nøkler
-
Hvis du gjenoppretter lommeboka di ved hjelp av nøkler!
-
Skriv inn et unikt lommebok navn og passord. Passordet er brukt for å sikre lommebokdataene på denne enheten.
- Bruk et sterkt passord, helst en passordfrase.
-
Skriv inn Monero-addressen din i feltet \"Offentlig Addresse\" og fyll ut \"View Key\" and \"Spend Key\".
-
Hvis du kjenner til blokkhøyden til den første transaksjonen til denne addressen,
- skriv det inn i feltet \"Gjenopprettelseshøyde\" - hvis det er tomt vil hele blokkjeden skannes etter
- transaksjoner som hører til denne addressen. Dette tar veldig lang tid.<
- ]]>
-
- Lage lommebok - View
-
Hvis du bare vil følge med på innkommende transaksjoner til en lommebok!
-
Skriv inn et unikt lommebok navn og passord. Passordet er brukt for å sikre lommebokdataene på denne enheten.
- Bruk et sterkt passord, helst en passordfrase.
-
Skriv inn Monero-addressen din i feltet \"Offentlig Addresse\" og fyll ut \"View-nøkkel\".
-
Hvis du kjenner til blokkhøyden til den første transaksjonen til denne addressen,
- skriv det inn i feltet \"Gjenopprettelseshøyde\" - hvis det er tomt vil hele blokkjeden skannes etter
- transaksjoner som hører til denne addressen. Dette tar veldig lang tid.
- ]]>
-
- Lommebokdetaljer
-
Offentlig nøkkel
- Den offentlige addressen din er som bankkontonummeret ditt, som du kan dele med folk
- uten å være redd for å miste penger. Det er denne folk sender Monero til.
-
Mnemonisk Seed
- Dette er den eneste dataen du trenger for å gjenoprette lommeboka di senere,
- og få full tilgang til pengene dine. Å holde denne privat er veldig viktig, siden den gir hvem som helst full
- tilgang til dine moneroj! Hvis du ikke har skrevet den ned, vær så snill og gjør det!
-
Lommebokfiler gjenoprettelsespassord
- Vær sikker på at du skriver ned dette passordet. Hvis du nullstiller enheten eller avinstallerer appen, vil
- du trenge tilgang til lommeboka di igjen.
-
CrAzYpass
- Hvis passordet vist her er 52 alfanunmeriske karakterer i grupper av 4 - gratulerer!
- Lommebokfilene dine er sikret med en 256-bit nøkkel generert av enheten din sine sikkerhetsfunksjoner
- basert på passordet du valgte (når du lagde det eller forandra det) og dette gjør det
- utrolig vanskelig å hacke!
- Denne funksjonen er obligatorisk for nye lommebøker.
-
Eldre passord
- Hvis du ser passordet ditt her, er ikke lommebokfilene dine så sikre som de er ved bruk av
- CrAzYpass. For å fikse dette, trykk på \"Change Passphrase\" fra menyen. Etter å ha skrivd inn
- ett nytt passord (kanskje til og med det samme som før) vil appen generere et CrAzYpass for
- deg og sikre lommebokfilene dine med det. Skriv det ned!
-
CrAzYpass lommebøker
- Hvis du noen gang trenger å reinstallere monerujo (for eksempel etter å ha nullstilt enheten eller bytta
- til en ny en) eller du vil bruke lommebokfilene dine på en annen enhet eller PC, må du bruke
- dette gjenoppretelsespassordet for å få tilgang til lommeboka di igjen.
- Ved å velge \"Change Passphrase\" fra menyen, kan du velge et annet passord. Vær oppmerksom
- på at dette vil generere et nytt gjenoppretelsespassord. Skriv det ned!
-
View-nøkkel
- View-nøkkelen din gir andre tilgang til å se innkommende transaksjoner, uten å gi dem
- tilgang til å bruke penger.
-
Spend-nøkkel
- Spend-nøkkelen gir alle tillatelse til å bruke moneroene dine, så hold den like
- trygt som det mnemoniske seedet ditt!
- ]]>
-
- Lommebokliste
-
Node
-
Monerujo bruker en ekstern node for å kommunisere med Monero-nettverket, uten å måtte
- laste ned og oppbevare en kopi av blokkjeden selv. Du kan finne en liste over populære
- eksterne noder eller lære hvordan du driver din egen eksterne node her: https://moneroworld.com/
-
Monerujo kommer med noen eksterne noder lagt inn. Den husker de fem siste nodene du har brukt.
-
Lommebøker
-
Her ser du lommebøkene dine. De ligger i monerujo mappa
- på den interne lagringa for enheten din. Du kan bruke en filutforsker for å se dem.
- Du burde ta backup av denne mappa en gang i blant til en ekstern enhet i tilfelle
- enheten din eksploderer eller blir stjelt.
-
Velg en lommebok for å åpne den, eller trykk \"+\" for å lage en ny en.
- Eller velg en av disse lommebokoperasjonene:
-
Detaljer
-
Viser lommebokdetaljene, seed og nøkler.
-
Motta
-
Lag en QR-kode for å motta Monero.
-
Gi nytt navn
-
Gi nytt navn til lommeboka. Backuper blir ikke omgjort.
-
Backup
-
Lag en kopi av lommeboka til backups mappa inni monerujo
- og overskriv tidligere kopier.
-
Arkiver
-
Lag en backup og slett lommeboka etterpå. Kopien blir igjen i backups
- mappa. Hvis du ikke lenger trenger backupsene, burde du slette dem med en filutforsker
- eller en sikker sletteapp.
- ]]>
-
- Transaksjonsdetaljer
-
Destinasjon
- Dette er den offentlige adressen til lommeboka du sendte Monero til.
-
Betalings-ID
- Du kan bruke betalings-ID til å identifisere hvorfor du sendte Monero mellom to parter. Dette er
- helt frivillig og privat. For eksempel lar det en bedrift tilknytte transaksjonen din med
- en vare du har kjøpt.
-
TX-ID
- Dette er transaksjons-IDen din, som du kan bruke til å identifisere transaksjonen din på den obfuskerte Monero blokkjeden, ved å bruke en
- blokkjedeutforsker som https://xmrchain.net/
-
TX-nøkkel (Transaksjonsnøkkel)
- Dette er din private transaksjonsnøkkel. Hold den privat, siden å gi den til en tredjepart
- avslører hvilken signatur i ringen som er din, og gjør derfor transaksjonen din gjennomsiktig.
-
Blokk
- Dette er blokka som transaksjonen din ligger i.
- ]]>
-
- Send
-
Mottakers adresse
-
Dette er den offentlige adressen til lommeboka du skal sende moneroj til, som du kan
- kopiere fra utklippstavla, skanne fra en QR-kode eller skrive inn manuellt. Vær sikker på at du trippelsjekker dette
- for å forsikre deg om at du ikke sender moneroj til feil adresse.
-
In addition to using an XMR address, you can also use
-
-
an OpenAlias for XMR or BTC
-
a BTC address
-
- Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai
- for details). See the section on sending BTC below.
-
Å sende BTC
-
SideShift.ai
-
SideShift.ai er en tredjepartstjeneste som lar deg veksle Monero til Bitcoin.
- Vi bruker SideShift.ai-APIen til å integrere BTC-betalinger i Monerujo. Sjekk ut
- https://sideshift.ai og bestem for deg selv om dette er noe du vil bruke. Monerujo-utviklerne
- er ikke assosierte med SideShift.ai og kan ikke hjelpe deg med deres tjeneste.
-
SideShift.ai vekslingskurs
-
På \"Mengde\" skjermen vil du bli vist de nåværende parametrene til SideShift.ai-tjenesten. Disse
- inkluderer den nåværende vekslingskursen så vel som nedre og øvre BTC-grenser. Vær oppmerksom på at
- kursen ikke er garantert på dette punktet.
-
SideShift.ai ordre
-
På \"Bekreft\" skjermen, vil du se den faktiske SideShift.ai ordren. Denne ordren er gyldig for
- en begrensa tid - du legger kanskje til en nedtelling på \"Bruk\" knappen. Veklingskursen kan være
- enn den veiledende kursen vist på de tidligere skjermene.
-
SideShift.ai hemmelig nøkkel
-
Fordi Monerujo bare håndterer XMR delen av transaksjonen din, kan din SideShift.ai hemmelige nøkkel
- bli brukt til å spore BTC-transaksjonen på SideShift.ai sine hjemmesider.
-
SideShift.ai nedtelling!
-
Når nedtellinga når null, må du få en ny kvote fra SideShift.ai ved å gå tilbake til
- det tidligere steget og komme tilbake til \"Bekreft\" skjermen.
- ]]>
-
- Å sende BTC
-
SideShift.ai
-
SideShift.ai er en tredjepartstjeneste som lar deg veksle Monero til Bitcoin.
- Vi bruker SideShift.ai-APIen til å integrere BTC-betalinger i Monerujo. Sjekk ut
- https://sideshift.ai og bestem for deg selv om dette er noe du vil bruke. Monerujo-utviklerne
- er ikke assosierte med SideShift.ai og kan ikke hjelpe deg med deres tjeneste.
-
SideShift.ai vekslingskurs
-
På \"Mengde\" skjermen vil du bli vist de nåværende parametrene til SideShift.ai-tjenesten. Disse
- inkluderer den nåværende vekslingskursen så vel som nedre og øvre BTC-grenser. Vær oppmerksom på at
- kursen ikke er garantert på dette punktet.
-
SideShift.ai ordre
-
På \"Bekreft\" skjermen, vil du se den faktiske SideShift.ai ordren. Denne ordren er gyldig for
- en begrensa tid - du legger kanskje til en nedtelling på \"Bruk\" knappen. Veklingskursen kan være
- enn den veiledende kursen vist på de tidligere skjermene.
-
SideShift.ai hemmelig nøkkel
-
Fordi Monerujo bare håndterer XMR delen av transaksjonen din, kan din SideShift.ai hemmelige nøkkel
- bli brukt til å spore BTC-transaksjonen på SideShift.ai sine hjemmesider.
-
SideShift.ai nedtelling!
-
Når nedtellinga når null, må du få en ny kvote fra SideShift.ai ved å gå tilbake til
- det tidligere steget og komme tilbake til \"Bekreft\" skjermen.
- ]]>
-
- Create Wallet - Ledger
-
You want to recover your wallet from your Ledger Nano S device.
-
Your secret keys never leave the Ledger device, so you need it plugged in every
- time you want to access your wallet.
-
Enter a unique wallet name and password. The password is used for securing your wallet data on the Android
- device. Use a strong password - even better use a passphrase.
-
Enter the block number of the first transaction used for this address in the
- field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
- enter an approximate date/blockheight before you first used this wallet address.
- ]]>
-
- Lommeboka
-
Street Mode
-
Street mode can be enabled/disabled in the menu or Gunther\'s head icon. In this mode, your
- balance is not shown on any screen so you can safely use your wallet on the street, a pub or
- other public place. Previous transactions are also hidden. New transactions will be shown, so
- you can see that you have sent/received sweet Moneroj!
-
Skanning
- Fordi Monero liker å holde ting privat, må vi hver gang du åpner en lommebok i Monerujo
- skanne blokkjeden for å se om noen nye moneroj har blitt sendt til lommeboka di, som bare
- lagrer informasjon til telefonen din som tilhører lommeboka. Noen ganger kan det ta litt
- tid fordi du ikke har synkronisert på en stund.
-
Saldo
-
Hjelp! Kontosaldoen min har blitt borte, eller noe er ubekrefta!
- Ikke få panikk! Når du sender penger fra lommeboka di, vil noe av saldoen din bli
- vist som ubekrefta en liten periode.
- Dette er et resultat av hvordan Monero veksles på blokkjeden og hvordan vekslepenger funker.
- Les mer om vekslepenger på https://getmonero.org/resources/moneropedia/change.html
-
Transaksjonsliste
-
En liste over lommeboktransaksjonene. In view lommebøker, kan man bare se innkommende transaksjoner.
- ]]>
-
- Nodes
-
TL;DR
-
Refresh the nodes list by pulling down & bookmark 3–5 nodes to allow Monerujo
- to choose the best one for you!
-
What's a Node?
-
Monerujo uses a Remote Node (sometimes also called Daemon) to communicate with
- the Monero Network without having to download and store a copy of the
- whole blockchain itself.
-
Node List
-
If the list is empty, you can either add new nodes manually or let Monerujo
- scan the network for you. Or both. Read on…
-
The node list shows all currently known nodes. Additionally, the timestamp
- of the latest block known to each node is shown under the node name. An icon
- representing the node's response behaviour
- (which indicates the level of connectivity to be expected)
- is shown next to each node.
-
Any node in the list can be bookmarked for later use.
- Nodes which are not bookmarked will be forgotten.
-
Monerujo will choose the optimal bookmarked node each time you use it.
- It does this by checking the blockheight (how up-to-date
- is the node?) as well as the response behaviour (how fast does the node respond to requests?).
-
The list is sorted by these characteristics, so the top node would be the one Monerujo
- would choose right now. The bottom of the list would show very slow or unavailable nodes.
-
Add a Node
-
By touching the "Add Node" button at the bottom, you will be asked to
- enter the node details in the following dialog.
- The "Address" is the hostname or IP-address of the node - this is the only
- mandatory entry.
- Enter the "Port" if the node runs on a non-default port (e.g. 18089).
- You can also optionally name the node, so you can identify it easier later on.
- Some nodes require credentials to use them. Enter the provided username &
- password in the appropriate fields. Now you can "Test" these setting.
- The "Test Results" will display the blockheight, response time and actual IP used.
- The result may also be an error - usually because the hostname provided is
- not reachable in a sensible amount of time or the credentials are incorrect.
- Or the hostname/port combination does not point to an actual Monero Node!
- Once the test passes (no error) - you're set to press "OK" to save &
- bookmark this node.
-
Scan for Nodes
-
Additionally, you can scan the network for nodes. Monerujo will start
- scanning the network for Remote Nodes on port 18089. It begins by asking your
- bookmarked nodes for other peers in the Monero P2P network and then continues
- by asking those for their peers, and so on. If you have no bookmarked nodes
- (or they don't tell us about their peers),
- Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
- scan stops when it finds 10 remote nodes in total.
- ]]>
-
-
-
- Using a payment link
-
You have started monerujo with a payment link. In order to send funds, please do the following:
-
- 1. Open the wallet you want to spend from
- 2. Wait until the wallet is synced & the "Give" button appears
- 3. Touch the "Give" button
-
-
The payment details will be filled in. Check them and proceed like for any other transaction.
- ]]>
-
- Got it!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
deleted file mode 100644
index 269381f..0000000
--- a/app/src/main/res/values-nb/strings.xml
+++ /dev/null
@@ -1,452 +0,0 @@
-
-
- Lommebok
-
- Om
- Personvernserklæring
-
- Del
- Hjelp
- Motta
- Gi nytt navn
- Backup
- [Forandre passord]
-
- Fortsett å skrive …
- Meh …
- Kom igjen, du kan gjøre det bedre!
- Nesten der …
- Å ja, h4x0r stil!
-
- Lommebøker
- Credits
- OK
- Avbryt
- Lukk
- Detaljert informasjon
-
- Sendt suksessfullt!
- Ferdig
-
- Trykk for QR kode
-
- BTC betaling tilgjengelig, trykk for mer info.
- Ledger tilgjengelig, trykk for mer info.
-
- Du skrev inn en %1$s addresse.
- Du vil sende XMR og mottakeren vil få %1$s gjennom SideShift.ai tjenesten.
- ]]>
-
- SideShift.ai Ordre
- %1$s %2$s
-
- Bekreftelse venter
- Betaling venter
- SideShift.ai error (%1$s)
- %1$s sendt!
- Spør …
-
- Du kan sende %1$s — %2$s %4$s.
- SideShift.ai gir deg en vekslingskurs på %3$s %4$s/XMRakkurat nå.
- ]]>
-
- Saldo: %2$s %3$s (%1$s XMR)
-
- ✔ Betalings ID integrert
- Forbereder din transaksjon
-
- Lager SideShift.ai ordre
- Spør etter SideShift.ai ordre
- Forbereder Monero transaksjon
-
- Spør etter SideShift.ai parametre
-
- SideShift.ai ERROR
- Kode: %1$d
-
- Trykk for å prøve igjen
- Nå sitter vi fast her!
- Ops, det ser ikke ut til at SideShift.ai er tilgjengelig for øyeblikket!
-
- %1$s %3$s = %2$s XMR
- (Rate: %1$s %2$s/XMR)
-
- Besøk SideShift.ai for støtte og sporing
- Hemmelig nøkkel\nSideShift.ai
- SideShift.ai Hemmelig nøkkel
- %1$s destinasjonsadresse
- Mengde
-
- Transaksjons-ID
- Destinasjonsadresse
- Notater
-
- Backup pågår
- Arkivering pågår
- Nytt navn gis
- [Passordforandring i gang]
-
- Gjør ting ferdig …\nDette kan ta si tid!
-
- Backup suksessfull
- Backup feila!
- Kunne ikke gi nytt navn!
- [Passordforandring feila!]
- [Passord forandra]
-
- Node
- Laster lommebok …
- Lommebok lagra
- Lommeboklagring feila!
- Kobler til …
- Node-tiklobling feila!\nSjekk brukernavn/passord
- Noden er ugyldig!\nPrøv en annen.
- Kan ikke nå node!\nPrøv på nytt eller med en annen.
-
- Kobla fra
-
- Transaksjon feila: %1$s
-
- Du venta for lenge, min venn!
-
- Jeg er fortsatt opptatt med din forrige lommebok …
-
- Gi nytt navn til %1$s
-
- [Nytt passord for %1$s]
- [Gjenta passord for %1$s]
- Passord for %1$s
- [You can also open wallet using fingerprint.\nPlease touch sensor.]
- [Opening the wallet…]
- [Fingerprint not recognized. Try again.]
- Feil passord!
- [Saved password is incorrect.\nPlease enter password manually.]
- Lommebok eksisterer ikke!
- Daemon-adresse må være gitt!
- Lommebok matcher ikke valgt nett
-
- (Bare se)
-
- Motta
- Gi
-
- + %1$s XMR ubekrefta
-
- monerujo tjeneste
-
- Synkronisert:
- Gjenværende blokker
- Skanner:
-
- Ekstern lagring er ikke skrivbar! Panikk!
- Vi trenger virkelig de eksternlagrings-rettighetene!
- Ikke noe kamera = ikke noe QR-skanning!
-
- View-nøkkel
- Offentlig adresse
- Nøkkel
- View-nøkkel kopiert til utklippstavle!
- Nøkkel kopiert til utklippstavle!
- Lommebokadresse kopiert til utklippstavle!
- Transaksjons-ID kopiert til utklippstavle!
- Kopiering skrudd av for sikkerhetsgrunner!
-
- Kan ikke hente vekslingskurs!\nBruk XMR/XMR eller prøv igjen
-
- Lag lommebok
- Lommeboknavn
- Lommebokpassord
- [Allow to open wallet using fingerprint]
- [Fingerprint Authentication
-
With fingerprint authentication enabled, you can view wallet balance and receive funds
- without entering password.
-
But for additional security, monerujo will still require you to enter password when
- viewing wallet details or sending funds.
- Security Warning
-
Finally, monerujo wants to remind you that anyone who can get your fingerprint will be
- able to peep into your wallet balance.
-
For instance, a malicious user around you can open your wallet when you are asleep.
- Are you sure to enable this function?
- ]]>]
- [Passordene stemmer ikke overens]
- [Passord kan ikke være tomt]
- Lag meg en lommebok!
- Jeg har notert informasjonen ovenfor!
-
- Gi meg et navn!
- Lommebok eksisterer!
- Kan ikke begynne med .
- Lager lommebok
- Lommebok lagd
-
- Skriv inn nummer eller dato (ÅÅÅÅ-MM-DD)
-
- Nøkler
- Ny
- Seed
- View
-
- Offentlig adresse
- View-nøkkel
- Spend-nøkkel
- 25-ord mnemonisk seed
- Gjenopprettelseshøyde- eller dato (ÅÅÅÅ-MM-DD)
-
- Offentlig adresse
- View-nøkkel
- Spend-nøkkel
- Mnemonisk seed
- [Lommebokfiler gjenopprettelsespassord]
-
- Skriv inn gyldig nøkkel
- Skriv inn gyldig adresse
- Skriv inn ditt 25-ord lange seed
-
- Privat notat (valgfritt)
- Generer
- Bruk mine søte moneroj
- Bruk mine søte moneroj (%1$s)
- Ikke en QR-kode
- Ikke en gyldig betalings-QR-kode
- Ikke en gyldig adresse
- Send
- Saldo: %1$s XMR
- Adresse
- Mengde
- Bekreft
- Ferdig
-
- Antall
- Avgift (XMR)
- Avgift
- Totalt (XMR)
- Totalt
-
- %1$s XMR
- +%1$s avgift
-
- Error med å lage transaksjon
-
- Avgift %1$s
- (%1$s)
- feila
- - %1$s
- + %1$s
-
- Tidsstempel
- TX ID
- TX-nøkkel
- Destinasjon
- Betalings-ID
- Blokk
- Mengde
- Avgift
- Overføringer
- Notater
- (valgfritt)
- Transaksjonsdetaljer
-
- VENTENDE
- FEILA
-
- Mengde
- Kunne ikke åpne lommebok!
-
- Maks. %1$s
- Min. 0
- XMR ikke et tall
-
- Sensitive data vil nå bli vist.\nSe over skulderen din!
- Jeg er trygg
- Ta meg tilbake!
- Detaljer
-
- Ja, gjør det!
- Nei takk!
-
- Lag ny lommebok
- Gjenoprett bare-se lommebok
- Gjenoprett lommebok fra private nøkler
- Gjenoprett lommebok fra 25-ord seed
-
- Create Account
- Added new account #%1$d
- Account #
-
- Send all confirmed funds in this account!
- Subaddress
- Public Subaddress #%1$d: %2$s
-
- Language
- Use System Language
-
- Restore from Ledger Nano
-
- Communicating with Ledger
- Confirmation on Ledger required!
- Retrieving subaddresses
- Verifying keys
- Doing crazy maths
- Hashing stuff
- Please (re)connect Ledger device
-
- Creating account
-
- %1$s attached
- %1$s detached
-
- Writing Tag
- Writing Tag failed!
- Writing Tag successful
- Tag does not support NDEF!
- Tag provides %1$d bytes, but we need %2$d!
- I don\'t understand the Tag!
- I don\'t know what you want!
- NFC Available!
-
- Description (optional)
-
- OpenAlias address not available
- OpenAlias secure ✔
- Resolving OpenAlias…
- OpenAlias without DNSSEC - address may be spoofed
-
- Node version incompatible - please upgrade!
-
- Detaljer
- Street Mode
-
- Node-o-matiC enabled, tap for more info.
- Last block updated: %1$s
- Nodes
- Node Name (Optional)
- Hostname
- Port
- Username (Optional)
- Password (Optional)
- Cannot resolve host
- We need this!
- Must be numeric
- Must be 1–65535
- Add Node
- Touch to refresh!
- CONNECTION ERROR %1$d
- CONNECTION ERROR
- AUTHENTICATION FAILED
- Test Result:
- Height: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- Testing IP: %1$s …
- Please wait for scan to finish
- Touch to select or add nodes
- Add nodes manually or pull down to scan
- Scanning network…
- Automatically bookmarked best %1$d nodes
- Test
-
- Receiver
-
- EVERYTHING!
-
- Convert Ledger Seed
- Ledger Seed Words
- Ledger Passphrase (optional)
- Invalid Ledger Seed!
- Entering your Ledger Seed here is a major security risk!
-
- Restore Height
-
- Start Monero App on %1$s
-
- Rescan!
-
- I get it!
- Next
- I\'m ready!
-
- Welcome to Monerujo!
- This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.
- Keep your seed safe
- The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.
- Send Crypto
- Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.
- Nodes, your way
- Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.
- Send with fingerprint
- You\'re now able to send XMR with just your fingerprint if you enabled it. To request the password, just disable fingerprint access.
-
- Dark Mode
-
- Auto
- Day
- Night
-
- There is nothing here\nPlease create or restore a wallet
-
- Restore default nodes
- Restoring already in progress…
-
- Last Block: %1$d seconds ago
- Last Block: %1$d minutes ago
- Last Block: %1$d hours ago
- Last Block: %1$d days ago
-
- Cannot get quote
- Check amount and try again
-
- Ambiguous address.
- Please select the type above.
- ]]>
-
- Please enter or scan a %1$s address.
- You'll send XMR and the receiver will get %2$s using the SideShift.ai service.
- ]]>
-
- Please enter or scan a Monero address.
- ]]>
-
- Subaddresses
- Subaddress Name
- Too many unused addresses - use some to enable creating more!
- Too many unused accounts - use some to enable creating more!
- Transactions for this subaddress:
- No transactions for this subaddress yet
- Select a subaddress
- Long-press for details
-
- This wallet will be deleted. Your funds will be gone forever unless you have your seed or a working backup to recover it.
- Delete
- Delete failed!
-
- Import wallet
- Import failed!
-
- Reset wallet!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-nl/about.xml b/app/src/main/res/values-nl/about.xml
deleted file mode 100644
index 6697d6a..0000000
--- a/app/src/main/res/values-nl/about.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
- Sluiten
- Ik ben monerujo
- Versie %1$s (%2$d)
-
- Makers
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo e.a.
-
Deze pagina geeft informatie over ons beleid met betrekking tot het verzamelen, gebruiken en openbaar maken van persoonlijke gegevens die we ontvangen van gebruikers van onze app (monerujo: Monero-portemonnee).
-
-
Door deze app te gebruiken ga je akkoord met het verzamelen en gebruiken van gegevens volgens dit beleid.
-
-
Verzamelde gegevens
-
Persoonlijke gegevens zijn alle gegevens waarmee iemand kan worden geïdentificeerd.
-
-
Monero-sleutels en openbare Monero-adressen worden lokaal verzameld en verwerkt door de app, om transacties in versleutelde vorm te kunnen verwerken en verzenden op het Monero-netwerk.
-
-
Verder worden er geen persoonlijke gegevens verzameld door de app.
-
Als je de optionele wisselkoersfunctie gebruikt, haalt monerujo de wisselkoers op via de openbare API van coinmarketcap.com.
- Zie het privacybeleid op https://coinmarketcap.com/privacy voor meer informatie over hoe de gegevens in je aanvragen worden verzameld.
-
Als je de app gebruikt om naar BTC-adressen te betalen, maak je gebruik van de service SideShift.ai.
- Zie hun privacybeleid op https://sideshift.ai/ voor meer informatie. Monerujo verzendt het BTC-adres en -bedrag van de bestemming naar SideShift.ai. Je IP-adres kan ook worden bewaard.
-
App-machtigingen
-
-
INTERNET: Verbinding maken met het Monero-netwerk via een Monero-node
-
READ_EXTERNAL_STORAGE: Portemonneebestanden lezen die zijn opgeslagen op het apparaat
-
WRITE_EXTERNAL_STORAGE: Schrijven naar portemonneebestanden die zijn opgeslagen op het apparaat
-
WAKE_LOCK: Apparaat actief houden tijdens het synchroniseren
-
CAMERA: QR-codes scannen om Monero te ontvangen
-
-
Wijzigingen van dit Privacybeleid
-
Dit Privacybeleid kan van tijd tot tijd worden bijgewerkt. We kondigen wijzigingen aan door het nieuwe Privacybeleid te publiceren in de app en op de website www.monerujo.io. We raden je aan om af en toe te controleren of dit Privacybeleid is gewijzigd.
-
Laatste wijziging van dit Privacybeleid: 10 november 2017.
-
-
Contact
-
Als je vragen hebt over ons Privacybeleid, of over hoe je gegevens worden verzameld en verwerkt, kun je een e-mail naar privacy@monerujo.io sturen (in het Engels).
-
Voer een unieke naam en wachtwoord in.
- Met het wachtwoord worden de gegevens in je portemonnee op dit apparaat beveiligd. Gebruik een sterk wachtwoord - of liever een wachtzin van meerdere woorden.
-
Schrijf je hersteltekst op!
-
Op het volgende scherm wordt de hersteltekst (\"mnemonic seed\") van 25 woorden getoond.
- Dit is het enige dat je nodig hebt om later je portemonnee te herstellen en volledige toegang tot je geld te krijgen.
- Het is belangrijk om deze gegevens verborgen te houden, want hiermee kan iedereen volledige toegang tot je portemonnee krijgen, met alle gevolgen van dien.
-
Als je het wachtwoord van je portemonnee kwijtraakt, kun je nog steeds je portemonnee herstellen met de hersteltekst.
-
Maar het is niet mogelijk om je hersteltekst terug te vinden als je deze kwijtraakt. Dan ben je ook je geld kwijt!
- Je kunt de hersteltekst niet veranderen. Als de hersteltekst wordt gestolen of niet langer geheim is, moet je je geld overmaken naar een nieuwe portemonnee (met een nieuwe hersteltekst). Daarom is het het beste dat je back-ups van je hersteltekst maakt door de 25 woorden op te schrijven en op meerdere veilige plekken op te slaan.
- ]]>
-
- Portemonnee maken - Hersteltekst
-
Als je al een Monero-adres hebt en de transacties wilt ophalen vanuit de blockchain.
-
Voer een unieke naam en wachtwoord in. Met het wachtwoord worden de gegevens in je portemonnee op dit apparaat beveiligd.
- Gebruik een sterk wachtwoord - of liever een wachtzin van meerdere woorden.
-
Voer je hersteltekst in het veld \"Hersteltekst\" in.
-
Voer in het veld \"Herstelpunt\" het bloknummer in van de eerste transactie die voor dit adres is gebruikt. Je kunt ook een datum gebruiken, met de indeling JJJJ-MM-DD. Als je het niet zeker weet, kun je een schatting invoeren van de datum/blokhoogte voordat je het adres van deze portemonnee voor het eerst hebt gebruikt.
- ]]>
-
- Portemonnee maken - Ledger
-
Je wilt de portemonnee gebruiken die op je Ledger Nano S staat.
-
Je geheime sleutel wordt nooit opgehaald van je Ledger, dus je moet het apparaat iedere keer aansluiten als je deze portemonnee wilt gebruiken.
-
Voer een unieke naam en wachtwoord in. Met het wachtwoord worden de gegevens in je portemonnee op je Android-apparaat beveiligd. Gebruik een sterk wachtwoord - of liever een wachtzin van meerdere woorden.
-
Voer in het veld \"Herstelpunt\" het bloknummer in van de eerste transactie die voor dit adres is gebruikt. Je kunt ook een datum gebruiken, met de indeling JJJJ-MM-DD. Als je het niet zeker weet, kun je een schatting invoeren van de datum/blokhoogte voordat je het adres van deze portemonnee voor het eerst hebt gebruikt.
- ]]>
-
- Portemonnee maken - Sleutels
-
Als je een Monero-adres herstelt met je sleutels.
-
Voer een unieke naam en wachtwoord in. Met het wachtwoord worden de gegevens in je portemonnee op dit apparaat beveiligd.
- Gebruik een sterk wachtwoord - of liever een wachtzin van meerdere woorden.
-
Voer je Monero-adres in het veld \"Openbaar adres\" in, en vul de velden \"Alleen-lezen sleutel\" en \"Bestedingssleutel\" in.
-
Voer in het veld \"Herstelpunt\" het bloknummer in van de eerste transactie die voor dit adres is gebruikt. Je kunt ook een datum gebruiken, met de indeling JJJJ-MM-DD. Als je het niet zeker weet, kun je een schatting invoeren van de datum/blokhoogte voordat je het adres van deze portemonnee voor het eerst hebt gebruikt.
- ]]>
-
- Portemonnee maken - Alleen-lezen
-
Als je alleen de binnenkomende transacties voor een portemonnee wilt bekijken.
-
Voer een unieke naam en wachtwoord in. Met het wachtwoord worden de gegevens in je portemonnee op dit apparaat beveiligd.
- Gebruik een sterk wachtwoord - of liever een wachtzin van meerdere woorden.
-
Voer je Monero-adres in het veld \"Openbaar adres\" in, en vul het veld \"Alleen-lezen sleutel\" in.
-
Voer in het veld \"Herstelpunt\" het bloknummer in van de eerste transactie die voor dit adres is gebruikt. Je kunt ook een datum gebruiken, met de indeling JJJJ-MM-DD. Als je het niet zeker weet, kun je een schatting invoeren van de datum/blokhoogte voordat je het adres van deze portemonnee voor het eerst hebt gebruikt.
- ]]>
-
- Portemonneegegevens
-
Openbaar adres
- Je openbare adres is te vergelijken met een bankrekeningnummer dat je aan iedereen kunt geven zonder het risico te lopen dat je je moneroj kwijtraakt. Anderen gebruiken dit adres om moneroj naar jouw portemonnee te sturen.
-
Hersteltekst
- Dit is het enige dat je nodig hebt om later je portemonnee te herstellen en volledige toegang tot je geld te krijgen. Het is belangrijk om deze gegevens verborgen te houden, want hiermee kan iedereen volledige toegang tot je moneroj krijgen. Als je de hersteltekst nog niet hebt opgeschreven op een veilige plek, doe het dan nu!
-
Wachtwoord voor portemonneebestanden
- Zorg dat je dit wachtwoord opschrijft. Als je dit apparaat opnieuw instelt of de app verwijdert, heb je dit wachtwoord nodig om je portemonnee weer te gebruiken.
-
CrAzYpass
- Als dit wachtwoord bestaat uit 52 alfanumerieke tekens in groepen van 4 - gefeliciteerd!
- Je portemonneebestanden worden beveiligd met een 256-bits sleutel die is gegenereerd door beveiligingsfuncties van je apparaat op basis van de wachtzin die je hebt gekozen (door deze te maken of te wijzigen). Dit maakt het erg moeilijk om te hacken!
- Deze functie is verplicht voor alle nieuw gemaakte portemonnees.
-
Ouderwets wachtwoord
- Als je wachtzin hierbij staat, zijn je portemonneebestanden niet zo goed beveiligd als wanneer je CrAzYpass gebruikt. Selecteer \"Wachtzin wijzigen\" in het menu om dit op te lossen. Nadat je een nieuwe wachtzin hebt ingevoerd (of dezelfde als de vorige keer), wordt er een nieuwe CrAzYpass voor je gegenereerd, waarmee je portemonneebestanden worden beveiligd. Schrijf deze op!
-
Portemonnee met CrAzYpass
- Als je Monerujo ooit opnieuw moet installeren (bijvoorbeeld als je je telefoon opnieuw hebt ingesteld of als je een nieuwe telefoon hebt) of als je je portemonneebestanden op een ander apparaat of een computer wilt gebruiken, moet je dit herstelwachtwoord invoeren om weer toegang tot je portemonnee te krijgen.
- Door \"Wachtzin wijzigen\" te selecteren in het menu kun je een andere wachtzin kiezen. Let op: hierdoor wordt een nieuw herstelwachtwoord gegenereerd. Schrijf het op!
-
Alleen-lezen sleutel
- Met je alleen-lezen sleutel kunnen binnenkomende transacties voor je portemonnee worden gevolgd zonder toestemming te geven om het geld in je portemonnee uit te geven.
-
Bestedingssleutel
- Met je bestedingssleutel kan iedereen de moneroj in je portemonnee uitgeven. Laat deze sleutel dus aan niemand zien; bewaar hem veilig, net als je hersteltekst.
- ]]>
-
- Portemonneelijst
-
Node
-
Monerujo gebruikt een externe node om te communiceren met het Monero-netwerk zonder zelf een exemplaar van de hele blockchain te hoeven downloaden en opslaan. Hier vind je een lijst met populaire externe nodes, of kun je leren hoe je er zelf een draait: https://moneroworld.com/
-
Bepaalde externe nodes zijn vooraf ingesteld in Monerujo. De laatste vijf gebruikte nodes worden onthouden.
-
Portemonnees
-
Hier worden je portemonnees weergegeven. Ze zijn opgeslagen in de map monerujo in de interne opslag van je apparaat. Je kunt ze vinden in een bestandenverkenner-app.
- Maak regelmatig back-ups van deze map naar opslag elders, voor het geval dat je apparaat in brand vliegt of wordt gestolen.
-
Selecteer een portemonnee om te openen of tik op de \"+\" om een nieuwe te maken.
- Of selecteer een van de portemonnee-bewerkingen:
-
Details
-
Details, hersteltekst en sleutels weergeven.
-
Ontvangen
-
Een QR-code maken voor het ontvangen van moneroj.
-
Hernoemen
-
De portemonnee een andere naam geven. De naam van back-ups wordt niet veranderd.
-
Back-up
-
Een kopie maken van de portemonnee in de map backups in de map monerujo. Hierdoor worden eerdere kopieën overschreven.
-
Archiveren
-
Een back-up maken en vervolgens de portemonnee verwijderen. De kopie blijft in de map backups staan. Heb je je back-ups niet meer nodig? Verwijder ze dan met een bestandenverkenner of verwijder de app veilig.
- ]]>
-
- Transactiedetails
-
Bestemming
- Dit is het openbare adres van de portemonnee waarnaar je Monero verstuurt.
-
Betalings-ID
- Je kunt een Betalings-ID gebruiken om aan te geven waarom je Monero verzendt. Dit is volledig optioneel en blijft vertrouwelijk tussen beide partijen. Een bedrijf kan bijvoorbeeld jouw transactie koppelen aan een artikel dat je hebt gekocht.
-
Transactie-ID
- Met je transactie-ID kun je de versleutelde transactie vinden in een Monero-blockexplorer, bijvoorbeeld https://xmrchain.net/
-
Transactiesleutel
- Dit is de geheime sleutel van je transactie. Bewaar deze veilig, want als iemand bekendmaakt welke handtekening in een ring van jou is, wordt je transactie openbaar.
-
Blok
- Dit is het blok waarin je transactie is opgenomen.
- ]]>
-
- Verzenden
-
Adres ontvanger
-
Dit is het openbare adres van de portemonnee waar je moneroj naartoe stuurt. Je kunt dit kopiëren via het klembord, een QR-code scannen of het adres handmatig invoeren. Controleer dit nauwkeurig om er zeker van te zijn dat je geen geld naar het verkeerde adres stuurt.
-
In addition to using an XMR address, you can also use
-
-
an OpenAlias for XMR or BTC
-
a BTC address
-
- Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai
- for details). See the section on sending BTC below.
-
BTC verzenden
-
SideShift.ai
-
SideShift.ai is een externe service waarmee je Monero kunt inwisselen voor Bitcoin.
- We gebruiken de API van SideShift.ai om Bitcoin-betalingen te integreren in Monerujo. Neem eens een kijkje op https://sideshift.ai en besluit zelf of je dit wilt gebruiken. Het Monerujo-team is niet verbonden aan SideShift.ai en kan je niet helpen met deze service.
-
Wisselkoers SideShift.ai
-
Op het scherm \"Bedrag\" worden de huidige waarden voor het gebruik van SideShift.ai weergegeven. Hierbij staat de huidige wisselkoers, maar ook het maximale en minimale BTC-bedrag. Houd er rekening mee dat deze koers op dit moment nog niet wordt gegarandeerd.
-
SideShift.ai-opdracht
-
Op het scherm \"Bevestigen\" wordt de eigenlijke SideShift.ai-opdracht weergegeven. Deze opdracht is geldig voor een beperkte tijd. Er wordt afgeteld op de knop \"Uitgeven\". De wisselkoers kan hier anders zijn dan de schatting die op eerdere schermen is weergegeven.
-
Geheime sleutel SideShift.ai
-
Omdat Monerujo alleen het Monero-gedeelte van je transactie verwerkt, kun je je geheime sleutel voor SideShift.ai gebruiken om het Bitcoin-gedeelte van de opdracht te volgen op de SideShift.ai-website.
-
SideShift.ai telt af!
-
Als de knop heeft afgeteld naar nul, moet je een nieuw aanbod van SideShift.ai aanvragen. Ga daarvoor terug naar de vorige stap en open het scherm \"Bevestigen\" opnieuw.
- ]]>
-
- BTC verzenden
-
SideShift.ai
-
SideShift.ai is een externe service waarmee je Monero kunt inwisselen voor Bitcoin.
- We gebruiken de API van SideShift.ai om Bitcoin-betalingen te integreren in Monerujo. Neem eens een kijkje op https://sideshift.ai en besluit zelf of je dit wilt gebruiken. Het Monerujo-team is niet verbonden aan SideShift.ai en kan je niet helpen met deze service.
-
Wisselkoers SideShift.ai
-
Op het scherm \"Bedrag\" worden de huidige waarden voor het gebruik van SideShift.ai weergegeven. Hierbij staat de huidige wisselkoers, maar ook het maximale en minimale BTC-bedrag. Houd er rekening mee dat deze koers op dit moment nog niet wordt gegarandeerd.
-
SideShift.ai-opdracht
-
Op het scherm \"Bevestigen\" wordt de eigenlijke SideShift.ai-opdracht weergegeven. Deze opdracht is geldig voor een beperkte tijd. Er wordt afgeteld op de knop \"Uitgeven\". De wisselkoers kan hier anders zijn dan de schatting die op eerdere schermen is weergegeven.
-
Geheime sleutel SideShift.ai
-
Omdat Monerujo alleen het Monero-gedeelte van je transactie verwerkt, kun je je geheime sleutel voor SideShift.ai gebruiken om het Bitcoin-gedeelte van de opdracht te volgen op de SideShift.ai-website.
-
SideShift.ai telt af!
-
Als de knop heeft afgeteld naar nul, moet je een nieuw aanbod van SideShift.ai aanvragen. Ga daarvoor terug naar de vorige stap en open het scherm \"Bevestigen\" opnieuw.
- ]]>
-
- De portemonnee
-
Street Mode
-
Street mode can be enabled/disabled in the menu or Gunther\'s head icon. In this mode, your
- balance is not shown on any screen so you can safely use your wallet on the street, a pub or
- other public place. Previous transactions are also hidden. New transactions will be shown, so
- you can see that you have sent/received sweet Moneroj!
-
Scannen
- Omdat Monero graag alles geheim houdt, scannen we iedere keer als je een Monerujo-portemonnee opent de blockchain om te kijken of er nieuwe moneroj naar je portemonnee zijn overgemaakt. Hierbij wordt alleen informatie die bij je portemonnee hoort opgeslagen op je telefoon. Soms kan het even duren als je een tijd niet hebt gesynchroniseerd.
-
Het saldo
-
Help! Het saldo van mijn portemonnee is verdwenen of niet bevestigd!
- Geen paniek! Wanneer je geld uit je portemonnee verzend, wordt een deel van je saldo tijdelijk aangegeven als onbevestigd.
- Dit is het gevolg van hoe Monero wordt gemengd op de blockchain en hoe wisselgeld werkt.
- Lees meer over wisselgeld op https://getmonero.org/resources/moneropedia/change.html
-
Transactielijst
-
Een lijst van de transacties van de portemonnee. In een alleen-lezen portemonnee worden alleen binnenkomende transacties weergegeven.
-
- ]]>
-
- Nodes
-
TL;DR
-
Refresh the nodes list by pulling down & bookmark 3–5 nodes to allow Monerujo
- to choose the best one for you!
-
What's a Node?
-
Monerujo uses a Remote Node (sometimes also called Daemon) to communicate with
- the Monero Network without having to download and store a copy of the
- whole blockchain itself.
-
Node List
-
If the list is empty, you can either add new nodes manually or let Monerujo
- scan the network for you. Or both. Read on…
-
The node list shows all currently known nodes. Additionally, the timestamp
- of the latest block known to each node is shown under the node name. An icon
- representing the node's response behaviour
- (which indicates the level of connectivity to be expected)
- is shown next to each node.
-
Any node in the list can be bookmarked for later use.
- Nodes which are not bookmarked will be forgotten.
-
Monerujo will choose the optimal bookmarked node each time you use it.
- It does this by checking the blockheight (how up-to-date
- is the node?) as well as the response behaviour (how fast does the node respond to requests?).
-
The list is sorted by these characteristics, so the top node would be the one Monerujo
- would choose right now. The bottom of the list would show very slow or unavailable nodes.
-
Add a Node
-
By touching the "Add Node" button at the bottom, you will be asked to
- enter the node details in the following dialog.
- The "Address" is the hostname or IP-address of the node - this is the only
- mandatory entry.
- Enter the "Port" if the node runs on a non-default port (e.g. 18089).
- You can also optionally name the node, so you can identify it easier later on.
- Some nodes require credentials to use them. Enter the provided username &
- password in the appropriate fields. Now you can "Test" these setting.
- The "Test Results" will display the blockheight, response time and actual IP used.
- The result may also be an error - usually because the hostname provided is
- not reachable in a sensible amount of time or the credentials are incorrect.
- Or the hostname/port combination does not point to an actual Monero Node!
- Once the test passes (no error) - you're set to press "OK" to save &
- bookmark this node.
-
Scan for Nodes
-
Additionally, you can scan the network for nodes. Monerujo will start
- scanning the network for Remote Nodes on port 18089. It begins by asking your
- bookmarked nodes for other peers in the Monero P2P network and then continues
- by asking those for their peers, and so on. If you have no bookmarked nodes
- (or they don't tell us about their peers),
- Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
- scan stops when it finds 10 remote nodes in total.
- ]]>
-
-
-
- Using a payment link
-
You have started monerujo with a payment link. In order to send funds, please do the following:
-
- 1. Open the wallet you want to spend from
- 2. Wait until the wallet is synced & the "Give" button appears
- 3. Touch the "Give" button
-
-
The payment details will be filled in. Check them and proceed like for any other transaction.
- ]]>
-
- Got it!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
deleted file mode 100644
index afd8698..0000000
--- a/app/src/main/res/values-nl/strings.xml
+++ /dev/null
@@ -1,452 +0,0 @@
-
-
- Portemonnee
-
- Info
- Privacybeleid
-
- Delen
- Help
- Ontvangen
- Hernoemen
- Back-up
- Wachtzin wijzigen
-
- Blijf typen…
- Mwah…
- Kom op, dat kan beter!
- Je bent er bijna…
- Ja, nu ben je een hacker!
-
- Portemonnees
- Makers
- OK
- Annuleren
- Sluiten
- Meer informatie
-
- Verzonden
- Klaar
-
- Tik voor QR-code
-
- BTC-betaling ingeschakeld. Tik voor meer info.
- Ledger ingeschakeld. Tik voor meer info.
-
- Je hebt een %1$s-adres ingevoerd.
- Je verzendt XMR en de ontvanger krijgt %1$s via SideShift.ai.
- ]]>
-
- SideShift.ai-opdracht
-
- %1$s %2$s
-
- Wacht op bevestiging
- Wacht op betaling
- Fout bij SideShift.ai (%1$s)
- %1$s verzonden!
- Aanvragen…
-
- Je kunt %1$s — %2$s %4$s verzenden.
- SideShift.ai biedt nu een wisselkoers van %3$s %4$s/XMR aan.
- ]]>
-
- Saldo: %2$s %3$s (%1$s XMR)
-
- ✔ Betalings-ID geïntegreerd
- Transactie wordt voorbereid
-
- SideShift.ai-opdracht maken
- SideShift.ai-opdracht aanvragen
- Monero-transactie voorbereiden
-
- SideShift.ai-parameters aanvragen
-
- FOUT BIJ SideShift.ai
- Code: %1$d
-
- Opnieuw proberen
- Nu zitten we vast…
- Oeps, SideShift.ai is op dit moment niet beschikbaar.
-
- %1$s %3$s = %2$s XMR
- (Koers: %1$s %2$s/XMR)
-
- Ga naar SideShift.ai voor hulp en traceren
- Geheime sleutel\nSideShift.ai
- Geheime sleutel SideShift.ai
- %1$s-doeladres
- Bedrag
-
- Transactie-ID
- Doeladres
- Opmerkingen
-
- Back-up wordt gemaakt
- Wordt gearchiveerd
- Naam wordt gewijzigd
- Wachtwoord wordt gewijzigd
-
- Bezig met voltooien…\nDit kan even duren.
-
- Back-up mislukt!
- Hernoemen mislukt!
- Wachtwoord wijzigen mislukt!
- Wachtwoord is gewijzigd
-
- Node
- Portemonnee laden…
- Portemonnee opgeslagen
- Portemonnee opslaan mislukt!
- Verbinden…
- Geen verbinding met node.\nControleer naam/wachtwoord.
- Node ongeldig.\nProbeer een andere.
- Kan node niet bereiken.\nProbeer opnieuw of andere.
-
- Geen verbinding
-
- Transactie mislukt: %1$s
-
- Je hebt te lang gewacht, vriend!
-
- Ik ben nog bezig met de vorige…
-
- %1$s hernoemen
-
- Nieuwe wachtzin voor %1$s
- Herhaal wachtzin voor %1$s
- Wachtwoord voor %1$s
- Je kunt ook je vingerafdruk gebruiken.\nRaak de sensor aan.
- Portemonnee openen…
- Vingerafdruk niet herkend. Probeer het opnieuw.
- Onjuist wachtwoord!
- Opgeslagen wachtwoord is onjuist\nVoer wachtwoord handmatig in.
- Portemonnee bestaat niet!
- Node-adres moet ingesteld zijn!
- Portemonnee komt niet overeen met netwerk
-
- (Alleen-lezen)
-
- Ontvangen
- Geven
-
- + %1$s XMR onbevestigd
-
- monerujo-service
-
- Gesynchroniseerd:
- Blokken te gaan
- Scannen:
-
- Kan niet schrijven naar externe opslag! Help!
- We hebben die machtiging voor Externe Opslag nodig!
- Geen camera = geen QR-codes scannen!
-
- Alleen-lezen sleutel
- Openbaar adres
- Sleutel
- Alleen-lezen sleutel gekopieerd naar klembord!
- Sleutel gekopieerd naar klembord!
- Portemonnee-adres gekopieerd naar klembord!
- Transactie-ID gekopieerd naar klembord!
- Kopiëren uitgeschakeld voor de veiligheid!
-
- Kan wisselkoers niet ophalen!\nGebruik XMR/XMR of probeer opnieuw
-
- Portemonnee maken
- Naam portemonnee
- Wachtwoord portemonnee
- Openen met vingerafdruk toestaan
- Verificatie met vingerafdruk
-
Als je verificatie met vingerafdruk toestaat, kun je het saldo van je portemonnee bekijken en geld ontvangen zonder een wachtwoord in te voeren.
-
Maar voor de veiligheid vereist monerujo wel dat je een wachtwoord invoert om details van de portemonnee te bekijken of geld over te maken.
- Beveiligingswaarschuwing
-
Houd er rekening mee dat iedereen die toegang heeft tot je vingerafdruk het saldo van je portemonnee kan bekijken.
-
Een kwaadwillige gebruiker kan bijvoorbeeld je portemonnee openen terwijl je slaapt.
- Weet je zeker dat je deze functie wilt inschakelen?
- ]]>
- Wachtwoorden komen niet overeen
- Wachtwoord mag niet leeg zijn
- Maak die portemonnee nou maar!
- Ik heb de hersteltekst opgeschreven
-
- Geef me een naam!
- Portemonnee bestaat al!
- Mag niet beginnen met .
- Portemonnee wordt gemaakt
- Portemonnee is gemaakt
-
- Voer getal of datum (JJJJ-MM-DD) in
-
- Sleutels
- Nieuw
- Hersteltekst
- Alleen-lezen
-
- Openbaar adres
- Alleen-lezen sleutel
- Bestedingssleutel
- Hersteltekst van 25 woorden
- Herstelpunt of datum (JJJJ-MM-DD)
-
- Openbaar adres
- Alleen-lezen sleutel
- Bestedingssleutel
- Hersteltekst
- Wachtwoord voor portemonneebestanden
-
- Voer geldige sleutel in
- Voer geldig adres in
- Voer je 25 woorden in
-
- Opmerkingen voor jezelf (optioneel)
- Genereren
- Geef mijn mooie moneroj uit
- Geef mijn mooie moneroj uit (%1$s)
- Geen QR-code
- Geen geldige QR-code voor betaling
- Geen geldig adres
- Verzenden
- Saldo: %1$s XMR
- Adres
- Bedrag
- Bevestigen
- Klaar
-
- Bedrag
- Vergoeding (XMR)
- Vergoeding
- Totaal (XMR)
- Totaal
-
- %1$s XMR
- +%1$s kosten
-
- Fout bij transactie maken
-
- kosten %1$s
- (%1$s)
- mislukt
- - %1$s
- + %1$s
-
- Tijdstempel
- Transactie-ID
- Transactiesleutel
- Bestemming
- Betalings-ID
- Blok
- Bedrag
- Vergoeding
- Betalingen
- Opmerkingen
- (optioneel)
- Transactiedetails
-
- WACHTEN
- MISLUKT
-
- Bedrag
- Kan portemonnee niet openen!
-
- Max. %1$s
- Min. 0
- XMR geen getal
-
- Nu worden vertrouwelijke gegevens getoond.\nKijk achter je!
- Het is veilig.
- Ga terug!
- Details
-
- Deze portemonnee zal worden verwijderd. Uw geld zal voor altijd weg zijn, tenzij u uw zaad of een werkende back-up hebt om het te herstellen.
- Ja, doe dat!
- Nee, niet doen!
-
- Nieuwe portemonnee
- Alleen-lezen portemonnee herstellen
- Portemonnee herstellen met privésleutels
- Voer je 25 woorden in
-
- Account maken
- Nieuw account #%1$d toegevoegd
- Accountnr.
-
- Al het bevestigde geld in dit account verzenden!
- Subadres
- Openbaar subadres #%1$d: %2$s
-
- Taal
- Systeemtaal gebruiken
-
- Herstellen met Ledger Nano
-
- Communiceren met Ledger…
- Bevestiging op Ledger vereist!
- Subadressen ophalen…
- Sleutels verifiëren…
- Magisch rekenwerk…
- Hashes berekenen…
- Maak (opnieuw) verbinding met Ledger
-
- Account maken…
-
- %1$s gekoppeld
- %1$s losgemaakt
-
- Tag wordt geschreven
- Tag schrijven mislukt!
- Tag is geschreven
- Tag ondersteunt NDEF niet!
- Tag levert %1$d bytes, maar we hebben er %2$d nodig!
- Ik begrijp de Tag niet!
- Ik weet niet wat je wilt!
- NFC beschikbaar!
-
- Omschrijving (optioneel)
-
- OpenAlias-adres niet beschikbaar
- OpenAlias veilig ✔
- OpenAlias omzetten…
- OpenAlias zonder DNSSEC - adres kan nep zijn
-
- Incompatibele versie van node. Je moet upgraden!
-
- Details
- Street Mode
-
- Node-o-matiC enabled, tap for more info.
- Last block updated: %1$s
- Nodes
- Node Name (Optional)
- Hostname
- Port
- Username (Optional)
- Password (Optional)
- Cannot resolve host
- We need this!
- Must be numeric
- Must be 1–65535
- Add Node
- Touch to refresh!
- CONNECTION ERROR %1$d
- CONNECTION ERROR
- AUTHENTICATION FAILED
- Test Result:
- Height: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- Testing IP: %1$s …
- Please wait for scan to finish
- Touch to select or add nodes
- Add nodes manually or pull down to scan
- Scanning network…
- Automatically bookmarked best %1$d nodes
- Test
-
- Backup successful
-
-
- Ontvanger
-
- EVERYTHING!
-
- Convert Ledger Seed
- Ledger Seed Words
- Ledger Passphrase (optional)
- Invalid Ledger Seed!
- Entering your Ledger Seed here is a major security risk!
-
- Herstelpunt
-
- Start Monero App on %1$s
-
- Rescan!
-
- I get it!
- Next
- I\'m ready!
-
- Welcome to Monerujo!
- This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.
- Keep your seed safe
- The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.
- Send Crypto
- Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.
- Nodes, your way
- Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.
- Send with fingerprint
- You\'re now able to send XMR with just your fingerprint if you enabled it. To request the password, just disable fingerprint access.
-
- Dark Mode
-
- Auto
- Day
- Night
-
- There is nothing here\nPlease create or restore a wallet
-
- Restore default nodes
- Restoring already in progress…
-
- Last Block: %1$d seconds ago
- Last Block: %1$d minutes ago
- Last Block: %1$d hours ago
- Last Block: %1$d days ago
-
- Cannot get quote
- Check amount and try again
-
- Ambiguous address.
- Please select the type above.
- ]]>
-
- Please enter or scan a %1$s address.
- You'll send XMR and the receiver will get %2$s using the SideShift.ai service.
- ]]>
-
- Please enter or scan a Monero address.
- ]]>
-
- Subaddresses
- Subaddress Name
- Too many unused addresses - use some to enable creating more!
- Too many unused accounts - use some to enable creating more!
- Transactions for this subaddress:
- No transactions for this subaddress yet
- Select a subaddress
- Long-press for details
-
- Delete
- Delete failed!
-
- Import wallet
- Import failed!
-
- Reset wallet!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-pt-rBR/about.xml b/app/src/main/res/values-pt-rBR/about.xml
deleted file mode 100755
index f59ba87..0000000
--- a/app/src/main/res/values-pt-rBR/about.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
- Fechar
- Eu sou o monerujo
- Versão %1$s (%2$d)
-
- Créditos
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo et al.
-
Esta página explica nossas políticas em relação a coleta, uso e
- divulgação das informações pessoais que recebemos dos usuários de nosso
- aplicativo (monerujo: carteira Monero).
-
-
Ao usar este aplicativo, você concorda com a coleta e uso das
- informações de acordo com este documento.
-
-
Dados Coletados
-
Dados pessoais consistem em todo tipo de informação que permite identificar um indivíduo.
-
-
Os endereços públicos e as chaves Monero são armazenados e processados localmente
- no objetivo de efetuar as transações e transmiti-las à rede Monero de forma encriptada.
-
-
Outros dados pessoais não são recolhidos pelo aplicativo.
-
Se você utilizar a funcionalidade de conversão (opcional), o monerujo buscará
- as cotações usando a API pública do coinmarketcap.com.
- Verifique sua política de privacidade em https://coinmarketcap.com/privacy para
- detalhes de como as requisições são coletadas.
-
-
Se você usar nosso aplicativo para fazer pagamentos em BTC, você estará
- usando o serviço SideShift.ai. Verifique sua política de privacidade em https://sideshift.ai/
- para detalhes. O monerujo envia o endereço de destino e valor ao serviço. Seu
- IP também pode ser coletado.
-
Permissões do aplicativo
-
-
INTERNET : Conectar à rede Monero via um nó remoto
-
READ_EXTERNAL_STORAGE : Ler os arquivos das carteiras no dispositivo
-
WRITE_EXTERNAL_STORAGE : Escrever os arquivos das carteiras no dispositivo
-
WAKE_LOCK : Mantém o dispositivo acordado ao sincronizar
-
CAMERA : Escanear códigos QR para transacionar Monero
-
-
Alterações a esta política de privacidade
-
Nós podemos alterar esta política de privacidade de tempos em tempos.
- Notificaremos quaisquer alterações atualizando este documento no aplicativo
- e no website oficial (www.monerujo.io)
- Aconselhamos que você revisite esta política de privacidade periodicamente.
-
Última atualização: 10 de Novembro de 2017.
-
-
Contate-nos
-
Se tiver alguma questão sobre nossa política de privacidade,
- ou sobre como os seus dados são recolhidos e processados,
- por favor envie um email para privacy@monerujo.io.
-
Escreva um nome para sua carteira e uma senha forte.
- A senha é utilizada para proteger as informações da carteira. Use uma senha forte e comprida.
-
Anote a semente mnemônica!
-
Na próxima tela será exibida a sua \"semente mnemônica\".
- Essa lista de palavras é a única informação necessária para restaurar sua carteira no futuro
- e recuperar o acesso aos seus fundos.
- Manter a semente num local seguro e privado é muito importante, já que ela dá acesso completo
- aos seus fundos para qualquer pessoa!
-
Se você perder ou esquecer sua senha, ainda é possível recuperar a carteira através da semente mnemônica.
-
Não existe uma maneira de recuperar a semente mnemônica, se você perdê-la seu dinheiro será perdido junto!
- A semente nunca pode ser alterada. Se ela for roubada ou comprometida de alguma maneira, será
- preciso movimentar os fundos para uma nova carteira (com uma nova semente).
- Portanto é melhor fazer um backup da sua semente
- mnemônica escrevendo-a a mão e guardando cópias em vários lugares seguros.
- ]]>
-
- Criar Carteira - Semente
-
Se você já tem um endereço Monero e quer restaurar suas transações e fundos!
-
Escreva um nome e senha únicos para sua carteira. A senha é utilizada para proteger os dados no Android.
- Use uma senha forte e comprida.
-
Escreva a semente no campo \"semente mnemônica\".
-
Caso lembre, escreva a altura (ID) do bloco da primeira transação que você fez neste endereço
- no campo \"restaurar da altura\". Você também pode indicar uma data no formato AAAA-MM-DD. Se você não tiver certeza,
- coloque uma data aproximada anterior a data da sua primeira transação.
- ]]>
-
- Criar Carteira - Ledger
-
Se você quer usar sua carteira do dispositivo Ledger Nano S.
-
Suas chaves nunca saem do dispositivo da Ledger, então é preciso conectá-lo
- sempre que você desejar usar a carteira.
-
Escreva um nome e senha únicos para sua carteira. A senha é utilizada para proteger os dados no Android.
- Use uma senha forte - ou melhor, use uma longa frase.
-
Caso lembre, escreva a altura (ID) do bloco da primeira transação que você fez neste endereço
- no campo \"restaurar da altura\". Você também pode indicar uma data no formato AAAA-MM-DD. Se você não tiver certeza,
- coloque uma data aproximada anterior a data da sua primeira transação.
- ]]>
-
- Criar Carteira - Chaves
-
Se você quer restaurar a carteira a partir das chaves privadas
-
Escreva um nome e senha únicos para sua carteira. A senha é utilizada para proteger os dados no Android.
- Use uma senha forte e comprida.
-
Escreva seu endereço Monero no campo \"Endereço público\" e preencha os campos \"Chave de visualização\" e \"Chave de gasto\".
-
Caso lembre, escreva a altura (ID) do bloco da primeira transação que você fez neste endereço
- no campo \"restaurar da altura\". Você também pode indicar uma data no formato AAAA-MM-DD. Se você não tiver certeza,
- coloque uma data aproximada anterior a data da sua primeira transação.
- ]]>
-
- Criar Carteira - Somente Leitura
-
Se você quer monitorar as transações que chegam na sua carteira.
-
Escreva um nome e senha únicos para sua carteira. A senha é utilizada para proteger os dados no Android.
- Use uma senha forte e comprida.
-
Escreva seu endereço Monero no campo \"Endereço público\" e preencha o campo \"Chave de visualização\".
-
Caso lembre, escreva a altura (ID) do bloco da primeira transação que você fez neste endereço
- no campo \"restaurar da altura\". Você também pode indicar uma data no formato AAAA-MM-DD. Se você não tiver certeza,
- coloque uma data aproximada anterior a data da sua primeira transação.
- ]]>
-
- Detalhes da carteira
-
Endereço público
- Seu endereço público é como se fosse o número da sua conta bancária: você pode compartilhá-lo com qualquer
- pessoa sem ter medo de perder seu Monero. As pessoas te enviarão Monero usando este endereço.
-
Semente Mnemônica
- Essa é a única informação necessária para recuperar sua carteira no futuro e obter controle absoluto de seus fundos.
- Manter essa informação privada e segura é muito importante, já que ela dá acesso total dos seus Moneros
- para qualquer pessoa! Se você não anotou as palavras em um local seguro, faça-o o mais rápido possível!
-
Senha dos arquivos da carteira
- Certifique-se de anotar e se lembrar desta senha. Caso você reinicie o dispositivo ou desinstale a aplicação, será preciso
- colocar a senha para acessar a carteira novamente.
-
SeNHaLoUCa
- Se a senha exibida tem 50 caracteres alfanuméricos em grupos de 4 - parabéns!
- Os arquivos da sua carteira estão protegidos com uma chave de 256-bits gerada pelo seu dispositivo baseada
- na senha que você escolheu (na hora de criar ou alterar a senha). Isso faz com que a carteira seja extremamente
- difícil de ser hackeada!
- Essa funcionalidade é obrigatória para todas as novas carteiras.
-
Senhas antigas
- Se esta é a sua senha, os arquivos da sua carteira não estão tão protegidos como se estivessem usando a SeNHaLoUCa.
- Para corrigir este problema, selecione \"Alterar senha\" no menu. Após escrever a nova senha (ou até mesmo a mesma),
- o aplicativo vai criar a SeNHaLoUCa para você e protegerá seus arquivos com ela.
- Não esqueça de anotá-la!
-
Carteiras com SeNHaLoUCa
- Se você precisar reinstalar o Monerujo (por exemplo, caso você compre um novo celular), ou se você quiser usar
- os arquivos da sua carteira em outro dispositivo ou computador, será preciso usar essa senha de restauração para
- ter acesso à carteira novamente.
- Ao selecionar "Alterar senha" no menu, você poderá escolher uma nova senha. Lembre-se que isso vai criar uma nova senha
- de restauração! Anote-a!
-
Chave de Visualização
- Sua chave de visualização pode ser usada para monitorar as transações que você recebe, sem precisar
- dar permissão para gastar os fundos da sua carteira.
-
Chave de Gasto
- Sua chave de gasto permite gastar o Monero que estiver na sua carteira, então não compartilhe esta chave com ninguém!
- Mantenha-a segura, assim como a semente mnemônica.
- ]]>
-
- Lista de Carteiras
-
Nó
-
O Monerujo usa nós remotos para se comunicar com a rede Monero sem precisar fazer o
- download do blockchain inteiro. Você pode consultar uma lista de nós remotos populares
- e aprender a como usar seu próprio nó em https://moneroworld.com/
-
O Monerujo já possui alguns nós remotos pré-definidos. Os últimos 5 nós usados ficam salvos.
-
Carteiras
-
Aqui ficam suas carteiras. Elas estão numa pasta chamada monerujo no armazenamento
- interno do seu dispositivo. Você pode usar um aplicativo de gerenciador de arquivos para vê-las.
- Você deve fazer backups desta pasta fora do celular regularmente caso seu dispositivo
- exploda ou seja roubado
-
Selecione uma carteira para abri-la ou toque em \"+\" para criar uma nova.
- Ou selecione uma das opções:
-
Detalhes
-
Mostra mais informações sobre a carteira, semente & chaves.
-
Receber
-
Cria um código QR para receber Monero.
-
Renomear
-
Renomeia a carteira. Backups não são renomeados.
-
Backup
-
Faz uma cópia da carteira na pasta backups dentro de monerujo
- sobrescrevendo as cópias anteriores.
-
arquivar
-
Faz um backup da carteira e a deleta logo em seguida. A cópia permanece na pasta backups.
- Se você não precisa mais do seu backup recomendamos que você delete o arquivo usando um aplicativo
- gerenciador de arquivos.
- ]]>
-
- Detalhes da transação
-
Destino
- O endereço público para onde você enviou Monero.
-
ID do Pagamento
- Você pode usar o ID do Pagamento para identificar a razão pela qual você transacionou com a contraparte.
- Essa opção é opcional e privada. Por exemplo, lojistas podem reconciliar o seu pagamento com
- o produto que você comprou.
-
ID TX
- O ID da transação pode ser usado em exploradores de Blockchain do Monero como o
- https://xmrchain.net/ para identificar a transação (ofuscada).
-
Chave TX (chave da transação)
- Essa é a chava privada da sua transação. Matenha-a segura, pois ao divulgá-la para um terceiro permitirá que ele identifique
- qual das assinaturas é a sua, transformando sua transação em transparente para essa pessoa ou entidade.
-
Bloco
- Bloco no qual sua transação foi incluída pelos mineradores.
- ]]>
-
- Enviar
-
Endereço destino
-
Este é o endereço público da carteira na qual você está enviando Monero. Você pode colar da sua área de transferência,
- escanear um código QR ou escrevê-lo manualmente. Verifique-o múltiplas vezes para garantir que você não está enviando
- Monero para o endereço errado.
-
Além de enviar para um endereço XMR, você também pode enviar para
-
-
um OpenAlias para XMR ou BTC
-
um endereço BTC
-
- Observe que o envio de BTC é processado pelo serviço SideShift.ai (veja https://sideshift.ai para detalhes).
- Consulte a seção sobre envio de BTC abaixo.
-
Enviando BTC
-
SideShift.ai
-
SideShift.ai é um serviço terceiro que age como casa de câmbio de Monero para Bitcoin.
- Nós usamos a API do SideShift.ai para integrar pagamentos em Bitcoin direto na carteira Monerujo. Consulte https://sideshift.ai
- e decide por sua própria conta se este é um serviço que você quer usar. A equipe Monerujo não está associada com o SideShift.ai
- e não podemos ajudá-lo caso algo não funcione no serviço.
-
Cotação SideShift.ai
-
Na tela que exibe o valor da transação você poderá consultar os parâmetros do SideShift.ai.
- Nos quais estão incluídos a cotação, assim como os limites máximos e mínimos de envio de BTC.
- Note que nesse momento a cotação ainda não é garantida.
-
Ordem SideShift.ai
-
Na tela de confirmação você verá a ordem criada no SideShift.ai. A ordem é válida somente por
- um período limitado - você pode observar uma contagem regressiva no botão de confirmação. A cotação pode
- ser diferente do que estava indicado na tela anterior.
-
Chave secreta do SideShift.ai
-
Como o Monerujo somente lida com a parte da transação que é em Monero, você pode usar sua chave secreta do
- SideShift.ai para rastrear a parte da transação que é em Bitcoin no website do SideShift.ai.
-
Contagem regressiva do SideShift.ai
-
Quando o contador chega a zero será preciso iniciar uma nova ordem e solicitar uma nova cotação ao SideShift.ai. Volte para a tela
- anterior e faça o processo novamente.
- ]]>
-
- Enviando BTC
-
SideShift.ai
-
SideShift.ai é um serviço terceiro que age como casa de câmbio de Monero para Bitcoin.
- Nós usamos a API do SideShift.ai para integrar pagamentos em Bitcoin direto na carteira Monerujo. Consulte https://sideshift.ai
- e decide por sua própria conta se este é um serviço que você quer usar. A equipe Monerujo não está associada com o SideShift.ai
- e não podemos ajudá-lo caso algo não funcione no serviço.
-
Cotação SideShift.ai
-
Na tela que exibe o valor da transação você poderá consultar os parâmetros do SideShift.ai.
- Nos quais estão incluídos a cotação, assim como os limites máximos e mínimos de envio de BTC.
- Note que nesse momento a cotação ainda não é garantida.
-
Ordem SideShift.ai
-
Na tela de confirmação você verá a ordem criada no SideShift.ai. A ordem é válida somente por
- um período limitado - você pode observar uma contagem regressiva no botão de confirmação. A cotação pode
- ser diferente do que estava indicado na tela anterior.
-
Chave secreta do SideShift.ai
-
Como o Monerujo somente lida com a parte da transação que é em Monero, você pode usar sua chave secreta do
- SideShift.ai para rastrear a parte da transação que é em Bitcoin no website do SideShift.ai.
-
Contagem regressiva do SideShift.ai
-
Quando o contador chega a zero será preciso iniciar uma nova ordem e solicitar uma nova cotação ao SideShift.ai. Volte para a tela
- anterior e faça o processo novamente.
- ]]>
-
- Carteira
-
Modo Rua
-
O modo rua pode ser ativado/desativado no menu ou no ícone da cabeça do Gunther. Neste modo, o seu
- saldo não será exibido em nenhuma tela para que você possa usar sua carteira com segurança na rua, em um bar ou
- outro lugar público. Transações anteriores também serão ocultas. Novas transações serão mostradas, então
- você pode ver que você enviou/recebeu Moneroj!
-
Escaneando
- Como o Monero sempre mantém tudo privado, sempre que você abrir sua carteira o Monerujo precisa escanear
- o blockchain para identificar se você recebeu algum novo Monero. Somente as informações que correspondem à sua
- carteira são salvas no celular. De vez em quando esse processo demora,
- principalmente se faz tempo que você não abre a carteira.
-
Saldo
-
Ajuda! O saldo da minha carteira desapareceu ou está não-confirmado!
- Não entre em pânico! Quando você envia uma transação, parte do seu saldo temporariamente é marcado
- como não-confirmado.
- Isso acontece devido a maneira como o Monero é trocado no blockchain, e como a noção de \"troco\" funciona.
- Você pode ler mais sobre o assunto aqui: https://getmonero.org/resources/moneropedia/change.html
-
Lista de transações
-
Lista de transações da carteira. Nas carteiras \"somente leitura\", somente as transações de entrada aparecem.
- ]]>
-
- Nós
-
TL;DR
-
Atualize a lista de nós puxando para baixo & favorite 3–5 nós para permitir que o Monerujo
- escolha o melhor para você!
-
O que é um Nó?
-
O Monerujo usa um nó remoto (às vezes também chamado de Daemon) para se comunicar com
- a Rede Monero sem ter que baixar e armazenar uma cópia do
- blockchain inteiro.
-
Lista de Nós
-
Se a lista estiver vazia, você pode adicionar novos nós manualmente ou deixar que o Monerujo
- escaneie a rede para você. Ou ambos. Leia mais…
-
A lista de nós mostra todos os nós conhecidos atualmente. Além disso, a data e hora
- do último bloco sincronizado para cada nó é exibido abaixo de seu nome. Um ícone
- representando o comportamento de resposta do nó
- (o que indica o nível de conectividade esperado)
- é exibido ao lado.
-
Qualquer nó na lista pode ser favoritado para uso posterior.
- Os nós que não são marcados como favoritos serão esquecidos.
-
O Monerujo sempre escolherá o nó ideal dentre os marcados.
- Ele faz isso verificando a altura do bloco (quão sincronizado
- está o nó?) bem como o comportamento da resposta (com que rapidez o nó responde às solicitações?).
-
A lista é classificada por essas características, portanto, o nó do topo seria o único que o Monerujo
- escolheria nesse caso. A parte inferior da lista mostraria nós muito lentos ou indisponíveis.
-
Adicionar um Nó
-
Ao tocar no botão "Adicionar nó" na parte inferior, você será solicitado a
- inserir os detalhes do nó no diálogo seguinte.
- O "Endereço do Host" é o nome do host ou endereço IP do nó - esta é a única
- informação obrigatória.
- Digite a "Porta" se o nó for executado em uma porta não padrão (por exemplo, 18089).
- Você também pode, opcionalmente, dar um nome ao nó para facilitar sua identificação mais tarde.
- Alguns nós exigem credenciais para serem utilizados. Digite o nome de usuário e
- senha nos campos apropriados. Agora você pode "testar" essas configurações.
- Os "Resultados dos Testes" exibirão a altura do bloco, o tempo de resposta e o IP real usado.
- O resultado também pode ser um erro - geralmente porque o nome do host fornecido
- não pôde ser alcançado em um período de tempo razoável ou as credenciais estão incorretas.
- Ou a combinação Nome do Host/Porta não aponta para um Nó Monero válido!
- Depois que o teste passar (sem erro), você poderá pressionar "OK" para salvar &
- marcar este nó como favorito.
-
Escanear Nós
-
Além disso, você pode verificar a rede em busca de nós. O Monerujo vai começar a
- escanear a rede por nós remotos na porta 18089. Ele começa perguntando ao seus
- nós marcados como favoritos por outros pares na rede P2P do Monero e, em seguida, continua
- perguntando por seus pares, e assim por diante. Se você não tem nós marcados como favoritos
- (ou eles não nos dizem sobre seus pares),
- o Monerujo irá direto para os nós codificados direto no Monero em si. O
- escaneamento termina quando 10 nós remotos são encontrados no total.
- ]]>
-
-
-
- Usando um link de pagamento
-
Você abriu o monerujo a partir de um link de pagamento. Para enviar os fundos, siga estes passos:
-
- 1. Abra a carteira da qual você quer gastar
- 2. Espere que a carteira esteja sincronizada & o botão "Enviar" vai aparecer
- 3. Toque no botão "Enviar"
-
-
Os detalhes do pagamento serão preenchidos. Confirme-os e siga adiante como qualquer outra transação normal.
- ]]>
-
- Entendi!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
deleted file mode 100755
index 082f77e..0000000
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ /dev/null
@@ -1,445 +0,0 @@
-
-
- Carteira
-
- Sobre
- Política de Privacidade
-
- Compartilhar
- Ajuda
- Receber
- Renomear
- Backup
- Alterar Senha
-
- Continue escrevendo …
- É …
- Dá pra fazer melhor!
- Quase ideal …
- Excelente, senha digna de hacker!
-
- Carteiras
- Créditos
- OK
- Cancelar
- Fechar
- Mais detalhes
-
- Enviado com sucesso
- Concluído
-
- Toque para ver o código QR
-
- Pagamento em BTC ativado, toque para mais informações.
- Ledger ativada, toque para mais informações.
-
- Você colocou um endereço %1$s.
- Você enviará XMR e o destinatário receberá %1$s via o serviço SideShift.ai
- ]]>
-
- Ordem no SideShift.ai
-
- %1$s %2$s
-
- Confirmação Pendente
- Pagamento Pendente
- Erro SideShift.ai (%1$s)
- %1$s Enviado!
- Consultando …
-
- Você pode enviar %1$s — %2$s %4$s.
- SideShift.ai enviou a cotação de %3$s %4$s/XMRneste momento.
- ]]>
-
- Saldo: %2$s %3$s (%1$s XMR)
-
- ✔ ID do pagamento integrado
- Preparando sua transação
-
- Criando a ordem no SideShift.ai
- Atualizando a ordem no SideShift.ai
- Preparando a transação em Monero
-
- Consultando os parâmetros no SideShift.ai
-
- ERRO SideShift.ai
- Código: %1$d
-
- Toque aqui para tentar novamente
- Opa, estamos travados aqui!
- Hm, parece que o SideShift.ai não está disponível no momento
-
- %1$s %3$s = %2$s XMR
- (Cotação: %1$s %2$s/XMR)
-
- Visite SideShift.ai para suporte & rastreio da ordem
- Chave secreta\nSideShift.ai
- Chave secreta SideShift.ai
- Endereço %1$s de destino
- Valor
-
- ID da Transação
- Endereço de destino
- Notas
-
- Criando backup
- Arquivando
- Renomeando
- Alterando senha
-
- Finalizando o processo …\nPode demorar um pouco
-
- Erro ao criar backup!
- Erro ao renomear!
- Erro ao alterar senha!
- Senha alterada
-
- Nó
- Carregando …
- Carteira salva
- Erro ao salvar carteira
- Conectando …
- Erro ao conectar!\Verifique o usuário e senha
- Versão do nó incompatível - por favor faça a atualização!
- Nó inválido!\nEscolha outro.
- Não foi possível conectar ao nó!\nTente novamente ou escolha outro.
-
- Desconectado
-
- Transação falhou: %1$s
-
- Demorou demais!
-
- Ainda estou ocupado com a outra carteira …
-
- Renomear %1$s
-
- Nova senha para %1$s
- Repetir senha para %1$s
- Senha para %1$s
- Também é possível abrir a carteira usando sua impressão digital.\nPor favor, use o sensor.
- Abrindo a carteira…
- Impressão digital não reconhecida. Tente novamente.
- Senha incorreta!
- A senha salva está incorreta.\nPor favor, escreva manualmente.
- Essa carteira não existe!
- É preciso definir o endereço do daemon!
- A carteira não é compatível com a rede selecionada
-
- (Somente Leitura)
-
- Receber
- Enviar
-
- + %1$s XMR não confirmado
-
- Serviço monerujo
-
- Sincronizado:
- Blocos restantes
- Escaneando:
-
- Não é possível escrever no disco interno! Pânico!
- Realmente precisamos de acesso para escrever no disco interno!
- Sem câmera = Impossível escanear códigos QR!
-
- Chave de visualização
- Endereço público
- Chave
- Chave de visualização copiada para a área de transferência!
- Chave copiada para a área de transferência!
- Endereço da carteira copiado para a área de transferência!
- ID da transação copiado para a área de transferência!
- Copiar está desativado por razões de segurança!
-
- Não foi possível obter a cotação!\nUse XMR/XMR ou tente novamente
-
- Criar carteira
- Nome da carteira
- Senha da carteira
- Permitir abrir a carteira com impressão digital
- Autenticação por impressão digital
-
Com a autenticação por impressão digital ativa, é possível verificar o saldo e receber transações sem escrever a senha.
-
Porém por questões de segurança extra, o monerujo seguirá solicitando sua senha para ver detalhes da carteira ou enviar transações.
- Aviso de Segurança
-
Queremos lembrar que qualquer pessoa com acesso às suas digitais poderá espiar o seu saldo.
-
Por exemplo, uma pessoa com má intenção pode abrir sua carteira usando sua digital enquanto você dorme.
- Tem certeza que quer ativar esta funcionalidade?
- ]]>
-
- As senhas não são iguais
- A senha não pode estar vazia
- Vamos criar essa carteira logo!
- Eu anotei minha semente mnemônica
-
- Dê-me um nome!
- Essa carteira já existe!
- Não pode começar com .
- Criando carteira
- Carteira criada
-
- Escreva a altura ou data (AAAA-MM-DD)
-
- Chaves
- Nova
- Semente
- Visualizar
-
- Endereço público
- Chave de visualização
- Chave de gasto
- Semente mnemônica
- Restaurar da altura ou data (AAAA-MM-DD)
-
- Endereço público
- Chave de visualização
- Chave de gasto
- Semente mnemônica
- Senha para restaurar via arquivo
-
- Escreva uma chave válida
- Escreva um endereço válido
- Escreva a semente de 25 palavras
-
- Notas (opcional)
- Gerar
- Gastar meu querido Monero!
- Gastar meu querido Monero (%1$s)
- Isso não é um código QR
- Código QR inválido
- Endereço inválido
- Enviar
- Saldo: %1$s XMR
- Endereço
- Valor
- Confirmar
- Concluído
-
- Valor
- Taxa (XMR)
- Taxa
- Total (XMR)
- Total
-
- %1$s XMR
- +%1$s de taxa
-
- Erro ao criar a transação
-
- taxa de %1$s
- (%1$s)
- falhou
- - %1$s
- + %1$s
-
- Data/hora
- ID TX
- Chave TX
- Destino
- ID do Pagamento
- Bloco
- Valor
- Taxa
- Transferências
- Notas
- (opcional)
- Detalhes da Transação
-
- PENDENTE
- FALHOU
-
- Valor
- Não foi possível abrir a carteira!
-
- Máx. %1$s
- Mín. 0
- O valor não é numérico
-
- Dados importantes serão exibidos.\nCertifique-se que ninguém está espiando!
- Estou seguro
- Tire-me daqui!
- Detalhes
-
- Sim, pode fazer!
- Não, obrigado!
-
- Criar nova carteira
- Restaurar carteira \"Somente leitura\"
- Restaurar carteira via chaves privadas
- Restaurar carteira via semente mnemônica
-
- Criar conta
- Conta adicionada #%1$d
- Conta #
-
- Enviar todo o saldo disponível nesta conta!
- Subendereço
- Subendereço público #%1$d: %2$s
-
- Idioma
- Usar o idioma do sistema
-
- Restaurar da Ledger Nano
-
- Comunicando com a Ledger
- Necessária confirmação na Ledger!
- Recuperando subendereços
- Verificando chaves
- Fazendo cálculos incríveis
- Encriptando as coisas
- Favor (re)conectar a Ledger
-
- Criando conta
-
- %1$s conectado
- %1$s desconectado
-
- Escrevendo tag
- Erro ao escrever a tag!
- Sucesso ao escrever a tag
- A tag não suporta NDEF!
- Tag disponibiliza %1$d bytes, mas precisamos de %2$d!
- Não consigo ler a tag!
- Não sei o que você quer!
- NFC disponível!
-
- Mostrar Segredos!
- Modo Rua
-
- Nó-auto-mágiCo ativado, toque para mais informações.
- Último bloco sincronizado em: %1$s
- Nós
- Nome do Nó (Opcional)
- Endereço do Host
- Porta
- Usuário (Opcional)
- Senha (Opcional)
- Host não encontrado
- Nós precisamos disso!
- Deve ser numérico
- Deve ser entre 1–65535
- Adicionar Nó
- Toque para atualizar!
- ERRO DE CONEXÃO %1$d
- ERRO DE CONEXÃO
- FALHA NA AUTENTICAÇÃO
- Resultado do Teste:
- Altura: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- Testando IP: %1$s …
- Por favor, aguarde o escaneamento terminar
- Toque para selecionar ou adicionar nós
- Adicione nós manualmente ou puxe para baixo para escanear
- Escaneando rede…
- Melhores %1$d nós adicionados aos favoritos
- Testar
-
- Backup feito com successo
-
- Destinatário
-
- TUDO!
-
- Converter semente da Ledger
- Palavras da semente da Ledger
- Senha da Ledger (opcional)
- Semente da Ledger inválida!
- Escrever a semente da sua Ledger aqui é um grande risco de segurança!
-
- Restaurar da altura
-
- Iniciar o App Monero em %1$s
-
- Reescanear!
-
- Eu entendi!
- Próximo
- Estou pronto!
-
- Bem-vindo à Monerujo!
- Este aplicativo permite que você crie e use carteiras Monero. Você poderá guardar seus queridos moneroj
-aqui.
- Mantenha sua semente em segurança
- A semente dá acesso total a qualquer pessoa que a tenha. Se você perdê-la, nós não conseguiremos lhe ajudar a recuperá-la e você perderá seus amados moneroj.
- Enviar Cripto
- A Monerujo possui o SideShift.ai integrado. Basta colar ou escanear um endereço BTC, LTC, ETH, DASH ou DOGE e você estará enviando cripto, mas gastando em XMR.
- "Nós", do seu jeito
- Os nós conectam você à rede Monero. Escolha entre nós públicos ou seja completamente "cypherpunk" e utilize seu próprio nó.
- Enviar usando a digital
- Agora é possível enviar XMR apenas com sua digital, caso ela esteja habilitada. Para solicitar a senha, basta desativar acesso à digital.
-
- Modo Escuro
-
- Automático
- Claro
- Escuro
-
- Não há nada aqui\nPor favor, crie ou restaure uma carteira
-
- Restaurar nós padrão
- Restauração em andamento…
-
- Último Bloco: %1$d segundos atrás
- Último Bloco: %1$d minutos atrás
- Último Bloco: %1$d horas atrás
- Último Bloco: %1$d dias atrás
-
- Não foi possível obter a cotação
- Verifique o valor e tente novamente
-
- Endereço ambíguo.
- Por favor, selecione o tipo acima.
- ]]>
-
- Favor inserir ou escanear um endereço %1$s.
- Você enviará XMR e o destinatário irá receber %2$s através do serviço SideShift.ai.
- ]]>
-
- Favor inserir ou escanear um endereço Monero.
- ]]>
-
- Subendereços
- Nome do Subendereço
- Muitos endereços não utilizados - use alguns antes de criar novos!
- Muitas contas não utilizadas - use algumas para poder criar novas!
- Transações para esse subendereço:
- Nenhuma transação para esse subendereço ainda
- Selecione um subendereço
- Toque e segure para mais detalhes
-
- Esta carteira será excluída. Seus fundos desaparecerão para sempre, a não ser que você tenha sua semente guardada ou um backup funcional para recuperá-la.
- Excluir
- Exclusão falhou!
-
- Importar carteira
- Importação falhou!
-
- Resetar carteira!
-
-
- Necessário Tor
- \u00A0ESPERANDO PELO NÓ\u00A0
- "Permitir inicializações em segundo plano" nas opções do Orbot para usar o Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Encriptação da Semente (EXPERIMENTAL)
- Senha de dedução da semente (opcional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-pt/about.xml b/app/src/main/res/values-pt/about.xml
deleted file mode 100644
index 4e254ec..0000000
--- a/app/src/main/res/values-pt/about.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
- Fechar
- Eu sou o monerujo
- Versão %1$s (%2$d)
-
- Créditos
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo et al.
-
Esta página contém informação acerca das nossas políticas de recolha, uso
- e divulgação das informações pessoais que recebemos dos utilizadores
- da nossa app (monerujo: Monero Wallet).
-
-
Ao utilizar esta app está a concordar com a recolha e uso de
- informação de acordo com esta política.
-
-
Dados Recolhidos
-
Dados pessoais são todo o tipo de dados que permitem identificar um indivíduo.
-
-
As chaves e endereços Monero são recolhidos e processados pela app localmente
- para o propósito de processar transacções e transmiti-las à rede Monero de forma
- encriptada.
-
-
Quaisquer outros dados pessoais não são recolhidos pela app.
-
Se utilizar a conversão para USD/EUR, o monerujo obtém as taxas de conversão a
- partir da API pública do kraken.com.
- Confirme a política de privacidade deste serviço em https://www.kraken.com/legal/privacy para
- mais detalhes em como estes pedidos são processados (especialmente a
- secção "Informação que recolhemos automaticament").
-
Se utilizar esta app para pagar em BTC, você estará a utilizar o serviço SideShift.ai.
- Veja a sua política de privacidade em https://sideshift.ai/ para mais detalhes. O monerujo envia
- para este serviço a quantidade e o endereço de destino das BTC. O seu IP vai ser registado.
-
Permissões da app
-
-
INTERNET : Ligar à rede Monero
-
READ_EXTERNAL_STORAGE : Ler as carteiras Monero guardadas no dispositivo
-
WRITE_EXTERNAL_STORAGE : Escrever as carteiras Monero no dispositivo
-
WAKE_LOCK : Manter o dispositivo ligado enquanto sincroniza
-
CAMERA : Ler códigos QR para receber Monero
-
-
Alterações a esta política de privacidade
-
Nós podemos alterar esta política de privacidade de tempos em temps. Iremos notificar
- quaisquer alterações actualizando esta política de privacidade na app e no
- website oficial (www.monerujo.io)
- É aconselhável que reveja esta política de privacidade periodicamente para conferir quaisquer alterações.
-
A última actualização à política de privacidade foi em: 10 de Novembro de 2017.
-
-
Contacte-nos
-
Se tiver alguma questão acerca da nossa política de privacidade,
- ou sobre como os seus dados são recolhidos e processados,
- por favor envie um email para privacy@monerujo.io.
-
Introduz nome e palavra passe únicos para a carteira.
- A palavra passe é utilizada para proteger os dados da carteira. Utiliza uma passe forte -
- melhor ainda é utilizar uma frase passe.
-
Toma nota da tua Semente Mnemónica!
-
No próximo ecrã vai estar a tua \"Semente Mnemónica\" de 25 palavras.
- Esta semente é suficiente para recuperar a tua carteira mais tarde
- e ganhar total acesso aos teus fundos.
- Mantê-la segura e privada é muito importante, já que pode dar acesso total aos
- teus fundos a qualquer pessoa!
-
Se perderes a palavra passe da tua carteira, podes recuperar a carteira com a Semente Mnemónica.
-
Não há forma de recuperar a Semente Mnemónica, se a perderes todos os teus fundos serão perdidos!
- A Semente Mnemónica não pode ser alterada, e se for roubada ou comprometida de outra forma,
- tens de transferir os teus fundos para uma carteira nova (com uma nova Semente Mnemónica). Por isso,
- é melhor fazer uma cópia de segurança da Semente escrevendo-a fisicamente e guardando-a em
- vários lugares seguros.
- ]]>
-
- Crirar Carteira - Semente
-
Se já tens um Endereço Monero e queres recuperar as transacções da blockchain!
-
Introduz nome e palavra passe únicos para a carteira. A palavra passe é utilizada para proteger os dados da carteira. Utiliza uma passe forte - melhor ainda é utilizar uma frase passe.
-
Introduz a tua Semente no campo \"Semente Mnemónica\".
-
Se sabes o número do bloco da primeira transacção deste endereço, introduz no campo
- \"Restaurar de Altura\" - deixar em branco vai verificar toda a blockchain para
- encontrar as transacções do teu endereço. Isto demora imenso tempo.
- ]]>
-
- Criar Carteira - Chaves
-
Se estás a recuperar a tua carteira a partir das tuas chaves!
-
Introduz nome e palavra passe únicos para a carteira. A palavra passe é utilizada para proteger os dados da carteira. Utiliza uma passe forte - melhor ainda é utilizar uma frase passe.
-
Introduz o teu Endereço Monero no campo \"Endereço público\" e preenche a \"Chave de Visualização\" e a \"Chave de utilização\".
-
Se sabes o número do bloco da primeira transacção deste endereço, introduz no campo
- \"Restaurar de Altura\" - deixar em branco vai verificar toda a blockchain para
- encontrar as transacções do teu endereço. Isto demora imenso tempo.
- ]]>
-
- Criar Carteira - Visualização
-
Se apenas queres ver as transacções de depósito numa carteira!
-
Introduz nome e palavra passe únicos para a carteira. A palavra passe é utilizada para proteger os dados da carteira. Utiliza uma passe forte - melhor ainda é utilizar uma frase passe.
-
Introduz o teu Endereço Monero no campo \"Endereço público\" e preenche a \"Chave de Visualização\".
-
Se sabes o número do bloco da primeira transacção deste endereço, introduz no campo
- \"Restaurar de Altura\" - deixar em branco vai verificar toda a blockchain para
- encontrar as transacções do teu endereço. Isto demora imenso tempo.
- ]]>
-
- Detalhes da Carteira
-
Endereço público
- O teu endereço público é como o teu número de conta bancário e podes partilhá-lo livremente
- sem qualquer receio de perderes os teus Monero. As pessoas enviam dinheiro para a tua carteira
- através deste endereço.
-
Semente Mnemónica
- Este é o único dado necessário para recuperar a tua carteira no futuro e ganhar acesso total aos
- teus fundos. Manter esta informação privada e protegida é muito importante, já que dá a qualquer
- pessoa acesso aos teus Monero! Se não escreveste a semente nalgum sítio seguro, por favor fá-lo!
-
Palavra passe dos Ficheiros da Carteira
- Certifica-te que escreves esta palavra passe. Se formatares o teu dispositivo ou desinstalares esta
- app, vais precisar precisar disto para acederes à tua carteira.
-
passLoUCa
- Se a palavra passe mostrada aqui tem 52 caracteres alfanuméricos em grupos de 4 - parabéns!
- Os teus ficheiros estão seguros com uma chave de 256-bits gerada pelas funcionalidades de segurança
- do teu dispositivo através da frase passe que escolheste (na criação ou alterando-a). Isto
- torna-a extremamente difícil de piratear!
- Esta funcionalidade é obrigatória para todas as carteiras novas.
-
Palavra passe antiga
- Se vês a tua frase passe aqui, os ficheiros da tua carteira não estão tão seguros quanto
- se estivesses a usar a passLoUCa. Para corrigir isto, selecciona \"Alterar palavra passe\" no
- menu. Após introduzir a nova palavra passe (podes usar a mesma) a aplicação gera uma passLoUCa para
- ti e protege os ficheiros da tua carteira com ela. Escreve-a nalgum lado!
-
Carteiras com passLoUCa
- Se precisares de reinstalar o Monerujo (por exemplo, depois de formatares o telemóvel ou trocares
- para um novo) ou quiseres utilizar os ficheiros da carteira num dispositivo diferente ou PC, tens
- que usar esta Palavra passe de Recuperação de forma a aceder à tua carteira novamente.
- Ao seleccionar \"Alterar palavra passe\" do menu, podes escolher uma palavra passe nova. Cuidado
- que isto vai fazer gerar uma nova Palavra passe de Recuperação. Escreve-a nalgum lado!
-
Chave de Visualização
- A tua chave de visualização pode ser usada para ver as transacções de depósito sem dar permissão
- para gastar os fundos da tua carteira.
-
Spend key
- A tua chave de utilização permite a qualquer pessoa de gaster os Monero associados à tua carteira,
- por isso não a reveles a ninguém, mantém-a segura assim como a tua Semente Mnemónica.
- ]]>
-
- Lista de Carteiras
-
Nó
-
O Monerujo utiliza um Nó Remoto para comunicar com a rede Monero sem ter que descarregar e
- guardar uma cópia da blockchain inteira. Podes encontrar uma lista de nós remotos populares ou
- aprende como correr o teu próprio nó remoto em https://moneroworld.com/
-
O Monerujo vem com alguns Nós Remotos predefinidos. O histórico dos últimos 5 nós é guardado.
-
Carteiras
-
Aqui vês as tuas carteiras. Estão localizadas na pasta monerujo
- na memória interna do teu dispositivo. Podes utilizar um explorador de ficheiros
- para vê-las. Deves fazer cópias de segurança desta pasta regularmente para outro
- dispositivo para o caso dele explodir ou ser roubado.
-
Selecciona u carteir para a abrir ou pressiona \"+\" para criar uma nova.
- Ou selecciona uma das operações:
-
Detalhes
-
Mostra os detalhes da carteira, semente & chaves.
-
Receber
-
Cria um código QR para receber Moneroj.
-
Renomear
-
Renomeia a carteira. As cópias de segurança não são renomeadas.
-
Cópia de segurança
-
Faz uma cópia da carteira na pasta cópias de segurança dentro do
- monerujo reescrevendo cópias anteriores que lá estejam.
-
Arquivar
-
Faz uma cópia de segurança e de seguida apaga a carteira. a cópia permanece na pasta de
- cópias de segurança. Se já não precisas das tuas cópias de segurança, deves apagá-las
- num sistema de gestão de ficheiros ou com uma app que apaga de forma segura.
- ]]>
-
- Detalhes da Transacção
-
Destino
- O endereço público para o qual enviaste Moneroj
-
ID do Pagamento
- Utiliza-se o ID do Pagamento para identificar a razão porque foram transaccionados Moneroj.
- Isto é opcional e privado. Por exemplo, isto permite que um negócio identifique que item
- é que uma determinada transacção está a pagar.
-
ID TX
- Este é o ID da tua Transacção que podes utilizar para identificar a tua transacção ofuscada
- num explorador da Monero Blockchain como o https://xmrchain.net/
-
Chave TX (Chave da Transacção)
- Esta é a chave privada da tua transacção, mantém-a segura já que revelá-la a um terceiro
- revela qual a tua assinatura num anel, fazendo com que a tua transacção seja transparente.
-
Bloco
- O bloco em que a tua transacção foi incluída.
- ]]>
-
- Enviar
-
Endereço do Destinatário
-
Este é o endereço público da carteira para a qual vais enviar Moneroj, podes copiar esta
- informação da área de transferência, capturara um código QR, ou introduzir manualmente. Confirma
- atentamente que não estás a enviar para o endereço errado.
-
Para alem de usar um endereço de XMR também podes usar
-
-
Um OpenAlias para XMR ou BTC
-
um endereço de BTC
-
- Não deixar de notar que, enviar BTC é processado através do serviço SideShift.ai (ver https://sideshift.ai
- para detalhes). Ver a secção enviar BTC.
-
Enviar BTC
-
SideShift.ai
-
SideShift.ai é um serviço de terceiros que funciona como intercâmbio de Monero para Bitcoin.
- Nós utilizamos a API do SideShift.ai para integrar pagamentos de Bitcoin no Monerujo. Por favor
- vai a https://sideshift.ai e decide por ti próprio se queres utilizar este serviço. A equipa
- do Monerujo não está associada com o SideShift.ai e não te pode ajudar com este serviço.
-
Taxa de câmbio SideShift.ai
-
No ecrã de \"Quantidade\" vais ver os parâmetros actuais do serviço SideShift.ai. Estes
- incluem a taxa de câmbio assim como os limites superiores e inferiores em BTC. Nota que
- esta taxa ainda não é garantido.
-
Pedido SideShift.ai
-
No ecrão de \"Confirmação\", vais ver o pedido actual SideShift.ai. Este pedido é válido
- por um período limitado de tempo - podes reparar que exite uma contagem decrescente no
- botão de \"Enviar\". A taxa de câmbio pode ser diferente da taxa indicativa mostrada
- nos ecrãs anteriores.
-
Chave Secreta SideShift.ai
-
Como o Monerujo só controla a parte Monero da transacção, a chave secreta SideShift.ai
- pode ser utilizada para monitorar a parte Bitcoin da transacção na página pricipal do
- SideShift.ai.
-
Contagem decrescente SideShift.ai!
-
Quando a contagem chega a zero, precisas de obter uma nova taxa de câmbio do SideShift.ai
- indo ao passo anterior e depois voltando ao ecrã de \"Confirmar\".
- ]]>
-
- Enviar BTC
-
SideShift.ai
-
SideShift.ai é um serviço de terceiros que funciona como intercâmbio de Monero para Bitcoin.
- Nós utilizamos a API do SideShift.ai para integrar pagamentos de Bitcoin no Monerujo. Por favor
- vai a https://sideshift.ai e decide por ti próprio se queres utilizar este serviço. A equipa
- do Monerujo não está associada com o SideShift.ai e não te pode ajudar com este serviço.
-
Taxa de câmbio SideShift.ai
-
No ecrã de \"Quantidade\" vais ver os parâmetros actuais do serviço SideShift.ai. Estes
- incluem a taxa de câmbio assim como os limites superiores e inferiores em BTC. Nota que
- esta taxa ainda não é garantido.
-
Pedido SideShift.ai
-
No ecrão de \"Confirmação\", vais ver o pedido actual SideShift.ai. Este pedido é válido
- por um período limitado de tempo - podes reparar que exite uma contagem decrescente no
- botão de \"Enviar\". A taxa de câmbio pode ser diferente da taxa indicativa mostrada
- nos ecrãs anteriores.
-
Chave Secreta SideShift.ai
-
Como o Monerujo só controla a parte Monero da transacção, a chave secreta SideShift.ai
- pode ser utilizada para monitorar a parte Bitcoin da transacção na página pricipal do
- SideShift.ai.
-
Contagem decrescente SideShift.ai!
-
Quando a contagem chega a zero, precisas de obter uma nova taxa de câmbio do SideShift.ai
- indo ao passo anterior e depois voltando ao ecrã de \"Confirmar\".
- ]]>
-
- Criar carteira - Ledger
-
Se quiseres recuperar a tua carteira apartir do teu dispositivo Ledger Nano S.
-
As tuas chaves secretas nunca saem do teu dispositivo Ledger, consequentemente
- tens de conetar o mesmo sempre que quiseres aceder à tua carteira.
-
Introduz um nome e palavra passe unicos. A palavra passe é usada para garantir a segurança
- da tua informação no dispositivo Android. Usa uma palavra passe forte!
-
Introduz o numero do bloco da primeira transação correspondente a este endereço no campo
- \"Restore Height\". Podes tambem usar o formato ano mês dia ANO-MES-DIA. Se não tiveres
- certeza, introduz uma data/numero do bloco aproximada antes da primeira utilização
- da carteira.
- ]]>
-
- A Carteira
-
Street Mode
-
O Street mode pode ser ligado/desligado no menu ou na cabeça do icon Gunther. Neste modo
- o teu saldo não é mostrado no teu ecrã para que possas usar a tua carteira de forma segura
- na rua, num bar ou outro local publico. As transações anteriores são também escondidas. As novas
- transações serão mostradas, para que cossas ver se enviaste/recebeste os teus preciosos Moneroj!
-
A Examinar
- Como o Monero gosta de manter as coisas privadas, cada vez que abres uma carteira Monerujo temos
- que examinar a blockchain para ver se novos Moneroj foram enviados para a tua carteira. Apenas
- informação correspondente à tua carteira é guardada no telefone. Por vezes pode demorar algum tempo
- por já não sincronizares há algum tempo.
-
O Saldo
-
Ajudem! O saldo da minha carteira desapareceu ou está não-confirmado!
- Não entres em pânico! Quando envias fundos da tua carteira, algum do teu saldo aparece temporariamente
- como não confirmado.
- Isto acontece como resultado da forma como os Moneroj são trocados na blockchain.
- Podes ler mais sobre iston em https://getmonero.org/resources/moneropedia/change.html
-
Lista de Transacções
-
Uma lista de transacções da carteira. Em carteiras de visualização, apenas são mostradas transacções
- de depósito.
- ]]>
-
- Nós
-
TL;DR
-
Refresca a lista de Nós puxando para baixo & favorito 3–5 nós para permitir que
- o Monerujo escolha o melhor para ti!
-
O que é's um Nó?
-
O Monerujo usa um Nó remoto (por vezes chamado Daemon) para comunicar com a Rede do Monero
- sem ter de descarregar e gravar uma copia inteira da blockchain.
-
Lista de Nós
-
Se a lista estiver vazia, podes adicionar um Nó manualmente ou deixar o Monerujo fazer um
- scan à Rede por ti. Ou ambos. Continuar a ler em…
-
A lista de nós mostra todos os nós actualmente conhecidos. Adicionalmente, o timestamp do
- ultimo bloco conhecido é listado em cada nome do nó. Um icon a representar o tempo de resposta
- do nó' (que indica o nivel de conetividade esperado) é mostrado junto de cada nó.
-
Qualquer nó na lista pode ser adicionado aos favoritos por forma a usar mais tarde.
- Nós que não forem adicionados como favoritos serão esquecidos.
-
O Monerujo irá escolher o melhor nó favorito cada vez que o usas.
- Faz isto verificando a Altura (quanto mais actualizado esta cada nó) assim como a velocidade de
- resposta (quão rapido responde este nó?).
-
A lista é disposta consoante estas caracteristicas, assim sendo no topo estará o nó que o
- Monerujo escolheria a cada momento. No fundo da lista ficam os nós mais lentos ou indisponiveis.
-
Adicionar um Nó
-
Tocando no botão "Adicionar Nó" no fundo, poderás adicionar os detalhes
- na janela de dialogo.
- Em "Endereço" está o hostname ou endereço IP do nó - este é o unico campo necessário.
- Introduz a "Porta" se o nó corre com uma porta nao standard (ex 18089).
- Podes opcionalmente introduzir também um nome para mais facilmente o identificares mais tarde.
- Alguns nós requerem credenciais para os usar, introduz o nome de usuario &
- e palavra passe nos campos disponibilizados. Agora podes "Testar" estas configurações.
- Os "Resultados do Teste" mostrarão a altura do bloco, tempo de resposta e IP usados.
- O resultado pode também ser um erro - geralmente porque o Endereço introduzido está indisponivel
- dentro de tempo util ou as credenciais estão incorretas.
- Ou a combinação endereço/porta não aponta para um Nó de Monero!
- Assim que o teste passar (sem erros) - podes'pressionar "OK" para gravar &
- favorito este nó.
-
Procurar Nós
-
Adicionalmente, podes procurar nós na Rede de Monero. O Monerujo vai realizar
- uma busca na rede por nós remotos na porta 18089. Vai começar por procurar nos teus
- nós favoritos por outros pares na rede P2P do Monero e depois continua perguntando
- a esses pares, e por ai fora. Se não tiveres nenhum nó favorito na tua lista o
- Monerujo irá usar directamente os nós base que estão inscritos no codigo do Monero.
- A procura irá parar assim que encontrar 10 nós remotos no total.
- ]]>
-
-
-
- Usando Endereço de Pagamento
-
Iniciaste o Monerujo com um endereço de pagamento. Para enviar fundos, por favor faz o seguinte:
-
- 1. Abre a carteira de onde pretendes gastar
- 2. Espera até a carteira sincronizar & e o botão "Enviar" aparecer
- 3. Carrega no butão "Enviar"
-
-
Os detalhes do pagamento serão automaticamente preenchidos. Verifica e continua como em outra qualquer transação
- ]]>
-
- Entendido!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
deleted file mode 100644
index 1ddbfb5..0000000
--- a/app/src/main/res/values-pt/strings.xml
+++ /dev/null
@@ -1,456 +0,0 @@
-
-
- Carteira
-
- Sobre nós
- Política de Privacidade
-
- Partilhar
- Ajuda
- Receber
- Renomear
- Cópia de segurança
- Alterar palavra passe
-
- Continua a escrever …
- Meh …
- Tu consegues fazer melhor!
- Está quase lá …
- Está forte, está!
-
- Carteiras
- Créditos
- OK
- Cancelar
- Fechar
- Informação detalhada
-
- Enviado com sucesso
- Feito
-
- Toca para código QR
-
- Pagamento em BTC activado, toca para mais informação.
- Ledger activa, toca para mais informação.
-
- Introduziu um endereço %1$s.
- Vai enviar em XMR e o destinatário vai receber %1$s através do serviço SideShift.ai
- ]]>
-
- SideShift.ai Order
-
- %1$s %2$s
-
- Confirmação Pendente
- Pagamento Pendente
- Erro SideShift.ai (%1$s)
- %1$s Enviadas!
- A comunicar …
-
- Pode enviar %1$s — %2$s %4$s.
- SideShift.ai está com uma taxa de conversão de %3$s %4$s/XMRneste momento.
- ]]>
-
- Saldo: %2$s %3$s (%1$s XMR)
-
- ✔ ID do pagamento integrado
- A preparar a transacção
-
- A criar um pedido SideShift.ai
- A actualizar o pedido SideShift.ai
- A preparar a transacção Monero
-
- A obter os parâmetros SideShift.ai
-
- ERRO SideShift.ai
- Código: %1$d
-
- Toca para voltar a tentar
- Agora estamos emperrados aqui!
- Ups, SideShift.ai não parece estar disponível neste momento!
-
- %1$s %3$s = %2$s XMR
- (Rácio: %1$s %2$s/XMR)
-
- Vai a SideShift.ai para suporte & seguimento
- Chave secreta\nSideShift.ai
- SideShift.ai Chave secreta
- Endereço %1$s de destino
- Quantidade
-
- ID da Transacção
- Endereço de destino
- Notas
-
- A efectuar cópia de segurança
- A arquivar
- A renomear
- A altear a palavra passe
-
- A concluir o processamento …\nIsto pode demorar!
-
- Cópia de segurança falhou!
- Erro ao renomear!
- Erro ao alterar a palavra passe!
- Palavra passe alterada
-
- Nó
- A carregar a carteira …
- Carteira guardada
- Erro ao gravar a carteira!
- A conectar …
- Erro ao conectar!\nConfirma o utilizador/palavra passe
- Nó inválido!\nTenta outro.
- Não foi possível chegar ao nó!\nTenta novamente ou outro.
-
- Desconectado
-
- Transacção falhou: %1$s
-
- Já esperaste demasiado tempo!
-
- Ainda estou ocupado com a tua última carteira …
-
- Renomear %1$s
-
- Nova frase passe para %1$s
- Repetir frase passe para %1$s
- Palavra passe para %1$s
- Também podes abrir a carteira utilizando a impressão digital.\nPor favor, toca no sensor.
- Impressão diginal não reconhecida. Tenta novamente.
- Palavra passe incorrecta!
- A carteira não existe!
- O endereço do serviço tem que estar definido!
- A carteira não combina com a rede seleccionada
-
- (Ver apenas)
-
- Receber
- Enviar
-
- + %1$s XMR não confirmado
-
- Serviço monerujo
-
- Sincronizado:
- Blocos remanescentes
- A examinar:
-
- Não é possível escrever no espaço externo! Pânico!
- Nós preciamos mesmo da permissão de escrever no espaço externo!
- Sem câmara = Sem códigos QR!
-
- Ver chave
- Endereço público
- Chave
- Chave de visualização copiada para a área de transferência
- Chave copiada para a área de transferência!
- Endereço da carteira copiado para a área de transferência!
- ID da transacção copiado para a área de transferência!
- Copiar está desactivo por razões de segurança!
-
- Não foi possível obter a taxa de conversão!\nUsa XMR/XMR ou tenta outra vez
-
- Criar Carteira
- Nome da Carteira
- Frase-passe da Carteira
- Permitir abrir a carteira com a impressão digital
- Autenticação por impressão digital
-
Com a autenticação através da impressão digital, podes ver o teu saldo e receber fundos
- sem introduzir a palavra passe.
-
Mas para segurança adicional, o monerujo vai sempre pedir para introduzir a palavra passe
- para ver os detalhes da carteira ou enviar fundos.
- Aviso de segurança
-
Finalmente, o monerujo quer relembrar que qualquer pessoa que consiga obter a tua
- impressão digital vai conseguir cuscar o teu saldo da carteira.
-
Por exemplo, um utilizador malicioso pode abrir a tua carteira enquanto estiveres a dormir.
- Tens a certeza que queres activar esta funcionalidade?
- ]]>
-
- As frases-passe não são iguais
- Frase-passe não pode ser vazia
- Faz-me lá uma carteria!
- Eu apontei a minha Semente Mnemónica
-
- Dá-me um nome!
- A carteira já exite!
- Não pode começar com .
- A criar carteira
- Carteira criada
-
- Introduzir número ou data (AAAA-MM-DD)
-
- Chaves
- Nova
- Semente
- Visualizar
-
- Endereço Público
- Chave de visualização
- Chave de utilização
- Chave Mnemónica de 25 Palavras
- Restaurar de Altura ou Data (AAAA-MM-DD)
-
- Endereço público
- Chave de visualização
- Chave de utilização
- Semente mnemónica
- Restaurar palavra passe dos ficheiros de cateira
-
- Introduz uma chave válida
- Introduz um endereço válido
- Introduz a semente de 25 palavras
-
- Notas privadas (opcional)
- Gerar
- Gasta os meus queridos Moneroj
- Gasta os meus queridos Moneroj (%1$s)
- Não é um código QR
- Não é um código QR válido
- Não é um endereço válido
- Enviar
- Saldo: %1$s XMR
- Endereço
- Quantidade
- Confirmar
- Feito
-
- Quantidade
- Taxa (XMR)
- Taxa
- Total (XMR)
- Total
-
- %1$s XMR
- +%1$s Taxa
-
- Erro ao criar a transacção
-
- Taxa %1$s
- (%1$s)
- falhou
- - %1$s
- + %1$s
-
- Data/hora
- ID TX
- Chave TX
- Destino
- ID Pagamento
- Bloco
- Quantidade
- Taxa
- Transferências
- Notas
- (opcional)
- Detalhes da Transacção
-
- PENDENTE
- FALHADA
-
- Quantidade
- Não foi possível abrir a carteira!
-
- Max. %1$s
- Mín. 0
- XMR não é um número
-
- Dados sensíveis vão ser mostrados.\nOlha à tua volta!
- Estou seguro
- Volta atrás!
- Detalhes
-
- Sim, faz isso!
- Não obrigado!
-
- Criar nova carteira
- Restaurar carteira apenas de visualização
- Restaurar carteira a partir de chaves privadas
- Restaurar carteira a partir da semente de 25 palavras
-
- Palavra passe gravada incorrecta.\nInsere a palavra passe manualmente.
- A abrir a carteira…
-
- Criar Conta
- Conta nova adicionada #%1$d
- Conta #
-
- Enviar todos os fundos confirmados para esta conta!
- Subaddress
- Subaddress Publico #%1$d: %2$s
-
- Linguagem
- Usar linguagem de sistema
-
- Restaurar de Ledger Nano
-
- A comunicar com o Ledger
- Confirmação com Ledger necessária!
- Recuperando subaddresses
- Verificando chaves
- A cozinhar os numeros
- Produzindo hashes
- Reconeta o teu Ledger
-
- A criar conta
-
- %1$s Ligado
- %1$s Desligado
-
- Escrevendo Tag
- A escrita do Tag falhou!
- Escrita do Tag bem sucedida
- A Tag não suporta NDEF!
- A Tag tem %1$d bytes, mas nós precisamos de %2$d!
- Eu não percebo a Tag!
- Eu não percebo o que queres fazer!
- NFC Disponivel!
-
- Descrição (opcional)
-
- Endereço OpenAlias não disponivel.
- OpenAlias seguro ✔
- Resolvendo OpenAlias…
- OpenAlias sem DNSSEC - endereço pode estar spoofed
-
- Versão do Nó incompativel - atualizar por favor!
-
- Mostrar Segredos
- Street Mode
-
- Node-o-matiC ativado, tocar para mais info.
- Ultimo bloco actualizado: %1$s
- Nós
- Nome do Nó (Opcional)
- Hostname
- Port
- Nome de usuario (Optional)
- Palavra passe (Optional)
- Não foi possivel resolver host
- Precisamos disto!
- Tem de ser numérico
- Tem de ser 1–65535
- Adicionar Nó
- Tocar para refrescar!
- ERRO LIGAÇÃO %1$d
- ERRO LIGAÇÂO
- AUTENTIFICAÇÃO FALHOU
- Resultado do teste:
- Altura: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- A testar IP: %1$s …
- Por favor espera que o scan acabe
- Tocar para selecionar Nós.
- Adicionar Nós manualmente ou puxa para fazer scan
- A fazer scan á rede …
- Adicionar aos bookmarks os melhores %1$d nós automaticamente
- Testar ligação
-
- Backup bem sucedido
-
- Receptor
-
- A TOTALIDADE!
-
- Converter semente do Ledger
- Palavras da semente do Ledger
- Palavra passe do Ledger (opcional)
- Semente do Ledger invalida!
- Introduzir a semente do Ledger aqui comporta um elevado risco de segurança!
-
- Restaurar de Altura
-
- Start Monero App on %1$s
-
- Rescan!
-
- I get it!
- Next
- I\'m ready!
-
- Welcome to Monerujo!
- This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.
- Keep your seed safe
- The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.
- Send Crypto
- Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.
- Nodes, your way
- Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.
- Send with fingerprint
- You\'re now able to send XMR with just your fingerprint if you enabled it. To request the password, just disable fingerprint access.
-
- Dark Mode
-
- Auto
- Day
- Night
-
- There is nothing here\nPlease create or restore a wallet
-
- Restore default nodes
- Restoring already in progress…
-
- Last Block: %1$d seconds ago
- Last Block: %1$d minutes ago
- Last Block: %1$d hours ago
- Last Block: %1$d days ago
-
- Cannot get quote
- Check amount and try again
-
- Ambiguous address.
- Please select the type above.
- ]]>
-
- Please enter or scan a %1$s address.
- You'll send XMR and the receiver will get %2$s using the SideShift.ai service.
- ]]>
-
- Please enter or scan a Monero address.
- ]]>
-
- Subaddresses
- Subaddress Name
- Too many unused addresses - use some to enable creating more!
- Too many unused accounts - use some to enable creating more!
- Transactions for this subaddress:
- No transactions for this subaddress yet
- Select a subaddress
- Long-press for details
-
- This wallet will be deleted. Your funds will be gone forever unless you have your seed or a working backup to recover it.
- Delete
- Delete failed!
-
- Import wallet
- Import failed!
-
- Reset wallet!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-ro/about.xml b/app/src/main/res/values-ro/about.xml
deleted file mode 100644
index ffb5688..0000000
--- a/app/src/main/res/values-ro/about.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
- Închide
- Eu sunt monerujo
- Versiunea %1$s (%2$d)
-
- Mulțumiri
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo et al.
-
- monerujo.io
- ]]>
-
- Politică de confidențialitate
-
Această pagină te informează despre politicile privind colectarea,
- utilizarea și divulgarea informațiilor personale pe care le primim de la
- utilizatorii aplicației noastre (monerujo: Portofelul Monero).
-
-
Folosind această aplicație, ești de acord cu colectarea și utilizarea informațiilor
- în conformitate cu această politică.
-
-
Informații colectate
-
Datele personale sunt orice fel de date care ar putea identifica o persoană.
-
-
Cheile de acces Monero și adresele publice ale portofelului sunt colectate și procesate de aplicație
- în mod local, în scopul procesării tranzacțiilor și transmisterii acestora în
- rețeaua Monero într-o formă criptată.
-
-
Alte date personale nu sunt colectate de către aplicație.
-
În cazul în care folosești funcția de schimb monetar USD/EUR (facultativ), monerujo preia rata de schimb
- prin intermediul API-ului public al kraken.com.
- Vizualizează politica de confidențialitate la adresa https://www.kraken.com/legal/privacy pentru a vedea
- cum este procesată informația (În special secțiunea "Information We Collect Automatically").
-
În cazul in care folosești aplicația pentru a face o plată către o adresă de portofel BTC,
- vei folosi serviciul oferit de SideShift.ai.
- Vizualizează politica lor de confidențialitate la adresa https://sideshift.ai/ pentru detalii. Monerujo le va trimite lor
- adresa de destinație și suma BTC. Adresa ta de IP poate fi colectată.
-
Permisiunile aplicației
-
-
INTERNET : Conectarea la rețeaua Monero printr-un nod de asamblare al Monero
-
READ_EXTERNAL_STORAGE : Citește fișierele portofelului stocate pe dispozitiv
-
WRITE_EXTERNAL_STORAGE : Scrie fișierele portofelului stocate pe dispozitiv
-
WAKE_LOCK : Menține dispozitivul aprins pentru sincronizare
-
CAMERA : Scanează codurile QR pentru a primi Monero
-
-
Modificări ale acestei politici de confidențialitate
-
Modificări ale acestei politici de confidențialitate pot apărea din când în când.
- Te vom notifica cu privire la orice modificare, postând noua politică de confidențialitate în aplicație
- sau pe site-ul nostru (www.monerujo.io)
- Îți recomandăm să revizuiești periodic această politică de confidențialitate pentru orice modificări apărute.
-
Această politică de confidențialitate a fost modificată la data de: 10 noiembrie, 2017.
-
-
Contactează-ne
-
Pentru orice întrebări legate de politica de confidențialitate,
- sau despre cum este informația colectată și procesată,
- te rugăm să ne scrii la privacy@monerujo.io.
-
Introdu un nume unic al portofelului și o parolă. Parola este folosită pentru a securiza informațiile portofelului
- de pe dispozitiv. Folosește o parolă dificilă - folosește chiar o frază.
-
Notează-ți Semnătura Mnemonică!
-
În următorul ecran vor fi afișate 25 de cuvinte care reprezintă \"Semnătura Mnemonică\".
- Aceasta este singura informație necesară pentru recuperarea portofelului tău într-un moment ulterior și obținerea
- accesului deplin la fondurile tale. Păstrarea acesteia într-un mediu privat și securizat este foarte importantă,
- deoarece va permite oricui acces total la fondurile tale!
-
În cazul în care ți-ai pierdut parola portofelului, vei putea recupera accesul la el folosind Semnătura Mnemonică.
-
Nu există o altă modalitate de a-ți recupera Semnătura Mnemonică, dacă o pierzi, toate fondurile tale vor fi pierdute!
- Totodată Semnătura Mnemonică nu poate fi schimbată, iar dacă ea este furată sau compromisă, trebuie să îți muți
- fondurile către o nouă adresă de portofel (care va conține o altă Semnătură Mnemonică). Prin urmare, este mai bine
- să copiezi în siguranță Semnătura Mnemonică în mai multe locații sigure și de încredere.
- ]]>
-
- Creează Portofel - Semnătură
-
În cazul în care deții deja o adresă de portofel pentru Monero și dorești să îți recuperezi tranzacțiile din baza
- de date distribuită (blockchain)
-
Introdu un nume unic al portofelului și o parolă. Parola este folosită pentru a securiza informațiile portofelului
- de pe dispozitiv. Folosește o parolă dificilă - folosește chiar o frază.
-
Introdu cuvintele Semnăturii Mnemonice în câmpul \"Semnătură Mnemonică\".
-
În cazul în care știi monoblocul în care a fost procesată prima ta tranzacție folosind această adresă,
- te rugăm să-l introduci în câmpul \"Număr monobloc\". La fel poți să introduci o dată în format AAAA-LL-ZZ.
- Dacă nu ești sigur(ă), introdu o dată/număr aproximativ anterior primei utilizări a portofelului.
- ]]>
-
- Creează Portofel - Ledger
-
Dacă dorești să recuperezi portofelul tău cu dispozitivul Ledger Nano S.
-
Cheile tale secrete nu părăsesc niciodată dispozitivul Ledger, va trebui să-l conectezi de fiecare
- dată când vrei să accesezi portofelul tău.
-
Introdu un nume unic al portofelului și o parolă. Parola este folosită pentru a securiza informațiile portofelului
- de pe dispozitiv. Folosește o parolă dificilă - folosește chiar o frază.
-
În cazul în care știi monoblocul în care a fost procesată prima ta tranzacție folosind această adresă,
- te rugăm să-l introduci în câmpul \"Număr monobloc\". La fel poți să introduci o dată în format AAAA-LL-ZZ.
- Dacă nu ești sigur(ă), introdu o dată/număr aproximativ anterior primei utilizări a portofelului.
- ]]>
-
- Creează Portofel - Chei de acces
-
Dacă încerci recuperarea portofelului folosind cheile de acces!
-
Introdu un nume unic al portofelului și o parolă. Parola este folosită pentru a securiza informațiile
- portofelului de pe dispozitiv. Folosește o parolă dificilă - folosește chiar o frază.
-
Introdu adresa portofelului tău Monero în câmpul \"Adresă publică\", completează câmpul \"Cheie vizualizare\"
- și \"Cheie consum\".
-
În cazul în care știi monoblocul în care a fost procesată prima ta tranzacție folosind această adresă,
- te rugăm să-l introduci în câmpul \"Număr monobloc\". La fel poți să introduci o dată în format AAAA-LL-ZZ.
- Dacă nu ești sigur(ă), introdu o dată/număr aproximativ anterior primei utilizări a portofelului.
- ]]>
-
- Creează Portofel - Vizualizare
-
În cazul în care dorești să vizualizezi tranzacțiile primite!
-
Introdu un nume unic al portofelului și o parolă. Parola este folosită pentru a securiza informațiile
- portofelului de pe dispozitiv. Folosește o parolă dificilă - folosește chiar o frază.
-
Introdu adresa portofelului tău Monero în câmpul \"Adresă publică\" și completează câmpul
- \"Cheie vizualizare\".
-
În cazul în care știi monoblocul în care a fost procesată prima ta tranzacție folosind această adresă,
- te rugăm să-l introduci în câmpul \"Număr monobloc\". La fel poți să introduci o dată în format AAAA-LL-ZZ.
- Dacă nu ești sigur(ă), introdu o dată/număr aproximativ anterior primei utilizări a portofelului.
- ]]>
-
- Detalii Portofel
-
Adresă publică
- Adresa publică a protofelului reprezintă, ca și exemplu, un cont bancar, număr pe care îl poți împărtăși
- cu oricine fără a avea teama de a pierde din balanța Monero. Oricine poate trimite Monero către portofelul
- tău folosind această adresă.
-
Semnătura Mnemonică
- Aceasta este singura informație necesară pentru recuperarea portofelului tău într-un moment ulterior
- și obținerea accesului deplin la fondurile tale. Păstrarea acesteia într-un mediu privat și securizat
- este foarte importantă, deoarece va permite oricui acces total la fondurile tale!
- În cazul în care nu ai notat această informație într-un loc sigur, te rog să o faci acum!
-
Parolă Recuperare Fișiere Portofel
- Asigură-te că ai notat această parolă. Dacă resetezi dispozitivul sau ștergi aplicația, vei avea
- nevoie de ea pentru a accesa portofelul din nou.
-
CrAzYpass
- Dacă parola afișată aici e formată din 52 caractere alfanumerice în grupuri a câte 4 - felicitări!
- Fișierele portofelului tău sunt securizate cu o cheie pe 256 biți generată de dispozitiv
- pe baza parolei alese (la creare sau prin modificare). Este extrem de dificil
- să o spargi!
- E obligatorie pentru toate portofelele noi create.
-
Parolă
- Dacă aici e afișată parola ta, fișierele portofelului tău sunt mai puțin securizate decât la setarea
- unui CrAzYpass. Pentru a corecta, simplu selectează \"Schimbă Parola\" din meniu. După introducerea
- unei noi parole (inclusiv una folosită anterior) aplicația va genera un CrAzYpass pentru
- tine și va securiza fișierele portofelului cu ajutorul lui. Notează-l!
-
Portofele CrAzYpass
- Dacă dorești să reinstalezi Monerujo (ca exemplu, după resetarea telefonului sau trecerea
- la unul nou) sau dorești să utilizezi fișierele portofelului pe un alt dispozitiv sau PC, folosește
- Parola de Recuperare pentru a accesa portofelul din nou.
- La selectarea \"Schimbă Parola\" din meniu, poți alege o parolă nouă. Aceasta va genera
- o Parolă de Recuperare nouă. Noteaz-o!
-
Cheie vizualizare
- Cheia ta de vizualizare poate fi folosită pentru a monitoriza tranzacțiile primite fără a da permisiunea
- de a cheltui fondurile aflate în portofelul tău.
-
Cheie consum
- Cheia ta de consum permite oricui să cheltuie fondurile Monero asociate cu portofelul tău, așa că nu
- divulga nimănui această cheie și păstreaz-o în siguranță precum Semnătura Mnemonică.
- ]]>
-
- Listă Portofele
-
Nod
-
Monerujo folosește un dispozitiv la distanță (remote node) pentru a comunica cu Rețeaua Monero
- fără a descărca și a stoca o copie a întregii baze de date distribuite (blockchain). Poți găsi o listă
- populară de noduri de asamblare aflate la distanța, sau despre cum să creezi un nod de asamblare personal,
- la adresa https://moneroworld.com/
-
Monerujo vine cu o listă presetată de noduri de asamblare aflate la distanță (remote nodes).
- De asemenea, Monerujo reține ultimele cinci noduri folosite.
-
Portofele
-
Aici sunt afișate portofelele tale. Ele sunt salvate în dosarul monerujo aflat în
- memoria internă a dispozitivului tău. Poți să utilizezi un manager de fișiere pentru a le vedea.
- Ar trebui să efectuezi, în mod regulat, copii de siguranță ale acestui dosar pe alte dispozitive,
- în cazul în care dispozitivul tău va avea o disfuncționalitate sau va fi furat.
-
Selectează un portofel pentru a-l deschide sau atinge \"+\" pentru a crea unul nou.
- Sau selectează una din operațiunile portofelului:
-
Detalii
-
Arată detaliile portofelului, Semnătură & chei de acces.
-
Primește
-
Creează un cod QR pentru a primi Monero.
-
Redenumește
-
Redenumește portofelul. Copiile de siguranță (backups) nu sunt redenumite în această operațiune.
-
Copie de siguranță
-
Creează o copie de siguranță în dosarul backups aflat în dosarul monerujo
- suprascriind copiile anterioare.
-
Arhivează
-
Efectuează o copie de siguranță și apoi șterge fișierul portofelului. Copia va rămâne
- în dosarul backups. În cazul în care copiile de siguranță nu îți mai sunt necesare,
- va trebui să le ștergi folosind un manager de fișiere sau să ștergi aplicația într-un mod sigur.
- ]]>
-
- Detalii tranzacție
-
Destinație
- Aceasta este adresa publică la care tu ai trimis Monero
-
PaymentID
- Poți utiliza un ID de plată pentru a identifica suma trimisă între două terțe,
- acest lucru este complet opțional și privat. Ca exemplu, poate permite identificarea
- plății pentru un produs achiziționat.
-
TX ID
- Acesta este ID-ul Tranzacției și poate fi folosit pentru a identifica tranzacția ta obfuscată
- pe un explorator al bazei de date distribuită (Blockchain) a Monero, ca cel
- de pe https://xmrchain.net/
-
TX KEY (Cheie Tranzacție)
- Aceasta este cheia privată a tranzacției, care trebuie păstrată în siguranță,
- această cheie permite unei terțe părți să dezvăluie care din semnăturile formate într-un inel
- vă aparține, făcând astfel tranzacția transparentă.
-
Monobloc
- Acesta este monoblocul în care a fost inclusă tranzacția ta.
- ]]>
-
- Trimitere
-
Adresa destinatarului
-
Aceasta este adresa publică a destinatarului la care vrei să trimiți Monero, poți copia
- această adresă folosind clipboard-ul, scanând codul QR sau introducând-o manual. Verifică
- repetat această adresă pentru a fi sigur că trimiți monedele la o adresă corectă.
-
Pe lângă adresa XMR, poți folosi
-
-
un OpenAlias pentru XMR sau BTC
-
o adresă BTC
-
- Atenție, transferul BTC este procesat de serviciul SideShift.ai (vezi https://sideshift.ai
- pentru detalii). Vezi mai jos secțiunea Transfer BTC.
-
Transfer BTC
-
SideShift.ai
-
SideShift.ai este un serviciu terță parte care acționează ca un schimb valutar între Monero și Bitcoin.
- Noi folosim API-ul SideShift.ai pentru a integra plățile Bitcoin în Monerujo. Vezi
- https://sideshift.ai și decide singur dacă acesta este un serviciu pe care dorești să îl folosești. Echipa Monerujo
- nu este asociată în niciun fel cu SideShift.ai și nu te poate ajuta cu serviciile oferite de ei.
-
Rata de schimb a SideShift.ai
-
Pe ecranul cu \"Suma\" vor fi afișați parametrii serviciului SideShift.ai. Aceștia includ cursul de
- schimb actual, precum și limitele superioare și inferioare ale BTC. Reține că aceste rate de schimb
- nu sunt garantate în acest moment.
-
Ordin SideShift.ai
-
Pe ecranul cu \"Confirm\", vei vedea ordinul actual al SideShift.ai. Acest ordin este valabil pentru
- un timp limitat - este posibil să observi o numărătoare inversă pe butonul \"Consum\". Rata de schimb poate
- fi diferită de cea indicată pe ecranele anterioare.
-
Cheia secretă SideShift.ai
-
Din moment ce Monerujo gestionează numai partea Monero din tranzacția ta, cheia secretă a SideShift.ai
- poate fi folosită pentru a urmări partea Bitcoin a comenzii tale de pe site-ul SideShift.ai.
-
Numerotarea inversă SideShift.ai
-
În momentul în care numerotarea inversă ajunge la zero, va trebui să obții o nouă cotație de la SideShift.ai mergând
- înapoi la pasul anterior, apoi revenind la ecranul \"Confirm\".
- ]]>
-
- Transfer BTC
-
SideShift.ai
-
SideShift.ai este un serviciu terță parte care acționează ca un schimb valutar între Monero și Bitcoin.
- Noi folosim API-ul SideShift.ai pentru a integra plățile Bitcoin în Monerujo. Vezi
- https://sideshift.ai și decide singur dacă acesta este un serviciu pe care dorești să îl folosești. Echipa Monerujo
- nu este asociată în niciun fel cu SideShift.ai și nu te poate ajuta cu serviciile oferite de ei.
-
Rata de schimb a SideShift.ai
-
Pe ecranul cu \"Suma\" vor fi afișați parametrii serviciului SideShift.ai. Aceștia includ cursul de
- schimb actual, precum și limitele superioare și inferioare ale BTC. Reține că aceste rate de schimb
- nu sunt garantate în acest moment.
-
Ordin SideShift.ai
-
Pe ecranul cu \"Confirm\", vei vedea ordinul actual al SideShift.ai. Acest ordin este valabil pentru
- un timp limitat - este posibil să observi o numărătoare inversă pe butonul \"Consum\". Rata de schimb poate
- fi diferită de cea indicată pe ecranele anterioare.
-
Cheia secretă SideShift.ai
-
Din moment ce Monerujo gestionează numai partea Monero din tranzacția ta, cheia secretă a SideShift.ai
- poate fi folosită pentru a urmări partea Bitcoin a comenzii tale de pe site-ul SideShift.ai.
-
Numerotarea inversă SideShift.ai
-
În momentul în care numerotarea inversă ajunge la zero, va trebui să obții o nouă cotație de la SideShift.ai mergând
- înapoi la pasul anterior, apoi revenind la ecranul \"Confirm\".
- ]]>
-
- Portofelul
-
Mod Stradă
-
Modul stradă poate fi activat/dezactivat în meniu sau la atingerea iconiței cu capul lui Gunther. În acest mod,
- balanța nu e afișată pe niciun ecran, așă că poți utiliza portofelul în stradă, bar sau
- alt loc public. Tranzacțiile anterioare la fel sunt ascunse. Tranzacțiile noi vor fi afișate, ca
- să poți vizualiza scumpul Monero trimis/primit!
-
Scanarea
- Deoarece Monero păstrează lucrurile într-un mod privat, de fiecare dată când deschizi
- portofelul Monerujo, vom scana baza de date distribuită (blockchain) pentru a vedea dacă
- ai primit Monero în portofel, această metodă stochează doar informații relevante portofelului tău.
- Uneori poate dura ceva timp, fiindcă portofelul n-a fost sincronizat demult.
-
Balanța
-
Ajutor! Balanța portofelului meu a dispărut sau este neconfirmată!
- Nu te panica! În momentul în care trimiți fonduri din portofelul tău, o parte din balanță
- va fi arătată ca neconfirmată. Acest lucru se întâmplă ca urmare a modului în care este
- schimbat Monero în baza de date distribuită și modul în care se face schimbul.
- Citește mai multe despre schimb la adresa https://getmonero.org/resources/moneropedia/change.html
-
Listă tranzacții
-
O listă a tranzacțiilor portofelului. În portofele create folosind cheia de vizualizare,
- doar tranzacțiile primite vor fi afișate.
- ]]>
-
- Noduri
-
TL;DR
-
Actualizează lista de noduri prin tragerea în jos & marchează 3–5 noduri pentru a permite lui Monerujo
- să-l aleagă pe cel mai bun!
-
Ce este un Nod?
-
Monerujo folosește un nod la distanță (cunoscut și ca Daemon) pentru a comunica cu
- Rețeaua Monero fără a descărca și stoca o copie a
- întregului blockchain.
-
Listă Noduri
-
Dacă lista este goală, fie adaugi manual noduri noi sau îl lași pe Monerujo
- să scaneze rețeaua pentru tine. Sau ambele. Mai mullt…
-
Lista de noduri conține toate nodurile cunoscute în prezent. Mai mult, marca temporală
- a ultimului monobloc cunoscută fiecărui nod este afișată sub numele nodului. Calitatea răspunsului
- primit de la nod e reprezentat cu o iconiță (care indică nivelul de conectivitate așteptat)
- plasată lângă fiecare nod.
-
Orice nod din listă poate fi marcat pentru a fi utilizat mai târziu.
- Nodurile care nu sunt marcate vor fi uitate.
-
Monerujo va selecta nodul optim marcat la fiecare utilizare.
- Aceasta are loc atât prin verificarea numărului monoblocului (cât de actual
- e nodul?), cât și prin calitatea răspunsului nodului (cât de repede sunt procesate cererile?).
-
Lista e sortată după aceste caracteristici, așă că acum Monerujo va alege nodul
- cel mai bun. Josul listei va conține noduri foarte lente sau indisponibile.
-
Adaugă un Nod
-
La atingerea butonului "Adaugă Nod" din josul ecranului, va trebui
- să introduci informația nodului în dialogul următor.
- "Adresa" e hostname-ul sau adresa IP a nodului - unicul câmp
- obligatoriu.
- Introdu "Portul" dacă nodul folosește un port personalizat (ex. 18089).
- Opțional, poți denumi nodul, ca să-l identifici mai ușor mai târziu.
- Unele noduri necesită date la utilizare. Introdu numele de utilizator &
- și parola comunicate în câmpurile respective. Apoi "Testează" aceste setări.
- "Rezultatul Testării" va conține numărul monoblocului, timpul de răspuns și adresa IP folosită.
- Rezultatul poate fi și o eroare - de obicei pentru că hostname-ul comunicat nu
- poate fi accesat în timp rezonabil sau datele sunt incorecte.
- Sau combinația hostname/port nu contactează un Nod Monero actual!
- Odată ce testarea e pozitivă (fără erori) - atinge "OK" pentru a salva &
- marca acest nod.
-
Scanare Noduri
-
În plus, poți scana rețeaua pentru noduri. Monerujo va începe
- scanarea rețelei pentru noduri la distanță cu portul 18089. Primele sunt solicitate
- nodurile marcate, care vor furniza alți parteneri în rețeaua P2P Monero care, la rândul lor,
- vor căuta alții, și așa mai departe. Dacă nu ai noduri marcate
- (sau ele nu comunică informația partenerilor),
- Monerujo va accesa nodurile integrate în Monero. Scanarea
- se finalizează odată ce s-au găsit 10 noduri la distanță.
- ]]>
-
-
-
- Utilizarea unui link de plată
-
Ai accesat monerujo cu un link de plată. Pentru a trimite fonduri, te rugăm să efectuezi următoarele:
-
- 1. Deschide portofelul pe care dorești să-l folosești
- 2. Așteaptă să se sincronizeze portofelul & butonul "Trimite" va fi disponibil
- 3. Atinge butonul "Trimite"
-
-
Informația plății va fi completată. Verifică și continuă ca orice altă tranzacție.
- ]]>
-
- Am înțeles!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
deleted file mode 100644
index 079b12a..0000000
--- a/app/src/main/res/values-ro/strings.xml
+++ /dev/null
@@ -1,452 +0,0 @@
-
-
- Portofel
-
- Despre
- Politică de confidențialitate
-
- Împărtășește
- Ajutor
- Primește
- Redenumește
- Backup
-
- Continuă …
- Meh …
- Haida-ha, poți mai bine!
- Aproape …
- Așa da!
-
- Portofele
- Credits
- OK
- Anulează
- Închide
- Informații detaliate
-
- Trimis cu succes
- Gata
-
- Atinge pentru codul QR
-
- Plată BTC activată, apasă pentru mai multe informații.
- Ledger activată, apasă pentru mai multe informații.
-
- Ai introdus o adresă de %1$s.
- Vei trimite XMR și destinatarul va primi %1$s folosind serviciul SideShift.ai.
- ]]>
-
- Ordin SideShift.ai
-
- %1$s %2$s
-
- Confirmare în așteptare
- Plată în așteptare
- Eroare SideShift.ai (%1$s)
- %1$s trimis!
- Interogare …
-
- Poți trimite %1$s — %2$s %4$s.
- SideShift.ai îți oferă un curs de %3$s %4$s/XMRîn acest moment.
- ]]>
-
- Balanță: %2$s %3$s (%1$s XMR)
-
- ✔ Payment ID integrat
- Se pregătește tranzacția
-
- Creearea ordinului SideShift.ai
- Interogare ordin SideShift.ai
- Pregătirea tranzacției Monero
-
- Interogare parametrii SideShift.ai
-
- EROARE SideShift.ai
- Cod: %1$d
-
- Atinge pentru reîncercare
- Pff.. ne-am blocat acum!
- Oh, serviciul SideShift.ai este momentan indisponibil!
-
- %1$s %3$s = %2$s XMR
- (Rată: %1$s %2$s/XMR)
-
- Vizitează SideShift.ai pentru suport & interogare
- Cheia secretă \nSideShift.ai
- Cheia secretă SideShift.ai
- Destinație adresă %1$s
- Sumă
-
- ID Tranzacție
- Adresă destinație
- Notițe
-
- Copie de rezervă în curs
- Arhivare în curs
- Redenumire în curs
-
- Împachetăm lucrurile …\nPoate dura un pic!
-
- Copia de rezervă creată cu succes
- Copia de rezervă a eșuat!
- Redenumirea a eșuat!
-
- Nodul
- Se încarcă portofelul …
- Portofelul a fost salvat
- Salvarea portofelului a eșuat!
- Se conectează …
- Conexiunea la nod a eșuat!\nVerifică utilizator/parolă
- Nodul este invalid!\nÎncearcă altul.
- Nu se poate ajunge la nod!\nÎncearcă din nou sau un altul.
-
- Deconectat
-
- Tranzacție eșuată: %1$s
-
- Ai așteptat prea mult, prietene!
-
- Încă sunt ocupat cu ultimul tău portofel …
-
- Redenumește %1$s
-
- Parola pentru %1$s
- Parolă incorectă!
- Portofelul nu există!
- Adresa nodului trebuie setată!
- Portofelul selectat nu se potrivește cu rețeaua
-
- (Doar vizualizare)
-
- Primește
- Trimite
-
- + %1$s XMR neconfirmat
-
- Serviciul monerujo
-
- Sincronizat:
- Monoblocuri rămase
- Scanare:
-
- Nu se poate scrie pe memoria externă! Panică!
- Chiar avem nevoie de permisiuni pentru memoria externă!
- Fără cameră = Fără scanare coduri QR!
-
- Cheie Vizualizare
- Adresă publică
- Cheie
- Cheie vizualizre copiată în clipboard!
- Cheie copiată în clipboard!
- Adresă portofel copiată în clipboard!
- ID tranzacție copiat în clipboard!
- Copierea dezactivată din motive de securitate!
-
- Nu pot accesa rata de schimb!\nFolosește XMR/XMR sau reîncearcă
-
- Creează portofel
- Nume portofel
- Parolă portofel
- Hai cu portofelul odată!
- Mi-am notat cele 25 de cuvinte!
-
- Dă-mi un nume!
- Portofelul există!
- Nu pot începe cu .
- Se creează portofel
- Portofel creat
-
- Introdu număr sau dată (AAAA-LL-ZZ)
-
- Chei
- Nou
- Semnătură Mnemonică
- Vizualizare
-
- Adresă publică
- Cheie vizualizare
- Cheie consum
- Semnătura Mnemonică de 25-cuvinte
- Restaurează Monobloc sau Dată (YYYY-MM-ZZ)
-
- Adresă publică
- Cheie vizualizare
- Cheie consum
- Semnătură Mnemonică
-
- Introdu cheie validă
- Introdu adresă validă
- Introdu cele 25 de cuvinte
-
- Notițe private (opțional)
- Generează
- Ține scumpii mei Moneroj
- Ține scumpii mei Moneroj (%1$s)
- Cod QR invalid
- Cod QR de plată invalid
- Adresă invalidă
- Trimitere
- Balanță: %1$s XMR
- Adresă
- Sumă
- Confirmă
- Gata
-
- Sumă
- Comision (XMR)
- Comision
- Total (XMR)
- Total
-
- %1$s XMR
- +%1$s Comision
-
- Eroare creare tranzacție
-
- Comision %1$s
- (%1$s)
- eșuat
- - %1$s
- + %1$s
-
- Timestamp-ul
- ID tranzacție
- Cheie tranzacție
- Destinație
- ID plată
- Monobloc
- Sumă
- Comision
- Transferuri
- Notițe
- (opțional)
- Detalii tranzacție
-
- ÎN CURS
- EȘUATĂ
-
- Sumă
- Nu pot deschide portofel!
-
- Max. %1$s
- Min. 0
- XMR fără valoare
-
- Acum vor fi afișate date sensibile.\nUită-te peste umărul tău!
- Sunt în siguranță
- Du-mă înapoi!
- Detalii
-
- Da, fă asta!
- Nu mersi!
-
- Creează portofel nou
- Restaurează portofel vizualizare
- Restaurează portofel cu cheie privată
- Restaurează portofel cu semnătură mnemonică
-
- Schimbă parola
- Schimbare parolă în curs
- Schimbare parolă eșuată!
- Parolă schimbată
- Parolă nouă pentru %1$s
- Confirmă parola pentru %1$s
- Poți folosi amprentele digitale pentru a deschide portofelul.\nTe rugăm să atingi senzorul.
- Se deschide portofelul…
- Amprentele nu au fost recunoscute. Reîncearcă.
- Parola salvată este incorectă.\nTe rugăm să introduci parola manual.
- Permite deschiderea portofelului cu amprenta digitală
-
- Autentificare amprentă digitală
-
Având autentificarea amprentă digitală activată, poți vizualiza balanța portofelului și primi fonduri
- fără a introduce parola.
-
Pentru securitate suplimentară, monerujo va solicita să introduci parola atunci când
- vizualizezi informația portofelului sau trimiți fonduri.
- Avertisment de securitate
-
În final, monerujo îți reamintește că oricine va avea amprenta ta digitală va putea
- să urmărească balanța portofelului tău.
-
Ca exemplu, un utilizator malițios din preajma ta ar putea deschide portofelul atunci când dormi.
- Sigur dorești să activezi această opțiune?
-
- Parolele nu se potrivesc
- Parola nu poate fi goală
- Parolă Recuperare Fișiere Portofel
- Creează cont
- Cont nou #%1$d adăugat
- Cont #
- Trimite toate fondurile confirmate în acest cont!
- Subadresă
- Subadresă publică #%1$d: %2$s
-
- Limbă
- De sistem
-
- Recuperează cu Ledger Nano
-
- Comunicare cu Ledger
- Confirmare necesară în Ledger!
- Preluare subadresă
- Verificare chei
- Fac calcule nebune
- Niște hash-uri
- Te rugăm să (re)conectezi dispozitivul Ledger
-
- Se crează cont
-
- %1$s atașat
- %1$s detașat
-
- Se scrie Tag-ul
- Scriere Tag eșuată!
- Scriere Tag cu succes
- Tag-ul nu are suport NDEF!
- Tag-ul vine cu %1$d biți, dar avem nevoie de %2$d!
- Nu înțeleg Tag-ul!
- Nu știu ce vrei!
- NFC disponibil!
-
- Descriere (opțional)
-
- Adresă OpenAlias indisponibilă
- OpenAlias securizată ✔
- Se rezolvă OpenAlias…
- OpenAlias fără DNSSEC - adresa poate fi falsificată
-
- Versiune nod incompatibilă - te rugăm să actualizezi!
-
- Detalii
- Mod stradă
-
- Node-o-matiC activată, atinge pentru mai multe detalii.
- Ultimul monobloc actualizat: %1$s
- Noduri
- Nume nod (Opțional)
- Hostname
- Port
- Nume utilizator (Opțional)
- Parolă (Opțional)
- Nu pot rezolva host-ul
- Avem nevoie de el!
- Trebuie să fie numeric
- Trebuie să fie 1–65535
- Adaugă nod
- Atinge pentru a actualiza!
- EROARE CONEXIUNE %1$d
- EROARE CONEXIUNE
- AUTENTIFICARE EȘUATĂ
- Rezultat testare:
- Număr: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- Se testează IP: %1$s …
- Te rugăm să aștepți până la finalizarea scanării
- Atinge pentru a selecta sau adăuga noduri
- Adaugă noduri manual sau trage în jos pentru a scana
- Se scanează rețeaua…
- Au fost marcate automat cele mai bune %1$d noduri
- Testează
-
- Destinatar
-
- TOT!
-
- Convertește semnătura Ledger
- Cuvinte Semnătură Ledger
- Parolă Ledger (opțional)
- Semnătură Ledger invalidă!
- Introducere semnăturii tale Ledger aici e un risc major de securitate!
-
- Restaurează Monobloc
-
- Pornește aplicația Monero la %1$s
-
- Rescanează!
-
- Am înțeles!
- Următorul
- Sunt gata!
-
- Bun venit la Monerujo!
- Această aplicație îți permite să creezi și folosești portofele Monero. Poți stoca scumpii tăi moneroj în ele.
- Păstrează semnătura ta în singuranță
- Semnătura oferă accces deplin celui ce o are. Dacă o pierzi, nu te putem ajuta să o recuperezi și pierzi dulcii tăi moneroj.
- Trimite Cripto
- Monerujo are integrat serviciul SideShift.ai. Doar inserează sau scanează o adresă BTC, LTC, ETH, DASH sau DOGE și vei trimite aceste monede cu XMR.
- Noduri, cum îți dorești
- Nodurile te conectează la rețeaua Monero. Alege între noduri publice sau fii un cypherpunk și pornește unul propriu.
- Trimite cu amprentă
- Acum poți trimite XMR cu doar amprenta personală, în cazul în care a fost activată. Pentru a o face cu parola, dezactivează accesul la amprentă.
-
- Mod întunecat
-
- Auto
- Zi
- Noapte
-
- Nu e nimic aici\nTe rugăm să creezi sau recuperezi un portofel
-
- Restaurează noduri prestabilite
- Restaurare deja în curs…
-
- Ultimul monobloc: %1$d secunde în urmă
- Ultimul monobloc: %1$d minute în urmă
- Ultimul monobloc: %1$d ore în urmă
- Ultimul monobloc: %1$d zile în urmă
-
- Nu pot obține o cotație
- Verifică suma și reîncearcă
-
- Adresă ambiguă.
- Te rugăm să selectezi tipul de mai sus.
- ]]>
-
- Te rugăm să introduci sau scanezi o adresă %1$s.
- Vei trimite XMR și destinatarul va primi %2$s folosind serviciul SideShift.ai.
- ]]>
-
- Te rugăm să introduci sau scanezi o adresă Monero.
- ]]>
-
- Subadrese
- Nume subadresă
- Prea multe adrese neutilizate - începe să le folosești pentru a putea crea mai multe!
- Prea multe conturi neutilizate - începe să le folosești pentru a putea crea mai multe!
- Tranzacții pentru această subadresă:
- Nicio tranzacție pentru această subadresă
- Selectează o subadresă
- Atinge lung pentru detalii
-
- This wallet will be deleted. Your funds will be gone forever unless you have your seed or a working backup to recover it.
- Delete
- Delete failed!
-
- Import wallet
- Import failed!
-
- Reset wallet!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-ru/about.xml b/app/src/main/res/values-ru/about.xml
deleted file mode 100644
index 6841f31..0000000
--- a/app/src/main/res/values-ru/about.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
- Закрыть
- Я monerujo
- Версия %1$s (%2$d)
-
- Информация
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo et al.
-
- monerujo.io
- ]]>
-
- Политика конфиденциальности
-
Данная страница содержит информацию, касающуюся нашей политики по сбору,
- использованию и раскрытию ваших личных данных, которые мы получаем
- от пользователей приложения (monerujo: Monero Wallet).
-
-
Используя приложение, вы соглашаетесь на сбор и использование
- информации в соответствии с данной политикой.
-
-
Собранные данные
-
Личными данными являются любые данные, которые позволяют
- идентифицировать вас как личность.
-
Приложение локально собирает и обрабатывает ключи и публичные адреса Monero
- с целью обработки транзакций и её передачи в сеть Monero в зашифрованной форме.
-
-
Приложение не собирает каких-либо других личных данных.
-
Если вы используете функцию обмена(необязательно), monerujo получает обменный
- курс через публичный API coinmarketcap.com.
- Перейдите по адресу https://coinmarketcap.com/privacy для получения подробной
- информации о том, как собираются ваши персональные данные в запросах.
-
Если вы используете приложение для оплаты по адресам BTC,
- вы будете использовать сервис SideShift.ai. Их политика конфиденциальности подробно
- изложена на вебсайте https://sideshift.ai/. Monerujo отправляет им адрес
- назначения BTC и сумму. Ваш IP также указывается.
-
Разрешения, необходимые приложению
-
-
INTERNET : Подсоединение к сети Monero через демон-узел.
-
READ_EXTERNAL_STORAGE : Считывание файлов кошелька, которые хранятся на устройстве.
-
WRITE_EXTERNAL_STORAGE : Запись файлов кошелька, которые хранятся на устройстве.
-
WAKE_LOCK : Выведение устройства из неактивного состояния при синхронизации.
-
CAMERA : Сканирование QR-кодов для получения Monero.
-
-
Изменения в политике конфиденциальности
-
В данные положения политики конфиденциальности периодически могут
- вноситься изменения. В случае внесения таких изменений, новые положения
- будут опубликованы в приложении и на вебсайте (www.monerujo.io).
- Рекомендуется периодически проверять положения политики
- конфиденциальности на предмет внесения изменений.
-
Дата последнего обновления положений политики конфиденциальности: 10.11.2017
-
-
Контактная информация
-
Если у вас возникли вопросы, касающиеся нашей политики конфиденциальности
- или того, как происходит сбор и обработка ваших данных,
- напишите нам по адресу privacy@monerujo.io
-
- ]]>
-
\ No newline at end of file
diff --git a/app/src/main/res/values-ru/help.xml b/app/src/main/res/values-ru/help.xml
deleted file mode 100644
index 28fb0b0..0000000
--- a/app/src/main/res/values-ru/help.xml
+++ /dev/null
@@ -1,319 +0,0 @@
-
-
- Создать кошелёк — Новый
-
Если вам нужен новый адрес Monero!
-
Введите уникальное имя и пароль кошелька.
- Пароль используется для защиты данных вашего кошелька на Android устройстве.
- Необходимо использовать надёжный пароль. Лучше даже использовать фразу-пароль.
-
Запишите вашу мнемоническую фразу!
-
Следующий экран будет содержать вашу \"Мнемоническую фразу\", состоящую из 25 слов.
- Это единственные данные, которые необходимы для восстановления вашего кошелька в
- будущем и получения доступа к вашим средствам.
- Поддержание безопасности и конфиденциальности очень важно, так как это
- гарантирует, что никто не сможет получить доступ к вашим средствам!
-
Если вы потеряете пароль от вашего кошелька, вы сможете восстановить его, используя мнемоническую фразу.
-
Способ восстановления мнемонической фразы отсутствует. В случае её потери будут утеряны
- и все ваши средства! Также вы никогда не сможете изменить мнемоническую фразу, и если она
- будет украдена или раскрыта каким-либо другим образом, то вам придётся перенести ваши средства
- в новый кошелёк (с новой мнемонической фразой). Поэтому рекомендуется создать резервную копию
- вашей мнемонической фразы, записав её и сохранив несколько копий в безопасном месте.
- ]]>
-
- Создать кошелёк — Фраза
-
Что делать, если у вас уже есть адрес Monero, и вы хотите восстановить транзакции из блокчейна.
-
Необходимо ввести уникальные имя и пароль кошелька. Пароль используется для защиты данных вашего
- кошелька на устройстве. Необходимо использовать надёжный пароль. Лучше даже использовать фразу-пароль.
-
Ввести фразу в поле \"Мнемоническая фраза\".
-
Если вам известен номер блока первой транзакции, который использовался с этим адресом, следует
- ввести его в поле \"Восстановить высоту\". Если не заполните это поле, то будет просканирован весь блокчейн,
- чтобы найти транзакции, принадлежащие к вашему адресу, а это займёт много времени.
- ]]>
-
- Создать кошелёк — Ключи
-
Если вы хотите восстанавить свой кошелек с помощью ключей!
-
Необходимо ввести уникальные имя и пароль кошелька. Пароль используется для защиты данных вашего
- кошелька на устройстве. Необходимо использовать надёжный пароль. Лучше даже использовать фразу-пароль.
-
Введите ваш Monero адрес в поле \"Публичный адрес\", заполните поле \"Ключ просмотра\" и \"Ключ траты\".
-
Если вам известен номер блока первой транзакции, который использовался с этим адресом, следует
- ввести его в поле \"Восстановить высоту\". Если не заполнить это поле, то будет просканирован весь блокчейн,
- чтобы найти транзакции, принадлежащие к вашему адресу, а это займёт много времени.
- ]]>
-
- Создать кошелёк - Просмотр
-
Если вы просто хотите просматривать входящие транзакции на кошелек!
-
Необходимо ввести уникальные имя и пароль кошелька. Пароль используется для защиты данных вашего
- кошелька на устройстве. Необходимо использовать надёжный пароль. Лучше даже использовать фразу-пароль.
-
Введите ваш Monero адрес в поле \"Публичный адрес\", заполните поле \"Ключ просмотра\".
-
Если вам известен номер блока первой транзакции, который использовался с этим адресом, следует
- ввести его в поле \"Восстановить высоту\". Если не заполнить это поле, то будет просканирован весь блокчейн,
- чтобы найти транзакции, принадлежащие к вашему адресу, а это займёт много времени.
- ]]>
-
- Реквизиты кошелька
-
Публичный адрес
- Ваш публичный адрес подобен номеру вашего банковского счёта, вы можете делиться им с кем бы то ни было,
- не боясь потерять свои Monero. Monero будут отправлять на ваш кошелёк, используя именно этот адрес.
-
Мнемоническая фраза
- Это единственные данные, которые необходимы для восстановления вашего кошелька в будущем и получения
- доступа к вашим средствам. Поддержание безопасности и конфиденциальности очень важно,
- так как это гарантирует, что никто не сможет получить доступ к вашим средствам!
- Если вы не записали эту фразу и не храните её где-нибудь в безопасном месте, сделайте это!
-
Файлы восстановления пароля кошелька
- Следует убедиться в том, что вы записали пароль. Если вы вернётесь к заводским настройкам вашего
- устройства или деинсталлируете приложение, он вам понадобится для восстановления доступа к вашему кошельку.
-
CrAzYpass
- Если вы видите пароль, который состоит из 52 буквенно-цифровых символов, разбитых на
- четыре группы — поздравляем! Файлы вашего кошелька защищены 256-битным ключом, который генерируется
- с использованием функций безопасности вашего устройства и приложения на основе выбранной вами
- фразы-пароля (при создании или при изменении). Этот ключ взломать крайне сложно!
- Данный элемент обязателен для недавно созданных кошельков.
-
Устаревший пароль
- Если вы видите здесь вашу фразу-пароль, это означает, что файлы вашего кошелька защищены не так надёжно,
- как при использовании CrAzYpass. Чтобы исправить положение, необходимо просто выбрать в меню \"Изменить пароль\".
- После того, как новая фраза-пароль будет введена (возможно, та же, что и была до этого),
- приложение сгенерирует CrAzYpass и таким образом защитит файлы вашего кошелька. Запишите её!
-
Кошельки с CrAzYpass
- Если вам когда-либо понадобится переустановить Monerujo (например, после изменения настроек вашего телефона
- или при появлении у вас нового телефона), или же вам захочется использовать файлы вашего кошелька на
- другом устройстве или ПК, вы сможете использовать этот пароль восстановления,
- чтобы снова получить доступ к вашему кошельку.
- Для того чтобы выбрать другую фразу-пароль, необходимо выбрать \"Изменить пароль\" в меню.
- Следует помнить о том, что при этом будет сгенерирован новый пароль восстановления. Запишите его!
-
Ключ просмотра
- Ваш ключ просмотра может использоваться для просмотра входящих транзакций вашего кошелька без разрешения
- на трату средств, находящихся в кошельке.
-
Ключ траты
- Ваш ключ траты позволяет любому потратить Monero, связанные с вашим кошельком, поэтому не следует сообщать
- кому-либо этот ключ. Как и мнемоническую фразу, его следует держать в безопасном месте.
- ]]>
-
- Перечень терминов
-
Удаленный узел
-
Для связи с сетью Monero без загрузки и сохранения копии всего блокчейна Monerujo использует
- удалённый узел. Список популярных удалённых узлов и информацию о том, как запустить собственный
- удалённый узел, можно найти здесь: https://moneroworld.com
-
Monerujo имеет некоторые предустановленные удалённые узлы. Также кошелёк запоминает
- пять последних использованных узлов.
-
Кошельки
-
Здесь вы можете посмотреть кошельки. Они находятся в папке Monerujo на внутреннем накопителе
- вашего устройства. Чтобы просмотреть их, можно использовать файловый менеджер. Необходимо на
- регулярной основе создавать резервную копию этой папки для её хранения вне устройства на тот
- случай, если устройство будет повреждено или украдено.
-
Чтобы открыть кошелёк, необходимо выбрать его, а чтобы создать новый, следует
- использовать \"+\". Или же можно выбрать одну из указанных ниже операций.
-
Подробная информация
-
Показать подробную информацию по кошельку, мнемонической фразе, ключам.
-
Получить
-
Создать QR-код для получения Monero.
-
Переименовать
-
Переименовать кошелёк. Резервные копии не переименовываются.
-
Создать резервную копию
-
Создать копию кошелька в папке backups внутри Monerujo, переписав предыдущие копии.
-
Архивировать
-
Создать резервную копию и после этого удалить кошелёк. Копия остаётся в папке backups.
- Если необходимость в резервных копиях отсутствует, следует удалить их, используя файловый
- менеджер или приложение для безопасного удаления файлов.
- ]]>
-
- Детали транзакции
-
Адрес назначения
- Это публичный адрес кошелька, на который вы отправляете Monero
-
PaymentID
- Вы можете использовать Payment ID для идентификации причины, по которой Monero передаётся между
- двумя сторонами. Это опциональная и конфиденциальная операция. Например, она позволяет
- коммерсантам сверить вашу транзакцию с товаром, который был приобретён вами.
-
TX ID
- Это идентификатор вашей транзакции (Transaction ID). Вы можете использовать его для поиска
- вашей транзакции через просмотр блокчейна Monero, например, через этот:
- https://xmrchain.net/
-
TX KEY (Ключ транзакции)
- Это ваш приватный ключ транзакции. Его следует хранить в безопасном месте, так как с его помощью
- третья сторона может идентифицировать вашу подпись в кольце, что сделает транзакцию прозрачной.
-
Блок
- Номер блока, в который была включена ваша транзакция.
- ]]>
-
- Отправка
-
Адрес получателя
-
Это публичный адрес кошелька, на который вы отправляете Monero. Вы можете скопировать его
- из буфера, отсканировать QR-код или ввести вручную. Следует трижды проверить правильность
- этого адреса, чтобы не отправить монеты на ошибочный адрес.
-
Помимо использования адреса XMR, вы также можете использовать
-
-
OpenAlias для XMR или BTC
-
BTC адрес
-
- Обращаем ваше внимание, что отправка BTC выполняется через сервис SideShift.ai (посетите https://sideshift.ai
- для получения доп. информации). Ознакомьтесь с разделом об отправке BTC ниже.
-
Отправка BTC
-
SideShift.ai
-
SideShift.ai является сторонним сервисом, который помогает осуществлять обмен Monero на Bitcoin.
- Мы используем API службы SideShift.ai для включения платежей с использованием Bitcoin в Monerujo.
- Пожалуйста, посетите https://sideshift.ai, и решите, хотите ли вы использовать эту возможность.
- Команда Monerujo не связана с SideShift.ai и не может помочь вам в работе с этой службой.
-
Курс обмена SideShift.ai
-
На экране \"Сумма\" отображаются текущие параметры службы SideShift.ai.
- Здесь также отображается обменный курс, верхний и нижний предел BTC. Необходимо отметить,
- что на данном этапе курс не гарантируется.
-
Заказ SideShift.ai
-
На экране \"Подтверждение\" можно увидеть фактический заказ SideShift.ai. Этот заказ
- действителен в течение ограниченного времени. Обратный отсчёт можно увидеть на кнопке
- траты \"Трата\". Курс обмена может отличаться от того, что был показан на предыдущих экранах.
-
Секретный ключ SideShift.ai
-
Так как Monerujo отвечает за ту часть транзакции, которая связана с Monero, для отслеживания
- вашего заказа, которая связана с Bitcoin, можно использовать секретный ключ на домашней странице
- SideShift.ai.
-
Обратный отсчёт SideShift.ai
-
Как только обратный отсчёт достигнет нулевой точки, вам понадобится получить от SideShift.ai новое
- предложение, вернувшись к предыдущему шагу, а затем к экрану \"Подтверждение\".
- ]]>
-
- Отправка BTC
-
SideShift.ai
-
SideShift.ai является сторонним сервисом, который помогает осуществлять обмен Monero на Bitcoin.
- Мы используем API службы SideShift.ai для включения платежей с использованием Bitcoin в Monerujo.
- Пожалуйста, посетите https://sideshift.ai, и решите, хотите ли вы использовать эту возможность.
- Команда Monerujo не связана с SideShift.ai и не может помочь вам в работе с этой службой.
-
Курс обмена SideShift.ai
-
На экране \"Сумма\" отображаются текущие параметры службы SideShift.ai.
- Здесь также отображается обменный курс, верхний и нижний предел BTC. Необходимо отметить,
- что на данном этапе курс не гарантируется.
-
Заказ SideShift.ai
-
На экране \"Подтверждение\" можно увидеть фактический заказ SideShift.ai. Этот заказ
- действителен в течение ограниченного времени. Обратный отсчёт можно увидеть на кнопке
- траты \"Трата\". Курс обмена может отличаться от того, что был показан на предыдущих экранах.
-
Секретный ключ SideShift.ai
-
Так как Monerujo отвечает за ту часть транзакции, которая связана с Monero, для отслеживания
- вашего заказа, которая связана с Bitcoin, можно использовать секретный ключ на домашней странице
- SideShift.ai.
-
Обратный отсчёт SideShift.ai
-
Как только обратный отсчёт достигнет нулевой точки, вам понадобится получить от SideShift.ai новое
- предложение, вернувшись к предыдущему шагу, а затем к экрану \"Подтверждение\".
- ]]>
-
- Создать Ledger кошелек
-
Вы хотите восстановить свой кошелек из Ledger Nano S.
-
Ваши секретные ключи никогда не покидают пределы устройства Ledger. Вам необходимо подключать
- устройство каждый раз, когда вы хотите получить доступ к своему кошельку.
-
Необходимо ввести уникальные имя и пароль кошелька. Пароль используется для защиты данных вашего
- кошелька на устройстве. Необходимо использовать надёжный пароль. Лучше даже использовать фразу-пароль.
-
Если вам известен номер блока первой транзакции, который использовался с этим адресом, следует
- ввести его в поле \"Восстановить высоту\". Вы также можете использовать дату в формате YYYY-MM-DD.
- Если вы не уверены, введите приблизительную дату/высоту блока до того как вы впервые использовали этот кошелек.
- ]]>
-
- Кошелек
-
Уличный режим
-
Уличный режим можно включить/отключить в меню или через иконку головы Гюнтера. В этом режиме
- ваш баланс не будет отображаться, и вы можете безопасно пользоваться своим кошельком на улице,
- в пабе или другом общественном месте. Предыдущие транзакции будут скрыты. Для отображения
- будут доступны только новые транзакции, поэтому вы всегда сможете увидеть, что получили или
- успешно отправили сладенькие Moneroj!
-
Сканирование
- Поскольку Monero ориентирована на подержание анонимности, всякий раз, когда вы открываете кошелёк
- Monerujo, нам приходится сканировать блокчейн, чтобы посмотреть, были ли отправлены на ваш кошелёк
- новые Monero. Информация сохраняется только на вашем телефоне, привязанном к вашему кошельку.
- Иногда это может занять какое-то время, так как вы не синхронизировались в течение долгого периода.
-
Баланс
-
Помогите! Баланс моего кошелька куда-то исчез или не подтверждён!
- Не паникуйте! Если вы отправляете средства с вашего кошелька, ваш баланс временно остаётся
- неподтверждённым. Это происходит в результате процесса обмена Monero в блокчейне и работы механизма
- сдачи. Подробности обмена можно узнать по ссылке:
- https://getmonero.org/resources/moneropedia/change.html
-
Список транзакций
-
Список транзакций, проведённых с использованием этого кошелька. В кошельках просмотра можно увидеть
- только входящие транзакции.
- ]]>
-
- Узлы
-
МНОГА БУКАФ, НИАСИЛИЛ
-
Обновите ваш список узлов, потянув вниз в разделе & закладок 3–5 , чтобы Monerujo
- мог выбрать лучший узел для вас!
-
Что такое' узлы?
-
Monerujo использует удаленные узлы (их также называют Daemon), для связи с сетью
- Monero без необходимости загружать и хранить копию всего блокчейна на устройстве.
-
Список узлов
-
Если список пуст, вы можете добавить новые узлы вручную или разрешить Monerujo
- сканировать сеть. Возможны оба варианта. Подробнее…
-
Список узлов показывает все известные на данный момент узлы. Кроме того, отметка
- времени последнего блока известна каждому узлу и отображается под именем узла. Рядом
- с каждым узлом отображается значок, представляющий поведение ответа узла'
- (указывает на расчетный уровень подключения)
-
Любой узел из списка можно добавить в закладки для последующего использования.
- Узлы, не добавленные в закладки, будут забыты.
-
Monerujo будет выбирать оптимальный узел из закладок каждый раз, когда вы используете его.
- Он делает это, проверяя высоту блока (насколько актуален
- узел), а также поведение ответа (как быстро узел отвечает на запросы?).
-
Список сортируется по данным характеристикам, верхний узел будет тем, кому Monerujo
- отдаст наибольшее предпочтение при подключении. В нижней части списка будут отображаться
- медленные или недоступные узлы.
-
Добавить узел
-
При нажатии на кнопку "Добавить узел" вам будет предложено ввести сведения
- об узле в следующем диалоговом окне.
- "Адрес" - имя хоста или IP-адрес узла, это единственный обязательный параметр.
- Введите "Порт" если данный узел работает не на стандартном порте (например, 18089).
- Вы также можете дать наименование для данного узла, это может помочь при его поиске в списке.
- Введите имя пользователя & и пароль в соответствующих полях. Теперь вы можете
- "Проверить" эти настройки.
- В результатах "Проверки" будет отображаться высота блока, время отклика и фактический IP-адрес.
- Результатом также может быть ошибка, обычно потому, что введенный адрес не ответил
- в доступные сроки или введенные данные просто неверны.
- Или комбинация из адреса хоста/порта не указывает на фактический узел Monero!
- После того, как тест пройден (без ошибок), вам' необходимо нажать "OK" для сохранения &
- данного узла в закладки.
-
Сканирование узлов
-
Кроме того, вы можете сканировать сеть на наличие узлов. Monerujo начнет
- сканирование сети на наличие удаленных узлов через порт 18089. Процесс начинает с того, что
- Monerujo запрашивает у ваших узлов в адресной книге другие адреса узлов в сети Monero P2P,
- а затем продолжает, запрашивая у них другие одноранговые узлы. Если у вас нет узлов в
- закладках (или они не возвращают нам ответные данные), Monerujo перейдет к узлам Monero,
- которые добавлены в код Monero. Сканирование останавливается, когда будет найдено 10
- удаленных узлов.
- ]]>
-
-
-
- Использование платежной ссылки
-
Вы начали использование monerujo с платежной ссылкой. Для отправки средств, пожалуйста, выполните следующее:
-
- 1. Откройте кошелек, с которого будет происходить трата
- 2. Подождите, пока кошелек не будет синхронизирован & появится кнопка "Передать"
- 3. Нажмите на кнопку "Передать"
-
-
Платежные реквизиты будут заполнены. Проверьте их и действуйте, как в случае с любой другой транзакцией.
- ]]>
-
- Я понял!
-
- Не…
- Скачать Orbot!
- Tor
-
Tor, сокр. от The Onion Router, бесплатное и программное обеспечение с открытым исходным кодом для обеспечения анонимного общения.
-
Включение Tor перенаправит подключение к нескольким узлам и скроет IP-адрес от узла.
- Имейте в виду, что это более приватно, но и медленнее.
-
Для того, чтобы использовать Tor с Monerujo, вам понадобится Orbot на вашем телефоне. После установки Orbot убедитесь,
- что вы включили его, нажав значок сети на экране списка кошельков.
-
Если у вас есть проблемы с подключением к Tor, попробуйте получить новую идентичность в приложении Orbot (значок
- в правом верхнем углу).
- ]]>
-
- Tor узел
-
Это .onion узел. Для того, чтобы использовать его, вы должны включить Tor, нажав
- значок в верхней части страницы списка кошельков.
- ]]>
-
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
deleted file mode 100644
index 246c2a1..0000000
--- a/app/src/main/res/values-ru/strings.xml
+++ /dev/null
@@ -1,456 +0,0 @@
-
-
- Кошелек
-
- О программе
- Политика конфиденциальности
-
- Поделиться
- Помощь
- Получить
- Переименовать
- Резервная копия
- Изменить пароль
-
- Продолжайте писать …
- Ничего выдающегося …
- Давай, ты можешь лучше!
- Почти получилось! …
- Отлично! В лучших традициях h4x0r!
-
- Кошелек
- О кошельке
- Ок
- Отмена
- Закрыть
- Дополнительная информация
-
- Успешно отправлено
- Готово
-
- Нажмите для использования QR-кода
-
- Доступны переводы в BTC, нажмите для доп. информации
- Доступен Ledger, нажмите для доп. информации
-
- Вы ввели %1$s адрес.
- Отправляйте XMR, получатель получит %1$s, используя сервис SideShift.ai
- ]]>
-
- Заказ SideShift.ai
-
- %1$s %2$s
-
-
- Ожидание подтверждения
- Ожидание платежа
- Ошибка SideShift.ai (%1$s)
- %1$s успешно отправлены!
- Запрос …
-
- Вы можете отправить %1$s — %2$s %4$s.
- SideShift.ai устанавливает курс обмена %3$s %4$s/XMRв данный момент.
- ]]>
-
- Баланс: %2$s %3$s (%1$s XMR)
-
- ✔ Интегрированный ID платежа
- Подготовка транзакции
-
- Создание заказа SideShift.ai
- Запрос заказа SideShift.ai
- Подготовка транзакции Monero
-
- Запрос параметров SideShift.ai
-
- SideShift.ai ОШИБКА
- Код: %1$d
-
- Нажмите, чтобы повторить попытку
- Теперь мы застряли здесь!
- Ой-ой! Кажется SideShift.ai недоступен в данный момент!
-
- %1$s %3$s = %2$s XMR
- (Курс: %1$s %2$s/XMR)
-
- Посетите SideShift.ai для получения помощи &
- Секретный ключ\nSideShift.ai
- SideShift.ai секретный ключ
- Адрес получателя %1$s
- Сумма
-
- ID транзакции
- Адрес назначения
- Примечание
-
- Выполняется резервное копирование
- Выполняется архивирование
- Выполняется переименование
- Выполняется изменение пароля
-
- Для данного действия …\nМожет потребоваться некоторое время!
-
- Резервное копирование произошло с ошибкой!
- Переименование произошло с ошибкой!
- Изменение пароля произошло с ошибкой!
- Изменение пароля выполено успешно
-
- Удаленный узел
- Загрузка кошелька …
- Кошелек записан
- Ошибка записи кошелека!
- Подключение …
- Ошибка подключения к удаленному узлу!\nПроверьте username/password
- Ошибка удаленного узла!\nПопробуйте еще раз.
- Не удается подключится к удаленному узлу!\nПопробуйте позже.
-
- Разъединено
-
- Ошибка транзакции: %1$s
-
- Ты слишком долго ждал, мой друг!
-
- Я все еще занят твоим кошельком …
-
- Переименовать %1$s
-
- Новый пароль для %1$s
- Повторите пароль для %1$s
- Пароль для %1$s
- Теперь вы можете открыть кошелек с помощью отпечатков пальцев.\nПожалуйста коснитесь датчика.
- Открытие кошелька…
- Отпечаток пальца не распознается. Попробуйте ещё раз.
- Неверный пароль!
- Сохраненный пароль неверен.\nВведите пароль вручную.
- Кошелька не существует!
- Должен быть установлен адрес удаленного узла!
- Кошелек не соответствует выбранной сети
-
- (Режим просмотра)
-
- Получить
- Передать
-
- + %1$s XMR неподтвержденно
-
- Служба Monerujo
-
- Синхронизировано:
- Блоков осталось
- Просканировано:
-
- Внешнее хранилище недоступно для записи! Ахтунг!
- Нам действительно нужны эти разрешения!
- Нет доступа к камере = Нет QR-сканирования!
-
- Ключ просмотра
- Публичный адрес
- Ключ
- Ключ просмотра скопирован в буфер обмена!
- Ключ скопирован в буфер обмена!
- Адрес кошелька скопирован в буфер обмена!
- ID транзакции копирован в буфер обмена!
- Копирование недоступно по соображениям безопасности!
-
- Не удается получить курс обмена!\nИспользуйте XMR/XMR или повторите попытку
-
- Создать кошелек
- Имя кошелька
- Пароль кошелька
- Разрешить открыть кошелек при помощи отпечатка пальца
- Аутентификация по отпечаткам пальцев
-
С поддержкой аутентификации по отпечаткам пальцев, вы можете просматривать баланс и получать средства
- без ввода пароля.
-
Но для дополнительной безопасности, Monerujo потребует от вас ввести пароль при
- просмотре деталей кошелька или отправке средств.
- Предупреждение системы безопасности
-
Monerujo хочет напомнить вам, что любой, кто может получить ваш отпечаток пальца, будет
- обладать возможностью, заглянуть в баланс вашего кошелька.
-
Например, злоумышленник может заглянуть в ваш кошелек, когда вы спите.
- Вы уверены, что хотите включить эту функцию?
- ]]>
- Пароль не совпадает
- Пароль не может быть пустым
- Сделайте мне уже кошелек!
- Я записал мнемоническую фразу
-
- Придумай мне имя!
- Такой кошелек существует!
- Не может начинаться с .
- Создание кошелька
- Кошелек создан
-
- Введите номер блока или дату (YYYY-MM-DD)
-
- Ключ
- Новый
- Фраза
- Просмотр
-
- Публичный адрес
- Ключ просмотра
- Ключ траты
- Мнемоническая фраза (25 слов)
- Восстановить высоту или дату (YYYY-MM-DD)
-
- Публичный адрес
- Ключ просмотра
- Ключ траты
- Мнемоническая фраза
- Дата высоты восстановления (YYYY-MM-DD)
-
- Введите действующий ключ
- Введите действующий адрес
- Введите вашу мнемоническую фразу
-
- Персональная заметка (необязательно)
- Генерация
- Потратьте мои сладкие Moneroj
- Потратьте мои сладкие Moneroj (%1$s)
- Это не QR-код
- Недопустимый платеж по QR-коду
- Недопустимый адрес
- Отправка
- Баланс: %1$s XMR
- Адрес
- Сумма
- Подтверждение
- Готово
-
- Сумма
- Комиссия (XMR)
- Комиссия
- Всего (XMR)
- Всего
-
- %1$s XMR
- +%1$s Комиссия
-
- Ошибка создания транзакции
-
- Комиссия %1$s
- (%1$s)
- Не удалось
- - %1$s
- + %1$s
-
- Отметка времени
- TX ID
- Ключ TX
- Адресат
- ID платежа
- Блок
- Сумма
- Комиссия
- Переводы
- Заметки
- (необязательно)
- Подробно
-
- ОЖИДАНИЕ
- ОШИБКА
-
- Сумма
- Не удалось открыть кошелек!
-
- Макс. %1$s
- Мин. 0
- Не числовое значение XMR
-
- Сейчас будут показаны конфиденциальные данные. Оглянись вокруг!
- Я в безопасности
- Верните меня обратно!
- Подробная информация
-
- Этот кошелек будет удален. Твои деньги исчезнут навсегда, если у тебя нет сид-фразы или рабочей резервной копии для их восстановления.
- Да, сделай это!
- Нет, спасибо!
-
- Создать новый кошелек
- Восстановить кошелек только для просмотра
- Восстановить кошелек из ключей
- Восстановить кошелек из мнемонической фразы
-
- Создать учетную запись
- Добавить новую учетную запись #%1$d
- Учетная запись #
-
- Отправить все средства на этот счет!
- Подадрес
- Публичный подадрес #%1$d: %2$s
-
- Язык
- Использовать язык системы
-
- Восстановление из Ledger Nano
-
- Подключение к Ledger
- Требуется подтверждение в Ledger!
- Получение подадресов
- Проверка ключей
- Занимаюсь сумасшедшей математикой
- Хеширование материалов
- Подключите (переподключите) устройство Ledger
-
- Создание аккаунта
-
- %1$s прикреплен
- %1$s откреплён
-
- Запись метки
- Ошибка записи метки!
- Успешная запись метки
- Метка не поддерживает NDEF!
- Метка предоставляет %1$d байт, но нам нужно %2$d!
- Я не понимаю эту метку!
- Я не знаю, чего ты хочешь!
- NFC доступен!
-
- Описание (необязательно)
-
- Адрес OpenAlias недоступен
- OpenAlias безопасен ✔
- Разрешения OpenAlias…
- OpenAlias без DNSSEC - адрес может быть подделан
-
- Версия узла несовместима - пожалуйста, обновите!
-
- Показать ключи
- Уличный режим
-
- Node-o-matiC включен, нажмите для получения дополнительной информации.
- Последний блок: %1$s
- Узлы
- Имя узла (необязательно)
- Имя хоста
- Порт
- Имя пользователя (необязательно)
- Пароль (необязательно)
- Не удается подключиться к узлу
- Нам это нужно!
- Должен быть числовым
- Должен быть 1–65535
- Добавить узел
- Нажмите, чтобы обновить!
- ОШИБКА СОЕДИНЕНИЯ %1$d
- ОШИБКА СОЕДИНЕНИЯ
- ОШИБКА АУТЕНТИФИКАЦИИ
- Результат тестирования:
- Высота: %1$s (v%2$d), Пинг: %3$.0fms, IP: %4$s
- Тестирование IP: %1$s …
- Пожалуйста, дождитесь окончания сканирования
- Нажмите, чтобы выбрать или добавить узлы
- Добавьте узлы вручную или потяните вниз для сканирования
- Сканирование сети…
- Автоматически отмечены лучшие %1$d узлы
- Проверка
-
- Резервное копирование успешно
-
-
- Получатель
-
- ВСЕ!
-
- Преобразовать фразу Ledger
- Словесная фраза Ledger
- Пароль Ledger (необязательно)
- Ошибка фразы Ledger!
- Если вы пытаетесь ввести сюда фразу Ledger, это серьезная угроза для вашей безопасности!
-
- Высота восстановления
-
- Запуск приложения Monero на %1$s
-
- Пересканировать!
-
- Я понял!
- Далее
- Я готов!
-
- Добро пожаловать в Monerujo!
- Данное приложение позволяет создавать и использовать кошельки Monero. Вы можете хранить ваши сладкие moneroj в них.
- Храните свои ключи в безопасности
- Секретная фраза дает полный доступ к кошельку. Если вы её потеряете, мы не сможем её восстановить и вы потеряете ваши moneroj.
- Отправка других криптовалют
- Monerujo имеет поддержку SideShift.ai. Просто вставьте (или просканируйте) адрес BTC, LTC, ETH, DASH или DOGE и вы будете отправлять эти криптовалюты, тратя XMR.
- Узлы, узлы, узлы…
- Узлы позволяют подключаться к сети Monero. Выбирайте между общедоступными узлами или используйте свой собственный для безопасности IP адреса.
- Отправка с помощью отпечатка пальца
- Теперь вы можете отправлять XMR с помощью отпечатка пальца, если вы его включили. Чтобы запросить пароль, просто отключите доступ к отпечаткам пальцев.
-
- Тема
-
- Автоматически
- Светлая (дневная)
- Тёмная (ночная)
-
- Тут ничего нет\nСоздайте или восстановите кошелек
-
- Восстановить узел по умолчанию
- Восстановление уже в процессе…
-
- Последний блок: %1$d секунд назад
- Последний блок: %1$d минут назад
- Последний блок: %1$d часов назад
- Последний блок: %1$d дней назад
-
- Не могу получить котировку
- Проверьте сумму и повторите попытку
-
- Двусмысленный адрес.
- Пожалуйста, выберите тип выше.
- ]]>
-
- Введите или просканируйте адрес %1$s.
- Вы отправите XMR, а получатель получит %2$s с помощью серсива SideShift.ai.
- ]]>
-
- Введите или просканируйте адрес Monero.
- ]]>
-
- Подадреса
- Имя подадреса
- Слишком много неиспользуемых адресов - воспользуйтесь ими, чтобы создать больше!
- Слишком много неиспользуемых аккаунтов - воспользуйтесь ими, чтобы включить ещё!
- Транзакции данного подадреса:
- У данного подадреса нет транзакций
- Выбери подадрес
- Зажмите и удерживайте для подробностей
-
- Удалить кошелек
- Ошибка удаления!
-
- Импортировать кошелек
- Ошибка импорта!
-
- Сбросить кошелек
- Этот кошелек будет сброшен, потеряв всю локальную информацию (например: заметки, имена адресов, приватные ключи транзакций, …)! Используйте это ТОЛЬКО если кошелек поврежден и не загружается!
-
- Необходим Tor
- \u00A0ОЖИДАНИЕ УЗЛА\u00A0
- Необходимо выбрать "Allow Background Starts" в настройках Orbot для использования Tor!
- SideShift.ai не поддерживает Tor.\nОтключите Tor для обмена XMR.
-
- Шифрование фразы (ЭКСПЕРЕМЕНТАЛЬНО)
- Смещение фразы (необязательно)
-
- Настройки
- Интерфейс
- Информация
- Дневная / Ночная
-
- Стиль
-
- Классический
- Baldaŭ
-
-
- Не удалось создать QR!
-
diff --git a/app/src/main/res/values-sk/about.xml b/app/src/main/res/values-sk/about.xml
deleted file mode 100644
index ff6e9ed..0000000
--- a/app/src/main/res/values-sk/about.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
- Zatvoriť
- ja som monerujo
- Verzia %1$s (%2$d)
-
- Zásluhy
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo et al.
-
- monerujo.io
- ]]>
-
- Zásady ochrany osobných údajov
-
Na tejto stránke nájdete informácie o zásadách ochrany v súvislosti so zbieraním a spracovávaním osobných údajov,
- ktoré získame od užívateľov našej apky (monerujo: Monero Wallet).
-
-
Používaním tejto aplikácie súhlasíš so zbieraním a spracovávaním informácií v súlade s týmito pravidlami.
-
-
Zbierané Dáta
-
Osobné dáta sú také dáta, na základe ktorých by bolo možné identifikovať jedinca.
-
Monero kľúče a verejné adresy sú zbierané a spracovávané aplikáciou lokálne na účely
- spracovania a prenosu transakcie v Monero sieti.
-
Iné osobné data nie sú zbierané a spracovávané.
-
Pokiaľ používaš (voliteľnú) funkciu zmenárne, monerujo vyhľadá výmenný kurz cez verejné API portálu coinmarketcap.com.
- Pre viac detailov pozri zásady ochrany osobných údajov na https://coinmarketcap.com/privacy kde je uvedené aké dáta zbierajú
-
Pokiaľ používaš aplikáciu pre platby na BTC adresy, využívaš služby SideShift.ai.
- Pre viac detailov pozri zásady ochrany osobných údajov na https://sideshift.ai/ . Monerujo im posiela cieľovú BTC
- addresu príjemcu a posielané množstvo. Tvoju IP bude tiež možné zaznamenať.
-
Povolenia
-
-
INTERNET : Pripojiť do Monero siete cez vzdialený Monero uzol
-
READ_EXTERNAL_STORAGE : Čítať súbory peňaženky uložené v zariadení
-
WRITE_EXTERNAL_STORAGE : Zapisovať do súborov peňaženky uložených v zariadení
-
WAKE_LOCK : Udržať zariadenie prebudené počas synchronizácie
-
CAMERA : Snímať QR kódy na posielanie a obdržanie Monero
-
-
Zmeny v týchto zásadách
-
Je možné, že z času načas sa tieto zásady upravia, či doplnia, na čo budete včas upozornení aplikáciou
- a na našich webových stránkach (www.monerujo.io).
- Doporučujeme tieto zásady periodicky kontrolovať kôli prípadným zmenám.
-
tieto zásady ochrany údajov boli naposledy upravené: 10. November, 2017.
-
-
Kontaktuj Nás
-
Ak máš akékoľvek otázky ohľadom zásad ochrany osobných údajov, alebo ako sú data spracovávané,
- pošli email na privacy@monerujo.io.
-
- ]]>
-
diff --git a/app/src/main/res/values-sk/help.xml b/app/src/main/res/values-sk/help.xml
deleted file mode 100644
index 93c4672..0000000
--- a/app/src/main/res/values-sk/help.xml
+++ /dev/null
@@ -1,283 +0,0 @@
-
-
- Vytvoriť Peňaženku - Novú
-
Ak Ti treba novú Monero adresu!
-
Vlož unikátny názov a heslo peňaženky.
- Heslo je určené na zabezpečenie dát peňaženky v tomto zariadení.
- Používaj silné heslo - alebo ešte lepšie je použiť frázu.
-
Zapíš si mnemotechnický Seed!
-
Na nasledujúcej obrazovke uvidíš svoj 25-slovný \"Mnemotechnický Seed\".
- Sú to dáta potrebné na obnovenie peňaženky a získanie prístupu k Tvojim prostriedkom.
- Bezpečné uloženie a utajenie týchto dát je veľmi dôležité, keďže pomocou nich hocikto môže získať kontrolu nad vašimi XMR!
-
Ak stratíš heslo do peňaženky, ešte stále si môžeš obnoviť peňaženku so svojím mnemotechnickým Seedom.
-
Ak stratíš mnemotechnický Seed, neexistuje spôsob ako ho odvodiť a všetky Tvoje mince sú navždy stratené!
- Tento Seed sa nikdy nemôže zmeniť a v prípade, že je ukradnutý, alebo inak skompromitovaný, budeš musieť presunúť svoje mince do novej peňaženky (s novým mnemotechnickým Seedom).
- Preto je najlepšie ak si svoj Seed zálohuješ zapísaním na papier a uložíš na niekoľko bezpečných a utajených miest.
- ]]>
-
- Vytvoriť Peňaženku - Seed
-
Ak už máš Monero adresu a chceš obnoviť transakcie z blockchain!
-
Vlož unikátny názov a heslo peňaženky.
- Heslo je určené na zabezpečenie dát peňaženky v tomto zariadení.
- Používaj silné heslo - alebo ešte lepšie je použiť frázu.
-
Vlož svoj Seed do políčka \"Mnemotechnický Seed\".
-
Ak poznáš číslo bloku svojej prvej transakcie pre túto adresu, vlož ho do poľa \"Obnov Výšku\" - zanechaním prázdneho poľa budeš skenovať celú blockchain,
- aby si našiel transakcie prislúchajúce tejto adrese. To môže trvať veľmi dlho.
- ]]>
-
- Vytvoriť Peňaženku - Kľúče
-
Ak obnovuješ svoju peňaženku pomocou kľúčov!
-
Vlož unikátny názov a heslo peňaženky.
- Heslo je určené na zabezpečenie dát peňaženky v tomto zariadení.
- Používaj silné heslo - alebo ešte lepšie je použiť frázu.
-
Vlož svoju Monero adresu do poľa \"Verejná Adresa\" a vyplň \"Prezerací Kľúč\" and \"Platobný Kľúč\".
-
Ak poznáš číslo bloku svojej prvej transakcie pre túto adresu, vlož ho do poľa \"Obnov Výšku\" - zanechaním prázdneho poľa budeš skenovať celú blockchain,
- aby si našiel transakcie prislúchajúce tejto adrese. To môže trvať veľmi dlho.
-
Vlož sem číslo bloku prvej transakcie pre túto adresu do políčka \"Obnov Výšku\". Môžeš tiež použiť dátum vo formáte YYYY-MM-DD.
- Ak to nevieš naisto, vlož približný dátum/číslo bloku pred tým ako si prvýkrát použil danú adresu.
- ]]>
-
- Vytvoriť Peňaženku - Ledger
-
Obnovenie peňaženky zo zariadenia Ledger Nano S.
-
Tvoj tajný kľúč nikdy neunikne zo zariadenia Ledger, takže budeš musieť mať Ledger pripojený vždy, keď budeš chcieť pristupovať k svojej peňaženke.
-
Vlož unikátny názov a heslo peňaženky. Heslo je určené na zabezpečenie dát peňaženky na Android zariadení.
- Používaj silné heslo - alebo ešte lepšie je použiť frázu.
-
Do políčka \"Obnov Výšku\" vlož číslo bloku prvej transakcie pre túto adresu . Môžeš tiež použiť dátum vo formáte YYYY-MM-DD.
- Ak to nevieš presne, vlož približný dátum/číslo bloku pred tým ako si prvýkrát použil danú adresu. Urýchli to prehľadávanie blockchain.
- ]]>
-
- Vytvoriť Peňaženku - Prezeracia Peňaženka
-
Ak chceš iba sledovať prichádzajúce transakcie!
-
Vlož unikátny názov a heslo peňaženky. Heslo je určené na zabezpečenie dát peňaženky v tomto zariadení.
- Používaj silné heslo - alebo ešte lepšie je použiť frázu.
-
Vlož svoju Monero adresu do poľa \"Verejná Adresa\" a vyplň \"Prezerací Kľúč\".
-
Ak poznáš číslo bloku svojej prvej transakcie pre túto adresu, vlož ho do poľa \"Obnov Výšku\". Môžeš tiež použiť dátum vo formáte YYYY-MM-DD.
- Ak to nevieš naisto, vlož približný dátum/číslo bloku pred tým ako si prvýkrát použil danú adresu.
- Zanechaním prázdneho poľa budeš skenovať celú blockchain, aby si našiel transakcie prislúchajúce tejto adrese. To môže trvať veľmi dlho.
- ]]>
-
- Detaily Peňaženky
-
Verejná Adresa
- Vaša verejná adresa je niečo ako číslo bakového účtu, ktoré môžte zdieľať bez toho aby ste sa báli,
- že prídete o svoje Monero. Ľudia vám budú posielať Monero práve na túto adresu.
-
Mnemotechnický Seed
- Tieto dáta sú potrebné len na obnovu peňaženky a získanie plného prístupu k vašim prostriedkom.
- Bezpečné uloženie a utajenie týchto dát je veľmi dôležité, keďže pomocou nich hocikto môže získať kontrolu nad vašimi XMR!
- Ak to ešte nemáš zapísané a uložené niekde na bezpečnom mieste, urob tak čo najskôr!
-
Heslo pre súbory peňaženky
- Uisti sa, že si si heslo zapísal. Ak resetuješ zariadenie, alebo odinštaluješ appku, budeš ho potrebovať na prístup do peňaženky.
-
-
CrAzYpass
- Pokiaľ tu zobrazené heslo tvorí 52 alfanumerických znakov v skupinách po 4 - gratulujem!
- Tvoje súbory peňaženky sú zabezpečené 256-bit kľúčom vygenerovaným bezpečnostnými funkciami Tvojho zariadenia.
- Extrémne to zťažuje hacknutie týchto súborov!
- Táto funkcia je povinná pre všetky novo-vytvorené peňaženky.
-
Legacy Password
- Ak vidíš svoju prístupovú frázu na tomto mieste, Tvoja peňaženka nie je zabezpečená tak,
- ako by bola pri použití CrAzYpass. Napraviť to môžeš označením \"Zmeň Frázu\" v menu.
- Po vložení novej prístupovej frázy (aj pri tej istej ako predtým), aplikácia ti vygeneruje
- CrAzYpass a zabezpečí s ním súbory peňaženky. Zapísať!
-
CrAzYpass peňaženky
- Ak budeš potrebovať niekedy preinštalovať Monerujo (napríklad po resetovaní telefónu alebo pri výmene za iný),
- alebo ak chceš použiť súbory peňaženky na inom zariadení či PC, budeš musieť
- použiť toto heslo pre obnovu na opätovný prístup do svojej peňaženky.
- Označením \"Zmeň Frázu\ z menu, môžeš vybrať inú prístupovú frázu. Tu pozor, pretože to vygenereuje nové heslo pre obnovu.
- Zapísať!
-
Prezerací Kľúč
- Tvoj prezerací kľúč (view key) môžeš používať na sledovanie prichádzajúcich transakcií do peňaženky,
- zatiaľ čo míňať prostriedky tento prezerací kľúč neumožňuje.
-
Platobný Kľúč
- Platobný Kľúč (spend key) umožňuje míňať Monero prislúchajúce danej peňaženke,
- takže ho nikomu nepredrádzaj a uchovaj rovnako bezpečne ako svoj mnemotechnický seed.
- ]]>
-
- Zoznam Peňaženiek
-
Uzol
-
Monerujo používa vzdialené uzly na komunikáciu so sieťou Monero. Nie je tak potrebné sťahovať
- a ukladať celú blockchain ako takú. Zoznam populárnych uzlov spolu s návodmi ako ich rozbehať môžeš nájsť na
- https://moneroworld.com/
-
Monerujo prichádza s niekoľkými prednastavenými uzlami. Pamätá si posledných 5 použitých uzlov.
-
Peňaženky
-
Tu vidíš svoje peňaženky. Sú umiestnené v adresári monerujo na internom úložisku Tvojho zariadenia.
- Môžeš použiť súborový manažér telefónu na ich vyhľadanuie a zobrazenie.
- Mal by si robiť pravidelné zálohy týchto adresárov a umiestniť ich mimo zariadenie pre prípad straty, či poškodenia.
-
Označ Peňaženku alebo stlač \"+\" pre vytvorenie novej.
- Alebo označ jednu z možností:
-
Detaily
-
ukáže detaily peňaženky, seed & kľúče.
-
Prijať
-
Vytvorí QR kód na prijímanie Moneroj.
-
Premenuj
-
Premenuje peňaženku. Zálohy nie sú premenované.
-
Záloha
-
Vytvorí kópiu peňaženky v adresári backups vnútri monerujo
- prepísaním predchádzajúcich kópií.
-
Archivovať
-
Vytvorí zálohu s následným zmazaním peňaženky. Kópia zostáva v adresári backups
- Pokiaľ už nepotrebuješ zálohy, mal by si ich vymazať zo svojho telefónu pomocou súborového manažéra,
- alebo inej aplikácie na bezpečné mazanie.
-
- ]]>
-
- Detaily Transakcie
-
Destinácia
- Toto je verejná adresa peňaženky kde chceš poslať Monero.
-
ID Platby
- Môžeš použiť ID Platby na identifikáciu platby medzi dvoma stranami. Nie je to síce povinný, ale je to súkromný údaj.
- Tak napríklad s týmto môžeš zosúladiť svoj biznis s kúpenou položkou. Táto funkcia bude v Monero nahradená podadresami.
-
TX ID
- Toto je ID transakcie, ktoré slúži na identifikáciu transakcie v Monero blockchain exploreri, ako napr. https://xmrchain.net/
-
TX KĽÚČ (Transaction Key)
- Toto je Tvoj súkromný kľúč transakcie, uchovaj ho bezpečne a neposkytuj ho tretím stranám,
- aby nemohli identifikovať tvoj podpis v kruhovom podpise a spraviť tak transakciu verejnú a transparentnú.
-
Blok
- Blok do ktorého je zaradená vaša transakcia.
-
- ]]>
-
- Poslať
-
Adresa Príjemcu
-
Toto je verejná adresa peňaženky kam posielaš Monero. Môžeš ju kopírovať zo schránky, skenovať QR kód alebo vložiť manuálne.
- Trikrát sa uisti, že neposielaš mince na zlú adresu.
-
Okrem XMR adries, môžte použiť tiež
-
-
OpenAlias pre XMR či BTC
-
BTC adresu
-
- Nezabúdajte, že posielanie BTC prebieha cez službu SideShift.ai (detaily na https://sideshift.ai). Pozri sekciu nižšie o posielaní BTC
-
Posielanie BTC
-
SideShift.ai
-
SideShift.ai je služba tretej strany, ktorá umožňuje zámenu z Monero na Bitcoin.
- Používame SideShift.ai API na integráciu Bitcoin platieb do Monerujo. Prosím mrkni na
- https://sideshift.ai a rozhodni sa sám, či je to naozaj služba, ktorú chceš používať.
- Tím Monerujo nie je nijako spojený so službou SideShift.ai a teda nemôže pomôcť s prípadnými problémami s touto službou.
-
SideShift.ai Výmenný Kurz
-
Na obrazovke \"Množstvo\" uvidíš aktuálne parametre služby SideShift.ai, vrátane aktuálneho kurzu BTC, hornej a dolnej hranice.
- Podotýkame, že tento kurz nie je garantovaný.
-
SideShift.ai Objednávka
-
Na obrazovke \"Potvrdiť\", uvidíš aktuálnu objednávku v SideShift.ai. Táto objednávka je platná iba obmedzený čas - ako si môžeš všimnúť odpočítavanie na tlačítku \"Minúť\".
- Výmenný kurz sa môže líšiť od toho, ktorý bol na predošlých obrazovkách.
-
SideShift.ai Tajný Kľúč
-
Keďže Monerujo dbá len na tú časť transakcie, ktorá pracuje s Monero,
- tento SideShift.ai Tajný Kľúč sa môže využívať na sledovanie Bitcoinovej časti transakcie a objednávky
- na domovskej stránke SideShift.ai
-
SideShift.ai Odpočítavanie!
-
Akonáhle odpočítavanie dosiahne nulu, budeš potrebovať nový kľúč z SideShift.ai návratom na predchádzajúci krok a obrazovku \"Potvrdiť\" .
- ]]>
-
- Posielanie BTC
-
SideShift.ai
-
SideShift.ai je služba tretej strany, ktorá umožňuje zámenu z Monero na Bitcoin.
- Používame SideShift.ai API na integráciu Bitcoin platieb do Monerujo. Prosím mrkni na
- https://sideshift.ai a rozhodni sa sám, či je to naozaj služba, ktorú chceš používať.
- Tím Monerujo nie je nijako spojený so službou SideShift.ai a teda nemôže pomôcť s prípadnými problémami s touto službou.
-
SideShift.ai Výmenný Kurz
-
Na obrazovke \"Množstvo\" uvidíš aktuálne parametre služby SideShift.ai, vrátane aktuálneho kurzu BTC, hornej a dolnej hranice.
- Podotýkame, že tento kurz nie je garantovaný.
-
SideShift.ai Objednávka
-
Na obrazovke \"Potvrdiť\", uvidíš aktuálnu objednávku v SideShift.ai. Táto objednávka je platná iba obmedzený čas - ako si môžeš všimnúť odpočítavanie na tlačítku \"Minúť\".
- Výmenný kurz sa môže líšiť od toho, ktorý bol na predošlých obrazovkách.
-
SideShift.ai Tajný Kľúč
-
Keďže Monerujo dbá len na tú časť transakcie, ktorá pracuje s Monero,
- tento SideShift.ai Tajný Kľúč sa môže využívať na sledovanie Bitcoinovej časti transakcie a objednávky
- na domovskej stránke SideShift.ai
-
SideShift.ai Odpočítavanie!
-
Akonáhle odpočítavanie dosiahne nulu, budeš potrebovať nový kľúč z SideShift.ai návratom na predchádzajúci krok a obrazovku \"Potvrdiť\" .
- ]]>
-
- Peňaženka
-
-
Mód Ulica
-
Mód Ulica sa povoľuje a vypína v menu, alebo klepnutím na ikonu Guntherovej hlavy. V tomto móde sa váš zostatok nezobrazuje na žiadnej obrazovke,
- takže svoju peňaženku môžte smelo používať na ulici, v krčme, či na inom verejnom mieste. Po nastavení sú skryté aj predchádzajúce transakcie, zatiaľ čo nové budú zobrazené,
- aby ste mohli vidieť či vám odoslalo a dorazilo všetko správne.
-
-
Skenovanie
- Keďže Monero obľubuje súkromie, zakaždým pri otváraní Monerujo musíme skenovať blockchain aby sme videli, či nedorazili nové Monerá.
- Monerujo uchováva len tie informácie, ktoré prislúchajú vašej peňaženke. Pokiaľ nemáte sychronizovanú peňaženku dlhší čas, synchronizácia môže trvať dlho.
-
Zostatok
-
Pomóc! Zostatok v mojej peňaženke zmizol, alebo je nepotvrdený!
- Nestresuj! Keď odosielaš prostriedky zo svojej peňaženky, časť zostatku sa dočasne ukáže ako nepotvrdená.
-
- Súvisí to s tým, ako je Monero navrhnuté a ako funguje zmena v blockchain.
-
- Viac o zmenách sa dočítaš (anglicky) na https://getmonero.org/resources/moneropedia/change.html
-
Zoznam Transakcií
-
Zoznam transakcií v peňaženke. V prípade prezeracej peňaženky budú zobrazené iba prichádzajúce transakcie.
- ]]>
-
- Uzly
-
TL;DR
-
Aktuálny zoznam uzlov získaš tak, že potiahneš a pridáš do záložiek 5 uzlov, z ktorých si Monerujo jeden vyberie.
-
Čo je Uzol?
-
Monerujo používa vzdialený uzol (Remote Node, niekedy nazývaný aj Daemon) a peňaženka tak môže komunikovať so sieťou Monero bez toho, aby bolo potrebné sťahovať celú blockchain.
-
Zoznam Uzlov
-
Ak je zoznam prázdny, môžeš zadať adresu uzla manuálne, alebo môžeš nechať Monerujo preskúmať celú sieť. Prípadne oboje. Čítaj ďalej…
-
Zoznam uzlov zobrazuje všetky momentálne známe uzly. Pod každým uzlom je zobrazená časová pečiatka jeho posledného bloku.
- Vedľa je ikonka nodu, ktorá indikuje úroveň pripojenia.
-
Ktorýkoľvek uzol v zozname si môžte pridať do záložiek pre budúce použitie. Uzly, ktoré nebudú uložené, sa z pamäte vymažú.
-
Monerujo vyberie jeden z uložených uzlov pri každom použití. Skontroluje výšku bloku (blockheight) týchto uzlov a zistí, ktorý uzol je ako aktualizovaný, ako dlho trvá odpoveď a podľa toho vyberie pre vás optimálny uzol.
-
Podľa týchto charakteristík je dané aj zoradenie v zozname. Prvý uzol bude ten, ktorý Monerujo vybral práve teraz. Naspodku bude veľmi pomalý uzol s pomalou odozvou, alebo nedostupné uzly.
-
Pridať Uzol
-
Dotykom na tlačítko "Pridať Uzol" vložíte detaily vlastného uzla.
- "Adresa" je hostname alebo IP-adresa uzla. Je to jediné povinné pole.
- "Port" ak uzol používa iný ako predvolený port (napr. 18089).
- Môžte si aj pomenovať svoje uzly pre budúce použitie. Je to voliteľné.
- Niektoré uzly vyžadujú na používanie aj prihlasovacie údaje. V tom prípade napíšte užívateľské meno a heslo do príslušných polí.
- To by malo stačiť na testovanie týchto nastavení. "Test"
- "Výsledky Testu" zobrazia výšku, čas odozvy a aktuálnu IP adresu uzla.
- Vo výsledku môže byť tiež chyba - zvyčajne preto, že uzol nie je dostupný, neodpovedá v požadovanom čase, alebo prihlasovacie údaje nie sú správne.
- Prípadne kombinácia zadanej adresy a portu neprislúcha žiadnemu uzlu Monero siete!
- Akonáhle test skončí úspešne (žiadna chyba sa neobjaví) - klepni na "OK" a ulož si daný uzol.
-
Vyhľadať Uzol
-
Táto funkcia umožní vyhľadať uzol skenovaním Monero siete. Monerujo začne skenovať sieť a vyhľadávať vzdialené uzly na porte 18089.
- Začína tým, že sa opýta uzlov vo vašich záložkách na ďalšie uzly v P2P sieti Monero, ktoré sú s nimi spojené, tých sa opýta zas na ďalšie uzly atď.
- V prípade, že nemáte žiadne uzly vo svojich záložkách, Monerujo bude skúšať uzly (seed nodes) natvrdo zapísané v kóde Monero. Vyhľadávanie končí ak Monerujo nájde aspoň 10 vzdialených uzlov.
- ]]>
-
- Používanie platobného linku
-
Monerujo je spustené z platobného linku. Ak chceš posielať prostriedky, postupuj nasledovne:
-
- 1. Otvor peňaženku z ktorej chceš platiť
- 2. Počkaj kým sa peňaženka zosynchronizuje a zobrazí sa tlačítko "Poslať"
- 3. Stlač tlačidlo "Poslať"
-
-
Detaily platby budú vložené automaticky. Skontroluj ich a pokračuj ako obvykle pri ostatných transakciách.
- ]]>
-
- Rozumiem!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
deleted file mode 100644
index 8040eed..0000000
--- a/app/src/main/res/values-sk/strings.xml
+++ /dev/null
@@ -1,453 +0,0 @@
-
-
- Peňaženka
-
- O aplikácii
- Zásady ochrany osobných údajov
-
- Zdieľaj
- Pomoc
- Prijať
- Premenovať
- Záloha
- Zmena Hesla
-
- Pokračuj v písaní …
- Haha …
- Poď, dokážeš viac!
- Si tam …
- Yeah baby, h4x0r style!
-
- Peňaženky
- Zásluhy
- OK
- Zrušiť
- Zatvoriť
- Viac info
-
- úspešne odoslané
- Hotovo
-
- Klepni pre QR kód
-
- BTC platby aktivované, klepni pre viac info.
- Ledger aktivovaný, klepni pre viac info.
-
- Vložil si %1$s adresu.
- Pošleš XMR a adresát dostane %1$s cez službu SideShift.ai.
- ]]>
-
- SideShift.ai Objednávka
-
- %1$s %2$s
-
-
- Čaká na Potvrdenie
- Čakajúca Platba
- SideShift.ai Chyba (%1$s)
- %1$s Odoslané!
- Zisťujem …
-
- Môžeš poslať %1$s — %2$s %4$s.
- SideShift.ai ti dáva výmenný kurz of %3$s %4$s/XMRpráve teraz.
- ]]>
-
- Zostatok: %2$s %3$s (%1$s XMR)
-
- ✔ Payment ID integrované
- Pripravujem transakciu
-
- Vytváram objednávku na SideShift.ai
- Pýtam sa na objednávku SideShift.ai
- Pripravujem Monero transakciu
-
- Posielam SideShift.ai parametre
-
- CHYBA SideShift.ai
- Kód chyby: %1$d
-
- Klepni pre opakovanie
- Uviazli sme tu!
- Myslím, že služba SideShift.ai nie je momentálne dostupná!
-
- %1$s %3$s = %2$s XMR
- (Kurz: %1$s %2$s/XMR)
-
- Navštív SideShift.ai pre podporu & tracking
- Tajný kľúč\nSideShift.ai
- SideShift.ai Tajný kľúč
- Cieľová %1$s Adresa
- Čiastka
-
- ID Transakcie
- Cieľová Addresa
- Poznámky
-
- Prebieha Záloha
- Prebieha Archivácia
- Prebieha Premenovanie
- Prebieha zmena hesla
-
- Balím si veci …\nMôže to chvíľu trvať!
-
- Zálohovanie zlyhalo!
- Premenovanie zlyhalo!
- Zmena hesla zlyhala!
- Heslo zmenené
-
- Uzol
- Načítavam peňaženku …
- Peňaženka uložená
- Uloženie zlyhalo!
- pripájam sa …
- Spojenie s uzlom zlyhalo!\nSkontroluj užívateľa/heslo
- Neplatný uzol!\nSkús iný.
- Neviem sa spojiť s uzlom!\nSkús znova, alebo skús iný uzol.
-
- Odpojený
-
- Transakcia zlyhala: %1$s
-
- Čakal si príliš dlho kámo!
-
- Stále ma vyťažuje posledná peňaženka …
-
- Premenuj %1$s
-
- Nové heslo pre %1$s
- Opakuj heslo pre %1$s
- Heslo pre %1$s
- Môžeš tiež otvoriť peňaženku pomocou odtlačku prsta.\nDotkni sa senzora.
- Otváram peňaženku…
- Odtlačok som nerozoznal. Skús znova.
- Nesprávne heslo!
- Uložené heslo je nesprávne.\nProsím vlož heslo manuálne.
- Peňaženka neexistuje!
- Adresa uzla musí byť nastavená!
- Peňaženka sa nezhoduje s vybranou sieťou
-
- (Len k nahliadaniu)
-
- Prijať
- Poslať
-
- + %1$s XMR nepotvrdených
-
- monerujo Service
-
- Synchronizované:
- zostávajúcich blokov
- Skenovanie:
-
- Úložisko nie je zapisovateľné! Panika!
- Fakt potrebujem oprávnenia na externé úložisko!
- Bez kamery = žiaden QR kód!
-
- Prezerací Kľúč
- Verejná Adresa
- Kľúč
- Prezerací Kľúč skopírovaný do schránky!
- Kľúč skopírovaný do schránky!
- Adresa peňaženky skopírovaná do schránky!
- ID Transakcie skopírované do schránky!
- Kopírovanie vypnuté z bezpečnostných dôvodov!
-
- Neviem získať výmenný kurz!\nSkús XMR/XMR alebo vyskúšaj neskôr
-
- Vytvor Peňaženku
- Názov Peňaženky
- Heslo Peňaženky
- Povoľ otváranie peňaženky odtlačkom prsta
- Overenie odtlačkom prsta
-
Pomocou overenia odtlačkom prsta, môžeš vidieť zostatok a prijímať prostriedky, bez zadávania hesla.
-
Avšak kvôli zvýšeniu bezpečnosti, monerujo bude stále vyžadovať heslo na zobrazenie detailov peňaženky a posielanie.
- Bezpečnostné Varovanie
-
Monerujo Ti chce pripomenúť, že ktokoľvek kto získa prístup k Tvojim odtlačkom, bude schopný nazrieť do tvojej peňaženky.
-
Napríklad záškodník niekde v blízkosti môže otvoriť Tvoju peňaženku keď spíš.
- Si si istý, že chceš povoliť túto funkciu?
- ]]>
- Heslá nie sú rovnaké
- Heslo nesmie byť prázdne
- Sprav mi už peňaženku!
- Zapísal som si mnemotechnický seed
-
- Daj mi meno!
- Peňaženka existuje!
- Neslobodno začať s .
- Vytváranie peňaženky
- Peňaženka vytvorená
-
- Vlož číslo alebo dátum (YYYY-MM-DD)
-
- Kľúče
- Nová
- Seed
- Prezeracia
-
- Verejná Adresa
- Prezerací Kľúč (view key)
- Platobný Kľúč (spend key)
- 25-slovný mnemotechnický Seed
- Dátum (YYYY-MM-DD) alebo Výška
-
- Verejná Adresa
- Prezerací Kľúč (view key)
- Platobný Kľúč (spend key)
- Mnemotechnický Seed
- heslo súboru peňaženky
-
- Vlož platný Kľúč
- Vlož platnú Adresu
- Vlož svoj 25-slovný seed
-
- Súkromné Poznámky (voliteľné)
- Generuj
- Odošli Monero
- Odošli Monero (%1$s)
- Neplatný QR Kód
- Neplatný QR Kód Platby
- Neplatná Adresa
- Poslať
- Zostatok: %1$s XMR
- Adresa
- Čiastka
- Potvrdiť
- Hotovo
-
- Čiastka
- poplatok (XMR)
- poplatok
- Total (XMR)
- Total
-
- %1$s XMR
- +%1$s poplatok
-
- Vytvor Chybu Transakcie
-
- poplatok %1$s
- (%1$s)
- zlyhala
- - %1$s
- + %1$s
-
- časová pečiatka
- TX ID
- Kľúč Transakcie
- Cieľ
- ID Platby
- Blok
- Suma
- poplatok
- Poslaných
- Poznámky
- (voliteľné)
- Detaily Transakcie
-
- ČAKAJÚCI
- ZLYHAL
-
- Suma
- Nemohol som otvoriť peňaženku!
-
- Max. %1$s
- Min. 0
- XMR nie číslo
-
- Budú zobrazené citlivé dáta.\nPozri cez plece!
- Som v bezpečí
- Naspäť!
- Detaily
-
- Táto peňaženka bude zmazaná. Vaše finančné prostriedky budú navždy preč, pokiaľ nemáte svoj seed alebo funkčnú zálohu na ich obnovenie.
- Áno, poďme na to!
- Nie, díky!
-
- Vytvor novú peňaženku
- Obnoviť prezeraciu peňaženku
- Obnoviť peňaženku zo súkromných kľúčov
- Obnoviť peňaženku z 25-slovného seedu
-
- Vytvor Účet
- Pridaný nový účet #%1$d
- Účet #
-
- Pošli všetky potvrdené prostriedky na tomto účte!
- Subadresa
- Verejná Subadresa #%1$d: %2$s
-
- Jazyk
- Použi jazyk systému
-
- Obnoviť z Ledger Nano
-
- Komunikácia s Ledger
- Vyžaduje potvrdenie na Ledgeri!
- Načítavam subadresy
- Overovanie kľúčov
- Robím ťažké výpočty
- Hešujem materiál
- (znovu) zapoj Ledger
-
- Vytváram účet
-
- %1$s pripojený
- %1$s odpojený
-
- Zapisujem Tag
- Zapísanie Tagu zlyhalo!
- Zapísanie Tagu úspešné
- Tag nepodporuje NDEF!
- Tag poskytol %1$d bytes, ale treba %2$d!
- Neruzumiem Tagu!
- Neviem čo tým básnik myslel!
- NFC je dostupné!
-
- Popis (voliteľné)
-
- OpenAlias adresa nie je dostupná
- OpenAlias zabezpečený ✔
- Prekladám OpenAlias…
- OpenAlias bez DNSSEC - adresa môže byť zneužitá
-
- Nekompatibilný s verziou uzla - nutná aktualizácia!
-
- Ukázať Tajné Kľúče
-
- Mód Ulica
- Node-o-matiC povolený, klepni pre viac info.
- Posledný blok aktualizovaný: %1$s
- Uzly
- Názov Uzla (voliteľné)
- Adresa (Hostname)
- Port
- Užívateľ (voliteľné)
- Heslo (voliteľné)
- Nemôžem preložiť názov hosta
- Toto treba určite!
- Musí byť číslo
- Musí byť 1–65535
- Pridať Uzol
- Obnoviť!
- CHYBA SPOJENIA %1$d
- CHYBA SPOJENIA
- Overenie prihlásením zlyhalo
- Výsledok testu:
- Výška: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- Testujem IP: %1$s …
- Prosím počkajte, kým sa skenovanie nedokončí
- Vyber alebo pridaj uzly
- Pridaj uzly manuálne alebo potiahni prstom dole a skenuj sieť
- Prehľadávam sieť…
- Automaticky ukladám %1$d najlepších uzlov
- Test
-
- úspešne zálohované
-
-
- Príjemca
-
- VŠETKO!
-
- Konvertuj Ledger Seed
- Ledger Seed
- Ledger fráza (voliteľné)
- Neplatný Ledger Seed!
- Vloženie Ledger Seedu sem je vážne bezpečnostné riziko!
-
- Výška
-
- Start Monero App on %1$s
-
- Rescan!
-
- I get it!
- Next
- I\'m ready!
-
- Welcome to Monerujo!
- This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.
- Keep your seed safe
- The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.
- Send Crypto
- Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.
- Nodes, your way
- Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.
- Send with fingerprint
- You\'re now able to send XMR with just your fingerprint if you enabled it. To request the password, just disable fingerprint access.
-
- Dark Mode
-
- Auto
- Day
- Night
-
- There is nothing here\nPlease create or restore a wallet
-
- Restore default nodes
- Restoring already in progress…
-
- Last Block: %1$d seconds ago
- Last Block: %1$d minutes ago
- Last Block: %1$d hours ago
- Last Block: %1$d days ago
-
- Cannot get quote
- Check amount and try again
-
- Ambiguous address.
- Please select the type above.
- ]]>
-
- Please enter or scan a %1$s address.
- You'll send XMR and the receiver will get %2$s using the SideShift.ai service.
- ]]>
-
- Please enter or scan a Monero address.
- ]]>
-
- Subaddresses
- Subaddress Name
- Too many unused addresses - use some to enable creating more!
- Too many unused accounts - use some to enable creating more!
- Transactions for this subaddress:
- No transactions for this subaddress yet
- Select a subaddress
- Long-press for details
-
- Delete
- Delete failed!
-
- Import wallet
- Import failed!
-
- Reset wallet!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-sr/about.xml b/app/src/main/res/values-sr/about.xml
deleted file mode 100644
index 4699251..0000000
--- a/app/src/main/res/values-sr/about.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
- Close
- I am monerujo
- Version %1$s (%2$d)
-
- Credits
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo, ErCiccione et al.
-
This page informs you of our policies regarding the collection,
- use and disclosure of personal information we receive from users of our
- app (monerujo: Monero Wallet).
-
-
By using the app, you agree to the collection and use of information in
- accordance with this policy.
-
-
Data Collected
-
Personal data is any kind of data that could identify an individual.
-
-
Monero keys and public addresses are collected and processed by the app locally
- for the purpose of processing transactions and transmitted into the Monero Network
- in encrypted form.
-
-
Other personal data is not collected by the app.
-
If you use the exchange (optional) functionality, monerujo fetches the exchange
- rate through the public API of coinmarketcap.com.
- See their privacy policy at https://coinmarketcap.com/privacy for
- details on how data in your requests is collected.
-
If you use the app to pay to BTC addresses, you will be using the SideShift.ai service.
- See their privacy policy at https://sideshift.ai/ for details. Monerujo send them the BTC
- destination address and amount. Your IP will also be collectable.
-
App Permissions
-
-
INTERNET : Connect to the Monero Network via a Monero Daemon Node
-
READ_EXTERNAL_STORAGE : Read wallet files stored on the device
-
WRITE_EXTERNAL_STORAGE : Write wallet files stored on the device
-
WAKE_LOCK : Keep device awake while syncing
-
CAMERA : Scan QR Codes for receiving Monero
-
-
Changes to this Privacy Policy
-
We may update this privacy policy from time to time. We will notify
- you of any changes by posting the new privacy policy in the app and on the
- website (www.monerujo.io)
- You are advised to review this privacy policy periodically for any changes.
-
This Privacy Policy was last updated: 10th November, 2017.
-
-
Contact Us
-
If you have any questions about our privacy policy,
- or how your data is being collected and processed,
- please e-mail privacy@monerujo.io.
-
Enter a unique wallet name and password.
- The password is used for securing your wallet data on the device. Use a strong password -
- even better use a passphrase.
-
Note your Mnemonic Seed!
-
On the following screen you will find your 25-word \"Mnemonic Seed\".
- This is the only data needed to recover your wallet at a later point
- and gain full access to your funds.
- Keeping this secure and private is very important, as it gives anyone
- full access to your funds!
-
If you lose your wallet password, you can still recover your wallet with the Mnemonic Seed.
-
There is no way to recover your Mnemonic Seed, if you lose it all your funds will be lost!
- The Mnemonic Seed can also never be changed, and if it is stolen or otherwise compromised,
- you will have to move your funds to new wallet (with a new Mnemonic Seed). Therefore, it is best
- that you backup your Mnemonic Seed by writing it down and storing it in multiple safe
- and secure places.
- ]]>
-
- Create Wallet - Seed
-
If you already have a Monero Address and want to recover the transactions from the blockchain!
-
Enter a unique wallet name and password. The password is used for securing your wallet data on the device.
- Use a strong password - even better use a passphrase.
-
Enter your Seed in the field \"Mnemonic Seed\".
-
Enter the block number of the first transaction used for this address in the
- field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
- enter an approximate date/blockheight before you first used this wallet address.
- ]]>
-
- Create Wallet - Ledger
-
You want to recover your wallet from your Ledger Nano S device.
-
Your secret keys never leave the Ledger device, so you need it plugged in every
- time you want to access your wallet.
-
Enter a unique wallet name and password. The password is used for securing your wallet data on the Android
- device. Use a strong password - even better use a passphrase.
-
Enter the block number of the first transaction used for this address in the
- field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
- enter an approximate date/blockheight before you first used this wallet address.
- ]]>
-
- Create Wallet - Keys
-
If you are recovering your wallet using your keys!
-
Enter a unique wallet name and password. The password is used for securing your wallet data on the device.
- Use a strong password - even better use a passphrase.
-
Enter your Monero Address in the field \"Public Address\" and fill out \"View Key\" and \"Spend Key\".
-
Enter the block number of the first transaction used for this address in the
- field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
- enter an approximate date/blockheight before you first used this wallet address.
- ]]>
-
- Create Wallet - View
-
If you just want to monitor incoming transactions to a wallet!
-
Enter a unique wallet name and password. The password is used for securing your wallet data on the device.
- Use a strong password - even better use a passphrase.
-
Enter your Monero Address in the field \"Public Address\" and fill out the \"View Key\".
-
Enter the block number of the first transaction used for this address in the
- field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
- enter an approximate date/blockheight before you first used this wallet address.
- ]]>
-
- Wallet Details
-
Public address
- Your public address is like your bank account number you can share this with anyone without
- having to fear losing your Monero. People will send Monero to your wallet using this address.
-
Mnemonic Seed
- This is the only data needed to recover your wallet at a later point and gain full access to
- your funds. Keeping this private and secure is very important, as it gives anyone full
- access to your Monero! If you haven’t written this down somewhere safe please do!
-
Wallet Files Recovery Password
- Make sure you write this password down. If you reset your device or uninstall the app, you
- will need it to access your wallet again.
-
CrAzYpass
- If the password displayed here is 52 alphanumeric characters in groups of 4 - congratulations!
- Your wallet files are secured with a 256-bit key generated by your device's security
- features based on the passphrase you chose (on creation or by changing it). This makes it
- extremely difficult to hack!
- This feature is mandatory for all newly created wallets.
-
Legacy Password
- If you see your passphrase here, your wallet files are not as secure as when using
- a CrAzYpass. To fix this, simply select \"Change Passphrase\" from the menu. After entering
- a new passphrase (maybe even the same one as before) the app will generate a CrAzYpass for
- you and secure your wallet files with it. Write it down!
-
CrAzYpass wallets
- If you ever need to reinstall Monerujo (for example after resetting your phone or switching
- to a new one) or you want to use your wallet files on a different device or PC, you have to
- use this Recovery Password in order to access your wallet again.
- By selecting \"Change Passphrase\" from the menu, you can choose another passphrase. Beware
- that this will generate a new Recovery Password. Write it down!
-
View key
- Your view key can be used to monitor incoming transactions to your wallet without giving
- permission to spend the funds inside your wallet.
-
Spend key
- Your spend key allows anyone to spend the Monero associated with your wallet, so don’t tell
- anyone this key, keep it safe like your Mnemonic Seed.
- ]]>
-
- Wallet List
-
Node
-
Monerujo uses a Remote Node to communicate with the Monero Network without having
- to download and store a copy of the whole blockchain itself. You can find a list of popular
- remote nodes or learn how to run your own remote node here https://moneroworld.com/
-
Monerujo comes with some Remote Nodes preset. It remembers the last five nodes used.
-
Wallets
-
Here you see your wallets. They are located in the monerujo folder
- in the internal storage of your device. You can use a file explorer app to see them.
- You should make backups of this folder on a regular basis to off-device storage in
- case your device explodes or gets stolen.
-
Select a wallet to open it or press the \"+\" to create a new one.
- Or select one of the wallet operations:
-
Details
-
Show the wallet details, seed & keys.
-
Receive
-
Make a QR code for receiving Moneroj.
-
Rename
-
Rename the wallet. Backups are not renamed.
-
Backup
-
Make a copy of the wallet in the backups folder inside the monerujo
- overwriting previous copies there.
-
Archive
-
Make a backup and delete the wallet afterwards. The copy remains in the backups
- folder. If you no longer need your backups you should delete them with a file explorer or
- secure delete app.
- ]]>
-
- Transaction Details
-
Destination
- This is the public address of the wallet you sent Monero to
-
PaymentID
- You can use a Payment ID to identify the reason you sent Monero between two parties this is
- fully optional and private. For example it can allow a Business to reconcile your transaction
- with an item you bought.
-
TX ID
- This is your Transaction ID you can use it to identify your obfuscated transaction on a Monero
- Blockchain explorer like https://xmrchain.net/
-
TX KEY (Transaction Key)
- This is your transaction private key, keep this safe as revealing this to a third party
- reveals which signature in a ring is yours, thereby making your transaction transparent.
-
Block
- This was the block your transaction was included in.
- ]]>
-
- Send
-
Receiver’s address
-
This is the public address of the wallet you are sending Moneroj to, you can copy this from
- your clipboard, scan a QR code or enter it manually. Make sure you triple check this to
- ensure you aren’t sending coins to the wrong address.
-
In addition to using an XMR address, you can also use
-
-
an OpenAlias for XMR or BTC
-
a BTC address
-
- Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai
- for details). See the section on sending BTC below.
-
Sending BTC
-
SideShift.ai
-
SideShift.ai is a third party service which acts as an exchange from Monero to Bitcoin.
- We use the SideShift.ai API to integrate Bitcoin payments into Monerujo. Please check out
- https://sideshift.ai and decide for yourself if this is something you want to use. The Monerujo
- Team is not associated with SideShift.ai and cannot help you with their service.
-
SideShift.ai Exchange Rate
-
On the \"Amount\" screen you will be shown the current parameters of the SideShift.ai service. These
- include the current exchange rate as well as upper and lower BTC limits. Note that this
- rate is not guaranteed at this point.
-
SideShift.ai Order
-
On the \"Confirm\" screen, you will see the actual SideShift.ai order. This order is valid for
- a limited time - you may notice a countdown on the \"Spend\" button. The exchange rate may
- be different to the indicative one shown on previous screens.
-
SideShift.ai Secret Key
-
Since Monerujo only handles the Monero part of your transaction your SideShift.ai secret key
- can be used to track the Bitcoin part of your order on the SideShift.ai homepage.
-
SideShift.ai Countdown!
-
Once the countdown reaches zero, you need to get a new quote from SideShift.ai by going back to the
- previous step and then coming back to the \"Confirm\" screen.
- ]]>
-
- Sending BTC
-
SideShift.ai
-
SideShift.ai is a third party service which acts as an exchange from Monero to Bitcoin.
- We use the SideShift.ai API to integrate Bitcoin payments into Monerujo. Please check out
- https://sideshift.ai and decide for yourself if this is something you want to use. The Monerujo
- Team is not associated with SideShift.ai and cannot help you with their service.
-
SideShift.ai Exchange Rate
-
On the \"Amount\" screen you will be shown the current parameters of the SideShift.ai service. These
- include the current exchange rate as well as upper and lower BTC limits. Note that this
- rate is not guaranteed at this point.
-
SideShift.ai Order
-
On the \"Confirm\" screen, you will see the actual SideShift.ai order. This order is valid for
- a limited time - you may notice a countdown on the \"Spend\" button. The exchange rate may
- be different to the indicative one shown on previous screens.
-
SideShift.ai Secret Key
-
Since Monerujo only handles the Monero part of your transaction your SideShift.ai secret key
- can be used to track the Bitcoin part of your order on the SideShift.ai homepage.
-
SideShift.ai Countdown!
-
Once the countdown reaches zero, you need to get a new quote from SideShift.ai by going back to the
- previous step and then coming back to the \"Confirm\" screen.
- ]]>
-
- The Wallet
-
Street Mode
-
Street mode can be enabled/disabled in the menu or Gunther\'s head icon. In this mode, your
- balance is not shown on any screen so you can safely use your wallet on the street, a pub or
- other public place. Previous transactions are also hidden. New transactions will be shown, so
- you can see that you have sent/received sweet Moneroj!
-
Scanning
- Because Monero likes to keep things private, every time you open a Monerujo wallet we have to
- scan the blockchain to see if any new Moneroj have been sent to your wallet, this only
- stores information to your phone which belongs to your wallet. Sometimes it can take a while
- because you haven’t synced in a long time.
-
The Balance
-
Help! My wallet balance has disappeared or is unconfirmed!
- Don’t panic! When you send funds from your wallet, some of your balance will temporarily show
- as unconfirmed.
- This happens as a result of how Monero is exchanged on the blockchain and how change works.
- Read more about change at https://getmonero.org/resources/moneropedia/change.html
-
Transaction List
-
A list of the wallet transactions. In view wallets, only incoming transactions are shown.
- ]]>
-
- Nodes
-
TL;DR
-
Refresh the nodes list by pulling down & bookmark 3–5 nodes to allow Monerujo
- to choose the best one for you!
-
What's a Node?
-
Monerujo uses a Remote Node (sometimes also called Daemon) to communicate with
- the Monero Network without having to download and store a copy of the
- whole blockchain itself.
-
Node List
-
If the list is empty, you can either add new nodes manually or let Monerujo
- scan the network for you. Or both. Read on…
-
The node list shows all currently known nodes. Additionally, the timestamp
- of the latest block known to each node is shown under the node name. An icon
- representing the node's response behaviour
- (which indicates the level of connectivity to be expected)
- is shown next to each node.
-
Any node in the list can be bookmarked for later use.
- Nodes which are not bookmarked will be forgotten.
-
Monerujo will choose the optimal bookmarked node each time you use it.
- It does this by checking the blockheight (how up-to-date
- is the node?) as well as the response behaviour (how fast does the node respond to requests?).
-
The list is sorted by these characteristics, so the top node would be the one Monerujo
- would choose right now. The bottom of the list would show very slow or unavailable nodes.
-
Add a Node
-
By touching the "Add Node" button at the bottom, you will be asked to
- enter the node details in the following dialog.
- The "Address" is the hostname or IP-address of the node - this is the only
- mandatory entry.
- Enter the "Port" if the node runs on a non-default port (e.g. 18089).
- You can also optionally name the node, so you can identify it easier later on.
- Some nodes require credentials to use them. Enter the provided username &
- password in the appropriate fields. Now you can "Test" these setting.
- The "Test Results" will display the blockheight, response time and actual IP used.
- The result may also be an error - usually because the hostname provided is
- not reachable in a sensible amount of time or the credentials are incorrect.
- Or the hostname/port combination does not point to an actual Monero Node!
- Once the test passes (no error) - you're set to press "OK" to save &
- bookmark this node.
-
Scan for Nodes
-
Additionally, you can scan the network for nodes. Monerujo will start
- scanning the network for Remote Nodes on port 18089. It begins by asking your
- bookmarked nodes for other peers in the Monero P2P network and then continues
- by asking those for their peers, and so on. If you have no bookmarked nodes
- (or they don't tell us about their peers),
- Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
- scan stops when it finds 10 remote nodes in total.
- ]]>
-
- Using a payment link
-
You have started monerujo with a payment link. In order to send funds, please do the following:
-
- 1. Open the wallet you want to spend from
- 2. Wait until the wallet is synced & the "Give" button appears
- 3. Touch the "Give" button
-
-
The payment details will be filled in. Check them and proceed like for any other transaction.
- ]]>
-
- Got it!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
deleted file mode 100644
index 63149e0..0000000
--- a/app/src/main/res/values-sr/strings.xml
+++ /dev/null
@@ -1,451 +0,0 @@
-
-
- Novčanik
-
- O nama
- Pravila privatnosti
-
- Podeli
- Pomoć
- Primi
- Preimenuj
- Bekap
- Promeni lozinku
-
- Nastavi s\'kucanjem …
- Dosadno …
- Daj, možeš bolje!
- Uskoro stižemo …
- To bre, h4x0r stil!
-
- Novčanici
- Krediti
- OK
- Otkaži
- Zatvori
- Detaljne informacije
-
- Uspešno poslato
- Gotovo
-
- Takni za QR kod
-
- Omogućeno BTC plaćanje, tapni za više info.
- Knjiga računa omogućena, tapni za više info.
-
- Ubacio/la si %1$s adresu.
- You'će poslati XMR a primalac će dobiti %1$s koristeći SideShift.ai servis.
- ]]>
-
- SideShift.ai Nalog
-
- %1$s %2$s
-
- Potvrda u toku
- Plaćanje u toku
- SideShift.ai Greška (%1$s)
- %1$s Poslato!
- Ispitivanje …
-
- Možeš poslati %1$s — %2$s %4$s.
- SideShift.ai daje ti devizni kurs od %3$s %4$s/XMRtrenutno.
- ]]>
-
- Stanje: %2$s %3$s (%1$s XMR)
-
- ✔ ID plaćanja integrisan
- Priprema tvoje transakcije
-
- Kreiranje SideShift.ai Nalog
- Ispitivanje SideShift.ai Nalog
- Pripremanje Monero transakcije
-
- Ispitivanje SideShift.ai parametara
-
- SideShift.ai GREŠKA
- Kod: %1$d
-
- Takni za novi pokušaj
- Sada se zaglavismo!
- Uh, SideShift.ai izgleda da sad nije dostupan!
-
- %1$s %3$s = %2$s XMR
- (Rate: %1$s %2$s/XMR)
-
- Poseti SideShift.ai za bekap & praćenje
- Tajna šifra\nSideShift.ai
- SideShift.ai Tajna šifra
- Odredište %1$s adrese
- Suma
-
- ID transakcije
- Adresa odredišta
- Beleške
-
- Bekap u toku
- Arhiviranje u toku
- Preimenovanje u toku
- Promena lozinke u toku
-
- Pakovanje …\nOvo može malo potrajati!
-
- Bekap uspešan
- Bekap neuspeo!
- Preimenovanje neuspelo!
- Promena lozinke neuspela!
- Lozinka promenjena
-
- Čvor
-
- Otvaranje novčanika …
- Novčanik sačuvan
- Čuvanje novčanika neuspelo!
- Povezivanje …
- Povezivanje čvora neuspelo!\nCheck username/password
- Verzija čvora nekompatibilna - molimo da je nadgradite!
- Čvor nije validan!\nTry another.
- Nemože se doći do čvora!\nTry again or another.
-
- Nepovezano
-
- Transakcija neuspela: %1$s
-
- Predugo si čekao prijatelju!
-
- Još sam zauzet sa tvojim poslednjim novčanikom …
-
- Preimenuj %1$s
-
- Nova fraza-lozinka za %1$s
- Ponovi fraza-lozinku za %1$s
- Lozinka za %1$s
- Možeš otvoriti novčanik i sa otiskom prsta.\nMolimo takni senzor.
- Otvaranje novčanika…
- Otisak prsta nije prepoznat. Try again.
- Netačna lozinka!
- Sačuvana lozinka nije ispravna.\nMolimo unestite lozinku ručno.
- Novčanik ne postoji!
- Čvor mora biti podešen!
- Novčanik ne odgovara izabranoj mreži
-
- (Samo za pregled)
-
- Primljeno
- Daj
-
- + %1$s XMR nepotvrđeno
-
- monerujo Servis
-
- Sinhronizovano:
- Preostali blokovi
- Skeniranje:
-
- Eksterno skladište nije zapisivo! Panika!
- Stvarno su nam potrebna odobrenja za ta eksterna skladišta!
- Nema kamere = Nema QR skeniranja!
-
- Vidna šifra
- Javna adresa
- Šifra
- Vidna šifra kopirana u klipbord!
- Šifra kopirana u klipbord!
- Adresa novčanika kopirna u klipbord!
- ID transakcije kopiran u klipord!
- Kopiranje je onemogućeno iz sigurnosnih razloga!
-
- Ne može se dobiti kurs!\nUse XMR/XMR or try again
-
- Kreiraj novčanik
- Ime novčanika
- Fraza-lozinka novčanika
- Dozvoli otvaranje novčanika otiskom prsta
- Autorizacija otiska prsta
-
Sa omogućenom autorizacijom otiska prsta možeš videti stanje u novčaniku i primiti sredstva
- bez unosa lozinke.
-
Ali za dodatnu sigurnost, monerujo će ipak tražiti da uneseš lozinku za
- pregledanje novčaničkih detalja ili slanje sredstava.
- Sigurnosno upozorenje
-
Konačno, monerujo želi da te podseti da biloko ko može imati tvoj otisak prsta biće
- sposoban da zaviri u stanje tvog novčanika.
-
Na primer, zlonamerni korisnik iz tvoje okoline može ti otvoriti novčanik dok spavaš.
- Da li si siguran da omogućavaš ovu funkciju?
- ]]>
- Fraze-lozinke se ne podudaraju
- Fraza-lozinka ne može biti prazna
- Napravi mi već novčanik!
- Primetio sam mnemoničko seme
-
- Daj mi ime!
- Novčanik postoji!
- Nemožeš početi sa .
- Kreiranje novčanika
- Novčanik kreiran
-
- Unesi broj datuma u formatu (YYYY-MM-DD)
-
- Šifre
- Novo
- Seme
- Pregled
- Javna adresa
- Vidna šifra
- Šifra potrošnje
- Menemonično seme od 25 reči
- Obnovi visinu ili datum u formatu (YYYY-MM-DD)
-
- Javna adresa
- Vidna šifra
- Šifra potrošnje
- Mnemoničko seme
- Fajlovi novčanika obnova lozinke
-
- Unesi validnu šifru
- Unesi validnu adresu
- Unesi tvoje seme od 25 reči
-
- Privatne beleške (opciono)
- Generiši
-
- Potroši moj slatki Moneroj
- Potroši moj slatki Moneroj (%1$s)
- Nije QR kod
- Nije validan QR kod za plaćanje
- Nije validna adresa
- OpenAlias adresa nije dostupna
- OpenAlias sigurnost ✔
- Rešavanje OpenAlias-a…
- OpenAlias bez DNSSEC - adrese može biti lažna
- Pošalji
- Stanje: %1$s XMR
- Adresa
- Suma
- Potvrdi
- Urađeno
-
- Suma
- Naknada (XMR)
- Naknada
- Ukupno (XMR)
- Ukupno
-
- %1$s XMR
- +%1$s naknada
-
- Kreiraj transakcijsku grešku
-
- naknada %1$s
- (%1$s)
- neuspelo
- - %1$s
- + %1$s
-
- Vremenski žig
- TX ID
- TX šifra
- Odredište
- ID plaćanja
- Blok
- Suma
- Naknada
- Transferi
- Čvorovi
- (opciono)
- Detalji transakcije
-
- NA ČEKANJU
- NEUSPELO
-
- Suma
- Opis (opciono)
- Nemoguće otvaranje novčanika!
-
- Maks. %1$s
- Min. 0
- XMR nije broj
-
- Osetljivi podaci će biti pokazani.\nLook over your shoulder!
- Siguran sam
- Vrati me nazad!
- Detalji
-
- Ovaj novčanik će biti obrisan. Vaša sredstva će zauvek nestati ako nemate svoje seme ili ispravnu rezervnu kopiju da biste ih vratili.
- Da, uradi to!
- Ne, hvala!
-
- Kreiraj novi novčanik
- Obnovi novčanik za pregled
- Povrati novčanik iz privatnih šifri
- Povrati novčanik iz semena od 25 reči
-
- Kreiraj račun
- Dodat nov račun #%1$d
- Račun #
-
- Pošalji sva potvrđena sredstva na ovaj račun!
- Subadresa
- Javna subadresa #%1$d: %2$s
-
- Jezik
- Koristi sistemski jezik
-
- Povrati iz knjige računa nano
-
- Komunikacija sa knjigom računa
- Potrebna potvrda iz knjige računa!
- Povratak subadresa
- Verifikovanje šifri
- Ludačko računanje
- Hašovane stvari
- Molimo ponovo spojite uređaj knjige računa
-
- Kreiranje računa
-
- %1$s zakačeno
- %1$s otkačeno
-
- Pisanje taga
- Pisanje taga neuspelo!
- Pisanje taga uspešno
- Tag ne podržava NDEF!
- Tag omogućava %1$d bajta, međutim nama treba %2$d!
- Ne razumem tag!
- Ne znam šta si mislio!
- NFC dostupno!
-
- Pokaži tajne!
- Ulični mod
-
- Node-o-matiC (skener udaljenog čvora) omogućen, tapni za više info.
- Poslednji blok ažuriran: %1$s
- Čvorovi
- Ime čvora (opciono)
- Ime hosta
- Port
- Ime korisnika (opciono)
- Lozinka (opciono)
- Nemoguće je prepoznati hosta
- Ovo nam treba!
- Mora biti numerički
- Mora biti 1–65535
- Dodaj čvor
- Takni da osvežiš!
- KONEKCIJSKA GREŠKA %1$d
- KONEKCIJSKA GREŠKA
- NEUSPELA AUTORIZACIJA
- Rezultat testa:
- Visina: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- Provera IP-a: %1$s …
- Molimo sačekajte da se skeniranje završi
- Takni da izabereš ili dodaš čvorove
- Dodaj čvorove ručno ili povuci dole za skeniranje
- Skeniranje mreže…
- Automatski označeni najbolji %1$d čvorovi
- Testiranje
-
- Primalac
-
- SVE!
-
- Pretvori seme iz knjige računa
- Reči semena iz knjige računa
- Fraza-lozinka iz knjige računa(napredno)
- Nevalidno seme iz knjige računa!
- Unošenje tvog semena iz knjige računa na ovom mestu ima veliki sigurnosni rizik!
-
- Obnovi visinu
-
- Start Monero App on %1$s
-
- Rescan!
-
- I get it!
- Next
- I\'m ready!
-
- Welcome to Monerujo!
- This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.
- Keep your seed safe
- The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.
- Send Crypto
- Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.
- Nodes, your way
- Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.
- Send with fingerprint
- You\'re now able to send XMR with just your fingerprint if you enabled it. To request the password, just disable fingerprint access.
-
- Dark Mode
-
- Auto
- Day
- Night
-
- There is nothing here\nPlease create or restore a wallet
-
- Restore default nodes
- Restoring already in progress…
-
- Last Block: %1$d seconds ago
- Last Block: %1$d minutes ago
- Last Block: %1$d hours ago
- Last Block: %1$d days ago
-
- Cannot get quote
- Check amount and try again
-
- Ambiguous address.
- Please select the type above.
- ]]>
-
- Please enter or scan a %1$s address.
- You'll send XMR and the receiver will get %2$s using the SideShift.ai service.
- ]]>
-
- Please enter or scan a Monero address.
- ]]>
-
- Subaddresses
- Subaddress Name
- Too many unused addresses - use some to enable creating more!
- Too many unused accounts - use some to enable creating more!
- Transactions for this subaddress:
- No transactions for this subaddress yet
- Select a subaddress
- Long-press for details
-
- Delete
- Delete failed!
-
- Import wallet
- Import failed!
-
- Reset wallet!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-sv/about.xml b/app/src/main/res/values-sv/about.xml
deleted file mode 100644
index d0e1a70..0000000
--- a/app/src/main/res/values-sv/about.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
- Stäng
- Jag är Monerujo
- Version %1$s (%2$d)
-
- Medverkande
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo et al.
-
Den här sidan informerar dig om våra villkor angående samlingen
- och användningen av personlig information vi hämtar från användare
- av vår app (monerujo: Monero Plånbok).
-
-
Genom att använda denna app, går du med på samling och användning av information
- enligt denna policy.
-
-
Samlad Data
-
Personlig data är all slags data som kan identifiera en individ.
-
-
Moneronycklar och offentliga adresser är samlade och bearbetade av appen lokalt
- för att utföra transaktioner och skicka till Monero-nätverket i krypterad form.
-
-
Någon annan personlig data är inte samlad av appen.
-
Om du använder funktionen för USD/EUR växling (valfritt) så hämtar monerujo valutakurserna
- genom offentliga API:n av kraken.com.
- Läs deras sekretesspolicy på https://www.kraken.com/legal/privacy för
- detaljer om hur data i dina begär är samlade (speciellt
- sektionen "Information We Collect Automatically").
-
Om du använder appen för att skicka pengar till BTC-adresser, behöver du använda tjänsten SideShift.ai.
- Läs deras sekretesspolicy för detaljer på https://sideshift.ai/. Monerujo skickar de BTC-
- destination adressen och mängden. Din IP kan även samlas.
-
App-behörigheter
-
-
INTERNET : Anslut till Monero-nätverket via en Monero Daemon nod
-
READ_EXTERNAL_STORAGE : Läs plånboksfiler lagrade på enheten
-
WRITE_EXTERNAL_STORAGE : Skriv till plånboksfiler lagrade på enheten
-
WAKE_LOCK : Behåll enheten vaken under synkronisering
-
CAMERA : Skanna QR-koder för att ta emot Monero
-
-
Ändringar till denna Sekretesspolicy
-
Vi kan uppdatera denna sekretesspolicy. Vi meddelar
- dig om alla ändringar genom att skriva om den nya sekretesspolicyn i appen
- och på hemsidan (www.monerujo.io)
- Vi rekommendar att du läser vår sekretesspolicyn regelbundet för eventuella ändringar.
-
Denna Sekretesspolicy uppdaterades senast den: 10 November, 2017.
-
-
Kontakta Oss
-
Om du har några frågor om våran sekretesspolicy,
- eller om hur din data blir samlad och bearbetad,
- vänligen skicka e-post till privacy@monerujo.io.
-
- ]]>
-
diff --git a/app/src/main/res/values-sv/help.xml b/app/src/main/res/values-sv/help.xml
deleted file mode 100644
index e3f80d8..0000000
--- a/app/src/main/res/values-sv/help.xml
+++ /dev/null
@@ -1,303 +0,0 @@
-
-
- Skapa Plånbok - Ny
-
Om du behöver en ny Monero-adress!
-
Ange ett unikt plånboksnamn och lösenord. Lösenordet används för att hålla din plånboksdata säker på enheten.
- Använd ett starkt lösenord - eller ännu bättre, använd en lösenfras.
-
Anteckna ditt Mnemoniska Frö!
-
På den följande skärmen kommer du att hitta ditt 25-ord \"Mnemoniska Frö\".
- Det här är den enda datan som behövs för att återställa din plånbok i framtiden
- och få full tillgång till dina pengar.
- Att bevara denna data säkert och privat är väldigt viktigt, eftersom det ger vem som helst
- full tillgång till dina pengar!
-
Om du förlorar tillgång till din plånboks lösenord, kan du fortfarande återställa din plånbok med ditt Mnemoniska Frö.
-
Det finns inget sätt att återställa ditt Mnemoniska Frö, om du förlorar det förlorar du alla dina pengar!
- Det Mnemoniska Fröet kan även aldrig ändras, så om det blir stulet eller på annat sätt komprometterat,
- måste du flytta dina pengar till en ny plånbok (med ett nytt Mnemoniskt Frö). Därför, är det bäst
- att du bevarar ditt Mnemoniska Frö genom att skriva ner det och förvara det i flera säkra
- platser.
- ]]>
-
- Skapa Plånbok - Frö
-
Om du redan har en Monero-adress och vill återställa dess transaktioner från blockkedjan!
-
Ange ett unikt plånboksnamn och lösenord. Lösenordet används för att hålla din plånboksdata säker på enheten.
- Använd ett starkt lösenord - eller ännu bättre, använd en lösenfras.
-
Ange ditt frö i fältet \"Mnemoniskt Frö\".
-
Om du känner till blocknumret av den första transaktionen använd för denna adress, ange det i
- \"Återställningshöjd\" fältet - om du lämnar fältet tomt kommer hela blockkedjan för
- transaktioner som tillhör din adress skannas. Det tar en väldigt lång tid.
- ]]>
-
- Skapa Plånbok - Nycklar
-
Om du återställer en plånbok med dina nycklar!
-
Ange ett unikt plånboksnamn och lösenord. Lösenordet används för att hålla din plånboksdata säker på enheten.
- Använd ett starkt lösenord - eller ännu bättre, använd en lösenfras.
-
Ange din Monero-adress i fältet \"Offentlig Adress\" och fyll i \"Visningsnyckel\" och \"Spenderingsnyckel\".
-
Om du känner till blocknumret av den första transaktionen använd för denna adress, ange det i
- \"Återställningshöjd\" fältet - om du lämnar fältet tomt kommer hela blockkedjan för
- transaktioner som tillhör din adress skannas. Det tar en väldigt lång tid.
- ]]>
-
- Skapa Plånbok - Visa
-
Om du bara vill hålla ett öga på inkommande transaktioner till en plånbok!
-
Ange ett unikt plånboksnamn och lösenord. Lösenordet används för att hålla din plånboksdata säker på enheten.
- Använd ett starkt lösenord - eller ännu bättre, använd en lösenfras.
-
Ange din Monero-adress i fältet \"Offentlig Adress\" och fyll i \"Visningsnyckel\" och \"Spenderingsnyckel\".
-
Om du känner till blocknumret av den första transaktionen använd för denna adress, ange det i
- \"Återställningshöjd\" fältet - om du lämnar fältet tomt kommer hela blockkedjan för
- transaktioner som tillhör din adress skannas. Det tar en väldigt lång tid.
- ]]>
-
- Plånboksinformation
-
Offentlig adress
- Din offentliga adress är som ditt bankkontonummer, du kan dela det med vem som helst utan att
- behöva oroa dig om att förlora dina Moneroj. Folk kommer skicka Monero till din plånbok med
- den här adressen.
-
Mnemoniskt Frö
- Det här är den enda datan som behövs för att återställa din plånbok i framtiden och få full behörighet
- till dina pengar. Att bevara fröet säkert och privat är extremt viktigt, eftersom att det ger
- vem som helst tillgång till dina Moneroj! Om du inte har skrivit ner det någonstans säkert,
- vänligen gör det nu!
-
Visningsnyckel
- Din visningsnyckel kan användas för att hålla ett öga på inkommande transaktioner till din
- plånbok utan att ge behörigheten att spendera pengarna i din plånbok.
-
Spenderingsnyckel
- Din spenderingsnyckel ger vem som helst tillgång att spendera all Monero i din plånbok, så
- ge inte denna nyckeln till någon, förvara den säkert som ditt Mnemoniska Frö.
- ]]>
-
- Plånbokslista
-
Nod
- Monerujo använder en Avlägsen Nod för att kommunicera med Monero-nätverket utan att
- behöva ladda ner och lagra en kopia av hela blockkedjan. Du kan hitta en lista av populära
- avlägsna noder eller lära dig hur man kör sin egen avlägsen nod här https://moneroworld.com/
-
-
Monerujo kommer med några avlägsna noder inställda. Den kommer ihåg de 5 senast använda noderna.
-
Plånböcker
-
Här kan du se dina plånböcker. De finns i monerujo mappen på din enhets
- interna minne. Du kan använda en filutforskar app för att se dem. Du borde
- säkerhetskopiera den här mappen regelbundet till en extern hårddisk, ifall din
- enhet blir stulen eller exploderar.
-
-
Select a wallet to open it or press the \"+\" to create a new one.
- Or select one of the wallet operations:
-
- Välj en plånbok för att öppna det eller tryck på \"+\" för att skapa en ny.
- Eller välj en plånboks operation:
-
-
Detaljer
-
Visa plånbokens detaljer, frö & nycklar.
-
Mottaga
-
Gör en QR kod för att ta emot Moneroj.
-
Ändra namn
-
Ändra namn på plånboken. Säkerhetskopior ändrar inte namn.
-
Säkerhetskopiera
-
Skapa en kopia av plånboken i backups mappen i monerujo som skriver
- över tidigare kopior där.
-
Arkiv
-
Gör en säkerhetskopiering och ta bort den efter. Kopian är kvar i backups mappen.
- Om du inte längre behöver dina säkerhetskopior borde du ta bort de med en filutforskare
- eller säker databorttagnings-app.
-
- ]]>
-
- Transaktionsdetaljer
-
Destination
- Det här är offentliga adressen av plånboken du skickat Monero till.
-
Betalnings-ID
- Du kan använda ett Betalnings-ID för att identifiera anledningen du skickat Monero till någon,
- det är valfritt och privat. Till exempel tillåter det en affär att förknippa din transaktion
- med något du köpt.
-
TX ID
- Det här är ditt Transaktions-ID, det kan du använda för att identifiera förvirrande
- transaktioner på Blockkedjeutforskare som https://xmrchain.net/
-
TX Nyckel (Transaktionsnyckel)
- Det här är din transaktions privatnyckel, förvara den här säkert eftersom tillgång till
- den avslöjar vilken signatur i en ring som är din.
-
Block
- Det här är blocket som din transaktion blev inkluderad i.
- ]]>
-
- Skicka
-
Mottagarens adress
-
Det här är offentliga adressen av plånboken du skickar Moneroj till, du kan kopiera den från
- urklipp, skanna en QR-kod eller ange den manuellt. Se till att du trippel-kollar den för att
- vara säker på att du inte skickar pengar till fel adress.
-
In addition to using an XMR address, you can also use
-
-
an OpenAlias for XMR or BTC
-
a BTC address
-
- Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai
- for details). See the section on sending BTC below.
-
Skicka BTC
-
SideShift.ai
-
SideShift.ai är en tredjeparts tjänst som byter ut Monero mot Bitcoin. Vi använder SideShift.ai API:n
- för att integrera Bitcoin betalningar i Monerujo. Vänligen besök https://sideshift.ai och bestäm
- för dig själv om det är någonting du vill använda. Monerujo laget är inte associerad med
- SideShift.ai och kan inte hjälpa dig med deras tjänst.
-
SideShift.ai Växelkurs
-
På \"Mängd\"skärmen ser du de nuvarande parametrarna av SideShift.ai tjänsten. Dessa innehåller den
- nuvarande växelkursen samt de övre och lägre BTC gränserna. Vänligen notera att denna kursen
- inte är garanterad just nu.
-
SideShift.ai Beställning
-
På \"Bekräfta\" skärmen, kommer du att se den faktiska SideShift.ai beställningen. Den här beställningen
- är giltig under en begränsad tid - du kan se en nedräkning på \"Spendera\" knappen. Växelkursen
- kan vara annorlunda från den indikativa, visad på tidigare skärmar..
-
SideShift.ai Privatnyckel
-
Eftersom att Monerujo bara tar hand om Monero delen av din transaktion, kan din SideShift.ai
- privatnyckel användas för att spåra Bitcoin delen av din beställning på SideShift.ai sidan.
-
SideShift.ai Nedräkning!
-
När nedräkningen når noll, behöver du skaffa ett nytt kostnadsförslag från SideShift.ai genom att gå
- tillbaka till den tidigare skärmen och sedan gå till \"Bekräfta\"skärmen.
- ]]>
-
- Skicka BTC
-
SideShift.ai
-
SideShift.ai är en tredjeparts tjänst som byter ut Monero mot Bitcoin. Vi använder SideShift.ai API:n
- för att integrera Bitcoin betalningar i Monerujo. Vänligen besök https://sideshift.ai och bestäm
- för dig själv om det är någonting du vill använda. Monerujo laget är inte associerad med
- SideShift.ai och kan inte hjälpa dig med deras tjänst.
-
SideShift.ai Växelkurs
-
På \"Mängd\"skärmen ser du de nuvarande parametrarna av SideShift.ai tjänsten. Dessa innehåller den
- nuvarande växelkursen samt de övre och lägre BTC gränserna. Vänligen notera att denna kursen
- inte är garanterad just nu.
-
SideShift.ai Beställning
-
På \"Bekräfta\" skärmen, kommer du att se den faktiska SideShift.ai beställningen. Den här beställningen
- är giltig under en begränsad tid - du kan se en nedräkning på \"Spendera\" knappen. Växelkursen
- kan vara annorlunda från den indikativa, visad på tidigare skärmar..
-
SideShift.ai Privatnyckel
-
Eftersom att Monerujo bara tar hand om Monero delen av din transaktion, kan din SideShift.ai
- privatnyckel användas för att spåra Bitcoin delen av din beställning på SideShift.ai sidan.
-
SideShift.ai Nedräkning!
-
När nedräkningen når noll, behöver du skaffa ett nytt kostnadsförslag från SideShift.ai genom att gå
- tillbaka till den tidigare skärmen och sedan gå till \"Bekräfta\"skärmen.
- ]]>
-
- Create Wallet - Ledger
-
You want to recover your wallet from your Ledger Nano S device.
-
Your secret keys never leave the Ledger device, so you need it plugged in every
- time you want to access your wallet.
-
Enter a unique wallet name and password. The password is used for securing your wallet data on the Android
- device. Use a strong password - even better use a passphrase.
-
Enter the block number of the first transaction used for this address in the
- field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
- enter an approximate date/blockheight before you first used this wallet address.
- ]]>
-
- Plånboken
-
Street Mode
-
Street mode can be enabled/disabled in the menu or Gunther\'s head icon. In this mode, your
- balance is not shown on any screen so you can safely use your wallet on the street, a pub or
- other public place. Previous transactions are also hidden. New transactions will be shown, so
- you can see that you have sent/received sweet Moneroj!
-
Inläsning
- Eftersom Monero gillar att ha saker privat, läser Monerujo in blockkedjan för att se om du fått
- nya Moneroj varje gång du öppnar plånboken, det lagras alltså bara information på din mobil som
- har med din plånbok att göra. Ibland kan det ta lång tid om du inte har synkroniserat på länge.
-
Saldot
-
Hjälp! Min plånboks saldo har försvunnit eller är inte bekräftat!
- Få inte panik! När du skickar pengar från din plånbok, visas en del av ditt saldo temporärt
- som obekräftat.
- Det här händer på grund av hur Monero är skickat på blockkedjan och hur växel fungerar.
- Läs mer om växel på https://getmonero.org/resources/moneropedia/change.html
-
Transaktionlista
-
En lista av plånbokens transaktioner. I vis-plånböcker, visas bara inkommande transaktioner.
- ]]>
-
- Nodes
-
TL;DR
-
Refresh the nodes list by pulling down & bookmark 3–5 nodes to allow Monerujo
- to choose the best one for you!
-
What's a Node?
-
Monerujo uses a Remote Node (sometimes also called Daemon) to communicate with
- the Monero Network without having to download and store a copy of the
- whole blockchain itself.
-
Node List
-
If the list is empty, you can either add new nodes manually or let Monerujo
- scan the network for you. Or both. Read on…
-
The node list shows all currently known nodes. Additionally, the timestamp
- of the latest block known to each node is shown under the node name. An icon
- representing the node's response behaviour
- (which indicates the level of connectivity to be expected)
- is shown next to each node.
-
Any node in the list can be bookmarked for later use.
- Nodes which are not bookmarked will be forgotten.
-
Monerujo will choose the optimal bookmarked node each time you use it.
- It does this by checking the blockheight (how up-to-date
- is the node?) as well as the response behaviour (how fast does the node respond to requests?).
-
The list is sorted by these characteristics, so the top node would be the one Monerujo
- would choose right now. The bottom of the list would show very slow or unavailable nodes.
-
Add a Node
-
By touching the "Add Node" button at the bottom, you will be asked to
- enter the node details in the following dialog.
- The "Address" is the hostname or IP-address of the node - this is the only
- mandatory entry.
- Enter the "Port" if the node runs on a non-default port (e.g. 18089).
- You can also optionally name the node, so you can identify it easier later on.
- Some nodes require credentials to use them. Enter the provided username &
- password in the appropriate fields. Now you can "Test" these setting.
- The "Test Results" will display the blockheight, response time and actual IP used.
- The result may also be an error - usually because the hostname provided is
- not reachable in a sensible amount of time or the credentials are incorrect.
- Or the hostname/port combination does not point to an actual Monero Node!
- Once the test passes (no error) - you're set to press "OK" to save &
- bookmark this node.
-
Scan for Nodes
-
Additionally, you can scan the network for nodes. Monerujo will start
- scanning the network for Remote Nodes on port 18089. It begins by asking your
- bookmarked nodes for other peers in the Monero P2P network and then continues
- by asking those for their peers, and so on. If you have no bookmarked nodes
- (or they don't tell us about their peers),
- Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
- scan stops when it finds 10 remote nodes in total.
- ]]>
-
-
-
- Using a payment link
-
You have started monerujo with a payment link. In order to send funds, please do the following:
-
- 1. Open the wallet you want to spend from
- 2. Wait until the wallet is synced & the "Give" button appears
- 3. Touch the "Give" button
-
-
The payment details will be filled in. Check them and proceed like for any other transaction.
- ]]>
-
- Got it!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
deleted file mode 100644
index 7d5119e..0000000
--- a/app/src/main/res/values-sv/strings.xml
+++ /dev/null
@@ -1,444 +0,0 @@
-
-
- Plånbok
-
- Om
- Sekretesspolicy
-
- Dela
- Hjälp
- Ta emot
- Byt namn
- Säkerhetskopiera
- Ändra lösenfras
-
- Fortsätt skriva …
- Nja …
- Kom igen, bättre kan du!
- Du närmar dig …
- Så ska det se ut, som en h4x0r!
-
- Plånböcker
- Erkännanden
- OK
- Avbryt
- Stäng
- Detaljerad information
-
- Har skickats
- Färdig
-
- Tryck för QR-kod
-
- BTC-betalning aktiverad, tryck för mer info.
- Ledger aktiverat, tryck för mer info.
-
- Du har angivit en %1$s-adress.
- Du kommer att skicka XMR och mottagaren får %1$s via tjänsten SideShift.ai.
- ]]>
-
- SideShift.ai-beställning
-
- %1$s %2$s
-
- Väntar på bekräftelse
- Väntar på betalning
- SideShift.ai-fel (%1$s)
- %1$s skickades!
- Frågar …
-
- Du kan skicka %1$s — %2$s %4$s.
- SideShift.ai ger dig just nu en växelkurs på %3$s %4$s/XMR.
- ]]>
-
- Saldo: %2$s %3$s (%1$s XMR)
-
- ✔ Betalnings-ID integrerat
- Förbereder din transaktion
-
- Skapar SideShift.ai-beställning
- Frågar SideShift.ai-beställningen
- Förbereder Monero-transaktion
-
- Frågar SideShift.ai-parametrar
-
- SideShift.ai-FEL
- Kod: %1$d
-
- Tryck för att försöka igen
- Nu har vi kört fast!
- Åh nej, SideShift.ai verkar inte vara tillgänglig just nu!
-
- %1$s %3$s = %2$s XMR
- (Kurs: %1$s %2$s/XMR)
-
- Besök SideShift.ai för support & spårning
- Hemlig nyckel\nSideShift.ai
- SideShift.ai hemlig nyckel
- Måladress för %1$s
- Belopp
-
- Transaktions-ID
- Måladress
- Anteckningar
-
- Säkerhetskopiering pågår
- Arkivering pågår
- Namnbyte pågår
- Ändring av lösenord pågår
-
- Gör klart några saker …\nDetta kan ta lite tid!
-
- Säkerhetskopia sparad
- Det gick inte att säkerhetskopiera!
- Det gick inte att byta namn!
- Det gick inte att ändra lösenord!
- Lösenordet har ändrats
-
- Nod
- Läser in plånbok …
- Plånbok sparad
- Det gick inte att spara plånbok!
- Ansluter …
- Kunde inte ansluta till nod!\nKontrollera användarnamn/lösenord
- Ogiltig nod!\nPröva någon annan.
- Noden kan inte nås!\nFörsök igen eller en annan nod.
-
- Frånkopplad
-
- Transaktionen misslyckades: %1$s
-
- Du väntade för länge!
-
- Jag är fortfarande upptagen med din förra plånbok …
-
- Byt namn %1$s
-
- Ny lösenfras för %1$s
- Upprepa lösenfrasen för %1$s
- Lösenord för %1$s
- Du kan också öppna plånboken med fingeravtryck.\nAnvänd fingeravtryckssensorn.
- Fingeravtrycket känns inte igen. Försök igen.
- Lösenordet är fel!
- Plånboken finns inte!
- Nodens adress måste anges!
- Plånboken matchar inte valt nät
-
- (Granskning)
-
- Ta emot
- Ge
-
- + %1$s XMR obekräftade
-
- monerujo-tjänsten
-
- Synkade:
- Återstående block
- Skannar:
-
- Externt lagringsutrymme är skrivskyddat! Panik!
- Vi behöver verkligen behörighet för Externt lagringsutrymme!
- Ingen kamera = Ingen QR-skanning!
-
- Granskningsnyckel
- Publik adress
- Nyckel
- Granskningsnyckel kopierades till urklipp!
- Nyckel kopierades till urklipp!
- Plånboksadress kopierades till urklipp!
- Transaktions-ID kopierades till urklipp!
- Kopiering är inaktiverad av säkerhetskäl!
-
- Det gick inte att hämta växelkurs!\nAnvänd XMR/XMR eller försök igen
-
- Skapa plånbok
- Plånbokens namn
- Plånbokens lösenfras
- Tillåt öppning av plånboken med fingeravtryck
- Autentisering med fingeravtryck
När fingeravtrycksautentisering är aktiverad kan du se plånbokens saldo och ta emot pengar utan att ange lösenord.
Men för ytterligare säkerhet kräver monerujo ändå att du anger lösenord för att granska information om plånboken eller skicka pengar.
Säkerhetsvarning
Slutligen vill monerujo påminna dig att vem som helst som kan komma åt ditt fingeravtryck kan se saldot i din plånbok.
En elak användare i din närhet kan till exempel öppna din plånbok när du sover.
Är det säkert att du vill aktivera denna funktion?]]>
- Lösenfraserna matchar inte
- Lösenfrasen får inte vara tom
- Skapa min plånbok nu då!
- Jag har skrivit ner det minnesbaserade startvärdet
-
- Ge mig ett namn!
- Plånboken finns!
- Får inte börja med .
- Skapar plånbok
- Plånboken skapades
-
- Ange ett tal eller ett datum (ÅÅÅÅ-MM-DD)
-
- Nycklar
- Nytt
- Startvärde
- Visa
-
- Publik adress
- Granskningsnyckel
- Spendernyckel
- Minnesbaserat startvärde på 25 ord
- Återställningshöjd eller datum (ÅÅÅÅ-MM-DD)
-
- Publik adress
- Granskningsnyckel
- Spendernyckel
- Minnesbaserat startvärde
- Lösenord för återställning av plånboksfiler
-
- Ange en giltig nyckel
- Ange en giltig adress
- Ange ditt startvärde på 25 ord
-
- Privat anteckning (valfri)
- Skapa
- Spendera mina Moneroj
- Spendera mina Moneroj (%1$s)
- Inte en QR-kod
- Inte en giltig QR-kod för betalning
- Inte en giltig adress
- Skicka
- Saldo: %1$s XMR
- Adress
- Belopp
- Bekräfta
- Färdig
-
- Belopp
- Avgift (XMR)
- Avgift
- Summa (XMR)
- Summa
-
- %1$s XMR
- +%1$s avgift
-
- Ett fel uppstod när transaktion skapades
-
- Avgift %1$s
- (%1$s)
- misslyckades
- - %1$s
- + %1$s
-
- Tidsstämpel
- TX-ID
- TX-nyckel
- Mål
- Betalnings-ID
- Block
- Belopp
- Avgift
- Överföringar
- Anteckningar
- (valfritt)
- Transaktionsdetaljer
-
- VÄNTANDE
- MISSLYCKAD
-
- Belopp
- Det gick inte att öppna plånboken!
-
- Max. %1$s
- Min. 0
- XMR är inte ett tal
-
- Nu kommer känsliga data att visas.\nTitta över axeln!
- Det är OK
- Ta mig tillbaka!
- Detaljer
-
- Ja, gör det!
- Nej tack!
-
- Skapa ny plånbok
- Återställ granskningsplånbok
- Återställ plånbok från privata nycklar
- Återställ plånbok från startvärde på 25 ord
-
- Öppnar plånboken…
- Det sparade lösenordet är inkorrekt.\nSkriv lösenordet manuellt.
-
- Skapa konto
- Nytt konto skapat #%1$d
- Konto #
-
- Skicka alla bekräftade pengar i detta konto!
- Underadress
- Publik underadress #%1$d: %2$s
-
- Språk
- Använd systemets språk
-
- Återställ från Ledger Nano
-
- Kommunicerar med Ledger
- Bekräfta på Ledger!
- Hämtar underadresser
- Verifierar nycklar
- Beräknar galet svår matte
- Beräknar checksumma
- Vänligen (åter)anslut Ledger
-
- Skapar konto
-
- %1$s ansluten
- %1$s frånkopplad
-
- Skriver tagg
- Misslyckades att skriva till tagg!
- Skrivning till tagg lyckades
- Taggen stöder inte NDEF!
- Taggen har %1$d bytes, men vi behöver %2$d!
- Jag förstår inte taggen!
- Jag vet inte vad du vill!
- NFC tillgängligt!
-
- Beskrivning (valfri)
-
- OpenAlias-adress ej tillgänglig
- OpenAlias säkrad ✔
- Slår upp OpenAlias…
- OpenAlias utan DNSSEC - adressen kan vara förfalskad
-
- Node version incompatible - please upgrade!
-
- Detaljer
- Gatu Mode
-
- Node-o-matiC aktiverad, tryck för mer info.
- Senaste blocket uppdaterat: %1$s
- Noder
- Node Namn (Frivillig)
- Värdnamn
- Port
- Användare (Frivillig)
- Lösenord (Frivillig)
- Det går inte att lösa värden
- Vi behöver det här!
- Måste vara numeriskt
- Måste vara 1–65535
- Addera nod
- Tryck för att uppdatera!
- ANSLUTNINGSFEL %1$d
- ANSLUTNINGSFEL
- AUTENTISERING MISSLYCKADES
- Test result:
- Height: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s
- Testar IP: %1$s …
- Vänta tills scanningen är klar
- Tryck för att välja eller addera nod
- Addera nod manuellt eller dra ner för att scanna
- Scannar nätverket…
- Automatiskt bokmärk bäst %1$d noder
- Testa
-
-
- Mottagaren
-
- SKICKA ALLT
-
- Konvertera Ledger Seed
- Ledger Seed Words
- Ledger lösenfras (frivillig)
- Ogilitigt Ledger Seed!
- Att ange din Ledger Seed här är en stor säkerhetsrisk!
-
- Återställningshöjd
-
- Starta Monero app på %1$s
-
- Skanna om!
-
- Jag förstår!
- Nästa
- Jag är redo!
-
- Välkommen till Monerujo!
- Denna app tillåter dig att skapa och använda Monero plånböcker. Du kan förvara dina kära moneroj i dem.
- Håll dina seed i säkert förvar.
- Seed ger full åtkomst till den som har den. Om du förlorar det, kan vi inte hjälpa dig och du förlorar dina kära moneroj.
- Skicka krypto
- Monerujo har SideShift.ai support inbyggt. Bara klistra in eller scanna en BTC, LTC, ETH, DASH or DOGE address och du skickar dessa krypto genom att spendera XMR.
- Noder, på ditt sätt.
- Noder ansluter dig till Monero-nätverket. Välj mellan offentliga noder eller gå all-in "cypherpunk" med din egen.
- Skicka med fingeravtryck
- Du kan nu skicka XMR med bara ditt fingeravtryck om du aktiverar det. För att begära lösenordet, inaktivera bara fingeravtrycksåtkomst.
-
- Dark Mode
-
- Auto
- Dag
- Natt
-
- Det finns inget här\nSkapa eller återställ en plånbok
-
- Återställ standardnoder
- Återställer redan pågående ...
-
- Senaste Block: %1$d sekunder sen
- Senaste Block: %1$d minuter sen
- Senaste Block: %1$d timmar sen
- Senaste Block: %1$d dagar sen
-
- Kan inte få offert
- Kontrollera beloppet och försök igen
-
- Ambiguous address.
- Please select the type above.
- ]]>
-
- Please enter or scan a %1$s address.
- You'll send XMR and the receiver will get %2$s using the SideShift.ai service.
- ]]>
-
- Please enter or scan a Monero address.
- ]]>
-
- Subaddresser
- Subaddresser namn
- För många oanvända adresser - använd några för att skapa flera!
- För många oanvända adresser - använd några för att skapa flera!
- Transaktioner för denna subadress:
- Inga transaktioner för denna subadress ännu
- Välj en subadress
- Tryck länge för mer detaljerad info
-
- Denna plånbok kommer att raderas. Dina pengar kommer att vara borta för alltid om du inte har din seed eller en fungerande säkerhetskopia för att återställa dem.
- Förstöra
- Förstöringen misslyckades!
-
- Importera plånbok
- Importeringen misslyckad!
-
- Återställ plånbok!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-ta/about.xml b/app/src/main/res/values-ta/about.xml
deleted file mode 100644
index 8ce3c82..0000000
--- a/app/src/main/res/values-ta/about.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
- மூடு
- நான் monerujo
- பதிப்பு %1$s (%2$d)
-
- நன்றி
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo, ErCiccione et al.
-
எங்கள் செயலியின் மூலம் (monerujo: மொனேரொ பணப்பை) பயனரிடமிருந்து பெறப்படும் தனிப்பட்ட தரவுகளைச் சேகரித்தல்,
- பயன்படுத்துதல் மற்றும் வெளிப்படுத்துதல் தொடர்பான எங்கள் கொள்கைகளைப் பற்றி இந்த பக்கம் உங்களுக்குத் தெரிவிக்கிறது.
-
-
இந்த செயலியைப் பயன்படுத்துவதன் மூலம், நீங்கள் இந்தக் கொள்கையின்படி தகவலைச் சேகரிப்பதற்கும் பயன்படுத்துவதற்கும் ஒப்புக்கொள்கிறீர்கள்
-
-
சேகரிக்கப்படும் தரவுகள்
-
தனிநபரை அடையாளம் காட்டவல்ல எந்தவொரு தரவும் தனிப்பட்ட தரவாகும்.
-
-
பரிமாற்றத்தை முறைப்படுத்தி, மறைகுறியீட்ட வடிவில் மொனேரொ வலையமைப்பினுள் அனுப்பும் நோக்கத்திற்காக
- மொனேரொ திறவுகோல்கள் மற்றும் பொது முகவரிகள் உள்ளூர் அளவில் செயலியால் சேகரிக்கப்பட்டு முறைப்படுத்தப்படுகிறது.
-
-
மற்ற எந்தவொரு தனிப்பட்ட தரவுகளும் இந்த செயலியால் சேகரிக்கப்படுவதில்லை.
-
நீங்கள் மாற்றுகை (விரும்பினால்) செயல்பாட்டைப் பயன்படுத்தும்போது, monerujo ஆனது coinmarketcap.com இன் பொது API மூலம்
- மாற்றுகை விலையைக் கொணர்கிறது. உங்கள் கோரலில் உள்ள தரவு எவ்வாறு சேகரிக்கப்படுகிறது என்பதை அறிந்துகொள்ள https://coinmarketcap.com/privacy
- என்னும் அவர்கள் தனியுரிமை கொள்கை பக்கத்தைப் பார்க்கவும்.
-
இந்த செயலியை ஒரு BTC முகவரிக்குப் பணம் செலுத்தப் பயன்படுத்தினால், நீங்கள் அதற்கு SideShift.ai சேவையைப் பயன்படுத்த நேரிடும்.
- மேலும் விவரங்களுக்கு https://sideshift.ai/ என்னும் தளத்தில் அவர்கள் தனியுரிமை கொள்கையைக் காணவும். BTC சேருமிட முகவரி மற்றும் தொகையை
- Monerujo அவர்களுக்கு அனுப்புகிறது. உங்கள் IP முகவரியும் சேகரிக்கப்படலாம்.
-
செயலி அனுமதிகள்
-
-
INTERNET (இணையம்) : ஒரு மொனேரொ மறைநிரல் கணுவை கொண்டு மொனேரொ வலையமைப்போடு இணைப்பதற்கு
CAMERA (படமி) : மொனேரொவை பெறுதல் பொருட்டு QR குறியீடுகளை வருடுவதற்கு
-
-
இந்த தனியுரிமை கொள்கைகளில் ஏற்படும் மாற்றங்கள்
-
நாங்கள் அவ்வப்போது இந்த தனியுரிமை கொள்கையை இற்றைப்படுத்துவோம். ஏதேனும் மாற்றங்கள் இருப்பின், புதிய தனியுரிமை கொள்கையைச்
- செயலி மற்றும் www.monerujo.io இணையதளத்தில் பதிவிடுவதன் மூலம் நாங்கள் உங்களுக்குத் தெரிவிப்போம்.
- ஏதேனும் மாற்றங்களுக்கு நீங்கள் இந்த தனியுரிமை கொள்கையை காலமுறைதோறும் மதிப்பாய்வு செய்யுமாறு அறிவுறுத்தப்படுகிறீர்கள்.
-
இந்த தனியுரிமை கொள்கை இறுதியாக இற்றைப்படுத்திய நாள்: நவம்பர் மாதம் 10 ஆம் நாள், 2017.
-
-
எங்களைத் தொடர்பு கொள்ளவும்
-
எங்களின் தனியுரிமை கொள்கை அல்லது எவ்வாறு உங்கள் தரவு சேகரிக்கப்பட்டு முறைப்படுத்தப்படுகிறது என்பதைப் பற்றி உங்களுக்கு ஏதேனும் கேள்விகள் இருந்தால்
- privacy@monerujo.io என்னும் முகவரிக்கு ஒரு மின்னஞ்சல் அனுப்பவும்.
-
தனித்துவமான பணப்பை பெயர் மற்றும் கடவுச்சொல்லை உள்ளிடவும்.
- சாதனத்தில் இருக்கும் உங்கள் பணப்பை தரவுகளை பாதுகாக்க இந்த கடவுச்சொல் பயன்படுத்தப்படும். ஆகையால் வலிமையான
- கடவுச்சொல்லை பயன்படுத்தவும் - கடவுத்தொடரை பயன்படுத்தினால் இன்னும் சிறப்பாக இருக்கும்.
-
உங்கள் நினைவி விதையை குறித்து வைத்து கொள்ளவும்!
-
பின்வரும் திரையில், உங்களுடைய 25-வார்த்தை கொண்ட \"நினைவி விதையை\" உங்களால் காண இயலும்.
- பின்னர் ஒரு கட்டத்தில் உங்கள் பணப்பையை மீட்டெடுக்க வேண்டும் என்றால் இந்த தரவு மட்டுமே போதுமானதாக இருக்கும்.
- இதன்மூலம் உங்கள் வைப்புகளின் முழு அணுகலை நீங்கள் பெற இயலும்.
- இது யாரேனும் ஒருவருக்கு உங்கள் வைப்பின் முழு அணுகலை தரவல்லது என்பதால், இதை பாதுகாப்பாக மற்றும்
- கமுக்கமாக வைத்திருப்பது மிகவும் முக்கியமானதாகும்!
-
நீங்கள் உங்கள் பணப்பை கடவுச்சொல்லை மறந்துவிட்டீர்கள் எனறால், இந்த நினைவி விதையை கொண்டு உங்களால்
- உங்கள் பணப்பையை மீட்டெடுக்க இயலும்.
-
உங்கள் நினைவி விதையை மீட்டெடுக்க எந்த வழியும் இல்லை. இதைத் தொலைத்து விட்டீர்கள் என்றால் உங்கள்
- மொத்த வைப்பும் தொலைந்து விட்டதாகப் பொருள்! நினைவி விதையையும் ஒருபோதும் மாற்ற இயலாது. மேலும், இது தொலைந்தோ
- அல்லது காணாமல் போனாலோ உங்கள் பணத்தை ஒரு புதிய பணப்பைக்கு மாற்ற வேண்டி வரும் (ஒரு புதிய நினைவி
- விதையைக் கொண்டு). எனவே, உங்கள் நினைவி விதையை ஒன்றிற்கும் மேற்பட்ட பாதுகாப்பான இடங்களில்
- கைப்பட எழுதி வைப்பது இன்றியமையாததாகும்.
- ]]>
-
- பணப்பை உருவாக்கல் - விதை
-
உங்களிடம் ஏற்கனவே ஒரு மொனேரொ முகவரி இருந்து, தொகுப்பு சங்கிலியில் இருந்து பரிமாற்றங்களை மீட்டெடுக்க வேண்டுமென்றால்!
-
தனித்துவமான பணப்பை பெயர் மற்றும் கடவுச்சொல்லை உள்ளிடவும்.
- சாதனத்தில் இருக்கும் உங்கள் பணப்பை தரவுகளை பாதுகாக்க இந்த கடவுச்சொல் பயன்படுத்தப்படும். ஆகையால் வலிமையான
- கடவுச்சொல்லை பயன்படுத்தவும் - கடவுத்தொடரை பயன்படுத்தினால் இன்னும் சிறப்பாக இருக்கும்.
-
\"நினைவி விதை\" என்னும் புலத்தில் உங்கள் விதையை உள்ளிடவும்.
-
\"மீட்டமை உயரம்\" புலத்தில் இந்த முகவரிக்காக பயன்படுத்தப்பட்ட முதல் பரிமாற்றத்தின் தொகுதி எண்ணை உள்ளிடவும்.
- மேலும் நீங்கள் வவவவ-மம-நாநா என்னும் வடிவத்தில் ஒரு தேதியையும் பயன்படுத்தலாம். உங்களுக்கு குழப்பமாக இருந்தால,
- இந்த பணப்பை முகவரிக்கு முன்பு நீங்கள் முதலில் பயன்படுத்திய தோராயமான தேதி அல்லது தொகுதி உயரத்தை உள்ளிடவும்.
- ]]>
-
- பணப்பையை உருவாக்கல் - பேரேடு
-
உங்கள் பேரேடு நாநோ S சாதனத்திலிருந்து உங்கள் பணப்பையை மீட்டெடுக்க வேண்டுமென்றால்.
-
உங்கள் இரகசிய திறவுகோல் ஒருபோதும் பேரேடு சாதனத்தை விட்டு வெளியேறாது, ஆகையால் ஒவ்வொரு
- முறை நீங்கள் உங்கள் பணப்பையை அணுக வேண்டும்போதும் இது சொருகப்பட்டிருக்க வேண்டும்.
-
தனித்துவமான பணப்பை பெயர் மற்றும் கடவுச்சொல்லை உள்ளிடவும். ஆன்ட்ராய்டு சாதனத்தில் இருக்கும்
- உங்கள் பணப்பை தரவுகளை பாதுகாக்க இந்த கடவுச்சொல் பயன்படுத்தப்படும். ஆகையால் வலிமையான
- கடவுச்சொல்லை பயன்படுத்தவும் - கடவுத்தொடரை பயன்படுத்தினால் இன்னும் சிறப்பாக இருக்கும்.
-
\"மீட்டமை உயரம்\" புலத்தில் இந்த முகவரிக்காக பயன்படுத்தப்பட்ட முதல் பரிமாற்றத்தின் தொகுதி எண்ணை உள்ளிடவும்.
- மேலும் நீங்கள் வவவவ-மம-நாநா என்னும் வடிவத்தில் ஒரு தேதியையும் பயன்படுத்தலாம். உங்களுக்கு குழப்பமாக இருந்தால,
- இந்த பணப்பை முகவரிக்கு முன்பு நீங்கள் முதலில் பயன்படுத்திய தோராயமான தேதி அல்லது தொகுதி உயரத்தை உள்ளிடவும்.
- ]]>
-
- பணப்பையை உருவாக்கல் - திறவுகோல்கள்
-
உங்கள் திறவுகோல்களை பயன்படுத்தி உங்கள் பணப்பையை மீட்டெடுக்க உள்ளீர்கள் என்றால்!
-
தனித்துவமான பணப்பை பெயர் மற்றும் கடவுச்சொல்லை உள்ளிடவும்.
- சாதனத்தில் இருக்கும் உங்கள் பணப்பை தரவுகளை பாதுகாக்க இந்த கடவுச்சொல் பயன்படுத்தப்படும். ஆகையால் வலிமையான
- கடவுச்சொல்லை பயன்படுத்தவும் - கடவுத்தொடரை பயன்படுத்தினால் இன்னும் சிறப்பாக இருக்கும்.
-
\"பொது முகவரி\" என்னும் புலத்தில் உங்கள் மொனேரொ முகவரியை உள்ளிட்டு, பின் \"பார்வை திறவுகோல்\" மற்றும் \"செலவழி திறவுகோல்\" ஆகியவற்றை நிரப்பவும்.
-
\"மீட்டமை உயரம்\" புலத்தில் இந்த முகவரிக்காக பயன்படுத்தப்பட்ட முதல் பரிமாற்றத்தின் தொகுதி எண்ணை உள்ளிடவும்.
- மேலும் நீங்கள் வவவவ-மம-நாநா என்னும் வடிவத்தில் ஒரு தேதியையும் பயன்படுத்தலாம். உங்களுக்கு குழப்பமாக இருந்தால,
- இந்த பணப்பை முகவரிக்கு முன்பு நீங்கள் முதலில் பயன்படுத்திய தோராயமான தேதி அல்லது தொகுதி உயரத்தை உள்ளிடவும்.
- ]]>
-
- பணப்பையை உருவாக்கல் - பார்க்க
-
பணப்பைக்கான உள்வரு பரிமாற்றங்களை மட்டும் நீங்கள் கண்காணிக்க வேண்டுமென்றால்!
-
தனித்துவமான பணப்பை பெயர் மற்றும் கடவுச்சொல்லை உள்ளிடவும்.
- சாதனத்தில் இருக்கும் உங்கள் பணப்பை தரவுகளை பாதுகாக்க இந்த கடவுச்சொல் பயன்படுத்தப்படும். ஆகையால் வலிமையான
- கடவுச்சொல்லை பயன்படுத்தவும் - கடவுத்தொடரை பயன்படுத்தினால் இன்னும் சிறப்பாக இருக்கும்.
-
\"பொது முகவரி\" என்னும் புலத்தில் உங்கள் மொனேரொ முகவரியை உள்ளிட்டு, பின் \"பார்வை திறவுகோல்\" ஐ நிரப்பவும்.
-
\"மீட்டமை உயரம்\" புலத்தில் இந்த முகவரிக்காக பயன்படுத்தப்பட்ட முதல் பரிமாற்றத்தின் தொகுதி எண்ணை உள்ளிடவும்.
- மேலும் நீங்கள் வவவவ-மம-நாநா என்னும் வடிவத்தில் ஒரு தேதியையும் பயன்படுத்தலாம். உங்களுக்கு குழப்பமாக இருந்தால,
- இந்த பணப்பை முகவரிக்கு முன்பு நீங்கள் முதலில் பயன்படுத்திய தோராயமான தேதி அல்லது தொகுதி உயரத்தை உள்ளிடவும்.
- ]]>
-
- பணப்பை விவரங்கள்
-
பொது முகவரி
- பொது முகவரி உங்கள் வங்கி கணக்கு எண்ணை போன்றது. நீங்கள் மொனேரொவை இழந்து விடுவோமோ என்ற எந்தவித
- கவலையும் இல்லாமல் இதை எவரோடும் பகிரலாம். இந்த முகவரியை பயன்படுத்தி மக்கள் உங்கள் பணப்பைக்கு மொனெரோவை
- அனுப்புவார்கள்.
-
நினைவி விதை
- பின்னர் ஒரு கட்டத்தில் உங்கள் பணப்பையை மீட்டெடுக்க வேண்டும் என்றால் இந்த தரவு மட்டுமே போதுமானதாக இருக்கும்.
- இதன்மூலம் உங்கள் வைப்புகளின் முழு அணுகலை நீங்கள் பெற இயலும்.
- இது யாரேனும் ஒருவருக்கு உங்கள் வைப்பின் முழு அணுகலை தரவல்லது என்பதால், இதை பாதுகாப்பாக மற்றும்
- கமுக்கமாக வைத்திருப்பது மிகவும் முக்கியமானதாகும்! இதை இன்னும் ஒரு பாதுகாப்பான இடத்தில் எழுதி வைக்கவில்லையென்றால்
- இப்போதே அதை செய்யவும்!
-
பணப்பை கோப்புகள் மீட்டமை கடவுச்சொல்
- இந்த கடவுச்சொல்லை எழுதி வைப்பதிருப்பதை உறுதிசெய்து கொள்ளவும். நீங்கள் உங்கள் சாதனத்தை மீள் அமைத்தாலோ அல்லது
- செயலியின் நிறுவலை நீக்கனாலோ, உங்கள் பணப்பையை மீண்டும் அணுக இது உங்களுக்கு தேவைப்படும்.
-
CrAzYpass
- இங்கு காட்டப்பட்டுள்ள கடவுச்சொல் ஒரு குழுவில் 4 என்ற அடிப்படையில் உள்ள 52 எண்ணெழுத்து வரையுருக்களாகும் - வாழ்த்துக்கள்!
- உங்கள் பணப்பை கோப்புகள் நீங்கள் தேர்ந்தெடுத்த கடவுத்தொடரை (உருவாக்கலின்போது அல்லது அதை மாற்றும் போது) அடிப்படையாக
- கொண்டு உங்கள் சாதனத்தின் பாதுகாப்பு சிறப்பியல்புகளால் உற்பத்தி செய்யப்பட்ட 256-இரும திறவுகோலை கொண்டு பாதுகாக்கப்பட்டுள்ளது.
- இது ஊடுருவலை மிக கடினமானதாக்குகிறது!
- இந்த சிறப்பியல்பு எல்லா புதிதாக உருவாக்கப்பட்ட பணப்பைகளுக்கும் கட்டாயமானதாகும்.
-
மரபுவழி கடவுச்சொல்
- உங்கள் கடவுத்தொடரை இங்குக் காண நேர்ந்தால், உங்கள் பணப்பை கோப்பானது CrAzYpass ஐ பயன்படுத்தும்போது
- உள்ள பாதுகாப்பைக் காட்டிலும் சற்று குறைவாக உள்ளது எனப் பொருள் கொள்ளலாம். இதைச் சரி செய்ய, சிறுபட்டியிலிருந்து
- \"கடவுச்சொற்றொடரை மாற்று\" என்பதைத் தேர்ந்தெடுக்கவும். இதில் புதிய கடவுத்தொடரை (அல்லது அதே கடவுத்தொடரை) இட்டவுடன்
- செயலியானது ஒரு CrAzYpass ஐ உங்களுக்காக உற்பத்தி செய்து, உங்கள் பணப்பை கோப்புகளை அதைக்கொண்டு பாதுகாக்கும். இதை
- எழுதி வைத்துக் கொள்ளவும்!
-
CrAzYpass பணப்பைகள்
- If you ever need to reinstall Monerujo (for example after resetting your phone or switching
- to a new one) or you want to use your wallet files on a different device or PC, you have to
- use this Recovery Password in order to access your wallet again.
- By selecting \"Change Passphrase\" from the menu, you can choose another passphrase. Beware
- that this will generate a new Recovery Password. Write it down!
-
பார்வை திறவுகோல்
- பார்வை திறவுகோலானது உங்கள் பணப்பைக்கு உள்வரும் பரிமாற்றங்களை, அவற்றிற்கு உங்கள் பணப்பையில்
- உள்ள பணத்தைச் செலவழிப்பதற்கு அனுமதி அளிக்காமல் அவற்றைக் கண்காணிக்கப் பயன்படும்.
-
செலவழி திறவுகோல்
- உங்கள் செலவழி திறவுகோலானது உங்கள் பணப்பையோடு தொடர்புடைய மொனேரொவை யாரேனும் ஒருவர் செலவழிக்க அனுமதிக்கிறது.
- ஆகையால், நினைவி விதையைப் போல் இதைப் பற்றியும் யாரிடமும் சொல்லாதீர்கள்.
- ]]>
-
- பணப்பை பட்டியல்
-
கணு
-
Monerujo uses a Remote Node to communicate with the Monero Network without having
- to download and store a copy of the whole blockchain itself. You can find a list of popular
- remote nodes or learn how to run your own remote node here https://moneroworld.com/
-
Monerujo comes with some Remote Nodes preset. It remembers the last five nodes used.
-
Wallets
-
Here you see your wallets. They are located in the monerujo folder
- in the internal storage of your device. You can use a file explorer app to see them.
- You should make backups of this folder on a regular basis to off-device storage in
- case your device explodes or gets stolen.
-
Select a wallet to open it or press the \"+\" to create a new one.
- Or select one of the wallet operations:
-
விவரங்கள்
-
பணப்பையின் விவரங்கள், விதை & திறவுகோல்களை காட்டும்.
-
பெறு
-
மொனேரொவை பெறுவதற்காக ஒரு QR குறியீட்டை உருவாக்கு.
-
மறுபெயரிடு
-
பணப்பையின் பெயரை மாற்றும். காப்புநகல்களின் பெயர்கள் மாற்றப்படாது.
-
காப்புநகலெடு
-
Make a copy of the wallet in the backups folder inside the monerujo
- overwriting previous copies there.
-
ஆவணகப்படுத்து
-
Make a backup and delete the wallet afterwards. The copy remains in the backups
- folder. If you no longer need your backups you should delete them with a file explorer or
- secure delete app.
- ]]>
-
- பரிமாற்ற விவரங்கள்
-
சேருமிடம்
- இது நீங்கள் மொனேரொவை எந்த பணப்பைக்கு அனுப்புகிறீர்களோ அதனுடைய பொது முகவரி
-
பணம்செலுத்தல் ID
- இரு தரப்பினருக்கு இடையில் நீங்கள மொனேரொவை அனுப்பியதற்கான காரணத்தை கண்டறிய ஒரு செலுத்தல் ID ஐ பயன்படுத்தலாம்.
- இது முழுக்க முழுக்க விருப்பம் சார்ந்தது மற்றும் கமுக்கமானது. எடுத்துக்காட்டாக, உங்கள் பரிமாற்றத்தை நீங்கள் வாங்கிய
- பொருட்களோடு சமரசப்படுத்த ஒரு வணிக நிறுவனத்திற்கு இது உதவலாம்.
-
TX ID
- இது உங்கள் பரிமாற்ற ID ஆகும். இதை நீங்கள் https://xmrchain.net/ போன்ற
- உங்கள் மொனேரொ தொகுப்பு சங்கிலி தேடலறிஞரில் தெளிவற்றதாக்கப்பட்ட பரிமாற்றங்களை அடையாளம் காணப் பயன்படுத்தலாம்.
-
TX KEY (பரிமாற்ற திறவுகோல்)
- இது உங்கள் தனிப்பட்ட பரிமாற்ற திறவுகோலாகும். இதைப் பாதுகாப்பாக வைத்திருக்கவும். இது மூன்றாம் நபருக்குத் தெரிந்தால் வளையத்தில் உள்ள
- கையொப்பத்தில் எது உங்கள் கையொப்பம் என்பதைக் காட்டிக்கொடுத்துவிடும். இதனால் உங்கள் பரிமாற்றம் வெளிப்படையானதாகிவிடும்.
-
தொகுப்பு
- இது உங்கள் பரிமாற்றம் சேர்க்கப்பட்டுள்ள தொகுப்பாகும்.
- ]]>
-
- அனுப்பு
-
பெறுநரின் முகவரி
-
This is the public address of the wallet you are sending Moneroj to, you can copy this from
- your clipboard, scan a QR code or enter it manually. Make sure you triple check this to
- ensure you aren’t sending coins to the wrong address.
-
In addition to using an XMR address, you can also use
-
-
XMR அல்லது BTC க்கான ஓப்பன் அளியாஸ்
-
ஒரு BTC முகவரி
-
- Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai
- for details). See the section on sending BTC below.
-
BTC ஐ அனுப்புதல்
-
SideShift.ai
-
SideShift.ai is a third party service which acts as an exchange from Monero to Bitcoin.
- We use the SideShift.ai API to integrate Bitcoin payments into Monerujo. Please check out
- https://sideshift.ai and decide for yourself if this is something you want to use. The Monerujo
- Team is not associated with SideShift.ai and cannot help you with their service.
-
SideShift.ai Exchange Rate
-
On the \"Amount\" screen you will be shown the current parameters of the SideShift.ai service. These
- include the current exchange rate as well as upper and lower BTC limits. Note that this
- rate is not guaranteed at this point.
-
SideShift.ai Order
-
On the \"Confirm\" screen, you will see the actual SideShift.ai order. This order is valid for
- a limited time - you may notice a countdown on the \"Spend\" button. The exchange rate may
- be different to the indicative one shown on previous screens.
-
SideShift.ai Secret Key
-
Since Monerujo only handles the Monero part of your transaction your SideShift.ai secret key
- can be used to track the Bitcoin part of your order on the SideShift.ai homepage.
-
SideShift.ai Countdown!
-
Once the countdown reaches zero, you need to get a new quote from SideShift.ai by going back to the
- previous step and then coming back to the \"Confirm\" screen.
- ]]>
-
- BTC ஐ அனுப்புதல்
-
SideShift.ai
-
SideShift.ai is a third party service which acts as an exchange from Monero to Bitcoin.
- We use the SideShift.ai API to integrate Bitcoin payments into Monerujo. Please check out
- https://sideshift.ai and decide for yourself if this is something you want to use. The Monerujo
- Team is not associated with SideShift.ai and cannot help you with their service.
-
SideShift.ai Exchange Rate
-
On the \"Amount\" screen you will be shown the current parameters of the SideShift.ai service. These
- include the current exchange rate as well as upper and lower BTC limits. Note that this
- rate is not guaranteed at this point.
-
SideShift.ai Order
-
On the \"Confirm\" screen, you will see the actual SideShift.ai order. This order is valid for
- a limited time - you may notice a countdown on the \"Spend\" button. The exchange rate may
- be different to the indicative one shown on previous screens.
-
SideShift.ai Secret Key
-
Since Monerujo only handles the Monero part of your transaction your SideShift.ai secret key
- can be used to track the Bitcoin part of your order on the SideShift.ai homepage.
-
SideShift.ai Countdown!
-
Once the countdown reaches zero, you need to get a new quote from SideShift.ai by going back to the
- previous step and then coming back to the \"Confirm\" screen.
- ]]>
-
- பணப்பை
-
வீதி பயன்முறை
-
Street mode can be enabled/disabled in the menu or Gunther\'s head icon. In this mode, your
- balance is not shown on any screen so you can safely use your wallet on the street, a pub or
- other public place. Previous transactions are also hidden. New transactions will be shown, so
- you can see that you have sent/received sweet Moneroj!
-
வருடல்
- Because Monero likes to keep things private, every time you open a Monerujo wallet we have to
- scan the blockchain to see if any new Moneroj have been sent to your wallet, this only
- stores information to your phone which belongs to your wallet. Sometimes it can take a while
- because you haven’t synced in a long time.
-
இருப்பு
-
காப்பாற்றுங்கள்! எனது பணப்பை இருப்பு மறைந்துவிட்டது / உறுதிப்படுத்தப்படவில்லை எனக் காட்டுகிறது!
- Don’t panic! When you send funds from your wallet, some of your balance will temporarily show
- as unconfirmed.
- This happens as a result of how Monero is exchanged on the blockchain and how change works.
- Read more about change at https://getmonero.org/resources/moneropedia/change.html
-
பரிமாற்ற பட்டியல்
-
A list of the wallet transactions. In view wallets, only incoming transactions are shown.
- ]]>
-
- கணு
-
TL;DR
-
Refresh the nodes list by pulling down & bookmark 3–5 nodes to allow Monerujo
- to choose the best one for you!
-
கணு என்றால் என்ன?
-
Monerujo வானது, மொத்த தொகுப்பு சங்கிலியையும் பதிவிறக்கி ஒரு நகலை தனக்குள் சேமித்து வைப்பதற்கு பதிலாக,
- மொனேரொ வலையமைப்போடு தொடர்பு கொள்வதற்கு ஒரு தொலைநிலை கணுவை பயன்படுத்துகிறது
- (இதை சில நேரம் மறைநிரல் என்றும் அழைப்பார்கள்).
-
கணு பட்டியல்
-
If the list is empty, you can either add new nodes manually or let Monerujo
- scan the network for you. Or both. Read on…
-
The node list shows all currently known nodes. Additionally, the timestamp
- of the latest block known to each node is shown under the node name. An icon
- representing the node's response behaviour
- (which indicates the level of connectivity to be expected)
- is shown next to each node.
-
Any node in the list can be bookmarked for later use.
- Nodes which are not bookmarked will be forgotten.
-
Monerujo will choose the optimal bookmarked node each time you use it.
- It does this by checking the blockheight (how up-to-date
- is the node?) as well as the response behaviour (how fast does the node respond to requests?).
-
The list is sorted by these characteristics, so the top node would be the one Monerujo
- would choose right now. The bottom of the list would show very slow or unavailable nodes.
-
கணுவை சேர்க்க
-
கீழுள்ள "கணுவை சேர்" பொத்தானைத் தட்டிய பிறகு, கணு விவரங்களை உள்ளிடும்படி
- பின்வரும் உரையாடலில் கேட்டுக்கொள்ளப்படுவீர்.
- "முகவரி" என்பது கணுவின் புரவலன் பெயர் அல்லது IP முகவரியாகும் - இது மட்டும்தான் கட்டாயமாக
- நிரப்ப வேண்டிய ஒன்று.
- முன்னிருப்பு-அல்லாத துரையில் (எ.கா. 18089) கணு இயங்கினால் "துரை" ஐ உள்ளிடவும்.
- கணுவை பின்பு எளிதில் கண்டறிவதற்கு, நீங்கள் விரும்பினால் அதற்கு ஒரு பெயரைச் சூட்டலாம்.
- Some nodes require credentials to use them. Enter the provided username &
- password in the appropriate fields. Now you can "Test" these setting.
- The "Test Results" will display the blockheight, response time and actual IP used.
- The result may also be an error - usually because the hostname provided is
- not reachable in a sensible amount of time or the credentials are incorrect.
- Or the hostname/port combination does not point to an actual Monero Node!
- Once the test passes (no error) - you're set to press "OK" to save &
- bookmark this node.
-
கணுக்களுக்காக வருடவும்
-
கூடுதலாக, கணுக்களுக்காக நீங்கள் வலையமைப்பை வருடலாம். Monerujo வானது தொலைநிலை கணுக்களுக்காக
- வலையமைப்பில் துறை 18089 இல் வருடலைத் தொடங்கும். தொடக்கத்தில் இது மொனேரொ P2P வலையமைப்பில் உள்ள மற்ற
- தோழர்களுக்கான உங்கள் புத்தகக்குறியிட்ட கணுக்களைக் கேட்கும், பின் அந்த தோழர்களிடம் உள்ள மற்ற தோழர்களுக்கான
- புத்தகக்குறியிட்ட கணுக்கள் எனக் கேட்டுக்கொண்டே போகும். உங்களிடம் எந்த புத்தகக்குறியிட்ட கணுக்களும் இல்லையென்றால்
- (அல்லது அவை அவற்றின் தோழர்களைப் பற்றி நம்மிடம் எதையும் சொல்லவில்லையென்றால்), Monerujo வானது மொனேரொவில் வன்பொதியப்பட்டுள்ள
- மொனேரொ விதை கணுக்களிடம் நேராகச் சென்றுவிடும். மொத்தமாக 10 தொலைநிலை கணுக்களைக் கண்டறிந்த பின் வருடல் நின்றுவிடும்.
- ]]>
-
- பணம் செலுத்தல் தொடுப்பியை பயன்படுத்துதல்
-
ஒரு செலுத்தல் தொடுப்பியை கொண்டு நீங்கள் monerujo வை துவக்கி விட்டீர்கள். வைப்புகளை அனுப்ப, பின்வரும் செயல்களை செய்யவும்:
-
- 1. நீங்கள் செலவழிப்பதற்கு ஒரு பணப்பையை திறக்கவும்
- 2. பணப்பை ஒத்திசைவு முடிந்து "பெறு" பொத்தான் தோன்றும்வரை காத்திருக்கவும்
- 3. "பெறு" பொத்தானை தொடவும்
-
-
பணம் செலுத்தல் விவரங்கள் நிரப்பப்பட்டிருக்கும். அவற்றைச் சரிபார்த்த பின் மற்ற பரிமாற்றங்களைப் போலப் பணம் செலுத்தத் தொடரவும்.
- ]]>
-
- புரிந்தது!
-
- தேவையில்லை…
- ஆர்பாட் ஐ பெறு!
- TOR
-
TOR என்பது The Onion Router என்பதன் சுருக்கமாகும், இது பெயரிலி தொடர்பைச் செயல்படுத்துவதற்குப் பயன்படுத்தப்படும்
- ஒரு கட்டற்ற மற்றும் திறந்த மூல மென்பொருளாகும்.
-
TOR ஐ செயல்படுத்துவதன் மூலம் உங்கள் இணைப்பு பல்வேறு தொடர் ஓட்ட இணைப்புகளின் வழியாகச் சென்று
- கணுவிடமிருந்து உங்கள் IP முகவரியை மறைக்கிறது. இது மிகவும் பாதுகாப்பானது எனினும் மெதுவானதும் கூட என்பதை
- நினைவில் கொள்ளவும்.
-
Monerujo உடன் TOR ஐ சேர்த்துப் பயன்படுத்த, உங்கள் கைப்பேசியில் ஆர்பாட் நிறுவப்பட்டிருக்க வேண்டும். ஆர்பாட்டை நிறுவியவுடன்
- பணப்பை பட்டியல் திரையில் உள்ள வலையமைப்பு சின்னத்தைத் தட்டுவதன் மூலம் ஆர்பாட்டை செயல்படுத்துவதை உறுதிசெய்து கொள்ளவும்.
-
TOR உடன் இணைப்பதில் சிக்கல் ஏற்பட்டால், ஆர்பாட் செயலியில் ஒரு புதிய அடையாளத்தை பெற முயற்சிக்கவும்.
- (சின்னம் மேல் வலப்பக்கத்தில் உள்ளது).
- ]]>
-
- TOR கணு
-
இது ஒரு .onion கணுவாகும். இதை பயன்படுத்த நீங்கள் பணப்பை பட்டியல் பக்கத்தின் மேல் உள்ள
- சின்னத்தை தட்டி TOR பயன்முறையை செயல்படுத்தவும்.
- ]]>
-
diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
deleted file mode 100644
index c470f66..0000000
--- a/app/src/main/res/values-ta/strings.xml
+++ /dev/null
@@ -1,450 +0,0 @@
-]>
-
- பணப்பை
-
- எங்களைப் பற்றி
- தனியுரிமைக் கொள்கை
-
- பகிர்
- உதவி
- பெறு
- மறுபெயரிடு
- அழி
- காப்புநகலெடு
- கடவுச்சொற்றொடரை மாற்று
-
- தொடர்ந்து … ஐ தட்டச்சு செய்யவும்
- …, இதை அடிப்பதற்கா இவ்வளவு நேரம்
- இதைவிட சிறப்பாக உங்களால் செய்ய இயலும்!
- … ஐ அடித்து நெருங்கி வந்துவிட்டீர்கள்
- அருமை அருமை! இதல்லவா கடவுச்சொல்!
-
- பணப்பைகள்
- நன்றிகள்
- சரி
- நீங்கு
- மூடு
- விரிவான தகவல்
-
- வெற்றிகரமாக அனுப்பப்பட்டது
- முடிந்தது
-
- QR குறியீட்டிற்கு தொடவும்
-
- XMR-அல்லாத பணம் செலுத்தல் செயல்படுத்தப்பட்டுள்ளது, மேலும் விவரங்களுக்கு தட்டவும்.
- பேரேடு செயல்படுத்தப்பட்டுள்ளது, மேலும் விவரங்களுக்கு தட்டவும்.
-
- நீங்கள் %1$s முகவரியை உள்ளிட்டுள்ளீர்கள்.
- நீங்கள் XMR ஐ அனுப்புவீர்கள், SideShift.ai சேவையின் மூலம் பெறுநர் %1$s ஐ பெற்றுக்கொள்வார்.
- ]]>
-
- SideShift.ai அமைவி
-
- %1$s %2$s
-
- உறுதிப்படுத்தல் நிலுவையில் உள்ளது
- பணம் செலுத்தல் நிலுவையில் உள்ளது
- SideShift.ai பிழை (%1$s)
- %1$s அனுப்பப்பட்டது!
- … ஐ வினவுகிறது
-
- நீங்கள் %1$s — %2$s %4$s ஐ அனுப்பலாம்.
- SideShift.ai ஆனது %3$s %4$s/XMR என்னும் இப்போதைய மாற்று மதிப்பை உங்களுக்கு அளிக்கிறது.
- ]]>
-
- இருப்பு: %2$s %3$s (%1$s XMR)
-
- ✔ ஒருங்கிணைந்த பணம் செலுத்தல் ID
- உங்கள் பரிமாற்றத்தை தயார் செய்கிறது
-
- SideShift.ai அமைவியை உருவாக்குகிறது
- SideShift.ai அமைவியை வினவுகிறது
- மோனேரோ பரிமாற்றத்தை தயார் செய்கிறது
-
- SideShift.ai அளவுருக்களை வினவுகிறது
-
- SideShift.ai பிழை
- குறியீடு: %1$d
-
- மீண்டும் முயல தொடவும்
- இப்போது நாம் இங்கு மாட்டிக்கொண்டோம்!
- அச்சச்சோ, SideShift.ai இப்போது கிடைப்பதற்கு வாய்ப்பு இருப்பதாக தெரியவில்லையே!
-
- %1$s %3$s = %2$s XMR
- (விலை: %1$s %2$s/XMR)
-
- ஆதரவு & சுவடுபற்றிச் செல்லலுக்கு SideShift.ai பக்கத்தை பார்க்கவும்
- இரகசிய திறவுகோல்\nSideShift.ai
- SideShift.ai இரகசிய திறவுகோல்
- சேருமிட %1$s முகவரி
- தொகை
-
- பரிமாற்ற ID
- சேருமிட முகவரி
- குறிப்புகள்
-
- காப்புநகலெடுப்பு நடந்து கொண்டிருக்கிறது
- ஆவணகப்படுத்தல் நடந்து கொண்டிருக்கிறது
- மறுபெயரிடல் நடந்து கொண்டிருக்கிறது
- கடவுச்சொல் மாற்றம் நடந்து கொண்டிருக்கிறது
-
- செயல்கள் முடியும் தருவாயில் உள்ளன …\nஇது சற்று நேரம் எடுக்கலாம்!
-
- காப்புநகலெடுப்பு வெற்றியடைந்தது
- காப்புநகலெடுப்பு தோல்வியடைந்தது!
- அழித்தல் தோல்வியடைந்தது!
- மறுபெயரிடல் தோல்வியடைந்தது!
- கடவுச்சொல் மாற்றம் தோல்வியடைந்தது!
- கடவுச்சொல் மாற்றப்பட்டது
-
- வலையமைப்பு
- … பணப்பை ஏறுகிறது
- பணப்பை சேமிக்கப்பட்டது
- பணப்பை சேமித்தல் தோல்வியடைந்தது!
- … ஐ இணைக்கிறது
- கணு இணைப்பு தோல்வியடைந்தது!\nபயனர்பெயர்/கடவுச்சொல்லை சரிபார்க்கவும்
- கணு பதிப்பு ஒத்துபோகவில்லை - தயவுசெய்து இற்றைப்படுத்தவும்!
- செல்லாத கணு!\nமற்றொன்றை முயற்சிக்கவும்.
- கணுவை அணுக முடியவில்லை!\nமீண்டும் அல்லது மற்றொன்றை முயலவும்.
-
- துண்டிக்கப்பட்டது
-
- பரிமாற்றம் தோல்வியடைந்தது: %1$s
-
- நீங்கள் நீண்ட நேரமாக காத்திருக்கிறீர்கள், தோழரே!
-
- நான் இன்னும் உங்கள் கடைசி … பணப்பையோடு அலுவலாக இருக்கிறேன்
-
- %1$s ஐ மறுபெயரிடவும்
-
- %1$s ற்கான புதிய கடவுத்தொடர்
- %1$s ற்கான கடவுத்தொடரை மீண்டும் இடவும்
- %1$s ற்கான கடவுத்தொடர்
- நீங்கள் விரல்பதிவை பயன்படுத்தியும் பணப்பையை திறக்கலாம்.\nஉணரியை தொடவும்.
- … பணப்பை திறக்கப்படுகிறது
- விரல்பதிவு அடையாளம் கண்டுகொள்ளப்படவில்லை. மீண்டும் முயலவும்.
- தவறான கடவுச்சொல்!
- சேமிக்கப்பட்ட கடவுச்சொல் தவறாய் இருக்கிறது.\nதயவுசெய்து கடவுச்சொல்லை கைமுறையாக இடவும்.
- பணப்பை எதுவும் இல்லை!
- கணு அமைக்கப்பட வேண்டும்!
- தேர்ந்தெடுக்கப்பட்ட வலையோடு பணப்பை ஒத்துபோகவில்லை
-
- (காண மட்டும்)
-
- பெறு
- அனுப்பு
-
- + %1$s XMR உறுதிப்படுத்தப்படவில்லை
-
- monerujo சேவை
-
- ஒத்திசைக்கப்பட்டது:
- மீதமுள்ள தொகுதிகள்
- வருடுகிறது:
-
- புற சேமிப்பகம் எழுதக்கூடியதல்ல! பீதி அடையுங்கள்!
- நமக்கு கண்டிப்பாக அந்த புற சேமிப்பகத்தின் அனுமதிகள் தேவை!
- படமி இல்லையென்றால் QR வருடலும் இல்லை
-
- பார்வை திறவுகோல்
- பொது முகவரி
- திறவுகோல்
- பார்வை திறவுகோல் கிளிப்போர்டில் நகலெடுக்கப்பட்டது!
- திறவுகோல் கிளிப்போர்டில் நகலெடுக்கப்பட்டது!
- பணப்பை முகவரி கிளிப்போர்டில் நகலெடுக்கப்பட்டது!
- பரிமாற்ற ID கிளிப்போர்டில் நகலெடுக்கப்பட்டது!
- பாதுகாப்பு காரணங்களுக்காக நகலெடுத்தல் முடக்கப்பட்டுள்ளது!
-
- மாற்று மதிப்பை பெற முடியவில்லை!\nXMR/XMR ஐ பயன்படுத்தவும் அல்லது மீண்டும் முயலவும்
-
- பணப்பையை உருவாக்கு
- பணப்பை பெயர்
- பணப்பை கடவுத்தொடர்
- விரல்பதிவு மூலம் பணப்பையை திறப்பதை அனுமதிக்கவும்
- விரல்பதிவு சான்றளிப்பு
-
விரல்பதிவு சான்றளிப்பை செயல்படுத்துவதன் மூலம் உங்களால், கடவுச்சொல்லை இடாமலேயே பணப்பை இருப்பை பார்க்கவும்,
- பணத்தை பெறவும் இயலும்.
-
இருப்பினும் கூடுதல் பாதுகாப்பிற்காக, பணப்பை விவரங்களை பார்க்கும்போதும் அல்லது பணத்தை அனுப்பும்போதும்
- monerujo உங்களிடம் கடவுச்சொல்லை கேட்கும்.
- பாதுகாப்பு எச்சரிக்கை
-
இறுதியாக, உங்கள் விரல்பதிவை பெறவல்ல ஒருவரால் உங்கள் பணப்பை இருப்பினுள் எட்டி பார்க்க முடியும்
- என்பதை monerujo உங்களுக்கு நினைவு கூற விரும்புகிறது.
-
எடுத்துக்காட்டாக, தீயநோக்குடைய ஒரு பயனரால் நீங்கள் உறக்கத்தில் இருக்கும்போது உங்களுக்கு தெரியாமல் இந்த
- பணப்பையை திறந்து பார்க்க வாய்ப்புள்ளது.
- இந்த செயல்பாட்டை செயல்படுத்த நீங்கள் உறுதியாக உள்ளீர்களா?
- ]]>
- கடவுத்தொடர் ஒத்துப்போகவில்லை
- கடவுத்தொடர் காலியாக இருக்காது
- இப்போ நீ பணப்பையை உருவாக்கி தறப்போறிய இல்லயா!
- நினைவி விதையை நான் குறிப்பு எடுத்துக்கொண்டு விட்டேன்
-
- எனக்கு ஒரு பெயரை சூட்டவும்!
- பணப்பை இருக்கிறது!
- புள்ளியை கொண்டு துவங்க கூடாது.
- பணப்பை உருவாக்கப்படுகிறது
- பணப்பை உருவாக்கப்பட்டுவிட்டது
-
- எண் அல்லது தேதியை (வவவவ-மம-நாநா) உள்ளிடவும்
-
- திறவுகோல்
- புதிய
- விதை
- பார்வை
-
- பொது முகவரி
- பார்வை திறவுகோல்
- செலவழி திறவுகோல்
- 25-வார்த்தையுள்ள நினைவி விதை
- மீட்டமை அல்லது தேதி (வவவவ-மம-நாநா)
-
- பொது முகவரி
- பார்வை திறவுகோல்
- செலவழி திறவுகோல்
- நினைவி விதை
- பணப்பை கோப்புகள் மீட்டமை கடவுச்சொல்
-
- செல்லத்தக்க திறவுகோலை உள்ளிடவும்
- செல்லத்தக்க முகவரியை உள்ளிடவும்
- உங்கள் 25 வார்த்தை விதையை உள்ளிடவும்
-
- தனிபட்ட குறிப்புகள் (விரும்பினால்)
- உற்பத்தி செய்
- என் அருமை Moneroj வை செலவழிக்கவும்
- என் அருமை Moneroj (%1$s) வை செலவழிக்கவும்
- இது ஒரு QR குறியீடு இல்லை
- இது ஒரு செல்லத்தக்க செலுத்தல் QR குறியீடு இல்லை
- இது ஒரு செல்லத்தக்க முகவரி இல்லை
- ஒப்பன் அளியாஸ் முகவரி கிடைக்கவில்லை
- ஒப்பன் அளியாஸ் பாதுகாப்பு ✔
- ஒப்பன் அளியாஸை தீர்த்துக்கொண்டிருக்கிறத…
- DNSSEC இல்லாத ஒப்பன் அளியாஸ் - முகவரி ஏமாற்றப்பட்டிருக்கலாம்
- அனுப்பு
- இருப்பு: %1$s XMR
- முகவரி
- தொகை
- உறுதிசெய்
- முடிந்தது
-
- தொகை
- கட்டணம் (XMR)
- கட்டணம்
- மொத்தம் (XMR)
- மொத்தம்
-
- %1$s XMR
- +%1$s கட்டணம்
-
- பரிமாற்ற உருவாக்கல் பிழை
-
- கட்டணம் %1$s
- (%1$s)
- தோல்வியடைந்தது
- - %1$s
- + %1$s
-
- நேரமுத்திரை
- TX ID
- TX திறவுகோல்
- சேருமிடம்
- செலுத்தல் ID
- தொகுப்பு
- தொகை
- கட்டணம்
- பண மாற்றங்கள்
- குறிப்புகள்
- (விரும்பினால்)
- பரிமாற்ற விவரங்கள்
-
- நிலுவையில் உள்ளது
- தோல்வியடைந்துவிட்டது
-
- தொகை
- விளக்கம் (விரும்பினால்)
- பணப்பையை திறக்க இயலவில்லை!
-
- பெரும. %1$s
- சிறும. 0
- XMR ஒரு எண் இல்லை
-
- மறைமுகத் தரவு இப்போது காட்டப்படும்.\nஉங்க பின்னால் யாராவது இருக்குராங்களானு பாத்துக்கோங்க!
- நான் பாதுகாப்பாகத்தான் உள்ளேன்
- பின்செல்லவும்!
- விவரங்கள்
-
- இந்த பணப்பை அழிக்கப்பட உள்ளது. உங்கள் விதை அல்லது வேலை செய்யக்கூடிய காப்புநகல் உங்களிடம் இல்லையென்றால் உங்கள் வைப்பு மொத்தமா போயிவிடும்.
- ஆம், உறுதியாக அதை செய்!
- இல்லை வேண்டாம்!
-
- புதிய பணப்பையை உருவாக்கவும்
- பார்க்க-மட்டும் பணப்பையை மீட்டெடுக்கவும்
- தனியார் திறவுகோல்களை மூலம் பணப்பையை மீட்டெடுக்கவும்
- 25 வார்த்தை கொண்ட நினைவி விதையை கொண்டு பணப்பையை மீட்டெடுக்கவும்
-
- கணக்கை உருவாக்கு
- #%1$d என்னும் புதிய கணக்கு சேர்க்கப்பட்டது
- கணக்கு #
-
- உறுதிப்படுத்தப்பட்ட எல்லா வைப்புகளையும் இந்த கணக்கில் இருந்து அனுப்பவும்!
- துணை முகவரி
- பொது துணை முகவரி #%1$d: %2$s
-
- மொழி
- முறைமை மொழியை பயன்படுத்து
-
- பேரேடு நாநோ இல் இருந்து மீட்டெடுக்கவும்
-
- பேரேடு உடன் தொடர்பு கொள்கிறது
- பேரேடில் உறுதிப்படுத்தல் தேவைப்படுகிறது!
- துணை முகவரிகளை மீட்டெடுக்கிறது
- திறவுகோல்களை சரிபார்க்கிறது
- சிக்கலான கணக்குகளை போடுகிறது
- தற்சார்பு முகவரியாக்க செயல்கள்
- பேரேடு சாதனத்தை (மறு)இணைக்கவும்
-
- கணக்கை உருவாக்குகிறது
-
- %1$s இணைக்கப்பட்டது
- %1$s பிரிக்கப்பட்டது
-
- குறிச்சொல்லை எழுதுகிறது
- குறிச்சொல் எழுதல் தோல்வியடைந்தது!
- குறிச்சொல் எழுதல் வெற்றியடைந்தது
- குறிச்சொலானது NDEF ஐ ஆதரிக்கவில்லை!
- குறிச்சொல்லானது %1$d எண்ணுன்மிகளை அளிக்கிறது, ஆனால் நமக்கு %2$d தேவை!
- இந்த குறிச்சொல் எனக்கு புரியவில்லை!
- உனக்கு என்ன வேண்டும் என்று எனக்கு தெரியவில்லை!
- NFC கிடைக்கிறது!
-
- இரகசியங்களை காண்பி!
- வீதி பாங்கு
-
- Node-o-matiC செயல்படுத்தப்பட்டுள்ளது, மேலும் தகவல்களுக்கு தட்டவும்.
- கடைசி தொகுதி இற்றைப்படுத்தப்பட்டது: %1$s
- கணுக்கள்
- கணு பெயர் (விரும்பினால்)
- புரவலன் பெயர்
- துறை
- பயனர்பெயர் (விரும்பினால்)
- கடவுச்சொல் (விரும்பினால்)
- புரவலனை தீர்க்க முடியவில்லை
- இது நமக்கு தேவை!
- எண்வகையாகத் தான் இருக்க வேண்டும்
- 1–65535 ற்குள் ஒன்றாக இருக்க வேண்டும்
- கணுவை சேர்
- புதுப்பிப்பதற்கு தொடவும்!
- இணைப்பு பிழை %1$d
- இணைப்பு பிழை
- சான்றளிப்பு தோல்வியடைந்தது
- சோதணை முடிவுகள்:
- உயரம்: %1$s (v%2$d), பிங்: %3$.0fms, IP: %4$s
- IP ஐ சோதித்தல்: %1$s …
- தயவுசெய்து வருடல் முடியும்வரை காத்திருக்கவும்
- கணுக்களை தேர்ந்தெடுப்பதற்கு அல்லது சேர்ப்பதற்கு தொடவும்
- கணுக்களை கைமுறையாக அல்லது வருடல் மூலம் சேர்க்கவும்
- வலையமைப்பை வருடுகிறது…
- சிறந்த %1$d கணுக்களை தானியக்கமாக புத்தகக்குறியிடுகிறது
- சோதணை
-
- பெறுநர்
-
- எல்லாம்!
-
- பேரேடு விதையை மாற்று
- பேரேடு விதை வார்த்தைகள்
- பேரேடு கடவுத்தொடர் (மேம்பட்டது)
- செல்லாத பேரேடு விதை!
- உங்கள் பேரேடு விதையை இங்கே உள்ளிடுவது மிகவும் ஆபத்தானதாகும்!
-
- மீட்டமை உயரம்
-
- %1$s இல் மொனோரொ செயலியை துவக்கவும்
-
- மறுவருடல்!
-
- எனக்கு புரிந்து விட்டது!
- அடுத்து
- நான் தயாராக உள்ளேன்!
-
- Monerujo விற்கு உங்களை அன்புடன் வரவேற்கிறோம்!
- மொனேரொ பணப்பைகளை உருவாக்கவும், பயன்படுத்தவும் இந்த செயலி உங்களை அனுமதிக்கும். உங்கள் அருமை மொனேரொக்களை இதில் நீங்கள் சேமித்து வைக்கலாம்.
- விதையை பாதுகாப்பாக வைக்கவும்
- இந்த விதை அதை வைத்திருப்பவருக்கு முழு அணுகலை வழங்குகிறது. இதை நீங்கள் துலைத்து விட்டால், இதை மீட்க எங்களால் உங்களுக்கு உதவ இயலாது. உங்கள் மனம் கவர்ந்த மொனேரொக்களை இழக்க நேரிடும்.
- கிரிப்டோவை அனுப்பவும்
- Monerujo இனுள் SideShift.ai க்கான ஆதரவு உட்பொதிந்துள்ளது. வெறும் BTC, LTC, ETH, DASH அல்லது DOGE க்கான முகவரியை ஒட்டுவதன் மூலம் அல்லது வருடுவதன் மூலம் உங்களால் XMR ஐ செலவழித்து இந்தவகை கிரிப்டோக்களாக அனுப்ப இயலும்.
- கணுக்கள், இது உங்கள் வழி
- கணுக்கள் உங்களை மொனேரொ வலையமைப்போடு இணைக்கிறது. பொது கணுக்களை பயன்படுத்துகிறீர்களா அல்லது முழுவதுமாக உங்கள் சொந்த கணுவை பயன்படுத்த போகிறீர்களா என்பதை முடிவு செய்யவும்.
- விரல்பதிவை கொண்டு அனுப்பவும்
- இது செயல்படுத்தப்பட்டிருந்தால் வெறும் விரல்பதிவை கொண்டு உங்களால் XMR ஐ அனுப்ப இயலும். கடவுச்சொல்லை கோர, விரல்பதிவு அணுகலை முடக்கவும்.
-
- இருண்ட பாங்கு
-
- தானியக்கமாக
- பகல்
- இரவு
-
- இங்கு எதுவும் இல்லை\nதயவுசெய்து பணப்பையை உருவாக்கவும் அல்லது மீட்டெடுக்கவும்
-
- முன்னிருப்பு கணுக்களை மீட்டெடுக்கவும்
- மீட்டெடுப்பு ஏற்கனவே நடந்து கொண்டிருக்கிறது…
-
- கடைசி தொகுதி: %1$d வினாடிகளுக்கு முன்பு
- கடைசி தொகுதி: %1$d நிமிடங்களுக்கு முன்பு
- கடைசி தொகுதி: %1$d மணி நேரத்திற்கு முன்பு
- கடைசி தொகுதி: %1$d நாட்களுக்கு முன்பு
-
- விலைப்புள்ளியை பெற இயலவில்லை
- தொகையை சரிபார்த்து பின் மீண்டும் முயலவும்
-
- தெளிவிலா முகவரி.
- மேல் உள்ள வகையை தேர்ந்தெடுக்கவும்.
- ]]>
-
- %1$s முகவரியை உள்ளிடவும் அல்லது வருடவும்.
- நீங்கள் XMR ஐ அனுப்புவீர்கள், இது SideShift.ai சேவை மூலம் %2$s வாக பெறுநர் பெற்றுக்கொள்வார்.
- ]]>
-
- மொனேரொ முகவரியை உள்ளிடவும் அல்லது வருடவும்.
- ]]>
-
- துணை முகவரிகள்
- துணை முகவரியின் பெயர்
- நிறைய பயன்படுத்தாத முகவரிகள் - இன்னும் உருவாக்குவதை செயல்படுத்த சிலவற்றை பயன்படுத்தவும்!
- நிறைய பயன்படுத்தாத கணக்குகள் - இன்னும் உருவாக்குவதை செயல்படுத்த சிலவற்றை பயன்படுத்தவும்!
- இந்த துணை முகவரிக்கான பரிமாற்றங்கள்:
- இந்த துணை முகவரிக்கான பரிமாற்றங்கள் எதுவும் இன்னும் இல்லை
- துணை முகவரியை தேர்ந்தெடுக்கவும்
- விவரங்களுக்கு நீண்ட நேரம் அழுத்தி பிடித்திருக்கவும்
-
- பணப்பையை ஏற்றுமதி செய்யவும்
- பணப்பை ஏற்றுமதி தோல்வியடைந்தது!
-
- பணப்பையை மீள் அமைக்கவும்!
- இந்த பணப்பை எல்லா அணைவரி-சங்கிலி தரவுகளும் (குறிப்புகள், கணக்கு & துணை முகவரி பெயர்கள், தனியார் பரிமாற்ற திறவுகோல்கள் போன்றவை …) அழிக்கப்பட்டு மீள் அமைக்கப்படும்! பணப்பை பழுதடைந்தாலோ, அல்லது ஏறவில்லை என்றால் மட்டுமே இதை பயன்படுத்தவும்!
-
- Tor தேவைப்படுகிறது
- \u00A0கணுவிற்காக காத்திருக்கிறது\u00A0
- Tor ஐ பயன்படுத்தவும் Orbot அமைப்பில் உள்ள "பின்னனி துவக்கத்தை அனுமதிக்கவும்"!
- SideShift.ai ஆனது Tor ஐ ஆதரிப்பதில்லை.\nXMR ஐ இடமாற்ற Tor ஐ முடக்கவும்.
-
- விதை மறையீடு (சோதனைவழி)
- விதை ஈடுசெய் சொற்றொடர் (விரும்பினால்)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-uk/about.xml b/app/src/main/res/values-uk/about.xml
deleted file mode 100644
index 698fd60..0000000
--- a/app/src/main/res/values-uk/about.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
- Закрити
- Я monerujo
- Версія %1$s (%2$d)
-
- Подяка
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo et al.
-
- monerujo.io
- ]]>
-
- Політика конфіденційності
-
Дана сторінка містить інформацію, що стосується нашої політики щодо збору,
- використання і розкриття ваших особистих даних, які ми отримуємо
- від користувачів додатку (monerujo: Monero Wallet).
-
-
Використовуючи додаток, ви погоджуєтесь на збір і використання
- інформації відповідно до даної політики.
-
-
Зібрані дані
-
Особистими даними є будь-які дані, які дозволяють
- ідентифікувати вас як особистість.
-
Додаток локально збирає і обробляє ключі, і публічні адреси Monero
- з метою обробки транзакцій та їх передачі в мережу Monero в зашифрованій формі.
-
-
Додаток не збирає будь-яких інших особистих даних.
-
Якщо ви використовуєте функцію обміну (необов\'язково), monerujo отримує обмінний
- курс через публічний API coinmarketcap.com.
- Перейдіть за адресою https://coinmarketcap.com/privacy для отримання детальної
- інформації про те, як збираються ваші персональні дані в запитах.
-
Якщо ви використовуєте додаток для оплати за адресами BTC,
- ви будете використовувати сервіс SideShift.ai. Їх політика конфіденційності детально
- викладена на веб-сайті https://sideshift.ai/. Monerujo відправляє їм адресу
- призначення BTC і суму. Ваш IP також вказується.
-
Дозволи, необхідні додатку
-
-
INTERNET : Підключення до мережі Monero через демон-вузол.
-
READ_EXTERNAL_STORAGE : Зчитування файлів гаманця, які зберігаються на пристрої.
-
WRITE_EXTERNAL_STORAGE : Запис файлів гаманця, які зберігаються на пристрої.
-
WAKE_LOCK : Виведення пристрою з неактивного стану при синхронізації.
-
CAMERA : Сканування QR-кодів для отримання Monero.
-
-
Зміни в політиці конфіденційності
-
У дані положення політики конфіденційності періодично можуть
- вноситися зміни. У разі внесення таких змін, нові положення
- будуть опубліковані в додатку, і на вебсайті (www.monerujo.io).
- Рекомендується періодично перевіряти положення політики
- конфіденційності на предмет внесення змін.
-
Дата останнього оновлення положень політики конфіденційності: 10.11.2017
-
-
Контактна інформація
-
Якщо у вас виникли питання, що стосуються нашої політики конфіденційності
- або того, як відбувається збір і обробка ваших даних,
- напишіть нам за адресою privacy@monerujo.io
-
- ]]>
-
diff --git a/app/src/main/res/values-uk/help.xml b/app/src/main/res/values-uk/help.xml
deleted file mode 100644
index c968fea..0000000
--- a/app/src/main/res/values-uk/help.xml
+++ /dev/null
@@ -1,314 +0,0 @@
-
-
- Створити гаманець - Новий
-
Якщо вам потрібна нова адреса Monero!
-
Введіть унікальне і\'мя та пароль гаманця.
- Пароль використовується для захисту даних вашого гаманця на Android пристрої.
- Необхідно використовувати надійний пароль. Краще навіть використовувати фразу-пароль.
-
-
Запишіть вашу мнемонічну фразу!
-
Наступний екран буде містити вашу \"мнемонічну фразу\", що складається з 25 слів.
- Це єдині дані, які необхідні для відновлення вашого гаманця в
- майбутньому і отримання доступу до ваших коштів.
- Підтримувати її безпеку і конфіденційність дуже важливо, так як це
- гарантує, що ніхто не зможе отримати доступ до ваших коштів!
-
Якщо ви втратите пароль від вашого гаманця, ви зможете відновити його, використовуючи мнемонічну фразу.
-
Спосіб відновлення мнемонічної фрази відсутній. У разі її втрати - будуть втрачені
- і всі ваші кошти! Також ви ніколи не зможете змінити мнемонічну фразу, і якщо вона
- буде вкрадена або розкрита будь-яким іншим чином, то вам доведеться перенести ваші кошти
- в новий гаманець (з новою мнемонічною фразою). Тому рекомендується створити резервну копію
- вашої мнемонічною фрази, записавши її, і зберігати декілька копій в безпечному місці.
- ]]>
-
- Створити гаманець - Фраза
-
Що робити, якщо у вас вже є адреса Monero, і ви хочете відновити транзакції з блокчейну.
-
Необхідно ввести унікальні ім\'я і пароль гаманця. Пароль використовується для захисту даних вашого
- гаманця на пристрої. Необхідно використовувати надійний пароль. Краще навіть використовувати фразу-пароль.
-
Ввести фразу в поле \"Мнемонічна фраза\".
-
Якщо вам відомий номер блоку першої транзакції, який використовувався з цією адресою, слід
- ввести його в поле \"Відновити висоту\". Якщо ви не заповните це поле, то буде проскановано весь блокчейн,
- щоб знайти транзакції які належать вашій адресі, а це займе багато часу.
- ]]>
-
- Створити гаманець - Ключі
-
Якщо ви хочете відновити свій гаманець за допомогою ключів!
-
Необхідно ввести унікальні і\'мя і пароль гаманця. Пароль використовується для захисту даних вашого
- гаманця на пристрої. Необхідно використовувати надійний пароль. Краще навіть використовувати фразу-пароль.
-
Введіть вашу Monero адресу в поле \"Публічна адреса\", заповніть поле \"Ключ перегляду \" і \"Ключ витрати \".
-
Якщо вам відомий номер блоку першої транзакції, який використовувався з цією адресою, слід
- ввести його в поле \"Відновити висоту \". Якщо не заповнити це поле, то буде проскановано весь блокчейн,
- щоб знайти транзакції, що належать вашій адресі, а це займе багато часу.
- ]]>
-
- Створити гаманець - Перегляд
-
Якщо ви просто хочете переглядати вхідні транзакції в гаманці!
-
Необхідно ввести унікальні і\'мя і пароль гаманця. Пароль використовується для захисту даних вашого
- гаманця на пристрої. Необхідно використовувати надійний пароль. Краще навіть використовувати фразу-пароль.
-
Введіть вашу Monero адресу в поле \"Публічний адресу\", заповніть поле \"Ключ перегляду\".
-
Якщо вам відомий номер блоку першої транзакції, який використовувався з цією адресою, слід
- ввести його в поле \"Відновити висоту\". Якщо не заповнити це поле, то буде проскановано весь em> блокчейн,
- щоб знайти транзакції, що належать вашій адресі, а це займе багато часу.
- ]]>
-
- Реквізити гаманця
-
Публічна адреса
- Ваша публічна адреса подібна номеру вашого банківського рахунку, ви можете ділитися нею,
- не боячись втратити свої Monero. Monero відправлятимуть на ваш гаманець, використовуючи саме цю адресу.
-
Мнемонічна фраза
- Це єдині дані, які необхідні для відновлення вашого гаманця в майбутньому, і отримання
- доступу до ваших коштів. Підтримувати її безпеку і конфіденційність дуже важливо,
- так як це гарантує, що ніхто не зможе отримати доступ до ваших коштів!
- Якщо ви не записали цю фразу, і не зберегли її в безпечному місці, зробіть це негайно!
-
Файли відновлення паролю гаманця
- Слід переконатися в тому, що ви записали пароль. Якщо ви повернетеся до заводських налаштувань вашого
- пристрою або видалите додаток, він вам знадобиться для відновлення доступу до вашого гаманця.
-
CrAzYpass
- Якщо ви бачите пароль, який складається з 52 букв і цифр, розбитих на
- чотири групи - вітаємо! Файли вашого гаманця захищені 256-бітним ключем, який генерується
- з використанням функцій безпеки вашого пристрою і додатку, на основі обраної вами
- фрази-пароля (при створенні або при її зміні). Цей ключ зламати вкрай складно!
- Даний елемент обов:apos;язковий для недавно створених гаманців.
-
Застарілий пароль
- Якщо ви бачите тут вашу фразу-пароль, це означає, що файли вашого гаманця захищені не так надійно,
- як при використанні CrAzYpass. Щоб виправити становище, необхідно просто вибрати в меню \"Змінити пароль\".
- Після того, як нова фраза-пароль буде введена (можливо, та сама, що і була до цього),
- додаток згенерує CrAzYpass і таким чином захистить файли вашого гаманця. Запишіть її!
-
Гаманці із CrAzYpass
- Якщо вам коли-небудь знадобиться перевстановити Monerujo (наприклад, після зміни налаштувань вашого телефону
- або при появі у вас нового телефону), або ж вам захочеться використовувати файли вашого гаманця на
- іншому пристрої або ПК, ви зможете використовувати цей пароль відновлення, щоб знову отримати доступ до вашого гаманця.
- Для того щоб вибрати іншу фразу-пароль, необхідно вибрати \"Змінити пароль\" в меню.
- Слід пам\'ятати про те, що при цьому буде згенеровано новий пароль відновлення. Запишіть його!
-
Ключ перегляду
- Ваш ключ перегляду може використовуватися для перегляду вхідних транзакцій у ваш гаманець без дозволу
- на витрату коштів, що знаходяться у ньому.
-
Ключ витрати
- Ваш ключ витрати дозволяє будь-кому витратити Monero, пов\'язані з вашим гаманцем, тому не слід повідомляти
- кому-небудь цей ключ. Як і мнемонічну фразу, його слід тримати в безпечному місці.
- ]]>
-
- Перелік термінів
-
Віддалений вузол
-
Для зв\'язку з мережею Monero, без завантаження і збереження копії усього блокчейну, Monerujo використовує
- віддалений вузол. Список популярних віддалених вузлів і інформацію про те, як запустити власний
- віддалений вузол, можна знайти тут: https://moneroworld.com
-
Monerujo має деякі попередньо встановлені віддалені вузли. Також гаманець запам\'ятовує
- п\'ять останніх використаних вузлів.
-
Гаманці
-
Тут ви можете переглядати гаманці. Вони знаходяться в папці Monerujo на внутрішньому накопичувачі
- вашого пристрою. Щоб переглянути їх, можна використати файловий менеджер. Необхідно на
- регулярній основі створювати резервну копію цієї папки, для її зберігання поза межами пристрою, на той
- випадок, якщо пристрій буде пошкоджено або вкрадено.
-
Щоб відкрити гаманець, необхідно вибрати його, а щоб створити новий, слід
- натиснути \"+\". Або ж можна вибрати одну із зазначених операцій нижче.
-
Детальна інформація
-
Показати детальну інформацію по гаманцю, мнемонічній фразі, ключам.
-
Отримати
-
Створити QR-код для отримання Monero.
-
Перейменувати
-
Перейменувати гаманець. Резервні копії не перейменовуються.
-
Створити резервну копію
-
Створити копію гаманця в папці backups всередині Monerujo, переписавши попередні копії.
-
Архівувати
-
Створити резервну копію і після цього видалити гаманець. Копія залишається в папці backups.
- Якщо необхідність в резервних копіях відсутня, слід видалити їх, використовуючи файловий
- менеджер або додаток для безпечного видалення файлів.
- ]]>
-
- Деталі транзакції
-
Адреса призначення
- Це публічна адреса гаманця, на яку ви відправляєте Monero
-
PaymentID
- Ви можете використовувати Payment ID для ідентифікації причини, по якій Monero передається між
- двома сторонами. Це опційна і конфіденційна операція. Наприклад, вона дозволяє
- комерсантам звірити вашу транзакцію з товаром, який був придбаний вами.
-
TX ID
- Це ідентифікатор вашої транзакції (Transaction ID). Ви можете використовувати його для пошуку
- вашої транзакції через оглядач блокчейну Monero, наприклад, через цей:
- https://xmrchain.net/
-
TX KEY (Ключ транзакції)
- Це ваш приватний ключ транзакції. Його слід зберігати в безпечному місці, так як з його допомогою
- третя сторона може ідентифікувати ваш підпис в кільці, що зробить транзакцію прозорою.
-
Блок
- Номер блоку, в який була включена ваша транзакція.
- ]]>
-
- Відправлення
-
Адреса одержувача
-
Це публічна адреса гаманця, на яку ви відправляєте Monero. Ви можете скопіювати її
- з буфера, відсканувати QR-код або ввести вручну. Слід тричі перевірити правильність
- цієї адреси, щоб не відправити монети на хибну адресу.
-
In addition to using an XMR address, you can also use
-
-
an OpenAlias for XMR or BTC
-
a BTC address
-
- Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai
- for details). See the section on sending BTC below.
-
-
Відправлення BTC
-
SideShift.ai
-
SideShift.ai є стороннім сервісом, який допомагає здійснювати обмін Monero на Bitcoin.
- Ми використовуємо API служби SideShift.ai для включення платежів із впровадженням Bitcoin в Monerujo.
- Будь ласка, Відвідайте https://sideshift.ai, і виріште, чи хочете ви використовувати цю можливість.
- Команда Monerujo НЕ пов\'язана з SideShift.ai і не може допомогти вам в роботі з цією службою.
-
Курс обміну SideShift.ai
-
На екрані \"Сума\" відображаються поточні параметри служби SideShift.ai.
- Тут також відображається обмінний курс, верхня і нижня межа BTC. Необхідно відзначити,
- що на даному етапі курс не гарантується.
-
Заявка SideShift.ai
-
На екрані \"Підтвердження\" можна побачити заявку SideShift.ai. Це заявка
- дійсна протягом обмеженого часу. Зворотний відлік можна побачити на кнопці
- витрати \"Витрата\". Курс обміну може відрізнятися від того, що був показаний на попередніх екранах.
-
Секретний ключ SideShift.ai
-
Так як Monerujo відповідає за ту частину транзакції, яка пов$apos;язана з Monero, для відстеження
- вашого замовлення, яка пов$apos;язана з Bitcoin, можна використовувати секретний ключ на домашній сторінці
- SideShift.ai.
-
Зворотній відлік SideShift.ai
-
Як тільки зворотний відлік досягне нульової точки, вам знадобиться отримати від SideShift.ai нову
- заявку по обміну, повернувшись до попереднього кроку, а потім до екрану \"Підтвердження\".
- ]]>
-
- Відправлення BTC
-
SideShift.ai
-
SideShift.ai є стороннім сервісом, який допомагає здійснювати обмін Monero на Bitcoin.
- Ми використовуємо API служби SideShift.ai для включення платежів із впровадженням Bitcoin в Monerujo.
- Будь ласка, Відвідайте https://sideshift.ai, і виріште, чи хочете ви використовувати цю можливість.
- Команда Monerujo НЕ пов\'язана з SideShift.ai і не може допомогти вам в роботі з цією службою.
-
Курс обміну SideShift.ai
-
На екрані \"Сума\" відображаються поточні параметри служби SideShift.ai.
- Тут також відображається обмінний курс, верхня і нижня межа BTC. Необхідно відзначити,
- що на даному етапі курс не гарантується.
-
Заявка SideShift.ai
-
На екрані \"Підтвердження\" можна побачити заявку SideShift.ai. Це заявка
- дійсна протягом обмеженого часу. Зворотний відлік можна побачити на кнопці
- витрати \"Витрата\". Курс обміну може відрізнятися від того, що був показаний на попередніх екранах.
-
Секретний ключ SideShift.ai
-
Так як Monerujo відповідає за ту частину транзакції, яка пов$apos;язана з Monero, для відстеження
- вашого замовлення, яка пов$apos;язана з Bitcoin, можна використовувати секретний ключ на домашній сторінці
- SideShift.ai.
-
Зворотній відлік SideShift.ai
-
Як тільки зворотний відлік досягне нульової точки, вам знадобиться отримати від SideShift.ai нову
- заявку по обміну, повернувшись до попереднього кроку, а потім до екрану \"Підтвердження\".
- ]]>
-
- Створити Ledger гаманець
-
Якщо ви хочете відновити свій гаманець із Ledger Nano S.
-
Ваші секретні ключі ніколи не покинуть пристрій Ledger. Вам потрібен
- пристрій кожен раз, коли ви хочете отримати доступ до свого гаманця.
-
Необхідно ввести унікальні і&apos:мя і пароль гаманця. Пароль використовується для захисту даних вашого
- гаманця на пристрої. Необхідно використовувати надійний пароль. Краще навіть використовувати фразу-пароль.
-
Якщо вам відомий номер блоку першої транзакції, який використовувався з цією адресою, слід
- ввести його в поле \"Відновити висоту\". Ви також можете використовувати дату в форматі YYYY-MM-DD.
- Якщо ви не впевнені, введіть приблизну дату/висоту блоку до того, як ви вперше використали цей гаманець.
- ]]>
-
- Гаманець
-
Street Mode
-
Вуличний режим може бути ввімкнений/вимкнений в меню. В цьому режимі ваш баланс не буде відображатися на екрані,
- і ви зможете безпечно користуватися гаманцем на вулиці, в пабі або в іншому публічному місці.
- Попередні транзакції також приховані. Нові транзакції будуть відображені, таким чином ви будете бачити скільки ви
- відправили/отримали солоденьких Moneroj!
-
Сканування
- Оскільки Monero орієнтована на підтримку анонімності, кожний раз, коли ви відкриваєте гаманець Monerujo,
- нам доводиться сканувати блокчейн, щоб подивитися, чи були відправлені на ваш гаманець
- нові Monero. Інформація зберігається тільки на вашому телефоні, привязаному до вашого гаманця.
- Іноді це може зайняти деякий час, якщо ви не синхронізувалися протягом довгого періоду.
-
Баланс
-
Допоможіть! Баланс мого гаманця кудись зник або не підтверджений!
- Не панікуйте! Якщо ви відправляєте кошти з вашого гаманця, ваш баланс тимчасово залишається
- непідтвердженим. Це відбувається в результаті процесу обміну Monero в блокчейні, і роботи механізму
- решти. Подробиці обміну можна дізнатися за посиланням:
- https://getmonero.org/resources/moneropedia/change.html
-
Список транзакцій
-
Список транзакцій, проведених з використанням цього гаманця. У гаманцях перегляду можна побачити
- тільки вхідні транзакції.
- ]]>
-
- Вузли
-
НЕПОДУЖАВ, ЗАБАГАТО БУКВ!
-
Обновіть ваш список вузлів, потягнувши вниз в розділі & закладок 3–5 , щоб Monerujo
- міг вибрати найкращий вузол для вас!
-
Що таке віддалені вузли?
-
Monerujo використовує віддалені вузли (також їх ще називають Daemon), для зв\'язку з мережею
- Monero без необхідності завантажувати і зберігати копію всього блокчейну на на пристрої.
-
Список Вузлів
-
Якщо список пустий, можете добавити нові вузли вручну або дозволити Monerujo
- просканувати мережу. Можливі обидва варіанти. Детально…
-
Список вузлів показує усі доступні на даний момент вузли. Крім цього, відмітка часу
- останнього блоку відома кожному вузлу і відображається під іменем кожного вузла. Рядом з кожним вузлом
- відображається значок, який представляє поведінку відповіді вузла
- (вказує на рівень його підключення).
-
Будь-який вузол в списку може бути добавлений в закладки для подальшого використання. Вузли, які
- не добавлені в закладки, будуть забутими.
-
Monerujo буде вибирати оптимальний вузол із закладок кожний раз, коли ви використовуєте його.
- Він робить це, перевіряючи висоту блоку (наскільки актуальним являється вузол), а також поведінку відповіді
- (як швидко відповідає вузол на запити).
-
Список сортується по наступним характеристикам, верхній вузол буде тим, якому Monerujo віддасть найбільшу
- перевагу при підключенні. В нижній частині списку будуть відображатися повільні або недоступні вузли.
-
Додати Вузол
-
Натиснувши кнопку "Добавити Вузол" вам буде запропоновано ввести дані вузла в наступному діалогову вікні.
- "Адреса" ім\'я хоста або IP-адреса вузла - це єдиний обов\'язковий параметр.
- Введіть "Порт" якщо вузол працює на нестандартному порті (наприклад, 18089).
- Ви також можете задати ім\'я для вузла, це може допомоги при його пошуку в списку.
- Для використання деяких вузлів потрібні облікові дані. Введіть ім\'я користувача &
- і пароль у відповідних полях. Тепер ви можете "Провірити" ці налаштування.
- В "Результатах Перевірки" буде відображатися висота блоку, час відповіді і фактична IP-адреса.
- Також, результатом провірки може бути помилка, зазвичай тому, що введена адреса не відповіла в заданий час, або введені дані просто невірні.
- Або комбінація із адреси хоста/порта не вказує на фактичний вузол Monero!
- Після того, як тест буде завершено (без помилок), вам необхідно натиснути "OK" для збереження &
- даного вузла в закладках.
-
Сканування Вузлів
-
Крім цього, ви можете сканувати мережу на наявність вузлів. Monerujo почне сканування
- мережі на наявність віддалених вузлів через порт 18089. Процес починається з того, що Monerujo
- запитує у вузлів в адресній книзі інші адреси вузлів в P2P-мережі Monero, після чого продовжує, запитуючи вже у них інші однорангові вузли. І так далі.
- Якщо у вас немає вузлів в закладках (або вони не повертають вам дані відповіді), Monerujo перейде к вузлам Monero, які добавлені в код Monero.
- Сканування зупиниться, як тільки буде знайдено 10 віддалених вузлів.
- ]]>
-
- Використання плажіного посилання
-
Ви почали використовувати Monerujo з платіжним посиланням. Для надсилання коштів, будь ласка, виконайте найступне:
-
- 1. Відкрийте гаманець, з якого буде відбуватися трата коштів
- 2. Зачекайте, поки гаманець повністю синхронізується & появиться кпонка "Переказати"
- 3. Натисніть кнопку "Переказати"
-
-
Реквізити платежу будуть заповнені. Перевірте їх, та підтвердіть, як і будь-яку іншу транзакцію.
- ]]>
-
- Я зрозумів!
-
- Nah…
- Get Orbot!
- Tor
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
- ]]>
-
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
deleted file mode 100644
index c21145d..0000000
--- a/app/src/main/res/values-uk/strings.xml
+++ /dev/null
@@ -1,456 +0,0 @@
-
-
- Гаманець
-
- Про програму
- Політика конфіденційності
-
- Поділитися
- Допомога
- Отримати
- Перейменувати
- Резервна копія
- Змінити пароль
-
- Продовжуйте писати …
- Нічого видатного …
- Давай, ти можеш краще!
- Майже вийшло! …
- Відмінно! У кращих традиціях h4x0r!
-
- Гаманець
- Подяка
- Ok
- Відміна
- Закрити
- Додатковій інформації
-
- Успішно відправлено
- Готово
-
- Натисніть для використання QR-коду
-
- Доступні перекази в BTC, натисніть для доп. інформації
- Доступний Ledger, натисніть для доп. інформації
-
- Ви ввели %1$s адресу.
- Надсилайте XMR, одержувач отримає %1$s, використовуючи сервіс SideShift.ai
- ]]>
-
- Заявка SideShift.ai
-
- %1$s %2$s
-
-
- Очікування підтвердження
- Очікування платежу
- Помилка SideShift.ai (%1$s)
- %1$s успішно відправлені!
- Запит …
-
- Ви можете відправити %1$s — %2$s %4$s.
- SideShift.ai встановлює курс обміну %3$s %4$s/XMRв даний момент.
- ]]>
-
- Баланс: %2$s %3$s (%1$s XMR)
-
- ✔ Інтегрований ID платежу
- Підготовка транзакції
-
- Створення заявки SideShift.ai
- Запит заявки SideShift.ai
- Підготовка транзакції Monero
-
- Запит параметрів SideShift.ai
-
- SideShift.ai ПОМИЛКА
- Код: %1$d
-
- Натисніть, щоб повторити спробу
- Тепер ми застрягли тут!
- Ой ой! Здається SideShift.ai недоступний в даний момент!
-
- %1$s %3$s = %2$s XMR
- (Курс: %1$s %2$s/XMR)
-
- Відвідайте SideShift.ai для отримання допомоги &
- Секретний ключ\nSideShift.ai
- SideShift.ai секретний ключ
- Адреса отримувача %1$s
- Сума
-
- ID транзакції
- Адреса призначення
- Примітка
-
- Виконується резервне копіювання
- Виконується архівування
- Виконується перейменування
- Виконується зміна паролю
-
- Для даної дії …\nМоже знадобитися деякий час!
-
- Резервне копіювання відбулося з помилкою!
- Перейменування відбулося з помилкою!
- Зміна паролю відбулася з помилкою!
- Зміну паролю виконано успішно
-
- Віддалений вузол
- Завантаження гаманця …
- Гаманець збережено
- Помилка збереження гаманця!
- Підключення …
- Помилка підключення до віддаленого вузла!\nПеревірте username/password
- Помилка віддаленого вузла!\nСпробуйте ще раз.
- Неможливо підключиться до віддаленого вузла!\nПопробуйте пізніше.
-
- Роз\'єднано
-
- Помилка транзакції: %1$s
-
- Ти надто довго чекав, друже!
-
- Я все ще зайнятий твоїм гаманцем …
-
- Перейменувати %1$s
-
- Новий пароль для %1$s
- Повторіть пароль для %1$s
- Пароль для %1$s
- Тепер ви можете відкрити гаманець за допомогою відбитка пальця.\nБудь ласка торкніться датчика.
- Відкриття гаманця…
- Відбиток пальця не розпізнається. Спробуйте ще раз.
- Невірний пароль!!
- Збережений пароль невірний.\nВведіть пароль вручну.
- Гаманця не існує!
- Повинна бути встановлена адреса віддаленого вузла!
- Гаманець не відповідає обраній мережі
-
- (Режим перегляду)
-
- Отримати
- Відправити
-
- + %1$s XMR непідтверджено
-
- Служба monerujo
-
- Синхронізовано:
- Блоків залишилось
- Проскановано:
-
- Зовнішнє сховище недоступне для запису! Ахтунг!
- Нам дійсно потрібні ці дозволи!
- Немає доступу до камери = Немає QR-сканування!
-
- Ключ перегляду
- Публічна адреса
- Ключ
- Ключ перегляду скопійовано в буфер обміну!
- Ключ скопійовано в буфер обміну!
- Адресу гаманця скопійовано в буфер обміну!
- ID транзакції скопійовано в буфер обміну!
- Копіювання недоступно з міркувань безпеки!
-
- Неможливо отримати курс обміну!\nВикористовуйте XMR/XMR або спробуйте ще раз
-
- Створити гаманець
- Ім\'я гаманця
- Пароль гаманця
- Дозволити відкрити гаманець за допомогою відбитка пальця
- Використання аутентифікації по відбитку пальця
-
З підтримкою аутентифікації по відбитку пальця, ви можете переглядати баланс і отримувати кошти
- без введення пароля.
-
Але для додаткової безпеки, monerujo попросить вас ввести пароль при
- перегляді деталей гаманця, або відправці коштів.
- Попередження системи безпеки
-
monerujo хоче нагадати вам, що кожен, хто може отримати ваш відбиток пальця, буде
- мати можливість, заглянути в баланс вашого гаманця.
-
Наприклад, зловмисник може заглянути в ваш гаманець, коли ви спите.
- Ви впевнені, що хочете включити цю функцію?
- ]]>
- Пароль не співпадає
- Пароль не може бути порожнім
- Зробіть мені вже гаманець!
- Я ввів мнемонічну фразу
-
- Придумай мені ім\'я!
- Такий гаманець існує!
- Не може починатися з .
- Створення гаманця
- Гаманець створено
-
- Введіть номер блоку або дату (YYYY-MM-DD)
-
- Ключ
- Новий
- Фраза
- Перегляд
-
- Публічна адреса
- Ключ перегляду
- Ключ витрати
- Мнемонічна фраза (25 слів)
- Відновити висоту або дату (YYYY-MM-DD)
-
- Публічна адреса
- Ключ перегляду
- Ключ витрати
- Мнемонічна фраза
- Дата висоти відновлення (YYYY-MM-DD)
-
- Введіть діючий ключ
- Введіть діючу адресу
- Введіть вашу мнемонічну фразу
-
- Персональна замітка (необов\'язково)
- Генерація
- Витратити мої солодкі Moneroj
- Витратити мої солодкі Moneroj (%1$s)
- Це не QR-код
- Неприпустимий платіж по QR-коду
- Неприпустима адреса
- Відправлення
- Баланс: %1$s XMR
- Адреса
- Сума
- Підтвердження
- Готово
-
- Сума
- Комісія (XMR)
- Комісія
- Всього (XMR)
- Всього
-
- %1$s XMR
- +%1$s Комісія
-
- Помилка створення транзакції
-
- Комісія %1$s
- (%1$s)
- Не вдалося
- - %1$s
- + %1$s
-
- Відмітка часу
- TX ID
- Ключ TX
- Адресат
- ID платежу
- Блок
- Сума
- Комісія
- Перекази
- Замітки
- (необов\'язково)
- Детально
-
- ОЧІКУВАННЯ
- ПОМИЛКА
-
- Сума
- Не вдалося відкрити гаманець!
-
- Max. %1$s
- Min. 0
- Не числове значення XMR
-
- Зараз будуть показані конфіденційні дані. Озирнись навколо!
- Я в безпеці
- Поверніть мене назад!
- Детальна інформація
-
- Цей гаманець буде знищено. Ваші кошти назавжди зникнуть, якщо у вас немає насіння або діючої резервної копії для його відновлення.
- Так, зроби це!
- Ні, дякую!
-
- Створити новий гаманець
- Відновити гаманець тільки для перегляду
- Відновити гаманець з ключів
- Відновити гаманець з мнемонічної фрази
-
- Створити обліковий запис
- Додати новий обліковий запис #%1$d
- Обліковий запис #
-
- Надіслати всі кошти на цей рахунок!
- Субадрес
- Публічна субадреса #%1$d: %2$s
-
- Мова
- Використовувати мову системи
-
- Відновлення з Ledger Nano
-
- Підключення до Ledger
- Необхідне підтвердження в Ledger!
- Отримання субадрес
- Провірка ключів
- Займаюся божевільною математикою
- Хешування матеріалів
- Підключіть (повторно підєднайте) пристрій Ledger
-
- Створення облікового запису
-
- %1$s підєднаний
- %1$s відєднаний
-
- Запис мітки
- Помилка запису мітки!
- Успішний запис мітки
- Мітка не підтримує NDEF!
- Мітка надає %1$d байт, але нам потрібно %2$d!
- Я не розумію цю мітку!
- Я не знаю, що ти хочеш!
- NFC доступний!
-
- Опис (необов\'язково)
-
- Адреса OpenAlias недоступна
- OpenAlias безпечний ✔
- Дозволи OpenAlias…
- OpenAlias без DNSSEC - адреса може бути підмінена
-
- Версія вузла несумісна - будь ласка обновіть!
-
- Інформация
- Вуличний Режим
-
- Node-o-matiC включений, натисніть щоб отримати більше інформації.
- Останній блок: %1$s
- Вузли
- Ім\'я вузла (опційно)
- Ім\'я хоста
- Порт
- Ім\'я користувача (опційно)
- Пароль (опційно)
- Не вдається підключитися до вузлу
- Нам це потрібно!
- Повинно бути число
- Повинно бути 1–65535
- Добавити вузол
- Натисніть, щоб обновити!
- ПОМИЛКА З\'ЄДНАННЯ %1$d
- ПОМИЛКА З\'ЄДНАННЯ
- ПОМИЛКА АУТЕНТИФІКАЦІЇ
- Результат Тестування:
- Висота: %1$s (v%2$d), Пінг: %3$.0fms, IP: %4$s
- Тестування IP: %1$s …
- Будь ласка, дочекайтеся закінчення сканування
- Натисніть, щоб вибрати або додати вузли
- Добавте вузли вручну або потягніть вниз для сканування
- Сканування мережі…
- Автоматично відмічені кращі %1$d вузли
- Провірка
-
- Резервне копіювання успішне
-
-
- Отримувач
-
- ВСЕ!
-
- Конвертувати фразу Ledger
- Словесна фраза Ledger
- Пароль Ledger (необов\'язково)
- Помилка Ledger фрази!
- Вводячи сюди Ledger фразу являється серйозною загрозою для вашої безпеки!
-
- Відновити висоту
-
- Запуск Monero додатку через %1$s
-
- Rescan!
-
- I get it!
- Next
- I\'m ready!
-
- Welcome to Monerujo!
- This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.
- Keep your seed safe
- The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.
- Send Crypto
- Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.
- Nodes, your way
- Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.
- Send with fingerprint
- You\'re now able to send XMR with just your fingerprint if you enabled it. To request the password, just disable fingerprint access.
-
- Dark Mode
-
- Auto
- Day
- Night
-
- There is nothing here\nPlease create or restore a wallet
-
- Restore default nodes
- Restoring already in progress…
-
- Last Block: %1$d seconds ago
- Last Block: %1$d minutes ago
- Last Block: %1$d hours ago
- Last Block: %1$d days ago
-
- Cannot get quote
- Check amount and try again
-
- Ambiguous address.
- Please select the type above.
- ]]>
-
- Please enter or scan a %1$s address.
- You'll send XMR and the receiver will get %2$s using the SideShift.ai service.
- ]]>
-
- Please enter or scan a Monero address.
- ]]>
-
- Subaddresses
- Subaddress Name
- Too many unused addresses - use some to enable creating more!
- Too many unused accounts - use some to enable creating more!
- Transactions for this subaddress:
- No transactions for this subaddress yet
- Select a subaddress
- Long-press for details
-
- Delete
- Delete failed!
-
- Import wallet
- Import failed!
-
- Reset wallet!
- This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, …)! Use this ONLY if this wallet is corrupt and does not load!
-
- Tor required
- \u00A0WAITING FOR NODE\u00A0
- "Allow Background Starts" in Orbot Settings to use Tor!
- SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.
-
- Seed encryption (EXPERIMENTAL)
- Seed Offset Phrase (optional)
-
- Settings
- Interface
- Information
- Day / Night
-
- Style
-
- Classic
- Baldaŭ
-
-
- Failed to create QR for sharing!
-
diff --git a/app/src/main/res/values-zh-rCN/about.xml b/app/src/main/res/values-zh-rCN/about.xml
deleted file mode 100644
index 6832d17..0000000
--- a/app/src/main/res/values-zh-rCN/about.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
- 关闭
- 我是 monerujo
- 版本 %1$s (%2$d)
-
- 感谢
-
- m2049r, baltsar777, anhdres, keejef,
- rehrar, EarlOfEgo et al.
-
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.
Tor, short for The Onion Router, is free and open-source software for enabling anonymous
- communication.
-
Enabling Tor will route your connection through several relays and hide your IP address
- from the node. Keep in mind this is more private but also slower.
-
In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
- installing Orbot, make sure to enable it by clicking the network icon on the wallet list
- screen.
-
If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
- on the top right).
- ]]>
-
- Tor Node
-
This is an .onion node. In order to use it, you must enable Tor mode by touching the
- icon near the top of the Wallet List page.