That fuck shit the fascists are using
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}