1 package com.moiseum.wolnelektury.view.book.list;
3 import android.os.Bundle;
5 import com.moiseum.wolnelektury.base.DataObserver;
6 import com.moiseum.wolnelektury.base.DataProvider;
7 import com.moiseum.wolnelektury.base.WLApplication;
8 import com.moiseum.wolnelektury.base.mvp.FragmentPresenter;
9 import com.moiseum.wolnelektury.connection.downloads.FileCacheUtils;
10 import com.moiseum.wolnelektury.connection.models.BookModel;
11 import com.moiseum.wolnelektury.connection.services.BooksService;
12 import com.moiseum.wolnelektury.storage.BookStorage;
13 import com.moiseum.wolnelektury.events.BookFavouriteEvent;
15 import org.greenrobot.eventbus.EventBus;
16 import org.greenrobot.eventbus.Subscribe;
17 import org.greenrobot.eventbus.ThreadMode;
19 import java.util.ArrayList;
20 import java.util.Collections;
21 import java.util.List;
23 import io.reactivex.Completable;
24 import io.reactivex.android.schedulers.AndroidSchedulers;
25 import io.reactivex.schedulers.Schedulers;
31 class BooksListPresenter extends FragmentPresenter<BooksListView> {
33 private static final String TAG = BooksListPresenter.class.getSimpleName();
35 private final DataProvider<List<BookModel>, BooksService> dataProvider;
36 private BookStorage storage;
37 private final BookListType bookListType;
38 private String lastKey;
39 private Integer clickedPosition;
41 BooksListPresenter(BooksListView view, BookListType type) {
45 dataProvider = type.getDataProvider();
46 dataProvider.setDataObserver(new BooksListDataObserver());
47 storage = WLApplication.getInstance().getBookStorage();
51 public void onCreate(Bundle savedInstanceState) {
52 super.onCreate(savedInstanceState);
53 EventBus.getDefault().register(this);
57 public void onViewCreated(Bundle savedInstanceState) {
58 super.onViewCreated(savedInstanceState);
63 public void onDestroy() {
65 dataProvider.cancel();
66 EventBus.getDefault().unregister(this);
69 @SuppressWarnings("unused")
70 @Subscribe(threadMode = ThreadMode.MAIN)
71 public void onBookAdded(BookStorage.BookAddedEvent event) {
72 if (bookListType == BookListType.DOWNLOADED) {
77 @SuppressWarnings("unused")
78 @Subscribe(threadMode = ThreadMode.MAIN)
79 public void onBookDeleted(BookStorage.BookDeletedEvent event) {
80 if (bookListType == BookListType.DOWNLOADED) {
85 @SuppressWarnings("unused")
86 @Subscribe(threadMode = ThreadMode.MAIN)
87 public void onFavouriteStateChanged(BookFavouriteEvent event) {
88 // TODO: Change that full reload
89 if (bookListType == BookListType.FAVOURITES) {
92 getView().updateFavouriteState(event.getState(), clickedPosition);
96 public void reloadBooks() {
98 getView().clearList();
102 public void loadMoreBooks() {
103 if (bookListType.isPageable()) {
108 private void loadBooks() {
109 dataProvider.load(lastKey);
112 void onBookClicked(BookModel book, int position) {
113 clickedPosition = position;
114 getView().openBookDetailsView(book.getSlug());
117 void onBookDeleteClicked(BookModel book) {
118 BookModel downloadedBook = storage.find(book.getSlug());
120 List<Completable> deletionOperations = new ArrayList<>();
121 if (downloadedBook != null && downloadedBook.isEbookDownloaded()) {
122 deletionOperations.add(FileCacheUtils.deleteEbookFile(downloadedBook.getEbookFileUrl()));
124 if (downloadedBook != null && downloadedBook.isAudioDownloaded()) {
125 deletionOperations.add(FileCacheUtils.deleteAudiobookFiles(downloadedBook.getAudioFileUrls()));
128 storage.remove(book.getSlug(), false);
129 addDisposable(Completable.concat(deletionOperations).andThen(Completable.fromAction(() -> {
130 })).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(() -> getView().updateEmptyViewVisibility(), error -> {
131 getView().showError(new Exception(error));
137 private class BooksListDataObserver implements DataObserver<List<BookModel>> {
139 private List<BookModel> matchDownloadedBooks(List<BookModel> books) {
140 if (bookListType.isDeletable()) {
141 List<BookModel> merged = new ArrayList<>(books.size());
142 List<BookModel> downloadedBooks = storage.all();
144 for (BookModel book : books) {
145 boolean found = false;
146 for (BookModel downloaded : downloadedBooks) {
147 if (book.getSlug().equals(downloaded.getSlug())) {
148 merged.add(downloaded);
164 public void onLoadStarted() {
165 getView().setProgressVisible(true);
169 public void onLoadSuccess(List<BookModel> data) {
170 if (data.size() > 0) {
171 lastKey = data.get(data.size() - 1).getSortedKey();
172 data = matchDownloadedBooks(data);
174 getView().setProgressVisible(false);
175 getView().setData(data);
179 public void onLoadFailed(Exception e) {
180 getView().setProgressVisible(false);
181 getView().setData(Collections.emptyList());
182 getView().showError(e);