xiongxiaohe 8 years ago
parent
commit
1dbef0d90e
19 changed files with 745 additions and 20 deletions
  1. 4 0
      app/build.gradle
  2. 3 0
      app/src/main/AndroidManifest.xml
  3. 28 3
      app/src/main/java/com/kfzs/duanduan/fragment/FgtSmallSheep.java
  4. 3 0
      app/src/main/java/com/kfzs/duanduan/utils/dlg/DeviceUtils.java
  5. 34 0
      app/src/main/java/com/sheep/gamegroup/util/DeviceUtil.java
  6. 3 6
      app/src/main/java/com/sheep/gamegroup/view/activity/DialogActivity.java
  7. 13 0
      app/src/main/java/com/sheep/gamegroup/view/activity/SingTask.java
  8. 2 4
      app/src/main/java/com/sheep/gamegroup/view/adapter/DownLoadTvAdp.java
  9. 48 0
      app/src/main/java/com/sheep/gamegroup/view/xutils/download/DefaultDownloadViewHolder.java
  10. 179 0
      app/src/main/java/com/sheep/gamegroup/view/xutils/download/DownloadCallback.java
  11. 132 0
      app/src/main/java/com/sheep/gamegroup/view/xutils/download/DownloadInfo.java
  12. 179 0
      app/src/main/java/com/sheep/gamegroup/view/xutils/download/DownloadManager.java
  13. 35 0
      app/src/main/java/com/sheep/gamegroup/view/xutils/download/DownloadState.java
  14. 28 0
      app/src/main/java/com/sheep/gamegroup/view/xutils/download/DownloadStateConverter.java
  15. 41 0
      app/src/main/java/com/sheep/gamegroup/view/xutils/download/DownloadViewHolder.java
  16. 3 3
      app/src/main/java/com/sheep/jiuyan/samllsheep/download/DownloadStateConverter.java
  17. 2 1
      app/src/main/java/com/sheep/jiuyan/samllsheep/page/GameDetailActivity.java
  18. 4 1
      app/src/main/java/com/sheep/jiuyan/samllsheep/page/TaskRecordActivity.java
  19. 4 2
      app/src/main/java/com/sheep/jiuyan/samllsheep/page/fragment/FgtMainPageTask.java

+ 4 - 0
app/build.gradle

@@ -220,4 +220,8 @@ dependencies {
     compile 'com.github.ithedan:TextViewDrawable:v1.0'
     compile 'com.lzy.widget:imagepicker:0.6.1'
     compile 'com.github.zhangkexpz:LayoutScroll:v1.0'
+    compile 'com.arialyy.aria:aria-core:3.3.14'
+    annotationProcessor 'com.arialyy.aria:aria-compiler:3.3.14'
+
+
 }

+ 3 - 0
app/src/main/AndroidManifest.xml

@@ -338,6 +338,9 @@
             android:screenOrientation="portrait"
             android:theme="@android:style/Theme.Translucent.NoTitleBar"
             android:configChanges="orientation|keyboardHidden|screenSize"/>
+
+
+
         <activity android:name="com.sheep.gamegroup.view.activity.CommitWxAct"
             android:screenOrientation="portrait" />
         <activity android:name="com.sheep.gamegroup.view.activity.ActGuideOnHook"

+ 28 - 3
app/src/main/java/com/kfzs/duanduan/fragment/FgtSmallSheep.java

@@ -205,6 +205,15 @@ public class FgtSmallSheep extends BaseCompatFragment implements SmallSheepContr
 
     }
 
