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.templates;
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.TemplateAccountDAO;
28 import net.ktnx.mobileledger.dao.TemplateHeaderDAO;
29 import net.ktnx.mobileledger.db.DB;
30 import net.ktnx.mobileledger.db.TemplateAccount;
31 import net.ktnx.mobileledger.db.TemplateHeader;
32 import net.ktnx.mobileledger.db.TemplateWithAccounts;
33 import net.ktnx.mobileledger.model.TemplateDetailsItem;
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 TemplateDetailsViewModel extends ViewModel {
43 private final MutableLiveData<List<TemplateDetailsItem>> items =
44 new MutableLiveData<>(Collections.emptyList());
45 private Long mPatternId;
46 private String mDefaultPatternName;
47 private boolean itemsLoaded = false;
49 public String getDefaultPatternName() {
50 return mDefaultPatternName;
52 public void setDefaultPatternName(String name) {
53 mDefaultPatternName = name;
56 public void resetItems() {
57 ArrayList<TemplateDetailsItem> newList = new ArrayList<>();
58 final TemplateDetailsItem.Header header = TemplateDetailsItem.createHeader();
59 header.setName(mDefaultPatternName);
63 while (newList.size() < 3) {
64 final TemplateDetailsItem.AccountRow aRow = TemplateDetailsItem.createAccountRow();
65 aRow.setId(newList.size() + 1);
69 items.setValue(newList);
71 private void checkItemConsistency() {
72 ArrayList<TemplateDetailsItem> newList = new ArrayList<>(items.getValue());
73 boolean changes = false;
74 if (newList.size() < 1) {
75 final TemplateDetailsItem.Header header = TemplateDetailsItem.createHeader();
76 header.setName(mDefaultPatternName);
81 while (newList.size() < 3) {
82 newList.add(TemplateDetailsItem.createAccountRow());
87 items.setValue(newList);
89 public LiveData<List<TemplateDetailsItem>> getItems(Long patternId) {
90 if (itemsLoaded && Objects.equals(patternId, this.mPatternId))
93 if (patternId != null && patternId <= 0)
94 throw new IllegalArgumentException("Pattern ID " + patternId + " is invalid");
96 mPatternId = patternId;
98 if (mPatternId == null) {
105 LiveData<TemplateWithAccounts> dbList = db.getTemplateDAO()
106 .getTemplateWithAccounts(mPatternId);
107 Observer<TemplateWithAccounts> observer = new Observer<TemplateWithAccounts>() {
109 public void onChanged(TemplateWithAccounts src) {
110 ArrayList<TemplateDetailsItem> l = new ArrayList<>();
112 TemplateDetailsItem header = TemplateDetailsItem.fromRoomObject(src.header);
114 for (TemplateAccount acc : src.accounts) {
115 l.add(TemplateDetailsItem.fromRoomObject(acc));
118 for (TemplateDetailsItem i : l) {
119 Logger.debug("patterns-db", "Loaded pattern item " + i);
124 dbList.removeObserver(this);
127 dbList.observeForever(observer);
131 public void setTestText(String text) {
132 List<TemplateDetailsItem> list = new ArrayList<>(items.getValue());
133 TemplateDetailsItem.Header header = new TemplateDetailsItem.Header(list.get(0)
135 header.setTestText(text);
138 items.setValue(list);
140 public void onSaveTemplate() {
141 Logger.debug("flow", "PatternDetailsViewModel.onSavePattern(); model=" + this);
142 final List<TemplateDetailsItem> list = Objects.requireNonNull(items.getValue());
144 AsyncTask.execute(() -> {
145 boolean newPattern = mPatternId == null || mPatternId <= 0;
147 TemplateDetailsItem.Header modelHeader = list.get(0)
149 TemplateHeaderDAO headerDAO = DB.get()
151 TemplateHeader dbHeader = modelHeader.toDBO();
153 dbHeader.setId(null);
154 dbHeader.setId(mPatternId = headerDAO.insertSync(dbHeader));
157 headerDAO.updateSync(dbHeader);
159 Logger.debug("pattern-db",
160 String.format(Locale.US, "Stored pattern header %d, item=%s", dbHeader.getId(),
164 TemplateAccountDAO taDAO = DB.get()
165 .getTemplateAccountDAO();
166 for (int i = 1; i < list.size(); i++) {
167 final TemplateDetailsItem.AccountRow accRowItem = list.get(i)
169 TemplateAccount dbAccount = accRowItem.toDBO(dbHeader.getId());
170 dbAccount.setTemplateId(mPatternId);
171 dbAccount.setPosition(i);
173 dbAccount.setId(null);
174 dbAccount.setId(taDAO.insertSync(dbAccount));
177 taDAO.updateSync(dbAccount);
179 Logger.debug("pattern-db", String.format(Locale.US,
180 "Stored pattern account %d, account=%s, comment=%s, neg=%s, item=%s",
181 dbAccount.getId(), dbAccount.getAccountName(),
182 dbAccount.getAccountComment(), dbAccount.getNegateAmount(), accRowItem));