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; } }