+    @Override
+    public void onResume() {
+        super.onResume();
+        if (upview1 != null) {
+            //开始滚动
+            upview1.startScroll();
+        }
+
+    }
 
     @Override
     public void onPause() {
@@ -217,6 +226,17 @@ public class FgtSmallSheep extends BaseCompatFragment implements SmallSheepContr
 
     private void setViews(final List<MoreDataEntity> loginEty) {
 
+         invite(loginEty);
+//        new Handler().postDelayed(new Runnable(){
+//            public void run() {
+//
+//            }
+//        },60000*2);
+
+
+
+    }
+    private  void  invite(final List<MoreDataEntity> loginEty){
         for (MoreDataEntity entity:loginEty) {
             LinearLayout moreView = (LinearLayout) LayoutInflater.from(getActivity()).inflate(R.layout.x_item_view, null);
             StringBuilder  sb=new StringBuilder();
@@ -227,10 +247,13 @@ public class FgtSmallSheep extends BaseCompatFragment implements SmallSheepContr
             tv_desc.setText(sb.toString());
             views.add(moreView);
         }
+
         upview1.setEasyViews(views);
-        //开始滚动
-        upview1.setAutoStart(true);
-        upview1.startScroll();
+        if(!upview1.isAutoStart()){
+            upview1.startScroll();
+        }
+
+
 
 
     }
@@ -238,6 +261,8 @@ public class FgtSmallSheep extends BaseCompatFragment implements SmallSheepContr
 
 
 
+
+
     public  String TimeStamp2Date(long  timestampString) {
         String     formats = "yyyy-MM-dd HH:mm:ss";
         Long timestamp = timestampString * 1000;

+ 3 - 0
app/src/main/java/com/kfzs/duanduan/utils/dlg/DeviceUtils.java

@@ -87,6 +87,9 @@ public class DeviceUtils {
         return "";
     }
 
+
+
+
     public String getIMEI() {
         try {
             return phone.getDeviceId();

+ 34 - 0
app/src/main/java/com/sheep/gamegroup/util/DeviceUtil.java

@@ -0,0 +1,34 @@
+package com.sheep.gamegroup.util;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.provider.Settings;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.DisplayMetrics;
+import android.view.WindowManager;
+
+import com.kf.utils.DeviceIDFactory;
+import com.kf.utils.KFLog;
+
+import java.io.File;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * Created by Administrator on 2018/3/27.
+ */
+
+public class DeviceUtil {
+
+    public static String getDeviceId(Context context) {
+        return Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
+    }
+
+
+
+
+
+
+}

+ 3 - 6
app/src/main/java/com/sheep/gamegroup/view/activity/DialogActivity.java

@@ -32,6 +32,7 @@ import com.sheep.gamegroup.model.entity.TaskEty;
 import com.sheep.gamegroup.model.entity.TaskState;
 import com.sheep.gamegroup.presenter.TaskDialogContract;
 import com.sheep.gamegroup.presenter.TaskDialogPresenter;
+import com.sheep.gamegroup.util.DeviceUtil;
 import com.sheep.gamegroup.util.Jump2View;
 import com.sheep.gamegroup.util.MyDbManager;
 import com.sheep.gamegroup.util.MyListview;
@@ -151,10 +152,6 @@ public class DialogActivity extends Activity implements TaskDialogContract.View
         isDownLoad = PackageUtil.isAppInstalled(SheepApp.mContext, task_entity.getPackage_names());
 
         isHaveLoad();
-//        downLoadApk();
-        /**
-         * 下载
-         */
         loadTvAdp = new DownLoadTvAdp(activity, infoList);
         listview_down.setAdapter(loadTvAdp);
 
@@ -240,7 +237,7 @@ public class DialogActivity extends Activity implements TaskDialogContract.View
             switch (type){
                 case 0://开始任务
                     JSONObject object = new JSONObject();
-                    object.put("device_id", new DeviceUtils(activity).getIMEI()+"");
+                    object.put("device_id", DeviceUtil.getDeviceId(DialogActivity.this));
                     object.put("release_task_id", Integer.valueOf(task_entity.getRelease_task_id()+""));
                     preference.acceptedTask(object);
                     break;
@@ -326,6 +323,7 @@ public class DialogActivity extends Activity implements TaskDialogContract.View
 //                    start_task_tv.setText("继续下载");
                 }
                 infoList.clear();
+
                 infoList.add(downloadInfo);
             }
         }
@@ -356,7 +354,6 @@ public class DialogActivity extends Activity implements TaskDialogContract.View
             }
         }
         start_task_tv.setText(buttonStr);
-
         loadTvAdp.setTaskState(type);
         loadTvAdp.addTaskPreference(preference);
         loadTvAdp.addTaskEty(task_entity);

+ 13 - 0
app/src/main/java/com/sheep/gamegroup/view/activity/SingTask.java

