]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/ui/transaction_list/TransactionListAdapter.java
drop a couple of global colour values
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / ui / transaction_list / TransactionListAdapter.java
index a15ab0f6c68c18220db79d4ef0a3c17c2799ea5d..96de4b64a017501b4e7a842717e41def70768119 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2019 Damyan Ivanov.
+ * Copyright © 2020 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
@@ -17,6 +17,7 @@
 
 package net.ktnx.mobileledger.ui.transaction_list;
 
+import android.app.Activity;
 import android.content.Context;
 import android.database.sqlite.SQLiteDatabase;
 import android.graphics.Typeface;
@@ -24,13 +25,17 @@ import android.os.AsyncTask;
 import android.text.Spannable;
 import android.text.SpannableString;
 import android.text.style.StyleSpan;
-import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import net.ktnx.mobileledger.App;
 import net.ktnx.mobileledger.R;
 import net.ktnx.mobileledger.model.Data;
 import net.ktnx.mobileledger.model.LedgerTransaction;
@@ -38,19 +43,13 @@ import net.ktnx.mobileledger.model.LedgerTransactionAccount;
 import net.ktnx.mobileledger.model.TransactionListItem;
 import net.ktnx.mobileledger.utils.Colors;
 import net.ktnx.mobileledger.utils.Globals;
-import net.ktnx.mobileledger.utils.MLDB;
+import net.ktnx.mobileledger.utils.Misc;
+import net.ktnx.mobileledger.utils.SimpleDate;
 
 import java.text.DateFormat;
-import java.util.Date;
 import java.util.GregorianCalendar;
 import java.util.TimeZone;
 
-import androidx.annotation.NonNull;
-import androidx.appcompat.widget.AppCompatTextView;
-import androidx.recyclerview.widget.RecyclerView;
-
-import static net.ktnx.mobileledger.utils.DimensionUtils.dp2px;
-
 public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowHolder> {
     public void onBindViewHolder(@NonNull TransactionRowHolder holder, int position) {
         TransactionListItem item = TransactionListViewModel.getTransactionListItem(position);
@@ -59,58 +58,54 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowH
         // the view will disappear when the notifications reaches the model, so by simply omitting
         // the out-of-range get() call nothing bad happens - just a to-be-deleted view remains
         // a bit longer
-        if (item == null) return;
+        if (item == null)
+            return;
 
         switch (item.getType()) {
             case TRANSACTION:
                 holder.vTransaction.setVisibility(View.VISIBLE);
                 holder.vDelimiter.setVisibility(View.GONE);
-                holder.vTrailer.setVisibility(View.GONE);
                 LedgerTransaction tr = item.getTransaction();
 
-                //        debug("transactions", String.format("Filling position %d with %d accounts", position,
+                //        debug("transactions", String.format("Filling position %d with %d
+                //        accounts", position,
                 //                tr.getAccounts().size()));
 
                 TransactionLoader loader = new TransactionLoader();
                 loader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
-                        new TransactionLoaderParams(tr, holder, position, Data.accountFilter.getValue(),
-                                item.isOdd()));
+                        new TransactionLoaderParams(tr, holder, position,
+                                Data.accountFilter.getValue(), item.isOdd()));
 
                 // WORKAROUND what seems to be a bug in CardHolder somewhere
                 // when a view that was previously holding a delimiter is re-purposed
                 // occasionally it stays too short (not high enough)
-                holder.vTransaction.measure(View.MeasureSpec
-                                .makeMeasureSpec(holder.itemView.getWidth(), View.MeasureSpec.EXACTLY),
+                holder.vTransaction.measure(
+                        View.MeasureSpec.makeMeasureSpec(holder.itemView.getWidth(),
+                                View.MeasureSpec.EXACTLY),
                         View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
                 break;
             case DELIMITER:
-                Date date = item.getDate();
+                SimpleDate date = item.getDate();
                 holder.vTransaction.setVisibility(View.GONE);
-                holder.vTrailer.setVisibility(View.GONE);
                 holder.vDelimiter.setVisibility(View.VISIBLE);
-                holder.tvDelimiterDate.setText(DateFormat.getDateInstance().format(date));
+                holder.tvDelimiterDate.setText(DateFormat.getDateInstance()
+                                                         .format(date.toDate()));
                 if (item.isMonthShown()) {
                     GregorianCalendar cal = new GregorianCalendar(TimeZone.getDefault());
-                    cal.setTime(date);
-                    holder.tvDelimiterMonth
-                            .setText(Globals.monthNames[cal.get(GregorianCalendar.MONTH)]);
+                    cal.setTime(date.toDate());
+                    holder.tvDelimiterMonth.setText(
+                            Globals.monthNames[cal.get(GregorianCalendar.MONTH)]);
                     holder.tvDelimiterMonth.setVisibility(View.VISIBLE);
-                    //                holder.vDelimiterLine.setBackgroundResource(R.drawable.dashed_border_8dp);
-                    holder.vDelimiterLine.setVisibility(View.GONE);
+                    //                holder.vDelimiterLine.setBackgroundResource(R.drawable
+                    //                .dashed_border_8dp);
                     holder.vDelimiterThick.setVisibility(View.VISIBLE);
                 }
                 else {
                     holder.tvDelimiterMonth.setVisibility(View.GONE);
-                    //                holder.vDelimiterLine.setBackgroundResource(R.drawable.dashed_border_1dp);
-                    holder.vDelimiterLine.setVisibility(View.VISIBLE);
+                    //                holder.vDelimiterLine.setBackgroundResource(R.drawable
+                    //                .dashed_border_1dp);
                     holder.vDelimiterThick.setVisibility(View.GONE);
                 }
-                break;
-            case TRAILER:
-                holder.vTransaction.setVisibility(View.GONE);
-                holder.vTrailer.setVisibility(View.VISIBLE);
-                holder.vDelimiter.setVisibility(View.GONE);
-
                 break;
         }
     }
@@ -120,7 +115,7 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowH
     public TransactionRowHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
 //        debug("perf", "onCreateViewHolder called");
         View row = LayoutInflater.from(parent.getContext())
-                .inflate(R.layout.transaction_list_row, parent, false);
+                                 .inflate(R.layout.transaction_list_row, parent, false);
         return new TransactionRowHolder(row);
     }
 
