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;
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(0);
+ 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());
}
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());
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(null);
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(null);
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, neg=%s, item=%s",
+ dbAccount.getId(), dbAccount.getAccountName(),
+ dbAccount.getAccountComment(), dbAccount.getNegateAmount(), accRowItem));
}
});
}