X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Fpatterns%2FPatternDetailsViewModel.java;h=70a2b119c5c2b577d16fce274f75a83460a003c7;hp=1c6e0359c3811eda293547baf0330a699b48a2d6;hb=b0404689e0dbb2b08f02deca7ee5d14636a3baa6;hpb=c2bc2a73948d991a4c827d230ae93e239401b9b9 diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/patterns/PatternDetailsViewModel.java b/app/src/main/java/net/ktnx/mobileledger/ui/patterns/PatternDetailsViewModel.java index 1c6e0359..70a2b119 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/patterns/PatternDetailsViewModel.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/patterns/PatternDetailsViewModel.java @@ -17,34 +17,32 @@ 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> items = new MutableLiveData<>(); - private long mPatternId; + private final MutableLiveData> 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> getItems() { - return items; - } public void resetItems() { - items.setValue(Collections.emptyList()); - checkItemConsistency(); + ArrayList 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 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 ph = db.getPatternDAO() - .getPattern(patternId); - ArrayList 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> 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 dbList = db.getPatternDAO() + .getPatternWithAccounts(mPatternId); + Observer observer = new Observer() { + @Override + public void onChanged(PatternWithAccounts src) { + ArrayList 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 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 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)); } }); }