@@ -129,6 +124,7 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowH
         return Data.transactions.size();
     }
     enum LoaderStep {HEAD, ACCOUNTS, DONE}
+
     private static class TransactionLoader
             extends AsyncTask<TransactionLoaderParams, TransactionLoaderStep, Void> {
         @Override
@@ -136,12 +132,13 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowH
             LedgerTransaction tr = p[0].transaction;
             boolean odd = p[0].odd;
 
-            SQLiteDatabase db = MLDB.getDatabase();
+            SQLiteDatabase db = App.getDatabase();
             tr.loadData(db);
 
             publishProgress(new TransactionLoaderStep(p[0].holder, p[0].position, tr, odd));
 
             int rowIndex = 0;
+            // FIXME ConcurrentModificationException in ArrayList$ltr.next (ArrayList.java:831)
             for (LedgerTransactionAccount acc : tr.getAccounts()) {
 //                debug(c.getAccountName(), acc.getAmount()));
                 publishProgress(new TransactionLoaderStep(p[0].holder, acc, rowIndex++,
@@ -160,45 +157,40 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowH
 
             switch (step.getStep()) {
                 case HEAD:
-                    holder.tvDescription.setText(step.getTransaction().getDescription());
+                    holder.tvDescription.setText(step.getTransaction()
+                                                     .getDescription());
+                    String trComment = Misc.emptyIsNull(step.getTransaction()
+                                                            .getComment());
+                    if (trComment == null)
+                        holder.tvComment.setVisibility(View.GONE);
+                    else {
+                        holder.tvComment.setText(trComment);
+                        holder.tvComment.setVisibility(View.VISIBLE);
+                    }
 
-                    if (step.isOdd()) holder.row.setBackgroundColor(Colors.tableRowDarkBG);
-                    else holder.row.setBackgroundColor(Colors.tableRowLightBG);
+//                    if (step.isOdd())
+//                        holder.row.setBackgroundColor(Colors.tableRowDarkBG);
+//                    else
+//                        holder.row.setBackgroundColor(Colors.tableRowLightBG);
 
                     break;
                 case ACCOUNTS:
                     int rowIndex = step.getAccountPosition();
                     Context ctx = holder.row.getContext();
                     LinearLayout row = (LinearLayout) holder.tableAccounts.getChildAt(rowIndex);
-                    TextView accName, accAmount;
                     if (row == null) {
-                        row = new LinearLayout(ctx);
-                        row.setLayoutParams(new LinearLayout.LayoutParams(
-                                LinearLayout.LayoutParams.MATCH_PARENT,
-                                LinearLayout.LayoutParams.WRAP_CONTENT));
-                        row.setGravity(Gravity.CENTER_VERTICAL);
-                        row.setOrientation(LinearLayout.HORIZONTAL);
-                        row.setPaddingRelative(dp2px(ctx, 8), 0, 0, 0);
-                        accName = new AppCompatTextView(ctx);
-                        accName.setLayoutParams(new LinearLayout.LayoutParams(0,
-                                LinearLayout.LayoutParams.WRAP_CONTENT, 5f));
-                        accName.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
-                        row.addView(accName);
-                        accAmount = new AppCompatTextView(ctx);
-                        LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(
-                                LinearLayout.LayoutParams.WRAP_CONTENT,
-                                LinearLayout.LayoutParams.WRAP_CONTENT);
-                        llp.setMarginEnd(0);
-                        accAmount.setLayoutParams(llp);
-                        accAmount.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
-                        accAmount.setMinWidth(dp2px(ctx, 60));
-                        row.addView(accAmount);
+                        LayoutInflater inflater = ((Activity) ctx).getLayoutInflater();
+                        row = (LinearLayout) inflater.inflate(
+                                R.layout.transaction_list_row_accounts_table_row, null);
+                        // if the rootView above is given (and the line below is spared)
+                        // the accounts remain with their default text (set in the layout resource)
                         holder.tableAccounts.addView(row);
                     }
-                    else {
-                        accName = (TextView) row.getChildAt(0);
-                        accAmount = (TextView) row.getChildAt(1);
-                    }
+                    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);
                     LedgerTransactionAccount acc = step.getAccount();
 
 
@@ -206,8 +198,8 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowH
 //                            acc.getAccountName(), acc.getAmount()));
 
                     String boldAccountName = step.getBoldAccountName();
-                    if ((boldAccountName != null) &&
-                        acc.getAccountName().startsWith(boldAccountName))
+                    if ((boldAccountName != null) && acc.getAccountName()
+                                                        .startsWith(boldAccountName))
                     {
                         accName.setTextColor(Colors.accent);
                         accAmount.setTextColor(Colors.accent);
@@ -218,10 +210,21 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowH
                         accName.setText(ss);
                     }
                     else {
-                        accName.setTextColor(Colors.defaultTextColor);
-                        accAmount.setTextColor(Colors.defaultTextColor);
+                        @ColorInt int textColor = dummyText.getTextColors()
+                                                           .getDefaultColor();
+                        accName.setTextColor(textColor);
+                        accAmount.setTextColor(textColor);
                         accName.setText(acc.getAccountName());
                     }
+
+                    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());
 
                     break;