Ver código fonte

datashare delete

liujiangyao 7 anos atrás
pai
commit
8be37d54b4
78 arquivos alterados com 6265 adições e 152 exclusões
  1. 0 1
      .idea/gradle.xml
  2. 1 1
      app/build.gradle
  3. 0 6
      app/src/main/AndroidManifest.xml
  4. 3 2
      app/src/main/java/com/kfzs/duanduan/ActDownloadMgr.java
  5. 6 5
      app/src/main/java/com/kfzs/duanduan/ActSearch.java
  6. 4 9
      app/src/main/java/com/kfzs/duanduan/ActWeb.java
  7. 1 1
      app/src/main/java/com/kfzs/duanduan/adp/DownloadMgrAdapter.java
  8. 0 3
      app/src/main/java/com/kfzs/duanduan/db/DataSave.java
  9. 1 1
      app/src/main/java/com/kfzs/duanduan/event/EventDownloadHandler.java
  10. 2 2
      app/src/main/java/com/kfzs/duanduan/oem/AppAddOrdelReceiver.java
  11. 2 2
      app/src/main/java/com/kfzs/duanduan/services/DownloadTaskService.java
  12. 6 8
      app/src/main/java/com/kfzs/duanduan/utils/GameStatusScanner.java
  13. 0 9
      app/src/main/java/com/kfzs/duanduan/utils/dlg/CheckUtils.java
  14. 1 1
      app/src/main/java/com/kfzs/duanduan/utils/dlg/DownBtnUtils.java
  15. 2 2
      app/src/main/java/com/kfzs/duanduan/utils/net/APIRequest.java
  16. 2 2
      app/src/main/java/com/kfzs/duanduan/utils/net/APIRequestOptionV2.java
  17. 2 2
      app/src/main/java/com/kfzs/duanduan/utils/net/APIRequestV2.java
  18. 2 5
      app/src/main/java/com/kfzs/duanduan/utils/sys/ChannelContent.java
  19. 66 0
      app/src/main/java/com/sheep/gamegroup/download/BuildConfigSaver.java
  20. 110 0
      app/src/main/java/com/sheep/gamegroup/download/BuildConfigUtils.java
  21. 275 0
      app/src/main/java/com/sheep/gamegroup/download/DDProviderHelper.java
  22. 143 0
      app/src/main/java/com/sheep/gamegroup/download/KFZSDDContentSession.java
  23. 171 0
      app/src/main/java/com/sheep/gamegroup/download/KFZSDDProvider.java
  24. 154 0
      app/src/main/java/com/sheep/gamegroup/download/KFZSDDSQLiteOpenHelper.java
  25. 112 0
      app/src/main/java/com/sheep/gamegroup/download/KFZSDDSQLiteOpenHelperCallbacks.java
  26. 195 0
      app/src/main/java/com/sheep/gamegroup/download/KFZSProvider.java
  27. 83 0
      app/src/main/java/com/sheep/gamegroup/download/appdownload/AppdownloadBean.java
  28. 184 0
      app/src/main/java/com/sheep/gamegroup/download/appdownload/AppdownloadBeanDao.java
  29. 43 0
      app/src/main/java/com/sheep/gamegroup/download/base/AbstractContentValues.java
  30. 78 0
      app/src/main/java/com/sheep/gamegroup/download/base/AbstractCursor.java
  31. 412 0
      app/src/main/java/com/sheep/gamegroup/download/base/AbstractSelection.java
  32. 199 0
      app/src/main/java/com/sheep/gamegroup/download/base/BaseContentProvider.java
  33. 5 0
      app/src/main/java/com/sheep/gamegroup/download/base/BaseModel.java
  34. 49 0
      app/src/main/java/com/sheep/gamegroup/download/base/BaseSQLiteOpenHelperCallbacks.java
  35. 2 2
      datashare/src/main/java/com/kfzs/duanduan/data/graph/provider/channel/Channel.java
  36. 4 3
      datashare/src/main/java/com/kfzs/duanduan/data/graph/provider/channel/ChannelDao.java
  37. 105 0
      app/src/main/java/com/sheep/gamegroup/download/channel/DaoMaster.java
  38. 73 0
      app/src/main/java/com/sheep/gamegroup/download/channel/DaoSession.java
  39. 281 0
      app/src/main/java/com/sheep/gamegroup/download/download/DownLoadInfo.java
  40. 310 0
      app/src/main/java/com/sheep/gamegroup/download/download/DownLoadInfoDao.java
  41. 500 0
      app/src/main/java/com/sheep/gamegroup/download/downloadtask/DownloadtaskBean.java
  42. 126 0
      app/src/main/java/com/sheep/gamegroup/download/downloadtask/DownloadtaskColumns.java
  43. 172 0
      app/src/main/java/com/sheep/gamegroup/download/downloadtask/DownloadtaskContentValues.java
  44. 186 0
      app/src/main/java/com/sheep/gamegroup/download/downloadtask/DownloadtaskCursor.java
  45. 103 0
      app/src/main/java/com/sheep/gamegroup/download/downloadtask/DownloadtaskModel.java
  46. 578 0
      app/src/main/java/com/sheep/gamegroup/download/downloadtask/DownloadtaskSelection.java
  47. 144 0
      app/src/main/java/com/sheep/gamegroup/download/records/RecordsBean.java
  48. 52 0
      app/src/main/java/com/sheep/gamegroup/download/records/RecordsColumns.java
  49. 61 0
      app/src/main/java/com/sheep/gamegroup/download/records/RecordsContentValues.java
  50. 53 0
      app/src/main/java/com/sheep/gamegroup/download/records/RecordsCursor.java
  51. 32 0
      app/src/main/java/com/sheep/gamegroup/download/records/RecordsModel.java
  52. 177 0
      app/src/main/java/com/sheep/gamegroup/download/records/RecordsSelection.java
  53. 275 0
      app/src/main/java/com/sheep/gamegroup/download/session/SessionBean.java
  54. 80 0
      app/src/main/java/com/sheep/gamegroup/download/session/SessionColumns.java
  55. 114 0
      app/src/main/java/com/sheep/gamegroup/download/session/SessionContentValues.java
  56. 99 0
      app/src/main/java/com/sheep/gamegroup/download/session/SessionCursor.java
  57. 60 0
      app/src/main/java/com/sheep/gamegroup/download/session/SessionModel.java
  58. 337 0
      app/src/main/java/com/sheep/gamegroup/download/session/SessionSelection.java
  59. 1 1
      app/src/main/java/com/sheep/gamegroup/helper/DownloadHelper.java
  60. 1 1
      app/src/main/java/com/sheep/gamegroup/model/entity/DialogEntity.java
  61. 1 1
      app/src/main/java/com/sheep/gamegroup/util/CommonUtil.java
  62. 2 2
      app/src/main/java/com/sheep/gamegroup/util/ShareJs.java
  63. 1 11
      app/src/main/java/com/sheep/gamegroup/util/WebviewJs.java
  64. 1 1
      app/src/main/java/com/sheep/gamegroup/view/activity/ActMainGame.java
  65. 1 1
      app/src/main/java/com/sheep/gamegroup/view/activity/TaskDetailAct.java
  66. 2 2
      app/src/main/java/com/sheep/gamegroup/view/activity/TaskDetailCreditCardAct.java
  67. 1 1
      app/src/main/java/com/sheep/gamegroup/view/adapter/TryMakeMoneyAdp.java
  68. 1 2
      app/src/main/java/com/sheep/gamegroup/view/dialog/DialogAccountAbnormal.java
  69. 5 6
      datashare/src/main/java/com/kfzs/duanduan/data/graph/provider/KFZSProvider.java
  70. 0 2
      datashare/src/main/java/com/kfzs/duanduan/data/graph/provider/current/CurrentDao.java
  71. 1 5
      datashare/src/main/java/com/kfzs/duanduan/data/graph/provider/channel/DaoMaster.java
  72. 1 15
      datashare/src/main/java/com/kfzs/duanduan/data/graph/provider/channel/DaoSession.java
  73. 1 1
      datashare/src/main/java/com/kfzs/duanduan/data/graph/provider/player/UserDao.java
  74. 2 2
      datashare/src/main/java/com/kfzs/duanduan/datashare/AppDownloadDatabaseHelper.java
  75. 2 28
      datashare/src/main/java/com/kfzs/duanduan/datashare/DDProviderHelper.java
  76. 1 1
      datashare/src/main/java/com/kfzs/duanduan/datashare/provider/appdownload/AppdownloadBeanDao.java
  77. 1 1
      datashare/src/main/java/com/kfzs/duanduan/datashare/provider/download/DownLoadInfoDao.java
  78. 1 1
      settings.gradle

+ 0 - 1
.idea/gradle.xml

@@ -9,7 +9,6 @@
           <set>
             <option value="$PROJECT_DIR$" />
             <option value="$PROJECT_DIR$/app" />
-            <option value="$PROJECT_DIR$/datashare" />
             <option value="$PROJECT_DIR$/ucrop" />
             <option value="$PROJECT_DIR$/view" />
           </set>

+ 1 - 1
app/build.gradle

