From 72e437223bee45070c13b4acba4bd4368fe68244 Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Sat, 21 Sep 2019 16:02:04 +0300 Subject: [PATCH] new transaction: add a clear button to edited fields makes it easy to clear a field's text without select-all or holding on the backspace key --- .../ui/activity/NewTransactionActivity.java | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/activity/NewTransactionActivity.java b/app/src/main/java/net/ktnx/mobileledger/ui/activity/NewTransactionActivity.java index d37f4b58..9062f545 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/activity/NewTransactionActivity.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/activity/NewTransactionActivity.java @@ -19,6 +19,7 @@ package net.ktnx.mobileledger.ui.activity; import android.annotation.SuppressLint; import android.database.Cursor; +import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; import android.text.Editable; @@ -104,6 +105,7 @@ public class NewTransactionActivity extends ProfileThemedActivity MLDB.hookAutocompletionAdapter(this, tvDescription, MLDB.DESCRIPTION_HISTORY_TABLE, "description", false, findViewById(R.id.new_transaction_acc_1), this, mProfile); hookTextChangeListener(tvDescription); + hookClearClickListener(tvDescription); progress = findViewById(R.id.save_transaction_progress); fab = findViewById(R.id.fab); @@ -115,6 +117,77 @@ public class NewTransactionActivity extends ProfileThemedActivity while (table.getChildCount() < 2) { doAddAccountRow(false); } + + check_transaction_submittable(); + } + private void hookClearClickListener(AutoCompleteTextView v) { + final TextWatcher w = new TextWatcher() { + private boolean hasText; + private boolean hadText; + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + hadText = s.length() > 0; + } + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + @Override + public void afterTextChanged(Editable s) { + hasText = s.length() > 0; + + if (hadText && !hasText) { + v.setCompoundDrawablesRelative(null, null, null, null); + } + if (!hadText && hasText) { + v.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, + R.drawable.ic_clear_black_24dp, 0); + } + } + }; + View.OnFocusChangeListener prevFocusListener = v.getOnFocusChangeListener(); + v.setOnFocusChangeListener((v12, hasFocus) -> { + if (hasFocus) { + if (((TextView) v12).getText().length() > 0) { + ((TextView) v12).setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, + R.drawable.ic_clear_black_24dp, 0); + } + ((TextView) v12).addTextChangedListener(w); + } + else { + ((TextView) v12).removeTextChangedListener(w); + ((TextView) v12).setCompoundDrawables(null, null, null, null); + } + + if (prevFocusListener != null) prevFocusListener.onFocusChange(v12, hasFocus); + }); + + v.setOnTouchListener((v1, event) -> { + if (event.getAction() == MotionEvent.ACTION_UP) + if (((TextView) v1).getText().length() > 0) { + boolean clearClicked = false; + final float x = event.getX(); + final int vw = v1.getWidth(); + // start, top, end, bottom (end == 2) + Drawable dwb = ((TextView) v1).getCompoundDrawablesRelative()[2]; + if (dwb != null) { + final int dw = dwb.getBounds().width(); + if (v1.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR) { + if ((x > vw - dw)) clearClicked = true; + } + else { + if (x < vw - dw) clearClicked = true; + } + if (clearClicked) { + ((TextView) v1).setText(""); + v1.requestFocus(); + return true; + } + } + } + v.performClick(); + return false; + }); } @Override protected void initProfile() { @@ -365,6 +438,7 @@ public class NewTransactionActivity extends ProfileThemedActivity MLDB.hookAutocompletionAdapter(this, acc, MLDB.ACCOUNTS_TABLE, "name", true, amt, null, mProfile); hookTextChangeListener(acc); + hookClearClickListener(acc); hookTextChangeListener(amt); return row; -- 2.39.5