// 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;
            // 可以下载
            case -1:
            case Downloads.Status.STATUS_PENDING:
            case Downloads.Status.STATUS_RUNNING:
                DLogger.d(Utils.getDownloaderTAG(this), "准备下载, status(%d)", downloadInfo.status);

                return true;
            // 等待重试
            case Downloads.Status.STATUS_WAITING_TO_RETRY:
                // download was waiting for a delayed restart
                final long now = Utils.realtime();
                boolean retry = downloadInfo.restartTime(now) <= now;
                if (!retry) {
                    DLogger.e(Utils.getDownloaderTAG(this), "retry = false, lastMod + retryAfter = %d, now = %d", downloadInfo.lastMod + downloadInfo.retryAfter, now);
                }
                retry = true;

                DLogger.w(Utils.getDownloaderTAG(this), "第 %d 次尝试下载重连, id = %d", downloadInfo.numFailed, id);

                return retry;
            // 等待网络重连
            case Downloads.Status.STATUS_WAITING_FOR_NETWORK:
            case Downloads.Status.STATUS_QUEUED_FOR_WIFI:
                return Utils.isWifiActive();
            default:
                return false;
        }
    }

    boolean isRunning() {
// 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;

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

                return true;
            // 等待重试
            case Downloads.Status.STATUS_WAITING_TO_RETRY:
                // download was waiting for a delayed restart
                final long now = Utils.realtime();
                boolean retry = downloadInfo.restartTime(now) <= now;
                if (!retry) {
                    DLogger.e(Utils.getDownloaderTAG(this), "retry = false, lastMod + retryAfter = %d, now = %d", downloadInfo.lastMod + downloadInfo.retryAfter, now);
                }
                retry = true;

                DLogger.w(Utils.getDownloaderTAG(this), "第 %d 次尝试下载重连, id = %d", downloadInfo.numFailed, id);

                return retry;
            // 等待网络重连
            case Downloads.Status.STATUS_WAITING_FOR_NETWORK:
            case Downloads.Status.STATUS_QUEUED_FOR_WIFI:
                return Utils.isWifiActive();
            default:
                return false;
        }
    }

    boolean isRunning() {
        return thread != null;