@@ -223,7 +223,6 @@ dependencies {
     compile 'com.kf.framework:volleyplus:1.4.5@aar'
     compile "com.android.support:support-annotations:$supportLibVersion"
     compile "com.android.support:recyclerview-v7:$supportLibVersion"
-    compile project(':datashare')
     compile files('libs/jackson-core-2.2.1.jar')
     compile files('libs/jackson-dataformat-xml-2.1.2.jar')
     compile 'io.reactivex:rxandroid:1.2.1'
@@ -261,6 +260,7 @@ dependencies {
 //    compile 'com.github.nanchen2251:CompressHelper:1.0.5'
 //    compile(name: 'compresshelper-release', ext: 'aar')
     compile files('libs/compresshelper-release.jar')
+    compile 'org.greenrobot:greendao:3.2.2'
 }
 static def releaseTime() {
     return new Date().format("MMddHHmm", TimeZone.getDefault())

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

@@ -248,12 +248,6 @@
             android:hardwareAccelerated="false"
             android:screenOrientation="portrait" />
 
-        <provider
-            android:name="com.kfzs.duanduan.data.graph.provider.KFZSProvider"
-            android:authorities="com.kfzs.duanduan.data.graph.provider.${DUANDUAN_GRAPH}"
-            android:exported="true" />
-
-
         <receiver android:name="com.kfzs.duanduan.oem.AppAddOrdelReceiver">
             <intent-filter>
                 <action android:name="android.intent.action.PACKAGE_ADDED" />

+ 3 - 2
app/src/main/java/com/kfzs/duanduan/ActDownloadMgr.java

@@ -19,7 +19,6 @@ import com.kfzs.appstore.utils.adapter.OnMDLItemChildClickListener;
 import com.kfzs.duanduan.adp.DownloadMgrAdapter;
 import com.kfzs.duanduan.bean.CompareResult;
 import com.kfzs.duanduan.bean.DownloadStatus;
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.kfzs.duanduan.event.BigEvent;
 import com.kfzs.duanduan.event.EventDownloadHandler;
 import com.kfzs.duanduan.event.EventTypes;
@@ -29,6 +28,7 @@ import com.kfzs.duanduan.utils.dlg.HelperUtils;
 import com.kfzs.duanduan.utils.dlg.TitleBarUtils;
 import com.kfzs.duanduan.view.DialogStorageLow;
 import com.kfzs.duanduan.view.KFProgressButton;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 import com.sheep.gamegroup.util.CommonUtil;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.utils.ClassFileHelper;
@@ -39,6 +39,7 @@ import org.greenrobot.eventbus.Subscribe;
 import java.io.File;
 import java.text.DecimalFormat;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import butterknife.BindView;
@@ -166,7 +167,7 @@ public class ActDownloadMgr extends BaseCompatActivity {
 
     private void setDownloadTaskData() {
         downloadTasks.clear();
-        downloadTasks.addAll(downloadTaskService.getAllDownloadTasks());
+        downloadTasks.addAll((Collection<? extends DownLoadInfo>) downloadTaskService.getAllDownloadTasks());
 
         downloadMgrAdapter.clear();
         downloadMgrAdapter.addMoreDatas(downloadTasks);

+ 6 - 5
app/src/main/java/com/kfzs/duanduan/ActSearch.java

@@ -32,7 +32,6 @@ import com.kfzs.duanduan.adp.AdpSearchRecord;
 import com.kfzs.duanduan.adp.AdpSearchViewPager;
 import com.kfzs.duanduan.bean.DownloadStatus;
 import com.kfzs.duanduan.bll.UrlBll;
-import com.kfzs.duanduan.datashare.KFZSDDContentSession;
 import com.kfzs.duanduan.event.EventDownloadHandler;
 import com.kfzs.duanduan.proto.ApiResponseOuterClass;
 import com.kfzs.duanduan.proto.HotWordsOuterClass;
@@ -40,12 +39,16 @@ import com.kfzs.duanduan.proto.MistinessNamesOuterClass;
 import com.kfzs.duanduan.utils.InstallButtonUtils;
 import com.kfzs.duanduan.utils.dlg.DownBtnUtils;
 import com.kfzs.duanduan.utils.dlg.HelperUtils;
+import com.kfzs.duanduan.utils.dlg.SkipUtils;
 import com.kfzs.duanduan.utils.net.APIRequest;
 import com.kfzs.duanduan.utils.net.APIRequestInstance;
 import com.kfzs.duanduan.utils.net.ResponseNetworkTask;
 import com.orhanobut.logger.Logger;
+import com.sheep.gamegroup.download.KFZSDDContentSession;
 import com.sheep.gamegroup.util.UMConfigUtils;
 import com.sheep.jiuyan.samllsheep.R;
+import com.sheep.jiuyan.samllsheep.SheepApp;
+import com.sheep.jiuyan.samllsheep.utils.SpUtils;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
@@ -403,10 +406,8 @@ public class ActSearch extends BaseCompatActivity {
         mAdpSearchRecord.add(mStrSearchKey);
 
         HashMap<String, String> params = new HashMap<>();
-        if (null != KFZSDDContentSession.getInstance().findOutHeadSession(app)) {
-            params.put(UrlBll.HeadParams.AUTHORIZATION,
-                    KFZSDDContentSession.getInstance().findOutHeadSession(app).getToken());
-        }
+        params.put(UrlBll.HeadParams.AUTHORIZATION,
+                SpUtils.getToken(SheepApp.mContext));
         UMConfigUtils.onEvent(UMConfigUtils.Event.GAME_SEARCH);
         HashMap<String, String> paramsurl = new HashMap<>();
         paramsurl.put("q", mStrSearchKey);

+ 4 - 9
app/src/main/java/com/kfzs/duanduan/ActWeb.java

@@ -6,6 +6,8 @@ import android.os.Bundle;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
+
+import com.sheep.gamegroup.download.DDProviderHelper;
 import com.tencent.smtt.sdk.WebChromeClient;
 import com.tencent.smtt.sdk.WebSettings;
 import com.tencent.smtt.sdk.WebView;
@@ -18,8 +20,6 @@ import android.widget.TextView;
 import com.kfzs.android.view.RunThreadUtils;
 import com.kfzs.android.view.widget.SafeWebView;
 import com.kfzs.duanduan.bean.KFIntentKeys;
-import com.kfzs.duanduan.data.graph.provider.current.Current;
-import com.kfzs.duanduan.datashare.DDProviderHelper;
 import com.kfzs.duanduan.db.DataSave;
 import com.kfzs.duanduan.utils.ShareUtils;
 import com.kfzs.duanduan.utils.net.OnURLParseByJS;
@@ -316,16 +316,11 @@ public class ActWeb extends BaseCompatActivity {
     public class PublicJavaScript {
         @JavascriptInterface
         public String getHeader() {
-            return DDProviderHelper.getInstance().getLastUserToken(KFZSApp.context);
+            return "";
         }
         @JavascriptInterface
         public String getNick() {
-            Current current= DDProviderHelper.getInstance().getLastUser(ActWeb.this);
-            if(current==null || TextUtils.isEmpty(current.getMNickName())){
-                return "";
-            }
-
-            return current.getMNickName();
+            return "";
         }
 
         @JavascriptInterface

+ 1 - 1
app/src/main/java/com/kfzs/duanduan/adp/DownloadMgrAdapter.java

@@ -8,11 +8,11 @@ import com.bumptech.glide.Glide;
 import com.kfzs.duanduan.view.KFProgressButton;
 import com.kfzs.appstore.utils.adapter.MDLAdpater;
 import com.kfzs.appstore.utils.adapter.MDLViewHolderHelper;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 import com.sheep.jiuyan.samllsheep.R;
 import com.kfzs.duanduan.bean.CompareResult;
 import com.kfzs.duanduan.utils.InstallButtonUtils;
 import com.kfzs.duanduan.services.DownloadTaskService;
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.kfzs.duanduan.utils.ApkUtils;
 import com.kfzs.duanduan.ActDownloadMgr;
 

+ 0 - 3
app/src/main/java/com/kfzs/duanduan/db/DataSave.java

@@ -5,8 +5,6 @@ import android.content.pm.PackageManager;
 import android.os.Bundle;
 
 import com.kfzs.duanduan.KFZSApp;
-import com.kfzs.duanduan.data.graph.provider.channel.Channel;
-import com.kfzs.duanduan.datashare.DDProviderHelper;
 import com.kfzs.duanduan.utils.ApkUtils;
 import com.kfzs.duanduan.utils.sys.ChannelContent;
 
@@ -67,7 +65,6 @@ public class DataSave {
             } else {
                 try {
                     channelName = getAppMetaData().getString("UMENG_CHANNEL");
-                    DDProviderHelper.getInstance().setChannel(KFZSApp.context,new Channel(1L,channelName,null));
                 } catch (PackageManager.NameNotFoundException e) {
                     e.printStackTrace();
                 }

+ 1 - 1
app/src/main/java/com/kfzs/duanduan/event/EventDownloadHandler.java

@@ -4,8 +4,8 @@ import android.content.Context;
 
 import com.kfzs.duanduan.bean.DownloadStatus;
 import com.kfzs.duanduan.services.DownloadTaskService;
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.kfzs.duanduan.utils.dlg.HelperUtils;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 
 import org.greenrobot.eventbus.EventBus;
 

+ 2 - 2
app/src/main/java/com/kfzs/duanduan/oem/AppAddOrdelReceiver.java

@@ -8,9 +8,9 @@ import android.os.Looper;
 import android.text.TextUtils;
 
 import com.alibaba.fastjson.JSONObject;
-import com.kfzs.duanduan.datashare.DDProviderHelper;
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.kfzs.duanduan.utils.ApkUtils;
+import com.sheep.gamegroup.download.DDProviderHelper;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 import com.sheep.gamegroup.util.DeviceUtil;
 import com.sheep.gamegroup.util.NetUtil;
 import com.sheep.jiuyan.samllsheep.SheepApp;

+ 2 - 2
app/src/main/java/com/kfzs/duanduan/services/DownloadTaskService.java

@@ -7,8 +7,8 @@ import android.text.TextUtils;
 import com.arialyy.aria.core.Aria;
 import com.arialyy.aria.core.download.DownloadTarget;
 import com.kfzs.duanduan.KFZSApp;
-import com.kfzs.duanduan.datashare.DDProviderHelper;
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
+import com.sheep.gamegroup.download.DDProviderHelper;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 import com.sheep.gamegroup.model.api.IDownload;
 import com.sheep.gamegroup.model.entity.DialogEntity;
 import com.sheep.gamegroup.model.entity.OrienteeringDetail;

+ 6 - 8
app/src/main/java/com/kfzs/duanduan/utils/GameStatusScanner.java

@@ -11,8 +11,6 @@ import com.kfzs.duanduan.KFZSApp;
 import com.kfzs.duanduan.bean.CompareResult;
 import com.kfzs.duanduan.bean.DownloadStatus;
 import com.kfzs.duanduan.bll.UrlBll;
-import com.kfzs.duanduan.datashare.KFZSDDContentSession;
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.kfzs.duanduan.db.DataSave;
 import com.kfzs.duanduan.event.BigEvent;
 import com.kfzs.duanduan.event.EventTypes;
@@ -23,10 +21,12 @@ import com.kfzs.duanduan.services.DownloadTaskService;
 import com.kfzs.duanduan.utils.net.APIRequest;
 import com.kfzs.duanduan.utils.net.APIRequestInstance;
 import com.kfzs.duanduan.view.KFProgressButton;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 import com.sheep.gamegroup.util.UMConfigUtils;
 import com.sheep.jiuyan.samllsheep.BuildConfig;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.utils.ClassFileHelper;
+import com.sheep.jiuyan.samllsheep.utils.SpUtils;
 import com.zhy.http.okhttp.OkHttpUtils;
 import com.zhy.http.okhttp.callback.StringCallback;
 
@@ -221,12 +221,10 @@ public abstract class GameStatusScanner {
             return;
         }
         HashMap<String, String> params = null;
-        if (KFZSDDContentSession.getInstance().findOutHeadSession(mContext) != null
-                && !TextUtils.isEmpty(KFZSDDContentSession.getInstance().findOutHeadSession(mContext).getToken())) {
-            params = new HashMap<>();
-            String token = KFZSDDContentSession.getInstance().findOutHeadSession(mContext).getToken();
-            params.put(UrlBll.HeadParams.AUTHORIZATION, token);
-        }
+
+        params = new HashMap<>();
+        String token = SpUtils.getToken(mContext);
+        params.put(UrlBll.HeadParams.AUTHORIZATION, token);
 
 
         APIRequest apiRequest = APIRequestInstance.postReq(TAG, UrlBll.AppStoreApi.GAME_COUNT_UPDATE+""+gameid,

+ 0 - 9
app/src/main/java/com/kfzs/duanduan/utils/dlg/CheckUtils.java

@@ -5,7 +5,6 @@ import android.text.TextUtils;
 import com.sheep.jiuyan.samllsheep.utils.G;
 import com.kfzs.duanduan.KFZSApp;
 import com.sheep.jiuyan.samllsheep.R;
-import com.kfzs.duanduan.datashare.DDProviderHelper;
 
 /**
  * @ Created by Dlg
@@ -76,13 +75,5 @@ public class CheckUtils {
         return true;
     }
 
-    /**
-     * 当前是否是登录状态
-     *
-     * @return
-     */
-    public boolean isLogin() {
-        return !TextUtils.isEmpty(DDProviderHelper.getInstance().getLastUserToken(KFZSApp.context));
-    }
 
 }

+ 1 - 1
app/src/main/java/com/kfzs/duanduan/utils/dlg/DownBtnUtils.java

@@ -3,7 +3,6 @@ package com.kfzs.duanduan.utils.dlg;
 import android.content.Context;
 import android.util.Log;
 
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.kfzs.duanduan.event.EventDownloadHandler;
 import com.kfzs.duanduan.proto.GameOuterClass;
 import com.kfzs.duanduan.services.DownloadTaskService;
@@ -11,6 +10,7 @@ import com.kfzs.duanduan.utils.ApkUtils;
 import com.kfzs.duanduan.utils.GameStatusScanner;
 import com.kfzs.duanduan.utils.InstallButtonUtils;
 import com.kfzs.duanduan.view.KFProgressButton;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 
 import java.util.Map;
 

+ 2 - 2
app/src/main/java/com/kfzs/duanduan/utils/net/APIRequest.java

@@ -11,9 +11,9 @@ import com.android.volleyplus.toolbox.HttpHeaderParser;
 import com.google.protobuf.InvalidProtocolBufferException;
 import com.kfzs.duanduan.KFZSApp;
 import com.kfzs.duanduan.bll.UrlBll;
-import com.kfzs.duanduan.datashare.DDProviderHelper;
 import com.kfzs.duanduan.db.DataSave;
 import com.kfzs.duanduan.proto.ApiResponseOuterClass;
+import com.sheep.jiuyan.samllsheep.utils.SpUtils;
 
 import java.io.UnsupportedEncodingException;
 import java.util.HashMap;
@@ -56,7 +56,7 @@ public class APIRequest extends Request<ApiResponseOuterClass.ApiResponse> {
     public Map<String, String> getHeaders() throws AuthFailureError {
         Map<String, String> headers =new HashMap<>();
         headers.put(UrlBll.HeadParams.SECRET_KEY, DataSave.getInstance().getApkSign());
-        String token = DDProviderHelper.getInstance().getLastUserToken(KFZSApp.context);
+        String token = SpUtils.getToken(KFZSApp.context);
         if (!TextUtils.isEmpty(token)) {
             headers.put(UrlBll.HeadParams.AUTHORIZATION, token);
         }

+ 2 - 2
app/src/main/java/com/kfzs/duanduan/utils/net/APIRequestOptionV2.java

@@ -10,8 +10,8 @@ import com.android.volleyplus.request.RequestOption;
 import com.kfzs.duanduan.KFZSApp;
 import com.kfzs.duanduan.bll.UrlBll;
 import com.kfzs.duanduan.db.DataSave;
-import com.kfzs.duanduan.datashare.DDProviderHelper;
 import com.kfzs.duanduan.bean.BaseMsg;
+import com.sheep.jiuyan.samllsheep.utils.SpUtils;
 
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
@@ -155,7 +155,7 @@ public final class APIRequestOptionV2 {
      * 所有请求都加头
      */
     private void addUserTokenDefault() {
-        String token = DDProviderHelper.getInstance().getLastUserToken(KFZSApp.context);
+        String token = SpUtils.getToken(KFZSApp.context);
         if (TextUtils.isEmpty(token)) {
             return;
         }

+ 2 - 2
app/src/main/java/com/kfzs/duanduan/utils/net/APIRequestV2.java

@@ -13,8 +13,8 @@ import com.android.volleyplus.toolbox.HttpHeaderParser;
 import com.kfzs.duanduan.KFZSApp;
 import com.kfzs.duanduan.bean.BaseMsg;
 import com.kfzs.duanduan.bll.UrlBll;
-import com.kfzs.duanduan.datashare.DDProviderHelper;
 import com.kfzs.duanduan.db.DataSave;
+import com.sheep.jiuyan.samllsheep.utils.SpUtils;
 
 import java.io.UnsupportedEncodingException;
 import java.util.HashMap;
@@ -55,7 +55,7 @@ public class APIRequestV2 extends Request<BaseMsg> {
     public Map<String, String> getHeaders() throws AuthFailureError {
         Map<String, String> headers = new HashMap<>();
         headers.put(UrlBll.HeadParams.SECRET_KEY, DataSave.getInstance().getApkSign());
-        String token = DDProviderHelper.getInstance().getLastUserToken(KFZSApp.context);
+        String token = SpUtils.getToken(KFZSApp.context);;
         if (!TextUtils.isEmpty(token)) {
             headers.put(UrlBll.HeadParams.AUTHORIZATION, token);
         }

+ 2 - 5
app/src/main/java/com/kfzs/duanduan/utils/sys/ChannelContent.java

@@ -3,9 +3,7 @@ package com.kfzs.duanduan.utils.sys;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.text.TextUtils;
-
-import com.kfzs.duanduan.data.graph.provider.channel.Channel;
-import com.kfzs.duanduan.datashare.DDProviderHelper;
+import com.sheep.gamegroup.download.channel.Channel;
 
 import java.io.IOException;
 import java.util.Enumeration;
@@ -48,7 +46,7 @@ public class ChannelContent {
     }
 
     public boolean initChannelContent(Context context) {
-        Channel channel = DDProviderHelper.getInstance().getChannel(context);
+        Channel channel = null;
         if (channel != null && !TextUtils.isEmpty(channel.getMChannelName())) {
             channel_name = channel.getMChannelName();
             hasChannelFile = true;
@@ -73,7 +71,6 @@ public class ChannelContent {
                     }
                     String[] split = entryName.split(CHANNEL_FILE_MARK);
                     channel_name = split[split.length - 1];
-                    DDProviderHelper.getInstance().setChannel(context, new Channel(1L, channel_name, null));
                     hasChannelFile = true;
                     /*long size = entry.getSize();
                     if (size > 0) {

+ 66 - 0
app/src/main/java/com/sheep/gamegroup/download/BuildConfigSaver.java

@@ -0,0 +1,66 @@
+package com.sheep.gamegroup.download;
+
+import android.text.TextUtils;
+
+/**
+ * <pre>
+ *     sinlov
+ *
+ *     /\__/\
+ *    /`    '\
+ *  ≈≈≈ 0  0 ≈≈≈ Hello world!
+ *    \  --  /
+ *   /        \
+ *  /          \
+ * |            |
+ *  \  ||  ||  /
+ *   \_oo__oo_/≡≡≡≡≡≡≡≡o
+ *
+ * </pre>
+ * Created by sinlov on 17/3/10.
+ */
+public class BuildConfigSaver {
+    private static BuildConfigSaver instance;
+    private String flavor;
+    private String datashare;
+    private String graph;
+
+    public String getDatashare() {
+        if (TextUtils.isEmpty(datashare)) {
+            datashare = BuildConfigUtils.getBuildConfigByKey("DUANDUAN_DATASHARE");
+            if (TextUtils.isEmpty(datashare)) {
+                throw new IllegalArgumentException("you are not setting buildConfigField \"String\", \"DUANDUAN_DATASHARE\", '\"debug\"' ");
+            }
+        }
+        return datashare;
+    }
+
+    public String getGraph() {
+        if (TextUtils.isEmpty(graph)) {
+            graph = BuildConfigUtils.getBuildConfigByKey("DUANDUAN_GRAPH");
+            if (TextUtils.isEmpty(graph)) {
+                throw new IllegalArgumentException("you are not setting buildConfigField \"String\", \"DUANDUAN_GRAPH\", '\"debug\"' ");
+            }
+        }
+        return graph;
+    }
+
+    public String getFlavor() {
+        if (TextUtils.isEmpty(flavor)) {
+            flavor = BuildConfigUtils.getBuildConfigByKey("FLAVOR");
+            return flavor;
+        } else {
+            return flavor;
+        }
+    }
+
+    public static BuildConfigSaver getInstance() {
+        if (instance == null) {
+            instance = new BuildConfigSaver();
+        }
+        return instance;
+    }
+
+    private BuildConfigSaver() {
+    }
+}

+ 110 - 0
app/src/main/java/com/sheep/gamegroup/download/BuildConfigUtils.java

@@ -0,0 +1,110 @@
+package com.sheep.gamegroup.download;
+
+import android.util.Log;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <pre>
+ *     sinlov
+ *
+ *     /\__/\
+ *    /`    '\
+ *  ≈≈≈ 0  0 ≈≈≈ Hello world!
+ *    \  --  /
+ *   /        \
+ *  /          \
+ * |            |
+ *  \  ||  ||  /
+ *   \_oo__oo_/≡≡≡≡≡≡≡≡o
+ *
+ * </pre>
+ * Created by sinlov on 17/3/10.
+ */
+public class BuildConfigUtils {
+
+    public static String getBuildConfigByKey(String key) {
+        String res;
+        try {
+            final Class<?> activityThread = Class.forName("android.app.ActivityThread");
+            final Method currentPackage = activityThread.getMethod("currentPackageName");
+            final String packageName = (String) currentPackage.invoke(null, (Object[]) null);
+            final Class<?> buildConfig = Class.forName(packageName + ".BuildConfig");
+            final Field findField = buildConfig.getField(key);
+            findField.setAccessible(true);
+            if (findField.getGenericType().toString().equals(
+                    "class java.lang.String")) {
+                res = (String) findField.get("");
+            } else {
+                res = "";
+            }
+        } catch (final Throwable t) {
+            res = getBuildPNByKey("com.kfzs.duanduan", key);
+        }
+        return res;
+    }
+
+    public static String getBuildPNByKey(String pn, String key) {
+        String res;
+        try {
+            final Class<?> buildConfig = Class.forName(pn + ".BuildConfig");
+            final Field findField = buildConfig.getField(key);
+            findField.setAccessible(true);
+            if (findField.getGenericType().toString().equals(
+                    "class java.lang.String")) {
+                res = (String) findField.get("");
+            } else {
+                res = "";
+            }
+        } catch (final Throwable t) {
+            Log.w("Find", "getBuildConfigByKey error", t);
+            final String message = t.getMessage();
+            if (message != null && message.contains("BuildConfig")) {
+                res = "default";
+            } else {
+                res = "";
+            }
+        }
+        return res;
+    }
+
+    private static List<String> getParameters(Class<?> clazz) {
+        Field[] fields = clazz.getDeclaredFields();
+        List<String> res = new ArrayList<String>();
+        for (Field f : fields) {
+            res.add(f.getName());
+        }
+        return res;
+    }
+
+    private static void getFieldsValue(Object obj) {
+        Field[] fields = obj.getClass().getDeclaredFields();
+
+        String[] types = {"java.lang.Integer",
+                "java.lang.Double",
+                "java.lang.Float",
+                "java.lang.Long",
+                "java.lang.Short",
+                "java.lang.Byte",
+                "java.lang.Boolean",
+                "java.lang.Character",
+                "java.lang.String",
+                "int", "double", "long", "short", "byte", "boolean", "char", "float"};
+        for (Field f : fields) {
+            f.setAccessible(true);
+            try {
+                for (String str : types) {
+                    if (f.getType().getName().equals(str))
+                        System.out.println("Name: " + f.getName() + " |Type: " + f.getType().getName() + " |val: " + f.get(obj));
+                }
+            } catch (IllegalArgumentException e) {
+                e.printStackTrace();
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}

+ 275 - 0
app/src/main/java/com/sheep/gamegroup/download/DDProviderHelper.java

@@ -0,0 +1,275 @@
+package com.sheep.gamegroup.download;
+
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+
+import com.sheep.gamegroup.download.channel.DaoMaster;
+import com.sheep.gamegroup.download.channel.DaoSession;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
+import com.sheep.gamegroup.download.download.DownLoadInfoDao;
+
+import java.util.List;
+
+/**
+ * 端端privoder工具
+ *
+ * @author kemllor
+ * @date 2017/6/15   15:27
+ **/
+
+public class DDProviderHelper {
+
+    private static DDProviderHelper mInstance;
+
+    public static synchronized DDProviderHelper getInstance() {
+        if (mInstance == null) {
+            mInstance = new DDProviderHelper();
+        }
+        return mInstance;
+    }
+
+    private DDProviderHelper() {
+    }
+
+
+
+    /**
+     * 获取下载任务列表
+     *
+     * @param context
+     * @return
+     */
+    public List<DownLoadInfo> getDownloadList(Context context) {
+        List<DownLoadInfo> list = getDaossion(context).getDownLoadInfoDao().queryBuilder().build().list();
+        return list;
+    }
+
+
+    /**
+     * 更新下载任务状态;
+     *
+     * @param context
+     * @param info
+     */
+    public void updateDownload(Context context, DownLoadInfo info) {
+        DownLoadInfoDao loadInfoDao = getDaossion(context).getDownLoadInfoDao();
+        loadInfoDao.update(info);
+    }
+
+    /**
+     * 添加或更新任务
+     *
+     * @param context
+     * @param info
+     */
+    public boolean addOrUpDataDownloadTask(Context context, DownLoadInfo info) {
+        DownLoadInfoDao infoDao = getDaossion(context).getDownLoadInfoDao();
+        DownLoadInfo downLoadInfo = infoDao
+                .queryBuilder()
+                .where(DownLoadInfoDao.Properties.MDownloadUrl.eq(info.getMDownloadUrl()))
+                .build()
+                .unique();
+        try{
+            if (downLoadInfo == null) {
+                infoDao.insert(info);
+                return true;
+            } else {
+                info.setMId(downLoadInfo.getMId());
+                infoDao.update(info);
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * 删除指定任务;
+     *
+     * @param context
+     * @param gameID
+     */
+    public List<DownLoadInfo> deleteDownloadTask(Context context, String gameID) {
+        DownLoadInfoDao loadInfoDao = getDaossion(context).getDownLoadInfoDao();
+        DownLoadInfo loadInfo = loadInfoDao.queryBuilder()
+                .where(DownLoadInfoDao.Properties.MGameID.eq(gameID))
+                .build()
+                .unique();
+        loadInfoDao.delete(loadInfo);
+        List<DownLoadInfo> loadInfos = loadInfoDao.queryBuilder().build().list();
+        return loadInfos;
+    }
+    /**
+     * 删除所有任务;
+     *
+     * @param context
+     */
+    public void deleteAllDownloadTask(Context context) {
+        DownLoadInfoDao loadInfoDao = getDaossion(context).getDownLoadInfoDao();
+        loadInfoDao.deleteAll();
+    }
+
+
+    /**
+     * 删除指定任务;
+     *
+     * @param context
+     * @param url
+     */
+    public boolean deleteDownloadTaskByUrl(Context context, String url) {
+        try {
+            DownLoadInfoDao loadInfoDao = getDaossion(context).getDownLoadInfoDao();
+            DownLoadInfo loadInfo = loadInfoDao.queryBuilder()
+                    .where(DownLoadInfoDao.Properties.MDownloadUrl.eq(url))
+                    .build()
+                    .unique();
+            loadInfoDao.delete(loadInfo);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    private DaoMaster.DevOpenHelper openHelper;
+
+    private synchronized DaoSession getDaossion(Context context) {
+        if (openHelper == null) {
+            openHelper = new DaoMaster.DevOpenHelper(context, "dd.db");
+        }
+        return new DaoMaster(openHelper.getReadableDb()).newSession();
+    }
+
+    /**
+     * 获取下载中的任务;
+     *
+     * @param ctx
+     */
+    public List<DownLoadInfo> getDownloadingTask(Context ctx) {
+        List<DownLoadInfo> loadInfos = getDaossion(ctx)
+                .getDownLoadInfoDao()
+                .queryBuilder()
+                .where(DownLoadInfoDao.Properties.MStatus.eq(2))
+                .build()
+                .list();
+        return loadInfos;
+    }
+
+    /**
+     * 获取指定下载任务
+     *
+     * @param downloadUrl
+     */
+    public DownLoadInfo getDownloadTask(Context context, String downloadUrl) {
+        DownLoadInfo downLoadInfo = getDaossion(context)
+                .getDownLoadInfoDao()
+                .queryBuilder()
+                .where(DownLoadInfoDao.Properties.MDownloadUrl.eq(downloadUrl))
+                .build()
+                .unique();
+        return downLoadInfo;
+    }
+
+    /**
+     * 获取指定下载任务
+     *
+     * @param packName
+     */
+    public DownLoadInfo getDownloadTaskToPackname(Context context, String packName) {
+        DownLoadInfo downLoadInfo = getDaossion(context)
+                .getDownLoadInfoDao()
+                .queryBuilder()
+                .where(DownLoadInfoDao.Properties.MPackageName.eq(packName))
+                .limit(1)
+                .build()
+                .unique();
+        return downLoadInfo;
+    }
+
+    /**
+     * 下载任务完成
+     *
+     * @param ctx
+     * @param downloadUrl
+     * @param apkPath
+     */
+    public void setDownloadTaskFinish(Context ctx, String downloadUrl, String apkPath) {
+        DownLoadInfo downloadTask = getDownloadTask(ctx, downloadUrl);
+        if (downloadTask != null) {
+            downloadTask.setMApkPath(apkPath);
+            downloadTask.setMStatus(3);//DownloadTaskService.STATUS_FINISH
+            getDaossion(ctx).getDownLoadInfoDao().update(downloadTask);
+        }
+    }
+
+    /**
+     * 更新任务状态
+     *
+     * @param ctx
+     * @param percent
+     * @param downloadedSize
+     * @param totalSize
+     * @param downloadTaskId
+     * @param downloadUrl
+     */
+    public void updateDownloadPercent(Context ctx, int percent, double downloadedSize, double totalSize, int downloadTaskId, String downloadUrl, int state) {
+        DownLoadInfo downloadTask = getDownloadTask(ctx, downloadUrl);
+        if (downloadTask != null) {
+            downloadTask.setMPercent(percent);
+            downloadTask.setMTotalSize(totalSize);
+            downloadTask.setMDownloadedSize(downloadedSize);
+            downloadTask.setMDownloadTaskId(downloadTaskId);
+            downloadTask.setMStatus(state);//2下载中
+            updateDownload(ctx, downloadTask);
+        }
+    }
+
+
+    /**
+     * 改变任务状态
+     *
+     * @param ctx
+     * @param downloadUrl
+     * @param status
+     */
+    public boolean setDownloadTaskStatus(Context ctx, String downloadUrl, int status) {
+        try {
+            DownLoadInfo downloadTask = getDownloadTask(ctx, downloadUrl);
+            if (downloadTask != null) {
+                downloadTask.setMStatus(status);
+                updateDownload(ctx, downloadTask);
+                return true;
+            }
+            return false;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * app启动  所有任务全部暂停
+     *
+     * @param context
+     */
+    public void restoreDownloadTaskStatus(Context context) {
+        DownLoadInfoDao downLoadInfoDao = getDaossion(context).getDownLoadInfoDao();
+        List<DownLoadInfo> list = downLoadInfoDao
+                .queryBuilder()
+                .whereOr(DownLoadInfoDao.Properties.MStatus.eq(0), DownLoadInfoDao.Properties.MStatus.eq(2))
+                .build()
+                .list();
+
+        if (list != null && list.size() > 0) {
+            for (int i = 0; i < list.size(); i++) {
+                DownLoadInfo loadInfo = list.get(i);
+                loadInfo.setMStatus(4);
+                downLoadInfoDao.update(loadInfo);
+            }
+        }
+    }
+}

+ 143 - 0
app/src/main/java/com/sheep/gamegroup/download/KFZSDDContentSession.java

@@ -0,0 +1,143 @@
+package com.sheep.gamegroup.download;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+
+import com.sheep.gamegroup.download.session.SessionBean;
+import com.sheep.gamegroup.download.session.SessionContentValues;
+import com.sheep.gamegroup.download.session.SessionCursor;
+import com.sheep.gamegroup.download.session.SessionSelection;
+
+/**
+ * <pre>
+ *     sinlov
+ *
+ *     /\__/\
+ *    /`    '\
+ *  ≈≈≈ 0  0 ≈≈≈ Hello world!
+ *    \  --  /
+ *   /        \
+ *  /          \
+ * |            |
+ *  \  ||  ||  /
+ *   \_oo__oo_/≡≡≡≡≡≡≡≡o
+ *
+ * </pre>
+ * Created by sinlov on 17/2/21.
+ */
+public class KFZSDDContentSession {
+
+    public static final int SUCCESS = 1;
+    public static final int NOT_HAS_ANY_SESSION = 1 ^ 2;
+    public static final int HEAD_SESSION_HAS_CHANGE_STOP_JOB = 1 ^ 3;
+    public static final int CAN_NOT_FIND_QUERY_OUT_BY_KEY = 1 ^ 4;
+
+    private static KFZSDDContentSession instance;
+    private SessionBean saveSessionBean;
+    private KFZSDDSQLiteOpenHelper openHelper;
+
+    /**
+     * @return {@link SessionBean}
+     */
+    public SessionBean getSaveHeadSessionInMem() {
+        if (saveSessionBean == null) {
+            throw new NullPointerException("not has head session by head, just use findOutHeadSession()");
+        }
+        return saveSessionBean;
+    }
+
+    /**
+     * change head session by account if success return 0
+     * <br/>success return {@link #SUCCESS}
+     * <br/>if has not any session return {@link #NOT_HAS_ANY_SESSION}
+     * <br/>if account can find return {@link #CAN_NOT_FIND_QUERY_OUT_BY_KEY}
+     *
+     * @param ctx    {@link Context}
+     * @param openID {@link String}
+     * @return {@link #SUCCESS} or {@link #NOT_HAS_ANY_SESSION} or {@link #CAN_NOT_FIND_QUERY_OUT_BY_KEY}
+     * @deprecated
+     */
+    public int changeHeadSession(Context ctx, String openID) {
+        SessionSelection where = new SessionSelection();
+        int count = where.count(ctx);
+        if (count > 0) {
+            where.openId(openID);
+            ContentResolver contentResolver = ctx.getContentResolver();
+            SessionCursor query = where.query(contentResolver);
+            if (query == null) {
+                throwSessionProviderConfigError();
+            }
+            if (query.getCount() == 0) {
+                query.close();
+                return NOT_HAS_ANY_SESSION;
+            } else {
+                query.moveToNext();
+                SessionContentValues sessionContentValues = new SessionContentValues();
+                sessionContentValues.putOpenId(query.getOpenId());
+                sessionContentValues.putAccount(query.getAccount());
+                Integer uid = query.getUid();
+                sessionContentValues.putUid(uid);
+                String token = query.getToken();
+                sessionContentValues.putToken(token);
+                long nowTime = System.currentTimeMillis();
+                sessionContentValues.putUpdateTime(nowTime);
+                String temp = query.getAccount() + uid + token;
+                int hash = temp.hashCode();
+                sessionContentValues.putHash(hash);
+                contentResolver.update(sessionContentValues.uri(), sessionContentValues.values(), null, null);
+                query.close();
+                return SUCCESS;
+            }
+        } else {
+            return CAN_NOT_FIND_QUERY_OUT_BY_KEY;
+        }
+    }
+
+    /**
+     * remove all session and return delete session count
+     *
+     * @param ctx {@link Context}
+     * @return count of delete session raw
+     */
+
+    private void checkConfig(Context ctx) {
+        String graphMeta;
+        String dataShareMeta;
+        openHelper = KFZSDDSQLiteOpenHelper.getInstance(ctx);
+        try {
+            ApplicationInfo info = ctx.getPackageManager().getApplicationInfo(ctx.getPackageName(), PackageManager.GET_META_DATA);
+            Bundle metaData = info.metaData;
+            graphMeta = String.valueOf(metaData.get("DUANDUAN_GRAPH"));
+            dataShareMeta = String.valueOf(metaData.get("DUANDUAN_DATASHARE"));
+        } catch (PackageManager.NameNotFoundException e) {
+            e.printStackTrace();
+            graphMeta = "";
+            dataShareMeta = "";
+        }
+        String graph = BuildConfigSaver.getInstance().getGraph();
+        if (!graphMeta.equals(graph)) {
+            throw new IllegalArgumentException("DUANDUAN_GRAPH in Manifest: " + graphMeta + " |in BuildConfig:  " + graph + " | not same, please check config");
+        }
+        String dataShare = BuildConfigSaver.getInstance().getDatashare();
+        if (!dataShareMeta.equals(dataShare)) {
+            throw new IllegalArgumentException("DUANDUAN_DATASHARE in Manifest: " + dataShareMeta + " |in BuildConfig:  " + dataShare + " | not same, please check config");
+        }
+    }
+
+    private void throwSessionProviderConfigError() {
+        throw new IllegalArgumentException("Please check config!\nNow com.kfzs.duanduan.datashare.provider.KFZSDDProvider AUTHORITY is set: " + KFZSDDProvider.AUTHORITY + " maybe error!");
+    }
+
+    public static synchronized KFZSDDContentSession getInstance() {
+        if (instance == null) {
+            KFZSDDContentSession.instance = new KFZSDDContentSession();
+        }
+        return instance;
+    }
+
+    private KFZSDDContentSession() {
+    }
+}

+ 171 - 0
app/src/main/java/com/sheep/gamegroup/download/KFZSDDProvider.java

@@ -0,0 +1,171 @@
+package com.sheep.gamegroup.download;
+
+// @formatter:off
+
+import android.content.ContentValues;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.util.Log;
+
+import com.sheep.gamegroup.download.base.BaseContentProvider;
+import com.sheep.gamegroup.download.downloadtask.DownloadtaskColumns;
+import com.sheep.gamegroup.download.records.RecordsColumns;
+import com.sheep.gamegroup.download.session.SessionColumns;
+import com.sheep.jiuyan.samllsheep.BuildConfig;
+
+import java.util.Arrays;
+
+public class KFZSDDProvider extends BaseContentProvider {
+    private static final String TAG = KFZSDDProvider.class.getSimpleName();
+
+    private static final boolean DEBUG = BuildConfig.DEBUG;
+
+    private static final String TYPE_CURSOR_ITEM = "vnd.android.cursor.item/";
+    private static final String TYPE_CURSOR_DIR = "vnd.android.cursor.dir/";
+
+    public static final String AUTHORITY = "com.kfzs.duanduan.datashare.provider." + BuildConfigSaver.getInstance().getDatashare();
+    public static final String CONTENT_URI_BASE = "content://" + AUTHORITY;
+
+    private static final int URI_TYPE_DOWNLOADTASK = 0;
+    private static final int URI_TYPE_DOWNLOADTASK_ID = 1;
+
+    private static final int URI_TYPE_RECORDS = 2;
+    private static final int URI_TYPE_RECORDS_ID = 3;
+
+    private static final int URI_TYPE_SESSION = 4;
+    private static final int URI_TYPE_SESSION_ID = 5;
+
+
+    private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
+
+    static {
+        URI_MATCHER.addURI(AUTHORITY, DownloadtaskColumns.TABLE_NAME, URI_TYPE_DOWNLOADTASK);
+        URI_MATCHER.addURI(AUTHORITY, DownloadtaskColumns.TABLE_NAME + "/#", URI_TYPE_DOWNLOADTASK_ID);
+        URI_MATCHER.addURI(AUTHORITY, RecordsColumns.TABLE_NAME, URI_TYPE_RECORDS);
+        URI_MATCHER.addURI(AUTHORITY, RecordsColumns.TABLE_NAME + "/#", URI_TYPE_RECORDS_ID);
+        URI_MATCHER.addURI(AUTHORITY, SessionColumns.TABLE_NAME, URI_TYPE_SESSION);
+        URI_MATCHER.addURI(AUTHORITY, SessionColumns.TABLE_NAME + "/#", URI_TYPE_SESSION_ID);
+    }
+
+    @Override
+    protected SQLiteOpenHelper createSqLiteOpenHelper() {
+        return KFZSDDSQLiteOpenHelper.getInstance(getContext());
+    }
+
+    @Override
+    protected boolean hasDebug() {
+        return DEBUG;
+    }
+
+    @Override
+    public String getType(Uri uri) {
+        int match = URI_MATCHER.match(uri);
+        switch (match) {
+            case URI_TYPE_DOWNLOADTASK:
+                return TYPE_CURSOR_DIR + DownloadtaskColumns.TABLE_NAME;
+            case URI_TYPE_DOWNLOADTASK_ID:
+                return TYPE_CURSOR_ITEM + DownloadtaskColumns.TABLE_NAME;
+
+            case URI_TYPE_RECORDS:
+                return TYPE_CURSOR_DIR + RecordsColumns.TABLE_NAME;
+            case URI_TYPE_RECORDS_ID:
+                return TYPE_CURSOR_ITEM + RecordsColumns.TABLE_NAME;
+
+            case URI_TYPE_SESSION:
+                return TYPE_CURSOR_DIR + SessionColumns.TABLE_NAME;
+            case URI_TYPE_SESSION_ID:
+                return TYPE_CURSOR_ITEM + SessionColumns.TABLE_NAME;
+
+        }
+        return null;
+    }
+
+    @Override
+    public Uri insert(@NonNull Uri uri, ContentValues values) {
+        if (DEBUG) Log.d(TAG, "insert uri=" + uri + " values=" + values);
+        return super.insert(uri, values);
+    }
+
+    @Override
+    public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) {
+        if (DEBUG) Log.d(TAG, "bulkInsert uri=" + uri + " values.length=" + values.length);
+        return super.bulkInsert(uri, values);
+    }
+
+    @Override
+    public int update(@NonNull Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+        if (DEBUG)
+            Log.d(TAG, "update uri=" + uri + " values=" + values + " selection=" + selection + " selectionArgs=" + Arrays.toString(selectionArgs));
+        return super.update(uri, values, selection, selectionArgs);
+    }
+
+    @Override
+    public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) {
+        if (DEBUG)
+            Log.d(TAG, "delete uri=" + uri + " selection=" + selection + " selectionArgs=" + Arrays.toString(selectionArgs));
+        return super.delete(uri, selection, selectionArgs);
+    }
+
+    @Override
+    public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
+        if (DEBUG)
+            Log.d(TAG, "query uri=" + uri + " selection=" + selection + " selectionArgs=" + Arrays.toString(selectionArgs) + " sortOrder=" + sortOrder
+                    + " groupBy=" + uri.getQueryParameter(QUERY_GROUP_BY) + " having=" + uri.getQueryParameter(QUERY_HAVING) + " limit=" + uri.getQueryParameter(QUERY_LIMIT));
+        return super.query(uri, projection, selection, selectionArgs, sortOrder);
+    }
+
+    @Override
+    protected QueryParams getQueryParams(Uri uri, String selection, String[] projection) {
+        QueryParams res = new QueryParams();
+        String id = null;
+        int matchedId = URI_MATCHER.match(uri);
+        switch (matchedId) {
+            case URI_TYPE_DOWNLOADTASK:
+            case URI_TYPE_DOWNLOADTASK_ID:
+                res.table = DownloadtaskColumns.TABLE_NAME;
+                res.idColumn = DownloadtaskColumns._ID;
+                res.tablesWithJoins = DownloadtaskColumns.TABLE_NAME;
+                res.orderBy = DownloadtaskColumns.DEFAULT_ORDER;
+                break;
+
+            case URI_TYPE_RECORDS:
+            case URI_TYPE_RECORDS_ID:
+                res.table = RecordsColumns.TABLE_NAME;
+                res.idColumn = RecordsColumns._ID;
+                res.tablesWithJoins = RecordsColumns.TABLE_NAME;
+                res.orderBy = RecordsColumns.DEFAULT_ORDER;
+                break;
+
+            case URI_TYPE_SESSION:
+            case URI_TYPE_SESSION_ID:
+                res.table = SessionColumns.TABLE_NAME;
+                res.idColumn = SessionColumns._ID;
+                res.tablesWithJoins = SessionColumns.TABLE_NAME;
+                res.orderBy = SessionColumns.DEFAULT_ORDER;
+                break;
+
+            default:
+                throw new IllegalArgumentException("The uri '" + uri + "' is not supported by this ContentProvider");
+        }
+
+        switch (matchedId) {
+            case URI_TYPE_DOWNLOADTASK_ID:
+            case URI_TYPE_RECORDS_ID:
+            case URI_TYPE_SESSION_ID:
+                id = uri.getLastPathSegment();
+        }
+        if (id != null) {
+            if (selection != null) {
+                res.selection = res.table + "." + res.idColumn + "=" + id + " and (" + selection + ")";
+            } else {
+                res.selection = res.table + "." + res.idColumn + "=" + id;
+            }
+        } else {
+            res.selection = selection;
+        }
+        return res;
+    }
+}

+ 154 - 0
app/src/main/java/com/sheep/gamegroup/download/KFZSDDSQLiteOpenHelper.java

@@ -0,0 +1,154 @@
+package com.sheep.gamegroup.download;
+
+// @formatter:off
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.database.DatabaseErrorHandler;
+import android.database.DefaultDatabaseErrorHandler;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.os.Build;
+import android.util.Log;
+
+import com.sheep.gamegroup.download.base.BaseSQLiteOpenHelperCallbacks;
+import com.sheep.gamegroup.download.downloadtask.DownloadtaskColumns;
+import com.sheep.gamegroup.download.records.RecordsColumns;
+import com.sheep.gamegroup.download.session.SessionColumns;
+import com.sheep.jiuyan.samllsheep.BuildConfig;
+
+public class KFZSDDSQLiteOpenHelper extends SQLiteOpenHelper {
+    private static final String TAG = KFZSDDSQLiteOpenHelper.class.getSimpleName();
+
+    public static final String DATABASE_FILE_NAME = "kfzsdd.db";
+    private static final int DATABASE_VERSION = 3;
+    private static KFZSDDSQLiteOpenHelper sInstance;
+    private final Context mContext;
+    private final BaseSQLiteOpenHelperCallbacks mOpenHelperCallbacks;
+
+    public static final String SQL_CREATE_TABLE_DOWNLOADTASK = "CREATE TABLE IF NOT EXISTS "
+            + DownloadtaskColumns.TABLE_NAME + " ( "
+            + DownloadtaskColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+            + DownloadtaskColumns.CREATE_TIME + " INTEGER NOT NULL, "
+            + DownloadtaskColumns.DOWNLOAD_TASK_ID + " INTEGER, "
+            + DownloadtaskColumns.GAME_NAME + " TEXT NOT NULL, "
+            + DownloadtaskColumns.GAME_ID + " INTEGER NOT NULL, "
+            + DownloadtaskColumns.ICON_URL + " TEXT NOT NULL, "
+            + DownloadtaskColumns.PERCENT + " INTEGER, "
+            + DownloadtaskColumns.DOWNLOADED_SIZE + " REAL, "
+            + DownloadtaskColumns.TOTAL_SIZE + " REAL, "
+            + DownloadtaskColumns.STATUS + " INTEGER NOT NULL, "
+            + DownloadtaskColumns.DOWNLOAD_URL + " TEXT NOT NULL, "
+            + DownloadtaskColumns.PACKAGE_NAME + " TEXT NOT NULL, "
+            + DownloadtaskColumns.VERSION_CODE + " INTEGER NOT NULL, "
+            + DownloadtaskColumns.APK_PATH + " TEXT NOT NULL "
+            + ", CONSTRAINT unique_download_task UNIQUE (download_url) ON CONFLICT REPLACE"
+            + " );";
+
+    public static final String SQL_CREATE_INDEX_DOWNLOADTASK_CREATE_TIME = "CREATE INDEX IDX_DOWNLOADTASK_CREATE_TIME "
+            + " ON " + DownloadtaskColumns.TABLE_NAME + " ( " + DownloadtaskColumns.CREATE_TIME + " );";
+
+    public static final String SQL_CREATE_TABLE_RECORDS = "CREATE TABLE IF NOT EXISTS "
+            + RecordsColumns.TABLE_NAME + " ( "
+            + RecordsColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+            + RecordsColumns.CREATE_TIME + " INTEGER NOT NULL, "
+            + RecordsColumns.NAME + " TEXT NOT NULL "
+            + ", CONSTRAINT unique_records UNIQUE (create_time) ON CONFLICT REPLACE"
+            + " );";
+
+    public static final String SQL_CREATE_INDEX_RECORDS_CREATE_TIME = "CREATE INDEX IDX_RECORDS_CREATE_TIME "
+            + " ON " + RecordsColumns.TABLE_NAME + " ( " + RecordsColumns.CREATE_TIME + " );";
+
+    public static final String SQL_CREATE_TABLE_SESSION = "CREATE TABLE IF NOT EXISTS "
+            + SessionColumns.TABLE_NAME + " ( "
+            + SessionColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+            + SessionColumns.ACCOUNT + " TEXT NOT NULL, "
+            + SessionColumns.OPEN_ID + " TEXT, "
+            + SessionColumns.UPDATE_TIME + " INTEGER NOT NULL, "
+            + SessionColumns.TOKEN + " TEXT, "
+            + SessionColumns.UID + " INTEGER, "
+            + SessionColumns.HASH + " INTEGER "
+            + ", CONSTRAINT unique_session UNIQUE (account) ON CONFLICT REPLACE"
+            + " );";
+
+    public static final String SQL_CREATE_INDEX_SESSION_ACCOUNT = "CREATE INDEX IDX_SESSION_ACCOUNT "
+            + " ON " + SessionColumns.TABLE_NAME + " ( " + SessionColumns.ACCOUNT + " );";
+
+    public static final String SQL_CREATE_INDEX_SESSION_OPEN_ID = "CREATE INDEX IDX_SESSION_OPEN_ID "
+            + " ON " + SessionColumns.TABLE_NAME + " ( " + SessionColumns.OPEN_ID + " );";
+
+
+    public static KFZSDDSQLiteOpenHelper getInstance(Context context) {
+        // Use the application context, which will ensure that you
+        // don't accidentally leak an Activity's context.
+        // See this article for more information: http://bit.ly/6LRzfx
+        if (sInstance == null) {
+            sInstance = newInstance(context.getApplicationContext());
+        }
+        return sInstance;
+    }
+
+    private static KFZSDDSQLiteOpenHelper newInstance(Context context) {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
+            return newInstancePreHoneycomb(context);
+        }
+        return newInstancePostHoneycomb(context);
+    }
+
+
+    /*
+     * Pre Honeycomb.
+     */
+    private static KFZSDDSQLiteOpenHelper newInstancePreHoneycomb(Context context) {
+        return new KFZSDDSQLiteOpenHelper(context);
+    }
+
+    private KFZSDDSQLiteOpenHelper(Context context) {
+        super(context, DATABASE_FILE_NAME, null, DATABASE_VERSION);
+        mContext = context;
+        mOpenHelperCallbacks = new KFZSDDSQLiteOpenHelperCallbacks();
+    }
+
+
+    /*
+     * Post Honeycomb.
+     */
+    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+    private static KFZSDDSQLiteOpenHelper newInstancePostHoneycomb(Context context) {
+        return new KFZSDDSQLiteOpenHelper(context, new DefaultDatabaseErrorHandler());
+    }
+
+    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+    private KFZSDDSQLiteOpenHelper(Context context, DatabaseErrorHandler errorHandler) {
+        super(context, DATABASE_FILE_NAME, null, DATABASE_VERSION, errorHandler);
+        mContext = context;
+        mOpenHelperCallbacks = new KFZSDDSQLiteOpenHelperCallbacks();
+    }
+
+
+    @Override
+    public void onCreate(SQLiteDatabase db) {
+        if (BuildConfig.DEBUG)
+            Log.d(TAG, "onCreate");
+        mOpenHelperCallbacks.onPreCreate(mContext, db);
+        db.execSQL(SQL_CREATE_TABLE_DOWNLOADTASK);
+        db.execSQL(SQL_CREATE_INDEX_DOWNLOADTASK_CREATE_TIME);
+        db.execSQL(SQL_CREATE_TABLE_RECORDS);
+        db.execSQL(SQL_CREATE_INDEX_RECORDS_CREATE_TIME);
+        db.execSQL(SQL_CREATE_TABLE_SESSION);
+        db.execSQL(SQL_CREATE_INDEX_SESSION_ACCOUNT);
+        db.execSQL(SQL_CREATE_INDEX_SESSION_OPEN_ID);
+        mOpenHelperCallbacks.onPostCreate(mContext, db);
+    }
+
+    @Override
+    public void onOpen(SQLiteDatabase db) {
+        super.onOpen(db);
+        mOpenHelperCallbacks.onOpen(mContext, db);
+    }
+
+    @Override
+    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+        mOpenHelperCallbacks.onUpgrade(mContext, db, oldVersion, newVersion);
+    }
+}

+ 112 - 0
app/src/main/java/com/sheep/gamegroup/download/KFZSDDSQLiteOpenHelperCallbacks.java

@@ -0,0 +1,112 @@
+package com.sheep.gamegroup.download;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.util.Log;
+
+import com.sheep.gamegroup.download.base.BaseSQLiteOpenHelperCallbacks;
+import com.sheep.gamegroup.download.downloadtask.DownloadtaskColumns;
+import com.sheep.gamegroup.download.session.SessionColumns;
+
+/**
+ * <pre>
+ *     sinlov
+ *
+ *     /\__/\
+ *    /`    '\
+ *  ≈≈≈ 0  0 ≈≈≈ Hello world!
+ *    \  --  /
+ *   /        \
+ *  /          \
+ * |            |
+ *  \  ||  ||  /
+ *   \_oo__oo_/≡≡≡≡≡≡≡≡o
+ *
+ * </pre>
+ * Created by sinlov on 17/4/13.
+ */
+public class KFZSDDSQLiteOpenHelperCallbacks extends BaseSQLiteOpenHelperCallbacks {
+
+    @Override
+    public void onOpen(Context context, SQLiteDatabase db) {
+        super.onOpen(context, db);
+        Log.i("update", "KFZSDDSQLiteOpenHelper " +
+                " - nowVersion: " + db.getVersion());
+    }
+
+    @Override
+    public void onPostCreate(Context context, SQLiteDatabase db) {
+        super.onPostCreate(context, db);
+    }
+
+    @Override
+    public void onPreCreate(Context context, SQLiteDatabase db) {
+        super.onPreCreate(context, db);
+    }
+
+    @Override
+    public void onUpgrade(Context context, SQLiteDatabase db, int oldVersion, int newVersion) {
+        super.onUpgrade(context, db, oldVersion, newVersion);
+        Log.i("update", "KFZSDDSQLiteOpenHelper onUpgrade" +
+                " oldVersion: " + oldVersion + " |newVersion: " + newVersion);
+        for (int i = oldVersion + 1; i <= newVersion; i++) {
+            switch (i) {
+                case 2:
+                    upgradeToVersion2(db);
+                    break;
+                case 3:
+                    upgradeToVersion3(db);
+                    break;
+                default:
+                    // For test version update
+//                    upgradeToVersion3(db);
+                    Log.w("update", "KFZSDDSQLiteOpenHelper onUpgrade version default most for test, " +
+                            "or update data base error! oldVersion: " + oldVersion + " |want version: " + newVersion);
+                    break;
+            }
+        }
+    }
+
+    private void upgradeToVersion3(SQLiteDatabase db) {
+        String dropSessionTempTable = "DROP TABLE " + SessionColumns.TABLE_NAME + ";";
+        db.execSQL(dropSessionTempTable);
+        db.execSQL(KFZSDDSQLiteOpenHelper.SQL_CREATE_TABLE_SESSION);
+        db.execSQL(KFZSDDSQLiteOpenHelper.SQL_CREATE_INDEX_SESSION_ACCOUNT);
+        db.execSQL(KFZSDDSQLiteOpenHelper.SQL_CREATE_INDEX_SESSION_OPEN_ID);
+        Log.i("update", "KFZSDDSQLiteOpenHelper onUpgrade version 3 success!");
+    }
+
+    private void upgradeToVersion2(SQLiteDatabase db) {
+        db.execSQL(KFZSDDSQLiteOpenHelper.SQL_CREATE_TABLE_DOWNLOADTASK);
+        String updateIndexDownloadTask = "CREATE INDEX IF NOT EXISTS IDX_DOWNLOADTASK_CREATE_TIME "
+                + " ON " + DownloadtaskColumns.TABLE_NAME + " ( " + DownloadtaskColumns.CREATE_TIME + " );";
+        db.execSQL(updateIndexDownloadTask);
+        String sessionTableRename = "ALTER TABLE " + SessionColumns.TABLE_NAME + " RENAME TO " + SessionColumns.TABLE_NAME + "_temp ;";
+        db.execSQL(sessionTableRename);
+        db.execSQL(KFZSDDSQLiteOpenHelper.SQL_CREATE_TABLE_SESSION);
+        String insertTempSessionTableData = "INSERT INTO " + SessionColumns.TABLE_NAME
+                + " ("
+                + SessionColumns._ID + ", "
+                + SessionColumns.ACCOUNT + ", "
+                + SessionColumns.UPDATE_TIME + ", "
+                + SessionColumns.TOKEN + ", "
+                + SessionColumns.UID + ", "
+                + SessionColumns.HASH
+                + ")"
+                + " SELECT "
+                + SessionColumns._ID + ", "
+                + SessionColumns.ACCOUNT + ", "
+                + SessionColumns.UPDATE_TIME + ", "
+                + SessionColumns.TOKEN + ", "
+                + SessionColumns.UID + ", "
+                + SessionColumns.HASH
+                + " FROM " + SessionColumns.TABLE_NAME + "_temp ;";
+        db.execSQL(insertTempSessionTableData);
+        String dropSessionTempTable = "DROP TABLE " + SessionColumns.TABLE_NAME + "_temp ;";
+        db.execSQL(dropSessionTempTable);
+        String sessionIndexUpdate = "CREATE INDEX IF NOT EXISTS IDX_SESSION_OPEN_ID "
+                + " ON " + SessionColumns.TABLE_NAME + " ( " + SessionColumns.OPEN_ID + " );";
+        db.execSQL(sessionIndexUpdate);
+        Log.i("update", "KFZSDDSQLiteOpenHelper onUpgrade version 2 success!");
+    }
+}

+ 195 - 0
app/src/main/java/com/sheep/gamegroup/download/KFZSProvider.java

@@ -0,0 +1,195 @@
+package com.sheep.gamegroup.download;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.util.Log;
+
+import com.sheep.gamegroup.download.channel.ChannelDao;
+import com.sheep.gamegroup.download.channel.DaoMaster;
+import com.sheep.jiuyan.samllsheep.BuildConfig;
+
+import java.util.Arrays;
+
+/**
+ * @author kemllor
+ * @date 2017/6/13   2:03
+ **/
+
+public class KFZSProvider extends ContentProvider {
+    public static final String TAG = "KFZSProvider";
+    public static final String QUERY_NOTIFY = "QUERY_NOTIFY";
+    public static final String QUERY_GROUP_BY = "QUERY_GROUP_BY";
+    public static final String QUERY_HAVING = "QUERY_HAVING";
+    public static final String QUERY_LIMIT = "QUERY_LIMIT";
+
+
+    private static final String TYPE_CURSOR_ITEM = "vnd.android.cursor.item/";
+    private static final String TYPE_CURSOR_DIR = "vnd.android.cursor.dir/";
+    public static final String AUTHORITY = "com.kfzs.duanduan.data.graph.provider";
+    public static final String CONTENT_URI_BASE = "content://" + AUTHORITY;
+
+
+    private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
+
+    private static final int URI_TYPE_USER = 0;
+    private static final int URI_TYPE_USER_ID = 1;
+
+    private static final int URI_TYPE_DOWNLOADTASK = 2;
+    private static final int URI_TYPE_DOWNLOADTASK_ID = 3;
+    private static final int URI_TYPE_CHANNEL = 4;
+
+
+
+    private SQLiteDatabase mDatabase;
+
+
+    @Override
+    public boolean onCreate() {
+        DaoMaster.OpenHelper openHelper = new DaoMaster.DevOpenHelper(getContext(), "dd.db");
+        mDatabase = openHelper.getWritableDatabase();
+        return false;
+    }
+
+    @Nullable
+    @Override
+    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
+        if (BuildConfig.DEBUG) {
+            Log.d(TAG, "query uri=" + uri + " selection=" + selection + " selectionArgs=" + Arrays.toString(selectionArgs) + " sortOrder=" + sortOrder
+                    + " groupBy=" + uri.getQueryParameter(QUERY_GROUP_BY) + " having=" + uri.getQueryParameter(QUERY_HAVING) + " limit=" + uri.getQueryParameter(QUERY_LIMIT));
+        }
+        String groupBy = uri.getQueryParameter(QUERY_GROUP_BY);
+        String having = uri.getQueryParameter(QUERY_HAVING);
+        String limit = uri.getQueryParameter(QUERY_LIMIT);
+        QueryParams queryParams = getQueryParams(uri, selection, projection);
+        Cursor res = mDatabase.query(queryParams.table, projection, queryParams.selection, selectionArgs, groupBy,
+                having, sortOrder == null ? queryParams.orderBy : sortOrder, limit);
+        if (getContext() != null)
+            res.setNotificationUri(getContext().getContentResolver(), uri);
+        return res;
+    }
+
+    @Nullable
+    @Override
+    public String getType(@NonNull Uri uri) {
+        int match = URI_MATCHER.match(uri);
+        switch (match) {
+           /* case URI_TYPE_USER:
+                return TYPE_CURSOR_DIR + UserDao.TABLENAME;
+            case URI_TYPE_USER_ID:
+                return TYPE_CURSOR_ITEM + UserDao.TABLENAME;
+            case URI_TYPE_DOWNLOADTASK:
+                return TYPE_CURSOR_DIR + DownLoadInfoDao.TABLENAME;
+            case URI_TYPE_DOWNLOADTASK_ID:
+                return TYPE_CURSOR_ITEM + DownLoadInfoDao.TABLENAME;*/
+            case URI_TYPE_CHANNEL:
+                return TYPE_CURSOR_ITEM + ChannelDao.TABLENAME;
+        }
+        return null;
+    }
+
+    @Nullable
+    @Override
+    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
+        if (BuildConfig.DEBUG) {
+            Log.d(TAG, "insert uri=" + uri + " values=" + values);
+        }
+        String table = uri.getLastPathSegment();
+        long rowId = mDatabase.insert(table, null, values);
+        if (rowId == -1)
+            return null;
+        String notify;
+        if (((notify = uri.getQueryParameter(QUERY_NOTIFY)) == null || "true".equals(notify))) {
+            if (getContext() != null)
+                getContext().getContentResolver().notifyChange(uri, null);
+        }
+        return uri.buildUpon().appendEncodedPath(String.valueOf(rowId)).build();
+    }
+
+    @Override
+    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
+        if (BuildConfig.DEBUG) {
+            Log.d(TAG, "delete uri=" + uri + " selection=" + selection + " selectionArgs=" + Arrays.toString(selectionArgs));
+        }
+        QueryParams queryParams = getQueryParams(uri, selection, null);
+        int res = mDatabase.delete(queryParams.table, queryParams.selection, selectionArgs);
+        String notify;
+        if (res != 0 && ((notify = uri.getQueryParameter(QUERY_NOTIFY)) == null || "true".equals(notify))) {
+            if (getContext() != null)
+                getContext().getContentResolver().notifyChange(uri, null);
+        }
+        return res;
+    }
+
+    @Override
+    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
+        if (BuildConfig.DEBUG) {
+            Log.d(TAG, "update uri=" + uri + " values=" + values + " selection=" + selection + " selectionArgs=" + Arrays.toString(selectionArgs));
+        }
+
+        QueryParams queryParams = getQueryParams(uri, selection, null);
+        int res = mDatabase.update(queryParams.table, values, queryParams.selection, selectionArgs);
+        String notify;
+        if (res != 0 && ((notify = uri.getQueryParameter(QUERY_NOTIFY)) == null || "true".equals(notify))) {
+            if (getContext() != null)
+                getContext().getContentResolver().notifyChange(uri, null);
+        }
+        return res;
+    }
+
+    protected QueryParams getQueryParams(Uri uri, String selection, String[] projection) {
+        QueryParams res = new QueryParams();
+        int matchedId = URI_MATCHER.match(uri);
+        switch (matchedId) {
+          /*  case URI_TYPE_DOWNLOADTASK:
+            case URI_TYPE_DOWNLOADTASK_ID:
+                res.table = DownLoadInfoDao.TABLENAME;
+                res.idColumn = DownLoadInfoDao.Properties.MGameID.columnName;
+                break;
+            case URI_TYPE_USER:
+            case URI_TYPE_USER_ID:
+                res.table = UserDao.TABLENAME;
+                res.idColumn = UserDao.Properties.MUserId.columnName;
+                break;*/
+            case URI_TYPE_CHANNEL:
+                res.table = ChannelDao.TABLENAME;
+                res.idColumn = ChannelDao.Properties.MChannelName.columnName;
+                break;
+
+            default:
+                throw new IllegalArgumentException("The uri '" + uri + "' is not supported by this ContentProvider");
+        }
+
+       /* switch (matchedId) {
+            case URI_TYPE_DOWNLOADTASK_ID:
+            case URI_TYPE_USER_ID:
+                id = uri.getLastPathSegment();
+        }
+        if (id != null) {
+            if (selection != null) {
+                res.selection = res.table + "." + res.idColumn + "=" + id + " and (" + selection + ")";
+            } else {
+                res.selection = res.table + "." + res.idColumn + "=" + id;
+            }
+        } else {
+            res.selection = selection;
+        }*/
+
+        res.selection = selection;
+        return res;
+    }
+
+    public static class QueryParams {
+        public String table;
+        public String idColumn;
+        public String selection;
+        public String orderBy;
+    }
+
+
+}

+ 83 - 0
app/src/main/java/com/sheep/gamegroup/download/appdownload/AppdownloadBean.java

@@ -0,0 +1,83 @@
+package com.sheep.gamegroup.download.appdownload;
+
+import org.greenrobot.greendao.annotation.Entity;
+import org.greenrobot.greendao.annotation.Generated;
+import org.greenrobot.greendao.annotation.Id;
+import org.greenrobot.greendao.annotation.NotNull;
+import org.greenrobot.greendao.annotation.Unique;
+
+/**
+ * Created by Administrator on 2017/12/25.
+ */
+
+@Entity
+public class AppdownloadBean {
+    @Id
+    private Long mId;
+
+    private String name;
+    private String icon;
+    private String url;
+    @NotNull
+    @Unique
+    private String pkgName;
+    private String interfaceName;
+    private int staus = 0;//1下载成功,2安装成功
+    public int getStaus() {
+        return this.staus;
+    }
+    public void setStaus(int staus) {
+        this.staus = staus;
+    }
+    public String getInterfaceName() {
+        return this.interfaceName;
+    }
+    public void setInterfaceName(String interfaceName) {
+        this.interfaceName = interfaceName;
+    }
+    public String getPkgName() {
+        return this.pkgName;
+    }
+    public void setPkgName(String pkgName) {
+        this.pkgName = pkgName;
+    }
+    public String getUrl() {
+        return this.url;
+    }
+    public void setUrl(String url) {
+        this.url = url;
+    }
+    public String getIcon() {
+        return this.icon;
+    }
+    public void setIcon(String icon) {
+        this.icon = icon;
+    }
+    public String getName() {
+        return this.name;
+    }
+    public void setName(String name) {
+        this.name = name;
+    }
+    public Long getMId() {
+        return this.mId;
+    }
+    public void setMId(Long mId) {
+        this.mId = mId;
+    }
+    @Generated(hash = 1920276973)
+    public AppdownloadBean(Long mId, String name, String icon, String url,
+            @NotNull String pkgName, String interfaceName, int staus) {
+        this.mId = mId;
+        this.name = name;
+        this.icon = icon;
+        this.url = url;
+        this.pkgName = pkgName;
+        this.interfaceName = interfaceName;
+        this.staus = staus;
+    }
+    @Generated(hash = 1344994525)
+    public AppdownloadBean() {
+    }
+
+}

+ 184 - 0
app/src/main/java/com/sheep/gamegroup/download/appdownload/AppdownloadBeanDao.java

@@ -0,0 +1,184 @@
+package com.sheep.gamegroup.download.appdownload;
+
+import android.database.Cursor;
+import android.database.sqlite.SQLiteStatement;
+
+import com.sheep.gamegroup.download.channel.DaoSession;
+
+import org.greenrobot.greendao.AbstractDao;
+import org.greenrobot.greendao.Property;
+import org.greenrobot.greendao.database.Database;
+import org.greenrobot.greendao.database.DatabaseStatement;
+import org.greenrobot.greendao.internal.DaoConfig;
+
+// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
+
+/**
+ * DAO for table "APPDOWNLOAD_BEAN".
+*/
+public class AppdownloadBeanDao extends AbstractDao<AppdownloadBean, Long> {
+
+    public static final String TABLENAME = "APPDOWNLOAD_BEAN";
+
+    /**
+     * Properties of entity AppdownloadBean.<br/>
+     * Can be used for QueryBuilder and for referencing column names.
+     */
+    public static class Properties {
+        public final static Property MId = new Property(0, Long.class, "mId", true, "_id");
+        public final static Property Name = new Property(1, String.class, "name", false, "NAME");
+        public final static Property Icon = new Property(2, String.class, "icon", false, "ICON");
+        public final static Property Url = new Property(3, String.class, "url", false, "URL");
+        public final static Property PkgName = new Property(4, String.class, "pkgName", false, "PKG_NAME");
+        public final static Property InterfaceName = new Property(5, String.class, "interfaceName", false, "INTERFACE_NAME");
+        public final static Property Staus = new Property(6, int.class, "staus", false, "STAUS");
+    }
+
+
+    public AppdownloadBeanDao(DaoConfig config) {
+        super(config);
+    }
+    
+    public AppdownloadBeanDao(DaoConfig config, DaoSession daoSession) {
+        super(config, daoSession);
+    }
+
+    /** Creates the underlying database table. */
+    public static void createTable(Database db, boolean ifNotExists) {
+        String constraint = ifNotExists? "IF NOT EXISTS ": "";
+        db.execSQL("CREATE TABLE " + constraint + "\"APPDOWNLOAD_BEAN\" (" + //
+                "\"_id\" INTEGER PRIMARY KEY ," + // 0: mId
+                "\"NAME\" TEXT," + // 1: name
+                "\"ICON\" TEXT," + // 2: icon
+                "\"URL\" TEXT," + // 3: url
+                "\"PKG_NAME\" TEXT NOT NULL UNIQUE ," + // 4: pkgName
+                "\"INTERFACE_NAME\" TEXT," + // 5: interfaceName
+                "\"STAUS\" INTEGER NOT NULL );"); // 6: staus
+    }
+
+    /** Drops the underlying database table. */
+    public static void dropTable(Database db, boolean ifExists) {
+        String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"APPDOWNLOAD_BEAN\"";
+        db.execSQL(sql);
+    }
+
+    @Override
+    protected final void bindValues(DatabaseStatement stmt, AppdownloadBean entity) {
+        stmt.clearBindings();
+ 
+        Long mId = entity.getMId();
+        if (mId != null) {
+            stmt.bindLong(1, mId);
+        }
+ 
+        String name = entity.getName();
+        if (name != null) {
+            stmt.bindString(2, name);
+        }
+ 
+        String icon = entity.getIcon();
+        if (icon != null) {
+            stmt.bindString(3, icon);
+        }
+ 
+        String url = entity.getUrl();
+        if (url != null) {
+            stmt.bindString(4, url);
+        }
+        stmt.bindString(5, entity.getPkgName());
+ 
+        String interfaceName = entity.getInterfaceName();
+        if (interfaceName != null) {
+            stmt.bindString(6, interfaceName);
+        }
+        stmt.bindLong(7, entity.getStaus());
+    }
+
+    @Override
+    protected final void bindValues(SQLiteStatement stmt, AppdownloadBean entity) {
+        stmt.clearBindings();
+ 
+        Long mId = entity.getMId();
+        if (mId != null) {
+            stmt.bindLong(1, mId);
+        }
+ 
+        String name = entity.getName();
+        if (name != null) {
+            stmt.bindString(2, name);
+        }
+ 
+        String icon = entity.getIcon();
+        if (icon != null) {
+            stmt.bindString(3, icon);
+        }
+ 
+        String url = entity.getUrl();
+        if (url != null) {
+            stmt.bindString(4, url);
+        }
+        stmt.bindString(5, entity.getPkgName());
+ 
+        String interfaceName = entity.getInterfaceName();
+        if (interfaceName != null) {
+            stmt.bindString(6, interfaceName);
+        }
+        stmt.bindLong(7, entity.getStaus());
+    }
+
+    @Override
+    public Long readKey(Cursor cursor, int offset) {
+        return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0);
+    }    
+
+    @Override
+    public AppdownloadBean readEntity(Cursor cursor, int offset) {
+        AppdownloadBean entity = new AppdownloadBean( //
+            cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // mId
+            cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // name
+            cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // icon
+            cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // url
+            cursor.getString(offset + 4), // pkgName
+            cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5), // interfaceName
+            cursor.getInt(offset + 6) // staus
+        );
+        return entity;
+    }
+     
+    @Override
+    public void readEntity(Cursor cursor, AppdownloadBean entity, int offset) {
+        entity.setMId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0));
+        entity.setName(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1));
+        entity.setIcon(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2));
+        entity.setUrl(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3));
+        entity.setPkgName(cursor.getString(offset + 4));
+        entity.setInterfaceName(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5));
+        entity.setStaus(cursor.getInt(offset + 6));
+     }
+    
+    @Override
+    protected final Long updateKeyAfterInsert(AppdownloadBean entity, long rowId) {
+        entity.setMId(rowId);
+        return rowId;
+    }
+    
+    @Override
+    public Long getKey(AppdownloadBean entity) {
+        if(entity != null) {
+            return entity.getMId();
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public boolean hasKey(AppdownloadBean entity) {
+        return entity.getMId() != null;
+    }
+
+    @Override
+    protected final boolean isEntityUpdateable() {
+        return true;
+    }
+    
+}

+ 43 - 0
app/src/main/java/com/sheep/gamegroup/download/base/AbstractContentValues.java

@@ -0,0 +1,43 @@
+package com.sheep.gamegroup.download.base;
+
+// @formatter:off
+
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.net.Uri;
+
+@SuppressWarnings("unused")
+public abstract class AbstractContentValues {
+    protected final ContentValues mContentValues = new ContentValues();
+
+    /**
+     * Returns the {@code uri} argument to pass to the {@code ContentResolver} methods.
+     */
+    public abstract Uri uri();
+
+    /**
+     * Returns the {@code ContentValues} wrapped by this object.
+     */
+    public ContentValues values() {
+        return mContentValues;
+    }
+
+    /**
+     * Inserts a row into a table using the values stored by this object.
+     *
+     * @param contentResolver The content resolver to use.
+     */
+    public Uri insert(ContentResolver contentResolver) {
+        return contentResolver.insert(uri(), values());
+    }
+
+    /**
+     * Inserts a row into a table using the values stored by this object.
+     *
+     * @param context The context to use.
+     */
+    public Uri insert(Context context) {
+        return context.getContentResolver().insert(uri(), values());
+    }
+}

+ 78 - 0
app/src/main/java/com/sheep/gamegroup/download/base/AbstractCursor.java

@@ -0,0 +1,78 @@
+package com.sheep.gamegroup.download.base;
+
+// @formatter:off
+
+import android.database.Cursor;
+import android.database.CursorWrapper;
+
+import java.util.Date;
+import java.util.HashMap;
+
+@SuppressWarnings({"WeakerAccess", "unused"})
+public abstract class AbstractCursor extends CursorWrapper {
+    private final HashMap<String, Integer> mColumnIndexes;
+
+    public AbstractCursor(Cursor cursor) {
+        super(cursor);
+        mColumnIndexes = new HashMap<>(cursor.getColumnCount() * 4 / 3, .75f);
+    }
+
+    public abstract long getId();
+
+    protected int getCachedColumnIndexOrThrow(String colName) {
+        Integer index = mColumnIndexes.get(colName);
+        if (index == null) {
+            index = getColumnIndexOrThrow(colName);
+            mColumnIndexes.put(colName, index);
+        }
+        return index;
+    }
+
+    public String getStringOrNull(String colName) {
+        int index = getCachedColumnIndexOrThrow(colName);
+        if (isNull(index)) return null;
+        return getString(index);
+    }
+
+    public Integer getIntegerOrNull(String colName) {
+        int index = getCachedColumnIndexOrThrow(colName);
+        if (isNull(index)) return null;
+        return getInt(index);
+    }
+
+    public Long getLongOrNull(String colName) {
+        int index = getCachedColumnIndexOrThrow(colName);
+        if (isNull(index)) return null;
+        return getLong(index);
+    }
+
+    public Float getFloatOrNull(String colName) {
+        int index = getCachedColumnIndexOrThrow(colName);
+        if (isNull(index)) return null;
+        return getFloat(index);
+    }
+
+    public Double getDoubleOrNull(String colName) {
+        int index = getCachedColumnIndexOrThrow(colName);
+        if (isNull(index)) return null;
+        return getDouble(index);
+    }
+
+    public Boolean getBooleanOrNull(String colName) {
+        int index = getCachedColumnIndexOrThrow(colName);
+        if (isNull(index)) return null;
+        return getInt(index) != 0;
+    }
+
+    public Date getDateOrNull(String colName) {
+        int index = getCachedColumnIndexOrThrow(colName);
+        if (isNull(index)) return null;
+        return new Date(getLong(index));
+    }
+
+    public byte[] getBlobOrNull(String colName) {
+        int index = getCachedColumnIndexOrThrow(colName);
+        if (isNull(index)) return null;
+        return getBlob(index);
+    }
+}

+ 412 - 0
app/src/main/java/com/sheep/gamegroup/download/base/AbstractSelection.java

@@ -0,0 +1,412 @@
+package com.sheep.gamegroup.download.base;
+
+// @formatter:off
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.support.v4.content.CursorLoader;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@SuppressWarnings({"WeakerAccess", "unused"})
+public abstract class AbstractSelection<T extends AbstractSelection<?>> {
+    private static final String EQ = "=?";
+    private static final String PAREN_OPEN = "(";
+    private static final String PAREN_CLOSE = ")";
+    private static final String AND = " AND ";
+    private static final String OR = " OR ";
+    private static final String IS_NULL = " IS NULL";
+    private static final String IS_NOT_NULL = " IS NOT NULL";
+    private static final String IN = " IN (";
+    private static final String NOT_IN = " NOT IN (";
+    private static final String COMMA = ",";
+    private static final String GT = ">?";
+    private static final String LT = "<?";
+    private static final String GT_EQ = ">=?";
+    private static final String LT_EQ = "<=?";
+    private static final String NOT_EQ = "<>?";
+    private static final String LIKE = " LIKE ?";
+    private static final String CONTAINS = " LIKE '%' || ? || '%'";
+    private static final String STARTS = " LIKE ? || '%'";
+    private static final String ENDS = " LIKE '%' || ?";
+    private static final String COUNT = "COUNT(*)";
+    public static final String DESC = " DESC";
+
+    private final StringBuilder mSelection = new StringBuilder();
+    private final List<String> mSelectionArgs = new ArrayList<>(5);
+
+    private final StringBuilder mOrderBy = new StringBuilder();
+
+    private Boolean mNotify;
+    private String mGroupBy;
+    private String mHaving;
+    private Integer mLimit;
+
+    protected void addEquals(String column, Object[] value) {
+        mSelection.append(column);
+
+        if (value == null) {
+            // Single null value
+            mSelection.append(IS_NULL);
+        } else if (value.length > 1) {
+            // Multiple values ('in' clause)
+            mSelection.append(IN);
+            for (int i = 0; i < value.length; i++) {
+                mSelection.append("?");
+                if (i < value.length - 1) {
+                    mSelection.append(COMMA);
+                }
+                mSelectionArgs.add(valueOf(value[i]));
+            }
+            mSelection.append(PAREN_CLOSE);
+        } else {
+            // Single value
+            if (value[0] == null) {
+                // Single null value
+                mSelection.append(IS_NULL);
+            } else {
+                // Single not null value
+                mSelection.append(EQ);
+                mSelectionArgs.add(valueOf(value[0]));
+            }
+        }
+    }
+
+    protected void addNotEquals(String column, Object[] value) {
+        mSelection.append(column);
+
+        if (value == null) {
+            // Single null value
+            mSelection.append(IS_NOT_NULL);
+        } else if (value.length > 1) {
+            // Multiple values ('in' clause)
+            mSelection.append(NOT_IN);
+            for (int i = 0; i < value.length; i++) {
+                mSelection.append("?");
+                if (i < value.length - 1) {
+                    mSelection.append(COMMA);
+                }
+                mSelectionArgs.add(valueOf(value[i]));
+            }
+            mSelection.append(PAREN_CLOSE);
+        } else {
+            // Single value
+            if (value[0] == null) {
+                // Single null value
+                mSelection.append(IS_NOT_NULL);
+            } else {
+                // Single not null value
+                mSelection.append(NOT_EQ);
+                mSelectionArgs.add(valueOf(value[0]));
+            }
+        }
+    }
+
+    protected void addLike(String column, String[] values) {
+        mSelection.append(PAREN_OPEN);
+        for (int i = 0; i < values.length; i++) {
+            mSelection.append(column);
+            mSelection.append(LIKE);
+            mSelectionArgs.add(values[i]);
+            if (i < values.length - 1) {
+                mSelection.append(OR);
+            }
+        }
+        mSelection.append(PAREN_CLOSE);
+    }
+
+    protected void addContains(String column, String[] values) {
+        mSelection.append(PAREN_OPEN);
+        for (int i = 0; i < values.length; i++) {
+            mSelection.append(column);
+            mSelection.append(CONTAINS);
+            mSelectionArgs.add(values[i]);
+            if (i < values.length - 1) {
+                mSelection.append(OR);
+            }
+        }
+        mSelection.append(PAREN_CLOSE);
+    }
+
+    protected void addStartsWith(String column, String[] values) {
+        mSelection.append(PAREN_OPEN);
+        for (int i = 0; i < values.length; i++) {
+            mSelection.append(column);
+            mSelection.append(STARTS);
+            mSelectionArgs.add(values[i]);
+            if (i < values.length - 1) {
+                mSelection.append(OR);
+            }
+        }
+        mSelection.append(PAREN_CLOSE);
+    }
+
+    protected void addEndsWith(String column, String[] values) {
+        mSelection.append(PAREN_OPEN);
+        for (int i = 0; i < values.length; i++) {
+            mSelection.append(column);
+            mSelection.append(ENDS);
+            mSelectionArgs.add(values[i]);
+            if (i < values.length - 1) {
+                mSelection.append(OR);
+            }
+        }
+        mSelection.append(PAREN_CLOSE);
+    }
+
+    protected void addGreaterThan(String column, Object value) {
+        mSelection.append(column);
+        mSelection.append(GT);
+        mSelectionArgs.add(valueOf(value));
+    }
+
+    protected void addGreaterThanOrEquals(String column, Object value) {
+        mSelection.append(column);
+        mSelection.append(GT_EQ);
+        mSelectionArgs.add(valueOf(value));
+    }
+
+    protected void addLessThan(String column, Object value) {
+        mSelection.append(column);
+        mSelection.append(LT);
+        mSelectionArgs.add(valueOf(value));
+    }
+
+    protected void addLessThanOrEquals(String column, Object value) {
+        mSelection.append(column);
+        mSelection.append(LT_EQ);
+        mSelectionArgs.add(valueOf(value));
+    }
+
+    public void addRaw(String raw, Object... args) {
+        mSelection.append(" ");
+        mSelection.append(raw);
+        mSelection.append(" ");
+        for (Object arg : args) {
+            mSelectionArgs.add(valueOf(arg));
+        }
+    }
+
+    private String valueOf(Object obj) {
+        if (obj instanceof Date) {
+            return String.valueOf(((Date) obj).getTime());
+        } else if (obj instanceof Boolean) {
+            return (Boolean) obj ? "1" : "0";
+        } else if (obj instanceof Enum) {
+            return String.valueOf(((Enum<?>) obj).ordinal());
+        }
+        return String.valueOf(obj);
+    }
+
+    @SuppressWarnings("unchecked")
+    public T openParen() {
+        mSelection.append(PAREN_OPEN);
+        return (T) this;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T closeParen() {
+        mSelection.append(PAREN_CLOSE);
+        return (T) this;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T and() {
+        mSelection.append(AND);
+        return (T) this;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T or() {
+        mSelection.append(OR);
+        return (T) this;
+    }
+
+
+    protected Object[] toObjectArray(int... array) {
+        Object[] res = new Object[array.length];
+        for (int i = 0; i < array.length; i++) {
+            res[i] = array[i];
+        }
+        return res;
+    }
+
+    protected Object[] toObjectArray(long... array) {
+        Object[] res = new Object[array.length];
+        for (int i = 0; i < array.length; i++) {
+            res[i] = array[i];
+        }
+        return res;
+    }
+
+    protected Object[] toObjectArray(float... array) {
+        Object[] res = new Object[array.length];
+        for (int i = 0; i < array.length; i++) {
+            res[i] = array[i];
+        }
+        return res;
+    }
+
+    protected Object[] toObjectArray(double... array) {
+        Object[] res = new Object[array.length];
+        for (int i = 0; i < array.length; i++) {
+            res[i] = array[i];
+        }
+        return res;
+    }
+
+    protected Object[] toObjectArray(Boolean value) {
+        return new Object[] {value};
+    }
+
+
+    /**
+     * Returns the selection produced by this object.
+     */
+    public String sel() {
+        return mSelection.toString();
+    }
+
+    /**
+     * Returns the selection arguments produced by this object.
+     */
+    public String[] args() {
+        int size = mSelectionArgs.size();
+        if (size == 0) return null;
+        return mSelectionArgs.toArray(new String[size]);
+    }
+
+    /**
+     * Returns the order string produced by this object.
+     */
+    public String order() {
+        return mOrderBy.length() > 0 ? mOrderBy.toString() : null;
+    }
+
+    /**
+     * Returns the {@code uri} argument to pass to the {@code ContentResolver} methods.
+     */
+    public Uri uri() {
+        Uri uri = baseUri();
+        if (mNotify != null) uri = BaseContentProvider.notify(uri, mNotify);
+        if (mGroupBy != null) uri = BaseContentProvider.groupBy(uri, mGroupBy);
+        if (mHaving != null) uri = BaseContentProvider.having(uri, mHaving);
+        if (mLimit != null) uri = BaseContentProvider.limit(uri, String.valueOf(mLimit));
+        return uri;
+    }
+
+    protected abstract Uri baseUri();
+
+    /**
+     * Deletes row(s) specified by this selection.
+     *
+     * @param contentResolver The content resolver to use.
+     * @return The number of rows deleted.
+     */
+    public int delete(ContentResolver contentResolver) {
+        return contentResolver.delete(uri(), sel(), args());
+    }
+
+    /**
+     * Deletes row(s) specified by this selection.
+     *
+     * @param context The context to use.
+     * @return The number of rows deleted.
+     */
+    public int delete(Context context) {
+        return context.getContentResolver().delete(uri(), sel(), args());
+    }
+
+    @SuppressWarnings("unchecked")
+    public T notify(boolean notify) {
+        mNotify = notify;
+        return (T) this;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T groupBy(String groupBy) {
+        mGroupBy = groupBy;
+        return (T) this;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T having(String having) {
+        mHaving = having;
+        return (T) this;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T limit(int limit) {
+        mLimit = limit;
+        return (T) this;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T orderBy(String order, boolean desc) {
+        if (mOrderBy.length() > 0) mOrderBy.append(COMMA);
+        mOrderBy.append(order);
+        if (desc) mOrderBy.append(DESC);
+        return (T) this;
+    }
+
+    public T orderBy(String order) {
+        return orderBy(order, false);
+    }
+
+    @SuppressWarnings("unchecked")
+    public T orderBy(String... orders) {
+        for (String order : orders) {
+            orderBy(order, false);
+        }
+        return (T) this;
+    }
+
+    /**
+     * Returns the number of rows selected by this object.
+     *
+     * @param resolver The content resolver to use.
+     * @return The number of rows selected by this object.
+     */
+    public int count(ContentResolver resolver) {
+        Cursor cursor = resolver.query(uri(), new String[] {COUNT}, sel(), args(), null);
+        if (cursor == null) return 0;
+        try {
+            return cursor.moveToFirst() ? cursor.getInt(0) : 0;
+        } finally {
+            cursor.close();
+        }
+    }
+
+    /**
+     * Returns the number of rows selected by this object.
+     *
+     * @param context The context to use.
+     * @return The number of rows selected by this object.
+     */
+    public int count(Context context) {
+        return count(context.getContentResolver());
+    }
+
+    /**
+     * Returns a {@code CursorLoader} based on this selection.
+     *
+     * @param context The context to use.
+     * @param projection The projection to use.
+     * @return The CursorLoader.
+     */
+    public abstract CursorLoader getCursorLoader(Context context, String[] projection);
+
+    /**
+     * Returns a {@code CursorLoader} based on this selection, with a {@code null} (all columns) selection.
+     *
+     * @param context The context to use.
+     * @return The CursorLoader.
+     */
+    public CursorLoader getCursorLoader(Context context) {
+        return getCursorLoader(context, null);
+    }
+}

+ 199 - 0
app/src/main/java/com/sheep/gamegroup/download/base/BaseContentProvider.java

@@ -0,0 +1,199 @@
+package com.sheep.gamegroup.download.base;
+
+// @formatter:off
+
+import android.content.ContentProvider;
+import android.content.ContentProviderOperation;
+import android.content.ContentProviderResult;
+import android.content.ContentValues;
+import android.content.OperationApplicationException;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.net.Uri;
+import android.provider.BaseColumns;
+import android.support.annotation.NonNull;
+import android.util.Log;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashSet;
+
+@SuppressWarnings({"ConstantConditions", "unused"})
+public abstract class BaseContentProvider extends ContentProvider {
+    public static final String QUERY_NOTIFY = "QUERY_NOTIFY";
+    public static final String QUERY_GROUP_BY = "QUERY_GROUP_BY";
+    public static final String QUERY_HAVING = "QUERY_HAVING";
+    public static final String QUERY_LIMIT = "QUERY_LIMIT";
+
+    public static class QueryParams {
+        public String table;
+        public String tablesWithJoins;
+        public String idColumn;
+        public String selection;
+        public String orderBy;
+    }
+
+
+    protected abstract QueryParams getQueryParams(Uri uri, String selection, String[] projection);
+    protected abstract boolean hasDebug();
+
+    protected abstract SQLiteOpenHelper createSqLiteOpenHelper();
+
+    protected SQLiteOpenHelper mSqLiteOpenHelper;
+
+    @Override
+    public final boolean onCreate() {
+        if (hasDebug()) {
+            // Enable logging of SQL statements as they are executed.
+            try {
+                Class<?> sqliteDebugClass = Class.forName("android.database.sqlite.SQLiteDebug");
+                Field field = sqliteDebugClass.getDeclaredField("DEBUG_SQL_STATEMENTS");
+                field.setAccessible(true);
+                field.set(null, true);
+
+                // Uncomment the following block if you also want logging of execution time (more verbose)
+                // field = sqliteDebugClass.getDeclaredField("DEBUG_SQL_TIME");
+                // field.setAccessible(true);
+                // field.set(null, true);
+            } catch (Throwable t) {
+                if (hasDebug()) Log.w(getClass().getSimpleName(), "Could not enable SQLiteDebug logging", t);
+            }
+        }
+        mSqLiteOpenHelper = createSqLiteOpenHelper();
+        return false;
+    }
+
+
+    @Override
+    public Uri insert(@NonNull Uri uri, ContentValues values) {
+        String table = uri.getLastPathSegment();
+        long rowId = mSqLiteOpenHelper.getWritableDatabase().insertOrThrow(table, null, values);
+        if (rowId == -1) return null;
+        String notify;
+        if (((notify = uri.getQueryParameter(QUERY_NOTIFY)) == null || "true".equals(notify))) {
+            getContext().getContentResolver().notifyChange(uri, null);
+        }
+        return uri.buildUpon().appendEncodedPath(String.valueOf(rowId)).build();
+    }
+
+    @Override
+    public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) {
+        String table = uri.getLastPathSegment();
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        int res = 0;
+        db.beginTransaction();
+        try {
+            for (ContentValues v : values) {
+                long id = db.insert(table, null, v);
+                db.yieldIfContendedSafely();
+                if (id != -1) {
+                    res++;
+                }
+            }
+            db.setTransactionSuccessful();
+        } finally {
+            db.endTransaction();
+        }
+        String notify;
+        if (res != 0 && ((notify = uri.getQueryParameter(QUERY_NOTIFY)) == null || "true".equals(notify))) {
+            getContext().getContentResolver().notifyChange(uri, null);
+        }
+
+        return res;
+    }
+
+    @Override
+    public int update(@NonNull Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+        QueryParams queryParams = getQueryParams(uri, selection, null);
+        int res = mSqLiteOpenHelper.getWritableDatabase().update(queryParams.table, values, queryParams.selection, selectionArgs);
+        String notify;
+        if (res != 0 && ((notify = uri.getQueryParameter(QUERY_NOTIFY)) == null || "true".equals(notify))) {
+            getContext().getContentResolver().notifyChange(uri, null);
+        }
+        return res;
+    }
+
+    @Override
+    public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) {
+        QueryParams queryParams = getQueryParams(uri, selection, null);
+        int res = mSqLiteOpenHelper.getWritableDatabase().delete(queryParams.table, queryParams.selection, selectionArgs);
+        String notify;
+        if (res != 0 && ((notify = uri.getQueryParameter(QUERY_NOTIFY)) == null || "true".equals(notify))) {
+            getContext().getContentResolver().notifyChange(uri, null);
+        }
+        return res;
+    }
+
+    @Override
+    public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
+        String groupBy = uri.getQueryParameter(QUERY_GROUP_BY);
+        String having = uri.getQueryParameter(QUERY_HAVING);
+        String limit = uri.getQueryParameter(QUERY_LIMIT);
+        QueryParams queryParams = getQueryParams(uri, selection, projection);
+        projection = ensureIdIsFullyQualified(projection, queryParams.table, queryParams.idColumn);
+        Cursor res = mSqLiteOpenHelper.getReadableDatabase().query(queryParams.tablesWithJoins, projection, queryParams.selection, selectionArgs, groupBy,
+                having, sortOrder == null ? queryParams.orderBy : sortOrder, limit);
+        res.setNotificationUri(getContext().getContentResolver(), uri);
+        return res;
+    }
+
+    private String[] ensureIdIsFullyQualified(String[] projection, String tableName, String idColumn) {
+        if (projection == null) return null;
+        String[] res = new String[projection.length];
+        for (int i = 0; i < projection.length; i++) {
+            if (projection[i].equals(idColumn)) {
+                res[i] = tableName + "." + idColumn + " AS " + BaseColumns._ID;
+            } else {
+                res[i] = projection[i];
+            }
+        }
+        return res;
+    }
+
+    @Override
+    public @NonNull ContentProviderResult[] applyBatch(@NonNull ArrayList<ContentProviderOperation> operations) throws OperationApplicationException {
+        HashSet<Uri> urisToNotify = new HashSet<>(operations.size());
+        for (ContentProviderOperation operation : operations) {
+            urisToNotify.add(operation.getUri());
+        }
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        db.beginTransaction();
+        try {
+            int numOperations = operations.size();
+            ContentProviderResult[] results = new ContentProviderResult[numOperations];
+            int i = 0;
+            for (ContentProviderOperation operation : operations) {
+                results[i] = operation.apply(this, results, i);
+                if (operation.isYieldAllowed()) {
+                    db.yieldIfContendedSafely();
+                }
+                i++;
+            }
+            db.setTransactionSuccessful();
+            for (Uri uri : urisToNotify) {
+                getContext().getContentResolver().notifyChange(uri, null);
+            }
+            return results;
+        } finally {
+            db.endTransaction();
+        }
+    }
+
+
+    public static Uri notify(Uri uri, boolean notify) {
+        return uri.buildUpon().appendQueryParameter(QUERY_NOTIFY, String.valueOf(notify)).build();
+    }
+
+    public static Uri groupBy(Uri uri, String groupBy) {
+        return uri.buildUpon().appendQueryParameter(QUERY_GROUP_BY, groupBy).build();
+    }
+
+    public static Uri having(Uri uri, String having) {
+        return uri.buildUpon().appendQueryParameter(QUERY_HAVING, having).build();
+    }
+
+    public static Uri limit(Uri uri, String limit) {
+        return uri.buildUpon().appendQueryParameter(QUERY_LIMIT, limit).build();
+    }
+}

+ 5 - 0
app/src/main/java/com/sheep/gamegroup/download/base/BaseModel.java

@@ -0,0 +1,5 @@
+package com.sheep.gamegroup.download.base;
+
+// @formatter:off
+public interface BaseModel {
+}

+ 49 - 0
app/src/main/java/com/sheep/gamegroup/download/base/BaseSQLiteOpenHelperCallbacks.java

@@ -0,0 +1,49 @@
+package com.sheep.gamegroup.download.base;
+
+// @formatter:off
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.util.Log;
+
+import com.sheep.jiuyan.samllsheep.BuildConfig;
+
+
+/**
+ * Override this class to implement your custom database opening, creation or upgrade.
+ */
+public class BaseSQLiteOpenHelperCallbacks {
+    private static final String TAG = BaseSQLiteOpenHelperCallbacks.class.getSimpleName();
+
+    /**
+     * Called when the database has been opened.
+     * @see android.database.sqlite.SQLiteOpenHelper#onOpen(SQLiteDatabase) onOpen
+     */
+    public void onOpen(Context context, SQLiteDatabase db) {
+        if (BuildConfig.DEBUG) Log.d(TAG, "onOpen");
+    }
+
+    /**
+     * Called before the database tables are created.
+     * @see android.database.sqlite.SQLiteOpenHelper#onCreate(SQLiteDatabase) onCreate
+     */
+    public void onPreCreate(Context context, SQLiteDatabase db) {
+        if (BuildConfig.DEBUG) Log.d(TAG, "onPreCreate");
+    }
+
+    /**
+     * Called after the database tables have been created.
+     * @see android.database.sqlite.SQLiteOpenHelper#onCreate(SQLiteDatabase) onCreate
+     */
+    public void onPostCreate(Context context, SQLiteDatabase db) {
+        if (BuildConfig.DEBUG) Log.d(TAG, "onPostCreate");
+    }
+
+    /**
+     * Called when the database needs to be upgraded.
+     * @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(Context, SQLiteDatabase, int, int) onUpgrade
+     */
+    public void onUpgrade(final Context context, final SQLiteDatabase db, final int oldVersion, final int newVersion) {
+        if (BuildConfig.DEBUG) Log.d(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion);
+    }
+}

+ 2 - 2
datashare/src/main/java/com/kfzs/duanduan/data/graph/provider/channel/Channel.java

@@ -1,9 +1,9 @@
-package com.kfzs.duanduan.data.graph.provider.channel;
+package com.sheep.gamegroup.download.channel;
 
 import org.greenrobot.greendao.annotation.Entity;
+import org.greenrobot.greendao.annotation.Generated;
 import org.greenrobot.greendao.annotation.Id;
 import org.greenrobot.greendao.annotation.Property;
-import org.greenrobot.greendao.annotation.Generated;
 
 /**
  * 渠道

+ 4 - 3
datashare/src/main/java/com/kfzs/duanduan/data/graph/provider/channel/ChannelDao.java

@@ -1,16 +1,17 @@
-package com.kfzs.duanduan.data.graph.provider.channel;
+package com.sheep.gamegroup.download.channel;
 
 import android.database.Cursor;
 import android.database.sqlite.SQLiteStatement;
 
 import org.greenrobot.greendao.AbstractDao;
 import org.greenrobot.greendao.Property;
-import org.greenrobot.greendao.internal.DaoConfig;
 import org.greenrobot.greendao.database.Database;
 import org.greenrobot.greendao.database.DatabaseStatement;
+import org.greenrobot.greendao.internal.DaoConfig;
 
 // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
-/** 
+
+/**
  * DAO for table "CHANNEL".
 */
 public class ChannelDao extends AbstractDao<Channel, Long> {

+ 105 - 0
app/src/main/java/com/sheep/gamegroup/download/channel/DaoMaster.java

@@ -0,0 +1,105 @@
+package com.sheep.gamegroup.download.channel;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteDatabase.CursorFactory;
+import android.util.Log;
+
+import com.sheep.gamegroup.download.appdownload.AppdownloadBeanDao;
+import com.sheep.gamegroup.download.download.DownLoadInfoDao;
+
+import org.greenrobot.greendao.AbstractDaoMaster;
+import org.greenrobot.greendao.database.Database;
+import org.greenrobot.greendao.database.DatabaseOpenHelper;
+import org.greenrobot.greendao.database.StandardDatabase;
+import org.greenrobot.greendao.identityscope.IdentityScopeType;
+
+// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
+
+/**
+ * Master of DAO (schema version 10): knows all DAOs.
+ */
+public class DaoMaster extends AbstractDaoMaster {
+    public static final int SCHEMA_VERSION = 10;
+
+    /** Creates underlying database table using DAOs. */
+    public static void createAllTables(Database db, boolean ifNotExists) {
+        ChannelDao.createTable(db, ifNotExists);
+        AppdownloadBeanDao.createTable(db, ifNotExists);
+        DownLoadInfoDao.createTable(db, ifNotExists);
+    }
+
+    /** Drops underlying database table using DAOs. */
+    public static void dropAllTables(Database db, boolean ifExists) {
+        ChannelDao.dropTable(db, ifExists);
+        AppdownloadBeanDao.dropTable(db, ifExists);
+        DownLoadInfoDao.dropTable(db, ifExists);
+    }
+
+    /**
+     * WARNING: Drops all table on Upgrade! Use only during development.
+     * Convenience method using a {@link DevOpenHelper}.
+     */
+    public static DaoSession newDevSession(Context context, String name) {
+        Database db = new DevOpenHelper(context, name).getWritableDb();
+        DaoMaster daoMaster = new DaoMaster(db);
+        return daoMaster.newSession();
+    }
+
+    public DaoMaster(SQLiteDatabase db) {
+        this(new StandardDatabase(db));
+    }
+
+    public DaoMaster(Database db) {
+        super(db, SCHEMA_VERSION);
+        registerDaoClass(ChannelDao.class);
+        registerDaoClass(AppdownloadBeanDao.class);
+        registerDaoClass(DownLoadInfoDao.class);
+    }
+
+    public DaoSession newSession() {
+        return new DaoSession(db, IdentityScopeType.Session, daoConfigMap);
+    }
+
+    public DaoSession newSession(IdentityScopeType type) {
+        return new DaoSession(db, type, daoConfigMap);
+    }
+
+    /**
+     * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} -
+     */
+    public static abstract class OpenHelper extends DatabaseOpenHelper {
+        public OpenHelper(Context context, String name) {
+            super(context, name, SCHEMA_VERSION);
+        }
+
+        public OpenHelper(Context context, String name, CursorFactory factory) {
+            super(context, name, factory, SCHEMA_VERSION);
+        }
+
+        @Override
+        public void onCreate(Database db) {
+            Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);
+            createAllTables(db, false);
+        }
+    }
+
+    /** WARNING: Drops all table on Upgrade! Use only during development. */
+    public static class DevOpenHelper extends OpenHelper {
+        public DevOpenHelper(Context context, String name) {
+            super(context, name);
+        }
+
+        public DevOpenHelper(Context context, String name, CursorFactory factory) {
+            super(context, name, factory);
+        }
+
+        @Override
+        public void onUpgrade(Database db, int oldVersion, int newVersion) {
+            Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
+            dropAllTables(db, true);
+            onCreate(db);
+        }
+    }
+
+}

+ 73 - 0
app/src/main/java/com/sheep/gamegroup/download/channel/DaoSession.java

@@ -0,0 +1,73 @@
+package com.sheep.gamegroup.download.channel;
+
+import com.sheep.gamegroup.download.appdownload.AppdownloadBean;
+import com.sheep.gamegroup.download.appdownload.AppdownloadBeanDao;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
+import com.sheep.gamegroup.download.download.DownLoadInfoDao;
+
+import org.greenrobot.greendao.AbstractDao;
+import org.greenrobot.greendao.AbstractDaoSession;
+import org.greenrobot.greendao.database.Database;
+import org.greenrobot.greendao.identityscope.IdentityScopeType;
+import org.greenrobot.greendao.internal.DaoConfig;
+
+import java.util.Map;
+
+// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
+
+/**
+ * {@inheritDoc}
+ * 
+ * @see org.greenrobot.greendao.AbstractDaoSession
+ */
+public class DaoSession extends AbstractDaoSession {
+
+    private final DaoConfig channelDaoConfig;
+    private final DaoConfig appdownloadBeanDaoConfig;
+    private final DaoConfig downLoadInfoDaoConfig;
+
+    private final ChannelDao channelDao;
+    private final AppdownloadBeanDao appdownloadBeanDao;
+    private final DownLoadInfoDao downLoadInfoDao;
+
+    public DaoSession(Database db, IdentityScopeType type, Map<Class<? extends AbstractDao<?, ?>>, DaoConfig>
+            daoConfigMap) {
+        super(db);
+
+        channelDaoConfig = daoConfigMap.get(ChannelDao.class).clone();
+        channelDaoConfig.initIdentityScope(type);
+
+        appdownloadBeanDaoConfig = daoConfigMap.get(AppdownloadBeanDao.class).clone();
+        appdownloadBeanDaoConfig.initIdentityScope(type);
+
+        downLoadInfoDaoConfig = daoConfigMap.get(DownLoadInfoDao.class).clone();
+        downLoadInfoDaoConfig.initIdentityScope(type);
+
+        channelDao = new ChannelDao(channelDaoConfig, this);
+        appdownloadBeanDao = new AppdownloadBeanDao(appdownloadBeanDaoConfig, this);
+        downLoadInfoDao = new DownLoadInfoDao(downLoadInfoDaoConfig, this);
+
+        registerDao(Channel.class, channelDao);
+        registerDao(AppdownloadBean.class, appdownloadBeanDao);
+        registerDao(DownLoadInfo.class, downLoadInfoDao);
+    }
+    
+    public void clear() {
+        channelDaoConfig.clearIdentityScope();
+        appdownloadBeanDaoConfig.clearIdentityScope();
+        downLoadInfoDaoConfig.clearIdentityScope();
+    }
+
+    public ChannelDao getChannelDao() {
+        return channelDao;
+    }
+
+    public AppdownloadBeanDao getAppdownloadBeanDao() {
+        return appdownloadBeanDao;
+    }
+
+    public DownLoadInfoDao getDownLoadInfoDao() {
+        return downLoadInfoDao;
+    }
+
+}

+ 281 - 0
app/src/main/java/com/sheep/gamegroup/download/download/DownLoadInfo.java

@@ -0,0 +1,281 @@
+package com.sheep.gamegroup.download.download;
+
+import android.text.TextUtils;
+
+import org.greenrobot.greendao.annotation.Entity;
+import org.greenrobot.greendao.annotation.Id;
+import org.greenrobot.greendao.annotation.NotNull;
+import org.greenrobot.greendao.annotation.Property;
+import org.greenrobot.greendao.annotation.Unique;
+import org.greenrobot.greendao.annotation.Generated;
+
+import java.io.Serializable;
+
+/**
+ * download task info
+ *
+ * @author kemllor
+ * @date 2017/6/13   0:13
+ **/
+@Entity
+public class DownLoadInfo implements Serializable{
+
+    /**
+     * id
+     */
+    @Id(autoincrement = true)
+    private Long mId;
+    /**
+     * creat time
+     */
+    @Property(nameInDb = "creat_time")
+    private Long mCreateTime;
+
+    /**
+     * task id
+     */
+    @Property(nameInDb = "download_task_id")
+    private Integer mDownloadTaskId;
+
+    /**
+     * game name
+     */
+    @Property(nameInDb = "game_name")
+    private String mGameName;
+
+    /**
+     * icon url
+     */
+    @Property(nameInDb = "icon_url")
+    private String mIconUrl;
+
+    /**
+     * progress per
+     */
+    @Property(nameInDb = "percent")
+    private Integer mPercent;
+
+    /**
+     * game id
+     @Unique
+     */
+    @NotNull
+    @Property(nameInDb = "game_id")
+    private Integer mGameID;
+
+    /**
+     * download size
+     */
+    @Property(nameInDb = "download_size")
+    private Double mDownloadedSize;
+
+    /**
+     * total size
+     */
+    @Property(nameInDb = "total_size")
+    private Double mTotalSize;
+
+    /**
+     * status 0 init  1 fail 2 donwloading  3 finish  4 paused  5  delete
+     */
+    @Property(nameInDb = "status")
+    private Integer mStatus;
+
+    /**
+     * download url
+     */
+    @Unique
+    @Property(nameInDb = "download_url")
+    private String mDownloadUrl;
+
+
+    /**
+     * channel download url
+     */
+    @Unique
+    @Property(nameInDb = "channel_download_url")
+    private String mChannelDownloadUrl;
+
+    /**
+     * package_name
+     */
+    @Property(nameInDb = "package_name")
+    private String mPackageName;
+
+    /**
+     * version code
+     */
+    @Property(nameInDb = "version_code")
+    private Integer mVersionCode;
+
+    /**
+     * apk save path
+     */
+    @Property(nameInDb = "apk_path")
+    private String mApkPath;
+
+    /**
+     * where from
+     * 0:默认;1:任务模块来的
+     */
+    @Property(nameInDb = "where_from")
+    private int whereFrom;
+
+    public int getWhereFrom() {
+        return whereFrom;
+    }
+
+    public void setWhereFrom(int whereFrom) {
+        this.whereFrom = whereFrom;
+    }
+
+    public String getMApkPath() {
+        return this.mApkPath;
+    }
+
+    public void setMApkPath(String mApkPath) {
+        this.mApkPath = mApkPath;
+    }
+
+    public Integer getMVersionCode() {
+        return this.mVersionCode;
+    }
+
+    public void setMVersionCode(Integer mVersionCode) {
+        this.mVersionCode = mVersionCode;
+    }
+
+    public String getMPackageName() {
+        return TextUtils.isEmpty(this.mPackageName)?"":this.mPackageName;
+    }
+
+    public void setMPackageName(String mPackageName) {
+        this.mPackageName = mPackageName;
+    }
+
+    public String getMDownloadUrl() {
+        return this.mDownloadUrl;
+    }
+
+    public void setMDownloadUrl(String mDownloadUrl) {
+        this.mDownloadUrl = mDownloadUrl;
+    }
+
+    public Integer getMStatus() {
+        return this.mStatus == null ? 0 : this.mStatus;
+    }
+
+    public void setMStatus(Integer mStatus) {
+        this.mStatus = mStatus;
+    }
+
+    public Double getMTotalSize() {
+        return this.mTotalSize;
+    }
+
+    public void setMTotalSize(Double mTotalSize) {
+        this.mTotalSize = mTotalSize;
+    }
+
+    public Double getMDownloadedSize() {
+        return this.mDownloadedSize;
+    }
+
+    public void setMDownloadedSize(Double mDownloadedSize) {
+        this.mDownloadedSize = mDownloadedSize;
+    }
+
+    public Integer getMGameID() {
+        return this.mGameID;
+    }
+
+    public void setMGameID(Integer mGameID) {
+        this.mGameID = mGameID;
+    }
+
+    public Integer getMPercent() {
+        return this.mPercent;
+    }
+
+    public void setMPercent(Integer mPercent) {
+        this.mPercent = mPercent;
+    }
+
+    public String getMIconUrl() {
+        return this.mIconUrl;
+    }
+
+    public void setMIconUrl(String mIconUrl) {
+        this.mIconUrl = mIconUrl;
+    }
+
+    public String getMGameName() {
+        return this.mGameName;
+    }
+
+    public void setMGameName(String mGameName) {
+        this.mGameName = mGameName;
+    }
+
+    public Integer getMDownloadTaskId() {
+        return this.mDownloadTaskId;
+    }
+
+    public void setMDownloadTaskId(Integer mDownloadTaskId) {
+        this.mDownloadTaskId = mDownloadTaskId;
+    }
+
+    public Long getMCreateTime() {
+        return this.mCreateTime;
+    }
+
+    public void setMCreateTime(Long mCreateTime) {
+        this.mCreateTime = mCreateTime;
+    }
+
+    public Long getMId() {
+        return this.mId;
+    }
+
+    public void setMId(Long mId) {
+        this.mId = mId;
+    }
+
+    public String getMChannelDownloadUrl() {
+        return this.mChannelDownloadUrl;
+    }
+
+    public void setMChannelDownloadUrl(String mChannelDownloadUrl) {
+        this.mChannelDownloadUrl = mChannelDownloadUrl;
+    }
+
+    @Generated(hash = 1556387369)
+    public DownLoadInfo(Long mId, Long mCreateTime, Integer mDownloadTaskId,
+            String mGameName, String mIconUrl, Integer mPercent, @NotNull Integer mGameID,
+            Double mDownloadedSize, Double mTotalSize, Integer mStatus, String mDownloadUrl,
+            String mChannelDownloadUrl, String mPackageName, Integer mVersionCode,
+            String mApkPath, int whereFrom) {
+        this.mId = mId;
+        this.mCreateTime = mCreateTime;
+        this.mDownloadTaskId = mDownloadTaskId;
+        this.mGameName = mGameName;
+        this.mIconUrl = mIconUrl;
+        this.mPercent = mPercent;
+        this.mGameID = mGameID;
+        this.mDownloadedSize = mDownloadedSize;
+        this.mTotalSize = mTotalSize;
+        this.mStatus = mStatus;
+        this.mDownloadUrl = mDownloadUrl;
+        this.mChannelDownloadUrl = mChannelDownloadUrl;
+        this.mPackageName = mPackageName;
+        this.mVersionCode = mVersionCode;
+        this.mApkPath = mApkPath;
+        this.whereFrom = whereFrom;
+    }
+
+    @Generated(hash = 1743687477)
+    public DownLoadInfo() {
+    }
+
+
+}

+ 310 - 0
app/src/main/java/com/sheep/gamegroup/download/download/DownLoadInfoDao.java

@@ -0,0 +1,310 @@
+package com.sheep.gamegroup.download.download;
+
+import android.database.Cursor;
+import android.database.sqlite.SQLiteStatement;
+
+import com.sheep.gamegroup.download.channel.DaoSession;
+
+import org.greenrobot.greendao.AbstractDao;
+import org.greenrobot.greendao.Property;
+import org.greenrobot.greendao.internal.DaoConfig;
+import org.greenrobot.greendao.database.Database;
+import org.greenrobot.greendao.database.DatabaseStatement;
+
+
+// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
+/** 
+ * DAO for table "DOWN_LOAD_INFO".
+*/
+public class DownLoadInfoDao extends AbstractDao<DownLoadInfo, Long> {
+
+    public static final String TABLENAME = "DOWN_LOAD_INFO";
+
+    /**
+     * Properties of entity DownLoadInfo.<br/>
+     * Can be used for QueryBuilder and for referencing column names.
+     */
+    public static class Properties {
+        public final static Property MId = new Property(0, Long.class, "mId", true, "_id");
+        public final static Property MCreateTime = new Property(1, Long.class, "mCreateTime", false, "creat_time");
+        public final static Property MDownloadTaskId = new Property(2, Integer.class, "mDownloadTaskId", false, "download_task_id");
+        public final static Property MGameName = new Property(3, String.class, "mGameName", false, "game_name");
+        public final static Property MIconUrl = new Property(4, String.class, "mIconUrl", false, "icon_url");
+        public final static Property MPercent = new Property(5, Integer.class, "mPercent", false, "percent");
+        public final static Property MGameID = new Property(6, int.class, "mGameID", false, "game_id");
+        public final static Property MDownloadedSize = new Property(7, Double.class, "mDownloadedSize", false, "download_size");
+        public final static Property MTotalSize = new Property(8, Double.class, "mTotalSize", false, "total_size");
+        public final static Property MStatus = new Property(9, Integer.class, "mStatus", false, "status");
+        public final static Property MDownloadUrl = new Property(10, String.class, "mDownloadUrl", false, "download_url");
+        public final static Property MChannelDownloadUrl = new Property(11, String.class, "mChannelDownloadUrl", false, "channel_download_url");
+        public final static Property MPackageName = new Property(12, String.class, "mPackageName", false, "package_name");
+        public final static Property MVersionCode = new Property(13, Integer.class, "mVersionCode", false, "version_code");
+        public final static Property MApkPath = new Property(14, String.class, "mApkPath", false, "apk_path");
+        public final static Property WhereFrom = new Property(15, int.class, "whereFrom", false, "where_from");
+    }
+
+
+    public DownLoadInfoDao(DaoConfig config) {
+        super(config);
+    }
+    
+    public DownLoadInfoDao(DaoConfig config, DaoSession daoSession) {
+        super(config, daoSession);
+    }
+
+    /** Creates the underlying database table. */
+    public static void createTable(Database db, boolean ifNotExists) {
+        String constraint = ifNotExists? "IF NOT EXISTS ": "";
+        db.execSQL("CREATE TABLE " + constraint + "\"DOWN_LOAD_INFO\" (" + //
+                "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: mId
+                "\"creat_time\" INTEGER," + // 1: mCreateTime
+                "\"download_task_id\" INTEGER," + // 2: mDownloadTaskId
+                "\"game_name\" TEXT," + // 3: mGameName
+                "\"icon_url\" TEXT," + // 4: mIconUrl
+                "\"percent\" INTEGER," + // 5: mPercent
+                "\"game_id\" INTEGER NOT NULL ," + // 6: mGameID
+                "\"download_size\" REAL," + // 7: mDownloadedSize
+                "\"total_size\" REAL," + // 8: mTotalSize
+                "\"status\" INTEGER," + // 9: mStatus
+                "\"download_url\" TEXT UNIQUE ," + // 10: mDownloadUrl
+                "\"channel_download_url\" TEXT UNIQUE ," + // 11: mChannelDownloadUrl
+                "\"package_name\" TEXT," + // 12: mPackageName
+                "\"version_code\" INTEGER," + // 13: mVersionCode
+                "\"apk_path\" TEXT," + // 14: mApkPath
+                "\"where_from\" INTEGER NOT NULL );"); // 15: whereFrom
+    }
+
+    /** Drops the underlying database table. */
+    public static void dropTable(Database db, boolean ifExists) {
+        String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"DOWN_LOAD_INFO\"";
+        db.execSQL(sql);
+    }
+
+    @Override
+    protected final void bindValues(DatabaseStatement stmt, DownLoadInfo entity) {
+        stmt.clearBindings();
+ 
+        Long mId = entity.getMId();
+        if (mId != null) {
+            stmt.bindLong(1, mId);
+        }
+ 
+        Long mCreateTime = entity.getMCreateTime();
+        if (mCreateTime != null) {
+            stmt.bindLong(2, mCreateTime);
+        }
+ 
+        Integer mDownloadTaskId = entity.getMDownloadTaskId();
+        if (mDownloadTaskId != null) {
+            stmt.bindLong(3, mDownloadTaskId);
+        }
+ 
+        String mGameName = entity.getMGameName();
+        if (mGameName != null) {
+            stmt.bindString(4, mGameName);
+        }
+ 
+        String mIconUrl = entity.getMIconUrl();
+        if (mIconUrl != null) {
+            stmt.bindString(5, mIconUrl);
+        }
+ 
+        Integer mPercent = entity.getMPercent();
+        if (mPercent != null) {
+            stmt.bindLong(6, mPercent);
+        }
+        stmt.bindLong(7, entity.getMGameID());
+ 
+        Double mDownloadedSize = entity.getMDownloadedSize();
+        if (mDownloadedSize != null) {
+            stmt.bindDouble(8, mDownloadedSize);
+        }
+ 
+        Double mTotalSize = entity.getMTotalSize();
+        if (mTotalSize != null) {
+            stmt.bindDouble(9, mTotalSize);
+        }
+ 
+        Integer mStatus = entity.getMStatus();
+        if (mStatus != null) {
+            stmt.bindLong(10, mStatus);
+        }
+ 
+        String mDownloadUrl = entity.getMDownloadUrl();
+        if (mDownloadUrl != null) {
+            stmt.bindString(11, mDownloadUrl);
+        }
+ 
+        String mChannelDownloadUrl = entity.getMChannelDownloadUrl();
+        if (mChannelDownloadUrl != null) {
+            stmt.bindString(12, mChannelDownloadUrl);
+        }
+ 
+        String mPackageName = entity.getMPackageName();
+        if (mPackageName != null) {
+            stmt.bindString(13, mPackageName);
+        }
+ 
+        Integer mVersionCode = entity.getMVersionCode();
+        if (mVersionCode != null) {
+            stmt.bindLong(14, mVersionCode);
+        }
+ 
+        String mApkPath = entity.getMApkPath();
+        if (mApkPath != null) {
+            stmt.bindString(15, mApkPath);
+        }
+        stmt.bindLong(16, entity.getWhereFrom());
+    }
+
+    @Override
+    protected final void bindValues(SQLiteStatement stmt, DownLoadInfo entity) {
+        stmt.clearBindings();
+ 
+        Long mId = entity.getMId();
+        if (mId != null) {
+            stmt.bindLong(1, mId);
+        }
+ 
+        Long mCreateTime = entity.getMCreateTime();
+        if (mCreateTime != null) {
+            stmt.bindLong(2, mCreateTime);
+        }
+ 
+        Integer mDownloadTaskId = entity.getMDownloadTaskId();
+        if (mDownloadTaskId != null) {
+            stmt.bindLong(3, mDownloadTaskId);
+        }
+ 
+        String mGameName = entity.getMGameName();
+        if (mGameName != null) {
+            stmt.bindString(4, mGameName);
+        }
+ 
+        String mIconUrl = entity.getMIconUrl();
+        if (mIconUrl != null) {
+            stmt.bindString(5, mIconUrl);
+        }
+ 
+        Integer mPercent = entity.getMPercent();
+        if (mPercent != null) {
+            stmt.bindLong(6, mPercent);
+        }
+        stmt.bindLong(7, entity.getMGameID());
+ 
+        Double mDownloadedSize = entity.getMDownloadedSize();
+        if (mDownloadedSize != null) {
+            stmt.bindDouble(8, mDownloadedSize);
+        }
+ 
+        Double mTotalSize = entity.getMTotalSize();
+        if (mTotalSize != null) {
+            stmt.bindDouble(9, mTotalSize);
+        }
+ 
+        Integer mStatus = entity.getMStatus();
+        if (mStatus != null) {
+            stmt.bindLong(10, mStatus);
+        }
+ 
+        String mDownloadUrl = entity.getMDownloadUrl();
+        if (mDownloadUrl != null) {
+            stmt.bindString(11, mDownloadUrl);
+        }
+ 
+        String mChannelDownloadUrl = entity.getMChannelDownloadUrl();
+        if (mChannelDownloadUrl != null) {
+            stmt.bindString(12, mChannelDownloadUrl);
+        }
+ 
+        String mPackageName = entity.getMPackageName();
+        if (mPackageName != null) {
+            stmt.bindString(13, mPackageName);
+        }
+ 
+        Integer mVersionCode = entity.getMVersionCode();
+        if (mVersionCode != null) {
+            stmt.bindLong(14, mVersionCode);
+        }
+ 
+        String mApkPath = entity.getMApkPath();
+        if (mApkPath != null) {
+            stmt.bindString(15, mApkPath);
+        }
+        stmt.bindLong(16, entity.getWhereFrom());
+    }
+
+    @Override
+    public Long readKey(Cursor cursor, int offset) {
+        return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0);
+    }    
+
+    @Override
+    public DownLoadInfo readEntity(Cursor cursor, int offset) {
+        DownLoadInfo entity = new DownLoadInfo( //
+            cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // mId
+            cursor.isNull(offset + 1) ? null : cursor.getLong(offset + 1), // mCreateTime
+            cursor.isNull(offset + 2) ? null : cursor.getInt(offset + 2), // mDownloadTaskId
+            cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // mGameName
+            cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // mIconUrl
+            cursor.isNull(offset + 5) ? null : cursor.getInt(offset + 5), // mPercent
+            cursor.getInt(offset + 6), // mGameID
+            cursor.isNull(offset + 7) ? null : cursor.getDouble(offset + 7), // mDownloadedSize
+            cursor.isNull(offset + 8) ? null : cursor.getDouble(offset + 8), // mTotalSize
+            cursor.isNull(offset + 9) ? null : cursor.getInt(offset + 9), // mStatus
+            cursor.isNull(offset + 10) ? null : cursor.getString(offset + 10), // mDownloadUrl
+            cursor.isNull(offset + 11) ? null : cursor.getString(offset + 11), // mChannelDownloadUrl
+            cursor.isNull(offset + 12) ? null : cursor.getString(offset + 12), // mPackageName
+            cursor.isNull(offset + 13) ? null : cursor.getInt(offset + 13), // mVersionCode
+            cursor.isNull(offset + 14) ? null : cursor.getString(offset + 14), // mApkPath
+            cursor.getInt(offset + 15) // whereFrom
+        );
+        return entity;
+    }
+     
+    @Override
+    public void readEntity(Cursor cursor, DownLoadInfo entity, int offset) {
+        entity.setMId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0));
+        entity.setMCreateTime(cursor.isNull(offset + 1) ? null : cursor.getLong(offset + 1));
+        entity.setMDownloadTaskId(cursor.isNull(offset + 2) ? null : cursor.getInt(offset + 2));
+        entity.setMGameName(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3));
+        entity.setMIconUrl(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4));
+        entity.setMPercent(cursor.isNull(offset + 5) ? null : cursor.getInt(offset + 5));
+        entity.setMGameID(cursor.getInt(offset + 6));
+        entity.setMDownloadedSize(cursor.isNull(offset + 7) ? null : cursor.getDouble(offset + 7));
+        entity.setMTotalSize(cursor.isNull(offset + 8) ? null : cursor.getDouble(offset + 8));
+        entity.setMStatus(cursor.isNull(offset + 9) ? null : cursor.getInt(offset + 9));
+        entity.setMDownloadUrl(cursor.isNull(offset + 10) ? null : cursor.getString(offset + 10));
+        entity.setMChannelDownloadUrl(cursor.isNull(offset + 11) ? null : cursor.getString(offset + 11));
+        entity.setMPackageName(cursor.isNull(offset + 12) ? null : cursor.getString(offset + 12));
+        entity.setMVersionCode(cursor.isNull(offset + 13) ? null : cursor.getInt(offset + 13));
+        entity.setMApkPath(cursor.isNull(offset + 14) ? null : cursor.getString(offset + 14));
+        entity.setWhereFrom(cursor.getInt(offset + 15));
+     }
+    
+    @Override
+    protected final Long updateKeyAfterInsert(DownLoadInfo entity, long rowId) {
+        entity.setMId(rowId);
+        return rowId;
+    }
+    
+    @Override
+    public Long getKey(DownLoadInfo entity) {
+        if(entity != null) {
+            return entity.getMId();
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public boolean hasKey(DownLoadInfo entity) {
+        return entity.getMId() != null;
+    }
+
+    @Override
+    protected final boolean isEntityUpdateable() {
+        return true;
+    }
+    
+}

+ 500 - 0
app/src/main/java/com/sheep/gamegroup/download/downloadtask/DownloadtaskBean.java

@@ -0,0 +1,500 @@
+package com.sheep.gamegroup.download.downloadtask;
+
+// @formatter:off
+
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+/**
+ * A download_task info which is part of a team.
+ */
+@SuppressWarnings({"WeakerAccess", "unused", "ConstantConditions"})
+public class DownloadtaskBean implements DownloadtaskModel {
+    private long mId;
+    private long mCreateTime;
+    private Integer mDownloadTaskId;
+    private String mGameName;
+    private String mIconUrl;
+    private Integer mPercent;
+    private String mGameID;
+    private Double mDownloadedSize;
+    private Double mTotalSize;
+    private int mStatus;
+    private String mDownloadUrl;
+    private String mPackageName;
+    private int mVersionCode;
+    private String mApkPath;
+
+
+    /**
+     * game id
+     */
+    public String getmGameID() {
+        return mGameID;
+    }
+
+    /**
+     * update game id of this download_task
+     *
+     * @param mGameID
+     */
+    public void setmGameID(String mGameID) {
+        this.mGameID = mGameID;
+    }
+
+    /**
+     * Primary key.
+     */
+    @Override
+    public long getId() {
+        return mId;
+    }
+
+    /**
+     * Primary key.
+     */
+    public void setId(long id) {
+        mId = id;
+    }
+
+    /**
+     * update create_time of this download_task.
+     */
+    @Override
+    public long getCreateTime() {
+        return mCreateTime;
+    }
+
+    /**
+     * update create_time of this download_task.
+     */
+    public void setCreateTime(long createTime) {
+        mCreateTime = createTime;
+    }
+
+    /**
+     * download_task_id of this download_task.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public Integer getDownloadTaskId() {
+        return mDownloadTaskId;
+    }
+
+    /**
+     * download_task_id of this download_task.
+     * Can be {@code null}.
+     */
+    public void setDownloadTaskId(@Nullable Integer downloadTaskId) {
+        mDownloadTaskId = downloadTaskId;
+    }
+
+    /**
+     * game_name of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    @Override
+    public String getGameName() {
+        return mGameName;
+    }
+
+    /**
+     * game_name of this download_task.
+     * Must not be {@code null}.
+     */
+    public void setGameName(@NonNull String gameName) {
+        if (gameName == null)
+            throw new IllegalArgumentException("gameName must not be null");
+        mGameName = gameName;
+    }
+
+    /**
+     * icon_url of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    @Override
+    public String getIconUrl() {
+        return mIconUrl;
+    }
+
+    /**
+     * icon_url of this download_task.
+     * Must not be {@code null}.
+     */
+    public void setIconUrl(@NonNull String iconUrl) {
+        if (iconUrl == null)
+            throw new IllegalArgumentException("iconUrl must not be null");
+        mIconUrl = iconUrl;
+    }
+
+    /**
+     * percent of this download_task.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public Integer getPercent() {
+        return mPercent;
+    }
+
+    /**
+     * percent of this download_task.
+     * Can be {@code null}.
+     */
+    public void setPercent(@Nullable Integer percent) {
+        mPercent = percent;
+    }
+
+    /**
+     * downloaded_size of this download_task.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public Double getDownloadedSize() {
+        return mDownloadedSize;
+    }
+
+    /**
+     * downloaded_size of this download_task.
+     * Can be {@code null}.
+     */
+    public void setDownloadedSize(@Nullable Double downloadedSize) {
+        mDownloadedSize = downloadedSize;
+    }
+
+    /**
+     * total_size of this download_task.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public Double getTotalSize() {
+        return mTotalSize;
+    }
+
+    /**
+     * total_size of this download_task.
+     * Can be {@code null}.
+     */
+    public void setTotalSize(@Nullable Double totalSize) {
+        mTotalSize = totalSize;
+    }
+
+    /**
+     * status of this download_task.
+     */
+    @Override
+    public int getStatus() {
+        return mStatus;
+    }
+
+    /**
+     * status of this download_task.
+     */
+    public void setStatus(int status) {
+        mStatus = status;
+    }
+
+    /**
+     * download_url of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    @Override
+    public String getDownloadUrl() {
+        return mDownloadUrl;
+    }
+
+    /**
+     * download_url of this download_task.
+     * Must not be {@code null}.
+     */
+    public void setDownloadUrl(@NonNull String downloadUrl) {
+        if (downloadUrl == null)
+            throw new IllegalArgumentException("downloadUrl must not be null");
+        mDownloadUrl = downloadUrl;
+    }
+
+    /**
+     * package_name of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    @Override
+    public String getPackageName() {
+        return mPackageName;
+    }
+
+    /**
+     * package_name of this download_task.
+     * Must not be {@code null}.
+     */
+    public void setPackageName(@NonNull String packageName) {
+        if (packageName == null)
+            throw new IllegalArgumentException("packageName must not be null");
+        mPackageName = packageName;
+    }
+
+    /**
+     * version_code of this download_task.
+     */
+    @Override
+    public int getVersionCode() {
+        return mVersionCode;
+    }
+
+    /**
+     * version_code of this download_task.
+     */
+    public void setVersionCode(int versionCode) {
+        mVersionCode = versionCode;
+    }
+
+    /**
+     * apk_path of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    @Override
+    public String getApkPath() {
+        return mApkPath;
+    }
+
+    @NonNull
+    @Override
+    public String getGameId() {
+        return mGameID;
+    }
+
+    /**
+     * apk_path of this download_task.
+     * Must not be {@code null}.
+     */
+    public void setApkPath(@NonNull String apkPath) {
+        if (apkPath == null)
+            throw new IllegalArgumentException("apkPath must not be null");
+        mApkPath = apkPath;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+        DownloadtaskBean bean = (DownloadtaskBean) o;
+        return mId == bean.mId;
+    }
+
+    @Override
+    public int hashCode() {
+        return (int) (mId ^ (mId >>> 32));
+    }
+
+    /**
+     * Instantiate a new DownloadtaskBean with specified values.
+     */
+    @NonNull
+    public static DownloadtaskBean newInstance(long id, long createTime, @Nullable Integer downloadTaskId, @NonNull String gameName, @NonNull String iconUrl, @Nullable Integer percent, @Nullable Double downloadedSize, @Nullable Double totalSize, int status, @NonNull String downloadUrl, @NonNull String packageName, int versionCode, @NonNull String apkPath) {
+        if (gameName == null)
+            throw new IllegalArgumentException("gameName must not be null");
+        if (iconUrl == null)
+            throw new IllegalArgumentException("iconUrl must not be null");
+        if (downloadUrl == null)
+            throw new IllegalArgumentException("downloadUrl must not be null");
+        if (packageName == null)
+            throw new IllegalArgumentException("packageName must not be null");
+        if (apkPath == null)
+            throw new IllegalArgumentException("apkPath must not be null");
+        DownloadtaskBean res = new DownloadtaskBean();
+        res.mId = id;
+        res.mCreateTime = createTime;
+        res.mDownloadTaskId = downloadTaskId;
+        res.mGameName = gameName;
+        res.mIconUrl = iconUrl;
+        res.mPercent = percent;
+        res.mDownloadedSize = downloadedSize;
+        res.mTotalSize = totalSize;
+        res.mStatus = status;
+        res.mDownloadUrl = downloadUrl;
+        res.mPackageName = packageName;
+        res.mVersionCode = versionCode;
+        res.mApkPath = apkPath;
+        return res;
+    }
+
+    /**
+     * Instantiate a new DownloadtaskBean with all the values copied from the given model.
+     */
+    @NonNull
+    public static DownloadtaskBean copy(@NonNull DownloadtaskModel from) {
+        DownloadtaskBean res = new DownloadtaskBean();
+        res.mId = from.getId();
+        res.mCreateTime = from.getCreateTime();
+        res.mDownloadTaskId = from.getDownloadTaskId();
+        res.mGameName = from.getGameName();
+        res.mIconUrl = from.getIconUrl();
+        res.mPercent = from.getPercent();
+        res.mDownloadedSize = from.getDownloadedSize();
+        res.mTotalSize = from.getTotalSize();
+        res.mStatus = from.getStatus();
+        res.mDownloadUrl = from.getDownloadUrl();
+        res.mPackageName = from.getPackageName();
+        res.mVersionCode = from.getVersionCode();
+        res.mApkPath = from.getApkPath();
+        return res;
+    }
+
+    public static class Builder {
+        private DownloadtaskBean mRes = new DownloadtaskBean();
+
+        /**
+         * Primary key.
+         */
+        public Builder id(long id) {
+            mRes.mId = id;
+            return this;
+        }
+
+        /**
+         * update create_time of this download_task.
+         */
+        public Builder createTime(long createTime) {
+            mRes.mCreateTime = createTime;
+            return this;
+        }
+
+        /**
+         * download_task_id of this download_task.
+         * Can be {@code null}.
+         */
+        public Builder downloadTaskId(@Nullable Integer downloadTaskId) {
+            mRes.mDownloadTaskId = downloadTaskId;
+            return this;
+        }
+
+        /**
+         * game_name of this download_task.
+         * Must not be {@code null}.
+         */
+        public Builder gameName(@NonNull String gameName) {
+            if (gameName == null)
+                throw new IllegalArgumentException("gameName must not be null");
+            mRes.mGameName = gameName;
+            return this;
+        }
+
+        /**
+         * icon_url of this download_task.
+         * Must not be {@code null}.
+         */
+        public Builder iconUrl(@NonNull String iconUrl) {
+            if (iconUrl == null)
+                throw new IllegalArgumentException("iconUrl must not be null");
+            mRes.mIconUrl = iconUrl;
+            return this;
+        }
+
+        /**
+         * percent of this download_task.
+         * Can be {@code null}.
+         */
+        public Builder percent(@Nullable Integer percent) {
+            mRes.mPercent = percent;
+            return this;
+        }
+
+        /**
+         * downloaded_size of this download_task.
+         * Can be {@code null}.
+         */
+        public Builder downloadedSize(@Nullable Double downloadedSize) {
+            mRes.mDownloadedSize = downloadedSize;
+            return this;
+        }
+
+        /**
+         * total_size of this download_task.
+         * Can be {@code null}.
+         */
+        public Builder totalSize(@Nullable Double totalSize) {
+            mRes.mTotalSize = totalSize;
+            return this;
+        }
+
+        /**
+         * status of this download_task.
+         */
+        public Builder status(int status) {
+            mRes.mStatus = status;
+            return this;
+        }
+
+        /**
+         * download_url of this download_task.
+         * Must not be {@code null}.
+         */
+        public Builder downloadUrl(@NonNull String downloadUrl) {
+            if (downloadUrl == null)
+                throw new IllegalArgumentException("downloadUrl must not be null");
+            mRes.mDownloadUrl = downloadUrl;
+            return this;
+        }
+
+        /**
+         * package_name of this download_task.
+         * Must not be {@code null}.
+         */
+        public Builder packageName(@NonNull String packageName) {
+            if (packageName == null)
+                throw new IllegalArgumentException("packageName must not be null");
+            mRes.mPackageName = packageName;
+            return this;
+        }
+
+        /**
+         * version_code of this download_task.
+         */
+        public Builder versionCode(int versionCode) {
+            mRes.mVersionCode = versionCode;
+            return this;
+        }
+
+        /**
+         * apk_path of this download_task.
+         * Must not be {@code null}.
+         */
+        public Builder apkPath(@NonNull String apkPath) {
+            if (apkPath == null)
+                throw new IllegalArgumentException("apkPath must not be null");
+            mRes.mApkPath = apkPath;
+            return this;
+        }
+
+        /**
+         * Get a new DownloadtaskBean built with the given values.
+         */
+        public DownloadtaskBean build() {
+            if (mRes.mGameName == null)
+                throw new IllegalArgumentException("gameName must not be null");
+            if (mRes.mIconUrl == null)
+                throw new IllegalArgumentException("iconUrl must not be null");
+            if (mRes.mDownloadUrl == null)
+                throw new IllegalArgumentException("downloadUrl must not be null");
+            if (mRes.mPackageName == null)
+                throw new IllegalArgumentException("packageName must not be null");
+            if (mRes.mApkPath == null)
+                throw new IllegalArgumentException("apkPath must not be null");
+            return mRes;
+        }
+    }
+
+    public static Builder newBuilder() {
+        return new Builder();
+    }
+}

+ 126 - 0
app/src/main/java/com/sheep/gamegroup/download/downloadtask/DownloadtaskColumns.java

@@ -0,0 +1,126 @@
+package com.sheep.gamegroup.download.downloadtask;
+
+// @formatter:off
+import android.net.Uri;
+import android.provider.BaseColumns;
+
+import com.sheep.gamegroup.download.KFZSDDProvider;
+import com.sheep.gamegroup.download.base.AbstractSelection;
+
+/**
+ * A download_task info which is part of a team.
+ */
+@SuppressWarnings("unused")
+public class DownloadtaskColumns implements BaseColumns {
+    public static final String TABLE_NAME = "downloadtask";
+    public static final Uri CONTENT_URI = Uri.parse(KFZSDDProvider.CONTENT_URI_BASE + "/" + TABLE_NAME);
+
+    /**
+     * Primary key.
+     */
+    public static final String _ID = BaseColumns._ID;
+
+    /**
+     * update create_time of this download_task.
+     */
+    public static final String CREATE_TIME = "create_time";
+
+    /**
+     * download_task_id of this download_task.
+     */
+    public static final String DOWNLOAD_TASK_ID = "download_task_id";
+
+    /**
+     * game_name of this download_task.
+     */
+    public static final String GAME_NAME = "game_name";
+    /**
+     * game_id of this download_task.
+     */
+    public static final String GAME_ID = "game_id";
+
+    /**
+     * icon_url of this download_task.
+     */
+    public static final String ICON_URL = "icon_url";
+
+    /**
+     * percent of this download_task.
+     */
+    public static final String PERCENT = "percent";
+
+    /**
+     * downloaded_size of this download_task.
+     */
+    public static final String DOWNLOADED_SIZE = "downloaded_size";
+
+    /**
+     * total_size of this download_task.
+     */
+    public static final String TOTAL_SIZE = "total_size";
+
+    /**
+     * status of this download_task.
+     */
+    public static final String STATUS = "status";
+
+    /**
+     * download_url of this download_task.
+     */
+    public static final String DOWNLOAD_URL = "download_url";
+
+    /**
+     * package_name of this download_task.
+     */
+    public static final String PACKAGE_NAME = "package_name";
+
+    /**
+     * version_code of this download_task.
+     */
+    public static final String VERSION_CODE = "version_code";
+
+    /**
+     * apk_path of this download_task.
+     */
+    public static final String APK_PATH = "apk_path";
+
+
+    public static final String DEFAULT_ORDER = TABLE_NAME + "." + CREATE_TIME + AbstractSelection.DESC;
+
+    public static final String[] ALL_COLUMNS = new String[] {
+            _ID,
+            CREATE_TIME,
+            DOWNLOAD_TASK_ID,
+            GAME_NAME,
+            GAME_ID,
+            ICON_URL,
+            PERCENT,
+            DOWNLOADED_SIZE,
+            TOTAL_SIZE,
+            STATUS,
+            DOWNLOAD_URL,
+            PACKAGE_NAME,
+            VERSION_CODE,
+            APK_PATH
+    };
+
+    public static boolean hasColumns(String[] projection) {
+        if (projection == null) return true;
+        for (String c : projection) {
+            if (c.equals(CREATE_TIME) || c.contains("." + CREATE_TIME)) return true;
+            if (c.equals(DOWNLOAD_TASK_ID) || c.contains("." + DOWNLOAD_TASK_ID)) return true;
+            if (c.equals(GAME_NAME) || c.contains("." + GAME_NAME)) return true;
+            if (c.equals(ICON_URL) || c.contains("." + ICON_URL)) return true;
+            if (c.equals(PERCENT) || c.contains("." + PERCENT)) return true;
+            if (c.equals(DOWNLOADED_SIZE) || c.contains("." + DOWNLOADED_SIZE)) return true;
+            if (c.equals(TOTAL_SIZE) || c.contains("." + TOTAL_SIZE)) return true;
+            if (c.equals(STATUS) || c.contains("." + STATUS)) return true;
+            if (c.equals(DOWNLOAD_URL) || c.contains("." + DOWNLOAD_URL)) return true;
+            if (c.equals(PACKAGE_NAME) || c.contains("." + PACKAGE_NAME)) return true;
+            if (c.equals(VERSION_CODE) || c.contains("." + VERSION_CODE)) return true;
+            if (c.equals(APK_PATH) || c.contains("." + APK_PATH)) return true;
+        }
+        return false;
+    }
+
+}

+ 172 - 0
app/src/main/java/com/sheep/gamegroup/download/downloadtask/DownloadtaskContentValues.java

@@ -0,0 +1,172 @@
+package com.sheep.gamegroup.download.downloadtask;
+
+// @formatter:off
+import java.util.Date;
+
+import android.content.Context;
+import android.content.ContentResolver;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import com.sheep.gamegroup.download.base.AbstractContentValues;
+
+/**
+ * Content values wrapper for the {@code downloadtask} table.
+ */
+@SuppressWarnings({"ConstantConditions", "unused"})
+public class DownloadtaskContentValues extends AbstractContentValues {
+    @Override
+    public Uri uri() {
+        return DownloadtaskColumns.CONTENT_URI;
+    }
+
+    /**
+     * Update row(s) using the values stored by this object and the given selection.
+     *
+     * @param contentResolver The content resolver to use.
+     * @param where The selection to use (can be {@code null}).
+     */
+    public int update(ContentResolver contentResolver, @Nullable DownloadtaskSelection where) {
+        return contentResolver.update(uri(), values(), where == null ? null : where.sel(), where == null ? null : where.args());
+    }
+
+    /**
+     * Update row(s) using the values stored by this object and the given selection.
+     *
+     * @param context The context to use.
+     * @param where The selection to use (can be {@code null}).
+     */
+    public int update(Context context, @Nullable DownloadtaskSelection where) {
+        return context.getContentResolver().update(uri(), values(), where == null ? null : where.sel(), where == null ? null : where.args());
+    }
+
+    /**
+     * update create_time of this download_task.
+     */
+    public DownloadtaskContentValues putCreateTime(long value) {
+        mContentValues.put(DownloadtaskColumns.CREATE_TIME, value);
+        return this;
+    }
+
+
+    /**
+     * download_task_id of this download_task.
+     */
+    public DownloadtaskContentValues putDownloadTaskId(@Nullable Integer value) {
+        mContentValues.put(DownloadtaskColumns.DOWNLOAD_TASK_ID, value);
+        return this;
+    }
+
+    public DownloadtaskContentValues putDownloadTaskIdNull() {
+        mContentValues.putNull(DownloadtaskColumns.DOWNLOAD_TASK_ID);
+        return this;
+    }
+
+    /**
+     * game_name of this download_task.
+     */
+    public DownloadtaskContentValues putGameName(@NonNull String value) {
+        if (value == null) throw new IllegalArgumentException("gameName must not be null");
+        mContentValues.put(DownloadtaskColumns.GAME_NAME, value);
+        return this;
+    }
+
+
+    /**
+     * icon_url of this download_task.
+     */
+    public DownloadtaskContentValues putIconUrl(@NonNull String value) {
+        if (value == null) throw new IllegalArgumentException("iconUrl must not be null");
+        mContentValues.put(DownloadtaskColumns.ICON_URL, value);
+        return this;
+    }
+
+
+    /**
+     * percent of this download_task.
+     */
+    public DownloadtaskContentValues putPercent(@Nullable Integer value) {
+        mContentValues.put(DownloadtaskColumns.PERCENT, value);
+        return this;
+    }
+
+    public DownloadtaskContentValues putPercentNull() {
+        mContentValues.putNull(DownloadtaskColumns.PERCENT);
+        return this;
+    }
+
+    /**
+     * downloaded_size of this download_task.
+     */
+    public DownloadtaskContentValues putDownloadedSize(@Nullable Double value) {
+        mContentValues.put(DownloadtaskColumns.DOWNLOADED_SIZE, value);
+        return this;
+    }
+
+    public DownloadtaskContentValues putDownloadedSizeNull() {
+        mContentValues.putNull(DownloadtaskColumns.DOWNLOADED_SIZE);
+        return this;
+    }
+
+    /**
+     * total_size of this download_task.
+     */
+    public DownloadtaskContentValues putTotalSize(@Nullable Double value) {
+        mContentValues.put(DownloadtaskColumns.TOTAL_SIZE, value);
+        return this;
+    }
+
+    public DownloadtaskContentValues putTotalSizeNull() {
+        mContentValues.putNull(DownloadtaskColumns.TOTAL_SIZE);
+        return this;
+    }
+
+    /**
+     * status of this download_task.
+     */
+    public DownloadtaskContentValues putStatus(int value) {
+        mContentValues.put(DownloadtaskColumns.STATUS, value);
+        return this;
+    }
+
+
+    /**
+     * download_url of this download_task.
+     */
+    public DownloadtaskContentValues putDownloadUrl(@NonNull String value) {
+        if (value == null) throw new IllegalArgumentException("downloadUrl must not be null");
+        mContentValues.put(DownloadtaskColumns.DOWNLOAD_URL, value);
+        return this;
+    }
+
+
+    /**
+     * package_name of this download_task.
+     */
+    public DownloadtaskContentValues putPackageName(@NonNull String value) {
+        if (value == null) throw new IllegalArgumentException("packageName must not be null");
+        mContentValues.put(DownloadtaskColumns.PACKAGE_NAME, value);
+        return this;
+    }
+
+
+    /**
+     * version_code of this download_task.
+     */
+    public DownloadtaskContentValues putVersionCode(int value) {
+        mContentValues.put(DownloadtaskColumns.VERSION_CODE, value);
+        return this;
+    }
+
+
+    /**
+     * apk_path of this download_task.
+     */
+    public DownloadtaskContentValues putApkPath(@NonNull String value) {
+        if (value == null) throw new IllegalArgumentException("apkPath must not be null");
+        mContentValues.put(DownloadtaskColumns.APK_PATH, value);
+        return this;
+    }
+
+}

+ 186 - 0
app/src/main/java/com/sheep/gamegroup/download/downloadtask/DownloadtaskCursor.java

@@ -0,0 +1,186 @@
+package com.sheep.gamegroup.download.downloadtask;
+
+// @formatter:off
+
+import android.database.Cursor;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import com.sheep.gamegroup.download.base.AbstractCursor;
+import com.sheep.gamegroup.download.download.DownLoadInfoDao;
+
+/**
+ * Cursor wrapper for the {@code downloadtask} table.
+ */
+@SuppressWarnings({"WeakerAccess", "unused", "UnnecessaryLocalVariable"})
+public class DownloadtaskCursor extends AbstractCursor implements DownloadtaskModel {
+    public DownloadtaskCursor(Cursor cursor) {
+        super(cursor);
+    }
+
+    /**
+     * Primary key.
+     */
+    @Override
+    public long getId() {
+        Long res = getLongOrNull(DownLoadInfoDao.Properties.MId.columnName);
+        if (res == null)
+            throw new NullPointerException("The value of '_id' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+
+    /**
+     * update create_time of this download_task.
+     */
+    @Override
+    public long getCreateTime() {
+        Long res = getLongOrNull(DownLoadInfoDao.Properties.MCreateTime.columnName);
+        if (res == null)
+            throw new NullPointerException("The value of 'create_time' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+
+    /**
+     * download_task_id of this download_task.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public Integer getDownloadTaskId() {
+        Integer res = getIntegerOrNull(DownLoadInfoDao.Properties.MDownloadTaskId.columnName);
+        return res;
+    }
+
+    /**
+     * game_name of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    @Override
+    public String getGameName() {
+        String res = getStringOrNull(DownLoadInfoDao.Properties.MGameName.columnName);
+        if (res == null)
+            throw new NullPointerException("The value of 'game_name' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+
+    /**
+     * icon_url of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    @Override
+    public String getIconUrl() {
+        String res = getStringOrNull(DownLoadInfoDao.Properties.MIconUrl.columnName);
+        if (res == null)
+            throw new NullPointerException("The value of 'icon_url' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+
+    /**
+     * percent of this download_task.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public Integer getPercent() {
+        Integer res = getIntegerOrNull(DownLoadInfoDao.Properties.MPercent.columnName);
+        return res;
+    }
+
+    /**
+     * downloaded_size of this download_task.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public Double getDownloadedSize() {
+        Double res = getDoubleOrNull(DownLoadInfoDao.Properties.MDownloadedSize.columnName);
+        return res;
+    }
+
+    /**
+     * total_size of this download_task.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public Double getTotalSize() {
+        Double res = getDoubleOrNull(DownLoadInfoDao.Properties.MTotalSize.columnName);
+        return res;
+    }
+
+    /**
+     * status of this download_task.
+     */
+    @Override
+    public int getStatus() {
+        Integer res = getIntegerOrNull(DownLoadInfoDao.Properties.MStatus.columnName);
+        if (res == null)
+            throw new NullPointerException("The value of 'status' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+
+    /**
+     * download_url of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    @Override
+    public String getDownloadUrl() {
+        String res = getStringOrNull(DownLoadInfoDao.Properties.MDownloadUrl.columnName);
+        if (res == null)
+            throw new NullPointerException("The value of 'download_url' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+
+    /**
+     * package_name of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    @Override
+    public String getPackageName() {
+        String res = getStringOrNull(DownLoadInfoDao.Properties.MPackageName.columnName);
+        if (res == null)
+            throw new NullPointerException("The value of 'package_name' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+
+    /**
+     * version_code of this download_task.
+     */
+    @Override
+    public int getVersionCode() {
+        Integer res = getIntegerOrNull(DownLoadInfoDao.Properties.MVersionCode.columnName);
+        if (res == null)
+            throw new NullPointerException("The value of 'version_code' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+
+    /**
+     * apk_path of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    @Override
+    public String getApkPath() {
+        String res = getStringOrNull(DownLoadInfoDao.Properties.MApkPath.columnName);
+        if (res == null)
+            throw new NullPointerException("The value of 'apk_path' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+
+    /**
+     * apk_path of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    @Override
+    public String getGameId() {
+        String res = getStringOrNull(DownLoadInfoDao.Properties.MGameID.columnName);
+        if (res == null)
+            throw new NullPointerException("The value of 'game_id' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+}

+ 103 - 0
app/src/main/java/com/sheep/gamegroup/download/downloadtask/DownloadtaskModel.java

@@ -0,0 +1,103 @@
+package com.sheep.gamegroup.download.downloadtask;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import com.sheep.gamegroup.download.base.BaseModel;
+
+/**
+ * A download_task info which is part of a team.
+ */
+@SuppressWarnings({"WeakerAccess", "unused"})
+public interface DownloadtaskModel extends BaseModel {
+
+    /**
+     * Primary key.
+     */
+    long getId();
+
+    /**
+     * update create_time of this download_task.
+     */
+    long getCreateTime();
+
+    /**
+     * download_task_id of this download_task.
+     * Can be {@code null}.
+     */
+    @Nullable
+    Integer getDownloadTaskId();
+
+    /**
+     * game_name of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    String getGameName();
+
+    /**
+     * icon_url of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    String getIconUrl();
+
+    /**
+     * percent of this download_task.
+     * Can be {@code null}.
+     */
+    @Nullable
+    Integer getPercent();
+
+    /**
+     * downloaded_size of this download_task.
+     * Can be {@code null}.
+     */
+    @Nullable
+    Double getDownloadedSize();
+
+    /**
+     * total_size of this download_task.
+     * Can be {@code null}.
+     */
+    @Nullable
+    Double getTotalSize();
+
+    /**
+     * status of this download_task.
+     */
+    int getStatus();
+
+    /**
+     * download_url of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    String getDownloadUrl();
+
+    /**
+     * package_name of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    String getPackageName();
+
+    /**
+     * version_code of this download_task.
+     */
+    int getVersionCode();
+
+    /**
+     * apk_path of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    String getApkPath();
+
+    /**
+     * game_id of this download_task.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    String getGameId();
+}

+ 578 - 0
app/src/main/java/com/sheep/gamegroup/download/downloadtask/DownloadtaskSelection.java

@@ -0,0 +1,578 @@
+package com.sheep.gamegroup.download.downloadtask;
+
+// @formatter:off
+
+import android.content.Context;
+import android.content.ContentResolver;
+import android.database.Cursor;
+import android.net.Uri;
+import android.support.v4.content.CursorLoader;
+
+import com.sheep.gamegroup.download.KFZSProvider;
+import com.sheep.gamegroup.download.base.AbstractSelection;
+import com.sheep.gamegroup.download.download.DownLoadInfoDao;
+
+/**
+ * Selection for the {@code downloadtask} table.
+ */
+@SuppressWarnings({"unused", "WeakerAccess", "Recycle"})
+public class DownloadtaskSelection extends AbstractSelection<DownloadtaskSelection> {
+    @Override
+    protected Uri baseUri() {
+        return Uri.parse(KFZSProvider.CONTENT_URI_BASE+"/"+ DownLoadInfoDao.TABLENAME);
+    }
+
+    /**
+     * Query the given content resolver using this selection.
+     *
+     * @param contentResolver The content resolver to query.
+     * @param projection A list of which columns to return. Passing null will return all columns, which is inefficient.
+     * @return A {@code DownloadtaskCursor} object, which is positioned before the first entry, or null.
+     */
+    public DownloadtaskCursor query(ContentResolver contentResolver, String[] projection) {
+        Cursor cursor = contentResolver.query(uri(), projection, sel(), args(), order());
+        if (cursor == null) return null;
+        return new DownloadtaskCursor(cursor);
+    }
+
+    /**
+     * Equivalent of calling {@code query(contentResolver, null)}.
+     */
+    public DownloadtaskCursor query(ContentResolver contentResolver) {
+        return query(contentResolver, null);
+    }
+
+    /**
+     * Query the given content resolver using this selection.
+     *
+     * @param context The context to use for the query.
+     * @param projection A list of which columns to return. Passing null will return all columns, which is inefficient.
+     * @return A {@code DownloadtaskCursor} object, which is positioned before the first entry, or null.
+     */
+    public DownloadtaskCursor query(Context context, String[] projection) {
+        Cursor cursor = context.getContentResolver().query(uri(), projection, sel(), args(), order());
+        if (cursor == null) return null;
+        return new DownloadtaskCursor(cursor);
+    }
+
+    /**
+     * Equivalent of calling {@code query(context, null)}.
+     */
+    public DownloadtaskCursor query(Context context) {
+        return query(context, null);
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public CursorLoader getCursorLoader(Context context, String[] projection) {
+        return new CursorLoader(context, uri(), projection, sel(), args(), order()) {
+            @Override
+            public Cursor loadInBackground() {
+                return new DownloadtaskCursor(super.loadInBackground());
+            }
+        };
+    }
+
+
+    public DownloadtaskSelection id(long... value) {
+        addEquals("downloadtask." + DownloadtaskColumns._ID, toObjectArray(value));
+        return this;
+    }
+
+    public DownloadtaskSelection idNot(long... value) {
+        addNotEquals("downloadtask." + DownloadtaskColumns._ID, toObjectArray(value));
+        return this;
+    }
+
+    public DownloadtaskSelection orderById(boolean desc) {
+        orderBy("downloadtask." + DownloadtaskColumns._ID, desc);
+        return this;
+    }
+
+    public DownloadtaskSelection orderById() {
+        return orderById(false);
+    }
+
+    public DownloadtaskSelection createTime(long... value) {
+        addEquals(DownloadtaskColumns.CREATE_TIME, toObjectArray(value));
+        return this;
+    }
+
+    public DownloadtaskSelection createTimeNot(long... value) {
+        addNotEquals(DownloadtaskColumns.CREATE_TIME, toObjectArray(value));
+        return this;
+    }
+
+    public DownloadtaskSelection createTimeGt(long value) {
+        addGreaterThan(DownloadtaskColumns.CREATE_TIME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection createTimeGtEq(long value) {
+        addGreaterThanOrEquals(DownloadtaskColumns.CREATE_TIME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection createTimeLt(long value) {
+        addLessThan(DownloadtaskColumns.CREATE_TIME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection createTimeLtEq(long value) {
+        addLessThanOrEquals(DownloadtaskColumns.CREATE_TIME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByCreateTime(boolean desc) {
+        orderBy(DownloadtaskColumns.CREATE_TIME, desc);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByCreateTime() {
+        orderBy(DownloadtaskColumns.CREATE_TIME, false);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadTaskId(Integer... value) {
+        addEquals(DownloadtaskColumns.DOWNLOAD_TASK_ID, value);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadTaskIdNot(Integer... value) {
+        addNotEquals(DownloadtaskColumns.DOWNLOAD_TASK_ID, value);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadTaskIdGt(int value) {
+        addGreaterThan(DownloadtaskColumns.DOWNLOAD_TASK_ID, value);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadTaskIdGtEq(int value) {
+        addGreaterThanOrEquals(DownloadtaskColumns.DOWNLOAD_TASK_ID, value);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadTaskIdLt(int value) {
+        addLessThan(DownloadtaskColumns.DOWNLOAD_TASK_ID, value);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadTaskIdLtEq(int value) {
+        addLessThanOrEquals(DownloadtaskColumns.DOWNLOAD_TASK_ID, value);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByDownloadTaskId(boolean desc) {
+        orderBy(DownloadtaskColumns.DOWNLOAD_TASK_ID, desc);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByDownloadTaskId() {
+        orderBy(DownloadtaskColumns.DOWNLOAD_TASK_ID, false);
+        return this;
+    }
+
+    public DownloadtaskSelection gameName(String... value) {
+        addEquals(DownloadtaskColumns.GAME_NAME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection gameNameNot(String... value) {
+        addNotEquals(DownloadtaskColumns.GAME_NAME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection gameNameLike(String... value) {
+        addLike(DownloadtaskColumns.GAME_NAME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection gameNameContains(String... value) {
+        addContains(DownloadtaskColumns.GAME_NAME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection gameNameStartsWith(String... value) {
+        addStartsWith(DownloadtaskColumns.GAME_NAME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection gameNameEndsWith(String... value) {
+        addEndsWith(DownloadtaskColumns.GAME_NAME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByGameName(boolean desc) {
+        orderBy(DownloadtaskColumns.GAME_NAME, desc);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByGameName() {
+        orderBy(DownloadtaskColumns.GAME_NAME, false);
+        return this;
+    }
+
+    public DownloadtaskSelection iconUrl(String... value) {
+        addEquals(DownloadtaskColumns.ICON_URL, value);
+        return this;
+    }
+
+    public DownloadtaskSelection iconUrlNot(String... value) {
+        addNotEquals(DownloadtaskColumns.ICON_URL, value);
+        return this;
+    }
+
+    public DownloadtaskSelection iconUrlLike(String... value) {
+        addLike(DownloadtaskColumns.ICON_URL, value);
+        return this;
+    }
+
+    public DownloadtaskSelection iconUrlContains(String... value) {
+        addContains(DownloadtaskColumns.ICON_URL, value);
+        return this;
+    }
+
+    public DownloadtaskSelection iconUrlStartsWith(String... value) {
+        addStartsWith(DownloadtaskColumns.ICON_URL, value);
+        return this;
+    }
+
+    public DownloadtaskSelection iconUrlEndsWith(String... value) {
+        addEndsWith(DownloadtaskColumns.ICON_URL, value);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByIconUrl(boolean desc) {
+        orderBy(DownloadtaskColumns.ICON_URL, desc);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByIconUrl() {
+        orderBy(DownloadtaskColumns.ICON_URL, false);
+        return this;
+    }
+
+    public DownloadtaskSelection percent(Integer... value) {
+        addEquals(DownloadtaskColumns.PERCENT, value);
+        return this;
+    }
+
+    public DownloadtaskSelection percentNot(Integer... value) {
+        addNotEquals(DownloadtaskColumns.PERCENT, value);
+        return this;
+    }
+
+    public DownloadtaskSelection percentGt(int value) {
+        addGreaterThan(DownloadtaskColumns.PERCENT, value);
+        return this;
+    }
+
+    public DownloadtaskSelection percentGtEq(int value) {
+        addGreaterThanOrEquals(DownloadtaskColumns.PERCENT, value);
+        return this;
+    }
+
+    public DownloadtaskSelection percentLt(int value) {
+        addLessThan(DownloadtaskColumns.PERCENT, value);
+        return this;
+    }
+
+    public DownloadtaskSelection percentLtEq(int value) {
+        addLessThanOrEquals(DownloadtaskColumns.PERCENT, value);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByPercent(boolean desc) {
+        orderBy(DownloadtaskColumns.PERCENT, desc);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByPercent() {
+        orderBy(DownloadtaskColumns.PERCENT, false);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadedSize(Double... value) {
+        addEquals(DownloadtaskColumns.DOWNLOADED_SIZE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadedSizeNot(Double... value) {
+        addNotEquals(DownloadtaskColumns.DOWNLOADED_SIZE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadedSizeGt(double value) {
+        addGreaterThan(DownloadtaskColumns.DOWNLOADED_SIZE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadedSizeGtEq(double value) {
+        addGreaterThanOrEquals(DownloadtaskColumns.DOWNLOADED_SIZE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadedSizeLt(double value) {
+        addLessThan(DownloadtaskColumns.DOWNLOADED_SIZE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadedSizeLtEq(double value) {
+        addLessThanOrEquals(DownloadtaskColumns.DOWNLOADED_SIZE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByDownloadedSize(boolean desc) {
+        orderBy(DownloadtaskColumns.DOWNLOADED_SIZE, desc);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByDownloadedSize() {
+        orderBy(DownloadtaskColumns.DOWNLOADED_SIZE, false);
+        return this;
+    }
+
+    public DownloadtaskSelection totalSize(Double... value) {
+        addEquals(DownloadtaskColumns.TOTAL_SIZE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection totalSizeNot(Double... value) {
+        addNotEquals(DownloadtaskColumns.TOTAL_SIZE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection totalSizeGt(double value) {
+        addGreaterThan(DownloadtaskColumns.TOTAL_SIZE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection totalSizeGtEq(double value) {
+        addGreaterThanOrEquals(DownloadtaskColumns.TOTAL_SIZE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection totalSizeLt(double value) {
+        addLessThan(DownloadtaskColumns.TOTAL_SIZE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection totalSizeLtEq(double value) {
+        addLessThanOrEquals(DownloadtaskColumns.TOTAL_SIZE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByTotalSize(boolean desc) {
+        orderBy(DownloadtaskColumns.TOTAL_SIZE, desc);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByTotalSize() {
+        orderBy(DownloadtaskColumns.TOTAL_SIZE, false);
+        return this;
+    }
+
+    public DownloadtaskSelection status(int... value) {
+        addEquals(DownloadtaskColumns.STATUS, toObjectArray(value));
+        return this;
+    }
+
+    public DownloadtaskSelection statusNot(int... value) {
+        addNotEquals(DownloadtaskColumns.STATUS, toObjectArray(value));
+        return this;
+    }
+
+    public DownloadtaskSelection statusGt(int value) {
+        addGreaterThan(DownloadtaskColumns.STATUS, value);
+        return this;
+    }
+
+    public DownloadtaskSelection statusGtEq(int value) {
+        addGreaterThanOrEquals(DownloadtaskColumns.STATUS, value);
+        return this;
+    }
+
+    public DownloadtaskSelection statusLt(int value) {
+        addLessThan(DownloadtaskColumns.STATUS, value);
+        return this;
+    }
+
+    public DownloadtaskSelection statusLtEq(int value) {
+        addLessThanOrEquals(DownloadtaskColumns.STATUS, value);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByStatus(boolean desc) {
+        orderBy(DownloadtaskColumns.STATUS, desc);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByStatus() {
+        orderBy(DownloadtaskColumns.STATUS, false);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadUrl(String... value) {
+        addEquals(DownloadtaskColumns.DOWNLOAD_URL, value);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadUrlNot(String... value) {
+        addNotEquals(DownloadtaskColumns.DOWNLOAD_URL, value);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadUrlLike(String... value) {
+        addLike(DownloadtaskColumns.DOWNLOAD_URL, value);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadUrlContains(String... value) {
+        addContains(DownloadtaskColumns.DOWNLOAD_URL, value);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadUrlStartsWith(String... value) {
+        addStartsWith(DownloadtaskColumns.DOWNLOAD_URL, value);
+        return this;
+    }
+
+    public DownloadtaskSelection downloadUrlEndsWith(String... value) {
+        addEndsWith(DownloadtaskColumns.DOWNLOAD_URL, value);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByDownloadUrl(boolean desc) {
+        orderBy(DownloadtaskColumns.DOWNLOAD_URL, desc);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByDownloadUrl() {
+        orderBy(DownloadtaskColumns.DOWNLOAD_URL, false);
+        return this;
+    }
+
+    public DownloadtaskSelection packageName(String... value) {
+        addEquals(DownloadtaskColumns.PACKAGE_NAME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection packageNameNot(String... value) {
+        addNotEquals(DownloadtaskColumns.PACKAGE_NAME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection packageNameLike(String... value) {
+        addLike(DownloadtaskColumns.PACKAGE_NAME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection packageNameContains(String... value) {
+        addContains(DownloadtaskColumns.PACKAGE_NAME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection packageNameStartsWith(String... value) {
+        addStartsWith(DownloadtaskColumns.PACKAGE_NAME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection packageNameEndsWith(String... value) {
+        addEndsWith(DownloadtaskColumns.PACKAGE_NAME, value);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByPackageName(boolean desc) {
+        orderBy(DownloadtaskColumns.PACKAGE_NAME, desc);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByPackageName() {
+        orderBy(DownloadtaskColumns.PACKAGE_NAME, false);
+        return this;
+    }
+
+    public DownloadtaskSelection versionCode(int... value) {
+        addEquals(DownloadtaskColumns.VERSION_CODE, toObjectArray(value));
+        return this;
+    }
+
+    public DownloadtaskSelection versionCodeNot(int... value) {
+        addNotEquals(DownloadtaskColumns.VERSION_CODE, toObjectArray(value));
+        return this;
+    }
+
+    public DownloadtaskSelection versionCodeGt(int value) {
+        addGreaterThan(DownloadtaskColumns.VERSION_CODE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection versionCodeGtEq(int value) {
+        addGreaterThanOrEquals(DownloadtaskColumns.VERSION_CODE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection versionCodeLt(int value) {
+        addLessThan(DownloadtaskColumns.VERSION_CODE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection versionCodeLtEq(int value) {
+        addLessThanOrEquals(DownloadtaskColumns.VERSION_CODE, value);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByVersionCode(boolean desc) {
+        orderBy(DownloadtaskColumns.VERSION_CODE, desc);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByVersionCode() {
+        orderBy(DownloadtaskColumns.VERSION_CODE, false);
+        return this;
+    }
+
+    public DownloadtaskSelection apkPath(String... value) {
+        addEquals(DownloadtaskColumns.APK_PATH, value);
+        return this;
+    }
+
+    public DownloadtaskSelection apkPathNot(String... value) {
+        addNotEquals(DownloadtaskColumns.APK_PATH, value);
+        return this;
+    }
+
+    public DownloadtaskSelection apkPathLike(String... value) {
+        addLike(DownloadtaskColumns.APK_PATH, value);
+        return this;
+    }
+
+    public DownloadtaskSelection apkPathContains(String... value) {
+        addContains(DownloadtaskColumns.APK_PATH, value);
+        return this;
+    }
+
+    public DownloadtaskSelection apkPathStartsWith(String... value) {
+        addStartsWith(DownloadtaskColumns.APK_PATH, value);
+        return this;
+    }
+
+    public DownloadtaskSelection apkPathEndsWith(String... value) {
+        addEndsWith(DownloadtaskColumns.APK_PATH, value);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByApkPath(boolean desc) {
+        orderBy(DownloadtaskColumns.APK_PATH, desc);
+        return this;
+    }
+
+    public DownloadtaskSelection orderByApkPath() {
+        orderBy(DownloadtaskColumns.APK_PATH, false);
+        return this;
+    }
+}

+ 144 - 0
app/src/main/java/com/sheep/gamegroup/download/records/RecordsBean.java

@@ -0,0 +1,144 @@
+package com.sheep.gamegroup.download.records;
+
+// @formatter:off
+
+import android.support.annotation.NonNull;
+
+/**
+ * A records info which is part of a team.
+ */
+@SuppressWarnings({"WeakerAccess", "unused", "ConstantConditions"})
+public class RecordsBean implements RecordsModel {
+    private long mId;
+    private long mCreateTime;
+    private String mName;
+
+    /**
+     * Primary key.
+     */
+    @Override
+    public long getId() {
+        return mId;
+    }
+
+    /**
+     * Primary key.
+     */
+    public void setId(long id) {
+        mId = id;
+    }
+
+    /**
+     * update create_time of this records.
+     */
+    @Override
+    public long getCreateTime() {
+        return mCreateTime;
+    }
+
+    /**
+     * update create_time of this records.
+     */
+    public void setCreateTime(long createTime) {
+        mCreateTime = createTime;
+    }
+
+    /**
+     * name of this records.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    @Override
+    public String getName() {
+        return mName;
+    }
+
+    /**
+     * name of this records.
+     * Must not be {@code null}.
+     */
+    public void setName(@NonNull String name) {
+        if (name == null) throw new IllegalArgumentException("name must not be null");
+        mName = name;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        RecordsBean bean = (RecordsBean) o;
+        return mId == bean.mId;
+    }
+
+    @Override
+    public int hashCode() {
+        return (int) (mId ^ (mId >>> 32));
+    }
+
+    /**
+     * Instantiate a new RecordsBean with specified values.
+     */
+    @NonNull
+    public static RecordsBean newInstance(long id, long createTime, @NonNull String name) {
+        if (name == null) throw new IllegalArgumentException("name must not be null");
+        RecordsBean res = new RecordsBean();
+        res.mId = id;
+        res.mCreateTime = createTime;
+        res.mName = name;
+        return res;
+    }
+
+    /**
+     * Instantiate a new RecordsBean with all the values copied from the given model.
+     */
+    @NonNull
+    public static RecordsBean copy(@NonNull RecordsModel from) {
+        RecordsBean res = new RecordsBean();
+        res.mId = from.getId();
+        res.mCreateTime = from.getCreateTime();
+        res.mName = from.getName();
+        return res;
+    }
+
+    public static class Builder {
+        private RecordsBean mRes = new RecordsBean();
+
+        /**
+         * Primary key.
+         */
+        public Builder id(long id) {
+            mRes.mId = id;
+            return this;
+        }
+
+        /**
+         * update create_time of this records.
+         */
+        public Builder createTime(long createTime) {
+            mRes.mCreateTime = createTime;
+            return this;
+        }
+
+        /**
+         * name of this records.
+         * Must not be {@code null}.
+         */
+        public Builder name(@NonNull String name) {
+            if (name == null) throw new IllegalArgumentException("name must not be null");
+            mRes.mName = name;
+            return this;
+        }
+
+        /**
+         * Get a new RecordsBean built with the given values.
+         */
+        public RecordsBean build() {
+            if (mRes.mName == null) throw new IllegalArgumentException("name must not be null");
+            return mRes;
+        }
+    }
+
+    public static Builder newBuilder() {
+        return new Builder();
+    }
+}

+ 52 - 0
app/src/main/java/com/sheep/gamegroup/download/records/RecordsColumns.java

@@ -0,0 +1,52 @@
+package com.sheep.gamegroup.download.records;
+
+// @formatter:off
+
+import android.net.Uri;
+import android.provider.BaseColumns;
+
+import com.sheep.gamegroup.download.KFZSDDProvider;
+import com.sheep.gamegroup.download.base.AbstractSelection;
+
+/**
+ * A records info which is part of a team.
+ */
+@SuppressWarnings("unused")
+public class RecordsColumns implements BaseColumns {
+    public static final String TABLE_NAME = "records";
+    public static final Uri CONTENT_URI = Uri.parse(KFZSDDProvider.CONTENT_URI_BASE + "/" + TABLE_NAME);
+
+    /**
+     * Primary key.
+     */
+    public static final String _ID = BaseColumns._ID;
+
+    /**
+     * update create_time of this records.
+     */
+    public static final String CREATE_TIME = "create_time";
+
+    /**
+     * name of this records.
+     */
+    public static final String NAME = "name";
+
+
+    public static final String DEFAULT_ORDER = TABLE_NAME + "." + NAME + AbstractSelection.DESC;
+
+    public static final String[] ALL_COLUMNS = new String[] {
+            _ID,
+            CREATE_TIME,
+            NAME
+    };
+
+    public static boolean hasColumns(String[] projection) {
+        if (projection == null) return true;
+        for (String c : projection) {
+            if (c.equals(CREATE_TIME) || c.contains("." + CREATE_TIME)) return true;
+            if (c.equals(NAME) || c.contains("." + NAME)) return true;
+        }
+        return false;
+    }
+
+}

+ 61 - 0
app/src/main/java/com/sheep/gamegroup/download/records/RecordsContentValues.java

@@ -0,0 +1,61 @@
+package com.sheep.gamegroup.download.records;
+
+// @formatter:off
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import com.sheep.gamegroup.download.base.AbstractContentValues;
+
+/**
+ * Content values wrapper for the {@code records} table.
+ */
+@SuppressWarnings({"ConstantConditions", "unused"})
+public class RecordsContentValues extends AbstractContentValues {
+    @Override
+    public Uri uri() {
+        return RecordsColumns.CONTENT_URI;
+    }
+
+    /**
+     * Update row(s) using the values stored by this object and the given selection.
+     *
+     * @param contentResolver The content resolver to use.
+     * @param where The selection to use (can be {@code null}).
+     */
+    public int update(ContentResolver contentResolver, @Nullable RecordsSelection where) {
+        return contentResolver.update(uri(), values(), where == null ? null : where.sel(), where == null ? null : where.args());
+    }
+
+    /**
+     * Update row(s) using the values stored by this object and the given selection.
+     *
+     * @param context The context to use.
+     * @param where The selection to use (can be {@code null}).
+     */
+    public int update(Context context, @Nullable RecordsSelection where) {
+        return context.getContentResolver().update(uri(), values(), where == null ? null : where.sel(), where == null ? null : where.args());
+    }
+
+    /**
+     * update create_time of this records.
+     */
+    public RecordsContentValues putCreateTime(long value) {
+        mContentValues.put(RecordsColumns.CREATE_TIME, value);
+        return this;
+    }
+
+
+    /**
+     * name of this records.
+     */
+    public RecordsContentValues putName(@NonNull String value) {
+        if (value == null) throw new IllegalArgumentException("name must not be null");
+        mContentValues.put(RecordsColumns.NAME, value);
+        return this;
+    }
+
+}

+ 53 - 0
app/src/main/java/com/sheep/gamegroup/download/records/RecordsCursor.java

@@ -0,0 +1,53 @@
+package com.sheep.gamegroup.download.records;
+
+// @formatter:off
+
+import android.database.Cursor;
+import android.support.annotation.NonNull;
+
+import com.sheep.gamegroup.download.base.AbstractCursor;
+
+/**
+ * Cursor wrapper for the {@code records} table.
+ */
+@SuppressWarnings({"WeakerAccess", "unused", "UnnecessaryLocalVariable"})
+public class RecordsCursor extends AbstractCursor implements RecordsModel {
+    public RecordsCursor(Cursor cursor) {
+        super(cursor);
+    }
+
+    /**
+     * Primary key.
+     */
+    @Override
+    public long getId() {
+        Long res = getLongOrNull(RecordsColumns._ID);
+        if (res == null)
+            throw new NullPointerException("The value of '_id' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+
+    /**
+     * update create_time of this records.
+     */
+    @Override
+    public long getCreateTime() {
+        Long res = getLongOrNull(RecordsColumns.CREATE_TIME);
+        if (res == null)
+            throw new NullPointerException("The value of 'create_time' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+
+    /**
+     * name of this records.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    @Override
+    public String getName() {
+        String res = getStringOrNull(RecordsColumns.NAME);
+        if (res == null)
+            throw new NullPointerException("The value of 'name' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+}

+ 32 - 0
app/src/main/java/com/sheep/gamegroup/download/records/RecordsModel.java

@@ -0,0 +1,32 @@
+package com.sheep.gamegroup.download.records;
+
+// @formatter:off
+
+import android.support.annotation.NonNull;
+
+import com.sheep.gamegroup.download.base.BaseModel;
+
+
+/**
+ * A records info which is part of a team.
+ */
+@SuppressWarnings({"WeakerAccess", "unused"})
+public interface RecordsModel extends BaseModel {
+
+    /**
+     * Primary key.
+     */
+    long getId();
+
+    /**
+     * update create_time of this records.
+     */
+    long getCreateTime();
+
+    /**
+     * name of this records.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    String getName();
+}

+ 177 - 0
app/src/main/java/com/sheep/gamegroup/download/records/RecordsSelection.java

@@ -0,0 +1,177 @@
+package com.sheep.gamegroup.download.records;
+
+// @formatter:off
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.support.v4.content.CursorLoader;
+
+import com.sheep.gamegroup.download.base.AbstractSelection;
+
+
+/**
+ * Selection for the {@code records} table.
+ */
+@SuppressWarnings({"unused", "WeakerAccess", "Recycle"})
+public class RecordsSelection extends AbstractSelection<RecordsSelection> {
+    @Override
+    protected Uri baseUri() {
+        return RecordsColumns.CONTENT_URI;
+    }
+
+    /**
+     * Query the given content resolver using this selection.
+     *
+     * @param contentResolver The content resolver to query.
+     * @param projection A list of which columns to return. Passing null will return all columns, which is inefficient.
+     * @return A {@code RecordsCursor} object, which is positioned before the first entry, or null.
+     */
+    public RecordsCursor query(ContentResolver contentResolver, String[] projection) {
+        Cursor cursor = contentResolver.query(uri(), projection, sel(), args(), order());
+        if (cursor == null) return null;
+        return new RecordsCursor(cursor);
+    }
+
+    /**
+     * Equivalent of calling {@code query(contentResolver, null)}.
+     */
+    public RecordsCursor query(ContentResolver contentResolver) {
+        return query(contentResolver, null);
+    }
+
+    /**
+     * Query the given content resolver using this selection.
+     *
+     * @param context The context to use for the query.
+     * @param projection A list of which columns to return. Passing null will return all columns, which is inefficient.
+     * @return A {@code RecordsCursor} object, which is positioned before the first entry, or null.
+     */
+    public RecordsCursor query(Context context, String[] projection) {
+        Cursor cursor = context.getContentResolver().query(uri(), projection, sel(), args(), order());
+        if (cursor == null) return null;
+        return new RecordsCursor(cursor);
+    }
+
+    /**
+     * Equivalent of calling {@code query(context, null)}.
+     */
+    public RecordsCursor query(Context context) {
+        return query(context, null);
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public CursorLoader getCursorLoader(Context context, String[] projection) {
+        return new CursorLoader(context, uri(), projection, sel(), args(), order()) {
+            @Override
+            public Cursor loadInBackground() {
+                return new RecordsCursor(super.loadInBackground());
+            }
+        };
+    }
+
+
+    public RecordsSelection id(long... value) {
+        addEquals("records." + RecordsColumns._ID, toObjectArray(value));
+        return this;
+    }
+
+    public RecordsSelection idNot(long... value) {
+        addNotEquals("records." + RecordsColumns._ID, toObjectArray(value));
+        return this;
+    }
+
+    public RecordsSelection orderById(boolean desc) {
+        orderBy("records." + RecordsColumns._ID, desc);
+        return this;
+    }
+
+    public RecordsSelection orderById() {
+        return orderById(false);
+    }
+
+    public RecordsSelection createTime(long... value) {
+        addEquals(RecordsColumns.CREATE_TIME, toObjectArray(value));
+        return this;
+    }
+
+    public RecordsSelection createTimeNot(long... value) {
+        addNotEquals(RecordsColumns.CREATE_TIME, toObjectArray(value));
+        return this;
+    }
+
+    public RecordsSelection createTimeGt(long value) {
+        addGreaterThan(RecordsColumns.CREATE_TIME, value);
+        return this;
+    }
+
+    public RecordsSelection createTimeGtEq(long value) {
+        addGreaterThanOrEquals(RecordsColumns.CREATE_TIME, value);
+        return this;
+    }
+
+    public RecordsSelection createTimeLt(long value) {
+        addLessThan(RecordsColumns.CREATE_TIME, value);
+        return this;
+    }
+
+    public RecordsSelection createTimeLtEq(long value) {
+        addLessThanOrEquals(RecordsColumns.CREATE_TIME, value);
+        return this;
+    }
+
+    public RecordsSelection orderByCreateTime(boolean desc) {
+        orderBy(RecordsColumns.CREATE_TIME, desc);
+        return this;
+    }
+
+    public RecordsSelection orderByCreateTime() {
+        orderBy(RecordsColumns.CREATE_TIME, false);
+        return this;
+    }
+
+    public RecordsSelection name(String... value) {
+        addEquals(RecordsColumns.NAME, value);
+        return this;
+    }
+
+    public RecordsSelection nameNot(String... value) {
+        addNotEquals(RecordsColumns.NAME, value);
+        return this;
+    }
+
+    public RecordsSelection nameLike(String... value) {
+        addLike(RecordsColumns.NAME, value);
+        return this;
+    }
+
+    public RecordsSelection nameContains(String... value) {
+        addContains(RecordsColumns.NAME, value);
+        return this;
+    }
+
+    public RecordsSelection nameStartsWith(String... value) {
+        addStartsWith(RecordsColumns.NAME, value);
+        return this;
+    }
+
+    public RecordsSelection nameEndsWith(String... value) {
+        addEndsWith(RecordsColumns.NAME, value);
+        return this;
+    }
+
+    public RecordsSelection orderByName(boolean desc) {
+        orderBy(RecordsColumns.NAME, desc);
+        return this;
+    }
+
+    public RecordsSelection orderByName() {
+        orderBy(RecordsColumns.NAME, false);
+        return this;
+    }
+}

+ 275 - 0
app/src/main/java/com/sheep/gamegroup/download/session/SessionBean.java

@@ -0,0 +1,275 @@
+package com.sheep.gamegroup.download.session;
+
+// @formatter:off
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+/**
+ * A session info which is part of a team.
+ */
+@SuppressWarnings({"WeakerAccess", "unused", "ConstantConditions"})
+public class SessionBean implements SessionModel {
+    private long mId;
+    private String mAccount;
+    private String mOpenId;
+    private long mUpdateTime;
+    private String mToken;
+    private Integer mUid;
+    private Integer mHash;
+
+
+    public SessionBean() {
+    }
+
+    /**
+     * Primary key.
+     */
+    @Override
+    public long getId() {
+        return mId;
+    }
+
+    /**
+     * Primary key.
+     */
+    public void setId(long id) {
+        mId = id;
+    }
+
+    /**
+     * account of this session. For instance, John.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    @Override
+    public String getAccount() {
+        return mAccount;
+    }
+
+    /**
+     * account of this session. For instance, John.
+     * Must not be {@code null}.
+     */
+    public void setAccount(@NonNull String account) {
+        if (account == null)
+            throw new IllegalArgumentException("account must not be null");
+        mAccount = account;
+    }
+
+    /**
+     * open_id of this session. For instance, John.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public String getOpenId() {
+        return mOpenId;
+    }
+
+    /**
+     * open_id of this session. For instance, John.
+     * Can be {@code null}.
+     */
+    public void setOpenId(@Nullable String openId) {
+        mOpenId = openId;
+    }
+
+    /**
+     * update time of this session.
+     */
+    @Override
+    public long getUpdateTime() {
+        return mUpdateTime;
+    }
+
+    /**
+     * update time of this session.
+     */
+    public void setUpdateTime(long updateTime) {
+        mUpdateTime = updateTime;
+    }
+
+    /**
+     * token of this session.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public String getToken() {
+        return mToken;
+    }
+
+    /**
+     * token of this session.
+     * Can be {@code null}.
+     */
+    public void setToken(@Nullable String token) {
+        mToken = token;
+    }
+
+    /**
+     * uid at user of this session.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public Integer getUid() {
+        return mUid;
+    }
+
+    /**
+     * uid at user of this session.
+     * Can be {@code null}.
+     */
+    public void setUid(@Nullable Integer uid) {
+        mUid = uid;
+    }
+
+    /**
+     * data hash save of this session.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public Integer getHash() {
+        return mHash;
+    }
+
+    /**
+     * data hash save of this session.
+     * Can be {@code null}.
+     */
+    public void setHash(@Nullable Integer hash) {
+        mHash = hash;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+        SessionBean bean = (SessionBean) o;
+        return mId == bean.mId;
+    }
+
+    @Override
+    public int hashCode() {
+        return (int) (mId ^ (mId >>> 32));
+    }
+
+    /**
+     * Instantiate a new SessionBean with specified values.
+     */
+    @NonNull
+    public static SessionBean newInstance(long id, @NonNull String account, @Nullable String openId, long updateTime, @Nullable String token, @Nullable Integer uid, @Nullable Integer hash) {
+        if (account == null)
+            throw new IllegalArgumentException("account must not be null");
+        SessionBean res = new SessionBean();
+        res.mId = id;
+        res.mAccount = account;
+        res.mOpenId = openId;
+        res.mUpdateTime = updateTime;
+        res.mToken = token;
+        res.mUid = uid;
+        res.mHash = hash;
+        return res;
+    }
+
+    /**
+     * Instantiate a new SessionBean with all the values copied from the given model.
+     */
+    @NonNull
+    public static SessionBean copy(@NonNull SessionModel from) {
+        SessionBean res = new SessionBean();
+        res.mId = from.getId();
+        res.mAccount = from.getAccount();
+        res.mOpenId = from.getOpenId();
+        res.mUpdateTime = from.getUpdateTime();
+        res.mToken = from.getToken();
+        res.mUid = from.getUid();
+        res.mHash = from.getHash();
+        return res;
+    }
+
+    public static class Builder {
+        private SessionBean mRes = new SessionBean();
+
+        /**
+         * Primary key.
+         */
+        public Builder id(long id) {
+            mRes.mId = id;
+            return this;
+        }
+
+        /**
+         * account of this session. For instance, John.
+         * Must not be {@code null}.
+         */
+        public Builder account(@NonNull String account) {
+            if (account == null)
+                throw new IllegalArgumentException("account must not be null");
+            mRes.mAccount = account;
+            return this;
+        }
+
+        /**
+         * open_id of this session. For instance, John.
+         * Can be {@code null}.
+         */
+        public Builder openId(@Nullable String openId) {
+            mRes.mOpenId = openId;
+            return this;
+        }
+
+        /**
+         * update time of this session.
+         */
+        public Builder updateTime(long updateTime) {
+            mRes.mUpdateTime = updateTime;
+            return this;
+        }
+
+        /**
+         * token of this session.
+         * Can be {@code null}.
+         */
+        public Builder token(@Nullable String token) {
+            mRes.mToken = token;
+            return this;
+        }
+
+        /**
+         * uid at user of this session.
+         * Can be {@code null}.
+         */
+        public Builder uid(@Nullable Integer uid) {
+            mRes.mUid = uid;
+            return this;
+        }
+
+        /**
+         * data hash save of this session.
+         * Can be {@code null}.
+         */
+        public Builder hash(@Nullable Integer hash) {
+            mRes.mHash = hash;
+            return this;
+        }
+
+        /**
+         * Get a new SessionBean built with the given values.
+         */
+        public SessionBean build() {
+            if (mRes.mAccount == null)
+                throw new IllegalArgumentException("account must not be null");
+            return mRes;
+        }
+    }
+
+    public static Builder newBuilder() {
+        return new Builder();
+    }
+}

+ 80 - 0
app/src/main/java/com/sheep/gamegroup/download/session/SessionColumns.java

@@ -0,0 +1,80 @@
+package com.sheep.gamegroup.download.session;
+
+// @formatter:off
+
+import android.net.Uri;
+import android.provider.BaseColumns;
+
+import com.sheep.gamegroup.download.KFZSDDProvider;
+import com.sheep.gamegroup.download.base.AbstractSelection;
+
+/**
+ * A session info which is part of a team.
+ */
+@SuppressWarnings("unused")
+public class SessionColumns implements BaseColumns {
+    public static final String TABLE_NAME = "session";
+    public static final Uri CONTENT_URI = Uri.parse(KFZSDDProvider.CONTENT_URI_BASE + "/" + TABLE_NAME);
+
+    /**
+     * Primary key.
+     */
+    public static final String _ID = BaseColumns._ID;
+
+    /**
+     * account of this session. For instance, John.
+     */
+    public static final String ACCOUNT = "account";
+
+    /**
+     * open_id of this session. For instance, John.
+     */
+    public static final String OPEN_ID = "open_id";
+
+    /**
+     * update time of this session.
+     */
+    public static final String UPDATE_TIME = "update_time";
+
+    /**
+     * token of this session.
+     */
+    public static final String TOKEN = "token";
+
+    /**
+     * uid at user of this session.
+     */
+    public static final String UID = "uid";
+
+    /**
+     * data hash save of this session.
+     */
+    public static final String HASH = "hash";
+
+
+    public static final String DEFAULT_ORDER = TABLE_NAME + "." + ACCOUNT + AbstractSelection.DESC;
+
+    public static final String[] ALL_COLUMNS = new String[] {
+            _ID,
+            ACCOUNT,
+            OPEN_ID,
+            UPDATE_TIME,
+            TOKEN,
+            UID,
+            HASH
+    };
+
+    public static boolean hasColumns(String[] projection) {
+        if (projection == null) return true;
+        for (String c : projection) {
+            if (c.equals(ACCOUNT) || c.contains("." + ACCOUNT)) return true;
+            if (c.equals(OPEN_ID) || c.contains("." + OPEN_ID)) return true;
+            if (c.equals(UPDATE_TIME) || c.contains("." + UPDATE_TIME)) return true;
+            if (c.equals(TOKEN) || c.contains("." + TOKEN)) return true;
+            if (c.equals(UID) || c.contains("." + UID)) return true;
+            if (c.equals(HASH) || c.contains("." + HASH)) return true;
+        }
+        return false;
+    }
+
+}

+ 114 - 0
app/src/main/java/com/sheep/gamegroup/download/session/SessionContentValues.java

@@ -0,0 +1,114 @@
+package com.sheep.gamegroup.download.session;
+
+// @formatter:off
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import com.sheep.gamegroup.download.base.AbstractContentValues;
+
+
+/**
+ * Content values wrapper for the {@code session} table.
+ */
+@SuppressWarnings({"ConstantConditions", "unused"})
+public class SessionContentValues extends AbstractContentValues {
+    @Override
+    public Uri uri() {
+        return SessionColumns.CONTENT_URI;
+    }
+
+    /**
+     * Update row(s) using the values stored by this object and the given selection.
+     *
+     * @param contentResolver The content resolver to use.
+     * @param where The selection to use (can be {@code null}).
+     */
+    public int update(ContentResolver contentResolver, @Nullable SessionSelection where) {
+        return contentResolver.update(uri(), values(), where == null ? null : where.sel(), where == null ? null : where.args());
+    }
+
+    /**
+     * Update row(s) using the values stored by this object and the given selection.
+     *
+     * @param context The context to use.
+     * @param where The selection to use (can be {@code null}).
+     */
+    public int update(Context context, @Nullable SessionSelection where) {
+        return context.getContentResolver().update(uri(), values(), where == null ? null : where.sel(), where == null ? null : where.args());
+    }
+
+    /**
+     * account of this session. For instance, John.
+     */
+    public SessionContentValues putAccount(@NonNull String value) {
+        if (value == null) throw new IllegalArgumentException("account must not be null");
+        mContentValues.put(SessionColumns.ACCOUNT, value);
+        return this;
+    }
+
+
+    /**
+     * open_id of this session. For instance, John.
+     */
+    public SessionContentValues putOpenId(@Nullable String value) {
+        mContentValues.put(SessionColumns.OPEN_ID, value);
+        return this;
+    }
+
+    public SessionContentValues putOpenIdNull() {
+        mContentValues.putNull(SessionColumns.OPEN_ID);
+        return this;
+    }
+
+    /**
+     * update time of this session.
+     */
+    public SessionContentValues putUpdateTime(long value) {
+        mContentValues.put(SessionColumns.UPDATE_TIME, value);
+        return this;
+    }
+
+
+    /**
+     * token of this session.
+     */
+    public SessionContentValues putToken(@Nullable String value) {
+        mContentValues.put(SessionColumns.TOKEN, value);
+        return this;
+    }
+
+    public SessionContentValues putTokenNull() {
+        mContentValues.putNull(SessionColumns.TOKEN);
+        return this;
+    }
+
+    /**
+     * uid at user of this session.
+     */
+    public SessionContentValues putUid(@Nullable Integer value) {
+        mContentValues.put(SessionColumns.UID, value);
+        return this;
+    }
+
+    public SessionContentValues putUidNull() {
+        mContentValues.putNull(SessionColumns.UID);
+        return this;
+    }
+
+    /**
+     * data hash save of this session.
+     */
+    public SessionContentValues putHash(@Nullable Integer value) {
+        mContentValues.put(SessionColumns.HASH, value);
+        return this;
+    }
+
+    public SessionContentValues putHashNull() {
+        mContentValues.putNull(SessionColumns.HASH);
+        return this;
+    }
+}

+ 99 - 0
app/src/main/java/com/sheep/gamegroup/download/session/SessionCursor.java

@@ -0,0 +1,99 @@
+package com.sheep.gamegroup.download.session;
+
+// @formatter:off
+
+import android.database.Cursor;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import com.sheep.gamegroup.download.base.AbstractCursor;
+
+
+/**
+ * Cursor wrapper for the {@code session} table.
+ */
+@SuppressWarnings({"WeakerAccess", "unused", "UnnecessaryLocalVariable"})
+public class SessionCursor extends AbstractCursor implements SessionModel {
+    public SessionCursor(Cursor cursor) {
+        super(cursor);
+    }
+
+    /**
+     * Primary key.
+     */
+    @Override
+    public long getId() {
+        Long res = getLongOrNull(SessionColumns._ID);
+        if (res == null)
+            throw new NullPointerException("The value of '_id' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+
+    /**
+     * account of this session. For instance, John.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    @Override
+    public String getAccount() {
+        String res = getStringOrNull(SessionColumns.ACCOUNT);
+        if (res == null)
+            throw new NullPointerException("The value of 'account' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+
+    /**
+     * open_id of this session. For instance, John.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public String getOpenId() {
+        String res = getStringOrNull(SessionColumns.OPEN_ID);
+        return res;
+    }
+
+    /**
+     * update time of this session.
+     */
+    @Override
+    public long getUpdateTime() {
+        Long res = getLongOrNull(SessionColumns.UPDATE_TIME);
+        if (res == null)
+            throw new NullPointerException("The value of 'update_time' in the database was null, which is not allowed according to the model definition");
+        return res;
+    }
+
+    /**
+     * token of this session.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public String getToken() {
+        String res = getStringOrNull(SessionColumns.TOKEN);
+        return res;
+    }
+
+    /**
+     * uid at user of this session.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public Integer getUid() {
+        Integer res = getIntegerOrNull(SessionColumns.UID);
+        return res;
+    }
+
+    /**
+     * data hash save of this session.
+     * Can be {@code null}.
+     */
+    @Nullable
+    @Override
+    public Integer getHash() {
+        Integer res = getIntegerOrNull(SessionColumns.HASH);
+        return res;
+    }
+}

+ 60 - 0
app/src/main/java/com/sheep/gamegroup/download/session/SessionModel.java

@@ -0,0 +1,60 @@
+package com.sheep.gamegroup.download.session;
+
+// @formatter:off
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import com.sheep.gamegroup.download.base.BaseModel;
+
+/**
+ * A session info which is part of a team.
+ */
+@SuppressWarnings({"WeakerAccess", "unused"})
+public interface SessionModel extends BaseModel {
+
+    /**
+     * Primary key.
+     */
+    long getId();
+
+    /**
+     * account of this session. For instance, John.
+     * Cannot be {@code null}.
+     */
+    @NonNull
+    String getAccount();
+
+    /**
+     * open_id of this session. For instance, John.
+     * Can be {@code null}.
+     */
+    @Nullable
+    String getOpenId();
+
+    /**
+     * update time of this session.
+     */
+    long getUpdateTime();
+
+    /**
+     * token of this session.
+     * Can be {@code null}.
+     */
+    @Nullable
+    String getToken();
+
+    /**
+     * uid at user of this session.
+     * Can be {@code null}.
+     */
+    @Nullable
+    Integer getUid();
+
+    /**
+     * data hash save of this session.
+     * Can be {@code null}.
+     */
+    @Nullable
+    Integer getHash();
+}

+ 337 - 0
app/src/main/java/com/sheep/gamegroup/download/session/SessionSelection.java

@@ -0,0 +1,337 @@
+package com.sheep.gamegroup.download.session;
+
+// @formatter:off
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.support.v4.content.CursorLoader;
+
+import com.sheep.gamegroup.download.base.AbstractSelection;
+
+
+/**
+ * Selection for the {@code session} table.
+ */
+@SuppressWarnings({"unused", "WeakerAccess", "Recycle"})
+public class SessionSelection extends AbstractSelection<SessionSelection> {
+    @Override
+    protected Uri baseUri() {
+        return SessionColumns.CONTENT_URI;
+    }
+
+    /**
+     * Query the given content resolver using this selection.
+     *
+     * @param contentResolver The content resolver to query.
+     * @param projection A list of which columns to return. Passing null will return all columns, which is inefficient.
+     * @return A {@code SessionCursor} object, which is positioned before the first entry, or null.
+     */
+    public SessionCursor query(ContentResolver contentResolver, String[] projection) {
+        Cursor cursor = contentResolver.query(uri(), projection, sel(), args(), order());
+        if (cursor == null) return null;
+        return new SessionCursor(cursor);
+    }
+
+    /**
+     * Equivalent of calling {@code query(contentResolver, null)}.
+     */
+    public SessionCursor query(ContentResolver contentResolver) {
+        return query(contentResolver, null);
+    }
+
+    /**
+     * Query the given content resolver using this selection.
+     *
+     * @param context The context to use for the query.
+     * @param projection A list of which columns to return. Passing null will return all columns, which is inefficient.
+     * @return A {@code SessionCursor} object, which is positioned before the first entry, or null.
+     */
+    public SessionCursor query(Context context, String[] projection) {
+        Cursor cursor = context.getContentResolver().query(uri(), projection, sel(), args(), order());
+        if (cursor == null) return null;
+        return new SessionCursor(cursor);
+    }
+
+    /**
+     * Equivalent of calling {@code query(context, null)}.
+     */
+    public SessionCursor query(Context context) {
+        return query(context, null);
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public CursorLoader getCursorLoader(Context context, String[] projection) {
+        return new CursorLoader(context, uri(), projection, sel(), args(), order()) {
+            @Override
+            public Cursor loadInBackground() {
+                return new SessionCursor(super.loadInBackground());
+            }
+        };
+    }
+
+
+    public SessionSelection id(long... value) {
+        addEquals("session." + SessionColumns._ID, toObjectArray(value));
+        return this;
+    }
+
+    public SessionSelection idNot(long... value) {
+        addNotEquals("session." + SessionColumns._ID, toObjectArray(value));
+        return this;
+    }
+
+    public SessionSelection orderById(boolean desc) {
+        orderBy("session." + SessionColumns._ID, desc);
+        return this;
+    }
+
+    public SessionSelection orderById() {
+        return orderById(false);
+    }
+
+    public SessionSelection account(String... value) {
+        addEquals(SessionColumns.ACCOUNT, value);
+        return this;
+    }
+
+    public SessionSelection accountNot(String... value) {
+        addNotEquals(SessionColumns.ACCOUNT, value);
+        return this;
+    }
+
+    public SessionSelection accountLike(String... value) {
+        addLike(SessionColumns.ACCOUNT, value);
+        return this;
+    }
+
+    public SessionSelection accountContains(String... value) {
+        addContains(SessionColumns.ACCOUNT, value);
+        return this;
+    }
+
+    public SessionSelection accountStartsWith(String... value) {
+        addStartsWith(SessionColumns.ACCOUNT, value);
+        return this;
+    }
+
+    public SessionSelection accountEndsWith(String... value) {
+        addEndsWith(SessionColumns.ACCOUNT, value);
+        return this;
+    }
+
+    public SessionSelection orderByAccount(boolean desc) {
+        orderBy(SessionColumns.ACCOUNT, desc);
+        return this;
+    }
+
+    public SessionSelection orderByAccount() {
+        orderBy(SessionColumns.ACCOUNT, false);
+        return this;
+    }
+
+    public SessionSelection openId(String... value) {
+        addEquals(SessionColumns.OPEN_ID, value);
+        return this;
+    }
+
+    public SessionSelection openIdNot(String... value) {
+        addNotEquals(SessionColumns.OPEN_ID, value);
+        return this;
+    }
+
+    public SessionSelection openIdLike(String... value) {
+        addLike(SessionColumns.OPEN_ID, value);
+        return this;
+    }
+
+    public SessionSelection openIdContains(String... value) {
+        addContains(SessionColumns.OPEN_ID, value);
+        return this;
+    }
+
+    public SessionSelection openIdStartsWith(String... value) {
+        addStartsWith(SessionColumns.OPEN_ID, value);
+        return this;
+    }
+
+    public SessionSelection openIdEndsWith(String... value) {
+        addEndsWith(SessionColumns.OPEN_ID, value);
+        return this;
+    }
+
+    public SessionSelection orderByOpenId(boolean desc) {
+        orderBy(SessionColumns.OPEN_ID, desc);
+        return this;
+    }
+
+    public SessionSelection orderByOpenId() {
+        orderBy(SessionColumns.OPEN_ID, false);
+        return this;
+    }
+
+    public SessionSelection updateTime(long... value) {
+        addEquals(SessionColumns.UPDATE_TIME, toObjectArray(value));
+        return this;
+    }
+
+    public SessionSelection updateTimeNot(long... value) {
+        addNotEquals(SessionColumns.UPDATE_TIME, toObjectArray(value));
+        return this;
+    }
+
+    public SessionSelection updateTimeGt(long value) {
+        addGreaterThan(SessionColumns.UPDATE_TIME, value);
+        return this;
+    }
+
+    public SessionSelection updateTimeGtEq(long value) {
+        addGreaterThanOrEquals(SessionColumns.UPDATE_TIME, value);
+        return this;
+    }
+
+    public SessionSelection updateTimeLt(long value) {
+        addLessThan(SessionColumns.UPDATE_TIME, value);
+        return this;
+    }
+
+    public SessionSelection updateTimeLtEq(long value) {
+        addLessThanOrEquals(SessionColumns.UPDATE_TIME, value);
+        return this;
+    }
+
+    public SessionSelection orderByUpdateTime(boolean desc) {
+        orderBy(SessionColumns.UPDATE_TIME, desc);
+        return this;
+    }
+
+    public SessionSelection orderByUpdateTime() {
+        orderBy(SessionColumns.UPDATE_TIME, false);
+        return this;
+    }
+
+    public SessionSelection token(String... value) {
+        addEquals(SessionColumns.TOKEN, value);
+        return this;
+    }
+
+    public SessionSelection tokenNot(String... value) {
+        addNotEquals(SessionColumns.TOKEN, value);
+        return this;
+    }
+
+    public SessionSelection tokenLike(String... value) {
+        addLike(SessionColumns.TOKEN, value);
+        return this;
+    }
+
+    public SessionSelection tokenContains(String... value) {
+        addContains(SessionColumns.TOKEN, value);
+        return this;
+    }
+
+    public SessionSelection tokenStartsWith(String... value) {
+        addStartsWith(SessionColumns.TOKEN, value);
+        return this;
+    }
+
+    public SessionSelection tokenEndsWith(String... value) {
+        addEndsWith(SessionColumns.TOKEN, value);
+        return this;
+    }
+
+    public SessionSelection orderByToken(boolean desc) {
+        orderBy(SessionColumns.TOKEN, desc);
+        return this;
+    }
+
+    public SessionSelection orderByToken() {
+        orderBy(SessionColumns.TOKEN, false);
+        return this;
+    }
+
+    public SessionSelection uid(Integer... value) {
+        addEquals(SessionColumns.UID, value);
+        return this;
+    }
+
+    public SessionSelection uidNot(Integer... value) {
+        addNotEquals(SessionColumns.UID, value);
+        return this;
+    }
+
+    public SessionSelection uidGt(int value) {
+        addGreaterThan(SessionColumns.UID, value);
+        return this;
+    }
+
+    public SessionSelection uidGtEq(int value) {
+        addGreaterThanOrEquals(SessionColumns.UID, value);
+        return this;
+    }
+
+    public SessionSelection uidLt(int value) {
+        addLessThan(SessionColumns.UID, value);
+        return this;
+    }
+
+    public SessionSelection uidLtEq(int value) {
+        addLessThanOrEquals(SessionColumns.UID, value);
+        return this;
+    }
+
+    public SessionSelection orderByUid(boolean desc) {
+        orderBy(SessionColumns.UID, desc);
+        return this;
+    }
+
+    public SessionSelection orderByUid() {
+        orderBy(SessionColumns.UID, false);
+        return this;
+    }
+
+    public SessionSelection hash(Integer... value) {
+        addEquals(SessionColumns.HASH, value);
+        return this;
+    }
+
+    public SessionSelection hashNot(Integer... value) {
+        addNotEquals(SessionColumns.HASH, value);
+        return this;
+    }
+
+    public SessionSelection hashGt(int value) {
+        addGreaterThan(SessionColumns.HASH, value);
+        return this;
+    }
+
+    public SessionSelection hashGtEq(int value) {
+        addGreaterThanOrEquals(SessionColumns.HASH, value);
+        return this;
+    }
+
+    public SessionSelection hashLt(int value) {
+        addLessThan(SessionColumns.HASH, value);
+        return this;
+    }
+
+    public SessionSelection hashLtEq(int value) {
+        addLessThanOrEquals(SessionColumns.HASH, value);
+        return this;
+    }
+
+    public SessionSelection orderByHash(boolean desc) {
+        orderBy(SessionColumns.HASH, desc);
+        return this;
+    }
+
+    public SessionSelection orderByHash() {
+        orderBy(SessionColumns.HASH, false);
+        return this;
+    }
+}

+ 1 - 1
app/src/main/java/com/sheep/gamegroup/helper/DownloadHelper.java

@@ -8,11 +8,11 @@ import android.widget.TextView;
 import com.arialyy.aria.core.Aria;
 import com.arialyy.aria.core.download.DownloadTarget;
 import com.arialyy.aria.core.inf.IEntity;
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.kfzs.duanduan.event.BigEvent;
 import com.kfzs.duanduan.event.EventTypes;
 import com.kfzs.duanduan.services.DownloadTaskService;
 import com.kfzs.duanduan.utils.ApkUtils;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 import com.sheep.gamegroup.model.api.IDownload;
 import com.sheep.gamegroup.view.activity.TaskDetailAct;
 import com.sheep.jiuyan.samllsheep.R;

+ 1 - 1
app/src/main/java/com/sheep/gamegroup/model/entity/DialogEntity.java

@@ -1,7 +1,7 @@
 package com.sheep.gamegroup.model.entity;
 
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.kfzs.duanduan.event.EventTypes;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 
 import java.io.Serializable;
 

+ 1 - 1
app/src/main/java/com/sheep/gamegroup/util/CommonUtil.java

@@ -29,12 +29,12 @@ import com.arialyy.aria.core.Aria;
 import com.arialyy.aria.core.download.DownloadTarget;
 import com.arialyy.aria.core.download.DownloadTask;
 import com.arialyy.aria.core.inf.IEntity;
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.kfzs.duanduan.event.BigEvent;
 import com.kfzs.duanduan.event.EventTypes;
 import com.mdad.sdk.mdsdk.AdManager;
 import com.sheep.gamegroup.absBase.BaseActivity;
 import com.sheep.gamegroup.alipay.PayResult;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 import com.sheep.gamegroup.model.entity.BaseMessage;
 import com.sheep.gamegroup.model.entity.DialogConfig;
 import com.sheep.gamegroup.model.entity.FindApp;

+ 2 - 2
app/src/main/java/com/sheep/gamegroup/util/ShareJs.java

@@ -4,7 +4,7 @@ import android.app.Activity;
 import android.webkit.JavascriptInterface;
 
 import com.kfzs.duanduan.KFZSApp;
-import com.kfzs.duanduan.datashare.DDProviderHelper;
+import com.sheep.gamegroup.download.DDProviderHelper;
 
 /**
  * 分享js注入
@@ -20,7 +20,7 @@ public class ShareJs {
 
     @JavascriptInterface
     public String getHeader() {
-        return DDProviderHelper.getInstance().getLastUserToken(KFZSApp.context);
+        return "";
     }
 
     @JavascriptInterface

+ 1 - 11
app/src/main/java/com/sheep/gamegroup/util/WebviewJs.java

@@ -1,8 +1,6 @@
 package com.sheep.gamegroup.util;
 
 import android.app.Activity;
-import android.content.Intent;
-import android.net.Uri;
 import android.os.Build;
 import android.text.TextUtils;
 import android.webkit.JavascriptInterface;
@@ -12,25 +10,17 @@ import com.arialyy.aria.core.Aria;
 import com.arialyy.aria.core.download.DownloadTarget;
 import com.arialyy.aria.core.download.DownloadTask;
 import com.arialyy.aria.core.inf.IEntity;
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.kfzs.duanduan.event.BigEvent;
 import com.kfzs.duanduan.event.EventTypes;
 import com.kfzs.duanduan.services.DownloadTaskService;
-import com.sheep.gamegroup.view.activity.ActWeb;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 import com.sheep.jiuyan.samllsheep.SheepApp;
-import com.sheep.jiuyan.samllsheep.utils.ClassFileHelper;
 import com.sheep.jiuyan.samllsheep.utils.G;
 import com.sheep.jiuyan.samllsheep.utils.PackageUtil;
 import com.sheep.jiuyan.samllsheep.utils.SpUtils;
-import com.zhy.http.okhttp.OkHttpUtils;
-import com.zhy.http.okhttp.callback.FileCallBack;
 
 import org.greenrobot.eventbus.EventBus;
 
-import java.io.File;
-
-import okhttp3.Call;
-
 /**
  * Created by ljy on 2018/6/25.
  */

+ 1 - 1
app/src/main/java/com/sheep/gamegroup/view/activity/ActMainGame.java

@@ -20,7 +20,6 @@ import com.kfzs.duanduan.ActSearch;
 import com.kfzs.duanduan.KFZSApp;
 import com.kfzs.duanduan.bean.KFIntentKeys;
 import com.kfzs.duanduan.bll.UrlBll;
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.kfzs.duanduan.db.DataSave;
 import com.kfzs.duanduan.event.BigEvent;
 import com.kfzs.duanduan.event.EventTypes;
@@ -36,6 +35,7 @@ import com.kfzs.duanduan.utils.net.ResponseNetworkTask;
 import com.kfzs.duanduan.view.AppHomepageAdvertisementDialog;
 import com.kfzs.duanduan.view.DialogStorageLow;
 import com.sheep.gamegroup.absBase.BaseActivity;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 import com.sheep.gamegroup.util.UMConfigUtils;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.utils.TitleBarUtils;

+ 1 - 1
app/src/main/java/com/sheep/gamegroup/view/activity/TaskDetailAct.java

@@ -9,6 +9,7 @@ import android.text.Html;
 import android.text.TextUtils;
 import android.view.View;
 
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 import com.sheep.gamegroup.util.TestUtil;
 import com.tencent.smtt.export.external.interfaces.WebResourceRequest;
 import com.tencent.smtt.sdk.WebChromeClient;
@@ -26,7 +27,6 @@ import com.arialyy.aria.core.Aria;
 import com.arialyy.aria.core.download.DownloadTarget;
 import com.arialyy.aria.core.download.DownloadTask;
 import com.arialyy.aria.core.inf.IEntity;
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.kfzs.duanduan.event.BigEvent;
 import com.kfzs.duanduan.event.EventTypes;
 import com.kfzs.duanduan.services.DownloadTaskService;

+ 2 - 2
app/src/main/java/com/sheep/gamegroup/view/activity/TaskDetailCreditCardAct.java

@@ -13,9 +13,9 @@ import android.widget.TextView;
 import com.alibaba.fastjson.JSONObject;
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.request.RequestOptions;
-import com.kfzs.duanduan.datashare.DDProviderHelper;
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.sheep.gamegroup.absBase.AbsChooseImageActivity;
+import com.sheep.gamegroup.download.DDProviderHelper;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 import com.sheep.gamegroup.model.entity.BaseMessage;
 import com.sheep.gamegroup.model.entity.TaskEty;
 import com.sheep.gamegroup.model.entity.TaskReleaseEty;

+ 1 - 1
app/src/main/java/com/sheep/gamegroup/view/adapter/TryMakeMoneyAdp.java

@@ -17,11 +17,11 @@ import com.bumptech.glide.Glide;
 import com.bumptech.glide.request.RequestOptions;
 import com.kfzs.appstore.utils.adapter.recyclerview.ViewHolder;
 import com.kfzs.duanduan.adp.AdpCommonRecy;
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.kfzs.duanduan.event.BigEvent;
 import com.kfzs.duanduan.event.EventTypes;
 import com.kfzs.duanduan.services.DownloadTaskService;
 import com.kfzs.duanduan.utils.ApkUtils;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 import com.sheep.gamegroup.helper.TaskHelper;
 import com.sheep.gamegroup.model.entity.BaseMessage;
 import com.sheep.gamegroup.model.entity.GameAgencyRechargePlatformEntity;

+ 1 - 2
app/src/main/java/com/sheep/gamegroup/view/dialog/DialogAccountAbnormal.java

@@ -6,12 +6,11 @@ import android.text.TextUtils;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.TextView;
-
-import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.kfzs.duanduan.event.BigEvent;
 import com.kfzs.duanduan.event.EventTypes;
 import com.kfzs.duanduan.services.DownloadTaskService;
 import com.kfzs.duanduan.utils.dlg.ViewFindUtils;
+import com.sheep.gamegroup.download.download.DownLoadInfo;
 import com.sheep.gamegroup.util.Jump2View;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.utils.SpUtils;

+ 5 - 6
datashare/src/main/java/com/kfzs/duanduan/data/graph/provider/KFZSProvider.java

@@ -10,8 +10,8 @@ import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.util.Log;
 
-import com.kfzs.duanduan.data.graph.provider.channel.ChannelDao;
-import com.kfzs.duanduan.data.graph.provider.channel.DaoMaster;
+import com.kfzs.duanduan.data.graph.provider.current.CurrentDao;
+import com.kfzs.duanduan.data.graph.provider.current.DaoMaster;
 import com.kfzs.duanduan.datashare.BuildConfig;
 
 import java.util.Arrays;
@@ -50,7 +50,7 @@ public class KFZSProvider extends ContentProvider {
 //        URI_MATCHER.addURI(AUTHORITY, UserDao.TABLENAME + "/#", URI_TYPE_USER_ID);
 //        URI_MATCHER.addURI(AUTHORITY, DownLoadInfoDao.TABLENAME, URI_TYPE_DOWNLOADTASK);
 //        URI_MATCHER.addURI(AUTHORITY, DownLoadInfoDao.TABLENAME + "/#", URI_TYPE_DOWNLOADTASK_ID);
-        URI_MATCHER.addURI(AUTHORITY, ChannelDao.TABLENAME, URI_TYPE_CHANNEL);
+        URI_MATCHER.addURI(AUTHORITY, CurrentDao.TABLENAME, URI_TYPE_CHANNEL);
     }
 
     private SQLiteDatabase mDatabase;
@@ -95,7 +95,7 @@ public class KFZSProvider extends ContentProvider {
             case URI_TYPE_DOWNLOADTASK_ID:
                 return TYPE_CURSOR_ITEM + DownLoadInfoDao.TABLENAME;*/
             case URI_TYPE_CHANNEL:
-                return TYPE_CURSOR_ITEM + ChannelDao.TABLENAME;
+                return TYPE_CURSOR_ITEM + CurrentDao.TABLENAME;
         }
         return null;
     }
@@ -164,8 +164,7 @@ public class KFZSProvider extends ContentProvider {
                 res.idColumn = UserDao.Properties.MUserId.columnName;
                 break;*/
             case URI_TYPE_CHANNEL:
-                res.table = ChannelDao.TABLENAME;
-                res.idColumn = ChannelDao.Properties.MChannelName.columnName;
+                res.table = CurrentDao.TABLENAME;
                 break;
 
             default:

+ 0 - 2
datashare/src/main/java/com/kfzs/duanduan/data/graph/provider/current/CurrentDao.java

@@ -9,8 +9,6 @@ import org.greenrobot.greendao.internal.DaoConfig;
 import org.greenrobot.greendao.database.Database;
 import org.greenrobot.greendao.database.DatabaseStatement;
 
-import com.kfzs.duanduan.data.graph.provider.channel.DaoSession;
-
 // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
 /** 
  * DAO for table "CURRENT".

+ 1 - 5
datashare/src/main/java/com/kfzs/duanduan/data/graph/provider/channel/DaoMaster.java

@@ -1,4 +1,4 @@
-package com.kfzs.duanduan.data.graph.provider.channel;
+package com.kfzs.duanduan.data.graph.provider.current;
 
 import android.content.Context;
 import android.database.sqlite.SQLiteDatabase;
@@ -11,7 +11,6 @@ import org.greenrobot.greendao.database.Database;
 import org.greenrobot.greendao.database.DatabaseOpenHelper;
 import org.greenrobot.greendao.identityscope.IdentityScopeType;
 
-import com.kfzs.duanduan.data.graph.provider.current.CurrentDao;
 import com.kfzs.duanduan.data.graph.provider.player.UserDao;
 import com.kfzs.duanduan.datashare.provider.appdownload.AppdownloadBeanDao;
 import com.kfzs.duanduan.datashare.provider.download.DownLoadInfoDao;
@@ -25,7 +24,6 @@ public class DaoMaster extends AbstractDaoMaster {
 
     /** Creates underlying database table using DAOs. */
     public static void createAllTables(Database db, boolean ifNotExists) {
-        ChannelDao.createTable(db, ifNotExists);
         CurrentDao.createTable(db, ifNotExists);
         UserDao.createTable(db, ifNotExists);
         AppdownloadBeanDao.createTable(db, ifNotExists);
@@ -34,7 +32,6 @@ public class DaoMaster extends AbstractDaoMaster {
 
     /** Drops underlying database table using DAOs. */
     public static void dropAllTables(Database db, boolean ifExists) {
-        ChannelDao.dropTable(db, ifExists);
         CurrentDao.dropTable(db, ifExists);
         UserDao.dropTable(db, ifExists);
         AppdownloadBeanDao.dropTable(db, ifExists);
@@ -57,7 +54,6 @@ public class DaoMaster extends AbstractDaoMaster {
 
     public DaoMaster(Database db) {
         super(db, SCHEMA_VERSION);
-        registerDaoClass(ChannelDao.class);
         registerDaoClass(CurrentDao.class);
         registerDaoClass(UserDao.class);
         registerDaoClass(AppdownloadBeanDao.class);

+ 1 - 15
datashare/src/main/java/com/kfzs/duanduan/data/graph/provider/channel/DaoSession.java

@@ -1,4 +1,4 @@
-package com.kfzs.duanduan.data.graph.provider.channel;
+package com.kfzs.duanduan.data.graph.provider.current;
 
 import java.util.Map;
 
@@ -8,13 +8,11 @@ import org.greenrobot.greendao.database.Database;
 import org.greenrobot.greendao.identityscope.IdentityScopeType;
 import org.greenrobot.greendao.internal.DaoConfig;
 
-import com.kfzs.duanduan.data.graph.provider.channel.Channel;
 import com.kfzs.duanduan.data.graph.provider.current.Current;
 import com.kfzs.duanduan.data.graph.provider.player.User;
 import com.kfzs.duanduan.datashare.provider.appdownload.AppdownloadBean;
 import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 
-import com.kfzs.duanduan.data.graph.provider.channel.ChannelDao;
 import com.kfzs.duanduan.data.graph.provider.current.CurrentDao;
 import com.kfzs.duanduan.data.graph.provider.player.UserDao;
 import com.kfzs.duanduan.datashare.provider.appdownload.AppdownloadBeanDao;
@@ -29,13 +27,11 @@ import com.kfzs.duanduan.datashare.provider.download.DownLoadInfoDao;
  */
 public class DaoSession extends AbstractDaoSession {
 
-    private final DaoConfig channelDaoConfig;
     private final DaoConfig currentDaoConfig;
     private final DaoConfig userDaoConfig;
     private final DaoConfig appdownloadBeanDaoConfig;
     private final DaoConfig downLoadInfoDaoConfig;
 
-    private final ChannelDao channelDao;
     private final CurrentDao currentDao;
     private final UserDao userDao;
     private final AppdownloadBeanDao appdownloadBeanDao;
@@ -45,9 +41,6 @@ public class DaoSession extends AbstractDaoSession {
             daoConfigMap) {
         super(db);
 
-        channelDaoConfig = daoConfigMap.get(ChannelDao.class).clone();
-        channelDaoConfig.initIdentityScope(type);
-
         currentDaoConfig = daoConfigMap.get(CurrentDao.class).clone();
         currentDaoConfig.initIdentityScope(type);
 
@@ -60,13 +53,11 @@ public class DaoSession extends AbstractDaoSession {
         downLoadInfoDaoConfig = daoConfigMap.get(DownLoadInfoDao.class).clone();
         downLoadInfoDaoConfig.initIdentityScope(type);
 
-        channelDao = new ChannelDao(channelDaoConfig, this);
         currentDao = new CurrentDao(currentDaoConfig, this);
         userDao = new UserDao(userDaoConfig, this);
         appdownloadBeanDao = new AppdownloadBeanDao(appdownloadBeanDaoConfig, this);
         downLoadInfoDao = new DownLoadInfoDao(downLoadInfoDaoConfig, this);
 
-        registerDao(Channel.class, channelDao);
         registerDao(Current.class, currentDao);
         registerDao(User.class, userDao);
         registerDao(AppdownloadBean.class, appdownloadBeanDao);
@@ -74,17 +65,12 @@ public class DaoSession extends AbstractDaoSession {
     }
     
     public void clear() {
-        channelDaoConfig.clearIdentityScope();
         currentDaoConfig.clearIdentityScope();
         userDaoConfig.clearIdentityScope();
         appdownloadBeanDaoConfig.clearIdentityScope();
         downLoadInfoDaoConfig.clearIdentityScope();
     }
 
-    public ChannelDao getChannelDao() {
-        return channelDao;
-    }
-
     public CurrentDao getCurrentDao() {
         return currentDao;
     }

+ 1 - 1
datashare/src/main/java/com/kfzs/duanduan/data/graph/provider/player/UserDao.java

@@ -9,7 +9,7 @@ import org.greenrobot.greendao.internal.DaoConfig;
 import org.greenrobot.greendao.database.Database;
 import org.greenrobot.greendao.database.DatabaseStatement;
 
-import com.kfzs.duanduan.data.graph.provider.channel.DaoSession;
+import com.kfzs.duanduan.data.graph.provider.current.DaoSession;
 
 // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
 /** 

+ 2 - 2
datashare/src/main/java/com/kfzs/duanduan/datashare/AppDownloadDatabaseHelper.java

@@ -3,8 +3,8 @@ package com.kfzs.duanduan.datashare;
 import android.content.Context;
 import android.text.TextUtils;
 
-import com.kfzs.duanduan.data.graph.provider.channel.DaoMaster;
-import com.kfzs.duanduan.data.graph.provider.channel.DaoSession;
+import com.kfzs.duanduan.data.graph.provider.current.DaoMaster;
+import com.kfzs.duanduan.data.graph.provider.current.DaoSession;
 import com.kfzs.duanduan.datashare.provider.appdownload.AppdownloadBean;
 import com.kfzs.duanduan.datashare.provider.appdownload.AppdownloadBeanDao;
 

+ 2 - 28
datashare/src/main/java/com/kfzs/duanduan/datashare/DDProviderHelper.java

@@ -6,12 +6,10 @@ import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
 
-import com.kfzs.duanduan.data.graph.provider.channel.Channel;
-import com.kfzs.duanduan.data.graph.provider.channel.ChannelDao;
-import com.kfzs.duanduan.data.graph.provider.channel.DaoMaster;
-import com.kfzs.duanduan.data.graph.provider.channel.DaoSession;
 import com.kfzs.duanduan.data.graph.provider.current.Current;
 import com.kfzs.duanduan.data.graph.provider.current.CurrentDao;
+import com.kfzs.duanduan.data.graph.provider.current.DaoMaster;
+import com.kfzs.duanduan.data.graph.provider.current.DaoSession;
 import com.kfzs.duanduan.data.graph.provider.player.User;
 import com.kfzs.duanduan.data.graph.provider.player.UserDao;
 import com.kfzs.duanduan.data.graph.provider.user.UserBean;
@@ -93,15 +91,6 @@ public class DDProviderHelper {
      * @param context
      * @param channel
      */
-    public void setChannel(Context context, Channel channel) {
-        DaoSession daossion = getDaossion(context);
-        ChannelDao channelDao = daossion.getChannelDao();
-        Channel currentChannel = channelDao.queryBuilder().build().unique();
-        if (currentChannel != null) {
-            channelDao.deleteAll();
-        }
-        channelDao.insert(channel);
-    }
 
     /**
      * 获取渠道名
@@ -109,10 +98,6 @@ public class DDProviderHelper {
      * @param context
      * @return
      */
-    public Channel getChannel(Context context) {
-        Channel channel = getDaossion(context).getChannelDao().queryBuilder().build().unique();
-        return channel;
-    }
 
     /**
      * 删除所有user;
@@ -120,17 +105,6 @@ public class DDProviderHelper {
      * @param context
      * @return
      */
-    public boolean deleteAllUser(Context context) {
-        try {
-            DaoSession daoSession = getDaossion(context);
-            UserDao userDao = daoSession.getUserDao();
-            userDao.deleteAll();
-        } catch (Exception e) {
-            e.printStackTrace();
-            return false;
-        }
-        return true;
-    }
 
 
     /**

+ 1 - 1
datashare/src/main/java/com/kfzs/duanduan/datashare/provider/appdownload/AppdownloadBeanDao.java

@@ -9,7 +9,7 @@ import org.greenrobot.greendao.internal.DaoConfig;
 import org.greenrobot.greendao.database.Database;
 import org.greenrobot.greendao.database.DatabaseStatement;
 
-import com.kfzs.duanduan.data.graph.provider.channel.DaoSession;
+import com.kfzs.duanduan.data.graph.provider.current.DaoSession;
 
 // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
 /** 

+ 1 - 1
datashare/src/main/java/com/kfzs/duanduan/datashare/provider/download/DownLoadInfoDao.java

@@ -9,7 +9,7 @@ import org.greenrobot.greendao.internal.DaoConfig;
 import org.greenrobot.greendao.database.Database;
 import org.greenrobot.greendao.database.DatabaseStatement;
 
-import com.kfzs.duanduan.data.graph.provider.channel.DaoSession;
+import com.kfzs.duanduan.data.graph.provider.current.DaoSession;
 
 // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
 /** 

+ 1 - 1
settings.gradle

@@ -1 +1 @@
-include ':app', ':datashare', ':view', ':ucrop'//, ':Aria', ':AriaAnnotations'
+include ':app', ':view', ':ucrop'//, ':Aria', ':AriaAnnotations'