package com.erakk.lnreader.task; import android.content.Context; import android.os.AsyncTask; import android.util.Log; import com.erakk.lnreader.Constants; import com.erakk.lnreader.LNReaderApplication; import com.erakk.lnreader.R; import com.erakk.lnreader.callback.CallbackEventData; 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.PageModel; import java.util.ArrayList; public class LoadNovelsTask extends AsyncTask<Void, ICallbackEventData, AsyncTaskResult<PageModel[]>> implements ICallbackNotifier { private static final String TAG = LoadNovelsTask.class.toString(); private boolean refreshOnly = false; private boolean onlyWatched = false; private boolean alphOrder = false; private final String mode; public volatile IExtendedCallbackNotifier<AsyncTaskResult<?>> owner; private final String taskId; public LoadNovelsTask(IExtendedCallbackNotifier<AsyncTaskResult<?>> owner, boolean refreshOnly, boolean onlyWatched, boolean alphOrder, String mode) { this.refreshOnly = refreshOnly; this.onlyWatched = onlyWatched; this.alphOrder = alphOrder; this.owner = owner; this.mode = mode; this.taskId = this.toString(); } @Override public void onProgressCallback(ICallbackEventData message) { publishProgress(message); } @Override protected void onPreExecute() { // executed on UI thread. owner.onProgressCallback(new CallbackEventData("Loading novels...", this.taskId)); if (refreshOnly) { LNReaderApplication.getInstance().addDownload(this.taskId, this.mode); } } @Override protected AsyncTaskResult<PageModel[]> doInBackground(Void... arg0) { Context ctx = LNReaderApplication.getInstance().getApplicationContext(); // different thread from UI try { ArrayList<PageModel> novels = new ArrayList<PageModel>(); if (mode.equalsIgnoreCase(Constants.EXTRA_NOVEL_LIST_MODE_MAIN)) { if (onlyWatched) { publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.load_novels_task_watched), this.taskId)); novels = NovelsDao.getInstance().getWatchedNovel(); } else { if (refreshOnly) { publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.load_novels_task_refreshing), this.taskId)); novels = NovelsDao.getInstance().getNovelsFromInternet(this); } else { publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.load_novels_task_loading), this.taskId)); novels = NovelsDao.getInstance().getNovels(this, alphOrder); } } } else if (mode.equalsIgnoreCase(Constants.EXTRA_NOVEL_LIST_MODE_ORIGINAL)) { if (refreshOnly) { publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.load_original_task_refreshing), this.taskId)); novels = NovelsDao.getInstance().getOriginalFromInternet(this); } else { publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.load_original_task_loading), this.taskId)); novels = NovelsDao.getInstance().getOriginal(this, alphOrder); } } else if (mode.equalsIgnoreCase(Constants.EXTRA_NOVEL_LIST_MODE_TEASER)) { if (refreshOnly) { publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.load_teaser_task_refreshing), this.taskId)); novels = NovelsDao.getInstance().getTeaserFromInternet(this); } else { publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.load_teaser_task_loading), this.taskId)); novels = NovelsDao.getInstance().getTeaser(this, alphOrder); } } else if (mode.equalsIgnoreCase(Constants.EXTRA_NOVEL_LIST_MODE_WEB)) { if (refreshOnly) { publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.load_web_task_refreshing), this.taskId)); novels = NovelsDao.getInstance().getWebNovelFromInternet(this); } else { publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.load_web_task_loading), this.taskId)); novels = NovelsDao.getInstance().getWebNovel(this, alphOrder); } } return new AsyncTaskResult<PageModel[]>(novels.toArray(new PageModel[novels.size()]), PageModel[].class); } catch (Exception e) { Log.e(TAG, "Error when getting novel list: " + e.getMessage(), e); publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.load_novels_task_error, e.getMessage()), this.taskId)); return new AsyncTaskResult<PageModel[]>(null, PageModel[].class, e); } } @Override protected void onProgressUpdate(ICallbackEventData... values) { owner.onProgressCallback(values[0]); LNReaderApplication.getInstance().updateDownload(this.taskId, -1, values[0].getMessage()); } @Override protected void onPostExecute(AsyncTaskResult<PageModel[]> result) { Context ctx = LNReaderApplication.getInstance(); // executed on UI thread. CallbackEventData message = null; if (mode.equalsIgnoreCase(Constants.EXTRA_NOVEL_LIST_MODE_MAIN)) { if (onlyWatched) { message = new CallbackEventData(ctx.getResources().getString(R.string.load_novels_task_watched_complete), this.taskId); } else { message = new CallbackEventData(ctx.getResources().getString(R.string.load_novels_task_complete), this.taskId); } } else if (mode.equalsIgnoreCase(Constants.EXTRA_NOVEL_LIST_MODE_ORIGINAL)) { message = new CallbackEventData(ctx.getResources().getString(R.string.load_original_task_complete), this.taskId); } else if (mode.equalsIgnoreCase(Constants.EXTRA_NOVEL_LIST_MODE_TEASER)) { message = new CallbackEventData(ctx.getResources().getString(R.string.load_teaser_task_complete), this.taskId); } else if (mode.equalsIgnoreCase(Constants.EXTRA_NOVEL_LIST_MODE_WEB)) { message = new CallbackEventData(ctx.getResources().getString(R.string.load_web_task_complete), this.taskId); } owner.downloadListSetup(this.taskId, null, 2, result.getError() != null); LNReaderApplication.getInstance().removeDownload(this.taskId); owner.onCompleteCallback(message, result); } }