]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/ui/activity/NewTransactionItemHolder.java
track locale changes in new transaction entry activity
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / ui / activity / NewTransactionItemHolder.java
index 504ec0adc0811477726869e4c2810ffaefec7da0..0ee99136eaa0d51579677b296e4a55e42a397b85 100644 (file)
@@ -67,7 +67,7 @@ class NewTransactionItemHolder extends RecyclerView.ViewHolder
     private AutoCompleteTextView tvDescription;
     private AutoCompleteTextView tvAccount;
     private TextView tvComment;
-    private TextView tvAmount;
+    private EditText tvAmount;
     private LinearLayout lHead;
     private ViewGroup lAccount;
     private FrameLayout lPadding;
@@ -81,6 +81,7 @@ class NewTransactionItemHolder extends RecyclerView.ViewHolder
     private Observer<Boolean> editableObserver;
     private Observer<Boolean> commentVisibleObserver;
     private Observer<String> commentObserver;
+    private Observer<Locale> localeObserver;
     private boolean inUpdate = false;
     private boolean syncingData = false;
     private View commentButton;
@@ -187,15 +188,14 @@ class NewTransactionItemHolder extends RecyclerView.ViewHolder
                 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
                     // only one decimal separator is allowed
                     // plus and minus are allowed only at the beginning
+                    String allowed = "0123456789";
                     String val = s.toString();
-                    if (val.isEmpty())
-                        tvAmount.setKeyListener(DigitsKeyListener.getInstance(
-                                "0123456789+-" + decimalSeparator + decimalDot));
-                    else if (val.contains(decimalSeparator) || val.contains(decimalDot))
-                        tvAmount.setKeyListener(DigitsKeyListener.getInstance("0123456789"));
-                    else
-                        tvAmount.setKeyListener(DigitsKeyListener.getInstance(
-                                "0123456789" + decimalSeparator + decimalDot));
+                    if (val.isEmpty() || (tvAmount.getSelectionStart() == 0))
+                        allowed += "-";
+                    if (!val.contains(decimalSeparator) && !val.contains(decimalDot))
+                        allowed += decimalSeparator + decimalDot;
+
+                    tvAmount.setKeyListener(DigitsKeyListener.getInstance(allowed));
 
                     syncData();
                     adapter.model.checkTransactionSubmittable(adapter);
@@ -207,7 +207,6 @@ class NewTransactionItemHolder extends RecyclerView.ViewHolder
         tvComment.addTextChangedListener(tw);
         tvAmount.addTextChangedListener(amountWatcher);
 
-        // FIXME: react on locale changes
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
             tvAmount.setKeyListener(DigitsKeyListener.getInstance(Locale.getDefault(), true, true));
         else
@@ -315,6 +314,11 @@ class NewTransactionItemHolder extends RecyclerView.ViewHolder
             else
                 tvAmount.setImeOptions(EditorInfo.IME_ACTION_NEXT);
         };
+
+        localeObserver = locale -> {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
+                tvAmount.setKeyListener(DigitsKeyListener.getInstance(locale, true, true));
+        };
     }
     private void setEditable(Boolean editable) {
         tvDate.setEnabled(editable);
@@ -443,6 +447,7 @@ class NewTransactionItemHolder extends RecyclerView.ViewHolder
                          .stopObservingFocusedItem(focusedAccountObserver);
                 this.item.getModel()
                          .stopObservingAccountCount(accountCountObserver);
+                Data.locale.removeObserver(localeObserver);
 
                 this.item = null;
             }
@@ -495,6 +500,7 @@ class NewTransactionItemHolder extends RecyclerView.ViewHolder
                     .observeFocusedItem(activity, focusedAccountObserver);
                 item.getModel()
                     .observeAccountCount(activity, accountCountObserver);
+                Data.locale.observe(activity, localeObserver);
             }
         }
         finally {