// Get the image from the filesystem if it exists or download from network private Observable<Page> getOrDownloadImage(final Page page, Download download) { // If the image URL is empty, do nothing if (page.getImageUrl() == null) return Observable.just(page); String filename = getImageFilename(page); File imagePath = new File(download.directory, filename); // If the image is already downloaded, do nothing. Otherwise download from network Observable<Page> pageObservable = isImageDownloaded(imagePath) ? Observable.just(page) : downloadImage(page, download.source, download.directory, filename); return pageObservable // When the image is ready, set image path, progress (just in case) and status .doOnNext( p -> { page.setImagePath(imagePath.getAbsolutePath()); page.setProgress(100); download.downloadedImages++; page.setStatus(Page.READY); }) // Mark this page as error and allow to download the remaining .onErrorResumeNext( e -> { page.setProgress(0); page.setStatus(Page.ERROR); return Observable.just(page); }); }
// Public method to get the image from the filesystem. It does NOT provide any way to download the // image public Observable<Page> getDownloadedImage(final Page page, File chapterDir) { if (page.getImageUrl() == null) { page.setStatus(Page.ERROR); return Observable.just(page); } File imagePath = new File(chapterDir, getImageFilename(page)); // When the image is ready, set image path, progress (just in case) and status if (isImageDownloaded(imagePath)) { page.setImagePath(imagePath.getAbsolutePath()); page.setProgress(100); page.setStatus(Page.READY); } else { page.setStatus(Page.ERROR); } return Observable.just(page); }