@Override
  protected AsyncTaskResult<NovelCollectionModel> doInBackground(PageModel... params) {
    Context ctx = owner.getContext();
    PageModel page = params[0];
    try {
      publishProgress(
          new CallbackEventData(
              ctx.getResources().getString(R.string.add_novel_task_check, page.getPage())));
      page = NovelsDao.getInstance().getUpdateInfo(page, this);
      if (page.isMissing()) {
        return new AsyncTaskResult<NovelCollectionModel>(
            new Exception(
                ctx.getResources().getString(R.string.add_novel_task_missing, page.getPage())));
      }

      NovelCollectionModel novelCol =
          NovelsDao.getInstance().getNovelDetailsFromInternet(page, this);
      Log.d("AddNovelTask", "Downloaded: " + novelCol.getPage());
      return new AsyncTaskResult<NovelCollectionModel>(novelCol);
    } catch (Exception e) {
      Log.e("AddNovelTask", e.getClass().toString() + ": " + e.getMessage(), e);
      publishProgress(
          new CallbackEventData(
              ctx.getResources()
                  .getString(R.string.add_novel_task_error, page.getPage(), e.getMessage())));
      return new AsyncTaskResult<NovelCollectionModel>(e);
    }
  }
 public void onGetResult(AsyncTaskResult<?> result, Class<?> t) {
   Exception e = result.getError();
   if (e == null) {
     // from LoadNovelsTask
     if (t == PageModel[].class) {
       PageModel[] list = (PageModel[]) result.getResult();
       if (list != null) {
         adapter.clear();
         adapter.addAll(list);
         toggleProgressBar(false);
       }
     }
     // from DownloadNovelDetailsTask
     else if (t == NovelCollectionModel[].class) {
       setMessageDialog(new CallbackEventData("Download complete."));
       NovelCollectionModel[] list = (NovelCollectionModel[]) result.getResult();
       for (NovelCollectionModel novelCol : list) {
         try {
           PageModel page = novelCol.getPageModel();
           boolean found = false;
           for (PageModel temp : adapter.data) {
             if (temp.getPage().equalsIgnoreCase(page.getPage())) {
               found = true;
               break;
             }
           }
           if (!found) {
             adapter.data.add(page);
           }
         } catch (Exception e1) {
           Log.e(TAG, e1.getClass().toString() + ": " + e1.getMessage(), e1);
         }
       }
       adapter.notifyDataSetChanged();
       toggleProgressBar(false);
     }
   } else {
     Log.e(TAG, e.getClass().toString() + ": " + e.getMessage(), e);
     Toast.makeText(this, e.getClass().toString() + ": " + e.getMessage(), Toast.LENGTH_LONG)
         .show();
   }
 }
  public void onGetResult(AsyncTaskResult<?> result, Class<?> t) {
    if (!isAdded()) return;

    Exception e = result.getError();
    if (e == null) {
      // from LoadNovelsTask
      if (t == PageModel[].class) {
        PageModel[] list = (PageModel[]) result.getResult();
        Log.d(TAG, "LoadNovelsTask result ok");
        if (list != null && list.length > 0) {
          adapter.clear();
          adapter.addAll(list);
          toggleProgressBar(false);

          // Show message if watch list is empty
          if (list.length == 0 && onlyWatched) {
            Log.d(TAG, "WatchList result set message empty");
            loadingText.setVisibility(TextView.VISIBLE);
            loadingText.setText("Watch List is empty.");
          }
        } else {
          toggleProgressBar(false);
          loadingText.setVisibility(TextView.VISIBLE);
          loadingText.setText("List is empty.");
          Log.w(TAG, "Empty ArrayList!");
        }
      }
      // from DownloadNovelDetailsTask
      else if (t == NovelCollectionModel[].class) {
        setMessageDialog(new CallbackEventData("Download complete."));
        NovelCollectionModel[] list = (NovelCollectionModel[]) result.getResult();
        for (NovelCollectionModel novelCol : list) {
          try {
            PageModel page = novelCol.getPageModel();
            boolean found = false;
            for (PageModel temp : adapter.data) {
              if (temp.getPage().equalsIgnoreCase(page.getPage())) {
                found = true;
                break;
              }
            }
            if (!found) {
              adapter.data.add(page);
            }
          } catch (Exception e1) {
            Log.e(TAG, e1.getClass().toString() + ": " + e1.getMessage(), e1);
          }
        }
        adapter.notifyDataSetChanged();
        toggleProgressBar(false);
      } else {
        Log.e(TAG, "Unknown ResultType: " + t.getName());
      }
    } else {
      Log.e(TAG, e.getClass().toString() + ": " + e.getMessage(), e);
      Toast.makeText(
              getSherlockActivity(),
              e.getClass().toString() + ": " + e.getMessage(),
              Toast.LENGTH_LONG)
          .show();
    }
  }