package com.erakk.lnreader.task;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import com.erakk.lnreader.LNReaderApplication;
import com.erakk.lnreader.R;
import com.erakk.lnreader.callback.CallbackEventData;
import com.erakk.lnreader.callback.DownloadCallbackEventData;
import com.erakk.lnreader.callback.ICallbackEventData;
import com.erakk.lnreader.callback.ICallbackNotifier;
import com.erakk.lnreader.callback.IExtendedCallbackNotifier;
import com.erakk.lnreader.dao.NovelsDao;
import com.erakk.lnreader.model.NovelContentModel;
import com.erakk.lnreader.model.PageModel;
import java.util.ArrayList;
public class DownloadNovelContentTask extends AsyncTask<Void, ICallbackEventData, AsyncTaskResult<NovelContentModel[]>> implements ICallbackNotifier {
private static final String TAG = DownloadNovelContentTask.class.toString();
private final PageModel[] chapters;
public volatile IExtendedCallbackNotifier<AsyncTaskResult<?>> owner;
private int currentChapter = 0;
private final String taskId;
public DownloadNovelContentTask(PageModel[] chapters, String taskId, IExtendedCallbackNotifier<AsyncTaskResult<?>> owner) {
this.chapters = chapters;
this.owner = owner;
this.taskId = taskId;
}
@Override
protected void onPreExecute() {
// executed on UI thread.
owner.downloadListSetup(this.taskId, null, 0, false);
LNReaderApplication.getInstance().addDownload(this.taskId, this.taskId);
}
@Override
public void onProgressCallback(ICallbackEventData message) {
publishProgress(message);
}
@Override
protected AsyncTaskResult<NovelContentModel[]> doInBackground(Void... params) {
Context ctx = LNReaderApplication.getInstance().getApplicationContext();
ArrayList<Exception> exceptionList = new ArrayList<Exception>();
try {
NovelContentModel[] contents = new NovelContentModel[chapters.length];
for (int i = 0; i < chapters.length; ++i) {
currentChapter++;
NovelContentModel oldContent = NovelsDao.getInstance().getNovelContent(chapters[i], false, null);
String message = ctx.getResources().getString(R.string.download_novel_content_task_progress, chapters[i].getTitle());
if (oldContent != null) {
message = ctx.getResources().getString(R.string.download_novel_content_task_update, chapters[i].getTitle());
}
Log.i(TAG, message);
publishProgress(new CallbackEventData(message, this.taskId));
try {
NovelContentModel temp = NovelsDao.getInstance().getNovelContentFromInternet(chapters[i], this);
contents[i] = temp;
} catch (Exception e) {
Log.e(TAG, String.format("Error when downloading: %s", chapters[i].getTitle()), e);
publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.download_novel_content_task_error, chapters[i].getTitle(), e.getMessage()), this.taskId));
exceptionList.add(e);
}
}
if (exceptionList.size() > 0) {
return new AsyncTaskResult<NovelContentModel[]>(contents, contents.getClass(), exceptionList.get(exceptionList.size() - 1));
}
return new AsyncTaskResult<NovelContentModel[]>(contents, contents.getClass());
} catch (Exception e) {
Log.e(TAG, String.format("Error when downloading: %s", chapters[currentChapter - 1].getPage()), e);
publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.download_novel_content_task_error, chapters[currentChapter - 1].getPage(), e.getMessage()), this.taskId));
return new AsyncTaskResult<NovelContentModel[]>(null, NovelContentModel[].class, e);
}
}
@Override
protected void onProgressUpdate(ICallbackEventData... values) {
// executed on UI thread.
DownloadCallbackEventData message = new DownloadCallbackEventData(values[0].getMessage(), currentChapter, chapters.length, this.taskId);
owner.onProgressCallback(message);
LNReaderApplication.getInstance().updateDownload(this.taskId, message.getPercentage(), message.getMessage());
}
@Override
protected void onPostExecute(AsyncTaskResult<NovelContentModel[]> result) {
Context ctx = LNReaderApplication.getInstance().getApplicationContext();
CallbackEventData message = new CallbackEventData(ctx.getResources().getString(R.string.download_novel_content_task_complete), this.taskId);
owner.downloadListSetup(this.taskId, message.getMessage(), 2, result.getError() != null ? true : false);
LNReaderApplication.getInstance().removeDownload(this.taskId);
owner.onCompleteCallback(message, result);
}
}