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