X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Fnew_transaction%2FNewTransactionModel.java;fp=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Fnew_transaction%2FNewTransactionModel.java;h=35bb3c82889c700efbc6e62e2bf91c7110157778;hp=cfe9c5d951d94604121e4f938606047bc0cedb86;hb=426a2bd8f495b5cf802e20248599dc5e08309aaf;hpb=410ac5bee1019afe708b4cb748b0806f53a63606 diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionModel.java b/app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionModel.java index cfe9c5d9..35bb3c82 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionModel.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionModel.java @@ -162,7 +162,7 @@ public class NewTransactionModel extends ViewModel { return copy; } private List shallowCopyList() { - return new ArrayList<>(items.getValue()); + return new ArrayList<>(Objects.requireNonNull(items.getValue())); } LiveData getShowComments() { return showComments; @@ -626,15 +626,14 @@ public class NewTransactionModel extends ViewModel { itemsWithAccountForCurrency.add(currName, item); } - if (item.isAmountSet()) { + if (item.isAmountSet() && item.isAmountValid()) { itemsWithAmountForCurrency.add(currName, item); balance.add(currName, item.getAmount()); } else { if (!item.isAmountValid()) { Logger.debug("submittable", - String.format("Not submittable: row %d has an invalid amount", - i + 1)); + String.format("Not submittable: row %d has an invalid amount", i)); submittable = false; hasInvalidAmount = true; } @@ -725,7 +724,7 @@ public class NewTransactionModel extends ViewModel { continue; if (item == receiver) { - final String hint = String.format("%1.2f", -currencyBalance); + final String hint = Data.formatNumber(-currencyBalance); if (!acc.isAmountHintSet() || !Misc.equalStrings(acc.getAmountHint(), hint)) { @@ -772,7 +771,7 @@ public class NewTransactionModel extends ViewModel { // if (Misc.isZero(balance.get(itemCurrencyName))) { // item.setCurrency(Currency.loadByName(balCurrency)); // item.setAmountHint( -// String.format("%1.2f", -balance.get(balCurrency))); +// Data.formatNumber(-balance.get(balCurrency))); // foundIt = true; // break; // } @@ -782,7 +781,7 @@ public class NewTransactionModel extends ViewModel { final TransactionAccount newAcc = new TransactionAccount("", balCurrency); final float bal = balance.get(balCurrency); if (!Misc.isZero(bal) && currAmounts == currRows) - newAcc.setAmountHint(String.format("%4.2f", -bal)); + newAcc.setAmountHint(Data.formatNumber(-bal)); Logger.debug("submittable", String.format("Adding new item with %s for currency %s", newAcc.getAmountHint(), balCurrency)); @@ -1072,6 +1071,8 @@ public class NewTransactionModel extends ViewModel { private float amount; private boolean amountSet; private boolean amountValid = true; + @NotNull + private String amountText = ""; private FocusedElement focusedElement = FocusedElement.Account; private boolean amountHintIsSet = false; private boolean isLast = false; @@ -1083,6 +1084,7 @@ public class NewTransactionModel extends ViewModel { amountSet = origin.amountSet; amountHint = origin.amountHint; amountHintIsSet = origin.amountHintIsSet; + amountText = origin.amountText; comment = origin.comment; currency = origin.currency; amountValid = origin.amountValid; @@ -1090,11 +1092,6 @@ public class NewTransactionModel extends ViewModel { isLast = origin.isLast; accountNameCursorPosition = origin.accountNameCursorPosition; } - public TransactionAccount(LedgerTransactionAccount account) { - super(); - currency = Misc.nullIsEmpty(account.getCurrency()); - amount = account.getAmount(); - } public TransactionAccount(String accountName) { super(); this.accountName = accountName; @@ -1104,6 +1101,46 @@ public class NewTransactionModel extends ViewModel { this.accountName = accountName; this.currency = currency; } + public @NotNull String getAmountText() { + return amountText; + } + public void setAmountText(@NotNull String amountText) { + this.amountText = amountText; + } + public boolean setAndCheckAmountText(@NotNull String amountText) { + String amtText = amountText.trim(); + this.amountText = amtText; + + boolean significantChange = false; + + if (amtText.isEmpty()) { + if (amountSet) { + significantChange = true; + } + resetAmount(); + } + else { + try { + amtText = amtText.replace(Data.getDecimalSeparator(), Data.decimalDot); + final float parsedAmount = Float.parseFloat(amtText); + if (!amountSet || !amountValid || !Misc.equalFloats(parsedAmount, amount)) + significantChange = true; + amount = parsedAmount; + amountSet = true; + amountValid = true; + } + catch (NumberFormatException e) { + Logger.debug("new-trans", String.format( + "assuming amount is not set due to number format exception. " + + "input was '%s'", amtText)); + if (amountValid) // it was valid and now it's not + significantChange = true; + amountValid = false; + } + } + + return significantChange; + } public boolean isLast() { return isLast; } @@ -1124,9 +1161,13 @@ public class NewTransactionModel extends ViewModel { public void setAmount(float amount) { this.amount = amount; amountSet = true; + amountValid = true; + amountText = Data.formatNumber(amount); } public void resetAmount() { amountSet = false; + amountValid = true; + amountText = ""; } @Override public ItemType getType() { @@ -1184,9 +1225,13 @@ public class NewTransactionModel extends ViewModel { b.append(String.format(" acc'%s'", accountName)); if (amountSet) - b.append(String.format(" %4.2f", amount)); + b.append(amountText) + .append(" [") + .append(amountValid ? "valid" : "invalid") + .append("] ") + .append(String.format(Locale.ROOT, " {raw %4.2f}", amount)); else if (amountHintIsSet) - b.append(String.format(" (%s)", amountHint)); + b.append(String.format(" (hint %s)", amountHint)); if (!TextUtils.isEmpty(currency)) b.append(" ") @@ -1206,7 +1251,9 @@ public class NewTransactionModel extends ViewModel { boolean equal = Misc.equalStrings(accountName, other.accountName); equal = equal && Misc.equalStrings(comment, other.comment) && - (amountSet ? other.amountSet && amount == other.amount : !other.amountSet); + (amountSet ? other.amountSet && amountValid == other.amountValid && + Misc.equalStrings(amountText, other.amountText) + : !other.amountSet); // compare amount hint only if there is no amount if (!amountSet)