]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/ui/transaction_list/TransactionRowHolder.java
convert the last update global header to a list header
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / ui / transaction_list / TransactionRowHolder.java
index d665d08198c3b7b839d5ce97914afdb884272fd2..ba48d70ca7994ac9bc4575b573016b1b0b853f49 100644 (file)
@@ -17,6 +17,7 @@
 
 package net.ktnx.mobileledger.ui.transaction_list;
 
+import android.text.format.DateUtils;
 import android.view.View;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -27,6 +28,10 @@ import androidx.constraintlayout.widget.ConstraintLayout;
 import androidx.recyclerview.widget.RecyclerView;
 
 import net.ktnx.mobileledger.R;
+import net.ktnx.mobileledger.model.Data;
+import net.ktnx.mobileledger.model.TransactionListItem;
+
+import java.util.Observer;
 
 class TransactionRowHolder extends RecyclerView.ViewHolder {
     final TextView tvDescription;
@@ -37,6 +42,10 @@ class TransactionRowHolder extends RecyclerView.ViewHolder {
     final CardView vTransaction;
     final TextView tvDelimiterMonth, tvDelimiterDate;
     final View vDelimiterThick;
+    final View vHeader;
+    final TextView tvLastUpdate;
+    TransactionListItem.Type lastType;
+    private Observer lastUpdateObserver;
     public TransactionRowHolder(@NonNull View itemView) {
         super(itemView);
         this.row = itemView.findViewById(R.id.transaction_row);
@@ -48,5 +57,58 @@ class TransactionRowHolder extends RecyclerView.ViewHolder {
         this.tvDelimiterDate = itemView.findViewById(R.id.transaction_delimiter_date);
         this.tvDelimiterMonth = itemView.findViewById(R.id.transaction_delimiter_month);
         this.vDelimiterThick = itemView.findViewById(R.id.transaction_delimiter_thick);
+        this.vHeader = itemView.findViewById(R.id.last_update_container);
+        this.tvLastUpdate = itemView.findViewById(R.id.last_update_text);
+    }
+    private void initLastUpdateObserver() {
+        if (lastUpdateObserver != null)
+            return;
+
+        lastUpdateObserver = (o, arg) -> setLastUpdateText(Data.lastUpdate.get());
+
+        Data.lastUpdate.addObserver(lastUpdateObserver);
+    }
+    void setLastUpdateText(long lastUpdate) {
+        final int formatFlags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR |
+                                DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_NUMERIC_DATE;
+        tvLastUpdate.setText((lastUpdate == 0) ? "----"
+                                               : DateUtils.formatDateTime(tvLastUpdate.getContext(),
+                                                       lastUpdate, formatFlags));
+    }
+    private void dropLastUpdateObserver() {
+        if (lastUpdateObserver == null)
+            return;
+
+        Data.lastUpdate.deleteObserver(lastUpdateObserver);
+        lastUpdateObserver = null;
+    }
+    void setType(TransactionListItem.Type newType) {
+        if (newType == lastType)
+            return;
+
+        switch (newType) {
+            case TRANSACTION:
+                vHeader.setVisibility(View.GONE);
+                vTransaction.setVisibility(View.VISIBLE);
+                vDelimiter.setVisibility(View.GONE);
+                dropLastUpdateObserver();
+                break;
+            case DELIMITER:
+                vHeader.setVisibility(View.GONE);
+                vTransaction.setVisibility(View.GONE);
+                vDelimiter.setVisibility(View.VISIBLE);
+                dropLastUpdateObserver();
+                break;
+            case HEADER:
+                vHeader.setVisibility(View.VISIBLE);
+                vTransaction.setVisibility(View.GONE);
+                vDelimiter.setVisibility(View.GONE);
+                initLastUpdateObserver();
+                break;
+            default:
+                throw new IllegalStateException("Unexpected value: " + newType);
+        }
+
+        lastType = newType;
     }
 }