]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionAccountRowItemHolder.java
focus amount when account is selected
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / ui / new_transaction / NewTransactionAccountRowItemHolder.java
index 7039f53a9b2ea479835c729b6ceb18678d506d44..8f1c51dd9ae24e9a922747a5e5536a09a6ab0b65 100644 (file)
@@ -35,7 +35,7 @@ import androidx.recyclerview.widget.RecyclerView;
 
 import net.ktnx.mobileledger.R;
 import net.ktnx.mobileledger.databinding.NewTransactionAccountRowBinding;
-import net.ktnx.mobileledger.db.AccountAutocompleteAdapter;
+import net.ktnx.mobileledger.db.AccountWithAmountsAutocompleteAdapter;
 import net.ktnx.mobileledger.model.Currency;
 import net.ktnx.mobileledger.model.Data;
 import net.ktnx.mobileledger.ui.CurrencySelectorFragment;
@@ -44,13 +44,11 @@ import net.ktnx.mobileledger.utils.DimensionUtils;
 import net.ktnx.mobileledger.utils.Logger;
 import net.ktnx.mobileledger.utils.Misc;
 
-import java.text.DecimalFormatSymbols;
+import java.text.ParseException;
 
 class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder {
-    private final String decimalDot = ".";
     private final NewTransactionAccountRowBinding b;
     private boolean ignoreFocusChanges = false;
-    private String decimalSeparator;
     private boolean inUpdate = false;
     private boolean syncingData = false;
     NewTransactionAccountRowItemHolder(@NonNull NewTransactionAccountRowBinding b,
@@ -94,12 +92,13 @@ class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder {
                 if (id == R.id.account_row_acc_amounts) {
                     try {
                         String input = String.valueOf(b.accountRowAccAmounts.getText());
-                        input = input.replace(decimalSeparator, decimalDot);
-                        final String newText = String.format("%4.2f", Float.parseFloat(input));
+                        input = input.replace(Data.getDecimalSeparator(), Data.decimalDot);
+                        final String newText = Data.formatNumber(Float.parseFloat(input));
                         if (!newText.equals(input)) {
                             boolean wasSyncingData = syncingData;
                             syncingData = true;
                             try {
+                                // there is a listener that will propagate the change to the model
                                 b.accountRowAccAmounts.setText(newText);
                             }
                             finally {
@@ -125,13 +124,12 @@ class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder {
         NewTransactionActivity activity = (NewTransactionActivity) b.getRoot()
                                                                     .getContext();
 
-        b.accountRowAccName.setAdapter(new AccountAutocompleteAdapter(b.getRoot()
-                                                                       .getContext(), mProfile));
-
-        decimalSeparator = "";
-        Data.locale.observe(activity, locale -> decimalSeparator = String.valueOf(
-                DecimalFormatSymbols.getInstance(locale)
-                                    .getMonetaryDecimalSeparator()));
+        b.accountRowAccName.setAdapter(new AccountWithAmountsAutocompleteAdapter(b.getRoot()
+                                                                                  .getContext(),
+                mProfile));
+        b.accountRowAccName.setOnItemClickListener((parent, view, position, id) -> {
+            adapter.noteFocusIsOnAmount(position);
+        });
 
         final TextWatcher tw = new TextWatcher() {
             @Override
@@ -251,14 +249,21 @@ class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder {
         }
     }
     public void checkAmountValid(String s) {
+        // FIXME this needs to be done in the model only
         boolean valid = true;
         try {
             if (s.length() > 0) {
-                float ignored = Float.parseFloat(s.replace(decimalSeparator, decimalDot));
+                float ignored =
+                        Float.parseFloat(s.replace(Data.getDecimalSeparator(), Data.decimalDot));
             }
         }
         catch (NumberFormatException ex) {
-            valid = false;
+            try {
+                float ignored = Data.parseNumber(s);
+            }
+            catch (ParseException ex2) {
+                valid = false;
+            }
         }
 
         displayAmountValidity(valid);
@@ -403,7 +408,7 @@ class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder {
 
         if (getBindingAdapterPosition() == RecyclerView.NO_POSITION) {
             // probably the row was swiped out
-            Logger.debug("new-trans", "Ignoring request to suncData(): adapter position negative");
+            Logger.debug("new-trans", "Ignoring request to syncData(): adapter position negative");
             return false;
         }
 
@@ -431,44 +436,23 @@ class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder {
             acc.setComment(String.valueOf(b.comment.getText()));
 
             String amount = String.valueOf(b.accountRowAccAmounts.getText());
-            amount = amount.trim();
 
-            if (amount.isEmpty()) {
-                if (acc.isAmountSet())
-                    significantChange = true;
-                acc.resetAmount();
-                acc.setAmountValid(true);
-            }
-            else {
-                try {
-                    amount = amount.replace(decimalSeparator, decimalDot);
-                    final float parsedAmount = Float.parseFloat(amount);
-                    if (!acc.isAmountSet() || !Misc.equalFloats(parsedAmount, acc.getAmount()))
-                        significantChange = true;
-                    acc.setAmount(parsedAmount);
-                    acc.setAmountValid(true);
-                }
-                catch (NumberFormatException e) {
-                    Logger.debug("new-trans", String.format(
-                            "assuming amount is not set due to number format exception. " +
-                            "input was '%s'", amount));
-                    if (acc.isAmountValid())
-                        significantChange = true;
-                    acc.setAmountValid(false);
-                }
-                final String curr = String.valueOf(b.currency.getText());
-                final String currValue;
-                if (curr.equals(b.currency.getContext()
-                                          .getResources()
-                                          .getString(R.string.currency_symbol)) || curr.isEmpty())
-                    currValue = null;
-                else
-                    currValue = curr;
-
-                if (!significantChange && !Misc.equalStrings(acc.getCurrency(), currValue))
-                    significantChange = true;
-                acc.setCurrency(currValue);
-            }
+            if (acc.setAndCheckAmountText(Misc.nullIsEmpty(amount)))
+                significantChange = true;
+            displayAmountValidity(!acc.isAmountSet() || acc.isAmountValid());
+
+            final String curr = String.valueOf(b.currency.getText());
+            final String currValue;
+            if (curr.equals(b.currency.getContext()
+                                      .getResources()
+                                      .getString(R.string.currency_symbol)) || curr.isEmpty())
+                currValue = null;
+            else
+                currValue = curr;
+
+            if (!significantChange && !Misc.equalStrings(acc.getCurrency(), currValue))
+                significantChange = true;
+            acc.setCurrency(currValue);
 
             return significantChange;
         }
@@ -497,8 +481,8 @@ class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder {
                                     presentAccountName, incomingAccountName,
                                     acc.getAccountNameCursorPosition()));
                     // avoid triggering completion pop-up
-                    AccountAutocompleteAdapter a =
-                            (AccountAutocompleteAdapter) b.accountRowAccName.getAdapter();
+                    AccountWithAmountsAutocompleteAdapter a =
+                            (AccountWithAmountsAutocompleteAdapter) b.accountRowAccName.getAdapter();
                     try {
                         b.accountRowAccName.setAdapter(null);
                         b.accountRowAccName.setText(incomingAccountName);
@@ -521,9 +505,8 @@ class NewTransactionAccountRowItemHolder extends NewTransactionItemViewHolder {
                         acc.isLast() ? EditorInfo.IME_ACTION_DONE : EditorInfo.IME_ACTION_NEXT);
 
                 setCurrencyString(acc.getCurrency());
-                b.accountRowAccAmounts.setText(
-                        acc.isAmountSet() ? String.format("%4.2f", acc.getAmount()) : null);
-                displayAmountValidity(true);
+                b.accountRowAccAmounts.setText(acc.getAmountText());
+                displayAmountValidity(!acc.isAmountSet() || acc.isAmountValid());
 
                 final String comment = acc.getComment();
                 b.comment.setText(comment);