UserAdapter.java

  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}