]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/ui/templates/TemplateDetailsAdapter.java
fix template editor layout
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / ui / templates / TemplateDetailsAdapter.java
index a12c92b68d3daf955429deab274d9cdac512e61e..1872ff2ff7d0ee5139219ed899aed529ffcf8783 100644 (file)
@@ -18,6 +18,7 @@
 package net.ktnx.mobileledger.ui.templates;
 
 import android.annotation.SuppressLint;
+import android.content.Context;
 import android.content.res.Resources;
 import android.text.Editable;
 import android.text.TextWatcher;
@@ -34,14 +35,15 @@ import androidx.recyclerview.widget.DiffUtil;
 import androidx.recyclerview.widget.ItemTouchHelper;
 import androidx.recyclerview.widget.RecyclerView;
 
+import net.ktnx.mobileledger.BuildConfig;
 import net.ktnx.mobileledger.R;
 import net.ktnx.mobileledger.databinding.TemplateDetailsAccountBinding;
 import net.ktnx.mobileledger.databinding.TemplateDetailsHeaderBinding;
 import net.ktnx.mobileledger.db.AccountAutocompleteAdapter;
-import net.ktnx.mobileledger.db.TemplateBase;
 import net.ktnx.mobileledger.model.Data;
 import net.ktnx.mobileledger.model.TemplateDetailsItem;
-import net.ktnx.mobileledger.ui.QRScanCapableFragment;
+import net.ktnx.mobileledger.ui.HelpDialog;
+import net.ktnx.mobileledger.ui.QR;
 import net.ktnx.mobileledger.ui.TemplateDetailSourceSelectorFragment;
 import net.ktnx.mobileledger.utils.Logger;
 import net.ktnx.mobileledger.utils.Misc;
@@ -49,7 +51,6 @@ import net.ktnx.mobileledger.utils.Misc;
 import org.jetbrains.annotations.NotNull;
 
 import java.text.ParseException;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 import java.util.regex.Matcher;
@@ -100,7 +101,7 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter<TemplateDetailsAdapter
         itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
             @Override
             public float getMoveThreshold(@NonNull RecyclerView.ViewHolder viewHolder) {
-                return 0.1f;
+                return 0.5f;
             }
             @Override
             public boolean isLongPressDragEnabled() {
@@ -166,6 +167,16 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter<TemplateDetailsAdapter
 
                 final int fromPosition = viewHolder.getAdapterPosition();
                 final int toPosition = target.getAdapterPosition();
+                if (fromPosition == toPosition) {
+                    Logger.debug("drag", String.format(Locale.US,
+                            "Ignoring request to move an account from position %d to %d",
+                            fromPosition, toPosition));
+                    return false;
+                }
+
+                Logger.debug("drag",
+                        String.format(Locale.US, "Moving account from %d to %d", fromPosition,
+                                toPosition));
                 mModel.moveItem(fromPosition, toPosition);
 
                 return true;
@@ -233,15 +244,16 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter<TemplateDetailsAdapter
         return differ.getCurrentList()
                      .size();
     }
-    public void setTemplateItems(List<TemplateBase> items) {
-        ArrayList<TemplateDetailsItem> list = new ArrayList<>();
-        for (TemplateBase p : items) {
-            TemplateDetailsItem item = TemplateDetailsItem.fromRoomObject(p);
-            list.add(item);
-        }
-        setItems(list);
-    }
     public void setItems(List<TemplateDetailsItem> items) {
+        if (BuildConfig.DEBUG) {
+            Logger.debug("tmpl", "Got new list");
+            for (int i = 1; i < items.size(); i++) {
+                final TemplateDetailsItem item = items.get(i);
+                Logger.debug("tmpl",
+                        String.format(Locale.US, "  %d: id %d, pos %d", i, item.getId(),
+                                item.getPosition()));
+            }
+        }
         differ.submitList(items);
     }
     public String getMatchGroupText(int groupNumber) {
@@ -390,6 +402,22 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter<TemplateDetailsAdapter
                 }
             };
             b.transactionComment.addTextChangedListener(transactionCommentWatcher);
