That fuck shit the fascists are using
at master 253 lines 8.7 kB view raw
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}