// Path: webimageloader/src/main/java/com/webimageloader/loader/LoaderWork.java
// public class LoaderWork {
//     private final Loader.Listener listener;
//     private final ImageLoader.ProgressListener progressListener;
//     private final List<Future<?>> futures;
// 
//     private volatile boolean cancelled = false;
// 
//     public LoaderWork(Loader.Listener listener, ImageLoader.ProgressListener progressListener) {
//         this.listener = listener;
//         this.progressListener = progressListener;
//         this.futures = new ArrayList<Future<?>>();
//     }
// 
//     public void cancel() {
//         cancelled = true;
// 
//         synchronized (futures) {
//             for (Future<?> future : futures) {
//                 future.cancel(false);
//             }
//         }
//     }
// 
//     public void start(List<Loader> loaderChain, LoaderRequest request) {
//         Iterator<Loader> it = loaderChain.iterator();
//         Loader loader = it.next();
// 
//         loader.load(new Manager(it, listener), request);
//     }
// 
//     public class Manager {
//         private Iterator<Loader> chain;
//         private Loader.Listener listener;
// 
//         private Loader nextLoader;
// 
//         Manager(Iterator<Loader> chain, Loader.Listener listener) {
//             this.chain = chain;
//             this.listener = listener;
// 
//             if (chain.hasNext()) {
//                 nextLoader = chain.next();
//             }
//         }
// 
//         public boolean isCancelled() {
//             return cancelled;
//         }
// 
//         public void addFuture(Future<?> future) {
//             synchronized (futures) {
//                 futures.add(future);
//             }
//         }
// 
//         public void next(LoaderRequest request) {
//             // Load using old listener
//             next(request, listener);
//         }
// 
//         public void next(LoaderRequest request, Loader.Listener listener) {
//             if (!cancelled) {
//                 Manager nextManager = new Manager(chain, listener);
//                 nextLoader.load(nextManager, request);
//             }
//         }
// 
//         public void publishProgress(float value) {
//             if (!cancelled) {
//                 progressListener.onProgress(value);
//             }
//         }
// 
//         public void deliverStream(InputSupplier is, Metadata metadata) {
//             if (!cancelled) {
//                 listener.onStreamLoaded(is, metadata);
//             }
//         }
// 
//         public void deliverBitmap(Bitmap b, Metadata metadata) {
//             if (!cancelled) {
//                 listener.onBitmapLoaded(b, metadata);
//             }
//         }
// 
//         public void deliverError(Throwable t) {
//             if (!cancelled) {
//                 listener.onError(t);
//             }
//         }
// 
//         public void deliverNotMotified(Metadata metadata) {
//             if (!cancelled) {
//                 listener.onNotModified(metadata);
//             }
//         }
//     }
// }


import com.webimageloader.loader.LoaderWork;
package com.webimageloader.util;


public class ListenerFuture implements Runnable {
    public interface Task {
        void run() throws Exception;
    }

    private Task task;
// Path: webimageloader/src/main/java/com/webimageloader/loader/LoaderWork.java
// public class LoaderWork {
//     private final Loader.Listener listener;
//     private final ImageLoader.ProgressListener progressListener;
//     private final List<Future<?>> futures;
// 
//     private volatile boolean cancelled = false;
// 
//     public LoaderWork(Loader.Listener listener, ImageLoader.ProgressListener progressListener) {
//         this.listener = listener;
//         this.progressListener = progressListener;
//         this.futures = new ArrayList<Future<?>>();
//     }
// 
//     public void cancel() {
//         cancelled = true;
// 
//         synchronized (futures) {
//             for (Future<?> future : futures) {
//                 future.cancel(false);
//             }
//         }
//     }
// 
//     public void start(List<Loader> loaderChain, LoaderRequest request) {
//         Iterator<Loader> it = loaderChain.iterator();
//         Loader loader = it.next();
// 
//         loader.load(new Manager(it, listener), request);
//     }
// 
//     public class Manager {
//         private Iterator<Loader> chain;
//         private Loader.Listener listener;
// 
//         private Loader nextLoader;
// 
//         Manager(Iterator<Loader> chain, Loader.Listener listener) {
//             this.chain = chain;
//             this.listener = listener;
// 
//             if (chain.hasNext()) {
//                 nextLoader = chain.next();
//             }
//         }
// 
//         public boolean isCancelled() {
//             return cancelled;
//         }
// 
//         public void addFuture(Future<?> future) {
//             synchronized (futures) {
//                 futures.add(future);
//             }
//         }
// 
//         public void next(LoaderRequest request) {
//             // Load using old listener
//             next(request, listener);
//         }
// 
//         public void next(LoaderRequest request, Loader.Listener listener) {
//             if (!cancelled) {
//                 Manager nextManager = new Manager(chain, listener);
//                 nextLoader.load(nextManager, request);
//             }
//         }
// 
//         public void publishProgress(float value) {
//             if (!cancelled) {
//                 progressListener.onProgress(value);
//             }
//         }
// 
//         public void deliverStream(InputSupplier is, Metadata metadata) {
//             if (!cancelled) {
//                 listener.onStreamLoaded(is, metadata);
//             }
//         }
// 
//         public void deliverBitmap(Bitmap b, Metadata metadata) {
//             if (!cancelled) {
//                 listener.onBitmapLoaded(b, metadata);
//             }
//         }
// 
//         public void deliverError(Throwable t) {
//             if (!cancelled) {
//                 listener.onError(t);
//             }
//         }
// 
//         public void deliverNotMotified(Metadata metadata) {
//             if (!cancelled) {
//                 listener.onNotModified(metadata);
//             }
//         }
//     }
// }


// Path: webimageloader/src/main/java/com/webimageloader/util/ListenerFuture.java
import com.webimageloader.loader.LoaderWork;

package com.webimageloader.util;


public class ListenerFuture implements Runnable {
    public interface Task {
        void run() throws Exception;
    }

    private Task task;
    private LoaderWork.Manager manager;