// Path: restvolley/src/main/java/com/hujiang/restvolley/MD5Utils.java
// public class MD5Utils {
// 
//     private static final int HEX_FF = 0xFF;
// 
//     /**
//      *
//      * @param key for disk.
//      * @return hash key.
//      */
//     public static String hashKeyForDisk(String key) {
//         String cacheKey;
//         try {
//             final MessageDigest mDigest = MessageDigest.getInstance("MD5");
//             mDigest.update(key.getBytes());
//             cacheKey = bytesToHexString(mDigest.digest());
//         } catch (NoSuchAlgorithmException e) {
//             cacheKey = String.valueOf(key.hashCode());
//         }
//         return cacheKey;
//     }
// 
//     private static String bytesToHexString(byte[] bytes) {
//         StringBuilder sb = new StringBuilder();
//         for (int i = 0; i < bytes.length; i++) {
//             String hex = Integer.toHexString(HEX_FF & bytes[i]);
//             if (hex.length() == 1) {
//                 sb.append('0');
//             }
//             sb.append(hex);
//         }
//         return sb.toString();
//     }
// 
// }
// 
// Path: restvolley/src/main/java/com/hujiang/restvolley/TaskScheduler.java
// public class TaskScheduler {
// 
//     private static Handler mHandler = new Handler(Looper.getMainLooper());
//     private static ThreadPool mThreadPool = new ThreadPool("com.hujiang.restvolley.task_scheduler");
// 
//     /**
//      * 以轻量级的方式执行一个异步任务.
//      * @param backgroundTaskRunnable 异步任务
//      */
//     public static void execute(final Runnable backgroundTaskRunnable) {
//         if (backgroundTaskRunnable != null) {
//             mThreadPool.addTask(backgroundTaskRunnable);
//         }
//     }
// 
//     /**
//      * execute a task.
//      * @param backgroundRunnable background task
//      * @param foregroundRunnable foreground task
//      */
//     public static void execute(final Runnable backgroundRunnable, final Runnable foregroundRunnable) {
//         mThreadPool.addTask(new Runnable() {
//             @Override
//             public void run() {
//                 if (backgroundRunnable != null) {
//                     backgroundRunnable.run();
//                 }
// 
//                 if (foregroundRunnable != null) {
//                     mHandler.post(foregroundRunnable);
//                 }
//             }
//         });
//     }
// 
//     /**
//      * execute a task.
//      * @param task {@link Task}
//      * @param <IT> in paramter's type
//      * @param <OT> out paramter's type
//      */
//     public static <IT, OT> void execute(final Task<IT, OT> task) {
//         exec(task);
//     }
// 
//     private static <IT, OT> void exec(final Task<IT, OT> task) {
//         if (task != null) {
//             mThreadPool.addTask(new Runnable() {
//                 @Override
//                 public void run() {
//                     final OT out = task.onDoInBackground(task.mInput);
//                     mHandler.post(new Runnable() {
//                         @Override
//                         public void run() {
//                             task.onPostExecuteForeground(out);
//                         }
//                     });
// 
//                 }
//             });
//         }
//     }
// }


