From e39439453839f70840900b323adcd64419e6eccc Mon Sep 17 00:00:00 2001 From: m2049r Date: Fri, 14 Sep 2018 21:15:10 +0200 Subject: [PATCH] Description in QR Code (#401) * use notes in qr code * remove payment id on receive * prep translations --- .../com/m2049r/xmrwallet/ReceiveFragment.java | 64 +--- .../m2049r/xmrwallet/data/BarcodeData.java | 24 +- .../send/SendAddressWizardFragment.java | 36 ++- .../send/SendSettingsWizardFragment.java | 16 - app/src/main/res/layout/fragment_receive.xml | 49 +-- .../main/res/layout/fragment_send_address.xml | 284 ++++++++++-------- .../res/layout/fragment_send_settings.xml | 20 +- app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values-el/strings.xml | 2 + app/src/main/res/values-es/strings.xml | 2 + app/src/main/res/values-fr/strings.xml | 2 + app/src/main/res/values-hu/strings.xml | 2 + app/src/main/res/values-it/strings.xml | 2 + app/src/main/res/values-nb/strings.xml | 14 +- app/src/main/res/values-pt/strings.xml | 4 +- app/src/main/res/values-ro/strings.xml | 2 + app/src/main/res/values-ru/strings.xml | 2 + app/src/main/res/values-sk/strings.xml | 10 +- app/src/main/res/values-sv/strings.xml | 2 + app/src/main/res/values-zh-rCN/strings.xml | 2 + app/src/main/res/values-zh-rTW/strings.xml | 2 + app/src/main/res/values/strings.xml | 1 + 22 files changed, 267 insertions(+), 277 deletions(-) diff --git a/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java b/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java index 99c9f21..3b97f0f 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java @@ -20,15 +20,12 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; -import android.nfc.NfcAdapter; import android.nfc.NfcManager; import android.os.AsyncTask; import android.os.Bundle; import android.support.design.widget.TextInputLayout; import android.support.v4.app.Fragment; -import android.text.Editable; import android.text.InputType; -import android.text.TextWatcher; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; @@ -67,9 +64,8 @@ public class ReceiveFragment extends Fragment { private ProgressBar pbProgress; private TextView tvAddressLabel; private TextView tvAddress; - private TextInputLayout etPaymentId; + private TextInputLayout etNotes; private ExchangeView evAmount; - private Button bPaymentId; private TextView tvQrCode; private ImageView qrCode; private ImageView qrCodeFull; @@ -97,9 +93,8 @@ public class ReceiveFragment extends Fragment { pbProgress = (ProgressBar) view.findViewById(R.id.pbProgress); tvAddressLabel = (TextView) view.findViewById(R.id.tvAddressLabel); tvAddress = (TextView) view.findViewById(R.id.tvAddress); - etPaymentId = (TextInputLayout) view.findViewById(R.id.etPaymentId); + etNotes = (TextInputLayout) view.findViewById(R.id.etNotes); evAmount = (ExchangeView) view.findViewById(R.id.evAmount); - bPaymentId = (Button) view.findViewById(R.id.bPaymentId); qrCode = (ImageView) view.findViewById(R.id.qrCode); tvQrCode = (TextView) view.findViewById(R.id.tvQrCode); qrCodeFull = (ImageView) view.findViewById(R.id.qrCodeFull); @@ -107,7 +102,6 @@ public class ReceiveFragment extends Fragment { bCopyAddress = (ImageButton) view.findViewById(R.id.bCopyAddress); bSubaddress = (Button) view.findViewById(R.id.bSubaddress); - etPaymentId.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); bCopyAddress.setOnClickListener(new View.OnClickListener() { @@ -136,41 +130,17 @@ public class ReceiveFragment extends Fragment { } }); - etPaymentId.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { + final EditText notesEdit = etNotes.getEditText(); + notesEdit.setRawInputType(InputType.TYPE_CLASS_TEXT); + notesEdit.setOnEditorActionListener(new TextView.OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) { - if (checkPaymentId()) { // && evAmount.checkXmrAmount(true)) { - generateQr(); - } + generateQr(); return true; } return false; } }); - etPaymentId.getEditText().addTextChangedListener(new TextWatcher() { - @Override - public void afterTextChanged(Editable editable) { - clearQR(); - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - }); - bPaymentId.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - etPaymentId.getEditText().setText((Wallet.generatePaymentId())); - etPaymentId.getEditText().setSelection(etPaymentId.getEditText().getText().length()); - if (checkPaymentId()) { //&& evAmount.checkXmrAmount(true)) { - generateQr(); - } - } - }); bSubaddress.setOnClickListener(new View.OnClickListener() { @Override @@ -195,7 +165,7 @@ public class ReceiveFragment extends Fragment { if (qrValid) { qrCodeFull.setImageBitmap(((BitmapDrawable) qrCode.getDrawable()).getBitmap()); qrCodeFull.setVisibility(View.VISIBLE); - } else if (checkPaymentId()) { + } else { evAmount.doExchange(); } } @@ -292,8 +262,6 @@ public class ReceiveFragment extends Fragment { listenerCallback.setTitle(wallet.getName()); listenerCallback.setSubtitle(wallet.getAccountLabel()); tvAddress.setText(wallet.getAddress()); - etPaymentId.setEnabled(true); - bPaymentId.setEnabled(true); enableCopyAddress(true); hideProgress(); generateQr(); @@ -381,18 +349,6 @@ public class ReceiveFragment extends Fragment { } } - private boolean checkPaymentId() { - String paymentId = etPaymentId.getEditText().getText().toString(); - boolean ok = paymentId.isEmpty() || Wallet.isPaymentIdValid(paymentId); - - if (!ok) { - etPaymentId.setError(getString(R.string.receive_paymentid_invalid)); - } else { - etPaymentId.setError(null); - } - return ok; - } - public BarcodeData getBarcodeData() { if (qrValid) return bcData; @@ -405,15 +361,15 @@ public class ReceiveFragment extends Fragment { private void generateQr() { Timber.d("GENQR"); String address = tvAddress.getText().toString(); - String paymentId = etPaymentId.getEditText().getText().toString(); + String notes = etNotes.getEditText().getText().toString(); String xmrAmount = evAmount.getAmount(); - Timber.d("%s/%s/%s", xmrAmount, paymentId, address); + Timber.d("%s/%s/%s", xmrAmount, notes, address); if ((xmrAmount == null) || !Wallet.isAddressValid(address)) { clearQR(); Timber.d("CLEARQR"); return; } - bcData = new BarcodeData(BarcodeData.Asset.XMR, address, paymentId, xmrAmount); + bcData = new BarcodeData(BarcodeData.Asset.XMR, address, null, notes, xmrAmount); int size = Math.min(qrCode.getHeight(), qrCode.getWidth()); Bitmap qr = generate(bcData.getUriString(), size, size); if (qr != null) { diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/BarcodeData.java b/app/src/main/java/com/m2049r/xmrwallet/data/BarcodeData.java index 10298f4..635bbad 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/BarcodeData.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/BarcodeData.java @@ -30,6 +30,7 @@ public class BarcodeData { public static final String XMR_SCHEME = "monero:"; public static final String XMR_PAYMENTID = "tx_payment_id"; public static final String XMR_AMOUNT = "tx_amount"; + public static final String XMR_DESCRIPTION = "tx_description"; static final String BTC_SCHEME = "bitcoin:"; static final String BTC_AMOUNT = "amount"; @@ -42,6 +43,7 @@ public class BarcodeData { public String address = null; public String paymentId = null; public String amount = null; + public String description = null; public BarcodeData(String uri) { this.asset = asset; @@ -66,6 +68,14 @@ public class BarcodeData { this.amount = amount; } + public BarcodeData(Asset asset, String address, String paymentId, String description, String amount) { + this.asset = asset; + this.address = address; + this.paymentId = paymentId; + this.description = description; + this.amount = amount; + } + public Uri getUri() { return Uri.parse(getUriString()); } @@ -80,12 +90,13 @@ public class BarcodeData { first = false; sb.append(BarcodeData.XMR_PAYMENTID).append('=').append(paymentId); } + if ((description != null) && !description.isEmpty()) { + sb.append(first ? "?" : "&"); + first = false; + sb.append(BarcodeData.XMR_DESCRIPTION).append('=').append(Uri.encode(description)); + } if (!amount.isEmpty()) { - if (first) { - sb.append("?"); - } else { - sb.append("&"); - } + sb.append(first ? "?" : "&"); sb.append(BarcodeData.XMR_AMOUNT).append('=').append(amount); } return sb.toString(); @@ -140,6 +151,7 @@ public class BarcodeData { } String address = monero.getPath(); String paymentId = parms.get(XMR_PAYMENTID); + String description = parms.get(XMR_DESCRIPTION); String amount = parms.get(XMR_AMOUNT); if (amount != null) { try { @@ -158,7 +170,7 @@ public class BarcodeData { Timber.d("address invalid"); return null; } - return new BarcodeData(Asset.XMR, address, paymentId, amount); + return new BarcodeData(Asset.XMR, address, paymentId, description, amount); } static public BarcodeData parseMoneroNaked(String address) { 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 index 8a19e5c..4f5e1f6 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAddressWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAddressWizardFragment.java @@ -39,9 +39,9 @@ import com.m2049r.xmrwallet.data.BarcodeData; import com.m2049r.xmrwallet.data.TxData; import com.m2049r.xmrwallet.data.TxDataBtc; import com.m2049r.xmrwallet.model.Wallet; -import com.m2049r.xmrwallet.model.WalletManager; import com.m2049r.xmrwallet.util.BitcoinAddressValidator; import com.m2049r.xmrwallet.util.Helper; +import com.m2049r.xmrwallet.util.UserNotes; import timber.log.Timber; @@ -75,6 +75,7 @@ public class SendAddressWizardFragment extends SendWizardFragment { private EditText etDummy; private TextInputLayout etAddress; private TextInputLayout etPaymentId; + private TextInputLayout etNotes; private Button bPaymentId; private CardView cvScan; private View tvPaymentIdIntegrated; @@ -155,15 +156,13 @@ public class SendAddressWizardFragment extends SendWizardFragment { } }); - etPaymentId = (TextInputLayout) view.findViewById(R.id.etPaymentId); etPaymentId.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); etPaymentId.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) { + if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { if (checkPaymentId()) { - etDummy.requestFocus(); - Helper.hideKeyboard(getActivity()); + etNotes.requestFocus(); } return true; } @@ -193,6 +192,19 @@ public class SendAddressWizardFragment extends SendWizardFragment { } }); + etNotes = (TextInputLayout) view.findViewById(R.id.etNotes); + etNotes.getEditText().setRawInputType(InputType.TYPE_CLASS_TEXT); + etNotes.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) { + etDummy.requestFocus(); + Helper.hideKeyboard(getActivity()); + return true; + } + return false; + } + }); + cvScan = (CardView) view.findViewById(R.id.bScan); cvScan.setOnClickListener(new View.OnClickListener() { @Override @@ -283,6 +295,7 @@ public class SendAddressWizardFragment extends SendWizardFragment { txData.setDestinationAddress(etAddress.getEditText().getText().toString()); txData.setPaymentId(etPaymentId.getEditText().getText().toString()); } + txData.setUserNotes(new UserNotes(etNotes.getEditText().getText().toString())); } return true; } @@ -325,14 +338,21 @@ public class SendAddressWizardFragment extends SendWizardFragment { etAddress.getEditText().getText().clear(); etAddress.setError(null); } - String scannedPaymenId = barcodeData.paymentId; - if (scannedPaymenId != null) { - etPaymentId.getEditText().setText(scannedPaymenId); + String scannedPaymentId = barcodeData.paymentId; + if (scannedPaymentId != null) { + etPaymentId.getEditText().setText(scannedPaymentId); checkPaymentId(); } else { etPaymentId.getEditText().getText().clear(); etPaymentId.setError(null); } + String scannedNotes = barcodeData.description; + if (scannedNotes != null) { + etNotes.getEditText().setText(scannedNotes); + } else { + etNotes.getEditText().getText().clear(); + etNotes.setError(null); + } } else Timber.d("barcodeData=null"); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendSettingsWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendSettingsWizardFragment.java index 1a792ac..76f13d3 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendSettingsWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendSettingsWizardFragment.java @@ -62,10 +62,8 @@ public class SendSettingsWizardFragment extends SendWizardFragment { PendingTransaction.Priority.Priority_High}; // must match the layout XML private Spinner sPriority; - private EditText etNotes; private EditText etDummy; - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -77,19 +75,6 @@ public class SendSettingsWizardFragment extends SendWizardFragment { sPriority = (Spinner) view.findViewById(R.id.sPriority); - etNotes = (EditText) view.findViewById(R.id.etNotes); - etNotes.setRawInputType(InputType.TYPE_CLASS_TEXT); - etNotes.setOnEditorActionListener(new TextView.OnEditorActionListener() { - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) { - etDummy.requestFocus(); - Helper.hideKeyboard(getActivity()); - return true; - } - return false; - } - }); - etDummy = (EditText) view.findViewById(R.id.etDummy); etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); @@ -102,7 +87,6 @@ public class SendSettingsWizardFragment extends SendWizardFragment { TxData txData = sendListener.getTxData(); txData.setPriority(Priorities[sPriority.getSelectedItemPosition()]); txData.setMixin(MIXIN); - txData.setUserNotes(new UserNotes(etNotes.getText().toString())); } return true; } diff --git a/app/src/main/res/layout/fragment_receive.xml b/app/src/main/res/layout/fragment_receive.xml index a69b498..7174d66 100644 --- a/app/src/main/res/layout/fragment_receive.xml +++ b/app/src/main/res/layout/fragment_receive.xml @@ -89,46 +89,21 @@ android:layout_marginTop="16dp" android:orientation="vertical" /> - + android:layout_height="wrap_content"> - + android:hint="@string/receive_desc_hint" + android:imeOptions="actionDone" + android:inputType="textMultiLine" + android:textAlignment="textStart" /> - - - - -