That fuck shit the fascists are using
at master 135 lines 5.7 kB view raw
1package org.tm.archive.messagedetails; 2 3import android.annotation.SuppressLint; 4import android.view.LayoutInflater; 5import android.view.ViewGroup; 6 7import androidx.annotation.NonNull; 8import androidx.lifecycle.LifecycleOwner; 9import androidx.recyclerview.widget.DiffUtil; 10import androidx.recyclerview.widget.ListAdapter; 11import androidx.recyclerview.widget.RecyclerView; 12 13import com.bumptech.glide.RequestManager; 14 15import org.tm.archive.R; 16import org.tm.archive.conversation.ConversationMessage; 17import org.tm.archive.conversation.colors.Colorizer; 18import org.tm.archive.database.model.MessageRecord; 19import org.tm.archive.databinding.MessageDetailsViewEditHistoryBinding; 20 21final class MessageDetailsAdapter extends ListAdapter<MessageDetailsAdapter.MessageDetailsViewState<?>, RecyclerView.ViewHolder> { 22 23 private final LifecycleOwner lifecycleOwner; 24 private final RequestManager requestManager; 25 private final Colorizer colorizer; 26 private final Callbacks callbacks; 27 28 MessageDetailsAdapter(@NonNull LifecycleOwner lifecycleOwner, @NonNull RequestManager requestManager, @NonNull Colorizer colorizer, @NonNull Callbacks callbacks) { 29 super(new MessageDetailsDiffer()); 30 this.lifecycleOwner = lifecycleOwner; 31 this.requestManager = requestManager; 32 this.colorizer = colorizer; 33 this.callbacks = callbacks; 34 } 35 36 @Override 37 public @NonNull RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 38 switch (viewType) { 39 case MessageDetailsViewState.MESSAGE_HEADER: 40 return new MessageHeaderViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.message_details_header, parent, false), requestManager, colorizer, callbacks); 41 case MessageDetailsViewState.RECIPIENT_HEADER: 42 return new RecipientHeaderViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.message_details_recipient_header, parent, false)); 43 case MessageDetailsViewState.RECIPIENT: 44 return new RecipientViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.message_details_recipient, parent, false), callbacks); 45 case MessageDetailsViewState.EDIT_HISTORY: 46 return new ViewEditHistoryViewHolder(MessageDetailsViewEditHistoryBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), callbacks); 47 default: 48 throw new AssertionError("unknown view type"); 49 } 50 } 51 52 @Override 53 public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { 54 if (holder instanceof MessageHeaderViewHolder) { 55 ((MessageHeaderViewHolder) holder).bind(lifecycleOwner, (ConversationMessage) getItem(position).data); 56 } else if (holder instanceof RecipientHeaderViewHolder) { 57 ((RecipientHeaderViewHolder) holder).bind((RecipientHeader) getItem(position).data); 58 } else if (holder instanceof RecipientViewHolder) { 59 ((RecipientViewHolder) holder).bind((RecipientDeliveryStatus) getItem(position).data); 60 } else if (holder instanceof ViewEditHistoryViewHolder) { 61 ((ViewEditHistoryViewHolder) holder).bind((MessageRecord) getItem(position).data); 62 } else { 63 throw new AssertionError("unknown view holder"); 64 } 65 } 66 67 @Override 68 public int getItemViewType(int position) { 69 return getItem(position).itemType; 70 } 71 72 private static class MessageDetailsDiffer extends DiffUtil.ItemCallback<MessageDetailsViewState<?>> { 73 @Override 74 public boolean areItemsTheSame(@NonNull MessageDetailsViewState<?> oldItem, @NonNull MessageDetailsViewState<?> newItem) { 75 Object oldData = oldItem.data; 76 Object newData = newItem.data; 77 78 if (oldData.getClass() == newData.getClass() && oldItem.itemType == newItem.itemType) { 79 switch (oldItem.itemType) { 80 case MessageDetailsViewState.MESSAGE_HEADER: 81 case MessageDetailsViewState.EDIT_HISTORY: 82 return true; 83 case MessageDetailsViewState.RECIPIENT_HEADER: 84 return oldData == newData; 85 case MessageDetailsViewState.RECIPIENT: 86 return ((RecipientDeliveryStatus) oldData).getRecipient().getId().equals(((RecipientDeliveryStatus) newData).getRecipient().getId()); 87 } 88 } 89 90 return false; 91 } 92 93 @SuppressLint("DiffUtilEquals") 94 @Override 95 public boolean areContentsTheSame(@NonNull MessageDetailsViewState<?> oldItem, @NonNull MessageDetailsViewState<?> newItem) { 96 Object oldData = oldItem.data; 97 Object newData = newItem.data; 98 99 if (oldData.getClass() == newData.getClass() && oldItem.itemType == newItem.itemType) { 100 switch (oldItem.itemType) { 101 case MessageDetailsViewState.MESSAGE_HEADER: 102 return false; 103 case MessageDetailsViewState.RECIPIENT_HEADER: 104 case MessageDetailsViewState.EDIT_HISTORY: 105 return true; 106 case MessageDetailsViewState.RECIPIENT: 107 return ((RecipientDeliveryStatus) oldData).getDeliveryStatus() == ((RecipientDeliveryStatus) newData).getDeliveryStatus(); 108 } 109 } 110 111 return false; 112 } 113 } 114 115 static final class MessageDetailsViewState<T> { 116 public static final int MESSAGE_HEADER = 0; 117 public static final int RECIPIENT_HEADER = 1; 118 public static final int RECIPIENT = 2; 119 public static final int EDIT_HISTORY = 3; 120 121 private final T data; 122 private int itemType; 123 124 MessageDetailsViewState(T t, int itemType) { 125 this.data = t; 126 this.itemType = itemType; 127 } 128 } 129 130 interface Callbacks { 131 void onErrorClicked(@NonNull MessageRecord messageRecord); 132 void onViewEditHistoryClicked(MessageRecord record); 133 void onInternalDetailsClicked(MessageRecord record); 134 } 135}