X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2FNewTransactionActivity.java;h=8ec820241caf42657295e189a385651f73a2ba77;hp=d2b3b476b7a39e230f92ec89027eeada1bef0d64;hb=0272b2095a6c19cd4ff779b63751c05c98459423;hpb=45a5fea939677b263f0844396b021522a5eb0c90 diff --git a/app/src/main/java/net/ktnx/mobileledger/NewTransactionActivity.java b/app/src/main/java/net/ktnx/mobileledger/NewTransactionActivity.java index d2b3b476..8ec82024 100644 --- a/app/src/main/java/net/ktnx/mobileledger/NewTransactionActivity.java +++ b/app/src/main/java/net/ktnx/mobileledger/NewTransactionActivity.java @@ -1,5 +1,6 @@ package net.ktnx.mobileledger; +import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.database.Cursor; import android.database.MatrixCursor; @@ -18,6 +19,7 @@ import android.text.InputType; import android.text.TextWatcher; import android.util.Log; import android.util.TypedValue; +import android.view.Gravity; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; @@ -63,6 +65,13 @@ public class NewTransactionActivity extends AppCompatActivity implements TaskCal setSupportActionBar(toolbar); text_date = findViewById(R.id.new_transaction_date); + text_date.setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public + void onFocusChange(View v, boolean hasFocus) { + if (hasFocus) pickTransactionDate(v); + } + }); text_descr = findViewById(R.id.new_transaction_description); hook_autocompletion_adapter(text_descr, MobileLedgerDB.DESCRIPTION_HISTORY_TABLE, "description"); @@ -70,16 +79,9 @@ public class NewTransactionActivity extends AppCompatActivity implements TaskCal 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 acc_name_view = (AutoCompleteTextView) row.getChildAt(0); - TextView amount_view = (TextView) row.getChildAt(1); - hook_swipe_listener(row); - hook_autocompletion_adapter(acc_name_view, MobileLedgerDB.ACCOUNTS_TABLE, "name"); - hook_text_change_listener(acc_name_view); - hook_text_change_listener(amount_view); -// Log.d("swipe", "hooked to row "+i); - } + table.removeAllViews(); + do_add_account_row(false); + do_add_account_row(false); } @Override @@ -233,6 +235,8 @@ public class NewTransactionActivity extends AppCompatActivity implements TaskCal mSave = menu.findItem(R.id.action_submit_transaction); if (mSave == null) throw new AssertionError(); + check_transaction_submittable(); + return true; } @@ -252,7 +256,8 @@ public class NewTransactionActivity extends AppCompatActivity implements TaskCal acc.setWidth(0); final EditText amt = new EditText(this); - amt.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f)); + amt.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, + TableRow.LayoutParams.MATCH_PARENT, 1f)); amt.setHint(R.string.new_transaction_amount_hint); amt.setWidth(0); amt.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_NUMBER_FLAG_DECIMAL ); @@ -261,6 +266,7 @@ public class NewTransactionActivity extends AppCompatActivity implements TaskCal final TableRow row = new TableRow(this); row.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT)); + row.setGravity(Gravity.BOTTOM); row.addView(acc); row.addView(amt); table.addView(row); @@ -281,35 +287,85 @@ public class NewTransactionActivity extends AppCompatActivity implements TaskCal save_transaction(); } + // rules: + // 1) at least two account names + // 2) each amount must have account name + // 3) amounts must balance to 0, or + // 3a) there must be exactly one empty amount + // 4) empty accounts with empty amounts are ignored + // 5) a row with an empty account name or empty amount is guaranteed to exist + @SuppressLint("DefaultLocale") private void check_transaction_submittable() { TableLayout table = findViewById(R.id.new_transaction_accounts_table); int accounts = 0; int accounts_with_values = 0; + int amounts = 0; + int amounts_with_accounts = 0; int empty_rows = 0; - for(int i = 0; i < table.getChildCount(); i++ ) { - TableRow row = (TableRow) table.getChildAt(i); + TextView empty_amount = null; + boolean single_empty_amount = false; + float running_total = 0f; + boolean have_description = + !((TextView) findViewById(R.id.new_transaction_description)).getText().toString() + .isEmpty(); + + try { + for (int i = 0; i < table.getChildCount(); i++) { + TableRow row = (TableRow) table.getChildAt(i); + + TextView acc_name_v = (TextView) row.getChildAt(0); + TextView amount_v = (TextView) row.getChildAt(1); + String amt = String.valueOf(amount_v.getText()); + String acc_name = String.valueOf(acc_name_v.getText()); + acc_name = acc_name.trim(); - TextView acc_name_v = (TextView) row.getChildAt(0); + if (!acc_name.isEmpty()) { + accounts++; - String acc_name = String.valueOf(acc_name_v.getText()); - acc_name = acc_name.trim(); - if (!acc_name.isEmpty()) { - accounts++; + if (!amt.isEmpty()) { + accounts_with_values++; + } + } + else empty_rows++; - TextView amount_v = (TextView) row.getChildAt(1); - String amt = String.valueOf(amount_v.getText()); + if (amt.isEmpty()) { + amount_v.setHint(String.format("%1.2f", 0f)); + if (empty_amount == null) { + empty_amount = amount_v; + single_empty_amount = true; + } + else if (!acc_name.isEmpty()) single_empty_amount = false; + } + else { + amounts++; + if (!acc_name.isEmpty()) amounts_with_accounts++; + running_total += Float.valueOf(amt); + } + } - if (!amt.isEmpty()) accounts_with_values++; - } else empty_rows++; - } + if ((empty_rows == 0) && ((table.getChildCount() == accounts) || (table.getChildCount() + == amounts))) + { + do_add_account_row(false); + } - if (accounts_with_values == accounts && empty_rows == 0) { - do_add_account_row(false); - } + if (have_description && (accounts >= 2) && (accounts_with_values >= (accounts - 1)) && ( + amounts_with_accounts == amounts)) + { + if (mSave != null) mSave.setVisible(true); + } + else if (mSave != null) mSave.setVisible(false); - if ((accounts >= 2) && (accounts_with_values >= (accounts - 1))) { - if (mSave != null) mSave.setVisible(true); - } else { + if (single_empty_amount) { + empty_amount + .setHint(String.format("%1.2f", (running_total > 0) ? -running_total : 0f)); + } + } + catch (NumberFormatException e) { + if (mSave != null) mSave.setVisible(false); + } + catch (Exception e) { + e.printStackTrace(); if (mSave != null) mSave.setVisible(false); } }