]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionModel.java
fix IME hints for amount inputs
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / ui / new_transaction / NewTransactionModel.java
index 060046c43ce4f87fb3b7fb87885356b0e9b501ef..a4fe14d2a0c65216e6fec6033bf58e73c0800327 100644 (file)
@@ -68,7 +68,6 @@ public class NewTransactionModel extends ViewModel {
     private final MutableLiveData<Boolean> isSubmittable = new InertMutableLiveData<>(false);
     private final MutableLiveData<Boolean> showComments = new MutableLiveData<>(true);
     private final MutableLiveData<List<Item>> items = new MutableLiveData<>();
-    private final MutableLiveData<Integer> accountCount = new InertMutableLiveData<>(0);
     private final MutableLiveData<Boolean> simulateSave = new InertMutableLiveData<>(false);
     private final AtomicInteger busyCounter = new AtomicInteger(0);
     private final MutableLiveData<Boolean> busyFlag = new InertMutableLiveData<>(false);
@@ -93,8 +92,25 @@ public class NewTransactionModel extends ViewModel {
     }
     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)
+                                                .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<Item> 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<Item> 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<Item> 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<Item> list) {
         Logger.debug("submittable", "== Dump of all items " + msg);
@@ -816,9 +848,6 @@ public class NewTransactionModel extends ViewModel {
 
         setItems(newList);
     }
-    public LiveData<Integer> getAccountCount() {
-        return accountCount;
-    }
     public boolean accountListIsEmpty() {
         List<Item> 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));