liujiangyao 8 år sedan
förälder
incheckning
536a2e173f
20 ändrade filer med 926 tillägg och 53 borttagningar
  1. 7 7
      app/src/main/java/com/sheep/gamegroup/util/Jump2View.java
  2. 1 1
      app/src/main/java/com/sheep/gamegroup/view/activity/AccountAndSecurityAct.java
  3. 53 0
      app/src/main/java/com/sheep/gamegroup/view/activity/ChangeTelAct.java
  4. 134 11
      app/src/main/java/com/sheep/gamegroup/view/activity/DialogActivity.java
  5. 1 1
      app/src/main/java/com/sheep/gamegroup/view/activity/LoginAct.java
  6. 11 5
      app/src/main/java/com/sheep/gamegroup/view/activity/PhoneAct.java
  7. 54 0
      app/src/main/java/com/sheep/gamegroup/view/activity/PhoneOldeAct.java
  8. 1 1
      app/src/main/java/com/sheep/gamegroup/view/activity/WithdrawalAct.java
  9. 3 0
      app/src/main/java/com/sheep/gamegroup/view/activity/WithdrawalResultAct.java
  10. 4 8
      app/src/main/java/com/sheep/gamegroup/view/adapter/DownLoadTvAdp.java
  11. 119 0
      app/src/main/java/com/sheep/gamegroup/view/download/ProgressDownloader.java
  12. 70 0
      app/src/main/java/com/sheep/gamegroup/view/download/ProgressResponseBody.java
  13. 205 0
      app/src/main/java/com/sheep/jiuyan/samllsheep/download/DowanLoadManagerDialog.java
  14. 182 0
      app/src/main/java/com/sheep/jiuyan/samllsheep/download/DownloadCallbackDialog.java
  15. 1 1
      app/src/main/res/layout/bind_phone_number_act_layout.xml
  16. 59 0
      app/src/main/res/layout/changge_tel_layout.xml
  17. 20 18
      app/src/main/res/layout/download_item_dialog.xml
  18. BIN
      app/src/main/res/mipmap-xhdpi/no_bind_tel_img.png
  19. BIN
      app/src/main/res/mipmap-xxhdpi/no_bind_tel_img.png
  20. 1 0
      app/src/main/res/values/strings.xml

+ 7 - 7
app/src/main/java/com/sheep/gamegroup/util/Jump2View.java