@@ -0,0 +1,13 @@
+package com.sheep.gamegroup.view.activity;
+
+import android.app.Activity;
+
+/**
+ * Created by Administrator on 2018/3/27.
+ */
+
+public class SingTask extends Activity {
+
+
+
+}

+ 2 - 4
app/src/main/java/com/sheep/gamegroup/view/adapter/DownLoadTvAdp.java

@@ -5,16 +5,14 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
-import android.widget.ImageView;
 import android.widget.TextView;
 import android.widget.Toast;
 
 import com.alibaba.fastjson.JSONObject;
-import com.bumptech.glide.Glide;
 import com.kfzs.duanduan.utils.dlg.DeviceUtils;
 import com.sheep.gamegroup.model.entity.TaskEty;
 import com.sheep.gamegroup.presenter.TaskDialogPresenter;
-import com.sheep.gamegroup.view.customview.SProgress;
+import com.sheep.gamegroup.util.DeviceUtil;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.SheepApp;
 import com.sheep.jiuyan.samllsheep.download.DownloadInfo;
@@ -250,7 +248,7 @@ public class DownLoadTvAdp extends BaseAdapter {
     }
     private void startTask(){
         JSONObject object = new JSONObject();
-        object.put("device_id", new DeviceUtils(mContext).getIMEI()+"");
+        object.put("device_id", DeviceUtil.getDeviceId(mContext));
         object.put("release_task_id", Integer.valueOf(task_entity.getRelease_task_id()+""));
         preference.acceptedTask(object);
     }

+ 48 - 0
app/src/main/java/com/sheep/gamegroup/view/xutils/download/DefaultDownloadViewHolder.java

@@ -0,0 +1,48 @@
+package com.sheep.gamegroup.view.xutils.download;
+
+import android.view.View;
+import android.widget.Toast;
+
+import org.xutils.common.Callback;
+import org.xutils.x;
+
+import java.io.File;
+
+/**
+ * Created by wyouflf on 15/11/11.
+ */
+public class DefaultDownloadViewHolder extends DownloadViewHolder {
+
+    public DefaultDownloadViewHolder(View view, DownloadInfo downloadInfo) {
+        super(view, downloadInfo);
+    }
+
+    @Override
+    public void onWaiting() {
+
+    }
+
+    @Override
+    public void onStarted() {
+
+    }
+
+    @Override
+    public void onLoading(long total, long current) {
+
+    }
+
+    @Override
+    public void onSuccess(File result) {
+        Toast.makeText(x.app(), "下载完成", Toast.LENGTH_LONG).show();
+    }
+
+    @Override
+    public void onError(Throwable ex, boolean isOnCallback) {
+        Toast.makeText(x.app(), "下载失败", Toast.LENGTH_LONG).show();
+    }
+
+    @Override
+    public void onCancelled(Callback.CancelledException cex) {
+    }
+}

+ 179 - 0
app/src/main/java/com/sheep/gamegroup/view/xutils/download/DownloadCallback.java

