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.NovelCollectionModel; import com.erakk.lnreader.model.PageModel; public class LoadNovelDetailsTask extends AsyncTask<Void, ICallbackEventData, AsyncTaskResult<NovelCollectionModel>> implements ICallbackNotifier { private static final String TAG = LoadNovelDetailsTask.class.toString(); private boolean refresh = false; public volatile IExtendedCallbackNotifier<AsyncTaskResult<?>> owner; private final String source; private final PageModel pageModel; public LoadNovelDetailsTask(PageModel p, boolean refresh, IExtendedCallbackNotifier<AsyncTaskResult<?>> owner, String source) { super(); this.owner = owner; this.refresh = refresh; this.pageModel = p; this.source = source; } @Override public void onProgressCallback(ICallbackEventData message) { publishProgress(message); } @Override protected void onPreExecute() { // executed on UI thread. String taskName; if (pageModel.getTitle() != null) taskName = pageModel.getTitle(); else taskName = pageModel.getPage(); LNReaderApplication.getInstance().addDownload(source, taskName); } @Override protected AsyncTaskResult<NovelCollectionModel> doInBackground(Void... arg0) { Context ctx = LNReaderApplication.getInstance().getApplicationContext(); try { if (refresh) { publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.load_novel_detail_task_refreshing), source)); NovelCollectionModel novelCol = NovelsDao.getInstance().getNovelDetailsFromInternet(pageModel, this); return new AsyncTaskResult<NovelCollectionModel>(novelCol, novelCol.getClass()); } else { publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.load_novel_detail_task_loading), source)); NovelCollectionModel novelCol = NovelsDao.getInstance().getNovelDetails(pageModel, this, true); return new AsyncTaskResult<NovelCollectionModel>(novelCol, novelCol.getClass()); } } catch (Exception e) { Log.e(TAG, e.getClass().toString() + ": " + e.getMessage(), e); publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.load_novel_detail_task_error, e.getMessage()), source)); return new AsyncTaskResult<NovelCollectionModel>(null, NovelCollectionModel.class, e); } } @Override protected void onProgressUpdate(ICallbackEventData... values) { owner.onProgressCallback(values[0]); if (values[0] instanceof DownloadCallbackEventData) { DownloadCallbackEventData m = (DownloadCallbackEventData) values[0]; LNReaderApplication.getInstance().updateDownload(this.source, m.getPercentage(), m.getMessage()); } else { LNReaderApplication.getInstance().updateDownload(this.source, -1, values[0].getMessage()); } } @Override protected void onPostExecute(AsyncTaskResult<NovelCollectionModel> result) { Context ctx = LNReaderApplication.getInstance().getApplicationContext(); CallbackEventData message = new CallbackEventData(ctx.getResources().getString(R.string.load_novel_detail_task_complete), source); LNReaderApplication.getInstance().removeDownload(source); owner.onCompleteCallback(message, result); } }