import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Environment;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.LruCache;
import android.widget.ImageView;
import com.android.volley.VolleyLog;
import com.hujiang.restvolley.MD5Utils;
import com.hujiang.restvolley.TaskScheduler;
import com.jakewharton.disklrucache.DiskLruCache;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private Bitmap getBitmapFromDiskLruCache(String key) {
        if (getDiskCache() == null) {
            return null;
        }

        String cachePath = new StringBuilder(getDiskCachePath()).append(File.separator).append(key).append(".0").toString();
        File cacheFile = new File(cachePath);
        try {
            if (cacheFile.exists()) {
                return ImageProcessor.decode(cachePath);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } catch (OutOfMemoryError error) {
            VolleyLog.e("Caught OOM for %d byte image, uri=%s", cacheFile.length(), cachePath);
        }

        return null;
    }

    private String generateKey(String target) {
// Path: restvolley/src/main/java/com/hujiang/restvolley/MD5Utils.java
// public class MD5Utils {
// 
//     private static final int HEX_FF = 0xFF;
// 
//     /**
//      *
//      * @param key for disk.
//      * @return hash key.
//      */
//     public static String hashKeyForDisk(String key) {
//         String cacheKey;
//         try {
//             final MessageDigest mDigest = MessageDigest.getInstance("MD5");
//             mDigest.update(key.getBytes());
//             cacheKey = bytesToHexString(mDigest.digest());
//         } catch (NoSuchAlgorithmException e) {
//             cacheKey = String.valueOf(key.hashCode());
//         }
//         return cacheKey;
//     }
// 
//     private static String bytesToHexString(byte[] bytes) {
//         StringBuilder sb = new StringBuilder();
//         for (int i = 0; i < bytes.length; i++) {
//             String hex = Integer.toHexString(HEX_FF & bytes[i]);
//             if (hex.length() == 1) {
//                 sb.append('0');
//             }
//             sb.append(hex);
//         }
//         return sb.toString();
//     }
// 
// }
// 
// Path: restvolley/src/main/java/com/hujiang/restvolley/TaskScheduler.java
// public class TaskScheduler {
// 
//     private static Handler mHandler = new Handler(Looper.getMainLooper());
//     private static ThreadPool mThreadPool = new ThreadPool("com.hujiang.restvolley.task_scheduler");
// 
//     /**
//      * 以轻量级的方式执行一个异步任务.
//      * @param backgroundTaskRunnable 异步任务
//      */
//     public static void execute(final Runnable backgroundTaskRunnable) {
//         if (backgroundTaskRunnable != null) {
//             mThreadPool.addTask(backgroundTaskRunnable);
//         }
//     }
// 
//     /**
//      * execute a task.
//      * @param backgroundRunnable background task
//      * @param foregroundRunnable foreground task
//      */
//     public static void execute(final Runnable backgroundRunnable, final Runnable foregroundRunnable) {
//         mThreadPool.addTask(new Runnable() {
//             @Override
//             public void run() {
//                 if (backgroundRunnable != null) {
//                     backgroundRunnable.run();
//                 }
// 
//                 if (foregroundRunnable != null) {
//                     mHandler.post(foregroundRunnable);
//                 }
//             }
//         });
//     }
// 
//     /**
//      * execute a task.
//      * @param task {@link Task}
//      * @param <IT> in paramter's type
//      * @param <OT> out paramter's type
//      */
//     public static <IT, OT> void execute(final Task<IT, OT> task) {
//         exec(task);
//     }
// 
//     private static <IT, OT> void exec(final Task<IT, OT> task) {
//         if (task != null) {
//             mThreadPool.addTask(new Runnable() {
//                 @Override
//                 public void run() {
//                     final OT out = task.onDoInBackground(task.mInput);
//                     mHandler.post(new Runnable() {
//                         @Override
//                         public void run() {
//                             task.onPostExecuteForeground(out);
//                         }
//                     });
// 
//                 }
//             });
//         }
//     }
// }


// Path: restvolley/src/main/java/com/hujiang/restvolley/image/RestVolleyImageCache.java
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Environment;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.LruCache;
import android.widget.ImageView;
import com.android.volley.VolleyLog;
import com.hujiang.restvolley.MD5Utils;
import com.hujiang.restvolley.TaskScheduler;
import com.jakewharton.disklrucache.DiskLruCache;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;

                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private Bitmap getBitmapFromDiskLruCache(String key) {
        if (getDiskCache() == null) {
            return null;
        }

        String cachePath = new StringBuilder(getDiskCachePath()).append(File.separator).append(key).append(".0").toString();
        File cacheFile = new File(cachePath);
        try {
            if (cacheFile.exists()) {
                return ImageProcessor.decode(cachePath);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } catch (OutOfMemoryError error) {
            VolleyLog.e("Caught OOM for %d byte image, uri=%s", cacheFile.length(), cachePath);
        }

        return null;
    }

    private String generateKey(String target) {
        return MD5Utils.hashKeyForDisk(target);