]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/ui/transaction_list/TransactionRowHolder.java
more pronounced day/month delimiters in the transaction list
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / ui / transaction_list / TransactionRowHolder.java
index ba48d70ca7994ac9bc4575b573016b1b0b853f49..876430f5de06e4c1b4b25a9061a5f9d74abfe94b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2020 Damyan Ivanov.
+ * Copyright © 2021 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.ui.transaction_list;
 
-import android.text.format.DateUtils;
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Typeface;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.style.StyleSpan;
+import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import androidx.annotation.ColorInt;
 import androidx.annotation.NonNull;
-import androidx.cardview.widget.CardView;
-import androidx.constraintlayout.widget.ConstraintLayout;
-import androidx.recyclerview.widget.RecyclerView;
+import androidx.annotation.Nullable;
 
 import net.ktnx.mobileledger.R;
-import net.ktnx.mobileledger.model.Data;
+import net.ktnx.mobileledger.databinding.TransactionListRowBinding;
+import net.ktnx.mobileledger.model.LedgerTransaction;
+import net.ktnx.mobileledger.model.LedgerTransactionAccount;
 import net.ktnx.mobileledger.model.TransactionListItem;
+import net.ktnx.mobileledger.utils.Colors;
+import net.ktnx.mobileledger.utils.Misc;
 
 import java.util.Observer;
 
-class TransactionRowHolder extends RecyclerView.ViewHolder {
-    final TextView tvDescription;
-    final TextView tvComment;
-    final LinearLayout tableAccounts;
-    final ConstraintLayout row;
-    final ConstraintLayout vDelimiter;
-    final CardView vTransaction;
-    final TextView tvDelimiterMonth, tvDelimiterDate;
-    final View vDelimiterThick;
-    final View vHeader;
-    final TextView tvLastUpdate;
+class TransactionRowHolder extends TransactionRowHolderBase {
+    private final TransactionListRowBinding b;
     TransactionListItem.Type lastType;
     private Observer lastUpdateObserver;
-    public TransactionRowHolder(@NonNull View itemView) {
-        super(itemView);
-        this.row = itemView.findViewById(R.id.transaction_row);
-        this.tvDescription = itemView.findViewById(R.id.transaction_row_description);
-        this.tvComment = itemView.findViewById(R.id.transaction_comment);
-        this.tableAccounts = itemView.findViewById(R.id.transaction_row_acc_amounts);
-        this.vDelimiter = itemView.findViewById(R.id.transaction_delimiter);
-        this.vTransaction = itemView.findViewById(R.id.transaction_card_view);
-        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);
+    public TransactionRowHolder(@NonNull TransactionListRowBinding binding) {
+        super(binding.getRoot());
+        b = binding;
     }
-    private void initLastUpdateObserver() {
-        if (lastUpdateObserver != null)
-            return;
+    public void bind(@NonNull TransactionListItem item, @Nullable String boldAccountName) {
+        LedgerTransaction tr = item.getTransaction();
+        b.transactionRowDescription.setText(tr.getDescription());
+        String trComment = Misc.emptyIsNull(tr.getComment());
+        if (trComment == null)
+            b.transactionComment.setVisibility(View.GONE);
+        else {
+            b.transactionComment.setText(trComment);
+            b.transactionComment.setVisibility(View.VISIBLE);
+        }
 
-        lastUpdateObserver = (o, arg) -> setLastUpdateText(Data.lastUpdate.get());
+        if (Misc.emptyIsNull(item.getRunningTotal()) != null) {
+            b.transactionRunningTotal.setText(item.getRunningTotal());
+            b.transactionRunningTotal.setVisibility(View.VISIBLE);
+            b.transactionRunningTotalDivider.setVisibility(View.VISIBLE);
+        }
+        else {
+            b.transactionRunningTotal.setVisibility(View.GONE);
+            b.transactionRunningTotalDivider.setVisibility(View.GONE);
+        }
 
-        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;
+        int rowIndex = 0;
+        Context ctx = b.getRoot()
+                       .getContext();
+        LayoutInflater inflater = ((Activity) ctx).getLayoutInflater();
+        for (LedgerTransactionAccount acc : tr.getAccounts()) {
+            LinearLayout row = (LinearLayout) b.transactionRowAccAmounts.getChildAt(rowIndex);
+            if (row == null) {
+                row = new LinearLayout(ctx);
+                inflater.inflate(R.layout.transaction_list_row_accounts_table_row, row);
+                b.transactionRowAccAmounts.addView(row);
+            }
 
-        Data.lastUpdate.deleteObserver(lastUpdateObserver);
-        lastUpdateObserver = null;
-    }
-    void setType(TransactionListItem.Type newType) {
-        if (newType == lastType)
-            return;
+            TextView dummyText = row.findViewById(R.id.dummy_text);
+            TextView accName = row.findViewById(R.id.transaction_list_acc_row_acc_name);
+            TextView accComment = row.findViewById(R.id.transaction_list_acc_row_acc_comment);
+            TextView accAmount = row.findViewById(R.id.transaction_list_acc_row_acc_amount);
+
+            if ((boldAccountName != null) && acc.getAccountName()
+                                                .startsWith(boldAccountName))
+            {
+                accName.setTextColor(Colors.primary);
+                accAmount.setTextColor(Colors.primary);
+
+                SpannableString ss = new SpannableString(Misc.addWrapHints(acc.getAccountName()));
+                ss.setSpan(new StyleSpan(Typeface.BOLD), 0, Misc.addWrapHints(boldAccountName)
+                                                                .length(),
+                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+                accName.setText(ss);
+            }
+            else {
+                @ColorInt int textColor = dummyText.getTextColors()
+                                                   .getDefaultColor();
+                accName.setTextColor(textColor);
+                accAmount.setTextColor(textColor);
+                accName.setText(Misc.addWrapHints(acc.getAccountName()));
+            }
 
-        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);
+            String comment = acc.getComment();
+            if (comment != null && !comment.isEmpty()) {
+                accComment.setText(comment);
+                accComment.setVisibility(View.VISIBLE);
+            }
+            else {
+                accComment.setVisibility(View.GONE);
+            }
+            accAmount.setText(acc.toString());
+
+            rowIndex++;
         }
 
-        lastType = newType;
+        if (b.transactionRowAccAmounts.getChildCount() > rowIndex) {
+            b.transactionRowAccAmounts.removeViews(rowIndex,
+                    b.transactionRowAccAmounts.getChildCount() - rowIndex);
+        }
     }
 }