package org.bookdash.android.presentation.bookinfo;
import android.support.annotation.NonNull;
import org.bookdash.android.R;
import org.bookdash.android.data.book.BookService;
import org.bookdash.android.data.book.DownloadService;
import org.bookdash.android.data.tracking.Analytics;
import org.bookdash.android.domain.model.DownloadProgressItem;
import org.bookdash.android.domain.model.firebase.FireBookDetails;
import org.bookdash.android.domain.model.firebase.FireContributor;
import org.bookdash.android.presentation.base.BasePresenter;
import java.util.List;
import rx.Scheduler;
import rx.Subscriber;
/**
* @author rebeccafranks
* @since 15/11/03.
*/
class BookInfoPresenter extends BasePresenter<BookInfoContract.View> implements BookInfoContract.Presenter {
private static final String TAG = "BookInfoPresenter";
private final BookService bookService;
private final DownloadService downloadService;
private final Scheduler ioScheduler, mainScheduler;
private final Analytics analytics;
BookInfoPresenter(@NonNull BookService bookService, @NonNull DownloadService downloadService,
@NonNull Analytics analytics, Scheduler ioScheduler, Scheduler mainScheduler) {
this.bookService = bookService;
this.downloadService = downloadService;
this.ioScheduler = ioScheduler;
this.mainScheduler = mainScheduler;
this.analytics = analytics;
}
@Override
public void loadContributorInformation(FireBookDetails bookDetailId) {
addSubscription(
bookService.getContributorsForBook(bookDetailId).subscribeOn(ioScheduler).observeOn(mainScheduler)
.subscribe(new Subscriber<List<FireContributor>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(final Throwable e) {
getView().showSnackBarMessage(R.string.error_getting_contributors);
}
@Override
public void onNext(final List<FireContributor> fireContributors) {
getView().showContributors(fireContributors);
}
}));
}
@Override
public void downloadBook(final FireBookDetails bookInfo) {
if (bookInfo == null || bookInfo.getBookUrl() == null) {
analytics.trackDownloadBookFailed(bookInfo, "book_not_available");
getView().showSnackBarMessage(R.string.book_not_available);
return;
}
if (bookInfo.isDownloading()) {
getView().showSnackBarMessage(R.string.book_is_downloading);
return;
}
bookInfo.setIsDownloading(true);
analytics.trackDownloadBookStarted(bookInfo);
addSubscription(downloadService.downloadFile(bookInfo).subscribeOn(ioScheduler).observeOn(mainScheduler)
.subscribe(new Subscriber<DownloadProgressItem>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
bookInfo.setIsDownloading(false);
String error = null;
if (e != null) {
getView().showSnackBarMessage(R.string.failed_to_download_book, e.getMessage());
error = e.getMessage();
}
analytics.trackDownloadBookFailed(bookInfo, error);
}
@Override
public void onNext(DownloadProgressItem downloadProgressItem) {
getView().showDownloadProgress(downloadProgressItem.getDownloadProgress());
if (downloadProgressItem.isComplete()) {
analytics.trackViewBook(bookInfo);
if (downloadProgressItem.getBookPages() == null) {
getView().showSnackBarMessage(R.string.failed_to_open_book);
analytics.trackDownloadBookFailed(bookInfo, "failed_to_open_book");
return;
}
getView().showDownloadFinished();
bookInfo.setIsDownloading(false);
getView().openBook(bookInfo, downloadProgressItem.getBookPages(),
bookInfo.getFolderLocation());
}
}
}));
}
@Override
public void shareBookClicked(FireBookDetails bookInfo) {
if (bookInfo == null) {
getView().showSnackBarMessage(R.string.book_info_still_loading);
return;
}
analytics.trackShareBook(bookInfo);
getView().sendShareEvent(bookInfo.getBookTitle());
}
}