2 * Copyright © 2021 Damyan Ivanov.
3 * This file is part of MoLe.
4 * MoLe is free software: you can distribute it and/or modify it
5 * under the term of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your opinion), any later version.
9 * MoLe is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License terms for details.
14 * You should have received a copy of the GNU General Public License
15 * along with MoLe. If not, see <https://www.gnu.org/licenses/>.
18 package net.ktnx.mobileledger.ui.patterns;
20 import android.os.AsyncTask;
22 import androidx.lifecycle.LiveData;
23 import androidx.lifecycle.MutableLiveData;
24 import androidx.lifecycle.Observer;
25 import androidx.lifecycle.ViewModel;
27 import net.ktnx.mobileledger.dao.PatternAccountDAO;
28 import net.ktnx.mobileledger.dao.PatternHeaderDAO;
29 import net.ktnx.mobileledger.db.DB;
30 import net.ktnx.mobileledger.db.PatternAccount;
31 import net.ktnx.mobileledger.db.PatternHeader;
32 import net.ktnx.mobileledger.db.PatternWithAccounts;
33 import net.ktnx.mobileledger.model.PatternDetailsItem;
34 import net.ktnx.mobileledger.utils.Logger;
36 import java.util.ArrayList;
37 import java.util.Collections;
38 import java.util.List;
39 import java.util.Locale;
40 import java.util.Objects;
42 public class PatternDetailsViewModel extends ViewModel {
43 private final MutableLiveData<List<PatternDetailsItem>> items =
44 new MutableLiveData<>(Collections.emptyList());
45 private Long mPatternId;
46 private String mDefaultPatternName;
47 public String getDefaultPatternName() {
48 return mDefaultPatternName;
50 public void setDefaultPatternName(String name) {
51 mDefaultPatternName = name;
54 public void resetItems() {
55 ArrayList<PatternDetailsItem> newList = new ArrayList<>();
56 final PatternDetailsItem.Header header = PatternDetailsItem.createHeader();
57 header.setName(mDefaultPatternName);
61 while (newList.size() < 3) {
62 final PatternDetailsItem.AccountRow aRow = PatternDetailsItem.createAccountRow();
63 aRow.setId(newList.size() + 1);
67 items.setValue(newList);
69 private void checkItemConsistency() {
70 ArrayList<PatternDetailsItem> newList = new ArrayList<>(items.getValue());
71 boolean changes = false;
72 if (newList.size() < 1) {
73 final PatternDetailsItem.Header header = PatternDetailsItem.createHeader();
74 header.setName(mDefaultPatternName);
79 while (newList.size() < 3) {
80 newList.add(PatternDetailsItem.createAccountRow());
85 items.setValue(newList);
87 public LiveData<List<PatternDetailsItem>> getItems(Long patternId) {
88 if (patternId != null && patternId <= 0)
89 throw new IllegalArgumentException("Pattern ID " + patternId + " is invalid");
91 mPatternId = patternId;
93 if (mPatternId == null) {
99 LiveData<PatternWithAccounts> dbList = db.getPatternDAO()
100 .getPatternWithAccounts(mPatternId);
101 Observer<PatternWithAccounts> observer = new Observer<PatternWithAccounts>() {
103 public void onChanged(PatternWithAccounts src) {
104 ArrayList<PatternDetailsItem> l = new ArrayList<>();
106 PatternDetailsItem header = PatternDetailsItem.fromRoomObject(src.header);
108 for (PatternAccount acc : src.accounts) {
109 l.add(PatternDetailsItem.fromRoomObject(acc));
112 for (PatternDetailsItem i : l) {
113 Logger.debug("patterns-db", "Loaded pattern item " + i);
117 dbList.removeObserver(this);
120 dbList.observeForever(observer);
124 public void setTestText(String text) {
125 List<PatternDetailsItem> list = new ArrayList<>(items.getValue());
126 PatternDetailsItem.Header header = new PatternDetailsItem.Header(list.get(0)
128 header.setTestText(text);
131 items.setValue(list);
133 public void onSavePattern() {
134 Logger.debug("flow", "PatternDetailsViewModel.onSavePattern(); model=" + this);
135 final List<PatternDetailsItem> list = Objects.requireNonNull(items.getValue());
137 AsyncTask.execute(() -> {
138 boolean newPattern = mPatternId == null || mPatternId <= 0;
140 PatternDetailsItem.Header modelHeader = list.get(0)
142 PatternHeaderDAO headerDAO = DB.get()
144 PatternHeader dbHeader = modelHeader.toDBO();
146 dbHeader.setId(mPatternId = headerDAO.insert(dbHeader));
149 headerDAO.update(dbHeader);
151 Logger.debug("pattern-db",
152 String.format(Locale.US, "Stored pattern header %d, item=%s", dbHeader.getId(),
156 PatternAccountDAO paDAO = DB.get()
157 .getPatternAccountDAO();
158 for (int i = 1; i < list.size(); i++) {
159 final PatternDetailsItem.AccountRow accRowItem = list.get(i)
161 PatternAccount dbAccount = accRowItem.toDBO(dbHeader.getId());
162 dbAccount.setPatternId(mPatternId);
163 dbAccount.setPosition(i);
165 dbAccount.setId(paDAO.insert(dbAccount));
167 paDAO.update(dbAccount);
169 Logger.debug("pattern-db", String.format(Locale.US,
170 "Stored pattern account %d, account=%s, comment=%s, item=%s",
171 dbAccount.getId(), dbAccount.getAccountName(),
172 dbAccount.getAccountComment(), accRowItem));