X-Git-Url: https://git.mdrn.pl/wl-app.git/blobdiff_plain/48b2fe9f7c2dc3d9aeaaa6dbfb27c7da4f3235ff..269195b3729c1bdc22e9053ee4ebca667ea8549d:/Android/app/src/main/java/com/moiseum/wolnelektury/view/book/list/BooksListFragment.java diff --git a/Android/app/src/main/java/com/moiseum/wolnelektury/view/book/list/BooksListFragment.java b/Android/app/src/main/java/com/moiseum/wolnelektury/view/book/list/BooksListFragment.java new file mode 100644 index 0000000..0bb96fb --- /dev/null +++ b/Android/app/src/main/java/com/moiseum/wolnelektury/view/book/list/BooksListFragment.java @@ -0,0 +1,184 @@ +package com.moiseum.wolnelektury.view.book.list; + +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.ProgressBar; +import android.widget.Toast; + +import com.moiseum.wolnelektury.R; +import com.moiseum.wolnelektury.base.mvp.PresenterFragment; +import com.moiseum.wolnelektury.components.ProgressRecyclerView; +import com.moiseum.wolnelektury.components.recycler.EndlessRecyclerOnScrollListener; +import com.moiseum.wolnelektury.connection.models.BookModel; +import com.moiseum.wolnelektury.view.book.BookActivity; +import com.moiseum.wolnelektury.view.book.BookType; +import com.moiseum.wolnelektury.view.main.MainActivity; +import com.moiseum.wolnelektury.view.main.NavigationElement; + +import org.greenrobot.eventbus.EventBus; + +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +/** + * @author golonkos + */ + +public class BooksListFragment extends PresenterFragment implements BooksListView { + + private static final String PARAM_LIST_TYPE = "PARAM_LIST_TYPE"; + + @BindView(R.id.rvBooksList) + ProgressRecyclerView rvBooksList; + @BindView(R.id.pbLoadMore) + ProgressBar pbLoadMore; + @BindView(R.id.btnReloadMore) + Button btnReloadMore; + + public static BooksListFragment newInstance(BookListType type) { + BooksListFragment fragment = new BooksListFragment(); + Bundle args = new Bundle(1); + args.putSerializable(PARAM_LIST_TYPE, type); + fragment.setArguments(args); + return fragment; + } + + private BookListType type; + private BooksListAdapter adapter; + + private EndlessRecyclerOnScrollListener rvBooksScrollListener = new EndlessRecyclerOnScrollListener() { + @Override + public void onLoadMore() { + if (adapter.getItemCount() > 0) { + getPresenter().loadMoreBooks(); + } + } + }; + + @Override + public void onCreate(Bundle savedInstanceState) { + if (getArguments() == null || getArguments().getSerializable(PARAM_LIST_TYPE) == null) { + throw new IllegalStateException("Missing list type parameter."); + } + type = (BookListType) getArguments().getSerializable(PARAM_LIST_TYPE); + super.onCreate(savedInstanceState); + } + + @Override + protected BooksListPresenter createPresenter() { + return new BooksListPresenter(this, type); + } + + @Override + public int getLayoutResourceId() { + return R.layout.fragment_books_list; + } + + @Override + public void prepareView(View view, Bundle savedInstanceState) { + LinearLayoutManager layoutManager = new LinearLayoutManager(getContext()); + rvBooksList.setLayoutManager(layoutManager); + rvBooksList.addOnScrollListener(rvBooksScrollListener); + + adapter = new BooksListAdapter(getContext()); + adapter.setOnItemClickListener((item, view1, position) -> getPresenter().onBookClicked(item, position)); + if (type.isDeletable()) { + adapter.setOnDeleteListener((book, position) -> { + getPresenter().onBookDeleteClicked(book); + adapter.removeItem(position); + Toast.makeText(getContext() ,getString(R.string.book_deleted_message), Toast.LENGTH_SHORT).show(); + }); + } + rvBooksList.setAdapter(adapter); + rvBooksList.setEmptyText(type.getEmptyListText()); + if (type.isSearchable()) { + setHasOptionsMenu(true); + } + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + if (type.isSearchable()) { + inflater.inflate(R.menu.menu_searchable, menu); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == R.id.action_search) { + EventBus.getDefault().post(new MainActivity.ChangeNavigationEvent(NavigationElement.SEARCH)); + } + return super.onOptionsItemSelected(item); + } + + @Override + protected String getNameForTracker() { + return type.getNameForTracker(); + } + + @Override + public void setData(List books) { + if (adapter.getItemCount() == 0) { + rvBooksList.setItems(books); + } else { + rvBooksList.addItems(books); + } + } + + @Override + public void clearList() { + adapter.clear(); + } + + @Override + public void setProgressVisible(boolean visible) { + if (adapter.getItemCount() == 0) { + rvBooksList.setProgressVisible(visible); + } else { + pbLoadMore.setVisibility(visible ? View.VISIBLE : View.GONE); + } + } + + @Override + public void showError(Exception e) { + Toast.makeText(getContext(), R.string.loading_results_failed, Toast.LENGTH_SHORT).show(); + if (adapter.getItemCount() != 0) { + btnReloadMore.setVisibility(View.VISIBLE); + } else { + rvBooksList.showRetryButton(() -> getPresenter().reloadBooks()); + } + } + + @Override + public void openBookDetailsView(String bookSlug) { + startActivity(new BookActivity.BookIntent(bookSlug, BookType.TYPE_DEFAULT, getActivity())); + } + + @Override + public void updateEmptyViewVisibility() { + rvBooksList.updateEmptyViewVisibility(); + } + + @Override + public void updateFavouriteState(boolean state, Integer clickedPosition) { + if (clickedPosition != null) { + adapter.getItem(clickedPosition).setLiked(state); + adapter.notifyDataSetChanged(); + } + } + + @OnClick(R.id.btnReloadMore) + public void onReloadMoreClicked() { + btnReloadMore.setVisibility(View.GONE); + pbLoadMore.setVisibility(View.VISIBLE); + getPresenter().loadMoreBooks(); + } +}