ChannelSearchResultAdapter.java

  1package eu.siacs.conversations.ui.adapter;
  2
  3import android.app.Activity;
  4import android.text.TextUtils;
  5import android.view.ContextMenu;
  6import android.view.LayoutInflater;
  7import android.view.View;
  8import android.view.ViewGroup;
  9
 10import androidx.annotation.NonNull;
 11import androidx.databinding.DataBindingUtil;
 12import androidx.recyclerview.widget.DiffUtil;
 13import androidx.recyclerview.widget.ListAdapter;
 14import androidx.recyclerview.widget.RecyclerView;
 15
 16import java.util.Locale;
 17
 18import eu.siacs.conversations.R;
 19import eu.siacs.conversations.databinding.SearchResultItemBinding;
 20import eu.siacs.conversations.entities.Room;
 21import eu.siacs.conversations.ui.XmppActivity;
 22import eu.siacs.conversations.ui.util.AvatarWorkerTask;
 23import eu.siacs.conversations.xmpp.Jid;
 24
 25public class ChannelSearchResultAdapter extends ListAdapter<Room, ChannelSearchResultAdapter.ViewHolder> implements View.OnCreateContextMenuListener {
 26
 27    private static final DiffUtil.ItemCallback<Room> DIFF = new DiffUtil.ItemCallback<Room>() {
 28        @Override
 29        public boolean areItemsTheSame(@NonNull Room a, @NonNull Room b) {
 30            return a.address != null && a.address.equals(b.address);
 31        }
 32
 33        @Override
 34        public boolean areContentsTheSame(@NonNull Room a, @NonNull Room b) {
 35            return a.equals(b);
 36        }
 37    };
 38    private OnChannelSearchResultSelected listener;
 39    private Room current;
 40
 41    public ChannelSearchResultAdapter() {
 42        super(DIFF);
 43    }
 44
 45    @NonNull
 46    @Override
 47    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
 48        return new ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), R.layout.search_result_item, viewGroup, false));
 49    }
 50
 51    @Override
 52    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
 53        final Room searchResult = getItem(position);
 54        viewHolder.binding.name.setText(searchResult.getName());
 55        final String description = searchResult.getDescription();
 56        final String language = searchResult.getLanguage();
 57        if (TextUtils.isEmpty(description)) {
 58            viewHolder.binding.description.setVisibility(View.GONE);
 59        } else {
 60            viewHolder.binding.description.setText(description);
 61            viewHolder.binding.description.setVisibility(View.VISIBLE);
 62        }
 63        if (language == null || language.length() != 2) {
 64            viewHolder.binding.language.setVisibility(View.GONE);
 65        } else {
 66            viewHolder.binding.language.setText(language.toUpperCase(Locale.ENGLISH));
 67            viewHolder.binding.language.setVisibility(View.VISIBLE);
 68        }
 69        final Jid room = searchResult.getRoom();
 70        viewHolder.binding.room.setText(room != null ? room.asBareJid().toString() : "");
 71        AvatarWorkerTask.loadAvatar(searchResult, viewHolder.binding.avatar, R.dimen.avatar);
 72        final View root = viewHolder.binding.getRoot();
 73        root.setTag(searchResult);
 74        root.setOnClickListener(v -> listener.onChannelSearchResult(searchResult));
 75        root.setOnCreateContextMenuListener(this);
 76    }
 77
 78    public void setOnChannelSearchResultSelectedListener(OnChannelSearchResultSelected listener) {
 79        this.listener = listener;
 80    }
 81
 82    public Room getCurrent() {
 83        return this.current;
 84    }
 85
 86    @Override
 87    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
 88        final Activity activity = XmppActivity.find(v);
 89        final Object tag = v.getTag();
 90        if (activity != null && tag instanceof Room) {
 91            activity.getMenuInflater().inflate(R.menu.channel_item_context, menu);
 92            this.current = (Room) tag;
 93        }
 94    }
 95
 96    public interface OnChannelSearchResultSelected {
 97        void onChannelSearchResult(Room result);
 98    }
 99
100    public static class ViewHolder extends RecyclerView.ViewHolder {
101
102        private final SearchResultItemBinding binding;
103
104        private ViewHolder(SearchResultItemBinding binding) {
105            super(binding.getRoot());
106            this.binding = binding;
107        }
108    }
109}