content: 
  package com.banrossyn.imageloader.core;
  
  import android.graphics.Bitmap;
  import com.banrossyn.imageloader.core.assist.LoadedFrom;
  import com.banrossyn.imageloader.core.display.BitmapDisplayer;
  import com.banrossyn.imageloader.core.imageaware.ImageAware;
  import com.banrossyn.imageloader.core.listener.ImageLoadingListener;
  import com.banrossyn.imageloader.utils.L;
  
  /**
   * Displays bitmap in {@link com.banrossyn.imageloader.core.imageaware.ImageAware}. Must be called on UI thread.
   *
   * @author rossyn (banrossyn[at]gmail[dot]com)
   * @see ImageLoadingListener
   * @see BitmapDisplayer
   * @since 1.3.1
   */
  final class DisplayBitmapTask implements Runnable {
  
  	private static final String LOG_DISPLAY_IMAGE_IN_IMAGEAWARE = "Display image in ImageAware (loaded from %1$s) [%2$s]";
  	private static final String LOG_TASK_CANCELLED_IMAGEAWARE_REUSED = "ImageAware is reused for another image. Task is cancelled. [%s]";
  	private static final String LOG_TASK_CANCELLED_IMAGEAWARE_COLLECTED = "ImageAware was collected by GC. Task is cancelled. [%s]";
  
  	private final Bitmap bitmap;
  	private final String imageUri;
  	private final ImageAware imageAware;
  	private final String memoryCacheKey;
  	private final BitmapDisplayer displayer;
  	private final ImageLoadingListener listener;
  	private final ImageLoaderEngine engine;
  	private final LoadedFrom loadedFrom;
  
  	public DisplayBitmapTask(Bitmap bitmap, ImageLoadingInfo imageLoadingInfo, ImageLoaderEngine engine,
  			LoadedFrom loadedFrom) {
  		this.bitmap = bitmap;
  		imageUri = imageLoadingInfo.uri;
  		imageAware = imageLoadingInfo.imageAware;
  		memoryCacheKey = imageLoadingInfo.memoryCacheKey;
  		displayer = imageLoadingInfo.options.getDisplayer();
  		listener = imageLoadingInfo.listener;
  		this.engine = engine;
  		this.loadedFrom = loadedFrom;
  	}
  
  	@Override
  	public void run() {
  		if (imageAware.isCollected()) {
  			L.d(LOG_TASK_CANCELLED_IMAGEAWARE_COLLECTED, memoryCacheKey);
  			listener.onLoadingCancelled(imageUri, imageAware.getWrappedView());
  		} else if (isViewWasReused()) {
  			L.d(LOG_TASK_CANCELLED_IMAGEAWARE_REUSED, memoryCacheKey);
  			listener.onLoadingCancelled(imageUri, imageAware.getWrappedView());
  		} else {
  			L.d(LOG_DISPLAY_IMAGE_IN_IMAGEAWARE, loadedFrom, memoryCacheKey);
  			displayer.display(bitmap, imageAware, loadedFrom);
  			engine.cancelDisplayTaskFor(imageAware);
  			listener.onLoadingComplete(imageUri, imageAware.getWrappedView(), bitmap);
  		}
  	}
  
  	/** Checks whether memory cache key (image URI) for current ImageAware is actual */
  	private boolean isViewWasReused() {
  		String currentCacheKey = engine.getLoadingUriForView(imageAware);
  		return !memoryCacheKey.equals(currentCacheKey);
  	}
  }
  