]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/ui/templates/TemplateDetailsViewModel.java
implement swipe-remove and drag-move in template details
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / ui / templates / TemplateDetailsViewModel.java
index fad2d394380b0ce97e735457d90d1843390d2c3d..5132af264025056cb95a9ab9fde9271aadeea702 100644 (file)
@@ -38,12 +38,16 @@ import java.util.Collections;
 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;
     }
@@ -52,39 +56,39 @@ public class TemplateDetailsViewModel extends ViewModel {
     }
 
     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");
 
@@ -92,6 +96,7 @@ public class TemplateDetailsViewModel extends ViewModel {
 
         if (mPatternId == null) {
             resetItems();
+            itemsLoaded = true;
             return items;
         }
 
@@ -113,6 +118,7 @@ public class TemplateDetailsViewModel extends ViewModel {
                     Logger.debug("patterns-db", "Loaded pattern item " + i);
                 }
                 items.postValue(l);
+                itemsLoaded = true;
 
                 dbList.removeObserver(this);
             }
@@ -144,36 +150,50 @@ public class TemplateDetailsViewModel extends ViewModel {
             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