]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/model/AccountListItem.java
more pronounced day/month delimiters in the transaction list
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / model / AccountListItem.java
index 5fd951715eeaf609cf46358f909b18c9f1a052f9..807e93d348b1e182d81090d94fc097b32cd4be8f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2020 Damyan Ivanov.
+ * Copyright © 2024 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
 package net.ktnx.mobileledger.model;
 
 import androidx.annotation.NonNull;
+import androidx.lifecycle.LiveData;
 
 import org.jetbrains.annotations.NotNull;
 
-public class AccountListItem {
-    private final Type type;
-    private LedgerAccount account;
-    public AccountListItem(@NotNull LedgerAccount account) {
-        this.type = Type.ACCOUNT;
-        this.account = account;
-    }
-    public AccountListItem() {
-        this.type = Type.HEADER;
-    }
+public abstract class AccountListItem {
+    private AccountListItem() {}
+    public abstract boolean sameContent(AccountListItem other);
     @NonNull
     public Type getType() {
-        return type;
+        if (this instanceof Account)
+            return Type.ACCOUNT;
+        else if (this instanceof Header)
+            return Type.HEADER;
+        else
+            throw new RuntimeException("Unsupported sub-class " + this);
+    }
+    public boolean isAccount() {
+        return this instanceof Account;
+    }
+    public Account toAccount() {
+        assert isAccount();
+        return ((Account) this);
+    }
+    public boolean isHeader() {
+        return this instanceof Header;
     }
-    @NotNull
-    public LedgerAccount getAccount() {
-        if (type != Type.ACCOUNT)
-            throw new IllegalStateException(
-                    String.format("Item type is not %s, but %s", Type.ACCOUNT, type));
-        return account;
+    public Header toHeader() {
+        assert isHeader();
+        return ((Header) this);
     }
     public enum Type {ACCOUNT, HEADER}
+
+    public static class Account extends AccountListItem {
+        private final LedgerAccount account;
+        public Account(@NotNull LedgerAccount account) {
+            this.account = account;
+        }
+        @Override
+        public boolean sameContent(AccountListItem other) {
+            if (!(other instanceof Account))
+                return false;
+            return ((Account) other).account.hasSubAccounts() == account.hasSubAccounts() &&
+                   ((Account) other).account.amountsExpanded() == account.amountsExpanded() &&
+                   ((Account) other).account.isExpanded() == account.isExpanded() &&
+                   ((Account) other).account.getLevel() == account.getLevel() &&
+                   ((Account) other).account.getAmountsString()
+                                            .equals(account.getAmountsString());
+        }
+        @NotNull
+        public LedgerAccount getAccount() {
+            return account;
+        }
+        public boolean allAmountsAreZero() {
+            return account.allAmountsAreZero();
+        }
+    }
+
+    public static class Header extends AccountListItem {
+        private final LiveData<String> text;
+        public Header(@NonNull LiveData<String> text) {
+            this.text = text;
+        }
+        public LiveData<String> getText() {
+            return text;
+        }
+        @Override
+        public boolean sameContent(AccountListItem other) {
+            return true;
+        }
+    }
 }