X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Fnew_transaction%2FNewTransactionAccountRowItemHolder.java;h=8f1c51dd9ae24e9a922747a5e5536a09a6ab0b65;hb=9981e0f34f9107070a1b90acff7da76957fcdbbe;hp=5df1fc1f808a9fb8637d9739e20343b1cf949501;hpb=ed6fa3f426ebb3076dc68fa866f1afea3e47cd47;p=mobile-ledger.git diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionAccountRowItemHolder.java b/app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionAccountRowItemHolder.java index 5df1fc1f..8f1c51dd 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionAccountRowItemHolder.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionAccountRowItemHolder.java @@ -35,7 +35,7 @@ import androidx.recyclerview.widget.RecyclerView; import net.ktnx.mobileledger.R; import net.ktnx.mobileledger.databinding.NewTransactionAccountRowBinding; -import net.ktnx.mobileledger.db.AccountAutocompleteAdapter; +import net.ktnx.mobileledger.db.AccountWithAmountsAutocompleteAdapter; import net.ktnx.mobileledger.model.Currency; import net.ktnx.mobileledger.model.Data; import net.ktnx.mobileledger.ui.CurrencySelectorFragment; @@ -44,16 +44,13 @@ import net.ktnx.mobileledger.utils.DimensionUtils; import net.ktnx.mobileledger.utils.Logger; import net.ktnx.mobileledger.utils.Misc; -import java.text.DecimalFormatSymbols; +import java.text.ParseException; class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder { - private final String decimalDot = "."; private final NewTransactionAccountRowBinding b; private boolean ignoreFocusChanges = false; - private String decimalSeparator; private boolean inUpdate = false; private boolean syncingData = false; - //TODO multiple amounts with different currencies per posting? NewTransactionAccountRowItemHolder(@NonNull NewTransactionAccountRowBinding b, NewTransactionItemsAdapter adapter) { super(b.getRoot()); @@ -95,12 +92,13 @@ class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder { if (id == R.id.account_row_acc_amounts) { try { String input = String.valueOf(b.accountRowAccAmounts.getText()); - input = input.replace(decimalSeparator, decimalDot); - final String newText = String.format("%4.2f", Float.parseFloat(input)); + input = input.replace(Data.getDecimalSeparator(), Data.decimalDot); + final String newText = Data.formatNumber(Float.parseFloat(input)); if (!newText.equals(input)) { boolean wasSyncingData = syncingData; syncingData = true; try { + // there is a listener that will propagate the change to the model b.accountRowAccAmounts.setText(newText); } finally { @@ -126,13 +124,12 @@ class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder { NewTransactionActivity activity = (NewTransactionActivity) b.getRoot() .getContext(); - b.accountRowAccName.setAdapter(new AccountAutocompleteAdapter(b.getRoot() - .getContext(), mProfile)); - - decimalSeparator = ""; - Data.locale.observe(activity, locale -> decimalSeparator = String.valueOf( - DecimalFormatSymbols.getInstance(locale) - .getMonetaryDecimalSeparator())); + b.accountRowAccName.setAdapter(new AccountWithAmountsAutocompleteAdapter(b.getRoot() + .getContext(), + mProfile)); + b.accountRowAccName.setOnItemClickListener((parent, view, position, id) -> { + adapter.noteFocusIsOnAmount(position); + }); final TextWatcher tw = new TextWatcher() { @Override @@ -252,14 +249,21 @@ class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder { } } public void checkAmountValid(String s) { + // FIXME this needs to be done in the model only boolean valid = true; try { if (s.length() > 0) { - float ignored = Float.parseFloat(s.replace(decimalSeparator, decimalDot)); + float ignored = + Float.parseFloat(s.replace(Data.getDecimalSeparator(), Data.decimalDot)); } } catch (NumberFormatException ex) { - valid = false; + try { + float ignored = Data.parseNumber(s); + } + catch (ParseException ex2) { + valid = false; + } } displayAmountValidity(valid); @@ -404,7 +408,7 @@ class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder { if (getBindingAdapterPosition() == RecyclerView.NO_POSITION) { // probably the row was swiped out - Logger.debug("new-trans", "Ignoring request to suncData(): adapter position negative"); + Logger.debug("new-trans", "Ignoring request to syncData(): adapter position negative"); return false; } @@ -432,44 +436,23 @@ class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder { acc.setComment(String.valueOf(b.comment.getText())); String amount = String.valueOf(b.accountRowAccAmounts.getText()); - amount = amount.trim(); - if (amount.isEmpty()) { - if (acc.isAmountSet()) - significantChange = true; - acc.resetAmount(); - acc.setAmountValid(true); - } - else { - try { - amount = amount.replace(decimalSeparator, decimalDot); - final float parsedAmount = Float.parseFloat(amount); - if (!acc.isAmountSet() || !Misc.equalFloats(parsedAmount, acc.getAmount())) - significantChange = true; - acc.setAmount(parsedAmount); - acc.setAmountValid(true); - } - catch (NumberFormatException e) { - Logger.debug("new-trans", String.format( - "assuming amount is not set due to number format exception. " + - "input was '%s'", amount)); - if (acc.isAmountValid()) - significantChange = true; - acc.setAmountValid(false); - } - final String curr = String.valueOf(b.currency.getText()); - final String currValue; - if (curr.equals(b.currency.getContext() - .getResources() - .getString(R.string.currency_symbol)) || curr.isEmpty()) - currValue = null; - else - currValue = curr; - - if (!significantChange && !Misc.equalStrings(acc.getCurrency(), currValue)) - significantChange = true; - acc.setCurrency(currValue); - } + if (acc.setAndCheckAmountText(Misc.nullIsEmpty(amount))) + significantChange = true; + displayAmountValidity(!acc.isAmountSet() || acc.isAmountValid()); + + final String curr = String.valueOf(b.currency.getText()); + final String currValue; + if (curr.equals(b.currency.getContext() + .getResources() + .getString(R.string.currency_symbol)) || curr.isEmpty()) + currValue = null; + else + currValue = curr; + + if (!significantChange && !Misc.equalStrings(acc.getCurrency(), currValue)) + significantChange = true; + acc.setCurrency(currValue); return significantChange; } @@ -498,8 +481,8 @@ class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder { presentAccountName, incomingAccountName, acc.getAccountNameCursorPosition())); // avoid triggering completion pop-up - AccountAutocompleteAdapter a = - (AccountAutocompleteAdapter) b.accountRowAccName.getAdapter(); + AccountWithAmountsAutocompleteAdapter a = + (AccountWithAmountsAutocompleteAdapter) b.accountRowAccName.getAdapter(); try { b.accountRowAccName.setAdapter(null); b.accountRowAccName.setText(incomingAccountName); @@ -522,9 +505,8 @@ class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder { acc.isLast() ? EditorInfo.IME_ACTION_DONE : EditorInfo.IME_ACTION_NEXT); setCurrencyString(acc.getCurrency()); - b.accountRowAccAmounts.setText( - acc.isAmountSet() ? String.format("%4.2f", acc.getAmount()) : null); - displayAmountValidity(true); + b.accountRowAccAmounts.setText(acc.getAmountText()); + displayAmountValidity(!acc.isAmountSet() || acc.isAmountValid()); final String comment = acc.getComment(); b.comment.setText(comment);