]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/ui/patterns/PatternDetailsViewModel.java
rework pattern management machinery
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / ui / patterns / PatternDetailsViewModel.java
index 1c6e0359c3811eda293547baf0330a699b48a2d6..70a2b119c5c2b577d16fce274f75a83460a003c7 100644 (file)
 
 package net.ktnx.mobileledger.ui.patterns;
 
-import android.database.Cursor;
 import android.os.AsyncTask;
 
-import androidx.annotation.NonNull;
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MutableLiveData;
+import androidx.lifecycle.Observer;
 import androidx.lifecycle.ViewModel;
 
-import net.ktnx.mobileledger.App;
 import net.ktnx.mobileledger.dao.PatternAccountDAO;
 import net.ktnx.mobileledger.dao.PatternHeaderDAO;
 import net.ktnx.mobileledger.db.DB;
 import net.ktnx.mobileledger.db.PatternAccount;
 import net.ktnx.mobileledger.db.PatternHeader;
-import net.ktnx.mobileledger.model.Currency;
+import net.ktnx.mobileledger.db.PatternWithAccounts;
 import net.ktnx.mobileledger.model.PatternDetailsItem;
 import net.ktnx.mobileledger.utils.Logger;
-import net.ktnx.mobileledger.utils.MLDB;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Locale;
 import java.util.Objects;
 
 public class PatternDetailsViewModel extends ViewModel {
-    static final int NEW_PATTERN = -1;
-    private final MutableLiveData<List<PatternDetailsItem>> items = new MutableLiveData<>();
-    private long mPatternId;
+    private final MutableLiveData<List<PatternDetailsItem>> items =
+            new MutableLiveData<>(Collections.emptyList());
+    private Long mPatternId;
     private String mDefaultPatternName;
     public String getDefaultPatternName() {
         return mDefaultPatternName;
@@ -52,13 +50,21 @@ public class PatternDetailsViewModel extends ViewModel {
     public void setDefaultPatternName(String name) {
         mDefaultPatternName = name;
     }
-    public LiveData<List<PatternDetailsItem>> getItems() {
-        return items;
-    }
 
     public void resetItems() {
-        items.setValue(Collections.emptyList());
-        checkItemConsistency();
+        ArrayList<PatternDetailsItem> newList = new ArrayList<>();
+        final PatternDetailsItem.Header header = PatternDetailsItem.createHeader();
+        header.setName(mDefaultPatternName);
+        header.setId(1);
+        newList.add(header);
+
+        while (newList.size() < 3) {
+            final PatternDetailsItem.AccountRow aRow = PatternDetailsItem.createAccountRow();
+            aRow.setId(newList.size() + 1);
+            newList.add(aRow);
+        }
+
+        items.setValue(newList);
     }
     private void checkItemConsistency() {
         ArrayList<PatternDetailsItem> newList = new ArrayList<>(items.getValue());
@@ -71,98 +77,49 @@ public class PatternDetailsViewModel extends ViewModel {
         }
 
         while (newList.size() < 3) {
-            newList.add(PatternDetailsItem.createAccountRow(newList.size() - 1));
+            newList.add(PatternDetailsItem.createAccountRow());
             changes = true;
         }
 
         if (changes)
             items.setValue(newList);
     }
-    public void loadItems(long patternId) {
-        DB db = App.getRoomDB();
-        LiveData<PatternHeader> ph = db.getPatternDAO()
-                                       .getPattern(patternId);
-        ArrayList<PatternDetailsItem> list = new ArrayList<>();
-
-        MLDB.queryInBackground(
-                "SELECT name, regular_expression, transaction_description, transaction_comment, " +
-                "date_year_match_group, date_month_match_group, date_day_match_group FROM " +
-                "patterns WHERE id=?", new String[]{String.valueOf(patternId)},
-                new MLDB.CallbackHelper() {
-                    @Override
-                    public void onDone() {
-                        super.onDone();
-
-                        MLDB.queryInBackground(
-                                "SELECT id, position, acc, acc_match_group, currency, " +
-                                "currency_match_group, amount, amount_match_group," +
-                                " comment, comment_match_group FROM " +
-                                "pattern_accounts WHERE pattern_id=? ORDER BY " + "position ASC",
-                                new String[]{String.valueOf(patternId)}, new MLDB.CallbackHelper() {
-                                    @Override
-                                    public void onDone() {
-                                        super.onDone();
-                                        items.postValue(list);
-                                    }
-                                    @Override
-                                    public boolean onRow(@NonNull Cursor cursor) {
-                                        PatternDetailsItem.AccountRow item =
-                                                PatternDetailsItem.createAccountRow(
-                                                        cursor.getInt(1));
-                                        list.add(item);
-
-                                        item.setId(cursor.getInt(0));
-
-                                        if (cursor.isNull(3)) {
-                                            item.setAccountName(cursor.getString(2));
-                                        }
-                                        else {
-                                            item.setAccountNameMatchGroup(cursor.getShort(3));
-                                        }
-
-                                        if (cursor.isNull(5)) {
-                                            final int currId = cursor.getInt(4);
-                                            if (currId > 0)
-                                                item.setCurrency(Currency.loadById(currId));
-                                        }
-                                        else {
-                                            item.setCurrencyMatchGroup(cursor.getShort(5));
-                                        }
-
-                                        if (cursor.isNull(7)) {
-                                            item.setAmount(cursor.getFloat(6));
-                                        }
-                                        else {
-                                            item.setAmountMatchGroup(cursor.getShort(7));
-                                        }
-
-                                        if (cursor.isNull(9)) {
-                                            item.setAccountComment(cursor.getString(8));
-                                        }
-                                        else {
-                                            item.setAccountCommentMatchGroup(cursor.getShort(9));
-                                        }
-
-                                        return true;
-                                    }
-                                });
-                    }
-                    @Override
-                    public boolean onRow(@NonNull Cursor cursor) {
-                        PatternDetailsItem.Header header = PatternDetailsItem.createHeader();
-                        header.setName(cursor.getString(0));
-                        header.setPattern(cursor.getString(1));
-                        header.setTransactionDescription(cursor.getString(2));
-                        header.setTransactionComment(cursor.getString(3));
-                        header.setDateYearMatchGroup(cursor.getShort(4));
-                        header.setDateMonthMatchGroup(cursor.getShort(5));
-                        header.setDateDayMatchGroup(cursor.getShort(6));
-
-                        list.add(header);
-
-                        return false;
-                    }
-                });
+    public LiveData<List<PatternDetailsItem>> getItems(Long patternId) {
+        if (patternId != null && patternId <= 0)
+            throw new IllegalArgumentException("Pattern ID " + patternId + " is invalid");
+
+        mPatternId = patternId;
+
+        if (mPatternId == null) {
+            resetItems();
+            return items;
+        }
+
+        DB db = DB.get();
+        LiveData<PatternWithAccounts> dbList = db.getPatternDAO()
+                                                 .getPatternWithAccounts(mPatternId);
+        Observer<PatternWithAccounts> observer = new Observer<PatternWithAccounts>() {
+            @Override
+            public void onChanged(PatternWithAccounts src) {
+                ArrayList<PatternDetailsItem> l = new ArrayList<>();
+
+                PatternDetailsItem header = PatternDetailsItem.fromRoomObject(src.header);
+                l.add(header);
+                for (PatternAccount acc : src.accounts) {
+                    l.add(PatternDetailsItem.fromRoomObject(acc));
+                }
+
+                for (PatternDetailsItem i : l) {
+                    Logger.debug("patterns-db", "Loaded pattern item " + i);
+                }
+                items.postValue(l);
+
+                dbList.removeObserver(this);
+            }
+        };
+        dbList.observeForever(observer);
+
+        return items;
     }
     public void setTestText(String text) {
         List<PatternDetailsItem> list = new ArrayList<>(items.getValue());
@@ -173,46 +130,46 @@ public class PatternDetailsViewModel extends ViewModel {
 
         items.setValue(list);
     }
-    public void setPatternId(int patternId) {
-        if (mPatternId != patternId) {
-            if (patternId == NEW_PATTERN) {
-                resetItems();
-            }
-            else {
-                loadItems(patternId);
-            }
-            mPatternId = patternId;
-        }
-
-    }
     public void onSavePattern() {
         Logger.debug("flow", "PatternDetailsViewModel.onSavePattern(); model=" + this);
         final List<PatternDetailsItem> list = Objects.requireNonNull(items.getValue());
 
         AsyncTask.execute(() -> {
+            boolean newPattern = mPatternId == null || mPatternId <= 0;
+
             PatternDetailsItem.Header modelHeader = list.get(0)
                                                         .asHeaderItem();
-            PatternHeaderDAO headerDAO = App.getRoomDB()
-                                            .getPatternDAO();
+            PatternHeaderDAO headerDAO = DB.get()
+                                           .getPatternDAO();
             PatternHeader dbHeader = modelHeader.toDBO();
-            if (mPatternId <= 0) {
+            if (newPattern) {
                 dbHeader.setId(mPatternId = headerDAO.insert(dbHeader));
             }
             else
                 headerDAO.update(dbHeader);
 
+            Logger.debug("pattern-db",
+                    String.format(Locale.US, "Stored pattern header %d, item=%s", dbHeader.getId(),
+                            modelHeader));
 
-            PatternAccountDAO paDAO = App.getRoomDB()
-                                         .getPatternAccountDAO();
+
+            PatternAccountDAO paDAO = DB.get()
+                                        .getPatternAccountDAO();
             for (int i = 1; i < list.size(); i++) {
-                PatternAccount dbAccount = list.get(i)
-                                               .asAccountRowItem()
-                                               .toDBO(dbHeader.getId());
+                final PatternDetailsItem.AccountRow accRowItem = list.get(i)
+                                                                     .asAccountRowItem();
+                PatternAccount dbAccount = accRowItem.toDBO(dbHeader.getId());
                 dbAccount.setPatternId(mPatternId);
-                if (dbAccount.getId() == null || dbAccount.getId() <= 0)
+                dbAccount.setPosition(i);
+                if (newPattern)
                     dbAccount.setId(paDAO.insert(dbAccount));
                 else
                     paDAO.update(dbAccount);
+
+                Logger.debug("pattern-db", String.format(Locale.US,
+                        "Stored pattern account %d, account=%s, comment=%s, item=%s",
+                        dbAccount.getId(), dbAccount.getAccountName(),
+                        dbAccount.getAccountComment(), accRowItem));
             }
         });
     }