void sendProgressOrResult(STResult result, boolean isProgress, double percentage) {
   Bundle b = new Bundle();
   b.putSerializable(StickerManager.CATEGORY_ID, category.getCategoryId());
   b.putSerializable(HikeConstants.DOWNLOAD_SOURCE, source);
   if (isProgress) {
     b.putSerializable(StickerManager.PERCENTAGE, percentage);
     StickerManager.getInstance().onStickersDownloadProgress(b);
   } else {
     b.putSerializable(StickerManager.STICKER_DOWNLOAD_TYPE, downloadType);
     if (result != STResult.SUCCESS) {
       StickerException e = getException();
       if (e != null && e.getErrorCode() == StickerException.OUT_OF_SPACE) {
         b.putBoolean(StickerManager.STICKER_DOWNLOAD_FAILED_FILE_TOO_LARGE, true);
       }
       StickerManager.getInstance().stickersDownloadFailed(b);
     } else {
       StickerManager.getInstance().sucessFullyDownloadedStickers(b);
     }
   }
 }
  @Override
  public STResult call() throws Exception {
    Logger.d(getClass().getSimpleName(), "CategoryId: " + category.getCategoryId());

    String directoryPath =
        StickerManager.getInstance().getStickerDirectoryForCategoryId(category.getCategoryId());
    if (directoryPath == null) {
      setException(new StickerException(StickerException.DIRECTORY_NOT_EXISTS));
      Logger.e(
          StickerDownloadManager.TAG,
          "Sticker download failed directory does not exist for task : " + taskId);
      return STResult.DOWNLOAD_FAILED;
    }

    File largeStickerDir = new File(directoryPath + HikeConstants.LARGE_STICKER_ROOT);
    File smallStickerDir = new File(directoryPath + HikeConstants.SMALL_STICKER_ROOT);
    int totalNumber = 0;
    boolean reachedEnd = false;
    boolean retry = true;
    int existingStickerNumber = 0;

    JSONArray existingStickerIds = new JSONArray();

    if (smallStickerDir.exists()) {
      String[] stickerIds = smallStickerDir.list(StickerManager.getInstance().stickerFileFilter);
      for (String stickerId : stickerIds) {
        existingStickerIds.put(stickerId);
        existingStickerNumber++;
        Logger.d(getClass().getSimpleName(), "Existing id: " + stickerId);
      }
    } else {
      smallStickerDir.mkdirs();
      Logger.d(getClass().getSimpleName(), "No existing sticker");
    }
    if (!largeStickerDir.exists()) largeStickerDir.mkdirs();

    Utils.makeNoMediaFile(largeStickerDir);
    Utils.makeNoMediaFile(smallStickerDir);
    while (shouldContinue(reachedEnd, totalNumber, existingStickerNumber)) {

      try {

        JSONObject request = new JSONObject();
        request.put(StickerManager.CATEGORY_ID, category.getCategoryId());
        request.put(HikeConstants.STICKER_IDS, existingStickerIds);
        request.put(HikeConstants.RESOLUTION_ID, Utils.getResolutionId());
        request.put(HikeConstants.NUMBER_OF_STICKERS, getStickerDownloadSize());
        if (source != null) {
          request.put(HikeConstants.DOWNLOAD_SOURCE, source.ordinal());
        }

        String urlString = AccountUtils.base + "/stickers";
        if (AccountUtils.ssl) {
          urlString = AccountUtils.HTTPS_STRING + AccountUtils.host + "/v1" + "/stickers";
        }
        setDownloadUrl(urlString);

        Logger.d(
            StickerDownloadManager.TAG, "Sticker Download Task Request : " + request.toString());
        Logger.d(
            StickerDownloadManager.TAG,
            "Starting download task : " + taskId + " url : " + urlString);
        JSONObject response = (JSONObject) download(request, HttpRequestType.POST);

        if (response == null
            || !HikeConstants.OK.equals(response.getString(HikeConstants.STATUS))) {
          setException(new StickerException(StickerException.NULL_OR_INVALID_RESPONSE));
          Logger.e(
              StickerDownloadManager.TAG,
              "Sticker download failed null or invalid response for task : " + taskId);
          return STResult.DOWNLOAD_FAILED;
        }
        Logger.d(
            StickerDownloadManager.TAG,
            "Got response for download task : " + taskId + " response : " + response.toString());
        int length = response.toString().getBytes().length;

        if (length > Utils.getFreeSpace()) {
          setException(new StickerException(StickerException.OUT_OF_SPACE));
          Logger.e(
              StickerDownloadManager.TAG,
              "Sticker download failed directory out of space for task : " + taskId);
          return STResult.DOWNLOAD_FAILED;
        }

        totalNumber = response.optInt(HikeConstants.TOTAL_STICKERS, -1);
        reachedEnd = response.optBoolean(HikeConstants.REACHED_STICKER_END);
        Logger.d(getClass().getSimpleName(), "Reached end? " + reachedEnd);
        Logger.d(getClass().getSimpleName(), "Sticker count: " + totalNumber);
        JSONObject data = response.getJSONObject(HikeConstants.DATA_2);
        for (Iterator<String> keys = data.keys(); keys.hasNext(); ) {
          String stickerId = keys.next();
          String stickerData = data.getString(stickerId);
          existingStickerIds.put(stickerId);
          existingStickerNumber++;

          try {
            byte[] byteArray =
                StickerManager.getInstance()
                    .saveLargeStickers(largeStickerDir.getAbsolutePath(), stickerId, stickerData);
            StickerManager.getInstance()
                .saveSmallStickers(smallStickerDir.getAbsolutePath(), stickerId, byteArray);
          } catch (FileNotFoundException e) {
            Logger.w(getClass().getSimpleName(), e);
          } catch (IOException e) {
            Logger.w(getClass().getSimpleName(), e);
          }
        }

      } catch (StickerException e) {
        Logger.e(StickerDownloadManager.TAG, "Sticker download failed for task : " + taskId, e);
        setException(e);
        return STResult.DOWNLOAD_FAILED;
      } catch (Exception e) {
        Logger.e(StickerDownloadManager.TAG, "Sticker download failed for task : " + taskId, e);
        setException(new StickerException(e));
        return STResult.DOWNLOAD_FAILED;
      }

      if (getRetryPolicy() != null) {
        ((DefaultRetryPolicy) getRetryPolicy()).reset();
      }
      if (totalNumber != 0) {
        sendProgressOrResult(null, true, existingStickerNumber / totalNumber);
      }
      if (category.getTotalStickers() != totalNumber) {
        category.setTotalStickers(totalNumber);
        HikeConversationsDatabase.getInstance()
            .updateStickerCountForStickerCategory(category.getCategoryId(), totalNumber);
      }
    }

    if (isSucessfull(reachedEnd, totalNumber, existingStickerNumber)) {
      return STResult.SUCCESS;
    } else {
      return STResult.DOWNLOAD_FAILED;
    }
  }