2019-01-25 16:58:23 +00:00
|
|
|
package eu.siacs.conversations.ui.adapter;
|
|
|
|
|
|
|
|
import android.app.PendingIntent;
|
|
|
|
import android.content.IntentSender;
|
|
|
|
import android.view.ContextMenu;
|
|
|
|
import android.view.LayoutInflater;
|
|
|
|
import android.view.View;
|
|
|
|
import android.view.ViewGroup;
|
|
|
|
|
2021-01-23 08:25:34 +00:00
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
import androidx.databinding.DataBindingUtil;
|
|
|
|
import androidx.recyclerview.widget.DiffUtil;
|
|
|
|
import androidx.recyclerview.widget.ListAdapter;
|
|
|
|
import androidx.recyclerview.widget.RecyclerView;
|
|
|
|
|
2019-01-25 16:58:23 +00:00
|
|
|
import org.openintents.openpgp.util.OpenPgpUtils;
|
|
|
|
|
|
|
|
import eu.siacs.conversations.R;
|
|
|
|
import eu.siacs.conversations.crypto.PgpEngine;
|
|
|
|
import eu.siacs.conversations.databinding.ContactBinding;
|
|
|
|
import eu.siacs.conversations.entities.Contact;
|
|
|
|
import eu.siacs.conversations.entities.MucOptions;
|
|
|
|
import eu.siacs.conversations.services.XmppConnectionService;
|
|
|
|
import eu.siacs.conversations.ui.ConferenceDetailsActivity;
|
|
|
|
import eu.siacs.conversations.ui.XmppActivity;
|
|
|
|
import eu.siacs.conversations.ui.util.AvatarWorkerTask;
|
|
|
|
import eu.siacs.conversations.ui.util.MucDetailsContextMenuHelper;
|
2020-05-15 15:06:16 +00:00
|
|
|
import eu.siacs.conversations.xmpp.Jid;
|
2019-01-25 16:58:23 +00:00
|
|
|
|
|
|
|
public class UserAdapter extends ListAdapter<MucOptions.User, UserAdapter.ViewHolder> implements View.OnCreateContextMenuListener {
|
|
|
|
|
|
|
|
static final DiffUtil.ItemCallback<MucOptions.User> DIFF = new DiffUtil.ItemCallback<MucOptions.User>() {
|
|
|
|
@Override
|
|
|
|
public boolean areItemsTheSame(@NonNull MucOptions.User a, @NonNull MucOptions.User b) {
|
2019-01-26 19:31:52 +00:00
|
|
|
final Jid fullA = a.getFullJid();
|
|
|
|
final Jid fullB = b.getFullJid();
|
|
|
|
final Jid realA = a.getRealJid();
|
|
|
|
final Jid realB = b.getRealJid();
|
|
|
|
if (fullA != null && fullB != null) {
|
|
|
|
return fullA.equals(fullB);
|
|
|
|
} else if (realA != null && realB != null) {
|
|
|
|
return realA.equals(realB);
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
2019-01-25 16:58:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean areContentsTheSame(@NonNull MucOptions.User a, @NonNull MucOptions.User b) {
|
|
|
|
return a.equals(b);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
private final boolean advancedMode;
|
2019-01-26 19:31:52 +00:00
|
|
|
private MucOptions.User selectedUser = null;
|
2019-01-25 16:58:23 +00:00
|
|
|
|
|
|
|
public UserAdapter(final boolean advancedMode) {
|
|
|
|
super(DIFF);
|
|
|
|
this.advancedMode = advancedMode;
|
|
|
|
}
|
|
|
|
|
|
|
|
@NonNull
|
|
|
|
@Override
|
|
|
|
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
|
|
|
|
return new ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), R.layout.contact, viewGroup, false));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
|
|
|
|
final MucOptions.User user = getItem(position);
|
|
|
|
AvatarWorkerTask.loadAvatar(user, viewHolder.binding.contactPhoto, R.dimen.avatar);
|
|
|
|
viewHolder.binding.getRoot().setOnClickListener(v -> {
|
|
|
|
final XmppActivity activity = XmppActivity.find(v);
|
|
|
|
if (activity != null) {
|
|
|
|
activity.highlightInMuc(user.getConversation(), user.getName());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
viewHolder.binding.getRoot().setTag(user);
|
|
|
|
viewHolder.binding.getRoot().setOnCreateContextMenuListener(this);
|
|
|
|
viewHolder.binding.getRoot().setOnLongClickListener(v -> {
|
|
|
|
selectedUser = user;
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
final String name = user.getName();
|
|
|
|
final Contact contact = user.getContact();
|
|
|
|
if (contact != null) {
|
2019-02-15 13:00:42 +00:00
|
|
|
final String displayName = contact.getDisplayName();
|
|
|
|
viewHolder.binding.contactDisplayName.setText(displayName);
|
|
|
|
if (name != null && !name.equals(displayName)) {
|
2019-01-25 16:58:23 +00:00
|
|
|
viewHolder.binding.contactJid.setText(String.format("%s \u2022 %s", name, ConferenceDetailsActivity.getStatus(viewHolder.binding.getRoot().getContext(), user, advancedMode)));
|
|
|
|
} else {
|
|
|
|
viewHolder.binding.contactJid.setText(ConferenceDetailsActivity.getStatus(viewHolder.binding.getRoot().getContext(), user, advancedMode));
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
viewHolder.binding.contactDisplayName.setText(name == null ? "" : name);
|
|
|
|
viewHolder.binding.contactJid.setText(ConferenceDetailsActivity.getStatus(viewHolder.binding.getRoot().getContext(), user, advancedMode));
|
|
|
|
}
|
|
|
|
if (advancedMode && user.getPgpKeyId() != 0) {
|
|
|
|
viewHolder.binding.key.setVisibility(View.VISIBLE);
|
|
|
|
viewHolder.binding.key.setOnClickListener(v -> {
|
|
|
|
final XmppActivity activity = XmppActivity.find(v);
|
|
|
|
final XmppConnectionService service = activity == null ? null : activity.xmppConnectionService;
|
|
|
|
final PgpEngine pgpEngine = service == null ? null : service.getPgpEngine();
|
|
|
|
if (pgpEngine != null) {
|
|
|
|
PendingIntent intent = pgpEngine.getIntentForKey(user.getPgpKeyId());
|
|
|
|
if (intent != null) {
|
|
|
|
try {
|
|
|
|
activity.startIntentSenderForResult(intent.getIntentSender(), 0, null, 0, 0, 0);
|
|
|
|
} catch (IntentSender.SendIntentException ignored) {
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
viewHolder.binding.key.setText(OpenPgpUtils.convertKeyIdToHex(user.getPgpKeyId()));
|
2020-02-14 11:04:11 +00:00
|
|
|
} else {
|
|
|
|
viewHolder.binding.key.setVisibility(View.GONE);
|
2019-01-25 16:58:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public MucOptions.User getSelectedUser() {
|
|
|
|
return selectedUser;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
|
2019-01-26 19:31:52 +00:00
|
|
|
MucDetailsContextMenuHelper.onCreateContextMenu(menu,v);
|
2019-01-25 16:58:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
class ViewHolder extends RecyclerView.ViewHolder {
|
|
|
|
|
|
|
|
private final ContactBinding binding;
|
|
|
|
|
|
|
|
private ViewHolder(ContactBinding binding) {
|
|
|
|
super(binding.getRoot());
|
|
|
|
this.binding = binding;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|