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.helper.BakaReaderException;
import com.erakk.lnreader.helper.Util;
import com.erakk.lnreader.model.NovelCollectionModel;
import com.erakk.lnreader.model.PageModel;
import java.util.ArrayList;
public class DownloadNovelDetailsTask extends AsyncTask<PageModel, ICallbackEventData, AsyncTaskResult<NovelCollectionModel[]>> implements ICallbackNotifier {
private static final String TAG = DownloadNovelDetailsTask.class.toString();
public volatile IExtendedCallbackNotifier<AsyncTaskResult<?>> owner;
private int currentPart = 0;
private int totalParts = 0;
private final String taskId;
public DownloadNovelDetailsTask(IExtendedCallbackNotifier<AsyncTaskResult<?>> owner) {
this.owner = owner;
this.taskId = this.toString();
}
@Override
protected void onPreExecute() {
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<NovelCollectionModel[]> doInBackground(PageModel... params) {
Context ctx = LNReaderApplication.getInstance();
ArrayList<NovelCollectionModel> result = new ArrayList<NovelCollectionModel>();
totalParts = params.length;
ArrayList<Exception> exs = new ArrayList<Exception>();
for (PageModel pageModel : params) {
currentPart++;
try {
Log.i(TAG, "Downloading: " + pageModel.getPage());
publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.download_novel_details_task_progress, pageModel.getTitle()), this.taskId));
NovelCollectionModel novelCol = NovelsDao.getInstance().getNovelDetailsFromInternet(pageModel, this);
result.add(novelCol);
} catch (Exception e) {
Log.e(TAG, "Failed to download novel details for " + pageModel.getPage() + ": " + e.getMessage(), e);
publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.download_novel_details_task_error, pageModel.getPage(), e.getMessage()), this.taskId));
exs.add(e);
}
}
if (exs.size() == 1) {
return new AsyncTaskResult<NovelCollectionModel[]>(result.toArray(new NovelCollectionModel[result.size()]), NovelCollectionModel[].class, new BakaReaderException(exs.get(0).getMessage(), BakaReaderException.DOWNLOADNOVELDETAIL_ERROR));
} else if (exs.size() > 1) {
String errors = Util.join(exs, "\n");
return new AsyncTaskResult<NovelCollectionModel[]>(result.toArray(new NovelCollectionModel[result.size()]), NovelCollectionModel[].class, new BakaReaderException(errors, BakaReaderException.MULTIPLE_ERRORS));
}
return new AsyncTaskResult<NovelCollectionModel[]>(result.toArray(new NovelCollectionModel[result.size()]), NovelCollectionModel[].class);
}
@Override
protected void onProgressUpdate(ICallbackEventData... values) {
// executed on UI thread.
DownloadCallbackEventData message = new DownloadCallbackEventData(values[0].getMessage(), currentPart, totalParts, this.taskId);
owner.onProgressCallback(message);
LNReaderApplication.getInstance().updateDownload(this.taskId, message.getPercentage(), message.getMessage());
}
@Override
protected void onPostExecute(AsyncTaskResult<NovelCollectionModel[]> result) {
Context ctx = LNReaderApplication.getInstance();
owner.downloadListSetup(this.taskId, null, 2, result.getError() != null);
LNReaderApplication.getInstance().removeDownload(this.taskId);
owner.onCompleteCallback(new CallbackEventData(ctx.getResources().getString(R.string.download_novel_details_task_complete), this.taskId), result);
}
}