@@ -55,7 +55,7 @@ public class Jump2View {
      */
     public void goWithdrawal(Context context, Object o){
         if(!isBindWeixin(context)){
-            goBindOrChangeWeixinView(context, o==null?false:o);
+            goBindOrChangeWeixinView(context, o==null?false:false);
             return;
         }
         Intent intent = new Intent(context, WithdrawalAct.class);
@@ -111,11 +111,11 @@ public class Jump2View {
     /**
      * 跳到手机登录页面
      * @param context
-     * @param o
+     * @param o:  0:登录,1:旧手机号,2:新手机号
      */
-    public void goPhoneLoginView(Context context, Object o){
+    public void goPhoneLoginView(Context context, int o){
         Intent intent = new Intent(context, PhoneAct.class);
-        intent.putExtra("show_notice", (Boolean) o);
+        intent.putExtra("show_notice",  o);
         context.startActivity(intent);
     }
 
@@ -155,13 +155,13 @@ public class Jump2View {
      * @param context
      * @param o false:绑定   true:切换
      */
-    public void goBindOrChangeWeixinView(Context context, Object o){
-        if(!isBindWeixin(context)){
+    public void goBindOrChangeWeixinView(Context context, boolean o){
+        if(!isBindWeixin(context) && !o){
             goNoBindWx(context, o);
             return;
         }
         Intent intent = new Intent(context, BindOrChangeWeixinAct.class);
-        intent.putExtra("type",o==null?false:(boolean)o);
+        intent.putExtra("type",o);
         context.startActivity(intent);
     }
 

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

@@ -146,7 +146,7 @@ public class AccountAndSecurityAct extends BaseActivity implements AccountAndSec
 
                 break;
             case R.id.rl_wx:  ////跳转到微信
-                Jump2View.getInstance().goBindOrChangeWeixinView(AccountAndSecurityAct.this,"");
+                Jump2View.getInstance().goBindOrChangeWeixinView(AccountAndSecurityAct.this,false);
                 break;
             case R.id.rl_auther: ////跳转授权
                 Jump2View.getInstance().goRealNameAuther(AccountAndSecurityAct.this,mEntity);

+ 53 - 0
app/src/main/java/com/sheep/gamegroup/view/activity/ChangeTelAct.java

@@ -0,0 +1,53 @@
+package com.sheep.gamegroup.view.activity;
+
+import android.os.Bundle;
+import android.widget.TextView;
+
+import com.sheep.gamegroup.absBase.BaseActivity;
+import com.sheep.gamegroup.util.Jump2View;
+import com.sheep.jiuyan.samllsheep.R;
+import com.sheep.jiuyan.samllsheep.utils.TitleBarUtils;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+
+/**
+ * Created by ljy on 2018/3/27.
+ */
+
+public class ChangeTelAct extends BaseActivity {
+    @BindView(R.id.tel_tv)
+    TextView telTv;
+    @BindView(R.id.sure_tv)
+    TextView sureTv;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.changge_tel_layout;
+    }
+
+    @Override
+    public void initView() {
+        ButterKnife.bind(this);
+        TitleBarUtils.getInstance()
+                .setTitle(this,"绑定手机号")
+                .setTitleFinish(this);
+
+    }
+
+    @Override
+    public void initListener() {
+
+    }
+
+    @Override
+    public void initData() {
+
+    }
+
+    @OnClick(R.id.sure_tv)
+    public void onViewClicked() {
+        Jump2View.getInstance().goPhoneLoginView(ChangeTelAct.this, 1);
+    }
+}

+ 134 - 11
app/src/main/java/com/sheep/gamegroup/view/activity/DialogActivity.java

@@ -9,6 +9,7 @@ import android.preference.DialogPreference;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RequiresApi;
+import android.util.Log;
 import android.view.View;
 import android.webkit.WebChromeClient;
 import android.webkit.WebResourceRequest;
@@ -25,6 +26,9 @@ import com.bumptech.glide.Glide;
 import com.kfzs.duanduan.event.BigEvent;
 import com.kfzs.duanduan.event.EventTypes;
 import com.kfzs.duanduan.utils.dlg.DeviceUtils;
+import com.liulishuo.filedownloader.BaseDownloadTask;
+import com.liulishuo.filedownloader.FileDownloadListener;
+import com.liulishuo.filedownloader.FileDownloader;
 import com.sheep.gamegroup.di.components.DaggerTaskDialogComponent;
 import com.sheep.gamegroup.di.modules.TaskDialogModule;
 import com.sheep.gamegroup.model.entity.BaseMessage;
@@ -38,14 +42,19 @@ import com.sheep.gamegroup.util.MyListview;
 import com.sheep.gamegroup.view.adapter.DownLoadTvAdp;
 import com.sheep.gamegroup.view.adapter.TaskStateAdapter;
 import com.sheep.gamegroup.view.customview.SProgress;
+import com.sheep.gamegroup.view.download.ProgressDownloader;
+import com.sheep.gamegroup.view.download.ProgressResponseBody;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.SheepApp;
+import com.sheep.jiuyan.samllsheep.download.DowanLoadManagerDialog;
 import com.sheep.jiuyan.samllsheep.download.DownloadInfo;
 import com.sheep.jiuyan.samllsheep.download.DownloadManager;
 import com.sheep.jiuyan.samllsheep.download.DownloadState;
 import com.sheep.jiuyan.samllsheep.utils.ClassFileHelper;
 import com.sheep.jiuyan.samllsheep.utils.G;
 import com.sheep.jiuyan.samllsheep.utils.PackageUtil;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.callback.FileCallBack;
 
 
 import org.greenrobot.eventbus.EventBus;
@@ -61,13 +70,17 @@ import javax.inject.Inject;
 import butterknife.BindView;
 import butterknife.ButterKnife;
 import butterknife.OnClick;
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import okhttp3.Call;
+import rx.functions.Action0;
 
 /**
  * 弹框activity
  * Created by ljy on 2018/3/20.
  */
 
-public class DialogActivity extends Activity implements TaskDialogContract.View {
+public class DialogActivity extends Activity implements TaskDialogContract.View, ProgressResponseBody.ProgressListener {
 
     @BindView(R.id.dialog_item_icon_iv)
     ImageView dialogItemIconIv;
@@ -91,7 +104,7 @@ public class DialogActivity extends Activity implements TaskDialogContract.View
     private List<TaskState> stateList = new ArrayList<>();//状态列表
     private TaskStateAdapter stateAdapter;
 
-    private DownloadManager downloadManager;
+    private DowanLoadManagerDialog downloadManager;
     DownloadInfo downloadInfo;
     private int type;//0,开始任务 1,开始试玩 2,开始下载
     private boolean isDownLoad = false;//是否下载
@@ -106,6 +119,15 @@ public class DialogActivity extends Activity implements TaskDialogContract.View
     @Inject
     TaskDialogPresenter preference;
 
+    /**
+     * okhttp
+     */
+    private long breakPoints;
+    private ProgressDownloader downloader;
+    private File file;
+    private long totalBytes;
+    private long contentLength;
+
     Handler handler = new Handler(){
         @Override
         public void handleMessage(Message msg) {
@@ -139,7 +161,7 @@ public class DialogActivity extends Activity implements TaskDialogContract.View
     }
 
     private void initDatas() {
-        downloadManager = DownloadManager.getInstance();
+        downloadManager = DowanLoadManagerDialog.getInstance();
         webview.loadUrl(task_entity.getBoot_address());
         Glide.with(this)
                 .load(task_entity.getIcon())
@@ -151,6 +173,7 @@ public class DialogActivity extends Activity implements TaskDialogContract.View
         isDownLoad = PackageUtil.isAppInstalled(activity, task_entity.getPackage_names());
 
         isHaveLoad();
+//        downLoad();
 //        downLoadApk();
         /**
          * 下载
@@ -158,7 +181,7 @@ public class DialogActivity extends Activity implements TaskDialogContract.View
         loadTvAdp = new DownLoadTvAdp(activity, infoList);
         listview_down.setAdapter(loadTvAdp);
 
-         setBtnState();
+//         setBtnState();
 
         //Todo ok
         JSONObject jsonObject = new JSONObject();
@@ -218,12 +241,7 @@ public class DialogActivity extends Activity implements TaskDialogContract.View
 //                refresh();
                 try {
                     downloadManager.startDownload(
-                            downloadInfo.getPkgName(),
-                            downloadInfo.getUrl(),
-                            downloadInfo.getLabel(),
-                            downloadInfo.getFileSavePath(), "",
-                            downloadInfo.isAutoResume(),
-                            downloadInfo.isAutoRename(),
+                            downloadInfo,
                             null);
                 } catch (DbException ex) {
                     Toast.makeText(x.app(), "添加下载失败", Toast.LENGTH_LONG).show();
@@ -261,7 +279,7 @@ public class DialogActivity extends Activity implements TaskDialogContract.View
      */
     private void downLoadApk(){
 
-        start_task_tv.setVisibility(View.GONE);
+        start_task_tv.setVisibility(View.VISIBLE);
         startStaskSprogress.setVisibility(View.VISIBLE);
         if (task_entity != null) {
             ClassFileHelper.getInstance().createSDDirection();
@@ -326,6 +344,14 @@ public class DialogActivity extends Activity implements TaskDialogContract.View
                 infoList.clear();
                 infoList.add(downloadInfo);
         }
+
+        try {
+            downloadManager.startDownload(
+                    downloadInfo,
+                    null);
+        } catch (DbException e) {
+            e.printStackTrace();
+        }
         return downloadInfo;
     }
     /**
@@ -358,6 +384,7 @@ public class DialogActivity extends Activity implements TaskDialogContract.View
         loadTvAdp.setTaskState(type);
         loadTvAdp.addTaskPreference(preference);
         loadTvAdp.addTaskEty(task_entity);
+        downLoad();
     }
 
     /**
@@ -417,4 +444,100 @@ public class DialogActivity extends Activity implements TaskDialogContract.View
         super.onDestroy();
     }
 
+    /**
+     * 下载
+     */
+    private void downLoad(){
+
+        ClassFileHelper.getInstance().createSDDirection();
+        final File mApkPath = new File(ClassFileHelper.DIR, task_entity.getTask_name() + ClassFileHelper.FILE_SUFFIX);
+        OkHttpUtils.get()
+                .url(task_entity.getDownload_link()+"")
+                .build()
+        .execute(new FileCallBack(ClassFileHelper.DIR, task_entity.getTask_name() + ClassFileHelper.FILE_SUFFIX) {
+            @Override
+            public void onError(Call call, Exception e, int id) {
+
+            }
+
+            @Override
+            public void inProgress(float progress, long total, int id) {
+                super.inProgress(progress, total, id);
+                Log.e("--","inProgress"+(int)(100*progress));
+                start_task_tv.setText((int)(100*progress)+"%");
+                if((int)(100*progress) == 100)
+                    PackageUtil.installApk(getApplicationContext(), mApkPath.getAbsolutePath());
+
+            }
+
+            @Override
+            public void onResponse(File response, int id) {
+
+            }
+        });
+    }
+
+    /**
+     * okhttp 下载
+     * @param contentLength
+     */
+    @Override
+    public void onPreExecute(long contentLength) {
+
+    }
+
+    @Override
+    public void update(long totalBytes, boolean done) {
+        // 注意加上断点的长度
+        this.totalBytes = totalBytes + breakPoints;
+//        progressBar.setProgress((int) (totalBytes + breakPoints) / 1024);
+        if (done) {
+            // 切换到主线程
+        }
+    }
+
+    private void fileDownloader(){
+        FileDownloader.getImpl()
+                .create("url")
+                .setWifiRequired(true)
+                .setPath(ClassFileHelper.DIR+task_entity.getTask_name() + ClassFileHelper.FILE_SUFFIX)
+                .setListener(new FileDownloadListener() {
+                    @Override
+                    protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+
+                    }
+
+                    @Override
+                    protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+                        int percent=(int) ((double) soFarBytes / (double) totalBytes * 100);
+                        start_task_tv.setText("("+percent+"%"+")");
+                    }
+
+                    @Override
+                    protected void completed(BaseDownloadTask task) {
+
+                    }
+
+                    @Override
+                    protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+
+                    }
+
+                    @Override
+                    protected void error(BaseDownloadTask task, Throwable e) {
+
+                    }
+
+                    @Override
+                    protected void warn(BaseDownloadTask task) {
+                        continueDownLoad(task);
+                    }
+                });
+    }
+    private void continueDownLoad(BaseDownloadTask task) {
+        while (task.getSmallFileSoFarBytes()!=task.getSmallFileTotalBytes()){
+            int percent=(int) ((double) task.getSmallFileSoFarBytes() / (double) task.getSmallFileTotalBytes() * 100);
+            start_task_tv.setText("("+percent+"%"+")");
+        }
+    }
 }

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

@@ -102,7 +102,7 @@ public class LoginAct extends BaseUMActivity implements LoginContract.View {
             Jump2View.getInstance().goHomePageView(this, null);
             finish();
         } else {
-            Jump2View.getInstance().goPhoneLoginView(LoginAct.this, false);
+            Jump2View.getInstance().goPhoneLoginView(LoginAct.this, 0);
 //            finish();
         }
     }

+ 11 - 5
app/src/main/java/com/sheep/gamegroup/view/activity/PhoneAct.java

@@ -74,7 +74,7 @@ public class PhoneAct extends BaseActivity implements PhoneContract.View {
 
     private String etPhone;
     private String etCode;
-    private boolean showNotice = false;//false:手机登录,true:绑定手机
+    private int showNotice;//0:登录,1:旧手机号,2:新手机号
 
     private int  bindPhone;
 
@@ -87,7 +87,7 @@ public class PhoneAct extends BaseActivity implements PhoneContract.View {
     @Override
     public void initView() {
         activity = this;
-        showNotice = getIntent().getBooleanExtra("show_notice", false);
+        showNotice = getIntent().getIntExtra("show_notice", 0);
         TitleBarUtils
                 .getInstance()
                 .setTitle(this, "手机号登录")
@@ -125,10 +125,16 @@ public class PhoneAct extends BaseActivity implements PhoneContract.View {
 
     @Override
     public void initData() {
-        if (!showNotice) {
+        if (showNotice == 0) {
             phoneTipTv.setVisibility(View.GONE);
+        }else if(showNotice == 1){
             phoneTipTv.setVisibility(View.GONE);
-        } else {
+            phone_iv.setVisibility(View.GONE);
+        }else if(showNotice == 2){
+            phoneTipTv.setVisibility(View.GONE);
+            phone_iv.setVisibility(View.GONE);
+        }
+        else {
             phoneTipTv.setVisibility(View.VISIBLE);
 
         }
@@ -267,7 +273,7 @@ public class PhoneAct extends BaseActivity implements PhoneContract.View {
     @Override
     public void loginFail(BaseMessage o) {
         hideProgress();
-        G.showToast("登录失败" + "");
+        G.showToast(o.getMsg() + "");
 //        testData();
     }
 

+ 54 - 0
app/src/main/java/com/sheep/gamegroup/view/activity/PhoneOldeAct.java

@@ -0,0 +1,54 @@
+package com.sheep.gamegroup.view.activity;
+
+import com.sheep.gamegroup.absBase.BaseActivity;
+import com.sheep.gamegroup.di.components.PhoneComponent;
+import com.sheep.gamegroup.model.entity.BaseMessage;
+import com.sheep.gamegroup.presenter.PhoneContract;
+import com.sheep.jiuyan.samllsheep.R;
+
+/**
+ * 解绑久的手机号
+ * Created by ljy on 2018/3/27.
+ */
+
+public class PhoneOldeAct extends BaseActivity implements PhoneContract.View {
+    @Override
+    public void returnGaptcha(Object o) {
+
+    }
+
+    @Override
+    public void gaptchaFail(BaseMessage o) {
+
+    }
+
+    @Override
+    public void returnLogindata(Object o) {
+
+    }
+
+    @Override
+    public void loginFail(BaseMessage o) {
+
+    }
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.bind_phone_number_act_layout;
+    }
+
+    @Override
+    public void initView() {
+
+    }
+
+    @Override
+    public void initListener() {
+
+    }
+
+    @Override
+    public void initData() {
+
+    }
+}

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

@@ -125,7 +125,7 @@ public class WithdrawalAct extends BaseActivity implements WithdrawalContract.Vi
     public void onViewClicked(View view) {
         switch (view.getId()) {
             case R.id.withdrawal_change_tv:
-                Jump2View.getInstance().goBindOrChangeWeixinView(activity, true);
+                Jump2View.getInstance().goBindOrChangeWeixinView(activity, false);
                 break;
             case R.id.withdrawal_sure:
                 doWithdrawal();

+ 3 - 0
app/src/main/java/com/sheep/gamegroup/view/activity/WithdrawalResultAct.java

@@ -18,6 +18,7 @@ import com.sheep.jiuyan.samllsheep.SheepApp;
 import com.sheep.jiuyan.samllsheep.base.BaseActivity;
 import com.sheep.jiuyan.samllsheep.utils.TitleBarUtils;
 
+import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 
 import javax.inject.Inject;
@@ -52,6 +53,7 @@ public class WithdrawalResultAct extends BaseActivity implements WithdrawalResul
 
     @Override
     public void initView() {
+        EventBus.getDefault().register(this);
         activity = this;
         amount = getIntent().getStringExtra("amount");
         withdrawalSuccessMoneyTv.setText("+"+amount+"元");
@@ -96,6 +98,7 @@ public class WithdrawalResultAct extends BaseActivity implements WithdrawalResul
     protected void onDestroy() {
         super.onDestroy();
         ActivityManager.getInstance().endActivity(WithdrawalAct.class);
+        EventBus.getDefault().unregister(this);
     }
 
     @Subscribe

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

@@ -17,6 +17,7 @@ import com.sheep.gamegroup.presenter.TaskDialogPresenter;
 import com.sheep.gamegroup.view.customview.SProgress;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.SheepApp;
+import com.sheep.jiuyan.samllsheep.download.DowanLoadManagerDialog;
 import com.sheep.jiuyan.samllsheep.download.DownloadInfo;
 import com.sheep.jiuyan.samllsheep.download.DownloadManager;
 import com.sheep.jiuyan.samllsheep.download.DownloadState;
@@ -38,7 +39,7 @@ import java.util.List;
 public class DownLoadTvAdp extends BaseAdapter {
     private Context mContext;
     private final LayoutInflater mInflater;
-    private DownloadManager downloadManager;
+    private DowanLoadManagerDialog downloadManager;
     private List<DownloadInfo> infoList;
     private int taskType;
     TaskDialogPresenter preference;
@@ -48,7 +49,7 @@ public class DownLoadTvAdp extends BaseAdapter {
         this.infoList = infoList;
         this.mContext = mContext;
         this.mInflater = LayoutInflater.from(mContext);
-        downloadManager = DownloadManager.getInstance();
+        downloadManager = DowanLoadManagerDialog.getInstance();
     }
 
     /**
@@ -220,12 +221,7 @@ public class DownLoadTvAdp extends BaseAdapter {
                         case STOPPED:
                             try {
                                 downloadManager.startDownload(
-                                        downloadInfo.getPkgName(),
-                                        downloadInfo.getUrl(),
-                                        downloadInfo.getLabel(),
-                                        downloadInfo.getFileSavePath(), "",
-                                        downloadInfo.isAutoResume(),
-                                        downloadInfo.isAutoRename(),
+                                        downloadInfo,
                                         this);
                             } catch (DbException ex) {
                                 Toast.makeText(x.app(), "添加下载失败", Toast.LENGTH_LONG).show();

+ 119 - 0
app/src/main/java/com/sheep/gamegroup/view/download/ProgressDownloader.java

@@ -0,0 +1,119 @@
+package com.sheep.gamegroup.view.download;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.RandomAccessFile;
+import java.nio.MappedByteBuffer;
+import java.nio.channels.FileChannel;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.Interceptor;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.ResponseBody;
+
+/**
+ * Created by ljy on 2018/3/27.
+ */
+
+public class ProgressDownloader {
+    public static final String TAG = "ProgressDownloader";
+
+    private ProgressResponseBody.ProgressListener progressListener;
+    private String url;
+    private OkHttpClient client;
+    private File destination;
+    private Call call;
+
+    public ProgressDownloader(String url, File destination, ProgressResponseBody.ProgressListener progressListener) {
+        this.url = url;
+        this.destination = destination;
+        this.progressListener = progressListener;
+        //在下载、暂停后的继续下载中可复用同一个client对象
+        client = getProgressClient();
+    }
+    //每次下载需要新建新的Call对象
+    private Call newCall(long startPoints) {
+        Request request = new Request.Builder()
+                .url(url)
+                .header("RANGE", "bytes=" + startPoints + "-")//断点续传要用到的,指示下载的区间
+                .build();
+        return client.newCall(request);
+    }
+
+    public OkHttpClient getProgressClient() {
+        // 拦截器,用上ProgressResponseBody
+        Interceptor interceptor = new Interceptor() {
+            @Override
+            public Response intercept(Chain chain) throws IOException {
+                Response originalResponse = chain.proceed(chain.request());
+                return originalResponse.newBuilder()
+                        .body(new ProgressResponseBody(originalResponse.body(), progressListener))
+                        .build();
+            }
+        };
+
+        return new OkHttpClient.Builder()
+                .addNetworkInterceptor(interceptor)
+                .build();
+    }
+
+    // startsPoint指定开始下载的点
+    public void download(final long startsPoint) {
+        call = newCall(startsPoint);
+        call.enqueue(new Callback() {
+            @Override
+            public void onFailure(Call call, IOException e) {
+
+            }
+
+            @Override
+            public void onResponse(Call call, Response response) throws IOException {
+                save(response, startsPoint);
+            }
+        });
+    }
+
+    public void pause() {
+        if(call!=null){
+            call.cancel();
+        }
+    }
+
+    private void save(Response response, long startsPoint) {
+        ResponseBody body = response.body();
+        InputStream in = body.byteStream();
+        FileChannel channelOut = null;
+        // 随机访问文件,可以指定断点续传的起始位置
+        RandomAccessFile randomAccessFile = null;
+        try {
+            randomAccessFile = new RandomAccessFile(destination, "rwd");
+            //Chanel NIO中的用法,由于RandomAccessFile没有使用缓存策略,直接使用会使得下载速度变慢,亲测缓存下载3.3秒的文件,用普通的RandomAccessFile需要20多秒。
+            channelOut = randomAccessFile.getChannel();
+            // 内存映射,直接使用RandomAccessFile,是用其seek方法指定下载的起始位置,使用缓存下载,在这里指定下载位置。
+            MappedByteBuffer mappedBuffer = channelOut.map(FileChannel.MapMode.READ_WRITE, startsPoint, body.contentLength());
+            byte[] buffer = new byte[1024];
+            int len;
+            while ((len = in.read(buffer)) != -1) {
+                mappedBuffer.put(buffer, 0, len);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            try {
+                in.close();
+                if (channelOut != null) {
+                    channelOut.close();
+                }
+                if (randomAccessFile != null) {
+                    randomAccessFile.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}

+ 70 - 0
app/src/main/java/com/sheep/gamegroup/view/download/ProgressResponseBody.java

@@ -0,0 +1,70 @@
+package com.sheep.gamegroup.view.download;
+
+import java.io.IOException;
+
+import okhttp3.MediaType;
+import okhttp3.ResponseBody;
+import okio.Buffer;
+import okio.BufferedSource;
+import okio.ForwardingSource;
+import okio.Okio;
+import okio.Source;
+
+/**
+ * Created by ljy on 2018/3/27.
+ */
+
+public class ProgressResponseBody extends ResponseBody {
+
+    public interface ProgressListener {
+        void onPreExecute(long contentLength);
+        void update(long totalBytes, boolean done);
+    }
+
+    private final ResponseBody responseBody;
+    private final ProgressListener progressListener;
+    private BufferedSource bufferedSource;
+
+    public ProgressResponseBody(ResponseBody responseBody,
+                                ProgressListener progressListener) {
+        this.responseBody = responseBody;
+        this.progressListener = progressListener;
+        if(progressListener!=null){
+            progressListener.onPreExecute(contentLength());
+        }
+    }
+
+    @Override
+    public MediaType contentType() {
+        return responseBody.contentType();
+    }
+
+    @Override
+    public long contentLength() {
+        return responseBody.contentLength();
+    }
+
+    @Override
+    public BufferedSource source() {
+        if (bufferedSource == null) {
+            bufferedSource = Okio.buffer(source(responseBody.source()));
+        }
+        return bufferedSource;
+    }
+
+    private Source source(Source source) {
+        return new ForwardingSource(source) {
+            long totalBytes = 0L;
+            @Override
+            public long read(Buffer sink, long byteCount) throws IOException {
+                long bytesRead = super.read(sink, byteCount);
+                // read() returns the number of bytes read, or -1 if this source is exhausted.
+                totalBytes += bytesRead != -1 ? bytesRead : 0;
+                if (null != progressListener) {
+                    progressListener.update(totalBytes, bytesRead == -1);
+                }
+                return bytesRead;
+            }
+        };
+    }
+}

+ 205 - 0
app/src/main/java/com/sheep/jiuyan/samllsheep/download/DowanLoadManagerDialog.java

@@ -0,0 +1,205 @@
+package com.sheep.jiuyan.samllsheep.download;
+
+import org.xutils.DbManager;
+import org.xutils.common.Callback;
+import org.xutils.common.task.PriorityExecutor;
+import org.xutils.common.util.LogUtil;
+import org.xutils.db.converter.ColumnConverterFactory;
+import org.xutils.ex.DbException;
+import org.xutils.http.RequestParams;
+import org.xutils.x;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executor;
+
+/**
+ * Created by ljy on 2018/3/27.
+ */
+
+public class DowanLoadManagerDialog {
+
+    static {
+        // 注册DownloadState在数据库中的值类型映射
+        ColumnConverterFactory.registerColumnConverter(DownloadState.class, new DownloadStateConverter());
+    }
+
+    private static volatile DowanLoadManagerDialog instance;
+
+    private final static int MAX_DOWNLOAD_THREAD = 2; // 有效的值范围[1, 3], 设置为3时, 可能阻塞图片加载.
+
+    private final DbManager db;
+    private final Executor executor = new PriorityExecutor(MAX_DOWNLOAD_THREAD, true);
+    DownloadInfo downloadInfos;
+    private  DownloadCallbackDialog downloadCallbackDialog;
+
+    private DowanLoadManagerDialog() {
+        DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()
+                .setDbName("downloads")
+                .setDbVersion(1);
+        db = x.getDb(daoConfig);
+        try {
+            List<DownloadInfo> infoList = db.selector(DownloadInfo.class).findAll();
+            if (infoList != null) {
+                for (DownloadInfo info : infoList) {
+                    if (info.getState().value() < DownloadState.FINISHED.value()) {
+                        info.setState(DownloadState.STOPPED);
+                    }
+                    downloadInfos = info;
+                }
+            }
+        } catch (DbException ex) {
+            LogUtil.e(ex.getMessage(), ex);
+        }
+    }
+
+    /*package*/
+    public static DowanLoadManagerDialog getInstance() {
+        if (instance == null) {
+            synchronized (DowanLoadManagerDialog.class) {
+                if (instance == null) {
+                    instance = new DowanLoadManagerDialog();
+                }
+            }
+        }
+        return instance;
+    }
+
+    public void updateDownloadInfo(DownloadInfo info) throws DbException {
+        db.update(info);
+    }
+
+    public int getDownloadListCount() {
+        return 0;
+    }
+
+    public DownloadInfo getDownloadInfo(int index) {
+        return downloadInfos;
+    }
+
+    public synchronized void startDownload(DownloadInfo downloadInfo,
+                                           DownloadViewHolder viewHolder) throws DbException {
+
+
+        // create download info
+        db.saveBindingId(downloadInfo);
+
+        // start downloading
+        if (viewHolder == null) {
+            viewHolder = new DefaultDownloadViewHolder(null, downloadInfo);
+        } else {
+            viewHolder.update(downloadInfo);
+        }
+        DownloadCallbackDialog callback = new DownloadCallbackDialog(viewHolder);
+        callback.setDownloadManager(this);
+        callback.switchViewHolder(viewHolder);
+        RequestParams params = new RequestParams(downloadInfo.getUrl());
+        params.setAutoResume(downloadInfo.isAutoResume());
+        params.setAutoRename(downloadInfo.isAutoRename());
+        params.setSaveFilePath(downloadInfo.getFileSavePath());
+        params.setExecutor(executor);
+        params.setCancelFast(true);
+        Callback.Cancelable cancelable = x.http().get(params, callback);
+        callback.setCancelable(cancelable);
+        downloadCallbackDialog = callback;
+
+        downloadInfos = downloadInfo;
+    }
+
+
+    public void stopDownload(int index) {
+        DownloadInfo downloadInfo = downloadInfos;
+        stopDownload(downloadInfo);
+    }
+
+    public void stopDownload(DownloadInfo downloadInfo) {
+        Callback.Cancelable cancelable = downloadCallbackDialog;
+        if (cancelable != null) {
+            cancelable.cancel();
+        }
+    }
+
+    public void stopAllDownload() {
+        if (downloadInfos != null) {
+            Callback.Cancelable cancelable = downloadCallbackDialog;
+            if (cancelable != null) {
+                cancelable.cancel();
+            }
+        }
+    }
+
+    public void removeDownload(int index) throws DbException {
+        DownloadInfo downloadInfo = downloadInfos;
+        db.delete(downloadInfo);
+        stopDownload(downloadInfo);
+        downloadInfos = null;
+    }
+
+    public void removeDownload(DownloadInfo downloadInfo) throws DbException {
+        db.delete(downloadInfo);
+        stopDownload(downloadInfo);
+        downloadInfo = null;
+    }
+    public synchronized DownloadInfo startDownloadOne(String pkg, String url, String label, String savePath, String imageUrl,
+                                                      boolean autoResume, boolean autoRename,
+                                                      DownloadViewHolder viewHolder) throws DbException {
+
+        String fileSavePath = new File(savePath).getAbsolutePath();
+        DownloadInfo downloadInfo = db.selector(DownloadInfo.class)
+                .where("label", "=", label)
+                .and("fileSavePath", "=", fileSavePath)
+                .findFirst();
+        if (downloadInfo != null) {
+            DownloadCallbackDialog callback = downloadCallbackDialog;
+            if (callback != null) {
+                if (viewHolder == null) {
+                    viewHolder = new DefaultDownloadViewHolder(null, downloadInfo);
+                }
+                if (callback.switchViewHolder(viewHolder)) {
+                    return downloadInfo;
+                } else {
+                    callback.cancel();
+                }
+            }
+        }
+
+        // create download info
+        if (downloadInfo == null) {
+            downloadInfo = new DownloadInfo();
+            downloadInfo.setUrl(url);
+            downloadInfo.setAutoRename(autoRename);
+            downloadInfo.setAutoResume(autoResume);
+            downloadInfo.setLabel(label);
+            downloadInfo.setFileSavePath(fileSavePath);
+            downloadInfo.setIcon(imageUrl);
+            downloadInfo.setState(DownloadState.STARTED);
+            downloadInfo.setPkgName(pkg);
+            db.saveBindingId(downloadInfo);
+        }
+
+        // start downloading
+        if (viewHolder == null) {
+            viewHolder = new DefaultDownloadViewHolder(null, downloadInfo);
+        } else {
+            viewHolder.update(downloadInfo);
+        }
+        DownloadCallbackDialog callback = new DownloadCallbackDialog(viewHolder);
+        callback.setDownloadManager(this);
+        callback.switchViewHolder(viewHolder);
+        RequestParams params = new RequestParams(url);
+        params.setAutoResume(downloadInfo.isAutoResume());
+        params.setAutoRename(downloadInfo.isAutoRename());
+        params.setSaveFilePath(downloadInfo.getFileSavePath());
+        params.setExecutor(executor);
+        params.setCancelFast(true);
+        Callback.Cancelable cancelable = x.http().get(params, callback);
+        callback.setCancelable(cancelable);
+        downloadCallbackDialog = callback;
+
+        downloadInfos = downloadInfo;
+        return downloadInfo;
+    }
+
+}

+ 182 - 0
app/src/main/java/com/sheep/jiuyan/samllsheep/download/DownloadCallbackDialog.java

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

+ 1 - 1
app/src/main/res/layout/bind_phone_number_act_layout.xml

@@ -21,7 +21,7 @@
                 android:layout_gravity="center_horizontal"
                 android:layout_marginLeft="100dp"
                 android:layout_marginRight="100dp"
-                android:src="@mipmap/icon"
+                android:src="@mipmap/no_bind_phone"
                 android:layout_marginTop="35dp"
                 android:layout_marginBottom="5dp"/>
 

+ 59 - 0
app/src/main/res/layout/changge_tel_layout.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:background="@color/bg_gray">
+
+    <include
+        layout="@layout/title"/>
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:scrollbars="none">
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+            <ImageView
+                android:id="@+id/phone_iv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginLeft="@dimen/content_padding_100"
+                android:layout_marginRight="@dimen/content_padding_100"
+                android:src="@mipmap/no_bind_tel_img"
+                android:layout_marginTop="@dimen/content_padding_35"
+                android:layout_marginBottom="5dp"/>
+
+            <TextView
+                android:id="@+id/tel_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="123456"
+                style="@style/txt_style_12"
+                android:layout_marginTop="@dimen/content_padding_30"
+                android:layout_gravity="center"/>
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/no_bind_tel_notice_text"
+                style="@style/txt_style_12"
+                android:layout_marginTop="@dimen/content_padding_10"
+                android:layout_marginBottom="@dimen/content_padding_10"
+                android:layout_gravity="center"/>
+            <TextView
+                android:id="@+id/sure_tv"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                style="@style/txt_big_btn_style"
+                android:text="更换手机号"
+                android:background="@drawable/selector_button_full_main"/>
+
+        </LinearLayout>
+    </ScrollView>
+
+
+</LinearLayout>

+ 20 - 18
app/src/main/res/layout/download_item_dialog.xml

@@ -108,25 +108,26 @@
                         app:textColor="@color/black"
                         app:textsize="18sp"
                         android:visibility="gone"/>
-
-                    <TextView
-                        android:id="@+id/start_task_tv"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:layout_centerHorizontal="true"
-                        android:layout_marginLeft="@dimen/content_padding_40"
-                        android:layout_marginRight="@dimen/content_padding_40"
-                        android:layout_marginTop="@dimen/content_padding_small"
-                        android:background="@drawable/sp_bg_gradient_rectangle_yellow"
-                        android:gravity="center"
-                        android:minHeight="36dp"
-                        android:minWidth="151dp"
-                        android:text="开始任务"
-                        android:textSize="18sp"
-                        android:textColor="@color/txt_black"
-                        android:visibility="gone"/>
                 </LinearLayout>
 
+                <TextView
+                    android:layout_below="@+id/listview"
+                    android:id="@+id/start_task_tv"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_centerHorizontal="true"
+                    android:layout_marginLeft="@dimen/content_padding_40"
+                    android:layout_marginRight="@dimen/content_padding_40"
+                    android:layout_marginTop="@dimen/content_padding_small"
+                    android:background="@drawable/sp_bg_gradient_rectangle_yellow"
+                    android:gravity="center"
+                    android:minHeight="36dp"
+                    android:minWidth="151dp"
+                    android:text="开始任务"
+                    android:textSize="18sp"
+                    android:textColor="@color/txt_black"
+                    android:visibility="visible"/>
+
                 <com.sheep.gamegroup.util.MyListview
                     android:id="@+id/listview_down"
                     android:layout_width="match_parent"
@@ -137,7 +138,8 @@
                     android:layout_centerHorizontal="true"
                     android:layout_marginLeft="@dimen/content_padding_40"
                     android:layout_marginRight="@dimen/content_padding_40"
-                    android:layout_marginTop="@dimen/content_padding_15"/>
+                    android:layout_marginTop="@dimen/content_padding_15"
+                    android:visibility="gone"/>
 
                 <TextView
                     android:id="@+id/doalog_item_get_rewards_tv"

BIN
app/src/main/res/mipmap-xhdpi/no_bind_tel_img.png


BIN
app/src/main/res/mipmap-xxhdpi/no_bind_tel_img.png


+ 1 - 0
app/src/main/res/values/strings.xml

@@ -17,4 +17,5 @@
     <string name="bind_weixin_notice_text">请用需要绑定的微信号关注微信公众号\"好玩服务号\",在公众号中点击验证码或输入\"验证码\"三个字获取验证码并填入下方</string>
     <string name="bind_weixin_withdrawal_notice_text">你的每次收入提现,我们都会通过微信的企业商户入账功能将收入实时入账到绑定微信号的微信零钱上</string>
     <string name="no_bind_wx_notice_text">未绑定微信号,无法入账到你的微信零钱</string>
+    <string name="no_bind_tel_notice_text">我们已将你的手机号与该帐号绑定,如有变更,请点击</string>
 </resources>