Added Android code
[wl-app.git] / Android / app / src / main / java / com / moiseum / wolnelektury / view / book / list / BooksListFragment.java
1 package com.moiseum.wolnelektury.view.book.list;
2
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;
12
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;
22
23 import org.greenrobot.eventbus.EventBus;
24
25 import java.util.List;
26
27 import butterknife.BindView;
28 import butterknife.OnClick;
29
30 /**
31  * @author golonkos
32  */
33
34 public class BooksListFragment extends PresenterFragment<BooksListPresenter> implements BooksListView {
35
36         private static final String PARAM_LIST_TYPE = "PARAM_LIST_TYPE";
37
38         @BindView(R.id.rvBooksList)
39         ProgressRecyclerView<BookModel> rvBooksList;
40         @BindView(R.id.pbLoadMore)
41         ProgressBar pbLoadMore;
42         @BindView(R.id.btnReloadMore)
43         Button btnReloadMore;
44
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);
50                 return fragment;
51         }
52
53         private BookListType type;
54         private BooksListAdapter adapter;
55
56         private EndlessRecyclerOnScrollListener rvBooksScrollListener = new EndlessRecyclerOnScrollListener() {
57                 @Override
58                 public void onLoadMore() {
59                         if (adapter.getItemCount() > 0) {
60                                 getPresenter().loadMoreBooks();
61                         }
62                 }
63         };
64
65         @Override
66         public void onCreate(Bundle savedInstanceState) {
67                 if (getArguments() == null || getArguments().getSerializable(PARAM_LIST_TYPE) == null) {
68                         throw new IllegalStateException("Missing list type parameter.");
69                 }
70                 type = (BookListType) getArguments().getSerializable(PARAM_LIST_TYPE);
71                 super.onCreate(savedInstanceState);
72         }
73
74         @Override
75         protected BooksListPresenter createPresenter() {
76                 return new BooksListPresenter(this, type);
77         }
78
79         @Override
80         public int getLayoutResourceId() {
81                 return R.layout.fragment_books_list;
82         }
83
84         @Override
85         public void prepareView(View view, Bundle savedInstanceState) {
86                 LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
87                 rvBooksList.setLayoutManager(layoutManager);
88                 rvBooksList.addOnScrollListener(rvBooksScrollListener);
89
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();
97                         });
98                 }
99                 rvBooksList.setAdapter(adapter);
100                 rvBooksList.setEmptyText(type.getEmptyListText());
101                 if (type.isSearchable()) {
102                         setHasOptionsMenu(true);
103                 }
104         }
105
106         @Override
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);
111                 }
112         }
113
114         @Override
115         public boolean onOptionsItemSelected(MenuItem item) {
116                 if (item.getItemId() == R.id.action_search) {
117                         EventBus.getDefault().post(new MainActivity.ChangeNavigationEvent(NavigationElement.SEARCH));
118                 }
119                 return super.onOptionsItemSelected(item);
120         }
121
122         @Override
123         protected String getNameForTracker() {
124                 return type.getNameForTracker();
125         }
126
127         @Override
128         public void setData(List<BookModel> books) {
129                 if (adapter.getItemCount() == 0) {
130                         rvBooksList.setItems(books);
131                 } else {
132                         rvBooksList.addItems(books);
133                 }
134         }
135
136         @Override
137         public void clearList() {
138                 adapter.clear();
139         }
140
141         @Override
142         public void setProgressVisible(boolean visible) {
143                 if (adapter.getItemCount() == 0) {
144                         rvBooksList.setProgressVisible(visible);
145                 } else {
146                         pbLoadMore.setVisibility(visible ? View.VISIBLE : View.GONE);
147                 }
148         }
149
150         @Override
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);
155                 } else {
156                         rvBooksList.showRetryButton(() -> getPresenter().reloadBooks());
157                 }
158         }
159
160         @Override
161         public void openBookDetailsView(String bookSlug) {
162                 startActivity(new BookActivity.BookIntent(bookSlug, BookType.TYPE_DEFAULT, getActivity()));
163         }
164
165         @Override
166         public void updateEmptyViewVisibility() {
167                 rvBooksList.updateEmptyViewVisibility();
168         }
169
170         @Override
171         public void updateFavouriteState(boolean state, Integer clickedPosition) {
172                 if (clickedPosition != null) {
173                         adapter.getItem(clickedPosition).setLiked(state);
174                         adapter.notifyDataSetChanged();
175                 }
176         }
177
178         @OnClick(R.id.btnReloadMore)
179         public void onReloadMoreClicked() {
180                 btnReloadMore.setVisibility(View.GONE);
181                 pbLoadMore.setVisibility(View.VISIBLE);
182                 getPresenter().loadMoreBooks();
183         }
184 }