package com.badoo.chateau.example.ui.conversations.list;
import android.content.res.Resources;
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.support.v7.widget.Toolbar;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
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.ExampleConversation;
import com.badoo.chateau.example.ui.util.recycle.AboveFabItemDecoration;
import com.badoo.chateau.extras.MultiSelectionHelper;
import com.badoo.chateau.extras.ViewFinder;
import com.badoo.chateau.ui.conversations.list.ConversationByLastMessageComparator;
import com.badoo.chateau.ui.conversations.list.ConversationListPresenter;
import com.badoo.chateau.ui.conversations.list.ConversationListPresenter.ConversationListView;
import java.util.Collections;
import java.util.List;
class ExampleConversationListView implements ConversationListView<ExampleConversation>,
MultiSelectionHelper.OnModeChangedListener,
MultiSelectionHelper.OnSelectionChangedListener,
ConversationViewHolder.OnConversationClickedListener, MvpView {
private final ContentLoadingProgressBar mProgress;
private final MultiSelectionHelper mSelectionHelper;
@NonNull
private final Toolbar mToolbar;
private final FloatingActionButton mStartNewChat;
private final ConversationsAdapter mAdapter;
private final RecyclerView mConversationList;
private final ConversationListPresenter<ExampleConversation> mPresenter;
private android.view.ActionMode mCurrentActionMode;
public ExampleConversationListView(@NonNull ViewFinder viewFinder, @NonNull Toolbar toolbar,
@NonNull PresenterFactory<ConversationListView<ExampleConversation>, ConversationListPresenter<ExampleConversation>> presenterFactory) {
mPresenter = presenterFactory.init(this);
mToolbar = toolbar;
mAdapter = new ConversationsAdapter(this);
mProgress = viewFinder.findViewById(R.id.conversations_progress);
mSelectionHelper = new MultiSelectionHelper(mAdapter, this, this);
mAdapter.setSelectionHelper(mSelectionHelper);
mConversationList = viewFinder.findViewById(R.id.conversations_list);
mConversationList.setLayoutManager(new LinearLayoutManager(mConversationList.getContext()));
mConversationList.setAdapter(mAdapter);
mStartNewChat = viewFinder.findViewById(R.id.conversations_start_new_chat_button);
mConversationList.addItemDecoration(new AboveFabItemDecoration(mStartNewChat));
}
@Override
public void showConversations(List<ExampleConversation> conversations) {
Collections.sort(conversations, new ConversationByLastMessageComparator());
mAdapter.setConversations(conversations);
}
@Override
public void showError(boolean fatal, @Nullable Throwable throwable) {
if (fatal) {
Snackbar.make(mConversationList, R.string.error_generic, Snackbar.LENGTH_INDEFINITE).show();
}
}
@Override
public void showLoading() {
if (mAdapter.getItemCount() == 0) {
mProgress.setVisibility(View.VISIBLE);
mProgress.show();
}
}
@Override
public void hideLoading() {
mProgress.hide();
}
@Override
public void onModeChanged(@MultiSelectionHelper.Mode int multiSelect) {
if (multiSelect == MultiSelectionHelper.MODE_MULTIPLE_SELECT) {
mStartNewChat.hide();
mCurrentActionMode = mToolbar.startActionMode(new DeleteConversationActionCallback());
onSelectionChanged(1); // Trigger the update manually since the first item has already been selected and we won't get a callback for it
}
else {
mStartNewChat.show();
if (mCurrentActionMode != null) {
mCurrentActionMode.finish();
}
}
}
@Override
public void onSelectionChanged(int count) {
if (mCurrentActionMode != null) {
mCurrentActionMode.setTitle(getResources().getString(R.string.title_selected_items, count));
}
}
@NonNull
private Resources getResources() {
return mToolbar.getResources();
}
@Override
public void onConversationClicked(@NonNull ExampleConversation conversation) {
mPresenter.onConversationClicked(conversation);
}
private class DeleteConversationActionCallback implements ActionMode.Callback {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.conversation_actions, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
if (item.getItemId() == R.id.action_delete) {
mPresenter.onDeleteConversations(mAdapter.getSelectedConversations());
mode.finish();
}
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
mCurrentActionMode = null;
mSelectionHelper.clearSelectedPositions();
}
}
}