]> git.ktnx.net Git - mobile-ledger-staging.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/ui/transaction_list/TransactionListAdapter.java
fix many lint errors/warnings
[mobile-ledger-staging.git] / app / src / main / java / net / ktnx / mobileledger / ui / transaction_list / TransactionListAdapter.java
index 3946474f35bd245a3079d5e704b713a45a895073..492c6151266a31540543c1f7cdf368234bc33afb 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
@@ -31,27 +31,79 @@ import android.view.ViewGroup;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import androidx.annotation.ColorInt;
 import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.AsyncListDiffer;
+import androidx.recyclerview.widget.DiffUtil;
 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;
 import net.ktnx.mobileledger.model.LedgerTransactionAccount;
 import net.ktnx.mobileledger.model.TransactionListItem;
+import net.ktnx.mobileledger.ui.MainModel;
 import net.ktnx.mobileledger.utils.Colors;
 import net.ktnx.mobileledger.utils.Globals;
+import net.ktnx.mobileledger.utils.Logger;
 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.List;
+import java.util.Locale;
 import java.util.TimeZone;
 
 public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowHolder> {
+    private final MainModel model;
+    private final AsyncListDiffer<TransactionListItem> listDiffer;
+    public TransactionListAdapter(MainModel model) {
+        super();
+        this.model = model;
+
+        listDiffer = new AsyncListDiffer<>(this, new DiffUtil.ItemCallback<TransactionListItem>() {
+            @Override
+            public boolean areItemsTheSame(@NonNull TransactionListItem oldItem,
+                                           @NonNull TransactionListItem newItem) {
+                if (oldItem.getType() != newItem.getType())
+                    return false;
+                switch (oldItem.getType()) {
+                    case DELIMITER:
+                        return (oldItem.getDate()
+                                       .equals(newItem.getDate()));
+                    case TRANSACTION:
+                        return oldItem.getTransaction()
+                                      .getId() == newItem.getTransaction()
+                                                         .getId();
+                    default:
+                        throw new IllegalStateException(
+                                String.format(Locale.US, "Unexpected transaction item type %s",
+                                        oldItem.getType()));
+                }
+            }
+            @Override
+            public boolean areContentsTheSame(@NonNull TransactionListItem oldItem,
+                                              @NonNull TransactionListItem newItem) {
+                switch (oldItem.getType()) {
+                    case DELIMITER:
+                        // Delimiters items are "same" for same dates and the contents are the date
+                        return true;
+                    case TRANSACTION:
+                        return oldItem.getTransaction()
+                                      .equals(newItem.getTransaction());
+                    default:
+                        throw new IllegalStateException(
+                                String.format(Locale.US, "Unexpected transaction item type %s",
+                                        oldItem.getType()));
+
+                }
+            }
+        });
+    }
     public void onBindViewHolder(@NonNull TransactionRowHolder holder, int position) {
-        TransactionListItem item = TransactionListViewModel.getTransactionListItem(position);
+        TransactionListItem item = listDiffer.getCurrentList()
+                                             .get(position);
 
         // in a race when transaction value is reduced, but the model hasn't been notified yet
         // the view will disappear when the notifications reaches the model, so by simply omitting
@@ -72,8 +124,8 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowH
 
                 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, model.getAccountFilter()
+                                                                               .getValue()));
 
                 // WORKAROUND what seems to be a bug in CardHolder somewhere
                 // when a view that was previously holding a delimiter is re-purposed
@@ -84,27 +136,26 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowH
                         View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
                 break;
             case DELIMITER:
-                Date date = item.getDate();
+                SimpleDate date = item.getDate();
                 holder.vTransaction.setVisibility(View.GONE);
                 holder.vDelimiter.setVisibility(View.VISIBLE);
                 holder.tvDelimiterDate.setText(DateFormat.getDateInstance()
-                                                         .format(date));
+                                                         .format(date.toDate()));
                 if (item.isMonthShown()) {
                     GregorianCalendar cal = new GregorianCalendar(TimeZone.getDefault());
-                    cal.setTime(date);
+                    cal.setTime(date.toDate());
+                    App.prepareMonthNames();
                     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.vDelimiterThick.setVisibility(View.VISIBLE);
                 }
                 else {
                     holder.tvDelimiterMonth.setVisibility(View.GONE);
                     //                holder.vDelimiterLine.setBackgroundResource(R.drawable
                     //                .dashed_border_1dp);
-                    holder.vDelimiterLine.setVisibility(View.VISIBLE);
                     holder.vDelimiterThick.setVisibility(View.GONE);
                 }
                 break;
@@ -122,7 +173,13 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowH
 
     @Override
     public int getItemCount() {
-        return Data.transactions.size();
+        return listDiffer.getCurrentList()
+                         .size();
+    }
+    public void setTransactions(List<TransactionListItem> newList) {
+        Logger.debug("transactions",
+                String.format(Locale.US, "Got new transaction list (%d items)", newList.size()));
+        listDiffer.submitList(newList);
     }
     enum LoaderStep {HEAD, ACCOUNTS, DONE}
 
@@ -131,12 +188,11 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowH
         @Override
         protected Void doInBackground(TransactionLoaderParams... p) {
             LedgerTransaction tr = p[0].transaction;
-            boolean odd = p[0].odd;
 
             SQLiteDatabase db = App.getDatabase();
             tr.loadData(db);
 
-            publishProgress(new TransactionLoaderStep(p[0].holder, p[0].position, tr, odd));
+            publishProgress(new TransactionLoaderStep(p[0].holder, p[0].position, tr));
 
             int rowIndex = 0;
             // FIXME ConcurrentModificationException in ArrayList$ltr.next (ArrayList.java:831)
@@ -180,13 +236,12 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowH
                     Context ctx = holder.row.getContext();
                     LinearLayout row = (LinearLayout) holder.tableAccounts.getChildAt(rowIndex);
                     if (row == null) {
+                        row = new LinearLayout(ctx);
                         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)
+                        inflater.inflate(R.layout.transaction_list_row_accounts_table_row, row);
                         holder.tableAccounts.addView(row);
                     }
+                    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);
@@ -201,8 +256,8 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowH
                     if ((boldAccountName != null) && acc.getAccountName()
                                                         .startsWith(boldAccountName))
                     {
-                        accName.setTextColor(Colors.accent);
-                        accAmount.setTextColor(Colors.accent);
+                        accName.setTextColor(Colors.secondary);
+                        accAmount.setTextColor(Colors.secondary);
 
                         SpannableString ss = new SpannableString(acc.getAccountName());
                         ss.setSpan(new StyleSpan(Typeface.BOLD), 0, boldAccountName.length(),
@@ -210,8 +265,10 @@ 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());
                     }
 
@@ -239,19 +296,17 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowH
         }
     }
 
-    private class TransactionLoaderParams {
-        LedgerTransaction transaction;
-        TransactionRowHolder holder;
-        int position;
-        String boldAccountName;
-        boolean odd;
+    private static class TransactionLoaderParams {
+        final LedgerTransaction transaction;
+        final TransactionRowHolder holder;
+        final int position;
+        final String boldAccountName;
         TransactionLoaderParams(LedgerTransaction transaction, TransactionRowHolder holder,
-                                int position, String boldAccountName, boolean odd) {
+                                int position, String boldAccountName) {
             this.transaction = transaction;
             this.holder = holder;
             this.position = position;
             this.boldAccountName = boldAccountName;
-            this.odd = odd;
         }
     }
 }
\ No newline at end of file