]> git.ktnx.net Git - mobile-ledger.git/blob - app/src/main/java/net/ktnx/mobileledger/ui/templates/TemplatesRecyclerViewAdapter.java
more pronounced day/month delimiters in the transaction list
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / ui / templates / TemplatesRecyclerViewAdapter.java
1 /*
2  * Copyright © 2021 Damyan Ivanov.
3  * This file is part of MoLe.
4  * MoLe is free software: you can distribute it and/or modify it
5  * under the term of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your opinion), any later version.
8  *
9  * MoLe is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License terms for details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with MoLe. If not, see <https://www.gnu.org/licenses/>.
16  */
17
18 package net.ktnx.mobileledger.ui.templates;
19
20 import android.view.LayoutInflater;
21 import android.view.ViewGroup;
22
23 import androidx.annotation.NonNull;
24 import androidx.recyclerview.widget.AsyncListDiffer;
25 import androidx.recyclerview.widget.DiffUtil;
26 import androidx.recyclerview.widget.RecyclerView;
27
28 import net.ktnx.mobileledger.databinding.TemplateListTemplateItemBinding;
29 import net.ktnx.mobileledger.databinding.TemplatesFallbackDividerBinding;
30 import net.ktnx.mobileledger.db.TemplateHeader;
31
32 import org.jetbrains.annotations.NotNull;
33
34 import java.util.ArrayList;
35 import java.util.List;
36
37 public class TemplatesRecyclerViewAdapter extends RecyclerView.Adapter<BaseTemplateViewHolder> {
38     static final int ITEM_TYPE_TEMPLATE = 1;
39     static final int ITEM_TYPE_DIVIDER = 2;
40     private final AsyncListDiffer<BaseTemplateItem> listDiffer;
41
42     public TemplatesRecyclerViewAdapter() {
43         listDiffer = new AsyncListDiffer<>(this, new DiffUtil.ItemCallback<BaseTemplateItem>() {
44             @Override
45             public boolean areItemsTheSame(
46                     @NotNull TemplatesRecyclerViewAdapter.BaseTemplateItem oldItem,
47                     @NotNull TemplatesRecyclerViewAdapter.BaseTemplateItem newItem) {
48                 return oldItem.getId() == newItem.getId();
49             }
50             @Override
51             public boolean areContentsTheSame(
52                     @NotNull TemplatesRecyclerViewAdapter.BaseTemplateItem oldItem,
53                     @NotNull TemplatesRecyclerViewAdapter.BaseTemplateItem newItem) {
54                 return oldItem.equals(newItem);
55             }
56         });
57     }
58     @NonNull
59     @Override
60     public BaseTemplateViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
61         final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
62         switch (viewType) {
63             case ITEM_TYPE_TEMPLATE:
64                 TemplateListTemplateItemBinding b =
65                         TemplateListTemplateItemBinding.inflate(inflater, parent, false);
66                 return new BaseTemplateViewHolder.TemplateViewHolder(b);
67             case ITEM_TYPE_DIVIDER:
68                 return new BaseTemplateViewHolder.TemplateDividerViewHolder(
69                         TemplatesFallbackDividerBinding.inflate(inflater, parent, false));
70             default:
71                 throw new RuntimeException("Can't handle " + viewType);
72         }
73     }
74     @Override
75     public void onBindViewHolder(@NonNull BaseTemplateViewHolder holder, int position) {
76         holder.bindToItem(listDiffer.getCurrentList()
77                                     .get(position));
78     }
79     @Override
80     public int getItemViewType(int position) {
81         BaseTemplateItem item = getItem(position);
82         if (item instanceof TemplateItem)
83             return ITEM_TYPE_TEMPLATE;
84         if (item instanceof TemplateDivider)
85             return ITEM_TYPE_DIVIDER;
86
87         throw new RuntimeException("Can't handle " + item);
88     }
89     @Override
90     public int getItemCount() {
91         return listDiffer.getCurrentList()
92                          .size();
93     }
94     public void setTemplates(List<TemplateHeader> newList) {
95         List<BaseTemplateItem> itemList = new ArrayList<>();
96
97         boolean reachedFallbackItems = false;
98
99         for (TemplateHeader item : newList) {
100             if (!reachedFallbackItems && item.isFallback()) {
101                 itemList.add(new TemplateDivider());
102                 reachedFallbackItems = true;
103             }
104             itemList.add(new TemplateItem(item));
105         }
106
107         listDiffer.submitList(itemList);
108     }
109     public BaseTemplateItem getItem(int position) {
110         return listDiffer.getCurrentList()
111                          .get(position);
112     }
113
114     static abstract class BaseTemplateItem {
115         abstract long getId();
116
117         abstract boolean equals(BaseTemplateItem other);
118     }
119
120     static class TemplateItem extends BaseTemplateItem {
121         final TemplateHeader template;
122         TemplateItem(TemplateHeader template) {this.template = template;}
123         @Override
124         long getId() {
125             return template.getId();
126         }
127         @Override
128         boolean equals(BaseTemplateItem other) {
129             return template.equals(((TemplateItem) other).template);
130         }
131     }
132
133     static class TemplateDivider extends BaseTemplateItem {
134         @Override
135         long getId() {
136             return -1;
137         }
138         @Override
139         boolean equals(BaseTemplateItem other) {
140             return true;
141         }
142     }
143 }