import java.util.List;
import java.util.Locale;
import java.util.Objects;
+import java.util.concurrent.atomic.AtomicInteger;
public class TemplateDetailsViewModel extends ViewModel {
private final MutableLiveData<List<TemplateDetailsItem>> items =
new MutableLiveData<>(Collections.emptyList());
private Long mPatternId;
private String mDefaultPatternName;
+ private boolean itemsLoaded = false;
+ private final AtomicInteger syntheticItemId = new AtomicInteger(0);
+
public String getDefaultPatternName() {
return mDefaultPatternName;
}
}
public void resetItems() {
- ArrayList<TemplateDetailsItem> newList = new ArrayList<>();
- final TemplateDetailsItem.Header header = TemplateDetailsItem.createHeader();
- header.setName(mDefaultPatternName);
- header.setId(0);
- newList.add(header);
-
- while (newList.size() < 3) {
- final TemplateDetailsItem.AccountRow aRow = TemplateDetailsItem.createAccountRow();
- aRow.setId(newList.size() + 1);
- newList.add(aRow);
- }
-
- items.setValue(newList);
+ checkItemConsistency(new ArrayList<>());
}
- private void checkItemConsistency() {
- ArrayList<TemplateDetailsItem> newList = new ArrayList<>(items.getValue());
+ public void checkItemConsistency(List<TemplateDetailsItem> list) {
+ if (list == null)
+ list = new ArrayList<>(items.getValue());
+
boolean changes = false;
- if (newList.size() < 1) {
+ if (list.size() < 1) {
final TemplateDetailsItem.Header header = TemplateDetailsItem.createHeader();
header.setName(mDefaultPatternName);
- newList.add(header);
+ header.setId(genItemId());
+ list.add(header);
changes = true;
}
- while (newList.size() < 3) {
- newList.add(TemplateDetailsItem.createAccountRow());
+ while (list.size() < 3) {
+ final TemplateDetailsItem.AccountRow accountRow =
+ TemplateDetailsItem.createAccountRow();
+ accountRow.setId(genItemId());
+ list.add(accountRow);
changes = true;
}
if (changes)
- items.setValue(newList);
+ items.setValue(list);
+ }
+ public int genItemId() {
+ return syntheticItemId.decrementAndGet();
}
public LiveData<List<TemplateDetailsItem>> getItems(Long patternId) {
+ if (itemsLoaded && Objects.equals(patternId, this.mPatternId))
+ return items;
+
if (patternId != null && patternId <= 0)
throw new IllegalArgumentException("Pattern ID " + patternId + " is invalid");
if (mPatternId == null) {
resetItems();
+ itemsLoaded = true;
return items;
}
Logger.debug("patterns-db", "Loaded pattern item " + i);
}
items.postValue(l);
+ itemsLoaded = true;
dbList.removeObserver(this);
}
TemplateHeader dbHeader = modelHeader.toDBO();
if (newPattern) {
dbHeader.setId(null);
- dbHeader.setId(mPatternId = headerDAO.insert(dbHeader));
+ dbHeader.setId(mPatternId = headerDAO.insertSync(dbHeader));
}
else
- headerDAO.update(dbHeader);
+ headerDAO.updateSync(dbHeader);
Logger.debug("pattern-db",
String.format(Locale.US, "Stored pattern header %d, item=%s", dbHeader.getId(),
modelHeader));
- TemplateAccountDAO paDAO = DB.get()
- .getPatternAccountDAO();
+ TemplateAccountDAO taDAO = DB.get()
+ .getTemplateAccountDAO();
+ taDAO.prepareForSave(mPatternId);
for (int i = 1; i < list.size(); i++) {
final TemplateDetailsItem.AccountRow accRowItem = list.get(i)
.asAccountRowItem();
TemplateAccount dbAccount = accRowItem.toDBO(dbHeader.getId());
dbAccount.setTemplateId(mPatternId);
dbAccount.setPosition(i);
- if (newPattern) {
+ if (dbAccount.getId() < 0) {
dbAccount.setId(null);
- dbAccount.setId(paDAO.insert(dbAccount));
+ dbAccount.setId(taDAO.insertSync(dbAccount));
}
else
- paDAO.update(dbAccount);
+ taDAO.updateSync(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));
}
+ taDAO.finishSave(mPatternId);
});
}
+ public void moveItem(int sourcePos, int targetPos) {
+ ArrayList<TemplateDetailsItem> newList = new ArrayList<>(items.getValue());
+ TemplateDetailsItem item = newList.remove(sourcePos);
+ newList.add(targetPos, item);
+ items.setValue(newList);
+ }
+ public void removeItem(int position) {
+ ArrayList<TemplateDetailsItem> newList = new ArrayList<>(items.getValue());
+ newList.remove(position);
+ checkItemConsistency(newList);
+ items.setValue(newList);
+ }
}
\ No newline at end of file