1
mirror of https://github.com/m2049r/xmrwallet synced 2025-09-04 00:53:36 +02:00

Compare commits

...

10 Commits

Author SHA1 Message Date
m2049r
a4b9a7c6fb fix spend amount & new version (#635) 2019-11-10 15:23:33 +01:00
m2049r
9f01155cb7 v1.12.1 2019-11-10 12:14:52 +01:00
m2049r
08e8a48138 scan only for 0.15 nodes (#634) 2019-11-10 12:13:06 +01:00
m2049r
551c3b9fb6 scan only for 0.15 nodes (#633) 2019-11-10 12:11:01 +01:00
m2049r
2258cb7096 v1.12.0 (#632) 2019-11-10 11:08:19 +01:00
m2049r
6d61841cf3 textfields are filled (#631) 2019-11-10 11:06:34 +01:00
m2049r
c65508d288 upgrade to monero v0.15 (#630) 2019-11-09 22:45:54 +01:00
m2049r
2c3f582672 paste bip70 (#621) 2019-09-22 10:09:18 +02:00
m2049r
f46ba75771 update gradle version (#614) 2019-08-16 19:07:12 +02:00
m2049r
0ce5f2b6ca create ExchangeEditText & use without numpad (#613) 2019-08-04 13:19:42 +02:00
56 changed files with 341 additions and 577 deletions

View File

@@ -155,6 +155,18 @@ add_library(net STATIC IMPORTED)
set_target_properties(net PROPERTIES IMPORTED_LOCATION
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libnet.a)
add_library(hardforks STATIC IMPORTED)
set_target_properties(hardforks PROPERTIES IMPORTED_LOCATION
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libhardforks.a)
add_library(randomx STATIC IMPORTED)
set_target_properties(randomx PROPERTIES IMPORTED_LOCATION
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/librandomx.a)
add_library(rpc_base STATIC IMPORTED)
set_target_properties(rpc_base PROPERTIES IMPORTED_LOCATION
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/librpc_base.a)
#############
# System
#############
@@ -188,6 +200,9 @@ target_link_libraries( monerujo
device_trezor
multisig
version
randomx
hardforks
rpc_base
boost_chrono
boost_date_time

View File

@@ -7,8 +7,8 @@ android {
applicationId "com.m2049r.xmrwallet"
minSdkVersion 21
targetSdkVersion 28
versionCode 183
versionName "1.11.13 'Chernushka'"
versionCode 193
versionName "1.12.3 'Caerbannog'"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {

View File

@@ -266,6 +266,7 @@ public class NodeFragment extends Fragment
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);
}

View File

@@ -235,8 +235,10 @@ public class NodeInfo extends Node {
String rpcVersion = json.getString("jsonrpc");
if (!RPC_VERSION.equals(rpcVersion))
return false;
final JSONObject header = json.getJSONObject(
"result").getJSONObject("block_header");
final JSONObject result = json.getJSONObject("result");
if (!result.has("credits")) // introduced in monero v0.15.0
return false;
final JSONObject header = result.getJSONObject("block_header");
height = header.getLong("height");
timestamp = header.getLong("timestamp");
majorVersion = header.getInt("major_version");

View File

@@ -140,28 +140,12 @@ public class SendAddressWizardFragment extends SendWizardFragment {
next = null;
} else {
// maybe a bip72 or 70 URI
String bip70 = PaymentProtocolHelper.getBip70(enteredAddress);
final String bip70 = PaymentProtocolHelper.getBip70(enteredAddress);
if (bip70 != null) {
// looks good - resolve through xmr.to
processBip70(bip70);
next = null;
} else if (checkAddress()) {
if (llPaymentId.getVisibility() == View.VISIBLE) {
next = etPaymentId;
} else {
next = etNotes;
}
}
}
if (next != null) {
final View focus = next;
etAddress.post(new Runnable() {
@Override
public void run() {
focus.requestFocus();
}
});
}
}
}
});
@@ -176,6 +160,7 @@ public class SendAddressWizardFragment extends SendWizardFragment {
Timber.d("isIntegratedAddress");
etPaymentId.getEditText().getText().clear();
llPaymentId.setVisibility(View.INVISIBLE);
etAddress.setError(getString(R.string.info_paymentid_integrated));
tvPaymentIdIntegrated.setVisibility(View.VISIBLE);
llXmrTo.setVisibility(View.INVISIBLE);
sendListener.setMode(SendFragment.Mode.XMR);
@@ -208,10 +193,21 @@ public class SendAddressWizardFragment extends SendWizardFragment {
if (clip == null) return;
// clean it up
final String address = clip.replaceAll("[^0-9A-Z-a-z]", "");
if (Wallet.isAddressValid(address) || BitcoinAddressValidator.validate(address))
etAddress.getEditText().setText(address);
else
Toast.makeText(getActivity(), getString(R.string.send_address_invalid), Toast.LENGTH_SHORT).show();
if (Wallet.isAddressValid(address) || BitcoinAddressValidator.validate(address)) {
final EditText et = etAddress.getEditText();
et.setText(address);
et.setSelection(et.getText().length());
etAddress.requestFocus();
} else {
final String bip70 = PaymentProtocolHelper.getBip70(clip);
if (bip70 != null) {
final EditText et = etAddress.getEditText();
et.setText(clip);
et.setSelection(et.getText().length());
processBip70(bip70);
} else
Toast.makeText(getActivity(), getString(R.string.send_address_invalid), Toast.LENGTH_SHORT).show();
}
}
});
@@ -248,7 +244,10 @@ public class SendAddressWizardFragment extends SendWizardFragment {
bPaymentId.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
etPaymentId.getEditText().setText((Wallet.generatePaymentId()));
final EditText et = etPaymentId.getEditText();
et.setText((Wallet.generatePaymentId()));
et.setSelection(et.getText().length());
etPaymentId.requestFocus();
}
});
@@ -259,7 +258,6 @@ public class SendAddressWizardFragment extends SendWizardFragment {
if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
|| (actionId == EditorInfo.IME_ACTION_DONE)) {
etDummy.requestFocus();
Helper.hideKeyboard(getActivity());
return true;
}
return false;
@@ -277,7 +275,6 @@ public class SendAddressWizardFragment extends SendWizardFragment {
etDummy = view.findViewById(R.id.etDummy);
etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
etDummy.requestFocus();
Helper.hideKeyboard(getActivity());
View tvNfc = view.findViewById(R.id.tvNfc);
NfcManager manager = (NfcManager) getContext().getSystemService(Context.NFC_SERVICE);
@@ -551,7 +548,6 @@ public class SendAddressWizardFragment extends SendWizardFragment {
public void onResumeFragment() {
super.onResumeFragment();
Timber.d("onResumeFragment()");
Helper.hideKeyboard(getActivity());
etDummy.requestFocus();
}

View File

@@ -21,8 +21,6 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.m2049r.xmrwallet.R;
@@ -30,8 +28,7 @@ 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.ExchangeTextView;
import com.m2049r.xmrwallet.widget.NumberPadView;
import com.m2049r.xmrwallet.widget.ExchangeEditText;
import timber.log.Timber;
@@ -59,8 +56,7 @@ public class SendAmountWizardFragment extends SendWizardFragment {
}
private TextView tvFunds;
private ExchangeTextView evAmount;
private View llAmount;
private ExchangeEditText etAmount;
private View rlSweep;
private ImageButton ibSweep;
@@ -75,12 +71,9 @@ public class SendAmountWizardFragment extends SendWizardFragment {
View view = inflater.inflate(R.layout.fragment_send_amount, container, false);
tvFunds = view.findViewById(R.id.tvFunds);
evAmount = view.findViewById(R.id.evAmount);
((NumberPadView) view.findViewById(R.id.numberPad)).setListener(evAmount);
etAmount = view.findViewById(R.id.etAmount);
rlSweep = view.findViewById(R.id.rlSweep);
llAmount = view.findViewById(R.id.llAmount);
view.findViewById(R.id.ivSweep).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -97,8 +90,7 @@ public class SendAmountWizardFragment extends SendWizardFragment {
}
});
Helper.hideKeyboard(getActivity());
etAmount.requestFocus();
return view;
}
@@ -107,11 +99,11 @@ public class SendAmountWizardFragment extends SendWizardFragment {
private void sweepAll(boolean spendAllMode) {
if (spendAllMode) {
ibSweep.setVisibility(View.INVISIBLE);
llAmount.setVisibility(View.GONE);
etAmount.setVisibility(View.GONE);
rlSweep.setVisibility(View.VISIBLE);
} else {
ibSweep.setVisibility(View.VISIBLE);
llAmount.setVisibility(View.VISIBLE);
etAmount.setVisibility(View.VISIBLE);
rlSweep.setVisibility(View.GONE);
}
this.spendAllMode = spendAllMode;
@@ -124,12 +116,12 @@ public class SendAmountWizardFragment extends SendWizardFragment {
sendListener.getTxData().setAmount(Wallet.SWEEP_ALL);
}
} else {
if (!evAmount.validate(maxFunds)) {
if (!etAmount.validate(maxFunds)) {
return false;
}
if (sendListener != null) {
String xmr = evAmount.getAmount();
String xmr = etAmount.getAmount();
if (xmr != null) {
sendListener.getTxData().setAmount(Wallet.getAmountFromString(xmr));
} else {
@@ -146,7 +138,7 @@ public class SendAmountWizardFragment extends SendWizardFragment {
public void onResumeFragment() {
super.onResumeFragment();
Timber.d("onResumeFragment()");
Helper.hideKeyboard(getActivity());
Helper.showKeyboard(getActivity());
final long funds = getTotalFunds();
maxFunds = 1.0 * funds / 1000000000000L;
if (!sendListener.getActivityCallback().isStreetMode()) {
@@ -157,10 +149,10 @@ public class SendAmountWizardFragment extends SendWizardFragment {
getString(R.string.unknown_amount)));
}
// getAmount is null if exchange is in progress
if ((evAmount.getAmount() != null) && evAmount.getAmount().isEmpty()) {
if ((etAmount.getAmount() != null) && etAmount.getAmount().isEmpty()) {
final BarcodeData data = sendListener.popBarcodeData();
if ((data != null) && (data.amount != null)) {
evAmount.setAmount(data.amount);
etAmount.setAmount(data.amount);
}
}
}

View File

@@ -31,8 +31,7 @@ import com.m2049r.xmrwallet.data.TxDataBtc;
import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.OkHttpHelper;
import com.m2049r.xmrwallet.widget.ExchangeBtcTextView;
import com.m2049r.xmrwallet.widget.NumberPadView;
import com.m2049r.xmrwallet.widget.ExchangeBtcEditText;
import com.m2049r.xmrwallet.widget.SendProgressView;
import com.m2049r.xmrwallet.xmrto.XmrToError;
import com.m2049r.xmrwallet.xmrto.XmrToException;
@@ -62,8 +61,7 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
}
private TextView tvFunds;
private ExchangeBtcTextView evAmount;
private NumberPadView numberPad;
private ExchangeBtcEditText etAmount;
private TextView tvXmrToParms;
private SendProgressView evParams;
@@ -86,24 +84,20 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
tvXmrToParms = view.findViewById(R.id.tvXmrToParms);
evAmount = view.findViewById(R.id.evAmount);
numberPad = view.findViewById(R.id.numberPad);
numberPad.setListener(evAmount);
Helper.hideKeyboard(getActivity());
etAmount = view.findViewById(R.id.etAmount);
etAmount.requestFocus();
return view;
}
@Override
public boolean onValidateFields() {
if (!evAmount.validate(maxBtc, minBtc)) {
if (!etAmount.validate(maxBtc, minBtc)) {
return false;
}
if (sendListener != null) {
TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
String btcString = evAmount.getAmount();
String btcString = etAmount.getAmount();
if (btcString != null) {
try {
double btc = Double.parseDouble(btcString);
@@ -122,10 +116,12 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
private void setBip70Mode() {
TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
if (txDataBtc.getBip70() != null) {
numberPad.setVisibility(View.INVISIBLE);
if (txDataBtc.getBip70() == null) {
etAmount.setEditable(true);
Helper.showKeyboard(getActivity());
} else {
numberPad.setVisibility(View.VISIBLE);
etAmount.setEditable(false);
Helper.hideKeyboard(getActivity());
}
}
@@ -141,7 +137,6 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
public void onResumeFragment() {
super.onResumeFragment();
Timber.d("onResumeFragment()");
Helper.hideKeyboard(getActivity());
final long funds = getTotalFunds();
if (!sendListener.getActivityCallback().isStreetMode()) {
tvFunds.setText(getString(R.string.send_available,
@@ -153,7 +148,7 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
final BarcodeData data = sendListener.popBarcodeData();
if (data != null) {
if (data.amount != null) {
evAmount.setAmount(data.amount);
etAmount.setAmount(data.amount);
}
}
setBip70Mode();
@@ -171,7 +166,7 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
getView().post(new Runnable() {
@Override
public void run() {
evAmount.setRate(1.0d / orderParameters.getPrice());
etAmount.setRate(1.0d / orderParameters.getPrice());
NumberFormat df = NumberFormat.getInstance(Locale.US);
df.setMaximumFractionDigits(6);
String min = df.format(orderParameters.getLowerLimit());
@@ -211,7 +206,7 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
}
private void processOrderParmsError(final Exception ex) {
evAmount.setRate(0);
etAmount.setRate(0);
orderParameters = null;
maxBtc = 0;
minBtc = 0;

View File

@@ -19,9 +19,12 @@
package com.m2049r.xmrwallet.widget;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
@@ -31,8 +34,7 @@ import com.m2049r.xmrwallet.util.Helper;
import timber.log.Timber;
public class ExchangeBtcTextView extends LinearLayout
implements NumberPadView.NumberPadListener {
public class ExchangeBtcEditText extends LinearLayout {
String btcAmount = null;
String xmrAmount = null;
@@ -67,7 +69,7 @@ public class ExchangeBtcTextView extends LinearLayout
}
void shakeAmountField() {
tvAmountA.startAnimation(Helper.getShakeAnimation(getContext()));
etAmountA.startAnimation(Helper.getShakeAnimation(getContext()));
}
void shakeExchangeField() {
@@ -86,31 +88,35 @@ public class ExchangeBtcTextView extends LinearLayout
public void setAmount(String btcAmount) {
this.btcAmount = btcAmount;
tvAmountA.setText(btcAmount);
etAmountA.setText(btcAmount);
xmrAmount = null;
exchange();
}
public void setEditable(boolean editable) {
etAmountA.setEnabled(editable);
}
public String getAmount() {
return btcAmount;
}
TextView tvAmountA;
EditText etAmountA;
TextView tvAmountB;
Spinner sCurrencyA;
Spinner sCurrencyB;
public ExchangeBtcTextView(Context context) {
public ExchangeBtcEditText(Context context) {
super(context);
initializeViews(context);
}
public ExchangeBtcTextView(Context context, AttributeSet attrs) {
public ExchangeBtcEditText(Context context, AttributeSet attrs) {
super(context, attrs);
initializeViews(context);
}
public ExchangeBtcTextView(Context context,
public ExchangeBtcEditText(Context context,
AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
@@ -125,13 +131,28 @@ public class ExchangeBtcTextView extends LinearLayout
private void initializeViews(Context context) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.view_exchange_btc_text, this);
inflater.inflate(R.layout.view_exchange_btc_edit, this);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
tvAmountA = findViewById(R.id.tvAmountA);
etAmountA = findViewById(R.id.etAmountA);
etAmountA.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
exchange();
}
@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);
@@ -146,12 +167,14 @@ public class ExchangeBtcTextView extends LinearLayout
new String[]{"XMR"});
sCurrencyB.setAdapter(xmrAdapter);
sCurrencyB.setEnabled(false);
etAmountA.setFocusable(true);
etAmountA.setFocusableInTouchMode(true);
}
double xmrBtcRate = 0;
public void exchange() {
btcAmount = tvAmountA.getText().toString();
btcAmount = etAmountA.getText().toString();
if (!btcAmount.isEmpty() && (xmrBtcRate > 0)) {
double xmr = xmrBtcRate * Double.parseDouble(btcAmount);
xmrAmount = Helper.getFormattedAmount(xmr, true);
@@ -161,38 +184,4 @@ public class ExchangeBtcTextView extends LinearLayout
tvAmountB.setText(getResources().getString(R.string.send_amount_btc_xmr, xmrAmount));
Timber.d("%s BTC =%f> %s XMR", btcAmount, xmrBtcRate, xmrAmount);
}
// deal with attached numpad
@Override
public void onDigitPressed(final int digit) {
tvAmountA.append(String.valueOf(digit));
exchange();
}
@Override
public void onPointPressed() {
//TODO locale?
if (tvAmountA.getText().toString().indexOf('.') == -1) {
if (tvAmountA.getText().toString().isEmpty()) {
tvAmountA.append("0");
}
tvAmountA.append(".");
}
}
@Override
public void onBackSpacePressed() {
String entry = tvAmountA.getText().toString();
int length = entry.length();
if (length > 0) {
tvAmountA.setText(entry.substring(0, entry.length() - 1));
exchange();
}
}
@Override
public void onClearAll() {
tvAmountA.setText(null);
exchange();
}
}

View File

@@ -21,11 +21,13 @@ 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.ImageButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
@@ -43,10 +45,7 @@ import java.util.Locale;
import timber.log.Timber;
public class ExchangeTextView extends LinearLayout
implements NumberPadView.NumberPadListener {
private static String MAX = "\u221E";
public class ExchangeEditText extends LinearLayout {
String xmrAmount = null;
String notXmrAmount = null;
@@ -89,7 +88,7 @@ public class ExchangeTextView extends LinearLayout
}
void shakeAmountField() {
tvAmountA.startAnimation(Helper.getShakeAnimation(getContext()));
etAmountA.startAnimation(Helper.getShakeAnimation(getContext()));
}
void shakeExchangeField() {
@@ -99,7 +98,7 @@ public class ExchangeTextView extends LinearLayout
public void setAmount(String xmrAmount) {
if (xmrAmount != null) {
setCurrencyA(0);
tvAmountA.setText(xmrAmount);
etAmountA.setText(xmrAmount);
setXmr(xmrAmount);
this.notXmrAmount = null;
doExchange();
@@ -114,7 +113,7 @@ public class ExchangeTextView extends LinearLayout
return xmrAmount;
}
TextView tvAmountA;
EditText etAmountA;
TextView tvAmountB;
Spinner sCurrencyA;
Spinner sCurrencyB;
@@ -146,17 +145,17 @@ public class ExchangeTextView extends LinearLayout
return sCurrencyB.getSelectedItemPosition();
}
public ExchangeTextView(Context context) {
public ExchangeEditText(Context context) {
super(context);
initializeViews(context);
}
public ExchangeTextView(Context context, AttributeSet attrs) {
public ExchangeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
initializeViews(context);
}
public ExchangeTextView(Context context,
public ExchangeEditText(Context context,
AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
@@ -171,13 +170,28 @@ public class ExchangeTextView extends LinearLayout
private void initializeViews(Context context) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.view_exchange_text, this);
inflater.inflate(R.layout.view_exchange_edit, this);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
tvAmountA = findViewById(R.id.tvAmountA);
etAmountA = findViewById(R.id.etAmountA);
etAmountA.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);
@@ -317,7 +331,7 @@ public class ExchangeTextView extends LinearLayout
boolean prepareExchange() {
Timber.d("prepareExchange()");
String enteredAmount = tvAmountA.getText().toString();
String enteredAmount = etAmountA.getText().toString();
if (!enteredAmount.isEmpty()) {
String cleanAmount = "";
if (getCurrencyA() == 0) {
@@ -426,37 +440,4 @@ public class ExchangeTextView extends LinearLayout
public void setOnFailedExchangeListener(OnFailedExchangeListener listener) {
onFailedExchangeListener = listener;
}
@Override
public void onDigitPressed(final int digit) {
tvAmountA.append(String.valueOf(digit));
doExchange();
}
@Override
public void onPointPressed() {
//TODO locale?
if (tvAmountA.getText().toString().indexOf('.') == -1) {
if (tvAmountA.getText().toString().isEmpty()) {
tvAmountA.append("0");
}
tvAmountA.append(".");
}
}
@Override
public void onBackSpacePressed() {
String entry = tvAmountA.getText().toString();
int length = entry.length();
if (length > 0) {
tvAmountA.setText(entry.substring(0, entry.length() - 1));
doExchange();
}
}
@Override
public void onClearAll() {
tvAmountA.setText(null);
doExchange();
}
}

View File

@@ -48,18 +48,9 @@ import java.util.Locale;
import timber.log.Timber;
// TODO combine this with ExchangeTextView
public class ExchangeView extends LinearLayout
implements NumberPadView.NumberPadListener {
public void enableSoftKeyboard(final boolean isEnabled) {
etAmount.getEditText().setShowSoftInputOnFocus(isEnabled);
}
public boolean focus() {
return etAmount.requestFocus();
}
public class ExchangeView extends LinearLayout {
String xmrAmount = null;
String notXmrAmount = null;
public void enable(boolean enable) {
etAmount.setEnabled(enable);
@@ -67,9 +58,6 @@ public class ExchangeView extends LinearLayout
sCurrencyB.setEnabled(enable);
}
String xmrAmount = null;
String notXmrAmount = null;
void setXmr(String xmr) {
xmrAmount = xmr;
if (onNewAmountListener != null) {
@@ -482,31 +470,4 @@ public class ExchangeView extends LinearLayout
public void setOnFailedExchangeListener(OnFailedExchangeListener listener) {
onFailedExchangeListener = listener;
}
@Override
public void onDigitPressed(final int digit) {
etAmount.getEditText().append(String.valueOf(digit));
}
@Override
public void onPointPressed() {
//TODO locale?
if (etAmount.getEditText().getText().toString().indexOf('.') == -1) {
etAmount.getEditText().append(".");
}
}
@Override
public void onBackSpacePressed() {
Editable editable = etAmount.getEditText().getText();
int length = editable.length();
if (length > 0) {
editable.delete(length - 1, length);
}
}
@Override
public void onClearAll() {
etAmount.getEditText().getText().clear();
}
}

View File

@@ -1,87 +0,0 @@
package com.m2049r.xmrwallet.widget;
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import com.m2049r.xmrwallet.R;
public class NumberPadView extends LinearLayout
implements View.OnClickListener, View.OnLongClickListener {
@Override
public void onClick(final View view) {
if (listener == null) {
throw new IllegalArgumentException("NumberPadListener has to be set, use setListener() to set it.");
}
switch (view.getId()) {
case R.id.numberPadPoint:
listener.onPointPressed();
break;
case R.id.numberPadBackSpace:
listener.onBackSpacePressed();
break;
default:
if (view.getTag() != null) {
listener.onDigitPressed(Integer.parseInt(view.getTag().toString()));
}
}
}
@Override
public boolean onLongClick(final View view) {
if (view.getId() == R.id.numberPadBackSpace) {
listener.onClearAll();
return true;
}
return false;
}
public void setListener(final NumberPadListener listener) {
this.listener = listener;
}
public interface NumberPadListener {
void onDigitPressed(final int digit);
void onBackSpacePressed();
void onPointPressed();
void onClearAll();
}
private NumberPadListener listener;
public NumberPadView(final Context context) {
this(context, null);
}
public NumberPadView(final Context context,
@Nullable final AttributeSet attrs) {
this(context, attrs, 0);
}
public NumberPadView(final Context context, @Nullable final AttributeSet attrs,
final int defStyleAttr) {
super(context, attrs, defStyleAttr);
final View view = View.inflate(context, R.layout.view_number_pad, this);
setOrientation(VERTICAL);
view.findViewById(R.id.numberPad0).setOnClickListener(this);
view.findViewById(R.id.numberPad1).setOnClickListener(this);
view.findViewById(R.id.numberPad2).setOnClickListener(this);
view.findViewById(R.id.numberPad3).setOnClickListener(this);
view.findViewById(R.id.numberPad4).setOnClickListener(this);
view.findViewById(R.id.numberPad5).setOnClickListener(this);
view.findViewById(R.id.numberPad6).setOnClickListener(this);
view.findViewById(R.id.numberPad7).setOnClickListener(this);
view.findViewById(R.id.numberPad8).setOnClickListener(this);
view.findViewById(R.id.numberPad9).setOnClickListener(this);
view.findViewById(R.id.numberPadPoint).setOnClickListener(this);
view.findViewById(R.id.numberPadBackSpace).setOnClickListener(this);
view.findViewById(R.id.numberPadBackSpace).setOnLongClickListener(this);
}
}

View File

@@ -18,11 +18,13 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etWalletName"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
app:counterEnabled="true"
app:counterMaxLength="20"
android:layout_marginEnd="4dp"
app:errorEnabled="true">
<android.support.design.widget.TextInputEditText
@@ -39,7 +41,9 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etWalletPassword"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="0dp"
android:layout_marginStart="4dp"
android:layout_height="wrap_content"
android:layout_weight="1">
@@ -78,6 +82,7 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etWalletMnemonic"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
@@ -95,6 +100,7 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etWalletAddress"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
@@ -115,6 +121,7 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etWalletViewKey"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
@@ -134,6 +141,7 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etWalletSpendKey"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
@@ -153,6 +161,7 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etWalletRestoreHeight"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"

View File

@@ -84,16 +84,17 @@
android:id="@+id/evAmount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:orientation="vertical" />
<android.support.design.widget.TextInputLayout
android:id="@+id/etNotes"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
<android.support.design.widget.TextInputEditText
style="@style/MoneroEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -101,7 +102,6 @@
android:imeOptions="actionDone"
android:inputType="textMultiLine"
android:textAlignment="textStart" />
</android.support.design.widget.TextInputLayout>
<RelativeLayout
@@ -128,8 +128,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:drawablePadding="4dp"
android:drawableStart="@drawable/ic_info_outline_gray_24dp"
android:drawablePadding="4dp"
android:text="@string/label_receive_info_gen_qr_code"
android:textAlignment="center"
android:textSize="16sp"
@@ -149,8 +149,8 @@
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:drawablePadding="8dp"
android:drawableStart="@drawable/ic_nfc_black_24dp"
android:drawablePadding="8dp"
android:gravity="center"
android:text="@string/nfc_tag_tap"
android:visibility="visible" />

View File

@@ -29,6 +29,7 @@
android:orientation="horizontal">
<android.support.design.widget.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:id="@+id/etAddress"
android:layout_width="0dp"
android:layout_height="wrap_content"
@@ -75,7 +76,7 @@
android:drawableStart="@drawable/ic_check_gray_24dp"
android:drawablePadding="8dp"
android:gravity="center"
android:text="@string/info_paymentid_intergrated"
android:text="@string/info_paymentid_integrated"
android:textSize="18sp"
android:visibility="invisible" />
@@ -118,6 +119,7 @@
android:visibility="visible">
<android.support.design.widget.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:id="@+id/etPaymentId"
android:layout_width="0dp"
android:layout_height="wrap_content"
@@ -153,11 +155,12 @@
</FrameLayout>
<android.support.design.widget.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:id="@+id/etNotes"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
<android.support.design.widget.TextInputEditText
style="@style/MoneroEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@@ -27,35 +27,19 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:paddingEnd="12dp"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:src="@drawable/ic_all_inclusive_24dp"
android:visibility="visible" />
</RelativeLayout>
<LinearLayout
android:id="@+id/llAmount"
<com.m2049r.xmrwallet.widget.ExchangeEditText
android:id="@+id/etAmount"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:visibility="visible">
<com.m2049r.xmrwallet.widget.ExchangeTextView
android:id="@+id/evAmount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginTop="16dp"
android:orientation="vertical" />
<com.m2049r.xmrwallet.widget.NumberPadView
android:id="@+id/numberPad"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:gravity="center" />
</LinearLayout>
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:orientation="vertical" />
<RelativeLayout
android:id="@+id/rlSweep"

View File

@@ -53,19 +53,11 @@
</LinearLayout>
</FrameLayout>
<com.m2049r.xmrwallet.widget.ExchangeBtcTextView
android:id="@+id/evAmount"
<com.m2049r.xmrwallet.widget.ExchangeBtcEditText
android:id="@+id/etAmount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginTop="16dp"
android:orientation="vertical" />
<com.m2049r.xmrwallet.widget.NumberPadView
android:id="@+id/numberPad"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:gravity="center" />
</LinearLayout>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -225,14 +226,20 @@
android:padding="8sp"
android:text="@string/tx_notes" />
<EditText
android:id="@+id/etTxNotes"
style="@style/MoneroEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:backgroundTint="@color/moneroGray"
android:hint="@string/tx_notes_hint"
android:inputType="textMultiLine" />
<android.support.design.widget.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TextInputEditText
android:id="@+id/etTxNotes"
style="@style/MoneroEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/moneroGray"
android:hint="@string/tx_notes_hint"
android:inputType="textMultiLine" />
</android.support.design.widget.TextInputLayout>
</TableRow>
<TableRow>

View File

@@ -12,6 +12,7 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etWalletPasswordA"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:errorEnabled="true">
@@ -28,6 +29,7 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etWalletPasswordB"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/section_top"

View File

@@ -8,8 +8,8 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:orientation="vertical">
@@ -22,6 +22,7 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etNodeHost"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="8"
@@ -41,6 +42,7 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etNodePort"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
@@ -61,6 +63,7 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etNodeName"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/data_top">
@@ -85,6 +88,7 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etNodeUser"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1">
@@ -103,6 +107,7 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etNodePass"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1">
@@ -142,8 +147,8 @@
style="@style/MoneroText.Medium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:layout_alignBaseline="@+id/tvResultLabel"
android:layout_marginStart="4dp"
android:layout_toEndOf="@+id/tvResultLabel"
android:textAlignment="textStart"
tools:text="Blockheight: 1710998 (v9), Ping: 187ms" />

View File

@@ -20,12 +20,13 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:textColor="@color/colorAccent"
android:labelFor="@+id/etSeed"
android:text="@string/prompt_ledger_seed_warn" />
android:text="@string/prompt_ledger_seed_warn"
android:textColor="@color/colorAccent" />
<android.support.design.widget.TextInputLayout
android:id="@+id/etSeed"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:errorEnabled="true">
@@ -42,6 +43,7 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etPassphrase"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:errorEnabled="true">

View File

@@ -8,10 +8,11 @@
<android.support.design.widget.TextInputLayout
android:id="@+id/etPassword"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:passwordToggleEnabled="true"
app:errorEnabled="true">
app:errorEnabled="true"
app:passwordToggleEnabled="true">
<android.support.design.widget.TextInputEditText
style="@style/MoneroEdit"

View File

@@ -1,25 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="8dp" >
android:padding="8dp">
<TextView
android:id="@+id/tvRenameLabel"
style="@style/MoneroLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/prompt_rename"
android:labelFor="@+id/etRename"
android:text="@string/prompt_rename"
android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
android:id="@+id/etRename"
style="@style/MoneroEdit"
<android.support.design.widget.TextInputLayout
android:id="@+id/etPassword"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="normal"
android:inputType="text" />
android:layout_height="wrap_content">
<android.support.design.widget.TextInputEditText
android:id="@+id/etRename"
style="@style/MoneroEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="normal"
android:inputType="text" />
</android.support.design.widget.TextInputLayout>
</LinearLayout>

View File

@@ -21,6 +21,7 @@
<com.m2049r.xmrwallet.widget.CTextInputLayout
android:id="@+id/etAmount"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"

View File

@@ -17,19 +17,27 @@
android:gravity="center"
android:textAlignment="center" />
<TextView
android:id="@+id/tvAmountA"
style="@style/MoneroText.Balance.Orange"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center|start"
android:layout_marginStart="16dp"
android:layout_weight="3"
android:hint="@string/send_amount_hint"
android:padding="4dp"
android:singleLine="true"
tools:text="87.00000" />
<android.support.design.widget.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TextInputEditText
android:id="@+id/etAmountA"
style="@style/MoneroText.Balance.Orange"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center|start"
android:layout_marginStart="16dp"
android:layout_weight="3"
android:hint="@string/send_amount_hint"
android:imeOptions="actionDone"
android:inputType="numberDecimal"
android:padding="4dp"
android:singleLine="true"
android:textAlignment="textStart"
tools:text="87.00000" />
</android.support.design.widget.TextInputLayout>
</LinearLayout>
<LinearLayout

View File

@@ -18,19 +18,26 @@
android:gravity="center"
android:textAlignment="center" />
<TextView
android:id="@+id/tvAmountA"
style="@style/MoneroText.Balance.Orange"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center|start"
android:layout_marginStart="16dp"
android:layout_weight="3"
android:hint="@string/send_amount_hint"
android:padding="4dp"
android:singleLine="true"
tools:text="87.00000" />
<android.support.design.widget.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TextInputEditText
android:id="@+id/etAmountA"
style="@style/MoneroText.Balance.Orange"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center|start"
android:layout_marginStart="16dp"
android:layout_weight="3"
android:imeOptions="actionDone"
android:inputType="numberDecimal"
android:padding="4dp"
android:singleLine="true"
android:textAlignment="textStart"
tools:text="87.00000" />
</android.support.design.widget.TextInputLayout>
</LinearLayout>
<LinearLayout
@@ -57,7 +64,6 @@
android:layout_gravity="center|start"
android:layout_marginStart="16dp"
android:layout_weight="3"
android:hint="@string/send_amount_hint"
android:padding="4dp"
android:singleLine="true"
tools:text="87.00000" />
@@ -66,8 +72,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginEnd="0sp"
android:layout_marginStart="8sp">
android:layout_marginStart="8sp"
android:layout_marginEnd="0sp">
<ImageView
android:id="@+id/evExchange"

View File

@@ -1,144 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:showIn="LinearLayout">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center">
<TextView
android:id="@+id/numberPad1"
style="@style/MoneroLabel.NumPad"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:tag="1"
android:text="1" />
<TextView
android:id="@+id/numberPad2"
style="@style/MoneroLabel.NumPad"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:tag="2"
android:text="2" />
<TextView
android:id="@+id/numberPad3"
style="@style/MoneroLabel.NumPad"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:tag="3"
android:text="3" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center">
<TextView
android:id="@+id/numberPad4"
style="@style/MoneroLabel.NumPad"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:tag="4"
android:text="4" />
<TextView
android:id="@+id/numberPad5"
style="@style/MoneroLabel.NumPad"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:tag="5"
android:text="5" />
<TextView
android:id="@+id/numberPad6"
style="@style/MoneroLabel.NumPad"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:tag="6"
android:text="6" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center">
<TextView
android:id="@+id/numberPad7"
style="@style/MoneroLabel.NumPad"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:tag="7"
android:text="7" />
<TextView
android:id="@+id/numberPad8"
style="@style/MoneroLabel.NumPad"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:tag="8"
android:text="8" />
<TextView
android:id="@+id/numberPad9"
style="@style/MoneroLabel.NumPad"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:tag="9"
android:text="9" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center">
<TextView
android:id="@+id/numberPadPoint"
style="@style/MoneroLabel.NumPad"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="." />
<TextView
android:id="@+id/numberPad0"
style="@style/MoneroLabel.NumPad"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:tag="0"
android:text="0" />
<ImageView
android:id="@+id/numberPadBackSpace"
android:layout_width="0dp"
android:layout_height="36sp"
android:layout_gravity="center"
android:layout_weight="1"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_backspace_black_36dp" />
</LinearLayout>
</merge>

View File

@@ -19,19 +19,19 @@
         ús i divulgació de la informació personal que rebem dels usuaris de la nostra
         aplicació (monerujo: Monero Wallet).
</p>
<p>Mitjançant l'ús d'aquesta aplicació vostè accepta la recopilació i lús de la informació dacord amb aquesta política.
<p>Mitjançant lús daquesta aplicació vostè accepta la recopilació i lús de la informació dacord amb aquesta política.
</p>
<h2>Dades Recopilades</h2>
<p>Les dades personals són qualsevol tipus de dades que puguin identificar un individu.
</p>
<p>Les claus i les adreces públiques de Monero són recollides i processades per laplicació de forma local per tal de processar les transaccions i transmetre-les a la xarxa Monero de forma encriptada.
</p>
<p>L'aplicació no recopila altres dades personals.</p>
<p>Si utilitzeu la funcionalitat d'intercanvi (opcional), monerujo obté el canvi
<p>Laplicació no recopila altres dades personals.</p>
<p>Si utilitzeu la funcionalitat dintercanvi (opcional), monerujo obté el canvi
         a través de lAPI 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</p>
<p>Si utilitzeu laplicació per pagar a adreces BTC, utilitzareu el servei XMR.TO.
         Consulteu la seva política de privacitat a https://xmr.to/ 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.</p>
         Consulteu la seva política de privacitat a https://xmr.to/ per obtenir més informació. Monerujo els envia ladreça de destinació de BTC i la quantitat. La vostra IP també podrà ser recollida.</p>
<h2>Permisos de la App</h2>
<ul>
<li>INTERNET : Connectar a la xarxa Monero mitjançant un Node Daemon de Monero</li>

View File

@@ -10,7 +10,7 @@
         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 <em> qualsevol persona</em> tingui accés total als vostres fons!.</p>
<p>Si perdeu la contrasenya del portamonedes encara podrieu recuperar-lo amb la llavor Mnemotècnica.</p>
<p>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 <em> múltiple </em> llocs de forma segura.</p>
<p>La llavor Mnemotècnica tampoc no es pot canviar mai, i si és robada o compromesa dalguna 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 <em> múltiple </em> llocs de forma segura.</p>
]]></string>
<string name="help_create_seed"><![CDATA[
@@ -19,7 +19,7 @@
<p>Introduïu un nom i contrasenya únics del portamonedes.
         La contrasenya sutilitza per protegir les dades del seu portamonedes en el dispositiu. Utilitzeu una contrasenya sòlida - encara millor si utiliza una frase.</p>
<p>Introduïu la Llavor en el camp \"Llavor Mnemotècnica\".<p>
<p>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 <em> abans </em> d'haver fer servir aquesta adreça del portamonedes.</p>
<p>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 <em> abans </em> dhaver fer servir aquesta adreça del portamonedes.</p>
]]></string>
<string name="help_create_ledger"><![CDATA[
@@ -27,7 +27,7 @@
<p>Si voleu recuperar el vostre portamonedes desde un dispositiu Ledger Nano S!</p>
<p>Les vostres claus secretes no surten mai del dispositiu Ledger, de manera que necessiteu que estigui connectat sempre que vulgueu accedir aal vostre portamonedes.</p>
<p>Introduïu un nom i contrasenya únics del portamonedes. La contrasenya sutilitza per protegir les dades de la seva cartera al dispositiu Android. Utilitzeu una contrasenya sòlida - encara millor si utiliza una frase.</p>
<p>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 <em> abans </em> d'haver fer servir aquesta adreça del portamonedes.</p>
<p>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 <em> abans </em> dhaver fer servir aquesta adreça del portamonedes.</p>
]]></string>
<string name="help_create_keys"><![CDATA[
@@ -36,7 +36,7 @@
<p>Introduïu un nom i contrasenya únics del portamonedes. La contrasenya sutilitza per protegir les dades de la seva cartera al dispositiu. Utilitzeu una contrasenya sòlida - encara millor si utiliza una frase.<p>
<p>Introduïu la vostra Adreça Monero en el camp \"Adreça Pública\" i ompliu \"Clau de Visualització\" i \"Clau de Despesa\" </p>
<p>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 <em> abans </em> d'haver fer servir aquesta adreça del portamonedes.</p>
         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 <em> abans </em> dhaver fer servir aquesta adreça del portamonedes.</p>
]]></string>
<string name="help_create_view"><![CDATA[
@@ -44,7 +44,7 @@
<p>Si només voleu monitoritzar les transaccions entrants del portamonedes!</p>
<p>Introduïu un nom i contrasenya únics del portamonedes. La contrasenya sutilitza per protegir les dades de la seva cartera al dispositiu. Utilitzeu una contrasenya sòlida - encara millor si utiliza una frase.<p>
<p>Introduïu la vostra Adreça Monero en el camp \"Adreça Pública\" i ompliu \"Clau de Visualització\".</p>
<p>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 <em> abans </em> d'haver fer servir aquesta adreça del portamonedes.</p>
<p>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 <em> abans </em> dhaver fer servir aquesta adreça del portamonedes.</p>
]]></string>
<string name="help_details"><![CDATA[
@@ -54,14 +54,14 @@
<h2>Clau Mnemotècnica</h2>
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 <em> qualsevol persona</em> tingui accés total als vostres fons! Si no us heu escrit en cap lloc segur, feu-ho!
<h2>Contrasenya de Recuperació d'Arxius del Portamonedes</h2>
<h2>Contrasenya de Recuperació dArxius del Portamonedes</h2>
Assegureu-vos que heu escrit aquesta contrasenya. Si restabliu el dispositiu o desinstal·leu laplicació, la necessitarà per tornar a accedir al seu portamonedes.<br/>
<h3>CrAzYsenya</h3>
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!<br/>
Aquesta opció és obligatoria per a tots els nous portamonedes.
<h3>Contrasenya de Llegat</h3>
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) laplicació generarà una CrAzYsenya per a protegir els vostres arxius del portamonedes. Anoteu-la!
Si veieu la vostra contrasenya aquí, els fitxers del portamonedes no estan tan segurs com quan sutilitza la CrAzYsenya. Per solucionar-ho, seleccioneu \"Canviar Contrasenya\" des del menú. Després dentrar una nova contrasenya (potser fins i tot la mateixa que abans) laplicació generarà una CrAzYsenya per a protegir els vostres arxius del portamonedes. Anoteu-la!
<h3>CrAzYsenya del Portamonedes</h3>
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. <br/>
        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!
@@ -76,10 +76,10 @@
<h2>Node</h2>
<p>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/<p>
<p>Monerujo té alguns Nodes remots incorporats. Se'n recorda dels últims cinc nodes empleats.</p>
<p>Monerujo té alguns Nodes remots incorporats. Sen recorda dels últims cinc nodes empleats.</p>
<h2>Portamonedes</h2>
<p>Aquí podeu veure els portamonedes. Es troben a la carpeta <tt> monerujo </tt>
         dins lemmagatzematge intern del dispositiu. Podeu utilitzar una aplicació dexploració d'arxius per veure'ls. Haurieu de fer còpies de seguretat daquesta carpeta de manera regular en un emmagatzematge extern al dispositiu en cas que el vostre dispositiu exploti o el robin.</p>
         dins lemmagatzematge intern del dispositiu. Podeu utilitzar una aplicació dexploració darxius per veurels. Haurieu de fer còpies de seguretat daquesta carpeta de manera regular en un emmagatzematge extern al dispositiu en cas que el vostre dispositiu exploti o el robin.</p>
<p>Seleccioneu una portamonedes per obrir-lo o premeu el botó "+" per crear-ne un de nou.
         O seleccioneu una de les operacions del portamonedes:</p>
<h3>Detalls</h3>
@@ -92,13 +92,13 @@
<p>Feu una còpia del portamonedes en la carpeta <tt> backups </tt> dins del <tt> monerujo </tt>
         per a sobreescriure còpies anteriors.</p>
<h3>Arxiu</h3>
<p>Feu una còpia de seguretat i a continuació elimineu el portamonedes. La còpia es mantindrà a la carpeta <tt> backups </tt>. Si ja no necessiteu les vostres còpies de seguretat les haureu deliminar amb un explorador d'arxius o una aplicació segura.</p>
<p>Feu una còpia de seguretat i a continuació elimineu el portamonedes. La còpia es mantindrà a la carpeta <tt> backups </tt>. Si ja no necessiteu les vostres còpies de seguretat les haureu deliminar amb un explorador darxius o una aplicació segura.</p>
]]></string>
<string name="help_tx_details"><![CDATA[
<h1>Detalls de Transacció</h1>
<h2>Destí</h2>
Aquesta és l'adreça pública del portamonedes on esteu enviant els Monero.
Aquesta és ladreça pública del portamonedes on esteu enviant els Monero.
<h2>ID de Pagament</h2>
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.
<h2>ID de Transacció</h2>
@@ -112,7 +112,7 @@
<string name="help_send"><![CDATA[
<h1>Enviar</h1>
<h2>Adreça del Receptor</h2>
<p>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.</p>
<p>Aquesta és ladreç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.</p>
<p>A més dutilitzar una adreça XMR, també podeu utilitzar
<ul>
<li>un OpenAlias per XMR o BTC</li>
@@ -125,7 +125,7 @@
<h1>Enviant BTC</h1>
<h2>XMR.TO</h2>
<p>XMR.TO és un servei de tercers que fa proporciona el canvi de Monero a Bitcoin.
         Nosaltres fem servir l'API XMR.TO per integrar els pagaments de Bitcoin a Monerujo. Si us plau, doneu un cop d'ull a https://xmr.to i decidiu vosaltres mateixos si és una cosa que volgueu utilitzar. L'equip de Monerujo no està associat amb XMR.TO i no pot oferir assistència amb el seu servei.</p>
         Nosaltres fem servir lAPI XMR.TO per integrar els pagaments de Bitcoin a Monerujo. Si us plau, doneu un cop dull a https://xmr.to i decidiu vosaltres mateixos si és una cosa que volgueu utilitzar. Lequip de Monerujo no està associat amb XMR.TO i no pot oferir assistència amb el seu servei.</p>
<h2>Tipus de Canvi XMR.TO<h2>
<p>A la pantalla \"Quantitat\" es mostraran els paràmetres actuals del servei XMR.TO. 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. També veureu
@@ -147,7 +147,7 @@
<h1>Enviant BTC</h1>
<h2>XMR.TO</h2>
<p>XMR.TO és un servei de tercers que fa proporciona el canvi de Monero a Bitcoin.
         Nosaltres fem servir l'API XMR.TO per integrar els pagaments de Bitcoin a Monerujo. Si us plau, doneu un cop d'ull a https://xmr.to i decidiu vosaltres mateixos si és una cosa que volgueu utilitzar. L'equip de Monerujo no està associat amb XMR.TO i no pot oferir assistència amb el seu servei.</p>
         Nosaltres fem servir lAPI XMR.TO per integrar els pagaments de Bitcoin a Monerujo. Si us plau, doneu un cop dull a https://xmr.to i decidiu vosaltres mateixos si és una cosa que volgueu utilitzar. Lequip de Monerujo no està associat amb XMR.TO i no pot oferir assistència amb el seu servei.</p>
<h2>Tipus de Canvi XMR.TO<h2>
<p>A la pantalla \"Quantitat\" es mostraran els paràmetres actuals del servei XMR.TO. 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. També veureu
@@ -170,7 +170,7 @@
<h2>Mode de carrer</h2>
<p>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!</p>
<h2>Escanejant</h2>
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 sha sincronitzat en molt de temps.
Perquè a Monero li agrada mantenir les coses privades, cada cop que obri un portamonedes Monerujo hem descanejar la blockchain per veure si shan enviat nous moneroj al seu portamonedes. Això només emmagatzema linformació al telèfon que pertany al seu portamonedes. De vegades pot trigar una estona perquè no sha sincronitzat en molt de temps.
<h2>El Balanç</h2>
<p><b>Ajuda! El balanç del meu portamonedes ha desaparegut o consta com a no confirmat!</b><br/>
No patiu! Quan envieu fons desde el vostre portamonedes part del balanç apareixerà com a no confirmat de forma temporal.
@@ -199,8 +199,8 @@
         es mostra al costat de cada node.</p>
<p>Es pot marcar qualsevol node de la llista per utilitzar-lo més endevant.
         Es descartaràn els nodes que no hagin estat seleccionats.<p>
<p>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
<p>Monerujo escollirà el node òptim (marcat) cada vegada que lutilitzeu.
         Això ho fa mitjançant la comprovació de lalçada de bloc (com dactualitzat
         està el node?), així com el temps de resposta (què tan ràpidament respon el node a les peticions?).</p>
<p>La llista sordena 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.</p>
@@ -209,15 +209,15 @@
        que introduïu els detalls del node al següent diàleg.
        El &quot;Adreça&quot; és el nom del servidor o adreça IP del node - aquesta és la única
        entrada obligatòria.
        Introduïu el &quot;Port&quot; si el node s'executa en un port no predeterminat (per exemple, 18089).
        Introduïu el &quot;Port&quot; si el node sexecuta 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 dusuari i
        contrasenya proporcionats als camps corresponents. Ara podeu &quot;Test&quot; aquesta configuració.
        Els &quot;Resultats de les Proves&quot; mostraran l'alçada de bloc, el temps de resposta i l'IP real.
        Els &quot;Resultats de les Proves&quot; mostraran lalçada de bloc, el temps de resposta i lIP 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.
        accessible dins dun 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 &quot;D'acord&quot; per desar iamp;
        Un cop aprovada la prova (sense error), ja estás llest per prémer &quot;Dacord&quot; per desar iamp;
        marcar aquest node.</p>
<h2>Escanejar Nodes</h2>
<p>A més, podeu escanejar la xarxa per buscar nodes. Monerujo començarà

View File

@@ -58,7 +58,7 @@
<string name="send_available_btc">Balanç: %2$s BTC (%1$s XMR)</string>
<string name="info_paymentid_intergrated">ID de pagment integrat</string>
<string name="info_paymentid_integrated">&#x2714; ID de pagment integrat</string>
<string name="info_prepare_tx">Preparant la seva transacció</string>
<string name="label_send_progress_xmrto_create">Creant ordre XMR.TO</string>
@@ -170,14 +170,14 @@
<string name="generate_fingerprint_warn"><![CDATA[
<strong>Autenticació dempremta digitals</strong>
<p>Amb lautenticació dempremta digital habilitada podeu veure el balanç del portamonedes i rebre fons
         sense la necessitat d'introduir la contrasenya.</p>
         sense la necessitat dintroduir la contrasenya.</p>
<p>Per a més seguretat, monerujo encara us demanarà que introduïu la contrasenya per
         veure els detalls del portamonedes o enviar fons.</p>
<strong>Advertència de seguretat</strong>
<p>Finalment, monerujo vol recordar-li que qualsevol que pugui obtenir la seva empremta digital serà
         capaç dobservar el balanç del seu portamonedes.</p>
<p>Per exemple, un usuari maliciós del vostre voltant pot obrir la vostra cartera quan esteu dormint.</p>
<strong>Esteu segurs d'habilitar aquesta funcionalitat?</strong>
<strong>Esteu segurs dhabilitar aquesta funcionalitat?</strong>
]]></string>
<string name="generate_bad_passwordB">La contrasenya no coincideix</string>
<string name="generate_empty_passwordB">La contrasenya no pot estar buida</string>

View File

@@ -59,7 +59,7 @@
<string name="send_available_btc">Guthaben: %2$s BTC (%1$s XMR)</string>
<string name="info_paymentid_intergrated">Zahlungs-ID integriert</string>
<string name="info_paymentid_integrated">&#x2714; Zahlungs-ID integriert</string>
<string name="info_prepare_tx">Bereite deine Transaktion vor</string>
<string name="label_send_progress_xmrto_create">Erstelle XMR.TO-Auftrag</string>

View File

@@ -57,7 +57,7 @@
<string name="send_available_btc">Σύνολο: %2$s BTC (%1$s XMR)</string>
<string name="info_paymentid_intergrated">ID πληρωμής ενσωματωμένο</string>
<string name="info_paymentid_integrated">&#x2714; ID πληρωμής ενσωματωμένο</string>
<string name="info_prepare_tx">Προετοιμασία της συναλλαγής σου</string>
<string name="label_send_progress_xmrto_create">Δημιουργία εντολής με XMR.TO</string>

View File

@@ -58,7 +58,7 @@
<string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string>
<string name="info_paymentid_intergrated">Paga-ID integriĝis</string>
<string name="info_paymentid_integrated">&#x2714; Paga-ID integriĝis</string>
<string name="info_prepare_tx">Preparante vian transakcion</string>
<string name="label_send_progress_xmrto_create">Kreante mendon al XMR.TO</string>

Some files were not shown because too many files have changed in this diff Show More