X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Factivity%2FNewTransactionActivity.java;h=9062f545540a5c9db23c6d7bd11f82f38808da79;hp=310232d2057a6fc9585d5f29ec0118adfce629b9;hb=72e437223bee45070c13b4acba4bd4368fe68244;hpb=c4d80cd461385af945cd3e599ad2307ad5adcfe6 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 310232d2..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,12 +19,12 @@ 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; import android.text.InputType; import android.text.TextWatcher; -import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.Menu; @@ -44,6 +44,7 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.snackbar.BaseTransientBottomBar; import com.google.android.material.snackbar.Snackbar; +import net.ktnx.mobileledger.App; import net.ktnx.mobileledger.BuildConfig; import net.ktnx.mobileledger.R; import net.ktnx.mobileledger.async.DescriptionSelectedCallback; @@ -67,6 +68,8 @@ import java.util.Objects; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.DialogFragment; +import static net.ktnx.mobileledger.utils.Logger.debug; + /* * TODO: nicer progress while transaction is submitted * TODO: reports @@ -100,8 +103,9 @@ public class NewTransactionActivity extends ProfileThemedActivity }); tvDescription = findViewById(R.id.new_transaction_description); MLDB.hookAutocompletionAdapter(this, tvDescription, MLDB.DESCRIPTION_HISTORY_TABLE, - "description", false, findViewById(R.id.new_transaction_acc_1), this); + "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); @@ -109,17 +113,81 @@ public class NewTransactionActivity extends ProfileThemedActivity Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); table = findViewById(R.id.new_transaction_accounts_table); - for (int i = 0; i < table.getChildCount(); i++) { - TableRow row = (TableRow) table.getChildAt(i); - AutoCompleteTextView tvAccountName = (AutoCompleteTextView) row.getChildAt(0); - TextView tvAmount = (TextView) row.getChildAt(1); - hookSwipeListener(row); - MLDB.hookAutocompletionAdapter(this, tvAccountName, MLDB.ACCOUNTS_TABLE, "name", true, - tvAmount, null); - hookTextChangeListener(tvAccountName); - hookTextChangeListener(tvAmount); -// Log.d("swipe", "hooked to row "+i); + + 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() { @@ -163,7 +231,7 @@ public class NewTransactionActivity extends ProfileThemedActivity Date date; if (dateString.isEmpty()) date = new Date(); else date = Globals.parseLedgerDate(dateString); - LedgerTransaction tr = new LedgerTransaction(date, tvDescription.getText().toString()); + LedgerTransaction tr = new LedgerTransaction(null, date, tvDescription.getText().toString(), mProfile); TableLayout table = findViewById(R.id.new_transaction_accounts_table); LedgerTransactionAccount emptyAmountAccount = null; @@ -193,7 +261,7 @@ public class NewTransactionActivity extends ProfileThemedActivity saver.execute(tr); } catch (ParseException e) { - Log.d("new-transaction", "Parse error", e); + debug("new-transaction", "Parse error", e); Toast.makeText(this, getResources().getString(R.string.error_invalid_date), Toast.LENGTH_LONG).show(); tvDate.requestFocus(); @@ -203,7 +271,7 @@ public class NewTransactionActivity extends ProfileThemedActivity if (fab != null) fab.setEnabled(true); } catch (Exception e) { - Log.d("new-transaction", "Unknown error", e); + debug("new-transaction", "Unknown error", e); progress.setVisibility(View.GONE); toggleAllEditing(true); @@ -273,10 +341,9 @@ public class NewTransactionActivity extends ProfileThemedActivity }); } - public boolean simulateCrash(MenuItem item) { - Log.d("crash", "Will crash intentionally"); + public void simulateCrash(MenuItem item) { + debug("crash", "Will crash intentionally"); new AsyncCrasher().execute(); - return true; } public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. @@ -313,7 +380,7 @@ public class NewTransactionActivity extends ProfileThemedActivity @Override public void afterTextChanged(Editable s) { -// Log.d("input", "text changed"); +// debug("input", "text changed"); check_transaction_submittable(); } }); @@ -342,8 +409,15 @@ public class NewTransactionActivity extends ProfileThemedActivity amt.setSelectAllOnFocus(true); // forward navigation support - final TableRow last_row = (TableRow) table.getChildAt(table.getChildCount() - 1); - final TextView last_amt = (TextView) last_row.getChildAt(1); + TextView last_amt; + int rows = table.getChildCount(); + if (rows > 0) { + final TableRow last_row = (TableRow) table.getChildAt(rows - 1); + last_amt = (TextView) last_row.getChildAt(1); + } + else { + last_amt = tvDescription; + } last_amt.setNextFocusForwardId(acc.getId()); last_amt.setNextFocusRightId(acc.getId()); last_amt.setImeOptions(EditorInfo.IME_ACTION_NEXT); @@ -361,8 +435,10 @@ public class NewTransactionActivity extends ProfileThemedActivity if (focus) acc.requestFocus(); hookSwipeListener(row); - MLDB.hookAutocompletionAdapter(this, acc, MLDB.ACCOUNTS_TABLE, "name", true, amt, null); + MLDB.hookAutocompletionAdapter(this, acc, MLDB.ACCOUNTS_TABLE, "name", true, amt, null, + mProfile); hookTextChangeListener(acc); + hookClearClickListener(acc); hookTextChangeListener(amt); return row; @@ -440,7 +516,7 @@ public class NewTransactionActivity extends ProfileThemedActivity doAddAccountRow(false); } - Log.d("submittable", String.format("accounts=%d, accounts_with_values=%s, " + + debug("submittable", String.format("accounts=%d, accounts_with_values=%s, " + "amounts_with_accounts=%d, amounts=%d, running_total=%1.2f, " + "single_empty_with_acc=%s", accounts, accounts_with_values, amounts_with_accounts, amounts, running_total, @@ -477,7 +553,7 @@ public class NewTransactionActivity extends ProfileThemedActivity @Override public void done(String error) { progress.setVisibility(View.INVISIBLE); - Log.d("visuals", "hiding progress"); + debug("visuals", "hiding progress"); if (error == null) resetForm(); else Snackbar.make(findViewById(R.id.new_transaction_accounts_table), error, @@ -506,7 +582,7 @@ public class NewTransactionActivity extends ProfileThemedActivity } @Override public void descriptionSelected(String description) { - Log.d("descr selected", description); + debug("descr selected", description); if (!inputStateIsInitial()) return; String accFilter = mProfile.getPreferredAccountsFilter(); @@ -526,10 +602,10 @@ public class NewTransactionActivity extends ProfileThemedActivity sb.append(" ORDER BY date desc limit 1"); final String sql = sb.toString(); - Log.d("descr", sql); - Log.d("descr", params.toString()); + debug("descr", sql); + debug("descr", params.toString()); - try (Cursor c = MLDB.getDatabase().rawQuery(sql, params.toArray(new String[]{}))) { + try (Cursor c = App.getDatabase().rawQuery(sql, params.toArray(new String[]{}))) { if (!c.moveToNext()) return; String profileUUID = c.getString(0); @@ -541,7 +617,6 @@ public class NewTransactionActivity extends ProfileThemedActivity "transaction %d with description %s", profileUUID, transactionId, description)); tr = profile.loadTransaction(transactionId); - table = findViewById(R.id.new_transaction_accounts_table); ArrayList accounts = tr.getAccounts(); TableRow firstNegative = null; int negativeCount = 0;