package com.novoda.bonfire.user.view;
import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.novoda.bonfire.R;
import com.novoda.bonfire.user.data.model.User;
import com.novoda.bonfire.user.data.model.Users;
import com.novoda.bonfire.user.displayer.UsersDisplayer;
import com.novoda.notils.caster.Views;
import java.util.ArrayList;
import java.util.List;
public class UsersView extends LinearLayout implements UsersDisplayer {
private UsersAdapter usersAdapter;
private RecyclerView recyclerView;
private List<SelectableUser> selectableUsers;
private Toolbar toolbar;
private SelectionListener selectionListener;
public UsersView(Context context, AttributeSet attrs) {
super(context, attrs);
setOrientation(VERTICAL);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
View.inflate(getContext(), R.layout.merge_users_view, this);
recyclerView = Views.findById(this, R.id.users_recycler_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
toolbar = Views.findById(this, R.id.toolbar);
toolbar.setTitle(R.string.members);
toolbar.inflateMenu(R.menu.users_menu);
recyclerView.setLayoutManager(layoutManager);
}
@Override
public void attach(final SelectionListener selectionListener) {
this.selectionListener = selectionListener;
usersAdapter = new UsersAdapter(selectionListener, LayoutInflater.from(getContext()));
recyclerView.setAdapter(usersAdapter);
toolbar.setOnMenuItemClickListener(menuItemClickListener);
}
@Override
public void detach(SelectionListener selectionListener) {
this.selectionListener = null;
toolbar.setOnMenuItemClickListener(null);
}
@Override
public void display(Users users) {
selectableUsers = toSelectableUsers(users);
usersAdapter.update(selectableUsers);
}
@Override
public void showFailure() {
//TODO no toast
Toast.makeText(getContext(), "Cannot add users to the channel", Toast.LENGTH_LONG).show();
}
@Override
public void displaySelectedUsers(Users selectedUsers) {
List<SelectableUser> usersWithUpdatedSelection = new ArrayList<>(selectableUsers.size());
for (SelectableUser selectableUser : selectableUsers) {
boolean isSelected = isUserSelected(selectedUsers, selectableUser);
usersWithUpdatedSelection.add(new SelectableUser(selectableUser.user, isSelected));
}
selectableUsers = usersWithUpdatedSelection;
usersAdapter.update(selectableUsers);
toolbar.setTitle(selectedUsers.size() + " Selected");
}
private boolean isUserSelected(Users selectedUsers, SelectableUser selectableUser) {
boolean foundMatch = false;
for (User selectedUser : selectedUsers.getUsers()) {
if (selectedUser.equals(selectableUser.user)) {
foundMatch = true;
break;
}
}
return foundMatch;
}
private Toolbar.OnMenuItemClickListener menuItemClickListener = new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.usersDoneButton) {
selectionListener.onCompleteClicked();
}
return false;
}
};
class SelectableUser {
public final User user;
public final boolean isSelected;
SelectableUser(User user, boolean isSelected) {
this.user = user;
this.isSelected = isSelected;
}
}
private List<SelectableUser> toSelectableUsers(Users users) {
List<SelectableUser> selectableUsers = new ArrayList<>(users.size());
for (User user : users.getUsers()) {
selectableUsers.add(new SelectableUser(user, false));
}
return selectableUsers;
}
}