package com.badoo.chateau.example.ui.conversations.create.selectusers;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.ContentLoadingProgressBar;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView;
import com.badoo.barf.mvp.MvpView;
import com.badoo.barf.mvp.PresenterFactory;
import com.badoo.chateau.example.R;
import com.badoo.chateau.example.data.model.ExampleUser;
import com.badoo.chateau.example.ui.BaseActivity;
import com.badoo.chateau.extras.recycle.BindableViewHolder;
import com.badoo.chateau.extras.MultiSelectionHelper;
import com.badoo.chateau.extras.ViewFinder;
import com.badoo.chateau.ui.conversations.create.selectusers.UserListPresenter;
import com.badoo.chateau.ui.conversations.create.selectusers.UserListPresenter.UserListView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static android.view.View.OnLongClickListener;
import static com.badoo.chateau.extras.MultiSelectionHelper.MODE_MULTIPLE_SELECT;
import static com.badoo.chateau.extras.MultiSelectionHelper.MODE_SINGLE_SELECT;
class UserListViewImpl implements UserListView<ExampleUser>, BaseActivity.BackPressedListener, MultiSelectionHelper.OnModeChangedListener, MvpView {
private final List<ExampleUser> mUsers = new ArrayList<>();
private final View mParent;
private final RecyclerView mUsersList;
private final FloatingActionButton mGroupAction;
private final ContentLoadingProgressBar mProgress;
private final MultiSelectionHelper mMultiSelectionHelper;
private final UserListPresenter<ExampleUser> mPresenter;
UserListViewImpl(@NonNull ViewFinder viewFinder,
@NonNull PresenterFactory<UserListView<ExampleUser>, UserListPresenter<ExampleUser>> presenterFactory) {
mPresenter = presenterFactory.init(this);
mParent = viewFinder.findViewById(R.id.createConversation_parent);
mProgress = viewFinder.findViewById(R.id.createConversation_progress);
mProgress.show();
mUsersList = viewFinder.findViewById(R.id.createConversation_userList);
mUsersList.setLayoutManager(new LinearLayoutManager(mUsersList.getContext()));
mUsersList.setAdapter(new UsersAdapter());
mMultiSelectionHelper = new MultiSelectionHelper(mUsersList.getAdapter(), this, null);
mGroupAction = viewFinder.findViewById(R.id.createConversation_groupAction);
mGroupAction.setOnClickListener(this::onGroupActionClick);
}
@Override
public void showUsers(@NonNull List<ExampleUser> users) {
mProgress.hide();
final int oldSize = mUsers.size();
if (mUsers.addAll(users)) {
mUsersList.getAdapter().notifyItemRangeInserted(oldSize - 1, mUsers.size() - 1);
}
}
@Override
public void showError(boolean fatal, @Nullable Throwable throwable) {
if (fatal) {
Snackbar.make(mUsersList, R.string.error_generic, Snackbar.LENGTH_INDEFINITE).show();
}
}
public void onGroupActionClick(View v) {
if (mMultiSelectionHelper.getMode() == MODE_SINGLE_SELECT) {
mMultiSelectionHelper.setMode(MODE_MULTIPLE_SELECT);
}
else {
mPresenter.onUsersSelected(getSelectedUsers());
}
}
@Override
public boolean onBackPressed() {
switch (mMultiSelectionHelper.getMode()) {
case MODE_SINGLE_SELECT:
return false;
case MODE_MULTIPLE_SELECT:
mMultiSelectionHelper.clearSelectedPositions();
return true;
}
return false;
}
@Override
public void onModeChanged(@MultiSelectionHelper.Mode int mode) {
switch (mode) {
case MODE_SINGLE_SELECT:
mGroupAction.setImageResource(R.drawable.ic_group_chat);
break;
case MODE_MULTIPLE_SELECT:
mGroupAction.setImageResource(R.drawable.ic_done);
Snackbar.make(mParent, R.string.info_select_users_for_group_chat, Snackbar.LENGTH_SHORT).show();
break;
}
}
private List<ExampleUser> getSelectedUsers() {
final List<ExampleUser> users = new ArrayList<>();
for (int position : mMultiSelectionHelper.getSelectedItems()) {
users.add(mUsers.get(position));
}
return users;
}
class UsersAdapter extends RecyclerView.Adapter<UserViewHolder> {
@Override
public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new UserViewHolder(
LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_user, parent, false));
}
@Override
public void onBindViewHolder(UserViewHolder holder, int position) {
holder.bind(mUsers.get(position));
}
@Override
public int getItemCount() {
return mUsers.size();
}
}
class UserViewHolder extends BindableViewHolder<ExampleUser> implements OnClickListener, OnLongClickListener {
private View mContainer;
private TextView mName;
public UserViewHolder(View itemView) {
super(itemView);
mContainer = itemView;
final ViewFinder finder = ViewFinder.from(itemView);
mName = finder.findViewById(R.id.user_name);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
}
@Override
public void bind(ExampleUser user) {
super.bind(user);
mName.setText(user.getDisplayName());
mContainer.setSelected(mMultiSelectionHelper.isPositionSelected(mUsers.indexOf(user)));
}
@Override
public void onClick(View v) {
if (!mMultiSelectionHelper.onClick(mUsers.indexOf(getBoundItem()))) {
mPresenter.onUsersSelected(Collections.singletonList(getBoundItem()));
}
}
@Override
public boolean onLongClick(View v) {
return mMultiSelectionHelper.onLongClick(mUsers.indexOf(getBoundItem()));
}
}
}