1package eu.siacs.conversations.ui.adapter;
2
3import android.app.PendingIntent;
4import android.content.IntentSender;
5import androidx.databinding.DataBindingUtil;
6import androidx.annotation.NonNull;
7import androidx.recyclerview.widget.ListAdapter;
8import androidx.recyclerview.widget.DiffUtil;
9import androidx.recyclerview.widget.RecyclerView;
10import android.view.ContextMenu;
11import android.view.LayoutInflater;
12import android.view.View;
13import android.view.ViewGroup;
14
15import org.openintents.openpgp.util.OpenPgpUtils;
16
17import eu.siacs.conversations.R;
18import eu.siacs.conversations.crypto.PgpEngine;
19import eu.siacs.conversations.databinding.ContactBinding;
20import eu.siacs.conversations.entities.Contact;
21import eu.siacs.conversations.entities.MucOptions;
22import eu.siacs.conversations.services.XmppConnectionService;
23import eu.siacs.conversations.ui.ConferenceDetailsActivity;
24import eu.siacs.conversations.ui.XmppActivity;
25import eu.siacs.conversations.ui.util.AvatarWorkerTask;
26import eu.siacs.conversations.ui.util.MucDetailsContextMenuHelper;
27import eu.siacs.conversations.xmpp.Jid;
28
29public class UserAdapter extends ListAdapter<MucOptions.User, UserAdapter.ViewHolder> implements View.OnCreateContextMenuListener {
30
31 static final DiffUtil.ItemCallback<MucOptions.User> DIFF = new DiffUtil.ItemCallback<MucOptions.User>() {
32 @Override
33 public boolean areItemsTheSame(@NonNull MucOptions.User a, @NonNull MucOptions.User b) {
34 final Jid fullA = a.getFullJid();
35 final Jid fullB = b.getFullJid();
36 final Jid realA = a.getRealJid();
37 final Jid realB = b.getRealJid();
38 if (fullA != null && fullB != null) {
39 return fullA.equals(fullB);
40 } else if (realA != null && realB != null) {
41 return realA.equals(realB);
42 } else {
43 return false;
44 }
45 }
46
47 @Override
48 public boolean areContentsTheSame(@NonNull MucOptions.User a, @NonNull MucOptions.User b) {
49 return a.equals(b);
50 }
51 };
52 private final boolean advancedMode;
53 private MucOptions.User selectedUser = null;
54
55 public UserAdapter(final boolean advancedMode) {
56 super(DIFF);
57 this.advancedMode = advancedMode;
58 }
59
60 @NonNull
61 @Override
62 public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
63 return new ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), R.layout.contact, viewGroup, false));
64 }
65
66 @Override
67 public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
68 final MucOptions.User user = getItem(position);
69 AvatarWorkerTask.loadAvatar(user, viewHolder.binding.contactPhoto, R.dimen.avatar);
70 viewHolder.binding.getRoot().setOnClickListener(v -> {
71 final XmppActivity activity = XmppActivity.find(v);
72 if (activity != null) {
73 activity.highlightInMuc(user.getConversation(), user.getName());
74 }
75 });
76 viewHolder.binding.getRoot().setTag(user);
77 viewHolder.binding.getRoot().setOnCreateContextMenuListener(this);
78 viewHolder.binding.getRoot().setOnLongClickListener(v -> {
79 selectedUser = user;
80 return false;
81 });
82 final String name = user.getName();
83 final Contact contact = user.getContact();
84 if (contact != null) {
85 final String displayName = contact.getDisplayName();
86 viewHolder.binding.contactDisplayName.setText(displayName);
87 if (name != null && !name.equals(displayName)) {
88 viewHolder.binding.contactJid.setText(String.format("%s \u2022 %s", name, ConferenceDetailsActivity.getStatus(viewHolder.binding.getRoot().getContext(), user, advancedMode)));
89 } else {
90 viewHolder.binding.contactJid.setText(ConferenceDetailsActivity.getStatus(viewHolder.binding.getRoot().getContext(), user, advancedMode));
91 }
92 } else {
93 viewHolder.binding.contactDisplayName.setText(name == null ? "" : name);
94 viewHolder.binding.contactJid.setText(ConferenceDetailsActivity.getStatus(viewHolder.binding.getRoot().getContext(), user, advancedMode));
95 }
96 if (advancedMode && user.getPgpKeyId() != 0) {
97 viewHolder.binding.key.setVisibility(View.VISIBLE);
98 viewHolder.binding.key.setOnClickListener(v -> {
99 final XmppActivity activity = XmppActivity.find(v);
100 final XmppConnectionService service = activity == null ? null : activity.xmppConnectionService;
101 final PgpEngine pgpEngine = service == null ? null : service.getPgpEngine();
102 if (pgpEngine != null) {
103 PendingIntent intent = pgpEngine.getIntentForKey(user.getPgpKeyId());
104 if (intent != null) {
105 try {
106 activity.startIntentSenderForResult(intent.getIntentSender(), 0, null, 0, 0, 0);
107 } catch (IntentSender.SendIntentException ignored) {
108
109 }
110 }
111 }
112 });
113 viewHolder.binding.key.setText(OpenPgpUtils.convertKeyIdToHex(user.getPgpKeyId()));
114 } else {
115 viewHolder.binding.key.setVisibility(View.GONE);
116 }
117
118
119 }
120
121 public MucOptions.User getSelectedUser() {
122 return selectedUser;
123 }
124
125 @Override
126 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
127 MucDetailsContextMenuHelper.onCreateContextMenu(menu,v);
128 }
129
130 class ViewHolder extends RecyclerView.ViewHolder {
131
132 private final ContactBinding binding;
133
134 private ViewHolder(ContactBinding binding) {
135 super(binding.getRoot());
136 this.binding = binding;
137 }
138 }
139}