setItemsWithoutSubmittableChecks(newList);
}
private void setItemsWithoutSubmittableChecks(@NonNull List<Item> 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)
list.set(cnt - 1, replacement);
}
+ if (BuildConfig.DEBUG)
+ dumpItemList("Before setValue()", list);
items.setValue(list);
}
private List<Item> copyList() {
- return copyList(null);
- }
- private List<Item> copyList(@Nullable List<Item> source) {
List<Item> copy = new ArrayList<>();
- List<Item> oldList = (source == null) ? items.getValue() : source;
+ List<Item> oldList = items.getValue();
if (oldList != null)
for (Item item : oldList) {
return copy;
}
- private List<Item> shallowCopyListWithoutItem(int position) {
+ private List<Item> copyListWithoutItem(int position) {
List<Item> copy = new ArrayList<>();
List<Item> oldList = items.getValue();
for (Item item : oldList) {
if (i++ == position)
continue;
- copy.add(item);
+ copy.add(Item.from(item));
}
}
list.add(new TransactionAccount(""));
list.add(new TransactionAccount(""));
noteFocusChanged(0, FocusedElement.Description);
+ isSubmittable.setValue(false);
setItemsWithoutSubmittableChecks(list);
}
boolean accountsInInitialState() {
return null;
}
void removeItem(int pos) {
- List<Item> newList = shallowCopyListWithoutItem(pos);
+ Logger.debug("new-trans", String.format(Locale.US, "Removing item at position %d", pos));
+ List<Item> newList = copyListWithoutItem(pos);
+ final FocusInfo fi = focusInfo.getValue();
+ if ((fi != null) && (pos < fi.position))
+ noteFocusChanged(fi.position - 1, fi.element);
setItems(newList);
}
void noteFocusChanged(int position, FocusedElement element) {
List<Item> newList = shallowCopyList();
Item item = newList.remove(fromIndex);
newList.add(toIndex, item);
+
+ FocusInfo fi = focusInfo.getValue();
+ if (fi != null && fi.position == fromIndex)
+ noteFocusChanged(toIndex, fi.element);
+
items.setValue(newList); // same count, same submittable state
}
void moveItemLast(List<Item> list, int index) {
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<Item> 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<Boolean> observer) {
busyFlag.removeObserver(observer);
@SuppressLint("DefaultLocale")
void checkTransactionSubmittable(@Nullable List<Item> list) {
boolean workingWithLiveList = false;
- boolean liveListCopied = false;
if (list == null) {
- list = Objects.requireNonNull(items.getValue());
+ list = copyList();
workingWithLiveList = true;
}
if (BuildConfig.DEBUG)
- dumpItemList("Before submittable checks", list);
+ dumpItemList(String.format("Before submittable checks (%s)",
+ workingWithLiveList ? "LIVE LIST" : "custom list"), list);
int accounts = 0;
final BalanceForCurrency balance = new BalanceForCurrency();
if (Misc.equalStrings(acc.getCurrency(), balCurrency)) {
if (BuildConfig.DEBUG)
Logger.debug("submittable",
- String.format("Resetting hint of '%s' [%s]",
- Misc.nullIsEmpty(acc.getAccountName()),
+ String.format(Locale.US, "Resetting hint of %d:'%s' [%s]",
+ i, Misc.nullIsEmpty(acc.getAccountName()),
balCurrency));
// 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);
+ acc.setAmountHint(null);
listChanged = true;
}
}
if (item == receiver) {
final String hint = String.format("%1.2f", -currencyBalance);
if (!acc.isAmountHintSet() ||
- !TextUtils.equals(acc.getAmountHint(), hint))
+ !Misc.equalStrings(acc.getAmountHint(), hint))
{
Logger.debug("submittable",
String.format("Setting amount hint of {%s} to %s [%s]",
acc.toString(), hint, balCurrency));
- if (workingWithLiveList & !liveListCopied) {
- list = copyList(list);
- liveListCopied = true;
- }
- final TransactionAccount newAcc = new TransactionAccount(acc);
- newAcc.setAmountHint(hint);
- list.set(i, newAcc);
+ acc.setAmountHint(hint);
listChanged = true;
}
}
Misc.nullIsEmpty(acc.getAccountName()),
balCurrency));
if (acc.amountHintIsSet && !TextUtils.isEmpty(acc.getAmountHint())) {
- if (workingWithLiveList && !liveListCopied) {
- list = copyList(list);
- liveListCopied = true;
- }
- final TransactionAccount newAcc = new TransactionAccount(acc);
- newAcc.setAmountHint(null);
- list.set(i, newAcc);
+ acc.setAmountHint(null);
listChanged = true;
}
}
// }
//
// if (!foundIt)
- if (workingWithLiveList && !liveListCopied) {
- list = copyList(list);
- liveListCopied = true;
- }
final TransactionAccount newAcc = new TransactionAccount("", balCurrency);
final float bal = balance.get(balCurrency);
if (!Misc.isZero(bal) && currAmounts == currRows)
for (String currName : emptyRowsForCurrency.currencies()) {
List<Item> emptyItems = emptyRowsForCurrency.getList(currName);
while ((list.size() > MIN_ITEMS) && (emptyItems.size() > 1)) {
- if (workingWithLiveList && !liveListCopied) {
- list = copyList(list);
- liveListCopied = true;
- }
// the list is a copy, so the empty item is no longer present
Item itemToRemove = emptyItems.remove(1);
removeItemById(list, itemToRemove.id);
List<Item> currItems = itemsForCurrency.getList(currName);
if (currItems.size() == 1) {
- if (workingWithLiveList && !liveListCopied) {
- list = copyList(list);
- liveListCopied = true;
- }
// the list is a copy, so the empty item is no longer present
removeItemById(list, emptyItems.get(0).id);
listChanged = true;
// 6) at least two rows need to be present in the ledger
// (the list also contains header and trailer)
while (list.size() < MIN_ITEMS) {
- if (workingWithLiveList && !liveListCopied) {
- list = copyList(list);
- liveListCopied = true;
- }
list.add(new TransactionAccount(""));
listChanged = true;
}
-
Logger.debug("submittable", submittable ? "YES" : "NO");
isSubmittable.setValue(submittable);
if (TextUtils.isEmpty(description))
b.append(" «no description»");
else
- b.append(String.format(" descr'%s'", description));
+ b.append(String.format(" '%s'", description));
if (date != null)
b.append(String.format("@%s", date.toString()));
return false;
return Objects.equals(date, other.date) &&
- TextUtils.equals(description, other.description) &&
- TextUtils.equals(comment, other.comment);
+ Misc.equalStrings(description, other.description) &&
+ Misc.equalStrings(comment, other.comment);
}
}
private boolean amountSet;
private boolean amountValid = true;
private FocusedElement focusedElement = FocusedElement.Account;
- private boolean amountHintIsSet = true;
+ private boolean amountHintIsSet = false;
private boolean isLast = false;
private int accountNameCursorPosition;
public TransactionAccount(TransactionAccount origin) {
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);
- equal = equal && TextUtils.equals(comment, other.comment) &&
+ boolean equal = Misc.equalStrings(accountName, other.accountName);
+ equal = equal && Misc.equalStrings(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)
+ Misc.equalStrings(amountHint, other.amountHint)
: !other.amountHintIsSet);
- equal = equal && TextUtils.equals(currency, other.currency) && isLast == other.isLast;
+ equal = equal && Misc.equalStrings(currency, other.currency) && isLast == other.isLast;
Logger.debug("new-trans",
String.format("Comparing {%s} and {%s}: %s", this.toString(), other.toString(),