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;h=a4fe14d2a0c65216e6fec6033bf58e73c0800327;hp=060046c43ce4f87fb3b7fb87885356b0e9b501ef;hb=ef5d367b0e34de0bf65409b3b44d686a19d50cec;hpb=a65999a788ab6d925caf7e0e5ca5ef0c460ad681 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 060046c4..a4fe14d2 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 @@ -68,7 +68,6 @@ public class NewTransactionModel extends ViewModel { private final MutableLiveData isSubmittable = new InertMutableLiveData<>(false); private final MutableLiveData showComments = new MutableLiveData<>(true); private final MutableLiveData> items = new MutableLiveData<>(); - private final MutableLiveData accountCount = new InertMutableLiveData<>(0); private final MutableLiveData simulateSave = new InertMutableLiveData<>(false); private final AtomicInteger busyCounter = new AtomicInteger(0); private final MutableLiveData busyFlag = new InertMutableLiveData<>(false); @@ -93,8 +92,25 @@ public class NewTransactionModel extends ViewModel { } private void setItemsWithoutSubmittableChecks(@NonNull List list) { Logger.debug("new-trans", "model: Setting new item list"); + final int cnt = list.size(); + for (int i = 1; i < cnt - 1; i++) { + final TransactionAccount item = list.get(i) + .toTransactionAccount(); + if (item.isLast) { + TransactionAccount replacement = new TransactionAccount(item); + replacement.isLast = false; + list.set(i, replacement); + } + } + final TransactionAccount last = list.get(cnt - 1) + .toTransactionAccount(); + if (!last.isLast) { + TransactionAccount replacement = new TransactionAccount(last); + replacement.isLast = true; + list.set(cnt - 1, replacement); + } + items.setValue(list); - accountCount.setValue(list.size() - 2); } private List copyList() { return copyList(null); @@ -156,7 +172,7 @@ public class NewTransactionModel extends ViewModel { list.add(new TransactionHead("")); list.add(new TransactionAccount("")); list.add(new TransactionAccount("")); - items.setValue(list); + setItemsWithoutSubmittableChecks(list); } boolean accountsInInitialState() { final List list = items.getValue(); @@ -451,6 +467,8 @@ public class NewTransactionModel extends ViewModel { else item.resetAmount(); } + if (BuildConfig.DEBUG) + dumpItemList("Loaded previous transaction", newList); if (singleNegativeIndex != -1) { firstNegative.resetAmount(); @@ -461,9 +479,9 @@ public class NewTransactionModel extends ViewModel { moveItemLast(newList, singlePositiveIndex); } - noteFocusChanged(1, FocusedElement.Description); - setItems(newList); + + noteFocusChanged(1, FocusedElement.Amount); } /** * A transaction is submittable if: @@ -738,8 +756,9 @@ public class NewTransactionModel extends ViewModel { list = copyList(list); liveListCopied = true; } - Item item = emptyItems.remove(1); - list.remove(item); + // the list is a copy, so the empty item is no longer present + Item itemToRemove = emptyItems.remove(1); + removeItemById(list, itemToRemove.id); listChanged = true; } @@ -752,8 +771,8 @@ public class NewTransactionModel extends ViewModel { list = copyList(list); liveListCopied = true; } - Item item = emptyItems.get(0); - list.remove(item); + // the list is a copy, so the empty item is no longer present + removeItemById(list, emptyItems.get(0).id); listChanged = true; } } @@ -791,6 +810,19 @@ public class NewTransactionModel extends ViewModel { setItemsWithoutSubmittableChecks(list); } } + private void removeItemById(@NotNull List list, int id) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + list.removeIf(item -> item.id == id); + } + else { + for (Item item : list) { + if (item.id == id) { + list.remove(item); + break; + } + } + } + } @SuppressLint("DefaultLocale") private void dumpItemList(@NotNull String msg, @NotNull List list) { Logger.debug("submittable", "== Dump of all items " + msg); @@ -816,9 +848,6 @@ public class NewTransactionModel extends ViewModel { setItems(newList); } - public LiveData getAccountCount() { - return accountCount; - } public boolean accountListIsEmpty() { List items = Objects.requireNonNull(this.items.getValue()); @@ -1003,6 +1032,7 @@ public class NewTransactionModel extends ViewModel { private boolean amountValid = true; private FocusedElement focusedElement = FocusedElement.Account; private boolean amountHintIsSet = false; + private boolean isLast = false; public TransactionAccount(TransactionAccount origin) { id = origin.id; accountName = origin.accountName; @@ -1014,6 +1044,7 @@ public class NewTransactionModel extends ViewModel { currency = origin.currency; amountValid = origin.amountValid; focusedElement = origin.focusedElement; + isLast = origin.isLast; } public TransactionAccount(LedgerTransactionAccount account) { super(); @@ -1029,6 +1060,9 @@ public class NewTransactionModel extends ViewModel { this.accountName = accountName; this.currency = currency; } + public boolean isLast() { + return isLast; + } public boolean isAmountSet() { return amountSet; } @@ -1128,7 +1162,7 @@ public class NewTransactionModel extends ViewModel { (amountHintIsSet ? other.amountHintIsSet && TextUtils.equals(amountHint, other.amountHint) : !other.amountHintIsSet) && - TextUtils.equals(currency, other.currency); + TextUtils.equals(currency, other.currency) && isLast == other.isLast; Logger.debug("new-trans", String.format("Comparing {%s} and {%s}: %s", this.toString(), other.toString(), equal));