/*
* Copyright 2013 Dmitry Monakhov.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package monakhv.samlib.service;
import monakhv.samlib.data.AbstractSettings;
import monakhv.samlib.db.entity.*;
import monakhv.samlib.http.HttpClientController;
import monakhv.samlib.log.Log;
import rx.Observable;
import rx.subjects.PublishSubject;
import rx.subjects.SerializedSubject;
import rx.subjects.Subject;
/**
* Service to making check for author updates Can be called from activity or
* from alarm manager
*
* @author monakhv
*/
public class BookDownloadService {
private static final String DEBUG_TAG = "BookDownloadService";
private final AbstractSettings mSettingsHelper;
private final HttpClientController mHttpClientController;
public BookDownloadService(AbstractSettings settingsHelper, HttpClientController httpClientController) {
mSettingsHelper = settingsHelper;
mHttpClientController = httpClientController;
}
public Observable<Integer> downloadBook(final Book book) {
final Subject<Integer,Integer> subject= new SerializedSubject<>(PublishSubject.<Integer>create());
Thread thread = new Thread() {
@Override
public void run() {
super.run();
AbstractSettings.FileType ft = mSettingsHelper.getFileType();
Log.d(DEBUG_TAG, "downloadBook: default type is " + ft.toString());
switch (ft) {
case HTML:
getBook(book, AbstractSettings.FileType.HTML, subject);
break;
case FB2:
boolean rr = getBook(book, AbstractSettings.FileType.FB2, subject);
if (!rr) {
getBook(book, AbstractSettings.FileType.HTML, subject);
}
break;
}
}
};
thread.start();
return subject;
}
private boolean getBook(Book book, AbstractSettings.FileType ft, Subject<Integer, Integer> subject) {
book.setFileType(ft);
try {
mHttpClientController.downloadBook(book, subject);
subject.onCompleted();
return true;
} catch (Exception ex) {
mSettingsHelper.cleanBookFile(book);//clean file on error
Log.e(DEBUG_TAG, "getBook: Download book error: " + book.getUri(), ex);
if (ft == AbstractSettings.FileType.HTML) {//for FB2 we have the second chance
subject.onError(ex);
}
return false;
}
}
}