UserAdapter.java

  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}