+
+            b.templateIsFallbackSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
+                if (updatePropagationDisabled)
+                    return;
+
+                getItem().setFallback(isChecked);
+                b.templateIsFallbackText.setText(isChecked ? R.string.template_is_fallback_yes
+                                                           : R.string.template_is_fallback_no);
+            });
+            final View.OnClickListener fallbackLabelClickListener =
+                    (view) -> b.templateIsFallbackSwitch.toggle();
+            b.templateIsFallbackLabel.setOnClickListener(fallbackLabelClickListener);
+            b.templateIsFallbackText.setOnClickListener(fallbackLabelClickListener);
+            b.templateParamsHelpButton.setOnClickListener(v -> HelpDialog.show(b.getRoot()
+                                                                                .getContext(),
+                    R.string.template_details_template_params_label, R.array.template_params_help));
         }
         @NotNull
         private TemplateDetailsItem.Header getItem() {
@@ -469,57 +497,57 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter<TemplateDetailsAdapter
                 b.testText.setText(header.getTestText());
 
                 if (header.hasLiteralDateYear()) {
-                    b.templateDetailsYearSource.setText(R.string.template_details_source_literal);
+                    b.yearSource.setText(R.string.template_details_source_literal);
                     final Integer dateYear = header.getDateYear();
                     b.templateDetailsDateYear.setText(
                             (dateYear == null) ? null : String.valueOf(dateYear));
-                    b.templateDetailsDateYearLayout.setVisibility(View.VISIBLE);
+                    b.yearLayout.setVisibility(View.VISIBLE);
                 }
                 else {
-                    b.templateDetailsDateYearLayout.setVisibility(View.GONE);
-                    b.templateDetailsYearSource.setText(
+                    b.yearLayout.setVisibility(View.GONE);
+                    b.yearSource.setText(
                             String.format(Locale.US, groupNoText, header.getDateYearMatchGroup(),
                                     getMatchGroupText(header.getDateYearMatchGroup())));
                 }
-                b.templateDetailsYearSourceLabel.setOnClickListener(
+                b.yearSourceLabel.setOnClickListener(
                         v -> selectHeaderDetailSource(v, HeaderDetail.DATE_YEAR));
-                b.templateDetailsYearSource.setOnClickListener(
+                b.yearSource.setOnClickListener(
                         v -> selectHeaderDetailSource(v, HeaderDetail.DATE_YEAR));
 
                 if (header.hasLiteralDateMonth()) {
-                    b.templateDetailsMonthSource.setText(R.string.template_details_source_literal);
+                    b.monthSource.setText(R.string.template_details_source_literal);
                     final Integer dateMonth = header.getDateMonth();
                     b.templateDetailsDateMonth.setText(
                             (dateMonth == null) ? null : String.valueOf(dateMonth));
-                    b.templateDetailsDateMonthLayout.setVisibility(View.VISIBLE);
+                    b.monthLayout.setVisibility(View.VISIBLE);
                 }
                 else {
-                    b.templateDetailsDateMonthLayout.setVisibility(View.GONE);
-                    b.templateDetailsMonthSource.setText(
+                    b.monthLayout.setVisibility(View.GONE);
+                    b.monthSource.setText(
                             String.format(Locale.US, groupNoText, header.getDateMonthMatchGroup(),
                                     getMatchGroupText(header.getDateMonthMatchGroup())));
                 }
-                b.templateDetailsMonthSourceLabel.setOnClickListener(
+                b.monthSourceLabel.setOnClickListener(
                         v -> selectHeaderDetailSource(v, HeaderDetail.DATE_MONTH));
-                b.templateDetailsMonthSource.setOnClickListener(
+                b.monthSource.setOnClickListener(
                         v -> selectHeaderDetailSource(v, HeaderDetail.DATE_MONTH));
 
                 if (header.hasLiteralDateDay()) {
-                    b.templateDetailsDaySource.setText(R.string.template_details_source_literal);
+                    b.daySource.setText(R.string.template_details_source_literal);
                     final Integer dateDay = header.getDateDay();
                     b.templateDetailsDateDay.setText(
                             (dateDay == null) ? null : String.valueOf(dateDay));
-                    b.templateDetailsDateDayLayout.setVisibility(View.VISIBLE);
+                    b.dayLayout.setVisibility(View.VISIBLE);
                 }
                 else {
-                    b.templateDetailsDateDayLayout.setVisibility(View.GONE);
-                    b.templateDetailsDaySource.setText(
+                    b.dayLayout.setVisibility(View.GONE);
+                    b.daySource.setText(
                             String.format(Locale.US, groupNoText, header.getDateDayMatchGroup(),
                                     getMatchGroupText(header.getDateDayMatchGroup())));
                 }
-                b.templateDetailsDaySourceLabel.setOnClickListener(
+                b.daySourceLabel.setOnClickListener(
                         v -> selectHeaderDetailSource(v, HeaderDetail.DATE_DAY));
-                b.templateDetailsDaySource.setOnClickListener(
+                b.daySource.setOnClickListener(
                         v -> selectHeaderDetailSource(v, HeaderDetail.DATE_DAY));
 
                 if (header.hasLiteralTransactionDescription()) {
@@ -561,6 +589,11 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter<TemplateDetailsAdapter
 
                 b.templateDetailsHeadScanQrButton.setOnClickListener(this::scanTestQR);
 
+                b.templateIsFallbackSwitch.setChecked(header.isFallback());
+                b.templateIsFallbackText.setText(
+                        header.isFallback() ? R.string.template_is_fallback_yes
+                                            : R.string.template_is_fallback_no);
+
                 checkPatternError(header);
             }
             finally {
@@ -589,7 +622,9 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter<TemplateDetailsAdapter
 
         }
         private void scanTestQR(View view) {
-            QRScanCapableFragment.triggerQRScan();
+            Context ctx = view.getContext();
+            if (ctx instanceof QR.QRScanTrigger)
+                ((QR.QRScanTrigger) ctx).triggerQRScan();
         }
     }
 
@@ -613,6 +648,8 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter<TemplateDetailsAdapter
                     Logger.debug(D_TEMPLATE_UI,
                             "Storing changed account name " + s + "; accRow=" + accRow);
                     accRow.setAccountName(String.valueOf(s));
+
+                    mModel.applyList(null);
                 }
             };
             b.templateDetailsAccountName.addTextChangedListener(accountNameWatcher);
@@ -635,6 +672,8 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter<TemplateDetailsAdapter
                     Logger.debug(D_TEMPLATE_UI,
                             "Storing changed account comment " + s + "; accRow=" + accRow);
                     accRow.setAccountComment(String.valueOf(s));
+
+                    mModel.applyList(null);
                 }
             };
             b.templateDetailsAccountComment.addTextChangedListener(accountCommentWatcher);
@@ -642,11 +681,9 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter<TemplateDetailsAdapter
             b.templateDetailsAccountAmount.addTextChangedListener(new TextWatcher() {
                 @Override
                 public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-
                 }
                 @Override
                 public void onTextChanged(CharSequence s, int start, int before, int count) {
-
                 }
                 @Override
                 public void afterTextChanged(Editable s) {
@@ -673,6 +710,8 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter<TemplateDetailsAdapter
                             b.templateDetailsAccountAmountLayout.setError("!");
                         }
                     }
+
+                    mModel.applyList(null);
                 }
             });
             b.templateDetailsAccountAmount.setOnFocusChangeListener((v, hasFocus) -> {
@@ -721,6 +760,8 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter<TemplateDetailsAdapter
                                              .getResources();
                 String groupNoText = resources.getString(R.string.template_item_match_group_source);
 
+                Logger.debug("drag", String.format(Locale.US, "Binding account id %d, pos %d at %d",
+                        item.getId(), item.getPosition(), getAdapterPosition()));
                 TemplateDetailsItem.AccountRow accRow = item.asAccountRowItem();
                 b.patternAccountLabel.setText(String.format(Locale.US,
                         resources.getString(R.string.template_details_account_row_label),