That fuck shit the fascists are using
1package org.tm.archive.mediasend;
2
3import android.view.LayoutInflater;
4import android.view.View;
5import android.view.ViewGroup;
6import android.widget.CheckBox;
7import android.widget.TextView;
8
9import androidx.annotation.NonNull;
10import androidx.annotation.Nullable;
11import androidx.annotation.StringRes;
12import androidx.recyclerview.widget.RecyclerView;
13
14import com.bumptech.glide.RequestManager;
15
16import org.tm.archive.R;
17import org.tm.archive.components.AvatarImageView;
18import org.tm.archive.components.FromTextView;
19import org.tm.archive.recipients.Recipient;
20import org.tm.archive.util.adapter.SectionedRecyclerViewAdapter;
21import org.tm.archive.util.adapter.StableIdGenerator;
22
23import java.util.ArrayList;
24import java.util.Collection;
25import java.util.Collections;
26import java.util.HashSet;
27import java.util.List;
28import java.util.Set;
29
30class CameraContactAdapter extends SectionedRecyclerViewAdapter<String, CameraContactAdapter.ContactSection> {
31
32 private static final int TYPE_INVITE = 1337;
33 private static final long ID_INVITE = Long.MAX_VALUE;
34
35 private static final String TAG_RECENT = "recent";
36 private static final String TAG_ALL = "all";
37 private static final String TAG_GROUPS = "groups";
38
39 private final RequestManager requestManager;
40 private final Set<Recipient> selected;
41 private final CameraContactListener cameraContactListener;
42
43
44 private final List<ContactSection> sections = new ArrayList<ContactSection>(3) {{
45 ContactSection recentContacts = new ContactSection(TAG_RECENT, R.string.CameraContacts_recent_contacts, Collections.emptyList(), 0);
46 ContactSection allContacts = new ContactSection(TAG_ALL, R.string.CameraContacts_signal_contacts, Collections.emptyList(), recentContacts.size());
47 ContactSection groups = new ContactSection(TAG_GROUPS, R.string.CameraContacts_signal_groups, Collections.emptyList(), recentContacts.size() + allContacts.size());
48
49 add(recentContacts);
50 add(allContacts);
51 add(groups);
52 }};
53
54 CameraContactAdapter(@NonNull RequestManager requestManager, @NonNull CameraContactListener listener) {
55 this.requestManager = requestManager;
56 this.selected = new HashSet<>();
57 this.cameraContactListener = listener;
58 }
59
60 @Override
61 protected @NonNull List<ContactSection> getSections() {
62 return sections;
63 }
64
65 @Override
66 public long getItemId(int globalPosition) {
67 if (isInvitePosition(globalPosition)) {
68 return ID_INVITE;
69 } else {
70 return super.getItemId(globalPosition);
71 }
72 }
73
74 @Override
75 public int getItemViewType(int globalPosition) {
76 if (isInvitePosition(globalPosition)) {
77 return TYPE_INVITE;
78 } else {
79 return super.getItemViewType(globalPosition);
80 }
81 }
82
83 @Override
84 public @NonNull RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
85 if (viewType == TYPE_INVITE) {
86 return new InviteViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.camera_contact_invite_item, viewGroup, false));
87 } else {
88 return super.onCreateViewHolder(viewGroup, viewType);
89 }
90 }
91
92 @Override
93 protected @NonNull RecyclerView.ViewHolder createHeaderViewHolder(@NonNull ViewGroup parent) {
94 return new HeaderViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.camera_contact_header_item, parent, false));
95 }
96
97 @Override
98 protected @NonNull RecyclerView.ViewHolder createContentViewHolder(@NonNull ViewGroup parent) {
99 return new ContactViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.camera_contact_contact_item, parent, false));
100 }
101
102 @Override
103 protected @Nullable RecyclerView.ViewHolder createEmptyViewHolder(@NonNull ViewGroup viewGroup) {
104 return null;
105 }
106
107 @Override
108 public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int globalPosition) {
109 if (isInvitePosition(globalPosition)) {
110 ((InviteViewHolder) holder).bind(cameraContactListener);
111 } else {
112 super.onBindViewHolder(holder, globalPosition);
113 }
114 }
115
116 @Override
117 protected void bindViewHolder(@NonNull RecyclerView.ViewHolder holder, @NonNull ContactSection section, int localPosition) {
118 section.bind(holder, localPosition, selected, requestManager, cameraContactListener);
119 }
120
121 @Override
122 public int getItemCount() {
123 return super.getItemCount() + 1;
124 }
125
126 public void setContacts(@NonNull CameraContacts contacts, @NonNull Collection<Recipient> selected) {
127 ContactSection recentContacts = new ContactSection(TAG_RECENT, R.string.CameraContacts_recent_contacts, contacts.getRecents(), 0);
128 ContactSection allContacts = new ContactSection(TAG_ALL, R.string.CameraContacts_signal_contacts, contacts.getContacts(), recentContacts.size());
129 ContactSection groups = new ContactSection(TAG_GROUPS, R.string.CameraContacts_signal_groups, contacts.getGroups(), recentContacts.size() + allContacts.size());
130
131 sections.clear();
132 sections.add(recentContacts);
133 sections.add(allContacts);
134 sections.add(groups);
135
136 this.selected.clear();
137 this.selected.addAll(selected);
138
139 notifyDataSetChanged();
140 }
141
142 private boolean isInvitePosition(int globalPosition) {
143 return globalPosition == getItemCount() - 1;
144 }
145
146 public static class ContactSection extends SectionedRecyclerViewAdapter.Section<String> {
147
148 private final String tag;
149 private final int titleResId;
150 private final List<Recipient> recipients;
151
152 public ContactSection(@NonNull String tag, @StringRes int titleResId, @NonNull List<Recipient> recipients, int offset) {
153 super(offset);
154 this.tag = tag;
155 this.titleResId = titleResId;
156 this.recipients = recipients;
157 }
158
159 @Override
160 public boolean hasEmptyState() {
161 return false;
162 }
163
164 @Override
165 public int getContentSize() {
166 return recipients.size();
167 }
168
169 @Override
170 public long getItemId(@NonNull StableIdGenerator<String> idGenerator, int globalPosition) {
171 int localPosition = getLocalPosition(globalPosition);
172
173 if (localPosition == 0) {
174 return idGenerator.getId(tag);
175 } else {
176 return idGenerator.getId(recipients.get(localPosition - 1).getId().serialize());
177 }
178 }
179
180 void bind(@NonNull RecyclerView.ViewHolder viewHolder,
181 int localPosition,
182 @NonNull Set<Recipient> selected,
183 @NonNull RequestManager requestManager,
184 @NonNull CameraContactListener cameraContactListener)
185 {
186 if (localPosition == 0) {
187 ((HeaderViewHolder) viewHolder).bind(titleResId);
188 } else {
189 Recipient recipient = recipients.get(localPosition - 1);
190 ((ContactViewHolder) viewHolder).bind(recipient, selected.contains(recipient), requestManager, cameraContactListener);
191 }
192 }
193 }
194
195 private static class HeaderViewHolder extends RecyclerView.ViewHolder {
196
197 private final TextView title;
198
199 HeaderViewHolder(@NonNull View itemView) {
200 super(itemView);
201 this.title = itemView.findViewById(R.id.camera_contact_header);
202 }
203
204 void bind(@StringRes int titleResId) {
205 this.title.setText(titleResId);
206 }
207 }
208
209 private static class ContactViewHolder extends RecyclerView.ViewHolder {
210
211 private final AvatarImageView avatar;
212 private final FromTextView name;
213 private final CheckBox checkbox;
214
215 ContactViewHolder(@NonNull View itemView) {
216 super(itemView);
217
218 this.avatar = itemView.findViewById(R.id.camera_contact_item_avatar);
219 this.name = itemView.findViewById(R.id.camera_contact_item_name);
220 this.checkbox = itemView.findViewById(R.id.camera_contact_item_checkbox);
221 }
222
223 void bind(@NonNull Recipient recipient,
224 boolean selected,
225 @NonNull RequestManager requestManager,
226 @NonNull CameraContactListener listener)
227 {
228 avatar.setAvatar(requestManager, recipient, false);
229 name.setText(recipient);
230 itemView.setOnClickListener(v -> listener.onContactClicked(recipient));
231 checkbox.setChecked(selected);
232 }
233 }
234
235 private static class InviteViewHolder extends RecyclerView.ViewHolder {
236
237 private final View inviteButton;
238
239 public InviteViewHolder(@NonNull View itemView) {
240 super(itemView);
241 inviteButton = itemView.findViewById(R.id.camera_contact_invite);
242 }
243
244 void bind(@NonNull CameraContactListener listener) {
245 inviteButton.setOnClickListener(v -> listener.onInviteContactsClicked());
246 }
247 }
248
249 interface CameraContactListener {
250 void onContactClicked(@NonNull Recipient recipient);
251 void onInviteContactsClicked();
252 }
253}