1 package com.moiseum.wolnelektury.view.book.list;
3 import android.os.Bundle;
4 import android.support.v7.widget.LinearLayoutManager;
5 import android.view.Menu;
6 import android.view.MenuInflater;
7 import android.view.MenuItem;
8 import android.view.View;
9 import android.widget.Button;
10 import android.widget.ProgressBar;
11 import android.widget.Toast;
13 import com.moiseum.wolnelektury.R;
14 import com.moiseum.wolnelektury.base.mvp.PresenterFragment;
15 import com.moiseum.wolnelektury.components.ProgressRecyclerView;
16 import com.moiseum.wolnelektury.components.recycler.EndlessRecyclerOnScrollListener;
17 import com.moiseum.wolnelektury.connection.models.BookModel;
18 import com.moiseum.wolnelektury.view.book.BookActivity;
19 import com.moiseum.wolnelektury.view.book.BookType;
20 import com.moiseum.wolnelektury.view.main.MainActivity;
21 import com.moiseum.wolnelektury.view.main.NavigationElement;
23 import org.greenrobot.eventbus.EventBus;
25 import java.util.List;
27 import butterknife.BindView;
28 import butterknife.OnClick;
34 public class BooksListFragment extends PresenterFragment<BooksListPresenter> implements BooksListView {
36 private static final String PARAM_LIST_TYPE = "PARAM_LIST_TYPE";
38 @BindView(R.id.rvBooksList)
39 ProgressRecyclerView<BookModel> rvBooksList;
40 @BindView(R.id.pbLoadMore)
41 ProgressBar pbLoadMore;
42 @BindView(R.id.btnReloadMore)
45 public static BooksListFragment newInstance(BookListType type) {
46 BooksListFragment fragment = new BooksListFragment();
47 Bundle args = new Bundle(1);
48 args.putSerializable(PARAM_LIST_TYPE, type);
49 fragment.setArguments(args);
53 private BookListType type;
54 private BooksListAdapter adapter;
56 private EndlessRecyclerOnScrollListener rvBooksScrollListener = new EndlessRecyclerOnScrollListener() {
58 public void onLoadMore() {
59 if (adapter.getItemCount() > 0) {
60 getPresenter().loadMoreBooks();
66 public void onCreate(Bundle savedInstanceState) {
67 if (getArguments() == null || getArguments().getSerializable(PARAM_LIST_TYPE) == null) {
68 throw new IllegalStateException("Missing list type parameter.");
70 type = (BookListType) getArguments().getSerializable(PARAM_LIST_TYPE);
71 super.onCreate(savedInstanceState);
75 protected BooksListPresenter createPresenter() {
76 return new BooksListPresenter(this, type);
80 public int getLayoutResourceId() {
81 return R.layout.fragment_books_list;
85 public void prepareView(View view, Bundle savedInstanceState) {
86 LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
87 rvBooksList.setLayoutManager(layoutManager);
88 rvBooksList.addOnScrollListener(rvBooksScrollListener);
90 adapter = new BooksListAdapter(getContext());
91 adapter.setOnItemClickListener((item, view1, position) -> getPresenter().onBookClicked(item, position));
92 if (type.isDeletable()) {
93 adapter.setOnDeleteListener((book, position) -> {
94 getPresenter().onBookDeleteClicked(book);
95 adapter.removeItem(position);
96 Toast.makeText(getContext() ,getString(R.string.book_deleted_message), Toast.LENGTH_SHORT).show();
99 rvBooksList.setAdapter(adapter);
100 rvBooksList.setEmptyText(type.getEmptyListText());
101 if (type.isSearchable()) {
102 setHasOptionsMenu(true);
107 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
108 super.onCreateOptionsMenu(menu, inflater);
109 if (type.isSearchable()) {
110 inflater.inflate(R.menu.menu_searchable, menu);
115 public boolean onOptionsItemSelected(MenuItem item) {
116 if (item.getItemId() == R.id.action_search) {
117 EventBus.getDefault().post(new MainActivity.ChangeNavigationEvent(NavigationElement.SEARCH));
119 return super.onOptionsItemSelected(item);
123 protected String getNameForTracker() {
124 return type.getNameForTracker();
128 public void setData(List<BookModel> books) {
129 if (adapter.getItemCount() == 0) {
130 rvBooksList.setItems(books);
132 rvBooksList.addItems(books);
137 public void clearList() {
142 public void setProgressVisible(boolean visible) {
143 if (adapter.getItemCount() == 0) {
144 rvBooksList.setProgressVisible(visible);
146 pbLoadMore.setVisibility(visible ? View.VISIBLE : View.GONE);
151 public void showError(Exception e) {
152 Toast.makeText(getContext(), R.string.loading_results_failed, Toast.LENGTH_SHORT).show();
153 if (adapter.getItemCount() != 0) {
154 btnReloadMore.setVisibility(View.VISIBLE);
156 rvBooksList.showRetryButton(() -> getPresenter().reloadBooks());
161 public void openBookDetailsView(String bookSlug) {
162 startActivity(new BookActivity.BookIntent(bookSlug, BookType.TYPE_DEFAULT, getActivity()));
166 public void updateEmptyViewVisibility() {
167 rvBooksList.updateEmptyViewVisibility();
171 public void updateFavouriteState(boolean state, Integer clickedPosition) {
172 if (clickedPosition != null) {
173 adapter.getItem(clickedPosition).setLiked(state);
174 adapter.notifyDataSetChanged();
178 @OnClick(R.id.btnReloadMore)
179 public void onReloadMoreClicked() {
180 btnReloadMore.setVisibility(View.GONE);
181 pbLoadMore.setVisibility(View.VISIBLE);
182 getPresenter().loadMoreBooks();