package ua.kpi.ecampus.ui.activity;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.NavUtils;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.PopupMenu;
import android.widget.ProgressBar;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.inject.Inject;
import butterknife.Bind;
import butterknife.OnClick;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import ua.kpi.ecampus.di.UIModule;
import ua.kpi.ecampus.model.dao.IDataAccessObject;
import ua.kpi.ecampus.model.pojo.Bulletin;
import ua.kpi.ecampus.rx.BulletinModeratorResponseManager;
import ua.kpi.ecampus.ui.adapter.PagingRecyclerAdapter;
import ua.kpi.ecampus.ui.presenter.BulletinBoardModeratorPresenter;
import ua.kpi.ecampus.ui.view.ExtendedRecyclerView;
import ua.kpi.ecampus.ui.view.OnItemClickListener;
import ua.kpi.ecampus.util.ToastUtil;
import ua.kpi.ecampus.util.pagination.PaginationTool;
/**
* Bulletin Board activity for Moderator of BulletinBoard.
*/
public class BulletinBoardModeratorActivity extends BaseActivity implements
BulletinBoardModeratorPresenter.IView {
@Bind(ua.kpi.ecampus.R.id.toolbar)
Toolbar mToolbar;
@Bind(ua.kpi.ecampus.R.id.tab_layout)
TabLayout mTabLayout;
@Bind(android.R.id.list)
ExtendedRecyclerView mRecyclerView;
@Bind(ua.kpi.ecampus.R.id.progress_bar_bulletin)
ProgressBar mProgressLoader;
@Inject
BulletinBoardModeratorPresenter mPresenter;
private PagingRecyclerAdapter mAdapter;
private Subscription mPagingSubscription;
/**
* The list of bulletins which are currently in adapter.
* Designed for filtering purposes.
*/
private Collection<Bulletin> mBulletins;
/**
* Is this activity is moderator activity.
* Always true. Affects on recycler item view (enable Edit button).
*/
private final boolean IS_MODERATOR_MODE = true;
/**
* Tabs indices
*/
private final int TAB_ALL = 0;
private final int TAB_ACTUAL = 1;
private final int TAB_PROFILE = 2;
private final int TAB_SUBDIVISION = 3;
private final int TAB_DELETED = 4;
/**
* Limit for the number of loaded items
*/
private final static int LIMIT = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(ua.kpi.ecampus.R.layout
.activity_bulletin_board_moderator);
bindViews();
mPresenter.setView(this);
mPresenter.initializeViewComponent();
}
private OnItemClickListener onItemClickListener =
new OnItemClickListener() {
@Override
public void onItemClicked(View view, int position, Object
item) {
mPresenter.onItemClick(item);
}
};
private PopupMenu.OnMenuItemClickListener onMenuItemClickListener = new
PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case ua.kpi.ecampus.R.id.edit:
Bulletin b = mAdapter.getClickedItem();
mPresenter.onEditMenuClick(b);
break;
}
return true;
}
};
private SearchView.OnQueryTextListener onQueryTextChangeListener = new
SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
final List<Bulletin> filteredList = mPresenter.filterData
(mBulletins, newText);
mAdapter.setFilter(filteredList);
return false;
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(ua.kpi.ecampus.R.menu.menu_bulletin_board,
menu);
final MenuItem item = menu.findItem(ua.kpi.ecampus.R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat
.getActionView(item);
searchView.setOnQueryTextListener(onQueryTextChangeListener);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected List<Object> getModules() {
List<Object> modules = new ArrayList<>();
modules.add(new UIModule());
return modules;
}
@Override
public void setViewComponent() {
setToolbar();
setTabLayout();
setRecyclerView();
}
private void setToolbar() {
setSupportActionBar(mToolbar);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
mToolbar.setNavigationIcon(ua.kpi.ecampus.R.mipmap
.ic_action_navigation_arrow_back);
getSupportActionBar().setTitle(ua.kpi.ecampus.R.string
.activity_bulletin_moderator_mode_title);
}
private void setTabLayout() {
TypedArray tabIcon = mPresenter.getTabsIcon();
mTabLayout.addTab(mTabLayout.newTab().setIcon(tabIcon.getResourceId
(TAB_ALL, -1)), true);
mTabLayout.addTab(mTabLayout.newTab().setIcon(tabIcon.getResourceId
(TAB_ACTUAL, -1)));
mTabLayout.addTab(mTabLayout.newTab().setIcon(tabIcon.getResourceId
(TAB_PROFILE, -1)));
mTabLayout.addTab(mTabLayout.newTab().setIcon(tabIcon.getResourceId
(TAB_SUBDIVISION, -1)));
mTabLayout.addTab(mTabLayout.newTab().setIcon(tabIcon.getResourceId
(TAB_DELETED, -1)));
mTabLayout.setOnTabSelectedListener(new TabLayout
.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
setCurrentTabFragment(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
// N/A
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
// N/A
}
});
}
private void setCurrentTabFragment(int tabPosition) {
switch (tabPosition) {
case TAB_ALL:
mBulletins = mPresenter.getData();
break;
case TAB_ACTUAL:
mBulletins = mPresenter.getFilteredByDate();
break;
case TAB_PROFILE:
mBulletins = mPresenter.getFilteredByProfile();
break;
case TAB_SUBDIVISION:
mBulletins = mPresenter.getFilteredBySubdivision();
break;
case TAB_DELETED:
mBulletins = mPresenter.getDeletedBulletins();
break;
}
mAdapter.setItems(new ArrayList<>(mBulletins));
}
@OnClick(ua.kpi.ecampus.R.id.fab_add)
public void fabAddOnClick() {
mPresenter.onButtonAddClick();
}
private void setVisible(View... views) {
for (View v : views)
v.setVisibility(View.VISIBLE);
}
private void setInvisible(View... views) {
for (View v : views)
v.setVisibility(View.GONE);
}
private void setRecyclerView() {
setInvisible(mRecyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager
(getApplicationContext()));
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setEmptyView(findViewById(android.R.id.empty));
mAdapter = new PagingRecyclerAdapter(IS_MODERATOR_MODE);
mAdapter.setHasStableIds(true);
mRecyclerView.setSaveEnabled(true);
mAdapter.setOnItemClickListener(onItemClickListener);
mAdapter.setOnMenuItemClickListener(onMenuItemClickListener);
mRecyclerView.setAdapter(mAdapter);
// if all items was loaded we don't need Pagination
if (mAdapter.isAllItemsLoaded()) {
return;
}
setRecyclerViewPagination();
}
/**
* RecyclerView pagination
*/
private void setRecyclerViewPagination() {
PaginationTool<List<Bulletin>> paginationTool = PaginationTool
.buildPagingObservable(mRecyclerView, lastId -> new
BulletinModeratorResponseManager().getResponse
(lastId, LIMIT))
.setLimit(LIMIT)
.build();
mPagingSubscription = paginationTool
.getPagingObservable()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<Bulletin>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
if (e != null)
//Log.e(Config.LOG, e.getMessage());
ToastUtil.showError(getString(ua.kpi.ecampus.R.string
.error_while_data_obtaining),
getApplicationContext());
setViewsVisibility();
}
@Override
public void onNext(List<Bulletin> items) {
IDataAccessObject<Bulletin> dao = mPresenter.getDao();
dao.setData(items);
mBulletins = new ArrayList<>(dao.getData());
setViewsVisibility();
mAdapter.setItems(new ArrayList<>(mBulletins));
}
});
}
private void setViewsVisibility() {
setInvisible(mProgressLoader);
setVisible(mRecyclerView);
}
@Override
public void onDestroy() {
if (mPagingSubscription != null && !mPagingSubscription
.isUnsubscribed()) {
mPagingSubscription.unsubscribe();
}
// for memory leak prevention (RecycleView is not unsubscibed from
// adapter DataObserver)
if (mRecyclerView != null) {
mRecyclerView.setAdapter(null);
}
super.onDestroy();
}
}