]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionFragment.java
offer fallback templates only when no other template matches
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / ui / new_transaction / NewTransactionFragment.java
index e708c5fe3f2d7a37e88e684fdede50b52f57d3b3..5edf252d72858ceccacef8663fe388e897a7810f 100644 (file)
@@ -95,10 +95,10 @@ public class NewTransactionFragment extends QRScanCapableFragment {
         args.putString(TemplatesActivity.ARG_ADD_TEMPLATE, scanned);
         requireContext().startActivity(intent, args);
     }
-    private void alertNoPatternMatch(String scanned) {
+    private void alertNoTemplateMatch(String scanned) {
         MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireContext());
         builder.setCancelable(true)
-               .setMessage(R.string.no_pattern_matches)
+               .setMessage(R.string.no_template_matches)
                .setPositiveButton(R.string.add_button,
                        (dialog, which) -> startNewPatternActivity(scanned))
                .create()
@@ -110,13 +110,14 @@ public class NewTransactionFragment extends QRScanCapableFragment {
         if (Misc.emptyIsNull(text) == null)
             return;
 
-        LiveData<List<TemplateHeader>> allPatterns = DB.get()
-                                                       .getPatternDAO()
-                                                       .getPatterns();
-        allPatterns.observe(getViewLifecycleOwner(), patternHeaders -> {
-            ArrayList<TemplateHeader> matchingPatterns = new ArrayList<>();
+        LiveData<List<TemplateHeader>> allTemplates = DB.get()
+                                                        .getTemplateDAO()
+                                                        .getTemplates();
+        allTemplates.observe(getViewLifecycleOwner(), templateHeaders -> {
+            ArrayList<TemplateHeader> matchingFallbackTemplates = new ArrayList<>();
+            ArrayList<TemplateHeader> matchingTemplates = new ArrayList<>();
 
-            for (TemplateHeader ph : patternHeaders) {
+            for (TemplateHeader ph : templateHeaders) {
                 String patternSource = ph.getRegularExpression();
                 if (Misc.emptyIsNull(patternSource) == null)
                     continue;
@@ -129,7 +130,10 @@ public class NewTransactionFragment extends QRScanCapableFragment {
                     Logger.debug("pattern",
                             String.format("Pattern '%s' [%s] matches '%s'", ph.getName(),
                                     patternSource, text));
-                    matchingPatterns.add(ph);
+                    if (ph.isFallback())
+                        matchingFallbackTemplates.add(ph);
+                    else
+                        matchingTemplates.add(ph);
                 }
                 catch (ParcelFormatException e) {
                     // ignored
@@ -139,31 +143,34 @@ public class NewTransactionFragment extends QRScanCapableFragment {
                 }
             }
 
-            if (matchingPatterns.isEmpty())
-                alertNoPatternMatch(text);
-            else if (matchingPatterns.size() == 1)
-                applyPattern(matchingPatterns.get(0), text);
+            if (matchingTemplates.isEmpty())
+                matchingTemplates = matchingFallbackTemplates;
+
+            if (matchingTemplates.isEmpty())
+                alertNoTemplateMatch(text);
+            else if (matchingTemplates.size() == 1)
+                applyTemplate(matchingTemplates.get(0), text);
             else
-                choosePattern(matchingPatterns, text);
+                chooseTemplate(matchingTemplates, text);
         });
     }
-    private void choosePattern(ArrayList<TemplateHeader> matchingPatterns, String matchedText) {
-        final String patternNameColumn = "name";
+    private void chooseTemplate(ArrayList<TemplateHeader> matchingTemplates, String matchedText) {
+        final String templateNameColumn = "name";
         AbstractCursor cursor = new AbstractCursor() {
             @Override
             public int getCount() {
-                return matchingPatterns.size();
+                return matchingTemplates.size();
             }
             @Override
             public String[] getColumnNames() {
-                return new String[]{"_id", patternNameColumn};
+                return new String[]{"_id", templateNameColumn};
             }
             @Override
             public String getString(int column) {
                 if (column == 0)
                     return String.valueOf(getPosition());
-                return matchingPatterns.get(getPosition())
-                                       .getName();
+                return matchingTemplates.get(getPosition())
+                                        .getName();
             }
             @Override
             public short getShort(int column) {
@@ -199,15 +206,16 @@ public class NewTransactionFragment extends QRScanCapableFragment {
 
         MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireContext());
         builder.setCancelable(true)
-               .setTitle(R.string.choose_pattern_to_apply)
-               .setSingleChoiceItems(cursor, -1, patternNameColumn, (dialog, which) -> {
-                   applyPattern(matchingPatterns.get(which), matchedText);
+               .setTitle(R.string.choose_template_to_apply)
+               .setIcon(R.drawable.ic_baseline_auto_graph_24)
+               .setSingleChoiceItems(cursor, -1, templateNameColumn, (dialog, which) -> {
+                   applyTemplate(matchingTemplates.get(which), matchedText);
                    dialog.dismiss();
                })
                .create()
                .show();
     }
-    private void applyPattern(TemplateHeader patternHeader, String text) {
+    private void applyTemplate(TemplateHeader patternHeader, String text) {
         Pattern pattern = Pattern.compile(patternHeader.getRegularExpression());
 
         Matcher m = pattern.matcher(text);
@@ -257,8 +265,8 @@ public class NewTransactionFragment extends QRScanCapableFragment {
         listAdapter.notifyItemChanged(0);
 
         DB.get()
-          .getPatternDAO()
-          .getPatternWithAccounts(patternHeader.getId())
+          .getTemplateDAO()
+          .getTemplateWithAccounts(patternHeader.getId())
           .observe(getViewLifecycleOwner(), entry -> {
               int rowIndex = 0;
               final boolean accountsInInitialState = viewModel.accountsInInitialState();