package com.xabber.android.ui.adapter;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import com.xabber.android.R;
import com.xabber.android.data.SettingsManager;
import com.xabber.android.data.entity.AccountJid;
import com.xabber.android.data.entity.UserJid;
import com.xabber.android.data.extension.blocking.BlockingManager;
import com.xabber.android.data.log.LogManager;
import com.xabber.android.data.roster.AbstractContact;
import com.xabber.android.data.roster.RosterManager;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class BlockedListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements UpdatableAdapter {
private AccountJid account;
@SuppressWarnings("WeakerAccess")
List<UserJid> blockedContacts;
@SuppressWarnings("WeakerAccess")
@Nullable OnBlockedContactClickListener listener;
@SuppressWarnings("WeakerAccess")
Set<UserJid> checkedContacts;
public BlockedListAdapter(AccountJid account) {
this.account = account;
blockedContacts = new ArrayList<>();
checkedContacts = new HashSet<>();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new BlockListItemViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_block, parent, false));
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
final BlockListItemViewHolder viewHolder = (BlockListItemViewHolder) holder;
final UserJid contact = blockedContacts.get(position);
final AbstractContact rosterContact = RosterManager.getInstance().getBestContact(account, contact);
if (viewHolder.avatar != null) {
viewHolder.avatar.setImageDrawable(rosterContact.getAvatarForContactList());
}
viewHolder.name.setText(rosterContact.getName());
viewHolder.name.setVisibility(View.VISIBLE);
viewHolder.checkBox.setChecked(checkedContacts.contains(contact));
}
@Override
public int getItemCount() {
return blockedContacts.size();
}
@Override
public void onChange() {
blockedContacts.clear();
final Collection<UserJid> blockedContacts = BlockingManager.getInstance().getBlockedContacts(account);
if (blockedContacts != null) {
this.blockedContacts.addAll(blockedContacts);
}
// remove checked contacts not containing in new blocked list
final Iterator<UserJid> iterator = checkedContacts.iterator();
while (iterator.hasNext()) {
final UserJid next = iterator.next();
if (!this.blockedContacts.contains(next)) {
iterator.remove();
}
}
notifyDataSetChanged();
}
public interface OnBlockedContactClickListener {
void onBlockedContactClick();
}
public void setListener(@Nullable OnBlockedContactClickListener listener) {
this.listener = listener;
}
private class BlockListItemViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
private final String LOG_TAG = BlockListItemViewHolder.class.getSimpleName();
@Nullable
final ImageView avatar;
final TextView name;
final CheckBox checkBox;
BlockListItemViewHolder(View view) {
super(view);
if (SettingsManager.contactsShowAvatars()) {
avatar = (ImageView) view.findViewById(R.id.avatar);
avatar.setVisibility(View.VISIBLE);
} else {
avatar = null;
}
name = (TextView) view.findViewById(R.id.contact_list_item_name);
checkBox = (CheckBox) view.findViewById(R.id.block_list_contact_checkbox);
checkBox.setOnClickListener(this);
view.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int adapterPosition = getAdapterPosition();
if (adapterPosition == RecyclerView.NO_POSITION) {
LogManager.w(LOG_TAG, "onClick: no position");
return;
}
UserJid userJid = blockedContacts.get(adapterPosition);
if (checkedContacts.contains(userJid)) {
checkedContacts.remove(userJid);
checkBox.setChecked(false);
} else {
checkedContacts.add(userJid);
checkBox.setChecked(true);
}
if (listener != null) {
listener.onBlockedContactClick();
}
}
}
public ArrayList<UserJid> getCheckedContacts() {
return new ArrayList<>(checkedContacts);
}
public void setCheckedContacts(List<UserJid> checkedContacts) {
this.checkedContacts.clear();
this.checkedContacts.addAll(checkedContacts);
}
}