/** * Wire * Copyright (C) 2016 Wire Swiss GmbH * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.waz.zclient.views; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.waz.api.UpdateListener; import com.waz.api.User; import com.waz.zclient.R; import com.waz.zclient.utils.ViewUtils; import com.waz.zclient.views.chathead.ChatheadImageView; import java.util.ArrayList; import java.util.List; public class MentioningAdapter extends RecyclerView.Adapter<MentioningAdapter.ViewHolder> { private static final int MAX_USERS = 8; private static final int MAX_USERS_WITH_TEXT = 2; private List<User> users = new ArrayList<>(); private OnItemClickListener onItemClickListener; @Override public int getItemViewType(int position) { if (getItemCount() <= MAX_USERS_WITH_TEXT) { return R.layout.mentioning_view_item_with_name; } else { return R.layout.mentioning_view_item; } } @Override public MentioningAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false)); } @Override public void onBindViewHolder(MentioningAdapter.ViewHolder holder, int position) { holder.setUser(users.get(position)); holder.setOnItemClickListener(onItemClickListener); } @Override public int getItemCount() { return Math.min(users.size(), MAX_USERS); } public void setUsers(List<User> users) { final List<User> existingUsers = new ArrayList<>(this.users); final List<User> intersection = intersection(existingUsers, users); if (intersection.size() == users.size() && intersection.size() == existingUsers.size()) { return; } if (intersection.size() == 0 || users.size() <= MAX_USERS_WITH_TEXT) { this.users.clear(); for (User user : users) { this.users.add(user); } } else { final List<User> newUsers = new ArrayList<>(users); newUsers.removeAll(intersection); existingUsers.removeAll(intersection); for (User user : existingUsers) { this.users.remove(user); } for (User user : newUsers) { this.users.add(user); } } notifyDataSetChanged(); } private List<User> intersection(List<User> list1, List<User> list2) { List<User> list = new ArrayList<>(); for (User t : list1) { if (list2.contains(t)) { list.add(t); } } return list; } public void setOnItemClickListener(MentioningAdapter.OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } public interface OnItemClickListener { void onItemClick(User user); } public static class ViewHolder extends RecyclerView.ViewHolder implements UpdateListener, View.OnClickListener { private final ChatheadImageView image; private final TextView name; private User user; private OnItemClickListener onItemClickListener; public ViewHolder(View itemView) { super(itemView); image = ViewUtils.getView(itemView, R.id.civ__mentioning_image); image.setOnClickListener(this); name = ViewUtils.getView(itemView, R.id.ttv__mentioning_name); if (name != null) { name.setOnClickListener(this); } } public void setUser(User user) { if (this.user != null) { if (this.image != null) { this.image.setUser(null); } this.user.removeUpdateListener(this); this.user = null; } this.user = user; if (this.user != null) { this.user.addUpdateListener(this); if (this.image != null) { image.setUser(user); } } updated(); } @Override public void updated() { if (name == null) { return; } name.setText(user != null ? user.getDisplayName() : ""); } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } @Override public void onClick(View v) { if (onItemClickListener != null) { onItemClickListener.onItemClick(user); } } } }