X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Fpatterns%2FPatternDetailsViewModel.java;fp=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Fpatterns%2FPatternDetailsViewModel.java;h=1c6e0359c3811eda293547baf0330a699b48a2d6;hb=4d2ce14d526978de65113314cc50ab5ecf9c7d09;hp=0000000000000000000000000000000000000000;hpb=7ab7cfc1e7a64680541ed7e46e4d03868e4ff2f4;p=mobile-ledger-staging.git 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 new file mode 100644 index 00000000..1c6e0359 --- /dev/null +++ b/app/src/main/java/net/ktnx/mobileledger/ui/patterns/PatternDetailsViewModel.java @@ -0,0 +1,219 @@ +/* + * Copyright © 2021 Damyan Ivanov. + * This file is part of MoLe. + * MoLe is free software: you can distribute it and/or modify it + * under the term of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your opinion), any later version. + * + * MoLe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License terms for details. + * + * You should have received a copy of the GNU General Public License + * along with MoLe. If not, see . + */ + +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.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.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.Objects; + +public class PatternDetailsViewModel extends ViewModel { + static final int NEW_PATTERN = -1; + private final MutableLiveData> items = new MutableLiveData<>(); + private long mPatternId; + private String mDefaultPatternName; + public String getDefaultPatternName() { + return mDefaultPatternName; + } + public void setDefaultPatternName(String name) { + mDefaultPatternName = name; + } + public LiveData> getItems() { + return items; + } + + public void resetItems() { + items.setValue(Collections.emptyList()); + checkItemConsistency(); + } + private void checkItemConsistency() { + ArrayList newList = new ArrayList<>(items.getValue()); + boolean changes = false; + if (newList.size() < 1) { + final PatternDetailsItem.Header header = PatternDetailsItem.createHeader(); + header.setName(mDefaultPatternName); + newList.add(header); + changes = true; + } + + while (newList.size() < 3) { + newList.add(PatternDetailsItem.createAccountRow(newList.size() - 1)); + 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 void setTestText(String text) { + List list = new ArrayList<>(items.getValue()); + PatternDetailsItem.Header header = new PatternDetailsItem.Header(list.get(0) + .asHeaderItem()); + header.setTestText(text); + list.set(0, header); + + 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(() -> { + PatternDetailsItem.Header modelHeader = list.get(0) + .asHeaderItem(); + PatternHeaderDAO headerDAO = App.getRoomDB() + .getPatternDAO(); + PatternHeader dbHeader = modelHeader.toDBO(); + if (mPatternId <= 0) { + dbHeader.setId(mPatternId = headerDAO.insert(dbHeader)); + } + else + headerDAO.update(dbHeader); + + + PatternAccountDAO paDAO = App.getRoomDB() + .getPatternAccountDAO(); + for (int i = 1; i < list.size(); i++) { + PatternAccount dbAccount = list.get(i) + .asAccountRowItem() + .toDBO(dbHeader.getId()); + dbAccount.setPatternId(mPatternId); + if (dbAccount.getId() == null || dbAccount.getId() <= 0) + dbAccount.setId(paDAO.insert(dbAccount)); + else + paDAO.update(dbAccount); + } + }); + } +} \ No newline at end of file