/* * Copyright (c) 2012 Socialize Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.socialize.ui.image; import com.socialize.log.SocializeLogger; import com.socialize.util.CacheableDrawable; import com.socialize.util.Drawables; /** * Loads images from a url. * @author Jason Polites */ public class ImageLoader { private Drawables drawables; private ImageLoadAsyncTask imageLoadAsyncTask; private SocializeLogger logger; /** * Initializes the loader and starts an AsyncTask thread. */ public void init() { if(logger != null && logger.isDebugEnabled()) { logger.debug("ImageLoader starting image load task"); } imageLoadAsyncTask.start(); } /** * Destroys the loader and stops the AsyncTask thread. */ public void destroy() { if(logger != null && logger.isDebugEnabled()) { logger.debug("ImageLoader stopping image load task"); } imageLoadAsyncTask.finish(); } /** * Cancels the load of a previous request. * @param url */ public void cancel(String url) { imageLoadAsyncTask.cancel(url); } /** * Loads an image based on Base64 encoded bytes. * @param id The id to give the request * @param name The name to give the image in cache. * @param encodedData The encoded image data. * @param listener A listener to handle the callback. */ public void loadImageByData(final String name, final String encodedData, int width, int height, final ImageLoadListener listener) { ImageLoadRequest request = makeRequest(); request.setUrl(name); request.setEncodedImageData(encodedData); request.setType(ImageLoadType.ENCODED); loadImage(request, listener); } public void loadImageByUrl(final String url, final ImageLoadListener listener) { loadImageByUrl(url, -1, -1, listener); } /** * Asynchronously loads the image at the given url and calls the listener when it is loaded. * @param id The id to give the request * @param url The url to be loaded * @param listener A listener to handle the callback. */ public void loadImageByUrl(final String url, int width, int height, final ImageLoadListener listener) { ImageLoadRequest request = makeRequest(); request.setUrl(url); request.setType(ImageLoadType.URL); request.setScaleWidth(width); request.setScaleHeight(height); loadImage(request, listener); } public void loadImage(final ImageLoadRequest request, final ImageLoadListener listener) { // Look in cache final String url = request.getUrl(); CacheableDrawable drawable = drawables.getCache().get(url); if(drawable != null && !drawable.isRecycled()) { if(logger != null && logger.isDebugEnabled()) { logger.debug("ImageLoader loading image from cache for " + url); } if(listener != null) { listener.onImageLoad(request, drawable); } } else { if(logger != null && logger.isDebugEnabled()) { if(drawable != null && drawable.isRecycled()) { logger.debug("ImageLoader image was recycled, reloading " + url); } else { logger.debug("ImageLoader enqueuing request for image " + url); } } if(listener != null) { request.addListener(listener); } imageLoadAsyncTask.enqueue(request); } } public Drawables getDrawables() { return drawables; } public void setDrawables(Drawables drawables) { this.drawables = drawables; } protected ImageLoadRequest makeRequest() { return new ImageLoadRequest(); } public void setImageLoadAsyncTask(ImageLoadAsyncTask imageLoadAsyncTask) { this.imageLoadAsyncTask = imageLoadAsyncTask; } public void setLogger(SocializeLogger logger) { this.logger = logger; } public boolean isLoading(String url) { return imageLoadAsyncTask.isLoading(url); } public boolean isEmpty() { return imageLoadAsyncTask.isEmpty(); } }