@@ -0,0 +1,179 @@
+package com.sheep.gamegroup.view.xutils.download;
+
+import org.xutils.common.Callback;
+import org.xutils.common.util.LogUtil;
+import org.xutils.ex.DbException;
+
+import java.io.File;
+import java.lang.ref.WeakReference;
+
+/**
+ * Created by wyouflf on 15/11/10.
+ */
+/*package*/ class DownloadCallback implements
+        Callback.CommonCallback<File>,
+        Callback.ProgressCallback<File>,
+        Callback.Cancelable {
+
+    private DownloadInfo downloadInfo;
+    private WeakReference<DownloadViewHolder> viewHolderRef;
+    private DownloadManager downloadManager;
+    private boolean cancelled = false;
+    private Cancelable cancelable;
+
+    public DownloadCallback(DownloadViewHolder viewHolder) {
+        this.switchViewHolder(viewHolder);
+    }
+
+    public boolean switchViewHolder(DownloadViewHolder viewHolder) {
+        if (viewHolder == null) return false;
+
+        synchronized (DownloadCallback.class) {
+            if (downloadInfo != null) {
+                if (this.isStopped()) {
+                    return false;
+                }
+            }
+            this.downloadInfo = viewHolder.getDownloadInfo();
+            this.viewHolderRef = new WeakReference<DownloadViewHolder>(viewHolder);
+        }
+        return true;
+    }
+
+    public void setDownloadManager(DownloadManager downloadManager) {
+        this.downloadManager = downloadManager;
+    }
+
+    public void setCancelable(Cancelable cancelable) {
+        this.cancelable = cancelable;
+    }
+
+    private DownloadViewHolder getViewHolder() {
+        if (viewHolderRef == null) return null;
+        DownloadViewHolder viewHolder = viewHolderRef.get();
+        if (viewHolder != null) {
+            DownloadInfo downloadInfo = viewHolder.getDownloadInfo();
+            if (this.downloadInfo != null && this.downloadInfo.equals(downloadInfo)) {
+                return viewHolder;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public void onWaiting() {
+        try {
+            downloadInfo.setState(DownloadState.WAITING);
+            downloadManager.updateDownloadInfo(downloadInfo);
+        } catch (DbException ex) {
+            LogUtil.e(ex.getMessage(), ex);
+        }
+        DownloadViewHolder viewHolder = this.getViewHolder();
+        if (viewHolder != null) {
+            viewHolder.onWaiting();
+        }
+    }
+
+    @Override
+    public void onStarted() {
+        try {
+            downloadInfo.setState(DownloadState.STARTED);
+            downloadManager.updateDownloadInfo(downloadInfo);
+        } catch (DbException ex) {
+            LogUtil.e(ex.getMessage(), ex);
+        }
+        DownloadViewHolder viewHolder = this.getViewHolder();
+        if (viewHolder != null) {
+            viewHolder.onStarted();
+        }
+    }
+
+    @Override
+    public void onLoading(long total, long current, boolean isDownloading) {
+        if (isDownloading) {
+            try {
+                downloadInfo.setState(DownloadState.STARTED);
+                downloadInfo.setFileLength(total);
+                downloadInfo.setProgress((int) (current * 100 / total));
+                downloadManager.updateDownloadInfo(downloadInfo);
+            } catch (DbException ex) {
+                LogUtil.e(ex.getMessage(), ex);
+            }
+            DownloadViewHolder viewHolder = this.getViewHolder();
+            if (viewHolder != null) {
+                viewHolder.onLoading(total, current);
+            }
+        }
+    }
+
+    @Override
+    public void onSuccess(File result) {
+        synchronized (DownloadCallback.class) {
+            try {
+                downloadInfo.setState(DownloadState.FINISHED);
+                downloadManager.updateDownloadInfo(downloadInfo);
+            } catch (DbException ex) {
+                LogUtil.e(ex.getMessage(), ex);
+            }
+            DownloadViewHolder viewHolder = this.getViewHolder();
+            if (viewHolder != null) {
+                viewHolder.onSuccess(result);
+            }
+        }
+    }
+
+    @Override
+    public void onError(Throwable ex, boolean isOnCallback) {
+        synchronized (DownloadCallback.class) {
+            try {
+                downloadInfo.setState(DownloadState.ERROR);
+                downloadManager.updateDownloadInfo(downloadInfo);
+            } catch (DbException e) {
+                LogUtil.e(e.getMessage(), e);
+            }
+            DownloadViewHolder viewHolder = this.getViewHolder();
+            if (viewHolder != null) {
+                viewHolder.onError(ex, isOnCallback);
+            }
+        }
+    }
+
+    @Override
+    public void onCancelled(CancelledException cex) {
+        synchronized (DownloadCallback.class) {
+            try {
+                downloadInfo.setState(DownloadState.STOPPED);
+                downloadManager.updateDownloadInfo(downloadInfo);
+            } catch (DbException ex) {
+                LogUtil.e(ex.getMessage(), ex);
+            }
+            DownloadViewHolder viewHolder = this.getViewHolder();
+            if (viewHolder != null) {
+                viewHolder.onCancelled(cex);
+            }
+        }
+    }
+
+    @Override
+    public void onFinished() {
+        cancelled = false;
+    }
+
+    private boolean isStopped() {
+        DownloadState state = downloadInfo.getState();
+        return isCancelled() || state.value() > DownloadState.STARTED.value();
+    }
+
+    @Override
+    public void cancel() {
+        cancelled = true;
+        if (cancelable != null) {
+            cancelable.cancel();
+        }
+    }
+
+    @Override
+    public boolean isCancelled() {
+        return cancelled;
+    }
+}

+ 132 - 0
app/src/main/java/com/sheep/gamegroup/view/xutils/download/DownloadInfo.java

@@ -0,0 +1,132 @@
+package com.sheep.gamegroup.view.xutils.download;
+
+import org.xutils.db.annotation.Column;
+import org.xutils.db.annotation.Table;
+
+/**
+ * Author: wyouflf
+ * Date: 13-11-10
+ * Time: 下午8:11
+ */
+@Table(name = "download", onCreated = "CREATE UNIQUE INDEX index_name ON download(label,fileSavePath)")
+public class DownloadInfo {
+
+    public DownloadInfo() {
+    }
+
+    @Column(name = "id", isId = true)
+    private long id;
+
+    @Column(name = "state")
+    private DownloadState state = DownloadState.STOPPED;
+
+    @Column(name = "url")
+    private String url;
+
+    @Column(name = "label")
+    private String label;
+
+    @Column(name = "fileSavePath")
+    private String fileSavePath;
+
+    @Column(name = "progress")
+    private int progress;
+
+    @Column(name = "fileLength")
+    private long fileLength;
+
+    @Column(name = "autoResume")
+    private boolean autoResume;
+
+    @Column(name = "autoRename")
+    private boolean autoRename;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public DownloadState getState() {
+        return state;
+    }
+
+    public void setState(DownloadState state) {
+        this.state = state;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    public void setLabel(String label) {
+        this.label = label;
+    }
+
+    public String getFileSavePath() {
+        return fileSavePath;
+    }
+
+    public void setFileSavePath(String fileSavePath) {
+        this.fileSavePath = fileSavePath;
+    }
+
+    public int getProgress() {
+        return progress;
+    }
+
+    public void setProgress(int progress) {
+        this.progress = progress;
+    }
+
+    public long getFileLength() {
+        return fileLength;
+    }
+
+    public void setFileLength(long fileLength) {
+        this.fileLength = fileLength;
+    }
+
+    public boolean isAutoResume() {
+        return autoResume;
+    }
+
+    public void setAutoResume(boolean autoResume) {
+        this.autoResume = autoResume;
+    }
+
+    public boolean isAutoRename() {
+        return autoRename;
+    }
+
+    public void setAutoRename(boolean autoRename) {
+        this.autoRename = autoRename;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof DownloadInfo)) return false;
+
+        DownloadInfo that = (DownloadInfo) o;
+
+        if (id != that.id) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        return (int) (id ^ (id >>> 32));
+    }
+}

+ 179 - 0
app/src/main/java/com/sheep/gamegroup/view/xutils/download/DownloadManager.java

@@ -0,0 +1,179 @@
+package com.sheep.gamegroup.view.xutils.download;
+
+import org.xutils.DbManager;
+import org.xutils.common.Callback;
+import org.xutils.common.task.PriorityExecutor;
+import org.xutils.common.util.LogUtil;
+import org.xutils.db.converter.ColumnConverterFactory;
+import org.xutils.ex.DbException;
+import org.xutils.http.RequestParams;
+import org.xutils.x;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executor;
+
+/**
+ * Author: wyouflf
+ * Date: 13-11-10
+ * Time: 下午8:10
+ */
+public final class DownloadManager {
+
+    static {
+        // 注册DownloadState在数据库中的值类型映射
+        ColumnConverterFactory.registerColumnConverter(DownloadState.class, new DownloadStateConverter());
+    }
+
+    private static volatile DownloadManager instance;
+
+    private final static int MAX_DOWNLOAD_THREAD = 2; // 有效的值范围[1, 3], 设置为3时, 可能阻塞图片加载.
+
+    private final DbManager db;
+    private final Executor executor = new PriorityExecutor(MAX_DOWNLOAD_THREAD, true);
+    private final List<DownloadInfo> downloadInfoList = new ArrayList<DownloadInfo>();
+    private final ConcurrentHashMap<DownloadInfo, DownloadCallback>
+            callbackMap = new ConcurrentHashMap<DownloadInfo, DownloadCallback>(5);
+
+    private DownloadManager() {
+        DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()
+                .setDbName("download")
+                .setDbVersion(1);
+        db = x.getDb(daoConfig);
+        try {
+            List<DownloadInfo> infoList = db.selector(DownloadInfo.class).findAll();
+            if (infoList != null) {
+                for (DownloadInfo info : infoList) {
+                    if (info.getState().value() < DownloadState.FINISHED.value()) {
+                        info.setState(DownloadState.STOPPED);
+                    }
+                    downloadInfoList.add(info);
+                }
+            }
+        } catch (DbException ex) {
+            LogUtil.e(ex.getMessage(), ex);
+        }
+    }
+
+    /*package*/
+    public static DownloadManager getInstance() {
+        if (instance == null) {
+            synchronized (DownloadManager.class) {
+                if (instance == null) {
+                    instance = new DownloadManager();
+                }
+            }
+        }
+        return instance;
+    }
+
+    public void updateDownloadInfo(DownloadInfo info) throws DbException {
+        db.update(info);
+    }
+
+    public int getDownloadListCount() {
+        return downloadInfoList.size();
+    }
+
+    public DownloadInfo getDownloadInfo(int index) {
+        return downloadInfoList.get(index);
+    }
+
+    public synchronized void startDownload(String url, String label, String savePath,
+                                           boolean autoResume, boolean autoRename,
+                                           DownloadViewHolder viewHolder) throws DbException {
+
+        String fileSavePath = new File(savePath).getAbsolutePath();
+        DownloadInfo downloadInfo = db.selector(DownloadInfo.class)
+                .where("label", "=", label)
+                .and("fileSavePath", "=", fileSavePath)
+                .findFirst();
+        if (downloadInfo != null) {
+            DownloadCallback callback = callbackMap.get(downloadInfo);
+            if (callback != null) {
+                if (viewHolder == null) {
+                    viewHolder = new DefaultDownloadViewHolder(null, downloadInfo);
+                }
+                if (callback.switchViewHolder(viewHolder)) {
+                    return;
+                } else {
+                    callback.cancel();
+                }
+            }
+        }
+
+        // create download info
+        if (downloadInfo == null) {
+            downloadInfo = new DownloadInfo();
+            downloadInfo.setUrl(url);
+            downloadInfo.setAutoRename(autoRename);
+            downloadInfo.setAutoResume(autoResume);
+            downloadInfo.setLabel(label);
+            downloadInfo.setFileSavePath(fileSavePath);
+            db.saveBindingId(downloadInfo);
+        }
+
+        // start downloading
+        if (viewHolder == null) {
+            viewHolder = new DefaultDownloadViewHolder(null, downloadInfo);
+        } else {
+            viewHolder.update(downloadInfo);
+        }
+        DownloadCallback callback = new DownloadCallback(viewHolder);
+        callback.setDownloadManager(this);
+        callback.switchViewHolder(viewHolder);
+        RequestParams params = new RequestParams(url);
+        params.setAutoResume(downloadInfo.isAutoResume());
+        params.setAutoRename(downloadInfo.isAutoRename());
+        params.setSaveFilePath(downloadInfo.getFileSavePath());
+        params.setExecutor(executor);
+        params.setCancelFast(true);
+        Callback.Cancelable cancelable = x.http().get(params, callback);
+        callback.setCancelable(cancelable);
+        callbackMap.put(downloadInfo, callback);
+
+        if (downloadInfoList.contains(downloadInfo)) {
+            int index = downloadInfoList.indexOf(downloadInfo);
+            downloadInfoList.remove(downloadInfo);
+            downloadInfoList.add(index, downloadInfo);
+        } else {
+            downloadInfoList.add(downloadInfo);
+        }
+    }
+
+    public void stopDownload(int index) {
+        DownloadInfo downloadInfo = downloadInfoList.get(index);
+        stopDownload(downloadInfo);
+    }
+
+    public void stopDownload(DownloadInfo downloadInfo) {
+        Callback.Cancelable cancelable = callbackMap.get(downloadInfo);
+        if (cancelable != null) {
+            cancelable.cancel();
+        }
+    }
+
+    public void stopAllDownload() {
+        for (DownloadInfo downloadInfo : downloadInfoList) {
+            Callback.Cancelable cancelable = callbackMap.get(downloadInfo);
+            if (cancelable != null) {
+                cancelable.cancel();
+            }
+        }
+    }
+
+    public void removeDownload(int index) throws DbException {
+        DownloadInfo downloadInfo = downloadInfoList.get(index);
+        db.delete(downloadInfo);
+        stopDownload(downloadInfo);
+        downloadInfoList.remove(index);
+    }
+
+    public void removeDownload(DownloadInfo downloadInfo) throws DbException {
+        db.delete(downloadInfo);
+        stopDownload(downloadInfo);
+        downloadInfoList.remove(downloadInfo);
+    }
+}

+ 35 - 0
app/src/main/java/com/sheep/gamegroup/view/xutils/download/DownloadState.java

@@ -0,0 +1,35 @@
+package com.sheep.gamegroup.view.xutils.download;
+
+/**
+ * Created by wyouflf on 15/11/10.
+ */
+public enum DownloadState {
+    WAITING(0), STARTED(1), FINISHED(2), STOPPED(3), ERROR(4);
+
+    private final int value;
+
+    DownloadState(int value) {
+        this.value = value;
+    }
+
+    public int value() {
+        return value;
+    }
+
+    public static DownloadState valueOf(int value) {
+        switch (value) {
+            case 0:
+                return WAITING;
+            case 1:
+                return STARTED;
+            case 2:
+                return FINISHED;
+            case 3:
+                return STOPPED;
+            case 4:
+                return ERROR;
+            default:
+                return STOPPED;
+        }
+    }
+}

+ 28 - 0
app/src/main/java/com/sheep/gamegroup/view/xutils/download/DownloadStateConverter.java

@@ -0,0 +1,28 @@
+package com.sheep.gamegroup.view.xutils.download;
+
+import android.database.Cursor;
+
+import org.xutils.db.converter.ColumnConverter;
+import org.xutils.db.sqlite.ColumnDbType;
+
+/**
+ * Created by wyouflf on 15/11/10.
+ */
+public class DownloadStateConverter implements ColumnConverter<DownloadState> {
+
+    @Override
+    public DownloadState getFieldValue(Cursor cursor, int index) {
+        int dbValue = cursor.getInt(index);
+        return DownloadState.valueOf(dbValue);
+    }
+
+    @Override
+    public Object fieldValue2DbValue(DownloadState fieldValue) {
+        return fieldValue.value();
+    }
+
+    @Override
+    public ColumnDbType getColumnDbType() {
+        return ColumnDbType.INTEGER;
+    }
+}

+ 41 - 0
app/src/main/java/com/sheep/gamegroup/view/xutils/download/DownloadViewHolder.java

@@ -0,0 +1,41 @@
+package com.sheep.gamegroup.view.xutils.download;
+
+import android.view.View;
+
+import org.xutils.common.Callback;
+import org.xutils.x;
+
+import java.io.File;
+
+/**
+ * Created by wyouflf on 15/11/10.
+ */
+public abstract class DownloadViewHolder {
+
+    protected DownloadInfo downloadInfo;
+
+    public DownloadViewHolder(View view, DownloadInfo downloadInfo) {
+        this.downloadInfo = downloadInfo;
+        x.view().inject(this, view);
+    }
+
+    public final DownloadInfo getDownloadInfo() {
+        return downloadInfo;
+    }
+
+    public void update(DownloadInfo downloadInfo) {
+        this.downloadInfo = downloadInfo;
+    }
+
+    public abstract void onWaiting();
+
+    public abstract void onStarted();
+
+    public abstract void onLoading(long total, long current);
+
+    public abstract void onSuccess(File result);
+
+    public abstract void onError(Throwable ex, boolean isOnCallback);
+
+    public abstract void onCancelled(Callback.CancelledException cex);
+}

+ 3 - 3
app/src/main/java/com/sheep/jiuyan/samllsheep/download/DownloadStateConverter.java

@@ -1,9 +1,9 @@
 package com.sheep.jiuyan.samllsheep.download;
 
-import android.database.Cursor;
+        import android.database.Cursor;
 
-import org.xutils.db.converter.ColumnConverter;
-import org.xutils.db.sqlite.ColumnDbType;
+        import org.xutils.db.converter.ColumnConverter;
+        import org.xutils.db.sqlite.ColumnDbType;
 
 /**
  * Created by wyouflf on 15/11/10.

+ 2 - 1
app/src/main/java/com/sheep/jiuyan/samllsheep/page/GameDetailActivity.java

@@ -25,6 +25,7 @@ import android.widget.Toast;
 
 import com.app.hubert.library.NewbieGuide;
 import com.bumptech.glide.Glide;
+import com.sheep.gamegroup.util.DeviceUtil;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.SheepApp;
 import com.sheep.jiuyan.samllsheep.base.BaseActivity;
@@ -196,7 +197,7 @@ public class GameDetailActivity extends BaseActivity {
         HashMap<String, String> map = new HashMap<>();
         map.put("wx_open_id", SpUtils.getOpenId(this));
         map.put("task_id", task.getId() + "");
-        map.put("imei", new DeviceUtils(getApplicationContext()).getIMEI());
+        map.put("imei",  DeviceUtil.getDeviceId(getApplicationContext()));
         showProgress();
         NetManager.get(Url.USER_REGISTER_TASK, map, getApplicationContext(), new SheepCallback<String>(this) {
             @Override

+ 4 - 1
app/src/main/java/com/sheep/jiuyan/samllsheep/page/TaskRecordActivity.java

@@ -19,6 +19,7 @@ import android.widget.TextView;
 import android.widget.Toast;
 
 import com.bumptech.glide.Glide;
+import com.sheep.gamegroup.util.DeviceUtil;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.base.BaseActivity;
 import com.sheep.jiuyan.samllsheep.net.NetManager;
@@ -39,6 +40,8 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 
+import static com.sheep.jiuyan.samllsheep.SheepApp.mContext;
+
 /**
  * Created by kemllor on 2017/12/26.
  */
@@ -194,7 +197,7 @@ public class TaskRecordActivity extends BaseActivity {
         HashMap<String, String> map = new HashMap<>();
         map.put("wx_open_id", SpUtils.getOpenId(this));
         map.put("task_id", commit.getTaskPublishId() + "");
-        map.put("imei", new DeviceUtils(getApplicationContext()).getIMEI());
+        map.put("imei",  DeviceUtil.getDeviceId(mContext));
         showProgress();
         NetManager.get(Url.USER_REGISTER_TASK, map, getApplicationContext(), new SheepCallback<String>(this) {
             @Override

+ 4 - 2
app/src/main/java/com/sheep/jiuyan/samllsheep/page/fragment/FgtMainPageTask.java

@@ -12,6 +12,7 @@ import android.widget.ImageView;
 import android.widget.TextView;
 
 import com.bumptech.glide.Glide;
+import com.sheep.gamegroup.util.DeviceUtil;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.SheepApp;
 import com.sheep.jiuyan.samllsheep.base.BaseActivity;
@@ -190,7 +191,7 @@ public class FgtMainPageTask extends BaseFragment {
         HashMap<String, String> map = new HashMap<>();
         map.put("wx_open_id", SpUtils.getOpenId(SheepApp.mContext));
         map.put("task_id", mClickItem.getId() + "");
-        map.put("imei", new DeviceUtils(getContext()).getIMEI());
+        map.put("imei", DeviceUtil.getDeviceId(getContext()));
 
 
         NetManager.get(Url.USER_REGISTER_TASK, map, SheepApp.mContext, new SheepCallback<String>(getActivity()) {
@@ -263,7 +264,8 @@ public class FgtMainPageTask extends BaseFragment {
         //        requestNewPeopleTask();
         HashMap<String, String> map = new HashMap<>();
         map.put("wx_open_id", SpUtils.getOpenId(SheepApp.mContext));
-        map.put("imei", new DeviceUtils(SheepApp.mContext).getIMEI());
+
+        map.put("imei",  DeviceUtil.getDeviceId(SheepApp.mContext));
         if(mAdapter!=null &&mAdapter.getItemCount()>0){
             mAdapter.clear();
         }