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=707bc089cdf14ef3918ad74af4f7ea118f165aae;hp=2e9027154ae805014d6e878336434faaa8c6a7e0;hb=c9f30894817566586ff42216513adc4a69890da0;hpb=cf08359f12073863a51b69d03b614df300c42c43 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 2e902715..707bc089 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 @@ -18,6 +18,8 @@ package net.ktnx.mobileledger.ui.new_transaction; import android.annotation.SuppressLint; +import android.os.Handler; +import android.os.Looper; import android.text.TextUtils; import androidx.annotation.NonNull; @@ -68,7 +70,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 +94,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); @@ -152,11 +170,14 @@ public class NewTransactionModel extends ViewModel { return this.isSubmittable; } void reset() { + Logger.debug("new-trans", "Resetting model"); List list = new ArrayList<>(); list.add(new TransactionHead("")); list.add(new TransactionAccount("")); list.add(new TransactionAccount("")); - items.setValue(list); + noteFocusChanged(0, FocusedElement.Description); + isSubmittable.setValue(false); + setItemsWithoutSubmittableChecks(list); } boolean accountsInInitialState() { final List list = items.getValue(); @@ -260,7 +281,7 @@ public class NewTransactionModel extends ViewModel { newItems.add(accRow); } - items.postValue(newItems); + new Handler(Looper.getMainLooper()).post(() -> setItems(newItems)); }); } private int extractIntFromMatches(MatchResult m, Integer group, Integer literal) { @@ -340,7 +361,20 @@ public class NewTransactionModel extends ViewModel { list.add(list.remove(index)); } void toggleCurrencyVisible() { - showCurrency.setValue(!Objects.requireNonNull(showCurrency.getValue())); + final boolean newValue = !Objects.requireNonNull(showCurrency.getValue()); + + // remove currency from all items, or reset currency to the default + // no need to clone the list, because the removal of the currency won't lead to + // visual changes -- the currency fields will be hidden or reset to default anyway + // still, there may be changes in the submittable state + final List list = Objects.requireNonNull(this.items.getValue()); + for (int i = 1; i < list.size(); i++) { + ((TransactionAccount) list.get(i)).setCurrency(newValue ? Data.getProfile() + .getDefaultCommodity() + : null); + } + checkTransactionSubmittable(null); + showCurrency.setValue(newValue); } void stopObservingBusyFlag(Observer observer) { busyFlag.removeObserver(observer); @@ -451,6 +485,8 @@ public class NewTransactionModel extends ViewModel { else item.resetAmount(); } + if (BuildConfig.DEBUG) + dumpItemList("Loaded previous transaction", newList); if (singleNegativeIndex != -1) { firstNegative.resetAmount(); @@ -461,9 +497,9 @@ public class NewTransactionModel extends ViewModel { moveItemLast(newList, singlePositiveIndex); } - noteFocusChanged(1, FocusedElement.Description); - setItems(newList); + + noteFocusChanged(1, FocusedElement.Amount); } /** * A transaction is submittable if: @@ -594,17 +630,17 @@ public class NewTransactionModel extends ViewModel { String.format("Resetting hint of '%s' [%s]", Misc.nullIsEmpty(acc.getAccountName()), balCurrency)); - if (acc.amountHintIsSet && !TextUtils.isEmpty(acc.getAmountHint())) { + // skip if the amount is set, in which case the hint is not + // important/visible + if (!acc.isAmountSet() && acc.amountHintIsSet && + !TextUtils.isEmpty(acc.getAmountHint())) + { if (workingWithLiveList && !liveListCopied) { list = copyList(list); liveListCopied = true; } final TransactionAccount newAcc = new TransactionAccount(acc); newAcc.setAmountHint(null); - if (!liveListCopied) { - list = copyList(list); - liveListCopied = true; - } list.set(i, newAcc); listChanged = true; } @@ -830,9 +866,6 @@ public class NewTransactionModel extends ViewModel { setItems(newList); } - public LiveData getAccountCount() { - return accountCount; - } public boolean accountListIsEmpty() { List items = Objects.requireNonNull(this.items.getValue()); @@ -1016,7 +1049,9 @@ public class NewTransactionModel extends ViewModel { private boolean amountSet; private boolean amountValid = true; private FocusedElement focusedElement = FocusedElement.Account; - private boolean amountHintIsSet = false; + private boolean amountHintIsSet = true; + private boolean isLast = false; + private int accountNameCursorPosition; public TransactionAccount(TransactionAccount origin) { id = origin.id; accountName = origin.accountName; @@ -1028,6 +1063,8 @@ public class NewTransactionModel extends ViewModel { currency = origin.currency; amountValid = origin.amountValid; focusedElement = origin.focusedElement; + isLast = origin.isLast; + accountNameCursorPosition = origin.accountNameCursorPosition; } public TransactionAccount(LedgerTransactionAccount account) { super(); @@ -1043,6 +1080,9 @@ public class NewTransactionModel extends ViewModel { this.accountName = accountName; this.currency = currency; } + public boolean isLast() { + return isLast; + } public boolean isAmountSet() { return amountSet; } @@ -1129,25 +1169,37 @@ public class NewTransactionModel extends ViewModel { if (!TextUtils.isEmpty(comment)) b.append(String.format(" /%s/", comment)); + if (isLast) + b.append(" last"); + return b.toString(); } public boolean equalContents(TransactionAccount other) { if (other == null) return false; - boolean equal = TextUtils.equals(accountName, other.accountName) && - TextUtils.equals(comment, other.comment) && - (amountSet ? other.amountSet && amount == other.amount - : !other.amountSet) && - (amountHintIsSet ? other.amountHintIsSet && - TextUtils.equals(amountHint, other.amountHint) - : !other.amountHintIsSet) && - TextUtils.equals(currency, other.currency); + boolean equal = TextUtils.equals(accountName, other.accountName); + equal = equal && TextUtils.equals(comment, other.comment) && + (amountSet ? other.amountSet && amount == other.amount : !other.amountSet); + + // compare amount hint only if there is no amount + if (!amountSet) + equal = equal && (amountHintIsSet ? other.amountHintIsSet && + TextUtils.equals(amountHint, other.amountHint) + : !other.amountHintIsSet); + equal = equal && TextUtils.equals(currency, other.currency) && isLast == other.isLast; + Logger.debug("new-trans", String.format("Comparing {%s} and {%s}: %s", this.toString(), other.toString(), equal)); return equal; } + public int getAccountNameCursorPosition() { + return accountNameCursorPosition; + } + public void setAccountNameCursorPosition(int position) { + this.accountNameCursorPosition = position; + } } private static class BalanceForCurrency {