// Path: aisen_downloader/src/main/java/org/aiwen/downloader/utils/Constants.java
// public class Constants {
// 
//     public static final String TAG = "Hawk";
// 
//     public static final String TEMP_SUFFIX = ".atp";
// 
//     /** The intent that gets sent when the service must wake up for a retry */
//     public static final String ACTION_RETRY = "android.intent.action.DOWNLOAD_WAKEUP";
// 
//     /** the intent that gets sent when clicking an incomplete/failed download  */
//     public static final String ACTION_LIST = "android.intent.action.DOWNLOAD_LIST";
// 
//     /** the intent that gets sent when clicking a successful download */
//     public static final String ACTION_OPEN = "android.intent.action.DOWNLOAD_OPEN";
// 
//     /** the intent that gets sent when deleting the notification of a completed download */
//     public static final String ACTION_HIDE = "android.intent.action.DOWNLOAD_HIDE";
// 
//     /** The minimum amount of progress that has to be done before the progress bar gets updated */
//     public static final int MIN_PROGRESS_STEP = 65536;
// 
//     /** The minimum amount of time that has to elapse before the progress bar gets updated, in ms */
//     public static final long MIN_PROGRESS_TIME = 1000;// 2000
// 
//     /**
//      * The number of times that the download manager will retry its network
//      * operations when no progress is happening before it gives up.
//      */
//     public static final int MAX_RETRIES = 5;
// 
// }
// 
// Path: aisen_downloader/src/main/java/org/aiwen/downloader/utils/Utils.java
// public class Utils {
// 
//     public static void close(Closeable closeable) {
//         try {
//             if (closeable != null)
//                 closeable.close();
//         } catch (Exception e) {
//             e.printStackTrace();
//         }
//     }
// 
//     public static String getDownloaderTAG(Request request) {
//         return Constants.TAG + "_Thread_" + request.key;
//     }
// 
//     public static long now() {
//         return System.currentTimeMillis();
//     }
// 
//     public static long realtime() {
//         return SystemClock.elapsedRealtime();
//     }
// 
//     public static boolean isNetworkActive() {
//         Hawk hawk = Hawk.getInstance();
//         if (hawk != null) {
//             ConnectivityManager connectivityManager = (ConnectivityManager) hawk.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
//             NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
// 
//             return networkInfo != null && networkInfo.isConnected();
//         }
// 
//         return false;
//     }
// 
//     public static boolean isWifiActive() {
//         Hawk hawk = Hawk.getInstance();
//         if (hawk != null) {
//             ConnectivityManager connectivityManager = (ConnectivityManager) hawk.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
//             NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
// 
//             return networkInfo != null &&
//                         networkInfo.getType() == ConnectivityManager.TYPE_WIFI &&
//                         networkInfo.isConnected();
//         }
// 
//         return false;
//     }
// 
// }


import android.app.DownloadManager;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import org.aiwen.downloader.utils.Constants;
import org.aiwen.downloader.utils.Utils;

        public Builder setDestination(String destination) {
            request.downloadInfo.destination = destination;

            return this;
        }

        public Request get() {
            return request;
        }

    }

    Request(Uri uri, Uri fileUri) {
        this.uri = uri;
        this.fileUri = fileUri;
        key = KeyGenerator.generateMD5(this.uri.toString());
        downloadInfo = new DownloadInfo(this);
    }

    boolean isReadyToDownload() {
        if (isRunning()) {
            return false;
        }

        switch (downloadInfo.status) {
            // 可以下载
            case -1:
            case Downloads.Status.STATUS_PENDING:
            case Downloads.Status.STATUS_RUNNING:
// Path: aisen_downloader/src/main/java/org/aiwen/downloader/utils/Constants.java
// public class Constants {
// 
//     public static final String TAG = "Hawk";
// 
//     public static final String TEMP_SUFFIX = ".atp";
// 
//     /** The intent that gets sent when the service must wake up for a retry */
//     public static final String ACTION_RETRY = "android.intent.action.DOWNLOAD_WAKEUP";
// 
//     /** the intent that gets sent when clicking an incomplete/failed download  */
//     public static final String ACTION_LIST = "android.intent.action.DOWNLOAD_LIST";
// 
//     /** the intent that gets sent when clicking a successful download */
//     public static final String ACTION_OPEN = "android.intent.action.DOWNLOAD_OPEN";
// 
//     /** the intent that gets sent when deleting the notification of a completed download */
//     public static final String ACTION_HIDE = "android.intent.action.DOWNLOAD_HIDE";
// 
//     /** The minimum amount of progress that has to be done before the progress bar gets updated */
//     public static final int MIN_PROGRESS_STEP = 65536;
// 
//     /** The minimum amount of time that has to elapse before the progress bar gets updated, in ms */
//     public static final long MIN_PROGRESS_TIME = 1000;// 2000
// 
//     /**
//      * The number of times that the download manager will retry its network
//      * operations when no progress is happening before it gives up.
//      */
//     public static final int MAX_RETRIES = 5;
// 
// }
// 
// Path: aisen_downloader/src/main/java/org/aiwen/downloader/utils/Utils.java
// public class Utils {
// 
//     public static void close(Closeable closeable) {
//         try {
//             if (closeable != null)
//                 closeable.close();
//         } catch (Exception e) {
//             e.printStackTrace();
//         }
//     }
// 
//     public static String getDownloaderTAG(Request request) {
//         return Constants.TAG + "_Thread_" + request.key;
//     }
// 
//     public static long now() {
//         return System.currentTimeMillis();
//     }
// 
//     public static long realtime() {
//         return SystemClock.elapsedRealtime();
//     }
// 
//     public static boolean isNetworkActive() {
//         Hawk hawk = Hawk.getInstance();
//         if (hawk != null) {
//             ConnectivityManager connectivityManager = (ConnectivityManager) hawk.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
//             NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
// 
//             return networkInfo != null && networkInfo.isConnected();
//         }
// 
//         return false;
//     }
// 
//     public static boolean isWifiActive() {
//         Hawk hawk = Hawk.getInstance();
//         if (hawk != null) {
//             ConnectivityManager connectivityManager = (ConnectivityManager) hawk.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
//             NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
// 
//             return networkInfo != null &&
//                         networkInfo.getType() == ConnectivityManager.TYPE_WIFI &&
//                         networkInfo.isConnected();
//         }
// 
//         return false;
//     }
// 
// }


// Path: aisen_downloader/src/main/java/org/aiwen/downloader/Request.java
import android.app.DownloadManager;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import org.aiwen.downloader.utils.Constants;
import org.aiwen.downloader.utils.Utils;


        public Builder setDestination(String destination) {
            request.downloadInfo.destination = destination;

            return this;
        }

        public Request get() {
            return request;
        }

    }

    Request(Uri uri, Uri fileUri) {
        this.uri = uri;
        this.fileUri = fileUri;
        key = KeyGenerator.generateMD5(this.uri.toString());
        downloadInfo = new DownloadInfo(this);
    }

    boolean isReadyToDownload() {
        if (isRunning()) {
            return false;
        }

        switch (downloadInfo.status) {
            // 可以下载
            case -1:
            case Downloads.Status.STATUS_PENDING:
            case Downloads.Status.STATUS_RUNNING:
                DLogger.d(Utils.getDownloaderTAG(this), "准备下载, status(%d)", downloadInfo.status);